[
  {
    "path": ".gitignore",
    "content": "/bin/\n/dep/cdrtools/\n/dep/lame/\n/dep/libogg/\n/dep/libsndfile/\n/dep/libvorbis/\n/dep/smoke/\n/dist/\n/doc/english/infrarecorder.chm\n/obj/\n/output/\n/src/_ReSharper.infrarecorder_vc10/*\n/src/ipch/*\n/src/shell/dlldata.c\n/src/shell/shell.hh\n/src/shell/shell_i.c\n/src/shell/shell_p.c\n/src/Win32/\n/src/x64/\n/src/setup/ir_plugin/Win32/\n/src/setup/ir_plugin/x64/\n/src/tests/test.cc\n*.aps\n*.ncb\n*.opensdf\n*.user\n*.sdf\n*.suo\nchristian_kindahl.pfx\nchristian_kindahl.psw\n"
  },
  {
    "path": "dep/readme.txt",
    "content": "Some InfraRecorder components depends on the following 3rd party projects:\r\n * cdrtools: http://cdrecord.berlios.de/\r\n * LAME: http://lame.sourceforge.net/\r\n * libogg: http://www.xiph.org/ogg/\r\n * libsndfile: http://www.mega-nerd.com/libsndfile/\r\n * libvorbis: http://www.xiph.org/vorbis/\r\n\r\nSince the InfraRecorder solution references the above projects their\r\nsources or in some cases binaries must be unpacked to their corresponding\r\nsubdirectory."
  },
  {
    "path": "doc/english/help_english_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"help_english\"\r\n\tProjectGUID=\"{44E47ABA-9695-4A96-BC52-53585C6AAA3C}\"\r\n\tRootNamespace=\"help_english\"\r\n\tKeyword=\"MakeFileProj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"hhc infrarecorder.hhp&#x0D;&#x0A;&#x0D;&#x0A;rem for some reason hhc exits with code 1 even on successful builds.&#x0D;&#x0A;goto VCEnd\"\r\n\t\t\t\tReBuildCommandLine=\"del infrarecorder.chm&#x0D;&#x0A;hhc infrarecorder.hhp&#x0D;&#x0A;&#x0D;&#x0A;rem for some reason hhc exits with code 1 even on successful builds.&#x0D;&#x0A;goto VCEnd\"\r\n\t\t\t\tCleanCommandLine=\"del infrarecorder.chm\"\r\n\t\t\t\tOutput=\"help_english.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"hhc infrarecorder.hhp&#x0D;&#x0A;&#x0D;&#x0A;rem for some reason hhc exits with code 1 even on successful builds.&#x0D;&#x0A;goto VCEnd\"\r\n\t\t\t\tReBuildCommandLine=\"del infrarecorder.chm&#x0D;&#x0A;hhc infrarecorder.hhp&#x0D;&#x0A;&#x0D;&#x0A;rem for some reason hhc exits with code 1 even on successful builds.&#x0D;&#x0A;goto VCEnd\"\r\n\t\t\t\tCleanCommandLine=\"del infrarecorder.chm\"\r\n\t\t\t\tOutput=\"help_english.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "doc/english/help_english_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>help_english</ProjectName>\n    <ProjectGuid>{44E47ABA-9695-4A96-BC52-53585C6AAA3C}</ProjectGuid>\n    <RootNamespace>help_english</RootNamespace>\n    <Keyword>MakeFileProj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">hhc infrarecorder.hhp\n\nrem for some reason hhc exits with code 1 even on successful builds.\nset %ERRORLEVEL%=0</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del infrarecorder.chm\nhhc infrarecorder.hhp\n\nrem for some reason hhc exits with code 1 even on successful builds.\nset %ERRORLEVEL%=0</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del infrarecorder.chm</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">help_english.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">hhc infrarecorder.hhp\n\nrem for some reason hhc exits with code 1 even on successful builds.\nset %ERRORLEVEL%=0</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del infrarecorder.chm\nhhc infrarecorder.hhp\n\nrem for some reason hhc exits with code 1 even on successful builds.\nset %ERRORLEVEL%=0</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del infrarecorder.chm</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">help_english.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ExecutablePath)</ExecutablePath>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ExecutablePath)</ExecutablePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "doc/english/help_english_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "doc/english/how_to_use/burn_image.html",
    "content": "<html>\r\n<head>\r\n<title>Burn Image</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Burn Image</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>To burn/record a disc image, you can either use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Burn Image...</strong></dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../images/button_burnimage.bmp\"></dd>\r\n\t</dl>\r\n\t<p>You will be prompted to select the disc image on your hard drive that you\r\n\t   want to record.\r\n\t<h2>Options</h2>\r\n\t<p>A detailed description of the available options can be found in\r\n\t   <a href=\"burn_options.html\">this</a> topic.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/burn_options.html",
    "content": "<html>\n<head>\n<title>Burn Options</title>\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\n</head>\n<body scroll=\"no\">\n<div id=\"header\">\n\t<div id=\"location\">How to Use?</div>\n\t<div id=\"topic\">Burn Options</div>\n</div>\n<div id=\"content\">\n\t<p>This topic covers the burn/recording options that appear on various places\n\t   in InfraRecorder, for example when you want to burn a custom compilation,\n\t   a disc image, or copy a disc.</p>\n\t<p>Although these options are accessable in many different contexts, as\n\t   mentioned above, they are always presented in a similar way:</p>\n\t<p><img src=\"../images/screenshot_burn.png\"></p>\n\t<h1>General Settings</h1>\n\t<h2>On The Fly</h2>\n\t<p>When recording on the fly, the file system will be generated while recording,\n\t   which may increase the risk of write errors. If this option is turned off a\n\t   temporary disc image will first be created on the hard drive and then\n\t   recorded to the disc. The preferred setting is usually off; it should\n\t   generally be enabled only when you are low on disc space.</p>\n\t<h2>Verify the Disc After Writing</h2>\n\t<p>Enabling this option will cause InfraRecorder to perform a CRC\n\t   comparison between the files on your hard drive and the files on the newly\n\t   recorded disc, to make sure that all files have been written to the disc\n\t   without any problems.</p>\n\t<h2>Write Speed</h2>\n\t<p>Select the write speed to use when recording the disc. Selecting the\n\t   <em>Maximum</em> option will automatically select the highest speed that the\n\t   recorder is capable of.</p>\n\t<h2>Write Method</h2>\n\t<p>This option selects what method that you want to use when recording the\n\t   disc. Only the options that your recorder supports will be available in the\n\t   combo box.</p>\n\t<p><em>Session-At-Once (SAO)</em> often refered to as Disc-At-Once (DAO)\n\t   writes all of the data (including lead-in and lead-out) in one pass, not\n\t   allowing any interruptions in the data stream. Additional session/data\n\t   cannot be added at a later time. Please note that DVDs must be written using\n\t   this method.</p>\n\t<p><em>Track-At-Once (TAO)</em> writes each track independently, which requires\n\t   link blocks between two tracks. Older recorders often force a two second\n\t   pause (pregap) between two tracks, whereas newer recorders often can adjust\n\t   the amount of pregap data (see the option described below).</p>\n\t<p><em>TAO with zero pregap</em> uses the Track-At-Once method described above\n\t   and tries to set the pregap data length to zero, minimizing the number of\n\t   link blocks between the tracks.</p>\n\t<p><em>Raw writing (raw96r)</em> writes data in raw mode using 2352 byte\n\t   sectors plus 96 bytes of raw P-W subchannel data, resulting in a sector size\n\t   of 2448 bytes. This is the preferred raw writing mode, since it gives the\n\t   best control over the CD writing process.</p>\n\t<p><em>Raw writing (raw16)</em> writes data in raw mode using 2352 bytes\n\t   sectors plus 16 bytes of P-Q subchannel data, resulting in a sector size of\n\t   2368 bytes. If a recorder does not support the raw96r raw writing mode,\n\t   this is the preferred raw writing mode. This write method does not support\n\t   CD-Text.</p>\n\t<p><em>Raw writing (raw96p)</em> writes data in raw mode using 2352 byte\n\t   sectors plus 96 bytes of raw P-W subchannel data, resulting in a sector size\n\t   of 2448 bytes. This is the less preferred raw writing mode, mainly because\n\t   very few recorders support it and some of these recorders have bugs\n\t   in the firmware implementation. Don't use this method if your recorder\n\t   supports the raw96r or raw16 raw writing method.</p>\n\t<p><font color=\"#FF0000\">Important: Please note that raw writing methods\n\t   requires significantly more CPU-time than the other write methods. If your\n\t   CPU is too slow you might get problems with buffer underruns.</font></p>\n\t<h2>Other Options</h2>\n\t<p>Activating the <em>Simulation</em> option will cause InfraRecorder to\n\t   perform the selected action but with the recorder's laser turned off. This\n\t   option is recommended if you are unsure if the operation will succeed or\n\t   not.</p>\n\t<p><em>Buffer underrun protection</em> is a feature in most newer recorders\n\t   which allows the writing process to continue even if a buffer underrun\n\t   error occurr. This feature often has different names by different vendors,\n\t   for example: Yamaha Lossless-Link, Sanyo BURN-Proof, Ricoh Just-Link, etc.\n\t   </p>\n\t<p>The <em>Pad data tracks</em> option will cause each data track to be\n\t   followed by 15 sectors containing zeros, and audio track data\n\t   to be padded to be a multiple of 2352 bytes. You might want to enable\n\t   this option is if your CD-reader has problems reading the last sectors of a\n\t   track or if you intend to use the disc on a Linux ISO-9660 filesystem with\n\t   the read ahead bug.</p>\n\t<p>Disabling the <em>Close the disc after writing option</em> will cause the\n\t   last session (if using SAO mode) or track (if using a TAO mode) not to be\n\t   closed. This can be useful if you want to record a CD in\n\t   multiple steps.</p>\n\t<p><font color=\"#FF0000\">Important: Creating a non-closed disc is not the\n\t   same as creating a multi-session disc.</font></p>\n\t<hr>\n\t<h1><a name=\"advanced\">Advanced Settings</a></h1>\n\t<p>The <em>Allow overburning</em> option allows you to write more than the\n\t   official size to a medium. Most blank media can hold more space\n\t   than the official size, as the official size of the lead-out area on\n\t   a disc is 90 seconds (6750 sectors) and a disc usually works with only 150\n\t   sectors of lead-out. All media may be overburned by at least 88\n\t   seconds (6600 sectors). Most recorders can do overburning only with the\n\t   SAO and raw write methods. Some recorders limit\n\t   overburning and limit a disc to certain\n\t   size. This problem may be circumvented by writing the CD in raw mode\n\t   , which gives the recorder no chance to find the medium size before\n\t   starting the recording process.</p>\n\t<p>When the <em>Swap audio byte order</em> option is enabled, audio data is\n\t   assumed to be in byte-swapped (little-endian) order. Some types of recorders\n\t   for example from Yamaha, Sony and the new SCSI-3/MMC recorders require\n\t   audio data to be presented in little-endian order, while other recorders\n\t   require audio data to be presented in big-endian (network) byte order\n\t   normally used by the SCSI protocol. The byte order required by your\n\t   recorder will automatically be detected. The only time you may want to use\n\t   this option is if your data stream is in Intel (little-endian) order.</p>\n\t<p><em>Ignore medium size</em> can be enabled when you want to ignore the\n\t   known size of the medium. It should be used with extreme care. This option\n\t   implies overburning.</p>\n\t<p>The <em>Set the SCSI IMMED flag</em> option will, as the name suggest set\n\t   the IMMED flag for certain SCSI commands. Setting the IMMED flag will\n\t   request the commands to return immediateley while the operation proceeds in\n\t   the background, making the bus usable for other devices and avoiding a\n\t   system freeze. This can be useful on broken systems with ATAPI hard disk and\n\t   CD/DVD-writer on the same bus or with SCSI systems that don't use\n\t   disconnect/reconnect. These systems will freeze while blanking or closing\n\t   a disc, or while the recorder is filling up a session to the minimum amount.\n\t   Please note that not all recorders support the IMMED flag.</p>\n\t<p><em>Yamaha Audio Master Q. R.</em> is a feature which is used to create\n\t   high quality audio discs that have less reading problems in Hi-Fi players.\n\t   It is implemented as a variant of the SAO write mode so it will only work\n\t   if you select the Session-At-Once (SAO) write method. This feature does not\n\t   work with all writing speeds and reduces the amount of data that can\n\t   be written to a disc, because the pits on the CD will be\n\t   larger than normal. If this feature is enabled, a 74 minute CD will have\n\t   the capacity of 63 minutes, and an 80 minute CD will have the capacity\n\t   reduced to 68 minutes. This feature also works with data discs.</p>\n\t<p>The <em>Forcespeed mode</em> option forces the drive to use the selected\n\t   write speed no matter of the quality of the medium. Normally modern drives\n\t   know the highest possible speed for different media and may reduce the\n\t   speed in order to grant the best write quality. This option should be used\n\t   with caution, the recorder usually knows better which medium to write at\n\t   full speed.</p>\n\t<p>The <em>Plextor VariRec write mode</em> allows the user to slightly adjust\n\t   the power of the laser. If configured properly this may reduce the jitter,\n\t   resulting in better sound quality and increased playability and\n\t   compatibility with existing CD-players. VariRec only works when the write\n\t   speed is set to four.</p>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "doc/english/how_to_use/configuration.html",
    "content": "<html>\r\n<head>\r\n<title>Configuration</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Configuration</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>To access the InfraRecorder configuration, use the menu:</dt>\r\n\t\t<dd><strong>Options <img src=\"../images/arrow.png\"> Configuration...</strong>\r\n\t\t    </dd>\r\n\t</dl>\r\n\t<h1>General Settings</h1>\r\n\t<p>The <em>Check if autorun is enabled on each startup</em> option specifies\r\n\t   whether you want InfraRecorder to check if autorun enabled on each startup\r\n\t   or not. It is recommended that autorun is turned of because leaving autorun\r\n\t   enabled causes Windows to poll the CD drive while recording, which might\r\n\t   damage your CD.</p>\r\n\t<p>If you want InfraRecorder to remember the last active folder in the\r\n\t   <em>Explorer View</em> you should check the <em>Remember the last active\r\n\t   folder</em> option. You can also specify a folder on your own that will be\r\n\t   the default every time InfraRecorder starts.</p>\r\n\t<p>The <em>Temporary folder</em> option lets you specify which folder that\r\n\t   should be used when temporarily storing files on your harddrive, for\r\n\t   example disc images. If your harddrive/partition (which stores the\r\n\t   temporary folder) is almost full it can be a good idea to use a temporary\r\n\t   folder on another drive.</p>\r\n\t<h1>Advanced Settings</H1>\r\n\t<p>If you want to enable the log feature of InfraRecorder, enable the<em>\r\n\t   Enable program log</em> option. This can be usefull when trying to locate a\r\n\t   possible bug/error in InfraRecorder. It's not recommended that you enable\r\n\t   log support if you do not intend to log a special event because InfraRecorder\r\n\t   requires more memory and CPU-time when the log support is enabled.</p>\r\n\t<p>The <em>Enable smoke effect</em> option enables or disables the smoke effect\r\n\t   displayed during writing processes. The smoke effect requires Windows Vista\r\n\t   Aero to be enabled. If Aero is not enabled this option will have no effect.</p>\r\n\t<p>The <em>FIFO buffer size</em> option lets you specify the size of the RAM\r\n\t   buffer that is used in addition to your recorders physical buffer. Icreasing\r\n\t   the buffer size may result in a more stable recording process. As a rule of\r\n\t   thumb, the FIFO size should be at least equal to the size of the pysical\r\n\t   buffer of the CD/DVD-Recorder and no more than half of the physical amount\r\n\t   of RAM available in the machine. If you often record discs on-the-fly, this\r\n\t   buffer should be large (for example 128 MiB) to prevent buffer underruns.\r\n\t<h1>Language Settings</h1>\r\n\t<p>A list of available languages are displayed in the combo box. To change\r\n\t   language, simply select the language you want in the combo box, click the\r\n\t   OK-button and restart InfraRecorder. If your language is not available,\r\n\t   check the InfraRecorder website to see if a translation in your language\r\n\t   exists.</p>\r\n\t<h1>Shell Extension</h1>\r\n\t<dl>\r\n\t\t<dt>The shell extension (when enabled) adds additional menu entries to the\r\n\t   \t    shell context menu:</dt>\r\n\t\t<dd><img src=\"../images/screenshot_shellextension.png\"></dd>\r\n\t</dl>\r\n\t<p>It adds the options to record disc images and InfraRecorder projects\r\n\t   just by right-clicking on them.</p>\r\n\t<p>The shell extension can be customized to display the items in a submenu.\r\n\t   To display the context menu items in a submenu enable the <em>Display\r\n\t   context menu items in a submenu</em> option.</p>\r\n\t<p>It can also be customized to not display icons on the menu items by\r\n\t   disabling the <em>Display menu item icons</em> option.</p>\r\n\t<h2>Register the Shell Extension</h2>\r\n\t<p>The shell extension does not work automatically with disc images and\r\n\t   InfraRecorder projects. When enabling the <em>Enalbe InfraRecorder shell\r\n\t   extension</em>, InfraRecorder tells Windows Explorer that it offer other\r\n\t   applications to use it's extended features.</p>\r\n\t<p>To make Windows Explorer use the additional features supplied by the\r\n\t   InfraRecorder shell extension, the shell extension must be registered with\r\n\t   the file types that should be able to use the extra features.</p>\r\n\t<dl>\r\n\t\t<dt>There are a set of predefined file extensions available in the list. To\r\n\t\t    associate the InfraRecorder shell extension with a file type, just check\r\n\t\t    the item in the list view. You can add any additional file types to the \r\n\t\t    list by pressing the <em>Add file extension</em> button:</dt>\r\n\t\t<dd><img src=\"../images/button_add.bmp\"></dd>\r\n\t</dl>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/copy_audio_disc.html",
    "content": "<html>\r\n<head>\r\n<title>Copy Audio Disc</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Copy Audio Disc</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Copying an audio disc requires more steps than copying a data disc. First\r\n\t   \t    you must save the audio tracks on your hard drive. To do so, open the\r\n\t\t    tracks dialog by:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Manage Tracks...</strong></dd>\r\n\t\t<dt>The windows should look similar to this screenshot when you have selected\r\n\t\t    your source device and inserted an audio disc:</dt>\r\n\t\t<dd><img src=\"../images/screenshot_managetracks.png\"></dd>\r\n\t\t<dt>Now select the tracks you want to save (copy) by clicking and holding the\r\n\t\t    shift or control button. When you have selected the tracks press the <em>\r\n\t\t    save tracks button</em>:\r\n\t\t<dd><img src=\"../images/button_savetracks.bmp\"></dd>\r\n\t</dl>\r\n\t<p>You will now be prompted to select a target directory for the tracks.\r\n\t   Please go ahead and select a folder of your choice. When you have selected\r\n\t   a folder all the tracks that you have selected will be saved there (unless\r\n\t   any major read errors occured).</p>\r\n\t<p>You next step is to create a new audio project and add the tracks you just\r\n\t   saved to it. Please read this <a href=\"working_with_projects/getting_started.html\">\r\n\t   topic</a> for more information.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/copy_data_disc.html",
    "content": "<html>\r\n<head>\r\n<title>Copy Data Disc</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Copy Data Disc</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Please note that this page contains information on how to copy a data disc.\r\n\t   If you want to copy an audio disc (which is an entirely different process)\r\n\t   please see <a href=\"copy_audio_disc.html\">this</a> topic.</p>\r\n\t<p>When you want to copy a data disc you have two main options which is if you\r\n\t   want to copy the disc directly to another drive (for example from a\r\n\t   CD-reader to a CD-recorder) or to a disc image on your hard drive.</p>\r\n\t<h1>Copy to a Compact Disc</h2>\r\n\t<dl>\r\n\t\t<dt>To copy a disc directly to another drive, use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Copy Disc <img src=\"../images/arrow.png\"> to a Compact Disc...</strong></dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../images/button_copy.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Source</h2>\r\n\t<p>Select the source drive which contains the compact disc that you want to\r\n\t   make a copy of.</p>\r\n\t<h2>Target</h2>\r\n\t<p>Select the target drive which contains the empty compact disc that you want\r\n\t   to write the copy to. Please note that the target drive can not be the same\r\n\t   as the source drive.</p>\r\n\t<h2>On The Fly</h2>\r\n\t<p>Writing <em>on the fly</em> means that the data will be read from the\r\n\t   source drive and then directly written to the target (recorder) without any\r\n\t   buffering on your hard drive (only a relatively small memory buffer is\r\n\t   used). If your source drive would fail to read some sectors on the source\r\n\t   disc it might not be able to supply the target (recorder) with data fast\r\n\t   enough, resulting in write errors on the target disc. However most new\r\n\t   recorder offer some kind of buffer underrun protection technology that\r\n\t   should protect the targe disc if this event occurs.</p>\r\n\t<p>When the <em>On the fly</em> option is disabled a temporary disc image will\r\n\t   first be created on your hard drive. The disc image will then be written to\r\n\t   the target drive. Using this option requires more free disc space on your\r\n\t   hard drive but is recommended in most cases.</p>\r\n\t<h2>Clone Disc</h2>\r\n\t<p>When this option is enabled all sub-channel data and the full TOC on the\r\n\t   source disc will also be copied to the target disc. This option must be\r\n\t   enabled when copying a mixed-mode disc, otherwise only the data track will\r\n\t   be copied. It's recommended that your record the target disc using the\r\n\t   raw96r write method. If that method is not supported by your recorder,\r\n\t   please try the raw16 write method.</p>\r\n\t<h2>Read Options</h2>\r\n\t<p>The read options are described in <a href=\"read_options.html\">this</a> topic.</p>\r\n\t<h2>Other Options</h2>\r\n\t<p>The other options are described in <a href=\"burn_options.html\">this</a> topic.</p>\r\n\t<hr>\r\n\t<h1>Copy to a Disc Image</h1>\r\n\t<dl>\r\n\t\t<dt>To copy a disc to a disc image on the hard drive, use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Copy Disc <img src=\"../images/arrow.png\"> to a Disc Image...</strong></dd>\r\n\t</dl>\r\n\t<h2>Source</h2>\r\n\t<p>Select the source drive which contains the compact disc that you want to\r\n\t   make a copy of.</p>\r\n\t<h2>Image File</h2>\r\n\t<p>Select the location and name of the disc image. Please note that you will\r\n\t   approximateley need the same amount of size avaiable on your hard drive as\r\n\t   the compact disc contains.</p>\r\n\t<h2>Read Options</h2>\r\n\t<p>The read options are described in <a href=\"read_options.html\">this</a> topic.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/device_configuration.html",
    "content": "<html>\r\n<head>\r\n<title>Device Configuration</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Device Configuration</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>If you have many any changes in your hardware configuration you probably\r\n\t   \t    want to make InfraRecorder aware of the changes. To display the\r\n\t\t    InfraRecorder device configuration, use the menu:</dt>\r\n\t\t<dd><strong>Options <img src=\"../images/arrow.png\"> Devices...</strong></dd>\r\n\t</dl>\r\n\t<p>You will now see a list of devices that have been detected by InfraRecorder. If\r\n\t   you want to update the configuration, press the <em>Rescan</em> button. This will\r\n\t   cause InfraRecorder to perform a full system scan gather information about all\r\n\t   supported devices.</p>\r\n\t<p>If you want InfraRecorder to silently validate the configuration everytime\r\n\t   you start it, enable the <em>Silently validate the configuration at\r\n\t   startup</em> option.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/disc_information.html",
    "content": "<html>\r\n<head>\r\n<title>Disc Information</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Disc Information</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>To view detailed information about a disc, please use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Disc Information\r\n\t\t    <img src=\"../images/arrow.png\"></strong> &lt;select the drive containing the disc that you're interested in&gt;</dd>\r\n\t</dl>\r\n\t<h2>Field Information</h2>\r\n\t<p>The <em>Disc type</em> field displays what type of disc that is inserted in\r\n\t   the drive. For example: CD-R, DVD+R DL.</p>\r\n\t<p>The <em>Book type</em> field is only valid on DVD discs and displays of\r\n\t   what book type the DVD is.</p>\r\n\t<p>The <em>Region</em> field displays what region encoding the DVD has. The\r\n\t   region number can be resolved into the following regions:</p>\r\n\t<ol>\r\n\t\t<li><span>United States of America, Canada.</span></li>\r\n\t\t<li><span>Europe, including France, Greece, Turkey, Egypt, Arabia, Japan and\r\n\t\t    South Africa</span>.</li>\r\n\t\t<li><span>Korea, Thailand, Vietnam, Borneo and Indonesia.</span></li>\r\n\t\t<li><span>Australia and New Zealand, Mexico, the Caribbean, and South\r\n\t\t    America.</span></li>\r\n\t\t<li><span>India, Africa, Russia and former USSR countries.</span></li>\r\n\t\t<li><span>Peoples Republic of China.</span></li>\r\n\t\t<li><span>Unused.</span></li>\r\n\t\t<li><span>Airlines and cruise ships.</span></li>\r\n\t\t<li><span>Expansion (often used as region free).</span></li>\r\n\t</ol>\r\n\t<p>The <em>Layers</em> field displays the number of layers on the disc.</p>\r\n\t<p>The <em>Tracks</em> field displays the number of tracks on the disc.</p>\r\n\t<p>The <em>Sessions</em> field displays the number of sessions on the disc.</p>\r\n\t<p>The <em>Status</em> field displays information about the disc and session\r\n\t   status as well as information on if the disc is erasable or not.</p>\r\n\t<p>The <em>Used space</em> field displays the amount of used space on the\r\n\t   disc.</p>\r\n\t<p>The <em>Free space</em> field displays the amount of free space on the\r\n\t   disc.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/erase_disc.html",
    "content": "<html>\r\n<head>\r\n<title>Erase Disc</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Erase Disc</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>To erase a rewritable disc, you can either use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Erase Rewritable Disc...</strong></dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../images/button_erase.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Recorder</h2>\r\n\t<p>Please select the recorder that you want to use for erasing the disc.</p>\r\n\t<h2>Erase Method</h2>\r\n\t<p>Select one of the four erase methods to use. The <em>Erase the entire disc\r\n\t   </em> method will destroy all data on the disc. This operation may take\r\n\t   a long time. Using the <em>Minimally erase the disc</em> method will only\r\n\t   cause the table of contents (TOC), PMA and pregap to be erased. Basicly the\r\n\t   actual data is never erased from the disc (it will not be accessible),\r\n\t   the data will instead be overwritten when you write to the disc the next\r\n\t   time. This method is very fast can can often be done in about 10 seconds.\r\n\t   The <em>Unclose last session</em> method uncloses the last session (on a\r\n\t   closed multi-session disc) allowing more sessions to be added to the disc.\r\n\t   The last method <em>Erase last session</em> will simply just erase the last\r\n\t   session on the disc. This may take long or short time depending on the size\r\n\t   of the session.</p>\r\n\t<h2>Other Options</h2>\r\n\t<p>If the table of contents (TOC) for some reason has been damaged on a\r\n\t   disc, InfraRecorder will not erase the disc unless the <em>Ignore illegal\r\n\t   TOC</em> option is set.</p>\r\n\t<p>Activating the <em>Simulation</em> option will cause InfraRecorder to\r\n\t   perform the selected action but with the recorder's laser turned off. This\r\n\t   option is recommended if you are unsure if the operation will succeed or\r\n\t   not.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/fixate_disc.html",
    "content": "<html>\r\n<head>\r\n<title>Close Disc</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Close Disc</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>A closed disc is a disc that is considered to be finished.\r\n\t\t\tNormally a disc is automatically closed after recording data. This tool is\r\n\t\t    useful if data has been written but the disc for some reason hasn't been\r\n\t\t    closed. To close a disc, use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Close Disc...</strong></dd>\r\n\t</dl>\r\n\t<h2>Recorder</h2>\r\n\t<p>Please select the recorder that contains the disc that you want to close.</p>\r\n\t<h2>Other Options</h2>\r\n\t<p>Activating the <em>Simulation</em> option will cause InfraRecorder to\r\n\t   perform the selected action but with the recorder's laser turned off. This\r\n\t   option is recommended if you are unsure if the operation will succeed or\r\n\t   not.</p>\r\n</div>\r\n</body>\r\n</html>"
  },
  {
    "path": "doc/english/how_to_use/manage_tracks.html",
    "content": "<html>\r\n<head>\r\n<title>Manage Tracks</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Manage Tracks</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>The <em>Manage Tracks</em> tool displays table of contents (TOC)\r\n\t\t    information about a certain disc. It does also offer tools to save and\r\n\t\t    verify selected tracks. To open the track manager, use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Manage Tracks...</strong></dd>\r\n\t</dl>\r\n\t<p>Select the tracks that you want to work with by clicking the mouse while\r\n\t   pressing the shift or control key. You can also use the keyboard arrows\r\n\t   to navigate and select in the track list.</p>\r\n\t<dl>\r\n\t\t<dt>When you save tracks to your hard drive you will be prompted to\r\n\t\t    select a target directory. The tracks will then automatically be saved\r\n\t\t    and named by their track number and type (Track 1.wav, Track 2.iso). To\r\n\t\t    save the selected tracks to you hard drive, press the <em>save tracks\r\n\t\t    </em> button:</dt>\r\n\t\t<dd><img src=\"../images/button_savetracks.bmp\"></dd>\r\n\t\t<dt>To scan the selected tracks for errors, use the <em>verify tracks</em> button:\r\n\t\t<dd><img src=\"../images/button_verifytracks.bmp\"></dd>\r\n\t</dl>\r\n\t<h1>Screenshots</h1>\r\n\t<p>The result after verifying a data track:</p>\r\n\t<p><img src=\"../images/screenshot_trackscanres.png\"></p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/read_options.html",
    "content": "<html>\r\n<head>\r\n<title>Read Options</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?</div>\r\n\t<div id=\"topic\">Read Options</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>This topic covers the read options that appear on various places\r\n\t   in InfraRecorder, for example when you want to copy a disc either\r\n\t   to a disc image or to another disc.</p>\r\n\t<p>Altough these options are accessable in many different contexts as\r\n\t   mentioned above, they are always presented in a similar way:</p>\r\n\t<p><img src=\"../images/screenshot_read.png\"></p>\r\n\t<h1>Read Settings</h1>\r\n\t<h2>Ignore read errors</h2>\r\n\t<p>Enabling this option will cause the high level error checking not to abort\r\n\t   when errors are found in the data stream. The drive will also be switched\r\n\t   into a mode where it ignores read errors in data sectors that are a result\r\n\t   of uncorrectable ECC/EDC errors before reading.</p>\r\n\t<h2>Read all sub-channel data and the full TOC</h2>\r\n\t<p>When this option is enabled the disc will be read with all sub-channel\r\n\t   data and a full TOC. The full TOC data will be put into a file with\r\n\t   similar name to the specified image name but with the suffix\r\n\t   <strong>.toc</strong>.</p>\r\n\t<h2>Read speed</h2>\r\n\t<p>Select the speed to use when reading the disc. Selecting the <em>\r\n\t   Maximum</em> option will automatically select the highest speed that the\r\n\t   drive is capable of. Only MMC compliant drives will benefit from this\r\n\t   option. The speed of non MMC drives is not changed.</p>\r\n\t<p>Using a lower speed may increase the readability of a disc.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/working_with_projects/add_boot_image.html",
    "content": "<html>\r\n<head>\r\n<title>Add Boot Image</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?, Working with Projects</div>\r\n\t<div id=\"topic\">Add Boot Image</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>There are several options that you may need to configure when adding a boot\r\n\t   image to your project.</p>\r\n\t<h2>Local Path</h2>\r\n\t<p>In this field you should specify the local path of the selected boot image.\r\n\t   The path is relative to the root folder of the disc. For example: /boot/\r\n\t   will create a folder called boot in the root that contains the file that\r\n\t   you have selected.</p>\r\n\t<h2>Emulation Type</h2>\r\n\t<p>This option lets your specify the type of emulation that should be used on\r\n\t   the \"El Torino\" boot disc. If the emulation type is set to <em>Floppy</em>,\r\n\t   the boot image must be exactly the size of a 1200, 1440 or 2880 KiB floppy.\r\n\t   If the emulation type is set to <em>Harddisk</em>, the boot image must\r\n\t   begin with a master boot record that contains a single partition. Using no\r\n\t   emulation will cause the system to load and execute the image without\r\n\t   performing any disc emulation.</p>\r\n\t<h2>Advanced Options</h2>\r\n\t<p>The <em>Don't make image bootable</em> option allows you to prevent the \r\n\t   disc from beeing marked as bootable. The system will provide an emulated\r\n\t   drive for the image, but will boot off a standard boot device.</p>\r\n\t<p>Enabling the <em>Write boot-info-table to the image</em> option will cause\r\n\t   the boot image to be patched at offset 8 with a 54-byte table containing\r\n\t   information about the disc layout. If this option is enabled the local\r\n\t   boot image that you have specified will be patched, so make sure that you\r\n\t   have a backup of this file if it can't be easily regenerated.</p>\r\n\t<p>The <em>Boot load segment</em> option allows you to specify the load\r\n\t   segment address (in hexadecimal) for no-emulation \"El Torito\" discs.</p>\r\n\t<p>The <em>Boot load size</em> option allows you to specify the number\r\n\t   (in hexadecimal) of virtual (512-byte) sectors to load in no-emulation mode.\r\n\t   It's usually recommended to load the entire boot file. Some BIOSes may have\r\n\t   problems if this size is not a multiple of 4.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/working_with_projects/getting_started.html",
    "content": "<html>\r\n<head>\r\n<title>Getting Started</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?, Working with Projects</div>\r\n\t<div id=\"topic\">Getting Started</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>This topic will help you get started with your first custom CD project.\r\n\t   InfraRecorder currently supports three kinds of projects.</p>\r\n\t<p><em>Data Disc</em>\r\n\t   projects are used for creating discs that contains files and folders (using\r\n\t   the ISO9660 filesystem) that can be used on almost any computer. Data discs\r\n\t   does not hold as much data per sector as audio discs due to the fact that\r\n\t   data discs also stores addition error-check/correction data. As a result of\r\n\t   this, data discs can be recorded in higher speed without necessary loose\r\n\t   any quality/data. Data discs can be created in multiple steps, allowing\r\n\t   data to be added to existing CDs. See <a href=\"multisession_disc.html\">this</a>\r\n\t   topic for more information on the subject.</p>\r\n\t<p><em>Audio Disc</em> projects are used for creating audio discs that will\r\n\t   play in any CD-player (and computer). Audio projects should normally be\r\n\t   recorded at lower write speeds than data projects because audio discs does\r\n\t   not contain any error-checking/correction data.</p>\r\n\t<p><em>Mixed-Mode CD</em> projects are used for creating discs that contains\r\n\t   one first data track which shares the features of a <em>Data Disc</em>\r\n\t   project followed by a number of audio tracks. A <em>Mixed-Mode CD</em> will\r\n\t   play in any CD-player, but the first (data) track will sound like noise.\r\n\t   The audio tracks will play as normal.</p>\r\n\t<dl>\r\n\t\t<dt>To create a new project, use the menu:</dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> New Project\r\n\t\t    <img src=\"../../images/arrow.png\"></strong> &lt;select the type of\r\n\t\t    project that you want to create&gt;</dd>\r\n\t\t<dt>To open an existing project, use the menu:</dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> Open Project...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../../images/button_open.bmp\"></dd>\r\n\t</dl>\r\n\t<p>InfraRecorder projects can be recorded directly to a physical compact disc\r\n\t   or to a disc image. A disc image is a file stored on your computer that\r\n\t   contains all the file data that you have added to your project (with\r\n\t   exception for audio tracks in <em>Mixed-Mode</em> and <em>Audio</em>\r\n\t   projects). A disc image can be recorded at a later time. See\r\n\t   <a href=\"../burn_image.html\">this</a> topic for more information.</p>\r\n\t<dl>\r\n\t\t<dt>To record your project to a compact disc, you can use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Burn Compilation\r\n\t\t    <img src=\"../../images/arrow.png\"> to a Compact Disc...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../../images/button_recordcd.bmp\"></dd>\r\n\t</dl>\r\n\t<p>A detailed description of the recording options can be in\r\n\t   <a href=\"../burn_options.html\">this</a> topic.</p>\r\n\t<h1>Environment</h1>\r\n\t<h2>General</h2>\r\n\t<dl>\r\n\t\t<dt>The <em>Explorer View</em> toolbar is used for navigating the explorer\r\n\t\t    view and for adding files that are selected in the explorer list view to\r\n\t\t    your project.</dt>\r\n\t\t<dd><img src=\"../../images/toolbar_explorerview.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>The <em>Disc Layout</em> toolbar is used for project navigation and\r\n\t\t    management.</dt>\r\n\t\t<dd><img src=\"../../images/toolbar_disclayout.png\"></dd>\r\n\t</dl>\r\n\t<h2>File Management</h2>\r\n\t<dl>\r\n\t\t<dt>The <em>Edit</em> menu is used for project file management:\r\n\t\t<dd><img src=\"../../images/menu_edit.png\"></dd>\r\n\t\t<dt>The options available from the edit menu (above) are also avaiable for\r\n\t\t    faster access by right-clicking in the project view. For example if your\r\n\t\t    right-click on a folder this menu will appear:\r\n\t\t<dd><img src=\"../../images/menu_projectlistview.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>If you add more data to your project than what the selected media can\r\n\t\t    contain, the space meter at the bottom of the view will turn red:\r\n\t\t<dd><img src=\"../../images/spacemeter_full.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>The space meter will turn orange if the amount of data added to the\r\n\t\t    project exceeds the offical size of the media but will probably fit on\r\n\t\t    the media if recorded with <a href=\"../burn_options.html#advanced\">overburn</a>\r\n\t\t    enabled:\r\n\t\t<dd><img src=\"../../images/spacemeter_warn.png\"></dd>\r\n\t</dl>\r\n\t<p>You can change the space meter size to match the actual size of the blank\r\n\t   disc that you will record your project on. To do so, right click on the\r\n\t   space meter and select the apropriate media size.</p>\r\n\t<hr>\r\n\t<h1>File Management</h1>\r\n\t<h2>Add Files</h2>\r\n\t<p>There are many different ways to add files to your project. You can use\r\n\t   drag and drop from the <em>Explorer View</em> and from Windows Exlporer.\r\n\t   You can also navigate the <em>Explore View</em> and select the files you\r\n\t   want to include in your project.</p>\r\n\t<dl>\r\n\t\t<dt>When you have selected the files you want, you can use the menu:</dt>\r\n\t\t<dd><strong>Edit <img src=\"../../images/arrow.png\"> Add\r\n\t\t    <img src=\"../../images/arrow.png\"> Selected</strong></dd>\r\n\t\t<dt>or the toolbar button in the <em>Explorer View</em> toolbar:</dt>\r\n\t\t<dd><img src=\"../../images/button_addselected.bmp\"></dd>\r\n\t</dl>\r\n\t<p>You can also use the <em>Explorer View</em> to nagivate to a folder and\r\n\t   quickly add all files and folder in that folder to your project.\r\n\t<dl>\r\n\t\t<dt>To add all files and folder in the active <em>Explorer View</em> folder,\r\n\t\t    use the menu:</dt>\r\n\t\t<dd><strong>Edit <img src=\"../../images/arrow.png\"> Add\r\n\t\t    <img src=\"../../images/arrow.png\"> All</strong></dd>\r\n\t\t<dt>or the toolbar button in the <em>Explorer View</em> toolbar:</dt>\r\n\t\t<dd><img src=\"../../images/button_addall.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Remove Files</h2>\r\n\t<p>There are several ways of removing files and folders from your project. One\r\n\t   way is to press the delete key on your keyboard. You can also use the menu\r\n\t   or the toolbar button.</p>\r\n\t<dl>\r\n\t\t<dt>To remove files using the menu, do the following:</dt>\r\n\t\t<dd><strong>Edit <img src=\"../../images/arrow.png\"> Remove</strong></dd>\r\n\t\t<dt>you can also use the toolbar button in the <em>Disc Layout</em> toolbar:\r\n\t\t    </dt>\r\n\t\t<dd><img src=\"../../images/button_remove.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Other Operations</h2>\r\n\t<dl>\r\n\t\t<dt>To rename a file or folder, use the menu:</dt>\r\n\t\t<dd><strong>Edit <img src=\"../../images/arrow.png\"> Rename</strong></dd>\r\n\t\t<dt>or the toolbar button in the <em>Disc Layout</em> toolbar:</dt>\r\n\t\t<dd><img src=\"../../images/button_rename.bmp\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>To add a new empty folder to your project, use the menu:</dt>\r\n\t\t<dd><strong>Edit <img src=\"../../images/arrow.png\"> New Folder</strong></dd>\r\n\t\t<dt>or the toolbar button in the <em>Disc Layout</em> toolbar:</dt>\r\n\t\t<dd><img src=\"../../images/button_newfolder.bmp\"></dd>\r\n\t</dl>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/working_with_projects/multisession_disc.html",
    "content": "<html>\r\n<head>\r\n<title>Multi-Session Disc</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?, Working with Projects</div>\r\n\t<div id=\"topic\">Multi-Session Disc</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>A multi-session disc is a disc that contains multiple sessions. A\r\n\t   multi-session disc can be recorded in multiple steps by recording one\r\n\t   session at a time.</p>\r\n\t<h2>Creating New Multi-Session Discs</h2>\r\n\t<dl>\r\n\t\t<dt>Creating a new multi-session disc is easy. To create a new multi-session\r\n\t\t    disc, create a new data project:</dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> New Project\r\n\t\t    <img src=\"../../images/arrow.png\"> Data Disc</strong></dd>\r\n\t\t<dt>Open the project properties:</dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> Project Properties...\r\n\t\t    </strong></dd>\r\n\t\t<dt>Select the ISO tab and change the <em>Format</em> to:</dt>\r\n\t\t<dd><strong>Mode 2 XA (multisession)</strong></dd>\r\n\t</dl>\r\n\t<p>You can now add files and folder to you project as usual. See\r\n\t   <a href=\"getting_started.html\">this</a> topic for more information on how\r\n\t   to work with projects.</p>\r\n\t<h2>Continue Multi-Session Discs</h2>\r\n\t<dl>\r\n\t\t<dt>To add more data to an existing multi-session disc you must import the\r\n\t\t    existing session data into your project. To do so, use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Import Session...\r\n\t\t    </strong></dd>\r\n\t</dl>\r\n\t<p>A window will popup which allows you to select a device and view how much\r\n\t   allocated and free space that is available on the disc. If the OK-button is\r\n\t   greyed it means that the disc can not be imported.</p>\r\n\t<p>When you have selected the device which has the multi-session disc that you\r\n\t   want to import inserted. Press the OK-button and the data will be imported\r\n\t   into your project. The imported data can not be manipulated or removed\r\n\t   from the disc. All imported files and folders are displayed in grey\r\n\t   text.</p>\r\n\t<dl>\r\n\t\t<dt>When are done working with the new session and want to add the new data\r\n\t\t    to the disc, either use the menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Burn Compilation\r\n\t\t    <img src=\"../../images/arrow.png\"> to a Compact Disc...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>or the toolbar button:</dt>\r\n\t\t<dd><img src=\"../../images/button_recordcd.bmp\"></dd>\r\n\t</dl>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/how_to_use/working_with_projects/project_settings.html",
    "content": "<html>\r\n<head>\r\n<title>Project Settings</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">How to Use?, Working with Projects</div>\r\n\t<div id=\"topic\">Project Settings</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>This topic covers the project settings that are accessible from the menu:\r\n\t\t    </dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> Project Properties...\r\n\t\t    </strong></dd>\r\n\t</dl>\r\n\t<h1>General Settings</h1>\r\n\t<p>The only general setting that you are able to change is the disc label. The\r\n\t   default suggested label is based on the date and time of when the project\r\n\t   was created. Please note that the label applies to the same restrictions as\r\n\t   general file names in the project (see the <em>ISO Settings</em> section).\r\n\t   </p>\r\n\t<h1>ISO Settings</h1>\r\n\t<h2>Level</h2>\r\n\t<p>This option sets the ISO conformance level which basicly are different\r\n\t   levels of file name restrictions. There are three levels supported in\r\n\t   InfraRecorder:</p>\r\n\t<ol>\r\n\t\t<li><span>Level 1 uses file names in the 8.3 format (eight characters with a\r\n\t\t    three-character extension), upper case letters, numbers and underscore.\r\n\t\t    The maximum directory depth is eight.</span></li>\r\n\t\t<li><span>Level 2 allows file names to be up to 31 characters long.</span>\r\n\t\t    </li>\r\n\t\t<li><span>Level 3 allows files to be fragmented (mainly to allow packet\r\n\t\t    writing, or incremental CD recording).</span></li>\r\n\t\t<li><span>Level 4 does not really exist, but when selected the ISO-9660:1999\r\n\t\t    (which is ISO-9660 version 2) standard is used. This standard allows\r\n\t\t    file names to be up to 207 characters long and the directory structure\r\n\t\t    may be more than eight levels deep.</span></li>\r\n\t</ol>\r\n\t<h2>Character Set</h2>\r\n\t<p>Defines the character set used in the local file names included in the\r\n\t   project. InfraRecorder tries to automatically detect the character set\r\n\t   used on your system.</p>\r\n\t<h2>Format</h2>\r\n\t<p>This option specifies the format that should be used when writing your\r\n\t   project data to a disc. <em>Mode 1</em> is normally used when creating\r\n\t   regular non multi-session discs while <em>Mode 2</em> should be used when\r\n\t   creating multi-session discs. <em>Mode 1</em> allows 2048 bytes of data per\r\n\t   sector, <em>Mode 2</em> allows 2336 bytes of data per sector (A CD-ROM\r\n\t   sector is 2352 bytes large).</p>\r\n\t<h2>Other Options</h2>\r\n\t<p>The <em>Use Joliet file name extension</em> adds Joliet directory records\r\n\t   to the disc in addition to regular ISO9660 file names. The joliet extension\r\n\t   is commonly used on Windows systems and allows unicode file names with a\r\n\t   maximum length of 64 characters.</p>\r\n\t<p>If you want to use even longer file names you can enable the <em>Allow more\r\n\t   than 64 characters for Joliet names</em> option. This is not fully\r\n\t   compatible with the Joliet specification but seems to work. The maximum\r\n\t   character length is extended to 103 characters.</p>\r\n\t<p>The <em>Include UDF support in the generated file system</em> option is\r\n\t   self explanatory. UDF support is currently in alpha status, and for this\r\n\t   reason it's not possible to generate UDF only filesystems.</p>\r\n\t<p>The <em>Omit version number from ISO9660 file names</em> option is self\r\n\t   explanatory.</p>\r\n\t<h1>Fields</h1>\r\n\t<p>This secion contains options to specify information about the people behind\r\n\t   the CD-project. The <em>Publisher</em>, <em>Preparer</em>, <em>System</em>\r\n\t  and <em>Volume set</em> fields should be edited directly, the other fields\r\n\t  often contains file names due to the limited character length of 36\r\n\t  characters.</p>\r\n\t<h1>Audio Settings</h1>\r\n\t<p>This secion allows you to create CD-Text information. CD-Text is a format\r\n\t   supported by some (many?) CD-players that allows track and artist\r\n\t   information to be displayed when the CD is playing. These options are\r\n\t   available in audio and mixed-mode projects.</p>\r\n\t<h1>Boot Settings</h2>\r\n\t<dl>\r\n\t\t<dt>This section is only available on data projects and allows you to specify\r\n\t\t    up to 63 boot images that will be used to create an \"El Torito\" bootable\r\n\t\t    disc. To add a new boot image to the project, click the <em>Add boot\r\n\t\t    image</em> button:</dt>\r\n\t\t<dd><img src=\"../../images/button_add.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Boot Catalog</h2>\r\n\t<p>This option specifies the path and filename of the boot catalog to be used\r\n\t   when making an \"El Torito\" bootable disc. The path name should be relative\r\n\t   to the root on the disc. The file will be inserted into the output tree and\r\n\t   not created in the source filesystem. Please make sure that the specified file\r\n\t   name does not conflict with an existing file.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/acknowledgments.html",
    "content": "<html>\r\n<head>\r\n<title>Acknowledgments</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Acknowledgments</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>InfraRecorder uses icons and derivate work based on the icons in the\r\n\t   <a href=\"http://tango.freedesktop.org\">Tango Icon Project</a>. The\r\n\t   derivative work based on the Tango Icons can be separateley downloaded\r\n\t   (under the <a href=\"http://creativecommons.org/licenses/by-sa/2.5/\">\r\n\t   Creative Commons Attribution Share-Alike license</a>) from the\r\n\t   official InfraRecorder website.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/copyright.html",
    "content": "<html>\r\n<head>\r\n<title>Copyright</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Copyright</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>InfraRecorder copyright &copy; 2006-2010 Christian Kindahl.</p>\r\n\t<h2>InfraRecorder works in co-operation with the following software:</h2>\r\n\t<ul>\r\n\t\t<li>cdrecord &copy; 1995-2006 J&ouml;rg Schilling.</li>\r\n\t\t<li>readcd &copy; 1987, 1995-2006 J&ouml;rg Schilling.</li>\r\n\t\t<li>cdda2wav by <a href=\"http://www.mode.net\">Project MODE</a>,\r\n\t\t    <a href=\"http://www.iis.fhg.de\">Fraunhofer Institut f&uuml;r integrierte Schaltungen</a>.</li>\r\n\t</ul>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/faq.html",
    "content": "<html>\r\n<head>\r\n<title>Frequently Asked Questions</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Frequently Asked Questions</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>For a more up-to-date list of questions and answers, please visit\r\n\t   <a href=\"http://infrarecorder.org\">http://infrarecorder.org</a>.</p>\r\n\t<p><strong>InfraRecorder does not my disc devices, how do I solve this \r\n\t           problem?</strong>\r\n\t   <br/>This is most likely a permission issue. By default InfraRecorder\r\n\t        uses an interface called SPTI to access disc devices. On Windows\r\n\t        2000, XP and 2003 systems administrator permissions are required in\r\n\t        order to use SPTI.</p>\r\n\t<p>If you want to allow limited user accounts to access disc devices using\r\n\t   SPTI, please do the following when logged in as an administrator:</p>\r\n\t<ol>\r\n\t    <li><span>Navigate \"Start\" then \"Run\" in the Windows\r\n\t              start-menu.</span></li>\r\n\t    <li><span>Type \"secpol.msc\" without the quotes and press the OK\r\n\t              button.</span></li>\r\n\t    <li><span>Navigate \"Local Policies\" then \"Security Options\" in the\r\n\t              tree.</span></li>\r\n\t    <li><span>Change \"Devices: Restrict CD-ROM access to locally logged-on\r\n\t              user only\" item from \"Disabled\" to \"Enabled.\".</span></li>\r\n\t</ol>\r\n\t<p>Please note that some versions of Windows (Windows XP home for example)\r\n\t   does not have \"secpol.msc\". If using such a system please do the\r\n\t   following instead (while logged in as an administrator):</p>\r\n\t<ol>\r\n\t    <li><span>Navigate \"Start\" then \"Run\" in the Windows\r\n\t              start-menu.</span></li>\r\n\t    <li><span>Type \"regedit\" without the quotes and press the OK\r\n\t              button.</span></li>\r\n\t    <li><span>Navigate \"HKEY_LOCAL_MACHINE\", \"SOFTWARE\", \"Microsoft\",\r\n\t              \"Windows NT\", \"CurrentVersion\" and finally \"Winlogon\" in the\r\n\t              tree</span></li>\r\n\t    <li><span>In the selected path, add a string value named\r\n\t              \"allocatecdroms\" with the value \"1\" (without the\r\n\t              quotes). If the string value already exist with the value\r\n\t              \"0\", simply change it to \"1\".</span></li>\r\n\t</ol>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/feature_overview.html",
    "content": "<html>\r\n<head>\r\n<title>Feature Overview</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Feature Overview</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>This page lists the most essential features of InfraRecorder.</p>\r\n\t<h1>Main Features</h1>\r\n\t<ul>\r\n\t\t<li>Create custom data, music and mixed-mode projects and record them to\r\n\t\t    physical compact discs or disc images.</li>\r\n\t\t<li>Create and record disc images.</li>\r\n\t\t<li>Create direct disc copies, on the fly or by using a temporary disc\r\n\t\t    image.</li>\r\n\t\t<li>Erase (blank) rewritable discs using four different methods.</li>\r\n\t\t<li>Import session data from multi-session discs and append more sessions\r\n\t\t    to that kind of discs.</li>\r\n\t\t<li> Close discs (write lead-out information to prevent further data from\r\n\t\t     beeing added to the disc).</li>\r\n\t\t<li>Scan the SCSI/IDE bus for devices and collect detailed information\r\n\t\t    about their capabilities.</li>\r\n\t\t<li>Display detailed disc information.</li>\r\n\t\t<li>Read and save audio and data tracks to files (wav. and .iso)</li>\r\n\t\t<li>Scan selected tracks for errors.</li>\r\n\t</ul>\r\n\t<h1>Environment</h1>\r\n\t<ul>\r\n\t\t<li>Modern customizable Windows Explorer like interface.</li>\r\n\t\t<li>Drag and drop files from the explorer view of the program and Windows\r\n\t\t    Explorer to the project view.</li>\r\n\t\t<li>Uses different poject view layouts for different type of projects to\r\n\t\t    make the users work easier.</li>\r\n\t\t<li>Features a separate express application designed to guide the user to\r\n\t\t    the most essential tools as quick and easy as possible.</li>\r\n\t\t<li>Fully translatable interfaces for the main application, express\r\n\t\t    application and the shell extension.</li>\r\n\t</ul>\r\n\t<h1>Explorer Integration</h1>\r\n\t<p>Integrates with explorer and adds new shell context menu options.</p>\r\n\t<ul>\r\n\t\t<li>Record saved projects and disc images.</li>\r\n\t\t<li>Open and edit saved projects.</li>\r\n\t\t<li>Highly customizable, can be displayed in a submenu and with or without\r\n\t\t    menu icons.</li>\r\n\t\t<li>The shell extension can be registered with any file extension that the\r\n\t\t    user wants.</li>\r\n\t</ul>\r\n</div>\r\n</body>\r\n</html>"
  },
  {
    "path": "doc/english/infra_recorder/installation.html",
    "content": "<html>\r\n<head>\r\n<title>Installation</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Installation</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>The InfraRecorder installer supports different options/parameters for\r\n\t   unattended installations. The following parameters can be passed to the\r\n\t   installer:</p>\r\n\t<p><strong>/S</strong><br>Runs the installer (or uninstaller) silently. All\r\n\t   options will be default unless overrided by another parameter to the\r\n\t   installer.</p>\r\n\t<p><strong>/LANGUAGE=&lt;language&gt;</strong><br>Selects the language that\r\n\t   InfraRecorder should use. For example:\r\n\t   &quot;irsetup.exe /S /LANGUAGE=swedish&quot; will install InfraRecorder\r\n\t   silently with the default language set to Swedish.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/introduction.html",
    "content": "<html>\r\n<head>\r\n<title>Introduction</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Introduction</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<h2>Welcome</h2>\r\n\t<p>Thank you for installing InfraRecorder! InfraRecorder is a free CD\r\n\t   burning solution for Microsoft Windows.</p>\r\n\t<dl>\r\n\t\t<dt><h2>Quick Navigation</h2></dt>\r\n\t\t<dd><a href=\"feature_overview.html\">Feature Overview</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"license_agreement.html\">License Agreement</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"system_requirements.html\">System Requirements</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"quick_start.html\">Quick Start</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"copyright.html\">Copyright</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"acknowledgments.html\">Acknowledgments</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"whats_new.html\">What's New</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"installation.html\">Installation</a></dd>\r\n\t</dl>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/license_agreement.html",
    "content": "<html>\r\n<head>\r\n<title>License Agreement</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">License Agreement</div>\r\n</div>\r\n<div id=\"content\">\r\n<h3 style=\"text-align: center;\">GNU GENERAL PUBLIC LICENSE</h3>\r\n<p style=\"text-align: center;\">Version 3, 29 June 2007</p>\r\n\r\n<p>Copyright &copy; 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</p><p>\r\n\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.</p>\r\n\r\n<h3><a name=\"preamble\"></a>Preamble</h3>\r\n\r\n<p>The GNU General Public License is a free, copyleft license for\r\nsoftware and other kinds of works.</p>\r\n\r\n<p>The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nthe GNU General Public License is intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.  We, the Free Software Foundation, use the\r\nGNU General Public License for most of our software; it applies also to\r\nany other work released this way by its authors.  You can apply it to\r\nyour programs, too.</p>\r\n\r\n<p>When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.</p>\r\n\r\n<p>To protect your rights, we need to prevent others from denying you\r\nthese rights or asking you to surrender the rights.  Therefore, you have\r\ncertain responsibilities if you distribute copies of the software, or if\r\nyou modify it: responsibilities to respect the freedom of others.</p>\r\n\r\n<p>For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must pass on to the recipients the same\r\nfreedoms that you received.  You must make sure that they, too, receive\r\nor can get the source code.  And you must show them these terms so they\r\nknow their rights.</p>\r\n\r\n<p>Developers that use the GNU GPL protect your rights with two steps:\r\n(1) assert copyright on the software, and (2) offer you this License\r\ngiving you legal permission to copy, distribute and/or modify it.</p>\r\n\r\n<p>For the developers' and authors' protection, the GPL clearly explains\r\nthat there is no warranty for this free software.  For both users' and\r\nauthors' sake, the GPL requires that modified versions be marked as\r\nchanged, so that their problems will not be attributed erroneously to\r\nauthors of previous versions.</p>\r\n\r\n<p>Some devices are designed to deny users access to install or run\r\nmodified versions of the software inside them, although the manufacturer\r\ncan do so.  This is fundamentally incompatible with the aim of\r\nprotecting users' freedom to change the software.  The systematic\r\npattern of such abuse occurs in the area of products for individuals to\r\nuse, which is precisely where it is most unacceptable.  Therefore, we\r\nhave designed this version of the GPL to prohibit the practice for those\r\nproducts.  If such problems arise substantially in other domains, we\r\nstand ready to extend this provision to those domains in future versions\r\nof the GPL, as needed to protect the freedom of users.</p>\r\n\r\n<p>Finally, every program is threatened constantly by software patents.\r\nStates should not allow patents to restrict development and use of\r\nsoftware on general-purpose computers, but in those that do, we wish to\r\navoid the special danger that patents applied to a free program could\r\nmake it effectively proprietary.  To prevent this, the GPL assures that\r\npatents cannot be used to render the program non-free.</p>\r\n\r\n<p>The precise terms and conditions for copying, distribution and\r\nmodification follow.</p>\r\n\r\n<h3><a name=\"terms\"></a>TERMS AND CONDITIONS</h3>\r\n\r\n<h4><a name=\"section0\"></a>0. Definitions.</h4>\r\n\r\n<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>\r\n\r\n<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.</p>\r\n \r\n\r\n<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and\r\n&ldquo;recipients&rdquo; may be individuals or organizations.</p>\r\n\r\n<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the\r\nearlier work or a work &ldquo;based on&rdquo; the earlier work.</p>\r\n\r\n<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based\r\non the Program.</p>\r\n\r\n<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.</p>\r\n\r\n<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.</p>\r\n\r\n<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.</p>\r\n\r\n<h4><a name=\"section1\"></a>1. Source Code.</h4>\r\n\r\n<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work\r\nfor making modifications to it.  &ldquo;Object code&rdquo; means any non-source\r\nform of a work.</p>\r\n\r\n<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.</p>\r\n\r\n<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n&ldquo;Major Component&rdquo;, in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.</p>\r\n\r\n<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.</p>\r\n\r\n<p>The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.</p>\r\n\r\n<p>The Corresponding Source for a work in source code form is that\r\nsame work.</p>\r\n\r\n<h4><a name=\"section2\"></a>2. Basic Permissions.</h4>\r\n\r\n<p>All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.</p>\r\n\r\n<p>You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.</p>\r\n\r\n<p>Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.</p>\r\n\r\n<h4><a name=\"section3\"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>\r\n\r\n<p>No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.</p>\r\n\r\n<p>When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.</p>\r\n\r\n<h4><a name=\"section4\"></a>4. Conveying Verbatim Copies.</h4>\r\n\r\n<p>You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.</p>\r\n\r\n<p>You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.</p>\r\n\r\n<h4><a name=\"section5\"></a>5. Conveying Modified Source Versions.</h4>\r\n\r\n<p>You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:</p>\r\n\r\n<ul>\r\n<li>a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.</li>\r\n\r\n<li>b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    &ldquo;keep intact all notices&rdquo;.</li>\r\n\r\n<li>c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.</li>\r\n\r\n<li>d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.</li>\r\n</ul>\r\n\r\n<p>A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.</p>\r\n\r\n<h4><a name=\"section6\"></a>6. Conveying Non-Source Forms.</h4>\r\n\r\n<p>You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:</p>\r\n\r\n<ul>\r\n<li>a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.</li>\r\n\r\n<li>b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.</li>\r\n\r\n<li>c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.</li>\r\n\r\n<li>d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.</li>\r\n\r\n<li>e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.</li>\r\n</ul>\r\n\r\n<p>A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.</p>\r\n\r\n<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, &ldquo;normally used&rdquo; refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.</p>\r\n\r\n<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.</p>\r\n\r\n<p>If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).</p>\r\n\r\n<p>The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.</p>\r\n\r\n<p>Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.</p>\r\n\r\n<h4><a name=\"section7\"></a>7. Additional Terms.</h4>\r\n\r\n<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.</p>\r\n\r\n<p>When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.</p>\r\n\r\n<p>Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:</p>\r\n\r\n<ul>\r\n<li>a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or</li>\r\n\r\n<li>b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or</li>\r\n\r\n<li>c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or</li>\r\n\r\n<li>d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or</li>\r\n\r\n<li>e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or</li>\r\n\r\n<li>f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.</li>\r\n</ul>\r\n\r\n<p>All other non-permissive additional terms are considered &ldquo;further\r\nrestrictions&rdquo; within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.</p>\r\n\r\n<p>If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.</p>\r\n\r\n<p>Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.</p>\r\n\r\n<h4><a name=\"section8\"></a>8. Termination.</h4>\r\n\r\n<p>You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).</p>\r\n\r\n<p>However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.</p>\r\n\r\n<p>Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.</p>\r\n\r\n<p>Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.</p>\r\n\r\n<h4><a name=\"section9\"></a>9. Acceptance Not Required for Having Copies.</h4>\r\n\r\n<p>You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.</p>\r\n\r\n<h4><a name=\"section10\"></a>10. Automatic Licensing of Downstream Recipients.</h4>\r\n\r\n<p>Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.</p>\r\n\r\n<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.</p>\r\n\r\n<p>You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.</p>\r\n\r\n<h4><a name=\"section11\"></a>11. Patents.</h4>\r\n\r\n<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>\r\n\r\n<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, &ldquo;control&rdquo; includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.</p>\r\n\r\n<p>Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.</p>\r\n\r\n<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.</p>\r\n\r\n<p>If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.</p>\r\n\r\n  \r\n<p>If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.</p>\r\n\r\n<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.</p>\r\n\r\n<p>Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.</p>\r\n\r\n<h4><a name=\"section12\"></a>12. No Surrender of Others' Freedom.</h4>\r\n\r\n<p>If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.</p>\r\n\r\n<h4><a name=\"section13\"></a>13. Use with the GNU Affero General Public License.</h4>\r\n\r\n<p>Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU Affero General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the special requirements of the GNU Affero General Public License,\r\nsection 13, concerning interaction through a network will apply to the\r\ncombination as such.</p>\r\n\r\n<h4><a name=\"section14\"></a>14. Revised Versions of this License.</h4>\r\n\r\n<p>The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.</p>\r\n\r\n<p>Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU General\r\nPublic License &ldquo;or any later version&rdquo; applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU General Public License, you may choose any version ever published\r\nby the Free Software Foundation.</p>\r\n\r\n<p>If the Program specifies that a proxy can decide which future\r\nversions of the GNU General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.</p>\r\n\r\n<p>Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.</p>\r\n\r\n<h4><a name=\"section15\"></a>15. Disclaimer of Warranty.</h4>\r\n\r\n<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>\r\n\r\n<h4><a name=\"section16\"></a>16. Limitation of Liability.</h4>\r\n\r\n<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.</p>\r\n\r\n<h4><a name=\"section17\"></a>17. Interpretation of Sections 15 and 16.</h4>\r\n\r\n<p>If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.</p>\r\n\r\n<p>END OF TERMS AND CONDITIONS</p>\r\n\r\n<h3><a name=\"howto\"></a>How to Apply These Terms to Your New Programs</h3>\r\n\r\n<p>If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.</p>\r\n\r\n<p>To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>\r\n\r\n<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;\r\n    Copyright (C) &lt;year&gt;  &lt;name of author&gt;\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.\r\n</pre>\r\n\r\n<p>Also add information on how to contact you by electronic and paper mail.</p>\r\n\r\n<p>If the program does terminal interaction, make it output a short\r\nnotice like this when it starts in an interactive mode:</p>\r\n\r\n<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;\r\n\r\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n    This is free software, and you are welcome to redistribute it\r\n    under certain conditions; type `show c' for details.\r\n</pre>\r\n\r\n<p>The hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, your program's commands\r\nmight be different; for a GUI interface, you would use an &ldquo;about box&rdquo;.</p>\r\n\r\n<p>You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU GPL, see\r\n&lt;http://www.gnu.org/licenses/&gt;.</p>\r\n\r\n<p>The GNU General Public License does not permit incorporating your program\r\ninto proprietary programs.  If your program is a subroutine library, you\r\nmay consider it more useful to permit linking proprietary applications with\r\nthe library.  If this is what you want to do, use the GNU Lesser General\r\nPublic License instead of this License.  But first, please read\r\n&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/quick_start.html",
    "content": "<html>\r\n<head>\r\n<title>Quick Start</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Quick Start</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt><h2>How to Use?</h2></dt>\r\n\t\t<dd><a href=\"../how_to_use/working_with_projects/getting_started.html\">\r\n\t\t    Getting Started</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/working_with_projects/multisession_disc.html\">\r\n\t\t    Multi-Session Discs</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/copy_data_disc.html\">Copy Data Discs</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/copy_audio_disc.html\">Copy Audio Discs</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/erase_disc.html\">Erase Rewritable Discs</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/disc_information.html\">View Disc Information</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/device_configuration.html\">Configure Devices</a></dd>\r\n\t</dl>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/system_requirements.html",
    "content": "<html>\r\n<head>\r\n<title>System Requirements</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">System Requirements</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>InfraRecorder has the following system requirements:</p>\r\n\t<ul>\r\n\t\t<li>Windows 98 with Internet Explorer 5.0 or newer.</li>\r\n\t\t<li>32 MiB RAM.</li>\r\n\t\t<li>8.1 MiB of available hard disk space.</li>\r\n\t</ul>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infra_recorder/whats_new.html",
    "content": "<html>\r\n<head>\r\n<title>What's New</title>\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script>\r\n</head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">What's New?</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Version 0.53.0.0</p>\r\n\t<ul>\r\n        <li>Fixed write speed detection issue.</li>\r\n        <li>Fixed bug where maximum write speed would be used instead of the\r\n            selected one when burning DVDs.</li>\r\n        <li>Fixed bug in creation of UDF and ISO9660 file systems containing\r\n            many files and folders.</li>\r\n        <li>Relaxed ISO9660 duplicate file naming algorithm.</li>\r\n        <li>Added support for non-standard character sets in ISO9660 file\r\n            systems.</li>\r\n        <li>Various minor GUI changes.</li>\r\n        <li>The space meter will now automatically adjust if a blank DVD is\r\n            inserted.</li>\r\n\t</ul>\r\n\t<p>Version 0.52.0.0</p>\r\n\t<ul>\r\n        <li>Fixed bug preventing reading and encoding audio tracks.</li>\r\n\t\t<li>Fixed DVD-Video file sorting bug, preventing fully compatible DVD-Video \r\n            DVDs from being created.</li>\r\n        <li>Added sane error message when failing to create DVD-Video file \r\n            system.</li>\r\n        <li>Devices with drive letters A or B are now detected properly.</li>\r\n        <li>Fixed shortcut icons on Windows 7 64-bit.</li>\r\n        <li>Added support for reading discs (creating disc image) to a network\r\n            location.</li>\r\n\t</ul>\r\n\t<p>Version 0.51.0.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed bug causing desktop icons to disappear on Windows 7.</li>\r\n\t\t<li>Fixed bug causing InfraRecorder to crash when opening the burn dialog\r\n\t\t    on systems with no recorder(s) present.</li>\r\n\t\t<li>Added support for burning files from UNC paths.</li>\r\n\t\t<li>Various other bug fixes.</li>\r\n\t\t<li>Increased maximum FIFO buffer size from 128 MiB to 800 MiB.</li>\r\n\t\t<li>Added context menu to explorer tree view.</li>\r\n\t\t<li>InfraRecorder will now flash on the task bar when an operation has\r\n\t\t    completed.</li>\r\n\t\t<li>Added French translation of help file, thanks to Olivier Higelin!</li>\r\n\t</ul>\r\n\t<p>Version 0.50.0.0</p>\r\n\t<ul>\r\n\t\t<li>Relaxed default project ISO9660 settings.</li>\r\n\t\t<li>Made progress dialogs resizable for easier reading.</li>\r\n\t\t<li>Added wait cursors to time consuming operations.</li>\r\n\t\t<li>Fixed bug causing failed operations to sometimes be reporeted as\r\n\t\t    successful.</li>\r\n\t\t<li>Fixed bug causing an error when verifying discs containing single\r\n\t\t    character file or directory names.</li>\r\n\t\t<li>Updated cdrtools to version 2.01.01a61.</li>\r\n\t\t<li>Added support for displaying BluRay and HD-DVD capabilities.</li>\r\n\t\t<li>Displayed OK button problem should now be gone.</li>\r\n\t\t<li>Greatly improved device detection speed, devices are now always probed at\r\n\t\t    startup.</li>\r\n\t\t<li>Fixed a bug preventing boot images from being removed from projects.</li>\r\n\t\t<li>Updated InfraRecorder projects not to store file size information that\r\n\t\t    potentially could cause write errors.</li>\r\n\t\t<li>Added safety net preventing non-recoverable read errors to affect\r\n\t\t    integrity of other files during recording operation.</li>\r\n\t\t<li>Updated InfraRecorder to lock files on hard drive during file system\r\n\t\t    creation in order to avoid inconsistency errors.</li>\r\n\t\t<li>Added support for importing data from file lists like M3U.</li>\r\n\t\t<li>Added command line options for selecting default project and media\r\n\t\t    type.</a>\r\n\t\t<li>Fixed a bug causing projects opened by association not to be loaded if\r\n\t\t    welcome screen was enabled.</li>\r\n\t\t<li>Added support for using Ctrl+A in the track secion to select all\r\n\t\t    tracks.</li>\r\n\t\t<li>The drive letter is now displayed with the name of all CD/DVD\r\n\t\t    devices.</li>\r\n\t\t<li>Renamed disc fixation to disc closing.</li>\r\n\t\t<li>Fixed bugs related to drive letter detection.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.2.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the disc file system creation process to hang on some\r\n\t\t    systems (for real this time).</li>\r\n\t\t<li>Fixed a bug causing a custom temporary directory not to be used.</li>\r\n\t\t<li>Fixed a start-up maximization bug.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.1.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the disc file system creation process to hang on some\r\n\t\t    systems.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.0.0</p>\r\n\t<ul>\r\n\t\t<li>Minor bugfixes and updates.</li>\r\n\t\t<li>Added support for recording multiple copies.</li>\r\n\t\t<li>Added a welcome screen to the InfraRecorder main application and removed\r\n\t\t    the express application.</li>\r\n\t\t<li>Solved a bug causing the OK button not to be enabled after erasing or\r\n\t\t    formatting a disc.\r\n\t\t<li>Moved all source code to GPL version 3.</li>\r\n\t\t<li>Removed cdrtools binaries in favor of cdrkit binaries.</li>\r\n\t\t<li>Improved device detection routines, there should not be any more problems\r\n\t\t    with wrongly detected drive letters.</li>\r\n\t\t<li>Included an Indonesian translation, thanks to Andhika Padmawan!</li>\r\n\t\t<li>Included a Chuvash translation, thanks to Vladimir Kozhevnikov!</li>\r\n\t\t<li>Fixed a bug causing the express application and shell extension not to be\r\n\t\t    translated.</li>\r\n\t\t<li>Updated the portable version of InfraRecorder to store its log files in\r\n\t\t    the program directory instead of in the the application data folder.</li>\r\n\t</ul>\r\n\t<p>Version 0.45.0.0</p>\r\n\t<ul>\r\n\t\t<li>Updated cdrtools to version 2.01.01a38.</li>\r\n\t\t<li>Fixed a bug making InfraRecorder crash when trying to move a folder to\r\n\t\t    itself.</li>\r\n\t\t<li>Fixed a bug causing the wrong folder to be opened when double-clicking in\r\n\t\t    the project list view when a project contained folders with identical\r\n\t\t    names.</li>\r\n\t\t<li>Fixed a bug causing the focus not to be returned to the OK button in the\r\n\t\t    progress dialog after performing an operation.</li>\r\n\t\t<li>Fixed icon rendering error on Windows XP and newer where display depth is\r\n\t\t    lower than 32-bits.</li>\r\n\t\t<li>Changed the option to verify the device configuration at start up to be\r\n\t\t    enabled by default.</li>\r\n\t\t<li>Added support for associating InfraRecorder with disc images.</li>\r\n\t\t<li>Updated the some of the dialog windows to be minimizable and visible on\r\n\t\t    the task bar when launced by an external application (like irExpress).</li>\r\n\t\t<li>Fixed a bug causing incorrect file names to be used when verifying\r\n\t\t    recorded discs.</li>\r\n\t\t<li>Added functionallity to rename and remove files from imported sessions.</li>\r\n\t\t<li>Added support for selecting which multi-session track to import.</li>\r\n\t\t<li>When trying to record to a non-empty rewritable disc, InfraRecorder now\r\n\t\t    asks if the disc should be erased.</li>\r\n\t\t<li>When performing an operation the progress is now also displayed in the\r\n\t\t    taskbar.</li>\r\n\t\t<li>Reduced memory usage when dealing with projects.</li>\r\n\t\t<li>Fixed a bug making it impossible to open saved projects containing no\r\n\t\t    files.</li>\r\n\t\t<li>Included a Thai translation, thanks to Prasit Kaephukhieo!</li>\r\n\t\t<li>Improved compatibility with the ISO9660 standard.</li>\r\n\t\t<li>Added support for creating UDF-only file systems.</li>\r\n\t\t<li>Added support for Unicode files names in Joliet extension and UDF file\r\n\t\t    system.</li>\r\n\t\t<li>Added support for fragmented files in ISO9660 level 3. Files larger than\r\n\t\t    4 GiB can now be recorded to an ISO9660 file system.</li>\r\n\t\t<li>Removed mkisofs and isoinfo dependencies.</li>\r\n\t\t<li>Fixed some bugs related to importing disc sessions.</li>\r\n\t\t<li>Added properties menu item when right-clicking on the project tree root\r\n\t\t    node.</li>\r\n\t\t<li>Added proper flagging of hidden files in the disc file system.</li>\r\n\t\t<li>Changed the default write method for multi-session projects to TAO.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash when renaming project files to\r\n\t\t    include slash or backslash characters.</li>\r\n\t\t<li>Added the .img extension to the list of supported disc image extensions.</li>\r\n\t\t<li>A few cosmetic changes.</li>\r\n\t\t<li>Included an Arabic translation, thanks to Circoficus!</li>\r\n\t\t<li>Included a Greek translation, thanks to  . !</li>\r\n\t</ul>\r\n\t<p>Version 0.44.1.0</p>\r\n\t<ul>\r\n\t\t<li>Introduced alternate ways of fetching recorder write speeds. This solves\r\n\t\t    the &quot;disabled OK button problem&quot;.</li>\r\n\t\t<li>Added support for reloading laptop drives (drives that can not\r\n\t\t    automatically load themselves) before starting the disc verification\r\n\t\t    process.</li>\r\n\t\t<li>Corrected a version display error in the log system.</li>\r\n\t</ul>\r\n\t<p>Version 0.44.0.0</p>\r\n\t<ul>\r\n\t\t<li>Added a warning message when disabling disc fixation since some users\r\n\t\t    believes that this will create a multi-session disc.</li>\r\n\t\t<li>It's now possible to perform a disc copy using the same device as source\r\n\t\t    and target.</li>\r\n\t\t<li>Updated drive speed detection routines, it should now detect correct\r\n\t\t    speeds depeding on the inserted media.</li>\r\n\t\t<li>Improved the media removal/insertion auto detection routines.</li>\r\n\t\t<li>Added support for switching through the controls of the main view using\r\n\t\t    the tab key.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash on Windows 9x systems when\r\n\t\t    changing folder in the explorer view.</li>\r\n\t\t<li>Added menu items for selecting all files and inverting the file selection.</li>\r\n\t\t<li>Fixed a bug causing negative progress to be displayed in some cases.</li>\r\n\t\t<li>Updated InfraRecorder to correctly maximize on startup, if closed\r\n\t\t    maximized.</li>\r\n\t\t<li>Added a website button to the about window.</li>\r\n\t\t<li>Fixed a project file rename bug.</li>\r\n\t\t<li>Made the toolbar customizable in several ways.</li>\r\n\t\t<li>Improved project file handling, no duplicate files or folders are allowed.</li>\r\n\t\t<li>The program configuration is now stored in the application data folder.\r\n\t\t    A new portable version of InfraRecorder has been created where data is\r\n\t\t    stored in the program folder.</li>\r\n\t\t<li>Greatly improved drag and drop functionality.</li>\r\n\t\t<li>Included a Norwegian translation, thanks to Karol Ptasinski!</li>\r\n\t\t<li>Updated the help file with index and search capabilities.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to try to verify files that where\r\n\t\t    imported from previous sessions.</li>\r\n\t\t<li>Fixed a bug causing the disc to be ejected (if requested) before starting\r\n\t\t    the disc verification process.</li>\r\n\t\t<li>Fixed a bug causing incompatibility with Windows 9x systems due to a\r\n\t\t    function call to SHGetFolderPathA.</li>\r\n\t</ul>\r\n\t<p>Version 0.43.1.0</p>\r\n\t<ul>\r\n\t\t<li>Updated the cdrtools to version 2.01.01a26.</li>\r\n\t\t<li>Included a Finnish translation, thanks to Rami Aalto!</li>\r\n\t\t<li>Removed the error message related to ckEffects.exe.</li>\r\n\t\t<li>Improved the erase feature with support for more recorders.</li>\r\n\t\t<li>Fixed a bug causing the size and position of the main window not to be\r\n\t\t    remembered.</li>\r\n\t\t<li>Fixed a bug causing the explorer view to turn white when double-clicking\r\n\t\t    on a folder in the explorer list view (Windows XP only).</li>\r\n\t\t<li>Improved the program log functionality.</li>\r\n\t\t<li>Fixed a bug making it impossible to import sessions from certain disc types.</li>\r\n\t\t<li>Improved the explorer view performance. Expanding anything under \"My Computer\"\r\n\t\t    in the tree could on some systems result in a long delay because of slow\r\n\t\t    queries to floppy drives.</li>\r\n\t</ul>\r\n\t<p>Version 0.43.0.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug raising an exception when re-ordering audio tracks.</li>\r\n\t\t<li>Added a smoke effect when writing to a disc (requires Windows Vista\r\n\t\t    Aero to be enabled).</li>\r\n\t\t<li>Fixed a few bugs causing wrong disc information to be shown in the\r\n\t\t    disc information window.</li>\r\n\t\t<li>Various adaptations for Windows Vista.</li>\r\n\t\t<li>Added support for dropping files into the project tree view.</li>\r\n\t\t<li>Completely rewritten disc erase/format code. Improved DVD&plusmn;RW and\r\n\t\t    DVD-RAM support.</li>\r\n\t\t<li>Included a Catalan translation, thanks to Josep Llus Amador Teruel!</li>\r\n\t\t<li>Included a Galician translation, thanks to Xess Estvez!</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to have invalid window coordinates\r\n\t\t    closed while minimized.</li>\r\n\t\t<li>Included a Romanian translation, thanks to Nicolae Crefelean!</li>\r\n\t\t<li>Removed the Visual C++ 8 DLL dependencies from the shell extension.</li>\r\n\t\t<li>Included a Hungarian translation, thanks to Tibor Srkny!</li>\r\n\t\t<li>Included a Hebrew translation, thanks to Shemesh!</li>\r\n\t\t<li>Included a Danish translation, thanks to Patrick Fust!</li>\r\n\t\t<li>Fixed a bug causing all internal SCSI commands not to be executed in\r\n\t\t    the x64 build of InfraRecorder.</li>\r\n\t</ul>\r\n\t<p>Version 0.42.1.0</p>\r\n\t<ul>\r\n\t\t<li>The MSI installer used for the x64 release now creates the\r\n\t\t    start-menu shortcuts in a subfolder.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash when cdrecord reported\r\n\t\t    recording on a track-number higher than the number of tracks to be\r\n\t\t    recorded.</li>\r\n\t\t<li>Removed the Visual C++ 8 DLL dependencies from the irWave codec.</li>\r\n\t\t<li>Fixed a bug causing stack corruption when using the irWMA codec.</li>\r\n\t</ul>\r\n\t<p>Version 0.42.0.0</p>\r\n\t<ul>\r\n\t\t<li>Available as 64-bit (x64) build.</li>\r\n\t\t<li>Created a completely new Wave codec to remove the libsndfile\r\n\t\t    dependency and add support for the x64 compiler.</li>\r\n\t\t<li>Modifed the translation system to allow translated controls to\r\n\t\t    automatically resize and move its neightbours when needed.</li>\r\n\t\t<li>Various changes for Windows Vista compatibility.</li>\r\n\t\t<li>Modified the WMA codec so it doesn't raise an error message when it\r\n\t\t    fails to load (if Windows Media Player not installed).</li>\r\n\t\t<li>Included a Japanese translation, thanks to Nardog!</li>\r\n\t\t<li>Fixed a bug causing DVD media to always be recorded at maximum\r\n\t\t    speed.</li>\r\n\t\t<li>Included a Korean translation, thanks to Jung Jin-ho!</li>\r\n\t\t<li>Included a Bulgarian translation, thanks to Iliyan Popov!</li>\r\n\t\t<li>Separated data DVD from data CD projects.</li>\r\n\t\t<li>Added support for omiting version numbers from ISO9660 file names.</li>\r\n\t\t<li>Added support for using Rock Ridge extensions without using the Joliet\r\n\t\t    file name extension.</li>\r\n\t\t<li>Fixed a bug causing the write speed not to be properly reported on some\r\n\t\t    recorders.</li>\r\n\t\t<li>Added support for column sorting.</li>\r\n\t\t<li>Added support for rearranging audio tracks by drag and drop.</li>\r\n\t\t<li>Included a Serbian (Cyrillic and Latin) translation, thanks to ozzii!</li>\r\n\t\t<li>Added support for automatically verifying a disc after it has been\r\n\t\t    recorded.</li>\r\n\t\t<li>Made the labels on the progress dialog double buffered to avoid\r\n\t\t    flickering.</li>\r\n\t\t<li>Fixed a bug causing the cp1250 code page not to be properly\r\n\t\t    detected on Czech systems.</li>\r\n\t\t<li>Added support for creating DVD-Video projects.</li>\r\n\t\t<li>Included a Slovak translation, thanks to Marek!</li>\r\n\t\t<li>Fixed a bug causing problems when importing certain seasons from\r\n\t\t    multi-session discs.</li>\r\n\t\t<li>Fixed a bug causing project UDF-settings not to be properly reset\r\n\t\t    when creating a new project.</li>\r\n\t\t<li>Fixed a bug causing error messages not to be properly displayed when\r\n\t\t    recording custom projects on the fly.</li>\r\n\t\t<li>Included a Chinese (Traditional) translation, thanks to Charlie!</li>\r\n\t</ul>\r\n\t<p>Version 0.41.0.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the space meter to display inaccurate file\r\n\t\t    sizes on audio files in mixed-mode projects.</li>\r\n\t\t<li>Due to limitations in the Microsoft Windows 9x Unicode Layer, a\r\n\t\t    non-unicode version of InfraRecorder is released separateley.</li>\r\n\t\t<li>Added support for disabling the error message that occurs when a\r\n\t\t    codec fails to load.</li>\r\n\t\t<li>Added support for generating DVD-Video compliant filesystems.</li>\r\n\t\t<li>Added support for UDF.</li>\r\n\t\t<li>Added support for creating bootable data discs.</li>\r\n\t\t<li>Fixed a major bug preventing some projects from beeing properly\r\n\t\t    loaded.</li>\r\n\t\t<li>Included a Bosnian translation, thanks to Asim Husanovic!</li>\r\n\t\t<li>Added an option to change the detected write speed of a recorder.</li>\r\n\t\t<li>Changed the recorder speed management to now allow a larger\r\n\t\t    number of write speeds below the maximum speed.</li>\r\n\t\t<li>Added write method information to the advanced device details.</li>\r\n\t\t<li>Fixed a bug causing a wrong character set to be detected on systems\r\n\t\t    using code page 1251.</li>\r\n\t\t<li>Fixed a bug causing bogus unix file permissions to be set when\r\n\t\t    recording custom projects using the Joliet name extension.</li>\r\n\t\t<li>Improved the project space meter.</li>\r\n\t\t<li>Added support for recording custom projects on the fly.</li>\r\n\t\t<li>Fixed a bug causing a temporary file not to be removed when\r\n\t\t    copying a disc.</li>\r\n\t\t<li>Added support for disabling the unsupported character set error\r\n\t\t    message.</li>\r\n\t\t<li>Fixed a bug causing the space meter tooltip to display the size\r\n\t\t    information in bytes instead of minutes when dealing with audio\r\n\t\t    projects.</li>\r\n\t\t<li>Included a Slovenian translation, thanks to Frani iek!</li>\r\n\t\t<li>Included a Ukrainian translation and manual, thanks to Serhij Dubyk!</li>\r\n\t\t<li>The advanced device properties list now correctly displays\r\n\t\t    titletip when a feature description is to long to be fully\r\n\t\t    displayed.</li>\r\n\t\t<li>Fixed a bug causing empty directories to be ignored when creating\r\n\t\t    and recording custom projects.</li>\r\n\t\t<li>Fixed a bug causing files that has equal characters in the\r\n\t\t    file name to raise an error when creating a disc image.</li>\r\n\t\t<li>Included a Portuguese (Brazilian) translation, thanks to der Silva!</li>\r\n\t\t<li>Included a Chinese (Simplified) translation, thanks to DouDeHou!</li>\r\n\t\t<li>Added more read options (ignore read errors, read\r\n\t\t    sub-channel data and TOC, read speed).</li>\r\n\t\t<li>Added support for disc\r\n\t\t    <a href=\"../how_to_use/copy_data_disc.html\">cloning</a>.</li>\r\n\t\t<li>Added support for changing the FIFO buffer size.</li>\r\n\t\t<li>Added support for ISO level 4 which among many thigs\r\n\t\t    allows directory nesting to be deeper than eight levels.</li>\r\n\t</ul>\r\n\t<p>Version 0.40.0.0</p>\r\n\t<ul>\r\n\t\t<li>Included a Czech translation, thanks to khagaroth!</li>\r\n\t\t<li>Improved DVD-support (official cdrtools has DVD support\r\n\t\t    since version 2.01.01a09).</li>\r\n\t\t<li>Simulation mode now works when recording to DVDs.</li>\r\n\t\t<li>Support for blanking DVD+RW media (currently only with\r\n\t\t    Ricoh based drives).</li>\r\n\t\t<li>The size and position of the main InfraRecorder window\r\n\t\t    is now remembered and restored each startup.</li>\r\n\t\t<li>Included a Basque translation, thanks to David Garca-Abad!</li>\r\n\t\t<li>Added support for encoding audio tracks to Ogg, WMA and\r\n\t\t    MP3 (separate package due to patent issue).</li>\r\n\t\t<li>Fixed a bug causing the wrong tracks to be displayed\r\n\t\t    when scanning a disc for errors.</li>\r\n\t\t<li>Added support for decoding MP3, Ogg and WMA audio.</li>\r\n\t\t<li>Included a German manual, thanks to CE4!</li>\r\n\t\t<li>Included an Italian translation, thanks to Lorenzo Festa!</li>\r\n\t\t<li>Fixed bug with message boxes, they should now be modal.</li>\r\n\t\t<li>Added support for translated manuals.</li>\r\n\t\t<li>Changed the default simulation value to off.</li>\r\n\t\t<li>Added an option for changing the temporary folder.</li>\r\n\t\t<li>Added help documentation on how to make the InfraRecorder\r\n\t\t    installer perform unattended <a href=\"installation.html\">\r\n\t\t    installations</a>.</li>\r\n\t\t<li>The installer now adds an entry to Add/Remove Programs.</li> \r\n\t\t<li>Added support for selecting installation language on unattended\r\n\t\t   installations.</li> \r\n\t\t<li>Included a Russian translation and manual, thanks to Roman Starikh!</li>\r\n\t\t<li>Included a German translation, thanks to Thomas Bigler!</li>\r\n\t\t<li>Included a Polish translation, thanks to DJD!</li>\r\n\t\t<li>Included a Turkish translation, thanks to Fatma Akarslan!</li>\r\n\t\t<li>Included a Croatian translation, thanks to Tibor Keser!</li>\r\n\t\t<li>Included a Dutch translation, thanks to Patrick!</li>\r\n\t</ul>\r\n\t<p>Version 0.31.0.0</p>\r\n\t<ul>\r\n\t\t<li>Included a Portuguese translation, thanks to Cesar Baptista!</li>\r\n\t\t<li>Included a Spanish translation, thanks to Eduardo Leon!</li>\r\n\t\t<li>Increased the height of all comboboxes in the GUI to prevent unnecessary\r\n\t\t    scrolling.</li>\r\n\t\t<li>Fixed some GUI glitches causing black and purple backgrounds on some\r\n\t\t    graphics (only affected systems older than Windows XP).</li>\r\n\t\t<li>Added a tooltip to the space meter which displays the project size.</li>\r\n\t\t<li>Added support for pasting files from Windows Explorer into a project.</li>\r\n\t\t<li>Fixed a bug allowing multiple sessions to imported to a project.</li>\r\n\t</ul>\r\n\t<p>Version 0.30.0.83</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug (static linking to UpdateLayeredWindow in user32.dll) causing\r\n\t\t    incompatibility with Windows 9x systems.</li>\r\n\t</ul>\r\n\t<p>Version 0.30.0.82 (Beta 2)</p>\r\n\t<ul>\r\n\t\t<li>Added DVD support by patching cdrecord (WARNING: Simulation mode is known\r\n\t\t    not to work when burning DVDs).</li>\r\n\t\t<li>Included a French translation, thanks to Pierre-Jean Coudert!</li>\r\n\t\t<li>Changed the default write method to SAO because of DVD compatibility.</li>\r\n\t\t<li>Updated the installer with extra options and multi-language support.</li>\r\n\t\t<li>Added a couple of new translateable strings for the progress log output.\r\n\t\t    </li>\r\n\t\t<li>Made some directory layout changes to the CVS.</li>\r\n\t</ul>\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "doc/english/infrarecorder.hhc",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<OBJECT type=\"text/site properties\">\r\n\t<param name=\"ImageType\" value=\"Folder\">\r\n</OBJECT>\r\n<UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Infra Recorder\">\r\n\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t</OBJECT>\r\n\t<UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\introduction.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"17\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Feature Overview\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\feature_overview.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"31\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"License Agreement\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\license_agreement.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"37\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"System Requirements\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\system_requirements.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"41\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Quick Start\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\quick_start.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\copyright.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"27\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Acknowledgments\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\acknowledgments.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"What's New?\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\whats_new.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"12\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\installation.html\">\r\n\t\t\t<param name=\"URL\" value=\"infra_recorder\\installation.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\faq.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"9\">\r\n\t\t\t</OBJECT>\r\n\t</UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"How to Use?\">\r\n\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t</OBJECT>\r\n\t<UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Working with Projects\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t\t</OBJECT>\r\n\t\t<UL>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Getting Started\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\getting_started.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Multi-Session Disc\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\multisession_disc.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Project Settings\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\project_settings.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Add Boot Image\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\add_boot_image.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t</UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Burn Image\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\burn_image.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Burn Options\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\burn_options.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Read Options\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\read_options.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copy Audio Disc\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\copy_audio_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copy Data Disc\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\copy_data_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Disc Information\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\disc_information.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Erase Disc\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\erase_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Fixate Disc\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\fixate_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Manage Tracks\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\manage_tracks.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Device Configuration\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\device_configuration.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\configuration.html\">\r\n\t\t\t</OBJECT>\r\n\t</UL>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "doc/english/infrarecorder.hhk",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Acknowledgments\">\r\n\t\t<param name=\"Name\" value=\"Acknowledgments\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\acknowledgments.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Boot Images\">\r\n\t\t<param name=\"Name\" value=\"Add Boot Image\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\add_boot_image.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Burn Image\">\r\n\t\t<param name=\"Name\" value=\"Burn Image\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\burn_image.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Burn Options\">\r\n\t\t<param name=\"Name\" value=\"Burn Options\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\burn_options.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\configuration.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copy Audio Disc\">\r\n\t\t<param name=\"Name\" value=\"Copy Audio Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\copy_audio_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copy Data Disc\">\r\n\t\t<param name=\"Name\" value=\"Copy Data Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\copy_data_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\copyright.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Device Configuration\">\r\n\t\t<param name=\"Name\" value=\"Device Configuration\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\device_configuration.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Disc Information\">\r\n\t\t<param name=\"Name\" value=\"Disc Information\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\disc_information.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Erase Disc\">\r\n\t\t<param name=\"Name\" value=\"Erase Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\erase_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\faq.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Feature Overview\">\r\n\t\t<param name=\"Name\" value=\"Feature Overview\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\feature_overview.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Fixate Disc\">\r\n\t\t<param name=\"Name\" value=\"Fixate Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\fixate_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Getting Started\">\r\n\t\t<param name=\"Name\" value=\"Getting Started\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\getting_started.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\installation.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\introduction.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"License Agreement\">\r\n\t\t<param name=\"Name\" value=\"License Agreement\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\license_agreement.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Manage Tracks\">\r\n\t\t<param name=\"Name\" value=\"Manage Tracks\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\manage_tracks.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Multi-Session Discs\">\r\n\t\t<param name=\"Name\" value=\"Multi-Session Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\multisession_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Project Settings\">\r\n\t\t<param name=\"Name\" value=\"Project Settings\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\project_settings.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Quick Start\">\r\n\t\t<param name=\"Name\" value=\"Quick Start\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\quick_start.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Read Options\">\r\n\t\t<param name=\"Name\" value=\"Read Options\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\read_options.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"System Requirements\">\r\n\t\t<param name=\"Name\" value=\"System Requirements\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\system_requirements.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"What's New\">\r\n\t\t<param name=\"Name\" value=\"What's New\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\whats_new.html\">\r\n\t\t</OBJECT>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "doc/english/infrarecorder.hhp",
    "content": "[OPTIONS]\r\nCompatibility=1.1 or later\r\nCompiled file=infrarecorder.chm\r\nContents file=infrarecorder.hhc\r\nDefault topic=infra_recorder\\introduction.html\r\nDisplay compile progress=No\r\nFull-text search=Yes\r\nIndex file=infrarecorder.hhk\r\nLanguage=0x409 English (United States)\r\nTitle=InfraRecorder Help\r\n\r\n\r\n[INFOTYPES]\r\n\r\n"
  },
  {
    "path": "doc/english/style.css",
    "content": "body\r\n{\r\n\tfont-weight: normal;\r\n\tfont-size: 11px;\r\n\tmargin: 0px;\r\n\tcolor: #000000;\r\n\tfont-family: Verdana, Arial, Helvetica, sans-serif;\r\n\theight: 100%;\r\n\tbackground-color: #ffffff;\r\n\ttext-align: left\r\n}\r\n\r\nh1\r\n{\r\n\tfont-size: 115%;\r\n\tmargin-top: 1em;\r\n\tmargin-bottom: .6em;\r\n}\r\n\r\nh2\r\n{\r\n\tfont-size: 100%;\r\n\tmargin-top: 1em;\r\n\tmargin-bottom: .6em; \r\n}\r\n\r\nul\r\n{\r\n\tlist-style-type: disc;\r\n\tmargin-left: 1.9em;\r\n\tmargin-top: .6em;\r\n\tmargin-bottom: 0em;\r\n}\r\n\r\nol\r\n{\r\n\tmargin-left: 2.9em;\r\n\tmargin-top: .6em;\r\n\tmargin-bottom: 0em;\r\n\tfont-weight: bold;\r\n}\r\n\r\nol span\r\n{\r\n\tfont-weight: normal;\r\n}\r\n\r\nli\r\n{\r\n\tmargin-bottom: .3em;\r\n}\r\n\r\np,dl\r\n{\r\n\tmargin-top: .6em;\r\n\tmargin-bottom: .6em;\r\n}\r\n\r\nhr\r\n{\r\n\tmargin-top: .6em;\r\n}\r\n\r\ndd\r\n{\r\n\tpadding-top: .2em;\r\n\tmargin-bottom: .6em;  \r\n\tmargin-left: 0.8em; \r\n}\r\n\r\n#header\r\n{\r\n\tbackground: #ccccff;\r\n\tborder-bottom: 1px solid #9999ff;\r\n\tpadding-top: 5px;\r\n\tpadding-left: 10px;\r\n\tpadding-bottom: 5px;\r\n}\r\n\r\n#location\r\n{\r\n\tfont-style: italic;\r\n}\r\n\r\n#topic\r\n{\r\n\tfont-weight: bold;\r\n}\r\n\r\n#content\r\n{\r\n\tpadding: 10px;\r\n\tpadding-left: 10px;\r\n\toverflow: auto;\r\n\theight: 100%;\r\n}\r\n"
  },
  {
    "path": "doc/english/stylescript.js",
    "content": "window.onload = OnSize;\r\nwindow.onresize = OnSize;\r\n\r\nfunction OnSize()\r\n{\r\n\tvar vHeader = document.all.item(\"header\");\r\n\tvar vContent = document.all.item(\"content\");\r\n\r\n\tif (vContent ==null) \r\n\t\treturn;\r\n\r\n\tif (vHeader != null)\r\n\t{\r\n\t\tdocument.all.content.style.overflow = \"auto\";\r\n\t\tdocument.all.header.style.width = document.body.offsetWidth;\r\n\t\tdocument.all.content.style.width = document.body.offsetWidth - 4;\r\n\t\tdocument.all.content.style.top = document.all.header.offsetHeight;\r\n\r\n\t\tif (document.body.offsetHeight > document.all.header.offsetHeight)\r\n\t\t{\r\n\t\t\tdocument.all.content.style.height = document.body.offsetHeight - document.all.header.offsetHeight - 3;\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\tdocument.all.content.style.height = 0;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "doc/french/Gpl-3.0-FR.txt",
    "content": "\r\n                        LICENCE PUBLIQUE GNRALE GNU\r\n                         Version 3, du 29 juin 2007.\r\n\r\nCopyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r\n\r\nChacun est autoris  copier et distribuer des copies conformes de ce document de licence, mais toute modification en est proscrite.\r\n\r\nTraduction franaise par Philippe Verdy\r\n<verdy_p () wanadoo (point) fr>, le 30 juin 2007.\r\n\r\n_______________________________________________________________________\r\n\r\nAvertissement important au sujet de cette traduction franaise.\r\n_______________________________________________________________________\r\n\r\nCeci est une traduction en franais de la licence GNU General Public\r\nLicense (GPL). Cette traduction est fournie ici dans lespoir quelle\r\nfacilitera sa comprhension, mais elle ne constitue pas une traduction\r\nofficielle ou approuve dun point de vue juridique.\r\n\r\nLa Free Software Foundation (FSF) ne publie pas cette traduction et ne\r\nla pas approuve en tant que substitut valide au plan lgal pour la\r\nlicence authentique GNU General Public Licence. Cette traduction na\r\npas encore t passe en revue attentivement par un juriste et donc le\r\ntraducteur ne peut garantir avec certitude quelle reprsente avec\r\nexactitude la signification lgale des termes de la licence authentique\r\nGNU General Public License publie en anglais. Cette traduction\r\nntablit donc lgalement aucun des termes et conditions dutilisation\r\ndun logiciel sous licence GNU GPL  seul le texte original en anglais\r\nle fait. Si vous souhaitez tre sr que les activits que vous projetez\r\nseront autorises par la GNU General Public License, veuillez vous\r\nrfrer  sa seule version anglaise authentique.\r\n\r\nLa FSF vous recommande fermement de ne pas utiliser cette traduction en\r\ntant que termes officiels pour vos propres programmes ; veuillez plutt\r\nutiliser la version anglaise authentique telle que publie par la FSF.\r\nSi vous choisissez dacheminer cette traduction en mme temps quun\r\nProgramme sous licence GNU GPL, cela ne vous dispense pas de lobligation\r\ndacheminer en mme temps une copie de la licence authentique en anglais,\r\net de conserver dans la traduction cet avertissement important en\r\nfranais et son quivalent en anglais ci-dessous.\r\n\r\n_______________________________________________________________________\r\n\r\nImportant Warning About This French Translation.\r\n_______________________________________________________________________\r\n\r\nThis is a translation of the GNU General Public License (GPL) into\r\nFrench. This translation is distributed in the hope that it will\r\nfacilitate understanding, but it is not an official or legally approved\r\ntranslation.\r\n\r\nThe Free Software Foundation (FSF) is not the publisher of this\r\ntranslation and has not approved it as a legal substitute for the\r\nauthentic GNU General Public License. The translation has not been\r\nreviewed carefully by lawyers, and therefore the translator cannot be\r\nsure that it exactly represents the legal meaning of the authentic GNU\r\nGeneral Public License published in English. This translation does not\r\nlegally state the terms and conditions of use of any Program licenced\r\nunder GNU GPL  only the original English text of the GNU LGPL does\r\nthat. If you wish to be sure whether your planned activities are\r\npermitted by the GNU General Public License, please refer to its sole\r\nauthentic English version.\r\n\r\nThe FSF strongly urges you not to use this translation as the official\r\ndistribution terms for your programs; instead, please use the authentic\r\nEnglish version published by the FSF. If you choose to convey this\r\ntranslation along with a Program covered by the GPL Licence, this does\r\nnot remove your obligation to convey at the same time a copy of the\r\nauthentic GNU GPL License in English, and you must keep in this\r\ntranslation this important warning in English and its equivalent in\r\nFrench above.\r\n\r\n_______________________________________________________________________\r\n\r\n\r\nPrambule\r\n\r\nLa Licence Publique Gnrale GNU (GNU General Public License) est une\r\nlicence libre, en copyleft, destine aux uvres logicielles et\r\ndautres types de travaux.\r\n\r\nLes licences de la plupart des uvres logicielles et autres travaux de\r\npratique sont conues pour ter votre libert de partager et modifier\r\nces travaux. En contraste, la Licence Publique Gnrale GNU a pour but\r\nde garantir votre libert de partager et changer toutes les versions\r\ndun programme  afin dassurer quil restera libre pour tous les\r\nutilisateurs. Nous, la Free Software Foundation, utilisons la Licence\r\nPublique Gnrale GNU pour la plupart de nos logiciels ; cela\r\nsapplique aussi  tout autre travail dit de cette faon par ses\r\nauteurs. Vous pouvez, vous aussi, lappliquer  vos propres programmes.\r\n\r\nQuand nous parlons de logiciel libre (free), nous nous rfrons  la\r\nlibert (freedom), pas au prix. Nos Licences Publiques Gnrales sont\r\nconues pour assurer que vous ayez la libert de distribuer des copies\r\nde logiciel libre (et le facturer si vous le souhaitez), que vous\r\nreceviez le code source ou pouviez lobtenir si vous le voulez, que\r\nvous pouviez modifier le logiciel ou en utiliser toute partie dans de\r\nnouveaux logiciels libres, et que vous sachiez que vous avez le droit\r\nde faire tout ceci.\r\n\r\nPour protger vos droits, nous avons besoin dempcher que dautres\r\nvous restreignent ces droits ou vous demande de leur abandonner ces\r\ndroits. En consquence, vous avez certaines responsabilits si vous\r\ndistribuez des copies dun tel programme ou si vous le modifiez :\r\nles responsabilits de respecter la libert des autres.\r\n\r\nPar exemple, si vous distribuez des copies dun tel programme, que ce\r\nsoit gratuit ou contre un paiement, vous devez accorder aux\r\nDestinataires les mmes liberts que vous avez reues. Vous devez aussi\r\nvous assurer queux aussi reoivent ou peuvent recevoir son code\r\nsource. Et vous devez leur montrer les termes de cette licence afin\r\nquils connaissent leurs droits.\r\n\r\nLes dveloppeurs qui utilisent la GPL GNU protgent vos droits en deux\r\ntapes : (1) ils affirment leur droits dauteur (copyright) sur le\r\nlogiciel, et (2) vous accordent cette Licence qui vous donne la\r\npermission lgale de le copier, le distribuer et/ou le modifier.\r\n\r\nPour la protection des dveloppeurs et auteurs, la GPL stipule\r\nclairement quil ny a pas de garantie pour ce logiciel libre. Aux fins\r\n la fois des utilisateurs et auteurs, la GPL require que les versions\r\nmodifies soient marques comme changes, afin que leurs problmes ne\r\nsoient pas attribus de faon errone aux auteurs des versions\r\nprcdentes.\r\n\r\nCertains dispositifs sont conus pour empcher laccs des utilisateurs\r\n linstallation ou lexcution de versions modifies du logiciel \r\nlintrieur de ces dispositifs, alors que les fabricants le peuvent.\r\nCeci est fondamentalement incompatible avec le but de protger la\r\nlibert des utilisateurs de modifier le logiciel. Laspect systmatique\r\nde tels abus se produit dans le secteur des produits destins aux\r\nutilisateurs individuels, ce qui est prcidment ce qui est le plus\r\ninacceptable. Aussi, nous avons conu cette version de la GPL pour\r\nprohiber cette pratique pour ces produits. Si de tels problmes\r\nsurviennent dans dautres domaines, nous nous tenons prt  tendre\r\ncette restriction  ces domaines dans de futures versions de la GPL,\r\nautant quil sera ncessaire pour protger la libert des utilisateurs.\r\n\r\nFinalement, chaque programme est constamment menac par les brevets\r\nlogiciels. Les tats ne devraient pas autoriser de tels brevets \r\nrestreindre le dveloppement et lutilisation de logiciels libres sur\r\ndes ordinateurs dusage gnral ; mais dans ceux qui le font, nous\r\nvoulons spcialement viter le danger que les brevets appliqus  un\r\nprogramme libre puisse le rendre effectivement propritaire. Pour\r\nempcher ceci, la GPL assure que les brevets ne peuvent tre utiliss\r\npour rendre le programme non-libre.\r\n\r\nLes termes prcis et conditions concernant la copie, la distribution\r\net la modification suivent.\r\n\r\n\r\nTERMES ET CONDITIONS\r\n\r\n\r\nArticle 0. Dfinitions.\r\n\r\n Cette Licence  se rfre  la version 3 de la GNU General Public\r\nLicense (le texte original en anglais).\r\n\r\n Droit dAuteur  signifie aussi les droits du copyright ou voisins\r\nqui sappliquent  dautres types de travaux, tels que ceux sur les\r\nmasques de semi-conducteurs.\r\n\r\n Le Programme  se rfre  tout travail qui peut tre sujet au Droit\r\ndAuteur (copyright) et dont les droits dutilisation sont concds\r\nen vertu de cette Licence. Chacun des Licencis,  qui cette Licence\r\nest concde, est dsign par  vous.  Les  Licencis  et les\r\n Destinataires  peuvent tre des personnes physiques ou morales\r\n(individus ou organisations).\r\n\r\n Modifier  un travail signifie en obtenir une copie et adapter tout\r\nou partie du travail dune faon ncessitant une autorisation dun\r\ntitulaire de Droit dAuteur, autre que celle permettant den produire\r\nune copie conforme. Le travail rsultant est appel une  version\r\nmodifie  du prcdent travail, ou un travail  bas sur  le\r\nprcdent travail.\r\n\r\nUn  Travail Couvert  signifie soit le Programme non modifi soit un\r\ntravail bas sur le Programme.\r\n\r\n Propager  un travail signifie faire quoi que ce soit avec lui qui,\r\nsans permission, vous rendrait directement ou indirectement responsable\r\ndun dlit de contrefaon suivant les lois relatives au Droit dAuteur,\r\n lexception de son excution sur un ordinateur ou de la modification\r\ndune copie prive. La propagation inclue la copie, la distribution\r\n(avec ou sans modification), la mise  disposition envers le public, et\r\naussi d'autres activits dans certains pays.\r\n\r\n Acheminer  un travail signifie tout moyen de propagation de celui-ci\r\nqui permet  dautres parties de raliser ou recevoir des copies. La\r\nsimple interaction dun utilisateur  travers un rseau informatique,\r\nsans transfert effectif dune copie, ne constitue pas un acheminement.\r\n\r\nUne interface utilisateur interactive affiche des  Notices Lgales\r\nAppropries  quand elle comprend un dispositif convenable, bien\r\nvisible et vident qui (1) affiche une notice approprie sur les droits\r\ndauteur et (2) informe lutilisateur quil ny a pas de garantie pour\r\nle travail (sauf si des garanties ont t fournies hors du cadre de\r\ncette Licence), que les licencis peuvent acheminer le travail sous\r\ncette Licence, et comment voir une copie de cette Licence. Si\r\nlinterface prsente une liste de commandes utilisateur ou doptions,\r\ntel quun menu, un lment vident dans la liste prsente remplit ce\r\ncritre.\r\n\r\n\r\nArticle 1. Code source.\r\n\r\nLe  code source  dun travail signifie la forme prfre du travail\r\npermettant ou facilitant les modifications de celui-ci. Le  code\r\nobjet  dun travail signifie toute forme du travail qui nen est pas\r\nle code source.\r\n\r\nUne  Interface Standard  signifie une interface qui est soit celle\r\ndune norme officielle dfinie par un organisme de normalisation\r\nreconnu ou, dans le cas des interfaces spcifies pour un langage de\r\nprogrammation particulier, une interface largement utilise parmi les\r\ndveloppeurs travaillant dans ce langage.\r\n\r\nLes  Bibliothques Systme  dun travail excutable incluent tout ce\r\nqui, en dehors du travail dans son ensemble, (a) est inclus dans la\r\nforme usuelle de paquetage dun Composant Majeur mais ne fait pas\r\npartie de ce Composant Majeur et (b) sert seulement  permettre\r\nlutilisation du travail avec ce Composant Majeur ou  implmenter une\r\nInterface Standard pour laquelle une implmentation est disponible au\r\npublic sous forme de code source ; un  Composant Majeur  signifie,\r\ndans ce contexte, un composant majeur essentiel (noyau, systme de\r\nfentrage, etc.) du systme dexploitation (le cas chant) dun\r\nsystme sur lequel le travail excutable fonctionne, ou bien un\r\ncompilateur utilis pour produire le code objet du travail, ou un\r\ninterprte de code objet utilis pour excuter celui-ci.\r\n\r\nLe  Source Correspondant  dun travail sous forme de code objet\r\nsignifie lensemble des codes sources ncessaires pour gnrer,\r\ninstaller et (dans le cas dun travail excutable) excuter le code\r\nobjet et modifier le travail, y compris les scripts pour contrler ces\r\nactivits. Cependant, cela ninclue pas les Bibliothques Systme du\r\ntravail, ni les outils dusage gnral ou les programmes libres\r\ngnralement disponibles qui peuvent tre utiliss sans modification\r\npour achever ces activits mais ne sont pas partie de ce travail. Par\r\nexemple le Source Correspondant inclut les fichiers de dfinition\r\ndinterfaces associs aux fichiers sources du travail, et le code\r\nsource des bibliothques partages et des sous-routines lies\r\ndynamiquement, pour lesquelles le travail est spcifiquement conu pour\r\nles requrir via, par exemple, des communications de donnes ou\r\ncontrles de flux internes entre ces sous-programmes et dautres\r\nparties du travail.\r\n\r\nLe Source Correspondant na pas besoin dinclure tout ce que les\r\nutilisateurs peuvent regnrer automatiquement  partir dautres\r\nparties du Source Correspondant.\r\n\r\nLe Source Correspondant pour un travail sous forme de code source est\r\nce mme travail.\r\n\r\n\r\nArticle 2. Permissions de base.\r\n\r\nTous les droits accords suivant cette Licence le sont jusquau terme\r\ndes Droits dAuteur (copyright) sur le Programme, et sont\r\nirrvocables pourvu que les conditions tablies soient remplies. Cette\r\nLicence affirme explicitement votre permission illimite dexcuter le\r\nProgramme non modifi. La sortie produite par lexcution dun Travail\r\nCouvert nest couverte par cette Licence que si cette sortie, tant\r\ndonn leur contenu, constitue un Travail Couvert. Cette Licence\r\nreconnait vos propres droits dusage raisonnable (fair use en\r\nlgislation des tats-Unis dAmrique) ou autres quivalents, tels\r\nquils sont pourvus par la loi applicable sur le Droit dAuteur\r\n(copyright).\r\n\r\nVous pouvez crer, excuter et propager sans condition des Travaux\r\nCouverts que vous nacheminez pas, aussi longtemps que votre licence\r\ndemeure en vigueur. Vous pouvez acheminer des Travaux Couverts \r\ndautres personnes dans le seul but de leur faire raliser des\r\nmodifications  votre usage exclusif, ou pour quils vous fournissent\r\ndes facilits vous permettant dexcuter ces travaux, pourvu que vous\r\nvous conformiez aux termes de cette Licence lors de lacheminement de\r\ntout matriel dont vous ne contrlez pas le Droit dAuteur\r\n(copyright). Ceux qui, ds lors, ralisent ou excutent pour vous les\r\nTravaux Couverts ne doivent alors le faire quexclusivement pour votre\r\npropre compte, sous votre direction et votre contrle, suivant des\r\ntermes qui leur interdisent de raliser, en dehors de leurs relations\r\navec vous, toute copie de votre matriel soumis au Droit dAuteur.\r\n\r\nLacheminement dans toutes les autres circonstances nest permis que\r\nselon les conditions tablies ci-dessous. La concession de\r\nsous-licences nest pas autoris ; larticle 10 rend cet usage non\r\nncessaire.\r\n\r\n\r\nArticle 3. Protection des droits lgaux des utilisateurs envers les\r\nlois anti-contournement.\r\n\r\nAucun Travail Couvert ne doit tre vu comme faisant partie dune mesure\r\ntechnologique effective selon toute loi applicable remplissant les\r\nobligations prvues  larticle 11 du trait international sur le droit\r\ndauteur adopt  lOMPI le 20 dcembre 1996, ou toutes lois similaires\r\nqui prohibent ou restreignent le contournement de telles mesures.\r\n\r\nSi vous acheminez un Travail Couvert, vous renoncez  tout pouvoir lgal\r\ndinterdire le contournement des mesures technologiques dans tous les\r\ncas o un tel contournement serait effectu en exerant les droits\r\nprvus dans cette Licence pour ce Travail Couvert, et vous dclarez\r\nrejeter toute intention de limiter lopration ou la modification du\r\nTravail, en tant que moyens de renforcer,  lencontre des utilisateurs\r\nde ce Travail, vos droits lgaux ou ceux de tierces parties dinterdire\r\nle contournement des mesures technologiques.\r\n\r\n\r\nArticle 4. Acheminement des copies conformes.\r\n\r\nVous pouvez acheminer des copies conformes du code source du Programme\r\ntel que vous lavez reu, sur nimporte quel support, pourvu que vous\r\npubliiez scrupuleusement et de faon approprie sur chaque copie une\r\nnotice de Droit dAuteur approprie ; gardez intactes toutes les\r\nnotices tablissant que cette Licence et tous les termes additionnels non\r\npermissifs ajouts en accord avec larticle 7 sappliquent  ce code ;\r\net donnez  chacun des Destinataires une copie de cette Licence en mme\r\ntemps que le Programme.\r\n\r\nVous pouvez facturer  un prix quelconque, y compris gratuit, chacune\r\ndes copies que vous acheminez, et vous pouvez offrir une protection\r\nadditionnelle de support ou de garantie en change dun paiement.\r\n\r\n\r\nArticle 5. Acheminement des versions sources modifies.\r\n\r\nVous pouvez acheminer un travail bas sur le Programme, ou bien les\r\nmodifications pour le produire  partir du Programme, sous la forme de\r\ncode source suivant les termes de larticle 4, pourvu que vous\r\nsatisfassiez aussi  chacune des conditions requises suivantes :\r\n\r\n  a) Le travail doit comporter des notices videntes tablissant que\r\n     vous lavez modifi et donnant la date correspondante.\r\n\r\n  b) Le travail doit comporter des notices videntes tablissant quil\r\n     est dit selon cette Licence et les conditions ajoutes daprs\r\n     larticle 7. Cette obligation vient modifier lobligation de\r\n     larticle 4 de  garder intactes toutes les notices. \r\n\r\n  c) Vous devez licencier le travail entier, comme un tout, suivant\r\n     cette Licence  quiconque entre en possession dune copie. Cette\r\n     Licence sappliquera en consquence, avec les termes additionnels\r\n     applicables prvus par larticle 7,  la totalit du travail et\r\n     chacune de ses parties, indpendamment de la faon dont ils sont\r\n     empaquets. Cette licence ne donne aucune permission de licencier\r\n     le travail dune autre faon, mais elle ninvalide pas une telle\r\n     permission si vous lavez reue sparment. \r\n\r\n  d) Si le travail a des interfaces utilisateurs interactives, chacune\r\n     doit afficher les Notices Lgales Appropries ; cependant si le\r\n     Programme a des interfaces qui naffichent pas les Notices Lgales\r\n     Appropries, votre travail na pas  les modifier pour quelles\r\n     les affichent. \r\n\r\nUne compilation dun Travail Couvert avec dautres travaux spars et\r\nindpendants, qui ne sont pas par leur nature des extensions du Travail\r\nCouvert, et qui ne sont pas combins avec lui de faon  former un\r\nprogramme plus large, dans ou sur un volume de stockage ou un support\r\nde distribution, est appel un  aggrgat  si la compilation et son\r\nDroit dAuteur rsultant ne sont pas utiliss pour limiter laccs ou\r\nles droits lgaux des utilisateurs de la compilation en dea de ce que\r\npermettent les travaux individuels. Linclusion dun Travail Couvert\r\ndans un aggrgat ne cause pas lapplication de cette Licence aux\r\nautres parties de laggrgat.\r\n\r\n\r\nArticle 6. Acheminement des formes non sources.\r\n\r\nVous pouvez acheminer sous forme de code objet un Travail Couvert\r\nsuivant les termes des articles 4 et 5, pourvu que vous acheminiez\r\ngalement suivant les termes de cette Licence le Source Correspondant\r\nlisible par une machine, dune des faons suivantes :\r\n\r\n  a) Acheminer le code objet sur, ou inclus dans, un produit physique\r\n     (y compris un support de distribution physique), accompagn par le\r\n     Source Correspondant fix sur un support physique durable\r\n     habituellement utilis pour les changes de logiciels.\r\n\r\n  b) Acheminer le code objet sur, ou inclus dans, un produit physique\r\n     (y compris un support de distribution physique), accompagn dune\r\n     offre crite, valide pour au moins trois annes et valide pour\r\n     aussi longtemps que vous fournissez des pices de rechange ou un\r\n     support client pour ce modle de produit, afin de donner \r\n     quiconque possde le code objet soit (1) une copie du Source\r\n     Correspondant  tout logiciel dans ce produit qui est couvert par\r\n     cette Licence, sur un support physique durable habituellement\r\n     utilis pour les changes de logiciels, pour un prix non suprieur\r\n     au cot raisonnable de la ralisation physique de lacheminement\r\n     de la source, ou soit (2) un accs permettant de copier le Source\r\n     Correspondant depuis un serveur rseau sans frais.\r\n\r\n  c) Acheminer des copies individuelles du code objet avec une copie de\r\n     loffre crite de fournir le Source Correspondant. Cette\r\n     alternative est permise seulement occasionellement et non\r\n     commercialement, et seulement si vous avez reu le code objet avec\r\n     une telle offre, en accord avec larticle 6 alina b.\r\n\r\n  d) Acheminer le code objet en offrant un accs depuis un emplacement\r\n     dsign (gratuit ou contre facturation) et offrir un accs\r\n     quivalent au Source Correspondant de la mme faon via le mme\r\n     emplacement et sans facturation supplmentaire. Vous navez pas\r\n     besoin dobliger les Destinataires  copier le Source\r\n     Correspondant en mme temps que le code objet. Si lemplacement\r\n     pour copier le code objet est un serveur rseau, le Source\r\n     Correspondant peut tre sur un serveur diffrent (opr par vous\r\n     ou par un tiers) qui supporte des facilits quivalentes de\r\n     copie, pourvu que vous mainteniez des directions claires \r\n     proximit du code objet indiquant o trouver le Source\r\n     Correspondant. Indpendamment de quel serveur hberge le Source\r\n     Correspondant, vous restez oblig de vous assurer quil reste\r\n     disponible aussi longtemps que ncessaire pour satisfaire  ces\r\n     obligations.\r\n\r\n  e) Acheminer le code objet en utilisant une transmission\r\n     dgal--gal, pourvu que vous informiez les autres participants\r\n     sur o le code objet et le Source Correspondant du travail sont\r\n     offerts sans frais au public gnral suivant larticle 6 alina d.\r\n     Une portion sparable du code objet, dont le code source est exclu\r\n     du Source Correspondant en tant que Bibliothque Systme, na pas\r\n     besoin dtre inclu dans lacheminement du travail sous forme de\r\n     code objet.\r\n\r\nUn  Produit Utilisateur  est soit (1) un  Produit de Consommation, \r\nce qui signifie toute proprit personnelle tangible normalement\r\nutilise  des fins personnelles, familiales ou relatives au foyer,\r\nsoit (2) toute chose conue ou vendue pour lincorporation dans un lieu\r\ndhabitation. Pour dterminer si un produit constitue un Produit de\r\nConsommation, les cas ambigus sont rsolus en fonction de la\r\ncouverture. Pour un produit particulier reu par un utilisateur\r\nparticulier, lexpression  normalement utilise  ci-avant se rfre\r\n une utilisation typique ou lusage commun de produits de mme\r\ncatgorie, indpendamment du statut de cet utilisateur particulier ou\r\nde la faon spcifique dont cet utilisateur particulier utilise\r\neffectivement ou sattend lui-mme ou est attendu  utiliser ce\r\nproduit. Un produit est un Produit de Consommation indpendamment du\r\nfait que ce produit a ou na pas dutilisations substantielles\r\ncommerciales, industrielles ou hors Consommation,  moins que de telles\r\nutilisations reprsentent le seul mode significatif dutilisation du\r\nproduit.\r\n\r\nLes  Informations dInstallation  dun Produit Utilisateur signifient\r\ntoutes les mthodes, procdures, cls dautorisation ou autres\r\ninformations requises pour installer et excuter des versions modifies\r\ndun Travail Couvert dans ce Produit Utilisateur  partir dune version\r\nmodifie de son Source Correspondant. Les informations qui suffisent \r\nassurer la continuit de fonctionnement du code objet modifi ne\r\ndoivent en aucun cas tre empches ou interfres du seul fait quune\r\nmodification a t effectue.\r\n\r\nSi vous acheminez le code objet dun Travail Couvert dans, ou avec, ou\r\nspcifiquement pour lutilisation dans, un Produit Utilisateur et\r\nlacheminement se produit en tant qulment dune transaction dans\r\nlaquelle le droit de possession et dutilisation du Produit\r\nUtilisateur est transfr au Destinataire dfinitivement ou pour un\r\nterme fix (indpendamment de la faon dont la transaction est\r\ncaractrise), le Source Correspondant achemin selon cet article-ci\r\ndoit tre accompagn des Informations dInstallation. Mais cette\r\nobligation ne sapplique pas si ni vous ni aucune tierce partie ne\r\ndtient la possibilit dintaller un code objet modifi sur le Produit\r\nUtilisateur (par exemple, le travail a t install en mmoire morte).\r\n\r\nLobligation de fournir les Informations dInstallation ninclue pas\r\ncelle de continuer  fournir un service de support, une garantie ou des\r\nmises  jour pour un travail qui a t modifi ou install par le\r\nDestinataire, ou pour le Produit Utilisateur dans lequel il a t\r\nmodifi ou install. Laccs  un rseau peut tre rejet quand la\r\nmodification elle-mme affecte matriellement et dfavorablement les\r\noprations du rseau ou viole les rgles et protocoles de communication\r\nau travers du rseau.\r\n\r\nLe Source Correspondant achemin et les Informations dInstallation\r\nfournies, en accord avec cet article, doivent tre dans un format\r\npubliquement document (et dont une implmentation est disponible\r\nauprs du public sous forme de code source) et ne doit ncessiter\r\naucune cl ou mot de passe spcial pour le dpaquetage, la lecture ou\r\nla copie.\r\n\r\n\r\nArticle 7. Termes additionnels.\r\n\r\nLes  permissions additionelles  dsignent les termes qui\r\nsupplmentent ceux de cette Licence en mettant des exceptions  lune\r\nou plusieurs de ses conditions. Les permissions additionnelles qui\r\nsont applicables au Programme entier doivent tre traites comme si\r\nelles taient incluent dans cette Licence, dans les limites de leur\r\nvalidit suivant la loi applicable. Si des permissions additionnelles\r\nsappliquent seulement  une partie du Programme, cette partie peut\r\ntre utilise sparment suivant ces permissions, mais le Programme\r\ntout entier reste gouvern par cette Licence sans regard aux\r\npermissions additionelles.\r\n\r\nQuand vous acheminez une copie dun Travail Couvert, vous pouvez \r\nvotre convenance ter toute permission additionelle de cette copie, ou\r\nde nimporte quelle partie de celui-ci. (Des permissions\r\nadditionnelles peuvent tre rdiges de faon  requrir leur propre\r\nsuppression dans certains cas o vous modifiez le travail.) Vous\r\npouvez placer les permissions additionnelles sur le matriel achemin,\r\najoutes par vous  un Travail Couvert pour lequel vous avez ou pouvez\r\ndonner les permissions de Droit dAuteur (copyright) appropries.\r\n\r\nNonobstant toute autre clause de cette Licence, pour tout constituant\r\nque vous ajoutez  un Travail Couvert, vous pouvez (si autoris par les\r\ntitulaires de Droit dAuteur pour ce constituant) supplmenter les\r\ntermes de cette Licence avec des termes :\r\n\r\n  a) qui rejettent la garantie ou limitent la responsabilit de faon\r\n     diffrente des termes des articles 15 et 16 de cette Licence ; ou\r\n\r\n  b) qui requirent la prservation de notices lgales raisonnables\r\n     spcifies ou les attributions dauteur dans ce constituant ou\r\n     dans les Notices Lgales Appropries affiches par les travaux qui\r\n     le contiennent ; ou\r\n\r\n  c) qui prohibent la reprsentation incorrecte de lorigine de ce\r\n     constituant, ou qui requirent que les versions modifies dun tel\r\n     constituant soit marques par des moyens raisonnables comme\r\n     diffrentes de la version originale ; ou\r\n\r\n  d) qui limitent lusage  but publicitaire des noms des concdants de\r\n     licence et des auteurs du constituant ; ou\r\n\r\n  e) qui refusent  accorder des droits selon la lgislation relative\r\n     aux marques commerciales, pour lutilisation dans des noms\r\n     commerciaux, marques commerciales ou marques de services ; ou\r\n\r\n  f) qui requirent lindemnisation des concdants de licences et\r\n     auteurs du constituant par quiconque achemine ce constituant (ou\r\n     des versions modifies de celui-ci) en assumant contractuellement\r\n     la responsabilit envers le Destinataire, pour toute\r\n     responsabilit que ces engagements contractuels imposent\r\n     directement  ces octroyants de licences et auteurs.\r\n\r\nTous les autres termes additionnels non permissifs sont considrs\r\ncomme des  restrictions avances  dans le sens de larticle 10. Si le\r\nProgramme tel que vous lavez reu, ou toute partie de celui-ci,\r\ncontient une notice tablissant quil est gouvern par cette Licence en\r\nmme temps quun terme qui est une restriction avance, vous pouvez\r\nter ce terme. Si un document de licence contient une restriction\r\navance mais permet la reconcession de licence ou lacheminement\r\nsuivant cette Licence, vous pouvez ajouter un Travail Couvert\r\nconstituant gouvern par les termes de ce document de licence, pourvu\r\nque la restriction avance ne survit pas  un telle cession de licence\r\nou acheminement.\r\n\r\nSi vous ajoutez des termes  un Travail Couvert en accord avec cet\r\narticle, vous devez placer, dans les fichiers sources appropris, une\r\ndclaration des termes additionnels qui sappliquent  ces fichiers, ou\r\nune notice indiquant o trouver les termes applicables.\r\n\r\nLes termes additionnels, quils soient permissifs ou non permissifs,\r\npeuvent tre tablis sous la forme dune licence crite sparment, ou\r\ntablis comme des exceptions ; les obligations ci-dessus sappliquent\r\ndans chacun de ces cas.\r\n\r\n\r\nArticle 8. Terminaison.\r\n\r\nVous ne pouvez ni propager ni modifier un Travail Couvert autrement que\r\nsuivant les termes de cette Licence. Toute autre tentative de le\r\npropager ou le modifier est nulle et terminera automatiquement vos\r\ndroits selon cette Licence (y compris toute licence de brevet accorde\r\nselon le troisime paragraphe de larticle 11).\r\n\r\nCependant, si vous cessez toute violation de cette Licence, alors votre\r\nlicence depuis un titulaire de Droit dAuteur (copyright) est\r\nrinstaure (a)  titre provisoire  moins que et jusqu ce que le\r\ntitulaire de Droit dAuteur termine finalement et explicitement votre\r\nlicence, et (b) de faon permanente si le titulaire de Droit dAuteur\r\nne parvient pas  vous notifier de la violation par quelque moyen\r\nraisonnable dans les soixante (60) jours aprs la cessation.\r\n\r\nDe plus, votre licence depuis un titulaire particulier de Droit\r\ndAuteur est rinstaure de faon permanente si ce titulaire vous\r\nnotifie de la violation par quelque moyen raisonnable, cest la\r\npremire fois que vous avez reu une notification deviolation de cette\r\nLicence (pour un travail quelconque) depuis ce titulaire de Droit\r\ndAuteur, et vous rsolvez la violation dans les trente (30) jours qui\r\nsuivent votre rception de la notification.\r\n\r\nLa terminaison de vos droits suivant cette section ne terminera pas les\r\nlicences des parties qui ont reu des copies ou droits de votre part\r\nsuivant cette Licence. Si vos droits ont t termins et non\r\nrinstaurs de faon permanente, vous ntes plus qualifi  recevoir\r\nde nouvelles licences pour les mmes constituants selon larticle 10.\r\n\r\n\r\nArticle 9. Acceptation non requise pour obtenir des copies.\r\n\r\nVous ntes pas oblig daccepter cette licence afin de recevoir ou\r\nexcuter une copie du Programme. La propagation asservie dun Travail\r\nCouvert qui se produit simplement en consquence dune transmission\r\ndgal--gal pour recevoir une copie ne ncessite pas lacceptation.\r\nCependant, rien dautre que cette Licence ne vous accorde la\r\npermission de propager ou modifier un quelconque Travail Couvert. Ces\r\nactions enfreignent le Droit dAuteur si vous nacceptez pas cette\r\nLicence. Par consquent, en modifiant ou propageant un Travail Couvert,\r\nvous indiquez votre acceptation de cette Licence pour agir ainsi.\r\n\r\n\r\nArticle 10. Cession automatique de Licence aux Destinataires et\r\nintermdiaires.\r\n\r\nChaque fois que vous acheminez un Travail Couvert, le Destinataire\r\nreoit automatiquement une licence depuis les concdants originaux,\r\npour excuter, modifier et propager ce travail, suivant les termes de\r\ncette Licence. Vous ntes pas responsable du renforcement de la\r\nconformation des tierces parties avec cette Licence.\r\n\r\nUne  transaction dentit  dsigne une transaction qui transfre le\r\ncontrle dune organisation, ou de substantiellement tous ses actifs,\r\nou la subdivision dune organisation, ou la fusion de plusieurs\r\norganisations. Si la propagation dun Travail Couvert rsulte dune\r\ntransaction dentit, chaque partie  cette transaction qui reoit une\r\ncopie du travail reoit aussi les licences pour le travail que le\r\nprdcesseur intress  cette partie avait ou pourrait donner selon le\r\nparagraphe prcdent, plus un droit de possession du Source\r\nCorrespondant de ce travail depuis le prdcesseur intress si ce\r\nprdcesseur en dispose ou peut lobtenir par des efforts raisonnables.\r\n\r\nVous ne pouvez imposer aucune restriction avance dans lexercice des\r\ndroits accords ou affirms selon cette Licence. Par exemple, vous ne\r\npouvez imposer aucun paiement pour la licence, aucune royaltie, ni\r\naucune autre charge pour lexercice des droits accords selon cette\r\nLicence ; et vous ne pouvez amorcer aucun litige judiciaire (y compris\r\nune rclamation croise ou contre-rclamation dans un procs) sur\r\nlallgation quune revendication de brevet est enfreinte par la\r\nralisation, lutilisation, la vente, loffre de vente, ou\r\nlimportation du Programme ou dune quelconque portion de celui-ci.\r\n\r\n\r\nArticle 11. Brevets.\r\n\r\nUn  contributeur  est un titulaire de Droit dAuteur (copyright)\r\nqui autorise lutilisation selon cette Licence du Programme ou du\r\ntravail sur lequel le Programme est bas. Le travail ainsi soumis \r\nlicence est appel la  version contributive  de ce contributeur.\r\n\r\nLes  revendications de brevet essentielles  sont toutes les\r\nrevendications de brevets dtenues ou contrles par le contributeur,\r\nquelles soient dj acquises par lui ou acquises subsquemment, qui\r\npourraient tre enfreintes de quelque manire, permises par cette\r\nLicence, sur la ralisation, lutilisation ou la vente de la version\r\ncontributive de celui-ci. Aux fins de cette dfinition, le  contrle \r\ninclue le droit de concder des sous-licences de brevets dune manire\r\nconsistante, ncessaire et suffisante, avec les obligations de cette\r\nLicence.\r\n\r\nChaque contributeur vous accorde une licence de brevet non exclusive,\r\nmondiale et libre de toute royaltie, selon les revendications de brevet\r\nessentielles, pour raliser, utiliser, vendre, offrir  la vente,\r\nimporter et autrement excuter, modifier et propager les contenus de sa\r\nversion contributive.\r\n\r\nDans les trois paragraphes suivants, une  licence de brevet  dsigne\r\ntous les accords ou engagements exprims, quel que soit le nom que vous\r\nlui donnez, de ne pas mettre en vigueur un brevet (telle quune\r\npermission explicite pour mettre en pratique un brevet, ou un accord\r\npour ne pas poursuivre un Destinataire pour cause de violation de\r\nbrevet).  Accorder  une telle licence de brevet  une partie signifie\r\nconclure un tel accord ou engagement  ne pas faire appliquer le brevet\r\n cette partie.\r\n\r\nSi vous acheminez un Travail Couvert, dpendant en connaissance dune\r\nlicence de brevet, et si le Source Correspondant du travail nest pas\r\ndisponible  quiconque copie, sans frais et suivant les termes de cette\r\nLicence,  travers un serveur rseau publiquement acessible ou tout\r\nautre moyen immdiatement accessible, alors vous devez soit (1) rendre\r\nla Source Correspondante ainsi disponible, soit (2) vous engager  vous\r\npriver pour vous-mme du bnfice de la licence de brevet pour ce\r\ntravail particulier, soit (3) vous engager, dune faon consistante\r\navec les obligations de cette Licence,  tendre la licence de brevet\r\naux Destinataires de ce travail.  Dpendant en connaissance  signifie\r\nque vous avez effectivement connaissance que, selon la licence de\r\nbrevet, votre acheminement du Travail Couvert dans un pays, ou\r\nlutilisation du Travail Couvert par votre Destinataire dans un pays,\r\ninfreindrait un ou plusieurs brevets identifiables dans ce pays o vous\r\navez des raisons de penser quils sont valides.\r\n\r\nSi, conformment  ou en liaison avec une mme transaction ou un mme\r\narrangement, vous acheminez, ou propagez en procurant un acheminement\r\nde, un Travail Couvert et accordez une licence de brevet  lune des\r\nparties recevant le Travail Couvert pour lui permettre dutiliser,\r\npropager, modifier ou acheminer une copie spcifique du Travail\r\nCouvert, alors votre accord est automatiquement tendu  tous les\r\nDestinataires du Travail Couvert et des travaux bass sur celui-ci.\r\n\r\nUne licence de brevet est  discriminatoire  si, dans le champ de sa\r\ncouverture, elle ninclut pas un ou plusieurs des droits qui sont\r\nspcifiquement accords selon cette Licence, ou en prohibe lexercice,\r\nou est conditionne par le non-exercice dun ou plusieurs de ces\r\ndroits. Vous ne pouvez pas acheminer un Travail Couvert si vous tes\r\npartie  un arrangement selon lequel une partie tierce exerant son\r\nactivit dans la distribution de logiciels et  laquelle vous effectuez\r\nun paiement fond sur ltendue de votre activit dacheminement du\r\ntravail, et selon lequel la partie tierce accorde,  une quelconque\r\npartie qui recevrait depuis vous le Travail Couvert, une licence de\r\nbrevet discriminatoire (a) en relation avec les copies du Travail\r\nCouvert achemines par vous (ou les copies ralises  partir de ces\r\ncopies), ou (b) avant tout destine et en relation avec des produits\r\nspcifiques ou compilations contenant le Travail Couvert,  moins que\r\nvous ayez conclu cet arrangement ou que la licence de brevet ait t\r\naccorde avant le 28 mars 2007.\r\n\r\nRien dans cette Licence ne devrait tre interprt comme devant exclure\r\nou limiter toute licence implicite ou dautres moyens de dfense  une\r\ninfraction qui vous seraient autrement disponible selon la loi\r\napplicable relative aux brevets.\r\n\r\n\r\nArticle 12. Non abandon de la libert des autres.\r\n\r\nSi des conditions vous sont imposes (que ce soit par dcision\r\njudiciaire, par un accord ou autrement) qui contredisent les conditions\r\nde cette Licence, elles ne vous excusent pas des conditions de cette\r\nLicence. Si vous ne pouvez pas acheminer un Travail Couvert de faon \r\nsatisfaire simultnment vos obligations suivant cette Licence et\r\ntoutes autres obligations pertinentes, alors en consquence vous ne\r\npouvez pas du tout lacheminer. Par exemple, si vous avez un accord sur\r\ndes termes qui vous obligent  collecter pour le racheminement des\r\nroyalties depuis ceux  qui vous acheminez le Programme, la seule faon\r\nqui puisse vous permettre de satisfaire  la fois  ces termes et ceux\r\nde cette Licence sera de vous abstenir entirement dacheminer le\r\nProgramme.\r\n\r\n\r\nArticle 13. Utilisation avec la Licence Gnrale Publique Affero GNU.\r\n\r\nNonobstant toute autre clause de cette Licence, vous avez la permission\r\nde lier ou combiner tout Travail Couvert avec un travail plac sous la\r\nversion 3 de la Licence Gnrale Publique GNU Affero (GNU Affero\r\nGeneral Public License) en un seul travail combin, et dacheminer le\r\ntravail rsultant. Les termes de cette Licence continueront \r\nsappliquer  la partie formant un Travail Couvert, mais les\r\nobligations spciales de la Licence Gnrale Publique GNU Affero,\r\narticle 13, concernant linteraction  travers un rseau sappliqueront\r\n la combinaison en tant que telle.\r\n\r\n\r\nArticle 14. Versions rvises de cette License.\r\n\r\nLa Free Software Foundation peut publier des versions rvises et/ou\r\nnouvelles de la Licence Publique Gnrale GNU (GNU General Public\r\nLicense) de temps en temps. De telles version nouvelles resteront\r\nsimilaires dans lesprit avec la prsente version, mais peuvent\r\ndiffrer dans le dtail afin de traiter de nouveaux problmes ou\r\nproccupations.\r\n\r\nChaque version reoit un numro de version distinctif. Si le Programme\r\nindique quune version spcifique de la Licence Publique Gnrale GNU\r\n ou toute version ultrieure  (or any later version) sapplique \r\ncelui-ci, vous avez le choix de suivre soit les termes et conditions de\r\ncette version numrote, soit ceux de nimporte quelle version publie\r\nultrieurement par la Free Software Foundation. Si le Programme\r\nnindique pas une version spcifique de la Licence Publique Gnrale\r\nGNU, vous pouvez choisir lune quelconque des versions qui ont t\r\npublies par la Free Software Foundation.\r\n\r\nSi le Programme spcifie quun intermdiaire peut dcider quelles\r\nversions futures de la Licence Gnrale Publique GNU peut tre\r\nutilise, la dclaration publique dacceptation dune version par cet\r\nintermdiaire vous autorise  choisir cette version pour le Programme.\r\n\r\nDes versions ultrieures de la licence peuvent vous donner des\r\npermissions additionelles ou diffrentes. Cependant aucune obligation\r\nadditionelle nest impose  lun des auteurs ou titulaires de Droit\r\ndAuteur du fait de votre choix de suivre une version ultrieure.\r\n\r\n\r\nArticle 15. Dclaration dabsence de garantie.\r\n\r\nIL NY A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LES LIMITES PERMISES\r\nPAR LA LOI APPLICABLE.  MOINS QUE CELA NE SOIT TABLI DIFFREMMENT PAR\r\nCRIT, LES PROPRITAIRES DE DROITS ET/OU LES AUTRES PARTIES FOURNISSENT\r\nLE PROGRAMME  EN LTAT  SANS GARANTIE DAUCUNE SORTE, QUELLE SOIT\r\nEXPRIME OU IMPLICITE, CECI COMPRENANT, SANS SE LIMITER  CELLES-CI,\r\nLES GARANTIES IMPLICITES DE COMMERCIALISABILIT ET DADQUATION  UN\r\nOBJECTIF PARTICULIER. VOUS ASSUMEZ LE RISQUE ENTIER CONCERNANT LA\r\nQUALIT ET LES PERFORMANCES DU PROGRAMME. DANS LVENTUALIT O LE\r\nPROGRAMME SAVRERAIT DFECTUEUX, VOUS ASSUMEZ LES COTS DE TOUS LES\r\nSERVICES, RPARATIONS OU CORRECTIONS NCESSAIRES.\r\n\r\n\r\nArticle 16. Limitation de responsabilit.\r\n\r\nEN AUCUNE AUTRE CIRCONSTANCE QUE CELLES REQUISES PAR LA LOI APPLICABLE\r\nOU ACCORDES PAR CRIT, UN TITULAIRE DE DROITS SUR LE PROGRAMME, OU\r\nTOUT AUTRE PARTIE QUI MODIFIE OU ACHEMINE LE PROGRAMME COMME PERMIS\r\nCI-DESSUS, NE PEUT TRE TENU POUR RESPONSABLE ENVERS VOUS POUR LES\r\nDOMMAGES, INCLUANT TOUT DOMMAGE GNRAL, SPCIAL, ACCIDENTEL OU INDUIT\r\nSURVENANT PAR SUITE DE LUTILISATION OU DE LINCAPACIT DUTILISER LE\r\nPROGRAMME (Y COMPRIS, SANS SE LIMITER  CELLES-CI, LA PERTE DE DONNES\r\nOU LINEXACTITUDE DES DONNES RETOURNES OU LES PERTES SUBIES PAR VOUS\r\nOU DES PARTIES TIERCES OU LINCAPACIT DU PROGRAMME  FONCTIONNER AVEC\r\nTOUT AUTRE PROGRAMME), MME SI UN TEL TITULAIRE OU TOUTE AUTRE PARTIE\r\nA T AVIS DE LA POSSIBILIT DE TELS DOMMAGES.\r\n\r\n\r\nArticle 17. Interprtation des sections 15 et 16.\r\n\r\nSi la dclaration dabsence de garantie et la limitation de\r\nresponsabilit fournies ci-dessus ne peuvent prendre effet localement\r\nselon leurs termes, les cours de justice qui les examinent doivent\r\nappliquer la lgislation locale qui approche au plus prs possible une\r\nleve absolue de toute responsabilit civile lie au Programme,  moins\r\nquune garantie ou assumation de responsabilit accompagne une copie du\r\nProgramme en change dun paiement.\r\n\r\n\r\nFIN DES TERMES ET CONDITIONS.\r\n\r\n_______________________________________________________________________\r\n\r\n\r\nComment appliquer ces termes  vos nouveaux programmes\r\n\r\nSi vous dveloppez un nouveau programme et voulez quil soit le plus\r\npossible utilisable par le public, la meilleure faon dy parvenir et\r\nden faire un logiciel libre que chacun peut redistribuer et changer\r\nsuivant ces termes-ci.\r\n\r\nPour appliquer ces termes, attachez les notices suivantes au programme.\r\nIl est plus sr de les attacher au dbut de chacun des fichiers sources\r\nafin de transporter de faon la plus effective possible lexclusion de\r\ngarantie ; et chaque fichier devrait comporter au moins la ligne de\r\nrservation de droit (copyright) et une indication permettant de savoir\r\no la notice complte peut tre trouve :\r\n\r\n  <une ligne donnant le nom du programme et une brve ide de ce quil fait.>\r\n  Copyright (C) <anne> <nom de lauteur>  Tous droits rservs.\r\n  \r\n  Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le\r\n  modifier suivant les termes de la GNU General Public License telle que\r\n  publie par la Free Software Foundation : soit la version 3 de cette\r\n  licence, soit ( votre gr) toute version ultrieure.\r\n  \r\n  Ce programme est distribu dans lespoir quil vous sera utile, mais SANS\r\n  AUCUNE GARANTIE : sans mme la garantie implicite de COMMERCIALISABILIT\r\n  ni dADQUATION  UN OBJECTIF PARTICULIER. Consultez la Licence Gnrale\r\n  Publique GNU pour plus de dtails.\r\n  \r\n  Vous devriez avoir reu une copie de la Licence Gnrale Publique GNU avec\r\n  ce programme ; si ce nest pas le cas, consultez :\r\n  <http://www.gnu.org/licenses/>.\r\n\r\nAjoutez galement les informations permettant de vous contacter par\r\ncourrier lectronique ou postal.\r\n\r\nSi le programme produit une interaction sur un terminal, faites lui\r\nafficher une courte notice comme celle-ci lors de son dmarrage en mode\r\ninteractif :\r\n\r\n  <programme> Copyright (C) <anne> <nom de lauteur>\r\n  Ce programme vient SANS ABSOLUMENT AUCUNE GARANTIE ; taper affiche g pour\r\n  les dtails. Ceci est un logiciel libre et vous tes invit  le redistribuer\r\n  suivant certaines conditions ; taper affiche c pour les dtails.\r\n\r\nLes commandes hypothtiques affiche g and affiche c devrait\r\nafficher les parties appropries de la Licence Gnrale Publique. Bien\r\nsr, les commandes de votre programme peuvent tre diffrentes ; pour\r\nune interface graphique, vous pourriez utiliser une  bote  propos. \r\n\r\nVous devriez galement obtenir de votre employeur (si vous travaillez\r\nen tant que programmeur) ou de votre cole un  renoncement aux droits\r\nde proprit  pour ce programme, si ncessaire. Pour plus\r\ndinformations  ce sujet, et comment appliquer la GPL GNU, consultez\r\n<http://www.gnu.org/licenses/>.\r\n\r\nLa Licence Gnrale Publique GNU ne permet pas dincorporer votre\r\nprogramme dans des programmes propritaires. Si votre programme est une\r\nbibliothque de sous-routines, vous pourriez considrer quil serait\r\nplus utile de permettre de lier des applications propritaires avec la\r\nbibliothque. Si cest ce que vous voulez faire, utilisez la Licence\r\nGnrale Publique Limite GNU au lieu de cette Licence ; mais dabord,\r\nveuillez lire <http://www.gnu.org/philosophy/why-not-lgpl.html>.\r\n\r\n_______________________________________________________________________"
  },
  {
    "path": "doc/french/InfraRecorder.hhp",
    "content": "[OPTIONS]\r\nCompatibility=1.1 or later\r\nCompiled file=French.chm\r\nContents file=InfraRecorderFR.hhc\r\nDefault topic=infra_recorder\\introduction.html\r\nDisplay compile progress=No\r\nFull text search stop list file=fr.stp\r\nFull-text search=Yes\r\nIndex file=InfraRecorderFR.hhk\r\nLanguage=0x809 English (United Kingdom)\r\nTitle=Aide InfraRecorder\r\n\r\n\r\n[INFOTYPES]\r\n\r\n"
  },
  {
    "path": "doc/french/InfraRecorderFR.hhc",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<OBJECT type=\"text/site properties\">\r\n\t<param name=\"ImageType\" value=\"Folder\">\r\n</OBJECT>\r\n<UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Infra Recorder\">\r\n\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t</OBJECT>\r\n\t<UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\introduction.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"17\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Aper&ccedil;u des fonctionnalit&eacute;s\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\feature_overview.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"31\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Accord de licence\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\license_agreement_fr.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"37\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"License Agreement (Officiel)\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\license_agreement.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"37\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Configuration requise\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\system_requirements.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"41\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"D&eacute;marrage rapide\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\quick_start.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\copyright.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"27\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Accords\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\acknowledgments.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Quoi de neuf ?\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\whats_new.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"12\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\installation.html\">\r\n\t\t\t<param name=\"URL\" value=\"infra_recorder\\installation.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t\t<param name=\"Local\" value=\"infra_recorder\\faq.html\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"9\">\r\n\t\t\t</OBJECT>\r\n\t</UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Comment faire ?\">\r\n\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t</OBJECT>\r\n\t<UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Travail en projet\">\r\n\t\t\t<param name=\"ImageNumber\" value=\"1\">\r\n\t\t\t</OBJECT>\r\n\t\t<UL>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Premier projet\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\getting_started.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Les disques multi-sessions\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\multisession_disc.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Param&egrave;tres projet\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\project_settings.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t\t<param name=\"Name\" value=\"Ajout d'une image de boot\">\r\n\t\t\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\add_boot_image.html\">\r\n\t\t\t\t</OBJECT>\r\n\t\t</UL>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Graver une image\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\burn_image.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Options de gravure\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\burn_options.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Options de lecture\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\read_options.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copier des disque audios\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\copy_audio_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Copier des disques de donn&eacute;es\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\copy_data_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Informations disque\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\disc_information.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Effacer un disque\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\erase_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Cl&ocirc;turer un disque\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\fixate_disc.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"G&eacute;rer les pistes\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\manage_tracks.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Configuration des p&eacute;riph&eacute;riques\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\device_configuration.html\">\r\n\t\t\t</OBJECT>\r\n\t\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t\t<param name=\"Local\" value=\"how_to_use\\configuration.html\">\r\n\t\t\t</OBJECT>\r\n\t</UL>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "doc/french/InfraRecorderFR.hhk",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">\r\n<!-- Sitemap 1.0 -->\r\n</HEAD><BODY>\r\n<UL>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Accords\">\r\n\t\t<param name=\"Name\" value=\"Acknowledgments\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\acknowledgments.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Image de boot\">\r\n\t\t<param name=\"Name\" value=\"Add Boot Image\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\add_boot_image.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Graver une image\">\r\n\t\t<param name=\"Name\" value=\"Burn Image\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\burn_image.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Options de gravure\">\r\n\t\t<param name=\"Name\" value=\"Burn Options\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\burn_options.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t<param name=\"Name\" value=\"Configuration\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\configuration.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copier un disque audio\">\r\n\t\t<param name=\"Name\" value=\"Copy Audio Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\copy_audio_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copier un disque de donn&eacute;es\">\r\n\t\t<param name=\"Name\" value=\"Copy Data Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\copy_data_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t<param name=\"Name\" value=\"Copyright\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\copyright.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Configuration des p&eacute;riph&eacute;riques\">\r\n\t\t<param name=\"Name\" value=\"Device Configuration\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\device_configuration.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Effacer un disque\">\r\n\t\t<param name=\"Name\" value=\"Erase Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\erase_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Informations disque\">\r\n\t\t<param name=\"Name\" value=\"Disc Information\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\disc_information.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t<param name=\"Name\" value=\"FAQ\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\faq.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Aper&ccedil;u des fonctionnalit&eacute;s\">\r\n\t\t<param name=\"Name\" value=\"Feature Overview\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\feature_overview.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Cl&ocirc;turer un disque\">\r\n\t\t<param name=\"Name\" value=\"Fixate Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\fixate_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Premier projet\">\r\n\t\t<param name=\"Name\" value=\"Getting Started\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\getting_started.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t<param name=\"Name\" value=\"Installation\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\installation.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t<param name=\"Name\" value=\"Introduction\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\introduction.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Accord de licence\">\r\n\t\t<param name=\"Name\" value=\"License Agreement\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\license_agreement.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Gestion des pistes\">\r\n\t\t<param name=\"Name\" value=\"Manage Tracks\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\manage_tracks.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Disques multi-sessions\">\r\n\t\t<param name=\"Name\" value=\"Multi-Session Disc\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\multisession_disc.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Param&egrave;tres projet\">\r\n\t\t<param name=\"Name\" value=\"Project Settings\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\working_with_projects\\project_settings.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"D&eacute;marrage rapide\">\r\n\t\t<param name=\"Name\" value=\"Quick Start\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\quick_start.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Options de lecture\">\r\n\t\t<param name=\"Name\" value=\"Read Options\">\r\n\t\t<param name=\"Local\" value=\"how_to_use\\read_options.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Configuration requise\">\r\n\t\t<param name=\"Name\" value=\"System Requirements\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\system_requirements.html\">\r\n\t\t</OBJECT>\r\n\t<LI> <OBJECT type=\"text/sitemap\">\r\n\t\t<param name=\"Name\" value=\"Quoi de neuf\">\r\n\t\t<param name=\"Name\" value=\"What's New\">\r\n\t\t<param name=\"Local\" value=\"infra_recorder\\whats_new.html\">\r\n\t\t</OBJECT>\r\n</UL>\r\n</BODY></HTML>\r\n"
  },
  {
    "path": "doc/french/fr.stp",
    "content": "alors\r\nau\r\naucuns\r\naussi\r\nautre\r\navant\r\navec\r\navoir\r\nbon\r\ncar\r\nce\r\ncela\r\nces\r\nceux\r\nchaque\r\nci\r\ncomme\r\ncomment\r\ndans\r\ndes\r\ndu\r\ndedans\r\ndehors\r\ndepuis\r\ndeux\r\ndevrait\r\ndoit\r\ndonc\r\ndos\r\ndroite\r\ndbut\r\nelle\r\nelles\r\nen\r\nencore\r\nessai\r\nest\r\net\r\neu\r\nfait\r\nfaites\r\nfois\r\nfont\r\nforce\r\nhaut\r\nhors\r\nici\r\nil\r\nils\r\nje\t\r\njuste\r\nla\r\nle\r\nles\r\nleur\r\nl\r\nma\r\nmaintenant\r\nmais\r\nmes\r\nmine\r\nmoins\r\nmon\r\nmot\r\nmme\r\nni\r\nnomms\r\nnotre\r\nnous\r\nnouveaux\r\nou\r\no\r\npar\r\nparce\r\nparole\r\npas\r\npersonnes\r\npeut\r\npeu\r\npice\r\nplupart\r\npour\r\npourquoi\r\nquand\r\nque\r\nquel\r\nquelle\r\nquelles\r\nquels\r\nqui\r\nsa\r\nsans\r\nses\r\nseulement\r\nsi\r\nsien\r\nson\r\nsont\r\nsous\r\nsoyez\t\r\nsujet\r\nsur\r\nta\r\ntandis\r\ntellement\r\ntels\r\ntes\r\nton\r\ntous\r\ntout\r\ntrop\r\ntrs\r\ntu\r\nvaleur\r\nvoie\r\nvoient\r\nvont\r\nvotre\r\nvous\r\nvu\r\na\r\ntaient\r\ntat\r\ntions\r\nt\r\ntre"
  },
  {
    "path": "doc/french/how_to_use/burn_image.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Graver une image disque</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Graver une image disque</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Pour graver ou enregistrer une image disque, vous pouvez soit passer par le menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Graver l'image...</strong></dd>\r\n\t\t<dt>ou par le bouton de la barre d'outils:</dt>\r\n\t\t<dd><img src=\"../images/button_burnimage.bmp\"></dd>\r\n\t</dl>\r\n\t<p>Il vous sera demand de slectionner l'image disque, sur votre disque dur, que vous souhaitez gravez.\r\n\t</p><h2>Options</h2>\r\n\t<p>Une description dtaille des options disponible apparat dans <a href=\"burn_options.html\">cette section</a>.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/burn_options.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Options de gravure</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Options de gravure</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Cette section concerne les options de gravure\r\nqui peuvent tre appeles de plusieurs endroit dans InfraRecorder. Par\r\nexemple, lorsque vous souhaitez votre propre compilation, une image\r\ndisque ou faire une copie d'un disque.</p>\r\n\t<p>Bien que ces options soient accessibles dans diffrents contextes, l'interface se prsente toujours de la mme manire :</p>\r\n\t<p><img style=\"width: 367px; height: 420px;\" alt=\"\" src=\"../images/screenshot_burn.png\"></p>\r\n\t<h1>Paramtres gnraux</h1>\r\n\t<h2>A la vole</h2>\r\n\t<p>Lorsqu'on\r\ngrave  la vole, tout le systme de fichiers sera gnr au moment de\r\nla gravure, ce qui peut augmenter le risque d'erreur d'criture. Si\r\ncette option est invalide, une image temporaire du disque sera gnre\r\nsur le disque dur, puis enregistre sur le disque  graver. Par dfaut,\r\ncette option est invalide. Elle ne devrait tre valid que si vous\r\nmanquez d'espace sur votre disque dur.</p>\r\n\t<h2>Vrifier le disque aprs criture</h2>\r\n\t<p>En\r\nvalidant cette option, InfraRecorder effectuera une comparaison CRC\r\nentre les fichiers sources sur votre disque dur, et les fichiers cibles\r\nqui se trouvent sur le disque qui vient d'tre grav afin de s'assurer\r\nqu'aucune erreur d'criture ne s'est produite sur le disque.</p>\r\n\t<h2>Vitesse d'criture</h2>\r\n\t<p>Slectionne la vitesse de gravure sur le disque. En slectionnant l'option <em>\r\n\t   Maximum</em>, la vitesse la plus haute supporte par le disque ou la graveur sera utilise.</p>\r\n\t<h2>Mthode d'criture</h2>\r\n\t<p>Cette\r\noption slectionne la mthode d'criture utilise lors de la gravure du\r\ndisque. Seules les mthodes supportes par votre graveur seront listes.</p>\r\n\t<p><em>Session-At-Once (SAO)</em>\r\nappel aussi Disc-At-Once (DAO) , cette mthode crit toutes les\r\ndonnes (lead-in et lead-out inclus) en une seule passe. Sans autoriser\r\naucune interruption dans le flux de donnes. Aucune session ou donnes\r\nne peuvent tre ajoutes ultrieurement sur le disque. Notez que les\r\nDVD doivent obligatoirement tre gravs suivant cette mthode.</p>\r\n\t<p><em>Track-At-Once (TAO)</em>\r\ncrit chaque piste indpendemment ce qui requiert des blocs de lien\r\nentre deux pistes. Les anciens graveurs crent souvent une pause de\r\ndeux secondes entre les piste (appel pregap) alors que les graveurs\r\nles plus rcents autorisent un ajustement de la dure du pregap (voir\r\nl'option dcrite plus bas).</p>\r\n\t<p><em>TAO pregap zro</em> utilise\r\nla mthode&nbsp;Track-At-Once dcrite plus haut en essayant de dfinir\r\nune dure de pregap  zro en rduisant au maximum le nombre de blocs\r\nde lien entre&nbsp; deux pistes.</p>\r\n\t<p><em>Ecriture directe (raw96r)</em>\r\ncrit les donnes brutes en utilisant des secteurs de 2352 octets plus\r\n96 octets du sous canal P-W crant ainsi des secteur de 2448 octets. Il\r\ns'agit de la mthode la plus courante d'criture en direct car le\r\ncontrle de l'criture sur le CD est bien plus fiable.</p>\r\n\t<p><em>Ecriture directe</em><em>&nbsp;(raw16)</em> crit\r\nles donnes brutes en utilisant des secteurs de 2352 octets plus 16\r\noctets du sous canal P-Q crant ainsi des secteur de 2368 octets. Cette\r\nmthode sera utilis si un graveur ne supporte pas l'criture directe\r\n(raw96r). Cette mthode d'criture ne prendra pas en charge les CD-Text.</p>\r\n\t<p><em>Ecriture directe</em><em>&nbsp;(raw96p)</em><em></em>\r\ncrit les donnes brutes en utilisant des secteurs de 2352\r\noctets plus 96 octets du sous canal P-W crant ainsi des secteur de\r\n2448 octets. Cette mthode est  viter dans la mesure o peu de\r\ngraveurs la supportent, et beaucoup de ces graveurs ont des bogues dans\r\nleur firmware. N'utilisez pas cette mthode sir votre graveur supporte l'criture directe&nbsp;raw96r ou raw16.</p>\r\n\t<p><font color=\"#ff0000\">Important:\r\nNotez que l'criture directe a un besoin de puissance processeur bien\r\nplus important que pour les autres mthodes. Si votre processeur est\r\ntrs lent, vous pouvez rencontrer des problmes perte de mmoire tampon\r\nlors de la gravure.</font></p>\r\n\t<h2>Autres options</h2>\r\n\t<p>La validation de l'option&nbsp;<em>Simulation</em>\r\nva faire en sorte que Infrarecorder va effectuer les oprations\r\ndemands mais avec le laser du graveur teint. Cette option est\r\nrecommend si vous souhaitez vous assurer que la gravure du projet se\r\ndroulera correctement ou pas.</p>\r\n\t<p><em> Protection \"</em><em>Buffer underrun\"</em>\r\nest une focntionnalit prsente sur les graveurs les plus rcents qui\r\nautorise la poursuite de la gravure mme si la mmoire tampon du\r\ngraveur se vide compltement. Cette fonctionnalit peut avoir des noms\r\ndiffrents suivant les marques d'quipement avec par exemple: Yamaha\r\nLossless-Link, Sanyo BURN-Proof, Ricoh Just-Link, etc. Le nom le plus\r\ncommunment rencontr pour cette fonctionnalit est&nbsp;\tBURN-Proof.\r\n\t   </p>\r\n\t<p>Si l'option <em>Complte les donnes des pistes (Pad data tracks)</em>\r\nest valid, 15 secteurs nulls seront crit aprs chaque piste de\r\ndonnes ou audio. Cette option sera utilis dans le cas ou votre\r\nlecteur as des difficults  lire les derniers secteurs d'une piste.\r\nCette option est aussi utile dans le cas ou vous souhaitez utiliser le\r\ndisque avec un systme de fichier Linux ISO-9660 contenant un bogue dit\r\n\"read ahead\".</p><p>Si vous invalidez l'option <em>Finaliser le disque aprs criture</em>,\r\nla dernire session (si vous utilisez le mode SAO) ou la dernire piste\r\n(dans le cas d'un mode TAO) ne sera pas ferme. Ceci peut s'avrer\r\nutile si vous souhaitez graver un CD en plusieurs tapes.</p>\r\n\t<p><font color=\"#ff0000\">Important: La cration d'un disque non finalis ne correspond pas  la cration d'un disque multi-session.</font></p>\r\n\t<hr>\r\n\t<h1><a name=\"advanced\">Paramtres avancs</a></h1>\r\n\t<p>L'option&nbsp;<em>Autoriser l'overburning</em>\r\npermet de graver au dela de la taille officielle du mdia. Le fait est\r\nque la plupart des mdias vierges peuvent supporter plus que leur\r\ntaille officielle, car la zone alloue au \"lead-out\" est de 90 secondes\r\n(soit 6750 secteurs), et qu'un disque fonctionne avec seulement 150\r\nsecteurs affects au \"lead-out\". Les mdias peuvent ainsi tre\r\nsurchargs d'au moins 88 secondes (6600 secteurs). Le majorit des\r\ngraveur ne supporte l'overburning qu'en mode d'criture SAO ou raw.\r\nCertains graveur ne vous autorisent pas non plus de surcharger le\r\ndisque comme vous le souhaiteriez, et peuvent limiter la taille du\r\ndisque. Ce problme peut cependant tre contourn en gravant en mode\r\nraw, car dans ce cas, le graveur n'a aucune chance de connatre la\r\ntaille du disque avant le lancement de la gravure. </p><p>Lorsque l'option <span style=\"font-style: italic;\">Echanger l'ordre des octets</span> audio est valide, cela suppose que l'ordre des octets est invers (little endian). Certains\r\nmodle de graveurs de Yamaha ou Sony par exemple ainsi que les graveurs\r\nutilisant les nouvelles interfaces&nbsp;SCSI-3/MMC on besoin d'un mode\r\nd'adressage des donnes audio de type little-endian, alors que les\r\nautres ont besoin que les donnes audio soit de type big-endian\r\n(rseau) normalement utiliser par le protocole SCSI. L'ordre\r\nd'adressage des donnes audio sera automatiquement dtect. La seule\r\ncondition qui ncessite de valider cette option sera dans le cas d'un\r\nflux de donnes Intel (little-endian).</p>\r\n\t<p><em>Ignorer la taille du mdia</em>\r\npeut tre valide si vous souhaitez passez outre la taille connue du\r\nmdia. Cette option doit tre utilise avec prcaution. Cette option\r\nimplique un overburning.</p>\r\n\t<p>L'option <em>Positionner le drapeau \"SCSI IMMED\"</em>\r\nva imposer un retour immdiat d'une commande SCSI pendant que l'action\r\nse droule en arrire plan. Le bus SCSI sera ainsi disponible pour les\r\nautres priphriques qui s'y trouvent, ce qui vitera au systme de se\r\nfiger si le graveur ne rpond pas immdiatement. Ceci peut tre utile\r\nsur des vieux systmes utilisant un disque dur ATAPI et un graveur sur\r\nle mme bus, ou sur un systme SCSI qui ne supporte pas le mode\r\nconnect/dconnect. Ces systmes se figerons lors de l'effacement ou\r\nla cloture d'un disque, ou lors du remplissage de la session avec la\r\nquantit mini de donnes. Notez que tous les graveurs supportent le\r\ndrapeau IMMED.</p>\r\n\t<p><em>Yamaha Audio Master Q. R.</em> est une\r\nfonctionnalit qui permet de crer des disques audio de haute qualit\r\navec moins de problmes de lecture dans les platines CD de salon. Sa\r\nmise en oeuvre est une variante du mode d'criture SAO, c'est pourquoi\r\nvous n'aurez accs  cette option seulement si vous avez slectionn le\r\nmode d'criture session-at-once. Cette option ne fonctionne pas \r\ntoutes les vitesses de gravure, et n'autorise la mme quantit de\r\ndonne qu'en mode standard  cause du fait que le sillon de gravure\r\nsera largi. Si cette option est valid, un CD de 74 minutes verra sa\r\ncapacit rduite  63 minutes et un CD de 80 minutes descendra  68\r\nminutes. Cette fonctionnalit fonctionne galement avec les disques de\r\ndonnes.</p>\r\n\t<p>L'option <em>Forcespeed mode</em> force le graveur \r\nutiliser la vitesse slectionne sans se soucier de la qualit du\r\nmdia. Normallement, le graveur est sens connatre la vitesse de\r\ngravure maxi autorise en fonction du mdia, et peut rduire la vitesse\r\npour assurer la meilleure qualit de gravure. Utilisez cette option\r\navec prcaution et en connaissance de cause, car habituellement, le\r\ngraveur sait trs bien quel mdia peut tre grav  pleine vitesse.</p>\r\n\t<p>L'option <em>Plextor VariRec write mode</em>\r\nautorise  l'utilisateur un lger ajustement de la puissance du laser.\r\nSi cette option est configur correctement, cela peut rduire le\r\njitter, ce qui donnera une meilleure qualit sonore, et diminuera les\r\nrisques d'incompatibilit avec votre lecteur de salon. VariRec ne\r\nfonctionnne que si la vtesse de gravure est dfinie x4.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/configuration.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Configuration</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Configuration</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Pour accder aux options de&nbsp;InfraRecorder, utilisez le menu:</dt>\r\n\t\t<dd><strong>Options <img src=\"../images/arrow.png\"> Configuration...</strong>\r\n\t\t    </dd>\r\n\t</dl>\r\n\t<h1>Paramtres gnraux</h1>\r\n\t<p>L'option <em>Vrifier si \"autorun\" est actif  chaque dmarrage </em>va\r\ninterdire l'autorun lorsqu'un CD est insr dans le lecteur/graveur, et\r\nque InfraRecorder est lanc. Il est recommand que l'autorun soit\r\ninactif, sans quoi, Windows peut lancer des applications qui sont sur\r\nle CD alors qu'une gravure est lanc. Ceci peut endommager le CD.</p><p>L'option <span style=\"font-style: italic;\">Afficher l'cran de bienvenue au dmarrage</span>\r\naffiche l'cran qui vous permet de slectionner le projet que vous\r\nsouhaitez crer. Si cette option est invalide, le projet Cd de donnes\r\nsera slectionn par dfaut.</p><p>Les options<span style=\"font-style: italic;\"> Associer InfraRecorder aux fichiers .irp</span>, et <span style=\"font-style: italic;\">Associer InfraRecorder avec les images disque</span>\r\nsi elles sont valides, lancerons automatiquement InfraRecorder avec\r\nces fichiers lorsque vous double-cliquerez sur ce type de fichiers dans\r\nl'explorateur Windows.</p>\r\n\t<p>Si vous voulez que InfraRecorder se rappelle du dernier rpertoire utilis dans la <span style=\"font-style: italic;\">vue explorateur</span>, vous pouvez cocher <span style=\"font-style: italic;\">Se souvenir du dernier dossier actif</span>. Sinon, vous pouvez spcifier un dossier par dfaut utilis  chaque dmarrage de InfraRecorder.</p>\r\n\t<p>L'option <em>Dossier Temporaire</em>\r\nvous permet de spcifier l'emplacement du dossier o seront stocker\r\ntout les fichiers temporaires de l'application sur votre disque dur\r\ncomme les images disque par exemple. Si votre disque dur ou votre\r\npartition sur laquelle vous stockez ces fichiers temporaires est\r\npresque pleine, cela peut tre une bonne ide d'utiliser un autre\r\ndisque dur pour ce fichier temporaire.</p>\r\n\t<h1>Paramtres avancs</h1>\r\n\t<p>Si vous souhaitez activer la fonctionnalit de journalisation (log), cochez l'option <span style=\"font-style: italic;\">Activer le log</span>.\r\nCeci peut s'avrer utile si vous souhaitez pister un bogue ou une\r\nerreur dans InfraRecorder. Il n'est cependant pas souhaitable de\r\nlaisser le log actif si vous ne souhaitez pas pister d'vnement\r\nspcial, car le log ncessite plus de mmoire et de temps CPU.</p>\r\n\t<p>L'option <em>Activer l'effet de fume</em>\r\nvalide ou invalide l'affichage d'une colonne de fume durant la\r\ngravure. L'effet de fume ncessite l'activation de l'effet Aero dans\r\nWindows Vista soit activ. Si Aero n'est pas activ, cette option\r\nn'aura aucun effet.</p>\r\n\t<p>L'option <em>Taille du tampon FIFO</em>\r\npermet de chnager la quantit de mmoire RAM utilise pour le tampon en\r\nplus de de la taille du buffer physique du graveur. Augmenter la taille\r\ndu tampon peu permettre d'avoir une gravure plus stable. En rgle\r\ngnrale, la taille du FIFO ne doit pas tre infrieure  la taille\r\nphysique du tampon du graveur, et ne doit pas tre suprieure  la\r\nmoiti de la RAM installe sur votre PC. Si vous faites souvent des\r\ngravures  la vole, vous devez paramtrer une taille importante de\r\ntampon FIFO (par exemple 128MiB) pour viter toute rupture (underrun)\r\ndes donnes lors de la gravure. </p><h1>Paramtre de langue</h1>\r\n\t<p>Une liste des langues\r\ndisponible est affiche dans la bote de slection. Pour changer la\r\nlangue, slectionnez simplement la langue que vous souhaitez, cliquez\r\nsur le bouton OK, et redmarrez InfraRecorder. Si la langue que vous\r\nsouhaitez n'est pas disponible, vrifiez sur le <a href=\"http://infrarecorder.org/\" target=\"_blank\">site InfraRecorder</a> si votre langue existe.</p>\r\n\t<h1>Extension</h1>\r\n\t<dl>\r\n\t\t<dt>L'extension shell (lorsque elle est active) ajoute une commande supplmentaire au menu contextuel de l'explorateur Windows :</dt>\r\n\t\t<dd><img src=\"../images/screenshot_shellextension.png\"></dd>\r\n\t</dl>\r\n\t<p>Cela\r\nrajoute l'option de graver une image dique, ou un projet InfraRecorder\r\njuste en faisant un clic droit sur le fichier au sein de\r\nl'explorateur.&nbsp;</p>\r\n\t<p>L'extension shell peut tre personnalise pour ajouter les commandes dans un sous-menu. Pour cela, validez l'option <em>Afficher les menus contextuels dans des sous-menus</em>.</p>\r\n\t<p>On\r\npeut aussi personnaliser l'extension shell pour qu'elle n'affiche pas\r\nles icnes dans les commandes du menu en invalidant l'option <em>Afficher les icnes dans les menus</em>.</p>\r\n\t<h2>Associer l'Extension Shell</h2>\r\n\t<p>L'extension\r\nShell n'est pas associ automatiquement avec les images disque, et les\r\nprojet InfraRecorder. Lorsqu'on valide l'option <em>Activer l'extension InfraRecorder</em>, InfraRecorder Informe l'explorateur Windows que d'autres applications peuvent faire appel  ces fonctionnalits tendues.</p>\r\n\t<p>Pour\r\npermettre  l'exlorateur Windows d'utiliser les fonctionnalits\r\ntendues fournies par l'extension shell d'InfraRecorder, l'extension\r\nshell doit tre associe avec des types de fichier susceptibles\r\nd'utiliser ces fonctionnalits.</p>\r\n\t<dl>\r\n\t\t<dt>Il existe un jeu\r\nprdfini d'extensions de fichiers disponible dans la liste. Pour\r\nassocier l'extension shell d'IInfraRecorder  un type de fichier,\r\ncochez le type de fichier disponible dans la liste. Vous pouvez\r\nrajouter n'importe quel autre type de fichier  la liste en cliquant\r\nsur le bouton&nbsp;<em>Ajouter une nouvelle extension de fichier  la liste</em> :</dt>\r\n\t\t<dd><img src=\"../images/button_add.bmp\"></dd><dt></dt>\r\n\t</dl>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/copy_audio_disc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Copie de disques audios</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Copie de disques audios</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Copier un disque audio ncessite plus\r\nd'tapes que pour une copie de disque de donnes. Vous devz d'abord\r\nsauver les pistes audios sur votre disque dur. Pour cela, ouvrez la\r\nboite de dialogue des pistes par le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Grer les pistes...</strong></dd>\r\n\t\t<dt>La\r\nfentre devrait tre similaire  l'aperu ci-dessous lorsque vous aurez\r\nslectionn votre lecteur source et insr un disque audio :</dt>\r\n\t\t<dd><img src=\"../images/screenshot_managetracks.png\"></dd>\r\n\t\t<dt>Slectionnez\r\nles piste que vous souhaitez sauvegarder (copier) en cliquant sur une\r\npiste de dpart, puis une piste de fin en maintenant la touche MAJ\r\nenfonc. Lorsque vos piste sont slectionnes, cliquez sur le bouton <em>Enregistrer les pistes slectionnes sur le disque dur </em>:\r\n\t\t</dt><dd><img src=\"../images/button_savetracks.bmp\"></dd>\r\n\t</dl>\r\n\t<p>Il\r\nvous sera demand de spcifier le rpertoire de destination pour\r\nl'enregistrement des pistes. Slectionnez le rpertoire de votre choix.\r\nLorsque cela est fait, toutes les pistes que vous avez slectionnes\r\nseront sauve  l'emplacement spcifi (sauf en cas d'erreur de lecture\r\nmajeur du CD audio).</p>\r\n\t<p>La\r\nprochaine tape consiste  crer un projet audio, et d'y ajouter les\r\npistes que vous venez de sauver sur votre disque dur. Pour plus\r\nd'informations, consultez cette&nbsp;<a href=\"working_with_projects/getting_started.html\">section</a>.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/copy_data_disc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Copie de disques de donnes</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Copie de disques de donnes</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Veuillez noter que cette page contient des\r\ninformations sur la marche  suivre pour copier une CD/DVD de donnes.\r\nSi vous souhaitez copier un CD audio (ce qui est une procdure\r\ncompltement diffrente) rfrez-vous  cette <a href=\"copy_audio_disc.html\">section</a>.</p>\r\n\t<p>Si vous souhaitez copier un disque de donnes, vous avez deux options qui sont : Voulez-vous\r\ncopier le disque vers un autre disque (par exemple d'un lecteur CD vers\r\nun graveur CD) ou vers une image disque sur votre disque dur.</p>\r\n\t<h1>Copier vers un autre disque</h1>\r\n\t<dl>\r\n\t\t<dt>Pour copier un disque directement, utilisez le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Copier le disque <img src=\"../images/arrow.png\"> d'un disque compact...</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil :</dt>\r\n\t\t<dd><img src=\"../images/button_copy.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Source</h2>\r\n\t<p>Slectionnez le lecteur contenant le CD/DVD que vous souhaitez copier.</p>\r\n\t<h2>Destination</h2>\r\n\t<p>Slectionnez\r\nle graveur qui contient le CD/DVD vierge sur lequel sera grav la\r\ncopie. Si la destination est la mme que la source, vous ne pourrez pas\r\nfaire de copie  la vole.</p>\r\n\t<h2>A la vole</h2>\r\n\t<p>L'criture <em> la vole</em>\r\nsignifie que les donnes seront lues du lecteur source et crites\r\ndirectement sur le graveur de destination sans passer par un fichier\r\ntampon sur votre disque dur (seule une petite quantit de mmoire\r\ntampon sera alloue). Si votre lecteur source choue  la lecture de\r\ncertains secteurs de votre disque source, il pourrait ne pas tre\r\ncapable d'alimenter assez rapidement le graveur de detination, ce qui\r\nprovoquerait des erreurs d'criture sur le disque de destination.\r\nCependant, la plupart des graveur rcent offre des protections de chute\r\ndu tampon  0 qui devrait protger le disque de destination si cela\r\ndevait se produire.</p>\r\n\t<p>Si l'option <em>A la vole</em> est\r\ninvalide, une image temporaire du disque sera cre sur votre disque\r\ndur. A l'issue de cette opration, l'image disque temporaire sera alors\r\ngrave sur le disque de destination. Cette opration ncessitera plus\r\nd'espace disponible sur votre disque dur, mais sera plus scurisante\r\npour l'criture des donnes.</p>\r\n\t<h2>Cloner le disque</h2>\r\n\t<p>Lorsque\r\ncette option est valide, tous les sous-canaux de donnes ainsi que la\r\ntable d'allocation complte (TOC) du disque source seront galement\r\ncopis sur le disque cible. Cette option doit tre valide si vous\r\ncopiez un disque en mode mixte, sans quoi, seule la piste de donnes\r\nsera copi. Il est recommand de copier la destination en mode raw96r.\r\nSi cette mthode n'est pas supporte par votre graveur, essayez de\r\nspcifier une mthode d'criture raw16.</p>\r\n\t<h2>Options de lecture</h2>\r\n\t<p>Les options de lecture sont dcrites dans cette <a href=\"read_options.html\">section</a>.</p>\r\n\t<h2>Autres options</h2>\r\n\t<p>Les autres options sont dcrites dans cette <a href=\"burn_options.html\">section</a>.</p>\r\n\t<hr>\r\n\t<h1>Copier vers une image disque</h1>\r\n\t<dl>\r\n\t\t<dt>Pour copier un disque dans un fichier image sur votre disque dur, utilisez le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\">&nbsp;</strong><strong>Copier le disque</strong><strong> <img src=\"../images/arrow.png\"> sur une image disque...</strong></dd>\r\n\t</dl>\r\n\t<h2>Source</h2>\r\n\t<p>Slectionnez le lecteur source qui contient le CD/DVD que vous souhaitez copier.</p>\r\n\t<h2>Fichier image</h2>\r\n\t<p>Spcifiez\r\nl'emplacement et le nom du fichier image. Notez que la taille du\r\nfichier qui sera crit sur le disque dur sera de la taille du CD/DVD \r\ncopier. Vous devez donc vous assurer qu'il y a assez de place sur votre\r\ndisque dur.</p><h2>Options de lecture</h2>\r\n\t<p>Les options de lecture sont dcrites dans cette <a href=\"read_options.html\">section</a>.</p></div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/device_configuration.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Configurer les priphriques</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Configurer les priphriques</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Si vous avez fait des modification sur\r\nvotre matriel, vous aurez probalbement  en informer InfraRecorder.\r\nPour afficher la configuration des priphriques d'InfraRecorder,\r\nutilisez le menu :</dt>\r\n\t\t<dd><strong>Options <img src=\"../images/arrow.png\"> Matriel...</strong></dd>\r\n\t</dl>\r\n\t<p>Vous\r\nverrez alors la liste des priphriques qui ont t dtects par\r\nInfraRecorder. Si vous voulez mettre  jour la liste des priphrique,\r\ncliquez sur le bouton <em>Nouvelle recherche</em>. Cela demandera  InfraRecorder d'ffectuer une nouvelle recherche complte sur les priphriques supports sur votre machine.</p></div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/disc_information.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Les informations du disque</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Les informations du disque</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Pour voir les informations dtailles d'un disque insr dans le lecteur/graveur de votre PC, utilisez le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\">&nbsp;Information sur le disque\r\n\t\t    <img src=\"../images/arrow.png\"></strong> &lt;slectionnez le priphrique contenant le disque qui vous intresse&gt;</dd>\r\n\t</dl>\r\n\t<h2>Champs d'information</h2>\r\n\t<p>Le champ <em>Type de disque</em> affiche le type de disque insr comme par exemple: CD-R, DVD+R DL.</p>\r\n\t<p>Le champ <em>Type de mdia</em> n'est valide qu'avec un DVD et affiche son \"book type\", c'est  dire, le format physique du DVD (DVD-ROM, DVD-RAM, etc...)</p>\r\n\t<p>Le champ <em>Rgion</em> affiche pour quelle rgion est encod le DVD. Les numros de rgions sont les suivants :</p>\r\n\t<ol>\r\n\t\t<li><span>Etats unis, Canada.</span></li>\r\n\t\t<li><span>Europe, ainsi que France, Grce, Turquie, Egypte, Arabie, Japon et Afrique du Sud</span>.</li>\r\n\t\t<li><span>Core, Thalande, Vietnam, Borno et Indonsie.</span></li>\r\n\t\t<li><span>Australie et Nouvelle-Zlande, Mxique, les Caraibes et l'Amerique du Sud.</span></li>\r\n\t\t<li><span>Inde, Afrique, Russie et pays d'ex URSS.</span></li>\r\n\t\t<li><span>Rpublique Populaire de Chine.</span></li>\r\n\t\t<li><span>Inutilis.</span></li>\r\n\t\t<li><span>Compagnies ariennes et bateaux de croisires.</span></li>\r\n\t\t<li><span>Etendue (cela correspond souvent  un disque dzonn).</span></li>\r\n\t</ol>\r\n\t<p>Le champ<em></em> <em>Couche</em> affiche le nombre de couche sur un DVD.</p>\r\n\t<p>Le champ <em></em> <em>Pistes</em> affiche le nombre de piste prsentes sur le disque.</p>\r\n\t<p>Le champ <em></em><em>Sessions</em>&nbsp;affiche le nombre de sessions prsentes sur le disque.</p>\r\n\t<p>Le champ <em></em><em>Statut</em> affiche des informations sur le statut du disque et de ces sessions ainsi que l'information si le disque est effaable ou pas.</p>\r\n\t<p>Le champ <em></em><em>Espace utilis</em> affiche la taille de l'espace utilis sur le disque.</p>\r\n\t<p>Le champ <em></em><em>Espace libre </em>affiche la taille de l'espace disponible sur le disque.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/erase_disc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Effacer des disques r-inscriptibles</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Effacer des disques r-inscriptibles</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Pour effacer un disque rinscriptible, vous pouvez soit utiliser le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Effacer/Formatter un disque...</strong></dd>\r\n\t\t<dt>soit par le bouton de la barre d'outils :</dt>\r\n\t\t<dd><img src=\"../images/button_erase.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Graveur</h2>\r\n\t<p>Slectionnez le graveur dans lequel se trouve le disque  effacer.</p>\r\n\t<h2>Mthode d'effacement</h2>\r\n\t<p>Slectionnez une des quatre mthode d'effacement  utiliser. La mthode <em>Effacer tout le disque </em>effacera toutes les donnes physiquement prsentes sur le disque. Cette mthode peut tre trs longue. En utilisant la mthode <em>Effacer le disque en mode rapide</em>,\r\nseule la table d'allocation (TOC), PMA et le pregap seront effacs. Les\r\ndonnes effective ne sont pas effaces du disque (mais elle ne seront\r\nplus accessible). Au lieu de cela, les donnes seront crases par les\r\ndonnes que vous crirez sur le disque  la prochaine gravure. Cette\r\nmthode est beaucoup plus rapide, car elle est effectue le plus\r\nsouvent en une dizaine de secondes. La mthode <em>Annule la fermeture de la dernire session</em>\r\nannule la fermeture de la dernire session (sur un disque multi-session\r\nfinalis) permettant ainsi de rajouter des sessions sur le disque. La\r\ndernire mthode <em>Effacer la dernire session</em> va simplement\r\neffacer la dernire session enregistr sur le disque. Le temps\r\nd'effacement de la dernire session dpendra de la taille de celle-ci.</p>\r\n\t<h2>Autres options</h2>\r\n\t<p>Si la table d'allocation (TOC) a t endommage sur le disque, InfraRecorder n'effacera pas le disque  moins que l'option&nbsp;<em>Ignorer le TOC illgal</em> soit active.</p>\r\n\t<p>Activer l'option&nbsp;<em>Simulation</em>\r\ndemandera  InfraRecorder d'effectuer l'effacement avec le laser\r\nteint. Cette opration est recommand si vous voulez savoir si\r\nl'opration se droulera correctement ou pas.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/fixate_disc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Finaliser un disque</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Finaliser un disque</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Un disque finalis est un disque qu'on\r\npeut considr termin. Normallement, un disque est automatiquement\r\nfinalis aprs l'criture des donnes. Cet outil est utile si les\r\ndonnes ont t crites mais n'ont, pour quelques raisons que ce soit,\r\npas t finalises. Pour finaliser un disque, utilisez le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Finaliser le disque...</strong></dd>\r\n\t</dl>\r\n\t<h2>Graveur</h2>\r\n\t<p>Slectionnez le graveur dans lequel se trouve le disque  finaliser.</p>\r\n\t<h2>Autres options</h2>\r\n\t<p>Activer l'option&nbsp;<em>Simulation</em> demandera  InfraRecorder\r\nd'effectuer la finalisation avec le laser teint. Cette opration est\r\nrecommand si vous voulez savoir si l'opration se droulera\r\ncorrectement ou pas.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/manage_tracks.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Grer les pistes</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Grer les pistes</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>L'outil <em>Grer les pistes</em>\r\naffiche les informations de la table d'allocation (TOC) du disque\r\ninsr dans le lecteur/graveur. Il offre galement la possibilit de\r\nvrifier et sauver les pistes slectionnes. Pour ouvrir le\r\ngestionnaire de pistes, utilisez le menu :</dt>\r\n\t\t<dd><strong>Actions <img src=\"../images/arrow.png\"> Grer les pistes...</strong></dd>\r\n\t</dl>\r\n\t<p>Slectionnez\r\nles piste dsires en cliquant dessus avec la souris en maintenant la\r\ntouche MAJ ou CTRL appuy. Vous pouvez galement utiliser les flches\r\ndu clavier et la touche MAJ pour&nbsp;slectionner les pistes dans la\r\nliste.</p>\r\n\t<dl>\r\n\t\t<dt>Lorsque vous sauvgardez une piste sur votre\r\ndisque dur, vous aurez  slectionner un dossier de sauvegarde. Les\r\npistes seront alors automatiquement sauves et nommes suivant leur\r\nnumro et type (Track 1.wav, Track 2.iso).&nbsp; Pour sauver les pistes\r\nslectionnes sur votre disque dur, cliquez sur le bouton <em>Enregistrer les pistes slectionnes sur le disque dur</em> :</dt>\r\n\t\t<dd><img src=\"../images/button_savetracks.bmp\"></dd>\r\n\t\t<dt>Pour rechercher des erreurs sur les pistes slectionnes, utilisez le bouton <em>Rechercher des erreurs sur les pistes slectionnes</em>&nbsp;:\r\n\t\t</dt><dd><img src=\"../images/button_verifytracks.bmp\"></dd>\r\n\t</dl>\r\n\t\r\n\t<p>Ci-dessous le rsultat aprs la vrification d'une piste de donnes :.</p><p><img style=\"width: 517px; height: 279px;\" alt=\"\" src=\"../images/screenshot_trackscanres.png\"></p>Vous pouvez galement effacer les pistes slectionnes si votre disque est rinscriptible ne cliquant sur le bouton <span style=\"font-style: italic;\">Effacer</span><em> les pistes slectionnes du disque</em> :<em><br>&nbsp;<img style=\"width: 23px; height: 22px;\" alt=\"\" src=\"../images/button_erasetracks.bmp\"><br></em><p></p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/read_options.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Options de lecture</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?</div>\r\n\t<div id=\"topic\">Options de lecture</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Cette section couvre les options de lecture qui\r\npeuvent apparaitre  plusieurs moment au sein d'InfraRecorder. Par\r\nexemple, lorsque vous souhaitez un disque vers une image ou vers un\r\nautre disque.</p>\r\n\t<p>Bien que ces options puissent apparaitre dans diffrent contextes, elles se prsentent toujours de la mme manire :</p>\r\n\t<p><img style=\"width: 367px; height: 358px;\" alt=\"\" src=\"../images/screenshot_read.png\"></p>\r\n\t<h1>Paramtres de lecture</h1>\r\n\t<h2>Ignorer les erreurs de lecture</h2>\r\n\t<p>Valider\r\ncette option fera en sorte de ne pas abandonner le process en cours si\r\nune erreur de lecture de haut niveau est dtecte dans le flux de\r\ndonnes. Le lecteur/graveur sera galement plac dans un mode ou il\r\nignore toute erreur de lecture dans les secteur de donnes qui rsulte\r\nd'un ECC/EDC incorrect.</p>\r\n\t<h2>Lire toutes les donnes sub-channel et toute la TOC</h2>\r\n\t<p>Lorsque\r\ncette option est valide, le disque sera lu avec toute les donnes\r\nsub-channel et toute la table d'allocation (TOC). Toutes les donnes de\r\nla TOC seront places dans un fichier avec le mme nom que le fichier\r\nimage, mais avec le suffixe <strong>.toc</strong>.</p>\r\n\t<h2>Vitesse de lecture</h2>\r\n\t<p>Slectionnez la vitesse de lecture du disque. Slectionner l'option <em>\r\n\t   Maximum</em> va automatiquement slectionner la vitesse de lecture la plus haute supporte par le lecteur.</p>\r\n\t<p>Dfinir une vitesse de lecture plus basse peut augmenter la lisibilit du disque.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/working_with_projects/add_boot_image.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Ajouter une image de boot</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?, Travail en projet.</div>\r\n\t<div id=\"topic\">Ajouter une image de boot</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Plusieurs options peuvent tre dfinies lorsque vous ajoutez une image de boot  votre projet.</p>\r\n\t<h2>Chemin local</h2>\r\n\t<p>Dans ce champs, vous devez spcifi le chemin local de l'image de boot slectionne.\r\n\t   Le chemin est relatif  la racine du disque. Par exemple: /boot/\r\n\t   va crer un rpertoire appel boot  la racine du disque qui contiendra le fichier slectionn.</p>\r\n\t<h2>Type d'mulation</h2>\r\n\t<p>Cette\r\noption vous permet de choisir un type d'mulation pour un disque\r\nbootable de type&nbsp;\"El Torino\". Si l'mulation choisie est de type <span style=\"font-style: italic;\">disquette</span>, la taille du fichier image de boot doit tre exactement la mme que celle d'une disquette de&nbsp;<em></em>1200, 1440 ou 2880 Ko.\r\n\t   Si l'mulation est de type <span style=\"font-style: italic;\">disque dur</span>,\r\nl'image de boot doit imprativement commencer avec un MBR (Section de\r\nboot principale du disque) qui contient une seule partition. Si aucune\r\nmulation n'est dfinie, le systme chargera et executera l'image de\r\nboot sans aucune mulation disque.</p>\r\n\t<h2>Options avances</h2>\r\n\t<p>L'option <span style=\"font-style: italic;\">Faire une image non bootable</span>\r\nvous permet d'empcher de booter sur le CD/DVD. Le systme emulera un\r\ndisque  partir l'image de boot sur le CD/DVD, mais bootera sur son\r\ndisque de boot standard.</p>\r\n\t<p>Enabling the <em>Write boot-info-table to the image</em> option will cause\r\n\t   the boot image to be patched at offset 8 with a 54-byte table containing\r\n\t   information about the disc layout. If this option is enabled the local\r\n\t   boot image that you have specified will be patched, so make sure that you\r\n\t   have a backup of this file if it can't be easily regenerated.</p>\r\n\t<p>Le champ <em>Segment </em><em>boot load </em>vous\r\npermet de dfinir une adresse de dmarrage (en hexadcimale) dans le\r\ncas o aucune mulation pour les disques bootable \"El Torito\" discs.</p>\r\n\t<p>Le champ&nbsp; <em>Taille du boot load</em>\r\nvous permet de dfinir le nombre de secteurs virtuels (512 octets) \r\ncharger dans le cas o aucune mulation n'est dfinie. Il est\r\nrecommand de charger la totalit du fichier de boot. Certains BIOS sur\r\nles cartes mre peuvent avoir des problmes si la taille du boot load\r\nn'est pas un multiple de 4.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/working_with_projects/getting_started.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head>\r\n<meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\"><title>Premier projet</title>\r\n\r\n<link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?, Travail en projet.</div>\r\n\t<div id=\"topic\">Premier projet</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Cette section va vous aider  dmarrer avec votre premier projet CD/DVD de donne personnalises.\r\n\t   InfraRecorder supporte actuellement quatre types de projets.</p>\r\n\t<p>Les projets&nbsp;<em>CD/DVD de donnes</em>\r\nsont utiliss pour crer contenant des fichiers et des\r\nrpertoires&nbsp;(en utilisant le systme de fichiers ISO9660) qui peut\r\ntre exploit par presque tout ordinateur. Les disques de donnes ne\r\npeuvent contenir autant de donnes que les disques audios par\r\nsecteurs&nbsp;car le systme de fichier stocke galement des donnes de\r\ncontrle\r\net de corrections d'erreur supplmentaires. De ce fait, les disques de\r\ndonnes peuvent tre gravs  une vitesse plus leves sans perte de\r\ndonnes ou de qualit. Les disques de donnes peuvent tre gravs en\r\nplusieurs fois, autorisant ainsi l'ajout de donnes sur un CD/DVD dj\r\ngrav. Rfrez-vous  <a href=\"multisession_disc.html\">cette section</a>\r\n\t   pour en savoir plus sur ce sujet.</p>\r\n\t<p>Les projets&nbsp;<em>CD </em><em>Audio</em>\r\nsont utiliss pour crer des disque audios qui peuvent tre lu par\r\nn'importe quelle platine CD de salon (ou d'ordinateur). Les CD audios\r\ndoivent normalement tre grav  une vitesse plus lente que les CD de\r\ndonnes car ils ne contiennent pas d'informations de contrle ou de correction d'erreurs.</p>\r\n\t<p>Les projets&nbsp;<em>CD </em><em></em><em>en mode mixte</em>\r\nsont utilis pour crer des CD qui contiennent des donnes sur leur\r\npremire piste avec les mmes fonctionnalits qu'un CD de donnes,\r\nsuivi &nbsp;par des piste audios.Un CD mixte sera lu par n'importe\r\nquelle platine de salon, mais la premire piste (celle des donnes) ne\r\nsera que du bruit <em></em>.\r\n\t   Les pistes audios seront joues normalement.</p><p>Les projets&nbsp;<em>DVD vido</em>\r\nsont utiliss pour crer des DVD qui pourront tre lu sur une platine\r\nDVD de salon. Des restrictions d'ordre matrielles peuvent cependant\r\nempcher la platine de lire un DVD grav suivant le type de DVD grav\r\n(+R, +RW, -R, -RW). Renseignez vous sur votre platine de salon avant de\r\ngraver un DVD vido.</p>\r\n\t<dl>\r\n\t\t<dt>Pour crer un nouveau projet, utilisez le menu:</dt>\r\n\t\t<dd><strong>Fichier <img src=\"../../images/arrow.png\"> Nouveau Projet\r\n\t\t    <img src=\"../../images/arrow.png\"></strong> <span style=\"font-weight: bold;\">&lt;slectionnez le type de projet que vous souhaitez crer&gt;</span></dd>\r\n\t\t<dt>Pour ouvrir un projet existant, utilisez le menu:</dt>\r\n\t\t<dd><strong>File <img src=\"../../images/arrow.png\"> Ouvrir un project...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>ou le bouton de la barre d'outils:</dt>\r\n\t\t<dd><img src=\"../../images/button_open.bmp\"></dd>\r\n\t</dl>\r\n\t<p>Un\r\nprojet InfraRecorder peut tre directement grav sur un CD/DVD\r\nphysique, ou tre enregist dans un fichier image disque. Une image\r\ndisque est un fichier contenant toutes les donnes ajoutes au projet\r\n(sauf les pistes audios dans le cas d'un <span style=\"font-style: italic;\">projet audio</span> ou <span style=\"font-style: italic;\">projet mode mixte</span>). Une image disque peut tre graves sur un CD/DVD plus tard. Voir <a href=\"../burn_image.html\">cette section</a> pour plus d'information.</p>\r\n\t<dl>\r\n\t\t<dt>Pour graver votre projet sur un CD/DVD, vous pouvez utiliser le menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Graver la compilation\r\n\t\t    <img src=\"../../images/arrow.png\"> D'un disque compact...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>ou le bouton de la barre d'outils:</dt>\r\n\t\t<dd><img src=\"../../images/button_recordcd.bmp\"></dd>\r\n\t</dl>\r\n\t<p>Une description dtaille des options disponible apparat dans <a href=\"../burn_options.html\">cette section</a>.</p>\r\n\t<h1>Environment</h1>\r\n\t<h2>General</h2>\r\n\t<dl>\r\n\t\t<dt>La barre d'outil de la <span style=\"font-style: italic;\">Vue Explorateur</span> permet de naviguer dans la vue, et d'ajouter au projet les fichiers ou dossier slectionns dans la liste.</dt>\r\n\t\t<dd><img style=\"width: 311px; height: 26px;\" alt=\"\" src=\"../../images/toolbar_explorerview.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>La barre d'outil de la vue&nbsp; <em>Organisation du disque</em> est utilise pour grer le projet et naviguer dans le projet.</dt>\r\n\t\t<dd><img style=\"width: 320px; height: 26px;\" alt=\"\" src=\"../../images/toolbar_disclayout.png\"></dd>\r\n\t</dl>\r\n\t<h2>Gestion des fichiers</h2>\r\n\t<dl>\r\n\t\t<dt>Le menu <em>Edition</em> est utilis pour la gestion des fichiers du projet.\r\n\t\t</dt><dd><img style=\"width: 248px; height: 197px;\" alt=\"\" src=\"../../images/menu_edit.png\"></dd>\r\n\t\t<dt>Les\r\noptions disponibles dans le menu d'dition (ci-dessus) peuvent tre\r\nappel  partir de la vue de l'explorateur par appel d'un menu\r\ncontextuel  l'aide d'un clic droit dans la vue. Par exemple, si vous faites un clic droit sur un dossier, ce menu apparatra: </dt><dd><img style=\"width: 170px; height: 101px;\" alt=\"\" src=\"../../images/menu_projectlistview.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>Si\r\nvous ajoutez  votre projet plus de donnes que le mdia slectionn ne\r\npeut en contenir, l'indicateur d'espace en bas de la vue passera au\r\nrouge: </dt><dd><img src=\"../../images/spacemeter_full.png\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>L'indicateur\r\nd'espace passera  l'orange si la somme des donnes du projet excde la\r\ntaille officielle du mdia, mais pourront probablement tenir si\r\nl'option <a href=\"../burn_options.html#advanced\">Autoriser l'overburning</a>\r\n\t\t    est active:\r\n\t\t</dt><dd><img src=\"../../images/spacemeter_warn.png\"></dd>\r\n\t</dl>\r\n\t<p>Vous\r\npouvez changer la taille de l'indicateur afin de correspondre au disque\r\nvierge sur lequel vous allez graver votre projet. Pour cela, faites un\r\nclic droit sur l'indicateur, et slectionnez le type de mdia appropri.</p>\r\n\t<hr>\r\n\t<h1>Gestion de fichiers</h1>\r\n\t<h2>Ajout de fichiers</h2>\r\n\t<p>Il y a diffrents moyens d'ajouter des fichiers  votre projet. Vous pouvez faire un glisser-dposer depuis la <span style=\"font-style: italic;\">vue explorateur</span> ou depuis l'explorateur Windows vers la<span style=\"font-style: italic;\"> vue organisation du disque</span>.&nbsp;\r\n\t  Vous pouvez galement naviguer dans la <span style=\"font-style: italic;\">vue explorateur</span> et slectionner les fichiers que vous souhaitez ajouter  votre projet.</p>\r\n\t<dl>\r\n\t\t<dt>Lorsque les fichiers dsirs sont slectionns, vous pouvez utiliser le menu:</dt>\r\n\t\t<dd><strong>Edition <img src=\"../../images/arrow.png\"> Ajouter\r\n\t\t    <img src=\"../../images/arrow.png\"> Slectionn</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil de la <span style=\"font-style: italic;\">vue explorateur</span>:</dt>\r\n\t\t<dd><img src=\"../../images/button_addselected.bmp\"></dd>\r\n\t</dl>\r\n\t<p>Vous pouvez galement naviguer dans la <span style=\"font-style: italic;\">vue explorateur</span> sur un dossier, et rapidement ajouter tous les dossiers et fichiers contenus dans ce dossier  votre projet.\r\n\t</p><dl>\r\n\t\t<dt>Pour ajouter tous les fichiers et dossiers dans la <span style=\"font-style: italic;\">vue explorateur</span> active, utilisez le menu:</dt>\r\n\t\t<dd><strong>Edition <img src=\"../../images/arrow.png\"> Ajouter\r\n\t\t    <img src=\"../../images/arrow.png\"> Tout</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil de la <span style=\"font-style: italic;\">vue explorateur</span>:</dt>\r\n\t\t<dd><img src=\"../../images/button_addall.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Supprimer des fichiers</h2>\r\n\t<p>Il\r\ny a plusieurs faons de supprimer des fichiers et des dossiers de votre\r\nprojet. Une faon consiste  slectionner les fichiers et dossiers dans\r\nla <span style=\"font-style: italic;\">vue organisation du disque</span> et appuyer sur le touche \"suppr\" de votre clavier. Vous pouvez galement utiliser le menu ou le bouton de la barre d'outil:</p>\r\n\t<dl>\r\n\t\t<dt>Pour supprimer les fichiers slectionns en utilisant le menu:</dt>\r\n\t\t<dd><strong>Edition <img src=\"../../images/arrow.png\"> Supprimer</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil de la <span style=\"font-style: italic;\">vue organisation du disque</span>:\r\n\t\t    </dt>\r\n\t\t<dd><img src=\"../../images/button_remove.bmp\"></dd>\r\n\t</dl>\r\n\t<h2>Autres oprations</h2>\r\n\t<dl>\r\n\t\t<dt>Pour renommer un fichier ou un dossier slectionn, utilisez le menu:</dt>\r\n\t\t<dd><strong>Edition <img src=\"../../images/arrow.png\"> Renommer</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil de la <span style=\"font-style: italic;\">vue organisation du disque</span>:</dt>\r\n\t\t<dd><img src=\"../../images/button_rename.bmp\"></dd>\r\n\t</dl>\r\n\t<dl>\r\n\t\t<dt>Pour ajouter un dossier vide  votre projet, utilisez le menu:</dt>\r\n\t\t<dd><strong>Edition <img src=\"../../images/arrow.png\"> Nouveau Dossier</strong></dd>\r\n\t\t<dt>ou le bouton de la barre d'outil de la <span style=\"font-style: italic;\">vue organisation du disque</span>:</dt>\r\n\t\t<dd><img src=\"../../images/button_newfolder.bmp\"></dd>\r\n\t</dl>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/working_with_projects/multisession_disc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Disques multi-sessions</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?, Travail en projet.</div>\r\n\t<div id=\"topic\">Disques multi-sessions</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Un disque multi-session est un disque contenant\r\nde multiple gravures. Un disque multi-session peut tre graver en\r\nplusieurs tapes en ne gravant qu'une session  la fois.</p>\r\n\t<h2>Cration d'un nouveau disque multi-session</h2>\r\n\t<dl>\r\n\t\t<dt>La cration d'un disque multi-session est simple. Tout d'abord, crez un nouveau projet de donnes:</dt>\r\n\t\t<dd><strong>Fichier <img src=\"../../images/arrow.png\"> Nouveau projet\r\n\t\t    <img src=\"../../images/arrow.png\"> CD(ou DVD) de donnes</strong></dd>\r\n\t\t<dt>Ouvrez les proprits du projet:</dt>\r\n\t\t<dd><strong>Fichier <img src=\"../../images/arrow.png\"> Proprits du projet...\r\n\t\t    </strong></dd>\r\n\t\t<dt>Selectionnez l'onglet ISO, et changez le&nbsp;<em>Format</em> en:</dt>\r\n\t\t<dd><strong>Mode 2 XA (multi-session)</strong></dd>\r\n\t</dl>\r\n\t<p>Vous pouvez  prsent ajouter des fichiers et des dossiers  votre projet normalement. Reportez-vous  <a href=\"getting_started.html\">cette section</a> pour plus d'informations sur la faon de travailler en projet.</p>\r\n\t<h2>Continuer un disque multi-session</h2>\r\n\t<dl>\r\n\t\t<dt>Pour\r\najouter des donnes  un disque multi-session dj grav, vous devez\r\nd'abord importer les sessions existantes sur le disque. Pour cela,\r\nutilisez le menu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Importer une session...\r\n\t\t    </strong></dd>\r\n\t</dl>\r\n\t<p>Une\r\nfentre vous permettant de slectionner le priphrique et de voir\r\nl'espace allou et disponible sur le disque va s'ouvrir. Si le bouton\r\nOK est gris, cela signifie que les sessions du disque prsent dans le\r\npriphrique ne peuvent tre importes.</p>\r\n\t<p>Lorsque vous avez\r\nselectionn le priphrique contenant un disque multi-session \r\nimporter, cliquez sur le bouton OK, et toutes les donnes sur le disque\r\nvont tre ajoutes  votre projet. Les donnes importes ne peuvent\r\ntre manipules ou retires du disque. Tous les fichiers et dossiers\r\nimports apparaissent avec un texte gris.</p>\r\n\t<dl>\r\n\t\t<dt>Ds\r\nque votre travail sur la nouvelle session est termin et que vous\r\nsouhaitez ajouter ces donnes au disque, vous pouvez soit utiliser le\r\nmenu:</dt>\r\n\t\t<dd><strong>Actions <img src=\"../../images/arrow.png\"> Graver la compilation\r\n\t\t    <img src=\"../../images/arrow.png\"> d'un disque compact...</strong>\r\n\t\t    </dd>\r\n\t\t<dt>soit le bouton de la barre d'outils:</dt>\r\n\t\t<dd><img src=\"../../images/button_recordcd.bmp\"></dd></dl><h2>Ce qu'il faut savoir de plus sur les disques multi-sessions</h2><p>En\r\nplus des donnes que vous allez graver, chaque session ncessite 13Mo\r\nsupplmentaire pour ces informations. Cela implique que la capacit\r\nd'un disque va dpendre du nombre de session qui y sont stockes.</p><p>Certains\r\nlecteurs de CD/DVD peuvent ne pas reconnaitre les sessions qui se\r\ntrouvent aprs la premire session d'un disque. Si cela se produit, on\r\npeut retrouver ces informations en <a href=\"../fixate_disc.html\">finalisant</a> un disque. Mais on perd dans ce cas la possibilit d'ajouter de nouvelles sessions au disque.</p><dl><dt></dt><br>\r\n\t</dl>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/how_to_use/working_with_projects/project_settings.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Paramtres projet</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">Comment faire ?, Travail en projet.</div>\r\n\t<div id=\"topic\">Paramtres projet</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt>Cette section traite des paramtres du projet accessible par le menu:\r\n\t\t    </dt>\r\n\t\t<dd><strong>Fichier <img src=\"../../images/arrow.png\"> Proprits du projet...\r\n\t\t    </strong></dd>\r\n\t</dl>\r\n\t<h1>Paramtres gnraux</h1>\r\n\t<p>Le\r\nseul paramtre gnral susceptible d'tre modifi est l'tiquette du\r\ndisque. L'tiquette soumise par dfaut est base sur la date et l'heure\r\nde cration du projet. Notez que le nom de l'tiquette est soumis au\r\nmme restriction que celui des fichiers du projet (voir la section <span style=\"font-style: italic;\">Paramtres ISO</span> ci-dessous).\r\n\t   </p>\r\n\t<h1>Paramtres ISO</h1>\r\n\t<h2>Niveau</h2>\r\n\t<p>Cette\r\noption dfinit le niveau de conformit  la norme ISO qui dfinit la\r\nrestriction sur le nom des fichier. Il y a trois niveau de restriction\r\ngrs par InfraRecorder:</p>\r\n\t<ol>\r\n\t\t<li><span>Le niveau 1 utilise\r\ndes noms de fichier en format 8.3 (huit caractres avec trois\r\ncaractres pour l'extension), en majuscule, chiffres et caractre\r\nsoulign(underscore). Le nombre maximum de dossiers dans un chemin est\r\nde huit.</span></li>\r\n\t\t<li><span>Le niveau 2 autorise des noms de fichiers jusqu' 31 caractres.</span>\r\n\t\t    </li>\r\n\t\t<li><span>Le niveau 3 autorise la fragmentation des fichiers (principalement pour l'criture par paquets, ou une gravure incrmentale).</span></li>\r\n\t\t<li><span>Le\r\nniveau 4 n'existe pas vraiment, mais lorsqu'il est slectionn, la\r\nnorme&nbsp;ISO-9660:1999 (qui est la norme ISO-9660 version 2) est\r\nutilise. Cette norme autorise des noms de fichier jusqu' 207\r\ncaractres, et la profondeur des chemins peut tre suprieure  huit.</span></li>\r\n\t</ol><h2>Format</h2>\r\n\t<p>Cette option spcifie le format utilis lorsqu'on grave un projet de disque de donnes. Le<em> Mode 1</em> &nbsp;is normally used when creating\r\n\t   regular non multi-session discs while <em>Mode 2</em> should be used when\r\n\t   creating multi-session discs. <em>Mode 1</em> allows 2048 bytes of data per\r\n\t   sector, <em>Mode 2</em> allows 2336 bytes of data per sector (A CD-ROM\r\n\t   sector is 2352 bytes large).</p>\r\n\t<h2>Autres Options</h2>\r\n\t<p>L'option <em>Utiliser les extensions de nom de fichier Joliet</em>\r\najoute des enregistrements de dossier Joliet dans le disque en plus du\r\nstandard de nom de fichier ISO9660. L'extension Joliet est communment\r\nutilise sur les sytmes Windows, et permet des nom de fichier en\r\nformat unicode avec une longueur maximum de 64 caractres.</p>\r\n\t<p>Si cependant, vous souhaitez utiliser des nom de fichiers plus longs, validez l'option&nbsp;<em>Autoriser plus de&nbsp;64 caractres pour les noms de fichier Joliet</em>.\r\nMme si cela n'est pas pleinement compatible avec les spcifications\r\nJoliet, cela fonctionne. Le nombre maximum de caractres est alors\r\ntendu  103 caractres.</p>L'option&nbsp;<em>Omettre les numros de version des fichiers ISO9660</em> est explicite.\r\n\t<p>Validez l'option <em>Utilser les extensions Rock Ridge</em>\r\nafin de gnrer des enrgistrement SUSP et RR utilisant le protocole\r\nRock Ridge qui dcrit en dtail les fichiers du systme de fichiers\r\nISO9660.</p><h1>Champs</h1>\r\n\t<p>Cette section contient des champs qui\r\npermettent de saisir les informations sur les personnes qui ont cres\r\nle projet du CD/DVD. Les champs <em>Editeur,&nbsp;</em><em>Preparateur</em>, <em>Systme</em> et <em>Ensemble de Volumes</em>\r\npeuvent diter directement, les autres champs contiennent souvent des\r\nnom de fichiers, ce qui limite leur longueur  36 caractres.</p>\r\n\t<h1>Audio</h1>\r\n\t<p>Cette\r\nsection permet de crer des information CD-Text. Le CD-Text est un\r\nformat qui peut tre support par certain lecteur CD audio, et qui\r\npermet d'afficher le nom de l'artiste et des chansons lorsque le disque\r\nest en lecture. Ces option ne sont valable que dans les projets en mode\r\naudio ou en mode mixte.</p>\r\n\t<h1>Boot</h1>\r\n\t<dl>\r\n\t\t<dt>Cette section\r\nn'est disponible que dans les projets de donnes, et vous permet de\r\nspcifier jusqu' 63 images de boot qui pourront tre utilises pour\r\ncrer un CD/DVD bootable \"El Torito\". Pour ajouter une image de boot au\r\nprojet, cliquez sur le bouton&nbsp;<em>Ajouter une nouvelle image de boot au projet</em> :</dt>\r\n\t\t<dd><img src=\"../../images/button_add.bmp\"></dd><dt>Rfrez-vous  la section <a href=\"add_boot_image.html\">Ajouter une image de boot</a> pour plus d'information.</dt>\r\n\t</dl></div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/acknowledgments.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Accords</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Accords</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>InfraRecorder utilise des icnes et des  des travaux&nbsp;drivs issus du\r\n\t   <a href=\"http://tango.freedesktop.org\">Tango Icon Project</a>. Les travaux drivs bass sur les icnes Tango peuvent tre tlchargs sparment&nbsp;\r\n\t   (sous&nbsp;<a href=\"http://creativecommons.org/licenses/by-sa/2.5/\">Creative Commons Attribution Share-Alike license</a>)  partir du site web officiel de InfraRecorder.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/copyright.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Copyright</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Copyright</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>InfraRecorder copyright  2006-2009 Christian Kindahl.</p>\r\n\t<h2>InfraRecorder fonctionne en&nbsp;co-operation avec les logiciels suivant:</h2>\r\n\t<ul>\r\n\t\t<li>cdrecord  1995-2006 Jrg Schilling.</li>\r\n\t\t<li>readcd  1987, 1995-2006 Jrg Schilling.</li>\r\n\t\t<li>cdda2wav par <a href=\"http://www.mode.net\">Project MODE</a>,\r\n\t\t    <a href=\"http://www.iis.fhg.de\">Fraunhofer Institut fr integrierte Schaltungen</a>.</li>\r\n\t</ul>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/faq.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Foire aux Questions</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Foire aux Questions</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Pour une liste de questions plus  jour, visitez le site\r\n\t   <a href=\"http://infrarecorder.org\">http://infrarecorder.org</a>.</p>\r\n\t<p><strong>InfraRecorder ne reconnait pas mon graveur. Comment puis-je rsoudre le problme ?</strong><br>Il\r\ns'agit bien souvent d'un problme de permission. Par dfaut,\r\nInfraRecorder utilise une interface appele SPTI pour accder aux\r\npripharique de gravure. Avec Windows 200, XP et 2003, une permission\r\nadministrateur est requise pour accder aux priphriques SPTI.</p>\r\n\t<p>Si\r\nvous souhaitez autoriser aux comptes restreints l'accs au\r\npriphriques SPTI, vous devez procder comme suit en tant\r\nadministrateur :</p>\r\n\t<ol>\r\n\t    <li><span>A partir du menu \"Dmarrer\" appelez la commande \"Executer\".</span></li>\r\n\t    <li><span>Tapez la commande&nbsp;\"secpol.msc\" (sans les guillemets) et cliquez sur le bouton OK.</span></li>\r\n\t    <li><span>Naviguez dans \"Stratgies locale\" puis \"Options de scurit\".</span></li>\r\n\t    <li><span>Changez\r\nla stratgie \"Priphrique : ne permettre l'accs au CD-ROM qu'aux\r\nutilisateurs connects localement\" de \"Dsactiv\" en \"Activ\".</span></li>\r\n\t</ol>\r\n\t<p>Notez\r\nque certaines versions de Windows (comme Windows XP par exemple) n'ont\r\npas de gestionnaire de stratgie \"secpol.msc\". Dans ce cas, vous devrez\r\nprocder comme suit en tant qu'administrateur :</p>\r\n\t<ol>\r\n\t    <li><span>A partir du menu \"Dmarrer\" appelez la commande \"Executer\".</span></li>\r\n\t    <li><span>Tapez la commande&nbsp;\"regedit\" (sans les guillemets) et cliquez sur le bouton OK.</span></li>\r\n\t    <li><span>Naviguez au sein de l'arborescence \"HKEY_LOCAL_MACHINE\", \"SOFTWARE\", \"Microsoft\",\r\n\t              \"Windows NT\", \"CurrentVersion\" et \"Winlogon\"&nbsp;</span></li>\r\n\t    <li><span>Double\r\ncliquez sur la valeur de type REG_SZ appele&nbsp;\"allocatecdroms\",\r\npuis rentrez la valeur \"1\" (sans les guillemets). with the value \"1\"\r\n(without the quotes). &nbsp;Si la valeur n'existe pas, vous pouvez la\r\ncrer en cliquant droit, et en suivant le menu \"Nouveau&gt;Valeur\r\nchane\" avec le nom&nbsp;</span><span>\"allocatecdroms\", et la valeur \"1\".</span></li>\r\n\t</ol>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/feature_overview.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Aperu des fonctionnalits</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Aperu des fonctionnalits</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Cette page liste les fonctions essentielles de InfraRecorder.</p>\r\n\t<h1>Fonctions principales</h1>\r\n\t<ul>\r\n\t\t<li>Cre\r\ndes projets de donnes personnelles, musique, et&nbsp;mixte puis les\r\nstocker sur un mdia physique ou dans un fichier image.</li>\r\n\t\t<li>Cre et enregistrer des images de disques.</li>\r\n\t\t<li>Cre des copies directes de disques,  la vole, ou en utilisant une image disque temporaire.</li>\r\n\t\t<li>Efface des disques r-inscriptibles par le biais de quatre diffrentes mthodes.</li>\r\n\t\t<li>Importe des donnes de sessions issues d'un disque multi-session et lui rajouter d'autre sessions.</li>\r\n\t\t<li>Clture les disques (criture d'information en pilogue pour empcher toute rajout de donnes au disque).</li>\r\n\t\t<li>Recherche des priphriques sur bus SCSI/IDE et collecte des informations dtailles sur leur capacits.</li>\r\n\t\t<li>Affiche des informations disque dtailles.</li>\r\n\t\t<li>Lit et sauvegarde des donnes et pistes audios dans des fichiers&nbsp;(wav. et .iso)</li>\r\n\t\t<li>Balaye les pistes slectionnes  la recherche d'erreur.</li>\r\n\t</ul>\r\n\t<h1>Environment</h1>\r\n\t<ul>\r\n\t\t<li>Interface moderne et paramtrable du type \"explorateur Windows\".</li>\r\n\t\t<li>Glisser/dposer de fichiers d'une vue de l'explorateur Windows vers une vue projet.</li>\r\n\t\t<li>Vues de projets diffrentes suivant le type de projet pour permettre  l'utilisateur de travailler plus facilement.</li>\r\n\t\t<li>??? Features a separate express application designed to guide the user to\r\n\t\t    the most essential tools as quick and easy as possible.</li>\r\n\t\t<li>Une interface multilingue pour l'application principale, et l'extension du shell.</li>\r\n\t</ul>\r\n\t<h1>Integration dans l'explorateur</h1>\r\n\t<p>S'intgre  l'explorateur et ajoute de nouvelles options au menu contextuel.</p>\r\n\t<ul>\r\n\t\t<li>Grave les projets et images disque enregistrs.</li>\r\n\t\t<li>Ouvre et dite un projet enregistr.</li>\r\n\t\t<li>Pleinement paramtrable, les commandes peuvent s'afficher dans un sous-menu avec ou sans icnes.</li>\r\n\t\t<li>L'extension shell peut tre associes avec n'importe quelle type d'extension dfinie par l'utilisateur.</li>\r\n\t</ul>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/installation.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Installation</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Installation</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Le logiciel d'installation (installeur)\r\nde&nbsp;InfraRecorder support diffrentes options pour des\r\ninstallations spcifiques. Les paramtres suivants peuvent tre passs\r\n l'installeur:</p>\r\n\t<p><strong>/S</strong><br>Execute l'installeur\r\n(ou dsinstalleur) en mode silencieux. Toutes les choix utilisateurs se\r\nferont par dfaut  moins de dfinir une option supplmentaire.&nbsp;</p>\r\n\t<p><strong>/LANGUAGE=&lt;langue&gt;</strong><br>Dfini la langue qui doit tre utilise par InfraRecorder. Par exemple:\r\n\t   \"irsetup.exe /S /LANGUAGE=swedish\" installera InfraRecorder en mode silencieux avec la langue Sudoise.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/introduction.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\"><title>Introduction</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\"><script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Introduction</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<h2>Bienvenue</h2>\r\n\t<p>Merci d'avoir install InfraRecorder! &nbsp;InfraRecorder est une solution de gravure CD/DVD gratuite pour Windows.</p>\r\n\t<dl>\r\n\t\t<dt></dt><h2>Navigation rapide</h2>\r\n\t\t<dd><a href=\"feature_overview.html\">Aperu des fonctionnalits</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"license_agreement_fr.html\">Accord de licence en&nbsp;Franais</a></dd>\r\n\t\t<dt></dt><dd><a href=\"license_agreement.html\">Accord de licence en Anglais (officielle)</a></dd><dt></dt><dd><a href=\"system_requirements.html\">Configuration requise</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"quick_start.html\">Dmarrage rapide</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"copyright.html\">Copyright</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"acknowledgments.html\">Accords</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"whats_new.html\">Quoi de neuf</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"installation.html\">Installation</a></dd>\r\n\t</dl><br><br><div style=\"text-align: center;\" id=\"footer\">Fichier d'aide InfraRecorder Version 0.50.0.0 - traduction: Olivier HIGELIN\r\n</div></div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/license_agreement.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"en\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>License Agreement</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">License Agreement</div>\r\n</div>\r\n<div id=\"content\">\r\n<h3 style=\"text-align: center;\">GNU GENERAL PUBLIC LICENSE</h3>\r\n<p style=\"text-align: center;\">Version 3, 29 June 2007</p>\r\n\r\n<p>Copyright  2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</p><p>\r\n\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.</p>\r\n\r\n<h3><a name=\"preamble\"></a>Preamble</h3>\r\n\r\n<p>The GNU General Public License is a free, copyleft license for\r\nsoftware and other kinds of works.</p>\r\n\r\n<p>The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nthe GNU General Public License is intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.  We, the Free Software Foundation, use the\r\nGNU General Public License for most of our software; it applies also to\r\nany other work released this way by its authors.  You can apply it to\r\nyour programs, too.</p>\r\n\r\n<p>When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.</p>\r\n\r\n<p>To protect your rights, we need to prevent others from denying you\r\nthese rights or asking you to surrender the rights.  Therefore, you have\r\ncertain responsibilities if you distribute copies of the software, or if\r\nyou modify it: responsibilities to respect the freedom of others.</p>\r\n\r\n<p>For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must pass on to the recipients the same\r\nfreedoms that you received.  You must make sure that they, too, receive\r\nor can get the source code.  And you must show them these terms so they\r\nknow their rights.</p>\r\n\r\n<p>Developers that use the GNU GPL protect your rights with two steps:\r\n(1) assert copyright on the software, and (2) offer you this License\r\ngiving you legal permission to copy, distribute and/or modify it.</p>\r\n\r\n<p>For the developers' and authors' protection, the GPL clearly explains\r\nthat there is no warranty for this free software.  For both users' and\r\nauthors' sake, the GPL requires that modified versions be marked as\r\nchanged, so that their problems will not be attributed erroneously to\r\nauthors of previous versions.</p>\r\n\r\n<p>Some devices are designed to deny users access to install or run\r\nmodified versions of the software inside them, although the manufacturer\r\ncan do so.  This is fundamentally incompatible with the aim of\r\nprotecting users' freedom to change the software.  The systematic\r\npattern of such abuse occurs in the area of products for individuals to\r\nuse, which is precisely where it is most unacceptable.  Therefore, we\r\nhave designed this version of the GPL to prohibit the practice for those\r\nproducts.  If such problems arise substantially in other domains, we\r\nstand ready to extend this provision to those domains in future versions\r\nof the GPL, as needed to protect the freedom of users.</p>\r\n\r\n<p>Finally, every program is threatened constantly by software patents.\r\nStates should not allow patents to restrict development and use of\r\nsoftware on general-purpose computers, but in those that do, we wish to\r\navoid the special danger that patents applied to a free program could\r\nmake it effectively proprietary.  To prevent this, the GPL assures that\r\npatents cannot be used to render the program non-free.</p>\r\n\r\n<p>The precise terms and conditions for copying, distribution and\r\nmodification follow.</p>\r\n\r\n<h3><a name=\"terms\"></a>TERMS AND CONDITIONS</h3>\r\n\r\n<h4><a name=\"section0\"></a>0. Definitions.</h4>\r\n\r\n<p>&#8220;This License&#8221; refers to version 3 of the GNU General Public License.</p>\r\n\r\n<p>&#8220;Copyright&#8221; also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.</p>\r\n \r\n\r\n<p>&#8220;The Program&#8221; refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as &#8220;you&#8221;.  &#8220;Licensees&#8221; and\r\n&#8220;recipients&#8221; may be individuals or organizations.</p>\r\n\r\n<p>To &#8220;modify&#8221; a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a &#8220;modified version&#8221; of the\r\nearlier work or a work &#8220;based on&#8221; the earlier work.</p>\r\n\r\n<p>A &#8220;covered work&#8221; means either the unmodified Program or a work based\r\non the Program.</p>\r\n\r\n<p>To &#8220;propagate&#8221; a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.</p>\r\n\r\n<p>To &#8220;convey&#8221; a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.</p>\r\n\r\n<p>An interactive user interface displays &#8220;Appropriate Legal Notices&#8221;\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.</p>\r\n\r\n<h4><a name=\"section1\"></a>1. Source Code.</h4>\r\n\r\n<p>The &#8220;source code&#8221; for a work means the preferred form of the work\r\nfor making modifications to it.  &#8220;Object code&#8221; means any non-source\r\nform of a work.</p>\r\n\r\n<p>A &#8220;Standard Interface&#8221; means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.</p>\r\n\r\n<p>The &#8220;System Libraries&#8221; of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n&#8220;Major Component&#8221;, in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.</p>\r\n\r\n<p>The &#8220;Corresponding Source&#8221; for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.</p>\r\n\r\n<p>The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.</p>\r\n\r\n<p>The Corresponding Source for a work in source code form is that\r\nsame work.</p>\r\n\r\n<h4><a name=\"section2\"></a>2. Basic Permissions.</h4>\r\n\r\n<p>All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.</p>\r\n\r\n<p>You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.</p>\r\n\r\n<p>Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.</p>\r\n\r\n<h4><a name=\"section3\"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>\r\n\r\n<p>No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.</p>\r\n\r\n<p>When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.</p>\r\n\r\n<h4><a name=\"section4\"></a>4. Conveying Verbatim Copies.</h4>\r\n\r\n<p>You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.</p>\r\n\r\n<p>You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.</p>\r\n\r\n<h4><a name=\"section5\"></a>5. Conveying Modified Source Versions.</h4>\r\n\r\n<p>You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:</p>\r\n\r\n<ul>\r\n<li>a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.</li>\r\n\r\n<li>b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    &#8220;keep intact all notices&#8221;.</li>\r\n\r\n<li>c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.</li>\r\n\r\n<li>d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.</li>\r\n</ul>\r\n\r\n<p>A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n&#8220;aggregate&#8221; if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.</p>\r\n\r\n<h4><a name=\"section6\"></a>6. Conveying Non-Source Forms.</h4>\r\n\r\n<p>You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:</p>\r\n\r\n<ul>\r\n<li>a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.</li>\r\n\r\n<li>b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.</li>\r\n\r\n<li>c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.</li>\r\n\r\n<li>d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.</li>\r\n\r\n<li>e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.</li>\r\n</ul>\r\n\r\n<p>A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.</p>\r\n\r\n<p>A &#8220;User Product&#8221; is either (1) a &#8220;consumer product&#8221;, which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, &#8220;normally used&#8221; refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.</p>\r\n\r\n<p>&#8220;Installation Information&#8221; for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.</p>\r\n\r\n<p>If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).</p>\r\n\r\n<p>The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.</p>\r\n\r\n<p>Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.</p>\r\n\r\n<h4><a name=\"section7\"></a>7. Additional Terms.</h4>\r\n\r\n<p>&#8220;Additional permissions&#8221; are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.</p>\r\n\r\n<p>When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.</p>\r\n\r\n<p>Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:</p>\r\n\r\n<ul>\r\n<li>a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or</li>\r\n\r\n<li>b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or</li>\r\n\r\n<li>c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or</li>\r\n\r\n<li>d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or</li>\r\n\r\n<li>e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or</li>\r\n\r\n<li>f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.</li>\r\n</ul>\r\n\r\n<p>All other non-permissive additional terms are considered &#8220;further\r\nrestrictions&#8221; within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.</p>\r\n\r\n<p>If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.</p>\r\n\r\n<p>Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.</p>\r\n\r\n<h4><a name=\"section8\"></a>8. Termination.</h4>\r\n\r\n<p>You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).</p>\r\n\r\n<p>However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.</p>\r\n\r\n<p>Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.</p>\r\n\r\n<p>Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.</p>\r\n\r\n<h4><a name=\"section9\"></a>9. Acceptance Not Required for Having Copies.</h4>\r\n\r\n<p>You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.</p>\r\n\r\n<h4><a name=\"section10\"></a>10. Automatic Licensing of Downstream Recipients.</h4>\r\n\r\n<p>Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.</p>\r\n\r\n<p>An &#8220;entity transaction&#8221; is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.</p>\r\n\r\n<p>You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.</p>\r\n\r\n<h4><a name=\"section11\"></a>11. Patents.</h4>\r\n\r\n<p>A &#8220;contributor&#8221; is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's &#8220;contributor version&#8221;.</p>\r\n\r\n<p>A contributor's &#8220;essential patent claims&#8221; are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, &#8220;control&#8221; includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.</p>\r\n\r\n<p>Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.</p>\r\n\r\n<p>In the following three paragraphs, a &#8220;patent license&#8221; is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To &#8220;grant&#8221; such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.</p>\r\n\r\n<p>If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  &#8220;Knowingly relying&#8221; means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.</p>\r\n\r\n  \r\n<p>If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.</p>\r\n\r\n<p>A patent license is &#8220;discriminatory&#8221; if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.</p>\r\n\r\n<p>Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.</p>\r\n\r\n<h4><a name=\"section12\"></a>12. No Surrender of Others' Freedom.</h4>\r\n\r\n<p>If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.</p>\r\n\r\n<h4><a name=\"section13\"></a>13. Use with the GNU Affero General Public License.</h4>\r\n\r\n<p>Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU Affero General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the special requirements of the GNU Affero General Public License,\r\nsection 13, concerning interaction through a network will apply to the\r\ncombination as such.</p>\r\n\r\n<h4><a name=\"section14\"></a>14. Revised Versions of this License.</h4>\r\n\r\n<p>The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.</p>\r\n\r\n<p>Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU General\r\nPublic License &#8220;or any later version&#8221; applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU General Public License, you may choose any version ever published\r\nby the Free Software Foundation.</p>\r\n\r\n<p>If the Program specifies that a proxy can decide which future\r\nversions of the GNU General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.</p>\r\n\r\n<p>Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.</p>\r\n\r\n<h4><a name=\"section15\"></a>15. Disclaimer of Warranty.</h4>\r\n\r\n<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &#8220;AS IS&#8221; WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>\r\n\r\n<h4><a name=\"section16\"></a>16. Limitation of Liability.</h4>\r\n\r\n<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.</p>\r\n\r\n<h4><a name=\"section17\"></a>17. Interpretation of Sections 15 and 16.</h4>\r\n\r\n<p>If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.</p>\r\n\r\n<p>END OF TERMS AND CONDITIONS</p>\r\n\r\n<h3><a name=\"howto\"></a>How to Apply These Terms to Your New Programs</h3>\r\n\r\n<p>If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.</p>\r\n\r\n<p>To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe &#8220;copyright&#8221; line and a pointer to where the full notice is found.</p>\r\n\r\n<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;<br>    Copyright (C) &lt;year&gt;  &lt;name of author&gt;<br><br>    This program is free software: you can redistribute it and/or modify<br>    it under the terms of the GNU General Public License as published by<br>    the Free Software Foundation, either version 3 of the License, or<br>    (at your option) any later version.<br><br>    This program is distributed in the hope that it will be useful,<br>    but WITHOUT ANY WARRANTY; without even the implied warranty of<br>    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>    GNU General Public License for more details.<br><br>    You should have received a copy of the GNU General Public License<br>    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.<br></pre>\r\n\r\n<p>Also add information on how to contact you by electronic and paper mail.</p>\r\n\r\n<p>If the program does terminal interaction, make it output a short\r\nnotice like this when it starts in an interactive mode:</p>\r\n\r\n<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;<br><br>    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.<br>    This is free software, and you are welcome to redistribute it<br>    under certain conditions; type `show c' for details.<br></pre>\r\n\r\n<p>The hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, your program's commands\r\nmight be different; for a GUI interface, you would use an &#8220;about box&#8221;.</p>\r\n\r\n<p>You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a &#8220;copyright disclaimer&#8221; for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU GPL, see\r\n&lt;http://www.gnu.org/licenses/&gt;.</p>\r\n\r\n<p>The GNU General Public License does not permit incorporating your program\r\ninto proprietary programs.  If your program is a subroutine library, you\r\nmay consider it more useful to permit linking proprietary applications with\r\nthe library.  If this is what you want to do, use the GNU Lesser General\r\nPublic License instead of this License.  But first, please read\r\n&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/license_agreement_fr.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Accord de licence</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Accord de licence</div>\r\n</div>\r\n<div id=\"content\">\r\n<h3 style=\"text-align: center;\">LICENCE PUBLIQUE GNRALE GNU</h3>\r\n<p style=\"text-align: center;\">Version 3, du 29 juin 2007</p>\r\n\r\n<p>Copyright  2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</p><p>Chacun\r\nest autoris  copier et distribuer des copies conformes de ce document\r\nde licence, mais toute modification en est proscrite.</p><br><span style=\"font-weight: bold;\">Traduction franaise</span> par Philippe Verdy, le 30 juin 2007.<br><br><big><span style=\"font-weight: bold;\">Avertissement important au sujet de cette traduction franaise.</span></big><p>Ceci\r\nest une traduction en franais de la licence &#8220;GNU General Public\r\nLicense&#8221; (GPL). Cette traduction est fournie ici dans l&#8217;espoir qu&#8217;elle\r\nfacilitera sa comprhension, mais elle ne&nbsp;constitue pas une\r\ntraduction officielle ou approuve d&#8217;un point de vue juridique.<br><br>La\r\nFree Software Foundation (FSF) ne publie pas cette traduction et ne l&#8217;a\r\npas approuve en tant que substitut valide au plan lgal pour la\r\nlicence authentique &#8220;GNU General Public Licence&#8221;. Cette traduction n&#8217;a\r\npas encore t passe en revue attentivement par un juriste et donc le\r\ntraducteur ne peut garantir avec certitude qu&#8217;elle reprsente avec\r\nexactitude la signification lgale des termes de la licence authentique\r\n&#8220;GNU General Public License&#8221; publie en anglais. Cette traduction\r\nn&#8217;tablit donc lgalement aucun des termes et conditions d&#8217;utilisation\r\nd&#8217;un logiciel sous licence GNU GPL &#8212; seul le texte original en anglais\r\nle fait. Si vous souhaitez tre sr que les activits que vous projetez\r\nseront autorises par la GNU General Public License, veuillez vous\r\nrfrer  sa seule version anglaise authentique.<br><br>La FSF vous\r\nrecommande fermement de ne pas utiliser cette traduction en tant que\r\ntermes officiels pour vos propres programmes ; veuillez plutt utiliser\r\nla version anglaise&nbsp;authentique telle que publie par la FSF. Si\r\nvous choisissez d&#8217;acheminer cette traduction en mme temps qu&#8217;un\r\nProgramme sous licence GNU GPL, cela ne vous dispense pas de\r\nl&#8217;obligation d&#8217;acheminer en mme temps une copie de la licence\r\nauthentique en anglais, et de conserver dans la traduction cet\r\navertissement important en franais et son quivalent en anglais\r\nci-dessous.<br></p><big style=\"font-style: italic;\"><span style=\"font-weight: bold;\">Important Warning About This French Translation.</span></big><br><span style=\"font-style: italic;\">This\r\nis a translation of the GNU General Public License (GPL) into French.\r\nThis translation is distributed in the hope that it will facilitate\r\nunderstanding, but it is not an official or legally approved\r\ntranslation.</span><br style=\"font-style: italic;\"><br style=\"font-style: italic;\"><span style=\"font-style: italic;\">The\r\nFree Software Foundation (FSF) is not the publisher of this translation\r\nand has not approved it as a legal substitute for the authentic GNU\r\nGeneral Public License. The translation has not been reviewed carefully\r\nby lawyers, and therefore the translator cannot be sure that it exactly\r\nrepresents the legal meaning of the authentic GNU General Public\r\nLicense published in English. This translation does not legally state\r\nthe terms and conditions of use of any Program licenced under GNU GPL &#8212;\r\nonly the original English text of the GNU LGPL does that. If you wish\r\nto be sure whether your planned activities are permitted by the GNU\r\nGeneral Public License, please refer to its sole authentic English\r\nversion.</span><br style=\"font-style: italic;\"><br style=\"font-style: italic;\"><span style=\"font-style: italic;\">The\r\nFSF strongly urges you not to use this translation as the official\r\ndistribution terms for your programs; instead, please use the authentic\r\nEnglish version published by the FSF. If you choose to convey this\r\ntranslation along with a Program covered by the GPL Licence, this does\r\nnot remove your obligation to convey at the same time a copy of the\r\nauthentic GNU GPL License in English, and you must keep in this\r\ntranslation this important warning in English and its equivalent in\r\nFrench above.</span><br><span class=\"Apple-style-span\" style=\"border-collapse: separate; color: rgb(0, 0, 0); font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 15px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;\"></span><h3><a name=\"preamble\"></a>Prambule</h3>La\r\nLicence Publique Gnrale GNU (&#8220;GNU General Public License&#8221;) est une\r\nlicence libre, en &#8220;copyleft&#8221;, destine aux &#339;uvres logicielles et\r\nd&#8217;autres types de travaux.<br><br>Les licences de la plupart des &#339;uvres\r\nlogicielles et autres travaux de pratique sont conues pour ter votre\r\nlibert de partager et modifier ces travaux. En contraste, la\r\nLicence&nbsp; Publique Gnrale GNU a pour but de garantir votre\r\nlibert de partager et changer toutes les versions d&#8217;un programme &#8212;\r\nafin d&#8217;assurer qu&#8217;il restera libre pour tous les utilisateurs. Nous, la\r\nFree Software Foundation, utilisons la Licence Publique Gnrale GNU\r\npour la plupart de nos logiciels ; cela s&#8217;applique aussi  tout autre\r\ntravail dit de cette faon par ses<br>auteurs. Vous pouvez, vous aussi, l&#8217;appliquer  vos propres programmes.<br><br>Quand\r\nnous parlons de logiciel libre (&#8220;free&#8221;), nous nous rfrons  la\r\nlibert (&#8220;freedom&#8221;), pas au prix. Nos Licences Publiques Gnrales sont\r\nconues pour assurer que vous ayez la libert de distribuer des copies\r\nde logiciel libre (et le facturer si vous le souhaitez), que vous\r\nreceviez le code source ou pouviez l&#8217;obtenir si vous le voulez, que\r\nvous pouviez modifier le logiciel ou en utiliser toute partie dans de\r\nnouveaux logiciels libres, et que vous sachiez que vous avez le droit\r\nde faire tout ceci.<br><br>Pour protger vos droits, nous avons besoin\r\nd&#8217;empcher que d&#8217;autres vous restreignent ces droits ou vous demande de\r\nleur abandonner ces droits. En consquence, vous avez certaines\r\nresponsabilits si vous distribuez des copies d&#8217;un tel programme ou si\r\nvous le modifiez : les responsabilits de respecter la libert des\r\nautres.<br><br>Par exemple, si vous distribuez des copies d&#8217;un tel\r\nprogramme, que ce soit gratuit ou contre un paiement, vous devez\r\naccorder aux Destinataires les mmes liberts que vous avez reues.\r\nVous devez aussi vous assurer qu&#8217;eux aussi reoivent ou peuvent\r\nrecevoir son code source. Et vous devez leur montrer les termes de\r\ncette licence afin qu&#8217;ils connaissent leurs droits.<br><br>Les\r\ndveloppeurs qui utilisent la GPL GNU protgent vos droits en deux\r\ntapes : (1) ils affirment leur droits d&#8217;auteur (&#8220;copyright&#8221;) sur le\r\nlogiciel, et (2) vous accordent cette Licence qui vous donne la\r\npermission lgale de le copier, le distribuer et/ou le modifier.<br><br>Pour\r\nla protection des dveloppeurs et auteurs, la GPL stipule clairement\r\nqu&#8217;il n&#8217;y a pas de garantie pour ce logiciel libre. Aux fins  la fois\r\ndes utilisateurs et auteurs, la GPL require que les versions modifies\r\nsoient marques comme changes, afin que leurs problmes ne soient pas\r\nattribus de faon errone aux auteurs des versions prcdentes.<br><br>Certains\r\ndispositifs sont conus pour empcher l&#8217;accs des utilisateurs \r\nl&#8217;installation ou l&#8217;excution de versions modifies du logiciel \r\nl&#8217;intrieur de ces dispositifs, alors que les fabricants le peuvent.\r\nCeci est fondamentalement incompatible avec le but de protger la\r\nlibert des utilisateurs de modifier le logiciel. L&#8217;aspect systmatique\r\nde tels abus se produit dans le secteur des produits destins aux\r\nutilisateurs individuels, ce qui est prcidment ce qui est le plus\r\ninacceptable. Aussi, nous avons conu cette version de la GPL pour\r\nprohiber cette pratique pour ces produits. Si de tels problmes\r\nsurviennent dans d&#8217;autres domaines, nous nous tenons prt  tendre\r\ncette restriction  ces domaines dans de futures versions de la GPL,\r\nautant qu&#8217;il sera ncessaire pour protger la libert des utilisateurs.<br><br>Finalement,\r\nchaque programme est constamment menac par les brevets logiciels. Les\r\ntats ne devraient pas autoriser de tels brevets  restreindre le\r\ndveloppement et l&#8217;utilisation de logiciels libres sur des ordinateurs\r\nd&#8217;usage gnral ; mais dans ceux qui le font, nous voulons spcialement\r\nviter le danger que les brevets appliqus  un programme libre puisse\r\nle rendre effectivement propritaire. Pour empcher ceci, la GPL assure\r\nque les brevets ne peuvent tre utiliss pour rendre le programme\r\nnon-libre.<br><br>Les termes prcis et conditions concernant la copie, la distribution et la modification suivent.<h3><a name=\"terms\"></a>TERMES ET CONDITIONS</h3>\r\n\r\n<h4><a name=\"section0\"></a>0. Definitions.</h4> Cette Licence  se rfre  la version 3 de la &#8220;GNU General Public License&#8221; (le texte original en anglais).<br><br>\r\nDroit d&#8217;Auteur  signifie aussi les droits du &#8220;copyright&#8221; ou voisins\r\nqui s&#8217;appliquent  d&#8217;autres types de travaux, tels que ceux sur les\r\nmasques de semi-conducteurs.<br><br> Le Programme  se rfre  tout\r\ntravail qui peut tre sujet au Droit d&#8217;Auteur (&#8220;copyright&#8221;) et dont les\r\ndroits d&#8217;utilisation sont concds en vertu de cette Licence. Chacun\r\ndes Licencis,  qui cette Licence est concde, est dsign par \r\nvous.  Les  Licencis  et les  Destinataires  peuvent tre des\r\npersonnes physiques ou morales (individus ou organisations).<br><br>\r\nModifier  un travail signifie en obtenir une copie et adapter tout ou\r\npartie du travail d&#8217;une faon ncessitant une autorisation d&#8217;un\r\ntitulaire de Droit d&#8217;Auteur, autre que celle permettant d&#8217;en produire\r\nune copie conforme. Le travail rsultant est appel une  version\r\nmodifie  du prcdent travail, ou un travail  bas sur  le\r\nprcdent travail.<br><br>Un  Travail Couvert  signifie soit le Programme non modifi soit un travail bas sur le Programme.<br><br>\r\nPropager  un travail signifie faire quoi que ce soit avec lui qui,\r\nsans permission, vous rendrait directement ou indirectement responsable\r\nd&#8217;un dlit de contrefaon suivant les lois relatives au Droit d&#8217;Auteur,\r\n l&#8217;exception de son excution sur un ordinateur ou de la modification\r\nd&#8217;une copie prive. La propagation inclue la copie, la distribution\r\n(avec ou sans modification), la mise  disposition envers le public, et\r\naussi d'autres activits dans certains pays.<br><br> Acheminer  un\r\ntravail signifie tout moyen de propagation de celui-ci qui permet \r\nd&#8217;autres parties de raliser ou recevoir des copies. La simple\r\ninteraction d&#8217;un utilisateur &nbsp;travers un rseau informatique,\r\nsans transfert effectif d&#8217;une copie, ne constitue pas un acheminement.<br><br>Une\r\ninterface utilisateur interactive affiche des  Notices Lgales\r\nAppropries  quand elle comprend un dispositif convenable, bien\r\nvisible et vident qui (1) affiche une notice approprie sur les droits\r\nd&#8217;auteur et (2) informe l&#8217;utilisateur qu&#8217;il n&#8217;y a pas de garantie pour\r\nle travail (sauf si des garanties ont t fournies hors du cadre de\r\ncette Licence), que les licencis peuvent acheminer le travail sous\r\ncette Licence, et comment voir une copie de cette Licence. Si\r\nl&#8217;interface prsente une liste de commandes utilisateur ou d&#8217;options,\r\ntel qu&#8217;un menu, un lment vident dans la liste prsente remplit ce\r\ncritre.<h4><a name=\"section1\"></a>1. Code source.</h4>Le  code source\r\n d&#8217;un travail signifie la forme prfre du travail permettant ou\r\nfacilitant les modifications de celui-ci. Le  code objet  d&#8217;un\r\ntravail signifie toute forme du travail qui n&#8217;en est pas le code source.<br><br>Une\r\n Interface Standard  signifie une interface qui est soit celle d&#8217;une\r\nnorme officielle dfinie par un organisme de normalisation reconnu ou,\r\ndans le cas des interfaces spcifies pour un langage de programmation\r\nparticulier, une interface largement utilise parmi les dveloppeurs\r\ntravaillant dans ce langage.<br><br>Les  Bibliothques Systme  d&#8217;un\r\ntravail excutable incluent tout ce qui, en dehors du travail dans son\r\nensemble, (a) est inclus dans la forme usuelle de paquetage d&#8217;un\r\nComposant Majeur mais ne fait pas partie de ce Composant Majeur et (b)\r\nsert seulement  permettre l&#8217;utilisation du travail avec ce Composant\r\nMajeur ou  implmenter une Interface Standard pour laquelle une\r\nimplmentation est disponible au public sous forme de code source ; un\r\n Composant Majeur  signifie, dans ce contexte, un composant majeur\r\nessentiel (noyau, systme de fentrage, etc.) du systme d&#8217;exploitation\r\n(le cas chant) d&#8217;un systme sur lequel le travail excutable\r\nfonctionne, ou bien un compilateur utilis pour produire le code objet\r\ndu travail, ou un interprte de code objet utilis pour excuter\r\ncelui-ci.<br><br>Le  Source Correspondant  d&#8217;un travail sous forme de\r\ncode objet signifie l&#8217;ensemble des codes sources ncessaires pour\r\ngnrer, installer et (dans le cas d&#8217;un travail excutable) excuter le\r\ncode objet et modifier le travail, y compris les scripts pour contrler\r\nces activits. Cependant, cela n&#8217;inclue pas les Bibliothques Systme\r\ndu travail, ni les outils d&#8217;usage gnral ou les programmes libres\r\ngnralement disponibles qui peuvent tre utiliss sans modification\r\npour achever ces activits mais ne sont pas partie de ce travail. Par\r\nexemple le Source Correspondant inclut les fichiers de dfinition\r\nd&#8217;interfaces associs aux fichiers sources du travail, et le code\r\nsource des bibliothques partages et des sous-routines lies<br>dynamiquement,\r\npour lesquelles le travail est spcifiquement conu pour les requrir\r\nvia, par exemple, des communications de donnes ou contrles de flux\r\ninternes entre ces sous-programmes et d&#8217;autres parties du travail.<br><br>Le\r\nSource Correspondant n&#8217;a pas besoin d&#8217;inclure tout ce que les\r\nutilisateurs peuvent regnrer automatiquement  partir d&#8217;autres\r\nparties du Source Correspondant. <br>Le Source Correspondant pour un travail sous forme de code source est ce mme travail. <h4><a name=\"section2\"></a>2.&nbsp;Permissions de base.</h4>Tous\r\nles droits accords suivant cette Licence le sont jusqu&#8217;au terme des\r\nDroits d&#8217;Auteur (&#8220;copyright&#8221;) sur le Programme, et sont irrvocables\r\npourvu que les conditions tablies soient remplies. Cette Licence\r\naffirme explicitement votre permission illimite d&#8217;excuter le\r\nProgramme non modifi. La sortie produite par l&#8217;excution d&#8217;un Travail\r\nCouvert n&#8217;est couverte par cette Licence que si cette sortie, tant\r\ndonn leur contenu, constitue un Travail Couvert. Cette Licence\r\nreconnait vos propres droits d&#8217;usage raisonnable (&#8220;fair use&#8221; en<br>lgislation\r\ndes tats-Unis d&#8217;Amrique) ou autres quivalents, tels qu&#8217;ils sont\r\npourvus par la loi applicable sur le Droit d&#8217;Auteur (&#8220;copyright&#8221;).<br><br>Vous\r\npouvez crer, excuter et propager sans condition des Travaux Couverts\r\nque vous n&#8217;acheminez pas, aussi longtemps que votre licence demeure en\r\nvigueur. Vous pouvez acheminer des Travaux Couverts  d&#8217;autres\r\npersonnes dans le seul but de leur faire raliser des modifications \r\nvotre usage exclusif, ou pour qu&#8217;ils vous fournissent des facilits\r\nvous permettant d&#8217;excuter ces travaux, pourvu que vous vous conformiez\r\naux termes de cette Licence lors de l&#8217;acheminement de tout matriel\r\ndont vous ne contrlez pas le Droit d&#8217;Auteur (&#8220;copyright&#8221;). Ceux qui,\r\nds lors, ralisent ou excutent pour vous les Travaux Couverts ne\r\ndoivent alors le faire qu&#8217;exclusivement pour votre propre compte, sous\r\nvotre direction et votre contrle, suivant des termes qui leur\r\ninterdisent de raliser, en dehors de leurs relations avec vous, toute\r\ncopie de votre matriel soumis au Droit d&#8217;Auteur.<br><br>L&#8217;acheminement\r\ndans toutes les autres circonstances n&#8217;est permis que selon les\r\nconditions tablies ci-dessous. La concession de sous-licences n&#8217;est\r\npas autoris ; l&#8217;article 10 rend cet usage non ncessaire.<h4><a name=\"section3\"></a>3. Protection des droits lgaux des utilisateurs envers les lois anti-contournement.</h4>Aucun\r\nTravail Couvert ne doit tre vu comme faisant partie d&#8217;une mesure\r\ntechnologique effective selon toute loi applicable remplissant les\r\nobligations prvues  l&#8217;article 11 du trait international sur le droit\r\nd&#8217;auteur adopt  l&#8217;OMPI le 20 dcembre 1996, ou toutes lois similaires\r\nqui prohibent ou restreignent le contournement de telles mesures.<br><br>Si\r\nvous acheminez un Travail Couvert, vous renoncez  tout pouvoir lgal\r\nd&#8217;interdire le contournement des mesures technologiques dans tous les\r\ncas o un tel contournement serait effectu en exerant les droits\r\nprvus dans cette Licence pour ce Travail Couvert, et vous dclarez\r\nrejeter toute intention de limiter l&#8217;opration ou la modification du\r\nTravail, en tant que moyens de renforcer,  l&#8217;encontre des utilisateurs\r\nde ce Travail, vos droits lgaux ou ceux de tierces parties d&#8217;interdire\r\nle contournement des mesures technologiques.<h4><a name=\"section4\"></a>4. Acheminement des copies conformes.</h4>Vous\r\npouvez acheminer des copies conformes du code source du Programme tel\r\nque vous l&#8217;avez reu, sur n&#8217;importe quel support, pourvu que vous\r\npubliiez scrupuleusement et de faon approprie sur chaque copie une\r\nnotice de Droit d&#8217;Auteur approprie ; gardez intactes toutes les\r\nnotices tablissant que cette Licence et tous les termes additionnels\r\nnon permissifs ajouts en accord avec l&#8217;article 7 s&#8217;appliquent  ce\r\ncode ; et donnez  chacun des Destinataires une copie de cette Licence\r\nen mme temps que le Programme.<br><br>Vous pouvez facturer  un prix\r\nquelconque, y compris gratuit, chacune des copies que vous acheminez,\r\net vous pouvez offrir une protection additionnelle de support ou de\r\ngarantie en change d&#8217;un paiement.<h4><a name=\"section5\"></a>5. Acheminement des versions sources modifies.</h4>\r\n\r\n<p>Vous pouvez acheminer un travail bas sur le Programme, ou bien les\r\nmodifications pour le produire  partir du Programme, sous la forme de\r\ncode source suivant les termes de l&#8217;article 4, pourvu que voussatisfassiez aussi  chacune des conditions requises suivantes : </p>\r\n\r\n<ul>\r\n<li>a) Le travail doit comporter des notices videntes tablissant que&nbsp;vous l&#8217;avez modifi et donnant la date correspondante.</li>\r\n\r\n<li>b) Le travail doit comporter des notices videntes tablissant\r\nqu&#8217;il est dit selon cette Licence et les conditions ajoutes d&#8217;aprs\r\nl&#8217;article 7. Cette obligation vient modifier l&#8217;obligation de l&#8217;article\r\n4 de  garder intactes toutes les notices. .</li>\r\n\r\n<li>c) Vous devez licencier le travail entier, comme un tout, suivant\r\ncette Licence  quiconque entre en possession d&#8217;une copie. Cette\r\nLicence s&#8217;appliquera en consquence, avec les termes additionnels\r\napplicables prvus par l&#8217;article 7,  la totalit du travail et chacune\r\nde ses parties, indpendamment de la faon dont ils sont empaquets.\r\nCette licence ne donne aucune permission de licencier le travail d&#8217;une\r\nautre faon, mais elle n&#8217;invalide pas une telle permission si vous\r\nl&#8217;avez reue sparment.&nbsp;</li>\r\n\r\n<li>d) Si le travail a des interfaces utilisateurs interactives,\r\nchacune doit afficher les Notices Lgales Appropries ; cependant si le\r\nProgramme a des interfaces qui n&#8217;affichent pas les Notices Lgales\r\nAppropries, votre travail n&#8217;a pas  les modifier pour qu&#8217;elles les\r\naffichent.&nbsp;</li>\r\n</ul>\r\n\r\n<p>Une compilation d&#8217;un Travail Couvert avec d&#8217;autres travaux spars\r\net indpendants, qui ne sont pas par leur nature des extensions du\r\nTravail Couvert, et qui ne sont pas combins avec lui de faon  former\r\nun programme plus large, dans ou sur un volume de stockage ou un\r\nsupport de distribution, est appel un  aggrgat  si la compilation\r\net son Droit d&#8217;Auteur rsultant ne sont pas utiliss pour limiter\r\nl&#8217;accs ou les droits lgaux des utilisateurs de la compilation en dea\r\nde ce que permettent les travaux individuels. L&#8217;inclusion d&#8217;un Travail\r\nCouvert dans un aggrgat ne cause pas l&#8217;application de cette Licence\r\naux autres parties de l&#8217;aggrgat.</p>\r\n\r\n<h4><a name=\"section6\"></a>6. Acheminement des formes non sources.</h4>\r\n\r\n<p>Vous pouvez acheminer sous forme de code objet un Travail Couvert\r\nsuivant les termes des articles 4 et 5, pourvu que vous acheminiez\r\ngalement suivant les termes de cette Licence le Source Correspondantlisible par une machine, d&#8217;une des faons suivantes : </p>\r\n\r\n<ul>\r\n<li>a) Acheminer le code objet sur, ou inclus dans, un produit physique\r\n(y compris un support de distribution physique), accompagn par le\r\nSource Correspondant fix sur un support physique durable\r\nhabituellement utilis pour les changes de logiciels.</li>\r\n\r\n<li>b) Acheminer le code objet sur, ou inclus dans, un produit physique\r\n(y compris un support de distribution physique), accompagn d&#8217;une offre\r\ncrite, valide pour au moins trois annes et valide pour&nbsp;aussi\r\nlongtemps que vous fournissez des pices de rechange ou un support\r\nclient pour ce modle de produit, afin de donner  quiconque possde le\r\ncode objet soit (1) une copie du Source&nbsp;Correspondant  tout\r\nlogiciel dans ce produit qui est couvert par cette Licence, sur un\r\nsupport physique durable habituellement&nbsp;utilis pour les changes\r\nde logiciels, pour un prix non suprieur au cot raisonnable de la\r\nralisation physique de l&#8217;acheminement de la source, ou soit (2) un\r\naccs permettant de copier le Source&nbsp;Correspondant depuis un serveur rseau sans frais.</li>\r\n\r\n<li>c) Acheminer des copies individuelles du code objet avec une copie\r\nde l&#8217;offre crite de fournir le Source Correspondant.\r\nCette&nbsp;alternative est permise seulement&nbsp;occasionellement et\r\nnon&nbsp;commercialement, et seulement si vous avez reu le code objet\r\navec&nbsp;une telle offre, en accord avec l&#8217;article 6 alina b.</li>\r\n\r\n<li>d) Acheminer le code objet en offrant un accs depuis un\r\nemplacement dsign (gratuit ou contre facturation) et offrir un accs\r\nquivalent au Source Correspondant de la mme faon via le\r\nmme&nbsp;emplacement et sans facturation supplmentaire. Vous n&#8217;avez\r\npas&nbsp;besoin d&#8217;obliger les Destinataires  copier le\r\nSource&nbsp;Correspondant en mme temps que le code objet. Si\r\nl&#8217;emplacement&nbsp;pour copier le code objet est un serveur rseau, le\r\nSource&nbsp;Correspondant peut tre sur un serveur diffrent (opr par\r\nvous ou par un tiers) qui supporte des facilits quivalentes\r\nde&nbsp;copie, pourvu que vous mainteniez des directions claires\r\n&nbsp;proximit du code objet indiquant o trouver le\r\nSource&nbsp;Correspondant. Indpendamment de quel serveur hberge le\r\nSource&nbsp;Correspondant, vous restez oblig de vous assurer qu&#8217;il\r\nreste&nbsp;disponible aussi longtemps que ncessaire pour satisfaire \r\nces&nbsp;obligations.</li>\r\n\r\n<li>e) Acheminer le code objet en utilisant une\r\ntransmission&nbsp;d&#8217;gal--gal, pourvu que vous informiez les autres\r\nparticipants&nbsp;sur o le code objet et le Source Correspondant du\r\ntravail sont&nbsp;offerts sans frais au public gnral suivant\r\nl&#8217;article 6 alina d.&nbsp;Une portion sparable du code objet, dont le\r\ncode source est exclu&nbsp;du Source Correspondant en tant que\r\nBibliothque Systme, n&#8217;a pas&nbsp;besoin d&#8217;tre inclu dans\r\nl&#8217;acheminement du travail sous forme de&nbsp;code objet.</li>\r\n</ul>\r\n\r\n<p>A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.</p>\r\n\r\n<p>Un  Produit Utilisateur  est soit (1) un  Produit de\r\nConsommation,  ce qui signifie toute proprit personnelle tangible\r\nnormalement utilise  des fins personnelles, familiales ou relatives\r\nau foyer, soit (2) toute chose conue ou vendue pour l&#8217;incorporation\r\ndans un lieu d&#8217;habitation. Pour dterminer si un produit constitue un\r\nProduit de Consommation, les cas ambigus sont rsolus en fonction de la\r\ncouverture. Pour un produit particulier reu par un utilisateur\r\nparticulier, l&#8217;expression  normalement utilise  ci-avant se rfre \r\nune utilisation typique ou l&#8217;usage commun de produits de mme\r\ncatgorie, indpendamment du statut de cet utilisateur particulier ou\r\nde la faon spcifique dont cet utilisateur particulier utilise\r\neffectivement ou s&#8217;attend lui-mme ou est attendu  utiliser ce\r\nproduit. Un produit est un Produit de Consommation indpendamment du\r\nfait que ce produit a ou n&#8217;a pas d&#8217;utilisations substantielles\r\ncommerciales, industrielles ou hors Consommation,  moins que de telles\r\nutilisations reprsentent le seul mode significatif d&#8217;utilisation duproduit. </p>\r\n\r\n<p>Les  Informations d&#8217;Installation  d&#8217;un Produit Utilisateur\r\nsignifient toutes les mthodes, procdures, cls d&#8217;autorisation ou\r\nautres informations requises pour installer et excuter des versions\r\nmodifies d&#8217;un Travail Couvert dans ce Produit Utilisateur  partir\r\nd&#8217;une version modifie de son Source Correspondant. Les informations\r\nqui suffisent  assurer la continuit de fonctionnement du code objet\r\nmodifi ne doivent en aucun cas tre empches ou interfres du seul\r\nfait qu&#8217;unemodification a t effectue. </p>\r\n\r\n<p>Si vous acheminez le code objet d&#8217;un Travail Couvert dans, ou avec,\r\nou spcifiquement pour l&#8217;utilisation dans, un Produit Utilisateur et\r\nl&#8217;acheminement se produit en tant qu&#8217;lment d&#8217;une transaction dans\r\nlaquelle le droit de possession et d&#8217;utilisation du Produit Utilisateur\r\nest transfr au Destinataire dfinitivement ou pour un terme fix\r\n(indpendamment de la faon dont la transaction est caractrise), le\r\nSource Correspondant achemin selon cet article-ci doit tre accompagn\r\ndes Informations d&#8217;Installation. Mais cette obligation ne s&#8217;applique\r\npas si ni vous ni aucune tierce partie ne dtient la possibilit\r\nd&#8217;intaller un code objet modifi sur le ProduitUtilisateur (par exemple, le travail a t install en mmoire morte). </p>\r\n\r\n<p>L&#8217;obligation de fournir les Informations d&#8217;Installation n&#8217;inclue pas\r\ncelle de continuer  fournir un service de support, une garantie ou des\r\nmises  jour pour un travail qui a t modifi ou install par le\r\nDestinataire, ou pour le Produit Utilisateur dans lequel il a t\r\nmodifi ou install. L&#8217;accs  un rseau peut tre rejet quand la\r\nmodification elle-mme affecte matriellement et dfavorablement les\r\noprations du rseau ou viole les rgles et protocoles de communication\r\nau travers du rseau.</p>\r\n\r\n<p>Le Source Correspondant achemin et les Informations d&#8217;Installation\r\nfournies, en accord avec cet article, doivent tre dans un format\r\npubliquement document (et dont une implmentation est disponible\r\nauprs du public sous forme de code source) et ne doit ncessiter\r\naucune cl ou mot de passe spcial pour le dpaquetage, la lecture oula copie. </p>\r\n\r\n<h4><a name=\"section7\"></a>7. Termes additionnels.</h4>\r\n\r\n<p>Les  permissions additionelles  dsignent les termes qui\r\nsupplmentent ceux de cette Licence en mettant des exceptions  l&#8217;une\r\nou plusieurs de ses conditions. Les permissions additionnelles qui sont\r\napplicables au Programme entier doivent tre traites comme si elles\r\ntaient incluent dans cette Licence, dans les limites de leur validit\r\nsuivant la loi applicable. Si des permissions additionnelles\r\ns&#8217;appliquent seulement  une partie du Programme, cette partie peut\r\ntre utilise sparment suivant ces permissions, mais le Programme\r\ntout entier reste gouvern par cette Licence sans regard auxpermissions additionelles. </p>\r\n\r\n<p>Quand vous acheminez une copie d&#8217;un Travail Couvert, vous pouvez \r\nvotre convenance ter toute permission additionelle de cette copie, ou\r\nde n&#8217;importe quelle partie de celui-ci. (Des permissions additionnelles\r\npeuvent tre rdiges de faon  requrir leur propre suppression dans\r\ncertains cas o vous modifiez le travail.) Vous pouvez placer les\r\npermissions additionnelles sur le matriel achemin, ajoutes par vous\r\n un Travail Couvert pour lequel vous avez ou pouvezdonner les permissions de Droit d&#8217;Auteur (&#8220;copyright&#8221;) appropries. </p>\r\n\r\n<p>Nonobstant toute autre clause de cette Licence, pour tout\r\nconstituant que vous ajoutez  un Travail Couvert, vous pouvez (si\r\nautoris par les titulaires de Droit d&#8217;Auteur pour ce constituant)\r\nsupplmenter lestermes de cette Licence avec des termes : </p>\r\n\r\n<ul>\r\n<li>a) qui rejettent la garantie ou limitent la responsabilit de faon&nbsp;diffrente des termes des articles 15 et 16 de cette Licence ; ou</li>\r\n\r\n<li>b) qui requirent la prservation de notices lgales\r\nraisonnables&nbsp;spcifies ou les attributions d&#8217;auteur dans ce\r\nconstituant ou&nbsp;dans les Notices Lgales Appropries affiches par\r\nles travaux qui&nbsp;le contiennent ; ou</li>\r\n\r\n<li>c) qui prohibent la reprsentation incorrecte de l&#8217;origine de\r\nce&nbsp;constituant, ou qui requirent que les versions modifies d&#8217;un\r\ntel&nbsp;constituant soit marques par des moyens raisonnables\r\ncomme&nbsp;diffrentes de la version originale ; ou</li>\r\n\r\n<li>d) qui limitent l&#8217;usage  but publicitaire des noms des concdants de&nbsp;licence et des auteurs du constituant ; ou</li>\r\n\r\n<li>e) qui refusent  accorder des droits selon la lgislation relative\r\naux marques commerciales, pour l&#8217;utilisation dans des noms&nbsp;commerciaux, marques commerciales ou &nbsp;arques de services ; ou</li>\r\n\r\n<li>f) qui requirent l&#8217;indemnisation des concdants de licences\r\net&nbsp;auteurs du constituant par quiconque achemine ce constituant\r\n(ou&nbsp;des versions modifies de celui-ci) en assumant\r\ncontractuellement&nbsp;la responsabilit envers le Destinataire, pour\r\ntoute&nbsp;responsabilit que ces engagements contractuels\r\nimposent&nbsp;directement  ces octroyants de licences et auteurs.</li>\r\n</ul>\r\n\r\n<p>Tous les autres termes additionnels non permissifs sont considrs\r\ncomme des  restrictions avances  dans le sens de l&#8217;article 10. Si le\r\nProgramme tel que vous l&#8217;avez reu, ou toute partie de celui-ci,\r\ncontient une notice tablissant qu&#8217;il est gouvern par cette Licence en\r\nmme temps qu&#8217;un terme qui est une restriction avance, vous pouvez\r\nter ce terme. Si un document de licence contient une restriction\r\navance mais permet la reconcession de licence ou l&#8217;acheminement\r\nsuivant cette Licence, vous pouvez ajouter un Travail Couvert\r\nconstituant gouvern par les termes de ce document de licence, pourvu\r\nque la restriction avance ne survit pas  un telle cession de licenceou acheminement. </p>\r\n\r\n<p>Si vous ajoutez des termes  un Travail Couvert en accord avec cet\r\narticle, vous devez placer, dans les fichiers sources appropris, une\r\ndclaration des termes additionnels qui s&#8217;appliquent  ces fichiers, ou\r\nune notice indiquant o trouver les termes applicables.</p>\r\n\r\n<p>Les termes additionnels, qu&#8217;ils soient permissifs ou non permissifs,\r\npeuvent tre tablis sous la forme d&#8217;une licence crite sparment, ou\r\ntablis comme des exceptions ; les obligations ci-dessus s&#8217;appliquentdans chacun de ces cas. </p>\r\n\r\n<h4><a name=\"section8\"></a>8. Terminaison.</h4>\r\n\r\n<p>Vous ne pouvez ni propager ni modifier un Travail Couvert autrement\r\nque suivant les termes de cette Licence. Toute autre tentative de le\r\npropager ou le modifier est nulle et terminera automatiquement vos\r\ndroits selon cette Licence (y compris toute licence de brevet accorde\r\nselon le troisime paragraphe de l&#8217;article 11).</p>\r\n\r\n<p>Cependant, si vous cessez toute violation de cette Licence, alors\r\nvotre licence depuis un titulaire de Droit d&#8217;Auteur (&#8220;copyright&#8221;) est\r\nrinstaure (a)  titre provisoire  moins que et jusqu&#8217; ce que le\r\ntitulaire de Droit d&#8217;Auteur termine finalement et explicitement votre\r\nlicence, et (b) de faon permanente si le titulaire de Droit d&#8217;Auteur\r\nne parvient pas  vous notifier de la violation par quelque moyenraisonnable dans les soixante (60) jours aprs la cessation. </p>\r\n\r\n<p>De plus, votre licence depuis un titulaire particulier de Droit\r\nd&#8217;Auteur est rinstaure de faon permanente si ce titulaire vous\r\nnotifie de la violation par quelque moyen raisonnable, c&#8217;est la\r\npremire fois que vous avez reu une notification deviolation de cette\r\nLicence (pour un travail quelconque) depuis ce titulaire de Droit\r\nd&#8217;Auteur, et vous rsolvez la violation dans les trente (30) jours quisuivent votre rception de la notification. </p>\r\n\r\n<p>La terminaison de vos droits suivant cette section ne terminera pas\r\nles licences des parties qui ont reu des copies ou droits de votre\r\npart suivant cette Licence. Si vos droits ont t termins et non\r\nrinstaurs de faon permanente, vous n&#8217;tes plus qualifi  recevoirde nouvelles licences pour les mmes constituants selon l&#8217;article 10. </p>\r\n\r\n<h4><a name=\"section9\"></a>9. Acceptation non requise pour obtenir des copies.</h4>\r\n\r\n<p>Vous n&#8217;tes pas oblig d&#8217;accepter cette licence afin de recevoir ou\r\nexcuter une copie du Programme. La propagation asservie d&#8217;un Travail\r\nCouvert qui se produit simplement en consquence d&#8217;une transmission\r\nd&#8217;gal--gal pour recevoir une copie ne ncessite pas l&#8217;acceptation.\r\nCependant, rien d&#8217;autre que cette Licence ne vous accorde la permission\r\nde propager ou modifier un quelconque Travail Couvert. Ces actions\r\nenfreignent le Droit d&#8217;Auteur si vous n&#8217;acceptez pas cette Licence. Par\r\nconsquent, en modifiant ou propageant un Travail Couvert,vous indiquez votre acceptation de cette Licence pour agir ainsi. </p>\r\n\r\n<h4><a name=\"section10\"></a>10. Cession automatique de Licence aux Destinataires et intermdiaires.</h4>\r\n\r\n<p>Chaque fois que vous acheminez un Travail Couvert, le Destinataire\r\nreoit automatiquement une licence depuis les concdants originaux,\r\npour excuter, modifier et propager ce travail, suivant les termes de\r\ncette Licence. Vous n&#8217;tes pas responsable du renforcement de laconformation des tierces parties avec cette Licence. </p>\r\n\r\n<p>Une  transaction d&#8217;entit  dsigne une transaction qui transfre\r\nle contrle d&#8217;une organisation, ou de substantiellement tous ses\r\nactifs, ou la subdivision d&#8217;une organisation, ou la fusion de plusieurs\r\norganisations. Si la propagation d&#8217;un Travail Couvert rsulte d&#8217;une\r\ntransaction d&#8217;entit, chaque partie  cette transaction qui reoit une\r\ncopie du travail reoit aussi les licences pour le travail que le\r\nprdcesseur intress  cette partie avait ou pourrait donner selon le\r\nparagraphe prcdent, plus un droit de possession du Source\r\nCorrespondant de ce travail depuis le prdcesseur intress si ce\r\nprdcesseur en dispose ou peut l&#8217;obtenir par des efforts raisonnables.</p>\r\n\r\n<p>Vous ne pouvez imposer aucune restriction avance dans l&#8217;exercice\r\ndes droits accords ou affirms selon cette Licence. Par exemple, vous\r\nne pouvez imposer aucun paiement pour la licence, aucune royaltie, ni\r\naucune autre charge pour l&#8217;exercice des droits accords selon cette\r\nLicence ; et vous ne pouvez amorcer aucun litige judiciaire (y compris\r\nune rclamation croise ou contre-rclamation dans un procs) sur\r\nl&#8217;allgation qu&#8217;une revendication de brevet est enfreinte par la\r\nralisation, l&#8217;utilisation, la vente, l&#8217;offre de vente, oul&#8217;importation du Programme ou d&#8217;une quelconque portion de celui-ci. </p>\r\n\r\n<h4><a name=\"section11\"></a>11. Brevets.</h4>\r\n\r\n<p>Un  contributeur  est un titulaire de Droit d&#8217;Auteur (&#8220;copyright&#8221;)\r\nqui autorise l&#8217;utilisation selon cette Licence du Programme ou du\r\ntravail sur lequel le Programme est bas. Le travail ainsi soumis licence est appel la  version contributive  de ce contributeur. </p>\r\n\r\n<p>Les  revendications de brevet essentielles  sont toutes les\r\nrevendications de brevets dtenues ou contrles par le contributeur,\r\nqu&#8217;elles soient dj acquises par lui ou acquises subsquemment, qui\r\npourraient tre enfreintes de quelque manire, permises par cette\r\nLicence, sur la ralisation, l&#8217;utilisation ou la vente de la version\r\ncontributive de celui-ci. Aux fins de cette dfinition, le  contrle \r\ninclue le droit de concder des sous-licences de brevets d&#8217;une manire\r\nconsistante, ncessaire et suffisante, avec les obligations de cette<br>Licence.</p>\r\n\r\n<p>Chaque contributeur vous accorde une licence de brevet non\r\nexclusive, mondiale et libre de toute royaltie, selon les\r\nrevendications de brevet essentielles, pour raliser, utiliser, vendre,\r\noffrir  la vente, importer et autrement excuter, modifier et propager\r\nles contenus de saversion contributive. </p>\r\n\r\n<p>Dans les trois paragraphes suivants, une  licence de brevet \r\ndsigne tous les accords ou engagements exprims, quel que soit le nom\r\nque vous lui donnez, de ne pas mettre en vigueur un brevet (telle\r\nqu&#8217;une permission explicite pour mettre en pratique un brevet, ou un\r\naccord pour ne pas poursuivre un Destinataire pour cause de violation\r\nde brevet).  Accorder  une telle licence de brevet  une partie\r\nsignifie conclure un tel accord ou engagement  ne pas faire appliquer\r\nle brevet cette partie. </p>\r\n\r\n<p>Si vous acheminez un Travail Couvert, dpendant en connaissance\r\nd&#8217;une licence de brevet, et si le Source Correspondant du travail n&#8217;est\r\npas disponible  quiconque copie, sans frais et suivant les termes de\r\ncette Licence,  travers un serveur rseau publiquement acessible ou\r\ntout autre moyen immdiatement accessible, alors vous devez soit (1)\r\nrendre<br>la Source Correspondante ainsi disponible, soit (2) vous\r\nengager  vous priver pour vous-mme du bnfice de la licence de\r\nbrevet pour ce travail particulier, soit (3) vous engager, d&#8217;une faon\r\nconsistante avec les obligations de cette Licence,  tendre la licence\r\nde brevet aux Destinataires de ce travail.  Dpendant en connaissance\r\n signifie que vous avez effectivement connaissance que, selon la\r\nlicence de brevet, votre acheminement du Travail Couvert dans un pays,\r\nou l&#8217;utilisation du Travail Couvert par votre Destinataire dans un\r\npays, enfreindrait un ou plusieurs brevets identifiables dans ce pays\r\no vous avez des raisons de penser qu&#8217;ils sont valides.</p>\r\n\r\n  \r\n<p>Si, conformment  ou en liaison avec une mme transaction ou un\r\nmme arrangement, vous acheminez, ou propagez en procurant un\r\nacheminement de, un Travail Couvert et accordez une licence de brevet \r\nl&#8217;une des parties recevant le Travail Couvert pour lui permettre\r\nd&#8217;utiliser, propager, modifier ou acheminer une copie spcifique du\r\nTravail Couvert, alors votre accord est automatiquement tendu  tous\r\nles Destinataires du Travail Couvert et des travaux bass sur celui-ci.</p>\r\n\r\n<p>Une licence de brevet est  discriminatoire  si, dans le champ de\r\nsa couverture, elle n&#8217;inclut pas un ou plusieurs des droits qui sont\r\nspcifiquement accords selon cette Licence, ou en prohibe l&#8217;exercice,\r\nou est conditionne par le non-exercice d&#8217;un ou plusieurs de ces\r\ndroits. Vous ne pouvez pas acheminer un Travail Couvert si vous tes\r\npartie  un arrangement selon lequel une partie tierce exerant son\r\nactivit dans la distribution de logiciels et  laquelle vous effectuez\r\nun paiement fond sur l&#8217;tendue de votre activit d&#8217;acheminement du\r\ntravail, et selon lequel la partie tierce accorde,  une quelconque\r\npartie qui recevrait depuis vous le Travail Couvert, une licence de\r\nbrevet discriminatoire (a) en relation avec les copies du Travail\r\nCouvert achemines par vous (ou les copies ralises  partir de ces\r\ncopies), ou (b) avant tout destine et en relation avec des produits\r\nspcifiques ou compilations contenant le Travail Couvert,  moins que\r\nvous ayez conclu cet arrangement ou que la licence de brevet ait taccorde avant le 28 mars 2007. </p>\r\n\r\n<p>Rien dans cette Licence ne devrait tre interprt comme devant\r\nexclure ou limiter toute licence implicite ou d&#8217;autres moyens de\r\ndfense  une infraction qui vous seraient autrement disponible selon\r\nla loiapplicable relative aux brevets. </p>\r\n\r\n<h4><a name=\"section12\"></a>12. Non abandon de la libert des autres.</h4>\r\n\r\n<p>Si des conditions vous sont imposes (que ce soit par dcision\r\njudiciaire, par un accord ou autrement) qui contredisent les conditions\r\nde cette Licence, elles ne vous excusent pas des conditions de cette\r\nLicence. Si vous ne pouvez pas acheminer un Travail Couvert de faon \r\nsatisfaire simultnment vos obligations suivant cette Licence et\r\ntoutes autres obligations pertinentes, alors en consquence vous ne\r\npouvez pas du tout l&#8217;acheminer. Par exemple, si vous avez un accord sur\r\ndes termes qui vous obligent  collecter pour le racheminement des\r\nroyalties depuis ceux  qui vous acheminez le Programme, la seule faon\r\nqui puisse vous permettre de satisfaire  la fois  ces termes et ceux\r\nde cette Licence sera de vous abstenir entirement d&#8217;acheminer leProgramme. </p>\r\n\r\n<h4><a name=\"section13\"></a>13. Utilisation avec la Licence Gnrale Publique Affero GNU.</h4>\r\n\r\n<p>Nonobstant toute autre clause de cette Licence, vous avez la\r\npermission de lier ou combiner tout Travail Couvert avec un travail\r\nplac sous la version 3 de la Licence Gnrale Publique GNU Affero\r\n(&#8220;GNU Affero General Public License&#8221;) en un seul travail combin, et\r\nd&#8217;acheminer le travail rsultant. Les termes de cette Licence\r\ncontinueront  s&#8217;appliquer  la partie formant un Travail Couvert, mais\r\nles obligations spciales de la Licence Gnrale Publique GNU Affero,\r\narticle 13, concernant l&#8217;interaction  travers un rseau s&#8217;appliqueront\r\n la combinaison en tant que telle.</p>\r\n\r\n<h4><a name=\"section14\"></a>14. Versions rvises de cette License.</h4>\r\n\r\n<p>La Free Software Foundation peut publier des versions rvises et/ou\r\nnouvelles de la Licence Publique Gnrale GNU (&#8220;GNU General Public\r\nLicense&#8221;) de temps en temps. De telles version nouvelles resteront\r\nsimilaires dans l&#8217;esprit avec la prsente version, mais peuvent\r\ndiffrer dans le dtail afin de traiter de nouveaux problmes ouproccupations. </p>\r\n\r\n<p>Chaque version reoit un numro de version distinctif. Si le\r\nProgramme indique qu&#8217;une version spcifique de la Licence Publique\r\nGnrale GNU  ou toute version ultrieure  (&#8220;or any later version&#8221;)\r\ns&#8217;applique  celui-ci, vous avez le choix de suivre soit les termes et\r\nconditions de cette version numrote, soit ceux de n&#8217;importe quelle\r\nversion publie ultrieurement par la Free Software Foundation. Si le\r\nProgramme n&#8217;indique pas une version spcifique de la Licence Publique\r\nGnrale GNU, vous pouvez choisir l&#8217;une quelconque des versions qui ont\r\ntpublies par la Free Software Foundation. </p>\r\n\r\n<p>Si le Programme spcifie qu&#8217;un intermdiaire peut dcider quelles\r\nversions futures de la Licence Gnrale Publique GNU peut tre\r\nutilise, la dclaration publique d&#8217;acceptation d&#8217;une version par cetintermdiaire vous autorise  choisir cette version pour le Programme. </p>\r\n\r\n<p>Des versions ultrieures de la licence peuvent vous donner des\r\npermissions additionelles ou diffrentes. Cependant aucune obligation\r\nadditionelle n&#8217;est impose  l&#8217;un des auteurs ou titulaires de Droitd&#8217;Auteur du fait de votre choix de suivre une version ultrieure. </p>\r\n\r\n<h4><a name=\"section15\"></a>15. Dclaration d&#8217;absence de garantie.</h4>\r\n\r\n<p>IL N&#8217;Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LES LIMITES PERMISES\r\nPAR LA LOI APPLICABLE.  MOINS QUE CELA NE SOIT TABLI DIFFREMMENT PAR\r\nCRIT, LES PROPRITAIRES DE DROITS ET/OU LES AUTRES PARTIES FOURNISSENT\r\nLE PROGRAMME  EN L&#8217;TAT  SANS GARANTIE D&#8217;AUCUNE SORTE, QU&#8217;ELLE SOIT\r\nEXPRIME OU IMPLICITE, CECI COMPRENANT, SANS SE LIMITER  CELLES-CI,\r\nLES GARANTIES IMPLICITES DE COMMERCIALISABILIT ET D&#8217;ADQUATION  UN\r\nOBJECTIF PARTICULIER. VOUS ASSUMEZ LE RISQUE ENTIER CONCERNANT LA\r\nQUALIT ET LES PERFORMANCES DU PROGRAMME. DANS L&#8217;VENTUALIT O LE\r\nPROGRAMME S&#8217;AVRERAIT DFECTUEUX, VOUS ASSUMEZ LES COTS DE TOUS LESSERVICES, RPARATIONS OU CORRECTIONS NCESSAIRES.</p>\r\n\r\n<h4><a name=\"section16\"></a>16. Limitation de responsabilit.</h4>\r\n\r\n<p>EN AUCUNE AUTRE CIRCONSTANCE QUE CELLES REQUISES PAR LA LOI\r\nAPPLICABLE OU ACCORDES PAR CRIT, UN TITULAIRE DE DROITS SUR LE\r\nPROGRAMME, OU TOUT AUTRE PARTIE QUI MODIFIE OU ACHEMINE LE PROGRAMME\r\nCOMME PERMIS CI-DESSUS, NE PEUT TRE TENU POUR RESPONSABLE ENVERS VOUS\r\nPOUR LES DOMMAGES, INCLUANT TOUT DOMMAGE GNRAL, SPCIAL, ACCIDENTEL\r\nOU INDUIT SURVENANT PAR SUITE DE L&#8217;UTILISATION OU DE L&#8217;INCAPACIT\r\nD&#8217;UTILISER LE PROGRAMME (Y COMPRIS, SANS SE LIMITER  CELLES-CI, LA\r\nPERTE DE DONNES OU L&#8217;INEXACTITUDE DES DONNES RETOURNES OU LES PERTES\r\nSUBIES PAR VOUS OU DES PARTIES TIERCES OU L&#8217;INCAPACIT DU PROGRAMME \r\nFONCTIONNER AVEC TOUT AUTRE PROGRAMME), MME SI UN TEL TITULAIRE OU\r\nTOUTE AUTRE PARTIEA T AVIS DE LA POSSIBILIT DE TELS DOMMAGES. </p>\r\n\r\n<h4><a name=\"section17\"></a>17. Interprtation des sections 15 et 16.</h4>\r\n\r\n<p>Si la dclaration d&#8217;absence de garantie et la limitation de\r\nresponsabilit fournies ci-dessus ne peuvent prendre effet localement\r\nselon leurs termes, les cours de justice qui les examinent doivent\r\nappliquer la lgislation locale qui approche au plus prs possible une\r\nleve absolue de toute responsabilit civile lie au Programme,  moins\r\nqu&#8217;une garantie ou assumation de responsabilit accompagne une copie du\r\nProgramme en change d&#8217;un paiement.</p>\r\n\r\n<p>FIN DES TERMES ET CONDITIONS.</p>\r\n\r\n<h3><a name=\"howto\"></a>Comment appliquer ces termes  vos nouveaux programmes</h3>\r\n\r\n<p>Si vous dveloppez un nouveau programme et voulez qu&#8217;il soit le plus\r\npossible utilisable par le public, la meilleure faon d&#8217;y parvenir et\r\nd&#8217;en faire un logiciel libre que chacun peut redistribuer et changersuivant ces termes-ci. </p>\r\n\r\n<p>Pour appliquer ces termes, attachez les notices suivantes au\r\nprogramme. Il est plus sr de les attacher au dbut de chacun des\r\nfichiers sources afin de transporter de faon la plus effective\r\npossible l&#8217;exclusion de garantie ; et chaque fichier devrait comporter\r\nau moins la ligne de rservation de droit (&#8220;copyright&#8221;) et une\r\nindication permettant de savoiro la notice complte peut tre trouve : </p>\r\n\r\n<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;<br>    Copyright (C) &lt;year&gt;  &lt;name of author&gt;<br><br>    This program is free software: you can redistribute it and/or modify<br>    it under the terms of the GNU General Public License as published by<br>    the Free Software Foundation, either version 3 of the License, or<br>    (at your option) any later version.<br><br>    This program is distributed in the hope that it will be useful,<br>    but WITHOUT ANY WARRANTY; without even the implied warranty of<br>    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>    GNU General Public License for more details.<br><br>    You should have received a copy of the GNU General Public License<br>    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.<br></pre>\r\n\r\n<p>Ajoutez galement les informations permettant de vous contacter par courrier lectronique ou postal.</p>\r\n\r\n<p>Si le programme produit une interaction sur un terminal, faites lui\r\nafficher une courte notice comme celle-ci lors de son dmarrage en mode\r\ninteractif :</p>\r\n\r\n<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;<br><br>    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.<br>    This is free software, and you are welcome to redistribute it<br>    under certain conditions; type `show c' for details.<br></pre>\r\n\r\n<p>Les commandes hypothtiques &#8220;affiche g&#8221; and &#8220;affiche c&#8221; devrait\r\nafficher les parties appropries de la Licence Gnrale Publique. Bien\r\nsr, les commandes de votre programme peuvent tre diffrentes ; pourune interface graphique, vous pourriez utiliser une  bote  propos.  </p>\r\n\r\n<p>Vous devriez galement obtenir de votre employeur (si vous\r\ntravaillez en tant que programmeur) ou de votre cole un  renoncement\r\naux droits de proprit  pour ce programme, si ncessaire. Pour plus\r\nd&#8217;informations  ce sujet, et comment appliquer la GPL GNU, consultez&lt;http://www.gnu.org/licenses/&gt;. </p>\r\n\r\n<p>La Licence Gnrale Publique GNU ne permet pas d&#8217;incorporer votre\r\nprogramme dans des programmes propritaires. Si votre programme est une\r\nbibliothque de sous-routines, vous pourriez considrer qu&#8217;il serait\r\nplus utile de permettre de lier des applications propritaires avec la\r\nbibliothque. Si c&#8217;est ce que vous voulez faire, utilisez la Licence\r\nGnrale Publique Limite GNU au lieu de cette Licence ; mais d&#8217;abord,veuillez lire &lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;. </p>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/quick_start.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Dmarrage rapide</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Dmarrage rapide</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<dl>\r\n\t\t<dt></dt><h2>Comment faire ?</h2>\r\n\t\t<dd><a href=\"../how_to_use/working_with_projects/getting_started.html\">Premier projet</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/working_with_projects/multisession_disc.html\">Disques multi-sessions</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/copy_data_disc.html\">Copie de disques de donnes</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/copy_audio_disc.html\">Copie de disques audios</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/erase_disc.html\">Effacer des disques r-inscriptibles</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/disc_information.html\">Les informations du disque</a></dd>\r\n\t\t<dt></dt>\r\n\t\t<dd><a href=\"../how_to_use/device_configuration.html\">Configurer les priphriques</a></dd>\r\n\t</dl>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/system_requirements.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Configuration requise</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Configuration requise</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>La configuration requise pour InfraRecorder est la suivante:</p>\r\n\t<ul>\r\n\t\t<li>Windows 98 avec Internet Explorer 5.0 ou plus rcent.</li>\r\n\t\t<li>32 Mo de RAM.</li>\r\n\t\t<li>8.1 Mo disponible sur le disque dur.</li>\r\n\t</ul>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/infra_recorder/whats_new.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"fr\"><head><meta content=\"text/html;charset=ISO-8859-1\" http-equiv=\"Content-Type\">\r\n\r\n<title>Quoi de neuf</title><link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"../style.css\">\r\n<script type=\"text/javascript\" language=\"JavaScript\" src=\"../stylescript.js\"></script></head>\r\n<body scroll=\"no\">\r\n<div id=\"header\">\r\n\t<div id=\"location\">InfraRecorder</div>\r\n\t<div id=\"topic\">Quoi de neuf ?</div>\r\n</div>\r\n<div id=\"content\">\r\n\t<p>Version 0.50.0.0</p>\r\n\t<ul>\r\n\t\t<li>Relaxed default project ISO9660 settings.</li>\r\n\t\t<li>Made progress dialogs resizable for easier reading.</li>\r\n\t\t<li>Added wait cursors to time consuming operations.</li>\r\n\t\t<li>Fixed bug causing failed operations to sometimes be reporeted as\r\n\t\t    successful.</li>\r\n\t\t<li>Fixed bug causing an error when verifying discs containing single\r\n\t\t    character file or directory names.</li>\r\n\t\t<li>Updated cdrtools to version 2.01.01a61.</li>\r\n\t\t<li>Added support for displaying BluRay and HD-DVD capabilities.</li>\r\n\t\t<li>Displayed OK button problem should now be gone.</li>\r\n\t\t<li>Greatly improved device detection speed, devices are now always probed at\r\n\t\t    startup.</li>\r\n\t\t<li>Fixed a bug preventing boot images from being removed from projects.</li>\r\n\t\t<li>Updated InfraRecorder projects not to store file size information that\r\n\t\t    potentially could cause write errors.</li>\r\n\t\t<li>Added safety net preventing non-recoverable read errors to affect\r\n\t\t    integrity of other files during recording operation.</li>\r\n\t\t<li>Updated InfraRecorder to lock files on hard drive during file system\r\n\t\t    creation in order to avoid inconsistency errors.</li>\r\n\t\t<li>Added support for importing data from file lists like M3U.</li>\r\n\t\t<li>Added command line options for selecting default project and media\r\n\t\t    type.\r\n\t\t</li><li>Fixed a bug causing projects opened by association not to be loaded if\r\n\t\t    welcome screen was enabled.</li>\r\n\t\t<li>Added support for using Ctrl+A in the track secion to select all\r\n\t\t    tracks.</li>\r\n\t\t<li>The drive letter is now displayed with the name of all CD/DVD\r\n\t\t    devices.</li>\r\n\t\t<li>Renamed disc fixation to disc closing.</li>\r\n\t\t<li>Fixed bugs related to drive letter detection.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.2.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the disc file system creation process to hang on some\r\n\t\t    systems (for real this time).</li>\r\n\t\t<li>Fixed a bug causing a custom temporary directory not to be used.</li>\r\n\t\t<li>Fixed a start-up maximization bug.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.1.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the disc file system creation process to hang on some\r\n\t\t    systems.</li>\r\n\t</ul>\r\n\t<p>Version 0.46.0.0</p>\r\n\t<ul>\r\n\t\t<li>Minor bugfixes and updates.</li>\r\n\t\t<li>Added support for recording multiple copies.</li>\r\n\t\t<li>Added a welcome screen to the InfraRecorder main application and removed\r\n\t\t    the express application.</li>\r\n\t\t<li>Solved a bug causing the OK button not to be enabled after erasing or\r\n\t\t    formatting a disc.\r\n\t\t</li><li>Moved all source code to GPL version 3.</li>\r\n\t\t<li>Removed cdrtools binaries in favor of cdrkit binaries.</li>\r\n\t\t<li>Improved device detection routines, there should not be any more problems\r\n\t\t    with wrongly detected drive letters.</li>\r\n\t\t<li>Included an Indonesian translation, thanks to Andhika Padmawan!</li>\r\n\t\t<li>Included a Chuvash translation, thanks to Vladimir Kozhevnikov!</li>\r\n\t\t<li>Fixed a bug causing the express application and shell extension not to be\r\n\t\t    translated.</li>\r\n\t\t<li>Updated the portable version of InfraRecorder to store its log files in\r\n\t\t    the program directory instead of in the the application data folder.</li>\r\n\t</ul>\r\n\t<p>Version 0.45.0.0</p>\r\n\t<ul>\r\n\t\t<li>Updated cdrtools to version 2.01.01a38.</li>\r\n\t\t<li>Fixed a bug making InfraRecorder crash when trying to move a folder to\r\n\t\t    itself.</li>\r\n\t\t<li>Fixed a bug causing the wrong folder to be opened when double-clicking in\r\n\t\t    the project list view when a project contained folders with identical\r\n\t\t    names.</li>\r\n\t\t<li>Fixed a bug causing the focus not to be returned to the OK button in the\r\n\t\t    progress dialog after performing an operation.</li>\r\n\t\t<li>Fixed icon rendering error on Windows XP and newer where display depth is\r\n\t\t    lower than 32-bits.</li>\r\n\t\t<li>Changed the option to verify the device configuration at start up to be\r\n\t\t    enabled by default.</li>\r\n\t\t<li>Added support for associating InfraRecorder with disc images.</li>\r\n\t\t<li>Updated the some of the dialog windows to be minimizable and visible on\r\n\t\t    the task bar when launced by an external application (like irExpress).</li>\r\n\t\t<li>Fixed a bug causing incorrect file names to be used when verifying\r\n\t\t    recorded discs.</li>\r\n\t\t<li>Added functionallity to rename and remove files from imported sessions.</li>\r\n\t\t<li>Added support for selecting which multi-session track to import.</li>\r\n\t\t<li>When trying to record to a non-empty rewritable disc, InfraRecorder now\r\n\t\t    asks if the disc should be erased.</li>\r\n\t\t<li>When performing an operation the progress is now also displayed in the\r\n\t\t    taskbar.</li>\r\n\t\t<li>Reduced memory usage when dealing with projects.</li>\r\n\t\t<li>Fixed a bug making it impossible to open saved projects containing no\r\n\t\t    files.</li>\r\n\t\t<li>Included a Thai translation, thanks to Prasit Kaephukhieo!</li>\r\n\t\t<li>Improved compatibility with the ISO9660 standard.</li>\r\n\t\t<li>Added support for creating UDF-only file systems.</li>\r\n\t\t<li>Added support for Unicode files names in Joliet extension and UDF file\r\n\t\t    system.</li>\r\n\t\t<li>Added support for fragmented files in ISO9660 level 3. Files larger than\r\n\t\t    4 GiB can now be recorded to an ISO9660 file system.</li>\r\n\t\t<li>Removed mkisofs and isoinfo dependencies.</li>\r\n\t\t<li>Fixed some bugs related to importing disc sessions.</li>\r\n\t\t<li>Added properties menu item when right-clicking on the project tree root\r\n\t\t    node.</li>\r\n\t\t<li>Added proper flagging of hidden files in the disc file system.</li>\r\n\t\t<li>Changed the default write method for multi-session projects to TAO.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash when renaming project files to\r\n\t\t    include slash or backslash characters.</li>\r\n\t\t<li>Added the .img extension to the list of supported disc image extensions.</li>\r\n\t\t<li>A few cosmetic changes.</li>\r\n\t\t<li>Included an Arabic translation, thanks to Circoficus!</li>\r\n\t\t<li>Included a Greek translation, thanks to  . !</li>\r\n\t</ul>\r\n\t<p>Version 0.44.1.0</p>\r\n\t<ul>\r\n\t\t<li>Introduced alternate ways of fetching recorder write speeds. This solves\r\n\t\t    the \"disabled OK button problem\".</li>\r\n\t\t<li>Added support for reloading laptop drives (drives that can not\r\n\t\t    automatically load themselves) before starting the disc verification\r\n\t\t    process.</li>\r\n\t\t<li>Corrected a version display error in the log system.</li>\r\n\t</ul>\r\n\t<p>Version 0.44.0.0</p>\r\n\t<ul>\r\n\t\t<li>Added a warning message when disabling disc fixation since some users\r\n\t\t    believes that this will create a multi-session disc.</li>\r\n\t\t<li>It's now possible to perform a disc copy using the same device as source\r\n\t\t    and target.</li>\r\n\t\t<li>Updated drive speed detection routines, it should now detect correct\r\n\t\t    speeds depeding on the inserted media.</li>\r\n\t\t<li>Improved the media removal/insertion auto detection routines.</li>\r\n\t\t<li>Added support for switching through the controls of the main view using\r\n\t\t    the tab key.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash on Windows 9x systems when\r\n\t\t    changing folder in the explorer view.</li>\r\n\t\t<li>Added menu items for selecting all files and inverting the file selection.</li>\r\n\t\t<li>Fixed a bug causing negative progress to be displayed in some cases.</li>\r\n\t\t<li>Updated InfraRecorder to correctly maximize on startup, if closed\r\n\t\t    maximized.</li>\r\n\t\t<li>Added a website button to the about window.</li>\r\n\t\t<li>Fixed a project file rename bug.</li>\r\n\t\t<li>Made the toolbar customizable in several ways.</li>\r\n\t\t<li>Improved project file handling, no duplicate files or folders are allowed.</li>\r\n\t\t<li>The program configuration is now stored in the application data folder.\r\n\t\t    A new portable version of InfraRecorder has been created where data is\r\n\t\t    stored in the program folder.</li>\r\n\t\t<li>Greatly improved drag and drop functionality.</li>\r\n\t\t<li>Included a Norwegian translation, thanks to Karol Ptasinski!</li>\r\n\t\t<li>Updated the help file with index and search capabilities.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to try to verify files that where\r\n\t\t    imported from previous sessions.</li>\r\n\t\t<li>Fixed a bug causing the disc to be ejected (if requested) before starting\r\n\t\t    the disc verification process.</li>\r\n\t\t<li>Fixed a bug causing incompatibility with Windows 9x systems due to a\r\n\t\t    function call to SHGetFolderPathA.</li>\r\n\t</ul>\r\n\t<p>Version 0.43.1.0</p>\r\n\t<ul>\r\n\t\t<li>Updated the cdrtools to version 2.01.01a26.</li>\r\n\t\t<li>Included a Finnish translation, thanks to Rami Aalto!</li>\r\n\t\t<li>Removed the error message related to ckEffects.exe.</li>\r\n\t\t<li>Improved the erase feature with support for more recorders.</li>\r\n\t\t<li>Fixed a bug causing the size and position of the main window not to be\r\n\t\t    remembered.</li>\r\n\t\t<li>Fixed a bug causing the explorer view to turn white when double-clicking\r\n\t\t    on a folder in the explorer list view (Windows XP only).</li>\r\n\t\t<li>Improved the program log functionality.</li>\r\n\t\t<li>Fixed a bug making it impossible to import sessions from certain disc types.</li>\r\n\t\t<li>Improved the explorer view performance. Expanding anything under \"My Computer\"\r\n\t\t    in the tree could on some systems result in a long delay because of slow\r\n\t\t    queries to floppy drives.</li>\r\n\t</ul>\r\n\t<p>Version 0.43.0.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug raising an exception when re-ordering audio tracks.</li>\r\n\t\t<li>Added a smoke effect when writing to a disc (requires Windows Vista\r\n\t\t    Aero to be enabled).</li>\r\n\t\t<li>Fixed a few bugs causing wrong disc information to be shown in the\r\n\t\t    disc information window.</li>\r\n\t\t<li>Various adaptations for Windows Vista.</li>\r\n\t\t<li>Added support for dropping files into the project tree view.</li>\r\n\t\t<li>Completely rewritten disc erase/format code. Improved DVDRW and\r\n\t\t    DVD-RAM support.</li>\r\n\t\t<li>Included a Catalan translation, thanks to Josep Llus Amador Teruel!</li>\r\n\t\t<li>Included a Galician translation, thanks to Xess Estvez!</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to have invalid window coordinates\r\n\t\t    closed while minimized.</li>\r\n\t\t<li>Included a Romanian translation, thanks to Nicolae Crefelean!</li>\r\n\t\t<li>Removed the Visual C++ 8 DLL dependencies from the shell extension.</li>\r\n\t\t<li>Included a Hungarian translation, thanks to Tibor Srkny!</li>\r\n\t\t<li>Included a Hebrew translation, thanks to Shemesh!</li>\r\n\t\t<li>Included a Danish translation, thanks to Patrick Fust!</li>\r\n\t\t<li>Fixed a bug causing all internal SCSI commands not to be executed in\r\n\t\t    the x64 build of InfraRecorder.</li>\r\n\t</ul>\r\n\t<p>Version 0.42.1.0</p>\r\n\t<ul>\r\n\t\t<li>The MSI installer used for the x64 release now creates the\r\n\t\t    start-menu shortcuts in a subfolder.</li>\r\n\t\t<li>Fixed a bug causing InfraRecorder to crash when cdrecord reported\r\n\t\t    recording on a track-number higher than the number of tracks to be\r\n\t\t    recorded.</li>\r\n\t\t<li>Removed the Visual C++ 8 DLL dependencies from the irWave codec.</li>\r\n\t\t<li>Fixed a bug causing stack corruption when using the irWMA codec.</li>\r\n\t</ul>\r\n\t<p>Version 0.42.0.0</p>\r\n\t<ul>\r\n\t\t<li>Available as 64-bit (x64) build.</li>\r\n\t\t<li>Created a completely new Wave codec to remove the libsndfile\r\n\t\t    dependency and add support for the x64 compiler.</li>\r\n\t\t<li>Modifed the translation system to allow translated controls to\r\n\t\t    automatically resize and move its neightbours when needed.</li>\r\n\t\t<li>Various changes for Windows Vista compatibility.</li>\r\n\t\t<li>Modified the WMA codec so it doesn't raise an error message when it\r\n\t\t    fails to load (if Windows Media Player not installed).</li>\r\n\t\t<li>Included a Japanese translation, thanks to Nardog!</li>\r\n\t\t<li>Fixed a bug causing DVD media to always be recorded at maximum\r\n\t\t    speed.</li>\r\n\t\t<li>Included a Korean translation, thanks to Jung Jin-ho!</li>\r\n\t\t<li>Included a Bulgarian translation, thanks to Iliyan Popov!</li>\r\n\t\t<li>Separated data DVD from data CD projects.</li>\r\n\t\t<li>Added support for omiting version numbers from ISO9660 file names.</li>\r\n\t\t<li>Added support for using Rock Ridge extensions without using the Joliet\r\n\t\t    file name extension.</li>\r\n\t\t<li>Fixed a bug causing the write speed not to be properly reported on some\r\n\t\t    recorders.</li>\r\n\t\t<li>Added support for column sorting.</li>\r\n\t\t<li>Added support for rearranging audio tracks by drag and drop.</li>\r\n\t\t<li>Included a Serbian (Cyrillic and Latin) translation, thanks to ozzii!</li>\r\n\t\t<li>Added support for automatically verifying a disc after it has been\r\n\t\t    recorded.</li>\r\n\t\t<li>Made the labels on the progress dialog double buffered to avoid\r\n\t\t    flickering.</li>\r\n\t\t<li>Fixed a bug causing the cp1250 code page not to be properly\r\n\t\t    detected on Czech systems.</li>\r\n\t\t<li>Added support for creating DVD-Video projects.</li>\r\n\t\t<li>Included a Slovak translation, thanks to Marek!</li>\r\n\t\t<li>Fixed a bug causing problems when importing certain seasons from\r\n\t\t    multi-session discs.</li>\r\n\t\t<li>Fixed a bug causing project UDF-settings not to be properly reset\r\n\t\t    when creating a new project.</li>\r\n\t\t<li>Fixed a bug causing error messages not to be properly displayed when\r\n\t\t    recording custom projects on the fly.</li>\r\n\t\t<li>Included a Chinese (Traditional) translation, thanks to Charlie!</li>\r\n\t</ul>\r\n\t<p>Version 0.41.0.0</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug causing the space meter to display inaccurate file\r\n\t\t    sizes on audio files in mixed-mode projects.</li>\r\n\t\t<li>Due to limitations in the Microsoft Windows 9x Unicode Layer, a\r\n\t\t    non-unicode version of InfraRecorder is released separateley.</li>\r\n\t\t<li>Added support for disabling the error message that occurs when a\r\n\t\t    codec fails to load.</li>\r\n\t\t<li>Added support for generating DVD-Video compliant filesystems.</li>\r\n\t\t<li>Added support for UDF.</li>\r\n\t\t<li>Added support for creating bootable data discs.</li>\r\n\t\t<li>Fixed a major bug preventing some projects from beeing properly\r\n\t\t    loaded.</li>\r\n\t\t<li>Included a Bosnian translation, thanks to Asim Husanovic!</li>\r\n\t\t<li>Added an option to change the detected write speed of a recorder.</li>\r\n\t\t<li>Changed the recorder speed management to now allow a larger\r\n\t\t    number of write speeds below the maximum speed.</li>\r\n\t\t<li>Added write method information to the advanced device details.</li>\r\n\t\t<li>Fixed a bug causing a wrong character set to be detected on systems\r\n\t\t    using code page 1251.</li>\r\n\t\t<li>Fixed a bug causing bogus unix file permissions to be set when\r\n\t\t    recording custom projects using the Joliet name extension.</li>\r\n\t\t<li>Improved the project space meter.</li>\r\n\t\t<li>Added support for recording custom projects on the fly.</li>\r\n\t\t<li>Fixed a bug causing a temporary file not to be removed when\r\n\t\t    copying a disc.</li>\r\n\t\t<li>Added support for disabling the unsupported character set error\r\n\t\t    message.</li>\r\n\t\t<li>Fixed a bug causing the space meter tooltip to display the size\r\n\t\t    information in bytes instead of minutes when dealing with audio\r\n\t\t    projects.</li>\r\n\t\t<li>Included a Slovenian translation, thanks to Frani &#381;i&#382;ek!</li>\r\n\t\t<li>Included a Ukrainian translation and manual, thanks to Serhij Dubyk!</li>\r\n\t\t<li>The advanced device properties list now correctly displays\r\n\t\t    titletip when a feature description is to long to be fully\r\n\t\t    displayed.</li>\r\n\t\t<li>Fixed a bug causing empty directories to be ignored when creating\r\n\t\t    and recording custom projects.</li>\r\n\t\t<li>Fixed a bug causing files that has equal characters in the\r\n\t\t    file name to raise an error when creating a disc image.</li>\r\n\t\t<li>Included a Portuguese (Brazilian) translation, thanks to der Silva!</li>\r\n\t\t<li>Included a Chinese (Simplified) translation, thanks to DouDeHou!</li>\r\n\t\t<li>Added more read options (ignore read errors, read\r\n\t\t    sub-channel data and TOC, read speed).</li>\r\n\t\t<li>Added support for disc\r\n\t\t    <a href=\"../how_to_use/copy_data_disc.html\">cloning</a>.</li>\r\n\t\t<li>Added support for changing the FIFO buffer size.</li>\r\n\t\t<li>Added support for ISO level 4 which among many thigs\r\n\t\t    allows directory nesting to be deeper than eight levels.</li>\r\n\t</ul>\r\n\t<p>Version 0.40.0.0</p>\r\n\t<ul>\r\n\t\t<li>Included a Czech translation, thanks to khagaroth!</li>\r\n\t\t<li>Improved DVD-support (official cdrtools has DVD support\r\n\t\t    since version 2.01.01a09).</li>\r\n\t\t<li>Simulation mode now works when recording to DVDs.</li>\r\n\t\t<li>Support for blanking DVD+RW media (currently only with\r\n\t\t    Ricoh based drives).</li>\r\n\t\t<li>The size and position of the main InfraRecorder window\r\n\t\t    is now remembered and restored each startup.</li>\r\n\t\t<li>Included a Basque translation, thanks to David Garca-Abad!</li>\r\n\t\t<li>Added support for encoding audio tracks to Ogg, WMA and\r\n\t\t    MP3 (separate package due to patent issue).</li>\r\n\t\t<li>Fixed a bug causing the wrong tracks to be displayed\r\n\t\t    when scanning a disc for errors.</li>\r\n\t\t<li>Added support for decoding MP3, Ogg and WMA audio.</li>\r\n\t\t<li>Included a German manual, thanks to CE4!</li>\r\n\t\t<li>Included an Italian translation, thanks to Lorenzo Festa!</li>\r\n\t\t<li>Fixed bug with message boxes, they should now be modal.</li>\r\n\t\t<li>Added support for translated manuals.</li>\r\n\t\t<li>Changed the default simulation value to off.</li>\r\n\t\t<li>Added an option for changing the temporary folder.</li>\r\n\t\t<li>Added help documentation on how to make the InfraRecorder\r\n\t\t    installer perform unattended <a href=\"installation.html\">\r\n\t\t    installations</a>.</li>\r\n\t\t<li>The installer now adds an entry to Add/Remove Programs.</li> \r\n\t\t<li>Added support for selecting installation language on unattended\r\n\t\t   installations.</li> \r\n\t\t<li>Included a Russian translation and manual, thanks to Roman Starikh!</li>\r\n\t\t<li>Included a German translation, thanks to Thomas Bigler!</li>\r\n\t\t<li>Included a Polish translation, thanks to DJD!</li>\r\n\t\t<li>Included a Turkish translation, thanks to Fatma Akarslan!</li>\r\n\t\t<li>Included a Croatian translation, thanks to Tibor Keser!</li>\r\n\t\t<li>Included a Dutch translation, thanks to Patrick!</li>\r\n\t</ul>\r\n\t<p>Version 0.31.0.0</p>\r\n\t<ul>\r\n\t\t<li>Included a Portuguese translation, thanks to Cesar Baptista!</li>\r\n\t\t<li>Included a Spanish translation, thanks to Eduardo Leon!</li>\r\n\t\t<li>Increased the height of all comboboxes in the GUI to prevent unnecessary\r\n\t\t    scrolling.</li>\r\n\t\t<li>Fixed some GUI glitches causing black and purple backgrounds on some\r\n\t\t    graphics (only affected systems older than Windows XP).</li>\r\n\t\t<li>Added a tooltip to the space meter which displays the project size.</li>\r\n\t\t<li>Added support for pasting files from Windows Explorer into a project.</li>\r\n\t\t<li>Fixed a bug allowing multiple sessions to imported to a project.</li>\r\n\t</ul>\r\n\t<p>Version 0.30.0.83</p>\r\n\t<ul>\r\n\t\t<li>Fixed a bug (static linking to UpdateLayeredWindow in user32.dll) causing\r\n\t\t    incompatibility with Windows 9x systems.</li>\r\n\t</ul>\r\n\t<p>Version 0.30.0.82 (Beta 2)</p>\r\n\t<ul>\r\n\t\t<li>Added DVD support by patching cdrecord (WARNING: Simulation mode is known\r\n\t\t    not to work when burning DVDs).</li>\r\n\t\t<li>Included a French translation, thanks to Pierre-Jean Coudert!</li>\r\n\t\t<li>Changed the default write method to SAO because of DVD compatibility.</li>\r\n\t\t<li>Updated the installer with extra options and multi-language support.</li>\r\n\t\t<li>Added a couple of new translateable strings for the progress log output.\r\n\t\t    </li>\r\n\t\t<li>Made some directory layout changes to the CVS.</li>\r\n\t</ul>\r\n</div>\r\n</body></html>"
  },
  {
    "path": "doc/french/style.css",
    "content": "/* Generated by KompoZer */\nbody {\n  margin: 0px;\n  font-weight: normal;\n  font-size: 11px;\n  color: #000000;\n  font-family: Verdana,Arial,Helvetica,sans-serif;\n  height: 100%;\n  background-color: #ffffff;\n  text-align: left;\n}\nh1 {\n  font-size: 115%;\n  margin-top: 1em;\n  margin-bottom: 0.6em;\n}\nh2 {\n  font-size: 100%;\n  margin-top: 1em;\n  margin-bottom: 0.6em;\n}\nul {\n  list-style-type: disc;\n  margin-left: 1.9em;\n  margin-top: 0.6em;\n  margin-bottom: 0em;\n}\nol {\n  margin-left: 2.9em;\n  margin-top: 0.6em;\n  margin-bottom: 0em;\n  font-weight: bold;\n}\nol span {\n  font-weight: normal;\n}\nli {\n  margin-bottom: 0.3em;\n}\np, dl {\n  margin-top: 0.6em;\n  margin-bottom: 0.6em;\n}\nhr {\n  margin-top: 0.6em;\n}\ndd {\n  padding-top: 0.2em;\n  margin-bottom: 0.6em;\n  margin-left: 0.8em;\n}\n#header {\n  border-bottom: 1px solid #9999ff;\n  background: #ccccff none repeat scroll 0% 50%;\n  padding-top: 5px;\n  padding-left: 10px;\n  padding-bottom: 5px;\n}\n#location {\n  border-bottom: 1px solid #9999ff;\n  background: #ccccff none repeat scroll 0% 50%;\n  padding-top: 5px;\n  padding-left: 10px;\n  padding-bottom: 5px;\n}\n#topic {\n  font-weight: bold;\n}\n#content {\n  padding: 10px;\n  overflow: auto;\n  height: 100%;\n}\n#footer {\n  background: #ccccff none repeat scroll 0% 50%;\n  text-align: center;\n  position: absolute;\n  bottom: 3pt;\n  width: 100%;\n}\n"
  },
  {
    "path": "doc/french/stylescript.js",
    "content": "window.onload = OnSize;\r\nwindow.onresize = OnSize;\r\n\r\nfunction OnSize()\r\n{\r\n\tvar vHeader = document.all.item(\"header\");\r\n\tvar vContent = document.all.item(\"content\");\r\n\r\n\tif (vContent ==null) \r\n\t\treturn;\r\n\r\n\tif (vHeader != null)\r\n\t{\r\n\t\tdocument.all.content.style.overflow = \"auto\";\r\n\t\tdocument.all.header.style.width = document.body.offsetWidth;\r\n\t\tdocument.all.content.style.width = document.body.offsetWidth - 4;\r\n\t\tdocument.all.content.style.top = document.all.header.offsetHeight;\r\n\r\n\t\tif (document.body.offsetHeight > document.all.header.offsetHeight)\r\n\t\t{\r\n\t\t\tdocument.all.content.style.height = document.body.offsetHeight - document.all.header.offsetHeight - 3;\r\n\t\t}\r\n\t\telse \r\n\t\t{\r\n\t\t\tdocument.all.content.style.height = 0;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "etc/codecs/readme.txt",
    "content": "InfraRecorder MP3 Encoder\r\n-------------------------\r\nThis codec is distributed separateley because of patent issues. Personal and/or\r\ncommercial use of compiled versions of this codec requires a patent license in\r\nsome countries. Please check before using this codec.\r\n\r\nTo install this codec, simply copy the appropriate lame.irc file to the\r\nInfraRecorder codecs directory. C:\\Program Files\\InfraRecorder\\codecs by\r\ndefault. If you have InfraRecorder running you need to restart it so the codec\r\ncan be loaded. This package contains two codecs, one for the 32-bit version of\r\nInfraRecorder, and one for the 64-bit. To find out which version you should use\r\ncheck the InfraRecorder about window.\r\n\r\nThis software comes with ABSOLUTELY NO WARRANTY. This is free software, and you\r\nare welcome to redistribute it under certain conditions; please see the file\r\nlicense.txt in the sourcecode package for more information.\r\n"
  },
  {
    "path": "etc/translations/install.txt",
    "content": "To install the translation, place the .irl file (and the .chm file for\r\ntranslations that include a translated manual) in the InfraRecorder\\Languages\r\ndirectory. For example: C:\\Program Files\\InfraRecorder\\Languages.\r\n"
  },
  {
    "path": "etc/translations/readme.txt",
    "content": "Thank you for your help translating InfraRecorder!\r\n\r\nThe file to be translated is named English.irl. Your translation should use the\r\nsame file extension and be placed in the \"InfraRecorder\\Languages\" folder.\r\n\r\nWhen you send me your translation, please include a translation of the\r\nfollowing ten strings (used by the setup program):\r\n\r\n01: \"InfraRecorder Core Files (required)\"\r\n02: \"Start Menu Shortcuts\"\r\n03: \"Desktop Shortcut\"\r\n04: \"Quick Launch Shortcut\"\r\n05: \"Language Files\"\r\n06: \"The core files required to use InfraRecorder.\"\r\n07: \"Adds icons to your start menu for easy access.\"\r\n08: \"Adds an icon to your desktop.\"\r\n09: \"Adds an icon to your quick launch bar.\"\r\n10: \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\nYou may include any copyright comments in the beginning of the translation file\r\nif you wish. For example:\r\n\r\n; InfraRecorder Swedish Translation\r\n; Version 0.44\r\n: Date: November 7th 2007\r\n; Contact: user@domain.com\r\n; Size: 36 KiB\r\n\r\nPlease note that the section named [translation] not should be translated but\r\ncontain information about your translation. InfraRecorder 0.40 and newer will\r\nsupport translated help files. If you have translated the help file it should\r\nbe specified in your translation so that InfraRecorder can find it. To do so,\r\njust specify the location and name of the translated help file as value number\r\n0x0004 in the translation section. The translated help file should be placed in\r\nthe same directory as the translation. Example:\r\n  [translation]\r\n  0x0001=Christian Kindahl\r\n  0x0002=November 7th 2007\r\n  0x0003=0.44\r\n  0x0004=Languages\\Swedish.chm\r\nThe help file value (0x0004) is optional. If your translation does not include\r\na help file this value should not exist.\r\n\r\nSend your translation to: christian dot kindahl at gmail dot com\r\n"
  },
  {
    "path": "license.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Courier New;}}\r\n{\\*\\generator Msftedit 5.41.15.1515;}\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs16                     GNU GENERAL PUBLIC LICENSE\\par\r\n                       Version 3, 29 June 2007\\par\r\n\\par\r\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\\par\r\n Everyone is permitted to copy and distribute verbatim copies\\par\r\n of this license document, but changing it is not allowed.\\par\r\n\\par\r\n                            Preamble\\par\r\n\\par\r\n  The GNU General Public License is a free, copyleft license for\\par\r\nsoftware and other kinds of works.\\par\r\n\\par\r\n  The licenses for most software and other practical works are designed\\par\r\nto take away your freedom to share and change the works.  By contrast,\\par\r\nthe GNU General Public License is intended to guarantee your freedom to\\par\r\nshare and change all versions of a program--to make sure it remains free\\par\r\nsoftware for all its users.  We, the Free Software Foundation, use the\\par\r\nGNU General Public License for most of our software; it applies also to\\par\r\nany other work released this way by its authors.  You can apply it to\\par\r\nyour programs, too.\\par\r\n\\par\r\n  When we speak of free software, we are referring to freedom, not\\par\r\nprice.  Our General Public Licenses are designed to make sure that you\\par\r\nhave the freedom to distribute copies of free software (and charge for\\par\r\nthem if you wish), that you receive source code or can get it if you\\par\r\nwant it, that you can change the software or use pieces of it in new\\par\r\nfree programs, and that you know you can do these things.\\par\r\n\\par\r\n  To protect your rights, we need to prevent others from denying you\\par\r\nthese rights or asking you to surrender the rights.  Therefore, you have\\par\r\ncertain responsibilities if you distribute copies of the software, or if\\par\r\nyou modify it: responsibilities to respect the freedom of others.\\par\r\n\\par\r\n  For example, if you distribute copies of such a program, whether\\par\r\ngratis or for a fee, you must pass on to the recipients the same\\par\r\nfreedoms that you received.  You must make sure that they, too, receive\\par\r\nor can get the source code.  And you must show them these terms so they\\par\r\nknow their rights.\\par\r\n\\par\r\n  Developers that use the GNU GPL protect your rights with two steps:\\par\r\n(1) assert copyright on the software, and (2) offer you this License\\par\r\ngiving you legal permission to copy, distribute and/or modify it.\\par\r\n\\par\r\n  For the developers' and authors' protection, the GPL clearly explains\\par\r\nthat there is no warranty for this free software.  For both users' and\\par\r\nauthors' sake, the GPL requires that modified versions be marked as\\par\r\nchanged, so that their problems will not be attributed erroneously to\\par\r\nauthors of previous versions.\\par\r\n\\par\r\n  Some devices are designed to deny users access to install or run\\par\r\nmodified versions of the software inside them, although the manufacturer\\par\r\ncan do so.  This is fundamentally incompatible with the aim of\\par\r\nprotecting users' freedom to change the software.  The systematic\\par\r\npattern of such abuse occurs in the area of products for individuals to\\par\r\nuse, which is precisely where it is most unacceptable.  Therefore, we\\par\r\nhave designed this version of the GPL to prohibit the practice for those\\par\r\nproducts.  If such problems arise substantially in other domains, we\\par\r\nstand ready to extend this provision to those domains in future versions\\par\r\nof the GPL, as needed to protect the freedom of users.\\par\r\n\\par\r\n  Finally, every program is threatened constantly by software patents.\\par\r\nStates should not allow patents to restrict development and use of\\par\r\nsoftware on general-purpose computers, but in those that do, we wish to\\par\r\navoid the special danger that patents applied to a free program could\\par\r\nmake it effectively proprietary.  To prevent this, the GPL assures that\\par\r\npatents cannot be used to render the program non-free.\\par\r\n\\par\r\n  The precise terms and conditions for copying, distribution and\\par\r\nmodification follow.\\par\r\n\\par\r\n                       TERMS AND CONDITIONS\\par\r\n\\par\r\n  0. Definitions.\\par\r\n\\par\r\n  \"This License\" refers to version 3 of the GNU General Public License.\\par\r\n\\par\r\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\\par\r\nworks, such as semiconductor masks.\\par\r\n\\par\r\n  \"The Program\" refers to any copyrightable work licensed under this\\par\r\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\\par\r\n\"recipients\" may be individuals or organizations.\\par\r\n\\par\r\n  To \"modify\" a work means to copy from or adapt all or part of the work\\par\r\nin a fashion requiring copyright permission, other than the making of an\\par\r\nexact copy.  The resulting work is called a \"modified version\" of the\\par\r\nearlier work or a work \"based on\" the earlier work.\\par\r\n\\par\r\n  A \"covered work\" means either the unmodified Program or a work based\\par\r\non the Program.\\par\r\n\\par\r\n  To \"propagate\" a work means to do anything with it that, without\\par\r\npermission, would make you directly or secondarily liable for\\par\r\ninfringement under applicable copyright law, except executing it on a\\par\r\ncomputer or modifying a private copy.  Propagation includes copying,\\par\r\ndistribution (with or without modification), making available to the\\par\r\npublic, and in some countries other activities as well.\\par\r\n\\par\r\n  To \"convey\" a work means any kind of propagation that enables other\\par\r\nparties to make or receive copies.  Mere interaction with a user through\\par\r\na computer network, with no transfer of a copy, is not conveying.\\par\r\n\\par\r\n  An interactive user interface displays \"Appropriate Legal Notices\"\\par\r\nto the extent that it includes a convenient and prominently visible\\par\r\nfeature that (1) displays an appropriate copyright notice, and (2)\\par\r\ntells the user that there is no warranty for the work (except to the\\par\r\nextent that warranties are provided), that licensees may convey the\\par\r\nwork under this License, and how to view a copy of this License.  If\\par\r\nthe interface presents a list of user commands or options, such as a\\par\r\nmenu, a prominent item in the list meets this criterion.\\par\r\n\\par\r\n  1. Source Code.\\par\r\n\\par\r\n  The \"source code\" for a work means the preferred form of the work\\par\r\nfor making modifications to it.  \"Object code\" means any non-source\\par\r\nform of a work.\\par\r\n\\par\r\n  A \"Standard Interface\" means an interface that either is an official\\par\r\nstandard defined by a recognized standards body, or, in the case of\\par\r\ninterfaces specified for a particular programming language, one that\\par\r\nis widely used among developers working in that language.\\par\r\n\\par\r\n  The \"System Libraries\" of an executable work include anything, other\\par\r\nthan the work as a whole, that (a) is included in the normal form of\\par\r\npackaging a Major Component, but which is not part of that Major\\par\r\nComponent, and (b) serves only to enable use of the work with that\\par\r\nMajor Component, or to implement a Standard Interface for which an\\par\r\nimplementation is available to the public in source code form.  A\\par\r\n\"Major Component\", in this context, means a major essential component\\par\r\n(kernel, window system, and so on) of the specific operating system\\par\r\n(if any) on which the executable work runs, or a compiler used to\\par\r\nproduce the work, or an object code interpreter used to run it.\\par\r\n\\par\r\n  The \"Corresponding Source\" for a work in object code form means all\\par\r\nthe source code needed to generate, install, and (for an executable\\par\r\nwork) run the object code and to modify the work, including scripts to\\par\r\ncontrol those activities.  However, it does not include the work's\\par\r\nSystem Libraries, or general-purpose tools or generally available free\\par\r\nprograms which are used unmodified in performing those activities but\\par\r\nwhich are not part of the work.  For example, Corresponding Source\\par\r\nincludes interface definition files associated with source files for\\par\r\nthe work, and the source code for shared libraries and dynamically\\par\r\nlinked subprograms that the work is specifically designed to require,\\par\r\nsuch as by intimate data communication or control flow between those\\par\r\nsubprograms and other parts of the work.\\par\r\n\\par\r\n  The Corresponding Source need not include anything that users\\par\r\ncan regenerate automatically from other parts of the Corresponding\\par\r\nSource.\\par\r\n\\par\r\n  The Corresponding Source for a work in source code form is that\\par\r\nsame work.\\par\r\n\\par\r\n  2. Basic Permissions.\\par\r\n\\par\r\n  All rights granted under this License are granted for the term of\\par\r\ncopyright on the Program, and are irrevocable provided the stated\\par\r\nconditions are met.  This License explicitly affirms your unlimited\\par\r\npermission to run the unmodified Program.  The output from running a\\par\r\ncovered work is covered by this License only if the output, given its\\par\r\ncontent, constitutes a covered work.  This License acknowledges your\\par\r\nrights of fair use or other equivalent, as provided by copyright law.\\par\r\n\\par\r\n  You may make, run and propagate covered works that you do not\\par\r\nconvey, without conditions so long as your license otherwise remains\\par\r\nin force.  You may convey covered works to others for the sole purpose\\par\r\nof having them make modifications exclusively for you, or provide you\\par\r\nwith facilities for running those works, provided that you comply with\\par\r\nthe terms of this License in conveying all material for which you do\\par\r\nnot control copyright.  Those thus making or running the covered works\\par\r\nfor you must do so exclusively on your behalf, under your direction\\par\r\nand control, on terms that prohibit them from making any copies of\\par\r\nyour copyrighted material outside their relationship with you.\\par\r\n\\par\r\n  Conveying under any other circumstances is permitted solely under\\par\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\\par\r\nmakes it unnecessary.\\par\r\n\\par\r\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\\par\r\n\\par\r\n  No covered work shall be deemed part of an effective technological\\par\r\nmeasure under any applicable law fulfilling obligations under article\\par\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\\par\r\nsimilar laws prohibiting or restricting circumvention of such\\par\r\nmeasures.\\par\r\n\\par\r\n  When you convey a covered work, you waive any legal power to forbid\\par\r\ncircumvention of technological measures to the extent such circumvention\\par\r\nis effected by exercising rights under this License with respect to\\par\r\nthe covered work, and you disclaim any intention to limit operation or\\par\r\nmodification of the work as a means of enforcing, against the work's\\par\r\nusers, your or third parties' legal rights to forbid circumvention of\\par\r\ntechnological measures.\\par\r\n\\par\r\n  4. Conveying Verbatim Copies.\\par\r\n\\par\r\n  You may convey verbatim copies of the Program's source code as you\\par\r\nreceive it, in any medium, provided that you conspicuously and\\par\r\nappropriately publish on each copy an appropriate copyright notice;\\par\r\nkeep intact all notices stating that this License and any\\par\r\nnon-permissive terms added in accord with section 7 apply to the code;\\par\r\nkeep intact all notices of the absence of any warranty; and give all\\par\r\nrecipients a copy of this License along with the Program.\\par\r\n\\par\r\n  You may charge any price or no price for each copy that you convey,\\par\r\nand you may offer support or warranty protection for a fee.\\par\r\n\\par\r\n  5. Conveying Modified Source Versions.\\par\r\n\\par\r\n  You may convey a work based on the Program, or the modifications to\\par\r\nproduce it from the Program, in the form of source code under the\\par\r\nterms of section 4, provided that you also meet all of these conditions:\\par\r\n\\par\r\n    a) The work must carry prominent notices stating that you modified\\par\r\n    it, and giving a relevant date.\\par\r\n\\par\r\n    b) The work must carry prominent notices stating that it is\\par\r\n    released under this License and any conditions added under section\\par\r\n    7.  This requirement modifies the requirement in section 4 to\\par\r\n    \"keep intact all notices\".\\par\r\n\\par\r\n    c) You must license the entire work, as a whole, under this\\par\r\n    License to anyone who comes into possession of a copy.  This\\par\r\n    License will therefore apply, along with any applicable section 7\\par\r\n    additional terms, to the whole of the work, and all its parts,\\par\r\n    regardless of how they are packaged.  This License gives no\\par\r\n    permission to license the work in any other way, but it does not\\par\r\n    invalidate such permission if you have separately received it.\\par\r\n\\par\r\n    d) If the work has interactive user interfaces, each must display\\par\r\n    Appropriate Legal Notices; however, if the Program has interactive\\par\r\n    interfaces that do not display Appropriate Legal Notices, your\\par\r\n    work need not make them do so.\\par\r\n\\par\r\n  A compilation of a covered work with other separate and independent\\par\r\nworks, which are not by their nature extensions of the covered work,\\par\r\nand which are not combined with it such as to form a larger program,\\par\r\nin or on a volume of a storage or distribution medium, is called an\\par\r\n\"aggregate\" if the compilation and its resulting copyright are not\\par\r\nused to limit the access or legal rights of the compilation's users\\par\r\nbeyond what the individual works permit.  Inclusion of a covered work\\par\r\nin an aggregate does not cause this License to apply to the other\\par\r\nparts of the aggregate.\\par\r\n\\par\r\n  6. Conveying Non-Source Forms.\\par\r\n\\par\r\n  You may convey a covered work in object code form under the terms\\par\r\nof sections 4 and 5, provided that you also convey the\\par\r\nmachine-readable Corresponding Source under the terms of this License,\\par\r\nin one of these ways:\\par\r\n\\par\r\n    a) Convey the object code in, or embodied in, a physical product\\par\r\n    (including a physical distribution medium), accompanied by the\\par\r\n    Corresponding Source fixed on a durable physical medium\\par\r\n    customarily used for software interchange.\\par\r\n\\par\r\n    b) Convey the object code in, or embodied in, a physical product\\par\r\n    (including a physical distribution medium), accompanied by a\\par\r\n    written offer, valid for at least three years and valid for as\\par\r\n    long as you offer spare parts or customer support for that product\\par\r\n    model, to give anyone who possesses the object code either (1) a\\par\r\n    copy of the Corresponding Source for all the software in the\\par\r\n    product that is covered by this License, on a durable physical\\par\r\n    medium customarily used for software interchange, for a price no\\par\r\n    more than your reasonable cost of physically performing this\\par\r\n    conveying of source, or (2) access to copy the\\par\r\n    Corresponding Source from a network server at no charge.\\par\r\n\\par\r\n    c) Convey individual copies of the object code with a copy of the\\par\r\n    written offer to provide the Corresponding Source.  This\\par\r\n    alternative is allowed only occasionally and noncommercially, and\\par\r\n    only if you received the object code with such an offer, in accord\\par\r\n    with subsection 6b.\\par\r\n\\par\r\n    d) Convey the object code by offering access from a designated\\par\r\n    place (gratis or for a charge), and offer equivalent access to the\\par\r\n    Corresponding Source in the same way through the same place at no\\par\r\n    further charge.  You need not require recipients to copy the\\par\r\n    Corresponding Source along with the object code.  If the place to\\par\r\n    copy the object code is a network server, the Corresponding Source\\par\r\n    may be on a different server (operated by you or a third party)\\par\r\n    that supports equivalent copying facilities, provided you maintain\\par\r\n    clear directions next to the object code saying where to find the\\par\r\n    Corresponding Source.  Regardless of what server hosts the\\par\r\n    Corresponding Source, you remain obligated to ensure that it is\\par\r\n    available for as long as needed to satisfy these requirements.\\par\r\n\\par\r\n    e) Convey the object code using peer-to-peer transmission, provided\\par\r\n    you inform other peers where the object code and Corresponding\\par\r\n    Source of the work are being offered to the general public at no\\par\r\n    charge under subsection 6d.\\par\r\n\\par\r\n  A separable portion of the object code, whose source code is excluded\\par\r\nfrom the Corresponding Source as a System Library, need not be\\par\r\nincluded in conveying the object code work.\\par\r\n\\par\r\n  A \"User Product\" is either (1) a \"consumer product\", which means any\\par\r\ntangible personal property which is normally used for personal, family,\\par\r\nor household purposes, or (2) anything designed or sold for incorporation\\par\r\ninto a dwelling.  In determining whether a product is a consumer product,\\par\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\\par\r\nproduct received by a particular user, \"normally used\" refers to a\\par\r\ntypical or common use of that class of product, regardless of the status\\par\r\nof the particular user or of the way in which the particular user\\par\r\nactually uses, or expects or is expected to use, the product.  A product\\par\r\nis a consumer product regardless of whether the product has substantial\\par\r\ncommercial, industrial or non-consumer uses, unless such uses represent\\par\r\nthe only significant mode of use of the product.\\par\r\n\\par\r\n  \"Installation Information\" for a User Product means any methods,\\par\r\nprocedures, authorization keys, or other information required to install\\par\r\nand execute modified versions of a covered work in that User Product from\\par\r\na modified version of its Corresponding Source.  The information must\\par\r\nsuffice to ensure that the continued functioning of the modified object\\par\r\ncode is in no case prevented or interfered with solely because\\par\r\nmodification has been made.\\par\r\n\\par\r\n  If you convey an object code work under this section in, or with, or\\par\r\nspecifically for use in, a User Product, and the conveying occurs as\\par\r\npart of a transaction in which the right of possession and use of the\\par\r\nUser Product is transferred to the recipient in perpetuity or for a\\par\r\nfixed term (regardless of how the transaction is characterized), the\\par\r\nCorresponding Source conveyed under this section must be accompanied\\par\r\nby the Installation Information.  But this requirement does not apply\\par\r\nif neither you nor any third party retains the ability to install\\par\r\nmodified object code on the User Product (for example, the work has\\par\r\nbeen installed in ROM).\\par\r\n\\par\r\n  The requirement to provide Installation Information does not include a\\par\r\nrequirement to continue to provide support service, warranty, or updates\\par\r\nfor a work that has been modified or installed by the recipient, or for\\par\r\nthe User Product in which it has been modified or installed.  Access to a\\par\r\nnetwork may be denied when the modification itself materially and\\par\r\nadversely affects the operation of the network or violates the rules and\\par\r\nprotocols for communication across the network.\\par\r\n\\par\r\n  Corresponding Source conveyed, and Installation Information provided,\\par\r\nin accord with this section must be in a format that is publicly\\par\r\ndocumented (and with an implementation available to the public in\\par\r\nsource code form), and must require no special password or key for\\par\r\nunpacking, reading or copying.\\par\r\n\\par\r\n  7. Additional Terms.\\par\r\n\\par\r\n  \"Additional permissions\" are terms that supplement the terms of this\\par\r\nLicense by making exceptions from one or more of its conditions.\\par\r\nAdditional permissions that are applicable to the entire Program shall\\par\r\nbe treated as though they were included in this License, to the extent\\par\r\nthat they are valid under applicable law.  If additional permissions\\par\r\napply only to part of the Program, that part may be used separately\\par\r\nunder those permissions, but the entire Program remains governed by\\par\r\nthis License without regard to the additional permissions.\\par\r\n\\par\r\n  When you convey a copy of a covered work, you may at your option\\par\r\nremove any additional permissions from that copy, or from any part of\\par\r\nit.  (Additional permissions may be written to require their own\\par\r\nremoval in certain cases when you modify the work.)  You may place\\par\r\nadditional permissions on material, added by you to a covered work,\\par\r\nfor which you have or can give appropriate copyright permission.\\par\r\n\\par\r\n  Notwithstanding any other provision of this License, for material you\\par\r\nadd to a covered work, you may (if authorized by the copyright holders of\\par\r\nthat material) supplement the terms of this License with terms:\\par\r\n\\par\r\n    a) Disclaiming warranty or limiting liability differently from the\\par\r\n    terms of sections 15 and 16 of this License; or\\par\r\n\\par\r\n    b) Requiring preservation of specified reasonable legal notices or\\par\r\n    author attributions in that material or in the Appropriate Legal\\par\r\n    Notices displayed by works containing it; or\\par\r\n\\par\r\n    c) Prohibiting misrepresentation of the origin of that material, or\\par\r\n    requiring that modified versions of such material be marked in\\par\r\n    reasonable ways as different from the original version; or\\par\r\n\\par\r\n    d) Limiting the use for publicity purposes of names of licensors or\\par\r\n    authors of the material; or\\par\r\n\\par\r\n    e) Declining to grant rights under trademark law for use of some\\par\r\n    trade names, trademarks, or service marks; or\\par\r\n\\par\r\n    f) Requiring indemnification of licensors and authors of that\\par\r\n    material by anyone who conveys the material (or modified versions of\\par\r\n    it) with contractual assumptions of liability to the recipient, for\\par\r\n    any liability that these contractual assumptions directly impose on\\par\r\n    those licensors and authors.\\par\r\n\\par\r\n  All other non-permissive additional terms are considered \"further\\par\r\nrestrictions\" within the meaning of section 10.  If the Program as you\\par\r\nreceived it, or any part of it, contains a notice stating that it is\\par\r\ngoverned by this License along with a term that is a further\\par\r\nrestriction, you may remove that term.  If a license document contains\\par\r\na further restriction but permits relicensing or conveying under this\\par\r\nLicense, you may add to a covered work material governed by the terms\\par\r\nof that license document, provided that the further restriction does\\par\r\nnot survive such relicensing or conveying.\\par\r\n\\par\r\n  If you add terms to a covered work in accord with this section, you\\par\r\nmust place, in the relevant source files, a statement of the\\par\r\nadditional terms that apply to those files, or a notice indicating\\par\r\nwhere to find the applicable terms.\\par\r\n\\par\r\n  Additional terms, permissive or non-permissive, may be stated in the\\par\r\nform of a separately written license, or stated as exceptions;\\par\r\nthe above requirements apply either way.\\par\r\n\\par\r\n  8. Termination.\\par\r\n\\par\r\n  You may not propagate or modify a covered work except as expressly\\par\r\nprovided under this License.  Any attempt otherwise to propagate or\\par\r\nmodify it is void, and will automatically terminate your rights under\\par\r\nthis License (including any patent licenses granted under the third\\par\r\nparagraph of section 11).\\par\r\n\\par\r\n  However, if you cease all violation of this License, then your\\par\r\nlicense from a particular copyright holder is reinstated (a)\\par\r\nprovisionally, unless and until the copyright holder explicitly and\\par\r\nfinally terminates your license, and (b) permanently, if the copyright\\par\r\nholder fails to notify you of the violation by some reasonable means\\par\r\nprior to 60 days after the cessation.\\par\r\n\\par\r\n  Moreover, your license from a particular copyright holder is\\par\r\nreinstated permanently if the copyright holder notifies you of the\\par\r\nviolation by some reasonable means, this is the first time you have\\par\r\nreceived notice of violation of this License (for any work) from that\\par\r\ncopyright holder, and you cure the violation prior to 30 days after\\par\r\nyour receipt of the notice.\\par\r\n\\par\r\n  Termination of your rights under this section does not terminate the\\par\r\nlicenses of parties who have received copies or rights from you under\\par\r\nthis License.  If your rights have been terminated and not permanently\\par\r\nreinstated, you do not qualify to receive new licenses for the same\\par\r\nmaterial under section 10.\\par\r\n\\par\r\n  9. Acceptance Not Required for Having Copies.\\par\r\n\\par\r\n  You are not required to accept this License in order to receive or\\par\r\nrun a copy of the Program.  Ancillary propagation of a covered work\\par\r\noccurring solely as a consequence of using peer-to-peer transmission\\par\r\nto receive a copy likewise does not require acceptance.  However,\\par\r\nnothing other than this License grants you permission to propagate or\\par\r\nmodify any covered work.  These actions infringe copyright if you do\\par\r\nnot accept this License.  Therefore, by modifying or propagating a\\par\r\ncovered work, you indicate your acceptance of this License to do so.\\par\r\n\\par\r\n  10. Automatic Licensing of Downstream Recipients.\\par\r\n\\par\r\n  Each time you convey a covered work, the recipient automatically\\par\r\nreceives a license from the original licensors, to run, modify and\\par\r\npropagate that work, subject to this License.  You are not responsible\\par\r\nfor enforcing compliance by third parties with this License.\\par\r\n\\par\r\n  An \"entity transaction\" is a transaction transferring control of an\\par\r\norganization, or substantially all assets of one, or subdividing an\\par\r\norganization, or merging organizations.  If propagation of a covered\\par\r\nwork results from an entity transaction, each party to that\\par\r\ntransaction who receives a copy of the work also receives whatever\\par\r\nlicenses to the work the party's predecessor in interest had or could\\par\r\ngive under the previous paragraph, plus a right to possession of the\\par\r\nCorresponding Source of the work from the predecessor in interest, if\\par\r\nthe predecessor has it or can get it with reasonable efforts.\\par\r\n\\par\r\n  You may not impose any further restrictions on the exercise of the\\par\r\nrights granted or affirmed under this License.  For example, you may\\par\r\nnot impose a license fee, royalty, or other charge for exercise of\\par\r\nrights granted under this License, and you may not initiate litigation\\par\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\\par\r\nany patent claim is infringed by making, using, selling, offering for\\par\r\nsale, or importing the Program or any portion of it.\\par\r\n\\par\r\n  11. Patents.\\par\r\n\\par\r\n  A \"contributor\" is a copyright holder who authorizes use under this\\par\r\nLicense of the Program or a work on which the Program is based.  The\\par\r\nwork thus licensed is called the contributor's \"contributor version\".\\par\r\n\\par\r\n  A contributor's \"essential patent claims\" are all patent claims\\par\r\nowned or controlled by the contributor, whether already acquired or\\par\r\nhereafter acquired, that would be infringed by some manner, permitted\\par\r\nby this License, of making, using, or selling its contributor version,\\par\r\nbut do not include claims that would be infringed only as a\\par\r\nconsequence of further modification of the contributor version.  For\\par\r\npurposes of this definition, \"control\" includes the right to grant\\par\r\npatent sublicenses in a manner consistent with the requirements of\\par\r\nthis License.\\par\r\n\\par\r\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\\par\r\npatent license under the contributor's essential patent claims, to\\par\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\\par\r\npropagate the contents of its contributor version.\\par\r\n\\par\r\n  In the following three paragraphs, a \"patent license\" is any express\\par\r\nagreement or commitment, however denominated, not to enforce a patent\\par\r\n(such as an express permission to practice a patent or covenant not to\\par\r\nsue for patent infringement).  To \"grant\" such a patent license to a\\par\r\nparty means to make such an agreement or commitment not to enforce a\\par\r\npatent against the party.\\par\r\n\\par\r\n  If you convey a covered work, knowingly relying on a patent license,\\par\r\nand the Corresponding Source of the work is not available for anyone\\par\r\nto copy, free of charge and under the terms of this License, through a\\par\r\npublicly available network server or other readily accessible means,\\par\r\nthen you must either (1) cause the Corresponding Source to be so\\par\r\navailable, or (2) arrange to deprive yourself of the benefit of the\\par\r\npatent license for this particular work, or (3) arrange, in a manner\\par\r\nconsistent with the requirements of this License, to extend the patent\\par\r\nlicense to downstream recipients.  \"Knowingly relying\" means you have\\par\r\nactual knowledge that, but for the patent license, your conveying the\\par\r\ncovered work in a country, or your recipient's use of the covered work\\par\r\nin a country, would infringe one or more identifiable patents in that\\par\r\ncountry that you have reason to believe are valid.\\par\r\n\\par\r\n  If, pursuant to or in connection with a single transaction or\\par\r\narrangement, you convey, or propagate by procuring conveyance of, a\\par\r\ncovered work, and grant a patent license to some of the parties\\par\r\nreceiving the covered work authorizing them to use, propagate, modify\\par\r\nor convey a specific copy of the covered work, then the patent license\\par\r\nyou grant is automatically extended to all recipients of the covered\\par\r\nwork and works based on it.\\par\r\n\\par\r\n  A patent license is \"discriminatory\" if it does not include within\\par\r\nthe scope of its coverage, prohibits the exercise of, or is\\par\r\nconditioned on the non-exercise of one or more of the rights that are\\par\r\nspecifically granted under this License.  You may not convey a covered\\par\r\nwork if you are a party to an arrangement with a third party that is\\par\r\nin the business of distributing software, under which you make payment\\par\r\nto the third party based on the extent of your activity of conveying\\par\r\nthe work, and under which the third party grants, to any of the\\par\r\nparties who would receive the covered work from you, a discriminatory\\par\r\npatent license (a) in connection with copies of the covered work\\par\r\nconveyed by you (or copies made from those copies), or (b) primarily\\par\r\nfor and in connection with specific products or compilations that\\par\r\ncontain the covered work, unless you entered into that arrangement,\\par\r\nor that patent license was granted, prior to 28 March 2007.\\par\r\n\\par\r\n  Nothing in this License shall be construed as excluding or limiting\\par\r\nany implied license or other defenses to infringement that may\\par\r\notherwise be available to you under applicable patent law.\\par\r\n\\par\r\n  12. No Surrender of Others' Freedom.\\par\r\n\\par\r\n  If conditions are imposed on you (whether by court order, agreement or\\par\r\notherwise) that contradict the conditions of this License, they do not\\par\r\nexcuse you from the conditions of this License.  If you cannot convey a\\par\r\ncovered work so as to satisfy simultaneously your obligations under this\\par\r\nLicense and any other pertinent obligations, then as a consequence you may\\par\r\nnot convey it at all.  For example, if you agree to terms that obligate you\\par\r\nto collect a royalty for further conveying from those to whom you convey\\par\r\nthe Program, the only way you could satisfy both those terms and this\\par\r\nLicense would be to refrain entirely from conveying the Program.\\par\r\n\\par\r\n  13. Use with the GNU Affero General Public License.\\par\r\n\\par\r\n  Notwithstanding any other provision of this License, you have\\par\r\npermission to link or combine any covered work with a work licensed\\par\r\nunder version 3 of the GNU Affero General Public License into a single\\par\r\ncombined work, and to convey the resulting work.  The terms of this\\par\r\nLicense will continue to apply to the part which is the covered work,\\par\r\nbut the special requirements of the GNU Affero General Public License,\\par\r\nsection 13, concerning interaction through a network will apply to the\\par\r\ncombination as such.\\par\r\n\\par\r\n  14. Revised Versions of this License.\\par\r\n\\par\r\n  The Free Software Foundation may publish revised and/or new versions of\\par\r\nthe GNU General Public License from time to time.  Such new versions will\\par\r\nbe similar in spirit to the present version, but may differ in detail to\\par\r\naddress new problems or concerns.\\par\r\n\\par\r\n  Each version is given a distinguishing version number.  If the\\par\r\nProgram specifies that a certain numbered version of the GNU General\\par\r\nPublic License \"or any later version\" applies to it, you have the\\par\r\noption of following the terms and conditions either of that numbered\\par\r\nversion or of any later version published by the Free Software\\par\r\nFoundation.  If the Program does not specify a version number of the\\par\r\nGNU General Public License, you may choose any version ever published\\par\r\nby the Free Software Foundation.\\par\r\n\\par\r\n  If the Program specifies that a proxy can decide which future\\par\r\nversions of the GNU General Public License can be used, that proxy's\\par\r\npublic statement of acceptance of a version permanently authorizes you\\par\r\nto choose that version for the Program.\\par\r\n\\par\r\n  Later license versions may give you additional or different\\par\r\npermissions.  However, no additional obligations are imposed on any\\par\r\nauthor or copyright holder as a result of your choosing to follow a\\par\r\nlater version.\\par\r\n\\par\r\n  15. Disclaimer of Warranty.\\par\r\n\\par\r\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\\par\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\\par\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\\par\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\\par\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\\par\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\\par\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\\par\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\\par\r\n\\par\r\n  16. Limitation of Liability.\\par\r\n\\par\r\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\\par\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\\par\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\\par\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\\par\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\\par\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\\par\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\\par\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\\par\r\nSUCH DAMAGES.\\par\r\n\\par\r\n  17. Interpretation of Sections 15 and 16.\\par\r\n\\par\r\n  If the disclaimer of warranty and limitation of liability provided\\par\r\nabove cannot be given local legal effect according to their terms,\\par\r\nreviewing courts shall apply local law that most closely approximates\\par\r\nan absolute waiver of all civil liability in connection with the\\par\r\nProgram, unless a warranty or assumption of liability accompanies a\\par\r\ncopy of the Program in return for a fee.\\par\r\n\\par\r\n                     END OF TERMS AND CONDITIONS\\par\r\n\\par\r\n            How to Apply These Terms to Your New Programs\\par\r\n\\par\r\n  If you develop a new program, and you want it to be of the greatest\\par\r\npossible use to the public, the best way to achieve this is to make it\\par\r\nfree software which everyone can redistribute and change under these terms.\\par\r\n\\par\r\n  To do so, attach the following notices to the program.  It is safest\\par\r\nto attach them to the start of each source file to most effectively\\par\r\nstate the exclusion of warranty; and each file should have at least\\par\r\nthe \"copyright\" line and a pointer to where the full notice is found.\\par\r\n\\par\r\n    <one line to give the program's name and a brief idea of what it does.>\\par\r\n    Copyright (C) <year>  <name of author>\\par\r\n\\par\r\n    This program is free software: you can redistribute it and/or modify\\par\r\n    it under the terms of the GNU General Public License as published by\\par\r\n    the Free Software Foundation, either version 3 of the License, or\\par\r\n    (at your option) any later version.\\par\r\n\\par\r\n    This program is distributed in the hope that it will be useful,\\par\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\\par\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\par\r\n    GNU General Public License for more details.\\par\r\n\\par\r\n    You should have received a copy of the GNU General Public License\\par\r\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\\par\r\n\\par\r\nAlso add information on how to contact you by electronic and paper mail.\\par\r\n\\par\r\n  If the program does terminal interaction, make it output a short\\par\r\nnotice like this when it starts in an interactive mode:\\par\r\n\\par\r\n    <program>  Copyright (C) <year>  <name of author>\\par\r\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\\par\r\n    This is free software, and you are welcome to redistribute it\\par\r\n    under certain conditions; type `show c' for details.\\par\r\n\\par\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\\par\r\nparts of the General Public License.  Of course, your program's commands\\par\r\nmight be different; for a GUI interface, you would use an \"about box\".\\par\r\n\\par\r\n  You should also get your employer (if you work as a programmer) or school,\\par\r\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\\par\r\nFor more information on this, and how to apply and follow the GNU GPL, see\\par\r\n<http://www.gnu.org/licenses/>.\\par\r\n\\par\r\n  The GNU General Public License does not permit incorporating your program\\par\r\ninto proprietary programs.  If your program is a subroutine library, you\\par\r\nmay consider it more useful to permit linking proprietary applications with\\par\r\nthe library.  If this is what you want to do, use the GNU Lesser General\\par\r\nPublic License instead of this License.  But first, please read\\par\r\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\\par\r\n\\par\r\n}\r\n\u0000"
  },
  {
    "path": "license.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\r\n                       Version 3, 29 June 2007\r\n\r\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n                            Preamble\r\n\r\n  The GNU General Public License is a free, copyleft license for\r\nsoftware and other kinds of works.\r\n\r\n  The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nthe GNU General Public License is intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.  We, the Free Software Foundation, use the\r\nGNU General Public License for most of our software; it applies also to\r\nany other work released this way by its authors.  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.\r\n\r\n  To protect your rights, we need to prevent others from denying you\r\nthese rights or asking you to surrender the rights.  Therefore, you have\r\ncertain responsibilities if you distribute copies of the software, or if\r\nyou modify it: responsibilities to respect the freedom of others.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must pass on to the recipients the same\r\nfreedoms that you received.  You must make sure that they, too, receive\r\nor can get the source code.  And you must show them these terms so they\r\nknow their rights.\r\n\r\n  Developers that use the GNU GPL protect your rights with two steps:\r\n(1) assert copyright on the software, and (2) offer you this License\r\ngiving you legal permission to copy, distribute and/or modify it.\r\n\r\n  For the developers' and authors' protection, the GPL clearly explains\r\nthat there is no warranty for this free software.  For both users' and\r\nauthors' sake, the GPL requires that modified versions be marked as\r\nchanged, so that their problems will not be attributed erroneously to\r\nauthors of previous versions.\r\n\r\n  Some devices are designed to deny users access to install or run\r\nmodified versions of the software inside them, although the manufacturer\r\ncan do so.  This is fundamentally incompatible with the aim of\r\nprotecting users' freedom to change the software.  The systematic\r\npattern of such abuse occurs in the area of products for individuals to\r\nuse, which is precisely where it is most unacceptable.  Therefore, we\r\nhave designed this version of the GPL to prohibit the practice for those\r\nproducts.  If such problems arise substantially in other domains, we\r\nstand ready to extend this provision to those domains in future versions\r\nof the GPL, as needed to protect the freedom of users.\r\n\r\n  Finally, every program is threatened constantly by software patents.\r\nStates should not allow patents to restrict development and use of\r\nsoftware on general-purpose computers, but in those that do, we wish to\r\navoid the special danger that patents applied to a free program could\r\nmake it effectively proprietary.  To prevent this, the GPL assures that\r\npatents cannot be used to render the program non-free.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n                       TERMS AND CONDITIONS\r\n\r\n  0. Definitions.\r\n\r\n  \"This License\" refers to version 3 of the GNU General Public License.\r\n\r\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.\r\n\r\n  \"The Program\" refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\r\n\"recipients\" may be individuals or organizations.\r\n\r\n  To \"modify\" a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a \"modified version\" of the\r\nearlier work or a work \"based on\" the earlier work.\r\n\r\n  A \"covered work\" means either the unmodified Program or a work based\r\non the Program.\r\n\r\n  To \"propagate\" a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.\r\n\r\n  To \"convey\" a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.\r\n\r\n  An interactive user interface displays \"Appropriate Legal Notices\"\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.\r\n\r\n  1. Source Code.\r\n\r\n  The \"source code\" for a work means the preferred form of the work\r\nfor making modifications to it.  \"Object code\" means any non-source\r\nform of a work.\r\n\r\n  A \"Standard Interface\" means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.\r\n\r\n  The \"System Libraries\" of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n\"Major Component\", in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.\r\n\r\n  The \"Corresponding Source\" for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.\r\n\r\n  The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.\r\n\r\n  The Corresponding Source for a work in source code form is that\r\nsame work.\r\n\r\n  2. Basic Permissions.\r\n\r\n  All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.\r\n\r\n  You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.\r\n\r\n  Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.\r\n\r\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\r\n\r\n  No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.\r\n\r\n  When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.\r\n\r\n  4. Conveying Verbatim Copies.\r\n\r\n  You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.\r\n\r\n  You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.\r\n\r\n  5. Conveying Modified Source Versions.\r\n\r\n  You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:\r\n\r\n    a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.\r\n\r\n    b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    \"keep intact all notices\".\r\n\r\n    c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.\r\n\r\n    d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.\r\n\r\n  A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n\"aggregate\" if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.\r\n\r\n  6. Conveying Non-Source Forms.\r\n\r\n  You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:\r\n\r\n    a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.\r\n\r\n    b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.\r\n\r\n    c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.\r\n\r\n    d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.\r\n\r\n    e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.\r\n\r\n  A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.\r\n\r\n  A \"User Product\" is either (1) a \"consumer product\", which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, \"normally used\" refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.\r\n\r\n  \"Installation Information\" for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.\r\n\r\n  If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).\r\n\r\n  The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.\r\n\r\n  Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.\r\n\r\n  7. Additional Terms.\r\n\r\n  \"Additional permissions\" are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.\r\n\r\n  When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.\r\n\r\n  Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:\r\n\r\n    a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or\r\n\r\n    b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or\r\n\r\n    c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or\r\n\r\n    d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or\r\n\r\n    e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or\r\n\r\n    f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.\r\n\r\n  All other non-permissive additional terms are considered \"further\r\nrestrictions\" within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.\r\n\r\n  If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.\r\n\r\n  Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.\r\n\r\n  8. Termination.\r\n\r\n  You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).\r\n\r\n  However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.\r\n\r\n  Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.\r\n\r\n  Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.\r\n\r\n  9. Acceptance Not Required for Having Copies.\r\n\r\n  You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.\r\n\r\n  10. Automatic Licensing of Downstream Recipients.\r\n\r\n  Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.\r\n\r\n  An \"entity transaction\" is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.\r\n\r\n  You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.\r\n\r\n  11. Patents.\r\n\r\n  A \"contributor\" is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's \"contributor version\".\r\n\r\n  A contributor's \"essential patent claims\" are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, \"control\" includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.\r\n\r\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.\r\n\r\n  In the following three paragraphs, a \"patent license\" is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To \"grant\" such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.\r\n\r\n  If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  \"Knowingly relying\" means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.\r\n\r\n  If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.\r\n\r\n  A patent license is \"discriminatory\" if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.\r\n\r\n  Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.\r\n\r\n  12. No Surrender of Others' Freedom.\r\n\r\n  If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.\r\n\r\n  13. Use with the GNU Affero General Public License.\r\n\r\n  Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU Affero General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the special requirements of the GNU Affero General Public License,\r\nsection 13, concerning interaction through a network will apply to the\r\ncombination as such.\r\n\r\n  14. Revised Versions of this License.\r\n\r\n  The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\n  Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU General\r\nPublic License \"or any later version\" applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU General Public License, you may choose any version ever published\r\nby the Free Software Foundation.\r\n\r\n  If the Program specifies that a proxy can decide which future\r\nversions of the GNU General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.\r\n\r\n  Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.\r\n\r\n  15. Disclaimer of Warranty.\r\n\r\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. Limitation of Liability.\r\n\r\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.\r\n\r\n  17. Interpretation of Sections 15 and 16.\r\n\r\n  If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n            How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\n  If the program does terminal interaction, make it output a short\r\nnotice like this when it starts in an interactive mode:\r\n\r\n    <program>  Copyright (C) <year>  <name of author>\r\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n    This is free software, and you are welcome to redistribute it\r\n    under certain conditions; type `show c' for details.\r\n\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, your program's commands\r\nmight be different; for a GUI interface, you would use an \"about box\".\r\n\r\n  You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU GPL, see\r\n<http://www.gnu.org/licenses/>.\r\n\r\n  The GNU General Public License does not permit incorporating your program\r\ninto proprietary programs.  If your program is a subroutine library, you\r\nmay consider it more useful to permit linking proprietary applications with\r\nthe library.  If this is what you want to do, use the GNU Lesser General\r\nPublic License instead of this License.  But first, please read\r\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\r\n"
  },
  {
    "path": "makelinks.bat",
    "content": "@echo off\r\n\r\nset path_w32d=%~dp0bin\\win32\\debug\\\r\nset path_w32r=%~dp0bin\\win32\\release\\\r\nset path_w32p=%~dp0bin\\win32\\releasep\\\r\nset path_x64d=%~dp0bin\\x64\\debug\\\r\nset path_x64r=%~dp0bin\\x64\\release\\\r\nset path_x64p=%~dp0bin\\x64\\releasep\\\r\n\r\nset path_trans_l=%~dp0etc\\translations\\software\\\r\nset path_trans_h=%~dp0etc\\translations\\help\\\r\nset path_cdrtools=%~dp0dep\\cdrtools\\\r\nset path_sndfile=%~dp0dep\\libsndfile\\\r\nset path_smoke=%~dp0dep\\\r\nset path_help=%~dp0doc\\english\\\r\n\r\nrem make sure directories exists.\r\nif not exist %path_w32d%codecs\\ mkdir %path_w32d%codecs\\\r\nif not exist %path_w32r%codecs\\ mkdir %path_w32r%codecs\\\r\nif not exist %path_w32p%codecs\\ mkdir %path_w32p%codecs\\\r\nif not exist %path_x64d%codecs\\ mkdir %path_x64d%codecs\\\r\nif not exist %path_x64r%codecs\\ mkdir %path_x64r%codecs\\\r\nif not exist %path_x64p%codecs\\ mkdir %path_x64p%codecs\\\r\nif not exist %path_w32d%languages\\ mkdir %path_w32d%languages\\\r\nif not exist %path_w32r%languages\\ mkdir %path_w32r%languages\\\r\nif not exist %path_w32p%languages\\ mkdir %path_w32p%languages\\\r\nif not exist %path_x64d%languages\\ mkdir %path_x64d%languages\\\r\nif not exist %path_x64r%languages\\ mkdir %path_x64r%languages\\\r\nif not exist %path_x64p%languages\\ mkdir %path_x64p%languages\\\r\n\r\nrem make symbolic links to cdrtools binaries.\r\nif not exist %path_w32d%cdrtools mklink /D %path_w32d%cdrtools %path_cdrtools%\r\nif not exist %path_w32r%cdrtools mklink /D %path_w32r%cdrtools %path_cdrtools%\r\nif not exist %path_w32p%cdrtools mklink /D %path_w32p%cdrtools %path_cdrtools%\r\nif not exist %path_x64d%cdrtools mklink /D %path_x64d%cdrtools %path_cdrtools%\r\nif not exist %path_x64r%cdrtools mklink /D %path_x64r%cdrtools %path_cdrtools%\r\nif not exist %path_x64p%cdrtools mklink /D %path_x64p%cdrtools %path_cdrtools%\r\n\r\nrem make symbolic links to libsndfile libraries.\r\nif not exist %path_w32d%codecs\\libsndfile-1.dll mklink %path_w32d%codecs\\libsndfile-1.dll %path_sndfile%win32\\libsndfile-1.dll\r\nif not exist %path_w32r%codecs\\libsndfile-1.dll mklink %path_w32r%codecs\\libsndfile-1.dll %path_sndfile%win32\\libsndfile-1.dll\r\nif not exist %path_w32p%codecs\\libsndfile-1.dll mklink %path_w32p%codecs\\libsndfile-1.dll %path_sndfile%win32\\libsndfile-1.dll\r\nif not exist %path_x64d%codecs\\libsndfile-1.dll mklink %path_x64d%codecs\\libsndfile-1.dll %path_sndfile%x64\\libsndfile-1.dll\r\nif not exist %path_x64r%codecs\\libsndfile-1.dll mklink %path_x64r%codecs\\libsndfile-1.dll %path_sndfile%x64\\libsndfile-1.dll\r\nif not exist %path_x64p%codecs\\libsndfile-1.dll mklink %path_x64p%codecs\\libsndfile-1.dll %path_sndfile%x64\\libsndfile-1.dll\r\n\r\nrem make symbolic links to smoke program.\r\nif not exist %path_w32d%smoke.exe mklink %path_w32d%smoke.exe %path_smoke%smoke.exe\r\nif not exist %path_w32r%smoke.exe mklink %path_w32r%smoke.exe %path_smoke%smoke.exe\r\nif not exist %path_w32p%smoke.exe mklink %path_w32p%smoke.exe %path_smoke%smoke.exe\r\nif not exist %path_x64d%smoke.exe mklink %path_x64d%smoke.exe %path_smoke%smoke.exe\r\nif not exist %path_x64r%smoke.exe mklink %path_x64r%smoke.exe %path_smoke%smoke.exe\r\nif not exist %path_x64p%smoke.exe mklink %path_x64p%smoke.exe %path_smoke%smoke.exe\r\n\r\nrem make symbolic links to help file.\r\nif not exist %path_w32d%infrarecorder.chm mklink %path_w32d%infrarecorder.chm %path_help%infrarecorder.chm\r\nif not exist %path_w32r%infrarecorder.chm mklink %path_w32r%infrarecorder.chm %path_help%infrarecorder.chm\r\nif not exist %path_w32p%infrarecorder.chm mklink %path_w32p%infrarecorder.chm %path_help%infrarecorder.chm\r\nif not exist %path_x64d%infrarecorder.chm mklink %path_x64d%infrarecorder.chm %path_help%infrarecorder.chm\r\nif not exist %path_x64r%infrarecorder.chm mklink %path_x64r%infrarecorder.chm %path_help%infrarecorder.chm\r\nif not exist %path_x64p%infrarecorder.chm mklink %path_x64p%infrarecorder.chm %path_help%infrarecorder.chm\r\n\r\nrem make symbolic links to translations.\r\nif not exist %path_w32d%languages\\albanian.irl             mklink %path_w32d%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_w32d%languages\\arabic.irl               mklink %path_w32d%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_w32d%languages\\armenian.irl             mklink %path_w32d%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_w32d%languages\\basque.irl               mklink %path_w32d%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_w32d%languages\\bosnian.irl              mklink %path_w32d%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_w32d%languages\\bulgarian.irl            mklink %path_w32d%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_w32d%languages\\catalan.irl              mklink %path_w32d%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_w32d%languages\\chinese-simplified.irl   mklink %path_w32d%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_w32d%languages\\chinese-traditional.irl  mklink %path_w32d%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_w32d%languages\\chuvash.irl              mklink %path_w32d%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_w32d%languages\\croatian.irl             mklink %path_w32d%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_w32d%languages\\czech.irl                mklink %path_w32d%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_w32d%languages\\danish.irl               mklink %path_w32d%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_w32d%languages\\dutch.irl                mklink %path_w32d%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_w32d%languages\\estonian.irl             mklink %path_w32d%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_w32d%languages\\farsi.irl                mklink %path_w32d%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_w32d%languages\\finnish.irl              mklink %path_w32d%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_w32d%languages\\french.irl               mklink %path_w32d%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_w32d%languages\\galician.irl             mklink %path_w32d%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_w32d%languages\\german.irl               mklink %path_w32d%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_w32d%languages\\georgian.irl             mklink %path_w32d%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_w32d%languages\\greek.irl                mklink %path_w32d%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_w32d%languages\\hebrew.irl               mklink %path_w32d%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_w32d%languages\\hungarian.irl            mklink %path_w32d%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_w32d%languages\\indonesian.irl           mklink %path_w32d%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_w32d%languages\\italian.irl              mklink %path_w32d%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_w32d%languages\\japanese.irl             mklink %path_w32d%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_w32d%languages\\korean.irl               mklink %path_w32d%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_w32d%languages\\latvian.irl              mklink %path_w32d%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_w32d%languages\\lithuanian.irl           mklink %path_w32d%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_w32d%languages\\macedonian.irl           mklink %path_w32d%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_w32d%languages\\norwegian.irl            mklink %path_w32d%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_w32d%languages\\polish.irl               mklink %path_w32d%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_w32d%languages\\portuguese.irl           mklink %path_w32d%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_w32d%languages\\portuguese-brazilian.irl mklink %path_w32d%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_w32d%languages\\romanian.irl             mklink %path_w32d%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_w32d%languages\\russian.irl              mklink %path_w32d%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_w32d%languages\\serbian-cyrillic.irl     mklink %path_w32d%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_w32d%languages\\serbian-latin.irl        mklink %path_w32d%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_w32d%languages\\slovak.irl               mklink %path_w32d%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_w32d%languages\\slovenian.irl            mklink %path_w32d%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_w32d%languages\\spanish.irl              mklink %path_w32d%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_w32d%languages\\swedish.irl              mklink %path_w32d%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_w32d%languages\\thai.irl                 mklink %path_w32d%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_w32d%languages\\turkish.irl              mklink %path_w32d%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_w32d%languages\\ukrainian.irl            mklink %path_w32d%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_w32d%languages\\valencian.irl            mklink %path_w32d%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_w32d%languages\\vietnamese.irl           mklink %path_w32d%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\nif not exist %path_w32r%languages\\albanian.irl             mklink %path_w32r%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_w32r%languages\\arabic.irl               mklink %path_w32r%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_w32r%languages\\armenian.irl             mklink %path_w32r%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_w32r%languages\\basque.irl               mklink %path_w32r%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_w32r%languages\\bosnian.irl              mklink %path_w32r%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_w32r%languages\\bulgarian.irl            mklink %path_w32r%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_w32r%languages\\catalan.irl              mklink %path_w32r%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_w32r%languages\\chinese-simplified.irl   mklink %path_w32r%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_w32r%languages\\chinese-traditional.irl  mklink %path_w32r%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_w32r%languages\\chuvash.irl              mklink %path_w32r%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_w32r%languages\\croatian.irl             mklink %path_w32r%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_w32r%languages\\czech.irl                mklink %path_w32r%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_w32r%languages\\danish.irl               mklink %path_w32r%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_w32r%languages\\dutch.irl                mklink %path_w32r%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_w32r%languages\\estonian.irl             mklink %path_w32r%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_w32r%languages\\farsi.irl                mklink %path_w32r%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_w32r%languages\\finnish.irl              mklink %path_w32r%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_w32r%languages\\french.irl               mklink %path_w32r%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_w32r%languages\\galician.irl             mklink %path_w32r%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_w32r%languages\\german.irl               mklink %path_w32r%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_w32r%languages\\georgian.irl             mklink %path_w32r%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_w32r%languages\\greek.irl                mklink %path_w32r%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_w32r%languages\\hebrew.irl               mklink %path_w32r%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_w32r%languages\\hungarian.irl            mklink %path_w32r%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_w32r%languages\\indonesian.irl           mklink %path_w32r%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_w32r%languages\\italian.irl              mklink %path_w32r%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_w32r%languages\\japanese.irl             mklink %path_w32r%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_w32r%languages\\korean.irl               mklink %path_w32r%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_w32r%languages\\latvian.irl              mklink %path_w32r%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_w32r%languages\\lithuanian.irl           mklink %path_w32r%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_w32r%languages\\macedonian.irl           mklink %path_w32r%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_w32r%languages\\norwegian.irl            mklink %path_w32r%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_w32r%languages\\polish.irl               mklink %path_w32r%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_w32r%languages\\portuguese.irl           mklink %path_w32r%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_w32r%languages\\portuguese-brazilian.irl mklink %path_w32r%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_w32r%languages\\romanian.irl             mklink %path_w32r%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_w32r%languages\\russian.irl              mklink %path_w32r%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_w32r%languages\\serbian-cyrillic.irl     mklink %path_w32r%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_w32r%languages\\serbian-latin.irl        mklink %path_w32r%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_w32r%languages\\slovak.irl               mklink %path_w32r%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_w32r%languages\\slovenian.irl            mklink %path_w32r%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_w32r%languages\\spanish.irl              mklink %path_w32r%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_w32r%languages\\swedish.irl              mklink %path_w32r%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_w32r%languages\\thai.irl                 mklink %path_w32r%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_w32r%languages\\turkish.irl              mklink %path_w32r%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_w32r%languages\\ukrainian.irl            mklink %path_w32r%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_w32r%languages\\valencian.irl            mklink %path_w32r%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_w32r%languages\\vietnamese.irl           mklink %path_w32r%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\nif not exist %path_w32p%languages\\albanian.irl             mklink %path_w32p%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_w32p%languages\\arabic.irl               mklink %path_w32p%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_w32p%languages\\armenian.irl             mklink %path_w32p%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_w32p%languages\\basque.irl               mklink %path_w32p%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_w32p%languages\\bosnian.irl              mklink %path_w32p%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_w32p%languages\\bulgarian.irl            mklink %path_w32p%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_w32p%languages\\catalan.irl              mklink %path_w32p%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_w32p%languages\\chinese-simplified.irl   mklink %path_w32p%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_w32p%languages\\chinese-traditional.irl  mklink %path_w32p%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_w32p%languages\\chuvash.irl              mklink %path_w32p%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_w32p%languages\\croatian.irl             mklink %path_w32p%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_w32p%languages\\czech.irl                mklink %path_w32p%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_w32p%languages\\danish.irl               mklink %path_w32p%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_w32p%languages\\dutch.irl                mklink %path_w32p%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_w32p%languages\\estonian.irl             mklink %path_w32p%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_w32p%languages\\farsi.irl                mklink %path_w32p%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_w32p%languages\\finnish.irl              mklink %path_w32p%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_w32p%languages\\french.irl               mklink %path_w32p%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_w32p%languages\\galician.irl             mklink %path_w32p%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_w32p%languages\\german.irl               mklink %path_w32p%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_w32p%languages\\georgian.irl             mklink %path_w32p%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_w32p%languages\\greek.irl                mklink %path_w32p%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_w32p%languages\\hebrew.irl               mklink %path_w32p%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_w32p%languages\\hungarian.irl            mklink %path_w32p%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_w32p%languages\\indonesian.irl           mklink %path_w32p%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_w32p%languages\\italian.irl              mklink %path_w32p%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_w32p%languages\\japanese.irl             mklink %path_w32p%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_w32p%languages\\korean.irl               mklink %path_w32p%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_w32p%languages\\latvian.irl              mklink %path_w32p%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_w32p%languages\\lithuanian.irl           mklink %path_w32p%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_w32p%languages\\macedonian.irl           mklink %path_w32p%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_w32p%languages\\norwegian.irl            mklink %path_w32p%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_w32p%languages\\polish.irl               mklink %path_w32p%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_w32p%languages\\portuguese.irl           mklink %path_w32p%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_w32p%languages\\portuguese-brazilian.irl mklink %path_w32p%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_w32p%languages\\romanian.irl             mklink %path_w32p%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_w32p%languages\\russian.irl              mklink %path_w32p%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_w32p%languages\\serbian-cyrillic.irl     mklink %path_w32p%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_w32p%languages\\serbian-latin.irl        mklink %path_w32p%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_w32p%languages\\slovak.irl               mklink %path_w32p%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_w32p%languages\\slovenian.irl            mklink %path_w32p%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_w32p%languages\\spanish.irl              mklink %path_w32p%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_w32p%languages\\swedish.irl              mklink %path_w32p%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_w32p%languages\\thai.irl                 mklink %path_w32p%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_w32p%languages\\turkish.irl              mklink %path_w32p%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_w32p%languages\\ukrainian.irl            mklink %path_w32p%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_w32p%languages\\valencian.irl            mklink %path_w32p%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_w32p%languages\\vietnamese.irl           mklink %path_w32p%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\nif not exist %path_x64d%languages\\albanian.irl             mklink %path_x64d%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_x64d%languages\\arabic.irl               mklink %path_x64d%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_x64d%languages\\armenian.irl             mklink %path_x64d%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_x64d%languages\\basque.irl               mklink %path_x64d%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_x64d%languages\\bosnian.irl              mklink %path_x64d%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_x64d%languages\\bulgarian.irl            mklink %path_x64d%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_x64d%languages\\catalan.irl              mklink %path_x64d%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_x64d%languages\\chinese-simplified.irl   mklink %path_x64d%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_x64d%languages\\chinese-traditional.irl  mklink %path_x64d%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_x64d%languages\\chuvash.irl              mklink %path_x64d%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_x64d%languages\\croatian.irl             mklink %path_x64d%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_x64d%languages\\czech.irl                mklink %path_x64d%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_x64d%languages\\danish.irl               mklink %path_x64d%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_x64d%languages\\dutch.irl                mklink %path_x64d%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_x64d%languages\\estonian.irl             mklink %path_x64d%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_x64d%languages\\farsi.irl                mklink %path_x64d%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_x64d%languages\\finnish.irl              mklink %path_x64d%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_x64d%languages\\french.irl               mklink %path_x64d%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_x64d%languages\\galician.irl             mklink %path_x64d%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_x64d%languages\\german.irl               mklink %path_x64d%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_x64d%languages\\georgian.irl             mklink %path_x64d%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_x64d%languages\\greek.irl                mklink %path_x64d%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_x64d%languages\\hebrew.irl               mklink %path_x64d%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_x64d%languages\\hungarian.irl            mklink %path_x64d%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_x64d%languages\\indonesian.irl           mklink %path_x64d%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_x64d%languages\\italian.irl              mklink %path_x64d%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_x64d%languages\\japanese.irl             mklink %path_x64d%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_x64d%languages\\korean.irl               mklink %path_x64d%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_x64d%languages\\latvian.irl              mklink %path_x64d%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_x64d%languages\\lithuanian.irl           mklink %path_x64d%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_x64d%languages\\macedonian.irl           mklink %path_x64d%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_x64d%languages\\norwegian.irl            mklink %path_x64d%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_x64d%languages\\polish.irl               mklink %path_x64d%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_x64d%languages\\portuguese.irl           mklink %path_x64d%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_x64d%languages\\portuguese-brazilian.irl mklink %path_x64d%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_x64d%languages\\romanian.irl             mklink %path_x64d%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_x64d%languages\\russian.irl              mklink %path_x64d%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_x64d%languages\\serbian-cyrillic.irl     mklink %path_x64d%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_x64d%languages\\serbian-latin.irl        mklink %path_x64d%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_x64d%languages\\slovak.irl               mklink %path_x64d%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_x64d%languages\\slovenian.irl            mklink %path_x64d%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_x64d%languages\\spanish.irl              mklink %path_x64d%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_x64d%languages\\swedish.irl              mklink %path_x64d%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_x64d%languages\\thai.irl                 mklink %path_x64d%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_x64d%languages\\turkish.irl              mklink %path_x64d%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_x64d%languages\\ukrainian.irl            mklink %path_x64d%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_x64d%languages\\valencian.irl            mklink %path_x64d%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_x64d%languages\\vietnamese.irl           mklink %path_x64d%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\nif not exist %path_x64r%languages\\albanian.irl             mklink %path_x64r%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_x64r%languages\\arabic.irl               mklink %path_x64r%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_x64r%languages\\armenian.irl             mklink %path_x64r%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_x64r%languages\\basque.irl               mklink %path_x64r%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_x64r%languages\\bosnian.irl              mklink %path_x64r%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_x64r%languages\\bulgarian.irl            mklink %path_x64r%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_x64r%languages\\catalan.irl              mklink %path_x64r%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_x64r%languages\\chinese-simplified.irl   mklink %path_x64r%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_x64r%languages\\chinese-traditional.irl  mklink %path_x64r%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_x64r%languages\\chuvash.irl              mklink %path_x64r%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_x64r%languages\\croatian.irl             mklink %path_x64r%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_x64r%languages\\czech.irl                mklink %path_x64r%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_x64r%languages\\danish.irl               mklink %path_x64r%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_x64r%languages\\dutch.irl                mklink %path_x64r%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_x64r%languages\\estonian.irl             mklink %path_x64r%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_x64r%languages\\farsi.irl                mklink %path_x64r%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_x64r%languages\\finnish.irl              mklink %path_x64r%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_x64r%languages\\french.irl               mklink %path_x64r%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_x64r%languages\\galician.irl             mklink %path_x64r%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_x64r%languages\\german.irl               mklink %path_x64r%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_x64r%languages\\georgian.irl             mklink %path_x64r%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_x64r%languages\\greek.irl                mklink %path_x64r%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_x64r%languages\\hebrew.irl               mklink %path_x64r%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_x64r%languages\\hungarian.irl            mklink %path_x64r%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_x64r%languages\\indonesian.irl           mklink %path_x64r%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_x64r%languages\\italian.irl              mklink %path_x64r%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_x64r%languages\\japanese.irl             mklink %path_x64r%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_x64r%languages\\korean.irl               mklink %path_x64r%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_x64r%languages\\latvian.irl              mklink %path_x64r%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_x64r%languages\\lithuanian.irl           mklink %path_x64r%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_x64r%languages\\macedonian.irl           mklink %path_x64r%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_x64r%languages\\norwegian.irl            mklink %path_x64r%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_x64r%languages\\polish.irl               mklink %path_x64r%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_x64r%languages\\portuguese.irl           mklink %path_x64r%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_x64r%languages\\portuguese-brazilian.irl mklink %path_x64r%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_x64r%languages\\romanian.irl             mklink %path_x64r%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_x64r%languages\\russian.irl              mklink %path_x64r%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_x64r%languages\\serbian-cyrillic.irl     mklink %path_x64r%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_x64r%languages\\serbian-latin.irl        mklink %path_x64r%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_x64r%languages\\slovak.irl               mklink %path_x64r%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_x64r%languages\\slovenian.irl            mklink %path_x64r%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_x64r%languages\\spanish.irl              mklink %path_x64r%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_x64r%languages\\swedish.irl              mklink %path_x64r%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_x64r%languages\\thai.irl                 mklink %path_x64r%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_x64r%languages\\turkish.irl              mklink %path_x64r%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_x64r%languages\\ukrainian.irl            mklink %path_x64r%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_x64r%languages\\valencian.irl            mklink %path_x64r%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_x64r%languages\\vietnamese.irl           mklink %path_x64r%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\nif not exist %path_x64p%languages\\albanian.irl             mklink %path_x64p%languages\\albanian.irl             %path_trans_l%albanian.irl\r\nif not exist %path_x64p%languages\\arabic.irl               mklink %path_x64p%languages\\arabic.irl               %path_trans_l%arabic.irl\r\nif not exist %path_x64p%languages\\armenian.irl             mklink %path_x64p%languages\\armenian.irl             %path_trans_l%armenian.irl\r\nif not exist %path_x64p%languages\\basque.irl               mklink %path_x64p%languages\\basque.irl               %path_trans_l%basque.irl\r\nif not exist %path_x64p%languages\\bosnian.irl              mklink %path_x64p%languages\\bosnian.irl              %path_trans_l%bosnian.irl\r\nif not exist %path_x64p%languages\\bulgarian.irl            mklink %path_x64p%languages\\bulgarian.irl            %path_trans_l%bulgarian.irl\r\nif not exist %path_x64p%languages\\catalan.irl              mklink %path_x64p%languages\\catalan.irl              %path_trans_l%catalan.irl\r\nif not exist %path_x64p%languages\\chinese-simplified.irl   mklink %path_x64p%languages\\chinese-simplified.irl   %path_trans_l%chinese-simplified.irl\r\nif not exist %path_x64p%languages\\chinese-traditional.irl  mklink %path_x64p%languages\\chinese-traditional.irl  %path_trans_l%chinese-traditional.irl\r\nif not exist %path_x64p%languages\\chuvash.irl              mklink %path_x64p%languages\\chuvash.irl              %path_trans_l%chuvash.irl\r\nif not exist %path_x64p%languages\\croatian.irl             mklink %path_x64p%languages\\croatian.irl             %path_trans_l%croatian.irl\r\nif not exist %path_x64p%languages\\czech.irl                mklink %path_x64p%languages\\czech.irl                %path_trans_l%czech.irl\r\nif not exist %path_x64p%languages\\danish.irl               mklink %path_x64p%languages\\danish.irl               %path_trans_l%danish.irl\r\nif not exist %path_x64p%languages\\dutch.irl                mklink %path_x64p%languages\\dutch.irl                %path_trans_l%dutch.irl\r\nif not exist %path_x64p%languages\\estonian.irl             mklink %path_x64p%languages\\estonian.irl             %path_trans_l%estonian.irl\r\nif not exist %path_x64p%languages\\farsi.irl                mklink %path_x64p%languages\\farsi.irl                %path_trans_l%farsi.irl\r\nif not exist %path_x64p%languages\\finnish.irl              mklink %path_x64p%languages\\finnish.irl              %path_trans_l%finnish.irl\r\nif not exist %path_x64p%languages\\french.irl               mklink %path_x64p%languages\\french.irl               %path_trans_l%french.irl\r\nif not exist %path_x64p%languages\\galician.irl             mklink %path_x64p%languages\\galician.irl             %path_trans_l%galician.irl\r\nif not exist %path_x64p%languages\\german.irl               mklink %path_x64p%languages\\german.irl               %path_trans_l%german.irl\r\nif not exist %path_x64p%languages\\georgian.irl             mklink %path_x64p%languages\\georgian.irl             %path_trans_l%georgian.irl\r\nif not exist %path_x64p%languages\\greek.irl                mklink %path_x64p%languages\\greek.irl                %path_trans_l%greek.irl\r\nif not exist %path_x64p%languages\\hebrew.irl               mklink %path_x64p%languages\\hebrew.irl               %path_trans_l%hebrew.irl\r\nif not exist %path_x64p%languages\\hungarian.irl            mklink %path_x64p%languages\\hungarian.irl            %path_trans_l%hungarian.irl\r\nif not exist %path_x64p%languages\\indonesian.irl           mklink %path_x64p%languages\\indonesian.irl           %path_trans_l%indonesian.irl\r\nif not exist %path_x64p%languages\\italian.irl              mklink %path_x64p%languages\\italian.irl              %path_trans_l%italian.irl\r\nif not exist %path_x64p%languages\\japanese.irl             mklink %path_x64p%languages\\japanese.irl             %path_trans_l%japanese.irl\r\nif not exist %path_x64p%languages\\korean.irl               mklink %path_x64p%languages\\korean.irl               %path_trans_l%korean.irl\r\nif not exist %path_x64p%languages\\latvian.irl              mklink %path_x64p%languages\\latvian.irl              %path_trans_l%latvian.irl\r\nif not exist %path_x64p%languages\\lithuanian.irl           mklink %path_x64p%languages\\lithuanian.irl           %path_trans_l%lithuanian.irl\r\nif not exist %path_x64p%languages\\macedonian.irl           mklink %path_x64p%languages\\macedonian.irl           %path_trans_l%macedonian.irl\r\nif not exist %path_x64p%languages\\norwegian.irl            mklink %path_x64p%languages\\norwegian.irl            %path_trans_l%norwegian.irl\r\nif not exist %path_x64p%languages\\polish.irl               mklink %path_x64p%languages\\polish.irl               %path_trans_l%polish.irl\r\nif not exist %path_x64p%languages\\portuguese.irl           mklink %path_x64p%languages\\portuguese.irl           %path_trans_l%portuguese.irl\r\nif not exist %path_x64p%languages\\portuguese-brazilian.irl mklink %path_x64p%languages\\portuguese-brazilian.irl %path_trans_l%portuguese-brazilian.irl\r\nif not exist %path_x64p%languages\\romanian.irl             mklink %path_x64p%languages\\romanian.irl             %path_trans_l%romanian.irl\r\nif not exist %path_x64p%languages\\russian.irl              mklink %path_x64p%languages\\russian.irl              %path_trans_l%russian.irl\r\nif not exist %path_x64p%languages\\serbian-cyrillic.irl     mklink %path_x64p%languages\\serbian-cyrillic.irl     %path_trans_l%serbian-cyrillic.irl\r\nif not exist %path_x64p%languages\\serbian-latin.irl        mklink %path_x64p%languages\\serbian-latin.irl        %path_trans_l%serbian-latin.irl\r\nif not exist %path_x64p%languages\\slovak.irl               mklink %path_x64p%languages\\slovak.irl               %path_trans_l%slovak.irl\r\nif not exist %path_x64p%languages\\slovenian.irl            mklink %path_x64p%languages\\slovenian.irl            %path_trans_l%slovenian.irl\r\nif not exist %path_x64p%languages\\spanish.irl              mklink %path_x64p%languages\\spanish.irl              %path_trans_l%spanish.irl\r\nif not exist %path_x64p%languages\\swedish.irl              mklink %path_x64p%languages\\swedish.irl              %path_trans_l%swedish.irl\r\nif not exist %path_x64p%languages\\thai.irl                 mklink %path_x64p%languages\\thai.irl                 %path_trans_l%thai.irl\r\nif not exist %path_x64p%languages\\turkish.irl              mklink %path_x64p%languages\\turkish.irl              %path_trans_l%turkish.irl\r\nif not exist %path_x64p%languages\\ukrainian.irl            mklink %path_x64p%languages\\ukrainian.irl            %path_trans_l%ukrainian.irl\r\nif not exist %path_x64p%languages\\valencian.irl            mklink %path_x64p%languages\\valencian.irl            %path_trans_l%valencian.irl\r\nif not exist %path_x64p%languages\\vietnamese.irl           mklink %path_x64p%languages\\vietnamese.irl           %path_trans_l%vietnamese.irl\r\n\r\nrem make symbolic links to translated help.\r\nif not exist %path_w32d%languages\\czech.chm                mklink %path_w32d%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_w32d%languages\\french.chm               mklink %path_w32d%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_w32d%languages\\german.chm               mklink %path_w32d%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_w32d%languages\\russian.chm              mklink %path_w32d%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_w32d%languages\\thai.chm                 mklink %path_w32d%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_w32d%languages\\turkish.chm              mklink %path_w32d%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_w32d%languages\\ukrainian.chm            mklink %path_w32d%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\nif not exist %path_w32r%languages\\czech.chm                mklink %path_w32r%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_w32r%languages\\french.chm               mklink %path_w32r%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_w32r%languages\\german.chm               mklink %path_w32r%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_w32r%languages\\russian.chm              mklink %path_w32r%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_w32r%languages\\thai.chm                 mklink %path_w32r%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_w32r%languages\\turkish.chm              mklink %path_w32r%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_w32r%languages\\ukrainian.chm            mklink %path_w32r%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\nif not exist %path_w32p%languages\\czech.chm                mklink %path_w32p%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_w32p%languages\\french.chm               mklink %path_w32p%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_w32p%languages\\german.chm               mklink %path_w32p%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_w32p%languages\\russian.chm              mklink %path_w32p%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_w32p%languages\\thai.chm                 mklink %path_w32p%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_w32p%languages\\turkish.chm              mklink %path_w32p%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_w32p%languages\\ukrainian.chm            mklink %path_w32p%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\nif not exist %path_x64d%languages\\czech.chm                mklink %path_x64d%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_x64d%languages\\french.chm               mklink %path_x64d%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_x64d%languages\\german.chm               mklink %path_x64d%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_x64d%languages\\russian.chm              mklink %path_x64d%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_x64d%languages\\thai.chm                 mklink %path_x64d%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_x64d%languages\\turkish.chm              mklink %path_x64d%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_x64d%languages\\ukrainian.chm            mklink %path_x64d%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\nif not exist %path_x64r%languages\\czech.chm                mklink %path_x64r%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_x64r%languages\\french.chm               mklink %path_x64r%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_x64r%languages\\german.chm               mklink %path_x64r%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_x64r%languages\\russian.chm              mklink %path_x64r%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_x64r%languages\\thai.chm                 mklink %path_x64r%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_x64r%languages\\turkish.chm              mklink %path_x64r%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_x64r%languages\\ukrainian.chm            mklink %path_x64r%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\nif not exist %path_x64p%languages\\czech.chm                mklink %path_x64p%languages\\czech.chm                %path_trans_h%czech.chm\r\nif not exist %path_x64p%languages\\french.chm               mklink %path_x64p%languages\\french.chm               %path_trans_h%french.chm\r\nif not exist %path_x64p%languages\\german.chm               mklink %path_x64p%languages\\german.chm               %path_trans_h%german.chm\r\nif not exist %path_x64p%languages\\russian.chm              mklink %path_x64p%languages\\russian.chm              %path_trans_h%russian.chm\r\nif not exist %path_x64p%languages\\thai.chm                 mklink %path_x64p%languages\\thai.chm                 %path_trans_h%thai.chm\r\nif not exist %path_x64p%languages\\turkish.chm              mklink %path_x64p%languages\\turkish.chm              %path_trans_h%turkish.chm\r\nif not exist %path_x64p%languages\\ukrainian.chm            mklink %path_x64p%languages\\ukrainian.chm            %path_trans_h%ukrainian.chm\r\n\r\npause\r\n"
  },
  {
    "path": "readme.txt",
    "content": "InfraRecorder\r\nCopyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n\r\nThis program is licensed under GPL (version 3), please see the file\r\nLicense.txt. Please note that the graphics used in InfraRecorder is not covered\r\nby GPL, read the details further down in this document.\r\n\r\nThe InfraRecorder source code can be obtained from http://infrarecorder.org\r\n\r\nIn order to compile InfraRecorder you will need the following libraries:\r\n 1. WTL: http://wtl.sourceforge.net\r\n 2. ckCore, ckFileSystem and ckMMC: http://code.kindahl.com\r\n 3. libpng: http://www.libpng.org\r\n\r\nInfraRecorder uses cdrtools, sources can be found at:\r\nhttp://cdrecord.berlios.de/\r\n\r\nInfraRecorder has been developed with Visual C++ 2005 Professional edition. It\r\nis however possible to compile the sources with the free \"Express\" edition, but\r\nyou will need to separately obtain and install the ATL library headers. The\r\nMicrosoft Windows Server 2003 R2 Platform SDK (also free) was the last\r\nWindows SDK version to ship with the ATL headers. The bundled ATL 3.0 is rather\r\nold, but it is still supported by the latest WTL library.\r\n\r\nThe graphics used in InfraRecorder are NOT covered by GPL. The official\r\nInfraRecorder logo (the logo used in official InfraRecorder binaries), and all\r\nother graphics using it are licensed under the Creative Commons\r\nAttribution-Noncommercial-No Derivative Works license\r\n(http://creativecommons.org/licenses/by-nc-nd/3.0/) with one additional\r\ncondition:\r\n\r\n * The work may not be used in derivative software or in the purpose of\r\n   promoting derivative software.\r\n\r\nApart from the graphics using the official InfraRecorder logo the above\r\nlicense also applies to all graphics that are not derivative works of graphics\r\ncreated by the Tango Desktop Project. Examples of this kind of graphics are the\r\nbutton graphics used in the welcome screen.\r\n\r\nThe remaining graphics that are derivative work based on icons in the Tango\r\nDesktop Project (http://tango.freedesktop.org) is available under the same\r\nlicense as the Tango Desktop Project graphics. That is the Creative Commons\r\nAttribution Share-Alike license\r\n(http://creativecommons.org/licenses/by-sa/2.5/).\r\n"
  },
  {
    "path": "sign.bat",
    "content": "@echo off\r\n\r\nset    cert_file=   %~dp0christian_kindahl.pfx\r\nset /p cert_pass= < %~dp0christian_kindahl.psw\r\nset    cert_sats=   \"http://timestamp.comodoca.com/authenticode\"\r\n\r\nset path_w32r=%~dp0bin\\win32\\release\\\r\nset path_w32p=%~dp0bin\\win32\\releasep\\\r\nset path_x64r=%~dp0bin\\x64\\release\\\r\nset path_x64p=%~dp0bin\\x64\\releasep\\\r\n\r\nrem set path_dist=%~dp0dist\\\r\nset path_smoke_w32=%~dp0dep\\smoke\\win32\\\r\nset path_smoke_x64=%~dp0dep\\smoke\\x64\\\r\n\r\nset path_cdrtools=%~dp0dep\\cdrtools\\\r\nset path_sndfile_w32=%~dp0dep\\libsndfile\\win32\\\r\nset path_sndfile_x64=%~dp0dep\\libsndfile\\x64\\\r\n\r\nif \"%~1\" NEQ \"\" goto single_file\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_smoke_w32%smoke.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_smoke_x64%smoke.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_sndfile_w32%libsndfile-1.dll\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_sndfile_x64%libsndfile-1.dll\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_cdrtools%cdda2wav.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_cdrtools%cdrecord.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_cdrtools%readcd.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_cdrtools%cygwin1.dll\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%infrarecorder.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%shell.dll\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%codecs\\lame.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%codecs\\sndfile.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%codecs\\wave.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%codecs\\wma.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32r%codecs\\vorbis.irc\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%infrarecorder.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%codecs\\lame.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%codecs\\sndfile.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%codecs\\wave.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%codecs\\wma.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_w32p%codecs\\vorbis.irc\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%infrarecorder.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%shell.dll\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%codecs\\lame.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%codecs\\sndfile.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%codecs\\wave.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%codecs\\wma.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64r%codecs\\vorbis.irc\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%infrarecorder.exe\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%codecs\\lame.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%codecs\\sndfile.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%codecs\\wave.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%codecs\\wma.irc\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_x64p%codecs\\vorbis.irc\r\n\r\nrem signtool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_dist%ir.exe\r\nrem signtool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %path_dist%ir_x64.msi\r\ngoto end\r\n\r\n:single_file\r\n\r\nsigntool sign /f %cert_file% /p %cert_pass% /t %cert_sats% %1\r\ngoto end\r\n\r\n:end\r\n\r\npause\r\n"
  },
  {
    "path": "src/app/action_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckfilesystem/filesystemwriter.hh>\r\n#include <ckfilesystem/sectorstream.hh>\r\n#include \"settings.hh\"\r\n#include \"core.hh\"\r\n#include \"core2.hh\"\r\n#include \"core2_info.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"burn_image_dlg.hh\"\r\n#include \"copy_disc_dlg.hh\"\r\n#include \"copy_image_dlg.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"tracks_dlg.hh\"\r\n#include \"erase_dlg.hh\"\r\n#include \"fixate_dlg.hh\"\r\n#include \"progress_dlg.hh\"\r\n#include \"simple_progress_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"scsi.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"action_manager.hh\"\r\n\r\nCActionManager g_ActionManager;\r\n\r\nCActionManager::CActionManager()\r\n{\r\n}\r\n\r\nCActionManager::~CActionManager()\r\n{\r\n}\r\n\r\nstatic void RemoveTempTracks ( std::vector<TCHAR *> & TempTracks )\r\n{\r\n    for ( std::vector <TCHAR *>::iterator it = TempTracks.begin();\r\n          it != TempTracks.end();\r\n          ++it )\r\n    {\r\n        const TCHAR * const elem = *it;\r\n        ckcore::File::remove(elem);\r\n        delete [] elem;\r\n    }\r\n\r\n    TempTracks.clear();\r\n}\r\n\r\n\r\nDWORD WINAPI CActionManager::BurnCompilationThread(LPVOID lpThreadParameter)\r\n{\r\n    struct CLocalData\r\n    {\r\n        // The destructor frees these variables automatically.\r\n        ckcore::File ImageFile;\r\n        ckfilesystem::FileSet Files;  // Files to burn.\r\n        std::vector<TCHAR *> TempTracks;\r\n        const TCHAR *pAudioText;\r\n\r\n        CLocalData(void)\r\n            : ImageFile(g_BurnImageSettings.m_bOnFly\r\n                            ? ckcore::Path() // 'ImageFile' variable not used.\r\n                            : ckcore::File::temp(g_GlobalSettings.m_szTempPath,\r\n                                                 ckT(\"InfraRecorder\"))),\r\n              Files(g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO),\r\n              pAudioText(NULL)\r\n        {}\r\n\r\n        ~CLocalData(void)\r\n        {\r\n            if (!g_BurnImageSettings.m_bOnFly)\r\n                ImageFile.remove();\r\n\r\n            ckfilesystem::destroy_file_set(Files);\r\n\r\n            RemoveTempTracks(TempTracks);\r\n\r\n            // Remove the CD-Text file.\r\n            if (pAudioText != NULL)\r\n                ckcore::File::remove(pAudioText);\r\n        }\r\n    } LocalData;\r\n\r\n    int iProjectType = g_ProjectManager.GetProjectType();\r\n    eBurnResult result = BURNRESULT_INTERNALERROR;\r\n\r\n\r\n    // Make sure that the disc will not be ejected before beeing verified.\r\n    bool bEject = g_BurnImageSettings.m_bEject;\r\n    g_BurnImageSettings.m_bEject = false;\r\n\r\n    // Used for locating the files on the disc when verifying.\r\n    std::map<tstring,tstring> FilePathMap;\r\n\r\n    switch (iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            g_TreeManager.GetPathList(LocalData.Files,g_TreeManager.GetRootNode());\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            g_TreeManager.GetPathList(LocalData.Files,g_ProjectManager.GetMixDataRootNode(),\r\n                lstrlen(g_ProjectManager.GetMixDataRootNode()->pItemData->GetFileName()) + 1);\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            // Audio discs do not have files to burn.\r\n            break;\r\n\r\n        default:\r\n            ATLASSERT(false);\r\n            return 0;\r\n    };\r\n\r\n\r\n    if (iProjectType == PROJECTTYPE_DATA ||\r\n        iProjectType == PROJECTTYPE_MIXED)\r\n    {\r\n        // Set the status information.\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_PREPOPERATION));\r\n        g_pProgressDlg->SetDevice(_T(\"\"));\r\n        g_pProgressDlg->set_status(lngGetString(STATUS_GATHER_FILE_INFO));\r\n\r\n        // Create a temporary disc image if not burning on the fly.\r\n        if (!g_BurnImageSettings.m_bOnFly)\r\n        {\r\n            // Set the status information.\r\n            g_pProgressDlg->SetWindowText(lngGetString(STITLE_CREATEIMAGE));\r\n            g_pProgressDlg->SetDevice(lngGetString(PROGRESS_IMAGEDEVICE));\r\n            g_pProgressDlg->set_status(lngGetString(STATUS_WRITEIMAGE));\r\n\r\n            g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINDISCIMAGE));\r\n\r\n            const int iCreateImageResult = g_Core2.CreateImage(LocalData.ImageFile.name().c_str(),LocalData.Files,*g_pProgressDlg,\r\n                                                               true,g_BurnImageSettings.m_bVerify ? &FilePathMap : NULL);\r\n            g_pProgressDlg->set_progress(100);\r\n\r\n            switch (iCreateImageResult)\r\n            {\r\n                case RESULT_OK:\r\n                    g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_CREATEIMAGE));\r\n                    result = BURNRESULT_OK;\r\n                    break;\r\n\r\n                case RESULT_CANCEL:\r\n                    g_pProgressDlg->NotifyCompleted();\r\n                    return 0;\r\n\r\n                case RESULT_FAIL:\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_FAILED));\r\n                    g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_CREATEIMAGE));\r\n                    g_pProgressDlg->NotifyCompleted();\r\n                    return 0;\r\n\r\n                default:\r\n                    ATLASSERT( false );\r\n            };\r\n        }\r\n    }\r\n\r\n    g_pProgressDlg->set_progress(0);\r\n\r\n    ckmmc::Device &Device = *g_BurnImageSettings.m_pRecorder;\r\n\r\n    // Set the status information.\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_BURNCOMPILATION));\r\n    g_pProgressDlg->SetDevice(Device);\r\n\r\n    std::vector<TCHAR *> AudioTracks;\r\n\r\n    // Decode any encoded tracks in audio and mixed-mode projects.\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_DECODETRACKS));\r\n    switch (iProjectType)\r\n    {\r\n        case PROJECTTYPE_MIXED:\r\n        case PROJECTTYPE_AUDIO:\r\n            g_ProjectManager.GetAudioTracks(AudioTracks);\r\n\r\n            // Decode any audio tracks that might be encoded.\r\n            if (!g_ProjectManager.DecodeAudioTracks(AudioTracks,LocalData.TempTracks,g_pProgressDlg))\r\n            {\r\n                g_pProgressDlg->NotifyCompleted();\r\n                return 0;\r\n            }\r\n            break;\r\n\r\n        case PROJECTTYPE_DATA:\r\n            // No audio tracks to decode.\r\n            break;\r\n\r\n        default:\r\n            ATLASSERT( false );\r\n    }\r\n\r\n    // Start the burn process.\r\n    for (long i = 0; i < g_BurnImageSettings.m_lNumCopies; i++)\r\n    {\r\n        bool bLast = i == (g_BurnImageSettings.m_lNumCopies - 1);\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n        switch (iProjectType)\r\n        {\r\n            case PROJECTTYPE_DATA:\r\n                if (g_BurnImageSettings.m_bOnFly)\r\n                {\r\n                    // Try to estimate the file system size before burning the compilation.\r\n                    unsigned __int64 uiDataSize = 0;\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_ESTIMAGESIZE));\r\n\r\n                    const int iEstimateImageSizeRes = g_Core2.EstimateImageSize(LocalData.Files,*g_pProgressDlg,uiDataSize);\r\n\r\n                    g_pProgressDlg->set_progress(100);\r\n\r\n                    switch ( iEstimateImageSizeRes )\r\n                    {\r\n                    case RESULT_OK:\r\n                        // Reset the status.\r\n                        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n                        if (g_BurnImageSettings.m_bVerify || !bLast)\r\n                        {\r\n                            result = g_Core.BurnCompilationEx(Device,g_pProgressDlg,*g_pProgressDlg,LocalData.Files,\r\n                                AudioTracks,NULL,g_ProjectSettings.m_iIsoFormat,uiDataSize);\r\n                        }\r\n                        else\r\n                        {\r\n                            const bool bBurnCompilationRes = g_Core.BurnCompilation(Device,g_pProgressDlg,*g_pProgressDlg,LocalData.Files,\r\n                                AudioTracks,NULL,g_ProjectSettings.m_iIsoFormat,uiDataSize);\r\n                            result = bBurnCompilationRes ? BURNRESULT_OK : BURNRESULT_INTERNALERROR;\r\n                        }\r\n                        break;\r\n\r\n                    default:\r\n                        ATLASSERT( false );\r\n                        // Fall through\r\n                    case RESULT_CANCEL:\r\n                    case RESULT_FAIL:\r\n                        g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_ESTIMAGESIZE));\r\n                        result = BURNRESULT_INTERNALERROR;\r\n                        break;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (g_BurnImageSettings.m_bVerify || !bLast)\r\n                    {\r\n                        result = g_Core.BurnTracksEx(Device,g_pProgressDlg,LocalData.ImageFile.name().c_str(),\r\n                            AudioTracks,NULL,g_ProjectSettings.m_iIsoFormat);\r\n                    }\r\n                    else\r\n                    {\r\n                        bool bBurnTracksRes = g_Core.BurnTracks(Device,g_pProgressDlg,LocalData.ImageFile.name().c_str(),\r\n                            AudioTracks,NULL,g_ProjectSettings.m_iIsoFormat);\r\n                        result = bBurnTracksRes ? BURNRESULT_OK : BURNRESULT_INTERNALERROR;\r\n                    }\r\n                }\r\n                break;\r\n\r\n            case PROJECTTYPE_MIXED:\r\n                // Save CD-Text information.\r\n                if (AudioTracks.size() > 0)\r\n                {\r\n                    // Check if any audio information has been edited.\r\n                    if (g_TreeManager.HasExtraAudioData(g_ProjectManager.GetMixAudioRootNode()))\r\n                    {\r\n                        ckcore::File AudioTextFile = ckcore::File::temp(g_GlobalSettings.m_szTempPath,\r\n                                                                        ckT(\"InfraRecorder\"));\r\n\r\n                        if (g_ProjectManager.SaveCDText(AudioTextFile.name().c_str()))\r\n                            LocalData.pAudioText = AudioTextFile.name().c_str();\r\n                        else\r\n                            lngMessageBox(HWND_DESKTOP,FAILURE_CREATECDTEXT,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n                    }\r\n                }\r\n\r\n                if (g_BurnImageSettings.m_bOnFly)\r\n                {\r\n                    // Try to estimate the file system size before burning the compilation.\r\n                    unsigned __int64 uiDataSize = 0;\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_ESTIMAGESIZE));\r\n\r\n                    const int iEstimateImageSizeRes = g_Core2.EstimateImageSize(LocalData.Files,*g_pProgressDlg,uiDataSize);\r\n\r\n                    g_pProgressDlg->set_progress(100);\r\n\r\n                    switch ( iEstimateImageSizeRes )\r\n                    {\r\n                    case RESULT_OK:\r\n                        // Reset the status.\r\n                        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n                        if (g_BurnImageSettings.m_bVerify || !bLast)\r\n                        {\r\n                            result = g_Core.BurnCompilationEx(Device,g_pProgressDlg,*g_pProgressDlg,LocalData.Files,\r\n                                                               AudioTracks,LocalData.pAudioText,g_ProjectSettings.m_iIsoFormat,uiDataSize);\r\n                        }\r\n                        else\r\n                        {\r\n                            bool bBurnCompilationRes = g_Core.BurnCompilation(Device,g_pProgressDlg,*g_pProgressDlg,LocalData.Files,\r\n                                                             AudioTracks,LocalData.pAudioText,g_ProjectSettings.m_iIsoFormat,uiDataSize);\r\n                            result = bBurnCompilationRes ? BURNRESULT_OK : BURNRESULT_INTERNALERROR;\r\n                        }\r\n                        break;\r\n\r\n                    default:\r\n                        ATLASSERT( false );\r\n                        // Fall through.\r\n                    case RESULT_CANCEL:\r\n                    case RESULT_FAIL:\r\n                        g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_ESTIMAGESIZE));\r\n                        result = BURNRESULT_INTERNALERROR;\r\n                        break;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (g_BurnImageSettings.m_bVerify || !bLast)\r\n                    {\r\n                        result = g_Core.BurnTracksEx(Device,g_pProgressDlg,LocalData.ImageFile.name().c_str(),\r\n                            AudioTracks,LocalData.pAudioText,g_ProjectSettings.m_iIsoFormat);\r\n                    }\r\n                    else\r\n                    {\r\n                        bool bBurnTracksRes = g_Core.BurnTracks(Device,g_pProgressDlg,LocalData.ImageFile.name().c_str(),\r\n                            AudioTracks,LocalData.pAudioText,g_ProjectSettings.m_iIsoFormat);\r\n                        result = bBurnTracksRes ? BURNRESULT_OK : BURNRESULT_INTERNALERROR;\r\n                    }\r\n                }\r\n                break;\r\n\r\n            case PROJECTTYPE_AUDIO:\r\n                // Save CD-Text information.\r\n                if (AudioTracks.size() > 0)\r\n                {\r\n                    // Check if any audio information has been edited.\r\n                    if (g_TreeManager.HasExtraAudioData(g_TreeManager.GetRootNode()))\r\n                    {\r\n                        ckcore::File AudioTextFile = ckcore::File::temp(g_GlobalSettings.m_szTempPath,\r\n                                                                        ckT(\"InfraRecorder\"));\r\n\r\n                        if (g_ProjectManager.SaveCDText(AudioTextFile.name().c_str()))\r\n                            LocalData.pAudioText = AudioTextFile.name().c_str();\r\n                        else\r\n                            lngMessageBox(HWND_DESKTOP,FAILURE_CREATECDTEXT,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n                    }\r\n                }\r\n\r\n                if (bLast)\r\n                {\r\n                    bool bBurnTracksRes = g_Core.BurnTracks(Device,g_pProgressDlg,NULL,\r\n                        AudioTracks,LocalData.pAudioText,0);\r\n                    result = bBurnTracksRes ? BURNRESULT_OK : BURNRESULT_INTERNALERROR;\r\n                }\r\n                else\r\n                {\r\n                    result = g_Core.BurnTracksEx(Device,g_pProgressDlg,NULL,\r\n                        AudioTracks,LocalData.pAudioText,0);\r\n                }\r\n                break;\r\n\r\n            default:\r\n                ATLASSERT( false );\r\n        };\r\n\r\n        // Handle the result.\r\n        switch ( result )\r\n        {\r\n        default:\r\n            ATLASSERT( false );\r\n            // Fall through\r\n        case BURNRESULT_INTERNALERROR:\r\n        case BURNRESULT_EXTERNALERROR:\r\n\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->NotifyCompleted();\r\n\r\n            lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n            return 0;\r\n\r\n        case BURNRESULT_OK:\r\n            break;\r\n        }\r\n\r\n        // The recording was successful. Verify the disc if requested.\r\n        if (g_BurnImageSettings.m_bVerify)\r\n        {\r\n            // We need to reload the drive media.\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_RELOADMEDIA));\r\n\r\n            g_Core2.StartStopUnit(Device,CCore2::LOADMEDIA_EJECT,false);\r\n            if (!g_Core2.StartStopUnit(Device,CCore2::LOADMEDIA_LOAD,false))\r\n                lngMessageBox(*g_pProgressDlg,INFO_RELOAD,GENERAL_INFORMATION,MB_OK | MB_ICONINFORMATION);\r\n\r\n            // Set the device information.\r\n            g_pProgressDlg->SetDevice(Device);\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n            g_pProgressDlg->SetWindowText(lngGetString(STITLE_VERIFYDISC));\r\n\r\n            // Get the device drive letter.\r\n            TCHAR szDriveLetter[3];\r\n            szDriveLetter[0] = Device.address().device_[0];\r\n            szDriveLetter[1] = ':';\r\n            szDriveLetter[2] = '\\0';\r\n\r\n            // Validate the project files.\r\n            g_ProjectManager.VerifyCompilation(g_pProgressDlg,szDriveLetter,FilePathMap);\r\n\r\n            // We're done.\r\n            g_pProgressDlg->set_progress(100);\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n            g_pProgressDlg->NotifyCompleted();\r\n        }\r\n\r\n        // Eject the disc if requested.\r\n        if (bEject)\r\n            g_Core.EjectDisc(Device,false);\r\n\r\n        if (!bLast)\r\n        {\r\n            g_pProgressDlg->set_progress(0);\r\n\r\n            if (!g_pProgressDlg->RequestNextDisc())\r\n            {\r\n                g_pProgressDlg->NotifyCompleted();\r\n                break;\r\n            }\r\n\r\n            TCHAR szBuffer[128];\r\n            lsprintf(szBuffer,lngGetString(INFO_CREATECOPY),\r\n                i + 2,\r\n                g_BurnImageSettings.m_lNumCopies);\r\n            g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,szBuffer);\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nDWORD WINAPI CActionManager::CreateImageThread(LPVOID lpThreadParameter)\r\n{\r\n    TCHAR *szFileName = (TCHAR *)lpThreadParameter;\r\n\r\n    ckfilesystem::FileSet Files(g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO);\r\n\r\n    try\r\n    {\r\n        switch (g_ProjectManager.GetProjectType())\r\n        {\r\n            case PROJECTTYPE_DATA:\r\n                g_TreeManager.GetPathList(Files,g_TreeManager.GetRootNode());\r\n                break;\r\n\r\n            case PROJECTTYPE_MIXED:\r\n                g_TreeManager.GetPathList(Files,g_ProjectManager.GetMixDataRootNode(),\r\n                    lstrlen(g_ProjectManager.GetMixDataRootNode()->pItemData->GetFileName()) + 1);\r\n                break;\r\n\r\n            default:\r\n                ATLASSERT( false );\r\n                delete [] szFileName;\r\n                ckfilesystem::destroy_file_set(Files);\r\n                return 0;\r\n        };\r\n\r\n        // Set the status information.\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_CREATEIMAGE));\r\n        g_pProgressDlg->SetDevice(lngGetString(PROGRESS_IMAGEDEVICE));\r\n        g_pProgressDlg->set_status(lngGetString(STATUS_WRITEIMAGE));\r\n\r\n        g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINDISCIMAGE));\r\n\r\n        int iResult = g_Core2.CreateImage(szFileName,Files,*g_pProgressDlg,true);\r\n        g_pProgressDlg->set_progress(100);\r\n        g_pProgressDlg->NotifyCompleted();\r\n\r\n        switch (iResult)\r\n        {\r\n            case RESULT_OK:\r\n                g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n                g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_CREATEIMAGE));\r\n                break;\r\n\r\n            case RESULT_FAIL:\r\n                g_pProgressDlg->set_status(lngGetString(PROGRESS_FAILED));\r\n                g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_CREATEIMAGE));\r\n\r\n                ckcore::File::remove(szFileName);\r\n                break;\r\n\r\n            case RESULT_CANCEL:\r\n                ckcore::File::remove(szFileName);\r\n                break;\r\n\r\n            default:\r\n                ATLASSERT( false );\r\n        }\r\n    }\r\n    catch ( ... )\r\n    {\r\n        delete [] szFileName;\r\n        ckfilesystem::destroy_file_set(Files);\r\n        throw;\r\n    }\r\n\r\n    delete [] szFileName;\r\n    ckfilesystem::destroy_file_set(Files);\r\n    return 0;\r\n}\r\n\r\n/**\r\n    Tries to erase the disc inserted in the specified recorder using a fast\r\n    method. The function will not let you know if it fails.\r\n*/\r\nvoid CActionManager::QuickErase(ckmmc::Device &Device)\r\n{\r\n    // Get current profile.\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n\r\n    int iMode = g_EraseSettings.m_iMode;\r\n    bool bForce = g_EraseSettings.m_bForce;\r\n    bool bEject = g_EraseSettings.m_bEject;\r\n    bool bSimulate = g_EraseSettings.m_bSimulate;\r\n\r\n    switch (Profile)\r\n    {\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n            g_EraseSettings.m_iMode = CCore2::ERASE_FORMAT_QUICK;\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_DVDRAM:\r\n            g_EraseSettings.m_iMode = CCore2::ERASE_FORMAT_FULL;\r\n            break;\r\n\r\n        //case ckmmc::Device::ckPROFILE_CDRW:\r\n        //case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n        //case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n        default:\r\n            g_EraseSettings.m_iMode = CCore2::ERASE_BLANK_MINIMAL;\r\n            break;\r\n    }\r\n\r\n    g_EraseSettings.m_iMode = CCore2::ERASE_BLANK_MINIMAL;\r\n    g_EraseSettings.m_bForce = true;\r\n    g_EraseSettings.m_bEject = false;\r\n    g_EraseSettings.m_bSimulate = false;\r\n    g_EraseSettings.m_pRecorder = &Device;\r\n    g_EraseSettings.m_uiSpeed = 0xFFFFFFFF;\t// Maximum.\r\n\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_ERASE));\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    // Set the device information.\r\n    g_pProgressDlg->SetDevice(Device);\r\n\r\n    // Create the new erase thread.\r\n    unsigned long ulThreadID = 0;\r\n    HANDLE hThread = ::CreateThread(NULL,0,EraseThread,new CEraseParam(false),0,&ulThreadID);\r\n\r\n    // Wait for the thread to finish.\r\n    while (true)\r\n    {\r\n        if (WaitForSingleObject(hThread,100) == WAIT_TIMEOUT)\r\n        {\r\n            ProcessMessages();\r\n            Sleep(100);\r\n        }\r\n        else\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    ::CloseHandle(hThread);\r\n\r\n    g_pProgressDlg->Reset();\r\n    g_pProgressDlg->AllowCancel(true);\r\n\r\n    // Restore settings.\r\n    g_EraseSettings.m_iMode = iMode;\r\n    g_EraseSettings.m_bForce = bForce;\r\n    g_EraseSettings.m_bEject = bEject;\r\n    g_EraseSettings.m_bSimulate = bSimulate;\r\n}\r\n\r\n/**\r\n    Depending on the media inserted into the disc this function will try to\r\n    determine if the media should be erased. This includes asking the user if\r\n    necessary.\r\n*/\r\nbool CActionManager::QuickEraseQuery(ckmmc::Device &Device,HWND hWndParent)\r\n{\r\n    if (!g_ProjectSettings.m_bMultiSession)\r\n    {\r\n        CCore2Info Info;\r\n        CCore2DiscInfo DiscInfo;\r\n        if (Info.ReadDiscInformation(Device,&DiscInfo))\r\n        {\r\n            if (DiscInfo.m_ucDiscStatus != CCore2DiscInfo::DS_EMTPY &&\r\n                DiscInfo.m_ucFlags & CCore2DiscInfo::FLAG_ERASABLE)\r\n            {\r\n                if (lngMessageBox(hWndParent,MISC_ERASENONEMPTY,GENERAL_QUESTION,\r\n                    MB_YESNO | MB_ICONQUESTION) == IDYES)\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nINT_PTR CActionManager::BurnCompilation(HWND hWndParent,bool bAppMode)\r\n{\r\n    bool bAudioProject = g_ProjectManager.GetProjectType() == PROJECTTYPE_AUDIO;\r\n\r\n    // Display the burn image dialog.\r\n    CBurnImageDlg BurnImageDlg(lngGetString(MISC_BURNCOMPILATION),false,\r\n        !bAudioProject,!bAudioProject,bAppMode);\r\n    INT_PTR iResult = BurnImageDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        // Check if we should erase the disc.\r\n        bool bErase = QuickEraseQuery(*g_BurnImageSettings.m_pRecorder,hWndParent);\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        if (bErase)\r\n            QuickErase(*g_BurnImageSettings.m_pRecorder);\r\n\r\n        // Create the new thread.\r\n        unsigned long ulThreadID = 0;\r\n        HANDLE hThread = ::CreateThread(NULL,0,BurnCompilationThread,this,0,&ulThreadID);\r\n        ::CloseHandle(hThread);\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nINT_PTR CActionManager::CreateImage(HWND hWndParent,bool bAppMode)\r\n{\r\n    WTL::CFileDialog FileDialog(false,_T(\"iso\"),_T(\"Untitled\"),OFN_EXPLORER | OFN_OVERWRITEPROMPT,\r\n        _T(\"Disc Images (*.iso)\\0*.iso\\0\\0\"),hWndParent);\r\n    INT_PTR iResult = FileDialog.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // WARNING: Heap allocation, this memory memory must be freed when the thread exit.\r\n        TCHAR *szFileName = new TCHAR[MAX_PATH];\r\n        lstrcpy(szFileName,FileDialog.m_szFileName);\r\n\r\n        // Create the new thread.\r\n        unsigned long ulThreadID = 0;\r\n        HANDLE hThread = ::CreateThread(NULL,0,CreateImageThread,szFileName,0,&ulThreadID);\r\n        ::CloseHandle(hThread);\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nINT_PTR CActionManager::BurnImage(HWND hWndParent,bool bAppMode)\r\n{\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"Disc Images (*.iso, *.cue, *.img)\\0*.iso;*.cue;*.img\\0Raw Images (*.bin, *.raw)\\0*.bin;*.raw\\0All Files (*.*)\\0*.*\\0\\0\"),hWndParent);\r\n    INT_PTR iResult = FileDialog.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n        iResult = BurnImageEx(hWndParent,bAppMode,FileDialog.m_szFileName);\r\n\r\n    return iResult;\r\n}\r\n\r\nINT_PTR CActionManager::BurnImageEx(HWND hWndParent,bool bAppMode,const TCHAR *szFilePath)\r\n{\r\n    // Dialog title.\r\n    TCHAR szFileName[MAX_PATH];\r\n    lstrcpy(szFileName,szFilePath);\r\n    ExtractFileName(szFileName);\r\n\r\n    TCHAR szTitle[MAX_PATH];\r\n    lstrcpy(szTitle,lngGetString(MISC_BURN));\r\n    lstrcat(szTitle,szFileName);\r\n\r\n    // Look for a TOC file.\r\n    TCHAR szTOCFilePath[MAX_PATH];\r\n    lstrcpy(szTOCFilePath,szFilePath);\r\n    lstrcat(szTOCFilePath,_T(\".toc\"));\r\n\r\n    bool bImageHasTOC = false;\r\n    if (ckcore::File::exist(szTOCFilePath))\r\n        bImageHasTOC = true;\r\n\r\n    // Display the burn image dialog.\r\n    CBurnImageDlg BurnImageDlg(szTitle,bImageHasTOC,false,false,bAppMode);\r\n    INT_PTR iResult = BurnImageDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        // Check if we should erase the disc.\r\n        bool bErase = QuickEraseQuery(*g_BurnImageSettings.m_pRecorder,hWndParent);\r\n\r\n        ckmmc::Device &Device = *g_BurnImageSettings.m_pRecorder;\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        //g_pProgressDlg->SetWindowText(lngGetString(STITLE_BURNIMAGE));\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // Erase the disc if necessary.\r\n        if (bErase)\r\n            QuickErase(Device);\r\n\r\n        // Set the device information.\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_BURNIMAGE));\r\n        g_pProgressDlg->SetDevice(Device);\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n        // Begin burning the image.\r\n        if (!g_Core.BurnImage(Device,g_pProgressDlg,szFilePath,bImageHasTOC))\r\n        {\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->NotifyCompleted();\r\n\r\n            lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        }\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nDWORD WINAPI CActionManager::CopyDiscOnFlyThread(LPVOID lpThreadParameter)\r\n{\r\n    // Get device information.\r\n    ckmmc::Device &SrcDevice = *g_CopyDiscSettings.m_pSource;\r\n    ckmmc::Device &DstDevice = *g_CopyDiscSettings.m_pTarget;\r\n\r\n    // Set the status information.\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_COPYDISC));\r\n    g_pProgressDlg->SetDevice(DstDevice);\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    // Start the operation.\r\n    if (!g_Core.CopyDisc(SrcDevice,DstDevice,g_pProgressDlg))\r\n    {\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n        g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n        g_pProgressDlg->NotifyCompleted();\r\n\r\n        lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        return 0;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nDWORD WINAPI CActionManager::CopyDiscThread(LPVOID lpThreadParameter)\r\n{\r\n    ckcore::File ImageFile = ckcore::File::temp(g_GlobalSettings.m_szTempPath,\r\n                                                ckT(\"InfraRecorder\"));\r\n\r\n    // Set the status information.\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_CREATEIMAGE));\r\n    g_pProgressDlg->SetDevice(lngGetString(PROGRESS_IMAGEDEVICE));\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    // Get device information.\r\n    ckmmc::Device &SrcDevice = *g_CopyDiscSettings.m_pSource;\r\n\r\n    // Override the read sub-channel data setting.\r\n    g_ReadSettings.m_bClone = g_CopyDiscSettings.m_bClone;\r\n\r\n    eBurnResult iResult = g_Core.ReadDiscEx(SrcDevice,g_pProgressDlg,ImageFile.name().c_str());\r\n\r\n    switch (iResult)\r\n    {\r\n        default:\r\n            ATLASSERT( false );\r\n            // Fall through\r\n        case BURNRESULT_INTERNALERROR:\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->NotifyCompleted();\r\n\r\n            lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n\r\n            // Remove any temporary files.\r\n            ImageFile.remove();\r\n            if (g_CopyDiscSettings.m_bClone)\r\n            {\r\n                ckcore::tstring TocName = ImageFile.name();\r\n                TocName += ckT(\".toc\");\r\n                ckcore::File::remove(TocName.c_str());\r\n            }\r\n            return 0;\r\n\r\n        case BURNRESULT_EXTERNALERROR:\r\n            // Remove any temporary files.\r\n            ImageFile.remove();\r\n            if (g_CopyDiscSettings.m_bClone)\r\n            {\r\n                ckcore::tstring TocName = ImageFile.name();\r\n                TocName += ckT(\".toc\");\r\n                ckcore::File::remove(TocName.c_str());\r\n            }\r\n            return 0;\r\n\r\n        case BURNRESULT_OK:\r\n            break;\r\n    }\r\n\r\n    // Ask the user to switch discs if the target is the same as the source.\r\n    if (g_CopyDiscSettings.m_pSource == g_CopyDiscSettings.m_pTarget)\r\n    {\r\n        g_Core2.StartStopUnit(SrcDevice,CCore2::LOADMEDIA_EJECT,true);\r\n\r\n        if (lngMessageBox(*g_pProgressDlg,INFO_INSERTBLANK,GENERAL_INFORMATION,\r\n            MB_OKCANCEL | MB_ICONINFORMATION) == IDCANCEL)\r\n        {\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->NotifyCompleted();\r\n\r\n            // Remove any temporary files.\r\n            ImageFile.remove();\r\n            if (g_CopyDiscSettings.m_bClone)\r\n            {\r\n                ckcore::tstring TocName = ImageFile.name();\r\n                TocName += ckT(\".toc\");\r\n                ckcore::File::remove(TocName.c_str());\r\n            }\r\n\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    // Get device information.\r\n    ckmmc::Device &DstDevice = *g_CopyDiscSettings.m_pTarget;\r\n\r\n    // Set the status information.\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_BURNIMAGE));\r\n    g_pProgressDlg->SetDevice(DstDevice);\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    if (!g_Core.BurnImageEx(DstDevice,g_pProgressDlg,ImageFile.name().c_str(),\r\n        g_CopyDiscSettings.m_bClone))\r\n    {\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n        g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n        g_pProgressDlg->NotifyCompleted();\r\n\r\n        lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n    }\r\n\r\n    // Remove any temporary files.\r\n    ImageFile.remove();\r\n    if (g_CopyDiscSettings.m_bClone)\r\n    {\r\n        ckcore::tstring TocName = ImageFile.name();\r\n        TocName += ckT(\".toc\");\r\n        ckcore::File::remove(TocName.c_str());\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nDWORD WINAPI CActionManager::EraseThread(LPVOID lpThreadParameter)\r\n{\r\n    std::auto_ptr<CEraseParam> Param((CEraseParam *)lpThreadParameter);\r\n\r\n    // Get device information.\r\n    ckmmc::Device &Device = *g_EraseSettings.m_pRecorder;\r\n\r\n    bool bResult = g_Core2.EraseDisc(Device,g_pProgressDlg,g_EraseSettings.m_iMode,\r\n        g_EraseSettings.m_bForce,g_EraseSettings.m_bEject,g_EraseSettings.m_bSimulate,\r\n        g_EraseSettings.m_uiSpeed);\r\n\r\n    g_pProgressDlg->set_progress(100);\r\n\r\n    if (Param->m_bNotifyCompleted)\r\n        g_pProgressDlg->NotifyCompleted();\r\n\r\n    if (bResult)\r\n    {\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n    }\r\n    else\r\n    {\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_FAILED));\r\n        g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_ERASE));\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nINT_PTR CActionManager::CopyDisc(HWND hWndParent,bool bAppMode)\r\n{\r\n    // Display the information dialog.\r\n    if (g_GlobalSettings.m_bCopyWarning)\r\n    {\r\n        CInfoDlg InfoDlg(&g_GlobalSettings.m_bCopyWarning,lngGetString(INFO_COPYDISC));\r\n        if (InfoDlg.DoModal() == IDCANCEL)\r\n            return IDCANCEL;\r\n    }\r\n\r\n    // Display the burn image dialog.\r\n    CCopyDiscDlg CopyDiscDlg(bAppMode);\r\n    INT_PTR iResult = CopyDiscDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        if (g_CopyDiscSettings.m_pSource == g_CopyDiscSettings.m_pTarget)\r\n        {\r\n            ckmmc::Device &Device = *g_CopyDiscSettings.m_pSource;\r\n            g_Core2.StartStopUnit(Device,CCore2::LOADMEDIA_EJECT,true);\r\n\r\n            if (lngMessageBox(hWndParent,INFO_INSERTSOURCE,GENERAL_INFORMATION,\r\n                MB_OKCANCEL | MB_ICONINFORMATION) == IDCANCEL)\r\n            {\r\n                return IDCANCEL;\r\n            }\r\n        }\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // Create the new thread.\r\n        unsigned long ulThreadID = 0;\r\n        HANDLE hThread = ::CreateThread(NULL,0,g_CopyDiscSettings.m_bOnFly ? CopyDiscOnFlyThread : CopyDiscThread,NULL,0,&ulThreadID);\r\n        ::CloseHandle(hThread);\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\n/*\r\n    CActionManager::CopyImage\r\n    -------------------------\r\n    Performs the copy disc to a disc image action.\r\n*/\r\nINT_PTR CActionManager::CopyImage(HWND hWndParent,bool bAppMode)\r\n{\r\n    // Display the copy image dialog.\r\n    CCopyImageDlg CopyImageDlg(bAppMode);\r\n    INT_PTR iResult = CopyImageDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        ckmmc::Device &Device = *g_CopyDiscSettings.m_pSource;\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_CREATEIMAGE));\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // Set the device information.\r\n        g_pProgressDlg->SetDevice(Device);\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n        // Begin reading the disc.\r\n        if (!g_Core.ReadDisc(Device,g_pProgressDlg,CopyImageDlg.GetFileName()))\r\n        {\r\n            g_pProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pProgressDlg->NotifyCompleted();\r\n\r\n            lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        }\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nINT_PTR CActionManager::ManageTracks(bool bAppMode)\r\n{\r\n    CTracksDlg TracksDlg(bAppMode);\r\n    return TracksDlg.DoModal();\r\n}\r\n\r\nINT_PTR CActionManager::Erase(HWND hWndParent,bool bAppMode)\r\n{\r\n    CEraseDlg EraseDlg(bAppMode);\r\n    INT_PTR iResult = EraseDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        ckmmc::Device &Device = *g_EraseSettings.m_pRecorder;\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pProgressDlg->SetAppMode(bAppMode);\r\n\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(hWndParent);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_ERASE));\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // Set the device information.\r\n        g_pProgressDlg->SetDevice(Device);\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n        // Create the new thread.\r\n        unsigned long ulThreadID = 0;\r\n        HANDLE hThread = ::CreateThread(NULL,0,EraseThread,new CEraseParam(true),0,&ulThreadID);\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n\r\n        ::CloseHandle(hThread);\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nINT_PTR CActionManager::Fixate(HWND hWndParent,bool bAppMode)\r\n{\r\n    CFixateDlg FixateDlg(bAppMode);\r\n    INT_PTR iResult = FixateDlg.DoModal();\r\n\r\n    if (iResult == IDOK)\r\n    {\r\n        ckmmc::Device &Device = *g_FixateSettings.m_pRecorder;\r\n\r\n        // Disable the parent window.\r\n        if (hWndParent != NULL)\r\n            ::EnableWindow(hWndParent,false);\r\n\r\n        // If we're in application mode we need to create a message loop since\r\n        // the progress window must run independently.\r\n        CMessageLoop MainLoop;\r\n\r\n        if (bAppMode)\r\n            _Module.AddMessageLoop(&MainLoop);\r\n\r\n        // Create and display the progress dialog.\r\n        g_pSimpleProgressDlg->SetAppMode(bAppMode);\r\n\r\n        if (!g_pSimpleProgressDlg->IsWindow())\r\n            g_pSimpleProgressDlg->Create(hWndParent);\r\n\r\n        g_pSimpleProgressDlg->ShowWindow(true);\r\n        g_pSimpleProgressDlg->SetWindowText(lngGetString(STITLE_FIXATE));\r\n        g_pSimpleProgressDlg->Reset();\r\n        g_pSimpleProgressDlg->AttachProcess(&g_Core);\r\n        g_pSimpleProgressDlg->AttachHost(hWndParent);\r\n        ProcessMessages();\r\n\r\n        // Set the device information.\r\n        g_pSimpleProgressDlg->SetDevice(Device);\r\n        g_pSimpleProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n        // Begin erasing the disc.\r\n        if (!g_Core.FixateDisc(Device,g_pSimpleProgressDlg,\r\n            g_FixateSettings.m_bEject,\r\n            g_FixateSettings.m_bSimulate))\r\n        {\r\n            g_pSimpleProgressDlg->set_status(lngGetString(PROGRESS_CANCELED));\r\n            g_pSimpleProgressDlg->notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n            g_pSimpleProgressDlg->NotifyCompleted();\r\n\r\n            lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        }\r\n\r\n        // Run the message loop if we're in application mode.\r\n        if (bAppMode)\r\n        {\r\n            iResult = MainLoop.Run();\r\n                _Module.RemoveMessageLoop();\r\n            return iResult;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\n// For testing purposes only.\r\n/*int CActionManager::VerifyCompilation(HWND hWndParent)\r\n{\r\n    tDeviceInfo *pDeviceInfo = g_DeviceManager.GetDeviceInfo(g_BurnImageSettings.m_iRecorder);\r\n    tDeviceCap *pDeviceCap = g_DeviceManager.GetDeviceCap(g_BurnImageSettings.m_iRecorder);\r\n    tDeviceInfoEx *pDeviceInfoEx = g_DeviceManager.GetDeviceInfoEx(g_BurnImageSettings.m_iRecorder);\r\n\r\n    // Disable the parent window.\r\n    if (hWndParent != NULL)\r\n        ::EnableWindow(hWndParent,false);\r\n\r\n    // Create and display the progress dialog.\r\n    g_pProgressDlg->SetAppMode(false);\r\n\r\n    if (!g_pProgressDlg->IsWindow())\r\n        g_pProgressDlg->Create(hWndParent);\r\n\r\n    g_pProgressDlg->ShowWindow(true);\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_BURNIMAGE));\r\n    g_pProgressDlg->Reset();\r\n    g_pProgressDlg->AttachProcess(&g_Core);\r\n    g_pProgressDlg->AttachHost(hWndParent);\r\n    ProcessMessages();\r\n\r\n    // Set the device information.\r\n    TCHAR szDeviceName[128];\r\n    g_DeviceManager.GetDeviceName(pDeviceInfo,szDeviceName);\r\n\r\n    g_pProgressDlg->SetDevice(szDeviceName);\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    // Get the device drive letter.\r\n    TCHAR szDriveLetter[3];\r\n    szDriveLetter[1] = ':';\r\n    szDriveLetter[2] = '\\0';\r\n\r\n    bool bFoundDriveLetter = true;\r\n    if (!SCSIGetDriveLetter(2,1,0,szDriveLetter[0]))\r\n    {\r\n        // This is not water proof. External USB and FireWire devices will fail the above\r\n        // function call because USB and FireWire devices can't return an address on the\r\n        // requested form since the USB and FireWire bus can contain multiple devices.\r\n        // In a second attempt to locate the drive a search is performed by the device name.\r\n        // If two identical devices are connected (same revision) to the system there will\r\n        // be a conflict. Maybe I should solve this by using the ASPI driver?\r\n        if (!SCSIGetDriveLetter(pDeviceInfo->szVendor,pDeviceInfo->szIdentification,\r\n            pDeviceInfo->szRevision,szDriveLetter[0]))\r\n        {\r\n            bFoundDriveLetter = false;\r\n        }\r\n    }\r\n\r\n    if (bFoundDriveLetter)\r\n    {\r\n        // Validate the project files.\r\n        g_ProjectManager.VerifyCompilation(g_pProgressDlg,szDriveLetter);\r\n    }\r\n    else\r\n    {\r\n        // Add to progress dialog instead?\r\n        MessageBox(hWndParent,_T(\"InfraRecorder was unable to determine the drive letter of your recorder. The disc can not be verified.\"),lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n    }\r\n\r\n    // We're done.\r\n    g_pProgressDlg->set_progress(100);\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n    g_pProgressDlg->NotifyCompleted();\r\n\r\n    return 0;\r\n}*/"
  },
  {
    "path": "src/app/action_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CActionManager\r\n{\r\nprivate:\r\n    class CEraseParam\r\n    {\r\n    public:\r\n        bool m_bNotifyCompleted;\r\n\r\n        CEraseParam(bool bNotifyCompleted) : m_bNotifyCompleted(bNotifyCompleted) {}\r\n    };\r\n\r\n    static DWORD WINAPI BurnCompilationThread(LPVOID lpThreadParameter);\r\n    static DWORD WINAPI CreateImageThread(LPVOID lpThreadParameter);\r\n    static DWORD WINAPI CopyDiscOnFlyThread(LPVOID lpThreadParameter);\r\n    static DWORD WINAPI CopyDiscThread(LPVOID lpThreadParameter);\r\n    static DWORD WINAPI EraseThread(LPVOID lpThreadParameter);\r\n\r\n    void QuickErase(ckmmc::Device &Device);\r\n    bool QuickEraseQuery(ckmmc::Device &Device,HWND hWndParent);\r\n\r\npublic:\r\n    CActionManager();\r\n    ~CActionManager();\r\n\r\n    INT_PTR BurnCompilation(HWND hWndParent,bool bAppMode);\r\n    INT_PTR CreateImage(HWND hWndParent,bool bAppMode);\r\n    INT_PTR BurnImage(HWND hWndParent,bool bAppMode);\r\n    INT_PTR BurnImageEx(HWND hWndParent,bool bAppMode,const TCHAR *szFilePath);\r\n    INT_PTR CopyDisc(HWND hWndParent,bool bAppMode);\r\n    INT_PTR CopyImage(HWND hWndParent,bool bAppMode);\r\n    INT_PTR ManageTracks(bool bAppMode);\r\n    INT_PTR Erase(HWND hWndParent,bool bAppMode);\r\n    INT_PTR Fixate(HWND hWndParent,bool bAppMode);\r\n\r\n    // For testing purposes only.\r\n    //int VerifyCompilation(HWND hWndParent);\r\n};\r\n\r\nextern CActionManager g_ActionManager;\r\n"
  },
  {
    "path": "src/app/advanced_progress.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"advanced_progress.hh\"\r\n\r\nvoid CAdvancedProgress::SetBuffer(int iPercent)\r\n{\r\n    // Do nothing.\r\n}\r\n"
  },
  {
    "path": "src/app/advanced_progress.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/progress.hh>\r\n\r\n#define PROGRESS_STRINGBUFFER_SIZE\t\t256\r\n\r\nclass CAdvancedProgress : public ckcore::Progress\r\n{\r\nprotected:\r\n    // Should be used by inheritors when parsing the variable argument list passed\r\n    // to the AddLogEntry and SetStatus functions.\r\n    TCHAR m_szStringBuffer[PROGRESS_STRINGBUFFER_SIZE];\r\n\r\npublic:\r\n    // Called when the operation is complteted.\r\n    virtual void NotifyCompleted() = 0;\r\n\r\n    // Should be set to true when a real writing process is started.\r\n    virtual void SetRealMode(bool bRealMode) = 0;\r\n\r\n    // Not forced to be implemented by inheritor.\r\n    virtual void SetBuffer(int iPercent);\r\n\r\n    virtual void AllowReload() = 0;\r\n    virtual void AllowCancel(bool bAllow) = 0;\r\n\r\n    virtual bool RequestNextDisc() = 0;\r\n\r\n    // Starts the smoke effect.\r\n    virtual void StartSmoke() = 0;\r\n};\r\n"
  },
  {
    "path": "src/app/atl_compat.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\ninline ATL::CWindow GetParentWindow(const ATL::CWindow *pWnd)\r\n{\r\n    // Version 3.0 of the ATL library does not have the CWindow::GetParent()\r\n    // overload that returns a CWindow object. Unfortunately, ATL 3.0 is the\r\n    // latest freely available version of the ATL library, it comes with the\r\n    // Microsoft Windows Server 2003 R2 Platform SDK. Supporting ATL 3.0 means\r\n    // you can compile InfraRecorder with Visual Studio 2005 Express, which is\r\n    // also free. WTL 8.0 also supports ATL 3.0 / Visual Studio 2005 Express,\r\n    // see the bundled readme file.\r\n    //\r\n    // The missing GetParent() overload is actually very handy, and this routine\r\n    // is a good workaround that works on both ATL 3.0 and the newer versions.\r\n    //\r\n    // An alternative to this routine would be to manually add the missing\r\n    // overload to the ATL 3.0 headers. This is however cumbersome for the casual\r\n    // developer who just wants to compile the project once. Modifying the\r\n    // standard headers may also cause compilation trouble in other projects or\r\n    // with other versions of Visual Studio.\r\n\r\n#if _ATL_VER <= 0x0300\r\n    return ATL::CWindow(pWnd->GetParent());\r\n#else\r\n    // Use the one that comes with ATL.\r\n    return pWnd->GetParent();\r\n#endif\r\n}\r\n\r\n#if _ATL_VER <= 0x0300\r\n    #pragma comment(lib,\"shell32\")\r\n    #pragma comment(lib,\"gdi32\")\r\n    #pragma comment(lib,\"comdlg32\")\r\n#endif\r\n"
  },
  {
    "path": "src/app/control/custom_button.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"custom_button.hh\"\r\n\r\nCCustomButton::CCustomButton(unsigned short usCoverPng,int iCoverLeft,int iCoverRight) :\r\n    m_State(STATE_NORMAL),m_iCoverLeft(iCoverLeft),m_iCoverTop(iCoverRight)\r\n{\r\n    // Load the images.\r\n    m_CoverImage.Open(usCoverPng);\r\n    m_NormalImage.Open(IDR_BUTTONNPNG);\r\n    m_FocusImage.Open(IDR_BUTTONFPNG);\r\n    m_HoverImage.Open(IDR_BUTTONHPNG);\r\n    m_HoverFocusImage.Open(IDR_BUTTONHFPNG);\r\n}\r\n\r\nCCustomButton::~CCustomButton()\r\n{\r\n}\r\n\r\nLRESULT CCustomButton::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    TRACKMOUSEEVENT\ttme = { 0 };\r\n\r\n    tme.cbSize = sizeof(TRACKMOUSEEVENT);\r\n    tme.hwndTrack = m_hWnd;\r\n    tme.dwFlags = TME_LEAVE;\r\n    tme.dwHoverTime\t= 10000;\r\n    bool bMouseHover = TrackMouseEvent(&tme) == TRUE;\r\n    if (bMouseHover && m_State == STATE_NORMAL)\r\n    {\r\n        m_State = STATE_HOT;\r\n\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomButton::OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_State = STATE_NORMAL;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    InvalidateRect(&rcClient);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomButton::OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_State == STATE_HOT)\r\n    {\r\n        m_State = STATE_DOWN;\r\n\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomButton::OnLButtonUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_State == STATE_DOWN)\r\n    {\r\n        m_State = STATE_HOT;\r\n\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomButton::OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return 0;\r\n}\r\n\r\nvoid CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)\r\n{\r\n    CDCHandle dc = lpDrawItemStruct->hDC;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    FillRect(dc,&rcClient,GetSysColorBrush(COLOR_WINDOW));\r\n\r\n    switch (m_State)\r\n    {\r\n        case STATE_NORMAL:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_FocusImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_NormalImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n\r\n        case STATE_HOT:\r\n        case STATE_DOWN:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_HoverFocusImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_HoverImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n    }\r\n\r\n    m_CoverImage.Draw(dc,m_iCoverLeft,m_iCoverTop,rcClient.right,rcClient.bottom);\r\n\r\n    ReleaseDC(dc);\r\n}\r\n"
  },
  {
    "path": "src/app/control/custom_button.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"png_file.hh\"\r\n\r\nclass CCustomButton : public CWindowImpl<CCustomButton,CButton>,\r\n    public COwnerDraw<CCustomButton>\r\n{\r\nprivate:\r\n    enum eState\r\n    {\r\n        STATE_NORMAL,\r\n        STATE_HOT,\r\n        STATE_DOWN\r\n    };\r\n\r\n    eState m_State;\r\n    int m_iCoverLeft;\r\n    int m_iCoverTop;\r\n\r\n    CPngFile m_CoverImage;\r\n    CPngFile m_NormalImage;\r\n    CPngFile m_FocusImage;\r\n    CPngFile m_HoverImage;\r\n    CPngFile m_HoverFocusImage;\r\n\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckButton\"));\r\n\r\n    CCustomButton(unsigned short usCoverPng,int iCoverLeft,int iCoverRight);\r\n    ~CCustomButton();\r\n\r\n    BEGIN_MSG_MAP(CCustomButton)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WM_MOUSELEAVE,OnMouseLeave)\r\n        //MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)\r\n        //MESSAGE_HANDLER(WM_LBUTTONUP,OnLButtonUp)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)\r\n\r\n        CHAIN_MSG_MAP_ALT(COwnerDraw<CCustomButton>,1)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    // For ownerdraw.\r\n    void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_combo_box.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"custom_combo_box.hh\"\r\n\r\n/*\r\n    A custom combo box control that provides item icons to the left of the text.\r\n    The data property determines the icon index of an combo box item.\r\n\r\n    To get proper dimensions:\r\n      m_TrackCombo.SetItemHeight( 0,16);\r\n      m_TrackCombo.SetItemHeight(-1,16);\t// Static item.\r\n*/\r\nCCustomComboBox::CCustomComboBox() : m_hImageList(NULL),m_iImageList(0)\r\n{\r\n}\r\n\r\nCCustomComboBox::~CCustomComboBox()\r\n{\r\n}\r\n\r\nvoid CCustomComboBox::SetImageList(HIMAGELIST hImageList,int iImageList)\r\n{\r\n    m_hImageList = hImageList;\r\n    m_iImageList = iImageList;\r\n}\r\n\r\nvoid CCustomComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)\r\n{\r\n    CDCHandle dc = lpDrawItemStruct->hDC;\r\n    RECT rcItem = lpDrawItemStruct->rcItem;\r\n    \r\n    bool bSelected = (lpDrawItemStruct->itemState & ODS_SELECTED) != 0;\r\n    bool bFocused = (lpDrawItemStruct->itemState & ODS_FOCUS) != 0;\r\n    bool bDisabled = (lpDrawItemStruct->itemState & ODS_DISABLED) != 0;\r\n\r\n    int iBackgroundColor;\r\n    if (bDisabled)\r\n        iBackgroundColor = COLOR_BTNFACE;\r\n    else if (bSelected)\r\n        iBackgroundColor = COLOR_HIGHLIGHT;\r\n    else\r\n        iBackgroundColor = COLOR_WINDOW;\r\n\r\n    // Draw the background.\r\n    HBRUSH hBackground = ::GetSysColorBrush(iBackgroundColor);\r\n    dc.FillRect(&rcItem,hBackground);\r\n\r\n    // Draw icon.\r\n    if (!bDisabled && m_hImageList != NULL)\r\n    {\r\n        ImageList_Draw(m_hImageList,(int)lpDrawItemStruct->itemData,dc,\r\n            rcItem.left,\r\n            rcItem.top,ILD_TRANSPARENT);\r\n\r\n        rcItem.left += 16 + CUSTOMCOMBO_ICONSPACING;\r\n    }\r\n\r\n    // Draw the text.\r\n    HFONT hOldFont = (HFONT)dc.SelectFont(AtlGetDefaultGuiFont());\r\n\r\n    int iTextColor;\r\n    if (bDisabled)\r\n        iTextColor = COLOR_GRAYTEXT;\r\n    else if (bSelected)\r\n        iTextColor = COLOR_HIGHLIGHTTEXT;\r\n    else\r\n        iTextColor = COLOR_WINDOWTEXT;\r\n\r\n    dc.SetBkMode(TRANSPARENT);\r\n    dc.SetTextColor(::GetSysColor(iTextColor));\r\n\r\n    TCHAR szText[128];\r\n    if (GetLBTextLen(lpDrawItemStruct->itemID) >= (sizeof(szText) / sizeof(TCHAR) - 1))\r\n    {\r\n        TCHAR *szVarText = new TCHAR[GetLBTextLen(lpDrawItemStruct->itemID) + 1];\r\n        GetLBText(lpDrawItemStruct->itemID,szVarText);\r\n\r\n        dc.DrawText(szVarText,lstrlen(szVarText),&rcItem,DT_LEFT | DT_VCENTER | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n        delete [] szVarText;\r\n    }\r\n    else\r\n    {\r\n        GetLBText(lpDrawItemStruct->itemID,szText);\r\n\r\n        dc.DrawText(szText,lstrlen(szText),&rcItem,DT_LEFT | DT_VCENTER | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n    }\r\n\r\n    if (bFocused)\r\n        dc.DrawFocusRect(&rcItem);\r\n\r\n    dc.SelectFont(hOldFont);\r\n}\r\n"
  },
  {
    "path": "src/app/control/custom_combo_box.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define CUSTOMCOMBO_ICONSPACING\t\t\t1\r\n\r\nclass CCustomComboBox : public CWindowImpl<CCustomComboBox,CComboBox>,\r\n    public COwnerDraw<CCustomComboBox>\r\n{\r\nprivate:\r\n    HIMAGELIST m_hImageList;\r\n    int m_iImageList;\r\n\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckComboBox\"));\r\n\r\n    CCustomComboBox();\r\n    ~CCustomComboBox();\r\n\r\n    BEGIN_MSG_MAP(CCustomComboBox)\r\n        CHAIN_MSG_MAP_ALT(COwnerDraw<CCustomComboBox>,1)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnChar(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void SetImageList(HIMAGELIST hImageList,int iImageList);\r\n\r\n    // For ownerdraw.\r\n    void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_container.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"custom_container.hh\"\r\n#include \"settings.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"main_frm.hh\"\r\n\r\nCCustomContainer::CCustomContainer()\r\n{\r\n    m_iHeaderHeight = 0;\r\n\r\n    m_hWndCustomDraw = NULL;\r\n    m_iControlID = -1;\r\n}\r\n\r\nCCustomContainer::~CCustomContainer()\r\n{\r\n}\r\n\r\nvoid CCustomContainer::SetCustomDrawHandler(HWND hWndCustomDraw,int iID)\r\n{\r\n    m_hWndCustomDraw = hWndCustomDraw;\r\n    m_iControlID = iID;\r\n}\r\n\r\nvoid CCustomContainer::SetClient(HWND hWndClient)\r\n{\r\n    m_ClientWindow = hWndClient;\r\n\r\n    UpdateLayout();\r\n}\r\n\r\nvoid CCustomContainer::SetImageList(HIMAGELIST hImageList)\r\n{\r\n    m_ToolBar.SetImageList(hImageList);\r\n    //m_ToolBar.SetButtonStructSize();\r\n}\r\n\r\nvoid CCustomContainer::UpdateLayout()\r\n{\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    UpdateLayout(rcClient.right,rcClient.bottom);\r\n}\r\n\r\nvoid CCustomContainer::UpdateLayout(int iWidth,int iHeight)\r\n{\r\n    RECT rcHeader = { 0,0,iWidth,m_iHeaderHeight };\r\n\r\n    if (m_ClientWindow.m_hWnd != NULL)\r\n        m_ClientWindow.SetWindowPos(NULL,0,m_iHeaderHeight,iWidth,iHeight - m_iHeaderHeight,SWP_NOZORDER);\r\n    else\r\n        rcHeader.bottom = iHeight;\r\n\r\n    InvalidateRect(&rcHeader);\r\n}\r\n\r\nvoid CCustomContainer::AddToolBarSeparator()\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_SEP;\r\n    tbButton.iBitmap = 0;\r\n    tbButton.idCommand = 0;\r\n    tbButton.iString = 0;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CCustomContainer::AddToolBarButton(int iCommand,int iBitmap)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = NULL;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CCustomContainer::UpdateToolBar()\r\n{\r\n    // Update the toolbar position.\r\n    int iToolBarWidth = 0;\r\n    RECT rcButton;\r\n\r\n    for (int i = 0; i < m_ToolBar.GetButtonCount(); i++)\r\n    {\r\n        m_ToolBar.GetItemRect(i,&rcButton);\r\n        iToolBarWidth += rcButton.right - rcButton.left;\r\n    }\r\n\r\n    m_iHeaderHeight = HIWORD(m_ToolBar.GetButtonSize());\r\n    m_ToolBar.SetWindowPos(NULL,0,0,iToolBarWidth,m_iHeaderHeight,0);\r\n}\r\n\r\nvoid CCustomContainer::EnableToolbarButton(int iID,bool bEnable)\r\n{\r\n    m_ToolBar.EnableButton(iID,bEnable);\r\n}\r\n\r\nLRESULT CCustomContainer::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    RECT rcToolBar = { 0,0,100,100 };\r\n    m_ToolBar.Create(m_hWnd,rcToolBar,NULL,ATL_SIMPLE_TOOLBAR_PANE_STYLE,NULL);\r\n    m_ToolBar.SetButtonStructSize();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomContainer::OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    UpdateLayout(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomContainer::OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_ClientWindow.m_hWnd != NULL)\r\n        m_ClientWindow.SetFocus();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomContainer::OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Redirect messages to the parent.\r\n    if (m_ToolBar.m_hWnd != NULL && (HWND)lParam == m_ToolBar.m_hWnd)\r\n        return ::SendMessage(GetParent(),WM_COMMAND,wParam,(LPARAM)m_hWnd);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CCustomContainer::OnGetIShellBrowser(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // This is very important, we need to redirect this message to the main frame that can return\r\n    // the correct IShellBrowser object. If we do not answer to this message the CreateViewObject\r\n    // function call will fail on Windows 98 systems for all other directories than the desktop.\r\n    bHandled = TRUE;\r\n    return ::SendMessage(*g_pMainFrame,WM_GETISHELLBROWSER,wParam,lParam);\r\n}\r\n\r\nLRESULT CCustomContainer::OnCustomDraw(int idCtrl,LPNMHDR pnmh,BOOL &bHandled)\r\n{\r\n    if (m_hWndCustomDraw != NULL && idCtrl == m_iControlID)\r\n        return ::SendMessage(m_hWndCustomDraw,WM_CONTROLCUSTOMDRAW,0,(LPARAM)pnmh);\r\n        \r\n    bHandled = false;\r\n    return CDRF_DODEFAULT;\r\n}\r\n\r\nLRESULT CCustomContainer::OnToolBarGetInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // The string ID is the same as the button ID.\r\n    LPTOOLTIPTEXT pTipText = (LPTOOLTIPTEXT)pNMH;\r\n    //pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a hint translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr((unsigned long)pTipText->hdr.idFrom,szStrValue))\r\n            {\r\n                pTipText->lpszText = szStrValue;\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    // I am not sure if I want the tool tips to be displayed on the toolbar.\r\n    // This method is also to slow.\r\n    /*TCHAR szBuffer[256];\r\n    LoadString(_Module.GetResourceInstance(),pTipText->hdr.idFrom,szBuffer,sizeof(szBuffer) / sizeof(TCHAR));\r\n    m_StatusBar.SetPaneText(ID_DEFAULT_PANE,szBuffer);*/\r\n\r\n    pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n    return 0;\r\n}\r\n\r\nint CCustomContainer::GetHeaderHeight()\r\n{\r\n    return m_iHeaderHeight;\r\n}"
  },
  {
    "path": "src/app/control/custom_container.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#ifndef WM_GETISHELLBROWSER\r\n    #define WM_GETISHELLBROWSER\t\t\t\tWM_USER + 7\r\n#endif\r\n\r\nclass CCustomContainer : public CWindowImpl<CCustomContainer,CWindow,CControlWinTraits>\r\n{\r\nprivate:\r\n    CToolBarCtrl m_ToolBar;\r\n    CWindow m_ClientWindow;\r\n\r\n    int m_iHeaderHeight;\r\n\r\n    // Handle to the control that should receivce custom draw messages.\r\n    HWND m_hWndCustomDraw;\r\n    int m_iControlID;\r\n\r\npublic:\r\n    static CWndClassInfo &GetWndClassInfo()\r\n    {\r\n        static CWndClassInfo wc =\r\n        {\r\n            {\r\n                sizeof(WNDCLASSEX),CS_DBLCLKS,\r\n                StartWindowProc,0,0,NULL,NULL,NULL,\r\n                GetSysColorBrush(COLOR_BTNFACE),NULL,\r\n                _T(\"ckCustomContainer\"),NULL\r\n            },\r\n            NULL,NULL,IDC_ARROW,TRUE,0,_T(\"\")\r\n        };\r\n\r\n        return wc;\r\n    }\r\n\r\n    CCustomContainer();\r\n    ~CCustomContainer();\r\n\r\n    void SetCustomDrawHandler(HWND hWndCustomDraw,int iID);\r\n\r\n    BEGIN_MSG_MAP(CCustomContainer)\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_SIZE,OnSize)\r\n        MESSAGE_HANDLER(WM_SETFOCUS,OnSetFocus)\r\n        MESSAGE_HANDLER(WM_COMMAND,OnCommand)\r\n        MESSAGE_HANDLER(WM_GETISHELLBROWSER,OnGetIShellBrowser)\r\n\r\n        NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW,OnCustomDraw)\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnToolBarGetInfo)\r\n        FORWARD_NOTIFICATIONS()\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnCustomDraw(int idCtrl,LPNMHDR pnmh,BOOL &bHandled);\r\n    LRESULT OnGetIShellBrowser(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnToolBarGetInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    void SetClient(HWND hWndClient);\r\n    void SetImageList(HIMAGELIST hImageList);\r\n\r\n    void UpdateLayout();\r\n    void UpdateLayout(int iWidth,int iHeight);\r\n\r\n    void AddToolBarSeparator();\r\n    void AddToolBarButton(int iCommand,int iBitmap);\r\n    void UpdateToolBar();\r\n    void EnableToolbarButton(int iID,bool bEnable);\r\n\r\n    int GetHeaderHeight();\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_edit_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"custom_edit_ctrl.hh\"\r\n\r\nCCustomEditCtrl::CCustomEditCtrl()\r\n{\r\n}\r\n\r\nCCustomEditCtrl::~CCustomEditCtrl()\r\n{\r\n}\r\n\r\n/*\r\n    CCustomEditCtrl::OnChar\r\n    -----------------------\r\n    This edit control works like a regular edit control except that it does not\r\n    allow the | (pipe) character.\r\n*/\r\nLRESULT CCustomEditCtrl::OnChar(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = wParam == '|';\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/control/custom_edit_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CCustomEditCtrl : public CWindowImpl<CCustomEditCtrl,CEdit>\r\n{\r\npublic:\r\n    CCustomEditCtrl();\r\n    ~CCustomEditCtrl();\r\n\r\n    BEGIN_MSG_MAP(CCustomEditCtrl)\r\n        MESSAGE_HANDLER(WM_CHAR,OnChar)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnChar(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_header_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"custom_header_ctrl.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"tree_manager.hh\"\r\n\r\nCCustomHeaderCtrl::CCustomHeaderCtrl()\r\n{\r\n    m_bSortUp = true;\r\n    m_iSortCol = 0;\r\n}\r\n\r\nvoid CCustomHeaderCtrl::SetSortColumn(unsigned int uiColIndex,bool bSortUp)\r\n{\r\n    m_bSortUp = bSortUp;\r\n    m_iSortCol = uiColIndex;\r\n\r\n    HDITEM hdColumn;\r\n    hdColumn.mask = HDI_FORMAT;\r\n    GetItem(m_iSortCol,&hdColumn);\r\n\r\n    if (m_bSortUp)\r\n    {\r\n        hdColumn.fmt |= HDF_SORTUP;\r\n        hdColumn.fmt &= ~HDF_SORTDOWN;\r\n    }\r\n    else\r\n    {\r\n        hdColumn.fmt |= HDF_SORTDOWN;\r\n        hdColumn.fmt &= ~HDF_SORTUP;\r\n    }\r\n\r\n    SetItem(m_iSortCol,&hdColumn);\r\n}\r\n\r\nLRESULT CCustomHeaderCtrl::OnSetSortColumn(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    SetSortColumn((unsigned int)wParam,lParam == 0);\r\n    return 0;\r\n}\r\n\r\nvoid CCustomHeaderCtrl::ColumnClick(unsigned int uiColIndex)\r\n{\r\n    if (m_iSortCol == uiColIndex)\r\n    {\r\n        // Set the new sort arrow.\r\n        SetSortColumn(uiColIndex,!m_bSortUp);\r\n    }\r\n    else\r\n    {\r\n        // Remove the sort arrow from the previous column.\r\n        HDITEM hdColumn;\r\n        hdColumn.mask = HDI_FORMAT;\r\n        GetItem(m_iSortCol,&hdColumn);\r\n        hdColumn.fmt &= ~(m_bSortUp ? HDF_SORTUP : HDF_SORTDOWN);\r\n        SetItem(m_iSortCol,&hdColumn);\r\n\r\n        // Set the new sort arrow.\r\n        SetSortColumn(uiColIndex,true);\r\n    }\r\n\r\n    // Do the sorting.\r\n    g_TreeManager.GetCurrentNode()->Sort(uiColIndex,m_bSortUp,g_ProjectManager.GetViewType() != PROJECTVIEWTYPE_DATA);\r\n    g_TreeManager.Refresh();\r\n}\r\n"
  },
  {
    "path": "src/app/control/custom_header_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"ctrl_messages.hh\"\r\n\r\n#if (_WIN32_WINNT < 0x501)\r\n#define HDF_SORTUP              0x0400\r\n#define HDF_SORTDOWN            0x0200\r\n#endif\r\n\r\nclass CCustomHeaderCtrl : public CWindowImpl<CCustomHeaderCtrl,CHeaderCtrl>\r\n{\r\nprivate:\r\n    bool m_bSortUp;\r\n    unsigned int m_iSortCol;\r\n\r\n    void SetSortColumn(unsigned int uiColIndex,bool bSortUp);\r\n\r\npublic:\r\n    CCustomHeaderCtrl();\r\n\r\n    BEGIN_MSG_MAP(CCustomHeaderCtrl)\r\n        MESSAGE_HANDLER(WM_CHC_SETSORTCOLUMN,OnSetSortColumn)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnSetSortColumn(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void ColumnClick(unsigned int uiColIndex);\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_multi_button.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"custom_multi_button.hh\"\r\n\r\nCCustomMultiButton::CCustomMultiButton(long lCtrlMainId,long lCtrlSub1Id,long lCtrlSub2Id,\r\n                                       unsigned short usCoverPng,int iCoverLeft,int iCoverRight) :\r\n    m_lCtrlMainId(lCtrlMainId),m_lCtrlSub1Id(lCtrlSub1Id),m_lCtrlSub2Id(lCtrlSub2Id),\r\n    m_State(STATE_NORMAL),m_iCoverLeft(iCoverLeft),m_iCoverTop(iCoverRight)\r\n{\r\n    // Load the images.\r\n    m_CoverImage.Open(usCoverPng);\r\n    m_NormalImage.Open(IDR_MBUTTONNPNG);\r\n    m_FocusImage.Open(IDR_MBUTTONFPNG);\r\n    m_HoverImage.Open(IDR_MBUTTONHPNG);\r\n    m_HoverSub1Image.Open(IDR_MBUTTONHS1PNG);\r\n    m_HoverSub2Image.Open(IDR_MBUTTONHS2PNG);\r\n    m_HoverFocusImage.Open(IDR_MBUTTONFPNG);\r\n    m_HoverFocusSub1Image.Open(IDR_MBUTTONHFS1PNG);\r\n    m_HoverFocusSub2Image.Open(IDR_MBUTTONHFS2PNG);\r\n}\r\n\r\nCCustomMultiButton::~CCustomMultiButton()\r\n{\r\n}\r\n\r\nLRESULT CCustomMultiButton::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    TRACKMOUSEEVENT\ttme = { 0 };\r\n\r\n    tme.cbSize = sizeof(TRACKMOUSEEVENT);\r\n    tme.hwndTrack = m_hWnd;\r\n    tme.dwFlags = TME_LEAVE;\r\n    tme.dwHoverTime\t= 10000;\r\n    TrackMouseEvent(&tme);\r\n\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    eState NewState;\r\n    if (iPosX < SPLITTER_X)\r\n        NewState = STATE_HOTMAIN;\r\n    else if (iPosY < SPLITTER_Y)\r\n        NewState = STATE_HOTSUB1;\r\n    else\r\n        NewState = STATE_HOTSUB2;\r\n\r\n    if (NewState != m_State)\r\n    {\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    m_State = NewState;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomMultiButton::OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_State = STATE_NORMAL;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    InvalidateRect(&rcClient);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomMultiButton::OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_State == STATE_HOTMAIN ||\r\n        m_State == STATE_HOTSUB1 ||\r\n        m_State == STATE_HOTSUB2)\r\n    {\r\n        m_State = STATE_DOWN;\r\n\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomMultiButton::OnLButtonUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_State == STATE_DOWN)\r\n    {\r\n        m_State = STATE_HOTMAIN;\r\n\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    // Take action.\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    if (iPosX < SPLITTER_X)\r\n        ::PostMessage(GetParent(),WM_COMMAND,m_lCtrlMainId,0);\r\n    else if (iPosY < SPLITTER_Y)\r\n        ::PostMessage(GetParent(),WM_COMMAND,m_lCtrlSub1Id,0);\r\n    else\r\n        ::PostMessage(GetParent(),WM_COMMAND,m_lCtrlSub2Id,0);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomMultiButton::OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return 0;\r\n}\r\n\r\nvoid CCustomMultiButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)\r\n{\r\n    CDCHandle dc = lpDrawItemStruct->hDC;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    FillRect(dc,&rcClient,GetSysColorBrush(COLOR_WINDOW));\r\n\r\n    switch (m_State)\r\n    {\r\n        case STATE_NORMAL:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_FocusImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_NormalImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n\r\n        case STATE_HOTMAIN:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_HoverFocusImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_HoverImage.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n\r\n        case STATE_HOTSUB1:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_HoverFocusSub1Image.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_HoverSub1Image.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n\r\n        case STATE_HOTSUB2:\r\n            if (lpDrawItemStruct->itemState & ODS_FOCUS)\r\n                m_HoverFocusSub2Image.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            else\r\n                m_HoverSub2Image.Draw(dc,0,0,rcClient.right,rcClient.bottom);\r\n            break;\r\n    }\r\n\r\n    m_CoverImage.Draw(dc,m_iCoverLeft,m_iCoverTop,rcClient.right,rcClient.bottom);\r\n\r\n    ReleaseDC(dc);\r\n}\r\n"
  },
  {
    "path": "src/app/control/custom_multi_button.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"png_file.hh\"\r\n\r\nclass CCustomMultiButton : public CWindowImpl<CCustomMultiButton,CButton>,\r\n    public COwnerDraw<CCustomMultiButton>\r\n{\r\nprivate:\r\n    enum eState\r\n    {\r\n        STATE_NORMAL,\r\n        STATE_HOTMAIN,\r\n        STATE_HOTSUB1,\r\n        STATE_HOTSUB2,\r\n        STATE_DOWN\r\n    };\r\n\r\n    enum\r\n    {\r\n        SPLITTER_X = 99,\r\n        SPLITTER_Y = 36\r\n    };\r\n\r\n    eState m_State;\r\n    long m_lCtrlMainId;\r\n    long m_lCtrlSub1Id;\r\n    long m_lCtrlSub2Id;\r\n    int m_iCoverLeft;\r\n    int m_iCoverTop;\r\n\r\n    CPngFile m_CoverImage;\r\n    CPngFile m_NormalImage;\r\n    CPngFile m_FocusImage;\r\n    CPngFile m_HoverImage;\r\n    CPngFile m_HoverSub1Image;\r\n    CPngFile m_HoverSub2Image;\r\n    CPngFile m_HoverFocusImage;\r\n    CPngFile m_HoverFocusSub1Image;\r\n    CPngFile m_HoverFocusSub2Image;\r\n\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckMultiButton\"));\r\n\r\n    CCustomMultiButton(long lCtrlMainId,long lCtrlSub1Id,long lCtrlSub2Id,\r\n        unsigned short usCoverPng,int iCoverLeft,int iCoverRight);\r\n    ~CCustomMultiButton();\r\n\r\n    BEGIN_MSG_MAP(CCustomMultiButton)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WM_MOUSELEAVE,OnMouseLeave)\r\n        MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)\r\n        MESSAGE_HANDLER(WM_LBUTTONUP,OnLButtonUp)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)\r\n\r\n        CHAIN_MSG_MAP_ALT(COwnerDraw<CCustomMultiButton>,1)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    // For ownerdraw.\r\n    void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);\r\n};\r\n"
  },
  {
    "path": "src/app/control/custom_toolbar_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"custom_toolbar_ctrl.hh\"\r\n#include \"main_frm.hh\"\r\n\r\nCCustomToolBarCtrl::CCustomToolBarCtrl()\r\n{\r\n}\r\n\r\nCCustomToolBarCtrl::~CCustomToolBarCtrl()\r\n{\r\n}\r\n\r\nLRESULT CCustomToolBarCtrl::OnRButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    POINT ptCursor;\r\n    GetCursorPos(&ptCursor);\r\n\r\n    HMENU hToolBarsMenu = g_pMainFrame->GetToolBarsMenu();\r\n\r\n    // Force the popup menu items to update. This is needed since WTL seems to be lazy\r\n    // and only want to refresh the corresponding main menu items when needed.\r\n    CMainFrame::_AtlUpdateUIData UIData;\r\n    UIData.m_lpData = NULL;\r\n\r\n    UIData.m_wState = (WORD)g_pMainFrame->UIGetState(ID_VIEW_STANDARDTOOLBAR);\r\n    g_pMainFrame->UIUpdateMenuBarElement(ID_VIEW_STANDARDTOOLBAR,&UIData,hToolBarsMenu);\r\n\r\n    // Show the popup menu.\r\n    TrackPopupMenuEx(hToolBarsMenu,0,ptCursor.x,ptCursor.y,m_hWnd,NULL);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCustomToolBarCtrl::OnLButtonDblClk(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // We don't want to display the original customize toolbar dialog when the\r\n    // toolbar is double-clicked on.\r\n    bHandled = true;\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/control/custom_toolbar_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CCustomToolBarCtrl : public CWindowImpl<CCustomToolBarCtrl,CToolBarCtrl>\r\n{\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckToolBar\"));\r\n\r\n    CCustomToolBarCtrl();\r\n    ~CCustomToolBarCtrl();\r\n\r\n    BEGIN_MSG_MAP(CCustomToolBarCtrl)\r\n        MESSAGE_HANDLER(WM_RBUTTONDOWN,OnRButtonDown)\r\n        MESSAGE_HANDLER(WM_LBUTTONDBLCLK,OnLButtonDblClk)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnRButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonDblClk(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/double_buffered_static.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"double_buffered_static.hh\"\r\n\r\nCDoubleBufferedStatic::CDoubleBufferedStatic()\r\n{\r\n    m_Text.reserve(DOUBLEBUFFEREDSTATIC_RESERVE_LENGTH);\r\n}\r\n\r\nCDoubleBufferedStatic::~CDoubleBufferedStatic()\r\n{\r\n}\r\n\r\nvoid CDoubleBufferedStatic::SetWindowText(const TCHAR *szWindowText)\r\n{\r\n    m_Text = szWindowText;\r\n\r\n    RedrawWindow();\r\n}\r\n\r\nLRESULT CDoubleBufferedStatic::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CPaintDC dc(m_hWnd);\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    // Setup double buffering.\r\n    HDC hMemDC = CreateCompatibleDC(dc);\r\n    HBITMAP hMemBitmap = CreateCompatibleBitmap(dc,rcClient.right,rcClient.bottom);\r\n    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,hMemBitmap);\r\n \r\n    // Draw the background.\r\n    FillRect(hMemDC,&rcClient,GetSysColorBrush(COLOR_BTNFACE));\r\n\r\n    // Draw the text.\r\n    HFONT hOldFont = (HFONT)SelectObject(hMemDC,AtlGetDefaultGuiFont());\r\n\r\n    ::SetTextColor(hMemDC,GetSysColor(COLOR_BTNTEXT));\r\n    ::SetBkColor(hMemDC,GetSysColor(COLOR_BTNFACE));\r\n\r\n    DrawText(hMemDC,m_Text.c_str(),(int)m_Text.length(),&rcClient,\r\n        DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n\r\n    SelectObject(hMemDC,hOldFont);\r\n\r\n    BitBlt(dc,0,0,rcClient.right,rcClient.bottom,hMemDC,0,0,SRCCOPY);\r\n\r\n    SelectObject(hMemDC,hOldBitmap);\r\n    DeleteDC(hMemDC);\r\n    DeleteObject(hMemBitmap);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nLRESULT CDoubleBufferedStatic::OnEraseBkGnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/control/double_buffered_static.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <base/string_util.hh>\r\n\r\n#define DOUBLEBUFFEREDSTATIC_RESERVE_LENGTH\t\t\t\t256\r\n\r\nclass CDoubleBufferedStatic : public CWindowImpl<CDoubleBufferedStatic,CStatic>\r\n{\r\nprivate:\r\n    tstring m_Text;\r\n\r\npublic:\r\n    CDoubleBufferedStatic();\r\n    ~CDoubleBufferedStatic();\r\n\r\n    void SetWindowText(const TCHAR *szWindowText);\r\n\r\n    BEGIN_MSG_MAP(CDoubleBufferedStatic)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkGnd)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkGnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/drop_down_button.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"drop_down_button.hh\"\r\n\r\nCDropDownButton::CDropDownButton(unsigned int uiMenuID,bool bDrawArrow)\r\n{\r\n    m_bDrawArrow = bDrawArrow;\r\n\r\n    // Menu.\r\n    m_hMenu = LoadMenu(_Module.GetResourceInstance(),MAKEINTRESOURCE(uiMenuID));\r\n\r\n    // Font used for the arrow (if unthemed only).\r\n    CFont apa;\r\n    CLogFont lf = AtlGetDefaultGuiFont();\r\n    lstrcpy(lf.lfFaceName,_T(\"Webdings\"));\r\n    lf.lfCharSet = SYMBOL_CHARSET;\r\n    lf.lfHeight = 18;\r\n\r\n    m_hWebdingsFont = CreateFontIndirect(&lf);\r\n\r\n    // Theme data.\r\n    m_hTheme = NULL;\r\n}\r\n\r\nCDropDownButton::~CDropDownButton()\r\n{\r\n    // Menu.\r\n    DestroyMenu(m_hMenu);\r\n\r\n    // Arrow font.\r\n    DeleteObject(m_hWebdingsFont);\r\n\r\n    // Unload theme data.\r\n    if (m_hTheme != NULL)\r\n        g_VisualStyles.CloseThemeData(m_hTheme);\r\n}\r\n\r\nHMENU CDropDownButton::GetMenu()\r\n{\r\n    return m_hMenu;\r\n}\r\n\r\nBOOL CDropDownButton::SubclassWindow(HWND hWnd)\r\n{\r\n    BOOL bResult = CWindowImpl<CDropDownButton,CButton>::SubclassWindow(hWnd);\r\n\r\n    if (m_bDrawArrow)\r\n    {\r\n        SetButtonStyle(g_VisualStyles.IsAppThemed() ? BS_PUSHBUTTON : BS_OWNERDRAW);\r\n\r\n        // Load theme data.\r\n        if (g_VisualStyles.IsAppThemed())\r\n            m_hTheme = g_VisualStyles.OpenThemeData(m_hWnd,L\"TOOLBAR\");\r\n    }\r\n\r\n    return bResult;\r\n}\r\n\r\nvoid CDropDownButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)\r\n{\r\n    CDCHandle dc = lpDIS->hDC;\r\n    RECT rcItem = lpDIS->rcItem;\r\n    bool bEnabled = (lpDIS->itemState & ODS_DISABLED) == 0;\r\n    bool bFocused = (lpDIS->itemState & ODS_FOCUS) != 0;\r\n\r\n    // Draw the button.\r\n    RECT rcButton = rcItem;\r\n    if (bFocused)\r\n    {\r\n        dc.Draw3dRect(&rcButton,::GetSysColor(COLOR_3DDKSHADOW),::GetSysColor(COLOR_3DDKSHADOW));\r\n        ::InflateRect(&rcButton,-1, -1);\r\n    }\r\n\r\n    unsigned int uiState = 0;\r\n    if (lpDIS->itemState & ODS_SELECTED)\r\n    {\r\n        uiState |= DFCS_PUSHED;\r\n\r\n        ::OffsetRect(&rcItem,1,1);\r\n    }\r\n\r\n    if (!bEnabled)\r\n        uiState |= DFCS_INACTIVE;\r\n\r\n    ::DrawFrameControl(dc,&rcButton,DFC_BUTTON,DFCS_BUTTONPUSH | uiState);\r\n\r\n    // Draw the text.\r\n    TCHAR szText[DROPDOWNBUTTON_MAX_TEXT_SIZE];\r\n    GetWindowText(szText,DROPDOWNBUTTON_MAX_TEXT_SIZE - 1);\r\n\r\n    HFONT hOldFont = dc.SelectFont(GetFont());\r\n    dc.SetBkMode(TRANSPARENT);\r\n    dc.SetTextColor(::GetSysColor(bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT));\r\n\r\n    if (!bEnabled)\r\n    {\r\n        RECT rcText = rcItem;\r\n        RECT rcBound = rcText;\r\n        dc.DrawText(szText,-1,&rcBound,DT_SINGLELINE | DT_LEFT | DT_TOP | DT_CALCRECT);\r\n        ::OffsetRect(&rcText,(rcText.right - rcBound.right) / 2, (rcText.bottom - rcBound.bottom) / 2);\r\n        ::DrawState(dc,NULL,NULL,(LPARAM)szText,0,rcText.left,rcText.top,rcText.right,rcText.bottom,DST_PREFIXTEXT | DSS_DISABLED);\r\n    }\r\n    else\r\n    {\r\n        RECT rcText = rcItem;\r\n        dc.DrawText(szText,-1,&rcText,DT_SINGLELINE | DT_CENTER | DT_VCENTER);\r\n    }\r\n\r\n    // Draw the separator.\r\n    RECT rcSeparator = { rcItem.right - 22,rcItem.top + 5,rcItem.right - 20,rcItem.bottom - 5 };\r\n    dc.Draw3dRect(&rcSeparator,::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_BTNHIGHLIGHT));\r\n    dc.SelectFont(m_hWebdingsFont);\r\n\r\n    RECT rcArrow = { rcItem.right - 18,rcItem.top,rcItem.right,rcItem.bottom };\r\n    dc.DrawText(_T(\"\\x36\"),1,&rcArrow,DT_SINGLELINE | DT_LEFT | DT_VCENTER);\r\n\r\n    HBRUSH hOldBrush = dc.SelectBrush((HBRUSH)::GetStockObject(HOLLOW_BRUSH));\r\n    ::InflateRect(&rcButton,-3,-3);\r\n\r\n    // Draw the focus rectangle.\r\n    if (bFocused)\r\n        dc.DrawFocusRect(&rcButton);\r\n\r\n    dc.SelectBrush(hOldBrush);\r\n    dc.SelectFont(hOldFont);\r\n}\r\n\r\nDWORD CDropDownButton::OnPrePaint(int idCtrl,LPNMCUSTOMDRAW lpNMCD)\r\n{\r\n    return CDRF_NOTIFYPOSTPAINT;\r\n}\r\n\r\nDWORD CDropDownButton::OnPostPaint(int idCtrl,LPNMCUSTOMDRAW lpNMCD)\r\n{\r\n    CDCHandle dc = lpNMCD->hdc;\r\n    RECT rcButton = lpNMCD->rc;\r\n    bool bEnabled = (lpNMCD->uItemState & (CDIS_DISABLED | CDIS_GRAYED)) == 0;\r\n\r\n    // Draw the separator\r\n    RECT rcSeparator = { rcButton.right - 21,rcButton.top + 4,rcButton.right - 19,rcButton.bottom - 4 };\r\n    g_VisualStyles.DrawThemeBackground(m_hTheme,dc,TP_SEPARATOR,TS_NORMAL,&rcSeparator,NULL);\r\n\r\n    // Draw the arrow.\r\n    RECT rcArrow = { rcButton.right - 22,rcButton.top,rcButton.right,rcButton.bottom };\r\n    g_VisualStyles.DrawThemeBackground(m_hTheme,dc,\tTP_SPLITBUTTONDROPDOWN,bEnabled ? TS_NORMAL : TS_DISABLED,&rcArrow,NULL);\r\n    return CDRF_DODEFAULT;\r\n}\r\n\r\nLRESULT CDropDownButton::OnClicked(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    RECT rcButton;\r\n    GetWindowRect(&rcButton);\r\n\r\n    int iID = TrackPopupMenuEx(GetSubMenu(m_hMenu,0),TPM_NONOTIFY | TPM_RETURNCMD,\r\n        rcButton.left,rcButton.bottom,m_hWnd,NULL);\r\n    ::PostMessage(GetParent(),WM_COMMAND,iID,0);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/control/drop_down_button.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#include <atlcrack.h>\t// BEGIN_MSG_MAP_EX\r\n#include \"visual_styles.hh\"\r\n\r\n#define DROPDOWNBUTTON_MAX_TEXT_SIZE\t\t\t64\r\n\r\nclass CDropDownButton : public CWindowImpl<CDropDownButton,CButton>,\r\n    public COwnerDraw<CDropDownButton>,\r\n    public CCustomDraw<CDropDownButton>\r\n{\r\nprivate:\r\n    bool m_bDrawArrow;\r\n    HMENU m_hMenu;\r\n    HFONT m_hWebdingsFont;\r\n    HTHEME m_hTheme;\r\n\r\npublic:\r\n    CDropDownButton(unsigned int uiMenuID,bool bDrawArrow);\r\n    ~CDropDownButton();\r\n\r\n    HMENU GetMenu();\r\n    BOOL SubclassWindow(HWND hWnd);\r\n    void DrawItem(LPDRAWITEMSTRUCT lpDIS);\r\n    DWORD OnPrePaint(int idCtrl,LPNMCUSTOMDRAW lpNMCD);\r\n    DWORD OnPostPaint(int idCtrl,LPNMCUSTOMDRAW lpNMCD);\r\n\r\n#if _ATL_VER <= 0x0300\r\n    BEGIN_MSG_MAP_EX(CDropDownButton)\r\n#else\r\n    BEGIN_MSG_MAP(CDropDownButton)\r\n#endif\r\n        REFLECTED_COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)\r\n\r\n         CHAIN_MSG_MAP_ALT(COwnerDraw<CDropDownButton>,1)\r\n         CHAIN_MSG_MAP_ALT(CCustomDraw<CDropDownButton>,1)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnClicked(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/gradient_static.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/graph_util.hh>\r\n#include \"gradient_static.hh\"\r\n\r\nCGradientStatic::CGradientStatic(COLORREF TopColor) : m_TopColor(TopColor)\r\n{\r\n}\r\n\r\nCGradientStatic::~CGradientStatic()\r\n{\r\n}\r\n\r\nLRESULT CGradientStatic::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LRESULT lResult = DefWindowProc(uMsg,wParam,lParam);\r\n\r\n    HDC hDC = GetWindowDC();\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    DrawVertGradientRect(hDC,&rcClient,m_TopColor,GetSysColor(COLOR_BTNFACE));\r\n\r\n    ReleaseDC(hDC);\r\n\r\n    return lResult;\r\n}\r\n"
  },
  {
    "path": "src/app/control/gradient_static.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CGradientStatic : public CWindowImpl<CGradientStatic,CWindow>\r\n{\r\nprivate:\r\n    COLORREF m_TopColor;\r\n\r\npublic:\r\n    CGradientStatic(COLORREF TopColor);\r\n    ~CGradientStatic();\r\n\r\n    BEGIN_MSG_MAP(CGradientStatic)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/label_container.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"label_container.hh\"\r\n#include <base/graph_util.hh>\r\n#include \"ctrl_messages.hh\"\r\n#include \"version.hh\"\r\n#include \"visual_styles.hh\"\r\n#include \"resource.h\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nCLabelContainer::CLabelContainer(bool bClosable)\r\n{\r\n    m_iHeaderHeight = 0;\r\n\r\n    m_hBorderBrush = ::CreateSolidBrush(LABELCONTAINER_COLOR_BORDER);\r\n    m_szLabelText[0] = '\\0';\r\n\r\n    m_hWndCustomDraw = NULL;\r\n    m_iControlID = -1;\r\n\r\n    // Button releated.\r\n    m_hCloseImageList = NULL;\r\n    m_hWndCloseHost = NULL;\r\n    if (bClosable)\r\n        InitializeImageList();\r\n\r\n    m_iButtonState = PANE_BUTTON_NORMAL;\r\n    m_bButtonDown = false;\r\n}\r\n\r\nCLabelContainer::~CLabelContainer()\r\n{\r\n    if (m_hBorderBrush != NULL)\r\n        ::DeleteObject(m_hBorderBrush);\r\n\r\n    // Destroy the image list.\r\n    if (m_hCloseImageList != NULL)\r\n        ImageList_Destroy(m_hCloseImageList);\r\n}\r\n\r\nvoid CLabelContainer::InitializeImageList()\r\n{\r\n    HBITMAP hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_PANECLOSEBITMAP));\r\n    m_hCloseImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,4);\r\n    ImageList_AddMasked(m_hCloseImageList,hBitmap,RGB(255,0,255));\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nvoid CLabelContainer::SetCustomDrawHandler(HWND hWndCustomDraw,int iID)\r\n{\r\n    m_hWndCustomDraw = hWndCustomDraw;\r\n    m_iControlID = iID;\r\n}\r\n\r\nvoid CLabelContainer::SetClient(HWND hWndClient)\r\n{\r\n    m_ClientWindow = hWndClient;\r\n\r\n    UpdateLayout();\r\n}\r\n\r\nvoid CLabelContainer::SetCloseHost(HWND hWndCloseHost)\r\n{\r\n    m_hWndCloseHost = hWndCloseHost;\r\n}\r\n\r\nvoid CLabelContainer::UpdateLayout()\r\n{\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    UpdateLayout(rcClient.right,rcClient.bottom);\r\n}\r\n\r\nvoid CLabelContainer::UpdateLayout(int iWidth,int iHeight)\r\n{\r\n    RECT rcHeader = { 0,0,iWidth,m_iHeaderHeight };\r\n\r\n    if (m_ClientWindow.m_hWnd != NULL)\r\n        m_ClientWindow.SetWindowPos(NULL,0,m_iHeaderHeight,iWidth,iHeight - m_iHeaderHeight,SWP_NOZORDER);\r\n    else\r\n        rcHeader.bottom = iHeight;\r\n\r\n    InvalidateRect(&rcHeader);\r\n}\r\n\r\nLRESULT CLabelContainer::OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    UpdateLayout(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam));\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_ClientWindow.m_hWnd != NULL)\r\n        m_ClientWindow.SetFocus();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CLabelContainer::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    RECT rcHeader;\r\n    GetClientRect(&rcHeader);\r\n\r\n    rcHeader.bottom = rcHeader.top + m_iHeaderHeight;\r\n\r\n    if (wParam != NULL)\r\n    {\r\n        HDC hDC = (HDC)wParam;\r\n\r\n        DrawBackground(hDC,&rcHeader);\r\n        DrawText(hDC,&rcHeader);\r\n        DrawButton(hDC,&rcHeader);\r\n\r\n        ReleaseDC(hDC);\r\n    }\r\n    else\r\n    {\r\n        CPaintDC dc(m_hWnd);\r\n\r\n        DrawBackground(dc.m_hDC,&rcHeader);\r\n        DrawText(dc.m_hDC,&rcHeader);\r\n        DrawButton(dc.m_hDC,&rcHeader);\r\n\r\n        ReleaseDC(dc);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the panel is closable.\r\n    if (m_hCloseImageList == NULL)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    rcButton.top = rcClient.top + LABELCONTAINER_BUTTON_TOPSPACING;\r\n    rcButton.right = rcClient.right - LABELCONTAINER_BUTTON_RIGHTSPACING;\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    int iNewState;\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        SetCapture();\r\n        if (m_iButtonState != PANE_BUTTON_DOWN)\r\n            iNewState = PANE_BUTTON_HOVER;\r\n        else\r\n            iNewState = PANE_BUTTON_DOWN;\r\n    }\r\n    else\r\n    {\r\n        ReleaseCapture();\r\n        iNewState = PANE_BUTTON_NORMAL;\r\n    }\r\n\r\n    if (iNewState != m_iButtonState)\r\n    {\r\n        m_iButtonState = iNewState;\r\n        InvalidateRect(&rcButton);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnMouseDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the panel is closable.\r\n    if (m_hCloseImageList == NULL)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    rcButton.top = rcClient.top + LABELCONTAINER_BUTTON_TOPSPACING;\r\n    rcButton.right = rcClient.right - LABELCONTAINER_BUTTON_RIGHTSPACING;\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        m_iButtonState = PANE_BUTTON_DOWN;\r\n        InvalidateRect(&rcButton);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnMouseUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the panel is closable.\r\n    if (m_hCloseImageList == NULL)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    rcButton.top = rcClient.top + LABELCONTAINER_BUTTON_TOPSPACING;\r\n    rcButton.right = rcClient.right - LABELCONTAINER_BUTTON_RIGHTSPACING;\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        if (m_iButtonState == PANE_BUTTON_DOWN && m_hWndCloseHost != NULL)\r\n            ::PostMessage(m_hWndCloseHost,WM_LABELCONTAINER_CLOSE,0,0);\r\n\r\n        m_iButtonState = PANE_BUTTON_HOVER;\r\n        InvalidateRect(&rcButton);\r\n    }\r\n    else\r\n    {\r\n        m_iButtonState = PANE_BUTTON_NORMAL;\r\n        InvalidateRect(&rcButton);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CLabelContainer::OnCustomDraw(int idCtrl,LPNMHDR pnmh,BOOL &bHandled)\r\n{\r\n    if (m_hWndCustomDraw != NULL && idCtrl == m_iControlID)\r\n        return ::SendMessage(m_hWndCustomDraw,WM_CONTROLCUSTOMDRAW,0,(LPARAM)pnmh);\r\n        \r\n    bHandled = false;\r\n    return CDRF_DODEFAULT;\r\n}\r\n\r\nvoid CLabelContainer::DrawText(CDCHandle dc,RECT *pHeaderRect)\r\n{\r\n    HFONT hOldFont = NULL;\r\n\r\n    if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA &&\r\n        g_WinVer.m_ulMinorVersion == MINOR_WINVISTA &&\r\n        g_VisualStyles.IsThemeActive())\r\n    {\r\n        hOldFont = (HFONT)SelectObject(dc,AtlGetDefaultGuiFont());\r\n\r\n        ::SetBkMode(dc,TRANSPARENT);\r\n        ::SetTextColor(dc,RGB(139,139,139));\r\n    }\r\n    else\r\n    {\r\n        HFONT hFont = AtlCreateBoldFont(AtlGetDefaultGuiFont());\r\n        hOldFont = (HFONT)SelectObject(dc,hFont);\r\n\r\n        ::SetBkMode(dc,TRANSPARENT);\r\n        ::SetTextColor(dc,::GetSysColor(COLOR_BTNFACE));\r\n    }\r\n\r\n    RECT rcText;\r\n    rcText.left = pHeaderRect->left + 3;\r\n    rcText.right = pHeaderRect->right;\r\n    rcText.top = pHeaderRect->top + LABELCONTAINER_BORDER_HEIGHT + 1;\r\n    rcText.bottom = pHeaderRect->bottom;\r\n\r\n    ::DrawText(dc,m_szLabelText,lstrlen(m_szLabelText),&rcText,\r\n        DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n\r\n    if (hOldFont != NULL)\r\n        SelectObject(dc,hOldFont);\r\n}\r\n\r\nvoid CLabelContainer::DrawBackground(CDCHandle dc,RECT *pHeaderRect)\r\n{\r\n    RECT rcMisc;\r\n    rcMisc.left = pHeaderRect->left;\r\n    rcMisc.right = pHeaderRect->right;\r\n\r\n    // Bottom border.\r\n    rcMisc.top = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n    rcMisc.bottom = pHeaderRect->bottom;\r\n    FillRect(dc,&rcMisc,GetSysColorBrush(COLOR_BTNFACE));\r\n\r\n    if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA &&\r\n        g_WinVer.m_ulMinorVersion == MINOR_WINVISTA &&\r\n        g_VisualStyles.IsThemeActive())\r\n    {\r\n        // Gradient background.\r\n        rcMisc.top = pHeaderRect->top;\r\n        rcMisc.bottom = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n        DrawHorGradientRect(dc.m_hDC,&rcMisc,LABELCONTAINER_COLOR_BACKGROUNDVISTA,GetSysColor(COLOR_BTNFACE));\r\n    }\r\n    else if (true)\r\n    {\r\n        // Gradient background.\r\n        rcMisc.top = pHeaderRect->top;\r\n        rcMisc.bottom = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n        DrawHorGradientRect(dc.m_hDC,&rcMisc,LABELCONTAINER_COLOR_BACKGROUNDALT,GetSysColor(COLOR_BTNFACE));\r\n    }\r\n    else\r\n    {\r\n        // Gradient background.\r\n        rcMisc.left = LABELCONTAINER_BORDER_HEIGHT;\r\n        rcMisc.top = pHeaderRect->top + LABELCONTAINER_BORDER_HEIGHT;\r\n        rcMisc.bottom = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT - LABELCONTAINER_BORDER_HEIGHT;\r\n        DrawHorGradientRect(dc.m_hDC,&rcMisc,LABELCONTAINER_COLOR_BACKGROUND,GetSysColor(COLOR_BTNFACE));\r\n\r\n        // Border lines.\r\n        rcMisc.left = pHeaderRect->left;\r\n\r\n        rcMisc.top = pHeaderRect->top;\r\n        rcMisc.bottom = pHeaderRect->top + LABELCONTAINER_BORDER_HEIGHT;\r\n        DrawHorGradientRect(dc.m_hDC,&rcMisc,LABELCONTAINER_COLOR_BORDER,GetSysColor(COLOR_BTNFACE));\r\n\r\n        rcMisc.top = pHeaderRect->bottom - LABELCONTAINER_BORDER_HEIGHT - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n        rcMisc.bottom = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n        DrawHorGradientRect(dc.m_hDC,&rcMisc,LABELCONTAINER_COLOR_BORDER,GetSysColor(COLOR_BTNFACE));\r\n\r\n        rcMisc.top = pHeaderRect->top;\r\n        rcMisc.bottom = pHeaderRect->bottom - LABELCONTAINER_BOTTOMBORDER_HEIGHT;\r\n        rcMisc.right = pHeaderRect->left + LABELCONTAINER_BORDER_HEIGHT;\r\n        FillRect(dc,&rcMisc,m_hBorderBrush);\r\n    }\r\n}\r\n\r\nvoid CLabelContainer::DrawButton(CDCHandle dc,RECT *pHeaderRect)\r\n{\r\n    if (m_hCloseImageList != NULL)\r\n    {\r\n        ImageList_Draw(m_hCloseImageList,m_iButtonState,dc,\r\n            pHeaderRect->right - 16 - LABELCONTAINER_BUTTON_RIGHTSPACING,\r\n            LABELCONTAINER_BUTTON_TOPSPACING,ILD_TRANSPARENT);\r\n    }\r\n}\r\n\r\nvoid CLabelContainer::SetHeaderHeight(int iHeight)\r\n{\r\n    m_iHeaderHeight = iHeight;\r\n}\r\n\r\nvoid CLabelContainer::SetLabelText(const TCHAR *szText)\r\n{\r\n    lstrcpy(m_szLabelText,szText);\r\n}\r\n"
  },
  {
    "path": "src/app/control/label_container.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define LABELCONTAINER_COLOR_BACKGROUND\t\t\t\tRGB(255,255,255)\r\n#define LABELCONTAINER_COLOR_BORDER\t\t\t\t\tRGB(64,154,222)\r\n#define LABELCONTAINER_COLOR_BACKGROUNDVISTA\t\tRGB(252,252,252)\r\n#define LABELCONTAINER_COLOR_BACKGROUNDALT\t\t\t::GetSysColor(COLOR_BTNSHADOW)\r\n\r\n#define LABELCONTAINER_BOTTOMBORDER_HEIGHT\t\t\t4\r\n#define LABELCONTAINER_BORDER_HEIGHT\t\t\t\t1\r\n#define LABELCONTAINER_MAXTEXT\t\t\t\t\t\t32\r\n\r\n#define LABELCONTAINER_BUTTON_TOPSPACING\t\t\t1\r\n#define LABELCONTAINER_BUTTON_RIGHTSPACING\t\t\t0\r\n\r\n#define PANE_BUTTON_NORMAL\t\t\t\t\t\t\t0\r\n#define PANE_BUTTON_HOVER\t\t\t\t\t\t\t1\r\n#define PANE_BUTTON_DOWN\t\t\t\t\t\t\t2\r\n#define PANE_BUTTON_DISABLED\t\t\t\t\t\t3\r\n\r\nclass CLabelContainer : public CWindowImpl<CLabelContainer,CWindow,CControlWinTraits>\r\n{\r\nprivate:\r\n    CWindow m_ClientWindow;\r\n    int m_iHeaderHeight;\r\n\r\n    HBRUSH m_hBorderBrush;\r\n    TCHAR m_szLabelText[LABELCONTAINER_MAXTEXT];\r\n\r\n    // Button related.\r\n    HIMAGELIST m_hCloseImageList;\r\n    int m_iButtonState;\r\n    bool m_bButtonDown;\r\n\r\n    // Handle to the control that should receivce custom draw messages.\r\n    HWND m_hWndCustomDraw;\r\n    int m_iControlID;\r\n\r\n    // The host window that should receive the close message.\r\n    HWND m_hWndCloseHost;\r\n\r\n    void InitializeImageList();\r\n\r\n    void DrawText(CDCHandle dc,RECT *pHeaderRect);\r\n    void DrawBackground(CDCHandle dc,RECT *pHeaderRect);\r\n    void DrawButton(CDCHandle dc,RECT *pHeaderRect);\r\n\r\npublic:\r\n    static CWndClassInfo &GetWndClassInfo()\r\n    {\r\n        static CWndClassInfo wc =\r\n        {\r\n            {\r\n                sizeof(WNDCLASSEX),CS_DBLCLKS,\r\n                StartWindowProc,0,0,NULL,NULL,NULL,\r\n                GetSysColorBrush(COLOR_BTNFACE),NULL,\r\n                _T(\"ckLabelContainer\"),NULL\r\n            },\r\n            NULL,NULL,IDC_ARROW,TRUE,0,_T(\"\")\r\n        };\r\n\r\n        return wc;\r\n    }\r\n\r\n    CLabelContainer(bool bClosable = false);\r\n    ~CLabelContainer();\r\n\r\n    BEGIN_MSG_MAP(CLabelContainer)\r\n        MESSAGE_HANDLER(WM_SIZE,OnSize)\r\n        MESSAGE_HANDLER(WM_SETFOCUS,OnSetFocus)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WM_LBUTTONDOWN,OnMouseDown)\r\n        MESSAGE_HANDLER(WM_LBUTTONUP,OnMouseUp)\r\n\r\n        NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW,OnCustomDraw)\r\n\r\n        FORWARD_NOTIFICATIONS()\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnCustomDraw(int idCtrl,LPNMHDR pnmh,BOOL &bHandled);\r\n\r\n    void SetCustomDrawHandler(HWND hWndCustomDraw,int iID);\r\n    void SetClient(HWND hWndClient);\r\n    void SetCloseHost(HWND hWndCloseHost);\r\n\r\n    void UpdateLayout();\r\n    void UpdateLayout(int iWidth,int iHeight);\r\n\r\n    void SetHeaderHeight(int iHeight);\r\n    void SetLabelText(const TCHAR *szText);\r\n};\r\n"
  },
  {
    "path": "src/app/control/mini_html_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/file.hh>\r\n#include <base/string_util.hh>\r\n#include \"mini_html_ctrl.hh\"\r\n\r\nHBRUSH CMiniHtmlCtrl::m_hBackgroundBrush = NULL;\r\n\r\nCMiniHtmlCtrl::CMiniHtmlCtrl()\r\n{\r\n    m_pDocBuffer = NULL;\r\n    m_ulDocLength = 0;\r\n\r\n    //Load(_T(\"C:\\\\Users\\\\Christian Kindahl\\\\Desktop\\\\Active Projects\\\\InfraRecorder\\\\trunk\\\\Binary64\\\\Test.xml\"));\r\n\r\n    // Create fonts.\r\n    m_hNormalFont = NULL;\r\n    m_hBoldFont = NULL;\r\n    m_hHeaderFont = NULL;\r\n\r\n    LOGFONT lf = { 0 };\r\n    if (::GetObject(AtlGetDefaultGuiFont(),sizeof(LOGFONT),&lf) == sizeof(LOGFONT))\r\n    {\r\n        lf.lfHeight = MINIHTML_FONTHEIGHT_NORMAL;\r\n        lstrcpy(lf.lfFaceName,_T(\"Verdana\"));\r\n        m_hNormalFont = ::CreateFontIndirect(&lf);\r\n    }\r\n\r\n    if (m_hNormalFont == NULL)\r\n        m_hNormalFont = AtlGetDefaultGuiFont();\r\n\r\n    m_hBoldFont = AtlCreateBoldFont(m_hNormalFont);\r\n\r\n    lf.lfItalic = 1;\r\n    m_hItalicFont = ::CreateFontIndirect(&lf);\r\n    if (m_hItalicFont == NULL)\r\n        m_hItalicFont = m_hNormalFont;\r\n\r\n    lf.lfItalic = 0;\r\n    lf.lfHeight = MINIHTML_FONTHEIGHT_HEADER;\r\n    m_hHeaderFont = AtlCreateBoldFont(::CreateFontIndirect(&lf));\r\n    if (m_hHeaderFont == NULL)\r\n        m_hHeaderFont = m_hBoldFont;\r\n\r\n    // Create the background brush.\r\n    if (m_hBackgroundBrush == NULL)\r\n        m_hBackgroundBrush = ::CreateSolidBrush(MINIHTML_COLOR_BACKGROUND);\r\n\r\n    // Set default font widths to zer.\r\n    m_uiNormalSpaceWidth = 0;\r\n    m_uiBoldSpaceWidth = 0;\r\n    m_uiItalicSpaceWidth = 0;\r\n    m_uiHeaderSpaceWidth = 0;\r\n}\r\n\r\nCMiniHtmlCtrl::~CMiniHtmlCtrl()\r\n{\r\n    // Close any opened document.\r\n    Close();\r\n\r\n    if (m_hNormalFont != AtlGetDefaultGuiFont())\r\n        ::DeleteObject(m_hNormalFont);\r\n\r\n    if (m_hBoldFont != NULL)\r\n        ::DeleteObject(m_hBoldFont);\r\n\r\n    if (m_hItalicFont != NULL)\r\n        ::DeleteObject(m_hItalicFont);\r\n\r\n    if (m_hHeaderFont != NULL)\r\n        ::DeleteObject(m_hHeaderFont);\r\n\r\n    // Delete the background brush.\r\n    if (m_hBackgroundBrush != NULL)\r\n    {\r\n        ::DeleteObject(m_hBackgroundBrush);\r\n        m_hBackgroundBrush = NULL;\r\n    }\r\n}\r\n\r\nbool CMiniHtmlCtrl::Load(const TCHAR *szFileName)\r\n{\r\n    Close();\r\n\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return false;\r\n\r\n    // Make sure that the file is not too large.\r\n    if (File.size() > 0xFFFFFFFF)\r\n        return false;\r\n\r\n    // If the application is in an unicode environment we need to check what\r\n    // byte-order us used.\r\n    unsigned short usBOM = 0;\r\n    if (File.read(&usBOM,2) == -1)\r\n        return false;\r\n\r\n    switch (usBOM)\r\n    {\r\n        // Currently the only supported byte-order.\r\n        case BOM_UTF32BE:\r\n            break;\r\n\r\n        case BOM_UTF8:\r\n        case BOM_UTF32LE:\r\n        case BOM_SCSU:\r\n            return false;\r\n\r\n        default:\r\n            // If no BOM is found the file pointer has to be re-moved to the beginning.\r\n            File.seek(0,ckcore::File::ckFILE_BEGIN);\r\n            break;\r\n    };\r\n\r\n    unsigned long ulFileSize = (unsigned long)File.size() - (unsigned long)File.tell();\r\n    m_ulDocLength = ulFileSize / sizeof(TCHAR);\r\n\r\n    m_pDocBuffer = new TCHAR[m_ulDocLength + 1];\r\n    if (File.read(m_pDocBuffer,ulFileSize) == -1)\r\n        return false;\r\n\r\n    m_pDocBuffer[m_ulDocLength] = '\\0';\r\n\r\n    return ParseBuffer();\r\n}\r\n\r\nCMiniHtmlCtrl::eTagType CMiniHtmlCtrl::ParseTag(const TCHAR *szTag)\r\n{\r\n    if (!lstrcmp(szTag,_T(\"h\")) || !lstrcmp(szTag,_T(\"H\")))\r\n        return TT_HEADER;\r\n    else if (!lstrcmp(szTag,_T(\"b\")) || !lstrcmp(szTag,_T(\"B\")))\r\n        return TT_BOLD;\r\n    else if (!lstrcmp(szTag,_T(\"i\")) || !lstrcmp(szTag,_T(\"I\")))\r\n        return TT_ITALIC;\r\n    else if (!lstrcmp(szTag,_T(\"br\")) || !lstrcmp(szTag,_T(\"BR\")))\r\n        return TT_BREAK;\r\n\r\n    return TT_UNKNOWN;\r\n}\r\n\r\nCMiniHtmlCtrl::eAtomAttr CMiniHtmlCtrl::TagToAttr(eTagType TagType)\r\n{\r\n    switch (TagType)\r\n    {\r\n        case TT_BOLD:\r\n            return AA_BOLD;\r\n\r\n        case TT_ITALIC:\r\n            return AA_ITALIC;\r\n\r\n        case TT_HEADER:\r\n            return AA_HEADER;\r\n    }\r\n\r\n    return AA_NORMAL;\r\n}\r\n\r\nbool CMiniHtmlCtrl::ParseBuffer()\r\n{\r\n    bool bInTag = false;\r\n    tstring Tag;\r\n    std::vector<eTagType> Tags;\r\n    Tags.push_back(TT_NORMAL);\r\n    int iWordStart = -1;\r\n\r\n    for (unsigned int i = 0; i < m_ulDocLength; i++)\r\n    {\r\n        // Ignore some characters.\r\n        if (m_pDocBuffer[i] == '\\t' || m_pDocBuffer[i] == '\\n' || m_pDocBuffer[i] == '\\r')\r\n        {\r\n            if (iWordStart != -1)\r\n            {\r\n                eTagType CurTag = Tags[Tags.size() - 1];\r\n                m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,i - iWordStart,\r\n                    AT_TEXT,TagToAttr(CurTag)));\r\n\r\n                TCHAR szTemp[64];\r\n                lstrncpy(szTemp,m_pDocBuffer + iWordStart,i - iWordStart);\r\n                szTemp[i - iWordStart] = '\\0';\r\n\r\n                ::MessageBox(NULL,szTemp,_T(\"\"),MB_OK);\r\n\r\n                iWordStart = -1;\r\n            }\r\n            continue;\r\n        }\r\n\r\n        if (bInTag)\r\n        {\r\n            if (m_pDocBuffer[i] == '>')\r\n            {\r\n                // Check if it's an ending tag.\r\n                if (Tag.c_str()[0] == '/')\r\n                {\r\n                    if (iWordStart != -1)\r\n                    {\r\n                        eTagType CurTag = Tags[Tags.size() - 1];\r\n                        m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,\r\n                            i - iWordStart - (unsigned int)Tag.size() - 1,AT_TEXT,TagToAttr(CurTag)));\r\n\r\n                        TCHAR szTemp[64];\r\n                        lstrncpy(szTemp,m_pDocBuffer + iWordStart,i - iWordStart - Tag.size() - 1);\r\n                        szTemp[i - iWordStart - Tag.size() - 1] = '\\0';\r\n\r\n                        iWordStart = -1;\r\n                    }\r\n\r\n                    // Pop the tag stack if necessary.\r\n                    if (Tags[Tags.size() - 1] == ParseTag(Tag.c_str() + 1))\r\n                        Tags.pop_back();\r\n\r\n                    Tag.erase();\r\n                }\r\n                else if (Tag[Tag.size() - 1] == '/')\t// Check if we have a self-terminating tag.\r\n                {\r\n                    if (iWordStart != -1)\r\n                    {\r\n                        eTagType CurTag = Tags[Tags.size() - 1];\r\n                        m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,\r\n                            i - iWordStart - (unsigned int)Tag.size() - 1,AT_TEXT,TagToAttr(CurTag)));\r\n\r\n                        TCHAR szTemp[64];\r\n                        lstrncpy(szTemp,m_pDocBuffer + iWordStart,i - iWordStart - Tag.size() - 1);\r\n                        szTemp[i - iWordStart - Tag.size() - 1] = '\\0';\r\n\r\n                        iWordStart = -1;\r\n                    }\r\n\r\n                    Tag.resize(Tag.size() - 1);\r\n\r\n                    eTagType CurTag = ParseTag(Tag.c_str());\r\n                    switch (CurTag)\r\n                    {\r\n                        case TT_BREAK:\r\n                            {\r\n                                // Make sure that the break will be of correct height.\r\n                                eAtomAttr BreakAttr = Tags.size() > 0 ? TagToAttr(Tags[Tags.size() - 1]) : AA_NORMAL;\r\n                                m_Atoms.push_back(CAtom(NULL,NULL,AT_BREAK,BreakAttr));\r\n                            }\r\n                            break;\r\n                    }\r\n\r\n                    Tag.erase();\r\n                }\r\n                else\r\n                {\r\n                    // We have found a new tag and not processed the last atom, process it.\r\n                    if (iWordStart != -1)\r\n                    {\r\n                        eTagType CurTag = Tags[Tags.size() - 1];\r\n                        m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,\r\n                            i - iWordStart - (unsigned int)Tag.size() - 1,AT_TEXT,TagToAttr(CurTag)));\r\n\r\n                        TCHAR szTemp[64];\r\n                        lstrncpy(szTemp,m_pDocBuffer + iWordStart,i - iWordStart - Tag.size() - 1);\r\n                        szTemp[i - iWordStart - Tag.size() - 1] = '\\0';\r\n\r\n                        iWordStart = -1;\r\n                    }\r\n\r\n                    eTagType TagType = ParseTag(Tag.c_str());\r\n                    Tags.push_back(TagType);\r\n                    \r\n                    Tag.erase();\r\n                }\r\n\r\n                bInTag = false;\r\n            }\r\n            else\r\n            {\r\n                Tag.push_back(m_pDocBuffer[i]);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (m_pDocBuffer[i] == '<')\r\n            {\r\n                bInTag = true;\r\n            }\r\n            else\r\n            {\r\n                if (m_pDocBuffer[i] == ' ')\r\n                {\r\n                    if (iWordStart != -1)\r\n                    {\r\n                        eTagType CurTag = Tags[Tags.size() - 1];\r\n                        m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,i - iWordStart,\r\n                            AT_TEXT,TagToAttr(CurTag)));\r\n\r\n                        TCHAR szTemp[64];\r\n                        lstrncpy(szTemp,m_pDocBuffer + iWordStart,i - iWordStart);\r\n                        szTemp[i - iWordStart] = '\\0';\r\n\r\n                        iWordStart = -1;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (iWordStart == -1)\r\n                        iWordStart = i;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (iWordStart != -1)\r\n    {\r\n        eTagType CurTag = Tags[Tags.size() - 1];\r\n        m_Atoms.push_back(CAtom(m_pDocBuffer + iWordStart,m_ulDocLength - iWordStart,\r\n            AT_TEXT,TagToAttr(CurTag)));\r\n\r\n        TCHAR szTemp[64];\r\n        lstrncpy(szTemp,m_pDocBuffer + iWordStart,m_ulDocLength - iWordStart);\r\n        szTemp[m_ulDocLength - iWordStart] = '\\0';\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CMiniHtmlCtrl::Close()\r\n{\r\n    if (m_pDocBuffer != NULL)\r\n    {\r\n        delete [] m_pDocBuffer;\r\n        m_pDocBuffer = NULL;\r\n    }\r\n\r\n    m_ulDocLength = 0;\r\n}\r\n\r\nHFONT CMiniHtmlCtrl::GetAtomFont(const CAtom *pAtom)\r\n{\r\n    switch (pAtom->m_Attr)\r\n    {\r\n        case AA_HEADER:\r\n            return m_hHeaderFont;\r\n\r\n        case AA_BOLD:\r\n            return m_hBoldFont;\r\n\r\n        case AA_ITALIC:\r\n            return m_hItalicFont;\r\n\r\n        default:\r\n            return m_hNormalFont;\r\n    }\r\n}\r\n\r\nunsigned int CMiniHtmlCtrl::GetAtomWidth(const CAtom *pAtom)\r\n{\r\n    if (pAtom->m_Type == AT_BREAK)\r\n        return 0;\r\n\r\n    // Draw the text.\r\n    HDC hDC = GetDC();\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,GetAtomFont(pAtom));\r\n\r\n    RECT rcText = { 0,0,0,0 };\r\n    DrawText(hDC,pAtom->m_szText,pAtom->m_uiTextLen,&rcText,DT_LEFT | DT_CALCRECT);\r\n\r\n    SelectObject(hDC,hOldFont);\r\n\r\n    return rcText.right;\r\n}\r\n\r\nunsigned int CMiniHtmlCtrl::GetAtomSpaceWidth(const CAtom *pAtom)\r\n{\r\n    switch (pAtom->m_Attr)\r\n    {\r\n        case AA_HEADER:\r\n            if (m_uiHeaderSpaceWidth != 0)\r\n                return m_uiHeaderSpaceWidth;\r\n            break;\r\n\r\n        case AA_BOLD:\r\n            if (m_uiBoldSpaceWidth != 0)\r\n                return m_uiBoldSpaceWidth;\r\n            break;\r\n\r\n        case AA_ITALIC:\r\n            if (m_uiItalicSpaceWidth != 0)\r\n                return m_uiItalicSpaceWidth;\r\n            break;\r\n\r\n        default:\r\n            if (m_uiNormalSpaceWidth != 0)\r\n                return m_uiNormalSpaceWidth;\r\n            break;\r\n    }\r\n\r\n    HDC hDC = GetDC();\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,GetAtomFont(pAtom));\r\n\r\n    RECT rcText = { 0,0,0,0 };\r\n    DrawText(hDC,_T(\" \"),1,&rcText,DT_LEFT | DT_CALCRECT);\r\n\r\n    SelectObject(hDC,hOldFont);\r\n\r\n    switch (pAtom->m_Attr)\r\n    {\r\n        case AA_HEADER:\r\n            m_uiHeaderSpaceWidth = rcText.right;\r\n            break;\r\n\r\n        case AA_BOLD:\r\n            m_uiBoldSpaceWidth = rcText.right;\r\n            break;\r\n\r\n        case AA_ITALIC:\r\n            m_uiItalicSpaceWidth = rcText.right;\r\n            break;\r\n\r\n        default:\r\n            m_uiNormalSpaceWidth = rcText.right;\r\n            break;\r\n    }\r\n\r\n    return rcText.right;\r\n}\r\n\r\nunsigned int CMiniHtmlCtrl::GetAtomsTotalWidth(unsigned int uiFirstAtom,\r\n                                               unsigned int uiLastAtom)\r\n{\r\n    unsigned int uiTotalWidth = 0;\r\n    for (unsigned int uiAtom = uiFirstAtom; uiAtom < uiLastAtom; uiAtom++)\r\n    {\r\n        // Safety precausion.\r\n        if (uiAtom >= m_Atoms.size())\r\n            break;\r\n\r\n        CAtom *pAtom = &m_Atoms[uiAtom];\r\n        if (pAtom->m_Type == AT_BREAK)\r\n            continue;\r\n\r\n        uiTotalWidth += pAtom->m_uiWidth;\r\n        if (uiAtom != uiFirstAtom)\r\n            uiTotalWidth += GetAtomSpaceWidth(pAtom);\r\n    }\r\n\r\n    return uiTotalWidth;\r\n}\r\n\r\nint CMiniHtmlCtrl::RenderText(CDCHandle dc,const RECT *pRect,const CAtom *pAtom)\r\n{\r\n    // Draw the text.\r\n    HFONT hOldFont = (HFONT)SelectObject(dc,GetAtomFont(pAtom));\r\n\r\n    ::SetBkMode(dc,TRANSPARENT);\r\n    ::SetTextColor(dc,::GetSysColor(COLOR_WINDOWTEXT));\r\n\r\n    RECT rcText = *pRect;\r\n    ::DrawText(dc,pAtom->m_szText,pAtom->m_uiTextLen,&rcText,DT_LEFT);\r\n\r\n    // Calculate text height.\r\n    int iTextHeight = DrawText(dc,pAtom->m_szText,pAtom->m_uiTextLen,&rcText,DT_LEFT | DT_CALCRECT);\r\n\r\n    if (hOldFont != NULL)\r\n        SelectObject(dc,hOldFont);\r\n\r\n    return iTextHeight;\r\n}\r\n\r\nint CMiniHtmlCtrl::RenderImage(CDCHandle dc,const RECT *pRect,const CAtom *pAtom)\r\n{\r\n    return 0;\r\n}\r\n\r\nvoid CMiniHtmlCtrl::Render(CDCHandle dc)\r\n{\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    rcClient.right -= MINIHTML_HORIZONTAL_INDENT;\r\n\r\n    unsigned int uiAtom = 0;\r\n    unsigned int uiMaxHeight = 0,uiCurHeight = 0;\r\n\r\n    // Render all lines.\r\n    std::vector<unsigned int>::const_iterator itLine;\r\n    for (itLine = m_LineWordCount.begin(); itLine != m_LineWordCount.end(); itLine++)\r\n    {\r\n        rcClient.left = MINIHTML_HORIZONTAL_INDENT;\r\n        uiMaxHeight = 0;\r\n\r\n        // Check if we should center the line.\r\n        if (uiAtom < m_Atoms.size() && m_Atoms[uiAtom].m_Attr == AA_HEADER)\r\n        {\r\n            rcClient.left = MINIHTML_HORIZONTAL_INDENT +\r\n                ((rcClient.right - GetAtomsTotalWidth(uiAtom,uiAtom + *itLine)) >> 1);\r\n        }\r\n\r\n        // Render all words on the line.\r\n        for (unsigned int i = 0; i < *itLine; i++,uiAtom++)\r\n        {\r\n            // Safety precausion.\r\n            if (uiAtom >= m_Atoms.size())\r\n                break;\r\n\r\n            CAtom *pAtom = &m_Atoms[uiAtom];\r\n            if (pAtom->m_Type == AT_BREAK)\r\n            {\r\n                uiMaxHeight = pAtom->m_Attr == AA_HEADER ? MINIHTML_FONTHEIGHT_HEADER :\r\n                    MINIHTML_FONTHEIGHT_NORMAL;\r\n                continue;\r\n            }\r\n\r\n            switch (pAtom->m_Type)\r\n            {\r\n                case AT_TEXT:\r\n                    uiCurHeight = RenderText(dc,&rcClient,pAtom);\r\n                    break;\r\n\r\n                case AT_IMAGE:\r\n                    uiCurHeight = RenderImage(dc,&rcClient,pAtom);\r\n                    break;\r\n            }\r\n\r\n            if (uiCurHeight > uiMaxHeight)\r\n                uiMaxHeight = uiCurHeight;\r\n\r\n            rcClient.left += pAtom->m_uiWidth + GetAtomSpaceWidth(pAtom);\r\n        }\r\n\r\n        rcClient.top += uiMaxHeight;\r\n    }\r\n}\r\n\r\nvoid CMiniHtmlCtrl::Layout(unsigned int uiWidth,unsigned int uiHeight)\r\n{\r\n    if (uiWidth == 0)\r\n        return;\r\n\r\n    // Remove the indentation and border from the specified width immediately.\r\n    uiWidth -= (MINIHTML_HORIZONTAL_INDENT << 1) + (GetSystemMetrics(SM_CXEDGE) << 1);\r\n\r\n    m_LineWordCount.clear();\r\n    unsigned int uiLeft = 0,uiLine = 0;\r\n    unsigned int uiWordCount = 0;\r\n    unsigned int uiSpaceWidth = 0;\r\n\r\n    std::vector<CAtom>::iterator itAtom;\r\n    for (itAtom = m_Atoms.begin(); itAtom != m_Atoms.end(); itAtom++)\r\n    {\r\n        if (itAtom->m_Type == AT_BREAK)\r\n        {\r\n            itAtom->m_uiLine = uiLine++;\r\n            uiLeft = 0;\r\n\r\n            m_LineWordCount.push_back(uiWordCount + 1);\r\n            uiWordCount = 0;\r\n            continue;\r\n        }\r\n\r\n        // Calculate the width of a space character.\r\n        uiSpaceWidth = GetAtomSpaceWidth(&(*itAtom));\r\n\r\n        if (itAtom->m_uiWidth == 0)\r\n            itAtom->m_uiWidth = GetAtomWidth(&(*itAtom));\r\n\r\n        if ((uiLeft + itAtom->m_uiWidth) <= uiWidth)\r\n        {\r\n            itAtom->m_uiLine = uiLine;\r\n\r\n            if (uiLeft != 0)\r\n                uiLeft += uiSpaceWidth;\r\n            uiLeft += itAtom->m_uiWidth;\r\n            uiWordCount++;\r\n        }\r\n        else\r\n        {\r\n            itAtom->m_uiLine = ++uiLine;\r\n            uiLeft = itAtom->m_uiWidth;\r\n\r\n            m_LineWordCount.push_back(uiWordCount);\r\n            uiWordCount = 1;\r\n        }\r\n    }\r\n\r\n    if (uiLeft != 0)\r\n    {\r\n        m_LineWordCount.push_back(uiWordCount);\r\n    }\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    InvalidateRect(&rcClient);\r\n}\r\n\r\nLRESULT CMiniHtmlCtrl::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (wParam != NULL)\r\n    {\r\n        HDC hDC = (HDC)wParam;\r\n        Render(hDC);\r\n        ReleaseDC(hDC);\r\n    }\r\n    else\r\n    {\r\n        CPaintDC dc(m_hWnd);\r\n        Render(dc.m_hDC);\r\n        ReleaseDC(dc);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMiniHtmlCtrl::OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    unsigned int uiWidth = GET_X_LPARAM(lParam);\r\n    unsigned int uiHeight = GET_Y_LPARAM(lParam);\r\n\r\n    Layout(uiWidth,uiHeight);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/control/mini_html_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <atlscrl.h>\r\n#include <vector>\r\n\r\n#define MINIHTML_HORIZONTAL_INDENT\t\t\t\t3\r\n#define MINIHTML_COLOR_BACKGROUND\t\t\t\tRGB(245,245,245)\r\n#define MINIHTML_FONTHEIGHT_NORMAL\t\t\t\t12\r\n#define MINIHTML_FONTHEIGHT_HEADER\t\t\t\t18\r\n\r\n#define BOM_UTF8\t\t\t\t\t\t\t\t0xEFBBBF\r\n#define BOM_UTF32BE\t\t\t\t\t\t\t\t0x0000FEFF\r\n#define BOM_UTF32LE\t\t\t\t\t\t\t\t0xFFFE0000\r\n#define BOM_SCSU\t\t\t\t\t\t\t\t0x0EFEFF\r\n\r\nclass CMiniHtmlCtrl : public CScrollWindowImpl<CMiniHtmlCtrl>\r\n{\r\nprivate:\r\n    enum eAtomType\r\n    {\r\n        AT_TEXT,\r\n        AT_IMAGE,\r\n        AT_BREAK\r\n    };\r\n\r\n    enum eAtomAttr\r\n    {\r\n        AA_NORMAL,\r\n        AA_BOLD,\r\n        AA_ITALIC,\r\n        AA_HEADER\r\n    };\r\n\r\n    enum eTagType\r\n    {\r\n        TT_UNKNOWN,\r\n        TT_NORMAL,\r\n        TT_BOLD,\r\n        TT_ITALIC,\r\n        TT_HEADER,\r\n        TT_BREAK\r\n    };\r\n\r\n    class CAtom\r\n    {\r\n    public:\r\n        TCHAR *m_szText;\r\n        unsigned int m_uiTextLen;\r\n        unsigned int m_uiWidth;\r\n        unsigned int m_uiLine;\r\n        CMiniHtmlCtrl::eAtomType m_Type;\r\n        CMiniHtmlCtrl::eAtomAttr m_Attr;\r\n\r\n        CAtom(TCHAR *szText,unsigned int uiTextLen,CMiniHtmlCtrl::eAtomType Type,\r\n            CMiniHtmlCtrl::eAtomAttr Attr)\r\n        {\r\n            m_szText = szText;\r\n            m_uiTextLen = uiTextLen;\r\n            m_uiWidth = 0;\r\n            m_uiLine = 0;\r\n            m_Type = Type;\r\n            m_Attr = Attr;\r\n        }\r\n    };\r\n\r\n    TCHAR *m_pDocBuffer;\r\n    unsigned long m_ulDocLength;\r\n    std::vector<CAtom> m_Atoms;\r\n    std::vector<unsigned int> m_LineWordCount;\r\n    HFONT m_hNormalFont;\r\n    HFONT m_hBoldFont;\r\n    HFONT m_hItalicFont;\r\n    HFONT m_hHeaderFont;\r\n    unsigned int m_uiNormalSpaceWidth;\r\n    unsigned int m_uiBoldSpaceWidth;\r\n    unsigned int m_uiItalicSpaceWidth;\r\n    unsigned int m_uiHeaderSpaceWidth;\r\n\r\n    static HBRUSH m_hBackgroundBrush;\r\n\r\n    HFONT GetAtomFont(const CAtom *pAtom);\r\n    unsigned int GetAtomWidth(const CAtom *pAtom);\r\n    unsigned int GetAtomSpaceWidth(const CAtom *pAtom);\r\n    unsigned int GetAtomsTotalWidth(unsigned int uiFirstAtom,unsigned int uiLastAtom);\r\n\r\n    int RenderText(CDCHandle dc,const RECT *pRect,const CAtom *pAtom);\r\n    int RenderImage(CDCHandle dc,const RECT *pRect,const CAtom *pAtom);\r\n    void Render(CDCHandle dc);\r\n    void Layout(unsigned int uiWidth,unsigned int uiHeight);\r\n\r\n    eTagType ParseTag(const TCHAR *szTag);\r\n    eAtomAttr TagToAttr(eTagType TagType);\r\n    bool ParseBuffer();\r\n\r\npublic:\r\n    static CWndClassInfo &GetWndClassInfo()\r\n    {\r\n        static CWndClassInfo wc =\r\n        {\r\n            {\r\n                sizeof(WNDCLASSEX),CS_DBLCLKS,\r\n                StartWindowProc,0,0,NULL,NULL,NULL,\r\n                m_hBackgroundBrush,NULL,\r\n                _T(\"ckMiniHTML\"),NULL\r\n            },\r\n            NULL,NULL,IDC_ARROW,TRUE,0,_T(\"\")\r\n        };\r\n\r\n        return wc;\r\n    }\r\n\r\n    CMiniHtmlCtrl();\r\n    ~CMiniHtmlCtrl();\r\n\r\n    bool Load(const TCHAR *szFileName);\r\n    void Close();\r\n\r\n    BEGIN_MSG_MAP(CMiniHtmlCtrl)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_SIZE,OnSize)\r\n\r\n        DEFAULT_REFLECTION_HANDLER()\r\n\r\n        CHAIN_MSG_MAP(CScrollWindowImpl<CMiniHtmlCtrl>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/project_list_view_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_list_view_ctrl.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"settings.hh\"\r\n#include \"main_frm.hh\"\r\n#include \"string_table.hh\"\r\n#include \"project_drop_source.hh\"\r\n#include \"project_data_object.hh\"\r\n\r\n/*\r\n    FIXME: For Windows XP and newer.\r\n#ifndef LVM_SETSELECTEDCOLUMN\r\n    #define LVM_SETSELECTEDCOLUMN   (LVM_FIRST + 140)\r\n#endif\r\n\r\n    ::SendMessage(m_hWnd,LVM_SETSELECTEDCOLUMN,0,0);\r\n*/\r\n\r\nCProjectListViewDropTarget::CProjectListViewDropTarget(CProjectListViewCtrl *pHost)\r\n{\r\n    m_pHost = pHost;\r\n}\r\n\r\nbool CProjectListViewDropTarget::OnDragOver(POINTL ptCursor)\r\n{\r\n    LVHITTESTINFO lvHit;\r\n    lvHit.pt.x = ptCursor.x;\r\n    lvHit.pt.y = ptCursor.y;\r\n\r\n    ScreenToClient(m_pHost->m_hWnd,&lvHit.pt);\r\n\r\n    // See we're dragging above a folder, in that case highlight it.\r\n    int iTarget = m_pHost->HitTest(&lvHit);\r\n    if (iTarget != -1 && (((CItemData *)m_pHost->GetItemData(iTarget))->ucFlags & PROJECTITEM_FLAG_ISFOLDER))\r\n        m_pHost->SelectDropTarget(iTarget);\r\n    else\r\n        m_pHost->SelectDropTarget(-1);\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectListViewDropTarget::OnDrop(POINTL ptCursor,IDataObject *pDataObject)\r\n{\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    LVHITTESTINFO lvHit;\r\n    lvHit.pt.x = ptCursor.x;\r\n    lvHit.pt.y = ptCursor.y;\r\n\r\n    ScreenToClient(m_pHost->m_hWnd,&lvHit.pt);\r\n\r\n    CProjectNode *pTargetNode = NULL;\r\n\r\n    int iTarget = m_pHost->HitTest(&lvHit);\r\n    if (iTarget != -1 && (((CItemData *)m_pHost->GetItemData(iTarget))->ucFlags & PROJECTITEM_FLAG_ISFOLDER))\r\n    {\r\n        m_pHost->SelectDropTarget(-1);\r\n\r\n        pTargetNode = g_TreeManager.ResolveNode(g_TreeManager.GetCurrentNode(),\r\n            (CItemData *)m_pHost->GetItemData(iTarget));\r\n    }\r\n\r\n    // Handle the data.\r\n    HandleDropData(pDataObject,pTargetNode,ptCursor);\r\n    return true;\r\n}\r\n\r\nvoid CProjectListViewDropTarget::OnDragLeave()\r\n{\r\n    m_pHost->SelectDropTarget(-1);\r\n}\r\n\r\nbool CProjectListViewDropTarget::HandleDropData(IDataObject *pDataObject,CProjectNode *pTargetNode,\r\n                                                POINTL ptCursor)\r\n{\r\n    // Construct a FORMATETC object.\r\n    FORMATETC FormatEtc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r\n    STGMEDIUM StgMedium;\r\n\r\n    if (pDataObject->QueryGetData(&FormatEtc) == S_OK)\r\n    {\r\n        if (pDataObject->GetData(&FormatEtc,&StgMedium) == S_OK)\r\n        {\r\n            // Prepare a project file transaction.\r\n            CProjectManager::CFileTransaction Transaction;\r\n\r\n            HDROP hDrop = (HDROP)GlobalLock(StgMedium.hGlobal);\r\n\r\n            unsigned int uiNumFiles = DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n            TCHAR szFullName[MAX_PATH];\r\n\r\n            for (unsigned int i = 0; i < uiNumFiles; i++)\r\n            {\r\n                // Add each file to the project.\r\n                if (DragQueryFile(hDrop,i,szFullName,MAX_PATH - 1))\r\n                    Transaction.AddFile(szFullName,pTargetNode);\r\n            }\r\n\r\n            GlobalUnlock(StgMedium.hGlobal);\r\n            ReleaseStgMedium(&StgMedium);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        // Move to another folder if possible, otherwise rearrange in the list.\r\n        if (pTargetNode != NULL)\r\n        {\r\n            FormatEtc.cfFormat = static_cast<CLIPFORMAT>(m_uiClipFormat);\r\n            if (pDataObject->QueryGetData(&FormatEtc) == S_OK)\r\n            {\r\n                if (pDataObject->GetData(&FormatEtc,&StgMedium) == S_OK)\r\n                {\r\n                    // Prepare a project file transaction.\r\n                    CProjectManager::CFileTransaction Transaction;\r\n\r\n                    CProjectDropData *pDropData = (CProjectDropData *)GlobalLock(StgMedium.hGlobal);\r\n                    if (pDropData->m_pParent == NULL)\r\n                        return true;\r\n\r\n                    SIZE_T uiNumFiles = (GlobalSize(StgMedium.hGlobal) - sizeof(CProjectDropData)) / sizeof(CItemData *);\r\n\r\n                    for (SIZE_T i = 0; i < uiNumFiles; i++)\r\n                    {\r\n                        CItemData *pItemData = pDropData->m_ppData[i];\r\n\r\n                        Transaction.MoveFile(pDropData->m_pParent,pItemData,pTargetNode);\r\n                    }\r\n\r\n                    GlobalUnlock(StgMedium.hGlobal);\r\n                    ReleaseStgMedium(&StgMedium);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /*\r\n            */\r\n            // Determine the dropped item.\r\n            LVHITTESTINFO lvHit;\r\n            lvHit.pt.x = ptCursor.x;\r\n            lvHit.pt.y = ptCursor.y;\r\n\r\n            ScreenToClient(m_pHost->m_hWnd,&lvHit.pt);\r\n\r\n            ListView_HitTest(m_pHost->m_hWnd,&lvHit);\r\n\r\n            // Not inside the list view?\r\n            if (lvHit.iItem == -1)\r\n                return true;\r\n\r\n            // Make sure that we can't drop a file above a folder.\r\n            CItemData *pDropItemData = (CItemData *)m_pHost->GetItemData(lvHit.iItem);\r\n\r\n            while (pDropItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n                pDropItemData = (CItemData *)m_pHost->GetItemData(++lvHit.iItem);\r\n\r\n            CProjectNode *pCurrentNode = g_TreeManager.GetCurrentNode();\r\n\r\n            // Locate the dropped item (wee need an iterator so we know where to insert\r\n            // the dropped files.\r\n            std::list <CItemData *>::iterator itFileObject;\r\n\r\n            for (itFileObject = pCurrentNode->m_Files.begin(); itFileObject !=\r\n                pCurrentNode->m_Files.end(); itFileObject++)\r\n            {\r\n                if (*itFileObject == pDropItemData)\r\n                    break;\r\n            }\r\n\r\n            // Move the selected items.\r\n            int iItemIndex = -1;\r\n            iItemIndex = m_pHost->GetNextItem(iItemIndex,LVNI_SELECTED);\r\n\r\n            while (iItemIndex != -1)\r\n            {\r\n                // Move the internal item data pointer.\r\n                CItemData *pItemData = (CItemData *)m_pHost->GetItemData(iItemIndex);\r\n\r\n                pCurrentNode->m_Files.remove(pItemData);\r\n                pCurrentNode->m_Files.insert(itFileObject,pItemData);\r\n\r\n                // Move the actual list item.\r\n                LVITEM lvi = { 0 };\r\n                lvi.iItem = iItemIndex;\r\n                lvi.iSubItem = 0;\r\n                lvi.pszText = LPSTR_TEXTCALLBACK;\r\n                lvi.stateMask = static_cast<unsigned int>(~LVIS_SELECTED);\r\n                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;\r\n                m_pHost->GetItem(&lvi);\r\n\r\n                lvi.iItem = lvHit.iItem;\r\n\r\n                // Re-insert the item.\r\n                int iResult = m_pHost->InsertItem(&lvi);\r\n                if (lvi.iItem < iItemIndex)\r\n                    lvHit.iItem++;\r\n                if (iResult <= iItemIndex)\r\n                    iItemIndex++;\r\n\r\n                // Delete the old item.\r\n                m_pHost->DeleteItem(iItemIndex);\r\n\r\n                iItemIndex = m_pHost->GetNextItem(-1,LVNI_SELECTED);\r\n            }\r\n            /*\r\n            */\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n/*\r\n*/\r\n\r\nCProjectListViewCtrl::CProjectListViewCtrl()\r\n{\r\n    m_hDragImageList = NULL;\r\n\r\n    // Drop target.\r\n    m_pDropTarget = new CProjectListViewDropTarget(this);\r\n    CoLockObjectExternal(m_pDropTarget,TRUE,FALSE);\r\n}\r\n\r\nCProjectListViewCtrl::~CProjectListViewCtrl()\r\n{\r\n    // Drop target.\r\n    if (m_pDropTarget != NULL)\r\n    {\r\n        CoLockObjectExternal(m_pDropTarget,FALSE,TRUE);\r\n\r\n        m_pDropTarget->Release();\r\n        m_pDropTarget = NULL;\r\n    }\r\n\r\n    if (m_hDragImageList != NULL)\r\n        ImageList_Destroy(m_hDragImageList);\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnKeyDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LRESULT lResult = DefWindowProc(uMsg,wParam,lParam);\r\n\r\n    if (wParam == VK_RETURN)\r\n    {\r\n        if (GetSelectedCount() > 0)\r\n        {\r\n            // This is not safe, I know.\r\n            BOOL bDummy;\r\n            g_pMainFrame->OnPLVDblClk(IDC_PROJECTLISTVIEW,NULL,bDummy);\r\n        }\r\n    }\r\n\r\n    return lResult;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnDropFiles(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    HDROP hDrop = (HDROP)wParam;\r\n\r\n    POINT ptDrop;\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    if (DragQueryPoint(hDrop,&ptDrop) > 0)\r\n    {\r\n        // Prepare a project file transaction.\r\n        CProjectManager::CFileTransaction Transaction;\r\n\r\n        unsigned int uiNumFiles = DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n\r\n        for (unsigned int i = 0; i < uiNumFiles; i++)\r\n        {\r\n            if (DragQueryFile(hDrop,i,szFullName,MAX_PATH - 1))\r\n                Transaction.AddFile(szFullName);\r\n        }\r\n    }\r\n\r\n    DragFinish(hDrop);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    g_ProjectManager.ListSetActive();\r\n    g_ProjectManager.NotifyListSelChanged(GetSelectedCount());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnCustomDraw(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LPNMLVCUSTOMDRAW lpNMCustomDraw = (LPNMLVCUSTOMDRAW)lParam;\r\n\r\n    switch (lpNMCustomDraw->nmcd.dwDrawStage)\r\n    {\r\n        case CDDS_PREPAINT:\r\n            return CDRF_NOTIFYITEMDRAW;\r\n\r\n        case CDDS_ITEMPREPAINT:\r\n            CItemData *pItemData = (CItemData *)lpNMCustomDraw->nmcd.lItemlParam;\r\n\r\n            if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            {\r\n                lpNMCustomDraw->clrText = PROJECTLISTVIEW_COLOR_IMPORTED;\r\n                return CDRF_NEWFONT;\r\n            }\r\n            \r\n            if (pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n            {\r\n                lpNMCustomDraw->clrText = GetSysColor(COLOR_GRAYTEXT); \r\n                return CDRF_NEWFONT;\r\n            }\r\n\r\n            bHandled = false;\r\n            return CDRF_DODEFAULT;\r\n    }\r\n\r\n    bHandled = false;\r\n    return CDRF_DODEFAULT;\r\n}\r\n\r\nvoid CProjectListViewCtrl::BeginDrag(LPNMLISTVIEW pNMListView)\r\n{\r\n    CProjectDropSource *pDropSource = new CProjectDropSource();\r\n    CProjectDataObject *pDataObject = new CProjectDataObject();\r\n\r\n    // Add all file names to the data object.\r\n    int iItemIndex = -1;\r\n    iItemIndex = GetNextItem(iItemIndex,LVNI_SELECTED);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        CItemData *pItemData = (CItemData *)GetItemData(iItemIndex);\r\n        pDataObject->AddFile(pItemData);\r\n\r\n        iItemIndex = GetNextItem(iItemIndex,LVNI_SELECTED);\r\n    }\r\n\r\n    pDataObject->SetParent(g_TreeManager.GetCurrentNode());\r\n\r\n    DWORD dwEffect = 0;\r\n    ::DoDragDrop(pDataObject,pDropSource,DROPEFFECT_MOVE,&dwEffect);\r\n\r\n    pDropSource->Release();\r\n    pDataObject->Release();\t\r\n}\r\n\r\nvoid CProjectListViewCtrl::SetViewStyle(int iViewStyle)\r\n{\r\n    unsigned long ulStyle = 0;\r\n\r\n    switch (iViewStyle)\r\n    {\r\n        case LISTVIEWSTYLE_LARGEICONS:\r\n            ulStyle = LVS_ICON;\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_SMALLICONS:\r\n            ulStyle = LVS_SMALLICON;\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_LIST:\r\n            ulStyle = LVS_LIST;\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_DETAILS:\r\n            ulStyle = LVS_REPORT;\r\n            break;\r\n    };\r\n\r\n    unsigned long ulOldStyle = GetWindowLong(GWL_STYLE);\r\n    if ((ulOldStyle & LVS_TYPEMASK) != ulStyle)\r\n    {\r\n        unsigned long ulNewStyle = (ulOldStyle & ~LVS_TYPEMASK) | ulStyle;\r\n        SetWindowLong(GWL_STYLE,ulNewStyle);\r\n    }\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnViewLargeIcons(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_iPrjListViewStyle = LISTVIEWSTYLE_LARGEICONS;\r\n    g_DynamicSettings.Apply();\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnViewSmallIcons(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_iPrjListViewStyle = LISTVIEWSTYLE_SMALLICONS;\r\n    g_DynamicSettings.Apply();\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnViewList(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_iPrjListViewStyle = LISTVIEWSTYLE_LIST;\r\n    g_DynamicSettings.Apply();\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnViewDetails(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_iPrjListViewStyle = LISTVIEWSTYLE_DETAILS;\r\n    g_DynamicSettings.Apply();\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectListViewCtrl::OnNewFolder(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ProjectManager.ListAddNewFolder();\r\n    return 0;\r\n}\r\n\r\n/*\r\n    CProjectListViewCtrl::SelectDropTarget\r\n    --------------------------------------\r\n    Marks the specified item as drop target, if iDropItemIndex the drop target\r\n    items will be cleared but no new target selected.\r\n*/\r\nvoid CProjectListViewCtrl::SelectDropTarget(int iDropItemIndex)\r\n{\r\n    // Move the selected items.\r\n    int iItemIndex = -1;\r\n    iItemIndex = GetNextItem(iItemIndex,LVNI_DROPHILITED);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        SetItemState(iItemIndex,0,LVNI_DROPHILITED);\r\n\r\n        iItemIndex = GetNextItem(-1,LVNI_DROPHILITED);\r\n    }\r\n\r\n    if (iDropItemIndex != -1)\r\n        SetItemState(iDropItemIndex,LVNI_DROPHILITED,LVNI_DROPHILITED);\r\n}\r\n\r\nvoid CProjectListViewCtrl::ForceRedraw()\r\n{\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    InvalidateRect(&rcClient,true);\r\n}"
  },
  {
    "path": "src/app/control/project_list_view_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"tree_manager.hh\"\r\n#include \"project_drop_target_base.hh\"\r\n\r\n// Color of items flagged as imported.\r\n#define PROJECTLISTVIEW_COLOR_IMPORTED\t\t\t\tRGB(92,53,102)\r\n\r\nclass CProjectListViewCtrl;\r\n\r\nclass CProjectListViewDropTarget : public CProjectDropTargetBase\r\n{\r\nprivate:\r\n    CProjectListViewCtrl *m_pHost;\r\n\r\n    bool HandleDropData(IDataObject *pDataObject,CProjectNode *pTargetNode,POINTL ptCursor);\r\n\r\npublic:\r\n    CProjectListViewDropTarget(CProjectListViewCtrl *pHost);\r\n\r\n    bool OnDragOver(POINTL ptCursor);\r\n    bool OnDrop(POINTL ptCursor,IDataObject *pDataObject);\r\n    void OnDragLeave();\r\n};\r\n\r\nclass CProjectListViewCtrl : public CWindowImpl<CProjectListViewCtrl,CListViewCtrl>\r\n{\r\nprivate:\r\n    HIMAGELIST m_hDragImageList;\r\n\r\npublic:\r\n    CProjectListViewDropTarget *m_pDropTarget;\r\n\r\n    DECLARE_WND_CLASS(_T(\"ckProjectListViewCtrl\"));\r\n\r\n    CProjectListViewCtrl();\r\n    ~CProjectListViewCtrl();\r\n\r\n    void SetViewStyle(int iViewStyle);\r\n    void BeginDrag(LPNMLISTVIEW pNMListView);\r\n    \r\n    BEGIN_MSG_MAP(CProjectListViewCtrl)\r\n        COMMAND_ID_HANDLER(ID_VIEW_LARGEICONS,OnViewLargeIcons)\r\n        COMMAND_ID_HANDLER(ID_VIEW_SMALLICONS,OnViewSmallIcons)\r\n        COMMAND_ID_HANDLER(ID_VIEW_LIST,OnViewList)\r\n        COMMAND_ID_HANDLER(ID_VIEW_DETAILS,OnViewDetails)\r\n        COMMAND_ID_HANDLER(ID_EDIT_NEWFOLDER,OnNewFolder)\r\n\r\n        MESSAGE_HANDLER(WM_KEYDOWN,OnKeyDown)\r\n        MESSAGE_HANDLER(WM_DROPFILES,OnDropFiles)\r\n        MESSAGE_HANDLER(WM_SETFOCUS,OnSetFocus)\r\n        MESSAGE_HANDLER(WM_CONTROLCUSTOMDRAW,OnCustomDraw)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnKeyDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDropFiles(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCustomDraw(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnViewLargeIcons(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewSmallIcons(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewList(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewDetails(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewFolder(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    void ForceRedraw();\r\n    void SelectDropTarget(int iDropItemIndex);\r\n};\r\n"
  },
  {
    "path": "src/app/control/project_tree_view_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_tree_view_ctrl.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"project_data_object.hh\"\r\n#include \"project_drop_source.hh\"\r\n\r\nCProjectTreeViewDropTarget::CProjectTreeViewDropTarget(CTreeViewCtrlEx *pHost)\r\n{\r\n    m_pHost = pHost;\r\n}\r\n\r\nbool CProjectTreeViewDropTarget::OnDragOver(POINTL ptCursor)\r\n{\r\n    TVHITTESTINFO tvHit;\r\n    tvHit.pt.x = ptCursor.x;\r\n    tvHit.pt.y = ptCursor.y;\r\n\r\n    ScreenToClient(m_pHost->m_hWnd,&tvHit.pt);\r\n\r\n    HTREEITEM hTarget = m_pHost->HitTest(&tvHit);\r\n    if (hTarget)\r\n    {\r\n        m_pHost->SelectDropTarget(hTarget);\r\n        return true;\r\n    }\r\n\r\n    m_pHost->SelectDropTarget(NULL);\r\n    return false;\r\n}\r\n\r\nbool CProjectTreeViewDropTarget::OnDrop(POINTL ptCursor,IDataObject *pDataObject)\r\n{\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    TVHITTESTINFO tvHit;\r\n    tvHit.pt.x = ptCursor.x;\r\n    tvHit.pt.y = ptCursor.y;\r\n\r\n    ScreenToClient(m_pHost->m_hWnd,&tvHit.pt);\r\n\r\n    HTREEITEM hTarget = m_pHost->HitTest(&tvHit);\r\n    if (hTarget)\r\n    {\r\n        m_pHost->SelectDropTarget(NULL);\r\n\r\n        HandleDropData(pDataObject,(CProjectNode *)m_pHost->GetItemData(hTarget));\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nvoid CProjectTreeViewDropTarget::OnDragLeave()\r\n{\r\n    m_pHost->SelectDropTarget(NULL);\r\n}\r\n\r\nbool CProjectTreeViewDropTarget::HandleDropData(IDataObject *pDataObject,CProjectNode *pTargetNode)\r\n{\r\n    // Construct a FORMATETC object.\r\n    FORMATETC FormatEtc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r\n    STGMEDIUM StgMedium;\r\n\r\n    if (pDataObject->QueryGetData(&FormatEtc) == S_OK)\r\n    {\r\n        if (pDataObject->GetData(&FormatEtc,&StgMedium) == S_OK)\r\n        {\r\n            // Prepare a project file transaction.\r\n            CProjectManager::CFileTransaction Transaction;\r\n\r\n            HDROP hDrop = (HDROP)GlobalLock(StgMedium.hGlobal);\r\n\r\n            unsigned int uiNumFiles = DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n            TCHAR szFullName[MAX_PATH];\r\n\r\n            for (unsigned int i = 0; i < uiNumFiles; i++)\r\n            {\r\n                // Add each file to the project.\r\n                if (DragQueryFile(hDrop,i,szFullName,MAX_PATH - 1))\r\n                    Transaction.AddFile(szFullName,pTargetNode);\r\n            }\r\n\r\n            GlobalUnlock(StgMedium.hGlobal);\r\n            ReleaseStgMedium(&StgMedium);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        FormatEtc.cfFormat = static_cast<CLIPFORMAT>(m_uiClipFormat);\r\n        if (pDataObject->QueryGetData(&FormatEtc) == S_OK)\r\n        {\r\n            if (pDataObject->GetData(&FormatEtc,&StgMedium) == S_OK)\r\n            {\r\n                // Prepare a project file transaction.\r\n                CProjectManager::CFileTransaction Transaction;\r\n\r\n                CProjectDropData *pDropData = (CProjectDropData *)GlobalLock(StgMedium.hGlobal);\r\n                if (pDropData->m_pParent == NULL)\r\n                    return true;\r\n\r\n                SIZE_T uiNumFiles = (GlobalSize(StgMedium.hGlobal) - sizeof(CProjectDropData)) / sizeof(CItemData *);\r\n\r\n                for (SIZE_T i = 0; i < uiNumFiles; i++)\r\n                {\r\n                    CItemData *pItemData = pDropData->m_ppData[i];\r\n\r\n                    Transaction.MoveFile(pDropData->m_pParent,pItemData,pTargetNode);\r\n                }\r\n\r\n                GlobalUnlock(StgMedium.hGlobal);\r\n                ReleaseStgMedium(&StgMedium);\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nCProjectTreeViewCtrl::CProjectTreeViewCtrl()\r\n{\r\n    m_pDropTarget = new CProjectTreeViewDropTarget(this);\r\n\r\n    CoLockObjectExternal(m_pDropTarget,TRUE,FALSE);\r\n}\r\n\r\nCProjectTreeViewCtrl::~CProjectTreeViewCtrl()\r\n{\r\n    if (m_pDropTarget != NULL)\r\n    {\r\n        CoLockObjectExternal(m_pDropTarget,FALSE,TRUE);\r\n\r\n        m_pDropTarget->Release();\r\n        m_pDropTarget = NULL;\r\n    }\r\n}\r\n\r\nLRESULT CProjectTreeViewCtrl::OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CProjectNode *pNode = (CProjectNode *)GetSelectedItem().GetData();\r\n\r\n    g_ProjectManager.TreeSetActive();\r\n    g_ProjectManager.NotifyTreeSelChanged(pNode);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectTreeViewCtrl::OnCustomDraw(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LPNMTVCUSTOMDRAW lpNMCustomDraw = (LPNMTVCUSTOMDRAW)lParam;\r\n\r\n    switch (lpNMCustomDraw->nmcd.dwDrawStage)\r\n    {\r\n        case CDDS_PREPAINT:\r\n            return CDRF_NOTIFYITEMDRAW;\t\t\t\r\n\r\n        case CDDS_ITEMPREPAINT:\r\n            CProjectNode *pNode = (CProjectNode *)lpNMCustomDraw->nmcd.lItemlParam;\r\n\r\n            /*if (pNode == NULL || !(pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED))\r\n            {\r\n                bHandled = false;\r\n                return CDRF_DODEFAULT;\r\n            }\r\n\r\n            lpNMCustomDraw->clrText = GetSysColor(COLOR_GRAYTEXT); \r\n            return CDRF_NEWFONT;*/\r\n\r\n            if (pNode != NULL && pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            {\r\n                lpNMCustomDraw->clrText = PROJECTTREEVIEW_COLOR_IMPORTED; \r\n                return CDRF_NEWFONT;\r\n            }\r\n\r\n            if (pNode != NULL && pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n            {\r\n                lpNMCustomDraw->clrText = GetSysColor(COLOR_GRAYTEXT); \r\n                return CDRF_NEWFONT;\r\n            }\r\n\r\n            bHandled = false;\r\n            return CDRF_DODEFAULT;\r\n    }\r\n\r\n    bHandled = false;\r\n    return CDRF_DODEFAULT;\r\n}\r\n\r\nvoid CProjectTreeViewCtrl::BeginDrag(LPNMTREEVIEW pNMTreeView)\r\n{\r\n    if (((CProjectNode *)GetItemData(pNMTreeView->itemNew.hItem))->pItemData->ucFlags & PROJECTITEM_FLAG_ISPROJECTROOT)\r\n        return;\r\n\r\n    CProjectDropSource *pDropSource = new CProjectDropSource();\r\n    CProjectDataObject *pDataObject = new CProjectDataObject();\r\n\r\n    // Add all file names to the data object.\r\n    pDataObject->AddFile(((CProjectNode *)GetItemData(pNMTreeView->itemNew.hItem))->pItemData);\r\n    pDataObject->SetParent((CProjectNode *)GetItemData(GetParentItem(pNMTreeView->itemNew.hItem)));\r\n\r\n    DWORD dwEffect = 0;\r\n    ::DoDragDrop(pDataObject,pDropSource,DROPEFFECT_MOVE,&dwEffect);\r\n\r\n    pDropSource->Release();\r\n    pDataObject->Release();\r\n}\r\n\r\nvoid CProjectTreeViewCtrl::ForceRedraw()\r\n{\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    InvalidateRect(&rcClient,true);\r\n}"
  },
  {
    "path": "src/app/control/project_tree_view_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"ctrl_messages.hh\"\r\n#include \"tree_manager.hh\"\r\n#include \"project_drop_target_base.hh\"\r\n\r\n#define PROJECTTREEVIEW_COLOR_IMPORTED\t\t\t\tRGB(92,53,102)\r\n\r\nclass CProjectTreeViewDropTarget : public CProjectDropTargetBase\r\n{\r\nprivate:\r\n    CTreeViewCtrlEx *m_pHost;\r\n\r\n    bool HandleDropData(IDataObject *pDataObject,CProjectNode *pTargetNode);\r\n\r\npublic:\r\n    CProjectTreeViewDropTarget(CTreeViewCtrlEx *pHost);\r\n\r\n    bool OnDragOver(POINTL ptCursor);\t\r\n    bool OnDrop(POINTL ptCursor,IDataObject *pDataObject);\r\n    void OnDragLeave();\r\n};\r\n\r\nclass CProjectTreeViewCtrl : public CWindowImpl<CProjectTreeViewCtrl,CTreeViewCtrlEx>\r\n{\r\npublic:\r\n    CProjectTreeViewDropTarget *m_pDropTarget;\r\n\r\n    DECLARE_WND_CLASS(_T(\"ckProjectTreeViewCtrl\"));\r\n\r\n    CProjectTreeViewCtrl();\r\n    ~CProjectTreeViewCtrl();\r\n\r\n    BEGIN_MSG_MAP(CProjectTreeViewCtrl)\r\n        MESSAGE_HANDLER(WM_SETFOCUS,OnSetFocus)\r\n        MESSAGE_HANDLER(WM_CONTROLCUSTOMDRAW,OnCustomDraw)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnSetFocus(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCustomDraw(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void BeginDrag(LPNMTREEVIEW pNMTreeView);\r\n    void ForceRedraw();\r\n};\r\n"
  },
  {
    "path": "src/app/control/shell_list_view_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"shell_list_view_ctrl.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"version.hh\"\r\n\r\nunsigned int CF_IDLIST = ::RegisterClipboardFormat(CFSTR_SHELLIDLIST);\r\n\r\nCShellListViewCtrl::CShellListViewCtrl(HWND hWndParent,HWND hWndReceiver) : m_dwRef(0)\r\n{\r\n    m_hWndParent = hWndParent;\r\n    m_hWnd = NULL;\r\n\r\n    if (hWndReceiver == NULL)\r\n        m_hWndReceiver = m_hWndParent;\r\n    else\r\n        m_hWndReceiver = hWndReceiver;\r\n\r\n    m_pParentShellFolder = NULL;\r\n    m_pShellView = NULL;\r\n\r\n    // Used when collecting item data.\r\n    m_hItemsMem = NULL;\r\n\r\n    m_pidl = NULL;\r\n}\r\n\r\nCShellListViewCtrl::~CShellListViewCtrl()\r\n{\r\n    FreeMemberPointers();\r\n\r\n    // Make sure that no selection memory is still allocated.\r\n    if (m_hItemsMem != NULL)\r\n        EndGetItems();\r\n}\r\n\r\nHWND CShellListViewCtrl::GetListViewHandle()\r\n{\r\n    if (!m_hWnd)\r\n        return NULL;\r\n\r\n    // Find the list view control.\r\n    HWND hWndListView = FindWindowEx(m_hWnd,NULL,WC_LISTVIEW,NULL);\r\n\r\n    if (!::IsWindowVisible(hWndListView))\r\n    {\r\n        hWndListView = FindWindowEx(m_hWnd,NULL,_T(\"ThumbnailVwExtWnd32\"),NULL);\r\n        hWndListView = FindWindowEx(hWndListView,NULL,WC_LISTVIEW,NULL);\r\n    }\r\n\r\n    return hWndListView;\r\n}\r\n\r\nvoid CShellListViewCtrl::FreeMemberPointers()\r\n{\r\n    if (m_pShellView)\r\n    {\r\n        m_pShellView->UIActivate(SVUIA_DEACTIVATE);\r\n        m_pShellView->DestroyViewWindow();\r\n        m_pShellView->Release();\r\n    }\r\n\r\n    if (m_pParentShellFolder)\r\n        m_pParentShellFolder->Release();\r\n\r\n    m_pShellView = NULL;\r\n    m_pParentShellFolder = NULL;\r\n}\r\n\r\nIShellFolder *CShellListViewCtrl::GetParentShellFolder()\r\n{\r\n    return m_pParentShellFolder;\r\n}\r\n\r\nbool CShellListViewCtrl::IsFolder(LPCITEMIDLIST pidl,IShellFolder *psfParent)\r\n{\r\n    ATLASSERT(NULL != psfParent);\r\n\r\n    if (!psfParent)\r\n        return false;\r\n\r\n    DWORD dwAttribs = SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR | SFGAO_BROWSABLE;\r\n    HRESULT hResult = psfParent->GetAttributesOf(1,&pidl,&dwAttribs);\r\n\r\n    return ((S_OK == hResult &&\r\n        (dwAttribs & SFGAO_FOLDER) != 0 &&\r\n        ((dwAttribs & SFGAO_FILESYSTEM) != 0 ||\r\n        (dwAttribs & SFGAO_FILESYSANCESTOR) != 0)) && !(dwAttribs & SFGAO_BROWSABLE));\r\n}\r\n\r\nbool CShellListViewCtrl::IsFolderLink(LPCITEMIDLIST pidl,LPITEMIDLIST *pOutPidl)\r\n{\r\n    ATLASSERT(m_pParentShellFolder);\r\n\r\n    if (!m_pParentShellFolder)\r\n        return false;\r\n\r\n    // Is pidl a link?\r\n    DWORD dwAttribs = SFGAO_LINK;\r\n    m_pParentShellFolder->GetAttributesOf(1,&pidl,&dwAttribs);\r\n\r\n    if (!(dwAttribs & SFGAO_LINK))\r\n        return false;\r\n\r\n    // Get the link object.\r\n    IShellLink *pLink;\r\n\r\n    if (NOERROR != m_pParentShellFolder->GetUIObjectOf(m_hWnd,1,&pidl,IID_IShellLink,0,\r\n        (void**)&pLink))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    // Get link target's pidl.\r\n    LPITEMIDLIST rPidl = NULL,pidlParent = NULL,pidlChild = NULL;\r\n\r\n    if (NOERROR == pLink->GetIDList(&rPidl))\r\n    {\r\n        IShellFolder *psf;\r\n\r\n        if (NOERROR == SHGetDesktopFolder(&psf))\r\n        {\r\n            // If pidl is complex (it probably is), split into parent/child pidls first.\r\n            if (m_PidlHelp.Split(rPidl,&pidlParent,&pidlChild))\r\n            {\r\n                IShellFolder *psf2;\r\n\r\n                if (NOERROR == psf->BindToObject(pidlParent,NULL,IID_IShellFolder, \r\n                        reinterpret_cast<void**>(&psf2)))\r\n                {\r\n                    if (!IsFolder(pidlChild,psf2))\r\n                        m_PidlHelp.FreePidl(rPidl);\r\n\r\n                    psf2->Release();\r\n                }\r\n\r\n                m_PidlHelp.FreePidl(pidlParent);\r\n                m_PidlHelp.FreePidl(pidlChild);\r\n            }\r\n            else if (!IsFolder(rPidl,psf))\r\n            {\r\n                m_PidlHelp.FreePidl(rPidl);\r\n            }\r\n\r\n            psf->Release();\r\n        }\r\n    }\r\n\r\n    pLink->Release();\r\n\r\n    if (rPidl)\r\n    {\r\n        if (pOutPidl)\r\n            *pOutPidl = rPidl;\r\n        else\r\n            m_PidlHelp.FreePidl(rPidl);\r\n\r\n        return true;\r\n    }\r\n    \r\n    return false;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    if (ppvObject == NULL)\r\n        return E_POINTER;\r\n\r\n    *ppvObject = NULL;\r\n\r\n    if (iid == IID_IUnknown)\r\n        *ppvObject = (IUnknown *)(IShellBrowser *)this;\r\n    else if (iid == IID_IOleWindow)\r\n        *ppvObject = (IOleWindow *)this;\t\t\t\r\n    else if (iid == IID_IShellBrowser)\r\n        *ppvObject = (IShellBrowser *)this;\r\n    else if (iid == IID_ICommDlgBrowser)\r\n        *ppvObject = (ICommDlgBrowser *)this;\r\n    else\r\n        return E_NOINTERFACE;\r\n\r\n    ((IUnknown *)(*ppvObject))->AddRef();\r\n    return S_OK;\r\n}\r\n\r\nSTDMETHODIMP_(ULONG) CShellListViewCtrl::AddRef()\r\n{\r\n    return ++m_dwRef;\r\n}\r\n\r\nSTDMETHODIMP_(ULONG) CShellListViewCtrl::Release()\r\n{\r\n    return --m_dwRef;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::ContextSensitiveHelp(BOOL fEnterMode)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::GetWindow(HWND *lphwnd)\r\n{ \r\n    *lphwnd = m_hWndParent; \r\n    return S_OK; \r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::IncludeObject(THIS_ struct IShellView *ppshv,\r\n    LPCITEMIDLIST pidl)\r\n{\r\n    // TODO: Implement filtering support.\r\n    /*if (isISO(pidl))\r\n        return S_OK;\t// Show it.\r\n    return S_FALSE;\t\t// Hide it.*/\r\n\r\n    return S_OK;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::OnDefaultCommand(THIS_ struct IShellView *ppshv)\r\n{\r\n    CIDA *pData = BeginGetItems(true);\r\n    char *pcData = reinterpret_cast<char *>(pData) + pData->aoffset[1];\r\n    LPCITEMIDLIST pidl = (LPITEMIDLIST)pcData;\r\n\r\n    TCHAR szNewPathName[MAX_PATH];\r\n    if (!m_PidlHelp.GetPathName(m_pParentShellFolder,pidl,szNewPathName,MAX_PATH - 1))\r\n        return E_FAIL;\r\n\r\n    LPITEMIDLIST pidlTo = NULL;\r\n\r\n    // Check if we're dealing with a folder or a folder link.\r\n    if (IsFolder(pidl,m_pParentShellFolder))\r\n    {\r\n        // Notify the receiver that a new folder will be opened.\r\n        ::SendMessage(m_hWndReceiver,WM_SLVC_CHANGEFOLDER,(WPARAM)pidl,(LPARAM)szNewPathName);\r\n\r\n        BrowseObject(pidl,SBSP_SAMEBROWSER | SBSP_RELATIVE);\r\n    }\r\n    else if (IsFolderLink(pidl,&pidlTo))\r\n    {\r\n        // Notify the receiver that we will open a shortcut. Shortcuts should be notified\r\n        // in a different way than regular folders since it will require a deeper search\r\n        // in the folder tree to find the new path.\r\n        m_PidlHelp.GetPathName(m_pParentShellFolder,pidlTo,szNewPathName,MAX_PATH - 1);\r\n        ::SendMessage(m_hWndReceiver,WM_SLVC_CHANGEFOLDERLINK,(WPARAM)pidl,(LPARAM)szNewPathName);\r\n\r\n        BrowseObject(pidlTo,SBSP_SAMEBROWSER | SBSP_ABSOLUTE);\r\n    }\r\n    else\r\n    {\r\n        if (::SendMessage(m_hWndReceiver,WM_SLVC_FILECOMMAND,(WPARAM)pidl,(LPARAM)szNewPathName) == 1)\r\n        {\r\n            if (pidlTo)\r\n                m_PidlHelp.FreePidl(pidlTo);\r\n\r\n            EndGetItems();\r\n            return NOERROR;\r\n        }\r\n\r\n        EndGetItems();\r\n        return E_NOTIMPL;\r\n    }\r\n\r\n    if (pidlTo)\r\n        m_PidlHelp.FreePidl(pidlTo);\r\n\r\n    EndGetItems();\r\n    return NOERROR;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::OnStateChange(THIS_ struct IShellView *ppshv,ULONG uChange)\r\n{\r\n    // Handle selection, rename, focus etc.\r\n    return E_NOTIMPL;\r\n}\r\n\r\nWNDPROC CShellListViewCtrl::m_pOldWndProc = NULL;\r\n\r\nLRESULT CALLBACK CShellListViewCtrl::WndProc(HWND hWnd,UINT Msg,\r\n                                             WPARAM wParam, LPARAM lParam)\r\n{\r\n    //LRESULT lResult = m_pOldWndProc(hWnd,Msg,wParam,lParam);\r\n    LRESULT lResult = 0;\r\n    if (::IsWindowUnicode(hWnd))\r\n        lResult = ::CallWindowProcW(m_pOldWndProc,hWnd,Msg,wParam,lParam);\r\n    else\r\n        lResult = ::CallWindowProcA(m_pOldWndProc,hWnd,Msg,wParam,lParam);\r\n\r\n    // We need to redirect this message to the parent so later on the splitter\r\n    // that hosts this control will know that we have activated this window.\r\n    // Otherwise the splitter will not know that it should return the focus to\r\n    // this window if the focus is stolen by for example the menu.\r\n    if (Msg == WM_MOUSEACTIVATE)\r\n        ::SendMessage(GetParent(hWnd),Msg,wParam,lParam);\r\n\r\n    return lResult;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::BrowseObject(LPCITEMIDLIST pidl,UINT wFlags)\r\n{\r\n    if (wFlags & SBSP_PARENT && !m_pidl)\r\n        return E_FAIL;\r\n    if (wFlags & SBSP_RELATIVE && !m_pParentShellFolder)\r\n        return E_FAIL;\r\n\r\n    IShellFolder *pShellFolder = m_pParentShellFolder;\r\n    LPITEMIDLIST pidlCopy = NULL;\r\n    HRESULT hr = E_FAIL;\r\n\r\n    // Get IShellFolder, FULLY QUALIFIED pidl. Check if we are dealing with the desktop.\r\n    if (pidl == NULL && !(wFlags & SBSP_PARENT))\r\n    {\r\n        FreeMemberPointers();\r\n\r\n        if (SUCCEEDED(SHGetDesktopFolder(&m_pParentShellFolder)))\r\n            hr = SHGetSpecialFolderLocation(m_hWndParent,CSIDL_DESKTOP,&pidlCopy);\r\n    }\r\n    else\r\n    {\r\n        if (wFlags & SBSP_RELATIVE)\r\n        {\r\n            // Browse child folder\r\n            pidlCopy = ILCombine(m_pidl,pidl);\r\n            hr = pShellFolder->BindToObject(pidl,NULL,IID_IShellFolder,\r\n                reinterpret_cast<void **>(&m_pParentShellFolder));\r\n        }\r\n        else\r\n        {\r\n            if (wFlags & SBSP_PARENT)\r\n            {\r\n                // Browse parent: pidlCopy = parent folder's PIDL.\r\n                if (!m_PidlHelp.Split(m_pidl,&pidlCopy,NULL))\r\n                    return E_FAIL;\r\n            }\r\n            else\r\n            {\r\n                // Browse absolute PIDL: pidlCopy = clone(pidl).\r\n                pidlCopy = ILClone(pidl);\r\n            }\r\n\r\n            // Create IShellFolder for target PIDL through Desktop folder.\r\n            IShellFolder *pShellFolder2;\r\n            if (SUCCEEDED(hr = SHGetDesktopFolder(&pShellFolder2)))\r\n            {\r\n                if (SUCCEEDED(pShellFolder2->BindToObject(pidlCopy,NULL,\r\n                    IID_IShellFolder, reinterpret_cast<void**>(&m_pParentShellFolder))))\r\n                {\r\n                        pShellFolder2->Release();\r\n                }\r\n                else\r\n                {\r\n                    m_pParentShellFolder = pShellFolder2;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (FAILED(hr))\r\n    {\r\n        if (pidlCopy)\r\n            m_PidlHelp.FreePidl(pidlCopy);\r\n\r\n        if (m_pParentShellFolder)\r\n            m_pParentShellFolder->Release();\r\n\r\n        m_pParentShellFolder = pShellFolder;\r\n        return hr;\r\n    }\r\n\r\n    ATLASSERT(m_pParentShellFolder && pidlCopy);\r\n\r\n    if (!m_pParentShellFolder || !pidlCopy)\r\n        return E_FAIL;\r\n\r\n    // Use the IShellFolder to create a view window\r\n    FOLDERSETTINGS fs = { FVM_DETAILS,FWF_SNAPTOGRID/* | FWF_NOICONS*/ };\r\n\r\n    if (m_pShellView)\r\n        m_pShellView->GetCurrentInfo(&fs);\r\n\r\n    IShellView *pShellView = m_pShellView;\r\n    m_pShellView = NULL;\r\n    HWND hWndShellView = NULL;\r\n\r\n    if (SUCCEEDED(hr = m_pParentShellFolder->CreateViewObject(m_hWndParent,IID_IShellView,\r\n        reinterpret_cast<void **>(&m_pShellView))))\r\n    {\r\n        hr = m_pShellView->CreateViewWindow(pShellView,&fs,\r\n            static_cast<IShellBrowser*>(this),&CWindow::rcDefault,&hWndShellView);\r\n    }\r\n\r\n    if (FAILED(hr))\r\n    {\r\n        if (m_pShellView)\r\n        {\r\n            m_pShellView->UIActivate(SVUIA_DEACTIVATE);\r\n            m_pShellView->DestroyViewWindow();\r\n            m_pShellView->Release();\r\n            m_pShellView = pShellView;\r\n        }\r\n\r\n        m_PidlHelp.FreePidl(pidlCopy);\r\n        m_pParentShellFolder->Release();\r\n        m_pParentShellFolder = pShellFolder;\r\n\r\n        return hr;\r\n    }\r\n\r\n    // Restore the original windows procedure to the old window.\r\n    if (::IsWindow(m_hWnd) && m_pOldWndProc != NULL)\r\n    {\r\n        //::SetWindowLongPtr(m_hWnd,GWLP_WNDPROC,(LONG_PTR)m_pOldWndProc);\r\n        if (::IsWindowUnicode(m_hWnd))\r\n            ::SetWindowLongPtrW(m_hWnd,GWLP_WNDPROC,(LONG_PTR)m_pOldWndProc);\r\n        else\r\n            ::SetWindowLongPtrA(m_hWnd,GWLP_WNDPROC,(LONG_PTR)m_pOldWndProc);\r\n    }\r\n\r\n    m_hWnd = hWndShellView;\r\n\r\n    // Update the window to use our modified procedure.\r\n    //m_pOldWndProc = (WNDPROC)::GetWindowLongPtr(m_hWnd,GWLP_WNDPROC);\r\n    //::SetWindowLongPtr(m_hWnd,GWLP_WNDPROC,(LONG_PTR)WndProc);\r\n    if (::IsWindowUnicode(m_hWnd))\r\n    {\r\n        m_pOldWndProc = (WNDPROC)::GetWindowLongPtrW(m_hWnd,GWLP_WNDPROC);\r\n        ::SetWindowLongPtrW(m_hWnd,GWLP_WNDPROC,(LONG_PTR)WndProc);\r\n    }\r\n    else\r\n    {\r\n        m_pOldWndProc = (WNDPROC)::GetWindowLongPtrA(m_hWnd,GWLP_WNDPROC);\r\n        ::SetWindowLongPtrA(m_hWnd,GWLP_WNDPROC,(LONG_PTR)WndProc);\r\n    }\r\n\r\n    if (m_pidl)\r\n        m_PidlHelp.FreePidl(m_pidl);\r\n\r\n    m_pidl = pidlCopy;\r\n    \r\n    if (pShellView != NULL)\r\n    {\r\n        pShellView->UIActivate(SVUIA_DEACTIVATE);\r\n        pShellView->DestroyViewWindow();\r\n        pShellView->Release();\r\n    }\r\n\r\n    if (pShellFolder)\r\n        pShellFolder->Release();\r\n\r\n    // Only set the focus to the new list view if the old shell list view instance\r\n    // had the focus.\r\n    bool bSetFocus = ::GetFocus() == GetListViewHandle();\r\n\r\n    // Notify the receiver.\r\n    ::SendMessage(m_hWndReceiver,WM_SLVC_BROWSEOBJECT,0,(LPARAM)m_hWnd);\r\n    m_pShellView->UIActivate(bSetFocus ? SVUIA_ACTIVATE_FOCUS : SVUIA_ACTIVATE_NOFOCUS);\r\n\r\n    // Select first item in list view.\r\n    HWND hWndListView = FindWindowEx(m_hWnd,NULL,WC_LISTVIEW,NULL);\r\n    ListView_SetItemState(hWndListView,0,LVIS_FOCUSED | LVIS_SELECTED,0x000F);\r\n    ::ShowWindow(hWndListView,SW_NORMAL);\r\n\r\n    // Update the combobox.\r\n    ::SendMessage(m_hWndReceiver,WM_SLVC_DONEBROWSEOBJECT,0,(LPARAM)m_hWnd);\r\n\r\n    // Subclass the internal list view.\r\n    // UPDATE: Causes the list view to turn white when double-clicking on a\r\n    // folder in the explorer view.\r\n    /*if (hWndListView != NULL)\r\n    {\r\n        if (m_InternalListView.m_hWnd != NULL)\r\n        {\r\n            m_InternalListView.UnsubclassWindow();\r\n        }\r\n\r\n        m_InternalListView.SubclassWindow(hWndListView);\r\n        m_InternalListView.SetHost(m_pShellView);\r\n\r\n        // Force the WS_EX_CLIENTEDGE style on Windows Vista (which disables it by default).\r\n        if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA)\r\n            m_InternalListView.ModifyStyleEx(0,WS_EX_CLIENTEDGE,SWP_FRAMECHANGED);\r\n    }*/\r\n    if (hWndListView != NULL)\r\n    {\r\n        // Force the WS_EX_CLIENTEDGE style on Windows Vista (which disables it by default).\r\n        if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA)\r\n        {\r\n            unsigned long ulStyle = ::GetWindowLong(hWndListView,GWL_EXSTYLE);\r\n            ::SetWindowLong(hWndListView,GWL_EXSTYLE,ulStyle | WS_EX_CLIENTEDGE);\r\n            ::SetWindowPos(hWndListView,NULL,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE |\r\n                SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);\r\n        }\r\n    }\r\n\r\n    return NOERROR;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::EnableModelessSB(BOOL fEnable)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::GetControlWindow(UINT id,HWND *lphwnd)\r\n{\r\n    if (lphwnd == NULL)\r\n        return E_POINTER;\r\n\r\n    /*if (FCW_STATUS == id)\r\n    {\r\n        *lphwnd = m_hWndStatusBar;\r\n        return S_OK;\r\n    }*/\r\n\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::GetViewStateStream(DWORD grfMode,LPSTREAM *ppStrm)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::InsertMenusSB(HMENU hmenuShared,\r\n    LPOLEMENUGROUPWIDTHS lpMenuWidths)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::OnViewWindowActive(struct IShellView *ppshv)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::QueryActiveShellView(struct IShellView **ppshv)\r\n{\r\n    m_pShellView->AddRef();\r\n    *ppshv = m_pShellView;\r\n    return S_OK; \r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::RemoveMenusSB(HMENU hmenuShared)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::SendControlMsg(UINT id,UINT uMsg,WPARAM wParam,\r\n    LPARAM lParam,LRESULT *pret)\r\n{\r\n    if(pret == NULL)\r\n        return E_POINTER;\r\n\r\n    /*if (FCW_STATUS == id)\r\n    {\r\n        *pret = ::SendMessage(m_hWndStatusBar,uMsg,wParam,lParam);\r\n        return S_OK;\r\n    }*/\r\n    \r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::SetMenuSB(HMENU hmenuShared,HOLEMENU holemenuReserved,HWND hwndActiveObject)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::SetStatusTextSB(LPCOLESTR lpszStatusText)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::SetToolbarItems(LPTBBUTTON lpButtons,UINT nButtons,UINT uFlags)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nSTDMETHODIMP CShellListViewCtrl::TranslateAcceleratorSB(LPMSG lpmsg,WORD wID)\r\n{\r\n    return S_OK;\r\n}\r\n\r\nbool CShellListViewCtrl::IsAtTop()\r\n{\r\n    return m_pidl->mkid.cb < 1;\r\n}\r\n\r\nCIDA *CShellListViewCtrl::BeginGetItems(bool bSelected)\r\n{\r\n    if (m_hItemsMem != NULL)\r\n        EndGetItems();\r\n\r\n    IDataObject *pSelection;\r\n    HRESULT hResult = m_pShellView->GetItemObject(bSelected ? SVGIO_SELECTION : SVGIO_ALLVIEW,\r\n        IID_IDataObject,(void **)&pSelection);\r\n    if (!SUCCEEDED(hResult))\r\n        return NULL;\r\n\r\n    // CFSTR_SHELLIDLIST\r\n    FORMATETC fetc;\r\n    fetc.cfFormat = static_cast<CLIPFORMAT>(CF_IDLIST);\r\n    fetc.dwAspect = DVASPECT_CONTENT;\r\n    fetc.ptd = NULL;\r\n    fetc.lindex = -1;\r\n    fetc.tymed = TYMED_HGLOBAL;\r\n\r\n    hResult = pSelection->QueryGetData(&fetc);\r\n    if (!SUCCEEDED(hResult))\r\n        return NULL;\r\n\r\n    STGMEDIUM stm;\r\n    hResult = pSelection->GetData(&fetc,&stm);\r\n    if (!SUCCEEDED(hResult))\r\n        return NULL;\r\n\r\n    CIDA *pData = (CIDA *)GlobalLock(stm.hGlobal);\r\n    if (pData == NULL)\r\n        return NULL;\r\n\r\n    if (pData == NULL || pData->cidl < 1)\r\n        return NULL;\r\n\r\n    return pData;\r\n}\r\n\r\nvoid CShellListViewCtrl::EndGetItems()\r\n{\r\n    GlobalUnlock(m_hItemsMem);\r\n    m_hItemsMem = NULL;\r\n}\r\n"
  },
  {
    "path": "src/app/control/shell_list_view_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <shlobj.h>\r\n#include \"pidl_helper.hh\"\r\n\r\nclass CShellListViewCtrl : public IShellBrowser, public ICommDlgBrowser\r\n{\r\nprivate:\r\n    // Internal list view class used for translating the default shell hot keys.\r\n    /*class CInternalListViewCtrl : public CWindowImpl<CInternalListViewCtrl,CListViewCtrl>,\r\n                                  public CMessageFilter\r\n    {\r\n    private:\r\n        IShellView *m_pHostShellView;\r\n        bool m_bRegistered;\r\n\r\n    public:\r\n        BEGIN_MSG_MAP(CInternalListViewCtrl)\r\n            MESSAGE_HANDLER(WM_SETFOCUS,OnShowWindow)\r\n        END_MSG_MAP()\r\n\r\n        CInternalListViewCtrl()\r\n        {\r\n            m_bRegistered = false;\r\n        }\r\n\r\n        virtual BOOL PreTranslateMessage(MSG *pMsg)\r\n        {\r\n            if (GetFocus() == m_hWnd)\r\n            {\r\n                if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)\r\n                {\r\n                    if (m_pHostShellView->TranslateAccelerator(pMsg) == S_OK)\r\n                        return TRUE;\r\n                }\r\n            }\r\n\r\n            return FALSE;\r\n        }\r\n\r\n        LRESULT OnKeyDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n        {\r\n            if (uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST)\r\n            {\r\n                MSG Msg;\r\n                Msg.message = uMsg;\r\n                Msg.wParam = wParam;\r\n                Msg.lParam = lParam;\r\n\r\n                if (m_pHostShellView->TranslateAccelerator(&Msg) == S_OK)\r\n                {\r\n                    bHandled = true;\r\n                    return TRUE;\r\n                }\r\n            }\r\n\r\n            bHandled = false;\r\n            return 0;\r\n        }\r\n\r\n        LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n        {\r\n            if (!m_bRegistered)\r\n            {\r\n                AddToMessageLoop();\r\n                m_bRegistered = true;\r\n            }\r\n\r\n            bHandled = false;\r\n            return 0;\r\n        }\r\n\r\n        void SetHost(IShellView *pHostShellView)\r\n        {\r\n            m_pHostShellView = pHostShellView;\r\n        }\r\n\r\n        void AddToMessageLoop()\r\n        {\r\n            CMessageLoop *pLoop = _Module.GetMessageLoop();\r\n            pLoop->AddMessageFilter(this);\r\n        }\r\n\r\n        void RemoveFromMessageLoop()\r\n        {\r\n            CMessageLoop *pLoop = _Module.GetMessageLoop();\r\n            pLoop->RemoveMessageFilter(this);\r\n        }\r\n    };\r\n\r\n    CInternalListViewCtrl m_InternalListView;*/\r\n    static WNDPROC m_pOldWndProc;\r\n    static LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam);\r\n\r\n    DWORD m_dwRef;\r\n\r\n    HWND m_hWndParent;\r\n    HWND m_hWndReceiver;\r\n    HWND m_hWnd;\r\n\r\n    IShellFolder *m_pParentShellFolder;\r\n    IShellView *m_pShellView;\r\n\r\n    HGLOBAL\tm_hItemsMem;\r\n\r\n    CPidlHelper m_PidlHelp;\r\n    LPITEMIDLIST m_pidl;\r\n\r\n    void FreeMemberPointers();\r\n    bool IsFolder(LPCITEMIDLIST pidl,IShellFolder *psfParent);\r\n    bool IsFolderLink(LPCITEMIDLIST pidl,LPITEMIDLIST *pOutPidl);\r\n    //HWND GetListViewHandle();\r\n\r\npublic:\r\n    CShellListViewCtrl(HWND hWndParent,HWND hWndReceiver = NULL);\r\n    ~CShellListViewCtrl();\r\n\r\n    HWND GetListViewHandle();\r\n\r\n    // IUnknown members.\r\n    STDMETHOD(QueryInterface)(REFIID iid,void **ppvObject);\r\n    STDMETHOD_(ULONG,AddRef)();\r\n    STDMETHOD_(ULONG,Release)();\r\n\r\n    // IOleWindow members.\r\n    STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);\r\n    STDMETHOD(GetWindow)(HWND *lphwnd);\r\n\r\n    // ICommDlgBrowser members.\r\n    STDMETHOD(IncludeObject)(THIS_ struct IShellView *ppshv,LPCITEMIDLIST pidl);\r\n    STDMETHOD(OnDefaultCommand)(THIS_ struct IShellView *ppshv);\r\n    STDMETHOD(OnStateChange)(THIS_ struct IShellView *ppshv,ULONG uChange);\r\n\r\n    // IShellBrowser members (same as IOleInPlaceFrame).\r\n    STDMETHOD(BrowseObject)(LPCITEMIDLIST pidl,UINT wFlags);\r\n    STDMETHOD(EnableModelessSB)(BOOL fEnable);\r\n    STDMETHOD(GetControlWindow)(UINT id,HWND *lphwnd);\r\n    STDMETHOD(GetViewStateStream)(DWORD grfMode,LPSTREAM *ppStrm);\r\n    STDMETHOD(InsertMenusSB)(HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths);\r\n    STDMETHOD(OnViewWindowActive)(struct IShellView *ppshv);\r\n    STDMETHOD(QueryActiveShellView)(struct IShellView **ppshv);\r\n    STDMETHOD(RemoveMenusSB)(HMENU hmenuShared);\r\n    STDMETHOD(SendControlMsg)(UINT id,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT *pret);\r\n    STDMETHOD(SetMenuSB)(HMENU hmenuShared,HOLEMENU holemenuReserved,HWND hwndActiveObject);\r\n    STDMETHOD(SetStatusTextSB)(LPCOLESTR lpszStatusText);\r\n    STDMETHOD(SetToolbarItems)(LPTBBUTTON lpButtons,UINT nButtons,UINT uFlags);\r\n    STDMETHOD(TranslateAcceleratorSB)(LPMSG lpmsg,WORD wID);\r\n\r\n    // Miscellaneous.\r\n    IShellFolder *GetParentShellFolder();\r\n\r\n    bool IsAtTop();\r\n\r\n    CIDA *BeginGetItems(bool bSelected);\r\n    void EndGetItems();\r\n\r\n    // Operators.\r\n    operator HWND ()\r\n    {\r\n        return m_hWnd;\r\n    }\r\n};\r\n"
  },
  {
    "path": "src/app/control/space_meter.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include <base/graph_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"version.hh\"\r\n#include \"space_meter.hh\"\r\n\r\nCSpaceMeter::CSpaceMeter()\r\n    : m_bIsUpdatePending( false )\r\n{\r\n    m_iMeterPosition = 0;\r\n    m_iMeterSegmentSpacing = 0;\r\n\r\n    m_hProgressTheme = NULL;\r\n    m_iHorIndent = SPACEMETER_BARINDENT_THEMED;\r\n\r\n    // By default we use the size display mode.\r\n    m_iDisplayMode = SPACEMETER_DMSIZE;\r\n\r\n    // The default draw state is ofcourse normal.\r\n    m_iDrawState = SPACEMETER_DRAWSTATE_NORMAL;\r\n\r\n    m_uiAllocatedSize = 1;\r\n    m_uiDiscSize = 1;\r\n    m_uiMeterSize = 1;\r\n\r\n    for (unsigned int i = 0; i < SPACEMETER_METER_COUNT; i++)\r\n        lstrcpy(m_uiMeterSegments[i],_T(\"0 B\"));\r\n\r\n    m_hBarBorderBrush = ::CreateSolidBrush(SPACEMETER_BORDERCOLOR);\r\n    m_hWarnBarBorderBrush = ::CreateSolidBrush(SPACEMETER_WARNBORDERCOLOR);\r\n    m_hFullBarBorderBrush = ::CreateSolidBrush(SPACEMETER_FULLBORDERCOLOR);\r\n\r\n    m_ToolTipText.reserve(256);\r\n\r\n    // Create and fill the popup menu.\r\n    m_hPopupMenu = CreatePopupMenu();\r\n    FillPopupMenu();\r\n}\r\n\r\nCSpaceMeter::~CSpaceMeter()\r\n{\r\n    ::DeleteObject(m_hBarBorderBrush);\r\n    ::DeleteObject(m_hWarnBarBorderBrush);\r\n    ::DeleteObject(m_hFullBarBorderBrush);\r\n\r\n    // Destroy the popup menu.\r\n    if (m_hPopupMenu != NULL)\r\n        DestroyMenu(m_hPopupMenu);\r\n\r\n    // Destroy the tooltip control.\r\n    if (m_ToolTip.IsWindow())\r\n        m_ToolTip.DestroyWindow();\r\n\r\n    // Close the progress theme data.\r\n    if (m_hProgressTheme != NULL)\r\n        g_VisualStyles.CloseThemeData(m_hProgressTheme);\r\n}\r\n\r\nvoid CSpaceMeter::FillPopupMenu()\r\n{\r\n    // Remove the old items.\r\n    int iMenuItemCount = GetMenuItemCount(m_hPopupMenu);\r\n    for (int i = iMenuItemCount - 1; i >= 0; i--)\r\n        RemoveMenu(m_hPopupMenu,i,MF_BYPOSITION);\r\n\r\n    // Add new items (and on the same time convert them to radio items).\r\n    unsigned int uiMenuIndex = 0;\r\n    unsigned int uiCommand = SPACEMETER_POPUPMENU_IDBASE;\r\n\r\n    CMenuItemInfo mii;\r\n    mii.fMask = 0x100;\r\n    mii.fType = MFT_RADIOCHECK;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"DVD 7.96 GiB\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"DVD 4.38 GiB\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"99 min (870 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"90 min (791 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"80 min (703 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"74 min (650 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"24 min (210 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n\r\n    InsertMenu(m_hPopupMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiCommand++,_T(\"21 min (185 MiB)\"));\r\n    SetMenuItemInfo(m_hPopupMenu,uiMenuIndex,TRUE,&mii);\r\n    uiMenuIndex++;\r\n}\r\n\r\nvoid CSpaceMeter::DrawBar(HDC hDC,RECT *pClientRect)\r\n{\r\n    int iBottom = pClientRect->bottom - SPACEMETER_BARINDENT_BOTTOM;\r\n\r\n    RECT rcBar = {\r\n        pClientRect->left + m_iHorIndent,\r\n        iBottom - SPACEMETER_BAR_HEIGHT,\r\n        pClientRect->right - m_iHorIndent,\r\n        iBottom\r\n    };\r\n\r\n    // Draw the meter.\r\n    DrawMeter(hDC,pClientRect,&rcBar);\r\n\r\n    // Draw a different meter on Windows Vista systems.\r\n    if (m_hProgressTheme == NULL)\r\n    {\r\n        switch (m_iDrawState)\r\n        {\r\n            case SPACEMETER_DRAWSTATE_NORMAL:\r\n                FillRect(hDC,&rcBar,m_hBarBorderBrush);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_WARN:\r\n                FillRect(hDC,&rcBar,m_hWarnBarBorderBrush);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_FULL:\r\n                FillRect(hDC,&rcBar,m_hFullBarBorderBrush);\r\n                break;\r\n        }\t\t\r\n\r\n        ContractRect(&rcBar,1);\r\n\r\n        // First we draw the free space.\r\n        rcBar.left += m_iMeterPosition;\r\n\r\n        switch (m_iDrawState)\r\n        {\r\n            case SPACEMETER_DRAWSTATE_NORMAL:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_BARCOLOR_FREETOP,SPACEMETER_BARCOLOR_FREEBOTTOM);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_WARN:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_WARNBARCOLOR_FREETOP,SPACEMETER_WARNBARCOLOR_FREEBOTTOM);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_FULL:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_FULLBARCOLOR_FREETOP,SPACEMETER_FULLBARCOLOR_FREEBOTTOM);\r\n                break;\r\n        }\r\n\r\n        // Next we draw the allocated space.\r\n        rcBar.left -= m_iMeterPosition;\r\n        rcBar.right = m_iMeterPosition + m_iHorIndent + 1;\r\n\r\n        switch (m_iDrawState)\r\n        {\r\n            case SPACEMETER_DRAWSTATE_NORMAL:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_BARCOLOR_TOP,SPACEMETER_BARCOLOR_BOTTOM);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_WARN:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_WARNBARCOLOR_TOP,SPACEMETER_WARNBARCOLOR_BOTTOM);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_FULL:\r\n                DrawVertGradientRect(hDC,&rcBar,SPACEMETER_FULLBARCOLOR_TOP,SPACEMETER_FULLBARCOLOR_BOTTOM);\r\n                break;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,11,2,&rcBar,NULL);\r\n\r\n        // Draw the allocated space.\r\n        //rcBar.left++;\r\n        rcBar.right = m_iMeterPosition + m_iHorIndent + 1;\r\n\r\n        switch (m_iDrawState)\r\n        {\r\n            case SPACEMETER_DRAWSTATE_NORMAL:\r\n                g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,5,4,&rcBar,NULL);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_WARN:\r\n                g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,5,3,&rcBar,NULL);\r\n                break;\r\n\r\n            case SPACEMETER_DRAWSTATE_FULL:\r\n                g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,5,2,&rcBar,NULL);\r\n                break;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CSpaceMeter::DrawFullBar(HDC hDC,RECT *pClientRect)\r\n{\r\n    int iBottom = pClientRect->bottom - SPACEMETER_BARINDENT_BOTTOM;\r\n\r\n    RECT rcBar = {\r\n        pClientRect->left + m_iHorIndent,\r\n        iBottom - SPACEMETER_BAR_HEIGHT,\r\n        pClientRect->right - m_iHorIndent,\r\n        iBottom\r\n    };\r\n\r\n    // Draw the meter.\r\n    DrawMeter(hDC,pClientRect,&rcBar);\r\n\r\n    // Draw a different meter on Windows Vista systems.\r\n    if (m_hProgressTheme == NULL)\r\n    {\r\n        FillRect(hDC,&rcBar,m_hFullBarBorderBrush);\r\n\r\n        ContractRect(&rcBar,1);\r\n\r\n        // Draw the allocated space.\r\n        DrawVertGradientRect(hDC,&rcBar,SPACEMETER_FULLBARCOLOR_TOP,SPACEMETER_FULLBARCOLOR_BOTTOM);\r\n    }\r\n    else\r\n    {\r\n        g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,11,2,&rcBar,NULL);\r\n\r\n        // Draw the allocated space.\r\n        g_VisualStyles.DrawThemeBackground(m_hProgressTheme,hDC,5,2,&rcBar,NULL);\r\n    }\r\n}\r\n\r\nvoid CSpaceMeter::DrawMeter(HDC hDC,RECT *pClientRect,RECT *pBarRect)\r\n{\r\n    int iLineTop = pBarRect->bottom + SPACEMETER_METER_SPACING;\r\n\r\n    RECT rcLine = { 0, iLineTop, 0, iLineTop + SPACEMETER_METER_HEIGHT };\r\n    RECT rcText = { 0, iLineTop, pBarRect->right, pClientRect->bottom };\r\n\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,AtlGetDefaultGuiFont());\r\n\r\n    for (unsigned int i = 0; i < SPACEMETER_METER_COUNT; i++)\r\n    {\r\n        // Draw the line.\r\n        rcLine.left = pBarRect->left + i * m_iMeterSegmentSpacing;\r\n        rcLine.right = rcLine.left + 1;\r\n\r\n        ::FillRect(hDC,&rcLine,::GetSysColorBrush(COLOR_WINDOWTEXT));\r\n\r\n        // Draw the text.\r\n        ::SetBkMode(hDC,TRANSPARENT);\r\n        ::SetTextColor(hDC,::GetSysColor(COLOR_WINDOWTEXT));\r\n\r\n        rcText.left = rcLine.left + SPACEMETER_METERTEXT_INDENT_LEFT;\r\n        DrawText(hDC,m_uiMeterSegments[i],lstrlen(m_uiMeterSegments[i]),&rcText,\r\n            DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n    }\r\n\r\n    SelectObject(hDC,hOldFont);\r\n}\r\n\r\nvoid CSpaceMeter::UpdateMeter(int iClientWidth)\r\n{\r\n    int iMeterWidth = iClientWidth - m_iHorIndent - m_iHorIndent - 2;\r\n    m_iMeterSegmentSpacing = iMeterWidth / SPACEMETER_METER_COUNT;\r\n\r\n    unsigned __int64 uiAllocatedSize = min(m_uiAllocatedSize,m_uiMeterSize);\r\n    m_iMeterPosition = (int)(((float)uiAllocatedSize / m_uiMeterSize) * iMeterWidth);\r\n}\r\n\r\nvoid CSpaceMeter::UpdateToolTip()\r\n{\r\n    TCHAR szBuffer[ 200 ]; // Must be bigger than szFormattedInt, see below.\r\n    const TCHAR *szUsed = lngGetString(SPACEMETER_USED);\r\n    const TCHAR *szFree = lngGetString(SPACEMETER_FREE);\r\n    unsigned __int64 uiFree = m_uiAllocatedSize > m_uiDiscSize ? 0 : m_uiDiscSize -  m_uiAllocatedSize;\r\n\r\n    if (m_iDisplayMode == SPACEMETER_DMSIZE)\r\n    {\r\n        TCHAR szFormattedInt[ 160 ];\r\n\r\n        // Used.\r\n        m_ToolTipText = szUsed;\r\n        FormatBytes(szBuffer,m_uiAllocatedSize);\r\n        m_ToolTipText += szBuffer;\r\n\r\n        FormatInteger( m_uiAllocatedSize, szFormattedInt, _countof( szFormattedInt ) );\r\n        lsnprintf_s(szBuffer,64,_T(\" (%s Bytes)\\r\\n\"),szFormattedInt);\r\n        m_ToolTipText += szBuffer;\r\n\r\n        // Free.\r\n        m_ToolTipText += szFree;\r\n        FormatBytes(szBuffer,uiFree);\r\n        m_ToolTipText += szBuffer;\r\n\r\n        FormatInteger( uiFree, szFormattedInt, _countof( szFormattedInt ) );\r\n        lsnprintf_s(szBuffer,64,_T(\" (%s Bytes)\"),szFormattedInt);\r\n        m_ToolTipText += szBuffer;\r\n    }\r\n    else\r\n    {\r\n        // Used.\r\n        m_ToolTipText = szUsed;\r\n\r\n        lsnprintf_s(szBuffer,64,lngGetString(MISC_MINUTES),m_uiAllocatedSize/(1000 * 60));\r\n        m_ToolTipText += szBuffer;\r\n        m_ToolTipText += _T(\"\\r\\n\");\r\n\r\n        // Free.\r\n        m_ToolTipText += szFree;\r\n\r\n        lsnprintf_s(szBuffer,64,lngGetString(MISC_MINUTES),uiFree/(1000 * 60));\r\n        m_ToolTipText += szBuffer;\r\n    }\r\n}\r\n\r\nvoid CSpaceMeter::SetDiscSize(unsigned int uiDiscSize)\r\n{\r\n    for (unsigned int i = 0; i < SPACEMETER_POPUPMENU_COUNT; i++)\r\n        ::CheckMenuItem(m_hPopupMenu,i,MF_BYPOSITION | MF_UNCHECKED);\r\n\r\n    switch (uiDiscSize)\r\n    {\r\n        case SPACEMETER_SIZE_DLDVD:\r\n            m_uiDiscSize = 8547991552;\r\n            ::CheckMenuItem(m_hPopupMenu,0,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_DVD:\r\n            m_uiDiscSize = 4702989189;\r\n            ::CheckMenuItem(m_hPopupMenu,1,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_870MB:\r\n            m_uiDiscSize = 912261120;\r\n            ::CheckMenuItem(m_hPopupMenu,2,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_791MB:\r\n            m_uiDiscSize = 829423616;\r\n            ::CheckMenuItem(m_hPopupMenu,3,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_703MB:\r\n            m_uiDiscSize = 737148928;\r\n            ::CheckMenuItem(m_hPopupMenu,4,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_650MB:\r\n            m_uiDiscSize = 681574400;\r\n            ::CheckMenuItem(m_hPopupMenu,5,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_210MB:\r\n            m_uiDiscSize = 220200960;\r\n            ::CheckMenuItem(m_hPopupMenu,6,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_185MB:\r\n            m_uiDiscSize = 193986560;\r\n            ::CheckMenuItem(m_hPopupMenu,7,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_1020MIN:\t\t// This is incorrect, I have not been able to find how many sectors a dual layer DVD can contain.\r\n            m_uiDiscSize = 1020 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,0,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_510MIN:\r\n            m_uiDiscSize = 510 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,1,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_99MIN:\r\n            m_uiDiscSize = 99 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,2,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_90MIN:\r\n            m_uiDiscSize = 90 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,3,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_80MIN:\r\n            m_uiDiscSize = 80 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,4,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_74MIN:\r\n            m_uiDiscSize = 74 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,5,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_24MIN:\r\n            m_uiDiscSize = 24 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,6,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n\r\n        case SPACEMETER_SIZE_21MIN:\r\n            m_uiDiscSize = 21 * 1000 * 60;\r\n            ::CheckMenuItem(m_hPopupMenu,7,MF_BYPOSITION | MF_CHECKED);\r\n            break;\r\n    }\r\n\r\n    unsigned __int64 uiSegmentSize = m_uiDiscSize / (SPACEMETER_METER_COUNT - 1);\r\n    unsigned __int64 uiCurSegment = 0;\r\n\r\n    if (m_iDisplayMode == SPACEMETER_DMSIZE)\r\n    {\r\n        for (unsigned int i = 0; i < SPACEMETER_METER_COUNT; i++)\r\n        {\r\n            // For segments larger than 1GB we allow two decimals (by using the standard FormatBytes function).\r\n            if (m_uiMeterSegments[i],uiCurSegment > 1024 * 1024 * 1024)\r\n                FormatBytes(m_uiMeterSegments[i],uiCurSegment);\r\n            else\r\n                FormatBytesEx(m_uiMeterSegments[i],uiCurSegment);\r\n\r\n            uiCurSegment += uiSegmentSize;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        for (unsigned int i = 0; i < SPACEMETER_METER_COUNT; i++)\r\n        {\r\n            // Minutes.\r\n            lsnprintf_s(m_uiMeterSegments[i],SPACEMETER_METERTEXT_SIZE,_T(\"%d min\"),uiCurSegment/(1000 * 60));\r\n\r\n            uiCurSegment += uiSegmentSize;\r\n        }\r\n    }\r\n\r\n    // The meter hold the disc size + one segment.\r\n    m_uiMeterSize = m_uiDiscSize + uiSegmentSize;\r\n}\r\n\r\n\r\nvoid CSpaceMeter::SetAllocatedSize(unsigned __int64 uiAllocatedSize)\r\n{\r\n    m_uiAllocatedSize = uiAllocatedSize;\r\n\r\n    RequestDelayedUpdate();\r\n}\r\n\r\nvoid CSpaceMeter::IncreaseAllocatedSize(unsigned __int64 uiSize)\r\n{\r\n    SetAllocatedSize(m_uiAllocatedSize + uiSize);\r\n}\r\n\r\nvoid CSpaceMeter::DecreaseAllocatedSize(unsigned __int64 uiSize)\r\n{\r\n    SetAllocatedSize(m_uiAllocatedSize - uiSize);\r\n}\r\n\r\nvoid CSpaceMeter::RequestDelayedUpdate()\r\n{\r\n    if ( m_bIsUpdatePending )\r\n        return;\r\n\r\n    ATLVERIFY( 0 != PostMessage( WMU_SPACE_METER_DELAYED_UPDATE, 0, 0 ) );\r\n\r\n    m_bIsUpdatePending = true;\r\n}\r\n\r\n\r\nLRESULT CSpaceMeter::OnDelayedUpdate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    ATLASSERT( uMsg == WMU_SPACE_METER_DELAYED_UPDATE );\r\n    ATLASSERT( wParam == 0 );\r\n    ATLASSERT( lParam == 0 );\r\n    \r\n    m_bIsUpdatePending = false;\r\n\r\n    if (m_uiAllocatedSize > m_uiMeterSize)\r\n        m_iDrawState = SPACEMETER_DRAWSTATE_OUTOFSCOPE;\r\n    else if (m_uiAllocatedSize > m_uiDiscSize)\r\n    {\r\n        unsigned __int64 uiOverBurnAmount = m_iDisplayMode == SPACEMETER_DMSIZE ?\r\n            SPACEMETER_OVERBURNSIZE : SPACEMETER_OVERBURNLENGTH;\r\n\r\n        if (m_uiAllocatedSize < m_uiDiscSize + uiOverBurnAmount)\r\n            m_iDrawState = SPACEMETER_DRAWSTATE_WARN;\r\n        else\r\n            m_iDrawState = SPACEMETER_DRAWSTATE_FULL;\r\n    }\r\n    else\r\n    {\r\n        m_iDrawState = SPACEMETER_DRAWSTATE_NORMAL;\r\n    }\r\n\r\n    // Update the meter.\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    UpdateMeter(rcClient.right);\r\n\r\n    // Finally update the tooltip text buffer.\r\n    UpdateToolTip();\r\n\r\n    // Trigger a repaint.\r\n    RECT rcSpaceMeter;\r\n    GetClientRect(&rcSpaceMeter);\r\n    InvalidateRect(&rcSpaceMeter,true);\r\n\r\n    bHandled = true;\r\n    return 0;  // Return value unused.\r\n}\r\n\r\nunsigned __int64 CSpaceMeter::GetAllocatedSize()\r\n{\r\n    return m_uiAllocatedSize;\r\n}\r\n\r\nvoid CSpaceMeter::SetDisplayMode(int iDisplayMode)\r\n{\r\n    m_iDisplayMode = iDisplayMode;\r\n}\r\n\r\nvoid CSpaceMeter::Initialize()\r\n{\r\n    // Create the tool tip.\r\n    m_ToolTip.Create(m_hWnd);\r\n    m_ToolTip.SetMaxTipWidth(200);\r\n\r\n    CToolInfo ti(0,m_hWnd,SPACEMETER_TOOLTIP_ID,NULL,LPSTR_TEXTCALLBACK);\r\n\r\n    m_ToolTip.AddTool(&ti);\r\n    m_ToolTip.Activate(true);\r\n\r\n    // Initialize the progress theme data.\r\n    if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA &&\r\n        g_WinVer.m_ulMinorVersion == MINOR_WINVISTA)\r\n    {\r\n        m_hProgressTheme = g_VisualStyles.OpenThemeData(m_hWnd,L\"PROGRESS\");\r\n    }\r\n}\r\n\r\nLRESULT CSpaceMeter::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // If the application is themed, we use a different horizontal indentation.\r\n    if (!g_VisualStyles.IsThemeActive())\r\n        m_iHorIndent = SPACEMETER_BARINDENT_NORMAL;\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LRESULT lResult = DefWindowProc(uMsg,wParam,lParam);\r\n\r\n    unsigned int uiWidth = LOWORD(lParam);\r\n    UpdateMeter(uiWidth);\r\n\r\n    // Update the tooltip region.\r\n    if (m_ToolTip.IsWindow())\r\n    {\r\n        RECT rcClient = { 0,0,uiWidth,HIWORD(lParam) };\r\n        m_ToolTip.SetToolRect(m_hWnd,SPACEMETER_TOOLTIP_ID,&rcClient);\r\n    }\r\n\r\n    return lResult;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CPaintDC dc(m_hWnd);\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    HDC hMemDC;\r\n    HBITMAP hMemBitmap;\r\n\r\n    hMemDC = CreateCompatibleDC(dc);\r\n    hMemBitmap = CreateCompatibleBitmap(dc,rcClient.right,rcClient.bottom);\r\n\r\n    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,hMemBitmap);\r\n \r\n    // Draw the background.\r\n    FillRect(hMemDC,&rcClient,GetSysColorBrush(COLOR_BTNFACE));\r\n\r\n    // Draw the bar.\r\n    if (m_iDrawState == SPACEMETER_DRAWSTATE_OUTOFSCOPE)\r\n        DrawFullBar(hMemDC,&rcClient);\t\t// Just a faster draw method.\r\n    else\r\n        DrawBar(hMemDC,&rcClient);\r\n\r\n    BitBlt(dc,0,0,rcClient.right,rcClient.bottom,hMemDC,0,0,SRCCOPY);\r\n\r\n    SelectObject(hMemDC,hOldBitmap);\r\n\r\n    ReleaseDC(dc);\r\n    DeleteDC(hMemDC);\r\n\r\n    DeleteObject(hMemBitmap);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return true;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnRButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    POINT CursorPos;\r\n    GetCursorPos(&CursorPos);\r\n\r\n    TrackPopupMenuEx(m_hPopupMenu,0,CursorPos.x,CursorPos.y,m_hWnd,NULL);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_ToolTip.IsWindow())\r\n    {\r\n        MSG Msg = { m_hWnd,uMsg,wParam,lParam };\r\n        m_ToolTip.RelayEvent(&Msg);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnGetDispInfo(int idCtrl,LPNMHDR pnmh,BOOL &bHandled)\r\n{\r\n    // Make sure that the notification is about the control we care about.\r\n    if (pnmh->hwndFrom != m_ToolTip)\r\n    {\r\n        bHandled = FALSE;\r\n        return 0;\r\n    }\r\n\r\n    LPNMTTDISPINFO pNMTDI = (LPNMTTDISPINFO)pnmh;\r\n    pNMTDI->lpszText = const_cast<TCHAR *>(m_ToolTipText.c_str());\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSpaceMeter::OnPopupMenuClick(UINT uNotifyCode,int nID,CWindow wnd)\r\n{\r\n    nID -= SPACEMETER_POPUPMENU_IDBASE;\r\n\r\n    if (m_iDisplayMode == SPACEMETER_DMSIZE)\r\n        SetDiscSize(nID);\r\n    else\r\n        SetDiscSize(nID + SPACEMETER_POPUPMENU_COUNT);\r\n    \r\n    SetAllocatedSize(m_uiAllocatedSize);\r\n\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/control/space_meter.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <atlcrack.h>\t// COMMAND_RANGE_HANDLER_EX\r\n#include \"visual_styles.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\n#define SPACEMETER_BAR_HEIGHT\t\t\t\t10\r\n#define SPACEMETER_BARINDENT_NORMAL\t\t\t2\r\n#define SPACEMETER_BARINDENT_THEMED\t\t\t4\r\n#define SPACEMETER_BARINDENT_BOTTOM\t\t\t16\r\n\r\n#define SPACEMETER_METER_SPACING\t\t\t2\r\n#define SPACEMETER_METER_HEIGHT\t\t\t\t2\r\n#define SPACEMETER_METER_COUNT\t\t\t\t10\r\n#define SPACEMETER_METERTEXT_SIZE\t\t\t16\r\n#define SPACEMETER_METERTEXT_INDENT_LEFT\t4\r\n\r\n/*\r\n    New Tango colors.\r\n*/\r\n// Normal colors.\r\n#define SPACEMETER_BORDERCOLOR\t\t\t\tRGB(32,74,135)\r\n#define SPACEMETER_BARCOLOR_FREETOP\t\t\tRGB(114,159,205)\r\n#define SPACEMETER_BARCOLOR_FREEBOTTOM\t\tRGB(255,255,255)\r\n#define SPACEMETER_BARCOLOR_TOP\t\t\t\tRGB(114,159,205)\r\n#define SPACEMETER_BARCOLOR_BOTTOM\t\t\tRGB(52,101,164)\r\n\r\n// Warning colors (when overburning will most probably work).\r\n#define SPACEMETER_WARNBORDERCOLOR\t\t\tRGB(206,92,0)\r\n#define SPACEMETER_WARNBARCOLOR_FREETOP\t\tRGB(252,175,62)\r\n#define SPACEMETER_WARNBARCOLOR_FREEBOTTOM\tRGB(255,255,255)\r\n#define SPACEMETER_WARNBARCOLOR_TOP\t\t\tRGB(252,175,62)\r\n#define SPACEMETER_WARNBARCOLOR_BOTTOM\t\tRGB(245,121,0)\r\n\r\n// Disc full colors.\r\n#define SPACEMETER_FULLBORDERCOLOR\t\t\tRGB(164,0,0)\r\n#define SPACEMETER_FULLBARCOLOR_FREETOP\t\tRGB(239,41,41)\r\n#define SPACEMETER_FULLBARCOLOR_FREEBOTTOM\tRGB(255,255,255)\r\n#define SPACEMETER_FULLBARCOLOR_TOP\t\t\tRGB(239,41,41)\r\n#define SPACEMETER_FULLBARCOLOR_BOTTOM\t\tRGB(204,0,0)\r\n\r\n// How many bytes is it safe to overburn.\r\n#define SPACEMETER_OVERBURNSIZE\t\t\t\t13516800\t// 6600 * 2048 = 13 MiB.\r\n#define SPACEMETER_OVERBURNLENGTH\t\t\t88 * 1000\t// 6600 sectors = 88 seconds.\r\n\r\n#define SPACEMETER_DMSIZE\t\t\t\t\t0\r\n#define SPACEMETER_DMLENGTH\t\t\t\t\t1\r\n\r\n// Different draw states.\r\n#define SPACEMETER_DRAWSTATE_NORMAL\t\t\t0\r\n#define SPACEMETER_DRAWSTATE_WARN\t\t\t1\r\n#define SPACEMETER_DRAWSTATE_FULL\t\t\t2\r\n#define SPACEMETER_DRAWSTATE_OUTOFSCOPE\t\t3\r\n\r\n// Disc sizes (that should be passed to SetDiscSize).\r\n#define SPACEMETER_SIZE_DLDVD\t\t\t\t0\r\n#define SPACEMETER_SIZE_DVD\t\t\t\t\t1\r\n#define SPACEMETER_SIZE_870MB\t\t\t\t2\r\n#define SPACEMETER_SIZE_791MB\t\t\t\t3\r\n#define SPACEMETER_SIZE_703MB\t\t\t\t4\r\n#define SPACEMETER_SIZE_650MB\t\t\t\t5\r\n#define SPACEMETER_SIZE_210MB\t\t\t\t6\r\n#define SPACEMETER_SIZE_185MB\t\t\t\t7\r\n#define SPACEMETER_SIZE_1020MIN\t\t\t\t8\r\n#define SPACEMETER_SIZE_510MIN\t\t\t\t9\r\n#define SPACEMETER_SIZE_99MIN\t\t\t\t10\r\n#define SPACEMETER_SIZE_90MIN\t\t\t\t11\r\n#define SPACEMETER_SIZE_80MIN\t\t\t\t12\r\n#define SPACEMETER_SIZE_74MIN\t\t\t\t13\r\n#define SPACEMETER_SIZE_24MIN\t\t\t\t14\r\n#define SPACEMETER_SIZE_21MIN\t\t\t\t15\r\n\r\n// Specifies which ID the first recent menu item will have, the second will have + 1 and so on.\r\n#define SPACEMETER_POPUPMENU_IDBASE\t\t\t1000\r\n#define SPACEMETER_POPUPMENU_COUNT\t\t\t8\r\n\r\n#define SPACEMETER_TOOLTIP_ID\t\t\t\t1042\r\n\r\nclass CSpaceMeter : public CWindowImpl<CSpaceMeter,CWindow>\r\n{\r\nprivate:\r\n    // These values are for rendering, they should never be altered manually.\r\n    int m_iMeterPosition;\r\n    int m_iMeterSegmentSpacing;\r\n    TCHAR m_uiMeterSegments[SPACEMETER_METER_COUNT][SPACEMETER_METERTEXT_SIZE];\r\n\r\n    HBRUSH m_hBarBorderBrush;\r\n    HBRUSH m_hWarnBarBorderBrush;\r\n    HBRUSH m_hFullBarBorderBrush;\r\n\r\n    // Used for drawing a Vista meter.\r\n    HTHEME m_hProgressTheme;\r\n\r\n    // Horizontal indentation in pixels.\r\n    int m_iHorIndent;\r\n\r\n    int m_iDisplayMode;\r\n    int m_iDrawState;\r\n\r\n    // The following values can be changed from the outside using public functions.\r\n    unsigned __int64 m_uiAllocatedSize;\r\n    unsigned __int64 m_uiDiscSize;\r\n    unsigned __int64 m_uiMeterSize;\t\t\t// How many bytes does the meter display.\r\n\r\n    // Tooltip.\r\n    CToolTipCtrl m_ToolTip;\r\n    ckcore::tstring m_ToolTipText;\r\n\r\n    // Popup menu.\r\n    HMENU m_hPopupMenu;\r\n    void FillPopupMenu();\r\n\r\n    void DrawBar(HDC hDC,RECT *pClientRect);\r\n    void DrawFullBar(HDC hDC,RECT *pClientRect);\r\n    void DrawMeter(HDC hDC,RECT *pClientRect,RECT *pBarRect);\r\n\r\n    void UpdateMeter(int iClientWidth);\r\n    void UpdateToolTip();\r\n\r\n    bool m_bIsUpdatePending;\r\n\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckSpaceMeter\"));\r\n\r\n    CSpaceMeter();\r\n    ~CSpaceMeter();\r\n\r\n    //void SetDiskSize(unsigned __int64 uiDiskSize);\r\n    void SetDiscSize(unsigned int uiDiscSize);\r\n    void SetAllocatedSize(unsigned __int64 uiAllocatedSize);\r\n    void IncreaseAllocatedSize(unsigned __int64 uiSize);\r\n    void DecreaseAllocatedSize(unsigned __int64 uiSize);\r\n    unsigned __int64 GetAllocatedSize();\r\n\r\n    void SetDisplayMode(int iDisplayMode);\r\n    \r\n    void Initialize();\r\n\r\nprivate:\r\n#if _ATL_VER <= 0x0300\r\n    BEGIN_MSG_MAP_EX(CSpaceMeter)\r\n#else\r\n    BEGIN_MSG_MAP(CSpaceMeter)\r\n#endif\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_SIZE,OnSize)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)\r\n        MESSAGE_HANDLER(WM_RBUTTONDOWN,OnRButtonDown)\r\n        //MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WMU_SPACE_METER_DELAYED_UPDATE,OnDelayedUpdate)\r\n        MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST,WM_MOUSELAST,OnMouseMove)\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnGetDispInfo)\r\n\r\n        COMMAND_RANGE_HANDLER_EX(SPACEMETER_POPUPMENU_IDBASE,SPACEMETER_POPUPMENU_IDBASE + SPACEMETER_POPUPMENU_COUNT - 1,OnPopupMenuClick)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnRButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDelayedUpdate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetDispInfo(int idCtrl,LPNMHDR pnmh,BOOL &bHandled);\r\n\r\n    LRESULT OnPopupMenuClick(UINT uNotifyCode,int nID,CWindow wnd);\r\n\r\n    void RequestDelayedUpdate();\r\n};"
  },
  {
    "path": "src/app/control/title_tip_list_view_ctrl.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"title_tip_list_view_ctrl.hh\"\r\n#include <base/string_util.hh>\r\n\r\n/*\r\n    IMPORTANT: Requires host to chain the message loop.\r\n*/\r\n\r\nCTitleTipListViewCtrl::CTitleTipListViewCtrl()\r\n{\r\n    m_iCurrentItem = -1;\r\n    m_bTrackingMouseLeave = false;\r\n}\r\n\r\nCTitleTipListViewCtrl::~CTitleTipListViewCtrl()\r\n{\r\n    if (m_ToolTip.IsWindow())\r\n        m_ToolTip.DestroyWindow();\r\n}\r\n\r\nbool CTitleTipListViewCtrl::Initialize()\r\n{\r\n    m_ToolTip.Create(NULL,CWindow::rcDefault,NULL,\r\n        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,WS_EX_TOPMOST);\r\n\r\n    if (!m_ToolTip.IsWindow())\r\n        return false;\r\n\r\n    // Fill the tool information structure.\r\n    ::ZeroMemory(&m_ti,sizeof(m_ti));\r\n    m_ti.cbSize = sizeof(TOOLINFO);\r\n    m_ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;\r\n    m_ti.hwnd = GetParent();\r\n    m_ti.hinst = _Module.GetResourceInstance();\r\n    m_ti.uId = (unsigned int)m_hWnd;\r\n    m_ti.lpszText = LPSTR_TEXTCALLBACK;\r\n\r\n    m_ToolTip.AddTool(&m_ti);\r\n    m_ToolTip.TrackActivate(&m_ti,FALSE);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CTitleTipListViewCtrl::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    // Make sure that the control has been initialized.\r\n    if (!m_ToolTip.IsWindowEnabled())\r\n        return 0;\r\n\r\n    // Track the mouse to see when it leaves the list view.\r\n    if (!m_bTrackingMouseLeave)\r\n    {\r\n         TRACKMOUSEEVENT tme = { 0 };\r\n         tme.cbSize = sizeof(TRACKMOUSEEVENT);\r\n         tme.dwFlags = TME_LEAVE;\r\n         tme.hwndTrack = m_hWnd;\r\n\r\n         TrackMouseEvent(&tme);\r\n         m_bTrackingMouseLeave = true;\r\n      }\r\n\r\n    POINT ptCursor = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    unsigned int uiFlags = 0;\r\n    int iItem = HitTest(ptCursor,&uiFlags);\r\n\r\n    // Check if whe're hovering above an item.\r\n    if (iItem != -1)\r\n    {\r\n        RECT rcItem;\r\n        GetItemRect(iItem,&rcItem,LVIR_SELECTBOUNDS);\r\n\r\n        RECT rcListView;\r\n        GetClientRect(&rcListView);\r\n\r\n        // Check if the item text is to long to be fully displayed.\r\n        if (rcItem.right >= rcListView.right)\r\n        {\r\n            // Is the tool tip already visible?\r\n            if (m_ToolTip.GetCurrentTool(NULL) != 0)\r\n            {\r\n                if (m_iCurrentItem != iItem)\r\n                {\r\n                    m_iCurrentItem = iItem;\r\n                    m_ToolTip.TrackActivate(&m_ti,TRUE);\r\n                }\r\n\r\n                ClientToScreen(&rcItem);\r\n                ClientToScreen(&ptCursor);\r\n                m_ToolTip.TrackPosition(rcItem.left,rcItem.top);\r\n            }\r\n            else\r\n            {\r\n                m_ToolTip.TrackActivate(&m_ti,TRUE);\r\n                m_iCurrentItem = iItem;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            // Do not display the tool tip.\r\n            m_ToolTip.TrackActivate(&m_ti,FALSE);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        // Do not display the tool tip.\r\n        m_ToolTip.TrackActivate(&m_ti,FALSE);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CTitleTipListViewCtrl::OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_bTrackingMouseLeave = false;\r\n\r\n    RECT rcListView;\r\n    GetClientRect(&rcListView);\r\n    ClientToScreen(&rcListView);\r\n\r\n    POINT ptCursor;\r\n    GetCursorPos(&ptCursor);\r\n\r\n    // Check if the cursor has left the list view control.\r\n    if (!PtInRect(&rcListView,ptCursor))\r\n    {\r\n        if (m_ToolTip.IsWindow())\r\n            m_ToolTip.TrackActivate(&m_ti,FALSE);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CTitleTipListViewCtrl::OnGetDispInfo(int idCtrl,LPNMHDR pnmh,BOOL &bHandled)\r\n{\r\n    // Make sure that the notification is about the control we care about.\r\n    if (pnmh->hwndFrom != m_ToolTip)\r\n    {\r\n        bHandled = FALSE;\r\n        return 0;\r\n    }\r\n\r\n    // Copy the item title to the hint string buffer.\r\n    LPNMTTDISPINFO pNMTDI = (LPNMTTDISPINFO)pnmh;\r\n    GetItemText(m_iCurrentItem,0,pNMTDI->lpszText,80);\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/control/title_tip_list_view_ctrl.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CTitleTipListViewCtrl : public CWindowImpl<CTitleTipListViewCtrl,CListViewCtrl>\r\n{\r\nprivate:\r\n    CToolTipCtrl m_ToolTip;\r\n    TOOLINFO m_ti;\r\n    bool m_bTrackingMouseLeave;\r\n\r\n    // The current item that's beeing hovered.\r\n    int m_iCurrentItem;\r\n\r\npublic:\r\n    DECLARE_WND_CLASS(_T(\"ckToolTipListViewCtrl\"));\r\n\r\n    CTitleTipListViewCtrl();\r\n    ~CTitleTipListViewCtrl();\r\n\r\n    bool Initialize();\r\n\r\n    BEGIN_MSG_MAP(CTitleTipListViewCtrl)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WM_MOUSELEAVE,OnMouseLeave)\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnGetDispInfo)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseLeave(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetDispInfo(int idCtrl,LPNMHDR pnmh,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/control/welcome_pane.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"main_frm.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"action_manager.hh\"\r\n#include \"welcome_pane.hh\"\r\n\r\nCWelcomePane::CStandardButton::CStandardButton(CWelcomePane *pParent,\r\n                                               unsigned short usImageId,\r\n                                               int iX,int iY,long lCtrlId) :\r\n    CButton(pParent,iX,iY),m_State(STATE_NORMAL),m_bFocus(false),m_lCtrlId(lCtrlId)\r\n{\r\n    m_Image.Open(usImageId);\r\n}\r\n\r\nvoid CWelcomePane::CStandardButton::Draw(HDC hDC)\r\n{\r\n    switch (m_State)\r\n    {\r\n        case STATE_NORMAL:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_StandardFocusImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_StandardNormalImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n\r\n        case STATE_HOT:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_StandardHoverFocusImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_StandardHoverImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n    }\r\n\r\n    m_Image.Draw(hDC,GetX() + 18,GetY() + 12,GetX() + 18 + BUTTON_WIDTH,GetY() + 12 + BUTTON_HEIGHT);\r\n}\r\n\r\nbool CWelcomePane::CStandardButton::HoverTest(int iX,int iY,bool &bChanged)\r\n{\r\n    bool bHitX = iX > GetX() && iX < GetX() + BUTTON_WIDTH;\r\n    bool bHitY = iY > GetY() && iY < GetY() + BUTTON_HEIGHT;\r\n\r\n    if (bHitX && bHitY)\r\n    {\r\n        // Update status bar.\r\n        if (m_State != STATE_HOT)\r\n            m_pParent->SetStatusText(m_lCtrlId);\r\n\r\n        bChanged = m_State != STATE_HOT;\r\n        m_State = STATE_HOT;\r\n        return true;\r\n    }\r\n\r\n    bChanged = m_State != STATE_NORMAL;\r\n    m_State = STATE_NORMAL;\r\n    return false;\r\n}\r\n\r\nlong CWelcomePane::CStandardButton::ClickTest(int iX,int iY)\r\n{\r\n    bool bHitX = iX > GetX() && iX < GetX() + BUTTON_WIDTH;\r\n    bool bHitY = iY > GetY() && iY < GetY() + BUTTON_HEIGHT;\r\n\r\n    if (bHitX && bHitY)\r\n        return m_lCtrlId;\r\n    return -1;\r\n}\r\n\r\nCWelcomePane::CMultiButton::CMultiButton(CWelcomePane *pParent,\r\n                                         unsigned short usImageId,\r\n                                         int iX,int iY,\r\n                                         long lCtrlMainId,\r\n                                         long lCtrlSub1Id,\r\n                                         long lCtrlSub2Id) :\r\n    CButton(pParent,iX,iY),m_State(STATE_NORMAL),m_bFocus(false),\r\n    m_lCtrlMainId(lCtrlMainId),m_lCtrlSub1Id(lCtrlSub1Id),m_lCtrlSub2Id(lCtrlSub2Id)\r\n{\r\n    m_Image.Open(usImageId);\r\n}\r\n\r\nvoid CWelcomePane::CMultiButton::Draw(HDC hDC)\r\n{\r\n    switch (m_State)\r\n    {\r\n        case STATE_NORMAL:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_MultiFocusImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_MultiNormalImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n\r\n        case STATE_HOTMAIN:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_MultiHoverFocusImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_MultiHoverImage.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n\r\n        case STATE_HOTSUB1:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_MultiHoverFocusSub1Image.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_MultiHoverSub1Image.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n\r\n        case STATE_HOTSUB2:\r\n            if (m_bFocus)\r\n            {\r\n                m_pParent->m_MultiHoverFocusSub2Image.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            else\r\n            {\r\n                m_pParent->m_MultiHoverSub2Image.Draw(hDC,GetX(),GetY(),\r\n                    GetX() + BUTTON_WIDTH,GetY() + BUTTON_HEIGHT);\r\n            }\r\n            break;\r\n    }\r\n\r\n    m_Image.Draw(hDC,GetX() + 15,GetY() + 12,GetX() + 18 + BUTTON_WIDTH,GetY() + 12 + BUTTON_HEIGHT);\r\n}\r\n\r\nbool CWelcomePane::CMultiButton::HoverTest(int iX,int iY,bool &bChanged)\r\n{\r\n    bool bHitX = iX > GetX() && iX < GetX() + BUTTON_WIDTH;\r\n    bool bHitY = iY > GetY() && iY < GetY() + BUTTON_HEIGHT;\r\n\r\n    if (bHitX && bHitY)\r\n    {\r\n        int iSplitterX = GetX() + SPLITTER_X;\r\n        int iSplitterY = GetY() + SPLITTER_Y;\r\n\r\n        long lCtrlId;\r\n        eState NewState;\r\n        if (iX < iSplitterX)\r\n        {\r\n            lCtrlId = m_lCtrlMainId;\r\n            NewState = STATE_HOTMAIN;\r\n        }\r\n        else if (iY < iSplitterY)\r\n        {\r\n            lCtrlId = m_lCtrlSub1Id;\r\n            NewState = STATE_HOTSUB1;\r\n        }\r\n        else\r\n        {\r\n            lCtrlId = m_lCtrlSub2Id;\r\n            NewState = STATE_HOTSUB2;\r\n        }\r\n\r\n        // Update status bar.\r\n        if (NewState != m_State)\r\n            m_pParent->SetStatusText(lCtrlId);\r\n\r\n        bChanged = NewState != m_State;\r\n        m_State = NewState;\r\n        return true;\r\n    }\r\n\r\n    bChanged = m_State != STATE_NORMAL;\r\n    m_State = STATE_NORMAL;\r\n    return true;\r\n}\r\n\r\nlong CWelcomePane::CMultiButton::ClickTest(int iX,int iY)\r\n{\r\n    bool bHitX = iX > GetX() && iX < GetX() + BUTTON_WIDTH;\r\n    bool bHitY = iY > GetY() && iY < GetY() + BUTTON_HEIGHT;\r\n\r\n    if (bHitX && bHitY)\r\n    {\r\n        int iSplitterX = GetX() + SPLITTER_X;\r\n        int iSplitterY = GetY() + SPLITTER_Y;\r\n\r\n        if (iX < iSplitterX)\r\n            return m_lCtrlMainId;\r\n        else if (iY < iSplitterY)\r\n            return m_lCtrlSub1Id;\r\n        else\r\n            return m_lCtrlSub2Id;\r\n    }\r\n\r\n    return -1;\r\n}\r\n\r\nCWelcomePane::CWelcomePane()\r\n{\r\n    //m_LogoImage.Open(_T(\"C:\\\\test.png\"));\r\n    m_LogoImage.Open(IDR_WELCOMELOGOPNG);\r\n\r\n    // Load button images.\r\n    m_StandardNormalImage.Open(IDR_BUTTONNPNG);\r\n    m_StandardFocusImage.Open(IDR_BUTTONFPNG);\r\n    m_StandardHoverImage.Open(IDR_BUTTONHPNG);\r\n    m_StandardHoverFocusImage.Open(IDR_BUTTONHFPNG);\r\n\r\n    // Load multi button images.\r\n    m_MultiNormalImage.Open(IDR_MBUTTONNPNG);\r\n    m_MultiFocusImage.Open(IDR_MBUTTONFPNG);\r\n    m_MultiHoverImage.Open(IDR_MBUTTONHPNG);\r\n    m_MultiHoverSub1Image.Open(IDR_MBUTTONHS1PNG);\r\n    m_MultiHoverSub2Image.Open(IDR_MBUTTONHS2PNG);\r\n    m_MultiHoverFocusImage.Open(IDR_MBUTTONFPNG);\r\n    m_MultiHoverFocusSub1Image.Open(IDR_MBUTTONHFS1PNG);\r\n    m_MultiHoverFocusSub2Image.Open(IDR_MBUTTONHFS2PNG);\r\n\r\n    // Add buttons.\r\n    m_Buttons.push_back(new CMultiButton(this,IDR_WIZARDDATAPNG,\r\n        CButton::BUTTON_WIDTH * 0 + 10,10,\r\n        ID_NEWPROJECT_DATA,ID_NEWPROJECT_DATACD,ID_NEWPROJECT_DATADVD));\r\n    m_Buttons.push_back(new CStandardButton(this,IDR_WIZARDAUDIOPNG,\r\n        CButton::BUTTON_WIDTH * 1 + 10,10,\r\n        ID_NEWPROJECT_AUDIO));\r\n    m_Buttons.push_back(new CStandardButton(this,IDR_WIZARDVIDEOPNG,\r\n        CButton::BUTTON_WIDTH * 2 + 10,10,\r\n        ID_NEWPROJECT_DVDVIDEO));\r\n    m_Buttons.push_back(new CStandardButton(this,IDR_WIZARDWRITEPNG,\r\n        CButton::BUTTON_WIDTH * 0 + 10,CButton::BUTTON_HEIGHT + 10,\r\n        ID_ACTIONS_BURNIMAGE));\r\n    m_Buttons.push_back(new CStandardButton(this,IDR_WIZARDCOPYPNG,\r\n        CButton::BUTTON_WIDTH * 1 + 10,CButton::BUTTON_HEIGHT + 10,\r\n        ID_COPYDISC_COMPACTDISC));\r\n    m_Buttons.push_back(new CStandardButton(this,IDR_WIZARDREADPNG,\r\n        CButton::BUTTON_WIDTH * 2 + 10,CButton::BUTTON_HEIGHT + 10,\r\n        ID_COPYDISC_DISCIMAGE));\r\n}\r\n\r\nCWelcomePane::~CWelcomePane()\r\n{\r\n    // Delete all buttons.\r\n    std::vector<CButton *>::iterator itButton;\r\n    for (itButton = m_Buttons.begin(); itButton != m_Buttons.end(); itButton++)\r\n        delete *itButton;\r\n\r\n    m_Buttons.clear();\r\n}\r\n\r\nvoid CWelcomePane::SetStatusText(long lCtrlId)\r\n{\r\n    bool bSuccess = false;\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL &&\r\n        g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n    {\r\n        TCHAR *szStrValue;\r\n        if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(lCtrlId,szStrValue))\r\n        {\r\n            ::SendMessage(g_pMainFrame->m_hWndStatusBar,SB_SETTEXT,0,(LPARAM)szStrValue);\r\n            bSuccess = true;\r\n        }\r\n    }\r\n\r\n    if (!bSuccess)\r\n    {\r\n        TCHAR szBuffer[256];\r\n        LoadString(_Module.GetResourceInstance(),lCtrlId,szBuffer,sizeof(szBuffer) / sizeof(TCHAR));\r\n        ::SendMessage(g_pMainFrame->m_hWndStatusBar,SB_SETTEXT,0,(LPARAM)szBuffer);\r\n    }\r\n}\r\n\r\nLRESULT CWelcomePane::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    PAINTSTRUCT ps;\r\n    HDC hDC = BeginPaint(&ps);\r\n\r\n    // Calculate client rectangle.\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    // Center the buttons.\r\n    int iDrawWidth = CButton::BUTTON_WIDTH * 3 + 20;\r\n    int iDrawHeight = CButton::BUTTON_HEIGHT * 2 + 10;\r\n\r\n    int iOffsetX = (rcClient.right >> 1) - (iDrawWidth >> 1);\r\n    int iOffsetY = (rcClient.bottom >> 1) - (iDrawHeight >> 1);\r\n\r\n    std::vector<CButton *>::iterator itButton;\r\n    for (itButton = m_Buttons.begin(); itButton != m_Buttons.end(); itButton++)\r\n        (*itButton)->Offset(iOffsetX,iOffsetY);\r\n\r\n    // Use double-buffering.\r\n    HDC hMemDC = CreateCompatibleDC(hDC);\r\n    HBITMAP hMemBitmap = CreateCompatibleBitmap(hDC,rcClient.right - rcClient.left,\r\n        rcClient.bottom - rcClient.top);\r\n\r\n    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,hMemBitmap);\r\n\r\n    // Draw into the memory buffer.\r\n    FillRect(hMemDC,&rcClient,GetSysColorBrush(COLOR_WINDOW));\r\n\r\n    m_LogoImage.Draw(hMemDC,LOGO_INDENT_LEFT,LOGO_INDENT_TOP,rcClient.right,rcClient.bottom);\r\n\r\n    // Draw buttons.\r\n    //std::vector<CButton *>::iterator itButton;\r\n    for (itButton = m_Buttons.begin(); itButton != m_Buttons.end(); itButton++)\r\n        (*itButton)->Draw(hMemDC);\r\n\r\n    // Copy the memory buffer into the frame buffer.\r\n    BitBlt(hDC,0,0,rcClient.right,rcClient.bottom,hMemDC,0,0,SRCCOPY);\r\n\r\n    // Free memory buffer handles.\r\n    SelectObject(hMemDC,hOldBitmap);\r\n    DeleteObject(hMemBitmap);\r\n    DeleteDC(hMemDC);\r\n\r\n    EndPaint(&ps);\r\n    return 0;\r\n}\r\n\r\nLRESULT CWelcomePane::OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return 0;\r\n}\r\n\r\nLRESULT CWelcomePane::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    bool bRedraw = false,bHasHit = false;\r\n\r\n    std::vector<CButton *>::iterator itButton;\r\n    for (itButton = m_Buttons.begin(); itButton != m_Buttons.end(); itButton++)\r\n    {\r\n        CWelcomePane::CButton *pButton = *itButton;\r\n        \r\n        bool bChanged = false;\r\n        if (pButton->HoverTest(iPosX,iPosY,bChanged))\r\n            bHasHit = true;\r\n        if (bChanged)\r\n            bRedraw = true;\r\n    }\r\n\r\n    if (bRedraw)\r\n    {\r\n        RECT rcClient;\r\n        GetClientRect(&rcClient);\r\n        InvalidateRect(&rcClient);\r\n    }\r\n\r\n    if (!bHasHit)\r\n        ::SetWindowText(g_pMainFrame->m_hWndStatusBar,_T(\"\"));\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CWelcomePane::OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    std::vector<CButton *>::iterator itButton;\r\n    for (itButton = m_Buttons.begin(); itButton != m_Buttons.end(); itButton++)\r\n    {\r\n        CWelcomePane::CButton *pButton = *itButton;\r\n\r\n        long lAction = pButton->ClickTest(iPosX,iPosY);\r\n        switch (lAction)\r\n        {\r\n            case ID_NEWPROJECT_DATA:\r\n                g_pMainFrame->ShowWelcomePane(false);\r\n                break;\r\n\r\n            case ID_NEWPROJECT_DATACD:\r\n                g_pMainFrame->ShowWelcomePane(false);\r\n                g_ProjectManager.NewDataProject(SPACEMETER_SIZE_703MB);\r\n                break;\r\n\r\n            case ID_NEWPROJECT_DATADVD:\r\n                g_pMainFrame->ShowWelcomePane(false);\r\n                g_ProjectManager.NewDataProject(SPACEMETER_SIZE_DVD);\r\n                break;\r\n\r\n            case ID_NEWPROJECT_AUDIO:\r\n                g_pMainFrame->ShowWelcomePane(false);\r\n                g_ProjectManager.NewAudioProject(SPACEMETER_SIZE_80MIN);\r\n                break;\r\n\r\n            case ID_NEWPROJECT_DVDVIDEO:\r\n                g_pMainFrame->ShowWelcomePane(false);\r\n                g_ProjectManager.NewDataProject(SPACEMETER_SIZE_DVD);\r\n                g_ProjectSettings.m_iFileSystem = FILESYSTEM_DVDVIDEO;\r\n                break;\r\n\r\n            case ID_ACTIONS_BURNIMAGE:\r\n                g_ActionManager.BurnImage(*g_pMainFrame,false);\r\n                break;\r\n\r\n            case ID_COPYDISC_COMPACTDISC:\r\n                g_ActionManager.CopyDisc(*g_pMainFrame,false);\r\n                break;\r\n\r\n            case ID_COPYDISC_DISCIMAGE:\r\n                g_ActionManager.CopyImage(*g_pMainFrame,false);\r\n                break;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/control/welcome_pane.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"png_file.hh\"\r\n#include \"custom_button.hh\"\r\n#include \"custom_multi_button.hh\"\r\n\r\nclass CWelcomePane : public CWindowImpl<CWelcomePane,CWindow>\r\n{\r\nprivate:\r\n    enum\r\n    {\r\n        LOGO_INDENT_LEFT = 10,\r\n        LOGO_INDENT_TOP = 10\r\n    };\r\n\r\n    class CButton\r\n    {\r\n    public:\r\n        enum\r\n        {\r\n            BUTTON_WIDTH = 125,\r\n            BUTTON_HEIGHT = 72\r\n        };\r\n\r\n    private:\r\n        int m_iX;\r\n        int m_iY;\r\n        int m_iOffsetX;\r\n        int m_iOffsetY;\r\n\r\n    protected:\r\n        CWelcomePane *m_pParent;\r\n\r\n    public:\r\n        CButton(CWelcomePane *pParent,int iX,int iY) : m_pParent(pParent),m_iX(iX),m_iY(iY),m_iOffsetX(0),m_iOffsetY(0) {}\r\n        virtual ~CButton() {};\r\n\r\n        void Offset(int iOffsetX,int iOffsetY)\r\n        {\r\n            m_iOffsetX = iOffsetX;\r\n            m_iOffsetY = iOffsetY;\r\n        }\r\n\r\n        int GetX() { return m_iX + m_iOffsetX; }\r\n        int GetY() { return m_iY + m_iOffsetY; }\r\n\r\n        virtual void Draw(HDC hDC) = 0;\r\n\r\n        virtual bool HoverTest(int iX,int iY,bool &bChanged) = 0;\r\n        virtual long ClickTest(int iX,int iY) = 0;\r\n    };\r\n\r\n    class CStandardButton : public CButton\r\n    {\r\n    private:\r\n        enum eState\r\n        {\r\n            STATE_NORMAL,\r\n            STATE_HOT\r\n        };\r\n\r\n        bool m_bFocus;\r\n        long m_lCtrlId;\r\n        eState m_State;\r\n        CPngFile m_Image;\r\n    \r\n    public:\r\n        CStandardButton(CWelcomePane *pParent,unsigned short usImageId,int iX,int iY,long lCtrlId);\r\n\r\n        void Draw(HDC hDC);\r\n\r\n        bool HoverTest(int iX,int iY,bool &bChanged);\r\n        long ClickTest(int iX,int iY);\r\n    };\r\n\r\n    class CMultiButton : public CButton\r\n    {\r\n    private:\r\n        enum\r\n        {\r\n            SPLITTER_X = 99,\r\n            SPLITTER_Y = 36\r\n        };\r\n\r\n        enum eState\r\n        {\r\n            STATE_NORMAL,\r\n            STATE_HOTMAIN,\r\n            STATE_HOTSUB1,\r\n            STATE_HOTSUB2\r\n        };\r\n\r\n        bool m_bFocus;\r\n        long m_lCtrlMainId;\r\n        long m_lCtrlSub1Id;\r\n        long m_lCtrlSub2Id;\r\n        eState m_State;\r\n        CPngFile m_Image;\r\n    \r\n    public:\r\n        CMultiButton(CWelcomePane *pParent,unsigned short usImageId,int iX,int iY,\r\n                     long lCtrlMainId,long lCtrlSub1Id,long lCtrlSub2Id);\r\n\r\n        void Draw(HDC hDC);\r\n\r\n        bool HoverTest(int iX,int iY,bool &bChanged);\r\n        long ClickTest(int iX,int iY);\r\n    };\r\n\r\n    std::vector<CButton *> m_Buttons;\r\n\r\n    CPngFile m_LogoImage;\r\n\r\n    CPngFile m_StandardNormalImage;\r\n    CPngFile m_StandardFocusImage;\r\n    CPngFile m_StandardHoverImage;\r\n    CPngFile m_StandardHoverFocusImage;\r\n\r\n    CPngFile m_MultiNormalImage;\r\n    CPngFile m_MultiFocusImage;\r\n    CPngFile m_MultiHoverImage;\r\n    CPngFile m_MultiHoverSub1Image;\r\n    CPngFile m_MultiHoverSub2Image;\r\n    CPngFile m_MultiHoverFocusImage;\r\n    CPngFile m_MultiHoverFocusSub1Image;\r\n    CPngFile m_MultiHoverFocusSub2Image;\r\n\r\n    void SetStatusText(long lCtrlId);\r\n\r\npublic:\r\n    CWelcomePane();\r\n    ~CWelcomePane();\r\n\r\n    void Initialize();\r\n\r\n    BEGIN_MSG_MAP(CWelcomePane)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)\r\n        MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)\r\n\r\n        REFLECT_NOTIFICATIONS()\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnEraseBkgnd(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/core/cd_text.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <math.h>\r\n#include <base/string_util.hh>\r\n#include \"cd_text.hh\"\r\n\r\nvoid CCdText::InitCRC()\r\n{\r\n    // Compute basis polynomials.\r\n    unsigned short usBasePoly[8];\r\n    usBasePoly[0] = CDTEXT_CRCPOLYNOMIAL;\r\n\r\n    for (int i = 1; i < 8; i++)\r\n    {\r\n        usBasePoly[i] = usBasePoly[i - 1] << 1;\r\n\r\n        if ((usBasePoly[i - 1] >> 15) & 1)\r\n            usBasePoly[i] ^= usBasePoly[0];\r\n\r\n        usBasePoly[i] &= 0x0ffff;\r\n    }\r\n\r\n    // Calculate the table entries.\r\n    for (int i = 0; i < 256; i++)\r\n    {\r\n        int iCurrent = i;\r\n        m_usCRCTable[i] = 0;\r\n\r\n        for (int j = 0; j < 8; j++)\r\n        {\r\n            if (iCurrent & 1)\r\n                m_usCRCTable[i] ^= usBasePoly[j];\r\n\r\n            iCurrent >>= 1;\r\n        }\r\n    }\r\n}\r\n\r\nunsigned short CCdText::CalcCRC(unsigned char *pBuffer,unsigned int uiLength)\r\n{\r\n    unsigned short usCRC = 0;\r\n\r\n    for (int i = 0; i < (int)uiLength; i++)\r\n        usCRC = (usCRC << 8) ^ m_usCRCTable[(usCRC >> 8) ^ pBuffer[i]];\r\n \r\n    return usCRC;\r\n}\r\n\r\nCCdText::CCdText()\r\n{\r\n    Reset();\r\n\r\n    // Initialize the CRC table.\r\n    InitCRC();\r\n}\r\n\r\nCCdText::~CCdText()\r\n{\r\n    m_TrackNames.clear();\r\n    m_ArtistNames.clear();\r\n}\r\n\r\nvoid CCdText::Reset()\r\n{\r\n    m_szAlbumName[0] = '\\0';\r\n    m_szArtistName[0] = '\\0';\r\n\r\n    m_uiBufferPos = 0;\r\n    m_szBuffer[0] = '\\0';\r\n\r\n    m_TrackNames.clear();\r\n    m_ArtistNames.clear();\r\n}\r\n\r\nunsigned int CCdText::FindBufferEOS(unsigned int uiStart,unsigned int uiEnd)\r\n{\r\n    for (unsigned int i = uiStart; i < uiEnd; i++)\r\n    {\r\n        if (m_szBuffer[i] == '\\0')\r\n            return i;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nunsigned int CCdText::ReadPacket(ckcore::File &File,unsigned long ulPID,\r\n                                 unsigned long ulBlockInfo)\r\n{\r\n    // If the buffer can't hold the data we abort.\r\n    if (m_uiBufferPos + 12 >= CDTEXT_MAXFIELDSIZE)\r\n        return 0;\r\n\r\n    // Not currently used.\r\n    /*unsigned char ucDBCC = (unsigned char)(ulBlockInfo & 0x80) >> 7;\r\n    unsigned char ucBlockNumber = (unsigned char)(ulBlockInfo & 0x70) >> 4;\r\n    unsigned char ucCharPos = (unsigned char)(ulBlockInfo & 0x0F);*/\r\n\r\n    if (File.read(m_szBuffer + m_uiBufferPos,12) == -1)\r\n        return false;\r\n\r\n    // Debug information.\r\n    char szTemp[25];\r\n    sprintf(szTemp,\"%d, %d, %d\",(int)(ulPID & 0xFF0000) >> 16,(int)(ulPID & 0xFF00) >> 8,(int)ulPID & 0xFF);\r\n\r\n    char szTemp2[13];\r\n    memcpy(szTemp2,m_szBuffer + m_uiBufferPos,12);\r\n    szTemp2[12] = '\\0';\r\n\r\n    unsigned int uiEOS = FindBufferEOS(m_uiBufferPos,m_uiBufferPos + 12);\r\n\r\n    m_uiBufferPos += 12;\r\n\r\n    if (uiEOS == 0)\r\n        return 12;\r\n\r\n    switch (ulPID & 0xFF)\r\n    {\r\n        case PTI_NAMETITLE:\r\n            // If the second PID bytes is zero it's an album name, otherwise it's a track name.\r\n            if (((ulPID & 0xFF00) >> 8) == 0)\r\n                memcpy(m_szAlbumName,m_szBuffer,uiEOS + 1);\r\n            else\r\n                m_TrackNames.push_back(m_szBuffer);\r\n            break;\r\n\r\n        case PTI_NAMEPERFORMER:\r\n            if (((ulPID & 0xFF00) >> 8) == 0)\r\n                memcpy(m_szArtistName,m_szBuffer,uiEOS + 1);\r\n            else\r\n                m_ArtistNames.push_back(m_szBuffer);\r\n            break;\r\n\r\n        // We ignore all binary fields.\r\n        //case PTI_DISCID:\t// The specification is ambiguous and states that this type contains binary and character data.\r\n        //case PTI_GENREID:\t// The specification is ambiguous and states that this type contains binary and character data.\r\n        case PTI_TOCINFO:\r\n        case PTI_TOCINFO2:\r\n        case PTI_SIZEINFO:\r\n            MessageBox(NULL,_T(\"\"),_T(\"\"),MB_OK);\r\n            return 12;\r\n\r\n        default:\r\n            /*char szTemp[255];\r\n            memcpy(szTemp,m_szBuffer,uiEOS + 1);\r\n            MessageBoxA(NULL,szTemp,\"default\",MB_OK);*/\r\n            break;\r\n    };\r\n\r\n    // Skip all null characters.\r\n    while (m_szBuffer[uiEOS] == '\\0')\r\n        uiEOS++;\r\n\r\n    m_uiBufferPos -= uiEOS;\r\n\r\n    memcpy(m_szBuffer,m_szBuffer + uiEOS,m_uiBufferPos);\r\n\r\n    return 12;\r\n}\r\n\r\nbool CCdText::ReadFile(const TCHAR *szFileName)\r\n{\r\n    // Clear any previous data.\r\n    Reset();\r\n\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return false;\r\n\r\n    // Make sure that the file is not too large.\r\n    ckcore::tint64 iFileSize = File.size();\r\n    if (iFileSize > 0xFFFFFFFF)\r\n        return false;\r\n\r\n    unsigned int uiDataSize = (unsigned int)File.size();\r\n\r\n    // Try to find a signature.\r\n    unsigned long ulSignature = 0;\r\n    if (File.read(&ulSignature,4) == -1)\r\n        return false;\r\n\r\n    if (ulSignature == CDTEXT_SIGNATURE)\r\n        uiDataSize -= 4;\r\n    else\r\n        File.seek(0,ckcore::File::ckFILE_BEGIN);\r\n\r\n    unsigned int uiNumPackets = uiDataSize/18;\r\n\r\n    for (unsigned int i = 0; i < uiNumPackets; i++)\r\n    {\r\n        // Read header.\r\n        unsigned long ulHeader = 0;\r\n        if (File.read(&ulHeader,sizeof(unsigned long)) == -1)\r\n            return false;\r\n\r\n        // The first three bytes of the header is the Pack Type Indicator (PID),\r\n        // the last byte contain block information.\r\n        ReadPacket(File,ulHeader & 0xFFFFFF,(ulHeader & 0xFF000000) >> 24);\r\n\r\n        // Skip the CRC-field.\r\n        if (File.seek(2,ckcore::File::ckFILE_CURRENT) == -1)\r\n            return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nunsigned int CCdText::WriteText(ckcore::File &File,unsigned char ucType,unsigned char ucPID2,\r\n                                const char *szText,unsigned int uiCharPos)\r\n{\r\n    unsigned char ucBuffer[18];\r\n    ucBuffer[0] = ucType;\r\n    ucBuffer[1] = ucPID2;\r\n\r\n    unsigned int uiCurrentPos = 0;\r\n    unsigned int uiCurrentLen = (unsigned int)strlen(szText) + 1;\t\t// We want to include the terminating null character.\r\n\r\n    // Copy any old data to the write-buffer.\r\n    if (m_uiBufferPos > 0)\r\n    {\r\n        ucBuffer[1] = m_ucPrevPID2;\r\n        memcpy(ucBuffer + 4,m_szBuffer,m_uiBufferPos);\r\n    }\r\n\r\n    // Write all full texts.\r\n    while (uiCurrentPos < uiCurrentLen)\r\n    {\r\n        int iByteCount = min(12 - m_uiBufferPos,uiCurrentLen - uiCurrentPos - m_uiBufferPos);\r\n\r\n        memcpy(ucBuffer + 4 + m_uiBufferPos,szText + uiCurrentPos,iByteCount);\r\n\r\n        // Flush.\r\n        if (iByteCount + m_uiBufferPos == 12)\r\n        {\r\n            ucBuffer[2] = m_ucBlockCount++;\r\n            ucBuffer[3] = uiCharPos + uiCurrentPos;\r\n\r\n            // CRC.\r\n            unsigned short usCRC = CalcCRC(ucBuffer,16);\r\n            usCRC ^= 0xFFFF;\r\n            ucBuffer[16] = static_cast<unsigned char>((usCRC & 0xFF00) >> 8);\r\n            ucBuffer[17] = static_cast<unsigned char>(usCRC & 0xFF);\r\n\r\n            // Write.\r\n            File.write(ucBuffer,18);\r\n\r\n            m_uiBufferPos = 0;\r\n\r\n            uiCurrentPos += iByteCount;\r\n\r\n            // If we have just written a block associated with the previous we can now\r\n            // safeley set the second PID to match the current string.\r\n            if (ucBuffer[1] == m_ucPrevPID2)\r\n            {\r\n                ucBuffer[1] = ucPID2;\r\n\r\n                uiCharPos = 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            memcpy(m_szBuffer + m_uiBufferPos,szText + uiCurrentPos,iByteCount);\r\n            m_uiBufferPos += iByteCount;\r\n\r\n            break;\r\n        }\r\n    }\r\n\r\n    return uiCurrentPos;\r\n}\r\n\r\nvoid CCdText::FlushText(ckcore::File &File,unsigned char ucType,unsigned int uiCharPos)\r\n{\r\n    // Is there anything to flush?\r\n    if (m_uiBufferPos > 0)\r\n    {\r\n        unsigned char ucBuffer[18];\r\n        ucBuffer[0] = ucType;\r\n\r\n        ucBuffer[1] = m_ucPrevPID2;\r\n        ucBuffer[2] = m_ucBlockCount++;\r\n        ucBuffer[3] = uiCharPos;\r\n\r\n        memcpy(ucBuffer + 4,m_szBuffer,m_uiBufferPos);\r\n        memset(ucBuffer + 4 + m_uiBufferPos,'\\0',12 - m_uiBufferPos);\r\n\r\n        // CRC.\r\n        unsigned short usCRC = CalcCRC(ucBuffer,16);\r\n        usCRC ^= 0xFFFF;\r\n        ucBuffer[16] = static_cast<unsigned char>((usCRC & 0xFF00) >> 8);\r\n        ucBuffer[17] = static_cast<unsigned char>(usCRC & 0xFF);\r\n\r\n        // Flush.\r\n        File.write(ucBuffer,18);\r\n\r\n        m_uiBufferPos = 0;\r\n    }\r\n}\r\n\r\nbool CCdText::WriteFile(const TCHAR *szFileName)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return false;\r\n\r\n#ifdef CDTEXT_SAVESIGNATURE\r\n    // Write a signature.\r\n    unsigned long ulSignature = CDTEXT_SIGNATURE;\r\n    fs_write(&ulSignature,4,hFile);\r\n#endif\r\n\r\n    // Reset the internal counters.\r\n    m_uiBufferPos = 0;\r\n    m_ucBlockCount = 0;\r\n\r\n    unsigned int uiCharPos = 0;\r\n\r\n    // Track title information.\r\n    if (m_szAlbumName[0] != '\\0')\r\n    {\r\n        uiCharPos = WriteText(File,PTI_NAMETITLE,0,m_szAlbumName,uiCharPos);\r\n        m_ucPrevPID2 = 0;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < m_TrackNames.size(); i++)\r\n    {\r\n        uiCharPos = WriteText(File,PTI_NAMETITLE,(unsigned char)i + 1,m_TrackNames[i].c_str(),uiCharPos);\r\n        m_ucPrevPID2 = i + 1;\r\n    }\r\n\r\n    FlushText(File,PTI_NAMETITLE,uiCharPos);\r\n    uiCharPos = 0;\r\n\r\n    // Track artist information.\r\n    if (m_szArtistName[0] != '\\0')\r\n    {\r\n        uiCharPos = WriteText(File,PTI_NAMEPERFORMER,0,m_szArtistName,uiCharPos);\r\n        m_ucPrevPID2 = 0;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < m_ArtistNames.size(); i++)\r\n    {\r\n        uiCharPos = WriteText(File,PTI_NAMEPERFORMER,(unsigned char)i + 1,m_ArtistNames[i].c_str(),uiCharPos);\r\n        m_ucPrevPID2 = i + 1;\r\n    }\r\n\r\n    FlushText(File,PTI_NAMEPERFORMER,uiCharPos);\r\n    uiCharPos = 0;\r\n\r\n    return true;\r\n}\r\n\r\nbool CCdText::WriteFileEx(const TCHAR *szFileName,const TCHAR *szAlbumName,\r\n                          const TCHAR *szArtistName,std::vector<CItemData *> &Tracks)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return false;\r\n\r\n#ifdef CDTEXT_SAVESIGNATURE\r\n    // Write a signature.\r\n    unsigned long ulSignature = CDTEXT_SIGNATURE;\r\n    if (File.write(&ulSignature,4) == -1)\r\n        return false;\r\n#endif\r\n\r\n    // Reset the internal counters.\r\n    m_uiBufferPos = 0;\r\n    m_ucBlockCount = 0;\r\n\r\n    unsigned int uiCharPos = 0;\r\n    char szBuffer[CDTEXT_MAXFIELDSIZE];\r\n\r\n    // Track title information.\r\n    if (szAlbumName[0] != '\\0')\r\n    {\r\n        UnicodeToAnsi(szBuffer,szAlbumName,sizeof(szBuffer));\r\n\r\n        uiCharPos = WriteText(File,PTI_NAMETITLE,0,szBuffer,uiCharPos);\r\n        m_ucPrevPID2 = 0;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < Tracks.size(); i++)\r\n    {\r\n        UnicodeToAnsi(szBuffer,Tracks[i]->GetAudioData()->szTrackTitle,sizeof(szBuffer));\r\n\r\n        uiCharPos = WriteText(File,PTI_NAMETITLE,(unsigned char)i + 1,szBuffer,uiCharPos);\r\n        m_ucPrevPID2 = i + 1;\r\n    }\r\n\r\n    FlushText(File,PTI_NAMETITLE,uiCharPos);\r\n    uiCharPos = 0;\r\n\r\n    // Track artist information.\r\n    if (szArtistName[0] != '\\0')\r\n    {\r\n        UnicodeToAnsi(szBuffer,szArtistName,sizeof(szBuffer));\r\n\r\n        uiCharPos = WriteText(File,PTI_NAMEPERFORMER,0,szBuffer,uiCharPos);\r\n        m_ucPrevPID2 = 0;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < Tracks.size(); i++)\r\n    {\r\n        UnicodeToAnsi(szBuffer,Tracks[i]->GetAudioData()->szTrackArtist,sizeof(szBuffer));\r\n\r\n        uiCharPos = WriteText(File,PTI_NAMEPERFORMER,(unsigned char)i + 1,szBuffer,uiCharPos);\r\n        m_ucPrevPID2 = i + 1;\r\n    }\r\n\r\n    FlushText(File,PTI_NAMEPERFORMER,uiCharPos);\r\n    uiCharPos = 0;\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/app/core/cd_text.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/file.hh>\r\n#include \"tree_manager.hh\"\r\n\r\n#define CDTEXT_SIGNATURE\t\t\t0x2201\r\n#define CDTEXT_MAXFIELDSIZE\t\t\t160\r\n//#define CDTEXT_CRCPOLYNOMIAL\t\t0x8408\r\n#define CDTEXT_CRCPOLYNOMIAL\t\t0x1021\r\n\r\n// Define if a 4 byte header should be stored in the beginning of each cd-text binary file.\r\n//#define CDTEXT_SAVESIGNATURE\r\n\r\nclass CCdText\r\n{\r\nprivate:\r\n    unsigned short m_usCRCTable[256];\r\n\r\n    char m_szBuffer[CDTEXT_MAXFIELDSIZE];\r\n    unsigned int m_uiBufferPos;\r\n\r\n    unsigned char m_ucBlockCount;\r\n    unsigned char m_ucPrevPID2;\r\n\r\n    void Reset();\r\n    unsigned int FindBufferEOS(unsigned int uiStart,unsigned int uiEnd);\r\n    unsigned int ReadPacket(ckcore::File &File,unsigned long ulPID,unsigned long ulBlockInfo);\r\n\r\n    // CRC routines.\r\n    void InitCRC();\r\n    unsigned short CalcCRC(unsigned char *pBuffer,unsigned int uiLength);\r\n\r\n    // Write routines.\r\n    unsigned int WriteText(ckcore::File &File,unsigned char ucType,unsigned char ucPID2,\r\n        const char *szText,unsigned int uiCharPos);\r\n    void FlushText(ckcore::File &File,unsigned char ucType,unsigned int uiCharPos);\r\n\r\n    enum ePTI\r\n    {\r\n        PTI_NAMETITLE = 0x80,\r\n        PTI_NAMEPERFORMER = 0x81,\r\n        PTI_NAMEWRITER = 0x82,\r\n        PTI_NAMESONGWRITER = 0x83,\r\n        PTI_NAMEARRANGER = 0x84,\r\n        PTI_MESSAGEARTIST = 0x85,\r\n        PTI_DISCID = 0x86,\r\n        PTI_GENREID = 0x87,\r\n        PTI_TOCINFO = 0x88,\r\n        PTI_TOCINFO2 = 0x89,\r\n        PTI_RESERVED1 = 0x8A,\r\n        PTI_RESERVED2 = 0x8B,\r\n        PTI_RESERVED3 = 0x8C,\r\n        PTI_RESERVED4 = 0x8D,\r\n        PTI_UPCEAN = 0x8E,\r\n        PTI_SIZEINFO = 0x8F\r\n    };\r\n\r\npublic:\r\n    CCdText();\r\n    ~CCdText();\r\n\r\n    char m_szAlbumName[CDTEXT_MAXFIELDSIZE];\r\n    char m_szArtistName[CDTEXT_MAXFIELDSIZE];\r\n    std::vector<std::string> m_TrackNames;\r\n    std::vector<std::string> m_ArtistNames;\r\n\r\n    bool ReadFile(const TCHAR *szFileName);\r\n    bool WriteFile(const TCHAR *szFileName);\r\n    bool WriteFileEx(const TCHAR *szFileName,const TCHAR *szAlbumName,\r\n        const TCHAR *szArtistName,std::vector<CItemData *> &Tracks);\r\n};\r\n"
  },
  {
    "path": "src/app/core/cdrtools_parse_strings.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define CDRTOOLS_COPYRIGHT\t\t\t\t\t\"Cdrecord-ProDVD-ProBD-Clone\"\r\n#define CDRTOOLS_COPYRIGHT_LENGTH\t\t\t27\r\n#define CDRTOOLS_SCSIBUS\t\t\t\t\t\"scsibus\"\r\n#define CDRTOOLS_SCSIBUS_LENGTH\t\t\t\t7\r\n#ifdef CDRKIT\r\n#define CDRTOOLS_ERROR\t\t\t\t\t\t\"wodim: \"\r\n#define CDRTOOLS_ERROR_LENGTH\t\t\t\t7\r\n#define CDRTOOLS_ERROR3\t\t\t\t\t\t\"readom: \"\r\n#define CDRTOOLS_ERROR3_LENGTH\t\t\t\t8\r\n#define CDRTOOLS_ERROR4\t\t\t\t\t\t\"icedax: \"\r\n#define CDRTOOLS_ERROR4_LENGTH\t\t\t\t8\r\n#else\r\n#define CDRTOOLS_ERROR\t\t\t\t\t\t\"cdrecord: \"\r\n#define CDRTOOLS_ERROR_LENGTH\t\t\t\t10\r\n#define CDRTOOLS_ERROR3\t\t\t\t\t\t\"readcd: \"\r\n#define CDRTOOLS_ERROR3_LENGTH\t\t\t\t8\r\n#define CDRTOOLS_ERROR4\t\t\t\t\t\t\"cdda2wav: \"\r\n#define CDRTOOLS_ERROR4_LENGTH\t\t\t\t10\r\n#endif\r\n#define CDRTOOLS_REMOVABLE\t\t\t\t\t\"Removable \"\r\n#define CDRTOOLS_REMOVABLE_LENGTH\t\t\t10\r\n#define CDRTOOLS_TYPE_CDROM\t\t\t\t\t\"CD-ROM\"\r\n#define CDRTOOLS_TYPE_CDROM_LENGTH\t\t\t6\r\n#define CDRTOOLS_TYPE_COMMUNICATION\t\t\t\"Communication\"\r\n#define CDRTOOLS_TYPE_COMMUNICATION_LENGTH\t13\r\n#define CDRTOOLS_TYPE_DISC\t\t\t\t\t\"Disk\"\r\n#define CDRTOOLS_TYPE_DISC_LENGTH\t\t\t4\r\n#define CDRTOOLS_TYPE_JUKEBOX\t\t\t\t\"Juke Box\"\r\n#define CDRTOOLS_TYPE_JUKEBOX_LENGTH\t\t8\r\n#define CDRTOOLS_TYPE_OPTICALSTORAGE\t\t\"Optical Storage\"\r\n#define CDRTOOLS_TYPE_OPTICALSTORAGE_LENGTH\t15\r\n#define CDRTOOLS_TYPE_PRINTER\t\t\t\t\"Printer\"\r\n#define CDRTOOLS_TYPE_PRINTER_LENGTH\t\t7\r\n#define CDRTOOLS_TYPE_PROCESSOR\t\t\t\t\"Processor\"\r\n#define CDRTOOLS_TYPE_PROCESSOR_LENGTH\t\t9\r\n#define CDRTOOLS_TYPE_SCANNER\t\t\t\t\"Scanner\"\r\n#define CDRTOOLS_TYPE_SCANNER_LENGTH\t\t7\r\n#define CDRTOOLS_TYPE_TAPE\t\t\t\t\t\"Tape\"\r\n#define CDRTOOLS_TYPE_TAPE_LENGTH\t\t\t4\r\n#define CDRTOOLS_TYPE_WORM\t\t\t\t\t\"WORM\"\r\n#define CDRTOOLS_TYPE_WORM_LENGTH\t\t\t4\r\n#define CDRTOOLS_WRITEFLAGS\t\t\t\t\t\"Driver flags   :\"\r\n#define CDRTOOLS_WRITEFLAGS_LENGTH\t\t\t16\r\n#define CDRTOOLS_WRITEMODES\t\t\t\t\t\"Supported modes:\"\r\n#define CDRTOOLS_WRITEMODES_LENGTH\t\t\t16\r\n#define CDRTOOLS_GRACEBEGIN\t\t\t\t\t\"Last chance\"\r\n#define CDRTOOLS_GRACEBEGIN_LENGTH\t\t\t11\r\n#define CDRTOOLS_NOMEDIA\t\t\t\t\t\"Cannot load media.\"\r\n#define CDRTOOLS_NOMEDIA_LENGTH\t\t\t\t18\r\n#define CDRTOOLS_CYGWINPATH\t\t\t\t\t\"/cygdrive/\"\r\n#define CDRTOOLS_CYGWINPATH_LENGTH\t\t\t10\r\n#define CDRTOOLS_NOSUPPORT\t\t\t\t\t\"This drive or\"\r\n#define CDRTOOLS_NOSUPPORT_LENGTH\t\t\t13\r\n#define CDRTOOLS_BLANK\t\t\t\t\t\t\"BLANK\"\r\n#define CDRTOOLS_BLANK_LENGTH\t\t\t\t5\r\n#define CDRTOOLS_STARTCDWRITE\t\t\t\t\"Starting to write CD/DVD\"\r\n#define CDRTOOLS_STARTCDWRITE_LENGTH\t\t24\r\n#define CDRTOOLS_BLANKTIME\t\t\t\t\t\"Blanking time:\"\r\n#define CDRTOOLS_BLANKTIME_LENGTH\t\t\t14\r\n#define CDRTOOLS_NODISC\t\t\t\t\t\t\"No disk \"\r\n#define CDRTOOLS_NODISC_LENGTH\t\t\t\t8\r\n#define CDRTOOLS_BLANKERROR\t\t\t\t\t\"Cannot blank\"\r\n#define CDRTOOLS_BLANKERROR_LENGTH\t\t\t12\r\n#define CDRTOOLS_BLANKUNSUP\t\t\t\t\t\"Some drives do not\"\r\n#define CDRTOOLS_BLANKUNSUP_LENGTH\t\t\t18\r\n#define CDRTOOLS_BLANKRETRY\t\t\t\t\t\"Try again\"\r\n#define CDRTOOLS_BLANKRETRY_LENGTH\t\t\t9\r\n#define CDRTOOLS_UNSUPPORTED\t\t\t\t\"Unsupported \"\r\n#define CDRTOOLS_UNSUPPORTED_LENGTH\t\t\t12\r\n#define CDRTOOLS_SECTOR\t\t\t\t\t\t\"sector\"\r\n#define CDRTOOLS_SECTOR_LENGTH\t\t\t\t6\r\n#define CDRTOOLS_VERSIONINFO\t\t\t\t\"This version\"\r\n#define CDRTOOLS_VERSIONINFO_LENGTH\t\t\t12\r\n#define CDRTOOLS_DVDINFO\t\t\t\t\t\"If you need\"\r\n#define CDRTOOLS_DVDINFO_LENGTH\t\t\t\t11\r\n#define CDRTOOLS_DVDGETINFO\t\t\t\t\t\"Free test\"\r\n#define CDRTOOLS_DVDGETINFO_LENGTH\t\t\t9\r\n#define CDRTOOLS_STARTTRACK\t\t\t\t\t\"Starting new track\"\r\n#define CDRTOOLS_STARTTRACK_LENGTH\t\t\t18\r\n#define CDRTOOLS_WRITEPREGAP\t\t\t\t\"Writing pregap\"\r\n#define CDRTOOLS_WRITEPREGAP_LENGTH\t\t\t14\r\n#define CDRTOOLS_FILLFIFO\t\t\t\t\t\"Waiting for reader\"\r\n#define CDRTOOLS_FILLFIFO_LENGTH\t\t\t18\r\n#define CDRTOOLS_WRITETIME\t\t\t\t\t\"Writing  time:\"\r\n#define CDRTOOLS_WRITETIME_LENGTH\t\t\t14\r\n#define CDRTOOLS_FIXATE\t\t\t\t\t\t\"Fixating...\"\r\n#define CDRTOOLS_FIXATE_LENGTH\t\t\t\t11\r\n#define CDRTOOLS_FIXATETIME\t\t\t\t\t\"Fixating time:\"\r\n#define CDRTOOLS_FIXATETIME_LENGTH\t\t\t14\r\n#define CDRTOOLS_WARNINGCAP\t\t\t\t\t\"WARNING:\"\r\n#define CDRTOOLS_WARNINGCAP_LENGTH\t\t\t8\r\n#define CDRTOOLS_WRITEERROR\t\t\t\t\t\"A write error\"\r\n#define CDRTOOLS_WRITEERROR_LENGTH\t\t\t13\r\n#define CDRTOOLS_FILENOTFOUND\t\t\t\t\"No such file or directory.\"\r\n#define CDRTOOLS_FILENOTFOUND_LENGTH\t\t26\r\n#define CDRTOOLS_TOTALTTSIZE\t\t\t\t\"Total translation table\"\r\n#define CDRTOOLS_TOTALTTSIZE_LENGTH\t\t\t23\r\n#define CDRTOOLS_BADAUDIOCODING\t\t\t\t\"Inappropriate audio\"\r\n#define CDRTOOLS_BADAUDIOCODING_LENGTH\t\t19\r\n#define CDRTOOLS_RELOADDRIVE\t\t\t\t\"Re-load\"\r\n#define CDRTOOLS_RELOADDRIVE_LENGTH\t\t\t7\r\n#define CDRTOOLS_TOTALTIME\t\t\t\t\t\"Time total: \"\r\n#define CDRTOOLS_TOTALTIME_LENGTH\t\t\t12\r\n#define CDRTOOLS_END\t\t\t\t\t\t\"end: \"\r\n#define CDRTOOLS_END_LENGTH\t\t\t\t\t5\r\n#define CDRTOOLS_ADDRESS\t\t\t\t\t\"addr: \"\r\n#define CDRTOOLS_ADDRESS_LENGTH\t\t\t\t6\r\n#define CDRTOOLS_IOERROR\t\t\t\t\t\"Input/Output error. \"\r\n#define CDRTOOLS_IOERROR_LENGTH\t\t\t\t20\r\n#define CDRTOOLS_SECTORERROR\t\t\t\t\"Error on sector\"\r\n#define CDRTOOLS_SECTORERROR_LENGTH\t\t\t15\r\n#define CDRTOOLS_RETRYSECTOR\t\t\t\t\"Retrying from sector\"\r\n#define CDRTOOLS_RETRYSECTOR_LENGTH\t\t\t20\r\n#define CDRTOOLS_C2ERRORS\t\t\t\t\t\"C2 errors \"\r\n#define CDRTOOLS_C2ERRORS_LENGTH\t\t\t10\r\n#define CDRTOOLS_PERCENTDONE\t\t\t\t\"percent_done:\"\r\n#define CDRTOOLS_PERCENTDONE_LENGTH\t\t\t13\r\n#define CDRTOOLS_DEPPDIR\t\t\t\t\t\"Directories too deep\"\r\n#define CDRTOOLS_DEEPDIR_LENGTH\t\t\t\t20\r\n#define CDRTOOLS_FOUNDDVDMEDIA\t\t\t\t\"Found DVD\"\r\n#define CDRTOOLS_FOUNDDVDMEDIA_LENGTH\t\t9\r\n#define CDRTOOLS_OPENSESSION\t\t\t\t\"Cannot open new sess\"\r\n#define CDRTOOLS_OPENSESSION_LENGTH\t\t\t20\r\n#define CDRTOOLS_DISCSPACEWARNING\t\t\t\"Data may not fit on cur\"\r\n#define CDRTOOLS_DISCSPACEWARNING_LENGTH\t23\r\n#define CDRTOOLS_TURNINGBFON\t\t\t\t\"Turning BURN\"\r\n#define CDRTOOLS_TURNINGBFON_LENGTH\t\t\t12\r\n#define CDRTOOLS_TOTALEXTENT\t\t\t\t\"Total extent\"\r\n#define CDRTOOLS_TOTALEXTENT_LENGTH\t\t\t12\r\n#define CDRTOOLS_SIZEOFBOOT\t\t\t\t\t\"Size of boot\"\r\n#define CDRTOOLS_SIZEOFBOOT_LENGTH\t\t\t12\r\n#define CDRTOOLS_ERRORLEADIN\t\t\t\t\"Could not write Lead-in.\"\r\n#define CDRTOOLS_ERRORLEADIN_LENGTH\t\t\t24\r\n#define CDRTOOLS_ERRORINITDRIVE\t\t\t\t\"Cannot init drive\"\r\n#define CDRTOOLS_ERRORINITDRIVE_LENGTH\t\t17\r\n#define CDRTOOLS_DVDRWDUMMY\t\t\t\t\t\"DVD+RW has no -du\"\r\n#define CDRTOOLS_DVDRWDUMMY_LENGTH\t\t\t17\r\n#define CDRTOOLS_FIFO\t\t\t\t\t\t\"fifo\"\r\n#define CDRTOOLS_FIFO_LENGTH\t\t\t\t4"
  },
  {
    "path": "src/app/core/core.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/convert.hh>\r\n#include <base/string_container.hh>\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"version.hh\"\r\n#include \"temp_manager.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core2.hh\"\r\n#include \"core.hh\"\r\n\r\n// FIXME: How come Windows 95 supports larger command lines than Windows 2000?\r\n//        Windows 2000 seems to be the only OS that is limited to MAX_PATH.\r\n//        http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp\r\n//        http://support.microsoft.com/default.aspx?scid=kb;en-us;830473\r\n//\r\n//        Possible solution?\r\n//        http://blogs.msdn.com/oldnewthing/archive/2003/12/10/56028.aspx\r\n//        http://blogs.msdn.com/oldnewthing/archive/2003/12/11/56043.aspx\r\n\r\nCCore g_Core;\r\n\r\nCCore::CCore()\r\n{\r\n    m_iMode = -1;\r\n    m_iStatusMode = SMODE_DEFAULT;\r\n\r\n    m_bGraceTimeDone = false;\r\n    m_bDummyMode = false;\r\n    m_bErrorPathMode = true;\r\n\r\n    m_uiCDRToolsPathLen = 0;\r\n\r\n    m_pProgress = NULL;\r\n}\r\n\r\nCCore::~CCore()\r\n{\r\n    m_TrackSize.clear();\r\n}\r\n\r\n/*\r\n    CCore::Initialize\r\n    -----------------\r\n    Prepares the object. This function should be called in the beginning of all\r\n    cdrtools related functions.\r\n*/\r\nvoid CCore::Initialize(int iMode,CAdvancedProgress *pProgress)\r\n{\r\n    m_iMode = iMode;\r\n    m_iStatusMode = SMODE_DEFAULT;\r\n    m_bGraceTimeDone = false;\r\n    m_bErrorPathMode = true;\t\t\t// By default we're looking for a cygwin path before error messages.\r\n\r\n    m_uiCDRToolsPathLen = lstrlen(g_GlobalSettings.m_szCDRToolsPathCyg);\r\n\r\n    m_pProgress = pProgress;\r\n\r\n    // Remove all previous track information.\r\n    m_TrackSize.clear();\r\n    m_uiCurrentTrack = 0;\r\n\r\n    m_lNumCopies = 1;\r\n}\r\n\r\nvoid CCore::Reinitialize()\r\n{\r\n    m_bGraceTimeDone = false;\r\n    m_bErrorPathMode = true;\t\t\t// By default we're looking for a cygwin path before error messages.\r\n\r\n    m_uiCDRToolsPathLen = lstrlen(g_GlobalSettings.m_szCDRToolsPathCyg);\r\n\r\n    m_uiCurrentTrack = 0;\r\n}\r\n\r\nvoid CCore::CreateBatchFile(const char *szChangeDir,const char *szCommandLine,TCHAR *szBatchPath)\r\n{\r\n    // FIXME: This is not very nice.\r\n    ckcore::File BatchFile = ckcore::File::temp(g_GlobalSettings.m_szTempPath,\r\n                                                ckT(\"InfraRecorder\"));\r\n    lstrcpy(szBatchPath,BatchFile.name().c_str());\r\n\r\n    // Delete the generated temporary file since we need a batch file.\r\n    ckcore::File::remove(szBatchPath);\r\n\r\n    ChangeFileExt(szBatchPath,_T(\".bat\"));\r\n\r\n    CStringContainerA StringContainer;\r\n\r\n    if (szChangeDir != NULL)\r\n        StringContainer.m_szStrings.push_back(szChangeDir);\r\n\r\n    StringContainer.m_szStrings.push_back(szCommandLine);\r\n    StringContainer.SaveToFile(szBatchPath);\r\n}\r\n\r\nbool CCore::SafeLaunch(tstring &CommandLine,bool bWaitForProcess)\r\n{\r\n    if (g_GlobalSettings.m_bLog)\r\n        g_pLogDlg->print_line(_T(\"  Command line to run: %s\"),CommandLine.c_str());\r\n\r\n    if (m_lNumCopies > 0)\r\n        m_lNumCopies--;\r\n\r\n    m_LastCmdLine = CommandLine;\r\n    m_bLastWaitForProcess = bWaitForProcess;\r\n\r\n    // If the command line is longer than 260 characters we need to take special\r\n    // actions since all (only Windows 2000?) Windows versions older than XP are\r\n    // limited to MAX_PATH. Windows XP supports 32K character command lines.\r\n    if (CommandLine.length() > MAX_PATH - 1)\r\n    {\r\n        if (g_WinVer.m_ulMajorVersion < MAJOR_WINXP ||\r\n            (g_WinVer.m_ulMajorVersion == MAJOR_WINXP && g_WinVer.m_ulMinorVersion < MINOR_WINXP))\r\n        {\r\n            // Windows NT4 and 2000 supports 2048 character command lines, I am not\r\n            // sure if Windows 9x do. This needs to be checked.\r\n            if (CommandLine.length() > 2047)\r\n            {\r\n                TCHAR szMessage[256];\r\n                lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),2048);\r\n                MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n                return false;\r\n            }\r\n\r\n            if (g_GlobalSettings.m_bLog)\r\n                g_pLogDlg->print_line(_T(\"  Warning: The command line is %d characters long. Trying to execute through shell.\"),CommandLine.length());\r\n\r\n            TCHAR szBatchPath[MAX_PATH];\r\n\r\n            char *szCommandLine = new char[CommandLine.length() + 1];\r\n            UnicodeToAnsi(szCommandLine,CommandLine.c_str(),(int)CommandLine.length() + 1);\r\n\r\n            // Create the batch file.\r\n            CreateBatchFile(NULL,szCommandLine,szBatchPath);\r\n\r\n            delete [] szCommandLine;\r\n            \r\n            TCHAR szBatchCmdLine[MAX_PATH + 2];\r\n            lstrcpy(szBatchCmdLine,_T(\"\\\"\"));\r\n            lstrcat(szBatchCmdLine,szBatchPath);\r\n            lstrcat(szBatchCmdLine,_T(\"\\\"\"));\r\n\r\n            if (bWaitForProcess)\r\n            {\r\n                bool bResult = create(szBatchCmdLine);\r\n                ckcore::File::remove(szBatchPath);\r\n\r\n                if (bWaitForProcess)\r\n                    wait();\r\n\r\n                return bResult;\r\n            }\r\n            else\r\n            {\r\n                g_TempManager.AddObject(szBatchPath);\r\n                bool bResult = create(szBatchCmdLine);\r\n\r\n                if (bWaitForProcess)\r\n                    wait();\r\n\r\n                return bResult;\r\n            }\r\n        }\r\n        // Windows XP supports maximum 32768 characters.\r\n        else if (CommandLine.length() > 32767)\r\n        {\r\n            TCHAR szMessage[256];\r\n            lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),2048);\r\n            MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n    }\r\n\r\n    bool bResult = create((TCHAR *)CommandLine.c_str());\r\n\r\n    if (bWaitForProcess)\r\n        wait();\r\n\r\n    return bResult;\r\n}\r\n\r\nbool CCore::Relaunch()\r\n{\r\n    if (m_lNumCopies <= 0 || m_LastCmdLine.size() == 0)\r\n        return false;\r\n\r\n    if (!m_pProgress->RequestNextDisc())\r\n        return false;\r\n\r\n    // Launch the process from a separate thread since the current thread belongs\r\n    // to the previous process.\r\n    unsigned long ulThreadID = 0;\r\n    HANDLE hThread = ::CreateThread(NULL,0,NextCopyThread,this,0,&ulThreadID);\r\n\r\n    if (hThread != NULL)\r\n    {\r\n        ::CloseHandle(hThread);\r\n        return true;\r\n    }\r\n    \r\n    return false;\r\n}\r\n\r\nbool CCore::CheckGraceTime(const char *szBuffer)\r\n{\r\n    // If the message: Starting to write CD/DVD... is received we know that the \r\n    // grace count down time is about to start so we change the new line\r\n    // delimiter to '.' since the gracetime is updated using the '\\b' character.\r\n    if (!strncmp(szBuffer,CDRTOOLS_STARTCDWRITE,CDRTOOLS_STARTCDWRITE_LENGTH))\r\n    {\r\n        // Sometimes the \"Starting to write CD/DVD...\" string will reappear after the\r\n        // grace time countdown. Because of that we only allow this delimiter change once.\r\n        if (!m_bGraceTimeDone)\r\n            add_block_delim('.');\r\n\r\n        return true;\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_GRACEBEGIN,CDRTOOLS_GRACEBEGIN_LENGTH))\r\n    {\r\n        m_iStatusMode = SMODE_GRACETIME;\r\n\r\n        char szMode[6];\t// Can be \"dummy\" or \"real\".\r\n        int iTimer = 0;\r\n\r\n        sscanf(szBuffer,\"Last chance to quit, starting %s write in %d seconds.\",szMode,&iTimer);\r\n\r\n        m_bDummyMode = szMode[0] == 'd';\r\n\r\n        // Update the status.\r\n        m_pProgress->set_status(lngGetString(PROGRESS_GRACETIME),iTimer);\r\n\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CCore::CheckProgress(const char *szBuffer)\r\n{\r\n    if (!strncmp(szBuffer,CDRTOOLS_STARTTRACK,CDRTOOLS_STARTTRACK_LENGTH))\r\n    {\r\n        add_block_delim('.');\r\n\r\n        m_iStatusMode = SMODE_PREPROGRESS;\r\n\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nvoid CCore::ErrorOutputCDRECORD(const char *szBuffer)\r\n{\r\n    if (m_pProgress != NULL)\r\n    {\r\n        if (!strncmp(szBuffer,CDRTOOLS_NOMEDIA,CDRTOOLS_NOMEDIA_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_NOMEDIA));\r\n        else if (!strncmp(szBuffer,CDRTOOLS_BLANKERROR,CDRTOOLS_BLANKERROR_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_ERASE));\r\n        else if (!strncmp(szBuffer,CDRTOOLS_BLANKUNSUP,CDRTOOLS_BLANKUNSUP_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(INFO_UNSUPERASEMODE));\r\n        else if (!strncmp(szBuffer,CDRTOOLS_BLANKRETRY,CDRTOOLS_BLANKRETRY_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(INFO_ERASERETRY));\r\n        else if (!strncmp(szBuffer,CDRTOOLS_NODISC,CDRTOOLS_NODISC_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_NOMEDIA));\r\n        else if (!strncmp(szBuffer,CDRTOOLS_BADAUDIOCODING,CDRTOOLS_BADAUDIOCODING_LENGTH))\r\n        {\r\n            TCHAR szMessage[MAX_PATH + 128];\r\n            lstrcpy(szMessage,lngGetString(FAILURE_AUDIOCODING));\r\n\r\n            TCHAR szFileName[MAX_PATH + 3];\r\n            AnsiToUnicode(szFileName,szBuffer + CDRTOOLS_BADAUDIOCODING_LENGTH + 10,sizeof(szFileName) / sizeof(wchar_t));\r\n            lstrcat(szMessage,szFileName);\r\n\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,szMessage);\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_UNSUPPORTED,CDRTOOLS_UNSUPPORTED_LENGTH))\r\n        {\r\n            char *pBuffer = (char *)szBuffer + 12;\r\n\r\n            if (!strncmp(pBuffer,CDRTOOLS_SECTOR,CDRTOOLS_SECTOR_LENGTH))\r\n            {\r\n                int iSectorSize = 0;\r\n                sscanf(pBuffer,\"sector size %ld for %*[^\\0]\",&iSectorSize);\r\n\r\n                m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_BADSECTORSIZE),iSectorSize);\r\n            }\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_WRITEERROR,CDRTOOLS_WRITEERROR_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_WRITE));\r\n        }\r\n#ifndef CORE_DVD_SUPPORT\r\n        else if (!strncmp(szBuffer,CDRTOOLS_FOUNDDVDMEDIA,CDRTOOLS_FOUNDDVDMEDIA_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(FAILURE_DVDSUPPORT));\r\n        }\r\n#endif\r\n        else if (!strncmp(szBuffer,CDRTOOLS_OPENSESSION,CDRTOOLS_OPENSESSION_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_OPENSESSION));\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_WARNINGCAP,CDRTOOLS_WARNINGCAP_LENGTH))\t// \"WARNING:\" Prefix.\r\n        {\r\n            char *pBuffer = (char *)szBuffer + CDRTOOLS_WARNINGCAP_LENGTH + 1;\r\n\r\n            if (!strncmp(pBuffer,CDRTOOLS_DISCSPACEWARNING,CDRTOOLS_DISCSPACEWARNING_LENGTH))\r\n                m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(WARNING_DISCSIZE));\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_ERRORLEADIN,CDRTOOLS_ERRORLEADIN_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_WRITELEADIN));\r\n\r\n            // When called from BurnTracks/BurnCompilation we need to flag the operation as failed.\r\n            m_bOperationRes = false;\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_ERRORINITDRIVE,CDRTOOLS_ERRORINITDRIVE_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_INITDRIVE));\r\n\r\n            // When called from BurnTracks/BurnCompilation we need to flag the operation as failed.\r\n            m_bOperationRes = false;\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_DVDRWDUMMY,CDRTOOLS_DVDRWDUMMY_LENGTH))\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_DVDRWDUMMY));\r\n\r\n            // When called from BurnTracks/BurnCompilation we need to flag the operation as failed.\r\n            m_bOperationRes = false;\r\n        }\r\n#ifdef CORE_IGNORE_ERRORINFOMESSAGES\t\t// Ingore error information messages.\r\n        else if (!strncmp(szBuffer,CDRTOOLS_VERSIONINFO,CDRTOOLS_VERSIONINFO_LENGTH))\r\n            return;\r\n        else if (!strncmp(szBuffer,CDRTOOLS_DVDINFO,CDRTOOLS_DVDINFO_LENGTH))\r\n            return;\r\n        else if (!strncmp(szBuffer,CDRTOOLS_DVDGETINFO,CDRTOOLS_DVDGETINFO_LENGTH))\r\n            return;\r\n#endif\r\n#ifdef CORE_PRINT_UNSUPERRORMESSAGES\t\t// Print unhandled messages from cdrecord to the log window.\r\n    #ifdef CORE_DVD_SUPPORT\r\n        else if (!strncmp(szBuffer,CDRTOOLS_FOUNDDVDMEDIA,CDRTOOLS_FOUNDDVDMEDIA_LENGTH))\r\n            return;\r\n    #endif\r\n        else if (!strncmp(szBuffer,CDRTOOLS_TURNINGBFON,CDRTOOLS_TURNINGBFON_LENGTH))\r\n            return;\r\n        else if (!strncmp(szBuffer,CDRTOOLS_FIFO,CDRTOOLS_FIFO_LENGTH))\r\n            return;\r\n        else\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckEXTERNAL,\r\n                                ckcore::string::ansi_to_auto<1024>(szBuffer).c_str());\r\n        }\r\n#endif\r\n    }\r\n}\r\n\r\nvoid CCore::ErrorOutputREADCD(const char *szBuffer)\r\n{\r\n    if (m_pProgress != NULL)\r\n    {\r\n        if (!strncmp(szBuffer,CDRTOOLS_IOERROR,CDRTOOLS_IOERROR_LENGTH))\r\n        {\r\n            char *pBuffer = (char *)szBuffer + CDRTOOLS_IOERROR_LENGTH;\r\n\r\n            if (!strncmp(pBuffer,CDRTOOLS_SECTORERROR,CDRTOOLS_SECTORERROR_LENGTH))\r\n            {\r\n                unsigned long ulSector = atoi(pBuffer + CDRTOOLS_SECTORERROR_LENGTH + 1);\r\n    \r\n                m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(ERROR_SECTOR),ulSector);\r\n            }\r\n        }\r\n        else if (!strncmp(szBuffer,CDRTOOLS_RETRYSECTOR,CDRTOOLS_RETRYSECTOR_LENGTH))\r\n        {\r\n            unsigned long ulSector = atoi(szBuffer + CDRTOOLS_RETRYSECTOR_LENGTH + 1);\r\n\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_READSOURCEDISC),ulSector);\r\n        }\r\n#ifdef CORE_PRINT_UNSUPERRORMESSAGES\r\n        else\r\n        {\r\n            m_pProgress->notify(ckcore::Progress::ckEXTERNAL,\r\n                                ckcore::string::ansi_to_auto<1024>(szBuffer).c_str());\r\n        }\r\n#endif\r\n    }\r\n}\r\n\r\nvoid CCore::ErrorOutputCDDA2WAV(const char *szBuffer)\r\n{\r\n}\r\n\r\nvoid CCore::EraseOutput(const char *szBuffer)\r\n{\r\n    // Check if the media or command is not supported by the drive.\r\n    if (!strncmp(szBuffer,CDRTOOLS_NOSUPPORT,CDRTOOLS_NOSUPPORT_LENGTH))\r\n    {\r\n        char *pBuffer = (char *)szBuffer + 42;\r\n\r\n        if (!strncmp(pBuffer,CDRTOOLS_BLANK,CDRTOOLS_BLANK_LENGTH))\r\n            m_pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_UNSUPRW));\r\n    }\r\n    else if (CheckGraceTime(szBuffer))\r\n    {\r\n        return;\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_BLANKTIME,CDRTOOLS_BLANKTIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_ERASE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_RELOADDRIVE,CDRTOOLS_RELOADDRIVE_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(FAILURE_LOADDRIVE));\r\n        m_pProgress->set_status(lngGetString(ERROR_RELOADDRIVE));\r\n\r\n        // Enable the reload button.\r\n        m_pProgress->AllowReload();\r\n    }\r\n}\r\n\r\nvoid CCore::FixateOutput(const char *szBuffer)\r\n{\r\n    if (CheckGraceTime(szBuffer))\r\n    {\r\n        return;\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_FIXATETIME,CDRTOOLS_FIXATETIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_FIXATE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_RELOADDRIVE,CDRTOOLS_RELOADDRIVE_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(FAILURE_LOADDRIVE));\r\n        m_pProgress->set_status(lngGetString(ERROR_RELOADDRIVE));\r\n\r\n        // Enable the reload button.\r\n        m_pProgress->AllowReload();\r\n    }\r\n}\r\n\r\nvoid CCore::BurnImageOutput(const char *szBuffer)\r\n{\r\n    if (CheckGraceTime(szBuffer))\r\n        return;\r\n\r\n    if (CheckProgress(szBuffer))\r\n        return;\r\n\r\n    if (!strncmp(szBuffer,CDRTOOLS_WRITEPREGAP,CDRTOOLS_WRITEPREGAP_LENGTH))\r\n    {\r\n        int iTrack = 0;\r\n        long lPos = 0;\r\n        sscanf(szBuffer,\"Writing pregap for track %d at %ld\",&iTrack,&lPos);\r\n\r\n        TCHAR szStatus[64];\r\n        lsnprintf_s(szStatus,64,lngGetString(STATUS_WRITEPREGAP),iTrack,lPos);\r\n        m_pProgress->set_status(szStatus);\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_FILLFIFO,CDRTOOLS_FILLFIFO_LENGTH))\r\n    {\r\n        m_pProgress->set_status(lngGetString(STATUS_FILLBUFFER));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_WRITETIME,CDRTOOLS_WRITETIME_LENGTH))\r\n    {\r\n        // Only display the error message if no error occured.\r\n        if (m_bOperationRes)\r\n            m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_WRITE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_FIXATE,CDRTOOLS_FIXATE_LENGTH))\r\n    {\r\n        m_pProgress->set_status(lngGetString(STATUS_FIXATE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_FIXATETIME,CDRTOOLS_FIXATETIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_FIXATE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_WARNINGCAP,CDRTOOLS_WARNINGCAP_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(WARNING_FIXATE));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_RELOADDRIVE,CDRTOOLS_RELOADDRIVE_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(FAILURE_LOADDRIVE));\r\n        m_pProgress->set_status(lngGetString(ERROR_RELOADDRIVE));\r\n\r\n        // Enable the reload button.\r\n        m_pProgress->AllowReload();\r\n    }\r\n}\r\n\r\nvoid CCore::ReadDataTrackOutput(const char *szBuffer)\r\n{\r\n    if (!strncmp(szBuffer,CDRTOOLS_END,CDRTOOLS_END_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINREADTRACK),m_TrackSize[1]);\r\n        m_pProgress->set_status(lngGetString(STATUS_READTRACK));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_ADDRESS,CDRTOOLS_ADDRESS_LENGTH))\r\n    {\r\n        unsigned __int64 uiAddress = 0;\r\n        unsigned __int64 uiCount = 0;\r\n\r\n        if (sscanf(szBuffer,\"addr: %8ld cnt: %ld\",&uiAddress,&uiCount) == 2)\r\n            m_pProgress->set_progress((unsigned char)(((double)(uiAddress - m_TrackSize[0])/m_uiTotalSize) * 100));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_TOTALTIME,CDRTOOLS_TOTALTIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_READTRACK),m_TrackSize[1]);\r\n        m_bOperationRes = true;\t\t\t// Success.\r\n    }\r\n}\r\n\r\nvoid CCore::ReadAudioTrackOutput(const char *szBuffer)\r\n{\r\n    if (!strncmp(szBuffer,CDRTOOLS_PERCENTDONE,CDRTOOLS_PERCENTDONE_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINREADTRACK),m_uiTotalSize);\r\n        m_pProgress->set_status(lngGetString(STATUS_READTRACK));\r\n\r\n        m_iStatusMode = SMODE_AUDIOPROGRESS;\r\n    }\r\n}\r\n\r\nvoid CCore::ScanTrackOutput(const char *szBuffer)\r\n{\r\n    if (!strncmp(szBuffer,CDRTOOLS_END,CDRTOOLS_END_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINSCANTRACK),m_TrackSize[1]);\r\n        m_pProgress->set_status(lngGetString(STATUS_SCANTRACK));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_ADDRESS,CDRTOOLS_ADDRESS_LENGTH))\r\n    {\r\n        unsigned __int64 uiAddress = 0;\r\n        unsigned __int64 uiCount = 0;\r\n\r\n        if (sscanf(szBuffer,\"addr: %8ld cnt: %ld\",&uiAddress,&uiCount) == 2)\r\n            m_pProgress->set_progress((unsigned char)(((double)(uiAddress - m_TrackSize[0])/m_uiTotalSize) * 100));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_TOTALTIME,CDRTOOLS_TOTALTIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_SCANTRACK),m_TrackSize[1]);\r\n        m_bOperationRes = true;\t\t\t// Success.\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_C2ERRORS,CDRTOOLS_C2ERRORS_LENGTH))\r\n    {\r\n        char *pBuffer = (char *)szBuffer + CDRTOOLS_C2ERRORS_LENGTH;\r\n\r\n        if (!strncmp(pBuffer,\"total\",5))\r\n        {\r\n            unsigned long ulBytes = 0;\r\n            unsigned long ulSectors = 0;\r\n\r\n            if (sscanf(pBuffer + 7,\"%ld bytes in %d sectors on disk\",&ulBytes,&ulSectors) == 2)\r\n            {\r\n                m_pProgress->notify(ulSectors > 0 ? ckcore::Progress::ckWARNING : ckcore::Progress::ckINFORMATION,\r\n                    lngGetString(STATUS_C2TOTAL),ulBytes,ulBytes);\r\n            }\r\n        }\r\n        else if (!strncmp(pBuffer,\"rate\",4))\r\n        {\r\n            float fRate = (float)atof(pBuffer + 6);\r\n\r\n            m_pProgress->notify(fRate > 0 ? ckcore::Progress::ckWARNING : ckcore::Progress::ckINFORMATION,\r\n                lngGetString(STATUS_C2RATE),fRate);\r\n        }\r\n    }\r\n}\r\n\r\nvoid CCore::ReadDiscOutput(const char *szBuffer)\r\n{\r\n    if (!strncmp(szBuffer,CDRTOOLS_END,CDRTOOLS_END_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINREADDISC));\r\n        m_pProgress->set_status(lngGetString(STATUS_READDISC));\r\n\r\n        // Update the total number of sectors to process.\r\n        m_uiTotalSize = atoi(szBuffer + CDRTOOLS_END_LENGTH);\r\n\r\n        // Prevent a crash if the above function fails.\r\n        if (m_uiTotalSize == 0)\r\n            m_uiTotalSize = 1;\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_ADDRESS,CDRTOOLS_ADDRESS_LENGTH))\r\n    {\r\n        unsigned __int64 uiAddress = 0;\r\n        unsigned __int64 uiCount = 0;\r\n\r\n        if (sscanf(szBuffer,\"addr: %8ld cnt: %ld\",&uiAddress,&uiCount) == 2)\r\n            m_pProgress->set_progress((unsigned char)(((double)uiAddress/m_uiTotalSize) * 100));\r\n    }\r\n    else if (!strncmp(szBuffer,CDRTOOLS_TOTALTIME,CDRTOOLS_TOTALTIME_LENGTH))\r\n    {\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_READDISC));\r\n\r\n        m_bOperationRes = true;\t\t\t// Success.\r\n    }\r\n}\r\n\r\nvoid CCore::event_output(const std::string &block)\r\n{\r\n    // Write to the log.\r\n    if (g_GlobalSettings.m_bLog && m_iStatusMode == SMODE_DEFAULT)\r\n    {\r\n        g_pLogDlg->print(_T(\"   > \"));\r\n        g_pLogDlg->print_line(ckcore::string::ansi_to_auto<1024>(block.c_str()).c_str());\r\n    }\r\n\r\n    // Always skip the copyright line.\r\n    if (!strncmp(block.c_str(),CDRTOOLS_COPYRIGHT,CDRTOOLS_COPYRIGHT_LENGTH))\r\n        return;\r\n\r\n    // Check for a cygwin path.\r\n    if (m_bErrorPathMode)\r\n    {\r\n        if (!strncmp(block.c_str(),CDRTOOLS_CYGWINPATH,CDRTOOLS_CYGWINPATH_LENGTH))\r\n        {\r\n            // An error message has been found.\r\n            if (!strncmp(block.c_str() + m_uiCDRToolsPathLen,CDRTOOLS_ERROR,CDRTOOLS_ERROR_LENGTH))\r\n            {\r\n                ErrorOutputCDRECORD(block.c_str() + m_uiCDRToolsPathLen + CDRTOOLS_ERROR_LENGTH);\r\n                return;\r\n            }\r\n            else if (!strncmp(block.c_str() + m_uiCDRToolsPathLen,CDRTOOLS_ERROR3,CDRTOOLS_ERROR3_LENGTH))\r\n            {\r\n                ErrorOutputREADCD(block.c_str() + m_uiCDRToolsPathLen + CDRTOOLS_ERROR3_LENGTH);\r\n                return;\r\n            }\r\n            else if (!strncmp(block.c_str() + m_uiCDRToolsPathLen,CDRTOOLS_ERROR4,CDRTOOLS_ERROR4_LENGTH))\r\n            {\r\n                ErrorOutputCDDA2WAV(block.c_str() + m_uiCDRToolsPathLen + CDRTOOLS_ERROR4_LENGTH);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        // An error message has been found.\r\n        if (!strncmp(block.c_str(),CDRTOOLS_ERROR,CDRTOOLS_ERROR_LENGTH))\r\n        {\r\n            ErrorOutputCDRECORD(block.c_str() + CDRTOOLS_ERROR_LENGTH);\r\n            return;\r\n        }\r\n        else if (!strncmp(block.c_str(),CDRTOOLS_ERROR3,CDRTOOLS_ERROR3_LENGTH))\r\n        {\r\n            ErrorOutputREADCD(block.c_str() + CDRTOOLS_ERROR3_LENGTH);\r\n            return;\r\n        }\r\n        else if (!strncmp(block.c_str(),CDRTOOLS_ERROR4,CDRTOOLS_ERROR4_LENGTH))\r\n        {\r\n            ErrorOutputCDDA2WAV(block.c_str() + CDRTOOLS_ERROR4_LENGTH);\r\n            return;\r\n        }\r\n    }\r\n\r\n    // If we are in grace time mode we only look for timer updates.\r\n    if (m_iStatusMode == SMODE_GRACETIME)\r\n    {\r\n        int iTimer = 0;\r\n        sscanf(block.c_str(),\"\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b\\b%4d seconds\",&iTimer);\r\n\r\n        // Update the status.\r\n        m_pProgress->set_status(lngGetString(PROGRESS_GRACETIME),iTimer);\r\n\r\n        // Leave grace time mode if the timer is 0.\r\n        if (iTimer == 0)\r\n        {\r\n            m_iStatusMode = SMODE_DEFAULT;\r\n            m_bGraceTimeDone = true;\r\n\r\n            // We reset the line delimiter to the new line character.\r\n            remove_block_delim('.');\r\n\r\n            // Add a new message to the progress window (and update its staus).\r\n            switch (m_iMode)\r\n            {\r\n                case MODE_ERASE:\r\n                    m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINERASE),\r\n                        m_bDummyMode ? lngGetString(WRITEMODE_SIMULATION) : lngGetString(WRITEMODE_REAL));\r\n                    m_pProgress->set_status(lngGetString(STATUS_ERASE));\r\n                    break;\r\n\r\n                case MODE_FIXATE:\r\n                    m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINFIXATE),\r\n                        m_bDummyMode ? lngGetString(WRITEMODE_SIMULATION) : lngGetString(WRITEMODE_REAL));\r\n                    m_pProgress->set_status(lngGetString(STATUS_FIXATE));\r\n                    break;\r\n\r\n                case MODE_BURNIMAGE:\r\n                case MODE_BURNIMAGEEX:\r\n                    m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINWRITE),\r\n                        m_bDummyMode ? lngGetString(WRITEMODE_SIMULATION) : lngGetString(WRITEMODE_REAL));\r\n                    m_pProgress->set_status(lngGetString(STATUS_WRITEDATA));\r\n                    break;\r\n            };\r\n\r\n            // Start the smoke.\r\n            //if (!m_bDummyMode)\r\n                m_pProgress->StartSmoke();\r\n\r\n            m_pProgress->SetRealMode(true);\r\n        }\r\n\r\n        return;\r\n    }\r\n    else if (m_iStatusMode == SMODE_PREPROGRESS)\r\n    {\r\n        // Now we want to terminate the strings by the x (speed).\r\n        add_block_delim('x');\r\n\r\n        // Change the mode to progress mode.\r\n        m_iStatusMode = SMODE_PROGRESS;\r\n\r\n        // notify the status window that we're starting to write a new track.\r\n        m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINTRACK),\r\n            m_uiCurrentTrack + 1);\r\n\r\n        return;\r\n    }\r\n    else if (m_iStatusMode == SMODE_PROGRESS)\r\n    {\r\n        // \"Track 01:    1 of  473 MB written (fifo 100%) [buf 100%]   0.3x\"\r\n        //int iTrack = 0;\r\n        int iBuffer = 0;\r\n        __int64 iWritten = 0;\r\n        float fSpeed = 0.0f;\r\n\r\n        char *pBuffer = (char *)block.c_str();\r\n        if (pBuffer[0] == '.')\r\n            *pBuffer++;\r\n\r\n        // Special parsing, cdrtools has a bad habit of only writing output that is\r\n        // not zero. This only affects the FIFO and buffer size. We know that the\r\n        // track number, written size (in MB) and the write speed is always included\r\n        // (cdrecord.c).\r\n        pBuffer += 6;\r\n        //iTrack = atoi(pBuffer);\r\n\r\n        // Skip the integer.\r\n        pBuffer = SkipInteger(pBuffer);\r\n\r\n        // Skip the ':' character.\r\n        *pBuffer++;\r\n\r\n        iWritten = _atoi64(pBuffer);\r\n\r\n        // Skip the integer.\r\n        pBuffer = SkipInteger(pBuffer);\r\n\r\n        // Skip trailing whitespace.\r\n        *pBuffer++;\r\n\r\n        // Look for total size (currently ignored).\r\n        if (!strncmp(pBuffer,\"of \",3))\r\n        {\r\n            pBuffer += 3;\r\n            pBuffer = SkipInteger(pBuffer);\r\n\r\n            // Skip trailing whitespace.\r\n            *pBuffer++;\r\n        }\r\n\r\n        pBuffer += 11;\r\n\r\n        // Look for FIFO (currently ignored).\r\n        if (*pBuffer == '(')\r\n        {\r\n            pBuffer += 6;\r\n            pBuffer = SkipInteger(pBuffer);\r\n\r\n            // Skip the '%', ')' and whitespace character.\r\n            pBuffer += 3;\r\n        }\r\n\r\n        // Look for buffer.\r\n        if (*pBuffer == '[')\r\n        {\r\n            pBuffer += 5;\r\n            iBuffer = atoi(pBuffer);\r\n            pBuffer = SkipInteger(pBuffer);\r\n\r\n            // Skip the '%', ']' and whitespace character.\r\n            pBuffer += 3;\r\n        }\r\n\r\n        // Update: 2007-02-10. Skip BCAP information.\r\n        if (*pBuffer == '|')\r\n            pBuffer += 12;\r\n\r\n        // Write speed.\r\n        fSpeed = (float)atof(pBuffer);\r\n\r\n        // Update the status.\r\n        m_pProgress->set_status(lngGetString(STATUS_WRITE),m_uiCurrentTrack + 1,(int)m_TrackSize.size(),fSpeed);\r\n\r\n        m_pProgress->set_progress((unsigned char)(((double)(iWritten + m_uiProcessedSize)/m_uiTotalSize) * 100));\r\n        m_pProgress->SetBuffer(iBuffer);\r\n\r\n        // Check if we're done writing the track.\r\n        if (iWritten != 0 && iWritten == static_cast<__int64>(m_TrackSize[m_uiCurrentTrack]))\r\n        {\r\n            m_uiCurrentTrack++;\r\n\r\n            remove_block_delim('x');\r\n\r\n            // Leave the progress mode.\r\n            m_iStatusMode = SMODE_DEFAULT;\r\n\r\n            // Update the totoal processed size.\r\n            m_uiProcessedSize += iWritten;\r\n        }\r\n\r\n        return;\r\n    }\r\n    else if (m_iStatusMode == SMODE_AUDIOPROGRESS)\r\n    {\r\n        int iProgress = atoi(block.c_str());\r\n        m_pProgress->set_progress((unsigned char)iProgress);\r\n\r\n        if (iProgress == 100)\r\n        {\r\n            m_iStatusMode = SMODE_DEFAULT;\r\n\r\n            m_pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_READTRACK),m_uiTotalSize);\r\n            m_bOperationRes = true;\t\t// Success.\r\n        }\r\n    }\r\n\r\n    switch (m_iMode)\r\n    {\r\n        case MODE_EJECT:\r\n            break;\r\n\r\n        case MODE_ERASE:\r\n            EraseOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_FIXATE:\r\n            FixateOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_BURNIMAGE:\r\n        case MODE_BURNIMAGEEX:\r\n            BurnImageOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_READDATATRACK:\r\n        case MODE_READDATATRACKEX:\r\n            ReadDataTrackOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_READAUDIOTRACK:\r\n        case MODE_READAUDIOTRACKEX:\r\n            ReadAudioTrackOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_SCANTRACK:\r\n        case MODE_SCANTRACKEX:\r\n            ScanTrackOutput(block.c_str());\r\n            break;\r\n\r\n        case MODE_READDISC:\r\n        case MODE_READDISCEX:\r\n            ReadDiscOutput(block.c_str());\r\n            break;\r\n    };\r\n}\r\n\r\nvoid CCore::event_finished()\r\n{\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::ProcessEnded\"));\r\n        g_pLogDlg->print_line(_T(\"  Process exited with code: %d.\"),uiExitCode);\r\n    }\r\n\r\n    switch (m_iMode)\r\n    {\r\n        case MODE_EJECT:\r\n            break;\r\n\r\n        case MODE_ERASE:\r\n        case MODE_FIXATE:\r\n        //case MODE_BURNIMAGE:\r\n        case MODE_READDATATRACK:\r\n        case MODE_READAUDIOTRACK:\r\n        case MODE_SCANTRACK:\r\n        case MODE_READDISC:\r\n            m_pProgress->set_progress(100);\r\n            m_pProgress->set_status(lngGetString(uiExitCode == 0 ? PROGRESS_DONE : PROGRESS_FAILED));\r\n            m_pProgress->NotifyCompleted();\r\n            break;\r\n\r\n        case MODE_BURNIMAGE:\r\n            m_pProgress->set_progress(100);\r\n            m_pProgress->set_status(lngGetString(uiExitCode == 0 ? PROGRESS_DONE : PROGRESS_FAILED));\r\n\r\n            if (m_lNumCopies <= 0 || !Relaunch())\r\n                m_pProgress->NotifyCompleted();\r\n            break;\r\n\r\n        //case MODE_BURNIMAGEEX:\r\n        case MODE_READDATATRACKEX:\r\n        case MODE_READAUDIOTRACKEX:\r\n        case MODE_SCANTRACKEX:\r\n        case MODE_READDISCEX:\r\n            if (m_bOperationRes)\r\n            {\r\n                m_pProgress->set_progress(0);\r\n            }\r\n            else\r\n            {\r\n                m_pProgress->set_progress(100);\r\n                m_pProgress->set_status(lngGetString(uiExitCode == 0 ? PROGRESS_DONE : PROGRESS_FAILED));\r\n                m_pProgress->NotifyCompleted();\r\n            }\r\n            break;\r\n\r\n        case MODE_BURNIMAGEEX:\r\n            if (m_lNumCopies <= 0 || !Relaunch())\r\n            {\r\n                if (m_bOperationRes)\r\n                {\r\n                    m_pProgress->set_progress(0);\r\n                }\r\n                else\r\n                {\r\n                    m_pProgress->set_progress(100);\r\n                    m_pProgress->set_status(lngGetString(uiExitCode == 0 ? PROGRESS_DONE : PROGRESS_FAILED));\r\n                    m_pProgress->NotifyCompleted();\r\n                }\r\n            }\r\n            break;\r\n    };\r\n}\r\n\r\nbool CCore::EjectDisc(ckmmc::Device &Device,bool bWaitForProcess)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::EjectDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_EJECT);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -eject dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::LoadDisc(ckmmc::Device &Device,bool bWaitForProcess)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::LoadDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_EJECT);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -load dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::EraseDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                      int iMode,bool bForce,bool bEject,bool bSimulate)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::EraseDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Mode = %d, Force = %d, Eject = %d, Simulate = %d.\"),\r\n                              iMode,(int)bForce,(int)bEject,(int)bSimulate);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_ERASE,pProgress);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -v -blank=\");\r\n\r\n    switch (iMode)\r\n    {\r\n        case 0:\r\n            CommandLine += _T(\"all dev=\");\r\n            break;\r\n\r\n        case 2:\r\n            CommandLine += _T(\"unclose dev=\");\r\n            break;\r\n\r\n        case 3:\r\n            CommandLine += _T(\"session dev=\");\r\n            break;\r\n\r\n        default:\r\n            CommandLine += _T(\"fast dev=\");\r\n            break;\r\n    }\r\n\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    TCHAR szBuffer[64];\r\n    lsprintf(szBuffer,_T(\" gracetime=%d\"),g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    if (bForce)\r\n        CommandLine += _T(\" -force\");\r\n\r\n    if (Device.support(ckmmc::Device::ckDEVICE_EJECT) && bEject)\r\n        CommandLine += _T(\" -eject\");\r\n\r\n    if (Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE) && bSimulate)\r\n        CommandLine += _T(\" -dummy\");\r\n\r\n    return SafeLaunch(CommandLine,false);\r\n}\r\n\r\nbool CCore::FixateDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                       bool bEject,bool bSimulate)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::FixateDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Eject = %d, Simulate = %d.\"),\r\n                              (int)bEject,(int)bSimulate);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_FIXATE,pProgress);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -v -fix dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    TCHAR szBuffer[64];\r\n    lsprintf(szBuffer,_T(\" gracetime=%d\"),g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    if (Device.support(ckmmc::Device::ckDEVICE_EJECT) && bEject)\r\n        CommandLine += _T(\" -eject\");\r\n\r\n    if (Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE) && bSimulate)\r\n        CommandLine += _T(\" -dummy\");\r\n\r\n    return SafeLaunch(CommandLine,false);\r\n}\r\n\r\nbool CCore::BurnImage(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                      const TCHAR *szFileName,bool bWaitForProcess,bool bCloneMode)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::BurnImage\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  File = %s.\"),szFileName);\r\n        g_pLogDlg->print_line(_T(\"  Eject = %d, Simulate = %d, BUP = %d, Pad tracks = %d, Close = %d, Overburn = %d, Swab = %d, Ignore size = %d, Immed = %d, Audio master = %d, Forcespeed = %d, VariRec (enabled) = %d, VariRec (value) = %d, Clone = %d.\"),\r\n            (int)g_BurnImageSettings.m_bEject,\r\n            (int)g_BurnImageSettings.m_bSimulate,\r\n            (int)g_BurnImageSettings.m_bBUP,\r\n            (int)g_BurnImageSettings.m_bPadTracks,\r\n            (int)g_BurnImageSettings.m_bFixate,\r\n            (int)g_BurnAdvancedSettings.m_bOverburn,\r\n            (int)g_BurnAdvancedSettings.m_bSwab,\r\n            (int)g_BurnAdvancedSettings.m_bIgnoreSize,\r\n            (int)g_BurnAdvancedSettings.m_bImmed,\r\n            (int)g_BurnAdvancedSettings.m_bAudioMaster,\r\n            (int)g_BurnAdvancedSettings.m_bForceSpeed,\r\n            (int)g_BurnAdvancedSettings.m_bVariRec,\r\n            g_BurnAdvancedSettings.m_iVariRec,\r\n            (int)bCloneMode);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_BURNIMAGE,pProgress);\r\n\r\n    // For creating multiple copies.\r\n    m_lNumCopies = g_BurnImageSettings.m_lNumCopies;\r\n\r\n    // We need to specify the total size that we should record.\r\n    m_uiProcessedSize = 0;\r\n    m_uiTotalSize = ckcore::File::size(szFileName) / (1024 * 1024);\t\t// MB.\r\n    m_TrackSize.push_back(m_uiTotalSize);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -v dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    // Clone.\r\n    if (bCloneMode)\r\n        CommandLine += _T(\" -clone\");\r\n\r\n    TCHAR szBuffer[64];\r\n    lsprintf(szBuffer,_T(\" gracetime=%d\"),g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    // FIFO.\r\n    if (g_GlobalSettings.m_iFIFOSize != 4)\r\n    {\r\n        lsprintf(szBuffer,_T(\" fs=%dm\"),g_GlobalSettings.m_iFIFOSize);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Eject.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_EJECT) &&\r\n        g_BurnImageSettings.m_bEject)\r\n    {\r\n        CommandLine += _T(\" -eject\");\r\n    }\r\n\r\n    // Simulation.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE) &&\r\n        g_BurnImageSettings.m_bSimulate)\r\n    {\r\n        CommandLine += _T(\" -dummy\");\r\n    }\r\n\r\n    // Write method.\r\n    switch (g_BurnImageSettings.m_iWriteMethod)\r\n    {\r\n        case WRITEMETHOD_SAO:\r\n            CommandLine += _T(\" -sao\");\r\n            break;\r\n\r\n        case WRITEMETHOD_TAO:\r\n            CommandLine += _T(\" -tao\");\r\n            break;\r\n\r\n        case WRITEMETHOD_TAONOPREGAP:\r\n            CommandLine += _T(\" -tao pregap=0\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96R:\r\n            CommandLine += _T(\" -raw96r\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW16:\r\n            CommandLine += _T(\" -raw16\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96P:\r\n            CommandLine += _T(\" -raw96p\");\r\n            break;\r\n    };\r\n\r\n    TCHAR szDriverOpts[128];\r\n    lstrcpy(szDriverOpts,_T(\" driveropts=\"));\r\n    bool bUseDriverOpts = false;\r\n\r\n    // Buffer underrun protection.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_BUP))\r\n    {\r\n        bUseDriverOpts = true;\r\n\r\n        if (g_BurnImageSettings.m_bBUP)\r\n            lstrcat(szDriverOpts,_T(\"burnfree,\"));\r\n        else\r\n            lstrcat(szDriverOpts,_T(\"noburnfree,\"));\r\n    }\r\n\r\n    // Audio master.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_AUDIO_MASTER))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bAudioMaster)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"audiomaster,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // Forcespeed.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_FORCE_SPEED))\r\n    {\r\n        if (!g_BurnAdvancedSettings.m_bForceSpeed)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"noforcespeed,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // VariRec.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_VARIREC))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bVariRec)\r\n        {\r\n            TCHAR szVariRec[32];\r\n            lsprintf(szVariRec,_T(\"varirec=%d,\"),g_BurnAdvancedSettings.m_iVariRec);\r\n            lstrcat(szDriverOpts,szVariRec);\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    if (bUseDriverOpts)\r\n    {\r\n        szDriverOpts[lstrlen(szDriverOpts) - 1] = '\\0';\r\n        CommandLine += szDriverOpts;\r\n    }\r\n\r\n    // Pad tracks.\r\n    if (g_BurnImageSettings.m_bPadTracks)\r\n        CommandLine += _T(\" -pad\");\r\n\r\n    // Fixate.\r\n    if (!g_BurnImageSettings.m_bFixate)\r\n        CommandLine += _T(\" -nofix\");\r\n\r\n    // Overburning.\r\n    if (g_BurnAdvancedSettings.m_bOverburn)\r\n        CommandLine += _T(\" -overburn\");\r\n\r\n    // Swap audio byte order. FIXME: Should possibly check for support before selecting.\r\n    if (g_BurnAdvancedSettings.m_bSwab)\r\n        CommandLine += _T(\" -swab\");\r\n\r\n    // Ignore size.\r\n    if (g_BurnAdvancedSettings.m_bIgnoreSize)\r\n        CommandLine += _T(\" -ignsize\");\r\n\r\n    // SCSI IMMED flag.\r\n    if (g_BurnAdvancedSettings.m_bImmed)\r\n        CommandLine += _T(\" -immed\");\r\n\r\n    // Speed.\r\n    if (g_BurnImageSettings.m_iWriteSpeed != -1)\r\n    {\r\n        lsprintf(szBuffer,_T(\" speed=%d\"),g_BurnImageSettings.m_iWriteSpeed);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // File name.\r\n    TCHAR szCygwinFileName[MAX_PATH + 16];\r\n    GetCygwinFileName(szFileName,szCygwinFileName);\r\n\r\n    ckcore::Path FilePath(szFileName);\r\n    if (!ckcore::string::astrcmpi(FilePath.ext_name().c_str(),ckT(\"cue\")))\r\n    {\r\n        CommandLine += _T(\" cuefile=\\\"\");\r\n        CommandLine += szCygwinFileName;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n    else\t\t\t\t\t\t\t\t\t\t\t// any other.\r\n    {\r\n        CommandLine += _T(\" \\\"\");\r\n        CommandLine += szCygwinFileName;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::BurnTracks(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                       const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n                       const TCHAR *szAudioText,int iDataMode,int iMode,bool bWaitForProcess)\r\n{\r\n    // This function behaves different from almost all the others using\r\n    // m_bOperationRes. It actually assumes a successfull writing until proved\r\n    // otherwise.\r\n    m_bOperationRes = true;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::BurnTracks\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n\r\n        if (szDataTrack != NULL)\r\n            g_pLogDlg->print_line(_T(\"  File = %s.\"),szDataTrack);\r\n\r\n        g_pLogDlg->print_line(_T(\"  Eject = %d, Simulate = %d, BUP = %d, Pad tracks = %d, Close = %d, Method = %d, Overburn = %d, Swab = %d, Ignore size = %d, Immed = %d, Audio master = %d, Forcespeed = %d, VariRec (enabled) = %d, VariRec (value) = %d, Mode = %d.\"),\r\n            (int)g_BurnImageSettings.m_bEject,\r\n            (int)g_BurnImageSettings.m_bSimulate,\r\n            (int)g_BurnImageSettings.m_bBUP,\r\n            (int)g_BurnImageSettings.m_bPadTracks,\r\n            (int)g_BurnImageSettings.m_bFixate,\r\n            g_BurnImageSettings.m_iWriteMethod,\r\n            (int)g_BurnAdvancedSettings.m_bOverburn,\r\n            (int)g_BurnAdvancedSettings.m_bSwab,\r\n            (int)g_BurnAdvancedSettings.m_bIgnoreSize,\r\n            (int)g_BurnAdvancedSettings.m_bImmed,\r\n            (int)g_BurnAdvancedSettings.m_bAudioMaster,\r\n            (int)g_BurnAdvancedSettings.m_bForceSpeed,\r\n            (int)g_BurnAdvancedSettings.m_bVariRec,\r\n            g_BurnAdvancedSettings.m_iVariRec,\r\n            iDataMode);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // We need to specify the total size that we should record.\r\n    m_uiProcessedSize = 0;\r\n\r\n    if (szDataTrack != NULL)\r\n    {\r\n        m_uiTotalSize = ckcore::File::size(szDataTrack) / (1024 * 1024);\t\t// MB.\r\n        m_TrackSize.push_back(m_uiTotalSize);\r\n    }\r\n    else\r\n    {\r\n        m_uiTotalSize = 0;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < AudioTracks.size(); i++)\r\n    {\r\n        unsigned __int64 uiTrackSize = ckcore::File::size(AudioTracks[i]) / (1024 * 1024);\r\n        m_TrackSize.push_back(uiTrackSize);\r\n\r\n        m_uiTotalSize += uiTrackSize;\r\n    }\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -v dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    TCHAR szBuffer[64];\r\n    lsprintf(szBuffer,_T(\" gracetime=%d\"),g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    // FIFO.\r\n    if (g_GlobalSettings.m_iFIFOSize != 4)\r\n    {\r\n        lsprintf(szBuffer,_T(\" fs=%dm\"),g_GlobalSettings.m_iFIFOSize);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Eject.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_EJECT) &&\r\n        g_BurnImageSettings.m_bEject)\r\n    {\r\n        CommandLine += _T(\" -eject\");\r\n    }\r\n\r\n    // Simulation.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE) &&\r\n        g_BurnImageSettings.m_bSimulate)\r\n    {\r\n        CommandLine += _T(\" -dummy\");\r\n    }\r\n\r\n    // Write method.\r\n    switch (g_BurnImageSettings.m_iWriteMethod)\r\n    {\r\n        case WRITEMETHOD_SAO:\r\n            CommandLine += _T(\" -sao\");\r\n            break;\r\n\r\n        case WRITEMETHOD_TAO:\r\n            CommandLine += _T(\" -tao\");\r\n            break;\r\n\r\n        case WRITEMETHOD_TAONOPREGAP:\r\n            CommandLine += _T(\" -tao pregap=0\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96R:\r\n            CommandLine += _T(\" -raw96r\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW16:\r\n            CommandLine += _T(\" -raw16\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96P:\r\n            CommandLine += _T(\" -raw96p\");\r\n            break;\r\n    };\r\n\r\n    TCHAR szDriverOpts[128];\r\n    lstrcpy(szDriverOpts,_T(\" driveropts=\"));\r\n    bool bUseDriverOpts = false;\r\n\r\n    // Buffer underrun protection.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_BUP))\r\n    {\r\n        bUseDriverOpts = true;\r\n\r\n        if (g_BurnImageSettings.m_bBUP)\r\n            lstrcat(szDriverOpts,_T(\"burnfree,\"));\r\n        else\r\n            lstrcat(szDriverOpts,_T(\"noburnfree,\"));\r\n    }\r\n\r\n    // Audio master.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_AUDIO_MASTER))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bAudioMaster)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"audiomaster,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // Forcespeed.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_FORCE_SPEED))\r\n    {\r\n        if (!g_BurnAdvancedSettings.m_bForceSpeed)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"noforcespeed,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // VariRec.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_VARIREC))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bVariRec)\r\n        {\r\n            TCHAR szVariRec[32];\r\n            lsprintf(szVariRec,_T(\"varirec=%d,\"),g_BurnAdvancedSettings.m_iVariRec);\r\n            lstrcat(szDriverOpts,szVariRec);\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    if (bUseDriverOpts)\r\n    {\r\n        szDriverOpts[lstrlen(szDriverOpts) - 1] = '\\0';\r\n        CommandLine += szDriverOpts;\r\n    }\r\n\r\n    // Pad tracks.\r\n    if (g_BurnImageSettings.m_bPadTracks)\r\n        CommandLine += _T(\" -pad\");\r\n\r\n    // Fixate.\r\n    if (!g_BurnImageSettings.m_bFixate)\r\n        CommandLine += _T(\" -nofix\");\r\n\r\n    // Overburning.\r\n    if (g_BurnAdvancedSettings.m_bOverburn)\r\n        CommandLine += _T(\" -overburn\");\r\n\r\n    // Swap audio byte order. // FIXME: Should probably check for support before selecting.\r\n    if (g_BurnAdvancedSettings.m_bSwab)\r\n        CommandLine += _T(\" -swab\");\r\n\r\n    // Ignore size.\r\n    if (g_BurnAdvancedSettings.m_bIgnoreSize)\r\n        CommandLine += _T(\" -ignsize\");\r\n\r\n    // SCSI IMMED flag.\r\n    if (g_BurnAdvancedSettings.m_bImmed)\r\n        CommandLine += _T(\" -immed\");\r\n\r\n    // Speed.\r\n    if (g_BurnImageSettings.m_iWriteSpeed != -1)\r\n    {\r\n        lsprintf(szBuffer,_T(\" speed=%d\"),g_BurnImageSettings.m_iWriteSpeed);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // File name.\r\n    TCHAR szCygwinFileName[MAX_PATH + 16];\r\n\r\n    if (szDataTrack != NULL)\r\n    {\r\n        // Mode.\r\n        switch (iDataMode)\r\n        {\r\n            case 0:\t\t// Mode 1\r\n                CommandLine += _T(\" -data\");\r\n                break;\r\n\r\n            case 1:\t\t// Mode 2 XA (multisession)\r\n                CommandLine += _T(\" -multi\");\r\n                break;\r\n        };\r\n\r\n        GetCygwinFileName(szDataTrack,szCygwinFileName);\r\n\r\n        ckcore::Path FilePath(szDataTrack);\r\n        if (!ckcore::string::astrcmpi(FilePath.ext_name().c_str(),ckT(\"cue\")))\r\n        {\r\n            CommandLine += _T(\" cuefile=\\\"\");\r\n            CommandLine += szCygwinFileName;\r\n            CommandLine += _T(\"\\\"\");\r\n        }\r\n        else\t\t\t\t\t\t\t\t\t\t\t// any other.\r\n        {\r\n            CommandLine += _T(\" \\\"\");\r\n            CommandLine += szCygwinFileName;\r\n            CommandLine += _T(\"\\\"\");\r\n        }\r\n    }\r\n\r\n    // Audio tracks.\r\n    if (AudioTracks.size() > 0)\r\n        CommandLine += _T(\" -audio\");\r\n\r\n    for (unsigned int i = 0; i < AudioTracks.size(); i++)\r\n    {\r\n        GetCygwinFileName(AudioTracks[i],szCygwinFileName);\r\n\r\n        CommandLine += _T(\" \\\"\");\r\n        CommandLine += szCygwinFileName;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n\r\n    // Audio text.\r\n    if (szAudioText != NULL)\r\n    {\r\n        CommandLine += _T(\" textfile=\\\"\");\r\n        CommandLine += szAudioText;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::BurnImage(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                      const TCHAR *szFileName,bool bCloneMode)\r\n{\r\n    return BurnImage(Device,pProgress,szFileName,false,bCloneMode);\r\n}\r\n\r\n/*\r\n    CCore::BurnImageEx\r\n    ------------------\r\n    Same as the function above except that it will not return untill the process\r\n    has ended.\r\n*/\r\nbool CCore::BurnImageEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                        const TCHAR *szFileName,bool bCloneMode)\r\n{\r\n    return BurnImage(Device,pProgress,szFileName,true,bCloneMode);\r\n}\r\n\r\nbool CCore::BurnTracks(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                       const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n                       const TCHAR *szAudioText,int iDataMode)\r\n{\r\n    return BurnTracks(Device,pProgress,szDataTrack,AudioTracks,szAudioText,\r\n                      iDataMode,MODE_BURNIMAGE,true);\r\n}\r\n\r\n/*\r\n    CCore::BurnTracksEx\r\n    -------------------\r\n    Works like CCore::BurnTracks but it does not end the progress when done. It\r\n    allows for more operations to be performed in the same progress window. It\r\n    also has extra return values.\r\n*/\r\neBurnResult CCore::BurnTracksEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                                const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n                                const TCHAR *szAudioText,int iDataMode)\r\n{\r\n    if (!BurnTracks(Device,pProgress,szDataTrack,AudioTracks,szAudioText,\r\n                    iDataMode,MODE_BURNIMAGEEX,true))\r\n    {\r\n        return BURNRESULT_INTERNALERROR;\r\n    }\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? RESULT_OK : RESULT_EXTERNALERROR;\r\n}\r\n\r\n/*\r\n    CCore::ReadDataTrack\r\n    --------------------\r\n    Reads a track from the CD and stores the raw binary content in the file\r\n    named szFileName.\r\n*/\r\nbool CCore::ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                          const TCHAR *szFileName,unsigned int uiTrackNumber,\r\n                          unsigned long ulStartSector,unsigned long ulEndSector,\r\n                          int iMode,bool bWaitForProcess)\r\n{\r\n    m_bOperationRes = false;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::ReadDataTrack\"));\r\n        g_pLogDlg->print_line(_T(\"  File = %s.\"),szFileName);\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Start = %d, End = %d.\"),ulStartSector,ulEndSector);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // We need to specify the end adresses (in sectors) that we should read.\r\n    m_uiProcessedSize = 0;\r\n    m_uiTotalSize = ulEndSector - ulStartSector;\t// Track length (in sectors).\r\n    m_TrackSize.push_back(ulStartSector);\t\t\t// Start address of the track.\r\n    m_TrackSize.push_back(uiTrackNumber);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_READAPP);\r\n    CommandLine += _T(\"\\\" dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    // Sector range.\r\n    TCHAR szBuffer[128];\r\n    lsprintf(szBuffer,_T(\" sectors=%d-%d\"),ulStartSector,ulEndSector);\r\n    CommandLine += szBuffer;\r\n\r\n    // File name.\r\n    CommandLine += _T(\" f=\\\"\");\r\n    CommandLine += szFileName;\r\n    CommandLine += _T(\"\\\"\");\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                          const TCHAR *szFileName,unsigned int uiTrackNumber,\r\n                          unsigned long ulStartSector,unsigned long ulEndSector)\r\n{\r\n    return ReadDataTrack(Device,pProgress,szFileName,uiTrackNumber,\r\n                         ulStartSector,ulEndSector,MODE_READDATATRACK,true);\r\n}\r\n\r\neBurnResult CCore::ReadDataTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                                   const TCHAR *szFileName,unsigned int uiTrackNumber,\r\n                                   unsigned long ulStartSector,unsigned long ulEndSector)\r\n{\r\n    if (!ReadDataTrack(Device,pProgress,szFileName,uiTrackNumber,ulStartSector,\r\n                       ulEndSector,MODE_READDATATRACKEX,true))\r\n    {\r\n        return BURNRESULT_INTERNALERROR;\r\n    }\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n}\r\n\r\n/*\r\n*/\r\nbool CCore::ReadAudioTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                           const TCHAR *szFileName,unsigned int uiTrackNumber,\r\n                           int iMode,bool bWaitForProcess)\r\n{\r\n    m_bOperationRes = false;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::ReadAudioTrack\"));\r\n        g_pLogDlg->print_line(_T(\"  File = %s.\"),szFileName);\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // Remember what track we are working with.\r\n    m_uiTotalSize = uiTrackNumber;\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_AUDIOAPP);\r\n    CommandLine += _T(\"\\\" -D \");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    // Miscellaneous.\r\n    CommandLine += _T(\" -I generic_scsi -x -B -O wav -g -H\");\r\n\r\n    // Track.\r\n    TCHAR szBuffer[128];\r\n    lsprintf(szBuffer,_T(\" -t %d+%d\"),uiTrackNumber,uiTrackNumber);\r\n    CommandLine += szBuffer;\r\n\r\n    // File name.\r\n    CommandLine += _T(\" \\\"\");\r\n    CommandLine += szFileName;\r\n    CommandLine += _T(\"\\\"\");\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::ReadAudioTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                           const TCHAR *szFileName,unsigned int uiTrackNumber)\r\n{\r\n    return ReadAudioTrack(Device,pProgress,szFileName,uiTrackNumber,\r\n                          MODE_READAUDIOTRACK,true);\r\n}\r\neBurnResult CCore::ReadAudioTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n                                    unsigned int uiTrackNumber)\r\n{\r\n    if (!ReadAudioTrack(Device,pProgress,szFileName,uiTrackNumber,\r\n                        MODE_READAUDIOTRACKEX,true))\r\n    {\r\n        return BURNRESULT_INTERNALERROR;\r\n    }\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n}\r\n\r\n/*\r\n    CCore::ScanTrack\r\n    ----------------\r\n    Scans the selected track for CRC and C2 errors.\r\n*/\r\nbool CCore::ScanTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                      unsigned int uiTrackNumber,unsigned long ulStartSector,\r\n                      unsigned long ulEndSector,int iMode,bool bWaitForProcess)\r\n{\r\n    m_bOperationRes = false;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::ScanTrack\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Start = %d, End = %d.\"),ulStartSector,ulEndSector);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // We need to specify the end adresses (in sectors) that we should read.\r\n    m_uiProcessedSize = 0;\r\n    m_uiTotalSize = ulEndSector - ulStartSector;\t// Track length (in sectors).\r\n    m_TrackSize.push_back(ulStartSector);\t\t\t// Start address of the track.\r\n    m_TrackSize.push_back(uiTrackNumber);\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_READAPP);\r\n    CommandLine += _T(\"\\\" -c2scan dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    // Sector range.\r\n    TCHAR szBuffer[128];\r\n    lsprintf(szBuffer,_T(\" sectors=%d-%d\"),ulStartSector,ulEndSector);\r\n    CommandLine += szBuffer;\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::ScanTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,unsigned int uiTrackNumber,\r\n                      unsigned long ulStartSector,unsigned long ulEndSector)\r\n{\r\n    return ScanTrack(Device,pProgress,uiTrackNumber,ulStartSector,ulEndSector,\r\n                     MODE_SCANTRACK,true);\r\n}\r\n\r\neBurnResult CCore::ScanTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,unsigned int uiTrackNumber,\r\n                               unsigned long ulStartSector,unsigned long ulEndSector)\r\n{\r\n    if (!ScanTrack(Device,pProgress,uiTrackNumber,ulStartSector,ulEndSector,\r\n                   MODE_SCANTRACKEX,true))\r\n    {\r\n        return BURNRESULT_INTERNALERROR;\r\n    }\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n}\r\n\r\n/*\r\n    CCore::CopyDisc\r\n    ---------------\r\n    Performs an on-the-fly copy of a disc. This function is configured through the\r\n    g_BurnImageSettings, g_BurnAdvancedSettings and g_ReadSettings (m_bIgnoreErr\r\n    only) objects.\r\n*/\r\nbool CCore::CopyDisc(ckmmc::Device &SrcDevice,ckmmc::Device &DstDevice,\r\n                     CAdvancedProgress *pProgress)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::CopyDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  Source: [%d,%d,%d] %s\"),SrcDevice.address().bus_,\r\n                              SrcDevice.address().target_,SrcDevice.address().lun_,\r\n                              SrcDevice.name());\r\n        g_pLogDlg->print_line(_T(\"  Target: [%d,%d,%d] %s\"),DstDevice.address().bus_,\r\n                              DstDevice.address().target_,DstDevice.address().lun_,\r\n                              DstDevice.name());\r\n        g_pLogDlg->print_line(_T(\"  Eject = %d, Simulate = %d, BUP = %d, Pad tracks = %d, Close = %d, Overburn = %d, Swab = %d, Ignore size = %d, Immed = %d, Audio master = %d, Forcespeed = %d, VariRec (enabled) = %d, VariRec (value) = %d, Ignore read errors = %d.\"),\r\n            (int)g_BurnImageSettings.m_bEject,\r\n            (int)g_BurnImageSettings.m_bSimulate,\r\n            (int)g_BurnImageSettings.m_bBUP,\r\n            (int)g_BurnImageSettings.m_bPadTracks,\r\n            (int)g_BurnImageSettings.m_bFixate,\r\n            (int)g_BurnAdvancedSettings.m_bOverburn,\r\n            (int)g_BurnAdvancedSettings.m_bSwab,\r\n            (int)g_BurnAdvancedSettings.m_bIgnoreSize,\r\n            (int)g_BurnAdvancedSettings.m_bImmed,\r\n            (int)g_BurnAdvancedSettings.m_bAudioMaster,\r\n            (int)g_BurnAdvancedSettings.m_bForceSpeed,\r\n            (int)g_BurnAdvancedSettings.m_bVariRec,\r\n            g_BurnAdvancedSettings.m_iVariRec,\r\n            (int)g_ReadSettings.m_bIgnoreErr);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(MODE_BURNIMAGE,pProgress);\r\n\r\n    // Since this function uses a batch file for execution no cygwin paths are included in\r\n    // stderr messages.\r\n    m_bErrorPathMode = false;\r\n\r\n    // We need to specify the total size that we should record.\r\n    m_uiProcessedSize = 0;\r\n    m_uiTotalSize = g_CopyDiscSettings.m_uiSourceSize / (1024 * 1024);\t\t// MB.\r\n    m_TrackSize.push_back(m_uiTotalSize);\r\n\r\n    std::string CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = CORE_READAPP;\r\n    CommandLine += \" -v dev=\";\r\n\r\n    // Source device.\r\n    CommandLine += NDeviceUtil::GetDeviceAddrA(SrcDevice);\r\n\r\n    // Speed.\r\n    char szBuffer[64];\r\n    if (g_BurnImageSettings.m_iWriteSpeed != -1)\r\n    {\r\n        sprintf(szBuffer,\" speed=%d\",g_BurnImageSettings.m_iWriteSpeed);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Ignore read errors.\r\n    if (g_ReadSettings.m_bIgnoreErr)\r\n        CommandLine += \" -noerror -nocorr\";\r\n\r\n    // Redirection.\r\n    CommandLine += \" f=- 2> NUL: | \";\r\n\r\n    // Write app related.\r\n    CommandLine += CORE_WRITEAPP;\r\n    CommandLine += \" -v dev=\";\r\n    CommandLine += NDeviceUtil::GetDeviceAddrA(DstDevice);\r\n\r\n    sprintf(szBuffer,\" gracetime=%d\",g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    // FIFO.\r\n    if (g_GlobalSettings.m_iFIFOSize != 4)\r\n    {\r\n        sprintf(szBuffer,\" fs=%dm\",g_GlobalSettings.m_iFIFOSize);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Eject.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_EJECT) &&\r\n        g_BurnImageSettings.m_bEject)\r\n    {\r\n        CommandLine += \" -eject\";\r\n    }\r\n\r\n    // Simulation.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_TEST_WRITE) &&\r\n        g_BurnImageSettings.m_bSimulate)\r\n    {\r\n        CommandLine += \" -dummy\";\r\n    }\r\n\r\n    // Write method.\r\n    switch (g_BurnImageSettings.m_iWriteMethod)\r\n    {\r\n        case WRITEMETHOD_SAO:\r\n            CommandLine += \" -sao\";\r\n            break;\r\n\r\n        case WRITEMETHOD_TAO:\r\n            CommandLine += \" -tao\";\r\n            break;\r\n\r\n        case WRITEMETHOD_TAONOPREGAP:\r\n            CommandLine += \" -tao pregap=0\";\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96R:\r\n            CommandLine += \" -raw96r\";\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW16:\r\n            CommandLine += \" -raw16\";\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96P:\r\n            CommandLine += \" -raw96p\";\r\n            break;\r\n    };\r\n\r\n    char szDriverOpts[128];\r\n    strcpy(szDriverOpts,\" driveropts=\");\r\n    bool bUseDriverOpts = false;\r\n\r\n    // Buffer underrun protection.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_BUP))\r\n    {\r\n        bUseDriverOpts = true;\r\n\r\n        if (g_BurnImageSettings.m_bBUP)\r\n            strcat(szDriverOpts,\"burnfree,\");\r\n        else\r\n            strcat(szDriverOpts,\"noburnfree,\");\r\n    }\r\n\r\n    // Audio master.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_AUDIO_MASTER))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bAudioMaster)\r\n        {\r\n            strcat(szDriverOpts,\"audiomaster,\");\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // Forcespeed.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_FORCE_SPEED))\r\n    {\r\n        if (!g_BurnAdvancedSettings.m_bForceSpeed)\r\n        {\r\n            strcat(szDriverOpts,\"noforcespeed,\");\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // VariRec.\r\n    if (DstDevice.support(ckmmc::Device::ckDEVICE_VARIREC))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bVariRec)\r\n        {\r\n            char szVariRec[16];\r\n            sprintf(szVariRec,\"varirec=%d,\",g_BurnAdvancedSettings.m_iVariRec);\r\n            strcat(szDriverOpts,szVariRec);\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    if (bUseDriverOpts)\r\n    {\r\n        szDriverOpts[strlen(szDriverOpts) - 1] = '\\0';\r\n        CommandLine += szDriverOpts;\r\n    }\r\n\r\n    // Pad tracks.\r\n    if (g_BurnImageSettings.m_bPadTracks)\r\n        CommandLine += \" -pad\";\r\n\r\n    // Fixate.\r\n    if (!g_BurnImageSettings.m_bFixate)\r\n        CommandLine += \" -nofix\";\r\n\r\n    // Overburning.\r\n    if (g_BurnAdvancedSettings.m_bOverburn)\r\n        CommandLine += \" -overburn\";\r\n\r\n    // Swap audio byte order. // FIXME: Should probably check for support before selecting.\r\n    if (g_BurnAdvancedSettings.m_bSwab)\r\n        CommandLine += \" -swab\";\r\n\r\n    // Ignore size.\r\n    if (g_BurnAdvancedSettings.m_bIgnoreSize)\r\n        CommandLine += \" -ignsize\";\r\n\r\n    // SCSI IMMED flag.\r\n    if (g_BurnAdvancedSettings.m_bImmed)\r\n        CommandLine += \" -immed\";\r\n\r\n    // Redirection.\r\n    CommandLine += \" -\";\r\n\r\n    char szChangeDir[MAX_PATH + 3];\r\n    strcpy(szChangeDir,\"cd \");\r\n\r\n    char szFolderPath[MAX_PATH];\r\n    UnicodeToAnsi(szFolderPath,g_GlobalSettings.m_szCDRToolsPath,sizeof(szFolderPath));\r\n\r\n    strcat(szChangeDir,szFolderPath);\r\n\r\n    if (CommandLine.length() > 2047)\r\n    {\r\n        // All versions below Windows XP only supports 2047 character command lines (using the shell).\r\n        if (g_WinVer.m_ulMajorVersion < MAJOR_WINXP ||\r\n            (g_WinVer.m_ulMajorVersion == MAJOR_WINXP && g_WinVer.m_ulMinorVersion < MINOR_WINXP))\r\n        {\r\n            TCHAR szMessage[256];\r\n            lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),2048);\r\n            MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n        // Windows XP supports 8192 character command lines (using the shell).\r\n        else if (CommandLine.length() > 8191)\r\n        {\r\n            TCHAR szMessage[256];\r\n            lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),8192);\r\n            MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n    }\r\n\r\n    // Create the batch file.\r\n    TCHAR szBatchPath[MAX_PATH];\r\n    CreateBatchFile(szChangeDir,CommandLine.c_str(),szBatchPath);\r\n\r\n    TCHAR szBatchCmdLine[MAX_PATH + 2];\r\n    lstrcpy(szBatchCmdLine,_T(\"\\\"\"));\r\n    lstrcat(szBatchCmdLine,szBatchPath);\r\n    lstrcat(szBatchCmdLine,_T(\"\\\"\"));\r\n\r\n    bool bResult = create(szBatchCmdLine);\r\n    wait();\r\n    ckcore::File::remove(szBatchPath);\r\n    return bResult;\r\n}\r\n\r\n/*\r\n    CCore::ReadDisc\r\n    ---------------\r\n    Reads a disc to a disc image. This function is configured through the\r\n    g_ReadSettings object.\r\n*/\r\nbool CCore::ReadDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n                     int iMode,bool bWaitForProcess)\r\n{\r\n    m_bOperationRes = false;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::ReadDisc\"));\r\n        g_pLogDlg->print_line(_T(\"  File = %s.\"),szFileName);\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Ignore read errors = %d, Clone = %d, Speed = %d.\"),\r\n            (int)g_ReadSettings.m_bIgnoreErr,\r\n            (int)g_ReadSettings.m_bClone,\r\n            g_ReadSettings.m_iReadSpeed);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // We need to specify the end adresses (in sectors) that we should read.\r\n    m_uiProcessedSize = 0;\r\n    m_uiTotalSize = 0;\r\n\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_READAPP);\r\n    CommandLine += _T(\"\\\" dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    // Ignore read errors.\r\n    if (g_ReadSettings.m_bIgnoreErr)\r\n        CommandLine += _T(\" -noerror -nocorr\");\r\n\r\n    // Clone.\r\n    if (g_ReadSettings.m_bClone)\r\n        CommandLine += _T(\" -clone\");\r\n\r\n    // Speed.\r\n    if (g_ReadSettings.m_iReadSpeed != -1)\r\n    {\r\n        TCHAR szBuffer[64];\r\n        lsprintf(szBuffer,_T(\" speed=%d\"),g_ReadSettings.m_iReadSpeed); // FIXME: Is this CD or profile dependent speed?\r\n    }\r\n\r\n    // File name.\r\n    CommandLine += _T(\" f=\\\"\");\r\n    CommandLine += GetCygwinFileName(szFileName);\r\n    CommandLine += _T(\"\\\"\");\r\n\r\n    return SafeLaunch(CommandLine,bWaitForProcess);\r\n}\r\n\r\nbool CCore::ReadDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName)\r\n{\r\n    return ReadDisc(Device,pProgress,szFileName,MODE_READDISC,false);\r\n}\r\n\r\neBurnResult CCore::ReadDiscEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName)\r\n{\r\n    if (!ReadDisc(Device,pProgress,szFileName,MODE_READDISCEX,true))\r\n        return BURNRESULT_INTERNALERROR;\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n}\r\n\r\nDWORD WINAPI CCore::CreateCompImageThread(LPVOID lpThreadParameter)\r\n{\r\n    CCompImageParams *pParams = (CCompImageParams *)lpThreadParameter;\r\n\r\n    g_Core2.CreateImage(pParams->m_Process,pParams->m_Files,\r\n                        pParams->m_Progress,false);\r\n\r\n    return 0;\r\n}\r\n\r\nDWORD WINAPI CCore::NextCopyThread(LPVOID lpThreadParameter)\r\n{\r\n    CCore *pCore = (CCore *)lpThreadParameter;\r\n    pCore->Reinitialize();\r\n\r\n    pCore->m_uiProcessedSize = 0;\r\n    pCore->m_pProgress->set_progress(0);\r\n\r\n    TCHAR szBuffer[128];\r\n    lsprintf(szBuffer,lngGetString(INFO_CREATECOPY),\r\n        g_BurnImageSettings.m_lNumCopies - pCore->m_lNumCopies + 1,\r\n        g_BurnImageSettings.m_lNumCopies);\r\n    pCore->m_pProgress->notify(ckcore::Progress::ckINFORMATION,szBuffer);\r\n\r\n    pCore->SafeLaunch(pCore->m_LastCmdLine,pCore->m_bLastWaitForProcess);\r\n    return 0;\r\n}\r\n\r\n/*\r\n    CCore::BurnCompilation\r\n    ----------------------\r\n    Burns a compilation on the fly to a disc. This function is configured through\r\n    the g_BurnImageSettings and g_ProjectSettings object.\r\n*/\r\nbool CCore::BurnCompilation(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                            ckcore::Progress &Progress,const ckfilesystem::FileSet &Files,\r\n                            std::vector<TCHAR *> &AudioTracks,const TCHAR *szAudioText,\r\n                            int iDataMode,unsigned __int64 uiDataBytes,int iMode)\r\n{\r\n    m_bOperationRes = true;\r\n\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore::BurnCompilation\"));\r\n        g_pLogDlg->print_line(_T(\"  [%d,%d,%d] %s\"),Device.address().bus_,\r\n                              Device.address().target_,Device.address().lun_,\r\n                              Device.name());\r\n        g_pLogDlg->print_line(_T(\"  Eject = %d, Simulate = %d, BUP = %d, Pad tracks = %d, Close = %d, Overburn = %d, Swab = %d, Ignore size = %d, Immed = %d, Audio master = %d, Forcespeed = %d, VariRec (enabled) = %d, VariRec (value) = %d, Data bytes %I64d.\"),\r\n            (int)g_BurnImageSettings.m_bEject,\r\n            (int)g_BurnImageSettings.m_bSimulate,\r\n            (int)g_BurnImageSettings.m_bBUP,\r\n            (int)g_BurnImageSettings.m_bPadTracks,\r\n            (int)g_BurnImageSettings.m_bFixate,\r\n            (int)g_BurnAdvancedSettings.m_bOverburn,\r\n            (int)g_BurnAdvancedSettings.m_bSwab,\r\n            (int)g_BurnAdvancedSettings.m_bIgnoreSize,\r\n            (int)g_BurnAdvancedSettings.m_bImmed,\r\n            (int)g_BurnAdvancedSettings.m_bAudioMaster,\r\n            (int)g_BurnAdvancedSettings.m_bForceSpeed,\r\n            (int)g_BurnAdvancedSettings.m_bVariRec,\r\n            g_BurnAdvancedSettings.m_iVariRec,\r\n            uiDataBytes);\r\n    }\r\n\r\n    // Initialize this object.\r\n    Initialize(iMode,pProgress);\r\n\r\n    // Since this function uses a batch file for execution no cygwin paths are included in\r\n    // stderr messages.\r\n    m_bErrorPathMode = false;\r\n\r\n    // We need to specify the total size that we should record.\r\n    m_uiProcessedSize = 0;\r\n\r\n    m_uiTotalSize = uiDataBytes / (1024 * 1024);\t\t\t// MiB.\r\n    m_TrackSize.push_back(m_uiTotalSize);\r\n\r\n    for (unsigned int i = 0; i < AudioTracks.size(); i++)\r\n    {\r\n        unsigned __int64 uiTrackSize = ckcore::File::size(AudioTracks[i]) / (1024 * 1024);\r\n        m_TrackSize.push_back(uiTrackSize);\r\n\r\n        m_uiTotalSize += uiTrackSize;\r\n    }\r\n\r\n    // Setup the command line.\r\n    tstring CommandLine;\r\n    CommandLine.reserve(MAX_PATH);\r\n\r\n    // Write application part of the command line.\r\n    CommandLine = _T(\"\\\"\");\r\n    CommandLine += g_GlobalSettings.m_szCDRToolsPath;\r\n    CommandLine += _T(CORE_WRITEAPP);\r\n    CommandLine += _T(\"\\\" -v dev=\");\r\n    CommandLine += NDeviceUtil::GetDeviceAddr(Device);\r\n\r\n    TCHAR szBuffer[64];\r\n    lsprintf(szBuffer,_T(\" gracetime=%d\"),g_GlobalSettings.m_iGraceTime);\r\n    CommandLine += szBuffer;\r\n\r\n    // FIFO.\r\n    if (g_GlobalSettings.m_iFIFOSize != 4)\r\n    {\r\n        lsprintf(szBuffer,_T(\" fs=%dm\"),g_GlobalSettings.m_iFIFOSize);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Eject.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_EJECT) &&\r\n        g_BurnImageSettings.m_bEject)\r\n    {\r\n            CommandLine += _T(\" -eject\");\r\n    }\r\n\r\n    // Simulation.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE) &&\r\n        g_BurnImageSettings.m_bSimulate)\r\n    {\r\n        CommandLine += _T(\" -dummy\");\r\n    }\r\n\r\n    // Write method.\r\n    switch (g_BurnImageSettings.m_iWriteMethod)\r\n    {\r\n        case WRITEMETHOD_SAO:\r\n            CommandLine += _T(\" -sao\");\r\n\r\n            // The SAO method needs to know the size of the file system beforehand (specified in sectors).\r\n            lsprintf(szBuffer,_T(\" tsize=%I64ds\"),uiDataBytes/2048);\r\n            CommandLine += szBuffer;\r\n            break;\r\n\r\n        case WRITEMETHOD_TAO:\r\n            CommandLine += _T(\" -tao\");\r\n            break;\r\n\r\n        case WRITEMETHOD_TAONOPREGAP:\r\n            CommandLine += _T(\" -tao pregap=0\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96R:\r\n            CommandLine += _T(\" -raw96r\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW16:\r\n            CommandLine += _T(\" -raw16\");\r\n            break;\r\n\r\n        case WRITEMETHOD_RAW96P:\r\n            CommandLine += _T(\" -raw96p\");\r\n            break;\r\n    };\r\n\r\n    TCHAR szDriverOpts[128];\r\n    lstrcpy(szDriverOpts,_T(\" driveropts=\"));\r\n    bool bUseDriverOpts = false;\r\n\r\n    // Buffer underrun protection.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_BUP))\r\n    {\r\n        bUseDriverOpts = true;\r\n\r\n        if (g_BurnImageSettings.m_bBUP)\r\n            lstrcat(szDriverOpts,_T(\"burnfree,\"));\r\n        else\r\n            lstrcat(szDriverOpts,_T(\"noburnfree,\"));\r\n    }\r\n\r\n    // Audio master.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_AUDIO_MASTER))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bAudioMaster)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"audiomaster,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // Forcespeed.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_FORCE_SPEED))\r\n    {\r\n        if (!g_BurnAdvancedSettings.m_bForceSpeed)\r\n        {\r\n            lstrcat(szDriverOpts,_T(\"noforcespeed,\"));\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    // VariRec.\r\n    if (Device.support(ckmmc::Device::ckDEVICE_VARIREC))\r\n    {\r\n        if (g_BurnAdvancedSettings.m_bVariRec)\r\n        {\r\n            TCHAR szVariRec[32];\r\n            lsprintf(szVariRec,_T(\"varirec=%d,\"),g_BurnAdvancedSettings.m_iVariRec);\r\n            lstrcat(szDriverOpts,szVariRec);\r\n            bUseDriverOpts = true;\r\n        }\r\n    }\r\n\r\n    if (bUseDriverOpts)\r\n    {\r\n        szDriverOpts[lstrlen(szDriverOpts) - 1] = '\\0';\r\n        CommandLine += szDriverOpts;\r\n    }\r\n\r\n    // Pad tracks.\r\n    if (g_BurnImageSettings.m_bPadTracks)\r\n        CommandLine += _T(\" -pad\");\r\n\r\n    // Fixate.\r\n    if (!g_BurnImageSettings.m_bFixate)\r\n        CommandLine += _T(\" -nofix\");\r\n\r\n    // Overburning.\r\n    if (g_BurnAdvancedSettings.m_bOverburn)\r\n        CommandLine += _T(\" -overburn\");\r\n\r\n    // Swap audio byte order. // FIXME: Should probably check for support before selecting.\r\n    if (g_BurnAdvancedSettings.m_bSwab)\r\n        CommandLine += _T(\" -swab\");\r\n\r\n    // Ignore size.\r\n    if (g_BurnAdvancedSettings.m_bIgnoreSize)\r\n        CommandLine += _T(\" -ignsize\");\r\n\r\n    // SCSI IMMED flag.\r\n    if (g_BurnAdvancedSettings.m_bImmed)\r\n        CommandLine += _T(\" -immed\");\r\n\r\n    // Speed.\r\n    if (g_BurnImageSettings.m_iWriteSpeed != -1)\r\n    {\r\n        lsprintf(szBuffer,_T(\" speed=%d\"),g_BurnImageSettings.m_iWriteSpeed);\r\n        CommandLine += szBuffer;\r\n    }\r\n\r\n    // Mode.\r\n    switch (iDataMode)\r\n    {\r\n        case 0:\t\t// Mode 1\r\n            CommandLine += _T(\" -data -\");\r\n            break;\r\n\r\n        case 1:\t\t// Mode 2 XA (multisession)\r\n            CommandLine += _T(\" -multi -\");\r\n            break;\r\n    };\r\n\r\n    // Audio tracks.\r\n    if (AudioTracks.size() > 0)\r\n        CommandLine += _T(\" -audio\");\r\n\r\n    TCHAR szCygwinFileName[MAX_PATH + 16];\r\n\r\n    for (unsigned int i = 0; i < AudioTracks.size(); i++)\r\n    {\r\n        GetCygwinFileName(AudioTracks[i],szCygwinFileName);\r\n\r\n        CommandLine += _T(\" \\\"\");\r\n        CommandLine += szCygwinFileName;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n\r\n    // Audio text.\r\n    if (szAudioText != NULL)\r\n    {\r\n        CommandLine += _T(\" textfile=\\\"\");\r\n        CommandLine += szCygwinFileName;\r\n        CommandLine += _T(\"\\\"\");\r\n    }\r\n\r\n    if (CommandLine.length() > 2047)\r\n    {\r\n        // All versions below Windows XP only supports 2047 character command lines (using the shell).\r\n        if (g_WinVer.m_ulMajorVersion < MAJOR_WINXP ||\r\n            (g_WinVer.m_ulMajorVersion == MAJOR_WINXP && g_WinVer.m_ulMinorVersion < MINOR_WINXP))\r\n        {\r\n            TCHAR szMessage[256];\r\n            lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),2048);\r\n            MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n        // Windows XP supports 8192 character command lines (using the shell).\r\n        else if (CommandLine.length() > 8191)\r\n        {\r\n            TCHAR szMessage[256];\r\n            lsnprintf_s(szMessage,256,lngGetString(ERROR_COMMANDLINE),8192);\r\n            MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n    }\r\n\r\n    // Create a separate thread for writing the file system to the process.\r\n    CCompImageParams CompImageParams(*this,Progress,Files);\r\n\r\n    unsigned long ulThreadID = 0;\r\n    HANDLE hThread = ::CreateThread(NULL,0,CreateCompImageThread,&CompImageParams,0,&ulThreadID);\r\n    ::CloseHandle(hThread);\r\n\r\n    //return Launch((TCHAR *)CommandLine.c_str(),true);\r\n    return SafeLaunch(CommandLine,true);\r\n}\r\n\r\nbool CCore::BurnCompilation(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                            ckcore::Progress &Progress,const ckfilesystem::FileSet &Files,\r\n                            std::vector<TCHAR *> &AudioTracks,const TCHAR *szAudioText,\r\n                            int iMode,unsigned __int64 uiDataBytes)\r\n{\r\n    return BurnCompilation(Device,pProgress,Progress,Files,AudioTracks,\r\n                           szAudioText,iMode,uiDataBytes,MODE_BURNIMAGE);\r\n}\r\n\r\neBurnResult CCore::BurnCompilationEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                                     ckcore::Progress &Progress,const ckfilesystem::FileSet &Files,\r\n                                     std::vector<TCHAR *> &AudioTracks,const TCHAR *szAudioText,\r\n                                     int iMode,unsigned __int64 uiDataBytes)\r\n{\r\n    if (!BurnCompilation(Device,pProgress,Progress,Files,AudioTracks,szAudioText,\r\n                         iMode,uiDataBytes,MODE_BURNIMAGEEX))\r\n    {\r\n        return BURNRESULT_INTERNALERROR;\t\t\r\n    }\r\n\r\n    ckcore::tuint32 uiExitCode = 0;\r\n    exit_code(uiExitCode);\r\n\r\n    return uiExitCode == 0 ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n    //return m_bOperationRes ? BURNRESULT_OK : BURNRESULT_EXTERNALERROR;\r\n}"
  },
  {
    "path": "src/app/core/core.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/process.hh>\r\n#include <ckfilesystem/fileset.hh>\r\n#include <ckmmc/device.hh>\r\n#include <base/string_util.hh>\r\n#include \"advanced_progress.hh\"\r\n\r\n#define CORE_IGNORE_ERRORINFOMESSAGES\t\t// Should we ignore error information message (copyright etc.)?\r\n#define CORE_PRINT_UNSUPERRORMESSAGES\t\t// Should we print unhandled/unsupported messages to the log window?\r\n#define CORE_DVD_SUPPORT\t\t\t\t\t// Is DVD recording supported in this version?\r\n\r\nenum eBurnResult\r\n{\r\n    BURNRESULT_OK\t\t\t = 0,\r\n    BURNRESULT_INTERNALERROR = -1,\r\n    BURNRESULT_EXTERNALERROR = -2\r\n};\r\n\r\n#ifdef CDRKIT\r\n#define CORE_WRITEAPP\t\t\t\t\"wodim.exe\"\r\n#define CORE_READAPP\t\t\t\t\"readom.exe\"\r\n#define CORE_AUDIOAPP\t\t\t\t\"icedax.exe\"\r\n#else\r\n#define CORE_WRITEAPP\t\t\t\t\"cdrecord.exe\"\r\n#define CORE_READAPP\t\t\t\t\"readcd.exe\"\r\n#define CORE_AUDIOAPP\t\t\t\t\"cdda2wav.exe\"\r\n#endif\r\n\r\nclass CCore : public ckcore::Process\r\n{\r\nprivate:\r\n    int m_iMode;\r\n    int m_iStatusMode;\r\n\r\n    bool m_bGraceTimeDone;\r\n    bool m_bDummyMode;\r\n    bool m_bErrorPathMode;\t\t\t\t\t// Is set to true when we're expecting a cygwin path in the beginning of each error message.\r\n\r\n    bool m_bOperationRes;\r\n\r\n    unsigned __int64 m_uiProcessedSize;\r\n    unsigned __int64 m_uiTotalSize;\r\n    unsigned __int64 m_uiEstimatedSize;\t\t// Used when estimating file system size.\r\n    std::vector<unsigned __int64> m_TrackSize;\r\n    unsigned int m_uiCurrentTrack;\r\n\r\n    // Holds the length of the path to the cdrtools directory (cygwin path).\r\n    // This is used to remove the cygwin path to cdrtools on every stderr message.\r\n    // It's important that the length is updated when the path changes.\r\n    unsigned int m_uiCDRToolsPathLen;\r\n\r\n    // Object that can receive messages while receiving output from a console\r\n    // application.\r\n    CAdvancedProgress *m_pProgress;\r\n\r\n    // Used for creating multiple copies (when recording a disc image).\r\n    long m_lNumCopies;\r\n    tstring m_LastCmdLine;\r\n    bool m_bLastWaitForProcess;\r\n\r\n    // Used when quering version information.\r\n    ckcore::tstring m_Version;\r\n\r\n    void Initialize(int iMode,CAdvancedProgress *pProgress = NULL);\r\n    void Reinitialize();\r\n    void CreateBatchFile(const char *szChangeDir,const char *szCommandLine,TCHAR *szBatchPath);\r\n    bool SafeLaunch(tstring &CommandLine,bool bWaitForProcess);\r\n    bool Relaunch();\r\n\r\n    bool CheckGraceTime(const char *szBuffer);\r\n    bool CheckProgress(const char *szBuffer);\r\n\r\n    void ErrorOutputCDRECORD(const char *szBuffer);\r\n    void ErrorOutputREADCD(const char *szBuffer);\r\n    void ErrorOutputCDDA2WAV(const char *szBuffer);\r\n\r\n    void EraseOutput(const char *szBuffer);\r\n    void FixateOutput(const char *szBuffer);\r\n    void BurnImageOutput(const char *szBuffer);\r\n    void ReadDataTrackOutput(const char *szBuffer);\r\n    void ReadAudioTrackOutput(const char *szBuffer);\r\n    void ScanTrackOutput(const char *szBuffer);\r\n    void ReadDiscOutput(const char *szBuffer);\r\n    void VersionOutput(const char *szBuffer);\r\n\r\n    // Inherited events.\r\n    void event_output(const std::string &block);\r\n    void event_finished();\r\n\r\n    // Thread functions.\r\n    class CCompImageParams\t// A pointer to a structure of this type should be passed as thead parameter for CreateCompImageThread.\r\n    {\r\n    public:\r\n        ckcore::Process &m_Process;\r\n        ckcore::Progress &m_Progress;\r\n        const ckfilesystem::FileSet &m_Files;\r\n\r\n        CCompImageParams(ckcore::Process &Process,ckcore::Progress &Progress,\r\n            const ckfilesystem::FileSet &Files) : m_Process(Process),\r\n            m_Progress(Progress),m_Files(Files)\r\n        {\r\n        }\r\n    };\r\n\r\n    static DWORD WINAPI CreateCompImageThread(LPVOID lpThreadParameter);\r\n    static DWORD WINAPI NextCopyThread(LPVOID lpThreadParameter);\r\n\r\n    bool BurnImage(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szFileName,bool bWaitForProcess,bool bCloneMode);\r\n    bool BurnTracks(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n        const TCHAR *szAudioText,int iDataMode,int iMode,bool bWaitForProcess);\r\n    bool ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber,unsigned long ulStartSector,unsigned long ulEndSector,\r\n        int iMode,bool bWaitForProcess);\r\n    bool ReadAudioTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber,int iMode,bool bWaitForProcess);\r\n    bool ScanTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,unsigned int uiTrackNumber,\r\n        unsigned long ulStartSector,unsigned long ulEndSector,int iMode,bool bWaitForProcess);\r\n    bool ReadDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        int iMode,bool bWaitForProcess);\r\n    bool BurnCompilation(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        ckcore::Progress &Progress,const ckfilesystem::FileSet &Files,\r\n        std::vector<TCHAR *> &AudioTracks,const TCHAR *szAudioText,int iDataMode,\r\n        unsigned __int64 uiDataBytes,int iMode);\r\n\r\n    enum eMode\r\n    {\r\n        MODE_EJECT = 0,\r\n        MODE_ERASE,\r\n        MODE_FIXATE,\r\n        MODE_BURNIMAGE,\r\n        MODE_BURNIMAGEEX,\r\n        MODE_READDATATRACK,\r\n        MODE_READDATATRACKEX,\r\n        MODE_READAUDIOTRACK,\r\n        MODE_READAUDIOTRACKEX,\r\n        MODE_SCANTRACK,\r\n        MODE_SCANTRACKEX,\r\n        MODE_READDISC,\r\n        MODE_READDISCEX,\r\n        MODE_VERSION\r\n    };\r\n\r\n    enum eStatusMode\r\n    {\r\n        SMODE_DEFAULT = 0,\r\n        SMODE_GRACETIME,\r\n        SMODE_PREPROGRESS,\r\n        SMODE_PROGRESS,\r\n        SMODE_AUDIOPROGRESS\r\n    };\r\n\r\npublic:\r\n    CCore();\r\n    ~CCore();\r\n\r\n    bool EjectDisc(ckmmc::Device &Device,bool bWaitForProcess);\r\n    bool LoadDisc(ckmmc::Device &Device,bool bWaitForProcess);\r\n    bool EraseDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        int iMode,bool bForce,bool bEject,bool bSimulate);\r\n    bool FixateDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        bool bEject,bool bSimulate);\r\n    bool BurnImage(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szFileName,bool bCloneMode);\r\n    bool BurnImageEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szFileName,bool bCloneMode);\r\n    bool BurnTracks(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n        const TCHAR *szAudioText,int iDataMode);\r\n    eBurnResult BurnTracksEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        const TCHAR *szDataTrack,std::vector<TCHAR *> &AudioTracks,\r\n        const TCHAR *szAudioText,int iDataMode);\r\n    bool ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber,unsigned long ulStartSector,unsigned long ulEndSector);\r\n    eBurnResult ReadDataTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber,unsigned long ulStartSector,unsigned long ulEndSector);\r\n    bool ReadAudioTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber);\r\n    eBurnResult ReadAudioTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName,\r\n        unsigned int uiTrackNumber);\r\n    bool ScanTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,unsigned int uiTrackNumber,\r\n        unsigned long ulStartSector,unsigned long ulEndSector);\r\n    eBurnResult ScanTrackEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,unsigned int uiTrackNumber,\r\n        unsigned long ulStartSector,unsigned long ulEndSector);\r\n    bool CopyDisc(ckmmc::Device &SrcDevice,ckmmc::Device &DstDevice,CAdvancedProgress *pProgress);\r\n    bool ReadDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName);\r\n    eBurnResult ReadDiscEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,const TCHAR *szFileName);\r\n    bool BurnCompilation(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        ckcore::Progress &Progress,const ckfilesystem::FileSet &Files,std::vector<TCHAR *> &AudioTracks,\r\n        const TCHAR *szAudioText,int iMode,unsigned __int64 uiDataBytes);\r\n    eBurnResult BurnCompilationEx(ckmmc::Device &Device,CAdvancedProgress *pProgress,ckcore::Progress &Progress,\r\n        const ckfilesystem::FileSet &Files,std::vector<TCHAR *> &AudioTracks,\r\n        const TCHAR *szAudioText,int iMode,unsigned __int64 uiDataBytes);\r\n    ckcore::tstring CdrtoolsVersion();\r\n};\r\n\r\nextern CCore g_Core;"
  },
  {
    "path": "src/app/core/core2.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <cassert>\r\n#include <ckcore/filestream.hh>\r\n#include <ckcore/nullstream.hh>\r\n#include <ckcore/exception.hh>\r\n#include <ckfilesystem/filesystemwriter.hh>\r\n#include \"core2.hh\"\r\n#include \"core2_Format.hh\"\r\n#include \"core2_blank.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"core2_info.hh\"\r\n#include \"core2_read.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCCore2 g_Core2;\r\n\r\nCCore2::CCore2()\r\n{\r\n}\r\n\r\nCCore2::~CCore2()\r\n{\r\n}\r\n\r\nbool CCore2::HandleEvents(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                          unsigned char &ucHandledEvents)\r\n{\r\n    ucHandledEvents = 0;\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Handle events.\r\n    unsigned char ucEvents = 0xFF;\r\n    unsigned char ucEvent[8];\r\n\r\n    unsigned char ucStartCount = 0;\r\n\r\n    while (ucEvents)\r\n    {\r\n        ucCdb[0] = SCSI_GET_EVENT_STATUS_NOTIFICATION;\r\n        ucCdb[1] = 0x01;\t\t\t// Polled.\r\n        ucCdb[4] = ucEvents;\r\n        ucCdb[8] = sizeof(ucEvent);\r\n        ucCdb[9] = 0x00;\r\n\r\n        if (!Device.transport(ucCdb,10,ucEvent,sizeof(ucEvent),ckmmc::Device::ckTM_READ))\r\n            return false;\r\n\r\n        ucEvents = ucEvent[3];\r\n\r\n        if ((ucEvent[2] & 0x07) == 0 ||\r\n            (ucEvent[0] << 8 | ucEvent[1]) == 2 ||\r\n            (ucEvent[4] & 0x0F) == 0)\t// No Changes\r\n            return true;\r\n\r\n        unsigned int uiDescriptor = ucEvent[4] << 24 |\r\n            ucEvent[5] << 16 | ucEvent[6] << 8 | ucEvent[7];\r\n\r\n        switch (ucEvent[2] & 0x07)\r\n        {\r\n            case 0:\t\t// No reqeusted event classes are supported.\r\n                return true;\r\n\r\n            case 1:\t\t// Operational change request/notification.\r\n                ucHandledEvents |= 0x01;\r\n                break;\r\n\r\n            case 2:\t\t// Power management.\r\n                if ((uiDescriptor & 0xFF0000) != 0x01)\r\n                {\r\n                    // For some reasons this code is not compatible with all recorders.\r\n                    if (ucStartCount == 10)\r\n                    {\r\n                        g_pLogDlg->print_line(_T(\"  Warning: Unable to start the drive, aborting after %d retries.\"),ucStartCount);\r\n                        return true;\r\n                    }\r\n\r\n                    g_pLogDlg->print_line(_T(\"  The drive is not in active state.\"));\r\n\r\n                    if (!StartStopUnit(Device,LOADMEDIA_START,false))\r\n                    {\r\n                        if (pProgress != NULL)\r\n                            pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_NOMEDIA));\r\n                        return false;\r\n                    }\r\n\r\n                    g_pLogDlg->print_line(_T(\"   -> Started the disc to make it ready for access.\"));\r\n                    ucStartCount++;\r\n                }\r\n\r\n                ucHandledEvents |= 0x02;\r\n                break;\r\n\r\n            case 3:\t\t// External request.\r\n                ucHandledEvents |= 0x04;\r\n                break;\r\n\r\n            case 4:\t\t// Media.\r\n                ucHandledEvents |= 0x08;\r\n                break;\r\n\r\n            case 5:\t\t// Multiple hosts.\r\n                ucHandledEvents |= 0x10;\r\n                break;\r\n\r\n            case 6:\t\t// Device busy.\r\n                ucHandledEvents |= 0x20;\r\n                break;\r\n\r\n            case 7:\t\t// Reserved.\r\n                ucHandledEvents |= 0x40;\r\n                break;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2::WaitForUnit(ckmmc::Device &Device,CAdvancedProgress *pProgress)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    unsigned char ucSense[24];\r\n    memset(ucSense,0,sizeof(ucSense));\r\n\r\n    // Prepare command.\r\n    ucCdb[0] = SCSI_TEST_UNIT_READY;\r\n\r\n    while (true)\r\n    {\r\n        Sleep(1000);\r\n\r\n        unsigned char ucResult;\r\n        if (!Device.transport_with_sense(ucCdb,6,NULL,0,ckmmc::Device::ckTM_READ,\r\n                                         ucSense,ucResult))\r\n        {\r\n            return false;\r\n        }\r\n\r\n        // Check if we're done.\r\n        if (ucResult == SCSISTAT_GOOD)\r\n            return true;\r\n\r\n        // Check for errors.\r\n        /*switch (ucSense[2] & 0x0F)\r\n        {\r\n            case SENSEKEY_MEDIUM_ERROR:\r\n            case SENSEKEY_HARDWARE_ERROR:\r\n                return false;\r\n\r\n            case SENSEKEY_NOT_READY:\r\n                break;\r\n        }*/\r\n\r\n        // See if we're formating a disc.\r\n        unsigned char ucCode = CheckSense(ucSense);\r\n        if (ucCode == SENSE_FORMATINPROGRESS ||\r\n            ucCode == SENSE_LONGWRITEINPROGRESS)\r\n        {\r\n            // Check if the operation has been cancelled.\r\n            if (pProgress != NULL && pProgress->cancelled())\r\n            {\r\n                // Stop the unit and unlock the media.\r\n                CloseTrackSession(Device,0,0,true);\r\n                LockMedia(Device,false);\r\n                return false;\r\n            }\r\n\r\n            // Update the progress.\r\n            if (pProgress != NULL)\r\n            {\r\n                // If the SKSV bit is set to zero we are done.\r\n                if (ucSense[15] & 0x80)\r\n                {\r\n                    unsigned short usProgress = ((unsigned short)ucSense[16] << 8) | ucSense[17];\r\n                    pProgress->set_progress((unsigned char)(usProgress * 100.0f / 0xFFFF));\r\n                }\r\n                else\r\n                {\r\n                    pProgress->set_progress(100);\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nCCore2::eMediaChange CCore2::CheckMediaChange(ckmmc::Device &Device)\r\n{\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Handle events.\r\n    unsigned char ucEvent[8];\r\n\r\n    ucCdb[0] = SCSI_GET_EVENT_STATUS_NOTIFICATION;\r\n    ucCdb[1] = 0x01;\t\t\t// Polled.\r\n    ucCdb[4] = 0x10;\r\n    ucCdb[8] = sizeof(ucEvent);\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucEvent,sizeof(ucEvent),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return MEDIACHANGE_NOCHANGE;\r\n    }\r\n\r\n    unsigned char ucEventCode = ucEvent[4] & 0x0F;\r\n    switch (ucEventCode)\r\n    {\r\n        case 1:\r\n            Device.refresh();\r\n            return MEDIACHANGE_EJECTREQUEST;\r\n        case 2:\r\n            Device.refresh();\r\n            return MEDIACHANGE_NEWMEDIA;\r\n        case 3:\r\n            Device.refresh();\r\n            return MEDIACHANGE_MEDIAREMOVAL;\r\n        case 4:\r\n            Device.refresh();\r\n            return MEDIACHANGE_MEDIACHANGED;\r\n        case 5:\r\n            Device.refresh();\r\n            return MEDIACHANGE_BGFORMAT_COMPLETED;\r\n        case 6:\r\n            Device.refresh();\r\n            return MEDIACHANGE_BGFORMAT_RESTARTED;\r\n    }\r\n\r\n    return MEDIACHANGE_NOCHANGE;\r\n}\r\n\r\nbool CCore2::LockMedia(ckmmc::Device &Device,bool bLock)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_PREVENTALLOW_MEDIUM_REMOVAL;\r\n    ucCdb[4] = (unsigned char)bLock;\r\n    ucCdb[5] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,6,NULL,0,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2::StartStopUnit(ckmmc::Device &Device,eLoadMedia Action,bool bImmed)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    unsigned char ucSense[24];\r\n    memset(ucSense,0,sizeof(ucSense));\r\n\r\n    ucCdb[0] = SCSI_START_STOP_UNIT;\r\n    ucCdb[1] = (unsigned char)bImmed;\r\n    ucCdb[4] = (unsigned char)Action;\r\n    ucCdb[5] = 0x00;\r\n\r\n    unsigned char ucResult = 0;\r\n    if (!Device.transport_with_sense(ucCdb,6,NULL,0,ckmmc::Device::ckTM_READ,\r\n                                     ucSense,ucResult))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    if (ucResult != SCSISTAT_GOOD)\r\n    {\r\n        if ((ucSense[2] & 0x0F) == SENSEKEY_NOT_READY)\r\n        {\r\n            if (ucSense[12] == 0x3A)\r\n            {\r\n                switch (ucSense[13])\r\n                {\r\n                    case 0x00:\t// MEDIUM NOT PRESENT\r\n                    case 0x01:\t// MEDIUM NOT PRESENT  TRAY CLOSED.\r\n                        break;\r\n\r\n                    case 0x02:\t// MEDIUM NOT PRESENT  TRAY OPEN\r\n                        if (Action != LOADMEDIA_LOAD)\r\n                        {\r\n                            g_pLogDlg->print_line(_T(\"  Warning: Unable to start media, trying to manually load it.\"));\r\n                            return StartStopUnit(Device,LOADMEDIA_LOAD,bImmed);\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        g_pLogDlg->print_line(_T(\"  Error: Could not start or stop the unit.\"));\r\n\r\n        // Dump CDB.\r\n        g_pLogDlg->print(_T(\"  CDB:\\t\"));\r\n        for (unsigned int i = 0; i < 6; i++)\r\n        {\r\n            if (i == 0)\r\n                g_pLogDlg->print(_T(\"0x%.2X\"),ucCdb[i]);\r\n            else\r\n                g_pLogDlg->print(_T(\",0x%.2X\"),ucCdb[i]);\r\n        }\r\n\r\n        g_pLogDlg->print_line(_T(\"\"));\r\n\r\n        // Dump sense information.\r\n        g_pLogDlg->print_line(_T(\"  Sense:\\t0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X\"),\r\n            ucSense[0],ucSense[1],ucSense[2],ucSense[3],\r\n            ucSense[4],ucSense[5],ucSense[6],ucSense[7]);\r\n\r\n        g_pLogDlg->print_line(_T(\"  \\t0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X\"),\r\n            ucSense[ 8],ucSense[ 9],ucSense[10],ucSense[11],\r\n            ucSense[12],ucSense[13],ucSense[14],ucSense[15]);\r\n\r\n        g_pLogDlg->print_line(_T(\"  \\t0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X\"),\r\n            ucSense[16],ucSense[17],ucSense[18],ucSense[19],\r\n            ucSense[20],ucSense[21],ucSense[22],ucSense[23]);\r\n\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2::CloseTrackSession(ckmmc::Device &Device,unsigned char ucCloseFunction,\r\n                               unsigned short usTrackNumber,bool bImmed)\r\n{\r\n    if (ucCloseFunction > 0x07)\r\n        return false;\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_CLOSE_TRACK_SESSION;\r\n    ucCdb[1] = bImmed ? 0x01 : 0x00;\r\n    ucCdb[2] = ucCloseFunction & 0x07;\r\n    ucCdb[4] = static_cast<unsigned char>(usTrackNumber >> 8);\r\n    ucCdb[5] = static_cast<unsigned char>(usTrackNumber & 0xFF);\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,NULL,0,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2::SetDiscSpeeds(ckmmc::Device &Device,unsigned short usReadSpeed,\r\n                           unsigned short usWriteSpeed)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[ 0] = SCSI_SET_CD_SPEED;\r\n    ucCdb[ 2] = static_cast<unsigned char>(usReadSpeed >> 8);\r\n    ucCdb[ 3] = static_cast<unsigned char>(usReadSpeed & 0xFF);\r\n    ucCdb[ 4] = static_cast<unsigned char>(usWriteSpeed >> 8);\r\n    ucCdb[ 5] = static_cast<unsigned char>(usWriteSpeed & 0xFF);\r\n    ucCdb[11] = 0x08;\r\n\r\n    if (!Device.transport(ucCdb,12,NULL,0,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Updates mode page 5 of the specified device.\r\n    @param pDevice the device to update.\r\n    @param bTestWrite specifies wether the drive should test write or not.\r\n    @param WriteMode specifies the write mode to use for recording.\r\n    @param bSilent if true, the function will not output any error to the log if it failed.\r\n    @return true if the mode page was successfully updated, false otherwise.\r\n*/\r\nbool CCore2::UpdateModePage5(ckmmc::Device &Device,bool bTestWrite,\r\n                             bool bSilent)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[128];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Read the current code page information.\r\n    ucCdb[0] = SCSI_MODE_SENSE10;\r\n    ucCdb[2] = 0x05;\t\t\t\t\t// Default values and code page.\r\n    ucCdb[7] = sizeof(ucBuffer) >> 8;\t// Allocation length (MSB).\r\n    ucCdb[8] = sizeof(ucBuffer) & 0xFF;\t// Allocation length (LSB).\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,sizeof(ucBuffer),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    if ((ucBuffer[8] & 0x3F) != 0x05)\r\n        return false;\r\n\r\n    // Change the code page.\r\n    //ucBuffer[8 + 2] |= bTestWrite ? 0x10 : 0x00;\r\n    if (bTestWrite)\r\n        ucBuffer[8 + 2] |= 0x10;\r\n    else\r\n        ucBuffer[8 + 2] &= ~0x10;\r\n\r\n    // Send the updated code page.\r\n    unsigned short usFileListSize = (ucBuffer[0] << 8 | ucBuffer[1]) + 2;\r\n\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n    ucCdb[0] = SCSI_MODE_SELECT10;\r\n    ucCdb[1] = 0x10;\t// PF (not using vendor specified mode page).\r\n    ucCdb[7] = static_cast<unsigned char>(usFileListSize >> 8);\r\n    ucCdb[8] = static_cast<unsigned char>(usFileListSize & 0xFF);\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!bSilent)\r\n    {\r\n        if (!Device.transport(ucCdb,10,ucBuffer,usFileListSize,\r\n                              ckmmc::Device::ckTM_WRITE))\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        unsigned char ucSense[24];\r\n        memset(ucSense,0,sizeof(ucSense));\r\n\r\n        unsigned char ucResult = 0;\r\n        if (!Device.transport_with_sense(ucCdb,10,ucBuffer,usFileListSize,\r\n                                         ckmmc::Device::ckTM_WRITE,ucSense,ucResult))\r\n        {\r\n            return false;\r\n        }\r\n\r\n        if (ucResult != SCSISTAT_GOOD)\r\n            return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2::EraseDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                       int iMethod,bool bForce,bool bEject,bool bSimulate,\r\n                       unsigned int uiSpeed)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore2::EraseDisc\"));\r\n\r\n        TCHAR szParameters[128];\r\n        lsprintf(szParameters,_T(\"  Method = %d, Force = %d, Eject = %d, Simulate = %d.\"),\r\n            iMethod,(int)bForce,(int)bEject,(int)bSimulate);\r\n        g_pLogDlg->print_line(szParameters);\r\n    }\r\n\r\n    // Setup the progress dialog.\r\n    pProgress->AllowCancel(false);\r\n    pProgress->SetRealMode(!bSimulate);\r\n\r\n    // Turn test writing on if selected.\r\n    if (!UpdateModePage5(Device,bSimulate))\r\n        g_pLogDlg->print_line(_T(\"  Warning: Unable to update code page 0x05.\"));\r\n\r\n// Disabled until these routines are concidered stable enough.\r\n#if 0\r\n    // Lock the media.\r\n    if (!LockMedia(pDevice,true))\r\n        g_pLogDlg->print_line(_T(\"  Warning: Unable to lock device media.\"));\r\n#endif\r\n\r\n    // Set write speed.\r\n    if (!SetDiscSpeeds(Device,0xFFFF,(unsigned short)uiSpeed))\r\n        g_pLogDlg->print_line(_T(\"  Warning: Unable to set disc erase speed.\"));\r\n\r\n    bool bResult = false;\r\n    switch (iMethod)\r\n    {\r\n        case ERASE_FORMAT_QUICK:\r\n        case ERASE_FORMAT_FULL:\r\n            {\r\n                CCore2Format Core2Format;\r\n                bResult = Core2Format.FormatUnit(Device,pProgress,iMethod == ERASE_FORMAT_FULL);\r\n            }\r\n            break;\r\n\r\n        case ERASE_BLANK_FULL:\r\n        case ERASE_BLANK_MINIMAL:\r\n        case ERASE_BLANK_UNCLOSE:\r\n        case ERASE_BLANK_SESSION:\r\n            {\r\n                CCore2Blank Core2Blank;\r\n                bResult = Core2Blank.Blank(Device,pProgress,iMethod,bForce,bSimulate);\r\n            }\r\n            break;\r\n    }\r\n\r\n    // Unlock the media.\r\n    if (!LockMedia(Device,false))\r\n        g_pLogDlg->print_line(_T(\"  Warning: Unable to unlock device media.\"));\r\n\r\n    // Eject the media (if requested).\r\n    if (bResult && bEject)\r\n    {\r\n        if (!StartStopUnit(Device,LOADMEDIA_EJECT,true))\r\n            g_pLogDlg->print_line(_T(\"  Warning: Unable to eject media.\"));\r\n    }\r\n\r\n    return bResult;\r\n}\r\n\r\nbool CCore2::ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                           unsigned char ucTrackNumber,bool bIgnoreErr,const TCHAR *szFilePath)\r\n{\r\n    // Initialize log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"CCore2::ReadTrack\"));\r\n\r\n        TCHAR szParameters[128];\r\n        lsprintf(szParameters,_T(\"  Track = %d.\"),ucTrackNumber);\r\n        g_pLogDlg->print_line(szParameters);\r\n    }\r\n\r\n    CCore2Info Info;\r\n    CCore2Read Read;\r\n\r\n    // Print the maximum read speed (for diagnostics purposes).\r\n    ckcore::tuint32 uiMaxReadSpeed = Device.property(ckmmc::Device::ckPROP_MAX_READ_SPD);\r\n    g_pLogDlg->print_line(_T(\"  Maximum read speed: %d KiB/s.\"),uiMaxReadSpeed);\r\n\r\n    if (!SetDiscSpeeds(Device,0xFFFF,0xFFFF))\r\n        g_pLogDlg->print_line(_T(\"  Warning: Unable to set the device read speed.\"));\r\n\r\n    unsigned char ucFirstTrackNumber = 0,ucLastTrackNumber = 0;\r\n    std::vector<CCore2TOCTrackDesc> Tracks;\r\n\r\n    if (Info.ReadTOC(Device,ucFirstTrackNumber,ucLastTrackNumber,Tracks))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  First and last disc track number: %d, %d.\"),\r\n            ucFirstTrackNumber,ucLastTrackNumber);\r\n\r\n        // Validate the requested track number.\r\n        if (ucFirstTrackNumber > ucTrackNumber || ucLastTrackNumber < ucTrackNumber)\r\n        {\r\n            g_pLogDlg->print_line(_T(\"  Error: The requested track number is invalid.\"));\r\n            return false;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to read TOC information to validate selected track.\"));\r\n        return false;\r\n    }\r\n\r\n    // Obtain track start address.\r\n    unsigned long ulTrackAddr = Tracks[ucTrackNumber - 1].m_ulTrackAddr;\r\n\r\n    CCore2TrackInfo TrackInfo;\r\n    if (!Info.ReadTrackInformation(Device,CCore2Info::TIT_LBA,ulTrackAddr,&TrackInfo))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to read track information.\"));\r\n        return false;\r\n    }\r\n\r\n    unsigned long ulTrackSize = TrackInfo.m_ulTrackSize;\r\n\r\n    // Always assume a post-gap of 150 sectors. This may be a bad idea.\r\n    ulTrackSize -= 150;\r\n    g_pLogDlg->print_line(_T(\"  Track span: %d-%d.\"),ulTrackAddr,ulTrackAddr + ulTrackSize);\r\n\r\n    unsigned long ulMin = (ulTrackSize + 150)/(60*75);\r\n    unsigned long ulSec = (ulTrackSize + 150 - ulMin * 60 * 75)/75;\r\n    unsigned long ulFrame = ulTrackSize + 150 - ulMin * 60 * 75 - ulSec * 75;\r\n    g_pLogDlg->print_line(_T(\"  Track length: %02d:%02d:%02d\"),ulMin,ulSec,ulFrame);\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINREADTRACK),ucTrackNumber);\r\n    pProgress->set_status(lngGetString(STATUS_READTRACK));\r\n\r\n#ifdef DEBUG\r\n    g_pLogDlg->print_line(_T(\"  Tracks (start, length):\"));\r\n    std::vector<CCore2TOCTrackDesc>::const_iterator it;\r\n    for (it = Tracks.begin(); it != Tracks.end(); it++)\r\n    {\r\n        CCore2TrackInfo TrackInfo;\r\n        if (Info.ReadTrackInformation(Device,CCore2Info::TIT_LBA,(*it).m_ulTrackAddr,&TrackInfo))\r\n        {\r\n            unsigned long ulMin = (TrackInfo.m_ulTrackSize + 150)/(60*75);\r\n            unsigned long ulSec = (TrackInfo.m_ulTrackSize + 150 - ulMin * 60 * 75)/75;\r\n            unsigned long ulFrame = TrackInfo.m_ulTrackSize + 150 - ulMin * 60 * 75 - ulSec * 75;\r\n            g_pLogDlg->print_line(_T(\"    %d, %02d:%02d:%02d (%d)\"),(*it).m_ulTrackAddr,ulMin,ulSec,ulFrame,TrackInfo.m_ulTrackSize);\r\n        }\r\n    }\r\n#endif\r\n\r\n    ckcore::FileOutStream OutStream(szFilePath);\r\n    if (!OutStream.open())\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to open the output file: \\\"%s\\\".\"),szFilePath);\r\n        return false;\r\n    }\r\n\r\n    Core2ReadFunction::CReadUserData ReadFunc(Device,&OutStream);\r\n\r\n    // Start reading the selected sectors from the disc.\r\n    bool bResult = Read.ReadData(Device,pProgress,&ReadFunc,ulTrackAddr,ulTrackSize,bIgnoreErr);\r\n    OutStream.close();\r\n\r\n    if (bResult)\r\n        pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_READTRACK),ucTrackNumber);\r\n\r\n    return bResult;\r\n}\r\n\r\n/*\r\n    CCore2::ReadFullTOC\r\n    -------------------\r\n    Reads the full TOC and saves the data into a cdrtools compatible file.\r\n*/\r\nbool CCore2::ReadFullTOC(ckmmc::Device &Device,const TCHAR *szFileName)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[4 + 2048];\t\t// It feels stupid to allocate this much memory when\r\n                                            // only 2 bytes of data is needed. The problem is that\r\n                                            // some drives (tested with TSSTCorp CD/DVDW SH-S183A SB00)\r\n                                            // returns more data then requested which may cause buffer\r\n                                            // overruns.\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_TOC_PMA_ATIP;\r\n    ucCdb[2] = 0x02;\t\t\t\t\t\t// Full Q sub-code data.\r\n    ucCdb[7] = sizeof(ucBuffer) >> 8;\t\t// Allocation length (MSB).\r\n    ucCdb[8] = sizeof(ucBuffer) & 0xFF;\t\t// Allocation length (LSB).\r\n    ucCdb[9] = 0;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,sizeof(ucBuffer),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    // Save the data to the specified file name.\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to open file \\\"%s\\\" for writing.\"),szFileName);\r\n        return false;\r\n    }\r\n\r\n    unsigned short usDataLen = ((unsigned short)ucBuffer[0] << 8) | ucBuffer[1];\r\n    if (File.write(ucBuffer,usDataLen + 2) == -1)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to write to file \\\"%s\\\".\"),szFileName);\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nint CCore2::CreateImage(ckcore::OutStream &OutStream,const ckfilesystem::FileSet &Files,\r\n                        ckcore::Progress &Progress,bool bFailOnError,\r\n                        std::map<tstring,tstring> *pFilePathMap)\r\n{\r\n    ckfilesystem::FileSystem::Type FileSysType;\r\n    switch (g_ProjectSettings.m_iFileSystem)\r\n    {\r\n        case FILESYSTEM_ISO:\r\n            FileSysType = g_ProjectSettings.m_bJoliet ?\r\n                ckfilesystem::FileSystem::TYPE_ISO_JOLIET :\r\n                ckfilesystem::FileSystem::TYPE_ISO;\r\n            break;\r\n        case FILESYSTEM_ISO_UDF:\r\n            FileSysType = g_ProjectSettings.m_bJoliet ?\r\n                ckfilesystem::FileSystem::TYPE_ISO_UDF_JOLIET :\r\n                ckfilesystem::FileSystem::TYPE_ISO_UDF;\r\n                break;\r\n        case FILESYSTEM_DVDVIDEO:\r\n            FileSysType = ckfilesystem::FileSystem::TYPE_DVDVIDEO;\r\n            break;\r\n        case FILESYSTEM_UDF:\r\n            FileSysType = ckfilesystem::FileSystem::TYPE_UDF;\t\t\t\r\n            break;\r\n        default:\r\n            ATLASSERT(false);\r\n            ckcore::throw_internal_error(_T(__FILE__),__LINE__);\r\n    }\r\n\r\n    ckfilesystem::Iso::InterchangeLevel InterchangeLevel;\r\n    switch (g_ProjectSettings.m_iIsoLevel)\r\n    {\r\n        case 0:\r\n            InterchangeLevel = ckfilesystem::Iso::LEVEL_1;\r\n            break;\r\n        case 1:\r\n            InterchangeLevel = ckfilesystem::Iso::LEVEL_2;\r\n            break;\r\n        case 2:\r\n            InterchangeLevel = ckfilesystem::Iso::LEVEL_3;\r\n            break;\r\n        case 3:\r\n            InterchangeLevel = ckfilesystem::Iso::ISO9660_1999;\r\n            break;\r\n        default:\r\n            ATLASSERT(false);\r\n            ckcore::throw_internal_error(_T(__FILE__),__LINE__);\r\n    }\r\n\r\n    ckfilesystem::CharacterSet CharacterSet = ckfilesystem::CHARSET_ISO;\r\n    switch (g_ProjectSettings.m_IsoCharSet)\r\n    {\r\n        case CProjectSettings::CHARSET_ISO:\r\n            CharacterSet = ckfilesystem::CHARSET_ISO;\r\n            break;\r\n        case CProjectSettings::CHARSET_DOS:\r\n            CharacterSet = ckfilesystem::CHARSET_DOS;\r\n            break;\r\n        case CProjectSettings::CHARSET_ASCII:\r\n            CharacterSet = ckfilesystem::CHARSET_ASCII;\r\n            break;\r\n        default:\r\n            assert(false);\r\n            break;\r\n    }\r\n\r\n    ckfilesystem::FileSystem FileSys(FileSysType,Files);\r\n\r\n    FileSys.set_long_joliet_names(g_ProjectSettings.m_bJolietLongNames);\r\n    FileSys.set_interchange_level(InterchangeLevel);\r\n    FileSys.set_char_set(CharacterSet);\r\n    FileSys.set_include_file_ver_info(!g_ProjectSettings.m_bOmitVerNum);\r\n    FileSys.set_relax_max_dir_level(g_ProjectSettings.m_bDeepDirs);\r\n\r\n    FileSys.set_volume_label(g_ProjectSettings.m_szLabel);\r\n    FileSys.set_text_fields(g_ProjectSettings.m_szSystem,\r\n        g_ProjectSettings.m_szVolumeSet,g_ProjectSettings.m_szPublisher,\r\n        g_ProjectSettings.m_szPreparer);\r\n    FileSys.set_file_fields(g_ProjectSettings.m_szCopyright,\r\n        g_ProjectSettings.m_szAbstract,g_ProjectSettings.m_szBibliographic);\r\n\r\n    std::list<CProjectBootImage *>::const_iterator itBootImage;\r\n    for (itBootImage = g_ProjectSettings.m_BootImages.begin(); itBootImage !=\r\n        g_ProjectSettings.m_BootImages.end(); itBootImage++)\r\n    {\r\n        switch ((*itBootImage)->m_iEmulation)\r\n        {\r\n            case PROJECTBI_BOOTEMU_NONE:\r\n                FileSys.add_boot_image_no_emu((*itBootImage)->m_FullPath.c_str(),\r\n                    !(*itBootImage)->m_bNoBoot,(*itBootImage)->m_uiLoadSegment,(*itBootImage)->m_uiLoadSize);\r\n                break;\r\n\r\n            case PROJECTBI_BOOTEMU_FLOPPY:\r\n                FileSys.add_boot_image_floppy((*itBootImage)->m_FullPath.c_str(),\r\n                    !(*itBootImage)->m_bNoBoot);\r\n                break;\r\n\r\n            case PROJECTBI_BOOTEMU_HARDDISK:\r\n                FileSys.add_boot_image_hard_disk((*itBootImage)->m_FullPath.c_str(),\r\n                    !(*itBootImage)->m_bNoBoot);\r\n                break;\r\n        }\r\n    }\r\n\r\n    unsigned long ulSectorOffset = 0;\r\n    if (g_ProjectSettings.m_bMultiSession)\r\n        ulSectorOffset = (unsigned long)g_ProjectSettings.m_uiNextWritableAddr;\r\n\r\n    ckfilesystem::FileSystemWriter FileSysWriter(*g_pLogDlg,FileSys,bFailOnError);\r\n    int iResult = FileSysWriter.write(OutStream,Progress,ulSectorOffset);\r\n\r\n    if (pFilePathMap != NULL)\r\n        FileSysWriter.file_path_map(*pFilePathMap);\r\n\r\n    return iResult;\r\n}\r\n\r\n/*\r\n    A wrapper method for the function above.\r\n*/\r\nint CCore2::CreateImage(const TCHAR *szFullPath,const ckfilesystem::FileSet &Files,\r\n                        ckcore::Progress &Progress,bool bFailOnError,\r\n                        std::map<tstring,tstring> *pFilePathMap)\r\n{\r\n    ckcore::FileOutStream FileStream(szFullPath);\r\n    if (!FileStream.open())\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to obtain file handle to \\\"%s\\\".\"),szFullPath);\r\n        return RESULT_FAIL;\r\n    }\r\n\r\n    return CreateImage(FileStream,Files,Progress,bFailOnError,pFilePathMap);\r\n}\r\n\r\nint CCore2::EstimateImageSize(const ckfilesystem::FileSet &Files,ckcore::Progress &Progress,\r\n                              unsigned __int64 &uiImageSize)\r\n{\r\n    ckcore::NullStream OutStream;\r\n    int iResult = CreateImage(OutStream,Files,Progress,true);\r\n\r\n    uiImageSize = OutStream.written();\r\n    return iResult;\r\n}"
  },
  {
    "path": "src/app/core/core2.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <map>\r\n#include <ckcore/stream.hh>\r\n#include <ckfilesystem/sectorstream.hh>\r\n#include <ckfilesystem/fileset.hh>\r\n#include <ckmmc/device.hh>\r\n#include <base/string_util.hh>\r\n#include \"scsi.hh\"\r\n#include \"advanced_progress.hh\"\r\n\r\nclass CCore2\r\n{\r\npublic:\r\n    CCore2();\r\n    ~CCore2();\r\n\r\n    enum eLoadMedia\r\n    {\r\n        LOADMEDIA_STOP = 0x00,\r\n        LOADMEDIA_START = 0x01,\r\n        LOADMEDIA_EJECT = 0x02,\r\n        LOADMEDIA_LOAD = 0x03\r\n    };\r\n\r\n    enum eMediaChange\r\n    {\r\n        MEDIACHANGE_NOCHANGE,\r\n        MEDIACHANGE_EJECTREQUEST,\r\n        MEDIACHANGE_NEWMEDIA,\r\n        MEDIACHANGE_MEDIAREMOVAL,\r\n        MEDIACHANGE_MEDIACHANGED,\r\n        MEDIACHANGE_BGFORMAT_COMPLETED,\r\n        MEDIACHANGE_BGFORMAT_RESTARTED\r\n    };\r\n\r\n    enum\r\n    {\r\n        ERASE_FORMAT_QUICK,\r\n        ERASE_FORMAT_FULL,\r\n        ERASE_BLANK_FULL,\r\n        ERASE_BLANK_MINIMAL,\r\n        ERASE_BLANK_UNCLOSE,\r\n        ERASE_BLANK_SESSION\r\n    };\r\n\r\n    bool HandleEvents(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        unsigned char &ucHandledEvents);\r\n    bool WaitForUnit(ckmmc::Device &Device,CAdvancedProgress *pProgress);\r\n    eMediaChange CheckMediaChange(ckmmc::Device &Device);\r\n\r\n    bool LockMedia(ckmmc::Device &Device,bool bLock);\r\n    bool StartStopUnit(ckmmc::Device &Device,eLoadMedia Action,bool bImmed);\r\n    bool CloseTrackSession(ckmmc::Device &Device,unsigned char ucCloseFunction,\r\n        unsigned short usTrackNumber,bool bImmed);\r\n\r\n    bool SetDiscSpeeds(ckmmc::Device &Device,unsigned short usReadSpeed,\r\n        unsigned short usWriteSpeed);\r\n\r\n    bool UpdateModePage5(ckmmc::Device &Device,bool bTestWrite,bool bSilent = false);\r\n\r\n    // Primary functions.\r\n    bool EraseDisc(ckmmc::Device &Device,CAdvancedProgress *pProgress,int iMethod,\r\n        bool bForce,bool bEject,bool bSimulate,unsigned int uiSpeed);\r\n    bool ReadDataTrack(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        unsigned char ucTrackNumber,bool bIgnoreErr,const TCHAR *szFilePath);\r\n    bool ReadFullTOC(ckmmc::Device &Device,const TCHAR *szFileName);\r\n    int CreateImage(ckcore::OutStream &OutStream,const ckfilesystem::FileSet &Files,\r\n        ckcore::Progress &Progress,bool bFailOnError,\r\n        std::map<tstring,tstring> *pFilePathMap = NULL);\r\n    int CreateImage(const TCHAR *szFullPath,const ckfilesystem::FileSet &Files,\t\t// Wrapper.\r\n        ckcore::Progress &Progress,bool bFailOnError,\r\n        std::map<tstring,tstring> *pFilePathMap = NULL);\r\n    int EstimateImageSize(const ckfilesystem::FileSet &Files,ckcore::Progress &Progress,\t// Wrapper.\r\n        unsigned __int64 &uiImageSize);\r\n};\r\n\r\nextern CCore2 g_Core2;"
  },
  {
    "path": "src/app/core/core2_blank.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"core2_blank.hh\"\r\n#include \"core2.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCCore2Blank::CCore2Blank()\r\n{\r\n}\r\n\r\nCCore2Blank::~CCore2Blank()\r\n{\r\n}\r\n\r\nbool CCore2Blank::Blank(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                        int iMethod,bool bForce,bool bSimulate)\r\n{\r\n    g_pLogDlg->print_line(_T(\"CCore2Blank::Blank\"));\r\n\r\n    unsigned char ucBlankType;\r\n    switch (iMethod)\r\n    {\r\n        case CCore2::ERASE_BLANK_FULL:\r\n            ucBlankType = 0x00;\r\n            break;\r\n\r\n        case CCore2::ERASE_BLANK_MINIMAL:\r\n            ucBlankType = 0x01;\r\n            break;\r\n\r\n        case CCore2::ERASE_BLANK_UNCLOSE:\r\n            ucBlankType = 0x05;\r\n            break;\r\n\r\n        case CCore2::ERASE_BLANK_SESSION:\r\n            ucBlankType = 0x06;\r\n            break;\r\n\r\n        default:\r\n            g_pLogDlg->print_line(_T(\"  Warning: Unknown erase method, using full erase.\"));\r\n            ucBlankType = 0x00;\r\n            break;\r\n    }\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Handle any unhandled events.\r\n    unsigned char ucEvents;\r\n    if (g_Core2.HandleEvents(Device,pProgress,ucEvents))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Handled events: 0x%.2X\"),ucEvents);\r\n    }\r\n    else\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Failed to handle events, handled events: 0x%.2X\"),ucEvents);\r\n        return false;\r\n    }\r\n\r\n    // Start the smoke.\r\n    if (!bSimulate)\r\n        pProgress->StartSmoke();\r\n\r\n    // Execute the blank command.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[ 0] = SCSI_BLANK;\r\n    ucCdb[ 1] = 0x10 | ucBlankType;\t\t// Immed and blank type.\r\n    ucCdb[11] = 0x00;\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINERASE),bSimulate ? \r\n        lngGetString(WRITEMODE_SIMULATION) : lngGetString(WRITEMODE_REAL));\r\n    pProgress->set_status(lngGetString(STATUS_ERASE));\r\n\r\n    // Worst case scenario if the immed flag has no effect (DVD-RW DL at 1x).\r\n    Device.timeout(60 * 120);\r\n\r\n    if (!Device.transport(ucCdb,12,NULL,0,ckmmc::Device::ckTM_READ))\r\n    {\r\n        Device.timeout(60);\r\n\r\n        pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_ERASE));\r\n        return false;\r\n    }\r\n\r\n    Device.timeout(60);\r\n\r\n    if (!g_Core2.WaitForUnit(Device,pProgress))\r\n        return false;\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_ERASE));\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/core/core2_blank.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"advanced_progress.hh\"\r\n\r\nclass CCore2Blank\r\n{\r\npublic:\r\n    CCore2Blank();\r\n    ~CCore2Blank();\r\n\r\n    bool Blank(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        int iMethod,bool bForce,bool bSimulate);\r\n};\r\n"
  },
  {
    "path": "src/app/core/core2_format.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"core2_Format.hh\"\r\n#include \"core2.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCCore2Format::CCore2Format()\r\n{\r\n}\r\n\r\nCCore2Format::~CCore2Format()\r\n{\r\n}\r\n\r\nbool CCore2Format::WaitBkgndFormat(ckmmc::Device &Device,CAdvancedProgress *pProgress)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    unsigned char ucSense[24];\r\n    memset(ucSense,0,sizeof(ucSense));\r\n\r\n    // Prepare command.\r\n    ucCdb[0] = SCSI_REQUEST_SENSE;\r\n    ucCdb[4] = sizeof(ucSense);\r\n    ucCdb[5] = 0x00;\r\n\r\n    unsigned long ulPrevTime = GetTickCount();\r\n\r\n    while (true)\r\n    {\r\n        // See if one second have passed.\r\n        if (GetTickCount() > (ulPrevTime + 1000))\r\n        {\r\n            if (pProgress->cancelled())\r\n            {\r\n                // It's safe to abort the format process at this stage. We just need to\r\n                // close the current track.\r\n                g_Core2.CloseTrackSession(Device,0,0,true);\r\n                return false;\r\n            }\r\n\r\n            unsigned char ucResult;\r\n            if (!Device.transport_with_sense(ucCdb,6,NULL,0,\r\n                                             ckmmc::Device::ckTM_READ,ucSense,\r\n                                             ucResult))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            // Check if we're done.\r\n            if (ucResult == SCSISTAT_GOOD)\r\n                return true;\r\n\r\n            // See if we're formating a disc (in background mode).\r\n            if (ucSense[12] == 0x04 && ucSense[13] == 0x04)\r\n            {\r\n                // Update the progress.\r\n                if (pProgress != NULL)\r\n                {\r\n                    // If the SKSV bit is set to zero we are done.\r\n                    if (ucSense[15] & 0x80)\r\n                    {\r\n                        unsigned short usProgress = ((unsigned short)ucSense[16] << 8) | ucSense[17];\r\n                        pProgress->set_progress((unsigned char)(usProgress * 100.0f / 0xFFFF));\r\n                    }\r\n                    else\r\n                    {\r\n                        pProgress->set_progress(100);\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                // If we receive any other sense we're done.\r\n                return true;\r\n            }\r\n\r\n            ulPrevTime = GetTickCount();\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Format::FormatUnit(ckmmc::Device &Device,CAdvancedProgress *pProgress,bool bFull)\r\n{\r\n    g_pLogDlg->print_line(_T(\"CCore2Format::FormatUnit\"));\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[192];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Perform a device inquiry.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_INQUIRY;\r\n    ucCdb[4] = 192;\r\n    ucCdb[5] = 0;\r\n\r\n    if (!Device.transport(ucCdb,6,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    // Make sure the device type is a CDROM.\r\n    if ((ucBuffer[0] & 0x1F) != 0x05)\r\n        return false;\r\n\r\n    // Get the device configuration, to see what media that's mounted.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_GET_CONFIGURATION;\r\n    ucCdb[8] = 0x08;\r\n\r\n    if (!Device.transport(ucCdb,9,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    unsigned short usProfile = ucBuffer[6] << 8 | ucBuffer[7];\r\n    g_pLogDlg->print_line(_T(\"  Current profile: 0x%.4X.\"),usProfile);\r\n\r\n    if (usProfile != PROFILE_DVDPLUSRW && usProfile != PROFILE_DVDPLUSRW_DL &&\r\n        usProfile != PROFILE_DVDRAM && usProfile != PROFILE_DVDMINUSRW_RESTOV &&\r\n        usProfile != PROFILE_DVDMINUSRW_SEQ)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unsupported media.\"));\r\n        return false;\r\n    }\r\n\r\n    // Read the format capacities length.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_READ_FORMAT_CAPACITIES;\r\n    ucCdb[8] = 0x04;\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    unsigned char ucCapListLen = ucBuffer[3];\r\n    g_pLogDlg->print_line(_T(\"  Capacity list length: %d bytes.\"),ucCapListLen);\r\n\r\n    if (ucCapListLen % 8 != 0 || ucCapListLen == 0)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Invalid capacity list length.\"));\r\n        return false;\r\n    }\r\n\r\n    // Read the actual format capacities data.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_READ_FORMAT_CAPACITIES;\r\n    ucCdb[7] = (ucCapListLen + 0x04) >> 8;\r\n    ucCdb[8] = (ucCapListLen + 0x04) & 0xFF;\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,ucCapListLen + 0x04,\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    // Locate the appropriate formattable capacity descriptor.\r\n    unsigned int uiFmtDescOffset = 0;\r\n    switch (usProfile)\r\n    {\r\n        case PROFILE_DVDPLUSRW:\r\n        case PROFILE_DVDPLUSRW_DL:\r\n            for (uiFmtDescOffset = 8; uiFmtDescOffset < ucCapListLen; uiFmtDescOffset += 8)\r\n            {\r\n                if (ucBuffer[uiFmtDescOffset + 8] >> 2 == 0x26)\r\n                    break;\r\n            }\r\n            break;\r\n\r\n        case PROFILE_DVDRAM:\r\n            for (uiFmtDescOffset = 8; uiFmtDescOffset < ucCapListLen; uiFmtDescOffset += 8)\r\n            {\r\n                if (ucBuffer[uiFmtDescOffset + 8] >> 2 == 0x01)\r\n                    break;\r\n            }\r\n            break;\r\n\r\n        case PROFILE_DVDMINUSRW_RESTOV:\r\n        case PROFILE_DVDMINUSRW_SEQ:\r\n            for (uiFmtDescOffset = 8; uiFmtDescOffset < ucCapListLen; uiFmtDescOffset += 8)\r\n            {\r\n                if (ucBuffer[uiFmtDescOffset + 8] >> 2 == (bFull ? 0x10 : 0x15))\r\n                    break;\r\n            }\r\n            break;\r\n    }\r\n\r\n    if ((ucBuffer[8] & 0x03) == 0x03)\t\t// No media present or unknown capacity.\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to determine media capacity.\"));\r\n        return false;\r\n    }\r\n    else\r\n    {\r\n        unsigned int uiCapacity = ucBuffer[4] << 24 | ucBuffer[5] << 16 |\r\n            ucBuffer[6] << 8 | ucBuffer[7];\r\n\r\n        g_pLogDlg->print_line(_T(\"  Disc capacity: %.2f GiB (%I64d bytes).\"),\r\n            ((double)uiCapacity * 2048)/1073741824,(__int64)uiCapacity * 2048);\r\n\r\n        if ((ucBuffer[8] & 0x03) == 0x01)\t// Unformatted or blank media.\r\n            g_pLogDlg->print_line(_T(\"  The disc media is unformatted or blank.\"));\r\n        else if ((ucBuffer[8] & 0x03) == 0x02)\t// Formatted media.\r\n            g_pLogDlg->print_line(_T(\"  The disc media is formatted.\"));\r\n    }\r\n\r\n    // Handle any unhandled events.\r\n    unsigned char ucEvents;\r\n    if (g_Core2.HandleEvents(Device,pProgress,ucEvents))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Handled events: 0x%.2X\"),ucEvents);\r\n    }\r\n    else\r\n    {\r\n        return false;\r\n    }\r\n\r\n    // Start the smoke.\r\n    pProgress->StartSmoke();\r\n\r\n    // Format the disc.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_FORMAT_UNIT;\r\n    ucCdb[1] = 0x11;\r\n    ucCdb[5] = 0x00;\r\n\r\n    // Format list header.\r\n    ucBuffer[uiFmtDescOffset + 0] = 0x00;\r\n    ucBuffer[uiFmtDescOffset + 1] = 0x02;\t// Immed.\r\n    ucBuffer[uiFmtDescOffset + 2] = 0x00;\r\n    ucBuffer[uiFmtDescOffset + 3] = 0x08;\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINFORMAT),\r\n        lngGetString(WRITEMODE_REAL));\r\n    pProgress->set_status(lngGetString(STATUS_FORMAT));\r\n\r\n    if (!Device.transport(ucCdb,6,ucBuffer + uiFmtDescOffset,12,\r\n                          ckmmc::Device::ckTM_WRITE))\r\n    {\r\n        pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_FORMAT));\r\n        return false;\r\n    }\r\n\r\n    if (!g_Core2.WaitForUnit(Device,pProgress))\r\n        return false;\r\n\r\n    // Stop the background format process (DVD+RW only).\r\n    if (usProfile == PROFILE_DVDPLUSRW || usProfile == PROFILE_DVDPLUSRW_DL)\r\n    {\r\n        // Let the background format continue on DVD+RW discs if a full format was requested.\r\n        if (bFull)\r\n        {\r\n            pProgress->AllowCancel(true);\r\n            pProgress->set_status(lngGetString(STATUS_FORMATBKGND));\r\n\r\n            if (!WaitBkgndFormat(Device,pProgress))\r\n                return false;\r\n        }\r\n\r\n        // Stop the background format.\r\n        pProgress->set_status(lngGetString(STATUS_CLOSETRACK));\r\n\r\n        if (!g_Core2.CloseTrackSession(Device,0x00,0x00,true))\r\n            pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_STOPBKGNDFORMAT));\r\n\r\n        if (!g_Core2.WaitForUnit(Device,pProgress))\r\n            return false;\r\n    }\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(SUCCESS_FORMAT));\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/core/core2_format.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"advanced_progress.hh\"\r\n\r\nclass CCore2Format\r\n{\r\nprivate:\r\n    bool WaitBkgndFormat(ckmmc::Device &Device,CAdvancedProgress *pProgress);\r\n\r\npublic:\r\n    CCore2Format();\r\n    ~CCore2Format();\r\n\r\n    bool FormatUnit(ckmmc::Device &Device,CAdvancedProgress *pProgress,bool bFull);\r\n};\r\n"
  },
  {
    "path": "src/app/core/core2_info.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"scsi.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"core2_info.hh\"\r\n\r\nCCore2Info::CCore2Info()\r\n{\r\n}\r\n\r\nCCore2Info::~CCore2Info()\r\n{\r\n}\r\n\r\nbool CCore2Info::ReadCapacity(ckmmc::Device &Device,unsigned long &ulBlockAddress,\r\n                          unsigned long &ulBlockLength)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[8];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_CAPACITY;\r\n    ucCdb[9] = 0;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,8,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    ulBlockAddress = ((unsigned long)ucBuffer[0] << 24) | ((unsigned long)ucBuffer[1] << 16) |\r\n        ((unsigned long)ucBuffer[2] << 8) | ucBuffer[3];\r\n    ulBlockLength = ((unsigned long)ucBuffer[4] << 24) | ((unsigned long)ucBuffer[5] << 16) |\r\n        ((unsigned long)ucBuffer[6] << 8) | ucBuffer[7];\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Info::ReadTrackInformation(ckmmc::Device &Device,eTrackInfoType InfoType,\r\n                                      unsigned long ulTrackAddr,CCore2TrackInfo *pTrackInfo)\r\n{\r\n    if (pTrackInfo == NULL)\r\n        return false;\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[48];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_TRACK_INFORMATION;\r\n    ucCdb[1] = static_cast<unsigned char>(InfoType & 0x3);\r\n    ucCdb[2] = 0;\r\n    ucCdb[2] = (unsigned char)(ulTrackAddr >> 24);\r\n    ucCdb[3] = (unsigned char)(ulTrackAddr >> 16);\r\n    ucCdb[4] = (unsigned char)(ulTrackAddr >>  8);\r\n    ucCdb[5] = (unsigned char)(ulTrackAddr & 0xFF);\r\n    ucCdb[7] = sizeof(ucBuffer) >> 8;\t\t// Allocation length (MSB).\r\n    ucCdb[8] = sizeof(ucBuffer) & 0xFF;\t\t// Allocation length (LSB).\r\n    ucCdb[9] = 0;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,sizeof(ucBuffer),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    // Check if we received to much data.\r\n    unsigned short usDataLength = ((unsigned short)ucBuffer[0] << 8) | ucBuffer[1];\r\n    if (usDataLength > (sizeof(ucBuffer) - 2))\r\n        g_pLogDlg->print_line(_T(\"  Warning: CCore2::ReadTrackInformation received more track information than it could handle.\"));\r\n\r\n    pTrackInfo->m_ucFlags = (ucBuffer[6] & 0xF0) | ((ucBuffer[5] >> 2) & 0x0C) | (ucBuffer[7] & 0x03);\r\n    pTrackInfo->m_ucLJRS = (ucBuffer[5] >> 6) & 0x03;\r\n    pTrackInfo->m_ucTrackMode = ucBuffer[5] & 0x0F;\r\n    pTrackInfo->m_ucDataMode = ucBuffer[6] & 0x0F;\r\n\r\n    pTrackInfo->m_usTrackNumber = ((unsigned short)ucBuffer[32] << 8) | ucBuffer[2];\r\n    pTrackInfo->m_usSessionNumber = ((unsigned short)ucBuffer[33] << 8) | ucBuffer[3];\r\n\r\n    pTrackInfo->m_ulTrackAddr = ((unsigned int)ucBuffer[8] << 24) | ((unsigned int)ucBuffer[9] << 16) |\r\n        ((unsigned int)ucBuffer[10] << 8) | ucBuffer[11];\r\n    pTrackInfo->m_ulNextWritableAddr = ((unsigned int)ucBuffer[12] << 24) | ((unsigned int)ucBuffer[13] << 16) |\r\n        ((unsigned int)ucBuffer[14] << 8) | ucBuffer[15];\r\n    pTrackInfo->m_ulFreeBlocks = ((unsigned int)ucBuffer[16] << 24) | ((unsigned int)ucBuffer[17] << 16) |\r\n        ((unsigned int)ucBuffer[18] << 8) | ucBuffer[19];\r\n    pTrackInfo->m_ulBlockingFactor = ((unsigned int)ucBuffer[20] << 24) | ((unsigned int)ucBuffer[21] << 16) |\r\n        ((unsigned int)ucBuffer[22] << 8) | ucBuffer[23];\r\n    pTrackInfo->m_ulTrackSize = ((unsigned int)ucBuffer[24] << 24) | ((unsigned int)ucBuffer[25] << 16) |\r\n        ((unsigned int)ucBuffer[26] << 8) | ucBuffer[27];\r\n    pTrackInfo->m_ulLastRecorderAddr = ((unsigned int)ucBuffer[28] << 24) | ((unsigned int)ucBuffer[29] << 16) |\r\n        ((unsigned int)ucBuffer[30] << 8) | ucBuffer[31];\r\n    pTrackInfo->m_ulReadCombLBA = ((unsigned int)ucBuffer[36] << 24) | ((unsigned int)ucBuffer[37] << 16) |\r\n        ((unsigned int)ucBuffer[38] << 8) | ucBuffer[39];\r\n    pTrackInfo->m_ulNextJLA = ((unsigned int)ucBuffer[40] << 24) | ((unsigned int)ucBuffer[41] << 16) |\r\n        ((unsigned int)ucBuffer[42] << 8) | ucBuffer[43];\r\n    pTrackInfo->m_ulLastJLA = ((unsigned int)ucBuffer[44] << 24) | ((unsigned int)ucBuffer[45] << 16) |\r\n        ((unsigned int)ucBuffer[46] << 8) | ucBuffer[47];\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Info::ReadDiscInformation(ckmmc::Device &Device,CCore2DiscInfo *pDiscInfo)\r\n{\r\n    if (pDiscInfo == NULL)\r\n        return false;\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[2048];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_DISC_INFORMATION;\r\n    ucCdb[1] = 0x00;\t// Standard disc information.\r\n    ucCdb[7] = 0x08;\r\n    ucCdb[8] = 0x00;\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,2048,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    pDiscInfo->m_ucLastSessStatus = (ucBuffer[2] >> 2) & 0x03;\r\n    pDiscInfo->m_ucDiscStatus = ucBuffer[2] & 0x03;\r\n    pDiscInfo->m_ucFirstTrack = ucBuffer[3];\r\n    pDiscInfo->m_usNumSessions = ucBuffer[4] | (ucBuffer[9] << 8);\r\n    pDiscInfo->m_usLastSessFstTrack = ucBuffer[5] | (ucBuffer[10] << 8);\r\n    pDiscInfo->m_usLastSessLstTrack = ucBuffer[6] | (ucBuffer[11] << 8);\r\n    pDiscInfo->m_ucFlags = (ucBuffer[7] & 0xFC) | (((ucBuffer[2] & 0x10) > 0) << 1);\r\n    pDiscInfo->m_ucDiscType = ucBuffer[8];\r\n    pDiscInfo->m_uiDiscID = (ucBuffer[12] << 24) | (ucBuffer[13] << 16) |\r\n        (ucBuffer[14] << 8) | ucBuffer[15];\r\n    pDiscInfo->m_uiLastSessLeadInAddr = (ucBuffer[16] << 24) | (ucBuffer[17] << 16) |\r\n        (ucBuffer[18] << 8) | ucBuffer[19];\r\n    pDiscInfo->m_uiLastLeadOutAddr = (ucBuffer[20] << 24) | (ucBuffer[21] << 16) |\r\n        (ucBuffer[22] << 8) | ucBuffer[23];\r\n    pDiscInfo->m_uiDiscBarCode = ((unsigned __int64)ucBuffer[24] << 56) |\r\n        ((unsigned __int64)ucBuffer[25] << 48) | ((unsigned __int64)ucBuffer[26] << 40) |\r\n        ((unsigned __int64)ucBuffer[27] << 32) | (ucBuffer[28] << 24) |\r\n        (ucBuffer[29] << 16) | (ucBuffer[30] << 8) | ucBuffer[31];\r\n    pDiscInfo->m_ucDiscAppCode = ucBuffer[32];\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Info::ReadPhysFmtInfo(ckmmc::Device &Device,CCore2PhysFmtInfo *pPhysInfo)\r\n{\r\n    if (pPhysInfo == NULL)\r\n        return false;\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[192];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[ 0] = SCSI_READ_DISC_STRUCTURE;\r\n    ucCdb[ 7] = 0x00;\r\n    ucCdb[ 8] = 0x08 >> 8;\r\n    ucCdb[ 9] = 0x08;\r\n    ucCdb[11] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,12,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    //uiBookType = ucBuffer[4] & 0xFF;\r\n\r\n    pPhysInfo->m_ucDiscCategory = ucBuffer[4] >> 4;\r\n    pPhysInfo->m_ucPartVersion = ucBuffer[4] & 0xF;\r\n    pPhysInfo->m_ucDiscSize = ucBuffer[5] >> 4;\r\n    pPhysInfo->m_ucMaxRate = ucBuffer[5] & 0xF;\r\n    pPhysInfo->m_ucNumLayers = ((ucBuffer[6] & 0x60) >> 5) + 1;\r\n    pPhysInfo->m_ucTrackPath = (ucBuffer[6] & 0x10) > 0;\r\n    pPhysInfo->m_ucLayerType = ucBuffer[6] & 0xF;\r\n    pPhysInfo->m_ucLinearDensity = ucBuffer[7] >> 4;\r\n    pPhysInfo->m_ucTrackDensity = ucBuffer[7] & 0xF;\r\n    pPhysInfo->m_uiDataStartSector = (ucBuffer[9] << 16) | (ucBuffer[10] << 8) | ucBuffer[11];\r\n    pPhysInfo->m_uiDataEndSector = (ucBuffer[13] << 16) | (ucBuffer[14] << 8) | ucBuffer[15];\r\n    pPhysInfo->m_uiLayer0EndSector = (ucBuffer[17] << 16) | (ucBuffer[18] << 8) | ucBuffer[19];\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Info::ReadTOC(ckmmc::Device &Device,unsigned char &ucFirstTrackNumber,\r\n                         unsigned char &ucLastTrackNumber,std::vector<CCore2TOCTrackDesc> &Tracks)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[4 + 2048];\t\t// It feels stupid to allocate this much memory when\r\n                                            // only 2 bytes of data is needed. The problem is that\r\n                                            // some drives (tested with TSSTCorp CD/DVDW SH-S183A SB00)\r\n                                            // returns more data then requested which may cause buffer\r\n                                            // overruns.\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_TOC_PMA_ATIP;\r\n    ucCdb[2] = 0x00;\t\t\t\t\t\t// TOC.\r\n    ucCdb[7] = sizeof(ucBuffer) >> 8;\t\t// Allocation length (MSB).\r\n    ucCdb[8] = sizeof(ucBuffer) & 0xFF;\t\t// Allocation length (LSB).\r\n    ucCdb[9] = 0;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,sizeof(ucBuffer),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    unsigned short usDataLen = ((unsigned short)ucBuffer[0] << 8) | ucBuffer[1];\r\n    if (usDataLen < 2)\r\n        return false;\r\n        \r\n    ucFirstTrackNumber = ucBuffer[2];\r\n    ucLastTrackNumber = ucBuffer[3];\r\n\r\n    // Fill the Tracks vector.\r\n    for (unsigned char uc = ucFirstTrackNumber; uc <= ucLastTrackNumber; uc++)\r\n    {\r\n        unsigned char ucCurTrackNumber = ucBuffer[6 + 8 * (uc - 1)];\r\n        unsigned long ulTrackAddr = (ucBuffer[8 + 8 * (uc - 1)] << 24) |\r\n            (ucBuffer[9 + 8 * (uc - 1)] << 16) | (ucBuffer[10 + 8 * (uc - 1)] << 8) |\r\n            ucBuffer[11 + 8 * (uc - 1)];\r\n\r\n        Tracks.push_back(CCore2TOCTrackDesc(ucCurTrackNumber,ulTrackAddr));\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    Read session information.\r\n*/\r\nbool CCore2Info::ReadSI(ckmmc::Device &Device,unsigned char &ucFirstSessNumber,\r\n                        unsigned char &ucLastSessNumber,\r\n                        unsigned long &ulLastSessFirstTrackPos)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[4 + 2048];\t\t// It feels stupid to allocate this much memory when\r\n                                            // only 2 bytes of data is needed. The problem is that\r\n                                            // some drives (tested with TSSTCorp CD/DVDW SH-S183A SB00)\r\n                                            // returns more data then requested which may cause buffer\r\n                                            // overruns.\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[0] = SCSI_READ_TOC_PMA_ATIP;\r\n    ucCdb[2] = 0x01;\t\t\t\t\t\t// Session information.\r\n    ucCdb[7] = sizeof(ucBuffer) >> 8;\t\t// Allocation length (MSB).\r\n    ucCdb[8] = sizeof(ucBuffer) & 0xFF;\t\t// Allocation length (LSB).\r\n    ucCdb[9] = 0;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,sizeof(ucBuffer),\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    unsigned short usDataLen = ((unsigned short)ucBuffer[0] << 8) | ucBuffer[1];\r\n    if (usDataLen < 2)\r\n        return false;\r\n        \r\n    ucFirstSessNumber = ucBuffer[2];\r\n    ucLastSessNumber = ucBuffer[3];\r\n\r\n    ulLastSessFirstTrackPos = (ucBuffer[8] << 24) | (ucBuffer[9] << 16) |\r\n        (ucBuffer[10] << 8) |ucBuffer[11];\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CCore2Info::GetTotalDiscCapacity\r\n    --------------------------------\r\n    Counts the number of sectors marked as formatted (used) and\r\n    unformatted/blank (free) on the disc mounted on the specified device. The function\r\n    returns true of successfull, false otherwise.\r\n*/\r\nbool CCore2Info::GetTotalDiscCapacity(ckmmc::Device &Device,unsigned __int64 &uiUsedBytes,\r\n                                      unsigned __int64 &uiFreeBytes)\r\n{\r\n    g_pLogDlg->print_line(_T(\"CCore2Info::GetTotalDiscCapacity\"));\r\n\r\n    uiUsedBytes = 0;\r\n    uiFreeBytes = 0;\r\n\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[192];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    // Get the device configuration, to see what media that's mounted.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_GET_CONFIGURATION;\r\n    ucCdb[8] = 0x08;\r\n\r\n    if (!Device.transport(ucCdb,9,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    unsigned short usProfile = ucBuffer[6] << 8 | ucBuffer[7];\r\n    g_pLogDlg->print_line(_T(\"  Current profile: 0x%.4X.\"),usProfile);\r\n\r\n    bool bReadOnly = true;\r\n    switch (usProfile)\r\n    {\r\n        case PROFILE_CDR:\r\n        case PROFILE_CDRW:\r\n        case PROFILE_DVDMINUSR_SEQ:\r\n        case PROFILE_DVDRAM:\r\n        case PROFILE_DVDMINUSRW_RESTOV:\r\n        case PROFILE_DVDMINUSRW_SEQ:\r\n        case PROFILE_DVDMINUSR_DL_SEQ:\r\n        case PROFILE_DVDMINUSR_DL_JUMP:\r\n        case PROFILE_DVDPLUSRW:\r\n        case PROFILE_DVDPLUSR:\r\n        case PROFILE_DVDPLUSRW_DL:\r\n        case PROFILE_DVDPLUSR_DL:\r\n        case PROFILE_BDR_SRM:\r\n        case PROFILE_BDR_RRM:\r\n        case PROFILE_BDRE:\r\n        case PROFILE_HDDVDR:\r\n        case PROFILE_HDDVDRAM:\r\n            bReadOnly = false;\r\n            break;\r\n    }\r\n\r\n    // Read the format capacities length.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_READ_FORMAT_CAPACITIES;\r\n    ucCdb[8] = 0x04;\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,192,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    unsigned char ucCapListLen = ucBuffer[3];\r\n    g_pLogDlg->print_line(_T(\"  Capacity list length: %d bytes.\"),ucCapListLen);\r\n\r\n    if (ucCapListLen % 8 != 0 || ucCapListLen == 0)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Invalid capacity list length.\"));\r\n        return false;\r\n    }\r\n\r\n    // Read the actual format capacities data.\r\n    memset(ucCdb,0,16);\r\n    ucCdb[0] = SCSI_READ_FORMAT_CAPACITIES;\r\n    ucCdb[7] = (ucCapListLen + 0x04) >> 8;\r\n    ucCdb[8] = (ucCapListLen + 0x04) & 0xFF;\r\n    ucCdb[9] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,10,ucBuffer,ucCapListLen + 0x04,\r\n                          ckmmc::Device::ckTM_READ))\r\n    {\r\n        return false;\r\n    }\r\n\r\n    if ((ucBuffer[8] & 0x03) == 0x03)\t// No media present or unknown capacity.\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  No media present.\"));\r\n        return false;\r\n    }\r\n\r\n    // Format descriptors.\r\n    for (unsigned int i = 0; i < ucCapListLen; i += 8)\r\n    {\r\n        unsigned int uiCapacity = ucBuffer[i + 4] << 24 | ucBuffer[i + 5] << 16 |\r\n            ucBuffer[i + 6] << 8 | ucBuffer[i + 7];\r\n        unsigned int uiBlockSpare = ucBuffer[i + 9] << 16 |ucBuffer[i + 10] << 8 |\r\n            ucBuffer[i + 11];\r\n\r\n        if (uiBlockSpare == 2048)\r\n        {\r\n            if (ucBuffer[i + 8] == 0x02)\t\t// Formatted media\r\n                uiUsedBytes += (unsigned __int64)uiCapacity * 2048;\r\n            else if (ucBuffer[i + 8] == 0x01)\t// Unformatted or blank media.\r\n                uiFreeBytes += (unsigned __int64)uiCapacity * 2048;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CCore2Info::GetDiscDVDRegion(ckmmc::Device &Device,unsigned char &ucRegion)\r\n{\r\n    // Initialize buffers.\r\n    unsigned char ucBuffer[8];\r\n    memset(ucBuffer,0,sizeof(ucBuffer));\r\n\r\n    unsigned char ucCdb[16];\r\n    memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n    ucCdb[ 0] = SCSI_READ_DISC_STRUCTURE;\r\n    ucCdb[ 7] = 0x01;\r\n    ucCdb[ 8] = 0x08 >> 8;\r\n    ucCdb[ 9] = 0x08;\r\n    ucCdb[11] = 0x00;\r\n\r\n    if (!Device.transport(ucCdb,12,ucBuffer,8,ckmmc::Device::ckTM_READ))\r\n        return false;\r\n\r\n    unsigned char ucRegMask = ucBuffer[5];\r\n    ucRegion = 0;\r\n\r\n    if (ucRegMask != 0xFF)\r\n    {\r\n        for (unsigned char i = 0; i < 8; i++)\r\n        {\r\n            if (!((ucRegMask >> i) & 0x01))\r\n                ucRegion = i + 1;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/core/core2_info.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckmmc/device.hh>\r\n\r\nclass CCore2TrackInfo\r\n{\r\npublic:\r\n    // Flags.\r\n    enum { FLAG_NWAV = 0x01,FLAG_LRAV = 0x02,FLAG_COPY = 0x04,FLAG_DAMAGE = 0x08,\r\n        FLAG_FP = 0x10,FLAG_PACKET = 0x20,FLAG_BLANK = 0x40,FLAG_RT = 0x80 };\r\n\r\n    // Data modes.\r\n    enum { DM_MODE1 = 0x1,DM_MODE2 = 0x2,DM_UNKNOWN = 0xF };\r\n\r\n    unsigned char m_ucFlags;\r\n    unsigned char m_ucLJRS;\r\n    unsigned char m_ucTrackMode;\r\n    unsigned char m_ucDataMode;\r\n    unsigned short m_usTrackNumber;\r\n    unsigned short m_usSessionNumber;\r\n    unsigned long m_ulTrackAddr;\r\n    unsigned long m_ulNextWritableAddr;\r\n    unsigned long m_ulFreeBlocks;\r\n    unsigned long m_ulBlockingFactor;\r\n    unsigned long m_ulTrackSize;\r\n    unsigned long m_ulLastRecorderAddr;\r\n    unsigned long m_ulReadCombLBA;\r\n    unsigned long m_ulNextJLA;\r\n    unsigned long m_ulLastJLA;\r\n};\r\n\r\nclass CCore2DiscInfo\r\n{\r\npublic:\r\n    // Last session status.\t\r\n    enum { LSS_EMTPY,LSS_INCOMPLETE,LSS_RESERVED,LSS_COMPLETE };\r\n\r\n    // Disc status.\r\n    enum { DS_EMTPY,DS_INCOMPLETE,DS_FINALIZED,DS_RANDOMACCESS };\r\n\r\n    // Disc type.\r\n    enum { DT_CDDA = 0x00,DT_CDI = 0x10,DT_XA = 0x20,DT_UNDEFINED = 0xFF };\r\n\r\n    // Flags.\r\n    enum { FLAG_ERASABLE = 0x02,FLAG_D = 0x04,FLAG_RESERVED = 0x08,FLAG_DACV = 0x10,\r\n        FLAG_URU = 0x20,FLAG_DBCV = 0x40,FLAG_DIDV = 0x80 };\r\n\r\n    unsigned char m_ucFlags;\r\n    unsigned char m_ucLastSessStatus;\r\n    unsigned char m_ucDiscStatus;\r\n    unsigned char m_ucDiscType;\r\n    unsigned char m_ucFirstTrack;\r\n    unsigned short m_usNumSessions;\r\n    unsigned short m_usLastSessFstTrack;\r\n    unsigned short m_usLastSessLstTrack;\r\n    unsigned int m_uiDiscID;\r\n    unsigned int m_uiLastSessLeadInAddr;\r\n    unsigned int m_uiLastLeadOutAddr;\r\n    unsigned __int64 m_uiDiscBarCode;\r\n    unsigned char m_ucDiscAppCode;\r\n};\r\n\r\nclass CCore2TOCTrackDesc\r\n{\r\npublic:\r\n    CCore2TOCTrackDesc(unsigned char ucTrackNumber,unsigned long ulTrackAddr)\r\n    {\r\n        m_ucTrackNumber = ucTrackNumber;\r\n        m_ulTrackAddr = ulTrackAddr;\r\n    }\r\n\r\n    unsigned char m_ucTrackNumber;\r\n    unsigned long m_ulTrackAddr;\r\n};\r\n\r\nclass CCore2PhysFmtInfo\r\n{\r\npublic:\r\n    // Disc category.\r\n    enum { DC_DVDROM,DC_DVDRAM,DC_DVDR,DC_DVDRW,DC_HDDVDROM,DC_HDDVDRAM,DC_HDDVDR,\r\n        DC_RESERVED1,DC_RESERVED2,DC_DVDPLUSRW,DC_DVDPLUSR,DC_RESERVED3,\r\n        DC_RESERVED4,DC_DVDPLUSRWDL,DC_DVDPLUSRDL,DC_RESERVED5 };\r\n    \r\n    // Maximum rate.\r\n    enum { MR_252 = 0x0,MR_504 = 0x1,MR_1008 = 0x2,MR_2016 = 0x3,MR_3024 = 0x4,\r\n        MR_NOTSPECIFIED = 0xF };\r\n\r\n    // Track path.\r\n    enum { TP_PARALLEL,TP_OPPOSITE };\r\n\r\n    unsigned char m_ucDiscCategory;\r\n    unsigned char m_ucPartVersion;\r\n    unsigned char m_ucDiscSize;\r\n    unsigned char m_ucMaxRate;\r\n    unsigned char m_ucNumLayers;\r\n    unsigned char m_ucLayerType;\r\n    unsigned char m_ucTrackPath;\r\n    unsigned char m_ucLinearDensity;\r\n    unsigned char m_ucTrackDensity;\r\n    unsigned int m_uiDataStartSector;\r\n    unsigned int m_uiDataEndSector;\r\n    unsigned int m_uiLayer0EndSector;\r\n};\r\n\r\nclass CCore2Info\r\n{\r\npublic:\r\n    enum eTrackInfoType\r\n    {\r\n        TIT_LBA = 0,\r\n        TIT_TRACK = 1,\r\n        TIT_SESSION = 2\r\n    };\r\n\r\n    CCore2Info();\r\n    ~CCore2Info();\r\n\r\n    // Closely related to SCSI MMC functions.\r\n    bool ReadCapacity(ckmmc::Device &Device,unsigned long &ulBlockAddress,\r\n        unsigned long &ulBlockLength);\r\n    bool ReadTrackInformation(ckmmc::Device &Device,eTrackInfoType InfoType,\r\n        unsigned long ulTrackAddr,CCore2TrackInfo *pTrackInfo);\r\n    bool ReadDiscInformation(ckmmc::Device &Device,CCore2DiscInfo *pDiscInfo);\r\n    bool ReadPhysFmtInfo(ckmmc::Device &Device,CCore2PhysFmtInfo *pPhysInfo);\r\n    bool ReadTOC(ckmmc::Device &Device,unsigned char &ucFirstTrackNumber,\r\n        unsigned char &ucLastTrackNumber,std::vector<CCore2TOCTrackDesc> &Tracks);\r\n    bool ReadSI(ckmmc::Device &Device,unsigned char &ucFirstSessNumber,\r\n        unsigned char &ucLastSessNumber,unsigned long &ulLastSessFirstTrackPos);\r\n\r\n    bool GetTotalDiscCapacity(ckmmc::Device &Device,unsigned __int64 &uiUsedBytes,\r\n        unsigned __int64 &uiFreeBytes);\r\n    bool GetDiscDVDRegion(ckmmc::Device &Device,unsigned char &ucRegion);\r\n};\r\n"
  },
  {
    "path": "src/app/core/core2_read.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include \"core2_read.hh\"\r\n#include \"core2.hh\"\r\n#include \"core2_info.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nnamespace Core2ReadFunction\r\n{\r\n    CReadFunction::CReadFunction(ckmmc::Device &Device) : m_Device(Device)\r\n    {\r\n    }\r\n\r\n    bool CReadFunction::ReadCD(unsigned char *pBuffer,unsigned long ulAddress,unsigned long ulBlockCount,\r\n                               eMainChannelData MCD,eSubChannelData SCD,eC2ErrorInfo ErrorInfo)\r\n    {\r\n        if (pBuffer == NULL)\r\n            return false;\r\n\r\n        // Initialize buffers.\r\n        unsigned char ucCdb[16];\r\n        memset(ucCdb,0,sizeof(ucCdb));\r\n\r\n        if (ulBlockCount > 0xFFFFFF)\r\n            g_pLogDlg->print_line(_T(\"  Warning: Requested block count to large, trunkated the number of block requested to read.\"));\r\n\r\n        ucCdb[ 0] = SCSI_READ_CD;\r\n        ucCdb[ 1] = 0;\t\t// Return all types of sectors.\r\n        ucCdb[ 2] = static_cast<unsigned char>(ulAddress >> 24);\r\n        ucCdb[ 3] = static_cast<unsigned char>(ulAddress >> 16);\r\n        ucCdb[ 4] = static_cast<unsigned char>(ulAddress >>  8);\r\n        ucCdb[ 5] = static_cast<unsigned char>(ulAddress & 0xFF);\r\n        ucCdb[ 6] = static_cast<unsigned char>(ulBlockCount >> 16);\r\n        ucCdb[ 7] = static_cast<unsigned char>(ulBlockCount >>  8);\r\n        ucCdb[ 8] = static_cast<unsigned char>(ulBlockCount & 0xFF);\r\n        ucCdb[ 9] = static_cast<unsigned char>(0 | MCD | ErrorInfo);\r\n        ucCdb[11] = 0;\r\n\r\n        switch (SCD)\r\n        {\r\n            case SCD_FORMATTEDQ:\r\n                ucCdb[10] = 0x02;\r\n                break;\r\n\r\n            case SCD_DEINTERLEAVED_RW:\r\n                ucCdb[10] = 0x04;\r\n                break;\r\n        }\r\n\r\n        if (!m_Device.transport(ucCdb,12,pBuffer,ulBlockCount * GetFrameSize(),\r\n                                ckmmc::Device::ckTM_READ))\r\n        {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    CReadUserData::CReadUserData(ckmmc::Device &Device,ckcore::OutStream *pOutStream) :\r\n        CReadFunction(Device),m_pOutStream(pOutStream)\r\n    {\r\n        // Get the block size in bytes (the frame only contains the user data in this case).\r\n        CCore2Info Core2Info;\r\n        unsigned long ulBlockAddress = 0;\r\n\r\n        if (!Core2Info.ReadCapacity(Device,ulBlockAddress,m_ulFrameSize))\r\n        {\r\n            m_ulFrameSize = 2048;\r\n            g_pLogDlg->print_line(_T(\"  Error: Unable to obtain disc block information, impossible to continue.\"));\r\n        }\r\n\r\n        g_pLogDlg->print_line(_T(\"  Block address: %u, block length: %u.\"),ulBlockAddress,m_ulFrameSize);\r\n    }\r\n\r\n    CReadUserData::~CReadUserData()\r\n    {\r\n    }\r\n\r\n    bool CReadUserData::Read(unsigned char *pBuffer,unsigned long ulAddress,\r\n                             unsigned long ulBlockCount)\r\n    {\r\n        return ReadCD(pBuffer,ulAddress,ulBlockCount,MCD_USERDATA,SCD_NONE,C2EI_NONE);\r\n    }\r\n\r\n    bool CReadUserData::Process(unsigned char *pBuffer,unsigned long ulBlockCount)\r\n    {\r\n        return m_pOutStream->write(pBuffer,ulBlockCount * m_ulFrameSize) != 1;\r\n    }\r\n\r\n    unsigned long CReadUserData::GetFrameSize()\r\n    {\r\n        return m_ulFrameSize;\r\n    }\r\n\r\n    CReadC2::CReadC2(ckmmc::Device &Device) :\r\n        CReadFunction(Device)\r\n    {\r\n        m_ulErrSecCount = 0;\r\n        m_ulErrByteCount = 0;\r\n        m_uiTotalBytes = 0;\r\n    }\r\n\r\n    CReadC2::~CReadC2()\r\n    {\r\n    }\r\n\r\n    /*\r\n        CReadC2::NumBits\r\n        ----------------\r\n        Returns the number of bits in the specified byte.\r\n    */\r\n    unsigned char CReadC2::NumBits(unsigned char ucData)\r\n    {\r\n        unsigned char ucResult = 0;\r\n\r\n        if (ucData & 0x01)\r\n            ucResult++;\r\n        if (ucData & 0x02)\r\n            ucResult++;\r\n        if (ucData & 0x04)\r\n            ucResult++;\r\n        if (ucData & 0x08)\r\n            ucResult++;\r\n        if (ucData & 0x10)\r\n            ucResult++;\r\n        if (ucData & 0x20)\r\n            ucResult++;\r\n        if (ucData & 0x40)\r\n            ucResult++;\r\n        if (ucData & 0x80)\r\n            ucResult++;\r\n\r\n        return ucResult;\r\n    }\r\n\r\n    bool CReadC2::Read(unsigned char *pBuffer,unsigned long ulAddress,\r\n                       unsigned long ulBlockCount)\r\n    {\r\n        return ReadCD(pBuffer,ulAddress,ulBlockCount,MCD_NONE,SCD_NONE,C2EI_BITS);\r\n    }\r\n\r\n    bool CReadC2::Process(unsigned char *pBuffer,unsigned long ulBlockCount)\r\n    {\r\n        bool bSecErr = false;\r\n        const unsigned char *pBlockBuffer = pBuffer;\r\n\r\n        for (unsigned long i = 0; i < ulBlockCount; i++)\r\n        {\r\n            for (unsigned int j = 0; j < 294; j++)\r\n            {\r\n                // A little optimization.\r\n                if (pBlockBuffer[j] == 0)\r\n                    continue;\r\n\r\n                m_ulErrByteCount += NumBits(pBlockBuffer[j]);\r\n                bSecErr = true;\r\n            }\r\n\r\n            // Increase the error sector counter.\r\n            if (bSecErr)\r\n            {\r\n                m_ulErrSecCount++;\r\n                bSecErr = false;\r\n            }\r\n\r\n            pBlockBuffer += 294;\r\n        }\r\n\r\n        m_uiTotalBytes += (ulBlockCount * 294) << 3;\r\n        return true;\r\n    }\r\n\r\n    unsigned long CReadC2::GetFrameSize()\r\n    {\r\n        return 294;\r\n    }\r\n}\r\n\r\nCCore2Read::CCore2Read()\r\n{\r\n}\r\n\r\nCCore2Read::~CCore2Read()\r\n{\r\n}\r\n\r\n/*\r\n    CCore2Read::RetryReadBlock\r\n    --------------------------\r\n    Tries various methods to successfully re-read the sector at the specified address.\r\n*/\r\nbool CCore2Read::RetryReadBlock(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                                Core2ReadFunction::CReadFunction *pReadFunction,\r\n                                unsigned char *pBuffer,unsigned long ulAddress)\r\n{\r\n    unsigned char ucDummyBuffer[CORE2_READ_MAXFRAMESIZE];\r\n\r\n    // Try to re-read each sector CORE2_READ_RETRYCOUNT number of times.\r\n    for (unsigned int i = 0; i < CORE2_READ_RETRYCOUNT; i++)\r\n    {\r\n        if (pProgress != NULL)\r\n        {\r\n            pProgress->set_status(lngGetString(STATUS_REREADSECTOR),ulAddress,\r\n                i + 1,CORE2_READ_RETRYCOUNT);\r\n\r\n            // Check if the operation has been cancelled.\r\n            if (pProgress->cancelled())\r\n                return false;\r\n        }\r\n\r\n        g_Core2.WaitForUnit(Device,pProgress);\r\n\r\n        // Read the first 10 sectors without seeking.\r\n        if (i > 10)\r\n        {\r\n            if ((i % 4) == 0)\r\n            {\r\n                // Read the first sector.\r\n                pReadFunction->Read(ucDummyBuffer,0,1);\r\n            }\r\n            else\r\n            {\r\n                // Reed a random sector before the requested sector.\t\t\t\t\r\n                pReadFunction->Read(ucDummyBuffer,rand() % ulAddress,1);\r\n            }\r\n\r\n            g_Core2.WaitForUnit(Device,pProgress);\r\n        }\r\n\r\n        // Re-read the requested sector.\r\n        if (pReadFunction->Read(pBuffer,ulAddress,1))\r\n            return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CCore2Read::ReadData(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n                          Core2ReadFunction::CReadFunction *pReadFunction,unsigned long ulStartBlock,\r\n                          unsigned long ulNumBlocks,bool bIgnoreErr)\r\n{\r\n    //g_pLogDlg->print_line(_T(\"CCore2Read::ReadData\"));\r\n\r\n    // Make sure that the device supports this operation.\r\n    if (!Device.support(ckmmc::Device::ckDEVICE_MULTIREAD))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: The selected device does not support this kind of operation.\"));\r\n        return false;\r\n    }\r\n\r\n    if (!Device.support(ckmmc::Device::ckDEVICE_CD_READ))\r\n    {\r\n        if (pProgress != NULL)\r\n            pProgress->notify(ckcore::Progress::ckERROR,lngGetString(FAILURE_NOMEDIA));\r\n\r\n        g_pLogDlg->print_line(_T(\"  Error: The selected device does not support this kind of operation.\"));\r\n        return false;\r\n    }\r\n\r\n    // Make sure that a disc is inserted.\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n    if (Profile == ckmmc::Device::ckPROFILE_NONE)\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: No disc inserted.\"));\r\n        return false;\r\n    }\r\n\r\n    // Status related (ulWritten counts the number of blocks/sectors written).\r\n    unsigned long ulWritten = 0;\r\n    unsigned long ulLastTime = GetTickCount();\r\n\r\n    // Read the data.\r\n    unsigned char *pReadBuffer = new unsigned char[pReadFunction->GetFrameSize() * /*CORE2_READ_MAXFRAMESIZE * */CORE2_READ_BLOCKCOUNT];\r\n\r\n    unsigned long ulReadCount = CORE2_READ_BLOCKCOUNT;\r\n    unsigned long ulEndBlock = ulStartBlock + ulNumBlocks;\r\n\r\n    for (unsigned long l = ulStartBlock; l < ulEndBlock; l += ulReadCount)\r\n    {\r\n        if ((l + ulReadCount) > ulEndBlock)\r\n            ulReadCount = ulEndBlock - l;\r\n\r\n        // Update the status every second.\r\n        if (GetTickCount() > ulLastTime + 1000)\r\n        {\r\n            if (pProgress != NULL)\r\n            {\r\n                pProgress->set_status(lngGetString(STATUS_READTRACK2),\r\n                    ckmmc::util::kb_to_human_speed(ulWritten * 2352 / 1000,Profile));\r\n            }\r\n\r\n            ulWritten = 0;\r\n            ulLastTime = GetTickCount();\r\n        }\r\n\r\n        // Check if the operation has been cancelled.\r\n        if (pProgress != NULL && pProgress->cancelled())\r\n        {\r\n            delete [] pReadBuffer;\r\n            return false;\r\n        }\r\n\r\n        if (!pReadFunction->Read(pReadBuffer,l,ulReadCount))\r\n        {\r\n            g_pLogDlg->print_line(_T(\"  Warning: Failed to read sector range %u-%u\"),\r\n                l,l + ulReadCount);\r\n            if (pProgress != NULL)\r\n                pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(FAILURE_READSOURCEDISC),l);\r\n\r\n            // Read the sectors in the failed sector range one by one.\r\n            for (unsigned int j = 0; j < ulReadCount; j++)\r\n            {\r\n                // Check if the operation has been cancelled.\r\n                if (pProgress != NULL && pProgress->cancelled())\r\n                {\r\n                    delete [] pReadBuffer;\r\n                    return false;\r\n                }\r\n\r\n                if (!RetryReadBlock(Device,pProgress,pReadFunction,pReadBuffer + j * pReadFunction->GetFrameSize(),l + j))\r\n                {\r\n                    g_pLogDlg->print_line(_T(\"    Retry on sector %u failed.\"),l+j);\r\n\r\n                    // Check if we're allowed to ignore this error.\r\n                    if (!bIgnoreErr)\r\n                    {\r\n                        if (pProgress != NULL)\r\n                            pProgress->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_SECTOR),l + j);\t\r\n\r\n                        delete [] pReadBuffer;\r\n                        return false;\r\n                    }\r\n\r\n                    if (pProgress != NULL)\r\n                        pProgress->notify(ckcore::Progress::ckWARNING,lngGetString(ERROR_SECTOR),l + j);\t\r\n                }\r\n            }\r\n        }\r\n\r\n        if (!pReadFunction->Process(pReadBuffer,ulReadCount))\r\n        {\r\n            g_pLogDlg->print_line(_T(\"  Error: Unable to process read data.\"));\r\n\r\n            delete [] pReadBuffer;\r\n            return false;\r\n        }\r\n\r\n        if (pProgress != NULL)\r\n            pProgress->set_progress((unsigned char)(((double)l/ulEndBlock) * 100));\r\n        ulWritten += ulReadCount;\r\n    }\r\n\r\n    delete [] pReadBuffer;\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/app/core/core2_read.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/stream.hh>\r\n#include <ckmmc/device.hh>\r\n#include \"advanced_progress.hh\"\r\n\r\n#define CORE2_READ_RETRYCOUNT\t\t\t1\r\n#define CORE2_READ_MAXFRAMESIZE\t\t\t(2352 + 96 + 296)\t// Mainchannel + RAW P-W subchannel + C2 block information.\r\n#define CORE2_READ_BLOCKCOUNT\t\t\t20\t\t\t\t\t// Read 20 blocks at a time.\r\n\r\nnamespace Core2ReadFunction\r\n{\r\n    class CReadFunction\r\n    {\r\n    private:\r\n        ckmmc::Device &m_Device;\r\n\r\n    protected:\r\n        enum eMainChannelData\r\n        {\r\n            MCD_NONE = 0x00,\r\n            MCD_USERDATA = 0x10\r\n        };\r\n\r\n        enum eSubChannelData\r\n        {\r\n            SCD_NONE,\r\n            SCD_FORMATTEDQ,\r\n            SCD_DEINTERLEAVED_RW\r\n        };\r\n\r\n        enum eC2ErrorInfo\r\n        {\r\n            C2EI_NONE = 0x0,\r\n            C2EI_BITS = 0x2,\t\t\t// 294 bytes.\r\n            C2EI_BLOCKANDBITS = 0x4,\t// 296 bytes.\r\n        };\r\n\r\n        bool ReadCD(unsigned char *pBuffer,unsigned long ulAddress,unsigned long ulBlockCount,\r\n            eMainChannelData MCD,eSubChannelData SCD,eC2ErrorInfo ErrorInfo);\r\n\r\n    public:\r\n        CReadFunction(ckmmc::Device &Device);\r\n\r\n        virtual bool Read(unsigned char *pBuffer,unsigned long ulAddress,\r\n            unsigned long ulBlockCount) = 0;\r\n        virtual bool Process(unsigned char *pBuffer,unsigned long ulBlockCount) = 0;\r\n        virtual unsigned long GetFrameSize() = 0;\r\n    };\r\n\r\n    class CReadUserData : public CReadFunction\r\n    {\r\n    private:\r\n        ckcore::OutStream *m_pOutStream;\r\n        unsigned long m_ulFrameSize;\r\n\r\n    public:\r\n        CReadUserData(ckmmc::Device &Device,ckcore::OutStream *pOutStream);\r\n        ~CReadUserData();\r\n\r\n        bool Read(unsigned char *pBuffer,unsigned long ulAddress,\r\n            unsigned long ulBlockCount);\r\n        bool Process(unsigned char *pBuffer,unsigned long ulBlockCount);\r\n        unsigned long GetFrameSize();\r\n    };\r\n\r\n    class CReadRaw\r\n    {\r\n    };\r\n\r\n    class CReadC2 : public CReadFunction\r\n    {\r\n    private:\r\n        unsigned long m_ulErrSecCount;\r\n        unsigned long m_ulErrByteCount;\r\n        unsigned __int64 m_uiTotalBytes;\r\n\r\n        unsigned char NumBits(unsigned char ucData);\r\n\r\n    public:\r\n        CReadC2(ckmmc::Device &Device);\r\n        ~CReadC2();\r\n\r\n        bool Read(unsigned char *pBuffer,unsigned long ulAddress,\r\n            unsigned long ulBlockCount);\r\n        bool Process(unsigned char *pBuffer,unsigned long ulBlockCount);\r\n        unsigned long GetFrameSize();\r\n    };\r\n}\r\n\r\nclass CCore2Read\r\n{\r\nprivate:\r\n    enum eSubChannelData\r\n    {\r\n        SUBCHANNELDATA_NONE,\r\n        SUBCHANNELDATA_FORMATTEDQ,\r\n        SUBCHANNELDATA_DEINTERLEAVED_RW\r\n    };\r\n\r\n    bool RetryReadBlock(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        Core2ReadFunction::CReadFunction *pReadFunction,unsigned char *pBuffer,\r\n        unsigned long ulAddress);\r\n\r\npublic:\r\n    CCore2Read();\r\n    ~CCore2Read();\r\n\r\n    bool ReadData(ckmmc::Device &Device,CAdvancedProgress *pProgress,\r\n        Core2ReadFunction::CReadFunction *pReadFunction,unsigned long ulStartBlock,\r\n        unsigned long ulNumBlocks,bool bIgnoreErr);\r\n};\r\n"
  },
  {
    "path": "src/app/core/core2_stream.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"core2_read.hh\"\r\n#include \"core2_stream.hh\"\r\n\r\nCCore2InStream::CCore2InStream(ckcore::Log *pLog,ckmmc::Device &Device,\r\n                               unsigned long ulStartBlock,unsigned long ulEndBlock) :\r\n    m_pLog(pLog),m_Device(Device),m_ReadFunc(Device,&m_Stream),m_ulStartBlock(ulStartBlock),\r\n    m_ulEndBlock(ulEndBlock),m_ulCurBlock(ulStartBlock)\r\n{\r\n    m_ulBufferData = 0;\r\n    m_ulBufferPos = 0;\r\n    m_ulBufferSize = m_ReadFunc.GetFrameSize() * CORE2_INSTREAM_FRAMEFACTOR;\r\n    m_pBuffer = new unsigned char[m_ulBufferSize];\r\n\r\n    m_Stream.SetBuffer(m_pBuffer,m_ulBufferSize);\r\n}\r\n\r\nCCore2InStream::~CCore2InStream()\r\n{\r\n    if (m_pBuffer != NULL)\r\n    {\r\n        delete [] m_pBuffer;\r\n        m_pBuffer = NULL;\r\n\r\n        m_ulBufferSize = 0;\r\n    }\r\n}\r\n\r\nunsigned long CCore2InStream::GetSafeFrameReadCount()\r\n{\r\n    if (m_ulEndBlock - m_ulCurBlock < CORE2_INSTREAM_FRAMEFACTOR)\r\n        return m_ulEndBlock - m_ulCurBlock;\r\n    else\r\n        return CORE2_INSTREAM_FRAMEFACTOR;\r\n}\r\n\r\n/*\r\n    Not to be confused with other BytesToSector functions that calculates\r\n    The number of sectors to store the specified number of bytes. This function\r\n    calculates in which frame the last byte is stored.\r\n*/\r\nunsigned long CCore2InStream::BytesToFrame(unsigned __int64 uiBytes)\r\n{\r\n    if (uiBytes == 0)\r\n        return 0;\r\n\r\n    unsigned long ulSectors = 0;\r\n\r\n    while (uiBytes > m_ReadFunc.GetFrameSize())\r\n    {\r\n        uiBytes -= m_ReadFunc.GetFrameSize();\r\n        ulSectors++;\r\n    }\r\n\r\n    return ulSectors;\r\n}\r\n\r\nbool CCore2InStream::FillBuffer()\r\n{\r\n    unsigned long ulNumFrames = GetSafeFrameReadCount();\r\n    if (!m_Read.ReadData(m_Device,NULL,&m_ReadFunc,m_ulCurBlock,ulNumFrames,false))\r\n    {\r\n        m_pLog->print_line(_T(\"  Error: Unable to read user data from disc (%u, %u).\"),\r\n            m_ulCurBlock,ulNumFrames);\r\n        return false;\r\n    }\r\n\r\n    m_ulBufferData = m_Stream.GetBufferDataSize();\r\n    m_ulBufferPos = 0;\r\n\r\n    m_ulCurBlock += ulNumFrames;\r\n\r\n    return true;\r\n}\r\n\r\nckcore::tint64 CCore2InStream::read(void *pBuffer,ckcore::tuint32 uiCount)\r\n{\r\n    if (end())\r\n        return -1;\t// W00t? This was discovered when switching to ckcore.\r\n\r\n    ckcore::tint64 iResult = 0;\r\n\r\n    // Check if the requested data can be found in the buffer.\r\n    if (uiCount <= m_ulBufferData - m_ulBufferPos)\r\n    {\r\n        memcpy(pBuffer,m_pBuffer + m_ulBufferPos,uiCount);\r\n        m_ulBufferPos += uiCount;\r\n\r\n        iResult = uiCount;\r\n    }\r\n    else\r\n    {\r\n        // First copy everything we have in the buffer.\r\n        unsigned long ulInBuffer = m_ulBufferData - m_ulBufferPos;\r\n\r\n        memcpy(pBuffer,m_pBuffer + m_ulBufferPos,ulInBuffer);\r\n        m_ulBufferPos += ulInBuffer;\r\n\r\n        unsigned long ulRemain = uiCount - ulInBuffer;\r\n\r\n        if (end())\r\n            return ulInBuffer;\r\n\r\n        // Check if we can read more from the CD.\r\n        if (!FillBuffer())\r\n            return -1;\r\n\r\n        if (ulRemain > m_ulBufferData - m_ulBufferPos)\r\n        {\r\n            // FIXME: Is execution of this block possible?\r\n            unsigned long ulCanRead = m_ulBufferData - m_ulBufferPos;\r\n\r\n            memcpy((unsigned char *)pBuffer + ulInBuffer,m_pBuffer + m_ulBufferPos,ulCanRead);\r\n            m_ulBufferPos += ulCanRead;\r\n\r\n            iResult = ulInBuffer + ulCanRead;\r\n        }\r\n        else\r\n        {\r\n            memcpy((unsigned char *)pBuffer + ulInBuffer,m_pBuffer + m_ulBufferPos,ulRemain);\r\n            m_ulBufferPos += ulRemain;\r\n\r\n            iResult = uiCount;\r\n        }\r\n    }\r\n\r\n    return iResult;\r\n}\r\n\r\nckcore::tint64 CCore2InStream::size()\r\n{\r\n    return -1;\r\n}\r\n\r\nbool CCore2InStream::end()\r\n{\r\n    return m_ulCurBlock >= m_ulEndBlock && m_ulBufferPos >= m_ulBufferData;\r\n}\r\n\r\nbool CCore2InStream::seek(ckcore::tuint32 uiDistance,ckcore::InStream::StreamWhence Whence)\r\n{\r\n    if (Whence == ckcore::InStream::ckSTREAM_BEGIN)\r\n    {\r\n        unsigned long ulFrame = BytesToFrame(uiDistance);\r\n\r\n        // Calculate which sector the byte distance corresponds to.\r\n        m_ulCurBlock = m_ulStartBlock + ulFrame;\r\n\r\n        if (!FillBuffer())\r\n            return false;\r\n\r\n        m_ulBufferPos = (unsigned long)(uiDistance - ulFrame * m_ReadFunc.GetFrameSize());\r\n        return true;\r\n    }\r\n    else\r\n    {\r\n        // Check if we can just move forward in the internal buffer.\r\n        if (uiDistance < m_ulBufferData - m_ulBufferPos)\r\n        {\r\n            m_ulBufferPos += (unsigned long)uiDistance;\r\n        }\r\n        else\r\n        {\r\n            // In which internal frame are we?\r\n            unsigned long ulFrame = BytesToFrame(m_ulBufferPos);\r\n\r\n            // Search through the current frame.\r\n            ulFrame++;\r\n            __int64 iRemain = uiDistance - (m_ulBufferData - m_ulBufferPos);\r\n\r\n            // How many more frames should we move through.\r\n            ulFrame += BytesToFrame(iRemain);\r\n\r\n            m_ulCurBlock = m_ulStartBlock + ulFrame;\r\n\r\n            if (!FillBuffer())\r\n                return false;\r\n\r\n            m_ulBufferPos = (unsigned long)(iRemain - ulFrame * m_ReadFunc.GetFrameSize());\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/app/core/core2_stream.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/stream.hh>\r\n#include <ckcore/log.hh>\r\n#include \"core2_read.hh\"\r\n\r\n#define CORE2_INSTREAM_FRAMEFACTOR\t\t\t10\t// We will cache 10 frames in the memory.\r\n\r\nclass CCore2InStream : public ckcore::InStream\r\n{\r\nprivate:\r\n    class CInternalStream : public ckcore::OutStream\r\n    {\r\n    private:\r\n        unsigned char *m_pBuffer;\r\n        unsigned long m_ulBufferSize;\r\n        unsigned long m_ulBufferData;\r\n\r\n    public:\r\n        CInternalStream() : m_pBuffer(NULL),m_ulBufferSize(0),m_ulBufferData(0)\r\n        {\r\n        }\r\n\r\n        void SetBuffer(unsigned char *pBuffer,unsigned long ulBufferSize)\r\n        {\r\n            m_pBuffer = pBuffer;\r\n            m_ulBufferSize = ulBufferSize;\r\n        }\r\n\r\n        ckcore::tint64 write(const void *pBuffer,ckcore::tuint32 uiCount)\r\n        {\r\n            if (m_pBuffer == NULL)\r\n                return -1;\r\n\r\n            if (m_ulBufferSize < uiCount)\r\n                return -1;\r\n\r\n            memcpy(m_pBuffer,pBuffer,uiCount);\r\n            m_ulBufferData = uiCount;\r\n\r\n            return uiCount;\r\n        }\r\n\r\n        unsigned long GetBufferDataSize()\r\n        {\r\n            return m_ulBufferData;\r\n        }\r\n    };\r\n    CInternalStream m_Stream;\r\n\r\n    unsigned char *m_pBuffer;\r\n    unsigned long m_ulBufferSize;\r\n    unsigned long m_ulBufferData;\t\t// The amount of data that's stored in the buffer.\r\n    unsigned long m_ulBufferPos;\r\n\r\n    const unsigned long m_ulStartBlock;\t// The start sector to use as beginning of the stream.\r\n    const unsigned long m_ulEndBlock;\t// The last sector.\r\n    unsigned long m_ulCurBlock;\r\n\r\n    ckcore::Log *m_pLog;\r\n    ckmmc::Device &m_Device;\r\n\r\n    Core2ReadFunction::CReadUserData m_ReadFunc;\r\n    CCore2Read m_Read;\r\n\r\n    unsigned long GetSafeFrameReadCount();\r\n    unsigned long BytesToFrame(unsigned __int64 uiBytes);\r\n    bool FillBuffer();\r\n\r\npublic:\r\n    CCore2InStream(ckcore::Log *pLog,ckmmc::Device &Device,\r\n        unsigned long ulStartBlock,unsigned long ulEndBlock);\r\n    ~CCore2InStream();\r\n\r\n    // ckCore::InStream.\r\n    ckcore::tint64 read(void *pBuffer,ckcore::tuint32 uiCount);\r\n    ckcore::tint64 size();\r\n    bool end();\r\n    bool seek(ckcore::tuint32 uiDistnace,ckcore::InStream::StreamWhence Whence);\r\n};"
  },
  {
    "path": "src/app/core/core2_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"scsi.hh\"\r\n#include \"core2_util.hh\"\r\n\r\n/**\r\n    Parses the specified sense buffer and returns a value representing the\r\n    specific error.\r\n    @param pSenseBuf a pointer to the sense buffer, it should be atleast 24\r\n    bytes long\r\n    @return the correcsponding internal error value.\r\n*/\r\nunsigned char CheckSense(unsigned char *pSenseBuf)\r\n{\r\n    // Sense key.\r\n    switch (pSenseBuf[2] & 0x0F)\r\n    {\r\n        case 0x02:\r\n            {\r\n                // Additional sense code.\r\n                switch (pSenseBuf[12])\r\n                {\r\n                    case 0x04:\r\n                        {\r\n                            // Additional sense code qualifier.\r\n                            switch (pSenseBuf[13])\r\n                            {\r\n                                case 0x04:\r\n                                    return SENSE_FORMATINPROGRESS;\r\n\r\n                                case 0x08:\r\n                                    return SENSE_LONGWRITEINPROGRESS;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            break;\r\n\r\n        case 0x05:\r\n            {\r\n                // Additional sense code.\r\n                switch (pSenseBuf[12])\r\n                {\r\n                    case 0x64:\r\n                        {\r\n                            switch (pSenseBuf[13])\r\n                            {\r\n                                case 0x00:\r\n                                    return SENSE_ILLEGALMODEFORTHISTRACK;\r\n\r\n                                case 0x01:\r\n                                    return SENSE_INVALIDPACKETSIZE;\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n            break;\r\n    }\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/core/core2_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n\r\n#define SENSE_FORMATINPROGRESS\t\t\t0x01\r\n#define SENSE_LONGWRITEINPROGRESS\t\t0x02\r\n#define SENSE_ILLEGALMODEFORTHISTRACK\t0x03\r\n#define SENSE_INVALIDPACKETSIZE\t\t\t0x04\r\n\r\nunsigned char CheckSense(unsigned char *pSenseBuf);\r\n"
  },
  {
    "path": "src/app/core/diagnostics.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"settings.hh\"\r\n#include \"core.hh\"\r\n#include \"diagnostics.hh\"\r\n\r\nCDiagnostics g_Diagnostics;\r\n\r\nCDiagnostics::CDiagnostics()\r\n{\r\n}\r\n\r\nCDiagnostics::~CDiagnostics()\r\n{\r\n}\r\n\r\nvoid CDiagnostics::event_output(const std::string &block)\r\n{\r\n    // Always skip the copyright line.\r\n    if (!strncmp(block.c_str(),CDRTOOLS_COPYRIGHT,CDRTOOLS_COPYRIGHT_LENGTH))\r\n        return;\r\n\r\n    g_pLogDlg->print(_T(\"   > \"));\r\n    g_pLogDlg->print_line(ckcore::string::ansi_to_auto<1024>(block.c_str()).c_str());\r\n}\r\n\r\nvoid CDiagnostics::event_finished()\r\n{\r\n    g_pLogDlg->print_line(_T(\"CDiagnostics::ProcessEnded\"));\r\n    g_pLogDlg->print_line(_T(\"\"));\r\n}\r\n\r\nbool CDiagnostics::DeviceScan()\r\n{\r\n    g_pLogDlg->print_line(_T(\"CDiagnostics::DeviceScan\"));\r\n\r\n    TCHAR szCommandLine[MAX_PATH];\r\n    lstrcpy(szCommandLine,_T(\"\\\"\"));\r\n    lstrcat(szCommandLine,g_GlobalSettings.m_szCDRToolsPath);\r\n    lstrcat(szCommandLine,_T(CORE_WRITEAPP));\r\n#ifdef CDRKIT\r\n    lstrcat(szCommandLine,_T(\"\\\" -devices\"));\r\n#else\r\n    lstrcat(szCommandLine,_T(\"\\\" -scanbus\"));\r\n#endif\r\n\r\n    if (!create(szCommandLine))\r\n        return false;\r\n\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/core/diagnostics.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/process.hh>\r\n\r\nclass CDiagnostics : public ckcore::Process\r\n{\r\nprivate:\r\n    // Events.\r\n    void event_output(const std::string &block);\r\n    void event_finished();\r\n\r\npublic:\r\n    CDiagnostics();\r\n    ~CDiagnostics();\r\n\r\n    bool DeviceScan();\r\n};\r\n\r\nextern CDiagnostics g_Diagnostics;\r\n"
  },
  {
    "path": "src/app/core/scsi.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"scsi.hh\"\r\n"
  },
  {
    "path": "src/app/core/scsi.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// SCSI statuses.\r\n#define SCSISTAT_GOOD\t\t\t\t\t\t\t0x00\r\n#define SCSISTAT_CHECK_CONDITION\t\t\t\t0x02\r\n#define SCSISTAT_CONDITION_MET\t\t\t\t\t0x04\r\n#define SCSISTAT_BUSY\t\t\t\t\t\t\t0x08\r\n#define SCSISTAT_INTERMEDIATE\t\t\t\t\t0x10\r\n#define SCSISTAT_INTERMEDIATE_COND_MET\t\t\t0x14\r\n#define SCSISTAT_RESERVATION_CONFLICT\t\t\t0x18\r\n#define SCSISTAT_COMMAND_TERMINATED\t\t\t\t0x22\r\n#define SCSISTAT_QUEUE_FULL\t\t\t\t\t\t0x28\r\n\r\n// SCSI commands.\r\n#define SCSI_INQUIRY\t\t\t\t\t\t\t0x12\r\n#define SCSI_READ_CAPACITY\t\t\t\t\t\t0x25\r\n#define SCSI_READ_TOC_PMA_ATIP\t\t\t\t\t0x43\r\n#define SCSI_GET_CONFIGURATION\t\t\t\t\t0x46\r\n#define SCSI_READ_DISC_INFORMATION\t\t\t\t0x51\r\n#define SCSI_READ_DISC_STRUCTURE\t\t\t\t0xAD\r\n#define SCSI_READ_FORMAT_CAPACITIES\t\t\t\t0x23\r\n#define SCSI_FORMAT_UNIT\t\t\t\t\t\t0x04\r\n#define SCSI_GET_EVENT_STATUS_NOTIFICATION\t\t0x4A\r\n#define SCSI_TEST_UNIT_READY\t\t\t\t\t0x00\r\n#define SCSI_START_STOP_UNIT\t\t\t\t\t0x1B\r\n#define SCSI_CLOSE_TRACK_SESSION\t\t\t\t0x5B\r\n#define SCSI_PREVENTALLOW_MEDIUM_REMOVAL\t\t0x1E\r\n#define SCSI_GET_PERFORMANCE\t\t\t\t\t0xAC\r\n#define SCSI_SET_CD_SPEED\t\t\t\t\t\t0xBB\r\n#define SCSI_BLANK\t\t\t\t\t\t\t\t0xA1\r\n#define SCSI_MODE_SENSE10\t\t\t\t\t\t0x5A\r\n#define SCSI_MODE_SELECT10\t\t\t\t\t\t0x55\r\n#define SCSI_REQUEST_SENSE\t\t\t\t\t\t0x03\r\n#define SCSI_READ_CD\t\t\t\t\t\t\t0xBE\r\n#define SCSI_READ_TRACK_INFORMATION\t\t\t\t0x52\r\n\r\n// Profiles.\r\n#define PROFILE_NONE\t\t\t\t\t\t\t0x0000\r\n#define PROFILE_NONREMOVABLE\t\t\t\t\t0x0001\r\n#define PROFILE_REMOVABLE\t\t\t\t\t\t0x0002\r\n#define PROFILE_MOPTIC_E\t\t\t\t\t\t0x0003\r\n#define PROFILE_OPTIC_WO\t\t\t\t\t\t0x0004\r\n#define PROFILE_AS_MO\t\t\t\t\t\t\t0x0005\r\n#define PROFILE_CDROM\t\t\t\t\t\t\t0x0008\r\n#define PROFILE_CDR\t\t\t\t\t\t\t\t0x0009\r\n#define PROFILE_CDRW\t\t\t\t\t\t\t0x000A\r\n#define PROFILE_DVDROM\t\t\t\t\t\t\t0x0010\r\n#define PROFILE_DVDMINUSR_SEQ\t\t\t\t\t0x0011\r\n#define PROFILE_DVDRAM\t\t\t\t\t\t\t0x0012\r\n#define PROFILE_DVDMINUSRW_RESTOV\t\t\t\t0x0013\r\n#define PROFILE_DVDMINUSRW_SEQ\t\t\t\t\t0x0014\r\n#define PROFILE_DVDMINUSR_DL_SEQ\t\t\t\t0x0015\r\n#define PROFILE_DVDMINUSR_DL_JUMP\t\t\t\t0x0016\r\n#define PROFILE_DVDPLUSRW\t\t\t\t\t\t0x001A\r\n#define PROFILE_DVDPLUSR\t\t\t\t\t\t0x001B\r\n//#define PROFILE_DDCDROM\t\t\t\t\t\t0x0020\r\n//#define PROFILE_DDCDR\t\t\t\t\t\t\t0x0021\r\n//#define PROFILE_DDCDRW\t\t\t\t\t\t0x0022\r\n#define PROFILE_DVDPLUSRW_DL\t\t\t\t\t0x002A\r\n#define PROFILE_DVDPLUSR_DL\t\t\t\t\t\t0x002B\r\n#define PROFILE_BDROM\t\t\t\t\t\t\t0x0040\r\n#define PROFILE_BDR_SRM\t\t\t\t\t\t\t0x0041\r\n#define PROFILE_BDR_RRM\t\t\t\t\t\t\t0x0042\r\n#define PROFILE_BDRE\t\t\t\t\t\t\t0x0043\r\n#define PROFILE_HDDVDROM\t\t\t\t\t\t0x0050\r\n#define PROFILE_HDDVDR\t\t\t\t\t\t\t0x0051\r\n#define PROFILE_HDDVDRAM\t\t\t\t\t\t0x0052\r\n#define PROFILE_NONSTANDARD\t\t\t\t\t\t0xFFFF\r\n\r\n// Sense keys.\r\n#define\tSENSEKEY_NO_SENSE\t\t\t\t\t\t0x00\r\n#define SENSEKEY_RECOVERED_ERROR\t\t\t\t0x01\r\n#define SENSEKEY_NOT_READY\t\t\t\t\t\t0x02\r\n#define SENSEKEY_MEDIUM_ERROR\t\t\t\t\t0x03\t\t// Non recoverable error.\r\n#define SENSEKEY_HARDWARE_ERROR\t\t\t\t\t0x04\t\t// Non recoverable error.\r\n#define SENSEKEY_ILLEGAL_REQUEST\t\t\t\t0x05\r\n#define SENSEKEY_UNIT_ATTENTION\t\t\t\t\t0x06\r\n#define SENSEKEY_DATA_PROTECT\t\t\t\t\t0x07\r\n#define SENSEKEY_BLANK_CHECK\t\t\t\t\t0x08\r\n#define SENSEKEY_VENDOR_SPECIFIC\t\t\t\t0x09\r\n#define SENSEKEY_COPY_ABORTED\t\t\t\t\t0x0A\r\n#define SENSEKEY_ABORTED_COMMAND\t\t\t\t0x0B\r\n#define SENSEKEY_EQUAL\t\t\t\t\t\t\t0x0C\t\t// Obsolete.\r\n#define SENSEKEY_VOLUME_OVERFLOW\t\t\t\t0x0D\r\n#define SENSEKEY_MISCOMPARE\t\t\t\t\t\t0x0E\r\n#define SENSEKEY_RESERVED\t\t\t\t\t\t0x0F\r\n\r\n// Data block types (mode page 5).\r\n#define DATABLOCK_RAW\t\t\t\t\t\t\t0x00\t// 2352 bytes raw data.\r\n#define DATABLOCK_RAW_PQ\t\t\t\t\t\t0x01\t// Raw data with P and Q Sub-channel.\r\n#define DATABLOCK_RAW_PW\t\t\t\t\t\t0x02\t// Raw data with P-W Sub-channel.\r\n#define DATABLOCK_RAW_PW_R\t\t\t\t\t\t0x03\t// Raw data with P-W Sub-channel.\r\n#define DATABLOCK_MODE1\t\t\t\t\t\t\t0x08\t// Mode 1 (ISO/IEC 10149): 2048 bytes of user data.\r\n#define DATABLOCK_MODE2\t\t\t\t\t\t\t0x09\t// Mode 2 (ISO/IEC 10149): 2336 bytes of user data.\r\n#define DATABLOCK_MODE2_XA\t\t\t\t\t\t0x0A\t// Mode 2 (CD-ROM XA, form 1): 2048 bytes of user data, sub-header from write parameters.\r\n#define DATABLOCK_MODE2_XA_F1\t\t\t\t\t0x0B\t// Mode 2 (CD-ROM XA, form 1): 8 bytes of sub-header, 2 048 bytes of user data.\r\n#define DATABLOCK_MODE2_XA_F2\t\t\t\t\t0x0C\t// Mode 2 (CD-ROM XA, form 2): 2324 bytes of user data, sub-header is taken from write parameters.\r\n#define DATABLOCK_MODE2_XA_MIX\t\t\t\t\t0x0D\t// Mode 2 (CD-ROM XA, form 1, form 2, or mixed form): 8 bytes of sub-header, 2324 bytes of user data.\r\n"
  },
  {
    "path": "src/app/ctrl_messages.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n/*\r\n    WM_SETDEVICE\r\n    ------------\r\n    Sets the device to the device pointer of lParam.\r\n    Supported windows: CBurnImageDlg and CCopyDiscDlg.\r\n    If wParam = 1  when sending to a CCopyDiscDlg window the source device\r\n    index is set instead of the (default) target device index.\r\n*/\r\n#define WM_SETDEVICE\t\t\t\t\tWM_APP +  0\r\n\r\n/*\r\n    WM_GETDEVICE\r\n    ------------\r\n    Returns the device pointer.\r\n    Supported windows: CBurnImageDlg and CCopyDiscDlg.\r\n    If wParam = 1 when sending to a CCopyDiscDlg window the source device index\r\n    is returned instead of the target device index (which is default).\r\n*/\r\n#define WM_GETDEVICE\t\t\t\t\tWM_APP +  1\r\n\r\n/*\r\n    WM_SETCLONEMODE\r\n    ---------------\r\n    Sent to the host of a CCopyDiscGeneralPage class when the clone check box\r\n    checked. wParam is true if the check box is checked and false if it's\r\n    unchecked.\r\n*/\r\n#define WM_SETCLONEMODE\t\t\t\t\tWM_APP +  2\r\n\r\n/*\r\n    Messages associated with the CShellListViewCtrl control.\r\n*/\r\n#define WM_SLVC_BROWSEOBJECT\t\t\tWM_APP +  8\r\n#define WM_SLVC_DONEBROWSEOBJECT\t\tWM_APP +  9\r\n#define WM_SLVC_CHANGEFOLDER\t\t\tWM_APP + 10\r\n#define WM_SLVC_CHANGEFOLDERLINK\t\tWM_APP + 11\r\n#define WM_SLVC_FILECOMMAND\t\t\t\tWM_APP + 12\r\n\r\n/*\r\n    WM_CHC_SETSORTCOLUMN\r\n    --------------------\r\n    Set to the CCustomHeaderCtrl object to select which column that should be\r\n    drawn with a sort arrow. wParams specifies the index of the column and\r\n    lParam the sort direction (0 for up and 1 for down).\r\n*/\r\n#define WM_CHC_SETSORTCOLUMN\t\t\tWM_APP + 14\r\n\r\n/*\r\n    WM_SHELLCHANGE\r\n    --------------\r\n    Sent by CDirectoryMonitor when there has been a change in a directory.\r\n*/\r\n#define WM_SHELLCHANGE\t\t\t\t\tWM_APP + 15\r\n\r\n/*\r\n    WM_CONTROLCUSTOMDRAW\r\n    --------------------\r\n    Custom custom draw message sent to a control implementation that needs to\r\n    be custom drawn. Lparam is a pointer to a NMLVCUSTOMDRAW structure.\r\n*/\r\n#define WM_CONTROLCUSTOMDRAW\t\t\tWM_APP + 16\r\n\r\n/*\r\n    WM_CHECKMEDIA_BROADCAST\r\n    -----------------------\r\n    Sent to a window parent to make it broad cast a WM_CHECKMEDIA message to all\r\n    it's children (pages only). lParam is the pointer to the currently selected\r\n    device.\r\n*/\r\n#define WM_CHECKMEDIA_BROADCAST\t\t\tWM_APP + 17\r\n\r\n/*\r\n    WM_CHECKMEDIA\r\n    -------------\r\n    Sent to a page whenever the media information should be updated. lParam is the\r\n    device pointer to the currently selected device.\r\n*/\r\n#define WM_CHECKMEDIA\t\t\t\t\tWM_APP + 18\r\n\r\n/*\r\n    WM_LABELCONTAINER_CLOSE\r\n    -----------------------\r\n    Sent to the host of a label container control when the close button is\r\n    pressed.\r\n*/\r\n#define WM_LABELCONTAINER_CLOSE\t\t\tWM_APP + 19\r\n\r\n/*\r\n    Sent to the host of the file system property page when changing the file\r\n    system. wParam is the previously selected file system and lParam is the\r\n    file system identifier as defined in Settings.h.\r\n*/\r\n#define WM_SETFILESYSTEM\t\t\t\tWM_APP + 20\r\n\r\n// Used by class CSpaceMeter.\r\n#define WMU_SPACE_METER_DELAYED_UPDATE\tWM_APP + 21"
  },
  {
    "path": "src/app/dialog/about_window.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/crcstream.hh>\r\n#include <ckcore/filestream.hh>\r\n#include <base/graph_util.hh>\r\n#include <base/string_util.hh>\r\n#include \"resource.h\"\r\n#include \"settings.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"version.hh\"\r\n#include \"core.hh\"\r\n#include \"about_window.hh\"\r\n\r\n#define ABOUT_YEARS\t\t\t_T(\"2006-2012\")\r\n#define ABOUT_STR(str)\t\tstr,(sizeof(str)/sizeof(TCHAR))-1\r\n\r\n/*\r\n * Defines the supported cdrtools versions. These versions are determined by\r\n * the CRC-32 checksum of cdrecord.exe.\r\n */\r\ntypedef struct\r\n{\r\n    ckcore::tuint32 uiChecksum;\r\n    const TCHAR *szVersion;\r\n} tCdrtoolsChecksumVer;\r\n\r\nsize_t g_CdrtoolsChecksumVerCount = 1;\r\ntCdrtoolsChecksumVer g_CdrtoolsChecksumVer[1] =\r\n{\r\n    { 0xd47a1004,_T(\"2.01.01.a61\") }\r\n};\r\n\r\nCAboutWindow::CAboutWindow() :\r\n    m_VerFont(NULL),m_UrlFont(NULL),m_bUrlHover(false),\r\n    m_hWndParent(NULL),\r\n    m_pUpdateLayeredWindow(NULL)\r\n{\r\n    m_VerFont = AtlCreateBoldFont(AtlGetDefaultGuiFont());\r\n    \r\n    LOGFONT lf = { 0 };\r\n    if (::GetObject(AtlGetDefaultGuiFont(),sizeof(LOGFONT),&lf) == sizeof(LOGFONT))\r\n    {\r\n        lf.lfUnderline = 1;\r\n        m_UrlFont = ::CreateFontIndirect(&lf);\r\n    }\r\n\r\n    if (m_UrlFont == NULL)\r\n        m_UrlFont = AtlGetDefaultGuiFont();\r\n\r\n    // Load the function dynamically.\r\n    HMODULE hUser32 = GetModuleHandle(_T(\"USER32.DLL\"));\r\n    m_pUpdateLayeredWindow = (tUpdateLayeredWindow)GetProcAddress(hUser32,\"UpdateLayeredWindow\");\r\n}\r\n\r\nCAboutWindow::~CAboutWindow()\r\n{\r\n    if (m_VerFont != AtlGetDefaultGuiFont())\r\n        ::DeleteObject(m_VerFont);\r\n    if (m_UrlFont != AtlGetDefaultGuiFont())\r\n        ::DeleteObject(m_UrlFont);\r\n}\r\n\r\nvoid CAboutWindow::UpdateVersionInfo()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    unsigned long ulDummy;\r\n    unsigned long ulDataSize = GetFileVersionInfoSize(szFileName,&ulDummy);\r\n\r\n    if (ulDataSize != 0)\r\n    {\r\n        unsigned char *pBlock = new unsigned char[ulDataSize];\r\n\r\n        struct LANGANDCODEPAGE\r\n        {\r\n            unsigned short usLanguage;\r\n            unsigned short usCodePage;\r\n        } *pTranslate;\r\n\r\n        if (GetFileVersionInfo(szFileName,NULL,ulDataSize,pBlock) > 0)\r\n        {\r\n            // Get language information (only one language should be present).\r\n            VerQueryValue(pBlock,_T(\"\\\\VarFileInfo\\\\Translation\"),\r\n                (LPVOID *)&pTranslate,(unsigned int *)&ulDummy);\r\n\r\n            // Calculate the FileVersion sub block path.\r\n            lsprintf(m_szVersion,_T(\"\\\\StringFileInfo\\\\%04x%04x\\\\FileVersion\"),\r\n                     pTranslate[0].usLanguage,pTranslate[0].usCodePage);\r\n\r\n            unsigned char *pBuffer;\r\n            VerQueryValue(pBlock,m_szVersion,(LPVOID *)&pBuffer,(unsigned int *)&ulDataSize);\r\n\r\n            // Architecture.\r\n#ifdef _M_IA64\r\n            TCHAR *szArcStr = _T(\"IA64\");\r\n#elif defined _M_X64\r\n            TCHAR *szArcStr = _T(\"x64\");\r\n#else\r\n            TCHAR *szArcStr = _T(\"x86\");\r\n#endif\r\n\r\n            // Character coding.\r\n#ifdef PORTABLE\r\n            lsprintf(m_szVersion,_T(\"Version %s portable (unicode, %s)\"),\r\n                (TCHAR *)pBuffer,szArcStr);\r\n#else\r\n            lsprintf(m_szVersion,_T(\"Version %s (unicode, %s)\"),\r\n                (TCHAR *)pBuffer,szArcStr);\r\n#endif\r\n        }\r\n\r\n        delete [] pBlock;\r\n    }\r\n\r\n    // Update cdrtools version information.\r\n    m_szCdrtoolsVersion = _T(\"Installed version: Unknown\");\r\n\r\n    ckcore::Path CdrecordPath = g_GlobalSettings.m_szCDRToolsPath;\r\n    CdrecordPath += _T(CORE_WRITEAPP);\r\n    \r\n    ckcore::FileInStream CdrecordStream(CdrecordPath);\r\n    if (!CdrecordStream.open())\r\n        return;\r\n\r\n    ckcore::CrcStream CrcStream(ckcore::CrcStream::ckCRC_32);\r\n\r\n    if (!ckcore::stream::copy(CdrecordStream,CrcStream))\r\n        return;\r\n\r\n    for (size_t i = 0; i < g_CdrtoolsChecksumVerCount; i++)\r\n    {\r\n        if (g_CdrtoolsChecksumVer[i].uiChecksum == CrcStream.checksum())\r\n        {\r\n            m_szCdrtoolsVersion  = _T(\"Installed version: \");\r\n            m_szCdrtoolsVersion += g_CdrtoolsChecksumVer[i].szVersion;\r\n            m_szCdrtoolsVersion += _T(\" (officially supported)\");\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nLRESULT CAboutWindow::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Load a 32-bit transparent bitmap for Windows 2000 and newer systems.\r\n    if (m_pUpdateLayeredWindow != NULL)\r\n        LoadBitmaps();\r\n\r\n    SIZE sSplashBitmap;\r\n    m_SplashTmpBitmap.GetSize(sSplashBitmap);\r\n    SetWindowPos(HWND_TOPMOST,0,0,sSplashBitmap.cx,sSplashBitmap.cy,SWP_NOMOVE);\r\n\r\n    CenterWindow(HWND_DESKTOP);\r\n\r\n    // For per-pixel alpha transparency the window needs to be layered.\r\n    if (m_pUpdateLayeredWindow != NULL)\r\n        ModifyStyleEx(0,WS_EX_LAYERED);\r\n\r\n    Render();\r\n    return 0;\r\n}\r\n\r\nvoid CAboutWindow::RollbackBitmap()\r\n{\r\n    BITMAP bmpDstInfo;\r\n    m_SplashTmpBitmap.GetBitmap(&bmpDstInfo);\r\n\r\n    BITMAP bmbRefInfo;\r\n    m_SplashRefBitmap.GetBitmap(&bmbRefInfo);\r\n\r\n    unsigned char *pDstDataBits = (unsigned char *)bmpDstInfo.bmBits;\r\n    unsigned char *pSrcDataBits = (unsigned char *)bmbRefInfo.bmBits;\r\n\r\n    for (int y = 0; y < bmpDstInfo.bmHeight; y++)\r\n    {\r\n        unsigned char *pDstPixel = pDstDataBits + bmpDstInfo.bmWidth * 4 * y;\r\n        unsigned char *pSrcPixel = pSrcDataBits + bmbRefInfo.bmWidth * 4 * y;\r\n\r\n        for (int x = 0; x < bmpDstInfo.bmWidth; x++)\r\n        {\r\n            pDstPixel[0] = pSrcPixel[0];\r\n            pDstPixel[1] = pSrcPixel[1];\r\n            pDstPixel[2] = pSrcPixel[2];\r\n            pDstPixel[3] = pSrcPixel[3];\r\n\r\n            pDstPixel += 4;\r\n            pSrcPixel += 4;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CAboutWindow::Render()\r\n{\r\n    InvalidateRect(NULL);\r\n\r\n    // Process the message queue.\r\n    ProcessMessages();\r\n}\r\n\r\nLRESULT CAboutWindow::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CPaintDC dc(m_hWnd);\r\n\r\n    if (m_pUpdateLayeredWindow == NULL)\r\n        return 0;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    // FIXME: I have a good feeling that there is a much more efficient way to\r\n    //        achieve the requested behavior without manually copying the\r\n    //\t\t  reference bitmap.\r\n    RollbackBitmap();\r\n\r\n    HDC hMemDC = CreateCompatibleDC(dc);\r\n    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,m_SplashTmpBitmap);\r\n\r\n    RECT rcVersion  = { 37,115,390,145 };\r\n    DrawText(hMemDC,m_VerFont,&rcVersion,ABOUTWINDOW_TEXTCOLOR,\r\n             m_szVersion,lstrlen(m_szVersion));\r\n\r\n    RECT rcCopyright = { 37,145,390,175 };\r\n    DrawText(hMemDC,AtlGetDefaultGuiFont(),&rcCopyright,ABOUTWINDOW_TEXTCOLOR,\r\n             ABOUT_STR(_T(\"Copyright  \") ABOUT_YEARS _T(\" Christian Kindahl.\")));\r\n\r\n    RECT rcLegal = { 37,175,390,300 };\r\n    DrawText(hMemDC,AtlGetDefaultGuiFont(),&rcLegal,ABOUTWINDOW_TEXTCOLOR,\r\n             ABOUT_STR(_T(\"InfraRecorder comes with absolutely no warranty. \")\r\n                       _T(\"This is free software, and you are welcome to \")\r\n                       _T(\"redistribute it under certain conditions; please \")\r\n                       _T(\"see License.txt for more information.\")));\r\n\r\n    RECT rcThanks = { 37,230,390,260 };\r\n    DrawText(hMemDC,AtlGetDefaultGuiFont(),&rcThanks,ABOUTWINDOW_TEXTCOLOR,\r\n             ABOUT_STR(_T(\"Special thanks to R. Diez for his contributions.\")));\r\n\r\n    RECT rcCdrtools = { 37,260,390,320 };\r\n    DrawText(hMemDC,AtlGetDefaultGuiFont(),&rcCdrtools,ABOUTWINDOW_TEXTCOLOR,\r\n             ABOUT_STR(_T(\"InfraRecorder uses cdrecord, readcd and cdda2wav from \")\r\n                       _T(\"the cdrtools software suite. cdrtools copyright  \")\r\n                       _T(\"1995-2009 Jrg Schilling.\")));\r\n\r\n    RECT rcCdrtoolsVer = { 37,300,390,330 };\r\n    DrawText(hMemDC,AtlGetDefaultGuiFont(),&rcCdrtoolsVer,ABOUTWINDOW_TEXTCOLOR,\r\n             m_szCdrtoolsVersion.c_str(),static_cast<unsigned int>(m_szCdrtoolsVersion.size()));\r\n\r\n    RECT rcUrl = { ABOUTWINDOW_URL_LEFT,ABOUTWINDOW_URL_TOP,\r\n                   ABOUTWINDOW_URL_RIGHT,ABOUTWINDOW_URL_BOTTOM };\r\n    DrawText(hMemDC,m_bUrlHover ? m_UrlFont : AtlGetDefaultGuiFont(),\r\n             &rcUrl,ABOUTWINDOW_URLCOLOR,\r\n             ABOUT_STR(_T(\"http://infrarecorder.org\")));\r\n\r\n    DrawBitmap(dc,hMemDC);\r\n\r\n    SelectObject(hMemDC,hOldBitmap);\r\n\r\n    ReleaseDC(dc);\r\n    ReleaseDC(hMemDC);\r\n\r\n    return 0;\r\n}\r\n\r\nvoid CAboutWindow::DrawBitmap(HDC hScreenDC,HDC hMemDC)\r\n{\r\n    SIZE sSplashBitmap;\r\n    m_SplashTmpBitmap.GetSize(sSplashBitmap);\r\n\r\n    // Calculate window dimensions.\r\n    RECT rcWindow;\r\n    GetWindowRect(&rcWindow);\r\n\r\n    POINT ptWindowPos;\r\n    ptWindowPos.x = rcWindow.left;\r\n    ptWindowPos.y = rcWindow.top;\r\n\r\n    BLENDFUNCTION bfPixelFunction = { AC_SRC_OVER,0,255,AC_SRC_ALPHA };\r\n    POINT ptSource = { 0,0 };\r\n\r\n    m_pUpdateLayeredWindow(m_hWnd,hScreenDC,&ptWindowPos,&sSplashBitmap,\r\n                           hMemDC,&ptSource,0,&bfPixelFunction,ULW_ALPHA);\r\n}\r\n\r\n\r\nvoid CAboutWindow::DrawText(HDC hDC,HFONT hFont,RECT *pRect,\r\n                            COLORREF Color,const TCHAR *szText,\r\n                            int iTextLen)\r\n{\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,hFont);\r\n\r\n    ::SetBkMode(hDC,TRANSPARENT);\r\n    ::SetTextColor(hDC,Color);\r\n\r\n    ::DrawText(hDC,szText,iTextLen,pRect,\r\n        DT_LEFT | DT_END_ELLIPSIS | DT_WORDBREAK);\r\n\r\n    SelectObject(hDC,hOldFont);\r\n    \r\n    // Get bitmap information.\r\n    BITMAP bmpInfo;\r\n    m_SplashTmpBitmap.GetBitmap(&bmpInfo);\r\n\r\n    // Since the regular GDI functions (with a few exceptions) clear the alpha bit\r\n    // when they are used we need to set it, since we don't want to draw\r\n    // transparent text.\r\n    unsigned char *pDataBits = (unsigned char *)bmpInfo.bmBits;\r\n\r\n    int iStart = bmpInfo.bmHeight - pRect->bottom;\r\n    int iEnd = bmpInfo.bmHeight - pRect->top;\r\n\r\n    for (int y = iStart; y < iEnd; y++)\r\n    {\r\n        unsigned char *pPixel = pDataBits + bmpInfo.bmWidth * 4 * y;\r\n\r\n        pPixel += 4 * pRect->left;\r\n\r\n        for (int x = pRect->left; x < pRect->right; x++)\r\n        {\r\n            pPixel[3] = 0xFF;\r\n            pPixel += 4;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Utility function for loading the layered alpha bitmap into the specified\r\n * bitmap object.\r\n * @param [out] Bitmap The bitmap object to load the image into.\r\n */\r\nvoid CAboutWindow::LoadBitmap(CBitmap &Bitmap)\r\n{\r\n    // Load the bitmap.\r\n    HBITMAP hBitmap = (HBITMAP)LoadImage(_Module.GetModuleInstance(),MAKEINTRESOURCE(IDB_ABOUTBITMAP),\r\n        IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);\r\n    Bitmap.Attach(hBitmap);\r\n\r\n    // Precaclulate multiply the transparency.\r\n    BITMAP bmpInfo;\r\n    Bitmap.GetBitmap(&bmpInfo);\r\n\r\n    unsigned char *pDataBits = (unsigned char *)bmpInfo.bmBits;\r\n\r\n    for (int y = 0; y < bmpInfo.bmHeight; y++)\r\n    {\r\n        unsigned char *pPixel = pDataBits + bmpInfo.bmWidth * 4 * y;\r\n\r\n        for (int x = 0; x < bmpInfo.bmWidth; x++)\r\n        {\r\n            pPixel[0] = pPixel[0] * pPixel[3] / 255;\r\n            pPixel[1] = pPixel[1] * pPixel[3] / 255;\r\n            pPixel[2] = pPixel[2] * pPixel[3] / 255;\r\n\r\n            pPixel += 4;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CAboutWindow::LoadBitmaps()\r\n{\r\n    LoadBitmap(m_SplashTmpBitmap);\r\n    LoadBitmap(m_SplashRefBitmap);\r\n}\r\n\r\nLRESULT CAboutWindow::OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    if (iPosX > ABOUTWINDOW_URL_LEFT && iPosX < ABOUTWINDOW_URL_RIGHT &&\r\n        iPosY > ABOUTWINDOW_URL_TOP && iPosY < ABOUTWINDOW_URL_BOTTOM)\r\n    {\r\n        if (g_WinVer.m_ulMajorVersion >= MAJOR_WIN2000 &&\r\n            GetCursor() != LoadCursor(NULL,IDC_HAND))\r\n        {\r\n            SetCursor(LoadCursor(NULL,IDC_HAND));\r\n        }\r\n\r\n        bool bRender = !m_bUrlHover;\r\n        m_bUrlHover = true;\r\n\r\n        if (bRender)\r\n            Render();\r\n    }\r\n    else\r\n    {\r\n        if (GetCursor() != LoadCursor(NULL,IDC_ARROW))\r\n            SetCursor(LoadCursor(NULL,IDC_ARROW));\r\n\r\n        bool bRender = m_bUrlHover;\r\n        m_bUrlHover = false;\r\n\r\n        if (bRender)\r\n            Render();\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CAboutWindow::OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    int iPosX = GET_X_LPARAM(lParam); \r\n    int iPosY = GET_Y_LPARAM(lParam);\r\n\r\n    if (iPosX > ABOUTWINDOW_URL_LEFT && iPosX < ABOUTWINDOW_URL_RIGHT &&\r\n        iPosY > ABOUTWINDOW_URL_TOP && iPosY < ABOUTWINDOW_URL_BOTTOM)\r\n    {\r\n        ::ShellExecute(m_hWnd,_T(\"open\"),_T(\"http://infrarecorder.org\"),\r\n                       NULL,NULL,SW_SHOW);\r\n    }\r\n\r\n    // Re-enable the parent window.\r\n    if (m_hWndParent != NULL)\r\n        ::EnableWindow(m_hWndParent,TRUE);\r\n\r\n    DestroyWindow();\r\n    return 0;\r\n}\r\n\r\nvoid CAboutWindow::CreateAndShow(HWND hWndParent)\r\n{\r\n    UpdateVersionInfo();\r\n\r\n    // Windows 2000+ users may enjoy a real about Window while the others will\r\n    // have a simple message box for compatibility.\r\n    if (m_pUpdateLayeredWindow != NULL)\r\n    {\r\n        // Disable the parent window.\r\n        m_hWndParent = hWndParent;\r\n        ::EnableWindow(m_hWndParent,FALSE);\r\n\r\n        Create(hWndParent,CWindow::rcDefault);  \r\n        ShowWindow(true);\r\n        Render();\r\n    }\r\n    else\r\n    {\r\n        ckcore::tstring Message = m_szVersion;\r\n        Message += _T(\" copyright  \") ABOUT_YEARS _T(\" Christian Kindahl.\\n\\n\");\r\n        Message += _T(\"Please visit http://infrarecorder.org for more information.\");\r\n        ::MessageBox(hWndParent,Message.c_str(),_T(\"About InfraRecorder\"),\r\n                     MB_OK | MB_ICONINFORMATION);\r\n    }\r\n}"
  },
  {
    "path": "src/app/dialog/about_window.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define ABOUTWINDOW_TEXTCOLOR\t\t\t\t\tRGB(50,50,50)\r\n#define ABOUTWINDOW_URLCOLOR\t\t\t\t\tRGB(51,100,163)\r\n\r\n#define ABOUTWINDOW_URL_LEFT\t\t\t\t\t37\r\n#define ABOUTWINDOW_URL_TOP\t\t\t\t\t\t343\r\n#define ABOUTWINDOW_URL_RIGHT\t\t\t\t\t150\r\n#define ABOUTWINDOW_URL_BOTTOM\t\t\t\t\t373\r\n\r\n#if (_WIN32_WINNT < 0x0500)\r\n#define WS_EX_LAYERED\t\t\t\t\t\t\t0x00080000\r\n#define ULW_ALPHA\t\t\t\t\t\t\t\t0x00000002\r\n#endif\r\n\r\n#ifndef IDC_HAND\r\n#define IDC_HAND            MAKEINTRESOURCE(32649)\r\n#endif\r\n\r\ntypedef BOOL (WINAPI *tUpdateLayeredWindow)(HWND hWnd,HDC hdcDst,POINT *pptDst,\r\n                                            SIZE *psize,HDC hdcSrc,POINT *pptSrc,\r\n                                            COLORREF crKey,BLENDFUNCTION *pblend,\r\n                                            DWORD dwFlags);\r\n\r\nclass CAboutWindow : public CWindowImpl<CAboutWindow,CWindow,CWinTraits<WS_POPUP | WS_VISIBLE,WS_EX_TOOLWINDOW> >\r\n{\r\nprivate:\r\n    CBitmap m_SplashTmpBitmap;\r\n    CBitmap m_SplashRefBitmap;\r\n\r\n    HFONT m_VerFont;\r\n    HFONT m_UrlFont;\r\n    bool m_bUrlHover;\r\n\r\n    // Updated by the UpdateVersionInfo function.\r\n    TCHAR m_szVersion[128];\r\n    ckcore::tstring m_szCdrtoolsVersion;\r\n\r\n    HWND m_hWndParent;\r\n\r\n    void UpdateVersionInfo();\r\n    void RollbackBitmap();\r\n    void Render();\r\n\r\n    tUpdateLayeredWindow m_pUpdateLayeredWindow;\r\n    void DrawBitmap(HDC hScreenDC,HDC hMemDC);\r\n    void DrawText(HDC hDC,HFONT hFont,RECT *pRect,COLORREF Color,\r\n                  const TCHAR *szText,int iTextLen);\r\n\r\n    void LoadBitmap(CBitmap &Bitmap);\r\n    void LoadBitmaps();\r\n\r\npublic:\r\n    CAboutWindow();\r\n    ~CAboutWindow();\r\n\r\n    BEGIN_MSG_MAP(CAboutWindow)\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n        MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove);\r\n        MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnLButtonDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void CreateAndShow(HWND hWndParent);\r\n};\r\n\r\nextern CAboutWindow *g_pAboutWnd;"
  },
  {
    "path": "src/app/dialog/add_boot_image_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"add_boot_image_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\n/*\r\n    CAddBootImageDlg::CAddBootImageDlg\r\n    ----------------------------------\r\n    bEdit detemines if the title should state than a boot image is beeing\r\n    edited or if we're adding a new boot image to the project. It also determines\r\n    if the path edit should be enabled.\r\n*/\r\nCAddBootImageDlg::CAddBootImageDlg(CProjectBootImage *pBootImage,bool bEdit)\r\n{\r\n    m_bEdit = bEdit;\r\n    m_pBootImage = pBootImage;\r\n}\r\n\r\nCAddBootImageDlg::~CAddBootImageDlg()\r\n{\r\n}\r\n\r\nbool CAddBootImageDlg::Translate()\r\n{\r\n    // Set the title.\r\n    if (m_bEdit)\r\n        SetWindowText(lngGetString(TITLE_EDITBOOTIMAGE));\r\n\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a addbootimage translation section.\r\n    if (!pLng->EnterSection(_T(\"addbootimage\")))\r\n        return false;\r\n\r\n    TCHAR *szStrValue;\r\n\r\n    // Set the title.\r\n    if (!m_bEdit)\r\n    {\r\n        if (pLng->GetValuePtr(IDD_ADDBOOTIMAGEDLG,szStrValue))\r\n            SetWindowText(szStrValue);\r\n    }\r\n\r\n    // Translate the rest.\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_HELPBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_HELPBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_EMULATIONSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_EMULATIONSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_OPTIONSSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_OPTIONSSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_NOBOOTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_NOBOOTCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BOOTSEGMENTSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_BOOTSEGMENTSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BOOTSIZESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_BOOTSIZESTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CAddBootImageDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Set edit field length limit.\r\n    ::SendMessage(GetDlgItem(IDC_BOOTSEGMENTEDIT),EM_SETLIMITTEXT,MAX_BOOTLOAD_SIZE - 1,0);\r\n    ::SendMessage(GetDlgItem(IDC_BOOTSIZEEDIT),EM_SETLIMITTEXT,MAX_BOOTLOAD_SIZE - 1,0);\r\n\r\n    // Initialize the emulation combo box.\r\n    m_EmuCombo = GetDlgItem(IDC_EMULATIONCOMBO);\r\n    m_EmuCombo.AddString(lngGetString(BOOTEMU_NONE));\r\n    m_EmuCombo.AddString(lngGetString(BOOTEMU_FLOPPY));\r\n    m_EmuCombo.AddString(lngGetString(BOOTEMU_HARDDISK));\r\n    m_EmuCombo.SetCurSel(m_pBootImage->m_iEmulation);\r\n\r\n    BOOL bDummy;\r\n    OnEmuChange(NULL,NULL,NULL,bDummy);\r\n\r\n    // Setup the default settings.\r\n    CheckDlgButton(IDC_NOBOOTCHECK,m_pBootImage->m_bNoBoot);\r\n\r\n    TCHAR szBuffer[32];\r\n    lsnprintf_s(szBuffer,32,_T(\"0x%x\"),m_pBootImage->m_uiLoadSegment);\r\n    SetDlgItemText(IDC_BOOTSEGMENTEDIT,szBuffer);\r\n\r\n    lsnprintf_s(szBuffer,32,_T(\"0x%x\"),m_pBootImage->m_uiLoadSize);\r\n    SetDlgItemText(IDC_BOOTSIZEEDIT,szBuffer);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CAddBootImageDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Copy all information over to the CProjectBootImage object.\r\n    m_pBootImage->m_iEmulation = m_EmuCombo.GetCurSel();\r\n    m_pBootImage->m_bNoBoot = IsDlgButtonChecked(IDC_NOBOOTCHECK) == TRUE;\r\n\r\n    TCHAR szBuffer[MAX_BOOTLOAD_SIZE];\r\n    GetDlgItemText(IDC_BOOTSEGMENTEDIT,szBuffer,MAX_BOOTLOAD_SIZE - 1);\r\n    lsscanf(szBuffer,_T(\"0x%x\"),&m_pBootImage->m_uiLoadSegment);\r\n\r\n    GetDlgItemText(IDC_BOOTSIZEEDIT,szBuffer,MAX_BOOTLOAD_SIZE - 1);\r\n    lsscanf(szBuffer,_T(\"0x%x\"),&m_pBootImage->m_uiLoadSize);\r\n\r\n    TCHAR szTemp[32];\r\n    lsprintf(szTemp,_T(\"%d %d\"),m_pBootImage->m_uiLoadSegment,m_pBootImage->m_uiLoadSize);\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CAddBootImageDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CAddBootImageDlg::OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/add_boot_image.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}\r\n\r\nLRESULT CAddBootImageDlg::OnEmuChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (m_EmuCombo.GetCurSel() == PROJECTBI_BOOTEMU_NONE)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_NOBOOTCHECK),FALSE);\r\n\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSEGMENTSTATIC),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSEGMENTEDIT),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSIZESTATIC),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSIZEEDIT),TRUE);\r\n    }\r\n    else\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_NOBOOTCHECK),TRUE);\r\n\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSEGMENTSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSEGMENTEDIT),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSIZESTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOTSIZEEDIT),FALSE);\r\n    }\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/add_boot_image_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"settings.hh\"\r\n\r\nclass CAddBootImageDlg : public CDialogImpl<CAddBootImageDlg>\r\n{\r\nprivate:\r\n    bool m_bEdit;\r\n    CProjectBootImage *m_pBootImage;\r\n    CComboBox m_EmuCombo;\r\n\r\n    enum\r\n    {\r\n        MAX_BOOTLOAD_SIZE = 32\r\n    };\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_ADDBOOTIMAGEDLG };\r\n\r\n    CAddBootImageDlg(CProjectBootImage *pBootImage,bool bEdit);\r\n    ~CAddBootImageDlg();\r\n\r\n    BEGIN_MSG_MAP(CAddBootImageDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_ID_HANDLER(IDC_HELPBUTTON,OnHelp)\r\n        COMMAND_HANDLER(IDC_EMULATIONCOMBO,CBN_SELCHANGE,OnEmuChange)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnEmuChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/burn_advanced_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"burn_advanced_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCBurnAdvancedPage::CBurnAdvancedPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_ADVANCED,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCBurnAdvancedPage::~CBurnAdvancedPage()\r\n{\r\n    Detach();\r\n}\r\n\r\nbool CBurnAdvancedPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a burn translation section.\r\n    if (!pLng->EnterSection(_T(\"burn\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_OVERBURNCHECK,szStrValue))\r\n        SetDlgItemText(IDC_OVERBURNCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SWABCHECK,szStrValue))\r\n        SetDlgItemText(IDC_SWABCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_IGNORESIZECHECK,szStrValue))\r\n        SetDlgItemText(IDC_IGNORESIZECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_IMMEDCHECK,szStrValue))\r\n        SetDlgItemText(IDC_IMMEDCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_AUDIOMASTERCHECK,szStrValue))\r\n        SetDlgItemText(IDC_AUDIOMASTERCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FORCESPEEDCHECK,szStrValue))\r\n        SetDlgItemText(IDC_FORCESPEEDCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_VARIRECCHECK,szStrValue))\r\n        SetDlgItemText(IDC_VARIRECCHECK,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CBurnAdvancedPage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    g_BurnAdvancedSettings.m_bOverburn = IsDlgButtonChecked(IDC_OVERBURNCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bSwab = IsDlgButtonChecked(IDC_SWABCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bIgnoreSize = IsDlgButtonChecked(IDC_IGNORESIZECHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bImmed = IsDlgButtonChecked(IDC_IMMEDCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bAudioMaster = IsDlgButtonChecked(IDC_AUDIOMASTERCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bForceSpeed = IsDlgButtonChecked(IDC_FORCESPEEDCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_bVariRec = IsDlgButtonChecked(IDC_VARIRECCHECK) == TRUE;\r\n    g_BurnAdvancedSettings.m_iVariRec = m_VariRecTrackBar.GetPos();\r\n\r\n    return true;\r\n}\r\n\r\nvoid CBurnAdvancedPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/burn_options.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CBurnAdvancedPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // VariRec.\r\n    m_VariRecTrackBar = GetDlgItem(IDC_VARIRECSLIDER);\r\n    m_VariRecTrackBar.SetRange(-2,2);\r\n    m_VariRecTrackBar.SetTipSide(TBTS_BOTTOM);\r\n\r\n    // Setup the default settings.\r\n    CheckDlgButton(IDC_OVERBURNCHECK,g_BurnAdvancedSettings.m_bOverburn);\r\n    CheckDlgButton(IDC_SWABCHECK,g_BurnAdvancedSettings.m_bSwab);\r\n    CheckDlgButton(IDC_IGNORESIZECHECK,g_BurnAdvancedSettings.m_bIgnoreSize);\r\n    CheckDlgButton(IDC_IMMEDCHECK,g_BurnAdvancedSettings.m_bImmed);\r\n    CheckDlgButton(IDC_AUDIOMASTERCHECK,g_BurnAdvancedSettings.m_bAudioMaster);\r\n    CheckDlgButton(IDC_FORCESPEEDCHECK,g_BurnAdvancedSettings.m_bForceSpeed);\r\n    CheckDlgButton(IDC_VARIRECCHECK,g_BurnAdvancedSettings.m_bVariRec);\r\n\r\n    m_VariRecTrackBar.SetPos(g_BurnAdvancedSettings.m_iVariRec);\r\n    TCHAR szVariRec[16];\r\n    lsprintf(szVariRec,_T(\"%d\"),m_VariRecTrackBar.GetPos());\r\n    SetDlgItemText(IDC_VARIRECEDIT,szVariRec);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CBurnAdvancedPage::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if ((BOOL)wParam == TRUE)\r\n    {\r\n        ckmmc::Device *pDevice =\r\n            reinterpret_cast<ckmmc::Device *>(::SendMessage(GetParent(),WM_GETDEVICE,0,0));\r\n\r\n        ::EnableWindow(GetDlgItem(IDC_SWABCHECK),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_AUDIOMASTERCHECK),\r\n                       pDevice->support(ckmmc::Device::ckDEVICE_AUDIO_MASTER));\r\n\r\n        ::EnableWindow(GetDlgItem(IDC_FORCESPEEDCHECK),\r\n                       pDevice->support(ckmmc::Device::ckDEVICE_FORCE_SPEED));\r\n\r\n        bool bVariRec = pDevice->support(ckmmc::Device::ckDEVICE_VARIREC);\r\n        ::EnableWindow(GetDlgItem(IDC_VARIRECCHECK),bVariRec);\r\n        ::EnableWindow(GetDlgItem(IDC_VARIRECSLIDER),bVariRec);\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CBurnAdvancedPage::OnHScroll(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (wParam == TB_ENDTRACK)\r\n    {\r\n        TCHAR szPos[16];\r\n        lsprintf(szPos,_T(\"%d\"),m_VariRecTrackBar.GetPos());\r\n        SetDlgItemText(IDC_VARIRECEDIT,szPos);\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/burn_advanced_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CBurnAdvancedPage : public CPropertyPageImpl<CBurnAdvancedPage>\r\n{\r\nprivate:\r\n    CTrackBarCtrl m_VariRecTrackBar;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_BURNIMAGEADVANCED };\r\n\r\n    CBurnAdvancedPage();\r\n    ~CBurnAdvancedPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CBurnAdvancedPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_HSCROLL,OnHScroll)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CBurnAdvancedPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnHScroll(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/burn_image_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"burn_image_dlg.hh\"\r\n\r\nCBurnImageDlg::CBurnImageDlg(const TCHAR *szTitle,bool bImageHasTOC,\r\n                             bool bEnableOnFly,bool bEnableVerify,\r\n                             bool bAppMode) :\r\n    m_bCentered(false),m_bAppMode(bAppMode),m_pDevice(NULL),\r\n    CPropertySheetImpl<CBurnImageDlg>(szTitle,0,NULL),\r\n    m_GeneralPage(bImageHasTOC,bEnableOnFly,bEnableVerify)\r\n{\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n    AddPage(m_AdvancedPage);\r\n}\r\n\r\nCBurnImageDlg::~CBurnImageDlg()\r\n{\r\n}\r\n\r\nLRESULT CBurnImageDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    // Add the dialog to the task bar and enable it to be minimized.\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CBurnImageDlg::OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_pDevice = reinterpret_cast<ckmmc::Device *>(lParam);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CBurnImageDlg::OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = TRUE;\r\n    return reinterpret_cast<LRESULT>(m_pDevice);\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/burn_image_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"burn_image_general_page.hh\"\r\n#include \"burn_advanced_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nclass CBurnImageDlg : public CPropertySheetImpl<CBurnImageDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n    bool m_bAppMode;\r\n    ckmmc::Device *m_pDevice;\r\n\r\n    CBurnImageGeneralPage m_GeneralPage;\r\n    CBurnAdvancedPage m_AdvancedPage;\r\n\r\npublic:\r\n    CBurnImageDlg(const TCHAR *szTitle,bool bImageHasTOC,\r\n        bool bEnableOnFly,bool bEnableVerify,bool bAppMode);\r\n    ~CBurnImageDlg();\r\n\r\n    BEGIN_MSG_MAP(CBurnImageDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_SETDEVICE,OnSetDevice)\r\n        MESSAGE_HANDLER(WM_GETDEVICE,OnGetDevice)\r\n\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CBurnImageDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/burn_image_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include <base/string_util.hh>\r\n#include \"infrarecorder.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"version.hh\"\r\n#include \"visual_styles.hh\"\r\n#include \"burn_image_general_page.hh\"\r\n\r\nCBurnImageGeneralPage::CBurnImageGeneralPage(bool bImageHasTOC,bool bEnableOnFly,\r\n                                             bool bEnableVerify)\r\n{\r\n    m_bImageHasTOC = bImageHasTOC;\r\n    m_bEnableOnFly = bEnableOnFly;\r\n    m_bEnableVerify = bEnableVerify;\r\n    m_uiParentTitleLen = 0;\r\n    m_hIcon = NULL;\r\n    m_hRefreshIcon = NULL;\r\n    m_hRefreshImageList = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCBurnImageGeneralPage::~CBurnImageGeneralPage()\r\n{\r\n    if (m_hRefreshImageList != NULL)\r\n        ImageList_Destroy(m_hRefreshImageList);\r\n\r\n    if (m_hRefreshIcon != NULL)\r\n        DestroyIcon(m_hRefreshIcon);\r\n\r\n    if (m_hIcon != NULL)\r\n        DestroyIcon(m_hIcon);\r\n}\r\n\r\nbool CBurnImageGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a burn translation section.\r\n    if (!pLng->EnterSection(_T(\"burn\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_WRITESPEEDSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_WRITESPEEDSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_WRITESPEEDSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_WRITEMETHODSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_WRITEMETHODSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_WRITEMETHODSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_NUMCOPIESSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_NUMCOPIESSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_NUMCOPIESSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_EJECTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_EJECTCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SIMULATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_SIMULATECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BUPCHECK,szStrValue))\r\n        SetDlgItemText(IDC_BUPCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_PADCHECK,szStrValue))\r\n        SetDlgItemText(IDC_PADCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FIXATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_FIXATECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_VERIFYCHECK,szStrValue))\r\n        SetDlgItemText(IDC_VERIFYCHECK,szStrValue);\r\n\r\n    // Borrow the on the fly translation from the copy dialog.\r\n    if (!pLng->EnterSection(_T(\"copy\")))\r\n        return false;\r\n\r\n    if (pLng->GetValuePtr(IDC_ONFLYCHECK,szStrValue))\r\n        SetDlgItemText(IDC_ONFLYCHECK,szStrValue);\r\n\r\n    // Make sure that the edit controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_WRITESPEEDCOMBO,iMaxStaticRight,true);\r\n        UpdateEditPos(m_hWnd,IDC_WRITEMETHODCOMBO,iMaxStaticRight,true);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CBurnImageGeneralPage::InitRecorderMedia()\r\n{\r\n    if (m_uiParentTitleLen == 0)\r\n        m_uiParentTitleLen = GetParentWindow(this).GetWindowTextLength();\r\n\r\n    TCHAR szBuffer[256];\r\n    GetParentWindow(this).GetWindowText(szBuffer,m_uiParentTitleLen + 1);\r\n\r\n    // Obtain the device.\r\n    ckmmc::Device &Device =\r\n        *reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    Device.refresh();\r\n\r\n    // Get current profile.\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n\r\n    // Note: On CD-R/RW media the Test Write bit is valid only for Write Type\r\n    // 1 or 2 (Track at Once or Session at Once). On DVD-R media, the Test\r\n    // Write bit is valid only for Write Type 0 or 2 (Incremental or\r\n    // Disc-at-once). This is completely disregarded at the moment.\r\n    bool bSupportedProfile = false;\r\n    switch (Profile)\r\n    {\r\n        case ckmmc::Device::ckPROFILE_DVDRAM:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR_DL:\r\n            // Not sure about these:\r\n        case ckmmc::Device::ckPROFILE_BDROM:\r\n        case ckmmc::Device::ckPROFILE_BDR_SRM:\r\n        case ckmmc::Device::ckPROFILE_BDR_RRM:\r\n        case ckmmc::Device::ckPROFILE_BDRE:\r\n        case ckmmc::Device::ckPROFILE_HDDVDROM:\r\n        case ckmmc::Device::ckPROFILE_HDDVDR:\r\n        case ckmmc::Device::ckPROFILE_HDDVDRAM:\r\n            bSupportedProfile = true;\r\n\r\n            // Disable simulation (not supported for DVD+RW media).\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_CDR:\r\n        case ckmmc::Device::ckPROFILE_CDRW:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP:\r\n            bSupportedProfile = true;\r\n\r\n            // Enable simulation if supported by recorder.\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),\r\n                           Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_NONE:\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_INSERTBLANK));\r\n            break;\r\n\r\n        default:\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_UNSUPPORTED));\r\n            break;\r\n    }\r\n\r\n    GetParentWindow(this).SetWindowText(szBuffer);\r\n\r\n    if (bSupportedProfile)\r\n    {\r\n        // Maximum write speed.\r\n        m_WriteSpeedCombo.ResetContent();\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n        m_WriteSpeedCombo.SetItemData(0,static_cast<DWORD_PTR>(-1));\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        // Other supported write speeds.\r\n        const std::vector<ckcore::tuint32> &WriteSpeeds = Device.write_speeds();\r\n\r\n        std::vector<ckcore::tuint32>::const_iterator it;\r\n        for (it = WriteSpeeds.begin(); it != WriteSpeeds.end(); it++)\r\n        {\r\n            m_WriteSpeedCombo.AddString(ckmmc::util::kb_to_disp_speed(*it,Profile).c_str());\r\n            m_WriteSpeedCombo.SetItemData(m_WriteSpeedCombo.GetCount() - 1,\r\n                                          static_cast<DWORD_PTR>(ckmmc::util::kb_to_human_speed(*it,\r\n                                                                 /*ckmmc::Device::ckPROFILE_CDR*/Profile)));\r\n        }\r\n\r\n        // Write modes.\r\n        m_WriteMethodCombo.ResetContent();\r\n\r\n        if (Device.support(ckmmc::Device::ckWM_SAO))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_SAO));\r\n        if (Device.support(ckmmc::Device::ckWM_TAO))\r\n        {\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_TAO));\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_TAONOPREGAP));\r\n        }\r\n        if (Device.support(ckmmc::Device::ckWM_RAW96R))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW96R));\r\n        if (Device.support(ckmmc::Device::ckWM_RAW16))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW16));\r\n        if (Device.support(ckmmc::Device::ckWM_RAW96P))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW96P));\r\n\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n    }\r\n    else\r\n    {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CBurnImageGeneralPage::SuggestWriteMethod()\r\n{\r\n    ckmmc::Device &Device =\r\n        *reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    // Suggest the best raw write method if the image has an associated TOC file.\r\n    if (m_bImageHasTOC)\r\n    {\r\n        // Check for supported write modes. Raw96r has the highest priority, if\r\n        // that's not support the raw16 mode is recommended, if none of the mentioned\r\n        // write modes are supported a warning message is displayed.\r\n        int uiStrID = -1;\r\n\r\n        if (Device.support(ckmmc::Device::ckWM_RAW96R))\r\n            uiStrID = WRITEMODE_RAW96R;\r\n        else if (Device.support(ckmmc::Device::ckWM_RAW16))\r\n            uiStrID = WRITEMODE_RAW16;\r\n\r\n        const TCHAR *szStr = lngGetString(uiStrID);\r\n        if (uiStrID != -1)\r\n        {\r\n            TCHAR szItemText[128];\r\n\r\n            for (int i = 0; i < m_WriteMethodCombo.GetCount(); i++)\r\n            {\r\n                if (m_WriteMethodCombo.GetLBTextLen(i) >= (sizeof(szItemText) / sizeof(TCHAR)))\r\n                    continue;\r\n\r\n                m_WriteMethodCombo.GetLBText(i,szItemText);\r\n                if (!lstrcmp(szItemText,szStr))\r\n                {\r\n                    m_WriteMethodCombo.SetCurSel(i);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            // No good raw writing mode found.\r\n            MessageBox(lngGetString(WARNING_CLONEWRITEMETHOD),lngGetString(GENERAL_WARNING),\r\n                MB_OK | MB_ICONWARNING);\r\n        }\r\n    }\r\n    else if (g_ProjectSettings.m_bMultiSession)\r\n    {\r\n        // Suggest the TAO write mode for multi-session discs if available.\r\n        if (Device.support(ckmmc::Device::ckWM_TAO))\r\n        {\r\n            const TCHAR *szStr = lngGetString(WRITEMODE_TAO);\r\n            TCHAR szItemText[128];\r\n\r\n            for (int i = 0; i < m_WriteMethodCombo.GetCount(); i++)\r\n            {\r\n                if (m_WriteMethodCombo.GetLBTextLen(i) >= (sizeof(szItemText) / sizeof(TCHAR)))\r\n                    continue;\r\n\r\n                m_WriteMethodCombo.GetLBText(i,szItemText);\r\n                if (!lstrcmp(szItemText,szStr))\r\n                {\r\n                    m_WriteMethodCombo.SetCurSel(i);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid CBurnImageGeneralPage::InitRefreshButton()\r\n{\r\n    m_hRefreshIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_REFRESHICON),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);\r\n\r\n    // In Windows XP there is a bug causing the button to loose it's themed style if\r\n    // assigned an icon. The solution to this is to assign an image list instead.\r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n        int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n\r\n        m_hRefreshImageList = ImageList_Create(16,16,ILC_COLOR32 | (iBitsPixel < 32 ? ILC_MASK : 0),0,1);\r\n        ImageList_AddIcon(m_hRefreshImageList,m_hRefreshIcon);\r\n\r\n        BUTTON_IMAGELIST bImageList;\r\n        bImageList.himl = m_hRefreshImageList;\r\n        bImageList.margin.left = 0;\r\n        bImageList.margin.top = 0;\r\n        bImageList.margin.right = 0;\r\n        bImageList.margin.bottom = 0;\r\n        bImageList.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BCM_SETIMAGELIST,0,(LPARAM)&bImageList);\r\n    }\r\n    else\r\n    {\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BM_SETIMAGE,IMAGE_ICON,(LPARAM)m_hRefreshIcon);\r\n    }\r\n\r\n    // If the application is themed, then adjust the size of the button.\r\n    if (g_VisualStyles.IsThemeActive())\r\n    {\r\n        RECT rcButton;\r\n        ::GetWindowRect(GetDlgItem(IDC_REFRESHBUTTON),&rcButton);\r\n        ScreenToClient(&rcButton);\r\n        ::SetWindowPos(GetDlgItem(IDC_REFRESHBUTTON),NULL,rcButton.left - 1,rcButton.top - 1,\r\n            rcButton.right - rcButton.left + 2,rcButton.bottom - rcButton.top + 2,0);\r\n    }\r\n}\r\n\r\nvoid CBurnImageGeneralPage::CheckRecorderMedia()\r\n{\r\n    // Check that we have a recorder in the system.\r\n    if (m_RecorderCombo.GetItemData(m_RecorderCombo.GetCurSel()) == 0)\r\n        return;\r\n\r\n    bool bMediaInit = InitRecorderMedia();\r\n    if (!bMediaInit)\r\n    {\r\n        // Write speed.\r\n        m_WriteSpeedCombo.ResetContent();\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        // Write method.\r\n        m_WriteMethodCombo.ResetContent();\r\n        m_WriteMethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n    }\r\n\r\n    m_WriteSpeedCombo.EnableWindow(bMediaInit);\r\n    m_WriteMethodCombo.EnableWindow(bMediaInit);\r\n    ::EnableWindow(::GetDlgItem(GetParent(),IDOK),bMediaInit);\r\n    ::EnableWindow(GetDlgItem(IDC_WRITESPEEDSTATIC),bMediaInit);\r\n    ::EnableWindow(GetDlgItem(IDC_WRITEMETHODSTATIC),bMediaInit);\r\n\r\n    // Suggest a write method.\r\n    SuggestWriteMethod();\r\n}\r\n\r\nbool CBurnImageGeneralPage::OnApply()\r\n{\r\n    // Verify the number of copies.\r\n    TCHAR szNumCopies[64];\r\n    m_NumCopiesCombo.GetWindowText(szNumCopies,sizeof(szNumCopies) / sizeof(TCHAR) -1);\r\n\r\n    long lNumCopies = 1;\r\n    if (lsscanf(szNumCopies,_T(\"%d\"),&lNumCopies) != 1 || lNumCopies < 1)\r\n    {\r\n        lngMessageBox(m_hWnd,ERROR_NUMCOPIES,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    // Remember the configuration.\r\n    g_BurnImageSettings.m_bOnFly = IsDlgButtonChecked(IDC_ONFLYCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bVerify = IsDlgButtonChecked(IDC_VERIFYCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bEject = IsDlgButtonChecked(IDC_EJECTCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bSimulate = IsDlgButtonChecked(IDC_SIMULATECHECK) == TRUE;\r\n    g_BurnImageSettings.m_bBUP = IsDlgButtonChecked(IDC_BUPCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bPadTracks = IsDlgButtonChecked(IDC_PADCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bFixate = IsDlgButtonChecked(IDC_FIXATECHECK) == TRUE;\r\n\r\n    // For internal use only.\r\n    g_BurnImageSettings.m_pRecorder =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n    g_BurnImageSettings.m_iWriteSpeed = static_cast<int>(m_WriteSpeedCombo.GetItemData(m_WriteSpeedCombo.GetCurSel()));\r\n\r\n    TCHAR szBuffer[32];\r\n    GetDlgItemText(IDC_WRITEMETHODCOMBO,szBuffer,32);\r\n\r\n    if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_SAO)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_SAO;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_TAO)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_TAO;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_TAONOPREGAP)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_TAONOPREGAP;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW96R)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW96R;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW16)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW16;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW96P)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW96P;\r\n\r\n    g_BurnImageSettings.m_lNumCopies = lNumCopies;\r\n\r\n    return true;\r\n}\r\n\r\nvoid CBurnImageGeneralPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/burn_options.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CBurnImageGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_RecorderCombo = GetDlgItem(IDC_RECORDERCOMBO);\r\n    m_WriteSpeedCombo = GetDlgItem(IDC_WRITESPEEDCOMBO);\r\n    m_WriteMethodCombo = GetDlgItem(IDC_WRITEMETHODCOMBO);\r\n    m_NumCopiesCombo = GetDlgItem(IDC_NUMCOPIESCOMBO);\r\n\r\n    // Set the refresh button icon.\r\n    InitRefreshButton();\r\n\r\n    // Create the icon.\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        m_hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(12),IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    FreeLibrary(hInstance);\r\n\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Recorder combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        if (!pDevice->recorder())\r\n            continue;\r\n\r\n        m_RecorderCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_RecorderCombo.SetItemData(m_RecorderCombo.GetCount() - 1,\r\n                                    reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_RecorderCombo.GetCount() == 0)\r\n    {\r\n        m_RecorderCombo.AddString(lngGetString(FAILURE_NORECORDERS));\r\n        m_RecorderCombo.EnableWindow(false);\r\n        m_RecorderCombo.SetCurSel(0);\r\n\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteSpeedCombo.EnableWindow(false);\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        m_WriteMethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteMethodCombo.EnableWindow(false);\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(::GetDlgItem(GetParent(),IDOK),false);\r\n    }\r\n    else\r\n    {\r\n        m_RecorderCombo.SetCurSel(0);\r\n\r\n        if (m_bImageHasTOC)\r\n        {\r\n            // Display information message.\r\n            if (g_GlobalSettings.m_bRawImageInfo)\r\n            {\r\n                CInfoDlg InfoDlg(&g_GlobalSettings.m_bRawImageInfo,lngGetString(INFO_RAWIMAGE),INFODLG_NOCANCEL);\r\n                InfoDlg.DoModal();\r\n            }\r\n        }\r\n\r\n        BOOL bDummy;\r\n        OnRecorderChange(NULL,NULL,NULL,bDummy);\r\n    }\r\n\r\n    // Setup the default settings.\r\n    CheckDlgButton(IDC_ONFLYCHECK,g_BurnImageSettings.m_bOnFly);\r\n    CheckDlgButton(IDC_VERIFYCHECK,g_BurnImageSettings.m_bVerify);\r\n    CheckDlgButton(IDC_EJECTCHECK,g_BurnImageSettings.m_bEject);\r\n    CheckDlgButton(IDC_SIMULATECHECK,g_BurnImageSettings.m_bSimulate);\r\n    CheckDlgButton(IDC_BUPCHECK,g_BurnImageSettings.m_bBUP);\r\n    CheckDlgButton(IDC_PADCHECK,g_BurnImageSettings.m_bPadTracks);\r\n    CheckDlgButton(IDC_FIXATECHECK,g_BurnImageSettings.m_bFixate);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // Disable the on the fly check box if requested.\r\n    if (!m_bEnableOnFly)\r\n        ::EnableWindow(GetDlgItem(IDC_ONFLYCHECK),FALSE);\r\n\r\n    if (!m_bEnableVerify)\r\n        ::EnableWindow(GetDlgItem(IDC_VERIFYCHECK),FALSE);\r\n\r\n    // Fill number of copies combo box.\r\n    TCHAR szBuffer[64];\r\n    for (int i = 1; i <= 10; i++)\r\n    {\r\n        lsprintf(szBuffer,_T(\"%d\"),i);\r\n        m_NumCopiesCombo.AddString(szBuffer);\r\n    }\r\n    m_NumCopiesCombo.SetCurSel(0);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CBurnImageGeneralPage::OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    // Check for media change.\r\n    if (g_Core2.CheckMediaChange(*pDevice))\r\n        CheckRecorderMedia();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CBurnImageGeneralPage::OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    ::SendMessage(GetParent(),WM_SETDEVICE,0,reinterpret_cast<LPARAM>(pDevice));\r\n\r\n    // Kill any already running timers.\r\n    ::KillTimer(m_hWnd,TIMER_ID);\r\n    ::SetTimer(m_hWnd,TIMER_ID,TIMER_INTERVAL,NULL);\r\n\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    // General.\r\n    ::EnableWindow(GetDlgItem(IDC_BUPCHECK),pDevice->support(ckmmc::Device::ckDEVICE_BUP));\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CBurnImageGeneralPage::OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CBurnImageGeneralPage::OnFixateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!IsDlgButtonChecked(IDC_FIXATECHECK))\r\n    {\r\n        // Display warning message.\r\n        if (g_GlobalSettings.m_bFixateWarning)\r\n        {\r\n            CInfoDlg InfoDlg(&g_GlobalSettings.m_bFixateWarning,lngGetString(WARNING_NOFIXATION),INFODLG_ICONWARNING);\r\n            if (InfoDlg.DoModal() == IDCANCEL)\r\n                CheckDlgButton(IDC_FIXATECHECK,true);\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/burn_image_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"core2.hh\"\r\n\r\nclass CBurnImageGeneralPage : public CPropertyPageImpl<CBurnImageGeneralPage>\r\n{\r\nprivate:\r\n    bool m_bImageHasTOC;\r\n    bool m_bEnableOnFly;\r\n    bool m_bEnableVerify;\r\n    unsigned int m_uiParentTitleLen;\r\n    HICON m_hIcon;\r\n    HICON m_hRefreshIcon;\r\n    HIMAGELIST m_hRefreshImageList;\r\n\r\n    CComboBox m_RecorderCombo;\r\n    CComboBox m_WriteSpeedCombo;\r\n    CComboBox m_WriteMethodCombo;\r\n    CComboBox m_NumCopiesCombo;\r\n\r\n    enum\r\n    {\r\n        TIMER_ID = 42,\r\n        TIMER_INTERVAL = 1000\r\n    };\r\n\r\n    bool Translate();\r\n    bool InitRecorderMedia();\r\n    void SuggestWriteMethod();\r\n    void InitRefreshButton();\r\n    void CheckRecorderMedia();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_BURNIMAGEGENERAL };\r\n\r\n    CBurnImageGeneralPage(bool bImageHasTOC,bool bEnableOnFly,bool bEnableVerify);\r\n    ~CBurnImageGeneralPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CBurnImageGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_TIMER,OnTimer)\r\n        COMMAND_HANDLER(IDC_RECORDERCOMBO,CBN_SELCHANGE,OnRecorderChange)\r\n        COMMAND_HANDLER(IDC_REFRESHBUTTON,BN_CLICKED,OnRefresh)\r\n        COMMAND_HANDLER(IDC_FIXATECHECK,BN_CLICKED,OnFixateCheck)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CBurnImageGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFixateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/config_advanced_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_advanced_page.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCConfigAdvancedPage::CConfigAdvancedPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_ADVANCED,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCConfigAdvancedPage::~CConfigAdvancedPage()\r\n{\r\n}\r\n\r\nbool CConfigAdvancedPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a config translation section.\r\n    if (!pLng->EnterSection(_T(\"config\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_LOGCHECK,szStrValue))\r\n        SetDlgItemText(IDC_LOGCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SMOKECHECK,szStrValue))\r\n        SetDlgItemText(IDC_SMOKECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FIFOGROUPSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_FIFOGROUPSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FIFOINFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_FIFOINFOSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigAdvancedPage::OnApply()\r\n{\r\n    TCHAR szFIFO[4];\r\n    GetDlgItemText(IDC_FIFOEDIT,szFIFO,4);\r\n    int iFIFOSize = _wtoi(szFIFO);\r\n\r\n    if (iFIFOSize < FIFO_MIN || iFIFOSize > FIFO_MAX)\r\n    {\r\n        TCHAR szMessage[128];\r\n        lsnprintf_s(szMessage,128,lngGetString(ERROR_FIFOSIZE),FIFO_MIN,FIFO_MAX);\r\n        MessageBox(szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    // Remember the configuration.\r\n    g_GlobalSettings.m_bLog = IsDlgButtonChecked(IDC_LOGCHECK) == TRUE;\r\n    g_GlobalSettings.m_bSmoke = IsDlgButtonChecked(IDC_SMOKECHECK) == TRUE;\r\n    g_GlobalSettings.m_iFIFOSize = iFIFOSize;\r\n\r\n    return true;\r\n}\r\n\r\nvoid CConfigAdvancedPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/configuration.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CConfigAdvancedPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Load configuration.\r\n    CheckDlgButton(IDC_LOGCHECK,g_GlobalSettings.m_bLog);\r\n    CheckDlgButton(IDC_SMOKECHECK,g_GlobalSettings.m_bSmoke);\r\n\r\n    ::SendMessage(GetDlgItem(IDC_FIFOEDIT),EM_SETLIMITTEXT,3,0);\r\n    TCHAR szFIFO[4];\r\n    _itow(g_GlobalSettings.m_iFIFOSize,szFIFO,10);\r\n    SetDlgItemText(IDC_FIFOEDIT,szFIFO);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/config_advanced_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CConfigAdvancedPage : public CPropertyPageImpl<CConfigAdvancedPage>\r\n{\r\nprivate:\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGADVANCED };\r\n\r\n    CConfigAdvancedPage();\r\n    ~CConfigAdvancedPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CConfigAdvancedPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigAdvancedPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/config_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCConfigDlg::CConfigDlg() : CPropertySheetImpl<CConfigDlg>(lngGetString(TITLE_CONFIGURATION),0,NULL)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n    AddPage(m_AdvancedPage);\r\n    AddPage(m_LanguagePage);\r\n#ifndef PORTABLE\r\n    AddPage(m_ShellExtPage);\r\n#endif\r\n}\r\n\r\nCConfigDlg::~CConfigDlg()\r\n{\r\n}\r\n\r\nLRESULT CConfigDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/config_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"config_general_page.hh\"\r\n#include \"config_advanced_page.hh\"\r\n#include \"config_language_page.hh\"\r\n#include \"config_shell_ext_page.hh\"\r\n\r\nclass CConfigDlg : public CPropertySheetImpl<CConfigDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CConfigGeneralPage m_GeneralPage;\r\n    CConfigAdvancedPage m_AdvancedPage;\r\n    CConfigLanguagePage m_LanguagePage;\r\n    CConfigShellExtPage m_ShellExtPage;\r\n\r\npublic:\r\n    CConfigDlg();\r\n    ~CConfigDlg();\r\n\r\n    BEGIN_MSG_MAP(CConfigDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CConfigDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/config_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"registry.hh\"\r\n#include \"config_general_page.hh\"\r\n\r\nCConfigGeneralPage::CConfigGeneralPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCConfigGeneralPage::~CConfigGeneralPage()\r\n{\r\n}\r\n\r\n/*\r\n    CConfigGeneralPage::IsFileExtRegistered\r\n    ---------------------------------------\r\n    Returns true if InfraRecorder is associated with the specified file\r\n    extension.\r\n*/\r\nbool CConfigGeneralPage::IsFileExtRegistered(const TCHAR *szFileExt)\r\n{\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    if (!Reg.OpenKey(szFileExt,false))\r\n        return false;\r\n\r\n    TCHAR szKeyName[64];\r\n    if (Reg.ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n    {\r\n        Reg.CloseKey();\r\n\r\n        if (lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            TCHAR szFullName[256];\r\n            lstrcpy(szFullName,szKeyName),\r\n            lstrcat(szFullName,_T(\"\\\\shell\\\\open\\\\command\"));\r\n\r\n            if (!Reg.OpenKey(szFullName,false))\r\n                return false;\r\n\r\n            // Compare the file path of this application instance with the file\r\n            // path in the standard registry key.\r\n            TCHAR szFilePath[MAX_PATH];\r\n            lstrcpy(szFilePath,_T(\"\\\"\"));\r\n            GetModuleFileName(NULL,szFilePath + 1,MAX_PATH - 1);\r\n            lstrcat(szFilePath,_T(\"\\\"\"));\r\n\r\n            TCHAR szKeyFilePath[MAX_PATH];\r\n            if (!Reg.ReadString(_T(\"\"),szKeyFilePath,MAX_PATH * sizeof(TCHAR)) ||\r\n                lstrncmp(szFilePath,szKeyFilePath,lstrlen(szFilePath)))\r\n            {\r\n                Reg.CloseKey();\r\n                return false;\r\n            }\r\n\r\n            Reg.CloseKey();\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CConfigGeneralPage::RegisterFileExt\r\n    -----------------------------------\r\n    Associates InfraRecorder with the specified file extension. Returns true if\r\n    successfull, otherwise false. szTypeKeyName may not contain more than 64\r\n    characters.\r\n*/\r\nbool CConfigGeneralPage::RegisterFileExt(const TCHAR *szFileExt,const TCHAR *szTypeKeyName,\r\n                                         const TCHAR *szTypeDesc)\r\n{\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    if (Reg.OpenKey(szFileExt))\r\n    {\r\n        TCHAR szKeyName[64];\r\n\r\n        bool bCreate = false;\r\n        if (Reg.ReadString(_T(\"\"),szKeyName,sizeof(szKeyName)) || !lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            if (lstrcmp(szKeyName,szTypeKeyName))\r\n                bCreate = true;\r\n        }\r\n        else\r\n        {\r\n            bCreate = true;\r\n        }\r\n\r\n        // If no key is specified we create our own.\r\n        //if (!Reg.ReadString(_T(\"\"),szKeyName,sizeof(szKeyName)) || !lstrcmp(szKeyName,_T(\"\")))\r\n        if (bCreate)\r\n        {\r\n            // Extension key name.\r\n            if (!Reg.WriteString(_T(\"\"),(TCHAR *)szTypeKeyName,lstrlen(szTypeKeyName) * sizeof(TCHAR)))\r\n            {\r\n                Reg.CloseKey();\r\n                return false;\r\n            }\r\n\r\n            Reg.CloseKey();\r\n\r\n            // Key name description.\r\n            if (!Reg.OpenKey(szTypeKeyName,true))\r\n                return false;\r\n\r\n            if (!Reg.WriteString(_T(\"\"),(TCHAR *)szTypeDesc,lstrlen(szTypeDesc) * sizeof(TCHAR)))\r\n            {\r\n                Reg.CloseKey();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // Open key name and install shell extension.\r\n        Reg.CloseKey();\r\n\r\n        TCHAR szFullName[256];\r\n        lstrcpy(szFullName,/*szKeyName*/szTypeKeyName),\r\n        lstrcat(szFullName,_T(\"\\\\shell\\\\open\\\\command\"));\r\n\r\n        if (!Reg.OpenKey(szFullName))\r\n            return false;\r\n\r\n        TCHAR szCommand[MAX_PATH];\r\n        lstrcpy(szCommand,_T(\"\\\"\"));\r\n        GetModuleFileName(NULL,szCommand + 1,MAX_PATH - 1);\r\n        lstrcat(szCommand,_T(\"\\\" %1\"));\r\n\r\n        if (!Reg.WriteString(_T(\"\"),szCommand,MAX_PATH * sizeof(TCHAR)))\r\n        {\r\n            Reg.CloseKey();\r\n            return false;\r\n        }\r\n\r\n        Reg.CloseKey();\r\n\r\n        // Set default icon.\r\n        lstrcpy(szFullName,szKeyName),\r\n        lstrcat(szFullName,_T(\"\\\\DefaultIcon\"));\r\n\r\n        if (!Reg.OpenKey(szFullName))\r\n            return false;\r\n\r\n        TCHAR szIconPath[MAX_PATH + 2];\r\n        GetModuleFileName(NULL,szIconPath,MAX_PATH - 1);\r\n        lstrcat(szIconPath,_T(\",5\"));\r\n\r\n        if (!Reg.WriteString(_T(\"\"),szIconPath,MAX_PATH + 2 * sizeof(TCHAR)))\r\n        {\r\n            Reg.CloseKey();\r\n            return false;\r\n        }\r\n\r\n        Reg.CloseKey();\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CConfigGeneralPage::UnregisterFileExt\r\n    -------------------------------------\r\n    Deassociate InfraRecorder with the specified file extension. Returns true\r\n    if the process was successfull, false otherwise.\r\n*/\r\nbool CConfigGeneralPage::UnregisterFileExt(const TCHAR *szFileExt)\r\n{\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    if (!Reg.OpenKey(szFileExt,false))\r\n        return true;\r\n\r\n    TCHAR szKeyName[64];\r\n    if (Reg.ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n    {\r\n        Reg.CloseKey();\r\n\r\n        if (lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            TCHAR szFullName[256];\r\n            lstrcpy(szFullName,szKeyName),\r\n            lstrcat(szFullName,_T(\"\\\\shell\\\\open\"));\r\n\r\n            if (!Reg.OpenKey(szFullName,false))\r\n                return false;\r\n\r\n            // Delete the command key.\r\n            if (!Reg.DeleteKey(_T(\"command\")))\r\n            {\r\n                Reg.CloseKey();\r\n                return false;\r\n            }\r\n\r\n            Reg.CloseKey();\r\n\r\n            // Delete the open key.\r\n            szFullName[LastDelimiter(szFullName,'\\\\')] = '\\0';\r\n\r\n            if (!Reg.OpenKey(szFullName,false))\r\n                return false;\r\n\r\n            if (!Reg.DeleteKey(_T(\"open\")))\r\n            {\r\n                Reg.CloseKey();\r\n                return false;\r\n            }\r\n\r\n            // Remove the icon.\r\n            if (!Reg.OpenKey(szKeyName,false))\r\n                return false;\r\n\r\n            bool bResult = Reg.DeleteKey(_T(\"DefaultIcon\"));\r\n                Reg.CloseKey();\r\n            return bResult;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a config translation section.\r\n    if (!pLng->EnterSection(_T(\"config\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_AUTORUNCHECK,szStrValue))\r\n        SetDlgItemText(IDC_AUTORUNCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_WIZARDCHECK,szStrValue))\r\n        SetDlgItemText(IDC_WIZARDCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_ASSOCIATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_ASSOCIATECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_ASSOCIATEDISCIMAGECHECK,szStrValue))\r\n        SetDlgItemText(IDC_ASSOCIATEDISCIMAGECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SHELLFOLDERGROUPSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SHELLFOLDERGROUPSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SHELLFOLDERINFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SHELLFOLDERINFOSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_REMEMBERSHELLCHECK,szStrValue))\r\n        SetDlgItemText(IDC_REMEMBERSHELLCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TEMPFOLDERGROUPSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TEMPFOLDERGROUPSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TEMPFOLDERINFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TEMPFOLDERINFOSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    g_GlobalSettings.m_bAutoRunCheck = IsDlgButtonChecked(IDC_AUTORUNCHECK) == TRUE;\r\n    g_GlobalSettings.m_bShowWizard = IsDlgButtonChecked(IDC_WIZARDCHECK) == TRUE;\r\n    g_GlobalSettings.m_bRememberShell = IsDlgButtonChecked(IDC_REMEMBERSHELLCHECK) == TRUE;\r\n\r\n    GetDlgItemText(IDC_SHELLFOLDEREDIT,g_DynamicSettings.m_szShellDir,MAX_PATH - 1);\r\n    GetDlgItemText(IDC_TEMPFOLDEREDIT,g_GlobalSettings.m_szTempPath,MAX_PATH - 1);\r\n    IncludeTrailingBackslash(g_GlobalSettings.m_szTempPath);\r\n\r\n    // Register the project file extension.\r\n    if (IsDlgButtonChecked(IDC_ASSOCIATECHECK) == TRUE)\r\n    {\r\n        RegisterFileExt(_T(\".irp\"),_T(\"irproject\"),_T(\"InfraRecorder project\"));\r\n    }\r\n    else\r\n    {\r\n        if (IsFileExtRegistered(_T(\".irp\")))\r\n            UnregisterFileExt(_T(\".irp\"));\r\n    }\r\n\r\n    // Register the disc image extensions.\r\n    if (IsDlgButtonChecked(IDC_ASSOCIATEDISCIMAGECHECK) == TRUE)\r\n    {\r\n        RegisterFileExt(_T(\".iso\"),_T(\"irdiscimage\"),_T(\"InfraRecorder disc image\"));\r\n        RegisterFileExt(_T(\".img\"),_T(\"irdiscimage\"),_T(\"InfraRecorder disc image\"));\r\n        RegisterFileExt(_T(\".cue\"),_T(\"irdiscimage\"),_T(\"InfraRecorder disc image\"));\r\n    }\r\n    else\r\n    {\r\n        if (IsFileExtRegistered(_T(\".iso\")))\r\n            UnregisterFileExt(_T(\".iso\"));\r\n        if (IsFileExtRegistered(_T(\".img\")))\r\n            UnregisterFileExt(_T(\".img\"));\r\n        if (IsFileExtRegistered(_T(\".cue\")))\r\n            UnregisterFileExt(_T(\".cue\"));\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CConfigGeneralPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/configuration.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Load configuration.\r\n    CheckDlgButton(IDC_AUTORUNCHECK,g_GlobalSettings.m_bAutoRunCheck);\r\n    CheckDlgButton(IDC_WIZARDCHECK,g_GlobalSettings.m_bShowWizard);\r\n    CheckDlgButton(IDC_REMEMBERSHELLCHECK,g_GlobalSettings.m_bRememberShell);\r\n\r\n    ::SendMessage(GetDlgItem(IDC_SHELLFOLDEREDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n    SetDlgItemText(IDC_SHELLFOLDEREDIT,g_DynamicSettings.m_szShellDir);\r\n\r\n    CheckDlgButton(IDC_ASSOCIATECHECK,IsFileExtRegistered(_T(\".irp\")));\r\n    CheckDlgButton(IDC_ASSOCIATEDISCIMAGECHECK,IsFileExtRegistered(_T(\".iso\")) ||\r\n        IsFileExtRegistered(_T(\".img\")) || IsFileExtRegistered(_T(\".cue\")));\r\n\r\n    if (g_GlobalSettings.m_bRememberShell)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_SHELLFOLDEREDIT),false);\r\n        ::EnableWindow(GetDlgItem(IDC_SHELLFOLDERBROWSEBUTTON),false);\r\n    }\r\n\r\n    ::SendMessage(GetDlgItem(IDC_TEMPFOLDEREDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n    SetDlgItemText(IDC_TEMPFOLDEREDIT,g_GlobalSettings.m_szTempPath);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnRememberShellCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    bool bEnable = !IsDlgButtonChecked(IDC_REMEMBERSHELLCHECK) == TRUE;\r\n\r\n    ::EnableWindow(GetDlgItem(IDC_SHELLFOLDEREDIT),bEnable);\r\n    ::EnableWindow(GetDlgItem(IDC_SHELLFOLDERBROWSEBUTTON),bEnable);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnFolderBrowse(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CFolderDialog FolderDialog(m_hWnd,lngGetString(MISC_SPECIFYFOLDER),BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS);\r\n    int iControlID;\r\n\r\n    switch (wID)\r\n    {\r\n        case IDC_SHELLFOLDERBROWSEBUTTON:\r\n            iControlID = IDC_SHELLFOLDEREDIT;\r\n            break;\r\n\r\n        case IDC_TEMPFOLDERBROWSEBUTTON:\r\n            iControlID = IDC_TEMPFOLDEREDIT;\r\n            break;\r\n\r\n        default:\r\n        {\r\n            bHandled = false;\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    if (FolderDialog.DoModal() == IDOK)\r\n        SetDlgItemText(iControlID,FolderDialog.GetFolderPath());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/config_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CConfigGeneralPage : public CPropertyPageImpl<CConfigGeneralPage>\r\n{\r\nprivate:\r\n    bool IsFileExtRegistered(const TCHAR *szFileExt);\r\n    bool RegisterFileExt(const TCHAR *szFileExt,const TCHAR *szTypeKeyName,\r\n        const TCHAR *szTypeDesc);\r\n    bool UnregisterFileExt(const TCHAR *szFileExt);\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGGENERAL };\r\n\r\n    CConfigGeneralPage();\r\n    ~CConfigGeneralPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CBurnImageGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDC_REMEMBERSHELLCHECK,OnRememberShellCheck)\r\n        COMMAND_ID_HANDLER(IDC_SHELLFOLDERBROWSEBUTTON,OnFolderBrowse)\r\n        COMMAND_ID_HANDLER(IDC_TEMPFOLDERBROWSEBUTTON,OnFolderBrowse)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnRememberShellCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFolderBrowse(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/config_language_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/lng_processor.hh>\r\n#include \"config_language_page.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCConfigLanguagePage::CConfigLanguagePage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_LANGUAGE,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCConfigLanguagePage::~CConfigLanguagePage()\r\n{\r\n    // Clear the file list vector.\r\n    m_LangFileList.clear();\r\n}\r\n\r\nbool CConfigLanguagePage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a config translation section.\r\n    if (!pLng->EnterSection(_T(\"config\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_LANGUAGESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_LANGUAGESTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_LANGUAGEINFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_LANGUAGEINFOSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigLanguagePage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    int iLangIndex = m_LangCombo.GetCurSel();\r\n\r\n    if (iLangIndex == 0)\r\n        g_LanguageSettings.m_szLanguageFile[0] = '\\0';\r\n    else\r\n        lstrcpy(g_LanguageSettings.m_szLanguageFile,m_LangFileList[iLangIndex - 1].szFileName);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CConfigLanguagePage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/configuration.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nckcore::tstring CConfigLanguagePage::GetTranslationDisplayName(TCHAR *szFileName)\r\n{\r\n    bool bNeedParenthesis = false;\r\n    ckcore::tstring DispName;\r\n\r\n    size_t iFileNameLen = lstrlen(szFileName);\r\n    for (size_t i = 0; i < iFileNameLen; i++)\r\n    {\r\n        if (i == 0)\r\n        {\r\n            DispName.push_back((wchar_t)toupper(szFileName[i]));\r\n            continue;\r\n        }\r\n\r\n        if (szFileName[i] == '-')\r\n        {\r\n            DispName += TEXT(\" (\");\r\n            bNeedParenthesis = true;\r\n            continue;\r\n        }\r\n\r\n        DispName.push_back(szFileName[i]);\r\n    }\r\n\r\n    if (bNeedParenthesis)\r\n        DispName.push_back(')');\r\n\r\n    return DispName;\r\n}\r\n\r\nvoid CConfigLanguagePage::FillLangCombo()\r\n{\r\n    // Always add the english language item.\r\n    m_LangCombo.AddString(_T(\"English (default)\"));\r\n    m_LangCombo.SetCurSel(0);\r\n\r\n    // Add file translations.\r\n    WIN32_FIND_DATA FileData;\r\n    HANDLE hFile;\r\n\r\n    // Setup paths.\r\n    TCHAR szFolderPath[MAX_PATH];\r\n    ::GetModuleFileName(NULL,szFolderPath,MAX_PATH - 1);\r\n    ExtractFilePath(szFolderPath);\r\n    lstrcat(szFolderPath,_T(\"languages\\\\\"));\r\n\r\n    TCHAR szFilePath[MAX_PATH];\r\n    lstrcpy(szFilePath,szFolderPath);\r\n    lstrcat(szFilePath,_T(\"*.irl\"));\r\n\r\n    // Get the handle of the first file.\r\n    hFile = FindFirstFile(szFilePath,&FileData);\r\n\r\n    // Clear the file list vector.\r\n    m_LangFileList.clear();\r\n\r\n    if (hFile != INVALID_HANDLE_VALUE)\r\n    {\r\n        do\r\n        {\r\n            // We want to ingore the \".\" and \"..\" records.\r\n            if (!lstrcmp(FileData.cFileName,TEXT(\".\")) || !lstrcmp(FileData.cFileName,TEXT(\"..\")))\r\n                continue;\r\n\r\n            // Add the file data to the vector.\r\n            tLangFileData LangFileData;\r\n            lstrcpy(LangFileData.szFileName,FileData.cFileName);\r\n            m_LangFileList.push_back(LangFileData);\r\n\r\n            // Remove the file extension and add the item.\r\n            lstrcpy(szFilePath,FileData.cFileName);\r\n            ChangeFileExt(szFilePath,_T(\"\"));\r\n\r\n            ckcore::tstring DispName = GetTranslationDisplayName(szFilePath);\r\n            m_LangCombo.AddString(DispName.c_str());\r\n\r\n            // Loading the translation name from file is too slow.\r\n            /*lstrcpy(szFilePath,szFolderPath);\r\n            lstrcat(szFilePath,FileData.cFileName);\r\n\r\n            CLngProcessor LangFile(szFilePath);\r\n            if (LangFile.Load() != LNGRES_OK)\r\n                continue;\r\n\r\n            if (!LangFile.EnterSection(TEXT(\"translation\")))\r\n                continue;\r\n\r\n            TCHAR szLangName[256];\r\n            if (!LangFile.GetValue(0x0000,szLangName,sizeof(szLangName)/sizeof(TCHAR)))\r\n                continue;\r\n\r\n            m_LangCombo.AddString(szLangName);*/\r\n\r\n            if (!lstrcmp(FileData.cFileName,g_LanguageSettings.m_szLanguageFile))\r\n                m_LangCombo.SetCurSel(m_LangCombo.GetCount() - 1);\r\n        }\r\n        while (FindNextFile(hFile,&FileData));\r\n\r\n        FindClose(hFile);\r\n    }\r\n}\r\n\r\nLRESULT CConfigLanguagePage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup language combo box.\r\n    m_LangCombo = GetDlgItem(IDC_LANGUAGECOMBO);\r\n\r\n    // Load configuration.\r\n    FillLangCombo();\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/config_language_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"resource.h\"\r\n\r\ntypedef struct\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n} tLangFileData;\r\n\r\nclass CConfigLanguagePage : public CPropertyPageImpl<CConfigLanguagePage>\r\n{\r\nprivate:\r\n    CComboBox m_LangCombo;\r\n\r\n    std::vector<tLangFileData> m_LangFileList;\r\n\r\n    bool Translate();\r\n    ckcore::tstring GetTranslationDisplayName(TCHAR *szFileName);\r\n    void FillLangCombo();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGLANGUAGE };\r\n\r\n    CConfigLanguagePage();\r\n    ~CConfigLanguagePage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CConfigAdvancedPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigLanguagePage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/config_shell_ext_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_shell_ext_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"version.hh\"\r\n#include \"new_file_ext_dlg.hh\"\r\n#include \"shell_ext_util.hh\"\r\n\r\nCConfigShellExtPage::CConfigShellExtPage()\r\n{\r\n    m_hToolBarImageList = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_SHELLEXT,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCConfigShellExtPage::~CConfigShellExtPage()\r\n{\r\n    if (m_hToolBarImageList)\r\n        ImageList_Destroy(m_hToolBarImageList);\r\n}\r\n\r\nbool CConfigShellExtPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a config translation section.\r\n    if (!pLng->EnterSection(_T(\"config\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_SHELLEXTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_SHELLEXTCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SHELLEXTSUBMENUCHECK,szStrValue))\r\n        SetDlgItemText(IDC_SHELLEXTSUBMENUCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SHELLEXTICONCHECK,szStrValue))\r\n        SetDlgItemText(IDC_SHELLEXTICONCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SHELLEXTTEXTSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SHELLEXTTEXTSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigShellExtPage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    g_GlobalSettings.m_bShellExtSubMenu = IsDlgButtonChecked(IDC_SHELLEXTSUBMENUCHECK) == TRUE;\r\n    g_GlobalSettings.m_bShellExtIcon = IsDlgButtonChecked(IDC_SHELLEXTICONCHECK) == TRUE;\r\n\r\n    if (IsDlgButtonChecked(IDC_SHELLEXTCHECK))\r\n        RegisterShellExtension();\r\n    else\r\n        UnregisterShellExtension();\r\n\r\n    // Associate the individual file extensions.\r\n    RegisterListView();\r\n\r\n    return true;\r\n}\r\n\r\nvoid CConfigShellExtPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/configuration.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nvoid CConfigShellExtPage::InitToolBarImageList()\r\n{\r\n    // Create the image list.\r\n    HBITMAP hBitmap;\r\n\r\n    // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n    int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n    \r\n    if (g_WinVer.m_ulMajorCCVersion >= 6 && iBitsPixel >= 32)\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32,0,6);\r\n        ImageList_Add(m_hToolBarImageList,hBitmap,NULL);\r\n    }\r\n    else\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP_));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,6);\r\n        ImageList_AddMasked(m_hToolBarImageList,hBitmap,RGB(255,0,255));\r\n    }\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nvoid CConfigShellExtPage::AddToolBarButton(int iCommand,int iBitmap)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = 0;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CConfigShellExtPage::CreateToolBarCtrl()\r\n{\r\n    RECT rcListView;\r\n    m_ListView.GetWindowRect(&rcListView);\r\n    ScreenToClient(&rcListView);\r\n\r\n    RECT rcToolBar = { 0,0,100,100 };\r\n    m_ToolBar.Create(m_hWnd,rcToolBar,NULL,ATL_SIMPLE_TOOLBAR_PANE_STYLE,NULL);\r\n    m_ToolBar.SetImageList(m_hToolBarImageList);\r\n    m_ToolBar.SetButtonStructSize();\r\n\r\n    // Create the buttons.\r\n    AddToolBarButton(ID_SHELLEXT_ADD,1);\r\n    AddToolBarButton(ID_SHELLEXT_REMOVE,3);\r\n    m_ToolBar.EnableButton(ID_SHELLEXT_REMOVE,false);\t// Disabled by default.\r\n\r\n    // Update the toolbar position.\r\n    int iToolBarWidth = 0;\r\n    RECT rcButton;\r\n\r\n    for (int i = 0; i < m_ToolBar.GetButtonCount(); i++)\r\n    {\r\n        m_ToolBar.GetItemRect(i,&rcButton);\r\n        iToolBarWidth += rcButton.right - rcButton.left;\r\n    }\r\n\r\n    m_ToolBar.SetWindowPos(NULL,\r\n        rcListView.right - iToolBarWidth,\r\n        rcListView.top - HIWORD(m_ToolBar.GetButtonSize()),\r\n        iToolBarWidth,\r\n        HIWORD(m_ToolBar.GetButtonSize()),0);\r\n}\r\n\r\nvoid CConfigShellExtPage::CheckListView()\r\n{\r\n    int iDelimiter,iLength;\r\n    TCHAR *szString;\r\n    TCHAR *szExt;\r\n\r\n    // Open registry.\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    int iItemIndex = -1;\r\n    iItemIndex = m_ListView.GetNextItem(iItemIndex,LVNI_ALL);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        szString = (TCHAR *)m_ListView.GetItemData(iItemIndex);\r\n        iDelimiter = FirstDelimiter(szString,'|');\r\n        szExt = szString + iDelimiter + 1;\r\n\r\n        // Parse the extension list.\r\n        iLength = lstrlen(szExt);\r\n        iDelimiter = 0;\r\n\r\n        bool bCheck = true;\r\n\r\n        for (int i = 0; i < iLength; i++)\r\n        {\r\n            if (szExt[i] == ',')\r\n            {\r\n                // Skip empty extensions.\r\n                if (iDelimiter == i)\r\n                {\r\n                    iDelimiter++;\r\n                    continue;\r\n                }\r\n\r\n                szExt[i] = '\\0';\r\n                //MessageBox(szExt + iDelimiter);\r\n                bCheck = bCheck && IsExtensionInstalled(szExt + iDelimiter,&Reg);\r\n                szExt[i] = ',';\r\n\r\n                iDelimiter = i + 1;\r\n\r\n                // Automatically left trim the (next) string.\r\n                while (i + 1 < iLength &&\r\n                    szExt[i + 1] == ' ')\r\n                {\r\n                    iDelimiter++;\r\n                    i++;\r\n                }\r\n            }\r\n        }\r\n\r\n        //MessageBox(szExt + iDelimiter);\r\n        bCheck = bCheck && IsExtensionInstalled(szExt + iDelimiter,&Reg);\r\n\r\n        m_ListView.SetCheckState(iItemIndex,bCheck);\r\n\r\n        iItemIndex = m_ListView.GetNextItem(iItemIndex,LVNI_ALL);\r\n    }\r\n}\r\n\r\n/*\r\n    CConfigShellExtPage::RegisterListItem\r\n    -------------------------------------\r\n    Registers or unregisters the list view item with the specified item index.\r\n*/\r\nvoid CConfigShellExtPage::RegisterListItem(CRegistry *pReg,int iItemIndex)\r\n{\r\n    TCHAR *szString = (TCHAR *)m_ListView.GetItemData(iItemIndex);\r\n    int iDelimiter = FirstDelimiter(szString,'|');\r\n    TCHAR *szExt = szString + iDelimiter + 1;\r\n\r\n    // Parse the extension list.\r\n    int iLength = lstrlen(szExt);\r\n    iDelimiter = 0;\r\n\r\n    bool bRegister = m_ListView.GetCheckState(iItemIndex) == TRUE;\r\n\r\n    for (int i = 0; i < iLength; i++)\r\n    {\r\n        if (szExt[i] == ',')\r\n        {\r\n            // Skip empty extensions.\r\n            if (iDelimiter == i)\r\n            {\r\n                iDelimiter++;\r\n                continue;\r\n            }\r\n\r\n            szExt[i] = '\\0';\r\n\r\n            // Register or unregister the file extension.\r\n            if (bRegister)\r\n            {\r\n                // We separate project files from disc images since they need\r\n                // another desciption.\r\n                if (!lstrcmp(szExt,_T(\".irp\")))\r\n                    InstallProjectExtension(pReg);\r\n                else\r\n                    InstallExtension(szExt + iDelimiter,pReg);\r\n            }\r\n            else\r\n                UninstallExtension(szExt + iDelimiter,pReg);\r\n\r\n            szExt[i] = ',';\r\n\r\n            iDelimiter = i + 1;\r\n\r\n            // Automatically left trim the (next) string.\r\n            while (i + 1 < iLength &&\r\n                szExt[i + 1] == ' ')\r\n            {\r\n                iDelimiter++;\r\n                i++;\r\n            }\r\n        }\r\n    }\r\n\r\n    // Register or unregister the file extension.\r\n    if (bRegister)\r\n    {\r\n        // We separate project files from disc images since they need another desciption.\r\n        if (!lstrcmp(szExt,_T(\".irp\")))\r\n            InstallProjectExtension(pReg);\r\n        else\r\n            InstallExtension(szExt + iDelimiter,pReg);\r\n    }\r\n    else\r\n        UninstallExtension(szExt + iDelimiter,pReg);\r\n}\r\n\r\n/*\r\n    CConfigShellExtPage::RegisterListView\r\n    -------------------------------------\r\n    Registers and unregisters all extensions found in the list view depending on\r\n    the item check state.\r\n*/\r\nvoid CConfigShellExtPage::RegisterListView()\r\n{\r\n    // Open registry.\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    int iItemIndex = -1;\r\n    iItemIndex = m_ListView.GetNextItem(iItemIndex,LVNI_ALL);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        // Register or unregister the item.\r\n        RegisterListItem(&Reg,iItemIndex);\r\n\r\n        iItemIndex = m_ListView.GetNextItem(iItemIndex,LVNI_ALL);\r\n    }\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Initialize the list view.\r\n    m_ListView = GetDlgItem(IDC_SHELLEXTLIST);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);\r\n\r\n    m_ListView.InsertColumn(0,lngGetString(COLUMN_DESCRIPTION),LVCFMT_LEFT,196,0);\r\n    m_ListView.InsertColumn(1,lngGetString(COLUMN_EXTENSIONS),LVCFMT_LEFT,150,0);\r\n\r\n    // Fill the list view.\r\n    int iItemCount = 0;\r\n    std::list<tstring>::iterator itNodeObject;\r\n    for (itNodeObject = g_GlobalSettings.m_szShellExt.begin(); itNodeObject != g_GlobalSettings.m_szShellExt.end(); itNodeObject++)\r\n    {\r\n        tstring apa = (*itNodeObject);\r\n\r\n        m_ListView.AddItem(iItemCount,0,LPSTR_TEXTCALLBACK);\r\n        m_ListView.AddItem(iItemCount,1,LPSTR_TEXTCALLBACK);\r\n        m_ListView.SetItemData(iItemCount,(DWORD_PTR)(*itNodeObject).c_str());\r\n\r\n        iItemCount++;\r\n    }\r\n\r\n    // Check the list view items.\r\n    CheckListView();\r\n\r\n    // Tool bar.\r\n    InitToolBarImageList();\r\n    CreateToolBarCtrl();\r\n\r\n    // Load configuration.\r\n    CheckDlgButton(IDC_SHELLEXTCHECK,IsShellExtensionRegistered());\r\n    CheckDlgButton(IDC_SHELLEXTSUBMENUCHECK,g_GlobalSettings.m_bShellExtSubMenu);\r\n    CheckDlgButton(IDC_SHELLEXTICONCHECK,g_GlobalSettings.m_bShellExtIcon);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnListAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CNewFileExtDlg NewFileExtDlg;\r\n\r\n    if (NewFileExtDlg.DoModal() == IDOK)\r\n    {\r\n        TCHAR szBuffer[128];\r\n        lstrcpy(szBuffer,NewFileExtDlg.m_szDescBuffer);\r\n        lstrcat(szBuffer,_T(\"|\"));\r\n        lstrcat(szBuffer,NewFileExtDlg.m_szExtBuffer);\r\n\r\n        g_GlobalSettings.m_szShellExt.push_back(szBuffer);\r\n\r\n        // Add the list item.\r\n        int iItemCount = m_ListView.GetItemCount();\r\n\r\n        m_ListView.AddItem(iItemCount,0,LPSTR_TEXTCALLBACK);\r\n        m_ListView.AddItem(iItemCount,1,LPSTR_TEXTCALLBACK);\r\n        m_ListView.SetItemData(iItemCount,(DWORD_PTR)(*--g_GlobalSettings.m_szShellExt.end()).c_str());\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnListRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    int iSelItem = m_ListView.GetSelectedIndex();\r\n\r\n    if (m_ListView.GetCheckState(iSelItem))\r\n    {\r\n        m_ListView.SetCheckState(iSelItem,false);\r\n\r\n        // Unregister the item extensions.\r\n        CRegistry Reg;\r\n        Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n        RegisterListItem(&Reg,iSelItem);\r\n    }\r\n\r\n    // Remove the list view item.\r\n    const TCHAR *szString = (const TCHAR *)m_ListView.GetItemData(iSelItem);\r\n    m_ListView.DeleteItem(m_ListView.GetSelectedIndex());\r\n\r\n    // Locate and remove the data from the global settings.\r\n    std::list<tstring>::iterator itNodeObject;\r\n    for (itNodeObject = g_GlobalSettings.m_szShellExt.begin(); itNodeObject != g_GlobalSettings.m_szShellExt.end(); itNodeObject++)\r\n    {\r\n        if (szString == (*itNodeObject).c_str())\r\n        {\r\n            g_GlobalSettings.m_szShellExt.erase(itNodeObject);\r\n            break;\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnToolBarGetInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // The string ID is the same as the button ID.\r\n    LPTOOLTIPTEXT pTipText = (LPTOOLTIPTEXT)pNMH;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a hint translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr((unsigned long)pTipText->hdr.idFrom,szStrValue))\r\n            {\r\n                pTipText->lpszText = szStrValue;\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n    return 0;\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ToolBar.IsWindow())\r\n    {\r\n        if (m_ListView.GetSelectedCount() > 0)\r\n            m_ToolBar.EnableButton(ID_SHELLEXT_REMOVE,true);\r\n        else\r\n            m_ToolBar.EnableButton(ID_SHELLEXT_REMOVE,false);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CConfigShellExtPage::OnListGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    NMLVDISPINFO *pDispInfo = (NMLVDISPINFO *)pNMH;\r\n    const TCHAR *szString = (const TCHAR *)pDispInfo->item.lParam;\r\n\r\n    if (pDispInfo->item.mask & LVIF_TEXT)\r\n    {\r\n        int iDelimiter = FirstDelimiter(szString,'|');\r\n\r\n        switch (pDispInfo->item.iSubItem)\r\n        {\r\n            case 0:\r\n                {\r\n                    TCHAR *pDelimiter = (TCHAR *)szString + iDelimiter;\r\n\r\n                    *pDelimiter = '\\0';\r\n                    lstrcpy(pDispInfo->item.pszText,szString);\r\n                    *pDelimiter = '|';\r\n                }\r\n                break;\r\n\r\n            case 1:\r\n                {\r\n                    lstrcpy(pDispInfo->item.pszText,(TCHAR *)szString + iDelimiter + 1);\r\n                }\r\n                break;\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/config_shell_ext_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"registry.hh\"\r\n\r\nclass CConfigShellExtPage : public CPropertyPageImpl<CConfigShellExtPage>\r\n{\r\nprivate:\r\n    HIMAGELIST m_hToolBarImageList;\r\n\r\n    CListViewCtrl m_ListView;\r\n    CToolBarCtrl m_ToolBar;\r\n\r\n    bool Translate();\r\n\r\n    void InitToolBarImageList();\r\n    void AddToolBarButton(int iCommand,int iBitmap);\r\n    void CreateToolBarCtrl();\r\n\r\n    void CheckListView();\r\n    void RegisterListItem(CRegistry *pReg,int iItemIndex);\r\n    void RegisterListView();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGSHELLEXT };\r\n\r\n    CConfigShellExtPage();\r\n    ~CConfigShellExtPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CConfigShellExtPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_ID_HANDLER(ID_SHELLEXT_ADD,OnListAdd)\r\n        COMMAND_ID_HANDLER(ID_SHELLEXT_REMOVE,OnListRemove)\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnToolBarGetInfo)\r\n\r\n        NOTIFY_HANDLER(IDC_SHELLEXTLIST,LVN_ITEMCHANGED,OnListItemChanged)\r\n        NOTIFY_HANDLER(IDC_SHELLEXTLIST,LVN_GETDISPINFO,OnListGetDispInfo)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigShellExtPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnListAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnListRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnToolBarGetInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    LRESULT OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnListGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/confirm_file_replace_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/convert.hh>\r\n#include \"confirm_file_replace_dlg.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"main_frm.hh\"\r\n\r\nCConfirmFileReplaceDlg::CConfirmFileReplaceDlg()\r\n{\r\n    m_Mode = MODE_ASK;\r\n    m_szNewFullPath = NULL;\r\n    m_pNewItemData = NULL;\r\n    m_pOldItemData = NULL;\r\n}\r\n\r\nCConfirmFileReplaceDlg::~CConfirmFileReplaceDlg()\r\n{\r\n}\r\n\r\nbool CConfirmFileReplaceDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is an erase translation section.\r\n    if (!pLng->EnterSection(_T(\"confirmfilereplace\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_CONFIRMFILEREPLACEDLG,szStrValue))\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDC_YESBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_YESBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_YESALLBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_YESALLBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_NOBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_NOBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_NOALLBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_NOALLBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_INFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_INFOSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_REPLACEINFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_REPLACEINFOSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_REPLACEINFO2STATIC,szStrValue))\r\n        SetDlgItemText(IDC_REPLACEINFO2STATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CConfirmFileReplaceDlg::Reset\r\n    -----------------------------\r\n    Resets the dialog box causing the next call to Execute to display the dialog.\r\n*/\r\nvoid CConfirmFileReplaceDlg::Reset()\r\n{\r\n    m_Mode = MODE_ASK;\r\n}\r\n\r\nbool CConfirmFileReplaceDlg::Execute()\r\n{\r\n    bool bResult = false;\r\n\r\n    switch (DoModal(*g_pMainFrame))\t// It's okay if g_pMainFrame->m_hWnd is NULL.\r\n    {\r\n        case IDC_YESBUTTON:\r\n            bResult = true;\r\n            break;\r\n        case IDC_YESALLBUTTON:\r\n            m_Mode = MODE_YESALL;\r\n            bResult = true;\r\n            break;\r\n        case IDC_NOBUTTON:\r\n            break;\r\n        case IDC_NOALLBUTTON:\r\n            m_Mode = MODE_NOALL;\r\n            break;\r\n    };\r\n\r\n    return bResult;\r\n}\r\n\r\n/*\r\n    CConfirmFileReplaceDlg::Execute\r\n    -------------------------------\r\n    Returns true if the file is selected to be replaced and false if it isn't.\r\n    This function will determine if it's necessary to display the dialog at\r\n    all. The user might have pressed the \"No to All\" or \"Yes to All\" buttons.\r\n*/\r\nbool CConfirmFileReplaceDlg::Execute(const TCHAR *szNewFullPath,CItemData *pOldItemData)\r\n{\r\n    // Should we ask the user?\r\n    if (m_Mode != MODE_ASK)\r\n        return m_Mode == MODE_YESALL ? true : false;\r\n\r\n    m_szNewFullPath = szNewFullPath;\r\n    m_pNewItemData = NULL;\r\n    m_pOldItemData = pOldItemData;\r\n\r\n    return Execute();\r\n}\r\n\r\nbool CConfirmFileReplaceDlg::Execute(CItemData *pNewItemData,CItemData *pOldItemData)\r\n{\r\n    // Should we ask the user?\r\n    if (m_Mode != MODE_ASK)\r\n        return m_Mode == MODE_YESALL ? true : false;\r\n\r\n    m_szNewFullPath = NULL;\r\n    m_pNewItemData = pNewItemData;\r\n    m_pOldItemData = pOldItemData;\r\n\r\n    return Execute();\r\n}\r\n\r\nLRESULT CConfirmFileReplaceDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Make sure that all necessary data has been supplied.\r\n    if ((m_szNewFullPath == NULL && m_pNewItemData == NULL) || m_pOldItemData == NULL)\r\n        return TRUE;\r\n\r\n    // Set the copy icon.\r\n    ::SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,\r\n        (WPARAM)LoadIcon(LoadLibrary(_T(\"shell32.dll\")),MAKEINTRESOURCE(146)),0L);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // File name.\r\n    TCHAR szNewFileText[128];\r\n    ::GetWindowText(GetDlgItem(IDC_INFOSTATIC),szNewFileText,\r\n        sizeof(szNewFileText) - 2 - lstrlen(m_pOldItemData->GetFileName()));\r\n    lstrcat(szNewFileText,_T(\"\\n\"));\r\n    lstrcat(szNewFileText,m_pOldItemData->GetFileName());\r\n    ::SetWindowText(GetDlgItem(IDC_INFOSTATIC),szNewFileText);\r\n\r\n    // Set old icon.\r\n    SHFILEINFO shInfo;\r\n    if (SHGetFileInfo(m_pOldItemData->szFullPath,0,&shInfo,sizeof(shInfo),\r\n        SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))\r\n    {\r\n        ::SendMessage(GetDlgItem(IDC_OLDICONSTATIC),STM_SETICON,(WPARAM)shInfo.hIcon,0L);\r\n    }\r\n\r\n    // Set old size.\r\n    TCHAR szTempBuffer[128];\r\n    FormatBytes(szTempBuffer,m_pOldItemData->uiSize);\r\n    ::SetWindowText(GetDlgItem(IDC_OLDSIZESTATIC),szTempBuffer);\r\n\r\n    // Set old date.\r\n    FILETIME ft;\r\n    SYSTEMTIME st;\r\n\r\n    TCHAR *szDatePattern = new TCHAR[lstrlen(lngGetString(MISC_MODIFIED)) + 24];\r\n    lstrcpy(szDatePattern,_T(\"'\"));\r\n    lstrcat(szDatePattern,lngGetString(MISC_MODIFIED));\r\n    lstrcat(szDatePattern,_T(\" 'dddd',' dd MMMM yyyy\"));\r\n\r\n    ::DosDateTimeToFileTime(m_pOldItemData->usFileDate,m_pOldItemData->usFileTime,&ft);\r\n    ::FileTimeToSystemTime(&ft,&st);\r\n    ::GetDateFormat(LOCALE_USER_DEFAULT,0,&st,szDatePattern,szTempBuffer,sizeof(szTempBuffer));\r\n    ::SetWindowText(GetDlgItem(IDC_OLDDATESTATIC),szTempBuffer);\r\n\r\n    if (m_szNewFullPath != NULL)\r\n    {\r\n        // Set new icon.\r\n        if (SHGetFileInfo(m_szNewFullPath,0,&shInfo,sizeof(shInfo),\r\n            SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))\r\n        {\r\n            ::SendMessage(GetDlgItem(IDC_NEWICONSTATIC),STM_SETICON,(WPARAM)shInfo.hIcon,0L);\r\n        }\r\n\r\n        // Set new size.\r\n        FormatBytes(szTempBuffer,ckcore::File::size(m_szNewFullPath));\r\n        ::SetWindowText(GetDlgItem(IDC_NEWSIZESTATIC),szTempBuffer);\r\n\r\n        // Set new date.\r\n        unsigned short usFileDate = 0,usFileTime = 0;\r\n\r\n        struct tm AccessTime,ModifyTime,CreateTime;\r\n        ckcore::File::time(m_szNewFullPath,AccessTime,ModifyTime,CreateTime);\r\n        ckcore::convert::tm_to_dostime(ModifyTime,usFileDate,usFileTime);\r\n\r\n        ::DosDateTimeToFileTime(usFileDate,usFileTime,&ft);\r\n        ::FileTimeToSystemTime(&ft,&st);\r\n        ::GetDateFormat(LOCALE_USER_DEFAULT,0,&st,szDatePattern,szTempBuffer,sizeof(szTempBuffer));\r\n        ::SetWindowText(GetDlgItem(IDC_NEWDATESTATIC),szTempBuffer);\r\n    }\r\n    else\r\n    {\r\n        // Set new icon.\r\n        if (SHGetFileInfo(m_pNewItemData->szFullPath,0,&shInfo,sizeof(shInfo),\r\n            SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))\r\n        {\r\n            ::SendMessage(GetDlgItem(IDC_NEWICONSTATIC),STM_SETICON,(WPARAM)shInfo.hIcon,0L);\r\n        }\r\n\r\n        // Set new size.\r\n        FormatBytes(szTempBuffer,m_pNewItemData->uiSize);\r\n        ::SetWindowText(GetDlgItem(IDC_NEWSIZESTATIC),szTempBuffer);\r\n\r\n        // Set new date.\r\n        ::DosDateTimeToFileTime(m_pNewItemData->usFileDate,m_pNewItemData->usFileTime,&ft);\r\n        ::FileTimeToSystemTime(&ft,&st);\r\n        ::GetDateFormat(LOCALE_USER_DEFAULT,0,&st,szDatePattern,szTempBuffer,sizeof(szTempBuffer));\r\n        ::SetWindowText(GetDlgItem(IDC_NEWDATESTATIC),szTempBuffer);\t\r\n    }\r\n\r\n    delete [] szDatePattern;\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfirmFileReplaceDlg::OnButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}"
  },
  {
    "path": "src/app/dialog/confirm_file_replace_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"tree_manager.hh\"\r\n\r\nclass CConfirmFileReplaceDlg : public CDialogImpl<CConfirmFileReplaceDlg>\r\n{\r\nprivate:\r\n    enum eMode\r\n    {\r\n        MODE_ASK,\r\n        MODE_YESALL,\r\n        MODE_NOALL\r\n    };\r\n\r\n    eMode m_Mode;\r\n    const TCHAR *m_szNewFullPath;\r\n    CItemData *m_pNewItemData;\r\n    CItemData *m_pOldItemData;\r\n\r\n    bool Translate();\r\n    bool Execute();\r\n\r\npublic:\r\n    enum { IDD = IDD_CONFIRMFILEREPLACEDLG };\r\n\r\n    CConfirmFileReplaceDlg();\r\n    ~CConfirmFileReplaceDlg();\r\n\r\n    void Reset();\r\n    bool Execute(const TCHAR *szNewFullPath,CItemData *pOldItemData);\r\n    bool Execute(CItemData *pNewItemData,CItemData *pOldItemData);\r\n\r\n    BEGIN_MSG_MAP(CConfirmFileReplaceDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDC_YESBUTTON,OnButton)\r\n        COMMAND_ID_HANDLER(IDC_YESALLBUTTON,OnButton)\r\n        COMMAND_ID_HANDLER(IDC_NOBUTTON,OnButton)\r\n        COMMAND_ID_HANDLER(IDC_NOALLBUTTON,OnButton)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/copy_disc_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"copy_disc_dlg.hh\"\r\n\r\nCCopyDiscDlg::CCopyDiscDlg(bool bAppMode) :\r\n    m_bCentered(false),m_bAppMode(bAppMode),\r\n    m_pSrcDevice(NULL),m_pDstDevice(NULL),\r\n    CPropertySheetImpl<CCopyDiscDlg>(lngGetString(COPYDISC_TITLE),0,NULL),\r\n    m_GeneralPage(),\r\n    m_ReadPage(false,false)\r\n{\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n    AddPage(m_AdvancedPage);\r\n    AddPage(m_ReadPage);\r\n}\r\n\r\nCCopyDiscDlg::~CCopyDiscDlg()\r\n{\r\n}\r\n\r\nLRESULT CCopyDiscDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    // Add the dialog to the task bar and enable it to be minimized.\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscDlg::OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (wParam == 1)\r\n        m_pSrcDevice = reinterpret_cast<ckmmc::Device *>(lParam);\r\n    else\r\n        m_pDstDevice = reinterpret_cast<ckmmc::Device *>(lParam);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscDlg::OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = TRUE;\r\n    return reinterpret_cast<LRESULT>(wParam == 1 ? m_pSrcDevice : m_pDstDevice);\r\n}\r\n\r\nLRESULT CCopyDiscDlg::OnSetCloneMode(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_ReadPage.SetCloneMode(wParam == TRUE);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/copy_disc_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"copy_disc_general_page.hh\"\r\n#include \"burn_advanced_page.hh\"\r\n#include \"read_options_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nclass CCopyDiscDlg : public CPropertySheetImpl<CCopyDiscDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n    bool m_bAppMode;\r\n    ckmmc::Device *m_pSrcDevice;\r\n    ckmmc::Device *m_pDstDevice;\r\n\r\n    CCopyDiscGeneralPage m_GeneralPage;\r\n    CBurnAdvancedPage m_AdvancedPage;\r\n    CReadOptionsPage m_ReadPage;\r\n\r\npublic:\r\n    CCopyDiscDlg(bool bAppMode);\r\n    ~CCopyDiscDlg();\r\n\r\n    BEGIN_MSG_MAP(CCopyDiscDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_SETDEVICE,OnSetDevice)\r\n        MESSAGE_HANDLER(WM_GETDEVICE,OnGetDevice)\r\n        MESSAGE_HANDLER(WM_SETCLONEMODE,OnSetCloneMode)\r\n\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CCopyDiscDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetCloneMode(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/copy_disc_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include \"infrarecorder.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"wait_dlg.hh\"\r\n#include \"scsi.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"version.hh\"\r\n#include \"visual_styles.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"copy_disc_general_page.hh\"\r\n\r\nCCopyDiscGeneralPage::CCopyDiscGeneralPage()\r\n{\r\n    m_uiParentTitleLen = 0;\r\n    m_hRefreshIcon = NULL;\r\n    m_hRefreshImageList = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n\r\n    // Specify which controls that are located beloe the burn on the fly warning\r\n    // label.\r\n    m_iCtrlsBelowOnFly.push_back(IDC_CLONECHECK);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_BEVELSTATIC5);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_WRITESPEEDSTATIC);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_WRITESPEEDCOMBO);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_WRITEMETHODSTATIC);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_WRITEMETHODCOMBO);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_BEVELSTATIC4);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_EJECTCHECK);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_SIMULATECHECK);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_BUPCHECK);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_PADCHECK);\r\n    m_iCtrlsBelowOnFly.push_back(IDC_FIXATECHECK);\r\n}\r\n\r\nCCopyDiscGeneralPage::~CCopyDiscGeneralPage()\r\n{\r\n    if (m_hRefreshImageList != NULL)\r\n        ImageList_Destroy(m_hRefreshImageList);\r\n\r\n    if (m_hRefreshIcon != NULL)\r\n        DestroyIcon(m_hRefreshIcon);\r\n}\r\n\r\nbool CCopyDiscGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a burn translation section.\r\n    if (!pLng->EnterSection(_T(\"burn\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_WRITESPEEDSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_WRITESPEEDSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_WRITESPEEDSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_WRITEMETHODSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_WRITEMETHODSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_WRITEMETHODSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_EJECTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_EJECTCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SIMULATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_SIMULATECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BUPCHECK,szStrValue))\r\n        SetDlgItemText(IDC_BUPCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_PADCHECK,szStrValue))\r\n        SetDlgItemText(IDC_PADCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FIXATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_FIXATECHECK,szStrValue);\r\n\r\n    // Make sure that there is a copy translation section.\r\n    if (!pLng->EnterSection(_T(\"copy\")))\r\n        return false;\r\n\r\n    if (pLng->GetValuePtr(IDC_SOURCESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SOURCESTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TARGETSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TARGETSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_ONFLYCHECK,szStrValue))\r\n        SetDlgItemText(IDC_ONFLYCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_ONFLYSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_ONFLYSTATIC,szStrValue);\r\n\r\n        int iDiff = UpdateStaticHeight(m_hWnd,IDC_ONFLYSTATIC,szStrValue);\r\n        if (iDiff > 0)\r\n        {\r\n            for (unsigned int i = 0; i < m_iCtrlsBelowOnFly.size(); i++)\r\n            {\r\n                RECT rcControl = { 0 };\r\n                ::GetWindowRect(GetDlgItem(m_iCtrlsBelowOnFly[i]),&rcControl);\r\n                ScreenToClient(&rcControl);\r\n\r\n                ::MoveWindow(GetDlgItem(m_iCtrlsBelowOnFly[i]),rcControl.left,\r\n                    rcControl.top + iDiff,rcControl.right - rcControl.left,\r\n                    rcControl.bottom - rcControl.top,TRUE);\r\n            }\r\n\r\n            /*RECT rcWindow = { 0 };\r\n            GetWindowRect(&rcWindow);\r\n\r\n            MoveWindow(rcWindow.left,\r\n                rcWindow.top,rcWindow.right - rcWindow.left,\r\n                rcWindow.bottom - rcWindow.top + iDiff,TRUE);*/\r\n        }\r\n    }\r\n    if (pLng->GetValuePtr(IDC_CLONECHECK,szStrValue))\r\n        SetDlgItemText(IDC_CLONECHECK,szStrValue);\r\n\r\n    // Make sure that the edit controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_WRITESPEEDCOMBO,iMaxStaticRight,true);\r\n        UpdateEditPos(m_hWnd,IDC_WRITEMETHODCOMBO,iMaxStaticRight,true);\r\n    }\r\n\r\n\r\n    return true;\r\n}\r\n\r\nbool CCopyDiscGeneralPage::InitRecorderMedia()\r\n{\r\n    if (m_uiParentTitleLen == 0)\r\n        m_uiParentTitleLen = GetParentWindow(this).GetWindowTextLength();\r\n\r\n    TCHAR szBuffer[256];\r\n    GetParentWindow(this).GetWindowText(szBuffer,m_uiParentTitleLen + 1);\r\n\r\n    ckmmc::Device &Device =\r\n        *reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                           m_TargetCombo.GetCurSel()));\r\n\r\n    Device.refresh();\r\n\r\n    // Get current profile.\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n\r\n    // Note: On CD-R/RW media the Test Write bit is valid only for Write Type\r\n    // 1 or 2 (Track at Once or Session at Once). On DVD-R media, the Test\r\n    // Write bit is valid only for Write Type 0 or 2 (Incremental or\r\n    // Disc-at-once). This is completely disregarded at the moment.\r\n    bool bSupportedProfile = false;\r\n    switch (Profile)\r\n    {\r\n        case ckmmc::Device::ckPROFILE_DVDRAM:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR_DL:\r\n            // Not sure about these:\r\n        case ckmmc::Device::ckPROFILE_BDROM:\r\n        case ckmmc::Device::ckPROFILE_BDR_SRM:\r\n        case ckmmc::Device::ckPROFILE_BDR_RRM:\r\n        case ckmmc::Device::ckPROFILE_BDRE:\r\n        case ckmmc::Device::ckPROFILE_HDDVDROM:\r\n        case ckmmc::Device::ckPROFILE_HDDVDR:\r\n        case ckmmc::Device::ckPROFILE_HDDVDRAM:\r\n            bSupportedProfile = true;\r\n\r\n            // Disable simulation (not supported for DVD+RW media).\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_CDR:\r\n        case ckmmc::Device::ckPROFILE_CDRW:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP:\r\n            bSupportedProfile = true;\r\n\r\n            // Enable simulation if supported by recorder.\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),\r\n                           Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_NONE:\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_INSERTBLANK));\r\n            break;\r\n\r\n        default:\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_UNSUPPORTED));\r\n            break;\r\n    }\r\n\r\n    GetParentWindow(this).SetWindowText(szBuffer);\r\n\r\n    if (bSupportedProfile)\r\n    {\r\n        // Maximum write speed.\r\n        m_WriteSpeedCombo.ResetContent();\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n        m_WriteSpeedCombo.SetItemData(0,static_cast<DWORD_PTR>(-1));\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        // Other supported write speeds.\r\n        const std::vector<ckcore::tuint32> &WriteSpeeds = Device.write_speeds();\r\n        std::vector<ckcore::tuint32>::const_iterator it;\r\n        for (it = WriteSpeeds.begin(); it != WriteSpeeds.end(); it++)\r\n        {\r\n            m_WriteSpeedCombo.AddString(ckmmc::util::kb_to_disp_speed(*it,Profile).c_str());\r\n            m_WriteSpeedCombo.SetItemData(m_WriteSpeedCombo.GetCount() - 1,\r\n                                          static_cast<DWORD_PTR>(ckmmc::util::kb_to_human_speed(*it,\r\n                                                                 /*ckmmc::Device::ckPROFILE_CDR*/Profile)));\r\n        }\r\n\r\n        // Write modes.\r\n        m_WriteMethodCombo.ResetContent();\r\n\r\n        if (Device.support(ckmmc::Device::ckWM_SAO))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_SAO));\r\n        if (Device.support(ckmmc::Device::ckWM_TAO))\r\n        {\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_TAO));\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_TAONOPREGAP));\r\n        }\r\n        if (Device.support(ckmmc::Device::ckWM_RAW96R))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW96R));\r\n        if (Device.support(ckmmc::Device::ckWM_RAW16))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW16));\r\n        if (Device.support(ckmmc::Device::ckWM_RAW96P))\r\n            m_WriteMethodCombo.AddString(lngGetString(WRITEMODE_RAW96P));\r\n\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n    }\r\n    else\r\n    {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CCopyDiscGeneralPage::InitRefreshButton()\r\n{\r\n    m_hRefreshIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_REFRESHICON),IMAGE_ICON,/*GetSystemMetrics(SM_CXICON)*/16,/*GetSystemMetrics(SM_CYICON)*/16,LR_DEFAULTCOLOR);\r\n\r\n    // In Windows XP there is a bug causing the button to loose it's themed style if\r\n    // assigned an icon. The solution to this is to assign an image list instead.\r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n        int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n\r\n        m_hRefreshImageList = ImageList_Create(16,16,ILC_COLOR32 | (iBitsPixel < 32 ? ILC_MASK : 0),0,1);\r\n        ImageList_AddIcon(m_hRefreshImageList,m_hRefreshIcon);\r\n\r\n        BUTTON_IMAGELIST bImageList;\r\n        bImageList.himl = m_hRefreshImageList;\r\n        bImageList.margin.left = 0;\r\n        bImageList.margin.top = 0;\r\n        bImageList.margin.right = 0;\r\n        bImageList.margin.bottom = 0;\r\n        bImageList.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BCM_SETIMAGELIST,0,(LPARAM)&bImageList);\r\n    }\r\n    else\r\n    {\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BM_SETIMAGE,IMAGE_ICON,(LPARAM)m_hRefreshIcon);\r\n    }\r\n\r\n    // If the application is themed, then adjust the size of the button.\r\n    if (g_VisualStyles.IsThemeActive())\r\n    {\r\n        RECT rcButton;\r\n        ::GetWindowRect(GetDlgItem(IDC_REFRESHBUTTON),&rcButton);\r\n        ScreenToClient(&rcButton);\r\n        ::SetWindowPos(GetDlgItem(IDC_REFRESHBUTTON),NULL,rcButton.left - 1,rcButton.top - 1,\r\n            rcButton.right - rcButton.left + 2,rcButton.bottom - rcButton.top + 2,0);\r\n    }\r\n}\r\n\r\nvoid CCopyDiscGeneralPage::CheckRecorderMedia()\r\n{\r\n    bool bMediaInit = InitRecorderMedia();\r\n    if (!bMediaInit)\r\n    {\r\n        // Write speed.\r\n        m_WriteSpeedCombo.ResetContent();\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        // Write method.\r\n        m_WriteMethodCombo.ResetContent();\r\n        m_WriteMethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n    }\r\n\r\n    m_WriteSpeedCombo.EnableWindow(bMediaInit);\r\n    m_WriteMethodCombo.EnableWindow(bMediaInit);\r\n    ::EnableWindow(::GetDlgItem(GetParent(),IDOK),bMediaInit);\r\n    ::EnableWindow(GetDlgItem(IDC_WRITESPEEDSTATIC),bMediaInit);\r\n    ::EnableWindow(GetDlgItem(IDC_WRITEMETHODSTATIC),bMediaInit);\r\n}\r\n\r\nbool CCopyDiscGeneralPage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    g_CopyDiscSettings.m_bOnFly = IsDlgButtonChecked(IDC_ONFLYCHECK) == TRUE;\r\n    g_CopyDiscSettings.m_bClone = IsDlgButtonChecked(IDC_CLONECHECK) == TRUE;\r\n    g_BurnImageSettings.m_bEject = IsDlgButtonChecked(IDC_EJECTCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bSimulate = IsDlgButtonChecked(IDC_SIMULATECHECK) == TRUE;\r\n    g_BurnImageSettings.m_bBUP = IsDlgButtonChecked(IDC_BUPCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bPadTracks = IsDlgButtonChecked(IDC_PADCHECK) == TRUE;\r\n    g_BurnImageSettings.m_bFixate = IsDlgButtonChecked(IDC_FIXATECHECK) == TRUE;\r\n\r\n    ckmmc::Device *pSrcDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n\r\n    if (g_CopyDiscSettings.m_bOnFly && !AnalyzeDriveMedia(*pSrcDevice))\r\n    {\r\n        MessageBox(_T(\"Unable to get source drive media information. Can not continue.\"),lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    // For internal use only.\r\n    g_CopyDiscSettings.m_pSource =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n    g_CopyDiscSettings.m_pTarget =\r\n        reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                          m_TargetCombo.GetCurSel()));\r\n\r\n    g_BurnImageSettings.m_iWriteSpeed = static_cast<int>(m_WriteSpeedCombo.GetItemData(m_WriteSpeedCombo.GetCurSel()));\r\n    \r\n    TCHAR szBuffer[32];\r\n    GetDlgItemText(IDC_WRITEMETHODCOMBO,szBuffer,32);\r\n\r\n    if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_SAO)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_SAO;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_TAO)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_TAO;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_TAONOPREGAP)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_TAONOPREGAP;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW96R)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW96R;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW16)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW16;\r\n    else if (!lstrcmp(szBuffer,lngGetString(WRITEMODE_RAW96P)))\r\n        g_BurnImageSettings.m_iWriteMethod = WRITEMETHOD_RAW96P;\r\n\r\n    g_BurnImageSettings.m_lNumCopies = 1;\r\n    return true;\r\n}\r\n\r\nvoid CCopyDiscGeneralPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/copy_data_disc.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_SourceCombo = GetDlgItem(IDC_SOURCECOMBO);\r\n    m_TargetCombo = GetDlgItem(IDC_TARGETCOMBO);\r\n    m_WriteSpeedCombo = GetDlgItem(IDC_WRITESPEEDCOMBO);\r\n    m_WriteMethodCombo = GetDlgItem(IDC_WRITEMETHODCOMBO);\r\n\r\n    // Set the refresh button icon.\r\n    InitRefreshButton();\r\n\r\n    // Source combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        m_SourceCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_SourceCombo.SetItemData(m_SourceCombo.GetCount() - 1,\r\n                                  reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_SourceCombo.GetCount() == 0)\r\n    {\r\n        m_SourceCombo.AddString(lngGetString(FAILURE_NODEVICES));\r\n        m_SourceCombo.EnableWindow(false);\r\n    }\r\n\r\n    m_SourceCombo.SetCurSel(0);\r\n\r\n    // Target combo box.\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        // We only want to add recorder to the list.\r\n        if (!pDevice->recorder())\r\n            continue;\r\n\r\n        m_TargetCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_TargetCombo.SetItemData(m_TargetCombo.GetCount() - 1,\r\n                                  reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_TargetCombo.GetCount() == 0)\r\n    {\r\n        m_TargetCombo.AddString(lngGetString(FAILURE_NORECORDERS));\r\n        m_TargetCombo.EnableWindow(false);\r\n        m_TargetCombo.SetCurSel(0);\r\n\r\n        m_WriteSpeedCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteSpeedCombo.EnableWindow(false);\r\n        m_WriteSpeedCombo.SetCurSel(0);\r\n\r\n        m_WriteMethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_WriteMethodCombo.EnableWindow(false);\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(::GetDlgItem(GetParent(),IDOK),false);\r\n    }\r\n    else\r\n    {\r\n        m_TargetCombo.SetCurSel(0);\r\n\r\n        BOOL bDummy;\r\n        OnTargetChange(NULL,NULL,NULL,bDummy);\r\n    }\r\n\r\n    // Setup the default settings.\r\n    CheckDlgButton(IDC_ONFLYCHECK,g_CopyDiscSettings.m_bOnFly);\r\n    CheckDlgButton(IDC_CLONECHECK,g_CopyDiscSettings.m_bClone);\r\n        ::SendMessage(GetParent(),WM_SETCLONEMODE,g_CopyDiscSettings.m_bClone,0);\r\n    CheckDlgButton(IDC_EJECTCHECK,g_BurnImageSettings.m_bEject);\r\n    CheckDlgButton(IDC_SIMULATECHECK,g_BurnImageSettings.m_bSimulate);\r\n    CheckDlgButton(IDC_BUPCHECK,g_BurnImageSettings.m_bBUP);\r\n    CheckDlgButton(IDC_PADCHECK,g_BurnImageSettings.m_bPadTracks);\r\n    CheckDlgButton(IDC_FIXATECHECK,g_BurnImageSettings.m_bFixate);\r\n\r\n    BOOL bDummy;\r\n    OnFlyCheck(NULL,NULL,NULL,bDummy);\r\n\r\n    if (::IsWindowEnabled(::GetDlgItem(GetParent(),IDOK)))\r\n        OnCloneCheck(NULL,NULL,NULL,bDummy);\r\n\r\n    // Make sure that the same device is not selected as both target and source.\r\n    OnSourceChange(NULL,NULL,NULL,bDummy);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDstDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                          m_TargetCombo.GetCurSel()));\r\n\r\n    // Check for media change.\r\n    if (g_Core2.CheckMediaChange(*pDstDevice))\r\n        CheckRecorderMedia();\r\n\r\n    return TRUE;\r\n}\r\n\r\nunsigned long CCopyDiscGeneralPage::MSFToLBA(unsigned long ulMin,unsigned long ulSec,\r\n                                             unsigned long ulFrame)\r\n{\r\n    return ((ulMin * 60 * 75) + (ulSec * 75) + ulFrame - 150);\r\n}\r\n\r\nbool CCopyDiscGeneralPage::AnalyzeDriveMedia(ckmmc::Device &Device)\r\n{\r\n    // Rescan the bus.\r\n    CWaitDlg WaitDlg;\r\n    WaitDlg.Create(m_hWnd);\r\n    WaitDlg.ShowWindow(SW_SHOW);\r\n        // Initialize device (detect drive letter, open handle, count tracks).\r\n        WaitDlg.SetMessage(lngGetString(INIT_DEVICECD));\r\n\r\n        TCHAR szDriveLetter[3];\r\n        szDriveLetter[0] = Device.address().device_[0];\r\n        szDriveLetter[1] = ':';\r\n        szDriveLetter[2] = '\\0';\r\n\r\n        // Get the allocated space on the source drive.\r\n        ULARGE_INTEGER uiAvailable;\r\n        ULARGE_INTEGER uiTotal;\r\n        ULARGE_INTEGER uiFree;\r\n        uiAvailable.QuadPart = 0;\r\n        uiTotal.QuadPart = 0;\r\n        uiFree.QuadPart = 0;\r\n\r\n        if (GetDiskFreeSpaceEx(szDriveLetter,&uiAvailable,&uiTotal,&uiFree))\r\n            g_CopyDiscSettings.m_uiSourceSize = uiTotal.QuadPart;\r\n    WaitDlg.DestroyWindow();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnSourceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pSrcDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n    ckmmc::Device *pDstDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                          m_TargetCombo.GetCurSel()));\r\n\r\n    ::SendMessage(GetParent(),WM_SETDEVICE,1,reinterpret_cast<LPARAM>(pSrcDevice));\r\n\r\n    // Disable/enable the record on the fly button.\r\n    ::EnableWindow(GetDlgItem(IDC_ONFLYCHECK),pSrcDevice != pDstDevice);\r\n    if (pSrcDevice == pDstDevice)\r\n        CheckDlgButton(IDC_ONFLYCHECK,false);\r\n\r\n    BOOL bDummy;\r\n    OnFlyCheck(NULL,NULL,NULL,bDummy);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnTargetChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // If you insert a CD and immediately open this dialog, the application\r\n    // will be unresponsive for a few seconds while the device is being opened\r\n    // [see m_CurDevice.Open() below]. It would be best to avoid that pause\r\n    // altogether, but at least we display the hourglass cursor here, to let\r\n    // the user know he should be patient, otherwise he might try to click all\r\n    // over the place and wonder why nothing happens.\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    ckmmc::Device *pSrcDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n    ckmmc::Device *pDstDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                          m_TargetCombo.GetCurSel()));\r\n\r\n    ::SendMessage(GetParent(),WM_SETDEVICE,0,reinterpret_cast<LPARAM>(pDstDevice));\r\n\r\n    // Kill any already running timers.\r\n    ::KillTimer(m_hWnd,TIMER_ID);\r\n    ::SetTimer(m_hWnd,TIMER_ID,TIMER_INTERVAL,NULL);\r\n\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    // General.\r\n    ::EnableWindow(GetDlgItem(IDC_BUPCHECK),\r\n                   pDstDevice->support(ckmmc::Device::ckDEVICE_BUP));\r\n\r\n    // Suggest an appropriate write method if necessary.\r\n    BOOL bDummy;\r\n    if (IsDlgButtonChecked(IDC_ONFLYCHECK) == FALSE)\r\n        OnCloneCheck(0,0,NULL,bDummy);\r\n    else\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n\r\n    // Disable/enable the record on the fly button.\r\n    ::EnableWindow(GetDlgItem(IDC_ONFLYCHECK),pSrcDevice != pDstDevice);\r\n    if (pSrcDevice == pDstDevice)\r\n        CheckDlgButton(IDC_ONFLYCHECK,false);\r\n\r\n    OnFlyCheck(NULL,NULL,NULL,bDummy);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnFlyCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Enable/disable the clone disc check box.\r\n    if (IsDlgButtonChecked(IDC_ONFLYCHECK) == FALSE)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_CLONECHECK),TRUE);\r\n    }\r\n    else\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_CLONECHECK),FALSE);\r\n\r\n        // Select the top write method (usually SAO).\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n\r\n        // Disable and uncheck the clone check box.\r\n        CheckDlgButton(IDC_CLONECHECK,FALSE);\r\n        ::SendMessage(GetParent(),WM_SETCLONEMODE,FALSE,0);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnCloneCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Try to select a recommended write method.\r\n    if (IsDlgButtonChecked(IDC_CLONECHECK))\r\n    {\r\n        ::SendMessage(GetParent(),WM_SETCLONEMODE,TRUE,0);\r\n\r\n        ckmmc::Device &DstDevice =\r\n            *reinterpret_cast<ckmmc::Device *>(m_TargetCombo.GetItemData(\r\n                                               m_TargetCombo.GetCurSel()));\r\n\r\n        // Check for supported write modes. Raw96r has the highest priority, if\r\n        // that's not support the raw16 mode is recommended, if none of the mentioned\r\n        // write modes are supported a warning message is displayed.\r\n        int uiStrID = -1;\r\n\r\n        if (DstDevice.support(ckmmc::Device::ckWM_RAW96R))\r\n            uiStrID = WRITEMODE_RAW96R;\r\n        else if (DstDevice.support(ckmmc::Device::ckWM_RAW16))\r\n            uiStrID = WRITEMODE_RAW16;\r\n\r\n        const TCHAR *szStr = lngGetString(uiStrID);\r\n\r\n        if (uiStrID != -1)\r\n        {\r\n            TCHAR szItemText[128];\r\n\r\n            for (int i = 0; i < m_WriteMethodCombo.GetCount(); i++)\r\n            {\r\n                if (m_WriteMethodCombo.GetLBTextLen(i) >= (sizeof(szItemText) / sizeof(TCHAR)))\r\n                    continue;\r\n\r\n                m_WriteMethodCombo.GetLBText(i,szItemText);\r\n                if (!lstrcmp(szItemText,szStr))\r\n                {\r\n                    m_WriteMethodCombo.SetCurSel(i);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            // No good raw writing mode found.\r\n            MessageBox(lngGetString(WARNING_CLONEWRITEMETHOD),lngGetString(GENERAL_WARNING),\r\n                MB_OK | MB_ICONWARNING);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        ::SendMessage(GetParent(),WM_SETCLONEMODE,FALSE,0);\r\n\r\n        m_WriteMethodCombo.SetCurSel(0);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyDiscGeneralPage::OnFixateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!IsDlgButtonChecked(IDC_FIXATECHECK))\r\n    {\r\n        // Display warning message.\r\n        if (g_GlobalSettings.m_bFixateWarning)\r\n        {\r\n            CInfoDlg InfoDlg(&g_GlobalSettings.m_bFixateWarning,lngGetString(WARNING_NOFIXATION),INFODLG_ICONWARNING);\r\n            if (InfoDlg.DoModal() == IDCANCEL)\r\n                CheckDlgButton(IDC_FIXATECHECK,true);\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/copy_disc_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"resource.h\"\r\n#include \"core2.hh\"\r\n\r\nclass CCopyDiscGeneralPage : public CPropertyPageImpl<CCopyDiscGeneralPage>\r\n{\r\nprivate:\r\n    unsigned int m_uiParentTitleLen;\r\n    HICON m_hRefreshIcon;\r\n    HIMAGELIST m_hRefreshImageList;\r\n\r\n    CComboBox m_SourceCombo;\r\n    CComboBox m_TargetCombo;\r\n    CComboBox m_WriteSpeedCombo;\r\n    CComboBox m_WriteMethodCombo;\r\n\r\n    // This vectors holds the IDs of all controls located below the burn on the fly\r\n    // warning label. These controls will be moved to make the translated text fit\r\n    // if necessary.\r\n    std::vector<int> m_iCtrlsBelowOnFly;\r\n\r\n    enum\r\n    {\r\n        TIMER_ID = 42,\r\n        TIMER_INTERVAL = 1000\r\n    };\r\n\r\n    bool Translate();\r\n    bool InitRecorderMedia();\r\n    bool AnalyzeDriveMedia(ckmmc::Device &Device);\r\n    void InitRefreshButton();\r\n    void CheckRecorderMedia();\r\n\r\n    unsigned long MSFToLBA(unsigned long ulMin,unsigned long ulSec,unsigned long ulFrame);\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_COPYDISCGENERAL };\r\n\r\n    CCopyDiscGeneralPage();\r\n    ~CCopyDiscGeneralPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CCopyDiscGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_TIMER,OnTimer)\r\n        COMMAND_HANDLER(IDC_SOURCECOMBO,CBN_SELCHANGE,OnSourceChange)\r\n        COMMAND_HANDLER(IDC_TARGETCOMBO,CBN_SELCHANGE,OnTargetChange)\r\n        COMMAND_HANDLER(IDC_REFRESHBUTTON,BN_CLICKED,OnRefresh)\r\n        COMMAND_HANDLER(IDC_FIXATECHECK,BN_CLICKED,OnFixateCheck)\r\n        COMMAND_ID_HANDLER(IDC_ONFLYCHECK,OnFlyCheck)\r\n        COMMAND_ID_HANDLER(IDC_CLONECHECK,OnCloneCheck)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CCopyDiscGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnSourceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnTargetChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFlyCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCloneCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFixateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/copy_image_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"copy_image_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"wait_dlg.hh\"\r\n#include \"scsi.hh\"\r\n\r\nCCopyImageDlg::CCopyImageDlg(bool bAppMode) :\r\n    m_bCentered(false),m_bAppMode(bAppMode),m_pSrcDevice(NULL),\r\n    CPropertySheetImpl<CCopyImageDlg>(lngGetString(COPYIMAGE_TITLE),0,NULL),\r\n    m_ReadPage(true,true)\r\n{\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n    AddPage(m_ReadPage);\r\n}\r\n\r\nCCopyImageDlg::~CCopyImageDlg()\r\n{\r\n}\r\n\r\nLRESULT CCopyImageDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    // Add the dialog to the task bar and enable it to be minimized.\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyImageDlg::OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_pSrcDevice = reinterpret_cast<ckmmc::Device *>(lParam);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyImageDlg::OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    bHandled = TRUE;\r\n    return reinterpret_cast<LRESULT>(m_pSrcDevice);\r\n}\r\n\r\nLRESULT CCopyImageDlg::OnCheckMediaBroadcast(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (m_GeneralPage.IsWindow())\r\n        ::SendMessage(m_GeneralPage,WM_CHECKMEDIA,wParam,lParam);\r\n    if (m_ReadPage.IsWindow())\r\n        ::SendMessage(m_ReadPage,WM_CHECKMEDIA,wParam,lParam);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n\r\nTCHAR *CCopyImageDlg::GetFileName()\r\n{\r\n    return m_GeneralPage.GetFileName();\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/copy_image_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"copy_image_general_page.hh\"\r\n#include \"read_options_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nclass CCopyImageDlg : public CPropertySheetImpl<CCopyImageDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n    bool m_bAppMode;\r\n    ckmmc::Device *m_pSrcDevice;\r\n\r\n    CCopyImageGeneralPage m_GeneralPage;\r\n    CReadOptionsPage m_ReadPage;\r\n\r\npublic:\r\n    CCopyImageDlg(bool bAppMode);\r\n    ~CCopyImageDlg();\r\n\r\n    BEGIN_MSG_MAP(CCopyImageDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_SETDEVICE,OnSetDevice)\r\n        MESSAGE_HANDLER(WM_GETDEVICE,OnGetDevice)\r\n        MESSAGE_HANDLER(WM_CHECKMEDIA_BROADCAST,OnCheckMediaBroadcast)\r\n\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CCopyImageDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetDevice(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCheckMediaBroadcast(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    TCHAR *GetFileName();\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/copy_image_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"version.hh\"\r\n#include \"visual_styles.hh\"\r\n#include \"device_util.hh\"\r\n#include \"copy_image_general_page.hh\"\r\n\r\nCCopyImageGeneralPage::CCopyImageGeneralPage()\r\n{\r\n    m_uiParentTitleLen = 0;\r\n    m_hRefreshIcon = NULL;\r\n    m_hRefreshImageList = NULL;\r\n\r\n    m_szFileName[0] = '\\0';\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCCopyImageGeneralPage::~CCopyImageGeneralPage()\r\n{\r\n    if (m_hRefreshImageList != NULL)\r\n        ImageList_Destroy(m_hRefreshImageList);\r\n\r\n    if (m_hRefreshIcon != NULL)\r\n        DestroyIcon(m_hRefreshIcon);\r\n}\r\n\r\nbool CCopyImageGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a copy translation section.\r\n    if (!pLng->EnterSection(_T(\"copy\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_SOURCESTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_SOURCESTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_SOURCESTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_IMAGESTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_IMAGESTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_IMAGESTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n\r\n    // Make sure that the edit/combo controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_SOURCECOMBO,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_IMAGEEDIT,iMaxStaticRight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CCopyImageGeneralPage::InitRefreshButton()\r\n{\r\n    m_hRefreshIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_REFRESHICON),IMAGE_ICON,/*GetSystemMetrics(SM_CXICON)*/16,/*GetSystemMetrics(SM_CYICON)*/16,LR_DEFAULTCOLOR);\r\n\r\n    // In Windows XP there is a bug causing the button to loose it's themed style if\r\n    // assigned an icon. The solution to this is to assign an image list instead.\r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n        int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n\r\n        m_hRefreshImageList = ImageList_Create(16,16,ILC_COLOR32 | (iBitsPixel < 32 ? ILC_MASK : 0),0,1);\r\n        ImageList_AddIcon(m_hRefreshImageList,m_hRefreshIcon);\r\n\r\n        BUTTON_IMAGELIST bImageList;\r\n        bImageList.himl = m_hRefreshImageList;\r\n        bImageList.margin.left = 0;\r\n        bImageList.margin.top = 0;\r\n        bImageList.margin.right = 0;\r\n        bImageList.margin.bottom = 0;\r\n        bImageList.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BCM_SETIMAGELIST,0,(LPARAM)&bImageList);\r\n    }\r\n    else\r\n    {\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BM_SETIMAGE,IMAGE_ICON,(LPARAM)m_hRefreshIcon);\r\n    }\r\n\r\n    // If the application is themed, then adjust the size of the button.\r\n    if (g_VisualStyles.IsThemeActive())\r\n    {\r\n        RECT rcButton;\r\n        ::GetWindowRect(GetDlgItem(IDC_REFRESHBUTTON),&rcButton);\r\n        ScreenToClient(&rcButton);\r\n        ::SetWindowPos(GetDlgItem(IDC_REFRESHBUTTON),NULL,rcButton.left - 1,rcButton.top - 1,\r\n            rcButton.right - rcButton.left + 2,rcButton.bottom - rcButton.top + 2,0);\r\n    }\r\n}\r\n\r\nbool CCopyImageGeneralPage::OnApply()\r\n{\r\n    // For internal use only.\r\n    g_CopyDiscSettings.m_pSource =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n\r\n    GetDlgItemText(IDC_IMAGEEDIT,m_szFileName,MAX_PATH - 1);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CCopyImageGeneralPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/copy_data_disc.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CCopyImageGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_SourceCombo = GetDlgItem(IDC_SOURCECOMBO);\r\n\r\n    // Set the refresh button icon.\r\n    InitRefreshButton();\r\n\r\n    // Source combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        m_SourceCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_SourceCombo.SetItemData(m_SourceCombo.GetCount() - 1,\r\n                                  reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_SourceCombo.GetCount() == 0)\r\n    {\r\n        m_SourceCombo.AddString(lngGetString(FAILURE_NODEVICES));\r\n        m_SourceCombo.SetItemData(0,0);\r\n\r\n        m_SourceCombo.EnableWindow(false);\r\n        ::EnableWindow(GetDlgItem(IDC_BROWSEBUTTON),false);\r\n    }\r\n\r\n    m_SourceCombo.SetCurSel(0);\r\n\r\n    // Disable the OK button.\r\n    ::EnableWindow(::GetDlgItem(GetParent(),IDOK),false);\r\n\r\n    // Let the parent know which source drive that's selected.\r\n    BOOL bDummy;\r\n    OnSourceChange(NULL,NULL,NULL,bDummy);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CCopyImageGeneralPage::OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(m_SourceCombo.GetCurSel()));\r\n\r\n    ATLASSERT(sizeof(ckmmc::Device *) == sizeof(LPARAM));\r\n\r\n    // Check for media change.\r\n    if (g_Core2.CheckMediaChange(*pDevice))\r\n    {\r\n        GetParentWindow(this).SendMessage(WM_CHECKMEDIA_BROADCAST,0,\r\n                                          reinterpret_cast<LPARAM>(pDevice));\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CCopyImageGeneralPage::OnSourceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pSrcDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_SourceCombo.GetItemData(\r\n                                          m_SourceCombo.GetCurSel()));\r\n\r\n    ::SendMessage(GetParent(),WM_SETDEVICE,1,reinterpret_cast<LPARAM>(pSrcDevice));\r\n\r\n    // Kill any already running timers.\r\n    ::KillTimer(m_hWnd,TIMER_ID);\r\n    ::SetTimer(m_hWnd,TIMER_ID,TIMER_INTERVAL,NULL);\r\n\r\n    // Initialize the drive media.\r\n    GetParentWindow(this).SendMessage(WM_CHECKMEDIA_BROADCAST,0,\r\n        m_SourceCombo.GetItemData(m_SourceCombo.GetCurSel()));\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyImageGeneralPage::OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Initialize the drive media.\r\n    GetParentWindow(this).SendMessage(WM_CHECKMEDIA_BROADCAST,0,\r\n        m_SourceCombo.GetItemData(m_SourceCombo.GetCurSel()));\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CCopyImageGeneralPage::OnBrowse(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(false,_T(\"iso\"),_T(\"Untitled\"),OFN_EXPLORER | OFN_OVERWRITEPROMPT,\r\n        _T(\"Disc Images (*.iso)\\0*.iso\\0\\0\"),m_hWnd);\r\n    \r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        SetDlgItemText(IDC_IMAGEEDIT,FileDialog.m_szFileName);\r\n        ::EnableWindow(::GetDlgItem(GetParent(),IDOK),true);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nTCHAR *CCopyImageGeneralPage::GetFileName()\r\n{\r\n    return m_szFileName;\r\n}"
  },
  {
    "path": "src/app/dialog/copy_image_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"core2.hh\"\r\n\r\nclass CCopyImageGeneralPage : public CPropertyPageImpl<CCopyImageGeneralPage>\r\n{\r\nprivate:\r\n    unsigned int m_uiParentTitleLen;\r\n    HICON m_hRefreshIcon;\r\n    HIMAGELIST m_hRefreshImageList;\r\n\r\n    CComboBox m_SourceCombo;\r\n\r\n    // File name of the target image file.\r\n    TCHAR m_szFileName[MAX_PATH];\r\n\r\n    enum\r\n    {\r\n        TIMER_ID = 42,\r\n        TIMER_INTERVAL = 1000\r\n    };\r\n\r\n    bool Translate();\r\n    void InitRefreshButton();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_COPYIMAGEGENERAL };\r\n\r\n    CCopyImageGeneralPage();\r\n    ~CCopyImageGeneralPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CCopyImageGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_TIMER,OnTimer)\r\n        COMMAND_HANDLER(IDC_SOURCECOMBO,CBN_SELCHANGE,OnSourceChange)\r\n        COMMAND_HANDLER(IDC_REFRESHBUTTON,BN_CLICKED,OnRefresh)\r\n        COMMAND_ID_HANDLER(IDC_BROWSEBUTTON,OnBrowse)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CCopyImageGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnSourceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBrowse(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    TCHAR *GetFileName();\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/device_advanced_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"cdrtools_parse_strings.hh\"\r\n#include \"device_advanced_page.hh\"\r\n\r\nCDeviceAdvancedPage::CDeviceAdvancedPage(ckmmc::Device &Device) :\r\n    m_Device(Device)\r\n{\r\n    // If set to true the list view will not accept any item changes, that\r\n    // includes both selection and checking.\r\n    m_bLockAdvList = false;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_ADVANCED,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n}\r\n\r\nCDeviceAdvancedPage::~CDeviceAdvancedPage()\r\n{\r\n}\r\n\r\nbool CDeviceAdvancedPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a device translation section.\r\n    if (!pLng->EnterSection(_T(\"device\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_INFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_INFOSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CDeviceAdvancedPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Fill the list view.\r\n    m_ListView.SubclassWindow(GetDlgItem(IDC_ADVLIST));\r\n    m_ListView.Initialize();\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_CHECKBOXES);\r\n\r\n    m_ListView.AddColumn(_T(\"\"),0);\r\n    m_ListView.SetColumnWidth(0,370);\r\n\r\n    // General.\r\n    unsigned int uiItemCount = 0;\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_MODE2FORM1));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_MODE_2_FORM_1));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_MODE2FORM2));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_MODE_2_FORM_2));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READDIGAUDIO));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_CDDA_SUPPORTED));\r\n\r\n    if (m_Device.support(ckmmc::Device::ckDEVICE_CDDA_SUPPORTED))\r\n    {\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RESTARTNSDARA));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_CDDA_ACCURATE));\r\n    }\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READMULTSESSION));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_MULTI_SESSION));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READFIXPACKET));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_METHOD_2));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READBARCODE));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_READ_BAR_CODE));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READRWSUBCODE));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_RW_SUPPORTED));\r\n\r\n    if (m_Device.support(ckmmc::Device::ckDEVICE_RW_SUPPORTED))\r\n    {\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_READRAWPWSC));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_RW_DEINT_CORR));\r\n    }\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_SIMULATION));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_BUFRECORDING));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_BUP));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_C2EP));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_C2_POINTERS));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_EJECTCDSS));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_EJECT));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_CHANGEDISCSIDE));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_CHANGE_SIDES));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_INDIVIDUALDP));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_CHANGE_DISC_PRSNT));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RETURNCDCN));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_UPC));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RETURNCDISRC));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_ISRC));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_DELIVCOMPOSITE));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_COMPOSITE));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_PLAYAUDIOCD));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_AUDIO_PLAY));\r\n\r\n    if (m_Device.support(ckmmc::Device::ckDEVICE_AUDIO_PLAY))\r\n    {\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_INDIVIDUALVC));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_SEP_CHAN_VOL));\r\n\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_INDEPENDENTMUTE));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_SEP_CHAN_MUTE));\r\n\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_DOPORT1));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_DIGITAL_PORT_1));\r\n\r\n        m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_DOPORT2));\r\n        m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_DIGITAL_PORT_2));\r\n\r\n        // Digital output.\r\n        if (m_Device.support(ckmmc::Device::ckDEVICE_DIGITAL_PORT_1) ||\r\n            m_Device.support(ckmmc::Device::ckDEVICE_DIGITAL_PORT_2))\r\n        {\r\n            m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_DOSENDDIGDAT));\r\n            m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_LSBF));\r\n\r\n            m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_DOSETLRCK));\r\n            m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_RCK));\r\n\r\n            m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_HASVALIDDATA));\r\n            m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_BCKF));\r\n        }\r\n    }\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_HASLESIC));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_SSS));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_LMOPU));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_PREVENT_JUMPER));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_ALLOWML));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckDEVICE_LOCK));\r\n\r\n    // Write methods.\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_SAO));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckWM_SAO));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_TAO));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckWM_TAO));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RAW96R));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckWM_RAW96R));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RAW16));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckWM_RAW16));\r\n\r\n    m_ListView.AddItem(uiItemCount,0,lngGetString(ADVPROP_RAW96P));\r\n    m_ListView.SetCheckState(uiItemCount++,m_Device.support(ckmmc::Device::ckWM_RAW96P));\r\n\r\n    m_bLockAdvList = true;\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CDeviceAdvancedPage::OnItemChanging(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    return m_bLockAdvList;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/device_advanced_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n#include \"title_tip_list_view_ctrl.hh\"\r\n\r\nclass CDeviceAdvancedPage : public CPropertyPageImpl<CDeviceAdvancedPage>\r\n{\r\nprivate:\r\n    ckmmc::Device &m_Device;\r\n    bool m_bLockAdvList;\r\n    CTitleTipListViewCtrl m_ListView;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_DEVICEADVANCED };\r\n\r\n    CDeviceAdvancedPage(ckmmc::Device &Device);\r\n    ~CDeviceAdvancedPage();\r\n\r\n    BEGIN_MSG_MAP(CDeviceAdvancedPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        \r\n        NOTIFY_HANDLER(IDC_ADVLIST,LVN_ITEMCHANGING,OnItemChanging)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CDeviceAdvancedPage>)\r\n        CHAIN_MSG_MAP_MEMBER(m_ListView)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnItemChanging(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/device_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"device_dlg.hh\"\r\n\r\nCDeviceDlg::CDeviceDlg(ckmmc::Device &Device,const TCHAR *szTitle) :\r\n    CPropertySheetImpl<CDeviceDlg>(szTitle,0,NULL),\r\n    m_GeneralPage(Device),m_AdvancedPage(Device)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n    AddPage(m_AdvancedPage);\r\n}\r\n\r\nCDeviceDlg::~CDeviceDlg()\r\n{\r\n}\r\n\r\nLRESULT CDeviceDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/device_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"device_general_page.hh\"\r\n#include \"device_advanced_page.hh\"\r\n\r\nclass CDeviceDlg : public CPropertySheetImpl<CDeviceDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CDeviceGeneralPage m_GeneralPage;\r\n    CDeviceAdvancedPage m_AdvancedPage;\r\n\r\npublic:\r\n    CDeviceDlg(ckmmc::Device &Device,const TCHAR *szTitle);\r\n    ~CDeviceDlg();\r\n\r\n    BEGIN_MSG_MAP(CDeviceDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CDeviceDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/device_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include \"device_util.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"device_general_page.hh\"\r\n\r\nCDeviceGeneralPage::CDeviceGeneralPage(ckmmc::Device &Device) :\r\n    m_hIcon(NULL),m_Device(Device)\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n}\r\n\r\nCDeviceGeneralPage::~CDeviceGeneralPage()\r\n{\r\n    if (m_hIcon != NULL)\r\n        DestroyIcon(m_hIcon);\r\n}\r\n\r\nbool CDeviceGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a device translation section.\r\n    if (!pLng->EnterSection(_T(\"device\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_TYPELABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TYPELABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_LOCATIONLABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_LOCATIONLABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BUFFERLABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_BUFFERLABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_MAXREADLABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_MAXREADLABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_MAXWRITELABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_MAXWRITELABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_READSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_READSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_WRITESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_WRITESTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CDeviceGeneralPage::PrintDeviceType(ckmmc::Device &Device)\r\n{\r\n    if (Device.support(ckmmc::Device::ckDEVICE_WRITE_CDR) ||\r\n        Device.support(ckmmc::Device::ckDEVICE_WRITE_CDRW))\r\n    {\r\n        if (Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDR) ||\r\n            Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDRAM))\r\n        {\r\n            SetDlgItemText(IDC_TYPESTATIC,lngGetString(DEVICETYPE_DVDRECORDER));\r\n        }\r\n        else\r\n        {\r\n            SetDlgItemText(IDC_TYPESTATIC,lngGetString(DEVICETYPE_CDRECORDER));\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (Device.support(ckmmc::Device::ckDEVICE_READ_DVDROM) ||\r\n            Device.support(ckmmc::Device::ckDEVICE_READ_DVDR) ||\r\n            Device.support(ckmmc::Device::ckDEVICE_READ_DVDRAM))\r\n        {\r\n            SetDlgItemText(IDC_TYPESTATIC,lngGetString(DEVICETYPE_DVDREADER));\r\n        }\r\n        else\r\n        {\r\n            SetDlgItemText(IDC_TYPESTATIC,lngGetString(DEVICETYPE_CDREADER));\r\n        }\r\n    }\r\n}\r\n\r\nLRESULT CDeviceGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Create the icon.\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        m_hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(12),IMAGE_ICON,\r\n                                   GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    FreeLibrary(hInstance);\r\n\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Display the information.\r\n    SetDlgItemText(IDC_NAMESTATIC,NDeviceUtil::GetDeviceName(m_Device).c_str());\r\n\r\n    // Type.\r\n    PrintDeviceType(m_Device);\r\n\r\n    // Location.\r\n    TCHAR szBuffer[128];\r\n    lsnprintf_s(szBuffer,128,lngGetString(PROPERTIES_DEVICELOC),m_Device.address().bus_,\r\n                m_Device.address().target_,m_Device.address().lun_);\r\n    SetDlgItemText(IDC_LOCATIONSTATIC,szBuffer);\r\n\r\n    // Buffer size.\r\n    lsprintf(szBuffer,_T(\"%d kB\"),m_Device.property(ckmmc::Device::ckPROP_BUFFER_SIZE));\r\n    SetDlgItemText(IDC_BUFFERSTATIC,szBuffer);\r\n\r\n    // Max read speed.\r\n    ckcore::tuint32 max_read_speed = m_Device.property(ckmmc::Device::ckPROP_MAX_READ_SPD);\r\n    lsprintf(szBuffer,_T(\"%d sectors/s (CD: %s, DVD: %s)\"),\r\n             max_read_speed,\r\n             ckmmc::util::kb_to_disp_speed(max_read_speed,\r\n                                           ckmmc::Device::ckPROFILE_CDROM).c_str(),\r\n             ckmmc::util::kb_to_disp_speed(max_read_speed,\r\n                                           ckmmc::Device::ckPROFILE_DVDROM).c_str());\r\n    SetDlgItemText(IDC_MAXREADSTATIC,szBuffer);\r\n\r\n    // Max write speed.\r\n    ckcore::tuint32 max_write_speed = m_Device.property(ckmmc::Device::ckPROP_MAX_WRITE_SPD);\r\n    lsprintf(szBuffer,_T(\"%d sectors/s (CD: %s, DVD: %s)\"),\r\n             max_write_speed,\r\n             ckmmc::util::kb_to_disp_speed(max_write_speed,\r\n                                           ckmmc::Device::ckPROFILE_CDROM).c_str(),\r\n             ckmmc::util::kb_to_disp_speed(max_write_speed,\r\n                                           ckmmc::Device::ckPROFILE_DVDROM).c_str());\r\n    SetDlgItemText(IDC_MAXWRITESTATIC,szBuffer);\r\n\r\n    // Read media.\r\n    ::SendMessage(GetDlgItem(IDC_READCDRCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_CDR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READCDRWCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_CDRW) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDRCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDRAMCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDRAM) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDROMCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDROM) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDPLUSRCHECK),BM_SETCHECK,\r\n        m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDPLUSR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDPLUSRWCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDPLUSRW) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDPLUSRDLCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDPLUSR_DL) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READDVDPLUSRWDLCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_DVDPLUSRW_DL) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READBDCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_BD) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_READHDDVDCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_READ_HDDVD) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n\r\n    // Write media.\r\n    ::SendMessage(GetDlgItem(IDC_WRITECDRCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_CDR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITECDRWCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_CDRW) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDRCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDRAMCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDRAM) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDPLUSRCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDPLUSR) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDPLUSRWCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDPLUSRW) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDPLUSRDLCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDPLUSR_DL) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEDVDPLUSRWDLCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_DVDPLUSRW_DL) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEBDCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_BD) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n    ::SendMessage(GetDlgItem(IDC_WRITEHDDVDCHECK),BM_SETCHECK,\r\n                  m_Device.support(ckmmc::Device::ckDEVICE_WRITE_HDDVD) ?\r\n                  BST_INDETERMINATE : BST_UNCHECKED,0);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/device_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n\r\nclass CDeviceGeneralPage : public CPropertyPageImpl<CDeviceGeneralPage>\r\n{\r\nprivate:\r\n    HICON m_hIcon;\r\n    ckmmc::Device &m_Device;\r\n\r\n    bool Translate();\r\n    void PrintDeviceType(ckmmc::Device &Device);\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_DEVICEGENERAL };\r\n\r\n    CDeviceGeneralPage(ckmmc::Device &Device);\r\n    ~CDeviceGeneralPage();\r\n\r\n    BEGIN_MSG_MAP(CDeviceGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CDeviceGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnWriteSpeedSpin(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/devices_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include \"infrarecorder.hh\"\r\n#include \"device_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"device_util.hh\"\r\n#include \"devices_dlg.hh\"\r\n\r\nvoid CDevicesDlg::ScanCallback::event_status(ckmmc::DeviceManager::ScanCallback::Status Status)\r\n{\r\n    if (Status == ckmmc::DeviceManager::ScanCallback::ckEVENT_DEV_SCAN)\r\n    {\r\n        m_WaitDlg.SetMessage(lngGetString(INIT_SCANBUS));\r\n    }\r\n    else if (Status == ckmmc::DeviceManager::ScanCallback::ckEVENT_DEV_CAP)\r\n    {\r\n        m_WaitDlg.SetMessage(lngGetString(INIT_LOADCAPABILITIES));\r\n    }\r\n}\r\n\r\nbool CDevicesDlg::ScanCallback::event_device(ckmmc::Device::Address &Addr)\r\n{\r\n    return true;\r\n}\r\n\r\nCDevicesDlg::CDevicesDlg()\r\n{\r\n    m_hListImageList = NULL;\r\n}\r\n\r\nCDevicesDlg::~CDevicesDlg()\r\n{\r\n    if (m_hListImageList)\r\n        ImageList_Destroy(m_hListImageList);\r\n}\r\n\r\nbool CDevicesDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a devices translation section.\r\n    if (!pLng->EnterSection(_T(\"devices\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_DEVICESDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_HELPBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_HELPBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_RESCANBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_RESCANBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_INFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_INFOSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CDevicesDlg::FillListView()\r\n{\r\n    int iItemCount = 0;\r\n\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        TCHAR szBuffer[64];\r\n\r\n        if (pDevice->address().bus_ == -1 || pDevice->address().target_ == -1 ||\r\n            pDevice->address().lun_ == -1)\r\n        {\r\n            m_ListView.AddItem(iItemCount,0,_T(\"[?,?,?]\"),0);\r\n        }\r\n        else\r\n        {\r\n            lsprintf(szBuffer,_T(\"[%d,%d,%d]\"),pDevice->address().bus_,\r\n                     pDevice->address().target_,pDevice->address().lun_);\r\n            m_ListView.AddItem(iItemCount,0,szBuffer,0);\r\n        }\r\n\r\n        lsprintf(szBuffer,_T(\"%c:\"),pDevice->address().device_[0]);\r\n\r\n        m_ListView.AddItem(iItemCount,1,szBuffer,0);\r\n        m_ListView.AddItem(iItemCount,2,pDevice->vendor(),0);\r\n        m_ListView.AddItem(iItemCount,3,pDevice->identifier(),0);\r\n        m_ListView.AddItem(iItemCount,4,pDevice->revision(),0);\r\n        m_ListView.SetItemData(iItemCount,reinterpret_cast<DWORD_PTR>(pDevice));\r\n\r\n        iItemCount++;\r\n    }\r\n}\r\n\r\nvoid CDevicesDlg::InitializeListView()\r\n{\r\n    // Create the image list.\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        HICON hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(12),IMAGE_ICON,16,16,/*LR_DEFAULTCOLOR*/LR_LOADTRANSPARENT);\r\n    FreeLibrary(hInstance);\r\n\r\n    m_hListImageList = ImageList_Create(16,16,ILC_COLOR32,0,1);\r\n    ImageList_AddIcon(m_hListImageList,hIcon);\r\n\r\n    DestroyIcon(hIcon);\r\n\r\n    // Setup the list view.\r\n    m_ListView.SubclassWindow(GetDlgItem(IDC_DEVICELIST));\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_NORMAL);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_SMALL);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    // Add the columns.\r\n    m_ListView.AddColumn(lngGetString(COLUMN_ID),0);\r\n    m_ListView.SetColumnWidth(0,60);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_DRIVE),1);\r\n    m_ListView.SetColumnWidth(1,40);  // 25 is not enough for wide letters like \"W:\"\r\n    m_ListView.AddColumn(lngGetString(COLUMN_VENDOR),2);\r\n    m_ListView.SetColumnWidth(2,65);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_IDENTIFICATION),3);\r\n    m_ListView.SetColumnWidth(3,125);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_REVISION),4);\r\n    m_ListView.SetColumnWidth(4,55);\r\n}\r\n\r\nLRESULT CDevicesDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Initialize the list view.\r\n    InitializeListView();\r\n\r\n    // Fill the list view.\r\n    FillListView();\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CDevicesDlg::OnDestroy(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Detach the internal list view control.\r\n    m_ListView.UnsubclassWindow();\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CDevicesDlg::OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ListView.GetSelectedCount() > 0)\r\n    {\r\n        ckmmc::Device *pDevice =\r\n            reinterpret_cast<ckmmc::Device *>(m_ListView.GetItemData(\r\n                                              m_ListView.GetSelectedIndex()));\r\n\r\n        ckcore::tstring Title = lngGetString(PROPERTIES_TITLE);\r\n        Title += NDeviceUtil::GetDeviceName(*pDevice);\r\n\r\n        CDeviceDlg DeviceDlg(*pDevice,Title.c_str());\r\n        DeviceDlg.DoModal();\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CDevicesDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CDevicesDlg::OnRescan(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Empty the list view.\r\n    m_ListView.DeleteAllItems();\r\n\r\n    // Rescan the bus.\r\n    CWaitDlg WaitDlg;\r\n    WaitDlg.Create(m_hWnd);\r\n    WaitDlg.ShowWindow(SW_SHOW);\r\n        ScanCallback Callback(WaitDlg);\r\n        g_DeviceManager.scan(&Callback);\r\n    WaitDlg.DestroyWindow();\r\n\r\n    // Fill the list view.\r\n    FillListView();\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CDevicesDlg::OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/device_configuration.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/devices_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/devicemanager.hh>\r\n#include \"resource.h\"\r\n#include \"wait_dlg.hh\"\r\n\r\nclass CDevicesDlg : public CDialogImpl<CDevicesDlg>\r\n{\r\nprivate:\r\n    class CInternalListViewCtrl : public CWindowImpl<CInternalListViewCtrl,CListViewCtrl>\r\n    {\r\n    public:\r\n        BEGIN_MSG_MAP(CInternalListViewCtrl)\r\n            MESSAGE_HANDLER(WM_KEYDOWN,OnKeyDown)\r\n        END_MSG_MAP()\r\n\r\n        CInternalListViewCtrl()\r\n        {\r\n        }\r\n\r\n        LRESULT OnKeyDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n        {\r\n            LRESULT lResult = DefWindowProc(uMsg,wParam,lParam);\r\n\r\n            if (wParam == VK_RETURN)\r\n            {\r\n                if (GetSelectedCount() > 0)\r\n                {\r\n                    ::MessageBox(NULL,_T(\"\"),_T(\"\"),MB_OK);\r\n                }\r\n            }\r\n\r\n            return lResult;\r\n        }\r\n    };\r\n\r\n    class ScanCallback : public ckmmc::DeviceManager::ScanCallback\r\n    {\r\n    private:\r\n        CWaitDlg &m_WaitDlg;\r\n\r\n    public:\r\n        ScanCallback(CWaitDlg &WaitDlg) : m_WaitDlg(WaitDlg) {}\r\n\r\n        void event_status(ckmmc::DeviceManager::ScanCallback::Status Status);\r\n        bool event_device(ckmmc::Device::Address &Addr);\r\n    };\r\n\r\n    HIMAGELIST m_hListImageList;\r\n    CInternalListViewCtrl m_ListView;\r\n\r\n    bool Translate();\r\n\r\n    void InitializeListView();\r\n    void FillListView();\r\n\r\npublic:\r\n    enum { IDD = IDD_DEVICESDLG };\r\n\r\n    CDevicesDlg();\r\n    ~CDevicesDlg();\r\n\r\n    BEGIN_MSG_MAP(CDevicesDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_DESTROY,OnDestroy)\r\n\r\n        NOTIFY_HANDLER(IDC_DEVICELIST,NM_DBLCLK,OnListDblClick)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnOK)\r\n        COMMAND_ID_HANDLER(IDC_RESCANBUTTON,OnRescan)\r\n        COMMAND_HANDLER(IDC_HELPBUTTON,BN_CLICKED,OnHelp)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDestroy(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRescan(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/disc_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"disc_dlg.hh\"\r\n\r\nCDiscDlg::CDiscDlg(const TCHAR *szTitle,const TCHAR *szDiscLabel,ckmmc::Device &Device) :\r\n    CPropertySheetImpl<CDiscDlg>(szTitle,0,NULL),m_GeneralPage(szDiscLabel,Device)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP;\r\n\r\n    AddPage(m_GeneralPage);\r\n}\r\n\r\nCDiscDlg::~CDiscDlg()\r\n{\r\n}\r\n\r\nLRESULT CDiscDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/disc_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"disc_general_page.hh\"\r\n\r\nclass CDiscDlg : public CPropertySheetImpl<CDiscDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CDiscGeneralPage m_GeneralPage;\r\n\r\npublic:\r\n    CDiscDlg(const TCHAR *szTitle,const TCHAR *szDiscLabel,ckmmc::Device &Device);\r\n    ~CDiscDlg();\r\n\r\n    BEGIN_MSG_MAP(CDiscDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CDiscDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/disc_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"disc_general_page.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"core2.hh\"\r\n\r\nCDiscGeneralPage::CDiscGeneralPage(const TCHAR *szDiscLabel,ckmmc::Device &Device) :\r\n    m_Device(Device)\r\n{\r\n    m_hIcon = NULL;\r\n\r\n    lstrcpy(m_szDiscLabel,szDiscLabel);\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n}\r\n\r\nCDiscGeneralPage::~CDiscGeneralPage()\r\n{\r\n    if (m_hIcon != NULL)\r\n        DestroyIcon(m_hIcon);\r\n}\r\n\r\nbool CDiscGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a device translation section.\r\n    if (!pLng->EnterSection(_T(\"disc\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_TYPELABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_TYPELABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_TYPELABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_BOOKLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_BOOKLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_BOOKLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_REGIONLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_REGIONLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_REGIONLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_LAYERLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_LAYERLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_LAYERLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_TRACKLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_TRACKLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_TRACKLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_SESSIONLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_SESSIONLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_SESSIONLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_STATUSLABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_STATUSLABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_STATUSLABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_USEDSPACELABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_USEDSPACELABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_USEDSPACELABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_FREESPACELABELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_FREESPACELABELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_FREESPACELABELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n\r\n    // Make sure that the edit/combo controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_TYPESTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_BOOKSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_REGIONSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_LAYERSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_TRACKSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_SESSIONSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_STATUSSTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_USEDSPACESTATIC,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_FREESPACESTATIC,iMaxStaticRight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CDiscGeneralPage::DisplayDiscType(ckmmc::Device::Profile Profile)\r\n{\r\n    switch (Profile)\r\n    {\r\n        case ckmmc::Device::ckPROFILE_CDROM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"CD-ROM\")); break;\r\n        case ckmmc::Device::ckPROFILE_CDR:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"CD-R\")); break;\r\n        case ckmmc::Device::ckPROFILE_CDRW:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"CD-RW\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDROM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD-ROM\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD-R\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDRAM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD-RAM\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n            {\r\n                TCHAR szBuffer[64];\r\n                lstrcpy(szBuffer,_T(\"DVD-RW \"));\r\n                lstrcat(szBuffer,lngGetString(DISC_RESTRICTEDOVERWRITE));\r\n\r\n                SetDlgItemText(IDC_TYPESTATIC,szBuffer);\r\n            }\r\n            break;\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n            {\r\n                TCHAR szBuffer[64];\r\n                lstrcpy(szBuffer,_T(\"DVD-RW \"));\r\n                lstrcat(szBuffer,lngGetString(DISC_SEQUENTIAL));\r\n\r\n                SetDlgItemText(IDC_TYPESTATIC,szBuffer);\r\n            }\r\n            break;\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD-R DL\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD+RW\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD+R\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD+RW DL\")); break;\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSR_DL:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"DVD+R DL\")); break;\r\n        case ckmmc::Device::ckPROFILE_BDROM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"BD-ROM\")); break;\r\n        case ckmmc::Device::ckPROFILE_BDR_SRM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"BD-R SRM\")); break;\r\n        case ckmmc::Device::ckPROFILE_BDR_RRM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"BD-R RRM\")); break;\r\n        case ckmmc::Device::ckPROFILE_BDRE:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"BD-RE\")); break;\r\n        case ckmmc::Device::ckPROFILE_HDDVDROM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"HD DVD-ROM\")); break;\r\n        case ckmmc::Device::ckPROFILE_HDDVDR:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"HD DVD-R\")); break;\r\n        case ckmmc::Device::ckPROFILE_HDDVDRAM:\r\n            SetDlgItemText(IDC_TYPESTATIC,_T(\"HD DVD-RAM\")); break;\r\n        default:\r\n            SetDlgItemText(IDC_TYPESTATIC,lngGetString(DISC_UNKNOWN)); break;\r\n    }\r\n}\r\n\r\nvoid CDiscGeneralPage::DisplayBookType(unsigned char ucBookType,unsigned char ucBookRev)\r\n{\r\n    TCHAR szBookType[64];\r\n\r\n    switch (ucBookType)\r\n    {\r\n        case 0:\r\n            lsprintf(szBookType,_T(\"DVD-ROM (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 1:\r\n            lsprintf(szBookType,_T(\"DVD-RAM (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 2:\r\n            lsprintf(szBookType,_T(\"DVD-R (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 3:\r\n            lsprintf(szBookType,_T(\"DVD-RW (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 9:\r\n            lsprintf(szBookType,_T(\"DVD+RW (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 10:\r\n            lsprintf(szBookType,_T(\"DVD+R (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        case 14:\r\n            lsprintf(szBookType,_T(\"DVD+R DL (%s %d)\"),lngGetString(DISC_REVISION),ucBookRev); break;\r\n        default:\r\n            lsprintf(szBookType,lngGetString(DISC_UNKNOWN)); break;\r\n    }\r\n\r\n    SetDlgItemText(IDC_BOOKSTATIC,szBookType);\r\n}\r\n\r\nvoid CDiscGeneralPage::DisplayStatus(CCore2DiscInfo *pDiscInfo)\r\n{\r\n    const TCHAR *szDiscStatus = _T(\"\");\r\n    const TCHAR *szSessionStatus = _T(\"\");\r\n\r\n    switch (pDiscInfo->m_ucDiscStatus)\r\n    {\r\n        case CCore2DiscInfo::DS_EMTPY:\r\n            szDiscStatus = lngGetString(DISC_BLANK); break;\r\n        case CCore2DiscInfo::DS_INCOMPLETE:\r\n            szDiscStatus = lngGetString(DISC_INCOMPLETE); break;\r\n        case CCore2DiscInfo::DS_FINALIZED:\r\n            szDiscStatus = lngGetString(DISC_FIXATED); break;\r\n        case CCore2DiscInfo::DS_RANDOMACCESS:\r\n            szDiscStatus = lngGetString(DISC_RANDOMACCESS); break;\r\n    }\r\n\r\n    switch (pDiscInfo->m_ucLastSessStatus)\r\n    {\r\n        case CCore2DiscInfo::LSS_EMTPY:\r\n            szSessionStatus = lngGetString(DISC_EMPTY); break;\r\n        case CCore2DiscInfo::LSS_INCOMPLETE:\r\n            szSessionStatus = lngGetString(DISC_INCOMPLETE); break;\r\n        case CCore2DiscInfo::LSS_RESERVED:\r\n            szSessionStatus = lngGetString(DISC_RESERVED); break;\r\n        case CCore2DiscInfo::LSS_COMPLETE:\r\n            szSessionStatus = lngGetString(DISC_COMPLETE); break;\r\n    }\r\n\r\n    TCHAR szStatus[256];\r\n    lsprintf(szStatus,lngGetString(DISC_STATUS),szDiscStatus,szSessionStatus,\r\n        pDiscInfo->m_ucFlags & CCore2DiscInfo::FLAG_ERASABLE ? _T(\"\") : lngGetString(DISC_NOT));\r\n\r\n    SetDlgItemText(IDC_STATUSSTATIC,szStatus);\r\n}\r\n\r\nLRESULT CDiscGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Create the icon.\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        m_hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(12),IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    FreeLibrary(hInstance);\r\n\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Display the information.\r\n    SetDlgItemText(IDC_NAMESTATIC,m_szDiscLabel);\r\n\r\n    CCore2Info Info;\r\n\r\n    ckmmc::Device::Profile Profile = m_Device.profile();\r\n    DisplayDiscType(Profile);\r\n\r\n    // Extra DVD information.\r\n    unsigned int uiNumLayers = 0;\r\n    TCHAR szSmallBuffer[64];\r\n\r\n    if (Profile == ckmmc::Device::ckPROFILE_DVDROM || Profile == ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ || Profile == ckmmc::Device::ckPROFILE_DVDRAM ||\r\n        Profile == ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV || Profile == ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ || Profile == ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ ||\r\n        Profile == ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP || Profile == ckmmc::Device::ckPROFILE_DVDPLUSRW || Profile == ckmmc::Device::ckPROFILE_DVDPLUSR ||\r\n        Profile == ckmmc::Device::ckPROFILE_DVDPLUSRW_DL || Profile == ckmmc::Device::ckPROFILE_DVDPLUSR_DL)\r\n    {\r\n        // Book type.\r\n        CCore2PhysFmtInfo PhysInfo;\r\n        if (Info.ReadPhysFmtInfo(m_Device,&PhysInfo))\r\n            DisplayBookType(PhysInfo.m_ucDiscCategory,PhysInfo.m_ucPartVersion);\r\n        else\r\n            SetDlgItemText(IDC_BOOKSTATIC,lngGetString(DISC_UNKNOWN));\r\n\r\n        // Region.\r\n        unsigned char ucRegion = 0;\r\n\r\n        if (Info.GetDiscDVDRegion(m_Device,ucRegion))\r\n        {\r\n            if (ucRegion == 0)\r\n                SetDlgItemText(IDC_REGIONSTATIC,lngGetString(DISC_NOREGION));\r\n            else\r\n            {\r\n                lsprintf(szSmallBuffer,_T(\"%d\"),(int)ucRegion);\r\n                SetDlgItemText(IDC_REGIONSTATIC,szSmallBuffer);\r\n            }\r\n        }\r\n        else\r\n            SetDlgItemText(IDC_REGIONSTATIC,lngGetString(DISC_UNKNOWN));\r\n\r\n        // Layers\r\n        lsprintf(szSmallBuffer,_T(\"%d\"),uiNumLayers);\r\n        SetDlgItemText(IDC_LAYERSTATIC,szSmallBuffer);\r\n    }\r\n    else\r\n    {\r\n        // Book type.\r\n        SetDlgItemText(IDC_BOOKSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_BOOKSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_BOOKLABELSTATIC),false);\r\n\r\n        // Region.\r\n        SetDlgItemText(IDC_REGIONSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_REGIONSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_REGIONLABELSTATIC),false);\r\n\r\n        // Layers.\r\n        SetDlgItemText(IDC_LAYERSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_LAYERSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_LAYERLABELSTATIC),false);\r\n    }\r\n\r\n    CCore2DiscInfo DiscInfo;\r\n    if (Info.ReadDiscInformation(m_Device,&DiscInfo))\r\n    {\r\n        // Tracks.\r\n        lsprintf(szSmallBuffer,_T(\"%d\"),DiscInfo.m_usLastSessLstTrack - (DiscInfo.m_usLastSessFstTrack - 1));\r\n        SetDlgItemText(IDC_TRACKSTATIC,szSmallBuffer);\r\n\r\n        // Sessions.\r\n        lsprintf(szSmallBuffer,_T(\"%d\"),DiscInfo.m_usNumSessions);\r\n        SetDlgItemText(IDC_SESSIONSTATIC,szSmallBuffer);\r\n\r\n        // Status.\r\n        DisplayStatus(&DiscInfo);\r\n\r\n        // Space.\r\n        unsigned __int64 uiUsedSize = 0;\r\n        unsigned __int64 uiFreeSize = 0;\r\n        if (Info.GetTotalDiscCapacity(m_Device,uiUsedSize,uiFreeSize))\r\n        {\r\n            FormatBytes(szSmallBuffer,uiUsedSize);\r\n            lsprintf(szSmallBuffer + lstrlen(szSmallBuffer),_T(\" (%I64d Bytes)\"),uiUsedSize);\r\n            SetDlgItemText(IDC_USEDSPACESTATIC,szSmallBuffer);\r\n\r\n            FormatBytes(szSmallBuffer,uiFreeSize);\r\n            lsprintf(szSmallBuffer + lstrlen(szSmallBuffer),_T(\" (%I64d Bytes)\"),uiFreeSize);\r\n            SetDlgItemText(IDC_FREESPACESTATIC,szSmallBuffer);\r\n        }\r\n        else\r\n        {\r\n            // Used space.\r\n            SetDlgItemText(IDC_USEDSPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n            ::EnableWindow(GetDlgItem(IDC_USEDSPACESTATIC),false);\r\n            ::EnableWindow(GetDlgItem(IDC_USEDSPACELABELSTATIC),false);\r\n\r\n            // Free space.\r\n            SetDlgItemText(IDC_FREESPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n            ::EnableWindow(GetDlgItem(IDC_FREESPACESTATIC),false);\r\n            ::EnableWindow(GetDlgItem(IDC_FREESPACELABELSTATIC),false);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        // Tracks.\r\n        SetDlgItemText(IDC_TRACKSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_TRACKSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_TRACKLABELSTATIC),false);\r\n\r\n        // Sessions.\r\n        SetDlgItemText(IDC_SESSIONSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_SESSIONSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_SESSIONLABELSTATIC),false);\r\n\r\n        // Status.\r\n        SetDlgItemText(IDC_STATUSSTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_STATUSSTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_STATUSLABELSTATIC),false);\r\n\r\n        // Used space.\r\n        SetDlgItemText(IDC_USEDSPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_USEDSPACESTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_USEDSPACELABELSTATIC),false);\r\n\r\n        // Free space.\r\n        SetDlgItemText(IDC_FREESPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n        ::EnableWindow(GetDlgItem(IDC_FREESPACESTATIC),false);\r\n        ::EnableWindow(GetDlgItem(IDC_FREESPACELABELSTATIC),false);\r\n    }\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/disc_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n#include \"core2_info.hh\"\r\n\r\nclass CDiscGeneralPage : public CPropertyPageImpl<CDiscGeneralPage>\r\n{\r\nprivate:\r\n    HICON m_hIcon;\r\n\r\n    ckmmc::Device &m_Device;\r\n    TCHAR m_szDiscLabel[64];\r\n\r\n    bool Translate();\r\n\r\n    void DisplayDiscType(ckmmc::Device::Profile Profile);\r\n    void DisplayBookType(unsigned char ucBookType,unsigned char ucBookRev);\r\n    void DisplayStatus(CCore2DiscInfo *pDiscInfo);\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_DISCGENERAL };\r\n\r\n    CDiscGeneralPage(const TCHAR *szDiscLabel,ckmmc::Device &Device);\r\n    ~CDiscGeneralPage();\r\n\r\n    BEGIN_MSG_MAP(CDiscGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CDiscGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/edit_track_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include \"edit_track_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n\r\nCEditTrackDlg::CEditTrackDlg(CItemData *pItemData)\r\n{\r\n    m_pItemData = pItemData;\r\n}\r\n\r\nCEditTrackDlg::~CEditTrackDlg()\r\n{\r\n}\r\n\r\nbool CEditTrackDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a edittrack translation section.\r\n    if (!pLng->EnterSection(_T(\"edittrack\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TITLESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TITLESTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_ARTISTSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_ARTISTSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CEditTrackDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n    SetWindowText((TCHAR *)lParam);\r\n\r\n    SetDlgItemText(IDC_TITLEEDIT,m_pItemData->GetAudioData()->szTrackTitle);\r\n    SetDlgItemText(IDC_ARTISTEDIT,m_pItemData->GetAudioData()->szTrackArtist);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CEditTrackDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    GetDlgItemText(IDC_TITLEEDIT,m_pItemData->GetAudioData()->szTrackTitle,159);\r\n    GetDlgItemText(IDC_ARTISTEDIT,m_pItemData->GetAudioData()->szTrackArtist,159);\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CEditTrackDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/edit_track_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"tree_manager.hh\"\r\n\r\nclass CEditTrackDlg : public CDialogImpl<CEditTrackDlg>\r\n{\r\nprivate:\r\n    CItemData *m_pItemData;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_EDITTRACKDLG };\r\n\r\n    CEditTrackDlg(CItemData *pItemData);\r\n    ~CEditTrackDlg();\r\n\r\n    BEGIN_MSG_MAP(CEditTrackDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/erase_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include \"infrarecorder.hh\"\r\n#include \"erase_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"version.hh\"\r\n#include \"visual_styles.hh\"\r\n\r\nCEraseDlg::CEraseDlg(bool bAppMode)\r\n{\r\n    m_bAppMode = bAppMode;\r\n\r\n    m_hRefreshIcon = NULL;\r\n    m_hRefreshImageList = NULL;\r\n\r\n    m_uiRecorderTextLen = 0;\r\n}\r\n\r\nCEraseDlg::~CEraseDlg()\r\n{\r\n    if (m_hRefreshImageList != NULL)\r\n        ImageList_Destroy(m_hRefreshImageList);\r\n\r\n    if (m_hRefreshIcon != NULL)\r\n        DestroyIcon(m_hRefreshIcon);\r\n}\r\n\r\nbool CEraseDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is an erase translation section.\r\n    if (!pLng->EnterSection(_T(\"erase\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_ERASEDLG,szStrValue))\t\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_HELPBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_HELPBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_RECORDERSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_RECORDERSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_METHODSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_METHODSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FORCECHECK,szStrValue))\r\n        SetDlgItemText(IDC_FORCECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_EJECTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_EJECTCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SIMULATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_SIMULATECHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SPEEDSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SPEEDSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CEraseDlg::InitRecorderMedia()\r\n{\r\n    if (m_uiRecorderTextLen == 0)\r\n        m_uiRecorderTextLen = ::GetWindowTextLength(GetDlgItem(IDC_RECORDERSTATIC));\r\n\r\n    TCHAR szBuffer[256];\r\n    ::GetWindowText(GetDlgItem(IDC_RECORDERSTATIC),szBuffer,m_uiRecorderTextLen + 1);\r\n\r\n    // Empty the method combo box.\r\n    m_MethodCombo.ResetContent();\r\n\r\n    ckmmc::Device &Device =\r\n        *reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                           m_RecorderCombo.GetCurSel()));\r\n\r\n    Device.refresh();\r\n\r\n    // Get current profile.\r\n    bool bSupportedProfile = false;\r\n\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n    switch (Profile)\r\n    {\r\n        case ckmmc::Device::ckPROFILE_CDRW:\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_FULL));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_MINIMAL));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_UNCLOSE));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_SESSION));\r\n            m_MethodCombo.SetItemData(0,CCore2::ERASE_BLANK_FULL);\r\n            m_MethodCombo.SetItemData(1,CCore2::ERASE_BLANK_MINIMAL);\r\n            m_MethodCombo.SetItemData(2,CCore2::ERASE_BLANK_UNCLOSE);\r\n            m_MethodCombo.SetItemData(3,CCore2::ERASE_BLANK_SESSION);\r\n\r\n            m_MethodCombo.SetCurSel(0);\r\n            bSupportedProfile = true;\r\n\r\n            // Enable simulation if supported by the recorder.\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),\r\n                           Device.support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n\r\n            // Enable force erase.\r\n            ::EnableWindow(GetDlgItem(IDC_FORCECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n        case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n            m_MethodCombo.AddString(lngGetString(FORMATMODE_QUICK));\r\n            m_MethodCombo.AddString(lngGetString(FORMATMODE_FULL));\r\n            m_MethodCombo.SetItemData(0,CCore2::ERASE_FORMAT_QUICK);\r\n            m_MethodCombo.SetItemData(1,CCore2::ERASE_FORMAT_FULL);\r\n\r\n            m_MethodCombo.SetCurSel(1);\r\n            bSupportedProfile = true;\r\n\r\n            // Disable simulation (not supported for DVD+RW media).\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),FALSE);\r\n\r\n            // Disable force erase.\r\n            ::EnableWindow(GetDlgItem(IDC_FORCECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_DVDRAM:\r\n            m_MethodCombo.AddString(lngGetString(FORMATMODE_FULL));\r\n            m_MethodCombo.SetItemData(0,CCore2::ERASE_FORMAT_FULL);\r\n\r\n            m_MethodCombo.SetCurSel(0);\r\n            bSupportedProfile = true;\r\n\r\n            // Disable simulation (not supported for DVD-RAM media).\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),FALSE);\r\n\r\n            // Disable force erase.\r\n            ::EnableWindow(GetDlgItem(IDC_FORCECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n        case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n            m_MethodCombo.AddString(lngGetString(FORMATMODE_QUICK));\r\n            m_MethodCombo.AddString(lngGetString(FORMATMODE_FULL));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_FULL));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_MINIMAL));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_UNCLOSE));\r\n            m_MethodCombo.AddString(lngGetString(BLANKMODE_SESSION));\r\n\r\n            m_MethodCombo.SetItemData(0,CCore2::ERASE_FORMAT_QUICK);\r\n            m_MethodCombo.SetItemData(1,CCore2::ERASE_FORMAT_FULL);\r\n            m_MethodCombo.SetItemData(2,CCore2::ERASE_BLANK_FULL);\r\n            m_MethodCombo.SetItemData(3,CCore2::ERASE_BLANK_MINIMAL);\r\n            m_MethodCombo.SetItemData(4,CCore2::ERASE_BLANK_UNCLOSE);\r\n            m_MethodCombo.SetItemData(5,CCore2::ERASE_BLANK_SESSION);\r\n\r\n            m_MethodCombo.SetCurSel(2);\r\n            bSupportedProfile = true;\r\n\r\n            // Disable simulation (not supported for DVD-RW media).\r\n            ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),FALSE);\r\n\r\n            // Disable force erase.\r\n            ::EnableWindow(GetDlgItem(IDC_FORCECHECK),FALSE);\r\n            break;\r\n\r\n        case ckmmc::Device::ckPROFILE_NONE:\r\n            m_MethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n            m_MethodCombo.SetCurSel(0);\r\n\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_INSERT));\r\n            break;\r\n\r\n        default:\r\n            m_MethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n            m_MethodCombo.SetCurSel(0);\r\n\r\n            lstrcat(szBuffer,_T(\" \"));\r\n            lstrcat(szBuffer,lngGetString(MEDIA_UNSUPPORTED));\r\n            break;\r\n    }\r\n\r\n    ::SetWindowText(GetDlgItem(IDC_RECORDERSTATIC),szBuffer);\r\n\r\n    // Maximum write speed.\r\n    m_SpeedCombo.ResetContent();\r\n    m_SpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n    m_SpeedCombo.SetItemData(0,0xFFFFFFFF);\r\n    m_SpeedCombo.SetCurSel(0);\r\n\r\n    // General\r\n    if (bSupportedProfile)\r\n    {\r\n        m_MethodCombo.EnableWindow(TRUE);\r\n        m_SpeedCombo.EnableWindow(TRUE);\r\n        ::EnableWindow(GetDlgItem(IDOK),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_METHODSTATIC),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_SPEEDSTATIC),TRUE);\r\n\r\n        const std::vector<ckcore::tuint32> &WriteSpeeds = Device.write_speeds();\r\n\r\n        std::vector<ckcore::tuint32>::const_iterator it;\r\n        for (it = WriteSpeeds.begin(); it != WriteSpeeds.end(); it++)\r\n        {\r\n            m_SpeedCombo.AddString(ckmmc::util::kb_to_disp_speed(*it,Profile).c_str());\r\n            m_SpeedCombo.SetItemData(m_SpeedCombo.GetCount() - 1,\r\n                                     static_cast<DWORD_PTR>(ckmmc::util::kb_to_human_speed(*it,\r\n                                                            ckmmc::Device::ckPROFILE_CDR)));\r\n        }\r\n    }\r\n    else\r\n    {\r\n        m_MethodCombo.EnableWindow(FALSE);\r\n        m_SpeedCombo.EnableWindow(FALSE);\r\n        ::EnableWindow(GetDlgItem(IDOK),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_METHODSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_SPEEDSTATIC),FALSE);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CEraseDlg::InitRefreshButton()\r\n{\r\n    m_hRefreshIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_REFRESHICON),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);\r\n\r\n    // In Windows XP there is a bug causing the button to loose it's themed style if\r\n    // assigned an icon. The solution to this is to assign an image list instead.\r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n        int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n\r\n        m_hRefreshImageList = ImageList_Create(16,16,ILC_COLOR32 | (iBitsPixel < 32 ? ILC_MASK : 0),0,1);\r\n        ImageList_AddIcon(m_hRefreshImageList,m_hRefreshIcon);\r\n\r\n        BUTTON_IMAGELIST bImageList;\r\n        bImageList.himl = m_hRefreshImageList;\r\n        bImageList.margin.left = 0;\r\n        bImageList.margin.top = 0;\r\n        bImageList.margin.right = 0;\r\n        bImageList.margin.bottom = 0;\r\n        bImageList.uAlign = BUTTON_IMAGELIST_ALIGN_CENTER;\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BCM_SETIMAGELIST,0,(LPARAM)&bImageList);\r\n    }\r\n    else\r\n    {\r\n        SendMessage(GetDlgItem(IDC_REFRESHBUTTON),BM_SETIMAGE,IMAGE_ICON,(LPARAM)m_hRefreshIcon);\r\n    }\r\n\r\n    // If the application is themed, then adjust the size of the button.\r\n    if (g_VisualStyles.IsThemeActive())\r\n    {\r\n        RECT rcButton;\r\n        ::GetWindowRect(GetDlgItem(IDC_REFRESHBUTTON),&rcButton);\r\n        ScreenToClient(&rcButton);\r\n        ::SetWindowPos(GetDlgItem(IDC_REFRESHBUTTON),NULL,rcButton.left - 1,rcButton.top - 1,\r\n            rcButton.right - rcButton.left + 2,rcButton.bottom - rcButton.top + 2,0);\r\n    }\r\n}\r\n\r\nvoid CEraseDlg::CheckRecorderMedia()\r\n{\r\n    if (!InitRecorderMedia())\r\n    {\r\n        // Method.\r\n        m_MethodCombo.ResetContent();\r\n        m_MethodCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n        m_MethodCombo.SetCurSel(0);\r\n\r\n        // Write speed.\r\n        m_SpeedCombo.ResetContent();\r\n        m_SpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n        m_SpeedCombo.SetCurSel(0);\r\n\r\n        m_MethodCombo.EnableWindow(FALSE);\r\n        m_SpeedCombo.EnableWindow(FALSE);\r\n        ::EnableWindow(GetDlgItem(IDOK),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_METHODSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_SPEEDSTATIC),FALSE);\r\n    }\r\n}\r\n\r\nLRESULT CEraseDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    m_RecorderCombo = GetDlgItem(IDC_RECORDERCOMBO);\r\n    m_MethodCombo = GetDlgItem(IDC_METHODCOMBO);\r\n    m_SpeedCombo = GetDlgItem(IDC_SPEEDCOMBO);\r\n\r\n    // Set the refresh button icon.\r\n    InitRefreshButton();\r\n\r\n    // Recorder combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        // We only want to add recorder to the list.\r\n        if (!pDevice->recorder())\r\n            continue;\r\n\r\n        m_RecorderCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_RecorderCombo.SetItemData(m_RecorderCombo.GetCount() - 1,\r\n                                    reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_RecorderCombo.GetCount() == 0)\r\n    {\r\n        m_RecorderCombo.AddString(lngGetString(FAILURE_NORECORDERS));\r\n        m_RecorderCombo.EnableWindow(false);\r\n        m_RecorderCombo.SetCurSel(0);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(GetDlgItem(IDOK),false);\r\n    }\r\n    else\r\n    {\r\n        m_RecorderCombo.SetCurSel(0);\r\n\r\n        BOOL bDummy;\r\n        OnRecorderChange(NULL,NULL,NULL,bDummy);\r\n    }\r\n\r\n    // Setup the default settings.\r\n    m_MethodCombo.SetCurSel(g_EraseSettings.m_iMode);\r\n    CheckDlgButton(IDC_FORCECHECK,g_EraseSettings.m_bForce);\r\n    CheckDlgButton(IDC_EJECTCHECK,g_EraseSettings.m_bEject);\r\n    CheckDlgButton(IDC_SIMULATECHECK,g_EraseSettings.m_bSimulate);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CEraseDlg::OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    // Check for media change.\r\n    if (g_Core2.CheckMediaChange(*pDevice))\r\n        CheckRecorderMedia();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CEraseDlg::OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Kill any already running timers.\r\n    ::KillTimer(m_hWnd,TIMER_ID);\r\n    ::SetTimer(m_hWnd,TIMER_ID,TIMER_INTERVAL,NULL);\r\n\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CEraseDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Remember the configuration.\r\n    g_EraseSettings.m_iMode = (int)m_MethodCombo.GetItemData(m_MethodCombo.GetCurSel());\r\n    g_EraseSettings.m_bForce = IsDlgButtonChecked(IDC_FORCECHECK) == TRUE;\r\n    g_EraseSettings.m_bEject = IsDlgButtonChecked(IDC_EJECTCHECK) == TRUE;\r\n    g_EraseSettings.m_bSimulate = IsDlgButtonChecked(IDC_SIMULATECHECK) == TRUE;\r\n\r\n    // For internal use only.\r\n    g_EraseSettings.m_pRecorder =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n    g_EraseSettings.m_uiSpeed = (unsigned int)m_SpeedCombo.GetItemData(m_SpeedCombo.GetCurSel());\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CEraseDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CEraseDlg::OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/erase_disc.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}\r\n\r\nLRESULT CEraseDlg::OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Initialize the drive media.\r\n    CheckRecorderMedia();\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/erase_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n#include \"core2.hh\"\r\n\r\nclass CEraseDlg : public CDialogImpl<CEraseDlg>\r\n{\r\nprivate:\r\n    bool m_bAppMode;\r\n    HICON m_hRefreshIcon;\r\n    HIMAGELIST m_hRefreshImageList;\r\n    unsigned int m_uiRecorderTextLen;\r\n\r\n    CComboBox m_RecorderCombo;\r\n    CComboBox m_MethodCombo;\r\n    CComboBox m_SpeedCombo;\r\n\r\n    enum\r\n    {\r\n        TIMER_ID = 42,\r\n        TIMER_INTERVAL = 1000\r\n    };\r\n\r\n    bool Translate();\r\n    bool InitRecorderMedia();\r\n    void InitRefreshButton();\r\n    void CheckRecorderMedia();\r\n\r\npublic:\r\n    enum { IDD = IDD_ERASEDLG };\r\n\r\n    CEraseDlg(bool bAppMode);\r\n    ~CEraseDlg();\r\n\r\n    BEGIN_MSG_MAP(CEraseDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_TIMER,OnTimer)\r\n        COMMAND_HANDLER(IDC_RECORDERCOMBO,CBN_SELCHANGE,OnRecorderChange)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_HANDLER(IDC_HELPBUTTON,BN_CLICKED,OnHelp)\r\n        COMMAND_HANDLER(IDC_REFRESHBUTTON,BN_CLICKED,OnRefresh)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRefresh(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/fixate_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"string_table.hh\"\r\n#include \"device_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"fixate_dlg.hh\"\r\n\r\nCFixateDlg::CFixateDlg(bool bAppMode)\r\n{\r\n    m_bAppMode = bAppMode;\r\n}\r\n\r\nCFixateDlg::~CFixateDlg()\r\n{\r\n}\r\n\r\nbool CFixateDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // This dialog shares many strings with the erase dialog so we begin\r\n    // borrow strings from the erase section.\r\n    if (!pLng->EnterSection(_T(\"erase\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_HELPBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_HELPBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_RECORDERSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_RECORDERSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SIMULATECHECK,szStrValue))\r\n        SetDlgItemText(IDC_SIMULATECHECK,szStrValue);\r\n\r\n    if (!pLng->EnterSection(_T(\"fixate\")))\r\n        return false;\r\n\r\n    if (pLng->GetValuePtr(IDD_FIXATEDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDC_EJECTCHECK,szStrValue))\r\n        SetDlgItemText(IDC_EJECTCHECK,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CFixateDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    m_RecorderCombo = GetDlgItem(IDC_RECORDERCOMBO);\r\n\r\n    // Recorder combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        // We only want to add recorder to the list.\r\n        if (!pDevice->recorder())\r\n            continue;\r\n\r\n        m_RecorderCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_RecorderCombo.SetItemData(m_RecorderCombo.GetCount() - 1,\r\n                                    reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_RecorderCombo.GetCount() == 0)\r\n    {\r\n        m_RecorderCombo.AddString(lngGetString(FAILURE_NORECORDERS));\r\n        m_RecorderCombo.EnableWindow(false);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(GetDlgItem(IDOK),false);\r\n    }\r\n\r\n    m_RecorderCombo.SetCurSel(0);\r\n\r\n    // Enable/disable the simulation checkbox depending on if the selected recorder\r\n    // supports that operation.\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(0));\r\n    ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),\r\n                   pDevice->support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n\r\n    // Setup the default settings.\r\n    CheckDlgButton(IDC_EJECTCHECK,g_FixateSettings.m_bEject);\r\n    CheckDlgButton(IDC_SIMULATECHECK,g_FixateSettings.m_bSimulate);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CFixateDlg::OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Enable/disable the simulation checkbox depending on if the selected recorder\r\n    // supports that operation.\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    ::EnableWindow(GetDlgItem(IDC_SIMULATECHECK),\r\n                   pDevice->support(ckmmc::Device::ckDEVICE_TEST_WRITE));\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CFixateDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Remember the configuration.\r\n    g_FixateSettings.m_bEject = IsDlgButtonChecked(IDC_EJECTCHECK) == 1;\r\n    g_FixateSettings.m_bSimulate = IsDlgButtonChecked(IDC_SIMULATECHECK) == 1;\r\n\r\n    // For internal use only.\r\n    g_FixateSettings.m_pRecorder =\r\n        reinterpret_cast<ckmmc::Device *>(m_RecorderCombo.GetItemData(\r\n                                          m_RecorderCombo.GetCurSel()));\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CFixateDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CFixateDlg::OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/fixate_disc.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/fixate_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CFixateDlg : public CDialogImpl<CFixateDlg>\r\n{\r\nprivate:\r\n    bool m_bAppMode;\r\n    CComboBox m_RecorderCombo;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_FIXATEDLG };\r\n\r\n    CFixateDlg(bool bAppMode);\r\n    ~CFixateDlg();\r\n\r\n    BEGIN_MSG_MAP(CFixateDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_HANDLER(IDC_RECORDERCOMBO,CBN_SELCHANGE,OnRecorderChange)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_HANDLER(IDC_HELPBUTTON,BN_CLICKED,OnHelp)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnRecorderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/import_session_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"wait_dlg.hh\"\r\n#include \"scsi.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core2_info.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"import_session_dlg.hh\"\r\n\r\nCImportSessionDlg::CImportSessionDlg() : m_pSelDevice(NULL),m_pSelTrackData(NULL)\r\n{\r\n}\r\n\r\nCImportSessionDlg::~CImportSessionDlg()\r\n{\r\n    // Delete any track data.\r\n    ResetDiscInfo();\r\n}\r\n\r\nbool CImportSessionDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is an erase translation section.\r\n    if (!pLng->EnterSection(_T(\"importsession\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_IMPORTSESSIONDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DRIVESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_DRIVESTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_USEDSPACELABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_USEDSPACELABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TRACKSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TRACKSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CImportSessionDlg::UpdateDiscInfo(ckmmc::Device &Device)\r\n{\r\n    g_pLogDlg->print_line(_T(\"CImportSessionDlg::UpdateDiscInfo\"));\r\n\r\n    unsigned char ucFirstTrackNumber = 0,ucLastTrackNumber = 0;\r\n    std::vector<CCore2TOCTrackDesc> Tracks;\r\n\r\n    CCore2Info Info;\r\n    if (Info.ReadTOC(Device,ucFirstTrackNumber,ucLastTrackNumber,Tracks))\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  First and last disc track number: %d, %d.\"),\r\n            ucFirstTrackNumber,ucLastTrackNumber);\r\n\r\n        // Iterate through all tracks.\r\n        CCore2TrackInfo TrackInfo;\r\n\r\n        std::vector<CCore2TOCTrackDesc>::const_iterator itTrack;\r\n        for (itTrack = Tracks.begin(); itTrack != Tracks.end(); itTrack++)\r\n        {\r\n            if (!Info.ReadTrackInformation(Device,CCore2Info::TIT_LBA,itTrack->m_ulTrackAddr,&TrackInfo))\r\n            {\r\n                g_pLogDlg->print_line(_T(\"  Error: Unable to read information about track %d.\"),itTrack->m_ucTrackNumber);\r\n                return false;\r\n            }\r\n\r\n            // Always assume a post-gap of 150 sectors. This may be a bad idea.\r\n            unsigned long ulTrackSize = TrackInfo.m_ulTrackSize - 150;\r\n\r\n            m_TrackData.push_back(new CTrackData(TrackInfo.m_ucDataMode,TrackInfo.m_usSessionNumber,\r\n                TrackInfo.m_usTrackNumber,itTrack->m_ulTrackAddr,ulTrackSize));\r\n        }\r\n    }\r\n    else\r\n    {\r\n        g_pLogDlg->print_line(_T(\"  Error: Unable to read TOC information to validate selected track.\"));\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CImportSessionDlg::ResetDiscInfo()\r\n{\r\n    std::vector<CTrackData *>::iterator itTrack;\r\n    for (itTrack = m_TrackData.begin(); itTrack != m_TrackData.end(); itTrack++)\r\n        delete *itTrack;\r\n\r\n    m_TrackData.clear();\r\n}\r\n\r\nLRESULT CImportSessionDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    m_DeviceCombo = GetDlgItem(IDC_DEVICECOMBO);\r\n    m_TrackCombo = GetDlgItem(IDC_TRACKCOMBO);\r\n\r\n    // Device combo box.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        const ckmmc::Device *pDevice = *it;\r\n\r\n        m_DeviceCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_DeviceCombo.SetItemData(m_DeviceCombo.GetCount() - 1,\r\n                                  reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_DeviceCombo.GetCount() == 0)\r\n    {\r\n        m_DeviceCombo.AddString(lngGetString(FAILURE_NORECORDERS));\r\n        m_DeviceCombo.EnableWindow(false);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(GetDlgItem(IDOK),false);\r\n    }\r\n\r\n    m_DeviceCombo.SetCurSel(0);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // Update the information.\r\n    if (m_DeviceCombo.GetCount() > 0)\r\n    {\r\n        BOOL bDymmy;\r\n        OnDeviceChange(NULL,NULL,NULL,bDymmy);\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CImportSessionDlg::OnDeviceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_DeviceCombo.GetItemData(\r\n                                          m_DeviceCombo.GetCurSel()));\r\n\r\n    // Rescan the bus.\r\n    CWaitDlg WaitDlg;\r\n    WaitDlg.Create(m_hWnd);\r\n    WaitDlg.ShowWindow(SW_SHOW);\r\n        // Initialize device.\r\n        WaitDlg.SetMessage(lngGetString(INIT_DEVICECD));\r\n\r\n        CCore2Info Info;\r\n        CCore2DiscInfo DiscInfo;\r\n\r\n        if (Info.ReadDiscInformation(*pDevice,&DiscInfo))\r\n        {\r\n            // UPDATE: This does not seem to work on DVD+RW discs.\r\n            //::EnableWindow(GetDlgItem(IDOK),DiscInfo.m_ucDiscStatus == CCore2DiscInfo::DS_INCOMPLETE);\r\n            ::EnableWindow(GetDlgItem(IDOK),TRUE);\r\n\r\n            // Space.\r\n            unsigned __int64 uiUsedBytes = 0;\r\n            unsigned __int64 uiFreeBytes = 0;\r\n\r\n            if (Info.GetTotalDiscCapacity(*pDevice,uiUsedBytes,uiFreeBytes))\r\n            {\r\n                m_uiAllocatedSize = uiUsedBytes;\r\n\r\n                TCHAR szBuffer[64];\r\n                FormatBytes(szBuffer,m_uiAllocatedSize);\r\n                lsprintf(szBuffer + lstrlen(szBuffer),_T(\" (%I64d Bytes)\"),m_uiAllocatedSize);\r\n                SetDlgItemText(IDC_USEDSPACESTATIC,szBuffer);\r\n            }\r\n            else\r\n            {\r\n                SetDlgItemText(IDC_USEDSPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n            }\r\n\r\n            // Delete any  previous track data.\r\n            ResetDiscInfo();\r\n            UpdateDiscInfo(*pDevice);\r\n\r\n            m_TrackCombo.ResetContent();\r\n            if (m_TrackData.size() == 0)\r\n            {\r\n                m_TrackCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n                m_TrackCombo.EnableWindow(FALSE);\r\n\r\n                ::EnableWindow(GetDlgItem(IDOK),FALSE);\r\n            }\r\n            else\r\n            {\r\n                m_TrackCombo.EnableWindow(TRUE);\r\n\r\n                TCHAR szBuffer[128];\r\n\r\n                std::vector<CTrackData *>::iterator itTrack;\r\n                for (itTrack = m_TrackData.begin(); itTrack != m_TrackData.end(); itTrack++)\r\n                {\r\n                    lsnprintf_s(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),_T(\"%s %u %s %u: %u-%u (%s %u)\"),\r\n                        lngGetString(MISC_SESSION),(*itTrack)->m_usSessionNumber,\r\n                        lngGetString(MISC_TRACK),(*itTrack)->m_usTrackNumber,\r\n                        (*itTrack)->m_ulTrackAddr,(*itTrack)->m_ulTrackAddr + (*itTrack)->m_ulTrackLen,\r\n                        lngGetString(MISC_MODE),(*itTrack)->m_ucMode);\r\n                    m_TrackCombo.AddString(szBuffer);\r\n                    m_TrackCombo.SetItemData(m_TrackCombo.GetCount() - 1,(DWORD_PTR)*itTrack);\r\n                }\r\n\r\n                ::EnableWindow(GetDlgItem(IDOK),TRUE);\r\n            }\r\n\r\n            m_TrackCombo.SetCurSel(m_TrackCombo.GetCount() - 1);\r\n        }\r\n        else\r\n        {\r\n            ResetDiscInfo();\r\n            m_TrackCombo.ResetContent();\r\n            m_TrackCombo.AddString(lngGetString(MISC_NOTAVAILABLE));\r\n            m_TrackCombo.SetCurSel(0);\r\n            m_TrackCombo.EnableWindow(FALSE);\r\n\r\n            ::EnableWindow(GetDlgItem(IDOK),false);\r\n            SetDlgItemText(IDC_USEDSPACESTATIC,lngGetString(DISC_UNKNOWN));\r\n        }\r\n\r\n    WaitDlg.DestroyWindow();\r\n    return 0;\r\n}\r\n\r\nLRESULT CImportSessionDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    m_pSelDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_DeviceCombo.GetItemData(\r\n                                          m_DeviceCombo.GetCurSel()));\r\n    m_pSelTrackData = (CTrackData *)m_TrackCombo.GetItemData(m_TrackCombo.GetCurSel());\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CImportSessionDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}"
  },
  {
    "path": "src/app/dialog/import_session_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"resource.h\"\r\n\r\nclass CImportSessionDlg : public CDialogImpl<CImportSessionDlg>\r\n{\r\nprivate:\r\n    class CTrackData\r\n    {\r\n    public:\r\n        unsigned char m_ucMode;\r\n        unsigned short m_usSessionNumber;\r\n        unsigned short m_usTrackNumber;\r\n        unsigned long m_ulTrackAddr;\r\n        unsigned long m_ulTrackLen;\r\n\r\n        CTrackData(unsigned char ucMode,unsigned short usSessionNumber,\r\n            unsigned short usTrackNumber,unsigned long ulTrackAddr,unsigned long ulTrackLen) :\r\n            m_ucMode(ucMode),m_usSessionNumber(usSessionNumber),m_usTrackNumber(usTrackNumber),\r\n            m_ulTrackAddr(ulTrackAddr),m_ulTrackLen(ulTrackLen)\r\n        {\r\n        }\r\n    };\r\n\r\n    std::vector<CTrackData *> m_TrackData;\r\n    CComboBox m_DeviceCombo;\r\n    CComboBox m_TrackCombo;\r\n\r\n    bool Translate();\r\n    bool UpdateDiscInfo(ckmmc::Device &Device);\r\n\r\n    void ResetDiscInfo();\r\n\r\npublic:\r\n    enum { IDD = IDD_IMPORTSESSIONDLG };\r\n\r\n    // Data members that can be accessed from another object when the dialog\r\n    // has closed.\r\n    unsigned __int64 m_uiAllocatedSize;\r\n    ckmmc::Device *m_pSelDevice;\r\n    CTrackData *m_pSelTrackData;\r\n\r\n    CImportSessionDlg();\r\n    ~CImportSessionDlg();\r\n\r\n    BEGIN_MSG_MAP(CImportSessionDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_HANDLER(IDC_DEVICECOMBO,CBN_SELCHANGE,OnDeviceChange)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n\r\n        REFLECT_NOTIFICATIONS()\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDeviceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/info_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCInfoDlg::CInfoDlg(bool *pRemember,const TCHAR *szMessage,int iFlags)\r\n{\r\n    m_pRemember = pRemember;\r\n    m_iFlags = iFlags;\r\n    n_szMessage = szMessage;\r\n}\r\n\r\nCInfoDlg::~CInfoDlg()\r\n{\r\n}\r\n\r\nbool CInfoDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n\r\n    TCHAR *szStrValue;\r\n\r\n    // Translate the title.\r\n    if (!pLng->EnterSection(_T(\"strings\")))\r\n        return false;\r\n    \r\n    // Translate the rest.\r\n    if (!pLng->EnterSection(_T(\"info\")))\r\n        return false;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DISPLAYMSGCHECK,szStrValue))\r\n        SetDlgItemText(IDC_DISPLAYMSGCHECK,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CInfoDlg::InitializeMessage\r\n    ---------------------------\r\n    Sets the text of the static control to szMessage. Resizes the static to fit\r\n    all of the text, and if necessary also moves the check box and resizes the\r\n    main window.\r\n*/\r\nvoid CInfoDlg::InitializeMessage(const TCHAR *szMessage)\r\n{\r\n    // Set the message text.\r\n    SetDlgItemText(IDC_INFOSTATIC,szMessage);\r\n\r\n    // Get handles.\r\n    HWND hMessageCtrl = GetDlgItem(IDC_INFOSTATIC);\r\n    HWND hCheckCtrl = GetDlgItem(IDC_DISPLAYMSGCHECK);\r\n    HDC hMessageDC = ::GetDC(hMessageCtrl);\r\n\r\n    // Perpare font.\r\n    HFONT hMessageFont = (HFONT)::SendMessage(hMessageCtrl,WM_GETFONT,0,0);\r\n    HFONT hOldFont = (HFONT)::SelectObject(hMessageDC,hMessageFont);\r\n\r\n    // Calculate and set the message size.\r\n    RECT rcMessage;\r\n    ::GetWindowRect(GetDlgItem(IDC_INFOSTATIC),&rcMessage);\r\n    ScreenToClient(&rcMessage);\r\n\r\n    RECT rcText;\r\n    rcText.left = 0;\r\n    rcText.right = rcMessage.right - rcMessage.left;\r\n    int iMessageHeight = DrawText(hMessageDC,szMessage,lstrlen(szMessage),&rcText,DT_LEFT | DT_CALCRECT | DT_WORDBREAK);\r\n\r\n    ::MoveWindow(GetDlgItem(IDC_INFOSTATIC),rcMessage.left,rcMessage.top,rcMessage.right - rcMessage.left,iMessageHeight,TRUE);\r\n\r\n    // Restore old font.\r\n    ::SelectObject(hMessageDC,hOldFont);\r\n\r\n    // Move the check box and resize the window if necessary.\r\n    RECT rcCheck;\r\n    ::GetWindowRect(hCheckCtrl,&rcCheck);\r\n    ScreenToClient(&rcCheck);\r\n    int iNewCheckTop = rcMessage.top + iMessageHeight + 8;\r\n\r\n    if (iNewCheckTop > rcCheck.top)\r\n    {\r\n        ::SetWindowPos(hCheckCtrl,0,\r\n            rcCheck.left,iNewCheckTop,rcCheck.right - rcCheck.left,rcCheck.bottom - rcCheck.top,0);\r\n\r\n        int iDiff = iNewCheckTop - rcCheck.top;\r\n\r\n        // Resize the main window.\r\n        RECT rcWindow;\r\n        GetWindowRect(&rcWindow);\r\n        MoveWindow(rcWindow.left,rcWindow.top,\r\n            rcWindow.right - rcWindow.left,rcWindow.bottom - rcWindow.top + iDiff);\r\n    }\r\n}\r\n\r\nLRESULT CInfoDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Set the icon and window text.\r\n    HANDLE hIcon;\r\n\r\n    if (m_iFlags & INFODLG_ICONERROR)\r\n    {\r\n        hIcon = LoadIcon(NULL,IDI_HAND);\r\n        SetWindowText(lngGetString(GENERAL_ERROR));\r\n    }\r\n    else if (m_iFlags & INFODLG_ICONWARNING)\r\n    {\r\n        hIcon = LoadIcon(NULL,IDI_EXCLAMATION);\r\n        SetWindowText(lngGetString(GENERAL_WARNING));\r\n    }\r\n    else\r\n    {\r\n        hIcon = LoadIcon(NULL,IDI_ASTERISK);\r\n        SetWindowText(lngGetString(GENERAL_INFORMATION));\r\n    }\r\n\r\n    ::SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)hIcon,0L);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // Display message and caculate correct messsage and window widths.\r\n    InitializeMessage(n_szMessage);\r\n\r\n    // Disable the cancel button if necessary.\r\n    if (m_iFlags & INFODLG_NOCANCEL)\r\n        ::EnableWindow(GetDlgItem(IDCANCEL),FALSE);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CInfoDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    *m_pRemember = !IsDlgButtonChecked(IDC_DISPLAYMSGCHECK) == TRUE;\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CInfoDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/info_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\n// Flags.\r\n#define INFODLG_NOCANCEL\t\t\t1\r\n#define INFODLG_ICONERROR\t\t\t2\r\n#define INFODLG_ICONWARNING\t\t\t4\r\n\r\nclass CInfoDlg : public CDialogImpl<CInfoDlg>\r\n{\r\nprivate:\r\n    // Pointer to the value that will be changed according to the \"Do not display\r\n    // this message again\" option.\r\n    bool *m_pRemember;\r\n\r\n    int m_iFlags;\r\n\r\n    // Pointer to the message text to be displayed.\r\n    const TCHAR *n_szMessage;\r\n\r\n    bool Translate();\r\n    void InitializeMessage(const TCHAR *szMessage);\r\n\r\npublic:\r\n    enum { IDD = IDD_INFODLG };\r\n\r\n    CInfoDlg(bool *pRemember,const TCHAR *szMessage,int iFlags = 0);\r\n    ~CInfoDlg();\r\n\r\n    BEGIN_MSG_MAP(CEraseDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/log_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"diagnostics.hh\"\r\n#include \"version.hh\"\r\n#include \"log_dlg.hh\"\r\n\r\n// FIXME: No arrow is used, not enough space.\r\nCLogDlg::CLogDlg() : m_DiagButton(IDR_DIAGNOSTICSMENU,false),\r\n    m_LogFile(GetLogFullPath())\r\n{\r\n}\r\n\r\nCLogDlg::~CLogDlg()\r\n{\r\n}\r\n\r\nckcore::Path CLogDlg::GetLogFullPath()\r\n{\r\n    // Get system date.\r\n    SYSTEMTIME st;\r\n    GetLocalTime(&st);\r\n\r\n    TCHAR szFileName[13];\r\n    GetDateFormat(LOCALE_USER_DEFAULT,0,&st,_T(\"yyMMdd\"),szFileName,7);\r\n\r\n    // Get the log dir path.\r\n    ckcore::Path DirPath = GetLogDirPath();\r\n    \r\n    // Create the file path if it doesn't exist.\r\n    ckcore::Directory::create(DirPath);\r\n\r\n    // Construct the file name.\r\n    lstrcat(szFileName,_T(\".log\"));\r\n\r\n    // Append the file name and return.\r\n    return DirPath + szFileName;\r\n}\r\n\r\nckcore::Path CLogDlg::GetLogDirPath()\r\n{\r\n    TCHAR szDirPath[MAX_PATH];\r\n\r\n#ifdef PORTABLE\r\n    GetModuleFileName(NULL,szDirPath,MAX_PATH - 1);\r\n    ExtractFilePath(szDirPath);\r\n\r\n    lstrcat(szDirPath,_T(\"logs\\\\\"));\r\n#else\r\n    if (SUCCEEDED(SHGetFolderPath(m_hWnd,CSIDL_APPDATA | CSIDL_FLAG_CREATE,NULL,\r\n        SHGFP_TYPE_CURRENT,szDirPath)))\r\n    {\r\n        IncludeTrailingBackslash(szDirPath);\r\n        lstrcat(szDirPath,_T(\"InfraRecorder\\\\logs\\\\\"));\r\n    }\r\n    else\r\n    {\r\n        GetModuleFileName(NULL,szDirPath,MAX_PATH - 1);\r\n        ExtractFilePath(szDirPath);\r\n    }\r\n#endif\r\n\r\n    return ckcore::Path(szDirPath);\r\n}\r\n\r\nvoid CLogDlg::InitializeLogFile()\r\n{\r\n    if (m_LogFile.exist())\r\n    {\r\n        if (m_LogFile.open(ckcore::File::ckOPEN_READWRITE))\r\n        {\r\n            m_LogFile.seek(0,ckcore::File::ckFILE_END);\r\n            m_LogFile.write(ckT(\"\\r\\n\"),sizeof(ckcore::tchar) << 1);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (m_LogFile.open(ckcore::File::ckOPEN_WRITE))\r\n        {\r\n            // Write byte order mark.\r\n            unsigned short usBOM = BOM_UTF32BE;\r\n            m_LogFile.write(&usBOM,2);\r\n        }\r\n    }\r\n}\r\n\r\nbool CLogDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a log translation section.\r\n    if (!pLng->EnterSection(_T(\"log\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_LOGDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(ID_SAVEASBUTTON,szStrValue))\r\n        SetDlgItemText(ID_SAVEASBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_FILESBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_FILESBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DIAGNOSTICSBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_DIAGNOSTICSBUTTON,szStrValue);\r\n\r\n    // Modify the diagnostics popup menu.\r\n    if (pLng->GetValuePtr(ID_DIAGNOSTICS_DEVICESCAN,szStrValue))\r\n        ModifyMenu(m_DiagButton.GetMenu(),ID_DIAGNOSTICS_DEVICESCAN,MF_BYCOMMAND | MF_STRING,\r\n            ID_DIAGNOSTICS_DEVICESCAN,(LPCTSTR)szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CLogDlg::Show\r\n    -------------\r\n    Should be called when the log should be displayed. This function automaticly\r\n    scrolls to the bottom of the log.\r\n*/\r\nvoid CLogDlg::Show()\r\n{\r\n    g_pLogDlg->ShowWindow(SW_SHOW);\r\n    m_LogEdit.LineScroll(m_LogEdit.GetLineCount());\r\n}\r\n\r\nvoid CLogDlg::print(const TCHAR *szString,...)\r\n{\r\n    if (g_GlobalSettings.m_bLog && IsWindow())\r\n    {\r\n        va_list args;\r\n        va_start(args,szString);\r\n\r\n        _vsnwprintf(m_szLineBuffer,LOG_LINEBUFFER_SIZE - 1,szString,args);\r\n\r\n        m_LogEdit.AppendText(m_szLineBuffer);\r\n\r\n        // Write to the log file.\r\n        if (m_LogFile.test())\r\n            m_LogFile.write(m_szLineBuffer,lstrlen(m_szLineBuffer) * sizeof(TCHAR));\r\n    }\r\n}\r\n\r\nvoid CLogDlg::print_line(const TCHAR *szLine,...)\r\n{\r\n    if (g_GlobalSettings.m_bLog && IsWindow())\r\n    {\r\n        va_list args;\r\n        va_start(args,szLine);\r\n\r\n        _vsnwprintf(m_szLineBuffer,LOG_LINEBUFFER_SIZE - 1,szLine,args);\r\n\r\n        m_LogEdit.AppendText(m_szLineBuffer);\r\n        m_LogEdit.AppendText(_T(\"\\r\\n\"));\r\n\r\n        // Write to the log file.\r\n        if (m_LogFile.test())\r\n        {\r\n            m_LogFile.write(m_szLineBuffer,lstrlen(m_szLineBuffer) * sizeof(TCHAR));\r\n            m_LogFile.write(ckT(\"\\r\\n\"),2 * sizeof(ckcore::tchar));\r\n        }\r\n    }\r\n}\r\n\r\nbool CLogDlg::SaveLog(const TCHAR *szFileName)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return false;\r\n\r\n    // Obtain buffer handle.\r\n    HLOCAL hBuffer = m_LogEdit.GetHandle();\r\n    if (hBuffer == NULL)\r\n        return false;\r\n\r\n    // A special unicode hack is needed here since the edit might be in unicode\r\n    // while the application is not.\r\n    unsigned char *pBuffer = (unsigned char *)LocalLock(hBuffer);\r\n    unsigned int uiTextLength = m_LogEdit.GetWindowTextLength();\r\n\r\n    bool bIsUnicode = ::IsWindowUnicode(m_LogEdit) == TRUE;\r\n\r\n#ifdef LOG_SAVE_BOM\r\n    if (bIsUnicode)\r\n    {\r\n        unsigned short usBOM = BOM_UTF32BE;\r\n        if (File.write(&usBOM,2) == -1)\r\n        {\r\n            File.remove();\r\n            return false;\r\n        }\r\n    }\r\n#endif\r\n\r\n    // Do the actual writing.\r\n    unsigned int uiRemaining = uiTextLength * (bIsUnicode ? 2 : 1);\r\n\r\n    while (uiRemaining > LOG_WRITEBUFFER_SIZE)\r\n    {\r\n        if (File.write(pBuffer,LOG_WRITEBUFFER_SIZE) == -1)\r\n        {\r\n            File.remove();\r\n            return false;\r\n        }\r\n\r\n        uiRemaining -= LOG_WRITEBUFFER_SIZE;\r\n        pBuffer += LOG_WRITEBUFFER_SIZE;\r\n    }\r\n\r\n    if (File.write(pBuffer,uiRemaining) == -1)\r\n    {\r\n        File.remove();\r\n        return false;\r\n    }\r\n\r\n    LocalUnlock(hBuffer);\r\n    return true;\r\n}\r\n\r\nLRESULT CLogDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    DlgResize_Init(true,true,WS_CLIPCHILDREN);\r\n\r\n    m_LogEdit = GetDlgItem(IDC_LOGEDIT);\r\n\r\n    // The edit control can hold a maximum of 30,000 characters by default,\r\n    // and that's too little when for example the ISO 9600 file system starts\r\n    // generating warnings for many files in the project.\r\n    const UINT uiMaxCharCount = 1 * 1024 * 1024;\r\n    m_LogEdit.SetLimitText(uiMaxCharCount);\r\n    // There is no error indication, so manually check that the new value\r\n    // was actually accepted.\r\n    ATLASSERT(uiMaxCharCount == m_LogEdit.GetLimitText());\r\n\r\n    m_DiagButton.SubclassWindow(GetDlgItem(IDC_DIAGNOSTICSBUTTON));\r\n\r\n    // Initialize the log.\r\n    if (g_GlobalSettings.m_bLog)\r\n    {\r\n        // Initialize the log file.\r\n        InitializeLogFile();\r\n\r\n        // Print version information.\r\n        TCHAR szFileName[MAX_PATH];\r\n        GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n        unsigned long ulDummy;\r\n        unsigned long ulDataSize = GetFileVersionInfoSize(szFileName,&ulDummy);\r\n\r\n        if (ulDataSize != 0)\r\n        {\r\n            unsigned char *pBlock = new unsigned char[ulDataSize];\r\n\r\n            struct LANGANDCODEPAGE\r\n            {\r\n                unsigned short usLanguage;\r\n                unsigned short usCodePage;\r\n            } *pTranslate;\r\n\r\n            if (GetFileVersionInfo(szFileName,NULL,ulDataSize,pBlock) > 0)\r\n            {\r\n                // Get language information (only one language should be present).\r\n                VerQueryValue(pBlock,_T(\"\\\\VarFileInfo\\\\Translation\"),\r\n                    (LPVOID *)&pTranslate,(unsigned int *)&ulDummy);\r\n\r\n                // Calculate the FileVersion sub block path.\r\n                TCHAR szStrBuffer[128];\r\n                lsprintf(szStrBuffer,_T(\"\\\\StringFileInfo\\\\%04x%04x\\\\FileVersion\"),\r\n                    pTranslate[0].usLanguage,pTranslate[0].usCodePage);\r\n\r\n                unsigned char *pBuffer;\r\n                VerQueryValue(pBlock,szStrBuffer,(LPVOID *)&pBuffer,(unsigned int *)&ulDataSize);\r\n\r\n                print(_T(\"InfraRecorder version %s\"),(TCHAR *)pBuffer);\r\n            }\r\n\r\n            delete [] pBlock;\r\n        }\r\n\r\n#ifdef _M_IA64\r\n        print_line(_T(\" (IA64)\"));\r\n#elif defined _M_X64\r\n        print_line(_T(\" (x64)\"));\r\n#else\r\n        print_line(_T(\" (x86)\"));\r\n#endif\r\n\r\n        // Date and time.\r\n        SYSTEMTIME st;\r\n        GetLocalTime(&st);\r\n        TCHAR szDate[64];\r\n        GetDateFormat(LOCALE_USER_DEFAULT,0,&st,_T(\"dddd, MMMM dd yyyy \"),szDate,64);\r\n        TCHAR szDateTime[128];\r\n        lsprintf(szDateTime,_T(\"Started: %s%.2d:%.2d:%.2d.\"),szDate,st.wHour,st.wMinute,st.wSecond);\r\n        print_line(szDateTime);\r\n\r\n        // Windows version.\r\n        print_line(_T(\"Versions: MSW = %d.%d, IE = %d.%d, CC = %d.%d.\"),\r\n            g_WinVer.m_ulMajorVersion,g_WinVer.m_ulMinorVersion,\r\n            g_WinVer.m_ulMajorIEVersion,g_WinVer.m_ulMinorIEVersion,\r\n            g_WinVer.m_ulMajorCCVersion,g_WinVer.m_ulMinorCCVersion);\r\n    }\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CLogDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ShowWindow(SW_HIDE);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CLogDlg::OnSaveAs(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(false,_T(\"txt\"),_T(\"Untitled\"),OFN_EXPLORER | OFN_HIDEREADONLY,\r\n        _T(\"Text Documents (*.txt)\\0*.txt\\0All Files (*.*)\\0*.*\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        if (!SaveLog(FileDialog.m_szFileName))\r\n            lngMessageBox(m_hWnd,ERROR_FILEWRITE,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n    }\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CLogDlg::OnFiles(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ckcore::Path Path = GetLogDirPath();\r\n\r\n    ShellExecute(HWND_DESKTOP,_T(\"open\"),_T(\"explorer.exe\"),Path.name().c_str(),NULL,SW_SHOWDEFAULT);\r\n    return 0;\r\n}\r\n\r\nLRESULT CLogDlg::OnDiagDeviceScan(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_Diagnostics.DeviceScan();\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/log_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include <ckcore/file.hh>\r\n#include <ckcore/log.hh>\r\n#include \"drop_down_button.hh\"\r\n\r\n#define BOM_UTF8\t\t\t\t\t0xEFBBBF\r\n#define BOM_UTF32BE\t\t\t\t\t0x0000FEFF\r\n#define BOM_UTF32LE\t\t\t\t\t0xFFFE0000\r\n#define BOM_SCSU\t\t\t\t\t0x0EFEFF\r\n\r\n#define LOG_SAVE_BOM\r\n#define LOG_WRITEBUFFER_SIZE\t\t1024\r\n#define LOG_LINEBUFFER_SIZE\t\t\t512\r\n\r\nclass CLogDlg : public CDialogImpl<CLogDlg>,public CDialogResize<CLogDlg>,\r\n                public ckcore::Log\r\n{\r\nprivate:\r\n    CEdit m_LogEdit;\r\n    CDropDownButton m_DiagButton;\r\n\r\n    // This buffer will be used when creating the log line by the variable\r\n    // argument list.\r\n    TCHAR m_szLineBuffer[LOG_LINEBUFFER_SIZE];\r\n\r\n    ckcore::File m_LogFile;\r\n\r\n    ckcore::Path GetLogFullPath();\r\n    ckcore::Path GetLogDirPath();\r\n\r\n    void InitializeLogFile();\r\n\r\n    bool Translate();\r\n    bool SaveLog(const TCHAR *szFileName);\r\n\r\npublic:\r\n    enum { IDD = IDD_LOGDLG };\r\n\r\n    CLogDlg();\r\n    ~CLogDlg();\r\n\r\n    void Show();\r\n    void print(const TCHAR *szString,...);\r\n    void print_line(const TCHAR *szLine,...);\r\n\r\n    // Resize maps.\r\n    BEGIN_DLGRESIZE_MAP(CLogDlg)\r\n        DLGRESIZE_CONTROL(IDOK,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(ID_SAVEASBUTTON,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_DIAGNOSTICSBUTTON,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(IDC_FILESBUTTON,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(IDC_LOGEDIT,DLSZ_SIZE_X | DLSZ_SIZE_Y)\r\n    END_DLGRESIZE_MAP()\r\n\r\n    // Events.\r\n    BEGIN_MSG_MAP(CLogDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnOK)\r\n        COMMAND_ID_HANDLER(ID_SAVEASBUTTON,OnSaveAs)\r\n        COMMAND_ID_HANDLER(IDC_FILESBUTTON,OnFiles)\r\n        COMMAND_ID_HANDLER(ID_DIAGNOSTICS_DEVICESCAN,OnDiagDeviceScan)\r\n\r\n        REFLECT_NOTIFICATIONS()\r\n        CHAIN_MSG_MAP(CDialogResize<CLogDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnSaveAs(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnDiagDeviceScan(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFiles(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n\r\nextern CLogDlg * g_pLogDlg;"
  },
  {
    "path": "src/app/dialog/main_frm.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/filestream.hh>\r\n#include <ckcore/linereader.hh>\r\n#include <ckcore/exception.hh>\r\n#include <base/string_util.hh>\r\n#include \"resource.h\"\r\n#include \"settings.hh\"\r\n#include \"registry.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"devices_dlg.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"core.hh\"\r\n#include \"core2.hh\"\r\n#include \"settings_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"tree_manager.hh\"\r\n#include \"version.hh\"\r\n#include \"project_prop_dlg.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"config_dlg.hh\"\r\n#include \"action_manager.hh\"\r\n#include \"disc_dlg.hh\"\r\n#include \"scsi.hh\"\r\n#include \"import_session_dlg.hh\"\r\n#include \"core2_stream.hh\"\r\n#include \"project_drop_source.hh\"\r\n#include \"files_data_object.hh\"\r\n#include \"device_util.hh\"\r\n#include \"about_window.hh\"\r\n#include \"main_frm.hh\"\r\n\r\nCMainFrame::CMainFrame() : m_pShellListView(NULL),m_bWelcomePane(false)\r\n{\r\n    m_iDefaultProjType = PROJECTTYPE_DATA;\r\n    m_iDefaultMedia = -1;\t\t\t// Use default for each project type.\r\n    m_bDefaultProjDVDVideo = false;\r\n    m_bDefaultWizard = true;\r\n\r\n    // Empty the file name.\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    m_hMainSmallImageList = NULL;\r\n    m_hMainLargeImageList = NULL;\r\n    m_hMiniToolBarImageList = NULL;\r\n\r\n    // By default we allow the tree selection to change.\r\n    m_bEnableTreeSelection = true;\r\n\r\n    // By default we don't ignore accelerators.\r\n    m_bEnableAccel = true;\r\n}\r\n\r\nCMainFrame::~CMainFrame()\r\n{\r\n}\r\n\r\n/*\r\n    CMainFrame::AutoRunCheck\r\n    ------------------------\r\n    Checks if autorun is enabled. Windows polls the CD drive periodically, which\r\n    may result in recording failure.\r\n*/\r\n/*void CMainFrame::AutoRunCheck()\r\n{\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_LOCAL_MACHINE);\r\n\r\n    if (Reg.OpenKey(_T(\"SYSTEM\\\\CurrentControlSet\\\\Services\\\\Cdrom\\\\\"),false))\r\n    {\r\n        bool bAutoRun = false;\r\n\r\n        if (Reg.ReadBool(_T(\"AutoRun\"),bAutoRun))\r\n        {\r\n            if (bAutoRun)\r\n            {\r\n                if (lngMessageBox(m_hWnd,CONFIRM_AUTORUNENABLED,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDYES)\r\n                {\r\n                    if (!Reg.WriteBool(_T(\"AutoRun\"),false))\r\n                        lngMessageBox(m_hWnd,ERROR_REGISTRYWRITE,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n                }\r\n            }\r\n        }\r\n\r\n        Reg.CloseKey();\r\n    }\r\n}*/\r\n\r\n/*\r\n    CMainFrame::EnableAutoRun\r\n    -------------------------\r\n    Enabled or decible the Windows CD-ROM autorun feature. It returns the old\r\n    registry setting.\r\n*/\r\nbool CMainFrame::EnableAutoRun(bool bEnable)\r\n{\r\n    bool bResult = false;\r\n\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_LOCAL_MACHINE);\r\n\r\n    if (Reg.OpenKey(_T(\"SYSTEM\\\\CurrentControlSet\\\\Services\\\\Cdrom\\\\\"),false))\r\n    {\r\n        Reg.ReadBool(_T(\"AutoRun\"),bResult);\r\n        Reg.WriteBool(_T(\"AutoRun\"),bEnable);\r\n        Reg.CloseKey();\r\n    }\r\n\r\n    return bResult;\r\n}\r\n\r\nHWND CMainFrame::CreateToolBarCtrl()\r\n{\r\n    unsigned long ulToolBarStyle = g_DynamicSettings.m_iToolBarText == TOOLBAR_TEXT_SHOWRIGHT ? TBSTYLE_LIST : 0;\r\n    HWND hWndToolBar = m_ToolBar.Create(m_hWnd,rcDefault,NULL,ATL_SIMPLE_TOOLBAR_PANE_STYLE | CCS_ADJUSTABLE | ulToolBarStyle,NULL,ATL_IDW_TOOLBAR);\r\n\r\n    m_ToolBar.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);\r\n    m_ToolBar.SetImageList(g_DynamicSettings.m_iToolBarIcon == TOOLBAR_ICON_SMALL ?\r\n        m_hMainSmallImageList : m_hMainLargeImageList);\r\n    \r\n    // Add all toolbar buttons.\r\n    g_ToolBarManager.FillToolBarCtrl(&m_ToolBar);\r\n\r\n    return hWndToolBar;\r\n}\r\n\r\nint CMainFrame::GetDefaultMedia()\r\n{\r\n    if (m_iDefaultMedia != -1)\r\n        return m_iDefaultMedia;\r\n\r\n    // Find which recorder that the media was changed for.\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        ckmmc::Device *pDevice = *it;\r\n\r\n        // Check if the current device was affected.\r\n        if (pDevice->recorder())\r\n        {\r\n            CCore2Info Info;\r\n            CCore2DiscInfo DiscInfo;\r\n\r\n            // Fetch media information.\r\n            if (Info.ReadDiscInformation(*pDevice,&DiscInfo) && DiscInfo.m_ucDiscStatus == CCore2DiscInfo::DS_EMTPY)\r\n            {\r\n                switch (pDevice->profile())\r\n                {\r\n                    case ckmmc::Device::ckPROFILE_DVDRAM:\r\n                    case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n                    case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n                    case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n                    case ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ:\r\n                    case ckmmc::Device::ckPROFILE_DVDPLUSR:\r\n                        return SPACEMETER_SIZE_DVD;\r\n                    case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ:\r\n                    case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP:\r\n                    case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n                    case ckmmc::Device::ckPROFILE_DVDPLUSR_DL:\r\n                        return SPACEMETER_SIZE_DLDVD;\r\n                    /*case ckmmc::Device::ckPROFILE_BDROM:\r\n                    case ckmmc::Device::ckPROFILE_BDR_SRM:\r\n                    case ckmmc::Device::ckPROFILE_BDR_RRM:\r\n                    case ckmmc::Device::ckPROFILE_BDRE:\r\n                    case ckmmc::Device::ckPROFILE_HDDVDROM:\r\n                    case ckmmc::Device::ckPROFILE_HDDVDR:\r\n                    case ckmmc::Device::ckPROFILE_HDDVDRAM:\r\n                        return;*/\r\n\r\n                    // FIXME: In order to switch to CD size we need to know exactly how much the blank CD can store.\r\n                    /*case ckmmc::Device::ckPROFILE_CDR:\r\n                    case ckmmc::Device::ckPROFILE_CDRW:\r\n                        return SPACEMETER_SIZE_703MB;*/\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return -1;\r\n}\r\n\r\nvoid CMainFrame::InitializeMainSmallImageList()\r\n{\r\n    // Create the image list.\r\n    HBITMAP hSmallBitmap,hLargeBitmap;\r\n\r\n    // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n    int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n    \r\n    if (g_WinVer.m_ulMajorCCVersion >= 6 && iBitsPixel >= 32)\r\n    {\r\n        hSmallBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MAINSMALLBITMAP));\r\n        m_hMainSmallImageList = ImageList_Create(16,16,ILC_COLOR32,0,19);\r\n        ImageList_Add(m_hMainSmallImageList,hSmallBitmap,NULL);\r\n\r\n        hLargeBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MAINLARGEBITMAP));\r\n        m_hMainLargeImageList = ImageList_Create(32,32,ILC_COLOR32,0,19);\r\n        ImageList_Add(m_hMainLargeImageList,hLargeBitmap,NULL);\r\n    }\r\n    else\r\n    {\r\n        hSmallBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MAINSMALLBITMAP_));\r\n        m_hMainSmallImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,19);\r\n        ImageList_AddMasked(m_hMainSmallImageList,hSmallBitmap,RGB(255,0,255));\r\n\r\n        hLargeBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MAINLARGEBITMAP_));\r\n        m_hMainLargeImageList = ImageList_Create(32,32,ILC_COLOR32 | ILC_MASK,0,19);\r\n        ImageList_AddMasked(m_hMainLargeImageList,hLargeBitmap,RGB(255,0,255));\r\n    }\r\n\r\n    DeleteObject(hSmallBitmap);\r\n    DeleteObject(hLargeBitmap);\r\n}\r\n\r\nvoid CMainFrame::InitializeMiniToolBarImageList()\r\n{\r\n    // Create the image list.\r\n    HBITMAP hBitmap;\r\n\r\n    // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n    int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n    \r\n    if (g_WinVer.m_ulMajorCCVersion >= 6 && iBitsPixel >= 32)\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP));\r\n\r\n        m_hMiniToolBarImageList = ImageList_Create(16,16,ILC_COLOR32,0,6);\r\n        ImageList_Add(m_hMiniToolBarImageList,hBitmap,NULL);\r\n    }\r\n    else\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP_));\r\n\r\n        m_hMiniToolBarImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,6);\r\n        ImageList_AddMasked(m_hMiniToolBarImageList,hBitmap,RGB(255,0,255));\r\n    }\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nvoid CMainFrame::InitializeMainView()\r\n{\r\n    m_hWndClient = m_SpaceMeterView.Create(m_hWnd,rcDefault,\r\n        NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT);\r\n    m_SpaceMeterView.m_cxySplitBar = 2;\t\t// Force the splitter size 2, Vista uses a larger size by default.\r\n\r\n    m_SpaceMeterView.SetSplitterExtendedStyle(SPLIT_NONINTERACTIVE | SPLIT_BOTTOMALIGNED);\r\n\r\n    // Space meter.\r\n    m_SpaceMeter.Create(m_SpaceMeterView,rcDefault,NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |\r\n        WS_CLIPCHILDREN);\r\n    m_SpaceMeter.Initialize();\r\n\r\n    // Main view.\r\n    m_MainView.Create(m_SpaceMeterView,rcDefault,NULL,WS_CHILD | WS_VISIBLE |\r\n        WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT);\r\n    m_MainView.m_cxySplitBar = 4;\t// Force the splitter size 2, Vista uses a larger size by default.\r\n\r\n    UpdateLayout();\r\n\r\n    // FIXME:\r\n    m_WelcomePane.Create(m_SpaceMeterView,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP,\r\n        WS_EX_CLIENTEDGE);\r\n\r\n    // Update the splitter origins.\r\n    RECT rcClient;\r\n    ::GetClientRect(m_hWndClient,&rcClient);\r\n\r\n    if (m_bDefaultWizard)\r\n    {\r\n        m_bWelcomePane = true;\r\n\r\n        m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_TOP,m_WelcomePane);\r\n        m_SpaceMeterView.SetSinglePaneMode(SPLIT_PANE_TOP);\r\n    }\r\n    else\r\n    {\r\n        m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_BOTTOM,m_SpaceMeter);\r\n        m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_TOP,m_MainView);\r\n        m_SpaceMeterView.SetSplitterPos(rcClient.bottom - rcClient.top - MAINFRAME_SPACEMETER_HEIGHT);\r\n    }\r\n\r\n    m_MainView.SetSplitterPos((rcClient.bottom - rcClient.top - MAINFRAME_SPACEMETER_HEIGHT)/2);\r\n}\r\n\r\nbool CMainFrame::InitializeShellTreeView()\r\n{\r\n    // Get the handle of the system image list.\r\n    SHFILEINFO shFileInfo;\r\n    HIMAGELIST hImageListSmall = (HIMAGELIST)SHGetFileInfo(_T(\"C:\\\\\"),0,\r\n        &shFileInfo,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);\r\n\r\n    IShellFolder *pDesktop;\r\n    ITEMIDLIST *pidl;\r\n    TV_ITEM tvItem = { 0 };\r\n    TV_INSERTSTRUCT tvInsert = { 0 };\r\n\r\n    // Assign the image list handle and set the scroll time.\r\n    m_ShellTreeView.SetImageList(hImageListSmall,LVSIL_NORMAL);\r\n    m_ShellTreeView.SetScrollTime(100);\r\n\r\n    // Get the location of the desktop folder.\r\n    if (SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidl)))\r\n    {\r\n        if (FAILED(SHGetDesktopFolder(&pDesktop)))\r\n        {\r\n            // Free the pidl.\r\n            IMalloc *pMalloc;\r\n            if (SUCCEEDED(SHGetMalloc(&pMalloc)))\r\n                pMalloc->Free(pidl);\r\n\r\n            return false;\r\n        }\r\n\r\n        CShellTreeItemInfo *pItemInfo = new CShellTreeItemInfo;\r\n\r\n        if (pItemInfo == NULL)\r\n        {\r\n            // Free the pidl\r\n            IMalloc *pMalloc;\r\n            if (SUCCEEDED(SHGetMalloc(&pMalloc)))\r\n                pMalloc->Free(pidl);\r\n\r\n            pDesktop->Release();\r\n            return false;\r\n        }\r\n\r\n        // On the root node pidlSelf is offcourse equal to pidlFullyQual.\r\n        pItemInfo->pidlSelf = pidl;\r\n        pItemInfo->pidlFullyQual = pidl;\r\n\r\n        // Set the tree view item parameters.\r\n        tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n        tvItem.lParam = (LPARAM)pItemInfo;\r\n        tvItem.pszText = LPSTR_TEXTCALLBACK;\r\n        tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK;\r\n        tvItem.cChildren = TRUE;\r\n        tvInsert.item = tvItem;\r\n        tvInsert.hInsertAfter = TVI_LAST;\r\n\r\n        // Insert the root item in the tree and expand it to insert its contents.\r\n        HTREEITEM hItem = m_ShellTreeView.InsertItem(&tvInsert);\r\n        m_ShellTreeView.Expand(hItem);\r\n\r\n        // Check if the selected folder is the desktop. In that case we should go\r\n        // to the dekstop root, not the <drive>:/Documents and Settings/<user name>/Desktop\r\n        // folder.\r\n        TCHAR szDesktopPath[MAX_PATH];\r\n        m_PidlHelp.GetPathName(pidl,szDesktopPath);\r\n\r\n        if (!lstrcmp(szDesktopPath,g_DynamicSettings.m_szShellDir))\r\n        {\r\n            m_ShellTreeView.SelectItem(hItem);\r\n        }\r\n        else\r\n        {\r\n            // The selected folder is not the desktop.\r\n            OpenFolder(g_DynamicSettings.m_szShellDir,hItem,true);\r\n            \r\n            CShellTreeItemInfo *pItemInfo2 = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(m_ShellTreeView.GetSelectedItem());\r\n\r\n            if (pItemInfo2->dwFlags == 0)\r\n            {\r\n                if (pItemInfo2->pParentFolder == 0)\r\n                    m_pShellListView->BrowseObject(pItemInfo2->pidlSelf,SBSP_SAMEBROWSER | SBSP_ABSOLUTE);\r\n                else\t\t\t\r\n                    m_pShellListView->BrowseObject(pItemInfo2->pidlFullyQual,SBSP_SAMEBROWSER | SBSP_ABSOLUTE);\t\r\n            }\r\n        }\r\n\r\n        pDesktop->Release();\r\n\r\n        // Register the directory monitor.\r\n        if (!m_DirectoryMonitor.Register(m_hWnd,WM_SHELLCHANGE,SHCNE_MKDIR |\r\n            SHCNE_RENAMEFOLDER | SHCNE_RMDIR,pidl,true))\r\n        {\r\n            MessageBox(_T(\"An error occured when trying to register the directory monitor. As a result the InfraRecorder explorer tree will not automatically synchronize with Windows Explorer.\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CMainFrame::InitializeExplorerView(unsigned int uiSplitterPos)\r\n{\r\n    m_ExplorerView.Create(m_MainView,rcDefault,\r\n        NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT);\r\n    m_ExplorerView.m_cxySplitBar = 4;\t// Force the splitter size 2, Vista uses a larger size by default.\r\n\r\n    UpdateLayout();\r\n\r\n    m_MainView.SetSplitterPane(SPLIT_PANE_TOP,m_ExplorerView);\r\n    m_ExplorerView.SetSplitterPos(uiSplitterPos);\r\n\r\n    // Create the list view container.\r\n    m_ShellListViewContainer.Create(m_ExplorerView,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT,(unsigned int)0,NULL);\r\n    m_ShellListViewContainer.SetImageList(m_hMiniToolBarImageList);\r\n\r\n    // Add container buttons.\r\n    m_ShellListViewContainer.AddToolBarButton(ID_VIEW_UPLEVEL,0);\r\n    m_ShellListViewContainer.AddToolBarSeparator();\r\n    m_ShellListViewContainer.AddToolBarButton(ID_ADD_SELECTED,1);\r\n    m_ShellListViewContainer.AddToolBarButton(ID_ADD_ALL,2);\r\n    m_ShellListViewContainer.UpdateToolBar();\r\n\r\n    // Create the shell list view.\r\n    m_pShellListView = new CShellListViewCtrl(m_ShellListViewContainer,m_hWnd);\r\n    m_ShellListViewContainer.SetClient(*m_pShellListView);\r\n\r\n    // Create the tree view container.\r\n    m_ShellTreeViewContainer.Create(m_ExplorerView,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT,(unsigned int)0,NULL);\r\n    m_ShellTreeViewContainer.SetHeaderHeight(m_ShellListViewContainer.GetHeaderHeight());\r\n    m_ShellTreeViewContainer.SetLabelText(lngGetString(TITLE_EXPLORERVIEW));\r\n\r\n    // Create the shell tree view.\r\n    m_ShellTreeView.Create(m_ShellTreeViewContainer,rcDefault,NULL, \r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP | \r\n        TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, \r\n        WS_EX_CLIENTEDGE,IDC_SHELLTREEVIEW);\r\n\r\n    m_ShellTreeViewContainer.SetClient(m_ShellTreeView);\r\n\r\n    // Setup the view.\r\n    m_ExplorerView.SetSplitterPane(SPLIT_PANE_LEFT,m_ShellTreeViewContainer);\r\n    m_ExplorerView.SetSplitterPane(SPLIT_PANE_RIGHT,m_ShellListViewContainer);\r\n\r\n    // Initialize the shell tree view.\r\n    InitializeShellTreeView();\r\n}\r\n\r\nvoid CMainFrame::InitializeProjectView(unsigned int uiSplitterPos)\r\n{\r\n    m_ProjectView.Create(m_MainView,rcDefault,\r\n        NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT);\r\n    m_ProjectView.m_cxySplitBar = 4;\t// Force the splitter size 2, Vista uses a larger size by default.\r\n\r\n    UpdateLayout();\r\n\r\n    m_MainView.SetSplitterPane(SPLIT_PANE_BOTTOM,m_ProjectView);\r\n    m_ProjectView.SetSplitterPos(uiSplitterPos);\r\n\r\n    // Create the list view container.\r\n    m_ProjectListViewContainer.Create(m_ProjectView,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT,(unsigned int)0,NULL);\r\n    m_ProjectListViewContainer.SetImageList(m_hMiniToolBarImageList);\r\n\r\n    // Add container buttons.\r\n    m_ProjectListViewContainer.AddToolBarButton(ID_VIEW_UPLEVEL,0);\r\n    m_ProjectListViewContainer.AddToolBarSeparator();\r\n    m_ProjectListViewContainer.AddToolBarButton(ID_EDIT_NEWFOLDER,4);\r\n    m_ProjectListViewContainer.AddToolBarButton(ID_EDIT_RENAME,5);\r\n    m_ProjectListViewContainer.AddToolBarSeparator();\r\n    m_ProjectListViewContainer.AddToolBarButton(ID_EDIT_REMOVE,3);\r\n    m_ProjectListViewContainer.UpdateToolBar();\r\n\r\n    // Create the list view.\r\n    m_ProjectListView.Create(m_ProjectListViewContainer,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP | \r\n        LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS/* | LVS_EDITLABELS*/,\r\n        WS_EX_CLIENTEDGE,IDC_PROJECTLISTVIEW);\r\n    m_ProjectListViewHeader.SubclassWindow(m_ProjectListView.GetHeader());\r\n\r\n    m_ProjectListViewContainer.SetClient(m_ProjectListView);\r\n    m_ProjectListViewContainer.SetCustomDrawHandler(m_ProjectListView,IDC_PROJECTLISTVIEW);\r\n\r\n    // Enable the extended list view styles.\r\n    unsigned long ulLVExStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT;\r\n    /*if (g_GlobalSettings.m_bListGridLines)\r\n        ulLVExStyle |= LVS_EX_GRIDLINES;\r\n    if (g_GlobalSettings.m_bListTrackSel)\r\n        ulLVExStyle |= LVS_EX_TRACKSELECT;*/\r\n\r\n    m_ProjectListView.SetExtendedListViewStyle(ulLVExStyle);\r\n\r\n    // Create the list view menus.\r\n    m_hProjListSelMenu = LoadMenu(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_PROJLISTSELMENU));\r\n    m_hProjListNoSelMenu = LoadMenu(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_PROJLISTNOSELMENU));\r\n    ATLVERIFY(NULL != m_ShellTreeMenu.LoadMenu(IDR_SHELLTREEMENU));\r\n\r\n    // Make the view style check items to radio items.\r\n    CMenuItemInfo mii;\r\n    mii.fMask = MIIM_FTYPE;\r\n    mii.fType = MFT_RADIOCHECK;\r\n\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_LIST,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_DETAILS,FALSE,&mii);\r\n\r\n    // Create the tree view container.\r\n    m_ProjectTreeViewContainer.Create(m_ProjectView,rcDefault,NULL,\r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,WS_EX_CONTROLPARENT,(unsigned int)0,NULL);\r\n    m_ProjectTreeViewContainer.SetHeaderHeight(m_ProjectListViewContainer.GetHeaderHeight());\r\n    m_ProjectTreeViewContainer.SetLabelText(lngGetString(TITLE_PROJECTVIEW));\r\n\r\n    // Create the tree view.\r\n    m_ProjectTreeView.Create(m_ProjectTreeViewContainer,rcDefault,NULL, \r\n        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP | \r\n        TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS, \r\n        WS_EX_CLIENTEDGE,IDC_PROJECTTREEVIEW);\r\n\r\n    m_ProjectTreeViewContainer.SetClient(m_ProjectTreeView);\r\n    m_ProjectTreeViewContainer.SetCustomDrawHandler(m_ProjectTreeView,IDC_PROJECTTREEVIEW);\r\n\r\n    InitializeProjectImageLists();\r\n\r\n    // Setup the view.\r\n    m_ProjectView.SetSplitterPane(SPLIT_PANE_LEFT,m_ProjectTreeViewContainer);\r\n    m_ProjectView.SetSplitterPane(SPLIT_PANE_RIGHT,m_ProjectListViewContainer);\r\n\r\n    // Assign controls.\r\n    g_TreeManager.AssignControls(&m_ProjectTreeView,&m_ProjectListView);\r\n    g_ProjectManager.AssignControls(&m_ProjectView,&m_ProjectListViewContainer,&m_SpaceMeter,&m_ProjectListView,&m_ProjectTreeView);\r\n\r\n    // Prepare the apropriate project type.\r\n    int iDefaultMedia = GetDefaultMedia();\r\n    switch (m_iDefaultProjType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            g_ProjectManager.NewDataProject(iDefaultMedia != -1 ? iDefaultMedia :\r\n                                            SPACEMETER_SIZE_703MB);\r\n\r\n            if (m_bDefaultProjDVDVideo)\r\n                g_ProjectSettings.m_iFileSystem = FILESYSTEM_DVDVIDEO;\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            g_ProjectManager.NewAudioProject(iDefaultMedia != -1 ? iDefaultMedia :\r\n                                             SPACEMETER_SIZE_80MIN);\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            g_ProjectManager.NewMixedProject(iDefaultMedia != -1 ? iDefaultMedia :\r\n                                             SPACEMETER_SIZE_703MB);\r\n            break;\r\n    }\r\n}\r\n\r\nvoid CMainFrame::InitializeProjectImageLists()\r\n{\r\n    // Create the list view image list.\r\n    SHFILEINFO shFileInfo = { 0 };\r\n\r\n    HIMAGELIST hImageListSmall = (HIMAGELIST)::SHGetFileInfo(_T(\"\"),\r\n        0,&shFileInfo,sizeof(shFileInfo),SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);\r\n    m_ProjectListView.SetImageList(hImageListSmall,LVSIL_SMALL);\r\n\r\n    HIMAGELIST hImageListLarge = (HIMAGELIST)::SHGetFileInfo(_T(\"\"),\r\n        0,&shFileInfo,sizeof(shFileInfo),SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_ICON);\r\n    m_ProjectListView.SetImageList(hImageListLarge,LVSIL_NORMAL);\r\n\r\n    // Create the tree image list.\r\n    m_hProjectTreeImageList = ImageList_Create(16,16,ILC_COLOR32,4,5);\r\n    HICON hIcon;\r\n\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(4),IMAGE_ICON,16,16,/*LR_DEFAULTCOLOR*/LR_LOADTRANSPARENT);\r\n    FreeLibrary(hInstance);\r\n\r\n    ImageList_AddIcon(m_hProjectTreeImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_DATAICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hProjectTreeImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_AUDIOICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hProjectTreeImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_MIXEDICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hProjectTreeImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_VIDEOICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hProjectTreeImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    m_ProjectTreeView.SetImageList(m_hProjectTreeImageList,LVSIL_NORMAL);\r\n}\r\n\r\nbool CMainFrame::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a main translation section.\r\n    if (!pLng->EnterSection(_T(\"main\")))\r\n        return false;\r\n\r\n    // Sub menus.\r\n    TCHAR *szStrValue;\r\n\r\n    HMENU hMainMenu = m_CmdBar.GetMenu();\r\n    HMENU hCurMenu;\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_FILE,szStrValue))\t\t\t// File.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,0);\r\n        ::ModifyMenu(hMainMenu,0,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_EDIT,szStrValue))\t\t\t// Edit.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,1);\r\n        ::ModifyMenu(hMainMenu,1,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_ACTIONS,szStrValue))\t\t// Actions.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,2);\r\n        ::ModifyMenu(hMainMenu,2,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_VIEW,szStrValue))\t\t\t// View.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,3);\r\n        ::ModifyMenu(hMainMenu,3,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        hCurMenu = GetSubMenu(m_hProjListNoSelMenu,0);\r\n        HMENU hViewMenu = GetSubMenu(hCurMenu,0);\r\n\r\n        ::ModifyMenu(hCurMenu,0,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hViewMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_OPTIONS,szStrValue))\t\t// Options.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,4);\r\n        ::ModifyMenu(hMainMenu,4,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_MENUROOT_HELP,szStrValue))\t\t\t// Help.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hMainMenu,5);\r\n        ::ModifyMenu(hMainMenu,5,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    m_CmdBar.AttachMenu(hMainMenu);\r\n    HMENU hSubMenu = GetSubMenu(hMainMenu,0);\r\n\r\n    if (pLng->GetValuePtr(ID_FILE_NEWPROJECT,szStrValue))\t\t// File -> New Project.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,0);\r\n        ::ModifyMenu(hSubMenu,0,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    hSubMenu = GetSubMenu(hMainMenu,1);\r\n\r\n    if (pLng->GetValuePtr(ID_EDIT_ADDPROJECT,szStrValue))\t\t// Edit -> Add.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,3);\r\n        ::ModifyMenu(hSubMenu,3,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    hSubMenu = GetSubMenu(hMainMenu,2);\r\n\r\n    if (pLng->GetValuePtr(ID_ACTIONS_BURNCOMPILATION,szStrValue))\t\t// Actions -> Burn Compilation.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,0);\r\n        ::ModifyMenu(hSubMenu,0,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_ACTIONS_COPYDISC,szStrValue))\t\t\t\t// Actions -> Copy Disc.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,2);\r\n        ::ModifyMenu(hSubMenu,2,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_ACTIONS_DISCINFORMATION,szStrValue))\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,MENU_DISCINFO_INDEX);\r\n        ::ModifyMenu(hSubMenu,MENU_DISCINFO_INDEX,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    if (pLng->GetValuePtr(ID_ACTIONS_EJECT,szStrValue))\t\t\t\t\t// Actions -> Eject Disc.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,MENU_EJECTDISC_INDEX);\r\n        ::ModifyMenu(hSubMenu,MENU_EJECTDISC_INDEX,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    hSubMenu = GetSubMenu(hMainMenu,3);\r\n\r\n    if (pLng->GetValuePtr(ID_VIEW_TOOLBARS,szStrValue))\t\t\t\t\t// View -> Toolbars.\r\n    {\r\n        hCurMenu = ::GetSubMenu(hSubMenu,0);\r\n        ::ModifyMenu(hSubMenu,0,MF_POPUP | MF_BYPOSITION | MF_STRING,(UINT_PTR)hCurMenu,szStrValue);\r\n    }\r\n\r\n    // File menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,0);\r\n    if (pLng->GetValuePtr(ID_FILE_OPEN,szStrValue))\r\n    {\r\n        TCHAR szMenuString[64];\r\n        lstrncpy(szMenuString,szStrValue,sizeof(szMenuString) / sizeof(TCHAR) - 8);\r\n        lstrcat(szMenuString,_T(\"\\tCtrl+O\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_FILE_OPEN,MF_BYCOMMAND | MF_STRING,ID_FILE_OPEN,(LPCTSTR)szMenuString);\r\n    }\r\n    if (pLng->GetValuePtr(ID_FILE_SAVE,szStrValue))\r\n    {\r\n        TCHAR szMenuString[64];\r\n        lstrncpy(szMenuString,szStrValue,sizeof(szMenuString) / sizeof(TCHAR) - 8);\r\n        lstrcat(szMenuString,_T(\"\\tCtrl+S\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_FILE_SAVE,MF_BYCOMMAND | MF_STRING,ID_FILE_SAVE,(LPCTSTR)szMenuString);\r\n    }\r\n    if (pLng->GetValuePtr(ID_FILE_SAVE_AS,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_FILE_SAVE_AS,MF_BYCOMMAND | MF_STRING,ID_FILE_SAVE_AS,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_FILE_PROJECTPROPERTIES,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_FILE_PROJECTPROPERTIES,MF_BYCOMMAND | MF_STRING,ID_FILE_PROJECTPROPERTIES,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_APP_EXIT,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_APP_EXIT,MF_BYCOMMAND | MF_STRING,ID_APP_EXIT,(LPCTSTR)szStrValue);\r\n\r\n    // New project menu.\r\n    hCurMenu = GetSubMenu(hCurMenu,0);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_DATACD,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_DATACD,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_DATACD,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_DATACDMS,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_DATACDMS,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_DATACDMS,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_AUDIO,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_AUDIO,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_AUDIO,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_MIXED,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_MIXED,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_MIXED,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_DVDVIDEO,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_DVDVIDEO,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_DVDVIDEO,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_NEWPROJECT_DATADVD,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_NEWPROJECT_DATADVD,MF_BYCOMMAND | MF_STRING,ID_NEWPROJECT_DATADVD,(LPCTSTR)szStrValue);\r\n\r\n    // Edit menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,1);\r\n    if (pLng->GetValuePtr(ID_EDIT_NEWFOLDER,szStrValue))\r\n    {\r\n        ModifyMenu(hCurMenu,ID_EDIT_NEWFOLDER,MF_BYCOMMAND | MF_STRING,ID_EDIT_NEWFOLDER,(LPCTSTR)szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(m_hProjListNoSelMenu,ID_EDIT_NEWFOLDER,MF_BYCOMMAND | MF_STRING,ID_EDIT_NEWFOLDER,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_EDIT_RENAME,szStrValue))\r\n    {\r\n        TCHAR szMenuString[64];\r\n        lstrncpy(szMenuString,szStrValue,sizeof(szMenuString) / sizeof(TCHAR) - 4);\r\n        lstrcat(szMenuString,_T(\"\\tF2\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_EDIT_RENAME,MF_BYCOMMAND | MF_STRING,ID_EDIT_RENAME,(LPCTSTR)szMenuString);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(m_hProjListSelMenu,ID_EDIT_RENAME,MF_BYCOMMAND | MF_STRING,ID_EDIT_RENAME,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_EDIT_REMOVE,szStrValue))\r\n    {\r\n        TCHAR szMenuString[64];\r\n        lstrncpy(szMenuString,szStrValue,sizeof(szMenuString) / sizeof(TCHAR) - 5);\r\n        lstrcat(szMenuString,_T(\"\\tDel\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_EDIT_REMOVE,MF_BYCOMMAND | MF_STRING,ID_EDIT_REMOVE,(LPCTSTR)szMenuString);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(m_hProjListSelMenu,ID_EDIT_REMOVE,MF_BYCOMMAND | MF_STRING,ID_EDIT_REMOVE,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_EDIT_IMPORT,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_EDIT_IMPORT,MF_BYCOMMAND | MF_STRING,ID_EDIT_IMPORT,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_EDIT_SELECTALL,szStrValue))\r\n    {\r\n        TCHAR szMenuString[64];\r\n        lstrncpy(szMenuString,szStrValue,sizeof(szMenuString) / sizeof(TCHAR) - 8);\r\n        lstrcat(szMenuString,_T(\"\\tCtrl+A\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_EDIT_SELECTALL,MF_BYCOMMAND | MF_STRING,ID_EDIT_SELECTALL,(LPCTSTR)szMenuString);\r\n    }\r\n    if (pLng->GetValuePtr(ID_EDIT_INVERTSELECTION,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_EDIT_INVERTSELECTION,MF_BYCOMMAND | MF_STRING,ID_EDIT_INVERTSELECTION,(LPCTSTR)szStrValue);\r\n\r\n    // Add menu.\r\n    hCurMenu = GetSubMenu(hCurMenu,3);\r\n    if (pLng->GetValuePtr(ID_ADD_SELECTED,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ADD_SELECTED,MF_BYCOMMAND | MF_STRING,ID_ADD_SELECTED,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_ADD_ALL,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ADD_ALL,MF_BYCOMMAND | MF_STRING,ID_ADD_ALL,(LPCTSTR)szStrValue);\r\n\r\n    // Actions menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,2);\r\n    if (pLng->GetValuePtr(ID_ACTIONS_BURNIMAGE,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ACTIONS_BURNIMAGE,MF_BYCOMMAND | MF_STRING,ID_ACTIONS_BURNIMAGE,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_ACTIONS_MANAGETRACKS,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ACTIONS_MANAGETRACKS,MF_BYCOMMAND | MF_STRING,ID_ACTIONS_MANAGETRACKS,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_ACTIONS_ERASERE,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ACTIONS_ERASERE,MF_BYCOMMAND | MF_STRING,ID_ACTIONS_ERASERE,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_ACTIONS_FIXATEDISC,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ACTIONS_FIXATEDISC,MF_BYCOMMAND | MF_STRING,ID_ACTIONS_FIXATEDISC,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_ACTIONS_IMPORTSESSION,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_ACTIONS_IMPORTSESSION,MF_BYCOMMAND | MF_STRING,ID_ACTIONS_IMPORTSESSION,(LPCTSTR)szStrValue);\r\n\r\n    // Burn compilation menu.\r\n    hCurMenu = GetSubMenu(hCurMenu,0);\r\n    if (pLng->GetValuePtr(ID_BURNCOMPILATION_DISCIMAGE,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_BURNCOMPILATION_DISCIMAGE,MF_BYCOMMAND | MF_STRING,ID_BURNCOMPILATION_DISCIMAGE,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_BURNCOMPILATION_COMPACTDISC,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_BURNCOMPILATION_COMPACTDISC,MF_BYCOMMAND | MF_STRING,ID_BURNCOMPILATION_COMPACTDISC,(LPCTSTR)szStrValue);\r\n\r\n    // Copy disc menu (same strings as compilation menu).\r\n    hCurMenu = GetSubMenu(GetSubMenu(hMainMenu,2),2);\r\n    if (pLng->GetValuePtr(ID_BURNCOMPILATION_DISCIMAGE,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_COPYDISC_DISCIMAGE,MF_BYCOMMAND | MF_STRING,ID_COPYDISC_DISCIMAGE,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_BURNCOMPILATION_COMPACTDISC,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_COPYDISC_COMPACTDISC,MF_BYCOMMAND | MF_STRING,ID_COPYDISC_COMPACTDISC,(LPCTSTR)szStrValue);\r\n\r\n    // View menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,3);\r\n    if (pLng->GetValuePtr(ID_VIEW_STATUS_BAR,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_VIEW_STATUS_BAR,MF_BYCOMMAND | MF_STRING,ID_VIEW_STATUS_BAR,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_VIEW_PROGRAMLOG,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_VIEW_PROGRAMLOG,MF_BYCOMMAND | MF_STRING,ID_VIEW_PROGRAMLOG,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_VIEW_LARGEICONS,szStrValue))\r\n    {\r\n        ModifyMenu(hCurMenu,ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_STRING,ID_VIEW_LARGEICONS,(LPCTSTR)szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(GetSubMenu(m_hProjListNoSelMenu,0),ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_STRING,ID_VIEW_LARGEICONS,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_VIEW_SMALLICONS,szStrValue))\r\n    {\r\n        ModifyMenu(hCurMenu,ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_STRING,ID_VIEW_SMALLICONS,(LPCTSTR)szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(GetSubMenu(m_hProjListNoSelMenu,0),ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_STRING,ID_VIEW_SMALLICONS,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_VIEW_LIST,szStrValue))\r\n    {\r\n        ModifyMenu(hCurMenu,ID_VIEW_LIST,MF_BYCOMMAND | MF_STRING,ID_VIEW_LIST,(LPCTSTR)szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(GetSubMenu(m_hProjListNoSelMenu,0),ID_VIEW_LIST,MF_BYCOMMAND | MF_STRING,ID_VIEW_LIST,(LPCTSTR)szStrValue);\r\n    }\r\n    if (pLng->GetValuePtr(ID_VIEW_DETAILS,szStrValue))\r\n    {\r\n        ModifyMenu(hCurMenu,ID_VIEW_DETAILS,MF_BYCOMMAND | MF_STRING,ID_VIEW_DETAILS,(LPCTSTR)szStrValue);\r\n\r\n        // Modify the popup menu.\r\n        ModifyMenu(GetSubMenu(m_hProjListNoSelMenu,0),ID_VIEW_DETAILS,MF_BYCOMMAND | MF_STRING,ID_VIEW_DETAILS,(LPCTSTR)szStrValue);\r\n    }\r\n\r\n    // Toolbars menu.\r\n    hCurMenu = GetSubMenu(hCurMenu,0);\r\n    if (pLng->GetValuePtr(ID_VIEW_STANDARDTOOLBAR,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_VIEW_STANDARDTOOLBAR,MF_BYCOMMAND | MF_STRING,ID_VIEW_STANDARDTOOLBAR,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_VIEW_TBCUSTOMIZE,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_VIEW_TBCUSTOMIZE,MF_BYCOMMAND | MF_STRING,ID_VIEW_TBCUSTOMIZE,(LPCTSTR)szStrValue);\r\n\r\n    // Options menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,4);\r\n    if (pLng->GetValuePtr(ID_OPTIONS_CONFIGURATION,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_OPTIONS_CONFIGURATION,MF_BYCOMMAND | MF_STRING,ID_OPTIONS_CONFIGURATION,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_OPTIONS_DEVICES,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_OPTIONS_DEVICES,MF_BYCOMMAND | MF_STRING,ID_OPTIONS_DEVICES,(LPCTSTR)szStrValue);\r\n\r\n    // Help menu.\r\n    hCurMenu = GetSubMenu(hMainMenu,5);\r\n    if (pLng->GetValuePtr(ID_HELP_HELPTOPICS,szStrValue))\r\n        ModifyMenu(hCurMenu,ID_HELP_HELPTOPICS,MF_BYCOMMAND | MF_STRING,ID_HELP_HELPTOPICS,(LPCTSTR)szStrValue);\r\n    if (pLng->GetValuePtr(ID_APP_ABOUT,szStrValue))\r\n    {\r\n        TCHAR szTitle[32];\r\n        ::LoadString(_Module.GetResourceInstance(),IDR_MAINFRAME,szTitle,32);\r\n\r\n        TCHAR szBuffer[64];\r\n        lstrcpy(szBuffer,szStrValue);\r\n        lstrcat(szBuffer,_T(\" \"));\r\n        lstrcat(szBuffer,szTitle);\r\n        lstrcat(szBuffer,_T(\"...\"));\r\n\r\n        ModifyMenu(hCurMenu,ID_APP_ABOUT,MF_BYCOMMAND | MF_STRING,ID_APP_ABOUT,(LPCTSTR)szBuffer);\r\n    }\r\n\r\n    // Project list seleced menu.\r\n    if (pLng->GetValuePtr(ID_POPUPMENU_PROPERTIES,szStrValue))\r\n    {\r\n        ModifyMenu(m_hProjListSelMenu,ID_POPUPMENU_PROPERTIES,MF_BYCOMMAND | MF_STRING,\r\n            ID_POPUPMENU_PROPERTIES,(LPCTSTR)szStrValue);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CMainFrame::FillDriveMenus()\r\n{\r\n    // Update the menu.\r\n    HMENU hActionsMenu = GetSubMenu(m_CmdBar.GetMenu(),MENU_ACTIONS_INDEX);\r\n    HMENU hDiscMenu = GetSubMenu(hActionsMenu,MENU_DISCINFO_INDEX);\r\n    HMENU hEjectMenu = GetSubMenu(hActionsMenu,MENU_EJECTDISC_INDEX);\r\n\r\n    // Remove the old items.\r\n    int iMenuItemCount = GetMenuItemCount(hEjectMenu);\r\n    int iMenuIndex = 0;\r\n    for (int i = iMenuItemCount - 1; i >= 0; i--)\r\n    {\r\n        RemoveMenu(hDiscMenu,i,MF_BYPOSITION);\r\n        RemoveMenu(hEjectMenu,i,MF_BYPOSITION);\r\n    }\r\n\r\n    if (g_DeviceManager.devices().size() > 0)\r\n    {\r\n        std::vector<ckmmc::Device *>::const_iterator it;\r\n        for (it = g_DeviceManager.devices().begin(); it !=\r\n            g_DeviceManager.devices().end(); it++)\r\n        {\r\n            ckmmc::Device *pDevice = *it;\r\n\r\n            ckcore::tstring DeviceName = NDeviceUtil::GetDeviceName(*pDevice);\r\n\r\n            AppendMenu(hDiscMenu,MF_STRING,MENU_DISCINFO_IDBASE + iMenuIndex,DeviceName.c_str());\r\n            AppendMenu(hEjectMenu,MF_STRING,MENU_EJECTDISC_IDBASE + iMenuIndex,DeviceName.c_str());\r\n\r\n            m_DriveMenuDeviceMap[iMenuIndex] = pDevice;\r\n            \r\n            // Increase the menu index counter.\r\n            iMenuIndex++;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        AppendMenu(hDiscMenu,MF_STRING,0,lngGetString(EJECTMENU_NODRIVES));\r\n        AppendMenu(hEjectMenu,MF_STRING,0,lngGetString(EJECTMENU_NODRIVES));\r\n\r\n        CMenuItemInfo mii;\r\n        mii.fMask = MIIM_STATE;\r\n        mii.fState = MFS_GRAYED;\r\n        SetMenuItemInfo(hEjectMenu,0,TRUE,&mii);\r\n    }\r\n}\r\n\r\nvoid CMainFrame::SetTitleFile(const TCHAR *szFullName)\r\n{\r\n    // Update the title.\r\n    TCHAR szTitle[MAX_PATH + 32];\r\n    ::LoadString(_Module.GetResourceInstance(),IDR_MAINFRAME,szTitle,32);\r\n    lstrcat(szTitle,_T(\" - \"));\r\n\r\n    TCHAR szFileName[MAX_PATH];\r\n    lstrcpy(szFileName,szFullName);\r\n    ExtractFileName(szFileName);\r\n\r\n    lstrcat(szTitle,szFileName);\r\n\r\n    SetWindowText(szTitle);\r\n}\r\n\r\nvoid CMainFrame::SetTitleNormal()\r\n{\r\n    // Update the title.\r\n    TCHAR szTitle[32];\r\n    ::LoadString(_Module.GetResourceInstance(),IDR_MAINFRAME,szTitle,32);\r\n\r\n    SetWindowText(szTitle);\r\n}\r\n\r\nbool CMainFrame::SaveProjectAs()\r\n{\r\n    WTL::CFileDialog FileDialog(false,_T(\"irp\"),_T(\"Untitled\"),OFN_EXPLORER | OFN_OVERWRITEPROMPT,\r\n        _T(\"Project Files (*.irp)\\0*.irp\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        lstrcpy(m_szProjectFile,FileDialog.m_szFileName);\r\n\r\n        // Save the project.\r\n        g_ProjectManager.SaveProject(m_szProjectFile);\r\n\r\n        // Update the title.\r\n        SetTitleFile(m_szProjectFile);\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CMainFrame::SaveProjectPrompt\r\n    -----------------------------\r\n    Asks the user to if the project should be saved if it has been modified.\r\n    The function returns false if the operation was aborted, otherwise true.\r\n*/\r\nbool CMainFrame::SaveProjectPrompt()\r\n{\r\n    if (g_ProjectManager.GetModified())\r\n    {\r\n        switch (lngMessageBox(m_hWnd,CONFIRM_SAVEPROJECT,GENERAL_QUESTION,MB_YESNOCANCEL | MB_ICONQUESTION))\r\n        {\r\n            case IDYES:\r\n                if (m_szProjectFile[0] == '\\0')\r\n                    if (!SaveProjectAs())\r\n                        return false;\r\n                else\r\n                {\r\n                    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n                    g_ProjectManager.SaveProject(m_szProjectFile);\r\n                }\r\n                break;\r\n\r\n            case IDCANCEL:\r\n                return false;\r\n        };\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CMainFrame::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Main small image list (menus and small toolbar buttons).\r\n    InitializeMainSmallImageList();\r\n\r\n    // Create command bar window.\r\n    HWND hWndCmdBar = m_CmdBar.Create(m_hWnd,rcDefault,NULL,ATL_SIMPLE_CMDBAR_PANE_STYLE);\r\n    m_CmdBar.AttachMenu(GetMenu());\r\n    m_CmdBar.m_hImageList = m_hMainSmallImageList;\r\n\r\n    // Set the menu items image index.\r\n    m_CmdBar.m_arrCommand.Add(ID_FILE_OPEN);\r\n    m_CmdBar.m_arrCommand.Add(ID_FILE_SAVE);\r\n    m_CmdBar.m_arrCommand.Add(ID_FILE_SAVE_AS);\r\n    m_CmdBar.m_arrCommand.Add(ID_FILE_PROJECTPROPERTIES);\r\n    m_CmdBar.m_arrCommand.Add(ID_APP_EXIT);\r\n    m_CmdBar.m_arrCommand.Add(ID_EDIT_NEWFOLDER);\r\n    m_CmdBar.m_arrCommand.Add(ID_EDIT_RENAME);\r\n    m_CmdBar.m_arrCommand.Add(ID_EDIT_REMOVE);\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_BURNCOMPILATION);\t// Not visible.\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_BURNIMAGE);\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_COPYDISC);\t\t\t// Not visible.\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_MANAGETRACKS);\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_ERASERE);\r\n    m_CmdBar.m_arrCommand.Add(ID_ACTIONS_FIXATEDISC);\r\n    m_CmdBar.m_arrCommand.Add(ID_VIEW_PROGRAMLOG);\r\n    m_CmdBar.m_arrCommand.Add(ID_OPTIONS_CONFIGURATION);\r\n    m_CmdBar.m_arrCommand.Add(ID_OPTIONS_DEVICES);\r\n    m_CmdBar.m_arrCommand.Add(ID_HELP_HELPTOPICS);\r\n    m_CmdBar.m_arrCommand.Add(ID_APP_ABOUT);\r\n\r\n    // Remove old menu.\r\n    SetMenu(NULL);\r\n\r\n    HWND hWndToolBar = CreateToolBarCtrl();\r\n\r\n    CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);\r\n    AddSimpleReBarBandCtrl(m_hWndToolBar,hWndCmdBar,REBAR_MENUBAR_ID,NULL,true,0,FALSE);\r\n    AddSimpleReBarBandCtrl(m_hWndToolBar,hWndToolBar,REBAR_TOOLBAR_ID,NULL,true,0,FALSE);\r\n\r\n    CreateSimpleStatusBar();\r\n\r\n    UIAddToolBar(hWndToolBar);\r\n    UISetCheck(ID_VIEW_STANDARDTOOLBAR,1);\r\n    UISetCheck(ID_VIEW_STATUS_BAR,1);\r\n\r\n    // Register object for message filtering and idle updates.\r\n    CMessageLoop *pLoop = _Module.GetMessageLoop();\r\n    ATLASSERT(pLoop != NULL);\r\n    pLoop->AddMessageFilter(this);\r\n    pLoop->AddIdleHandler(this);\r\n\r\n    // Make the view style check items to radio items.\r\n    CMenuItemInfo mii;\r\n    mii.fMask = MIIM_FTYPE;\r\n    mii.fType = MFT_RADIOCHECK;\r\n\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_LIST,FALSE,&mii);\r\n    SetMenuItemInfo(m_hProjListNoSelMenu,ID_VIEW_DETAILS,FALSE,&mii);\r\n\r\n    // Mini tool bar image list.\r\n    InitializeMiniToolBarImageList();\r\n\r\n    // Initialize views.\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n    int iSplitterPos = (rcClient.right - rcClient.left) / 4;\r\n\r\n    InitializeMainView();\r\n    InitializeExplorerView(iSplitterPos);\r\n\r\n    bool bWelcomePane = false;\r\n\r\n    if (bWelcomePane)\r\n        m_SpaceMeterView.SetSinglePaneMode(SPLIT_PANE_TOP);\r\n    else\r\n        InitializeProjectView(iSplitterPos);\r\n\r\n    // Perform an autorun check.\r\n    //if (g_GlobalSettings.m_bAutoRunCheck)\r\n    //\tAutoRunCheck();\r\n    // WARNING: The auto run check has been experimentally replaced by temporarily\r\n    // disabling the auto run while InfraRecorder is running.\r\n    m_bEnableAutoRun = EnableAutoRun(false);\r\n\r\n    // Fill drive menus.\r\n    FillDriveMenus();\r\n\r\n    // Apply the settings.\r\n    if (!bWelcomePane)\r\n        g_DynamicSettings.Apply();\r\n\r\n    // Show/hide the tool bar and status bar.\r\n    if (!g_DynamicSettings.m_bViewToolBar)\r\n    {\r\n        UISetCheck(ID_VIEW_STANDARDTOOLBAR,0);\r\n        UpdateLayout();\r\n\r\n        ::SendMessage(m_hWndToolBar,RB_SHOWBAND,\r\n            ::SendMessage(m_hWndToolBar,RB_IDTOINDEX,REBAR_TOOLBAR_ID,0),false);\r\n    }\r\n\r\n    if (!g_DynamicSettings.m_bViewStatusBar)\r\n    {\r\n        UISetCheck(ID_VIEW_STATUS_BAR,0);\r\n        UpdateLayout();\r\n\r\n        ::ShowWindow(m_hWndStatusBar,SW_HIDE);\r\n    }\r\n\r\n    // Initialize drag and drop.\r\n    ATLVERIFY(SUCCEEDED(RegisterDragDrop(m_ProjectTreeView,m_ProjectTreeView.m_pDropTarget)));\r\n    ATLVERIFY(SUCCEEDED(RegisterDragDrop(m_ProjectListView,m_ProjectListView.m_pDropTarget)));\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    if (m_szProjectFile[0] != '\\0')\r\n    {\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        if (g_ProjectManager.LoadProject(m_szProjectFile))\r\n        {\r\n            // Update the view.\r\n            g_TreeManager.Refresh();\r\n\r\n            SetTitleFile(m_szProjectFile);\r\n        }\r\n    }\r\n\r\n    // Confirm buffer.\r\n    TCHAR szBuffer[32];\r\n    ::LoadString(_Module.GetResourceInstance(),128,szBuffer,32);\r\n\r\n    size_t iBufferLen = lstrlen(szBuffer);\r\n    for (size_t i = 0; i < iBufferLen; i++)\r\n        szBuffer[i] = szBuffer[i] ^ 0xFF;\r\n\r\n    TCHAR szTarget[] = { 0x49^0xFF,0x6E^0xFF,0x66^0xFF,0x72^0xFF,0x61^0xFF,\r\n                         0x52^0xFF,0x65^0xFF,0x63^0xFF,0x6F^0xFF,0x72^0xFF,\r\n                         0x64^0xFF,0x65^0xFF,0x72^0xFF,'\\0' };\r\n\r\n    if (lstrcmp(szTarget,szBuffer))\r\n    {\r\n        TCHAR szBuffer[] = { 0x59^0xFF,0x6F^0xFF,0x75^0xFF,0x72^0xFF,0x20^0xFF,\r\n            0x76^0xFF,0x65^0xFF,0x72^0xFF,0x73^0xFF,0x69^0xFF,0x6F^0xFF,0x6E^0xFF,\r\n            0x20^0xFF,0x6F^0xFF,0x66^0xFF,0x20^0xFF,0x49^0xFF,0x6E^0xFF,0x66^0xFF,\r\n            0x72^0xFF,0x61^0xFF,0x52^0xFF,0x65^0xFF,0x63^0xFF,0x6F^0xFF,0x72^0xFF,\r\n            0x64^0xFF,0x65^0xFF,0x72^0xFF,0x20^0xFF,0x68^0xFF,0x61^0xFF,0x73^0xFF,\r\n            0x20^0xFF,0x62^0xFF,0x65^0xFF,0x65^0xFF,0x6E^0xFF,0x20^0xFF,0x61^0xFF,\r\n            0x6C^0xFF,0x74^0xFF,0x65^0xFF,0x72^0xFF,0x65^0xFF,0x64^0xFF,0x2C^0xFF,\r\n            0x20^0xFF,0x70^0xFF,0x6C^0xFF,0x65^0xFF,0x61^0xFF,0x73^0xFF,0x65^0xFF,\r\n            0x20^0xFF,0x6D^0xFF,0x61^0xFF,0x6B^0xFF,0x65^0xFF,0x20^0xFF,0x73^0xFF,\r\n            0x75^0xFF,0x72^0xFF,0x65^0xFF,0x20^0xFF,0x74^0xFF,0x68^0xFF,0x61^0xFF,\r\n            0x74^0xFF,0x20^0xFF,0x79^0xFF,0x6F^0xFF,0x75^0xFF,0x20^0xFF,0x68^0xFF,\r\n            0x61^0xFF,0x76^0xFF,0x65^0xFF,0x20^0xFF,0x64^0xFF,0x6F^0xFF,0x77^0xFF,\r\n            0x6E^0xFF,0x6C^0xFF,0x6F^0xFF,0x61^0xFF,0x64^0xFF,0x65^0xFF,0x64^0xFF,\r\n            0x20^0xFF,0x79^0xFF,0x6F^0xFF,0x75^0xFF,0x72^0xFF,0x20^0xFF,0x76^0xFF,\r\n            0x65^0xFF,0x72^0xFF,0x73^0xFF,0x69^0xFF,0x6F^0xFF,0x6E^0xFF,0x20^0xFF,\r\n            0x66^0xFF,0x72^0xFF,0x6F^0xFF,0x6D^0xFF,0x20^0xFF,0x68^0xFF,0x74^0xFF,\r\n            0x74^0xFF,0x70^0xFF,0x3A^0xFF,0x2F^0xFF,0x2F^0xFF,0x69^0xFF,0x6E^0xFF,\r\n            0x66^0xFF,0x72^0xFF,0x61^0xFF,0x72^0xFF,0x65^0xFF,0x63^0xFF,0x6F^0xFF,\r\n            0x72^0xFF,0x64^0xFF,0x65^0xFF,0x72^0xFF,0x2E^0xFF,0x6F^0xFF,0x72^0xFF,\r\n            0x67^0xFF,'\\0' };\r\n\r\n        size_t iBufferLen = lstrlen(szBuffer);\r\n        for (size_t i = 0; i < iBufferLen; i++)\r\n            szBuffer[i] = szBuffer[i] ^ 0xFF;\r\n\r\n        MessageBox(szBuffer,_T(\"\"),MB_OK | MB_ICONWARNING);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nHMENU CMainFrame::GetToolBarsMenu()\r\n{\r\n    // Just divided the different sections up a bit so it's easier to see.\r\n    HMENU hViewMenu = GetSubMenu(m_CmdBar.GetMenu(),MENU_VIEW_INDEX);\r\n    HMENU hToolBarsMenu = GetSubMenu(hViewMenu,MENU_TOOLBARS_INDEX);\r\n\r\n    return hToolBarsMenu;\r\n}\r\n\r\nHIMAGELIST CMainFrame::GetToolBarSmall()\r\n{\r\n    return m_hMainSmallImageList;\r\n}\r\n\r\nHIMAGELIST CMainFrame::GetToolBarLarge()\r\n{\r\n    return m_hMainLargeImageList;\r\n}\r\n\r\nLRESULT CMainFrame::OnDestroy(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // If auto run was enabled before InfraRecorder was started, re-enable it.\r\n    if (m_bEnableAutoRun)\r\n        EnableAutoRun(true);\r\n\r\n    // Uninitialize the shell list view drag and drop.\r\n    ATLVERIFY(SUCCEEDED(RevokeDragDrop(m_ProjectListView)));\r\n    ATLVERIFY(SUCCEEDED(RevokeDragDrop(m_ProjectTreeView)));\r\n\r\n    // Save the configuration.\r\n    g_SettingsManager.Save();\r\n\r\n    // Destroy the m_pShellView object.\r\n    if (m_pShellListView != NULL)\r\n    {\r\n        m_ShellListViewContainer.SetClient(NULL);\r\n        delete m_pShellListView;\r\n    }\r\n\r\n    // Deregister the directory monitor.\r\n    m_DirectoryMonitor.Deregister();\r\n\r\n    // Destroy project tree view image list.\r\n    if (m_hProjectTreeImageList)\r\n        ImageList_Destroy(m_hProjectTreeImageList);\r\n\r\n    // Destroy the project list view menus.\r\n    DestroyMenu(m_hProjListSelMenu);\r\n    DestroyMenu(m_hProjListNoSelMenu);\r\n\r\n    // Destroy the mini tool bar image list.\r\n    if (m_hMiniToolBarImageList)\r\n        ImageList_Destroy(m_hMiniToolBarImageList);\r\n\r\n    // Destroy the main small image list.\r\n    if (m_hMainSmallImageList)\r\n        ImageList_Destroy(m_hMainSmallImageList);\r\n\r\n    // If we don't call PostQuitMessage() ourselves,\r\n    // CFrameWindowImplBase::OnDestroy() will do it for us,\r\n    // but then the application will end with exit code 1,\r\n    // and applications which terminate normally should\r\n    // actually end with exit code 0.\r\n    ATLASSERT(bHandled);  // Should have been set by WTL.\r\n    PostQuitMessage(0);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // FIXME: Add a check to see if the project is empty here. It's no idea to promt\r\n    //        to save if the project is empty.\r\n    if (!SaveProjectPrompt())\r\n    {\r\n        bHandled = true;\r\n        return TRUE;\r\n    }\r\n\r\n    // Remember the current window position and size.\r\n    if (IsWindowVisible() && !IsIconic() && !IsZoomed() && !m_bWelcomePane)\r\n        GetWindowRect(&g_DynamicSettings.m_rcWindow);\r\n\r\n    g_DynamicSettings.m_bWinMaximized = IsZoomed() == TRUE;\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnShellChange(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // This message is send completeley asynchronous. This will case a problem,\r\n    // especially since the Windows Shell seems to send a couple identical messages\r\n    // every time. For example: If the AddFolder routine has begin its execution and\r\n    // it has checked so no other identical items exsists, it can be interupted by\r\n    // a new message. This will cause duplicate folders to be added.\r\n    // This problem is solved by ignoring all shell change notificiation while\r\n    // processing one.\r\n    static bool bLocked = false;\r\n\r\n    if (!bLocked)\r\n        bLocked = true;\r\n    else\r\n        return 0;\r\n\r\n    LPITEMIDLIST *ppidls = reinterpret_cast<LPITEMIDLIST *>(wParam);\r\n    static bool bPhase = true;\r\n\r\n    TCHAR szPath[MAX_PATH];\r\n\r\n    switch (lParam)\r\n    {\r\n        // A directory was created.\r\n        case SHCNE_MKDIR:\r\n            m_PidlHelp.GetPathName(ppidls[0],szPath);\r\n            AddFolder(szPath);\r\n            break;\r\n\r\n        // A folder was renamed.\r\n        case SHCNE_RENAMEFOLDER:\r\n            RenameFolder(ppidls[0],ppidls[1]);\r\n            break;\r\n\r\n        // A folder was removed.\r\n        case SHCNE_RMDIR:\r\n            RemoveFolder(ppidls[0]);\r\n            break;\r\n    }\r\n\r\n    bLocked = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnGetIShellBrowser(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // This is very important, we need to redirect this message to the main frame that can return\r\n    // the correct IShellBrowser object. If we do not answer to this message the CreateViewObject\r\n    // function call will fail on Windows 98 systems for all other directories than the desktop.\r\n    bHandled = TRUE;\r\n    return (LRESULT)m_pShellListView;\r\n}\r\n\r\n\r\nLRESULT CMainFrame::OnContextMenu(UINT uMsg,WPARAM wParam,LPARAM lParam,\r\n                                  BOOL &bHandled)\r\n{\r\n    try\r\n    {\r\n        ATLASSERT(uMsg == WM_CONTEXTMENU);\r\n\r\n        // At this point WM_CONTEXTMENU comes normally from the m_SpaceMeterView window,\r\n        // which I don't really understand.\r\n        //\r\n        // In the case of the shell tree, our implementation of OnSTVRClick()\r\n        // calls this routine directly with the right window handle.\r\n        //\r\n        // If the user calls up the context menu with the keyboard (with Shift+F10\r\n        // or the context-menu key on modern keyboards), we still get the\r\n        // m_SpaceMeterView window handle, so we need handle this case as an exception.\r\n        POINT ptPos;\r\n        ptPos.x = GET_X_LPARAM(lParam);\r\n        ptPos.y = GET_Y_LPARAM(lParam);\r\n        const bool bWasWithKeyboard = (ptPos.x == -1) && (ptPos.y == -1);\r\n\r\n        if (bWasWithKeyboard)\r\n        {\r\n            // I couldn't think of anything better than the focus\r\n            // in order to find out whether the user was on the shell tree.\r\n            if (GetFocus() == m_ShellTreeView.m_hWnd)\r\n            {\r\n                DisplayContextMenuOnShellTree(ptPos,bWasWithKeyboard);\r\n                bHandled = TRUE;\r\n                return 0;\r\n            }\r\n\r\n            // FIXME: I've noticed that the project tree does not respond\r\n            //        to Shift+F10, this would be the place to fix it.\r\n        }\r\n        else\r\n        {\r\n            if (HWND(wParam) == m_ShellTreeView.m_hWnd)\r\n            {\r\n                DisplayContextMenuOnShellTree(ptPos,bWasWithKeyboard);\r\n                bHandled = TRUE;\r\n                return 0;\r\n            }\r\n        }\r\n\r\n        // At this point, we are not handling this WM_CONTEXTMENU message,\r\n        // but somebody else probably will.\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        // After displaying the error message box, this message\r\n        // should probably not be processed any further.\r\n        bHandled = TRUE;\r\n\r\n        ATLVERIFY(IDOK == MessageBox(ckcore::get_except_msg(e).c_str(),\r\n                                     lngGetString(GENERAL_ERROR),\r\n                                     MB_OK | MB_ICONERROR));\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnDeviceChange(UINT uMsg,WPARAM wParam,LPARAM lParam,\r\n                                   BOOL &bHandled)\r\n{\r\n    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;\r\n\r\n    if (wParam == DBT_DEVICEARRIVAL &&\r\n        lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)\r\n    {\r\n        PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;\r\n        if (lpdbv->dbcv_flags & DBTF_MEDIA)\r\n        {\r\n            bHandled = TRUE;\r\n\r\n            // Find which recorder that the media was changed for.\r\n            std::vector<ckmmc::Device *>::const_iterator it;\r\n            for (it = g_DeviceManager.devices().begin(); it !=\r\n                g_DeviceManager.devices().end(); it++)\r\n            {\r\n                ckmmc::Device *pDevice = *it;\r\n\r\n                int iDevLetterNum = toupper(pDevice->address().device_[0]) - 'A';\r\n                bool bDevHadMediaChange = (lpdbv->dbcv_unitmask & (1 << iDevLetterNum)) > 0;\r\n\r\n                // Check if the current device was affected.\r\n                if (pDevice->recorder() && bDevHadMediaChange)\r\n                {\r\n                    CCore2Info Info;\r\n                    CCore2DiscInfo DiscInfo;\r\n\r\n                    // Fetch media information.\r\n                    if (Info.ReadDiscInformation(*pDevice,&DiscInfo) && DiscInfo.m_ucDiscStatus == CCore2DiscInfo::DS_EMTPY)\r\n                    {\r\n                        switch (pDevice->profile())\r\n                        {\r\n                            case ckmmc::Device::ckPROFILE_DVDRAM:\r\n                            case ckmmc::Device::ckPROFILE_DVDPLUSRW:\r\n                            case ckmmc::Device::ckPROFILE_DVDMINUSRW_RESTOV:\r\n                            case ckmmc::Device::ckPROFILE_DVDMINUSRW_SEQ:\r\n                            case ckmmc::Device::ckPROFILE_DVDMINUSR_SEQ:\r\n                            case ckmmc::Device::ckPROFILE_DVDPLUSR:\r\n                                m_SpaceMeter.SetDiscSize(SPACEMETER_SIZE_DVD);\r\n                                m_SpaceMeter.Invalidate();\r\n                                break;\r\n                            case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_SEQ:\r\n                            case ckmmc::Device::ckPROFILE_DVDMINUSR_DL_JUMP:\r\n                            case ckmmc::Device::ckPROFILE_DVDPLUSRW_DL:\r\n                            case ckmmc::Device::ckPROFILE_DVDPLUSR_DL:\r\n                                m_SpaceMeter.SetDiscSize(SPACEMETER_SIZE_DLDVD);\r\n                                m_SpaceMeter.Invalidate();\r\n                                break;\r\n                            /*case ckmmc::Device::ckPROFILE_BDROM:\r\n                            case ckmmc::Device::ckPROFILE_BDR_SRM:\r\n                            case ckmmc::Device::ckPROFILE_BDR_RRM:\r\n                            case ckmmc::Device::ckPROFILE_BDRE:\r\n                            case ckmmc::Device::ckPROFILE_HDDVDROM:\r\n                            case ckmmc::Device::ckPROFILE_HDDVDR:\r\n                            case ckmmc::Device::ckPROFILE_HDDVDRAM:\r\n                                m_SpaceMeter.SetDiscSize();\r\n                                m_SpaceMeter.Invalidate();\r\n                                break;*/\r\n\r\n                            // FIXME: In order to switch to CD size we need to know exactly how much the blank CD can store.\r\n                            /*case ckmmc::Device::ckPROFILE_CDR:\r\n                            case ckmmc::Device::ckPROFILE_CDRW:\r\n                                m_SpaceMeter.SetDiscSize(SPACEMETER_SIZE_703MB);\r\n                                m_SpaceMeter.Invalidate();\r\n                                break;*/\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nvoid CMainFrame::DisplayContextMenuOnShellTree(POINT ptPos,bool bWasWithKeyboard)\r\n{\r\n    const HTREEITEM hSelectedItem = m_ShellTreeView.GetSelectedItem();\r\n\r\n    if (hSelectedItem == NULL)\r\n    {\r\n        // Theoretically possible, but I haven't found yet a 'normal' way to get here.\r\n        ATLASSERT(false);\r\n        return;\r\n    }\r\n\r\n    if (bWasWithKeyboard)\r\n    {\r\n        // It's possible to scroll the item out of view with the mouse,\r\n        // and then call up the context menu with the keyboard.\r\n        m_ShellTreeView.EnsureVisible(hSelectedItem);\r\n\r\n        RECT rcItem;\r\n        if (FALSE == m_ShellTreeView.GetItemRect(hSelectedItem,&rcItem,TRUE))\r\n            throw ckcore::Exception2(_T(\"GetItemRect: \"));\r\n\r\n        // This \"half-way\" calculation emulates more or less what Windows Explorer does,\r\n        // but there is probably a better, \"canonical\" way to calculate this position.\r\n        const int iHalfHeight = (rcItem.bottom - rcItem.top) / 2;\r\n        ptPos.x = rcItem.left + iHalfHeight;\r\n        ptPos.y = rcItem.top  + iHalfHeight;\r\n\r\n        if (FALSE == m_ShellTreeView.ClientToScreen(&ptPos))\r\n        {\r\n            ckcore::throw_from_hresult(GetLastError(),_T(\"ClientToScreen: \"));\r\n        }\r\n    }\r\n\r\n    // We should display here the full shell context menu with CDefFolderMenu_Create2(),\r\n    // but that's rather difficult. Until I've figured out how to do it,\r\n    // we'll have to make do with this tiny pop-up menu.\r\n    if (0 == m_ShellTreeMenu.GetSubMenu(0).TrackPopupMenuEx(0,ptPos.x,ptPos.y,m_hWnd,NULL))\r\n    {\r\n        ckcore::throw_from_hresult(GetLastError(),_T(\"TrackPopupMenuEx: \"));\r\n    }\r\n}\r\n\r\nLRESULT CMainFrame::OnSLVBrowseObject(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    HWND hWnd = (HWND)lParam;\r\n    m_ShellListViewContainer.SetClient(hWnd);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSLVDoneBrowseObject(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    HTREEITEM hSelectedItem = m_ShellTreeView.GetSelectedItem();\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hSelectedItem);\r\n\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    if (pItemInfo->pParentFolder)\r\n    {\r\n        m_PidlHelp.GetDisplayPathName(pItemInfo->pParentFolder,pItemInfo->pidlSelf,szFullName,MAX_PATH - 1);\r\n    }\r\n    else\r\n    {\r\n        IShellFolder *pDesktopFolder;\r\n        if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))\r\n        {\r\n            m_PidlHelp.GetDisplayPathName(pDesktopFolder,pItemInfo->pidlFullyQual,szFullName,MAX_PATH - 1);\r\n        }\r\n    }\r\n\r\n    // Update the current path. (This is not the same as display name.)\r\n    if (pItemInfo->pParentFolder)\r\n    {\r\n        m_PidlHelp.GetPathName(pItemInfo->pParentFolder,pItemInfo->pidlSelf,szFullName,MAX_PATH - 1);\r\n    }\r\n    else\r\n    {\r\n        IShellFolder *pDesktopFolder;\r\n        if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))\r\n        {\r\n            m_PidlHelp.GetPathName(pDesktopFolder,pItemInfo->pidlFullyQual,szFullName,MAX_PATH - 1);\r\n        }\r\n    }\r\n\r\n    // Remember the new path if the user has selected that option.\r\n    if (g_GlobalSettings.m_bRememberShell)\r\n        lstrcpy(g_DynamicSettings.m_szShellDir,szFullName);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nbool CMainFrame::OpenSpecialFolder(int iFolder)\r\n{\r\n    LPITEMIDLIST pidl;\r\n    SHGetSpecialFolderLocation(NULL,iFolder,&pidl);\r\n\r\n    // First the root item (desktop) is expanded.\r\n    HTREEITEM hRootItem = m_ShellTreeView.GetRootItem();\r\n    m_ShellTreeView.Expand(hRootItem);\r\n\r\n    // Then we search desktop item for the special folder.\r\n    HTREEITEM hItem = m_ShellTreeView.GetChildItem(hRootItem);\r\n\r\n    while (hItem)\r\n    {\r\n        CShellTreeItemInfo *pItemInfo = \r\n            (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n\r\n        if (pItemInfo->pParentFolder->CompareIDs(SHCIDS_CANONICALONLY,pItemInfo->pidlSelf,pidl) == 0)\r\n        {\r\n            m_bEnableTreeSelection = false;\r\n                m_ShellTreeView.SelectItem(hItem);\r\n                m_ShellTreeView.Expand(hItem);\r\n            m_bEnableTreeSelection = true;\r\n\r\n            return true;\r\n        }\r\n\r\n        hItem = m_ShellTreeView.GetNextVisibleItem(hItem);\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CMainFrame::OpenFolder(TCHAR *szFullPath,HTREEITEM hFrom,bool bExpandMyComp)\r\n{\r\n    // We need to make sure that the \"My Computer\" item is selected and expaned.\r\n    if (bExpandMyComp)\r\n    {\r\n        if (!OpenSpecialFolder(CSIDL_DRIVES))\r\n            return false;\r\n    }\r\n\r\n    HTREEITEM hItem = m_ShellTreeView.GetChildItem(hFrom);\r\n    CShellTreeItemInfo *pItemInfo = \r\n        (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n\r\n    TCHAR szCurName[MAX_PATH];\r\n\r\n    // It's important that we include the trailing backslash on the current path. Otherwise\r\n    // we might get a false match in the comparison later.\r\n    IncludeTrailingBackslash(szFullPath);\r\n    int iFullLength = lstrlen(szFullPath);\r\n\r\n    m_bEnableTreeSelection = false;\r\n\r\n    while (hItem)\r\n    {\r\n        pItemInfo = NULL;\r\n        pItemInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n\r\n        ATLASSERT(pItemInfo != NULL);\r\n        m_PidlHelp.GetPathName(pItemInfo->pParentFolder,pItemInfo->pidlSelf,szCurName,MAX_PATH - 1);\r\n\r\n        IncludeTrailingBackslash(szCurName);\r\n        int iCurLength = lstrlen(szCurName);\r\n\r\n        if (!_wcsnicmp(szCurName,szFullPath,iCurLength))\r\n        {\r\n            m_ShellTreeView.SelectItem(hItem);\r\n            m_ShellTreeView.Expand(hItem);\r\n\r\n            if (iCurLength == iFullLength)\r\n                break;\r\n        }\r\n\r\n        hItem = m_ShellTreeView.GetNextVisibleItem(hItem);\r\n    }\r\n\r\n    m_bEnableTreeSelection = true;\r\n    return true;\r\n}\r\n\r\n/*\r\n    CMainFrame::AddFolder\r\n    ---------------------\r\n    Add a new folder to the tree. The fullpath should be specified. It returns\r\n    true upon success, false otherwise.\r\n*/\r\nbool CMainFrame::AddFolder(TCHAR *szFullPath)\r\n{\r\n    // Get the full pidl of the new folder.\r\n    LPITEMIDLIST pidl;\r\n    if (!m_PidlHelp.GetPidl(szFullPath,&pidl))\r\n        return false;\r\n\r\n    if (ExtractFilePath(szFullPath))\r\n    {\r\n        // Get the pidl of the parent.\r\n        LPITEMIDLIST pidlParent;\r\n        if (!m_PidlHelp.GetPidl(szFullPath,&pidlParent))\r\n            return false;\r\n\r\n        // Locate the parent in the tree.\r\n        HTREEITEM hParentItem = FindItemFromPath(pidlParent);\r\n        if (!hParentItem)\r\n            return false;\r\n\r\n        // Why does this event get called twice for some newly created folders. If\r\n        // SHCNE_MKDIR was received only once we would not have to test this.\r\n        if (ItemExist(hParentItem,pidl))\r\n            return false;\r\n\r\n        // Check if the file doesn't have any children. If that is the case, we\r\n        // should not add the new items, just update the item count. The item\r\n        // will be added automaticly when expanding the node.\r\n        TVITEMEX tvParentItem;\r\n        tvParentItem.hItem = hParentItem;\r\n        tvParentItem.mask = TVIF_CHILDREN | TVIF_STATE;\r\n        if (m_ShellTreeView.GetItem(&tvParentItem))\r\n        {\r\n            if (tvParentItem.cChildren == 0 || !(tvParentItem.state & TVIS_EXPANDEDONCE))\r\n            {\r\n                tvParentItem.cChildren = 1;\r\n                m_ShellTreeView.SetItem(&tvParentItem);\r\n                return true;\r\n            }\r\n        }\r\n\r\n        // The parent already has children so we need to add the new folder manually.\r\n        CShellTreeItemInfo *pParentInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hParentItem);\r\n\r\n        LPITEMIDLIST parentpidl,childpidl;\r\n        m_PidlHelp.Split(pidl,&parentpidl,&childpidl);\r\n        IShellFolder *pParentFolder;\r\n\r\n        // If the parent has no parent, the desktop should be used as parent.\r\n        if (pParentInfo->pParentFolder == 0)\r\n        {\r\n            if (FAILED(SHGetDesktopFolder(&pParentFolder)))\r\n                return false;\r\n        }\r\n        else if (FAILED(pParentInfo->pParentFolder->BindToObject(pParentInfo->pidlSelf,\r\n                    NULL,IID_IShellFolder,(void **)&pParentFolder)))\r\n        {\r\n            return false;\r\n        }\r\n\r\n        TV_ITEM tvItem = { 0 };\r\n        TV_INSERTSTRUCT tvInsert = { 0 };\r\n        DWORD dwAttribs;\r\n\r\n        CShellTreeItemInfo *pItemInfo = new CShellTreeItemInfo;\r\n        pItemInfo->pidlSelf = childpidl;\r\n        // We can't use ppidls[0], we need to allocate our own one.\r\n        pItemInfo->pidlFullyQual = m_PidlHelp.ConcatenatePidl(parentpidl,childpidl);;\r\n            pParentFolder->AddRef();\r\n        pItemInfo->pParentFolder = pParentFolder;\r\n\r\n        ZeroMemory(&tvItem,sizeof(tvItem));\r\n        tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n        tvItem.pszText = LPSTR_TEXTCALLBACK;\r\n        tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK;\r\n        tvItem.lParam = (LPARAM)pItemInfo;\r\n\r\n        dwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | /*SFGAO_DISPLAYATTRMASK | */SFGAO_CANRENAME;\r\n        pParentFolder->GetAttributesOf(1,(LPCITEMIDLIST *)&childpidl,&dwAttribs);\r\n        \r\n        tvItem.cChildren = (dwAttribs & SFGAO_HASSUBFOLDER);\r\n\r\n        if (dwAttribs & SFGAO_SHARE)\r\n        {\r\n            tvItem.mask |= TVIF_STATE;\r\n            tvItem.stateMask |= TVIS_OVERLAYMASK;\r\n            tvItem.state |= INDEXTOOVERLAYMASK(1);\r\n        }\r\n\r\n        tvInsert.item = tvItem;\r\n        tvInsert.hInsertAfter = TVI_LAST;\r\n        //tvInsert.hInsertAfter = TVI_SORT;\r\n        tvInsert.hParent = hParentItem;\r\n        \r\n        // Insert the tree item.\r\n        m_ShellTreeView.InsertItem(&tvInsert);\r\n\r\n        pParentFolder->Release();\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CMainFrame::RemoveFolder\r\n    -------.----------------\r\n    Removes a node from the tree. The item data is freed. It returns true\r\n    if no errors occured and false otherwise.\r\n*/\r\nbool CMainFrame::RemoveFolder(LPITEMIDLIST pidlFullyQual)\r\n{\r\n    // Locate the item in the tree.\r\n    HTREEITEM hItem = FindItemFromPath(pidlFullyQual);\r\n    if (!hItem)\r\n        return false;\r\n\r\n    if (SUCCEEDED(m_ShellTreeView.DeleteItem(hItem)))\r\n        return true;\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CMainFrame::RenameFolder\r\n    ------------------------\r\n    Renames the tree item and updates the pidl accordingly. It returns true if\r\n    no errors occured and false otherwise.\r\n*/\r\nbool CMainFrame::RenameFolder(LPITEMIDLIST pidlOldFullyQual,LPITEMIDLIST pidlNewFullyQual)\r\n{\r\n    // Locate the item in the tree.\r\n    HTREEITEM hItem = FindItemFromPath(pidlOldFullyQual);\r\n    if (!hItem)\r\n        return false;\r\n\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n    if (!pItemInfo)\r\n        return false;\r\n\r\n    // Extract the full path name from the new pidl.\r\n    TCHAR szFullPath[MAX_PATH];\r\n    m_PidlHelp.GetPathName(pidlNewFullyQual,szFullPath);\r\n\r\n    // Compare the two paths where the new folder and old folder are located.\r\n    // If they differ the folder has been moved, otherwise we can just rename the\r\n    // existing one.\r\n    TCHAR szOldFullPath[MAX_PATH];\r\n    m_PidlHelp.GetPathName(pidlOldFullyQual,szOldFullPath);\r\n\r\n    TCHAR szTemp[MAX_PATH];\r\n    lstrcpy(szTemp,szFullPath);\r\n    \r\n    ExtractFilePath(szOldFullPath);\r\n    ExtractFilePath(szTemp);\r\n\r\n    // If the paths match move the folder.\r\n    if (lstrcmp(szTemp,szOldFullPath))\r\n        return MoveFolder(pidlOldFullyQual,szFullPath);\r\n\r\n    // Generate a new pidl from the path name above. (Why doesn't the first work?)\r\n    LPITEMIDLIST pidlNew;\r\n    if (!m_PidlHelp.GetPidl(szFullPath,&pidlNew))\r\n        return false;\r\n\r\n    // Split the pidl into parent and child parts.\r\n    LPITEMIDLIST pidlParent,pidlChild;\r\n    m_PidlHelp.Split(pidlNew,&pidlParent,&pidlChild);\r\n\r\n    pItemInfo->pidlSelf = pidlChild;\r\n    // We can't use pidlOldFullyQual, we need to allocate our own one.\r\n    pItemInfo->pidlFullyQual = m_PidlHelp.ConcatenatePidl(pidlParent,pidlChild);\r\n\r\n    // Manually update the tree item text.\r\n    SHFILEINFO shFileInfo;\r\n\r\n    if (SHGetFileInfo((LPCTSTR)pItemInfo->pidlFullyQual,0,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_PIDL | SHGFI_DISPLAYNAME))\r\n    {\r\n        m_ShellTreeView.SetItemText(hItem,shFileInfo.szDisplayName);\r\n    }\r\n\r\n    // Sort all children to the active parent (not recursive).\r\n    // Update: I don't want to sort the tree. This will prevent all system folder\r\n    //         to stay at top in the tree.\r\n    //m_ShellTreeView.SortChildren(m_ShellTreeView.GetParentItem(hItem),FALSE);\r\n\r\n    return true;\r\n}\r\n\r\nbool CMainFrame::MoveFolder(LPITEMIDLIST pidlFullyQual,TCHAR *szNewName)\r\n{\r\n    if (RemoveFolder(pidlFullyQual))\r\n        return AddFolder(szNewName);\r\n\r\n    return false;\r\n}\r\n\r\nbool CMainFrame::ItemExist(HTREEITEM hParentItem,LPITEMIDLIST pidl)\r\n{\r\n    HTREEITEM hItem = m_ShellTreeView.GetChildItem(hParentItem);\r\n\r\n    while (hItem)\r\n    {\r\n        CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n        \r\n        if (pItemInfo)\r\n        {\r\n            TCHAR szPath1[MAX_PATH],szPath2[MAX_PATH];\r\n            m_PidlHelp.GetPathName(pidl,szPath1);\r\n            m_PidlHelp.GetPathName(pItemInfo->pidlFullyQual,szPath2);\r\n\r\n            if (!lstrcmp(szPath1,szPath2))\r\n                return true;\r\n        }\r\n\r\n        hItem = m_ShellTreeView.GetNextVisibleItem(hItem);\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nHTREEITEM CMainFrame::FindItemFromPath(LPITEMIDLIST pidl)\r\n{\r\n    HTREEITEM hItem = m_ShellTreeView.GetRootItem();\r\n\r\n    while (hItem)\r\n    {\r\n        CShellTreeItemInfo *pItemInfo = NULL;\r\n        pItemInfo = (CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hItem);\r\n\r\n        TCHAR szPath1[MAX_PATH],szPath2[MAX_PATH];\r\n        m_PidlHelp.GetPathName(pidl,szPath1);\r\n        m_PidlHelp.GetPathName(pItemInfo->pidlFullyQual,szPath2);\r\n\r\n        if (!lstrcmp(szPath1,szPath2))\r\n            return hItem;\r\n\r\n        hItem = m_ShellTreeView.GetNextVisibleItem(hItem);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSLVChangeFolder(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    //const LPCITEMIDLIST pidl = (LPCITEMIDLIST)wParam;\r\n    const TCHAR *szNewPathName = (TCHAR *)lParam;\r\n\r\n    TCHAR szFullPath[MAX_PATH];\r\n    lstrcpy(szFullPath,szNewPathName);\r\n\r\n    // We must expand the current node.\r\n    m_ShellTreeView.Expand(m_ShellTreeView.GetSelectedItem());\r\n\r\n    // Open the path in the tree view, there is no need to expand the My Computer\r\n    // node since the path is relative.\r\n    OpenFolder(szFullPath,m_ShellTreeView.GetSelectedItem(),false);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSLVChangeFolderLink(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    //const LPCITEMIDLIST pidl = (LPCITEMIDLIST)wParam;\r\n    const TCHAR *szNewPathName = (TCHAR *)lParam;\r\n\r\n    TCHAR szFullPath[MAX_PATH];\r\n    lstrcpy(szFullPath,szNewPathName);\r\n\r\n    // Go to the link path, the My Computer node needs to be expanded.\r\n    OpenFolder(szFullPath,m_ShellTreeView.GetSelectedItem(),true);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nbool CMainFrame::EnumTreeObjects(HTREEITEM hParentItem,IShellFolder* pParentFolder,LPITEMIDLIST pidlParent)\r\n{\r\n    IEnumIDList *pEnum;\r\n\r\n    if (SUCCEEDED(pParentFolder->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_INCLUDEHIDDEN,&pEnum)))\r\n    {\r\n        ITEMIDLIST *pidl;\r\n        DWORD dwFetched = 1;\r\n        DWORD dwAttribs;\r\n        TV_ITEM tvItem = {0};\r\n        TV_INSERTSTRUCT tvInsert = {0};\r\n\r\n        while (SUCCEEDED(pEnum->Next(1,&pidl,&dwFetched)) && dwFetched)\r\n        {\r\n            CShellTreeItemInfo *pItemInfo = new CShellTreeItemInfo();\r\n            pItemInfo->pidlSelf = pidl;\r\n            pItemInfo->pidlFullyQual = m_PidlHelp.ConcatenatePidl(pidlParent,pidl);\r\n\r\n            pParentFolder->AddRef();\r\n\r\n            pItemInfo->pParentFolder = pParentFolder;\r\n\r\n            ZeroMemory(&tvItem,sizeof(tvItem));\r\n            tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n            tvItem.pszText = LPSTR_TEXTCALLBACK;\r\n            tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK;\r\n            tvItem.lParam = (LPARAM)pItemInfo;\r\n\r\n            // UPDATE: SFGAO_DISPLAYATTRMASK should never be used according to MSDN documentation.\r\n            /*SHDESCRIPTIONID sdiDesc;\r\n            bool bIsFloppy = false;\r\n            if (SUCCEEDED(SHGetDataFromIDList(pParentFolder,pidl,SHGDFIL_DESCRIPTIONID,&sdiDesc,sizeof(sdiDesc))))\r\n            {\r\n                if (sdiDesc.dwDescriptionId == SHDID_COMPUTER_DRIVE35 || sdiDesc.dwDescriptionId == SHDID_COMPUTER_DRIVE525)\r\n                    bIsFloppy = true;\r\n            }\r\n\r\n            if (bIsFloppy)\r\n            {\r\n                dwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANRENAME;\r\n                pParentFolder->GetAttributesOf(1,(LPCITEMIDLIST *)&pidl,&dwAttribs);\r\n            }\r\n            else\r\n            {\r\n                dwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DISPLAYATTRMASK | SFGAO_CANRENAME;\r\n                pParentFolder->GetAttributesOf(1,(LPCITEMIDLIST *)&pidl,&dwAttribs);\r\n            }*/\r\n\r\n            dwAttribs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANRENAME;\r\n            pParentFolder->GetAttributesOf(1,(LPCITEMIDLIST *)&pidl,&dwAttribs);\r\n\r\n            tvItem.cChildren = (dwAttribs & SFGAO_HASSUBFOLDER);\r\n\r\n            if (dwAttribs & SFGAO_SHARE)\r\n            {\r\n                tvItem.mask |= TVIF_STATE;\r\n                tvItem.stateMask |= TVIS_OVERLAYMASK;\r\n                tvItem.state |= INDEXTOOVERLAYMASK(1);\r\n            }\r\n\r\n            tvInsert.item = tvItem;\r\n            tvInsert.hInsertAfter = TVI_LAST;\r\n            tvInsert.hParent = hParentItem;\r\n\r\n            // Insert the tree item.\r\n            m_ShellTreeView.InsertItem(&tvInsert);\r\n\r\n            dwFetched = 0;\r\n        }\r\n\r\n        pEnum->Release();\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTVDISPINFO lpDispInfo = (LPNMTVDISPINFO)pNMH;\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)lpDispInfo->item.lParam;\r\n    SHFILEINFO shFileInfo;\r\n\r\n    if (lpDispInfo->item.mask & TVIF_TEXT)\r\n    {\r\n        if (SHGetFileInfo((LPCTSTR)pItemInfo->pidlFullyQual,0,&shFileInfo,\r\n            sizeof(shFileInfo),SHGFI_PIDL | SHGFI_DISPLAYNAME))\r\n        {\r\n            lstrcpy(lpDispInfo->item.pszText,shFileInfo.szDisplayName);\r\n        }\r\n    }\r\n      \r\n    if (lpDispInfo->item.mask & TVIF_IMAGE)\r\n    {\r\n        if (SHGetFileInfo((LPCTSTR)pItemInfo->pidlFullyQual,0,&shFileInfo,\r\n            sizeof(shFileInfo),SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_LINKOVERLAY))\r\n        {\r\n            lpDispInfo->item.iImage = shFileInfo.iIcon;\r\n        }\r\n    }\r\n\r\n    if (lpDispInfo->item.mask & TVIF_SELECTEDIMAGE)\r\n    {\r\n        if (SHGetFileInfo((LPCTSTR)pItemInfo->pidlFullyQual,0,&shFileInfo,\r\n            sizeof(shFileInfo),SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON))\r\n        {\r\n            lpDispInfo->item.iSelectedImage = shFileInfo.iIcon;\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVItemExpanding(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTREEVIEW pNMTV = (LPNMTREEVIEW)pNMH;\r\n\r\n    bHandled = false;\r\n\r\n    if (pNMTV->action == TVE_COLLAPSE)\r\n    {\r\n        m_ShellTreeView.Expand(pNMTV->itemNew.hItem,\r\n            TVE_COLLAPSE | TVE_COLLAPSERESET);\r\n    }\r\n    else if (pNMTV->action == TVE_EXPAND)\r\n    {\r\n        HCURSOR hCursor;\r\n        TVITEM tvItem = {0};\r\n        tvItem.mask = TVIF_PARAM;\r\n        tvItem.hItem = pNMTV->itemNew.hItem;\r\n\r\n        if (!m_ShellTreeView.GetItem(&tvItem))\r\n            return 0;\r\n\r\n        CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)tvItem.lParam;\r\n        hCursor = SetCursor(LoadCursor(NULL,IDC_WAIT));\r\n        \r\n        IShellFolder *pParentFolder = NULL;\r\n        if (pItemInfo->pParentFolder == 0)\r\n        {\r\n            if (FAILED(SHGetDesktopFolder(&pParentFolder)))\r\n                return 0;\r\n        }\r\n        else if (FAILED(pItemInfo->pParentFolder->BindToObject(pItemInfo->pidlSelf,\r\n            NULL,IID_IShellFolder,(void **)&pParentFolder)))\r\n        {\r\n            return 0;\r\n        }\r\n    \r\n        m_ShellTreeView.SetRedraw(FALSE);\r\n            EnumTreeObjects(pNMTV->itemNew.hItem,pParentFolder,\r\n                pItemInfo->pidlFullyQual);\r\n        m_ShellTreeView.SetRedraw(TRUE);\r\n\r\n        pParentFolder->Release();\r\n        SetCursor(hCursor);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVDeleteItem(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTREEVIEW pNMTV = (LPNMTREEVIEW)pNMH;\r\n    IMalloc *pMalloc;\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)pNMTV->itemOld.lParam;\r\n\r\n    if (SUCCEEDED(SHGetMalloc(&pMalloc)))\r\n    {\r\n        if (pItemInfo->dwFlags == 0)\r\n        {\r\n            pMalloc->Free(pItemInfo->pidlSelf);\r\n            pMalloc->Release();\r\n\r\n            if (pItemInfo->pParentFolder)\r\n            {\r\n                pItemInfo->pParentFolder->Release();\r\n                pMalloc->Free(pItemInfo->pidlFullyQual);\r\n            }\r\n        }\r\n    }\r\n      \r\n    delete pItemInfo;\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVSelChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    if (!m_bEnableTreeSelection)\r\n        return 0;\r\n\r\n    LPNMTREEVIEW pNMTV = (LPNMTREEVIEW)pNMH;\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)pNMTV->itemNew.lParam;\r\n\r\n    // This check should not be needed. However if some syncronization error between the\r\n    // shell list view and shell tree view occur this pItemInfo might be NULL.\r\n    if (!pItemInfo)\r\n        return 0;\r\n\r\n    if (pItemInfo->dwFlags == 0)\r\n    {\r\n        if (pItemInfo->pParentFolder == 0)\r\n            m_pShellListView->BrowseObject(pItemInfo->pidlSelf,SBSP_SAMEBROWSER | SBSP_ABSOLUTE);\r\n        else\t\t\t\r\n            m_pShellListView->BrowseObject(pItemInfo->pidlFullyQual,SBSP_SAMEBROWSER | SBSP_ABSOLUTE);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    if (!m_bEnableTreeSelection)\r\n        return 0;\r\n\r\n    LPNMTREEVIEW pNMTV = (LPNMTREEVIEW)pNMH;\r\n    CShellTreeItemInfo *pItemInfo = (CShellTreeItemInfo *)pNMTV->itemNew.lParam;\r\n\r\n    // This check should not be needed. However if some syncronization error between the\r\n    // shell list view and shell tree view occur this pItemInfo might be NULL.\r\n    if (!pItemInfo)\r\n        return 0;\r\n\r\n    TCHAR szFileName[MAX_PATH];\r\n    if (pItemInfo->pParentFolder)\r\n    {\r\n        m_PidlHelp.GetPathName(pItemInfo->pParentFolder,pItemInfo->pidlSelf,szFileName,MAX_PATH - 1);\r\n    }\r\n    else\r\n    {\r\n        IShellFolder *pDesktopFolder;\r\n        if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))\r\n        {\r\n            m_PidlHelp.GetPathName(pDesktopFolder,pItemInfo->pidlFullyQual,szFileName,MAX_PATH - 1);\r\n        }\r\n    }\r\n\r\n    // We don't allow dragging special system items with virtual file names that begins with \"::{\".\r\n    if (szFileName[0] == ':')\r\n        return 0;\r\n\r\n    CProjectDropSource *pDropSource = new CProjectDropSource();\r\n    CFilesDataObject *pDataObject = new CFilesDataObject();\r\n\r\n    // Add all file names to the data object.\r\n    pDataObject->AddFile(szFileName);\r\n\r\n    DWORD dwEffect = 0;\r\n    ::DoDragDrop(pDataObject,pDropSource,DROPEFFECT_COPY,&dwEffect);\r\n\r\n    pDropSource->Release();\r\n    pDataObject->Release();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSTVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    try\r\n    {\r\n        // Code inspired by this FAQ question:\r\n        //   Why don't I get a WM_CONTEXTMENU message when I right click in a Tree Control?\r\n        //   http://vcfaq.mvps.org/mfc/6.htm\r\n        ATLASSERT(pNMH->hwndFrom == m_ShellTreeView.m_hWnd);\r\n\r\n        // Whether we succeed or fail, we are the only place to process this notification.\r\n        bHandled = TRUE;\t\r\n\r\n        // Get the mouse cursor position.\r\n        const DWORD dwPos = GetMessagePos();\r\n\r\n        POINT ptPos;\r\n        ptPos.x = GET_X_LPARAM(dwPos);\r\n        ptPos.y = GET_Y_LPARAM(dwPos);\r\n\r\n        // Convert to screen co-ords for hit testing.\r\n        if (FALSE == m_ShellTreeView.ScreenToClient(&ptPos))\r\n        {\r\n            ckcore::throw_from_hresult(GetLastError(),_T(\"ScreenToClient: \"));\r\n        }\r\n\r\n        UINT uHitTestFlags;\r\n        const HTREEITEM hHitItem = m_ShellTreeView.HitTest(ptPos,&uHitTestFlags);\r\n\r\n        // Did the click occur on an item?\r\n        if ((hHitItem != NULL) && (uHitTestFlags & TVHT_ONITEM))\r\n        {\r\n            // Select the item only if we are going to open the pop-up menu\r\n            // for it. This is the same behaviour I've observed with Windows Explorer.\r\n            ATLVERIFY(TRUE == m_ShellTreeView.SelectItem(hHitItem));\r\n\r\n            // Simulate WM_CONTEXTMENU.\r\n            BOOL bOnContextMenuHandled = FALSE;\r\n            OnContextMenu(WM_CONTEXTMENU,WPARAM(pNMH->hwndFrom),dwPos,bOnContextMenuHandled);\r\n            ATLASSERT(bOnContextMenuHandled == TRUE);\r\n        }\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        ATLVERIFY(IDOK == MessageBox(ckcore::get_except_msg(e).c_str(),\r\n                                     lngGetString(GENERAL_ERROR),\r\n                                     MB_OK | MB_ICONERROR));\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTVDISPINFO lpDispInfo = (LPNMTVDISPINFO)pNMH;\r\n    CProjectNode *pNode = (CProjectNode *)lpDispInfo->item.lParam;\r\n\r\n    if (lpDispInfo->item.mask & TVIF_TEXT)\r\n        lstrcpy(lpDispInfo->item.pszText,pNode->pItemData->GetFileName());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVSelChanging(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    // If a mixed-mode project is active we want to prevent the root node from\r\n    // beeing selected.\r\n    if (g_ProjectManager.GetProjectType() == PROJECTTYPE_MIXED)\r\n    {\r\n        LPNMTREEVIEW lpDispInfo = (LPNMTREEVIEW)pNMH;\r\n        CProjectNode *pNode = (CProjectNode *)lpDispInfo->itemNew.lParam;\r\n\r\n        if (pNode == g_TreeManager.GetRootNode())\r\n        {\r\n            bHandled = true;\r\n            return TRUE;\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVSelChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTREEVIEW pNMTV = (LPNMTREEVIEW)pNMH;\r\n\r\n    bool bChangePath = true;\r\n    int iImage,iSelImage;\r\n    iImage = iSelImage = -1;\r\n\r\n    m_ProjectTreeView.GetItemImage(pNMTV->itemNew.hItem,iImage,iSelImage);\r\n\r\n    switch (iImage)\r\n    {\r\n        case PROJECTTREE_IMAGEINDEX_MIXED:\r\n            bChangePath = false;\r\n            break;\r\n\r\n        case PROJECTTREE_IMAGEINDEX_AUDIO:\r\n            g_ProjectManager.AudioSelected();\r\n            break;\r\n\r\n        default:\r\n            g_ProjectManager.DataSelected();\r\n            break;\r\n    };\r\n\r\n    // Select the new path.\r\n    CProjectNode *pNode = (CProjectNode *)pNMTV->itemNew.lParam;\t\r\n\r\n    if (bChangePath)\r\n    {\r\n        TCHAR szNewPath[MAX_PATH];\r\n        lstrcpy(szNewPath,pNode->pItemData->GetFilePath());\r\n        lstrcat(szNewPath,pNode->pItemData->GetFileName());\r\n        lstrcat(szNewPath,_T(\"\\\\\"));\r\n\r\n        g_TreeManager.SelectPath(szNewPath);\r\n    }\r\n\r\n    // Update the project manager.\r\n    g_ProjectManager.TreeSetActionNode(pNode);\r\n\r\n    // Update the menu items if focused.\r\n    if (::GetFocus() == m_ProjectTreeView)\r\n        g_ProjectManager.NotifyTreeSelChanged(pNode);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVBeginLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMTVDISPINFO lpDispInfo = (LPNMTVDISPINFO)pNMH;\r\n    CProjectNode *pNode = (CProjectNode *)lpDispInfo->item.lParam;\r\n\r\n    // We want to prevent the root and virtual audio root node from beeing\r\n    // renamed if we are dealing with a mixed project.\r\n    if (g_ProjectManager.GetProjectType() == PROJECTTYPE_MIXED)\r\n    {\r\n        if (pNode == g_ProjectManager.GetMixAudioRootNode())\r\n        {\r\n            bHandled = true;\r\n            return TRUE;\r\n        }\r\n    }\r\n\r\n    // We can't rename locked items.\r\n    if (pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n    {\r\n        bHandled = true;\r\n        return TRUE;\r\n    }\r\n\r\n    // Disable all accelerators.\r\n    m_bEnableAccel = false;\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVEndLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // Enable the accelerators.\r\n    m_bEnableAccel = true;\r\n\r\n    // Check for an empty name.\r\n    LPNMTVDISPINFO lpDispInfo = (LPNMTVDISPINFO)pNMH;\r\n    if (lpDispInfo->item.pszText == NULL || lpDispInfo->item.pszText[0] == '\\0')\r\n        return TRUE;\r\n\r\n    // Make sure that file name does not contain illegal characters.\r\n    if (FirstDelimiter(lpDispInfo->item.pszText,'\\\\') != -1 ||\r\n        FirstDelimiter(lpDispInfo->item.pszText,'/') != -1)\r\n    {\r\n        return TRUE;\r\n    }\r\n\r\n    CProjectNode *pNode = (CProjectNode *)lpDispInfo->item.lParam;\r\n    if (pNode != g_TreeManager.GetRootNode())\r\n    {\r\n        // Update the file name.\r\n        pNode->pItemData->SetFileName(lpDispInfo->item.pszText);\r\n\r\n        TCHAR szFullName[MAX_PATH];\r\n        lstrcpy(szFullName,pNode->pItemData->GetFilePath());\r\n        lstrcat(szFullName,pNode->pItemData->GetFileName());\r\n        lstrcat(szFullName,_T(\"\\\\\"));\r\n\r\n        g_TreeManager.RebuildPaths(szFullName);\r\n\r\n        m_ProjectListView.ForceRedraw();\r\n\r\n        if (g_ProjectManager.GetProjectType() == PROJECTTYPE_MIXED &&\r\n            pNode == g_ProjectManager.GetMixDataRootNode())\r\n        {\r\n            lstrcpy(g_ProjectSettings.m_szLabel,lpDispInfo->item.pszText);\r\n        }\r\n\r\n        if (pNode == g_TreeManager.GetCurrentNode())\r\n            g_TreeManager.SetCurrentPath(szFullName);\r\n    }\r\n    else\r\n    {\r\n        // Update label.\r\n        if (g_ProjectManager.GetProjectType() == PROJECTTYPE_DATA)\r\n            lstrcpy(g_ProjectSettings.m_szLabel,lpDispInfo->item.pszText);\r\n    }\r\n\r\n    g_ProjectManager.SetModified(true);\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    m_ProjectTreeView.BeginDrag((LPNMTREEVIEW)pNMH);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPTVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    POINT CursorPos,ClientPos;\r\n    GetCursorPos(&CursorPos);\r\n\r\n    ClientPos = CursorPos;\r\n    ::ScreenToClient(pNMH->hwndFrom,&ClientPos);\r\n\r\n    TVHITTESTINFO tvHitTestInfo = { 0 };\r\n    tvHitTestInfo.pt = ClientPos;\r\n    m_ProjectTreeView.HitTest(&tvHitTestInfo);\r\n\r\n    if ((tvHitTestInfo.flags & TVHT_ONITEMLABEL) != 0)\r\n    {\r\n        //m_ProjectTreeView.EditLabel(tvHitTestInfo.hItem);\r\n\r\n        TVITEM tvItem = { 0 };\r\n        tvItem.mask = TVIF_PARAM;\r\n        tvItem.hItem = tvHitTestInfo.hItem;\r\n        if (m_ProjectTreeView.GetItem(&tvItem) != FALSE)\r\n        {\r\n            g_ProjectManager.TreeSetActionNode((CProjectNode *)tvItem.lParam);\r\n            g_ProjectManager.NotifyTreeSelChanged((CProjectNode *)tvItem.lParam);\r\n\r\n            // TrackPopupMenuEx is asynchronous, it may return before the WM_COMMAND\r\n            // message is sent. This walkaround forces the WM_COMMAND message to be\r\n            // processed before this function returns.\r\n            int iID = TrackPopupMenuEx(GetSubMenu(m_hProjListSelMenu,0),TPM_NONOTIFY | TPM_RETURNCMD,CursorPos.x,CursorPos.y,m_hWnd,NULL);\r\n            ::SendMessage(m_hWnd,WM_COMMAND,(WPARAM)iID,NULL);\r\n        }\r\n    }\r\n\r\n    g_ProjectManager.NotifyTreeSelChanged((CProjectNode *)m_ProjectTreeView.GetSelectedItem().GetData());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    NMLVDISPINFO *pDispInfo = (NMLVDISPINFO *)pNMH;\r\n    CItemData *pItemData = (CItemData *)pDispInfo->item.lParam;\r\n\r\n    LVCOLUMN lvColumn = { 0 };\r\n    lvColumn.mask = LVCF_SUBITEM;\r\n    m_ProjectListView.GetColumn(pDispInfo->item.iSubItem,&lvColumn);\r\n\r\n    if (pDispInfo->item.mask & LVIF_IMAGE)\r\n    {\r\n        SHFILEINFO shFileInfo;\r\n\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n        {\r\n            // HACK: Force a folder icon to be used.\r\n            if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n                sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX))\r\n            {\r\n                pDispInfo->item.iImage = shFileInfo.iIcon;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (SHGetFileInfo(pItemData->GetFileName(),FILE_ATTRIBUTE_NORMAL,&shFileInfo,\r\n                sizeof(shFileInfo),\r\n                SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX))\r\n            {\r\n                pDispInfo->item.iImage = shFileInfo.iIcon;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (pDispInfo->item.mask & LVIF_TEXT)\r\n    {\r\n        if (g_ProjectManager.GetViewType() == PROJECTVIEWTYPE_DATA)\r\n        {\r\n            switch (lvColumn.iSubItem)\r\n            {\r\n                case COLUMN_SUBINDEX_NAME:\r\n                    lstrcpy(pDispInfo->item.pszText,pItemData->GetFileName());\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_TYPE:\r\n                    lstrcpy(pDispInfo->item.pszText,pItemData->szFileType);\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_MODIFIED:\r\n                    wsprintf(pDispInfo->item.pszText,_T(\"%04u-%02u-%02u %02u:%02u:%02u\"),\r\n                        (pItemData->usFileDate >> 9) + 1980, (pItemData->usFileDate >> 5) & 0x0F, (pItemData->usFileDate & 0x1F),\r\n                        (pItemData->usFileTime >> 11), (pItemData->usFileTime >> 5) & 0x3F, (pItemData->usFileTime & 0x1F) * 2);\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_SIZE:\r\n                    if (pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n                        pDispInfo->item.pszText[0] = '\\0';\r\n                    else\r\n                        lsprintf(pDispInfo->item.pszText,_T(\"%I64d\"),pItemData->uiSize);\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_PATH:\r\n                    lstrcpy(pDispInfo->item.pszText,pItemData->GetFilePath());\r\n                    break;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            switch (lvColumn.iSubItem)\r\n            {\r\n                case COLUMN_SUBINDEX_TRACK:\r\n                    if ((unsigned int)pDispInfo->item.pszText != 0xFFFFFFFF)\r\n                    lsprintf(pDispInfo->item.pszText,_T(\"%d\"),pDispInfo->item.iItem + 1);\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_TITLE:\r\n                    // If no title is specified the file name is displayed.\r\n                    if (pItemData->GetAudioData()->szTrackTitle[0] == '\\0')\r\n                        lstrcpy(pDispInfo->item.pszText,pItemData->GetFileName());\r\n                    else\r\n                        lstrcpy(pDispInfo->item.pszText,pItemData->GetAudioData()->szTrackTitle);\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_LENGTH:\r\n                    lsprintf(pDispInfo->item.pszText,_T(\"%.2d:%.2d:%.2d\"),\r\n                        (unsigned int)(pItemData->GetAudioData()->uiTrackLength/(1000 * 3600)),\r\n                        (unsigned int)((pItemData->GetAudioData()->uiTrackLength/(1000 * 60)) % 60),\r\n                        (unsigned int)((pItemData->GetAudioData()->uiTrackLength/1000) % 60));\r\n                    break;\r\n\r\n                case COLUMN_SUBINDEX_LOCATION:\r\n                    lstrcpy(pDispInfo->item.pszText,pItemData->szFullPath);\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVBeginLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    NMLVDISPINFO *pDispInfo = (NMLVDISPINFO *)pNMH;\r\n    CItemData *pItemData = (CItemData *)pDispInfo->item.lParam;\r\n\r\n    // We can't rename locked items.\r\n    if (pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n    {\r\n        bHandled = true;\r\n        return TRUE;\r\n    }\r\n\r\n    // Disable all accelerators.\r\n    m_bEnableAccel = false;\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVEndLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // Enable the accelerators.\r\n    m_bEnableAccel = true;\r\n\r\n    // Check for an empty name.\r\n    NMLVDISPINFO *pDispInfo = (NMLVDISPINFO *)pNMH;\r\n    if (pDispInfo->item.pszText == NULL || pDispInfo->item.pszText[0] == '\\0')\r\n        return TRUE;\r\n\r\n    // Make sure that file name does not contain illegal characters.\r\n    if (FirstDelimiter(pDispInfo->item.pszText,'\\\\') != -1 ||\r\n        FirstDelimiter(pDispInfo->item.pszText,'/') != -1)\r\n    {\r\n        return TRUE;\r\n    }\r\n\r\n    // Check for an existing file or folder with the same name.\r\n    if (g_TreeManager.GetChildItem(g_TreeManager.GetCurrentNode(),pDispInfo->item.pszText) != NULL)\r\n    {\r\n        TCHAR szMessage[MAX_PATH];\r\n        lsnprintf_s(szMessage,sizeof(szMessage),lngGetString(ERROR_EXISTINGFILENAME),\r\n            pDispInfo->item.pszText);\r\n        MessageBox(szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return TRUE;\r\n    }\r\n\r\n    // FIXME: A name check should be performed before accepting the name change.\r\n    //        The file name might contain illegal characters.\r\n\r\n    // Update the file name.\r\n    CItemData *pItemData = (CItemData *)pDispInfo->item.lParam;\r\n    pItemData->SetFileName(pDispInfo->item.pszText);\r\n\r\n    // Update the file type (if it's not a folder).\r\n    if (!(pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER))\r\n    {\r\n        SHFILEINFO shFileInfo;\r\n        if (SHGetFileInfo(pItemData->GetFileName(),FILE_ATTRIBUTE_NORMAL,&shFileInfo,\r\n            sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n        {\r\n            lstrcpy(pItemData->szFileType,shFileInfo.szTypeName);\r\n        }\r\n        else\r\n        {\r\n            lstrcpy(pItemData->szFileType,_T(\"\"));\r\n        }\r\n    }\r\n    else\r\n    {\r\n        TCHAR szFullName[MAX_PATH];\r\n        lstrcpy(szFullName,pItemData->GetFilePath());\r\n        lstrcat(szFullName,pItemData->GetFileName());\r\n        lstrcat(szFullName,_T(\"\\\\\"));\r\n\r\n        g_TreeManager.RebuildPaths(szFullName);\r\n    }\r\n\r\n    // Force the tree view to update.\r\n    RECT rcTree;\r\n    m_ProjectTreeView.GetClientRect(&rcTree);\r\n    m_ProjectTreeView.InvalidateRect(&rcTree);\r\n\r\n    g_ProjectManager.SetModified(true);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVDblClk(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    // First we make sure that an item is selected.\r\n    int iSelItem = -1;\r\n    iSelItem = m_ProjectListView.GetNextItem(iSelItem,LVNI_SELECTED);\r\n\r\n    if (iSelItem == -1)\r\n        return 0;\r\n\r\n    CItemData *pItemData = (CItemData *)m_ProjectListView.GetItemData(iSelItem);\r\n\r\n    if (pItemData != NULL)\r\n    {\r\n        // If we double-clicked on a folder we should browse its contents.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n        {\r\n            // Select the folder in the tree view.\r\n            HTREEITEM hTreeItem = m_ProjectTreeView.GetSelectedItem();\r\n            m_ProjectTreeView.Expand(hTreeItem);\r\n\r\n            hTreeItem = m_ProjectTreeView.GetChildItem(hTreeItem);\r\n\r\n            while (hTreeItem)\r\n            {\r\n                CProjectNode *pTreeNode = (CProjectNode *)m_ProjectTreeView.GetItemData(hTreeItem);\r\n                if (pTreeNode)\r\n                {\r\n                    //if (!lstrcmp(pTreeNode->pItemData->GetFileName(),pItemData->GetFileName()))\r\n                    if (pTreeNode->pItemData == pItemData)\r\n                    {\r\n                        m_ProjectTreeView.SelectItem(hTreeItem);\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                hTreeItem = m_ProjectTreeView.GetNextVisibleItem(hTreeItem);\r\n            }\t\t\t\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    POINT CursorPos;\r\n    GetCursorPos(&CursorPos);\r\n\r\n    // Display different popup menus depending on if any item(s) is selected or not.\r\n    if (m_ProjectListView.GetSelectedCount() > 0)\r\n        TrackPopupMenuEx(GetSubMenu(m_hProjListSelMenu,0),0,CursorPos.x,CursorPos.y,m_hWnd,NULL);\r\n    else\r\n        TrackPopupMenuEx(GetSubMenu(m_hProjListNoSelMenu,0),0,CursorPos.x,CursorPos.y,m_hWnd,NULL);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (::GetFocus() == m_ProjectListView)\r\n        g_ProjectManager.NotifyListSelChanged(m_ProjectListView.GetSelectedCount());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVDeleteItem(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    g_ProjectManager.NotifyListSelChanged(0);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    m_ProjectListView.BeginDrag((LPNMLISTVIEW)pNMH);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnPLVColumnClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMLISTVIEW lpNMListView = (LPNMLISTVIEW)pNMH;\r\n\r\n    // The 'Track' column in audio projects should not be sortable. \r\n    if (g_ProjectManager.GetViewType() == PROJECTVIEWTYPE_AUDIO &&\r\n        lpNMListView->iSubItem == 0)\r\n        return 0;\r\n\r\n    m_ProjectListViewHeader.ColumnClick(lpNMListView->iSubItem);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnToolTipGetInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // The string ID is the same as the button ID.\r\n    LPTOOLTIPTEXT pTipText = (LPTOOLTIPTEXT)pNMH;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a hint translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr((unsigned long)pTipText->hdr.idFrom,szStrValue))\r\n            {\r\n                pTipText->lpszText = szStrValue;\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnMenuSelect(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n    {\r\n        bHandled = false;\r\n        return TRUE;\r\n    }\r\n    \r\n    // Make sure that there is a hint translation section.\r\n    if (!g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n    {\r\n        bHandled = false;\r\n        return TRUE;\r\n    }\r\n\r\n    int iIndex = LOWORD(wParam);\r\n    int iFlags = HIWORD(wParam);\r\n\r\n    if (!(iFlags & MF_POPUP))\r\n    {\r\n        TCHAR szTemp[25];\r\n        lsprintf(szTemp,_T(\"%d (%d)\"),iIndex,(int)((iFlags & MF_POPUP) > 0));\r\n\r\n        TCHAR *szStrValue;\r\n        if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(iIndex,szStrValue))\r\n            ::SendMessage(m_hWndStatusBar,SB_SETTEXT,0,(LPARAM)szStrValue);\r\n    }\r\n    else\r\n    {\r\n        ::SendMessage(m_hWndStatusBar,SB_SETTEXT,0,(LPARAM)_T(\"\"));\r\n    }\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectDataCD(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewDataProject(SPACEMETER_SIZE_703MB);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectDataCDMS(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewDataProject(SPACEMETER_SIZE_703MB);\r\n\r\n    g_ProjectSettings.m_iFileSystem = FILESYSTEM_ISO;\r\n    g_ProjectSettings.m_iIsoFormat = 1;\t// Mode 2 (multi-session).\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectDataDVD(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewDataProject(SPACEMETER_SIZE_DVD);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectAudio(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewAudioProject(SPACEMETER_SIZE_80MIN);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectMixed(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewMixedProject(SPACEMETER_SIZE_703MB);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnNewProjectDVDVideo(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    // Disable the welcome screen if active.\r\n    ShowWelcomePane(false);\r\n\r\n    SetTitleNormal();\r\n    m_szProjectFile[0] = '\\0';\r\n\r\n    g_ProjectManager.NewDataProject(SPACEMETER_SIZE_DVD);\r\n\r\n    g_ProjectSettings.m_iFileSystem = FILESYSTEM_DVDVIDEO;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnFileOpen(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (!SaveProjectPrompt())\r\n        return 0;\r\n\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"Project Files (*.irp)\\0*.irp\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        // Disable the welcome screen if active.\r\n        ShowWelcomePane(false);\r\n\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        if (g_ProjectManager.LoadProject(FileDialog.m_szFileName))\r\n        {\r\n            // Update the view.\r\n            g_TreeManager.Refresh();\r\n\r\n            lstrcpy(m_szProjectFile,FileDialog.m_szFileName);\r\n            SetTitleFile(m_szProjectFile);\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnFileSave(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (m_szProjectFile[0] == '\\0')\r\n        SaveProjectAs();\r\n    else\r\n    {\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        g_ProjectManager.SaveProject(m_szProjectFile);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnFileSaveAs(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    SaveProjectAs();\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnShellTreeProperties(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    try\r\n    {\r\n        // Whether we fail or not, this message should not be processed any further.\r\n        bHandled = TRUE;\r\n\r\n        const HTREEITEM hSelectedItem = m_ShellTreeView.GetSelectedItem();\r\n\r\n        if (hSelectedItem == NULL)\r\n        {\r\n            // This command comes from the pop-up menu, which should only\r\n            // come up on a selected item.\r\n            ATLASSERT(false);\r\n            return 0;\r\n        }\r\n\r\n        const CShellTreeItemInfo * const pItemInfo =\r\n            (const CShellTreeItemInfo *)m_ShellTreeView.GetItemData(hSelectedItem);\r\n\r\n        if (pItemInfo == NULL)\r\n        {\r\n            ATLASSERT(false);\r\n            return 0;\r\n        }\r\n\r\n        SHELLEXECUTEINFO Sei;\r\n        ZeroMemory(&Sei,sizeof(Sei));\r\n        Sei.cbSize= sizeof(Sei);\r\n\r\n        // The MSDN documentation states the following:\r\n        //   With multiple monitors, if you specify an HWND\r\n        //   and set the lpVerb member of lpExecInfo to \"Properties\",\r\n        //   any windows created by ShellExecuteEx may not appear\r\n        //   in the correct position. \r\n        // However, no advice is offered on how to fix this problem.\r\n        // I guess we could specify the monitor to open on,\r\n        // but I wouldn't be able to test such code since I only have one monitor.\r\n        Sei.hwnd   = m_hWnd;\r\n        Sei.lpVerb = _T(\"properties\");\r\n\r\n        // Not all shell objects have a \"properties\" verb, for some\r\n        // of them (like the Control Panel) you'll get an error message\r\n        // (even if you set the SEE_MASK_FLAG_NO_UI flag).\r\n        // MSDN article \"Launching Applications\" explains how to look\r\n        // in the Registry in order to determinate what verbs are available.\r\n        // However, I don't think that's worth the effort, because\r\n        // we should be displaying the full shell context menu\r\n        // with CDefFolderMenu_Create2() instead, and all efforts should be\r\n        // channelled to that end.\r\n        Sei.fMask    = SEE_MASK_INVOKEIDLIST;\r\n        Sei.lpIDList = pItemInfo->pidlFullyQual;\r\n\r\n        if (TRUE != ShellExecuteEx(&Sei))\r\n        {\r\n            // ShellExecuteEx seems to display its own Messagebox on error,\r\n            // and apparently we never come here.\r\n            // I tried SEE_MASK_FLAG_NO_UI and it had no effect,\r\n            // and other people have also reported that this flag\r\n            // does not seem to work.\r\n            ckcore::throw_from_hresult(GetLastError(),_T(\"ShellExecuteEx: \"));\r\n        }\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        ATLVERIFY(IDOK == MessageBox(ckcore::get_except_msg(e).c_str(),\r\n                                     lngGetString(GENERAL_ERROR),\r\n                                     MB_OK | MB_ICONERROR));\r\n\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnFileProjectproperties(WORD wNotifyCode,WORD wID,\r\n                                            HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CProjectPropDlg ProjectPropDlg;\r\n    if (ProjectPropDlg.DoModal() == IDOK)\r\n    {\r\n        if (g_ProjectManager.GetViewType() == PROJECTVIEWTYPE_AUDIO)\r\n        {\r\n            // Force the list view to redraw.\r\n            m_ProjectListView.ForceRedraw();\r\n        }\r\n\r\n        // Update the label.\r\n        g_ProjectManager.SetDiscLabel(g_ProjectSettings.m_szLabel);\r\n        g_ProjectManager.SetModified(true);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnFileExit(WORD wNotifyCode,WORD wID,HWND hWndCtl,\r\n                               BOOL &bHandled)\r\n{\r\n    PostMessage(WM_CLOSE);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    CIDA *pData = m_pShellListView->BeginGetItems(wID == ID_ADD_SELECTED);\r\n    if (pData == NULL)\r\n        return 0;\r\n\r\n    // Prepare a project file transaction.\r\n    CProjectManager::CFileTransaction Transaction;\r\n\r\n    TCHAR szFileName[MAX_PATH];\r\n    IShellFolder *pParentFolder = m_pShellListView->GetParentShellFolder();\r\n    for (unsigned int i = 0; i < pData->cidl; i++)\r\n    {\r\n        char *pcData = reinterpret_cast<char *>(pData) + pData->aoffset[1 + i];\r\n        LPCITEMIDLIST pidl = (LPITEMIDLIST)pcData;\r\n\r\n        DWORD dwAttribs = SFGAO_FILESYSTEM;\r\n        if (pParentFolder->GetAttributesOf(1,&pidl,&dwAttribs) == NOERROR)\r\n        {\r\n            // We're not interested in non filesystem objects like the recycle bin and my computer.\r\n            if (dwAttribs & SFGAO_FILESYSTEM)\r\n            {\r\n                m_PidlHelp.GetPathName(pParentFolder,pidl,szFileName,MAX_PATH - 1);\r\n                Transaction.AddFile(szFileName);\r\n            }\r\n        }\r\n    }\r\n\r\n    m_pShellListView->EndGetItems();\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnImport(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"File List (*.txt,*.m3u)\\0*.txt;*.m3u\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        if (!g_ProjectManager.Import(FileDialog.m_szFileName))\r\n            lngMessageBox(m_hWnd,ERROR_PROJECT_IMPORT,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnSelectAll(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Get the focused list view control.\r\n    HWND hWndListView;\r\n    if (::GetFocus() == m_pShellListView->GetListViewHandle())\r\n        hWndListView = m_pShellListView->GetListViewHandle();\r\n    else\r\n        hWndListView = m_ProjectListView;\r\n\r\n    // Select all items in the list view.\r\n    LVITEM lvItem = { 0 };\r\n    lvItem.state = LVIS_SELECTED;\r\n    lvItem.stateMask = LVIS_SELECTED;\r\n\r\n    for (int i = 0; i < (int)::SendMessage(hWndListView,LVM_GETITEMCOUNT,0,0L); i++)\r\n        ::SendMessage(hWndListView,LVM_SETITEMSTATE,i,(LPARAM)&lvItem);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnInvertSel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Get the focused list view control.\r\n    HWND hWndListView;\r\n    if (::GetFocus() == m_pShellListView->GetListViewHandle())\r\n        hWndListView = m_pShellListView->GetListViewHandle();\r\n    else\r\n        hWndListView = m_ProjectListView;\r\n\r\n    // Invert the selection.\r\n    LVITEM lvItem = { 0 };\r\n    lvItem.state = LVIS_SELECTED;\r\n    lvItem.stateMask = LVIS_SELECTED;\r\n\r\n    for (int i = 0; i < (int)::SendMessage(hWndListView,LVM_GETITEMCOUNT,0,0L); i++)\r\n    {\r\n        lvItem.state = ::SendMessage(hWndListView,LVM_GETITEMSTATE,\r\n            i,(LPARAM)LVIS_SELECTED)? 0 : LVIS_SELECTED;\r\n        ::SendMessage(hWndListView,LVM_SETITEMSTATE,i,(LPARAM)&lvItem);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnBurncompilationCompactdisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.BurnCompilation(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnBurncompilationDiscimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Mixed mode projects can only produce disc images of the data section.\r\n    if (g_ProjectManager.GetProjectType() == PROJECTTYPE_MIXED)\r\n    {\r\n        if (lngMessageBox(m_hWnd,CONFIRM_CREATEMIXIMAGE,GENERAL_QUESTION,MB_YESNO | MB_ICONQUESTION) == IDNO)\r\n            return 0;\r\n    }\r\n\r\n    // Check the validity of projects using the DVD-Video file system.\r\n    if (g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO &&\r\n        !g_TreeManager.GetNodeFromPath(_T(\"/VIDEO_TS/VIDEO_TS.IFO\")))\r\n    {\r\n        if (lngMessageBox(m_hWnd,WARNING_BAD_DVDVIDEO,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDNO)\r\n            return 0;\r\n    }\r\n\r\n    // Check that the project is not empty.\r\n    if (g_ProjectManager.IsEmpty())\r\n    {\r\n        if (lngMessageBox(m_hWnd,WARNING_EMPTY_PROJECT,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDNO)\r\n            return 0;\r\n    }\r\n\r\n    g_ActionManager.CreateImage(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsBurnimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.BurnImage(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnCopydiscCompactdisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.CopyDisc(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnCopydiscDiscimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.CopyImage(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsManagetracks(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.ManageTracks(false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsErasere(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.Erase(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsFixatedisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ActionManager.Fixate(m_hWnd,false);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsDiscInfo(UINT uNotifyCode,int nID,CWindow wnd)\r\n{\r\n    // GetVolumeInformation() [see below] can take some time.\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    ckmmc::Device *pDevice = m_DriveMenuDeviceMap[nID - MENU_DISCINFO_IDBASE];\r\n\r\n    TCHAR szDriveLetter[4];\r\n    szDriveLetter[0] = pDevice->address().device_[0];\r\n    szDriveLetter[1] = ':';\r\n    szDriveLetter[2] = '\\\\';\r\n    szDriveLetter[3] = '\\0';\r\n\r\n    TCHAR szTitle[128];\r\n    lstrcpy(szTitle,lngGetString(PROPERTIES_TITLE));\r\n\r\n    // Get disc label.\r\n    TCHAR szDiscLabel[64];\r\n    szDiscLabel[0] = '\\0';\r\n    GetVolumeInformation(szDriveLetter,szDiscLabel,63,NULL,NULL,0,NULL,0);\r\n    \r\n    // Include the drive letter.\r\n    if (szDiscLabel[0] != '\\0')\r\n    {\r\n        lstrcat(szTitle,szDiscLabel);\r\n\r\n        lstrcat(szTitle,_T(\" (X:)\"));\r\n        szTitle[lstrlen(szTitle) - 3] = szDriveLetter[0];\r\n    }\r\n    else\r\n    {\r\n        lstrcat(szTitle,_T(\"X:\"));\r\n        szTitle[lstrlen(szTitle) - 2] = szDriveLetter[0];\r\n    }\r\n\r\n    CDiscDlg DiscDlg(szTitle,szDiscLabel,*pDevice);\r\n    DiscDlg.DoModal();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsImportsession(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_pLogDlg->print_line(_T(\"CMainFrame::OnActionsImportsession\"));\r\n\r\n    // We can only import to projects containing a data track.\r\n    CProjectNode *pDataRootNode = NULL;\r\n    switch (g_ProjectManager.GetProjectType())\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            pDataRootNode = g_TreeManager.GetRootNode();\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            pDataRootNode = g_ProjectManager.GetMixDataRootNode();\r\n            break;\r\n\r\n        //case PROJECTTYPE_AUDIO:\r\n        default:\r\n            return 0;\r\n    }\r\n\r\n    if (g_ProjectSettings.m_iFileSystem != FILESYSTEM_ISO)\r\n    {\r\n        if (lngMessageBox(m_hWnd,WARNING_IMPORTFS,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDYES)\r\n            g_ProjectSettings.m_iFileSystem = FILESYSTEM_ISO;\r\n        else\r\n            return 0;\r\n    }\r\n\r\n    CImportSessionDlg ImportSessionDlg;\r\n    if (ImportSessionDlg.DoModal() == IDOK)\r\n    {\r\n        // Remove any previously imported sessions.\r\n        g_ProjectManager.DeleteImportedItems();\r\n\r\n        // Make sure a valid track was selected.\r\n        if (ImportSessionDlg.m_pSelTrackData == NULL)\r\n        {\r\n            g_pLogDlg->print_line(_T(\"  Error: Invalid track selection in import session dialog.\"));\r\n            return 0;\r\n        }\r\n\r\n        // Import the new session.\r\n        ckmmc::Device *pDevice = ImportSessionDlg.m_pSelDevice;\r\n        ATLASSERT(pDevice != NULL);\r\n        \r\n        CCore2Info Info;\r\n        CCore2TrackInfo TrackInfo;\r\n        if (!Info.ReadTrackInformation(*pDevice,CCore2Info::TIT_TRACK,0xFF,&TrackInfo))\r\n        {\r\n            g_pLogDlg->print_line(_T(\"  Error: Failed to read track information when trying to import session.\"));\r\n            return 0;\r\n        }\r\n\r\n        // Import file tree.\r\n        CCore2InStream InStream(g_pLogDlg,*pDevice,0,\r\n            ImportSessionDlg.m_pSelTrackData->m_ulTrackAddr + ImportSessionDlg.m_pSelTrackData->m_ulTrackLen);\r\n\r\n        ckfilesystem::IsoReader Reader(*g_pLogDlg);\r\n        Reader.read(InStream,ImportSessionDlg.m_pSelTrackData->m_ulTrackAddr);\r\n        //Reader.PrintTree();\r\n\r\n        g_TreeManager.ImportIsoTree(Reader.get_root(),pDataRootNode);\r\n        g_TreeManager.Refresh();\r\n\r\n        // Update the space meter.\r\n        m_SpaceMeter.SetAllocatedSize(ImportSessionDlg.m_uiAllocatedSize);\r\n        \r\n        // Update the (internal) project settings.\r\n        g_ProjectSettings.m_bMultiSession = true;\r\n        g_ProjectSettings.m_uiImportTrackAddr = ImportSessionDlg.m_pSelTrackData->m_ulTrackAddr;\r\n        g_ProjectSettings.m_uiImportTrackLen = ImportSessionDlg.m_pSelTrackData->m_ulTrackLen;\r\n        g_ProjectSettings.m_uiNextWritableAddr = TrackInfo.m_ulNextWritableAddr;\r\n        g_ProjectSettings.m_pDevice = ImportSessionDlg.m_pSelDevice;\r\n        g_ProjectSettings.m_iIsoFormat = 1;\t// Mode 2 (multi-session)\r\n\r\n        g_pLogDlg->print_line(_T(\"  Imported session: %I64d-%I64d, %I64d.\"),\r\n            g_ProjectSettings.m_uiImportTrackAddr,\r\n            g_ProjectSettings.m_uiImportTrackAddr + g_ProjectSettings.m_uiImportTrackLen,\r\n            g_ProjectSettings.m_uiNextWritableAddr);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnActionsEjectDisc(UINT uNotifyCode,int nID,CWindow wnd)\r\n{\r\n    ckmmc::Device *pDevice = m_DriveMenuDeviceMap[nID - MENU_EJECTDISC_IDBASE];\r\n\r\n    if (!g_Core.EjectDisc(*pDevice,false))\r\n        lngMessageBox(HWND_DESKTOP,FAILURE_CDRTOOLS,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnViewToolBar(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_bViewToolBar = !g_DynamicSettings.m_bViewToolBar;\r\n\r\n    ::SendMessage(m_hWndToolBar,RB_SHOWBAND,\r\n        ::SendMessage(m_hWndToolBar,RB_IDTOINDEX,REBAR_TOOLBAR_ID,0),\r\n        g_DynamicSettings.m_bViewToolBar);\r\n\r\n    UISetCheck(ID_VIEW_STANDARDTOOLBAR,g_DynamicSettings.m_bViewToolBar);\r\n    UpdateLayout();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnViewTBCustomize(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_ToolBarManager.Customize();\r\n\r\n    // Update the height of the toolbar band.\r\n    int iBandIndex = (int)::SendMessage(m_hWndToolBar,RB_IDTOINDEX,REBAR_TOOLBAR_ID,0);\r\n    if (iBandIndex != -1)\r\n    {\r\n        REBARBANDINFO rbInfo;\r\n        rbInfo.cbSize = sizeof(REBARBANDINFO);\r\n        rbInfo.fMask = RBBIM_CHILDSIZE;\r\n\r\n        if (::SendMessage(m_hWndToolBar,RB_GETBANDINFO,(WPARAM)iBandIndex,(LPARAM)&rbInfo) != 0)\r\n        {\r\n            RECT rcToolBar;\r\n            m_ToolBar.GetClientRect(&rcToolBar);\r\n            rbInfo.cyMinChild = rcToolBar.bottom - rcToolBar.top;\r\n\r\n            ::SendMessage(m_hWndToolBar,RB_SETBANDINFO,(WPARAM)iBandIndex,(LPARAM)&rbInfo);\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnViewStatusBar(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_DynamicSettings.m_bViewStatusBar = !g_DynamicSettings.m_bViewStatusBar;\r\n    ::ShowWindow(m_hWndStatusBar,g_DynamicSettings.m_bViewStatusBar ? SW_SHOWNOACTIVATE : SW_HIDE);\r\n\r\n    UISetCheck(ID_VIEW_STATUS_BAR,g_DynamicSettings.m_bViewStatusBar);\r\n    UpdateLayout();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnViewProgramlog(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_pLogDlg->Show();\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnUpLevel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Check which up level button that was clicked.\r\n    if (hWndCtl == m_ProjectListViewContainer)\r\n    {\r\n        HTREEITEM hParent = m_ProjectTreeView.GetParentItem(m_ProjectTreeView.GetSelectedItem());\r\n\r\n        if (hParent != NULL)\r\n            m_ProjectTreeView.SelectItem(hParent);\r\n    }\r\n    else if (hWndCtl == m_ShellListViewContainer)\r\n    {\r\n        HTREEITEM hParent = m_ShellTreeView.GetParentItem(m_ShellTreeView.GetSelectedItem());\r\n        \r\n        if (hParent != NULL)\r\n            m_ShellTreeView.SelectItem(hParent);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnOptionsConfiguration(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CConfigDlg ConfigDlg;\r\n    ConfigDlg.DoModal();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnOptionsDevices(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CDevicesDlg DevicesDlg;\r\n    DevicesDlg.DoModal();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnHelpHelptopics(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/infra_recorder/introduction.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnAppAbout(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    g_pAboutWnd->CreateAndShow(m_hWnd);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainFrame::OnShellPaste(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n    if (OpenClipboard())\r\n    {\r\n        if (IsClipboardFormatAvailable(CF_HDROP))\r\n        {\r\n            HDROP hDrop = (HDROP)GetClipboardData(CF_HDROP);\r\n\r\n            if (hDrop != NULL)\r\n            {\r\n                // Prepare a project file transaction.\r\n                CProjectManager::CFileTransaction Transaction;\r\n\r\n                unsigned int uiNumFiles = ::DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n                TCHAR szFullName[MAX_PATH];\r\n                \r\n                for (unsigned int i = 0; i < uiNumFiles; i++)\r\n                {\r\n                    if (DragQueryFile(hDrop,i,szFullName,MAX_PATH - 1))\r\n                        Transaction.AddFile(szFullName);\r\n                }\r\n            }\r\n        }\r\n\r\n        CloseClipboard();\r\n    }\r\n\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/main_frm.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <atlcrack.h>\t// COMMAND_RANGE_HANDLER_EX\r\n#include \"main_view.hh\"\r\n#include \"space_meter.hh\"\r\n#include \"project_tree_view_ctrl.hh\"\r\n#include \"project_list_view_ctrl.hh\"\r\n#include \"custom_container.hh\"\r\n#include \"label_container.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"pidl_helper.hh\"\r\n#include \"shell_list_view_ctrl.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"directory_monitor.hh\"\r\n#include \"custom_header_ctrl.hh\"\r\n#include \"toolbar_manager.hh\"\r\n#include \"custom_toolbar_ctrl.hh\"\r\n#include \"mini_html_ctrl.hh\"\r\n#include \"settings.hh\"\r\n#include \"welcome_pane.hh\"\r\n\r\n// HACK: Enable doublebuffering on XP systems.\r\n#if (_WIN32_WINNT < 0x501)\r\n#define LVS_EX_DOUBLEBUFFER\t\t0x00010000\r\n#endif\r\n\r\n#if (WINVER < 0x0500)\r\n#define MIIM_FTYPE\t\t\t\t0x00000100\r\n#endif\r\n\r\n// Specified the height of the spacemeter.\r\n#define MAINFRAME_SPACEMETER_HEIGHT\t\t\t30\r\n\r\n// Specifies the index of certain menu items.\r\n#define MENU_ACTIONS_INDEX\t\t\t\t\t2\r\n#define MENU_VIEW_INDEX\t\t\t\t\t\t3\r\n#define MENU_DISCINFO_INDEX\t\t\t\t\t8\r\n#define MENU_EJECTDISC_INDEX\t\t\t\t11\r\n#define MENU_TOOLBARS_INDEX\t\t\t\t\t0\r\n\r\n// Specifies which ID the first menu item will have, the second will have + 1 and so on.\r\n#define MENU_DISCINFO_IDBASE\t\t\t\t1000\r\n#define MENU_EJECTDISC_IDBASE\t\t\t\t2000\r\n#define MENU_DRIVEMENU_MAX\t\t\t\t\t128\r\n\r\n#define PROJECTTREE_IMAGEINDEX_FOLDER\t\t0\r\n#define PROJECTTREE_IMAGEINDEX_DATA\t\t\t1\r\n#define PROJECTTREE_IMAGEINDEX_AUDIO\t\t2\r\n#define PROJECTTREE_IMAGEINDEX_MIXED\t\t3\r\n#define PROJECTTREE_IAMGEINDEX_DVDVIDEO\t\t4\r\n\r\n// Tool bar IDs.\r\n#define REBAR_MENUBAR_ID\t\t\t\t\t1\r\n#define REBAR_TOOLBAR_ID\t\t\t\t\t2\r\n\r\n// Data structure of each node in the shell tree.\r\nclass CShellTreeItemInfo\r\n{\r\npublic:\r\n    CShellTreeItemInfo()\r\n    {\r\n        memset(this,0,sizeof(CShellTreeItemInfo));\r\n    }\r\n\r\n    LPITEMIDLIST pidlSelf;\r\n    LPITEMIDLIST pidlFullyQual;\r\n    IShellFolder *pParentFolder;\r\n    DWORD dwFlags;\r\n};\r\n\r\nclass CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,\r\n    public CMessageFilter, public CIdleHandler\r\n{\r\nprivate:\r\n    HIMAGELIST m_hMainSmallImageList;\r\n    HIMAGELIST m_hMainLargeImageList;\r\n    HIMAGELIST m_hMiniToolBarImageList;\r\n    CCommandBarCtrl m_CmdBar;\r\n    CCustomToolBarCtrl m_ToolBar;\r\n    CHorSplitterWindow m_SpaceMeterView;\r\n    CMainView m_MainView;\r\n\r\n    CSplitterWindow m_ExplorerView;\r\n    CSplitterWindow m_ProjectView;\r\n    CSpaceMeter m_SpaceMeter;\r\n    CProjectTreeViewCtrl m_ProjectTreeView;\r\n    CWelcomePane m_WelcomePane;\r\n\r\n    CCustomContainer m_ProjectListViewContainer;\r\n    CLabelContainer m_ProjectTreeViewContainer;\r\n    CCustomContainer m_ShellListViewContainer;\r\n    CLabelContainer m_ShellTreeViewContainer;\r\n    CCustomHeaderCtrl m_ProjectListViewHeader;\r\n\r\n    HIMAGELIST m_hProjectTreeImageList;\r\n\r\n    CDirectoryMonitor m_DirectoryMonitor;\r\n    CShellListViewCtrl *m_pShellListView;\r\n    CTreeViewCtrlEx m_ShellTreeView;\r\n\r\n    // If set to false all accelerators will be disabled.\r\n    bool m_bEnableAccel;\r\n\r\n    // Uses to keep track of the device index (in the device manager) from the\r\n    // drive menus. For some reason it's not possible to retrieve the data member\r\n    // of a menu item when it has been clicked on.\r\n    ckmmc::Device *m_DriveMenuDeviceMap[MENU_DRIVEMENU_MAX];\r\n\r\n    // Is set to true if changing the tree selection is allowed.\r\n    bool m_bEnableTreeSelection;\r\n\r\n    //void AutoRunCheck();\r\n\r\n    bool m_bEnableAutoRun;\r\n    bool EnableAutoRun(bool bEnable);\r\n\r\n    // Set to true if the welcome pane is currently active.\r\n    bool m_bWelcomePane;\r\n\r\n    HWND CreateToolBarCtrl();\r\n\r\n    int GetDefaultMedia();\r\n\r\n    void InitializeMainSmallImageList();\r\n    void InitializeMiniToolBarImageList();\r\n    void InitializeMainView();\r\n    bool InitializeShellTreeView();\r\n    void InitializeExplorerView(unsigned int uiSplitterPos);\r\n    void InitializeProjectView(unsigned int uiSplitterPos);\r\n    void InitializeProjectImageLists();\r\n\r\n    bool Translate();\r\n\r\n    void FillDriveMenus();\r\n\r\n    void SetTitleFile(const TCHAR *szFullName);\r\n    void SetTitleNormal();\r\n\r\n    bool SaveProjectAs();\r\n    bool SaveProjectPrompt();\r\n\r\n    // Shell related.\r\n    bool OpenSpecialFolder(int iFolder);\r\n    bool OpenFolder(TCHAR *szFullPath,HTREEITEM hFrom,bool bExpandMyComp);\r\n    bool EnumTreeObjects(HTREEITEM hParentItem,IShellFolder *pParentFolder,\r\n        LPITEMIDLIST pidlParent);\r\n    bool AddFolder(TCHAR *szFullPath);\r\n    bool RemoveFolder(LPITEMIDLIST pidlFullyQual);\r\n    bool RenameFolder(LPITEMIDLIST pidlOldFullyQual,LPITEMIDLIST pidlNewFullyQual);\r\n    bool MoveFolder(LPITEMIDLIST pidlFullyQual,TCHAR *szNewName);\r\n    bool ItemExist(HTREEITEM hParentItem,LPITEMIDLIST pidl);\r\n    HTREEITEM FindItemFromPath(LPITEMIDLIST pidl);\r\n\r\n    void DisplayContextMenuOnShellTree(POINT ptPos,bool bWasWithKeyboard);\r\n\r\npublic:\r\n    DECLARE_FRAME_WND_CLASS(NULL,IDR_MAINFRAME)\r\n\r\n    CMainFrame();\r\n    ~CMainFrame();\r\n\r\n    // FIXME: This is damn ugly.\r\n    int m_iDefaultProjType;\r\n    int m_iDefaultMedia;\r\n    bool m_bDefaultProjDVDVideo;\r\n    bool m_bDefaultWizard;\r\n\r\n    TCHAR m_szProjectFile[MAX_PATH];\r\n\r\n    // Public controls.\r\n    CProjectListViewCtrl m_ProjectListView;\r\n    HMENU m_hProjListSelMenu;\r\n    HMENU m_hProjListNoSelMenu;\r\n    CMenu m_ShellTreeMenu;\r\n\r\n    // PIDL helper object.\r\n    CPidlHelper m_PidlHelp;\r\n\r\nprivate:\r\n    virtual BOOL PreTranslateMessage(MSG *pMsg)\r\n    {\r\n        if (!m_bEnableAccel)\r\n            return FALSE;\r\n\r\n        if (CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))\r\n            return TRUE;\r\n\r\n        // Let the shell list view control enter keys sent to it.\r\n        /*if (pMsg->hwnd == m_pShellListView->GetListViewHandle() &&\r\n            (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN))\r\n        {\r\n            return FALSE;\r\n        }\r\n\r\n        return IsDialogMessage(pMsg);*/\r\n\r\n        // Let the IsDialogMessage function process tab keys so it can help us\r\n        // tab between controls.\r\n        if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB)\r\n        {\r\n            return IsDialogMessage(pMsg);\r\n        }\r\n\r\n        return FALSE;\r\n    }\r\n\r\n    virtual BOOL OnIdle()\r\n    {\r\n        UIUpdateToolBar();\r\n        return FALSE;\r\n    }\r\n\r\npublic:\r\n    void ShowWelcomePane(bool bShow)\r\n    {\r\n        m_bWelcomePane = bShow;\r\n\r\n        if (bShow)\r\n        {\r\n            m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_TOP,m_WelcomePane);\r\n            m_SpaceMeterView.SetSinglePaneMode(SPLIT_PANE_TOP);\r\n        }\r\n        else\r\n        {\r\n            m_SpaceMeterView.SetSinglePaneMode();\r\n            m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_BOTTOM,m_SpaceMeter);\r\n            m_SpaceMeterView.SetSplitterPane(SPLIT_PANE_TOP,m_MainView);\r\n\r\n            // Setup splitters.\r\n            RECT rcClient;\r\n            ::GetClientRect(m_hWndClient,&rcClient);\r\n\r\n            m_SpaceMeterView.SetSplitterPos(rcClient.bottom - rcClient.top - MAINFRAME_SPACEMETER_HEIGHT);\r\n            m_MainView.SetSplitterPos((rcClient.bottom - rcClient.top - MAINFRAME_SPACEMETER_HEIGHT)/2);\r\n\r\n            int iSplitterPos = (rcClient.right - rcClient.left) / 4;\r\n            m_ExplorerView.SetSplitterPos(iSplitterPos);\r\n            m_ProjectView.SetSplitterPos(iSplitterPos);\r\n\r\n            WINDOWPLACEMENT wp;\r\n            GetWindowPlacement(&wp);\r\n\r\n            if (wp.showCmd != SW_MAXIMIZE)\r\n            {\r\n                // Load the last used window position and size.\r\n                if (g_DynamicSettings.m_rcWindow.left != -1 &&\r\n                    g_DynamicSettings.m_rcWindow.right != -1 &&\r\n                    g_DynamicSettings.m_rcWindow.top != -1 &&\r\n                    g_DynamicSettings.m_rcWindow.bottom != -1)\r\n                {\r\n                    SetWindowPos(HWND_TOP,&g_DynamicSettings.m_rcWindow,0);\r\n                }\r\n                else\r\n                {\r\n                    GetWindowRect(&g_DynamicSettings.m_rcWindow);\r\n\r\n                    g_DynamicSettings.m_rcWindow.right += 300;\r\n                    g_DynamicSettings.m_rcWindow.bottom += 200;\r\n\r\n                    SetWindowPos(HWND_TOP,&g_DynamicSettings.m_rcWindow,0);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    BEGIN_UPDATE_UI_MAP(CMainFrame)\r\n        // Edit menu.\r\n        UPDATE_ELEMENT(ID_EDIT_NEWFOLDER,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_EDIT_RENAME,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_EDIT_REMOVE,UPDUI_MENUPOPUP)\r\n\r\n        // Actions menu.\r\n        UPDATE_ELEMENT(ID_BURNCOMPILATION_DISCIMAGE,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_ACTIONS_IMPORTSESSION,UPDUI_MENUPOPUP)\r\n        \r\n        // View menu.\r\n        UPDATE_ELEMENT(ID_VIEW_STANDARDTOOLBAR,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_VIEW_STATUS_BAR,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_VIEW_LARGEICONS,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_VIEW_SMALLICONS,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_VIEW_LIST,UPDUI_MENUPOPUP)\r\n        UPDATE_ELEMENT(ID_VIEW_DETAILS,UPDUI_MENUPOPUP)\r\n    END_UPDATE_UI_MAP()\r\n\r\nprivate:\r\n#if _ATL_VER <= 0x0300\r\n    BEGIN_MSG_MAP_EX(CMainFrame)\r\n#else\r\n    BEGIN_MSG_MAP(CMainFrame)\r\n#endif\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_DESTROY,OnDestroy)\r\n        MESSAGE_HANDLER(WM_CLOSE,OnClose)\r\n        MESSAGE_HANDLER(WM_SHELLCHANGE,OnShellChange)\r\n        MESSAGE_HANDLER(WM_GETISHELLBROWSER,OnGetIShellBrowser)\r\n        MESSAGE_HANDLER(WM_CONTEXTMENU,OnContextMenu)\r\n        MESSAGE_HANDLER(WM_DEVICECHANGE,OnDeviceChange)\r\n\r\n        // Shell list view.\r\n        MESSAGE_HANDLER(WM_SLVC_BROWSEOBJECT,OnSLVBrowseObject)\r\n        MESSAGE_HANDLER(WM_SLVC_DONEBROWSEOBJECT,OnSLVDoneBrowseObject)\r\n        MESSAGE_HANDLER(WM_SLVC_CHANGEFOLDER,OnSLVChangeFolder)\r\n        MESSAGE_HANDLER(WM_SLVC_CHANGEFOLDERLINK,OnSLVChangeFolderLink)\r\n\r\n        // Shell tree view.\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,TVN_GETDISPINFO,OnSTVGetDispInfo)\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,TVN_ITEMEXPANDING,OnSTVItemExpanding)\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,TVN_DELETEITEM,OnSTVDeleteItem)\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,TVN_SELCHANGED,OnSTVSelChanged)\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,TVN_BEGINDRAG,OnSTVBeginDrag)\r\n        NOTIFY_HANDLER(IDC_SHELLTREEVIEW,NM_RCLICK,OnSTVRClick)\r\n\r\n        // Project tree view.\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_GETDISPINFO,OnPTVGetDispInfo)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_SELCHANGING,OnPTVSelChanging)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_SELCHANGED,OnPTVSelChanged)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_BEGINLABELEDIT,OnPTVBeginLabelEdit)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_ENDLABELEDIT,OnPTVEndLabelEdit)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,TVN_BEGINDRAG,OnPTVBeginDrag)\r\n        NOTIFY_HANDLER(IDC_PROJECTTREEVIEW,NM_RCLICK,OnPTVRClick)\r\n\r\n        // Project list view.\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_GETDISPINFO,OnPLVGetDispInfo)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_BEGINLABELEDIT,OnPLVBeginLabelEdit)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_ENDLABELEDIT,OnPLVEndLabelEdit)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,NM_DBLCLK,OnPLVDblClk)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,NM_RCLICK,OnPLVRClick)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_ITEMCHANGED,OnPLVItemChanged)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_DELETEITEM,OnPLVDeleteItem)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_BEGINDRAG,OnPLVBeginDrag)\r\n        NOTIFY_HANDLER(IDC_PROJECTLISTVIEW,LVN_COLUMNCLICK,OnPLVColumnClick)\r\n\r\n        // Toolbar.\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_BEGINADJUST,g_ToolBarManager.OnToolBarBeginAdjust)\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_INITCUSTOMIZE,g_ToolBarManager.OnToolBarInitCustomize)\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_QUERYINSERT,g_ToolBarManager.OnToolBarQueryInsert)\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_QUERYDELETE,g_ToolBarManager.OnToolBarQueryDelete)\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_GETBUTTONINFO,g_ToolBarManager.OnToolBarGetButtonInfo)\r\n        NOTIFY_HANDLER(ATL_IDW_TOOLBAR,TBN_RESET,g_ToolBarManager.OnToolBarReset)\r\n\r\n        // For translation purposes.\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnToolTipGetInfo)\r\n        MESSAGE_HANDLER(WM_MENUSELECT,OnMenuSelect)\r\n\r\n        // File menu.\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_DATACD,OnNewProjectDataCD)\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_DATACDMS,OnNewProjectDataCDMS)\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_DATADVD,OnNewProjectDataDVD)\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_AUDIO,OnNewProjectAudio)\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_MIXED,OnNewProjectMixed)\r\n        COMMAND_ID_HANDLER(ID_NEWPROJECT_DVDVIDEO,OnNewProjectDVDVideo)\r\n        COMMAND_ID_HANDLER(ID_FILE_OPEN,OnFileOpen)\r\n        COMMAND_ID_HANDLER(ID_FILE_SAVE,OnFileSave)\r\n        COMMAND_ID_HANDLER(ID_FILE_SAVE_AS,OnFileSaveAs)\r\n        COMMAND_ID_HANDLER(ID_FILE_PROJECTPROPERTIES,OnFileProjectproperties)\r\n        COMMAND_ID_HANDLER(ID_APP_EXIT,OnFileExit)\r\n\r\n        // Edit menu.\r\n        COMMAND_ID_HANDLER(ID_EDIT_NEWFOLDER,g_ProjectManager.OnNewFolder)\r\n        COMMAND_ID_HANDLER(ID_EDIT_RENAME,g_ProjectManager.OnRename)\r\n        COMMAND_ID_HANDLER(ID_EDIT_REMOVE,g_ProjectManager.OnRemove)\r\n        COMMAND_ID_HANDLER(ID_ADD_SELECTED,OnAdd)\r\n        COMMAND_ID_HANDLER(ID_ADD_ALL,OnAdd)\r\n        COMMAND_ID_HANDLER(ID_EDIT_IMPORT,OnImport)\r\n        COMMAND_ID_HANDLER(ID_EDIT_SELECTALL,OnSelectAll)\r\n        COMMAND_ID_HANDLER(ID_EDIT_INVERTSELECTION,OnInvertSel)\r\n\r\n        // Actions menu.\r\n        COMMAND_ID_HANDLER(ID_BURNCOMPILATION_COMPACTDISC,OnBurncompilationCompactdisc)\r\n        COMMAND_ID_HANDLER(ID_BURNCOMPILATION_DISCIMAGE,OnBurncompilationDiscimage)\r\n        COMMAND_ID_HANDLER(ID_ACTIONS_BURNIMAGE,OnActionsBurnimage)\r\n        COMMAND_ID_HANDLER(ID_COPYDISC_COMPACTDISC,OnCopydiscCompactdisc)\r\n        COMMAND_ID_HANDLER(ID_COPYDISC_DISCIMAGE,OnCopydiscDiscimage)\r\n        COMMAND_ID_HANDLER(ID_ACTIONS_MANAGETRACKS,OnActionsManagetracks)\r\n        COMMAND_ID_HANDLER(ID_ACTIONS_ERASERE,OnActionsErasere)\r\n        COMMAND_ID_HANDLER(ID_ACTIONS_FIXATEDISC,OnActionsFixatedisc)\r\n        COMMAND_RANGE_HANDLER_EX(MENU_DISCINFO_IDBASE,MENU_DISCINFO_IDBASE + MENU_DRIVEMENU_MAX - 1,OnActionsDiscInfo)\r\n        COMMAND_ID_HANDLER(ID_ACTIONS_IMPORTSESSION,OnActionsImportsession)\r\n        COMMAND_RANGE_HANDLER_EX(MENU_EJECTDISC_IDBASE,MENU_EJECTDISC_IDBASE + MENU_DRIVEMENU_MAX - 1,OnActionsEjectDisc)\r\n\r\n        // View menu.\r\n        COMMAND_ID_HANDLER(ID_VIEW_STANDARDTOOLBAR,OnViewToolBar)\r\n        COMMAND_ID_HANDLER(ID_VIEW_TBCUSTOMIZE,OnViewTBCustomize)\r\n        COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR,OnViewStatusBar)\r\n        COMMAND_ID_HANDLER(ID_VIEW_PROGRAMLOG,OnViewProgramlog)\r\n        COMMAND_ID_HANDLER(ID_VIEW_LARGEICONS,m_ProjectListView.OnViewLargeIcons)\r\n        COMMAND_ID_HANDLER(ID_VIEW_SMALLICONS,m_ProjectListView.OnViewSmallIcons)\r\n        COMMAND_ID_HANDLER(ID_VIEW_LIST,m_ProjectListView.OnViewList)\r\n        COMMAND_ID_HANDLER(ID_VIEW_DETAILS,m_ProjectListView.OnViewDetails)\r\n        COMMAND_ID_HANDLER(ID_VIEW_UPLEVEL,OnUpLevel)\r\n\r\n        // Options menu.\r\n        COMMAND_ID_HANDLER(ID_OPTIONS_CONFIGURATION,OnOptionsConfiguration)\r\n        COMMAND_ID_HANDLER(ID_OPTIONS_DEVICES,OnOptionsDevices)\r\n\r\n        // Help menu.\r\n        COMMAND_ID_HANDLER(ID_HELP_HELPTOPICS,OnHelpHelptopics)\r\n        COMMAND_ID_HANDLER(ID_APP_ABOUT,OnAppAbout)\r\n        \r\n        // Shell tree popup menu.\r\n        COMMAND_ID_HANDLER(ID_POPUPMENU_SHELLTREE_PROPERTIES,OnShellTreeProperties)\r\n\r\n        // Project list popup menu.\r\n        COMMAND_ID_HANDLER(ID_POPUPMENU_PROPERTIES,OnFileProjectproperties)\r\n\r\n        // Custom.\r\n        COMMAND_ID_HANDLER(ID_SHELL_PASTE,OnShellPaste)\r\n\r\n        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)\r\n        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)\r\n    END_MSG_MAP()\r\n\r\n    HMENU GetToolBarsMenu();\r\n    HIMAGELIST GetToolBarSmall();\r\n    HIMAGELIST GetToolBarLarge();\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDestroy(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnShellChange(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnGetIShellBrowser(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnContextMenu(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDeviceChange(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    // Shell list view.\r\n    LRESULT OnSLVBrowseObject(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSLVDoneBrowseObject(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSLVChangeFolder(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSLVChangeFolderLink(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnSTVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnSTVItemExpanding(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnSTVDeleteItem(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnSTVSelChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnSTVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnSTVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    LRESULT OnPTVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVSelChanging(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVSelChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVBeginLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVEndLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPTVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    LRESULT OnPLVGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVBeginLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVEndLabelEdit(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVDblClk(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVRClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVDeleteItem(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVBeginDrag(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnPLVColumnClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    // For translation purposes.\r\n    LRESULT OnToolTipGetInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnMenuSelect(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    // File menu.\r\n    LRESULT OnNewProjectDataCD(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewProjectDataCDMS(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewProjectDataDVD(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewProjectAudio(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewProjectMixed(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnNewProjectDVDVideo(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFileOpen(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFileSave(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFileSaveAs(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnShellTreeProperties(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFileProjectproperties(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnFileExit(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    // Edit menu.\r\n    LRESULT OnAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnImport(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnSelectAll(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnInvertSel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    // Actions menu.\r\n    LRESULT OnBurncompilationCompactdisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBurncompilationDiscimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsBurnimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCopydiscCompactdisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCopydiscDiscimage(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsManagetracks(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsErasere(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsFixatedisc(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsDiscInfo(UINT uNotifyCode,int nID,CWindow wnd);\r\n    LRESULT OnActionsImportsession(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnActionsEjectDisc(UINT uNotifyCode,int nID,CWindow wnd);\r\n    \r\n    // View menu.\r\n    LRESULT OnViewToolBar(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewTBCustomize(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewStatusBar(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnViewProgramlog(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnUpLevel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    // Options menu.\r\n    LRESULT OnOptionsConfiguration(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnOptionsDevices(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    // Help menu.\r\n    LRESULT OnHelpHelptopics(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnAppAbout(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    // Custom.\r\n    LRESULT OnShellPaste(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n\r\nextern CMainFrame *g_pMainFrame;"
  },
  {
    "path": "src/app/dialog/main_view.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"visual_styles.hh\"\r\n#include \"resource.h\"\r\n#include \"main_view.hh\"\r\n\r\nCMainView::CMainView() : m_uiBorderSize(MAINVIEW_THEMEDBORDER_SIZE),\r\n    m_bHintBar(false),m_HintType(HT_INFORMATION),\r\n    m_ButtonState(BS_NORMAL),\r\n    m_hIconImageList(NULL),m_hCloseImageList(NULL)\r\n{\r\n    // Fill the icon image list.\r\n    m_hIconImageList = ImageList_Create(16,16,ILC_COLOR32,0,4);\r\n\r\n    ImageList_AddIcon(m_hIconImageList,LoadIcon(NULL,IDI_INFORMATION));\r\n    ImageList_AddIcon(m_hIconImageList,LoadIcon(NULL,IDI_WARNING));\r\n    ImageList_AddIcon(m_hIconImageList,LoadIcon(NULL,IDI_ERROR));\r\n    ImageList_AddIcon(m_hIconImageList,LoadIcon(NULL,IDI_WINLOGO));\r\n\r\n    // Fill the close image list.\r\n    HBITMAP hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_PANECLOSEBITMAP));\r\n\r\n    m_hCloseImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,4);\r\n    ImageList_AddMasked(m_hCloseImageList,hBitmap,RGB(255,0,255));\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nCMainView::~CMainView()\r\n{\r\n    if (m_hIconImageList != NULL)\r\n        ImageList_Destroy(m_hIconImageList);\r\n\r\n    if (m_hCloseImageList != NULL)\r\n        ImageList_Destroy(m_hCloseImageList);\r\n}\r\n\r\nLRESULT CMainView::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // If the application is themed, we use a different border size.\r\n    if (!g_VisualStyles.IsThemeActive())\r\n        m_uiBorderSize = MAINVIEW_NORMALBORDER_SIZE;\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCCalcSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    RECT *pRect = (RECT *)lParam;\r\n\r\n    // Contract all size of the rectangle except for the bottom. The reason for\r\n    // this is that the space meter and this view is separated by a splitter.\r\n    pRect->left += m_uiBorderSize;\r\n    pRect->right -= m_uiBorderSize;\r\n    pRect->top += m_uiBorderSize;\r\n\r\n    // Let the default window proc adjust the rect further since there might be\r\n    // a scrollbar visible.\r\n    //DefWindowProc(uMsg,wParam,lParam);\r\n\r\n    if (m_bHintBar)\r\n        pRect->top += MAINVIEW_HINTBAR_SIZE;\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    RECT rcClient;\r\n\r\n    // Get the window rect and convert it's origin to 0,0 instead of the top\r\n    // left of the screen.\r\n    GetWindowRect(&rcClient);\r\n\r\n    HDC hDC = GetWindowDC();\r\n\r\n        rcClient.bottom -= rcClient.top;\r\n        rcClient.top = 0;\r\n        rcClient.right -= rcClient.left;\r\n        rcClient.left = 0;\r\n    \r\n        // Since FillRect is used, the center needs to be excluded.\r\n        // Otherwise there will be some flicker and drawing issues.\r\n        ExcludeClipRect(hDC,rcClient.left + m_uiBorderSize,\r\n            rcClient.top + m_uiBorderSize + (m_bHintBar ? MAINVIEW_HINTBAR_SIZE : 0),\r\n            rcClient.right - m_uiBorderSize,\r\n            rcClient.bottom);\r\n        FillRect(hDC,&rcClient,GetSysColorBrush(COLOR_BTNFACE));\r\n\r\n        if (m_bHintBar)\r\n        {\r\n            RECT rcHintBar = rcClient;\r\n            rcHintBar.bottom = rcHintBar.top + MAINVIEW_HINTBAR_SIZE;\r\n\r\n            DrawHintBar(hDC,rcHintBar);\r\n        }\r\n\r\n    ReleaseDC(hDC);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the hint bar is visible.\r\n    if (!m_bHintBar)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcWindow;\r\n    GetWindowRect(&rcWindow);\r\n\r\n    RECT rcHintBar = rcWindow;\r\n    rcHintBar.bottom = rcHintBar.top + MAINVIEW_HINTBAR_SIZE;\r\n\r\n    rcButton.top = rcHintBar.top + MAINVIEW_HINTBAR_SIZE/2 - 8;\r\n    rcButton.right = rcHintBar.right - (MAINVIEW_HINTBAR_SIZE/2 - 8);\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    eButtonState NewState;\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        if (m_ButtonState != BS_DOWN)\r\n            NewState = BS_HOVER;\r\n        else\r\n            NewState = BS_DOWN;\r\n    }\r\n    else\r\n    {\r\n        NewState = BS_NORMAL;\r\n    }\r\n\r\n    if (NewState != m_ButtonState)\r\n    {\r\n        m_ButtonState = NewState;\r\n        InvalidateRect(&rcButton);\r\n\r\n        SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                     SWP_DRAWFRAME);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCMouseDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the hint bar is visible.\r\n    if (!m_bHintBar)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcWindow;\r\n    GetWindowRect(&rcWindow);\r\n\r\n    RECT rcHintBar = rcWindow;\r\n    rcHintBar.bottom = rcHintBar.top + MAINVIEW_HINTBAR_SIZE;\r\n\r\n    rcButton.top = rcHintBar.top + MAINVIEW_HINTBAR_SIZE/2 - 8;\r\n    rcButton.right = rcHintBar.right - (MAINVIEW_HINTBAR_SIZE/2 - 8);\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        m_ButtonState = BS_DOWN;\r\n        InvalidateRect(&rcButton);\r\n\r\n        SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                     SWP_DRAWFRAME);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCMouseUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Only deal with this event if the hint bar is visible.\r\n    if (!m_bHintBar)\r\n        return 0;\r\n\r\n    POINT ptMouse = { GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam) };\r\n\r\n    RECT rcButton,rcWindow;\r\n    GetWindowRect(&rcWindow);\r\n\r\n    RECT rcHintBar = rcWindow;\r\n    rcHintBar.bottom = rcHintBar.top + MAINVIEW_HINTBAR_SIZE;\r\n\r\n    rcButton.top = rcHintBar.top + MAINVIEW_HINTBAR_SIZE/2 - 8;\r\n    rcButton.right = rcHintBar.right - (MAINVIEW_HINTBAR_SIZE/2 - 8);\r\n    rcButton.bottom = rcButton.top + 16;\r\n    rcButton.left = rcButton.right - 16;\r\n\r\n    if (::PtInRect(&rcButton,ptMouse))\r\n    {\r\n        if (m_ButtonState == BS_DOWN)\r\n            HideHintMsg();\r\n\r\n        m_ButtonState = BS_HOVER;\r\n        InvalidateRect(&rcButton);\r\n\r\n        SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                     SWP_DRAWFRAME);\r\n    }\r\n    else\r\n    {\r\n        m_ButtonState = BS_NORMAL;\r\n        InvalidateRect(&rcButton);\r\n\r\n        SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                     SWP_DRAWFRAME);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainView::OnNCHitTest(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    return HTBORDER;\r\n}\r\n\r\nvoid CMainView::DrawHintBar(HDC hDC,RECT &rcHintBar)\r\n{\r\n    // Draw the background.\r\n    FillRect(hDC,&rcHintBar,GetSysColorBrush(COLOR_INFOBK));\r\n\r\n    // Draw background highlight.\r\n    RECT rcHighlight = rcHintBar;\r\n    rcHighlight.bottom = rcHighlight.top + 1;\r\n    FillRect(hDC,&rcHighlight,GetSysColorBrush(COLOR_WINDOW));\r\n\r\n    rcHighlight.bottom = rcHintBar.bottom;\r\n    rcHighlight.right = rcHighlight.left + 1;\r\n    FillRect(hDC,&rcHighlight,GetSysColorBrush(COLOR_WINDOW));\r\n\r\n    // Draw background shadow.\r\n    RECT rcShadow = rcHintBar;\r\n    rcShadow.top = rcShadow.bottom - 1;\r\n    FillRect(hDC,&rcShadow,GetSysColorBrush(COLOR_3DLIGHT));\r\n\r\n    rcShadow.top = rcHintBar.top;\r\n    rcShadow.left = rcShadow.right - 1;\r\n    FillRect(hDC,&rcShadow,GetSysColorBrush(COLOR_3DLIGHT));\r\n\r\n    // Draw icon.\r\n    ImageList_Draw(m_hIconImageList,static_cast<int>(m_HintType),hDC,\r\n                   MAINVIEW_HINTBAR_SIZE/2 - 8,\r\n                   MAINVIEW_HINTBAR_SIZE/2 - 8,ILD_TRANSPARENT);\r\n\r\n    // Draw the close button.\r\n    ImageList_Draw(m_hCloseImageList,static_cast<int>(m_ButtonState),hDC,\r\n            rcHintBar.right - MAINVIEW_HINTBAR_SIZE/2 - 8,\r\n            MAINVIEW_HINTBAR_SIZE/2 - 8,ILD_TRANSPARENT);\r\n\r\n    // Draw text.\r\n    RECT rcText;\r\n    rcText.left = rcHintBar.left + 16 + (MAINVIEW_HINTBAR_SIZE/2 - 8) * 2;\r\n    rcText.right = rcHintBar.right;\r\n    rcText.top = rcHintBar.top;\r\n    rcText.bottom = rcHintBar.bottom;\r\n\r\n    SetBkColor(hDC,GetSysColor(COLOR_INFOBK));\r\n    SetTextColor(hDC,GetSysColor(COLOR_INFOTEXT));\r\n\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,AtlGetDefaultGuiFont());\r\n\r\n    DrawText(hDC,m_HintMsg.c_str(),static_cast<int>(m_HintMsg.size()),&rcText,\r\n             DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER);\r\n\r\n    if (hOldFont != NULL)\r\n        SelectObject(hDC,hOldFont);\r\n}\r\n\r\nvoid CMainView::ShowHintMsg(eHintType HintType,const TCHAR *szHintMsg)\r\n{\r\n    m_bHintBar = true;\r\n\r\n    m_HintType = HintType;\r\n    m_HintMsg = szHintMsg;\r\n\r\n    m_ButtonState = BS_NORMAL;\r\n\r\n    SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                 SWP_FRAMECHANGED);\r\n\r\n    PlaySound(_T(\"SystemNotification\"),0,SND_ASYNC | SND_ALIAS | SND_NOWAIT);\r\n}\r\n\r\nvoid CMainView::HideHintMsg()\r\n{\r\n    m_bHintBar = false;\r\n\r\n    SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE |\r\n                 SWP_FRAMECHANGED);\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/main_view.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/types.hh>\r\n\r\n#define MAINVIEW_NORMALBORDER_SIZE\t\t\t\t2\r\n#define MAINVIEW_THEMEDBORDER_SIZE\t\t\t\t4\r\n#define MAINVIEW_HINTBAR_SIZE\t\t\t\t\t28\r\n\r\nclass CMainView : public CSplitterWindowImpl<CMainView,false>\r\n{\r\npublic:\r\n    enum eHintType\r\n    {\r\n        HT_INFORMATION = 0,\r\n        HT_WARNING = 1,\r\n        HT_ERROR = 2,\r\n        HT_EXTERNAL = 3\r\n    };\r\n\r\nprivate:\r\n    enum eButtonState\r\n    {\r\n        BS_NORMAL = 0,\r\n        BS_HOVER = 1,\r\n        BS_DOWN = 2,\r\n        BS_DISABLED = 3\r\n    };\r\n\r\n    unsigned int m_uiBorderSize;\r\n\r\n    bool m_bHintBar;\r\n    eHintType m_HintType;\r\n    ckcore::tstring m_HintMsg;\r\n\r\n    eButtonState m_ButtonState;\r\n\r\n    HIMAGELIST m_hIconImageList;\r\n    HIMAGELIST m_hCloseImageList;\r\n\r\n    void DrawHintBar(HDC hDC,RECT &rcHintBar);\r\n\r\npublic:\r\n    CMainView();\r\n    ~CMainView();\r\n\r\n    typedef CSplitterWindowImpl<CMainView,false> _baseClass;\r\n\r\n    BEGIN_MSG_MAP(CMainView)\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_NCCALCSIZE,OnNCCalcSize)\r\n        MESSAGE_HANDLER(WM_NCPAINT,OnNCPaint)\r\n        MESSAGE_HANDLER(WM_NCMOUSEMOVE,OnNCMouseMove)\r\n        MESSAGE_HANDLER(WM_NCLBUTTONDOWN,OnNCMouseDown)\r\n        MESSAGE_HANDLER(WM_NCLBUTTONUP,OnNCMouseUp)\r\n        MESSAGE_HANDLER(WM_NCHITTEST,OnNCHitTest)\r\n\r\n        CHAIN_MSG_MAP(_baseClass);\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCCalcSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCMouseMove(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCMouseDown(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCMouseUp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnNCHitTest(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void ShowHintMsg(eHintType HintType,const TCHAR *szHintMsg);\r\n    void HideHintMsg();\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/new_file_ext_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"new_file_ext_dlg.hh\"\r\n#include <base/string_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n\r\nCNewFileExtDlg::CNewFileExtDlg()\r\n{\r\n}\r\n\r\nCNewFileExtDlg::~CNewFileExtDlg()\r\n{\r\n}\r\n\r\nbool CNewFileExtDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a newfileext translation section.\r\n    if (!pLng->EnterSection(_T(\"newfileext\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_NEWFILEEXTDLG,szStrValue))\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DESCSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_DESCSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_EXTSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_EXTSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CNewFileExtDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    m_DescEdit.SubclassWindow(GetDlgItem(IDC_DESCEDIT));\r\n    m_ExtEdit.SubclassWindow(GetDlgItem(IDC_EXTEDIT));\r\n\r\n    m_DescEdit.SetLimitText(63);\r\n    m_ExtEdit.SetLimitText(63);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CNewFileExtDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    GetDlgItemText(IDC_DESCEDIT,m_szDescBuffer,63);\r\n    GetDlgItemText(IDC_EXTEDIT,m_szExtBuffer,63);\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CNewFileExtDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/new_file_ext_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"custom_edit_ctrl.hh\"\r\n\r\nclass CNewFileExtDlg : public CDialogImpl<CNewFileExtDlg>\r\n{\r\nprivate:\r\n    CCustomEditCtrl m_DescEdit;\r\n    CCustomEditCtrl m_ExtEdit;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_NEWFILEEXTDLG };\r\n\r\n    TCHAR m_szDescBuffer[64];\r\n    TCHAR m_szExtBuffer[64];\r\n\r\n    CNewFileExtDlg();\r\n    ~CNewFileExtDlg();\r\n\r\n    BEGIN_MSG_MAP(CNewFileExtDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/progress_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <comutil.h>\r\n#include <base/string_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"device_util.hh\"\r\n#include \"version.hh\"\r\n#include \"progress_dlg.hh\"\r\n\r\nstatic const int SUBITEM_TEXT = 1;\r\n\r\nCProgressDlg::CProgressDlg() : m_pProcess(NULL),m_bAppMode(false),\r\n    m_bRealMode(false),m_bCancelled(false),m_hWndHost(NULL),m_ucPercent(0),\r\n    m_szHostTitle(NULL),m_pFlashWindowEx(NULL),m_bNeedToFocusOkButton(false)\r\n{\r\n    // Load the icons.\r\n    m_hListImageList = ImageList_Create(16,16,ILC_COLOR32,0,4);\r\n\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_INFORMATION));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_WARNING));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_ERROR));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_WINLOGO));\r\n\r\n\r\n    // The MSDN documentation states that FlashWindowEx() is only\r\n    // available in Windows 2000 and later. However, MS KB article ID 254339\r\n    // states that you can use this API in Windows 98 too.\r\n    const HMODULE hUser32 = GetModuleHandle(_T(\"USER32.DLL\"));\r\n    if (hUser32 == NULL)\r\n    {\r\n        ATLASSERT(false);  // This should never happen at this point.\r\n    }\r\n    else\r\n    {\r\n        m_pFlashWindowEx = (PointerToFlashWindowEx)GetProcAddress(hUser32,\"FlashWindowEx\");\r\n\r\n        // This should never happen at this point.\r\n        ATLASSERT(m_pFlashWindowEx != NULL);\r\n    }\r\n\r\n    SMOKE_INIT\r\n}\r\n\r\nCProgressDlg::~CProgressDlg()\r\n{\r\n    if (m_hListImageList != NULL)\r\n        ImageList_Destroy(m_hListImageList);\r\n\r\n    if (m_szHostTitle != NULL)\r\n    {\r\n        delete m_szHostTitle;\r\n        m_szHostTitle = NULL;\r\n    }\r\n}\r\n\r\nbool CProgressDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a progress translation section.\r\n    if (!pLng->EnterSection(_T(\"progress\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_RELOADBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_RELOADBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_BUFFERSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_BUFFERSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProgressDlg::AttachProcess(ckcore::Process *pProcess)\r\n{\r\n    m_pProcess = pProcess;\r\n}\r\n\r\nvoid CProgressDlg::AttachHost(HWND hWndHost)\r\n{\r\n    m_hWndHost = hWndHost;\r\n}\r\n\r\nvoid CProgressDlg::SetAppMode(bool bAppMode)\r\n{\r\n    m_bAppMode = bAppMode;\r\n}\r\n\r\nvoid CProgressDlg::SetRealMode(bool bRealMode)\r\n{\r\n    m_bRealMode = bRealMode;\r\n}\r\n\r\nvoid CProgressDlg::set_progress(unsigned char ucPercent)\r\n{\r\n    if (ucPercent < 0)\r\n        ucPercent = 0;\r\n    else if (ucPercent > 100)\r\n        ucPercent = 100;\r\n\r\n    // Make sure that the progress does not go in the wrong direction.\r\n    if (ucPercent < m_ucPercent && ucPercent != 0)\r\n        return;\r\n\r\n    // Only redraw when we have to.\r\n    if (m_ucPercent != ucPercent)\r\n    {\r\n        m_ucPercent = ucPercent;\r\n\r\n        SendDlgItemMessage(IDC_TOTALPROGRESS,PBM_SETPOS,(WPARAM)ucPercent,0);\r\n\r\n        TCHAR szProgress[32];\r\n        lsnprintf_s(szProgress,32,lngGetString(PROGRESS_TOTAL),ucPercent);\r\n        m_TotalStatic.SetWindowText(szProgress);\r\n\r\n        // Update parent title if necessary.\r\n        if (!m_bAppMode && m_szHostTitle != NULL)\r\n        {\r\n            TCHAR szTitle[64];\r\n            GetWindowText(szTitle,sizeof(szTitle)/sizeof(TCHAR));\r\n\r\n            TCHAR szHostTitle[32 + 64];\r\n            lsnprintf_s(szHostTitle,sizeof(szHostTitle)/sizeof(TCHAR),_T(\"%d%% - %s\"),ucPercent,szTitle);\r\n\r\n            GetParentWindow(this).SetWindowText(szHostTitle);\r\n        }\r\n\r\n        ProcessMessages();\r\n    }\r\n}\r\n\r\nvoid CProgressDlg::set_marquee(bool bEnable)\r\n{\r\n    // Only supported in Windows XP and newer (common controls version 6).\r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        HWND hWndCtrl = GetDlgItem(IDC_TOTALPROGRESS);\r\n\r\n        if (bEnable)\r\n        {\r\n            unsigned long ulStyle = ::GetWindowLong(hWndCtrl,GWL_STYLE);\r\n            ::SetWindowLong(hWndCtrl,GWL_STYLE,ulStyle | PBS_MARQUEE);\r\n            ::SendMessage(hWndCtrl,PBM_SETMARQUEE,TRUE,50);\r\n        }\r\n        else\r\n        {\r\n            unsigned long ulStyle = ::GetWindowLong(hWndCtrl,GWL_STYLE);\r\n            ::SetWindowLong(hWndCtrl,GWL_STYLE,ulStyle & ~PBS_MARQUEE);\r\n            ::SendMessage(hWndCtrl,PBM_SETMARQUEE,FALSE,50);\r\n        }\r\n    }\r\n}\r\n\r\nvoid CProgressDlg::set_status(const TCHAR *szStatus,...)\r\n{\r\n    // Prepare the string.\r\n    TCHAR szStatusStr[256];\r\n    lstrcpy(szStatusStr,lngGetString(PROGRESS_STATUS));\r\n\r\n    unsigned int uiFreeSpace = sizeof(szStatusStr)/sizeof(TCHAR) - lstrlen(szStatusStr) - 1;\r\n    if ((unsigned int)lstrlen(szStatus) > uiFreeSpace)\r\n        lstrncat(szStatusStr,szStatus,uiFreeSpace);\r\n    else\r\n        lstrcat(szStatusStr,szStatus);\r\n\r\n    // Parse the variable argument list.\r\n    va_list args;\r\n    va_start(args,szStatus);\r\n\r\n    _vsnwprintf(m_szStringBuffer,PROGRESS_STRINGBUFFER_SIZE - 1,szStatusStr,args);\r\n\r\n    m_StatusStatic.SetWindowText(m_szStringBuffer);\r\n}\r\n\r\nvoid CProgressDlg::notify(ckcore::Progress::MessageType Type,const TCHAR *szMessage,...)\r\n{\r\n    int iItemIndex = m_ListView.GetItemCount();\r\n\r\n    // Time.\r\n    SYSTEMTIME st;\r\n    GetLocalTime(&st);\r\n\r\n    TCHAR szTime[9];\t// xx:yy:zz\r\n    lsprintf(szTime,_T(\"%.2d:%.2d:%.2d\"),st.wHour,st.wMinute,st.wSecond);\r\n    szTime[8] = '\\0';\r\n\r\n    // Convert the log type to an index.\r\n    int iImageIndex = 0;\r\n    switch (Type)\r\n    {\r\n        case ckcore::Progress::ckINFORMATION:\r\n            iImageIndex = 0;\r\n            break;\r\n        case ckcore::Progress::ckWARNING:\r\n            iImageIndex = 1;\r\n            break;\r\n        case ckcore::Progress::ckERROR:\r\n            iImageIndex = 2;\r\n            break;\r\n        case ckcore::Progress::ckEXTERNAL:\r\n            iImageIndex = 3;\r\n            break;\r\n    }\r\n\r\n    m_ListView.AddItem(iItemIndex,0,szTime,iImageIndex);\r\n\r\n    // Parse the variable argument list.\r\n    va_list args;\r\n    va_start(args,szMessage);\r\n\r\n    _vsnwprintf(m_szStringBuffer,PROGRESS_STRINGBUFFER_SIZE - 1,szMessage,args);\r\n\r\n    m_ListView.AddItem(iItemIndex,SUBITEM_TEXT,m_szStringBuffer);\r\n\r\n    m_ListView.SetColumnWidth(SUBITEM_TEXT,LVSCW_AUTOSIZE);\r\n    m_ListView.EnsureVisible(iItemIndex,false);\r\n}\r\n\r\nbool CProgressDlg::cancelled()\r\n{\r\n    return m_bCancelled;\r\n}\r\n\r\nvoid CProgressDlg::SetDevice(const TCHAR *szDevice)\r\n{\r\n    ckcore::tstring DeviceStr = lngGetString(PROGRESS_DEVICE);\r\n    DeviceStr += szDevice;\r\n\r\n    SetDlgItemText(IDC_DEVICESTATIC,DeviceStr.c_str());\r\n}\r\n\r\nvoid CProgressDlg::SetDevice(ckmmc::Device &Device)\r\n{\r\n    ckcore::tstring DeviceStr = lngGetString(PROGRESS_DEVICE);\r\n    DeviceStr += NDeviceUtil::GetDeviceName(Device);\r\n\r\n    SetDlgItemText(IDC_DEVICESTATIC,DeviceStr.c_str());\r\n}\r\n\r\nvoid CProgressDlg::NotifyCompleted()\r\n{\r\n    ::EnableWindow(GetDlgItem(IDOK),true);\r\n    if ( GetForegroundWindow() == m_hWnd )\r\n    {\r\n        // Change default focus to the OK button. We can only do this\r\n        // if this window is active. Otherwise, this call will not\r\n        // make it active, but will still trigger a WM_ACTIVATE message\r\n        // to this window.\r\n        // Later on, when this window does get active, it will not\r\n        // get the corresponding WM_ACTIVATE and we won't be able\r\n        // to stop the flashing if necessary, see OnActivate() below.\r\n        SendMessage(WM_NEXTDLGCTL,(WPARAM)::GetDlgItem(m_hWnd,IDOK),0);\r\n    }\r\n    else\r\n        m_bNeedToFocusOkButton = true;\r\n\r\n    ::EnableWindow(GetDlgItem(IDCANCEL),false);\r\n\r\n    if (m_bCancelled)\r\n    {\r\n        set_status(lngGetString(PROGRESS_CANCELED));\r\n        notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n    }\r\n\r\n    // Restore the window title.\r\n    if (!m_bAppMode && m_szHostTitle != NULL)\r\n    {\r\n        GetParentWindow(this).SetWindowText(m_szHostTitle);\r\n\r\n        delete m_szHostTitle;\r\n        m_szHostTitle = NULL;\r\n    }\r\n\r\n    SMOKE_STOP\r\n\r\n    // Recording a CD can take some time, and the user may switch to\r\n    // another application meanwhile and not notice when the CD is finished.\r\n    // Therefore, at the end of the process, we prompt for\r\n    // the user's attention by making the window and taskbar icon flash.\r\n    //\r\n    // Calling SetForegroundWindow() or SetActiveWindow()\r\n    // should have an equivalent effect according to the documentation,\r\n    // but it does not seem to do the trick, we need to call\r\n    // FlashWindow().\r\n    // We don't want to start flashing if this window is the active one\r\n    // at the moment. We also need to stop the flashing if the window\r\n    // wasn't active and the user reacts to the flashing and clicks on it.\r\n    //\r\n    // Rather than flashing, it would be better to display a balloon notification\r\n    // on the task bar, but that's only available from Windows XP onwards.\r\n\r\n    if ( m_pFlashWindowEx != NULL && GetForegroundWindow() != m_hWnd )\r\n    {\r\n        FLASHWINFO fi1;\r\n        ZeroMemory(&fi1, sizeof(fi1));\r\n\r\n        fi1.cbSize = sizeof(fi1);\r\n        fi1.hwnd = m_hWnd;\r\n        fi1.dwFlags = 1; // FLASHW_CAPTION. The taskbar icon belongs to the main window.\r\n        fi1.uCount = 5;\r\n        fi1.dwTimeout = 0;\r\n\r\n        m_pFlashWindowEx( &fi1 );\r\n\r\n        if ( !m_bAppMode )\r\n        {\r\n            FLASHWINFO fi2;\r\n            ZeroMemory(&fi2, sizeof(fi2));\r\n\r\n            fi2.cbSize = sizeof(fi2);\r\n            fi2.hwnd = GetParentWindow(this).m_hWnd;\r\n            fi2.dwFlags = 2; // FLASHW_TRAY\r\n            fi2.uCount = 5;\r\n            fi2.dwTimeout = 0;\r\n\r\n            m_pFlashWindowEx( &fi2 );\r\n        }\r\n    }\r\n}\r\n\r\nLRESULT CProgressDlg::OnActivate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    const UINT nState = LOWORD(wParam);\r\n\r\n    // If this window is getting activated...\r\n    if (nState != WA_INACTIVE)\r\n    {\r\n        // Stop the window flashing. The window may never have flashed,\r\n        // or may have flashed but may have stopped flashing after the given\r\n        // flash count, but that doesn't matter.\r\n        if (m_pFlashWindowEx != NULL)\r\n        {\r\n            FLASHWINFO fi1;\r\n            ZeroMemory(&fi1,sizeof(fi1));\r\n\r\n            fi1.cbSize = sizeof(fi1);\r\n            fi1.hwnd = m_hWnd;\r\n            fi1.dwFlags = 0; // FLASHW_STOP\r\n            fi1.uCount = 0;\r\n            fi1.dwTimeout = 0;\r\n\r\n            m_pFlashWindowEx(&fi1);\r\n\r\n            if (!m_bAppMode)\r\n            {\r\n                FLASHWINFO fi2;\r\n                ZeroMemory(&fi2,sizeof(fi2));\r\n\r\n                fi2.cbSize = sizeof(fi2);\r\n                fi2.hwnd = GetParentWindow(this).m_hWnd;\r\n                fi2.dwFlags = 0; // FLASHW_STOP\r\n                fi2.uCount = 0;\r\n                fi2.dwTimeout = 0;\r\n\r\n                m_pFlashWindowEx(&fi2);\r\n            }\r\n        }\r\n\r\n        if (m_bNeedToFocusOkButton)\r\n        {\r\n            SendMessage(WM_NEXTDLGCTL,(WPARAM)::GetDlgItem(m_hWnd,IDOK),0);\t// Change default focus to the OK button.\r\n            m_bNeedToFocusOkButton = false;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nvoid CProgressDlg::SetBuffer(int iPercent)\r\n{\r\n    SendDlgItemMessage(IDC_BUFFERPROGRESS,PBM_SETPOS,(WPARAM)iPercent,0);\r\n}\r\n\r\nvoid CProgressDlg::AllowReload()\r\n{\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_SHOW);\r\n}\r\n\r\nvoid CProgressDlg::AllowCancel(bool bAllow)\r\n{\r\n    ::EnableWindow(GetDlgItem(IDCANCEL),bAllow);\r\n}\r\n\r\nvoid CProgressDlg::Reset()\r\n{\r\n    m_bRealMode = false;\r\n    m_bCancelled = false;\r\n}\r\n\r\nbool CProgressDlg::RequestNextDisc()\r\n{\r\n    return lngMessageBox(m_hWnd,INFO_NEXTCOPY,GENERAL_INFORMATION,MB_OKCANCEL | MB_ICONINFORMATION) == IDOK;\r\n}\r\n\r\nvoid CProgressDlg::StartSmoke()\r\n{\r\n    SMOKE_START\r\n}\r\n\r\nLRESULT CProgressDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    DlgResize_Init();\r\n\r\n    CenterWindow(GetParent());\r\n\r\n    // If we're in application mode, add a minimize button to the window.\r\n    // UPDATE: This does not work, nor is it a good idea regarding the smoke effect.\r\n    /*if (m_bAppMode)\r\n        ModifyStyle(0,WS_MINIMIZEBOX,0);*/\r\n\r\n    SendDlgItemMessage(IDC_TOTALPROGRESS,PBM_SETRANGE32,0,100);\r\n    SendDlgItemMessage(IDC_BUFFERPROGRESS,PBM_SETRANGE32,0,100);\r\n\r\n    // Make the static controls double buffered.\r\n    m_TotalStatic.SubclassWindow(GetDlgItem(IDC_TOTALSTATIC));\r\n    m_StatusStatic.SubclassWindow(GetDlgItem(IDC_STATUSSTATIC));\r\n\r\n    // Initialize the list view.\r\n    m_ListView = GetDlgItem(IDC_MESSAGELIST);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_NORMAL);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_SMALL);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    m_ListView.AddColumn(lngGetString(COLUMN_TIME),0);\r\n    m_ListView.SetColumnWidth(0,70);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_EVENT),1);\r\n    m_ListView.SetColumnWidth(1,150);\r\n\r\n    // Disable the OK button.\r\n    ::EnableWindow(GetDlgItem(IDOK),false);\r\n\r\n    set_progress(0);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    if (!m_bAppMode)\r\n    {\r\n        if (m_szHostTitle != NULL)\r\n            delete [] m_szHostTitle;\r\n\r\n        int iSize = GetParentWindow(this).GetWindowTextLength() + 1;\r\n        m_szHostTitle = new TCHAR[iSize];\r\n        GetParentWindow(this).GetWindowText(m_szHostTitle,iSize);\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CProgressDlg::OnReload(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Send a CR-LF message to inform CD-tools that the drive has been reloaded.\r\n    if (m_pProcess != NULL)\r\n        m_pProcess->write(\"\\r\\n\",2);\r\n\r\n    // Hide the reload button.\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_HIDE);\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CProgressDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Re-enable the main window.\r\n    if (::IsWindow(m_hWndHost))\r\n        ::EnableWindow(m_hWndHost,true);\r\n\r\n    DestroyWindow();\r\n\r\n    // If we're in application mode we post a quit message.\r\n    if (m_bAppMode)\r\n        ::PostQuitMessage(wID);\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CProgressDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Make sure that we're allowed to cancel.\r\n    if (!::IsWindowEnabled(GetDlgItem(IDCANCEL)))\r\n        return TRUE;\r\n\r\n    // If we're in real mode we dispay a warning message informing the user that\r\n    // aborting might permanently damage the CD.\r\n    if (m_bRealMode)\r\n    {\r\n        if (lngMessageBox(m_hWnd,CONFIRM_WRITECANCEL,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDNO)\r\n            return TRUE;\r\n    }\r\n\r\n    m_bCancelled = true;\r\n\r\n    if (m_pProcess != NULL)\r\n        m_pProcess->kill();\r\n\r\n    // Hide the reload button.\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_HIDE);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CProgressDlg::OnListViewDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    ATLASSERT(iCtrlID == IDC_MESSAGELIST);\r\n    LPNMITEMACTIVATE pItemActivate = (LPNMITEMACTIVATE)pNMH;\r\n\r\n    _bstr_t LineText;\r\n    m_ListView.GetItemText(pItemActivate->iItem,SUBITEM_TEXT,LineText.GetBSTR());\r\n\r\n    MessageBox(LineText,_T(\"Log line\"),MB_OK | MB_ICONINFORMATION);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/progress_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/process.hh>\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n#include \"advanced_progress.hh\"\r\n#include \"double_buffered_static.hh\"\r\n#include \"effects.hh\"\r\n#include \"version.hh\"\r\n\r\n#ifndef PBM_SETMARQUEE\r\n#define PBM_SETMARQUEE      (WM_USER + 10)\r\n#endif\r\n\r\n#ifndef PBS_MARQUEE\r\n#define PBS_MARQUEE         0x08\r\n#endif\r\n\r\nclass CProgressDlg : public CDialogImpl<CProgressDlg>,\r\n                     public CDialogResize<CProgressDlg>,\r\n                     public CAdvancedProgress\r\n{\r\nprivate:\r\n    #if(WINVER < 0x0500)\r\n\r\n        typedef struct {\r\n            UINT  cbSize;\r\n            HWND  hwnd;\r\n            DWORD dwFlags;\r\n            UINT  uCount;\r\n            DWORD dwTimeout;\r\n        } FLASHWINFO, *PFLASHWINFO;\r\n\r\n    #endif  // #if(WINVER < 0x0500)\r\n\r\n    typedef BOOL (WINAPI *PointerToFlashWindowEx)(PFLASHWINFO);\r\n    PointerToFlashWindowEx m_pFlashWindowEx;\r\n    bool m_bNeedToFocusOkButton;\r\n\r\n    HIMAGELIST m_hListImageList;\r\n    CListViewCtrl m_ListView;\r\n    CDoubleBufferedStatic m_TotalStatic;\r\n    CDoubleBufferedStatic m_StatusStatic;\r\n\r\n    ckcore::Process *m_pProcess;\r\n    bool m_bAppMode;\r\n    bool m_bRealMode;\r\n    bool m_bCancelled;\r\n\r\n    HWND m_hWndHost;\r\n\r\n    unsigned char m_ucPercent;\r\n\r\n    TCHAR *m_szHostTitle;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROGRESSDLG };\r\n\r\n    CProgressDlg();\r\n    ~CProgressDlg();\r\n\r\n    void AttachProcess(ckcore::Process *pProcess);\r\n    void AttachHost(HWND hWndHost);\r\n\r\n    void SetAppMode(bool bAppMode);\r\n    void SetRealMode(bool bRealMode);\r\n\r\n    // ckcore::Progress.\r\n    void set_progress(unsigned char ucPercent);\r\n    void set_marquee(bool bMarquee);\r\n    void set_status(const TCHAR *szStatus,...);\r\n    void notify(ckcore::Progress::MessageType Type,const TCHAR *szMessage,...);\r\n    bool cancelled();\r\n\r\n    void SetDevice(const TCHAR *szDevice);\r\n    void SetDevice(ckmmc::Device &Device);\r\n\r\n    void NotifyCompleted();\r\n\r\n    void SetBuffer(int iPercent);\r\n    void AllowReload();\r\n    void AllowCancel(bool bAllow);\r\n\r\n    void Reset();\r\n\r\n    bool RequestNextDisc();\r\n\r\n    void StartSmoke();\r\n\r\nprivate:\r\n    BEGIN_MSG_MAP(CProgressDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_ACTIVATE,OnActivate)\r\n\r\n        COMMAND_ID_HANDLER(IDC_RELOADBUTTON,OnReload)\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n\r\n        NOTIFY_HANDLER(IDC_MESSAGELIST,NM_DBLCLK,OnListViewDblClick)\r\n\r\n        SMOKE_EVENTS\r\n\r\n        CHAIN_MSG_MAP(CDialogResize<CProgressDlg>)\r\n    END_MSG_MAP()\r\n\r\n    // Resize maps.\r\n    BEGIN_DLGRESIZE_MAP(CProgressDlg)\r\n        DLGRESIZE_CONTROL(IDC_TOTALSTATIC,DLSZ_SIZE_X)\r\n        DLGRESIZE_CONTROL(IDC_TOTALPROGRESS,DLSZ_SIZE_X)\r\n        DLGRESIZE_CONTROL(IDC_STATUSSTATIC,DLSZ_SIZE_X)\r\n        DLGRESIZE_CONTROL(IDC_MESSAGELIST,DLSZ_SIZE_X | DLSZ_SIZE_Y)\r\n        DLGRESIZE_CONTROL(IDC_BEVELSTATIC,DLSZ_SIZE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_DEVICESTATIC,DLSZ_SIZE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_BUFFERSTATIC,DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_BUFFERPROGRESS,DLSZ_SIZE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDOK,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDCANCEL,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_RELOADBUTTON,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n    END_DLGRESIZE_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnActivate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnReload(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnListViewDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    SMOKE_IMPL\r\n};\r\n\r\nextern CProgressDlg * g_pProgressDlg;"
  },
  {
    "path": "src/app/dialog/project_prop_audio_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_audio_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"edit_track_dlg.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n\r\nCProjectPropAudioPage::CProjectPropAudioPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_AUDIO,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropAudioPage::~CProjectPropAudioPage()\r\n{\r\n}\r\n\r\nbool CProjectPropAudioPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_ALBUMSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_ALBUMSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_ALBUMSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_ARTISTSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_ARTISTSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_ARTISTSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_INFOSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_INFOSTATIC,szStrValue);\r\n\r\n    // Make sure that the edit/combo controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_ALBUMEDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_ARTISTEDIT,iMaxStaticRight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropAudioPage::OnApply()\r\n{\r\n    GetDlgItemText(IDC_ALBUMEDIT,g_ProjectSettings.m_szAlbumName,159);\r\n    GetDlgItemText(IDC_ARTISTEDIT,g_ProjectSettings.m_szAlbumArtist,159);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropAudioPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropAudioPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup the list view.\r\n    m_ListView = GetDlgItem(IDC_TRACKLIST);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    m_ListView.InsertColumn(0,lngGetString(COLUMN_TRACK),LVCFMT_LEFT,45,0);\r\n    m_ListView.InsertColumn(1,lngGetString(COLUMN_TITLE),LVCFMT_LEFT,150,1);\r\n    m_ListView.InsertColumn(2,lngGetString(COLUMN_ARTIST),LVCFMT_LEFT,118,2);\r\n\r\n    g_ProjectManager.ListAudioTracks(&m_ListView);\r\n\r\n    // Load the album information.\r\n    SetDlgItemText(IDC_ALBUMEDIT,g_ProjectSettings.m_szAlbumName);\r\n    SetDlgItemText(IDC_ARTISTEDIT,g_ProjectSettings.m_szAlbumArtist);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CProjectPropAudioPage::OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ListView.GetSelectedCount() > 0)\r\n    {\r\n        unsigned int uiTrackIndex = m_ListView.GetSelectedIndex();\r\n        CItemData *pItemData = (CItemData *)m_ListView.GetItemData(uiTrackIndex);\r\n\r\n        TCHAR szTitle[64];\r\n        lsnprintf_s(szTitle,64,lngGetString(PROJECTPROP_TRACKPROP),uiTrackIndex + 1);\r\n\r\n        CEditTrackDlg  EditTrackDlg(pItemData);\r\n        if (EditTrackDlg.DoModal(::GetActiveWindow(),(LPARAM)szTitle) == IDOK)\r\n        {\r\n            m_ListView.SetItemText(uiTrackIndex,1,pItemData->GetAudioData()->szTrackTitle);\r\n            m_ListView.SetItemText(uiTrackIndex,2,pItemData->GetAudioData()->szTrackArtist);\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_audio_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropAudioPage : public CPropertyPageImpl<CProjectPropAudioPage>\r\n{\r\nprivate:\r\n    CListViewCtrl m_ListView;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPAUDIO };\r\n\r\n    CProjectPropAudioPage();\r\n    ~CProjectPropAudioPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropAudioPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        NOTIFY_HANDLER(IDC_TRACKLIST,NM_DBLCLK,OnListDblClick)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropAudioPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_boot_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_boot_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"version.hh\"\r\n#include \"add_boot_image_dlg.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"trans_util.hh\"\r\n\r\nCProjectPropBootPage::CProjectPropBootPage()\r\n{\r\n    m_hToolBarImageList = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_BOOT,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropBootPage::~CProjectPropBootPage()\r\n{\r\n    if (m_hToolBarImageList)\r\n        ImageList_Destroy(m_hToolBarImageList);\r\n}\r\n\r\nbool CProjectPropBootPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    if (pLng->GetValuePtr(IDC_BOOTSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_BOOTSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropBootPage::InitToolBarImageList()\r\n{\r\n    // Create the image list.\r\n    HBITMAP hBitmap;\r\n    \r\n    if (g_WinVer.m_ulMajorCCVersion >= 6)\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32,0,6);\r\n        ImageList_Add(m_hToolBarImageList,hBitmap,NULL);\r\n    }\r\n    else\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_MINITOOLBARBITMAP_));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,6);\r\n        ImageList_AddMasked(m_hToolBarImageList,hBitmap,RGB(255,0,255));\r\n    }\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nvoid CProjectPropBootPage::AddToolBarButton(int iCommand,int iBitmap)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = 0;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CProjectPropBootPage::CreateToolBarCtrl()\r\n{\r\n    RECT rcListView;\r\n    ::GetWindowRect(GetDlgItem(IDC_LIST),&rcListView);\r\n    ScreenToClient(&rcListView);\r\n\r\n    RECT rcToolBar = { 0,0,100,100 };\r\n    m_ToolBar.Create(m_hWnd,rcToolBar,NULL,ATL_SIMPLE_TOOLBAR_PANE_STYLE,NULL);\r\n    m_ToolBar.SetImageList(m_hToolBarImageList);\r\n    m_ToolBar.SetButtonStructSize();\r\n\r\n    // Create the buttons.\r\n    AddToolBarButton(ID_BOOT_ADD,1);\r\n    AddToolBarButton(ID_BOOT_REMOVE,3);\r\n    AddToolBarButton(ID_BOOT_EDIT,6);\r\n    m_ToolBar.EnableButton(ID_BOOT_REMOVE,false);\r\n    m_ToolBar.EnableButton(ID_BOOT_EDIT,false);\r\n\r\n    // Update the toolbar position.\r\n    int iToolBarWidth = 0;\r\n    RECT rcButton;\r\n\r\n    for (int i = 0; i < m_ToolBar.GetButtonCount(); i++)\r\n    {\r\n        m_ToolBar.GetItemRect(i,&rcButton);\r\n        iToolBarWidth += rcButton.right - rcButton.left;\r\n    }\r\n\r\n    m_ToolBar.SetWindowPos(NULL,\r\n        rcListView.right - iToolBarWidth,\r\n        rcListView.top - HIWORD(m_ToolBar.GetButtonSize()),\r\n        iToolBarWidth,\r\n        HIWORD(m_ToolBar.GetButtonSize()),0);\r\n}\r\n\r\nvoid CProjectPropBootPage::FillListView()\r\n{\r\n    int iItemCount = 0;\r\n\r\n    std::list <CProjectBootImage *>::iterator itImageObject;\r\n    for (itImageObject = g_ProjectSettings.m_BootImages.begin(); itImageObject != g_ProjectSettings.m_BootImages.end(); itImageObject++)\r\n    {\r\n        m_ListView.AddItem(iItemCount,0,LPSTR_TEXTCALLBACK);\r\n        m_ListView.AddItem(iItemCount,1,LPSTR_TEXTCALLBACK);\r\n        m_ListView.SetItemData(iItemCount++,(DWORD_PTR)*itImageObject);\r\n    }\r\n}\r\n\r\nbool CProjectPropBootPage::OnApply()\r\n{\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropBootPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Create the toolbar.\r\n    InitToolBarImageList();\r\n    CreateToolBarCtrl();\r\n\r\n    // Initialize the list view.\r\n    m_ListView = GetDlgItem(IDC_LIST);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_NAME),0);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_EMULATION),1);\r\n    m_ListView.SetColumnWidth(0,253);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    // Fill the list view.\r\n    FillListView();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnListAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    // The maximum number of allowed boot images is 63.\r\n    if (m_ListView.GetItemCount() == 63)\r\n    {\r\n        MessageBox(lngGetString(ERROR_NUMBOOTIMAGES),lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return 0;\r\n    }\r\n\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"All Files (*.*)\\0*.*\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n    {\r\n        CProjectBootImage *pBootImage = new CProjectBootImage();\r\n        pBootImage->m_FullPath = FileDialog.m_szFileName;\r\n\r\n        ExtractFileName(FileDialog.m_szFileName);\r\n        pBootImage->m_LocalName = FileDialog.m_szFileName;\r\n\r\n        CAddBootImageDlg AddBootImageDlg(pBootImage,false);\r\n\r\n        if (AddBootImageDlg.DoModal() == IDOK)\r\n        {\r\n            g_ProjectSettings.m_BootImages.push_back(pBootImage);\r\n\r\n            int iItemCount = m_ListView.GetItemCount();\r\n\r\n            m_ListView.AddItem(iItemCount,0,LPSTR_TEXTCALLBACK);\r\n            m_ListView.AddItem(iItemCount,1,LPSTR_TEXTCALLBACK);\r\n            m_ListView.SetItemData(iItemCount,(DWORD_PTR)pBootImage);\r\n\r\n            return 0;\r\n        }\r\n\r\n        delete pBootImage;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnListRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n\r\n    CProjectBootImage *pBootImage =\r\n        reinterpret_cast<CProjectBootImage *>(m_ListView.GetItemData(m_ListView.GetSelectedIndex()));\r\n    g_ProjectSettings.m_BootImages.remove(pBootImage);\r\n\r\n    // Deltete the item from the list view.\r\n    m_ListView.DeleteItem(m_ListView.GetSelectedIndex());\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnListEdit(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    int iSelected = m_ListView.GetSelectedIndex();\r\n    CProjectBootImage *pBootImage = (CProjectBootImage *)m_ListView.GetItemData(iSelected);\r\n\r\n    CAddBootImageDlg AddBootImageDlg(pBootImage,true);\r\n    if (AddBootImageDlg.DoModal() == IDOK)\r\n    {\r\n        m_ListView.Update(iSelected);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnToolBarGetInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // The string ID is the same as the button ID.\r\n    LPTOOLTIPTEXT pTipText = (LPTOOLTIPTEXT)pNMH;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a hint translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr((unsigned long)pTipText->hdr.idFrom,szStrValue))\r\n            {\r\n                pTipText->lpszText = szStrValue;\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ToolBar.IsWindow())\r\n    {\r\n        if (m_ListView.GetSelectedCount() > 0)\r\n        {\r\n            m_ToolBar.EnableButton(ID_BOOT_REMOVE,true);\r\n            m_ToolBar.EnableButton(ID_BOOT_EDIT,true);\r\n        }\r\n        else\r\n        {\r\n            m_ToolBar.EnableButton(ID_BOOT_REMOVE,false);\r\n            m_ToolBar.EnableButton(ID_BOOT_EDIT,false);\r\n        }\r\n    }\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropBootPage::OnListGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    NMLVDISPINFO *pDispInfo = (NMLVDISPINFO *)pNMH;\r\n    CProjectBootImage *pBootImage = (CProjectBootImage *)pDispInfo->item.lParam;\r\n\r\n    if (pDispInfo->item.mask & LVIF_TEXT)\r\n    {\r\n        switch (pDispInfo->item.iSubItem)\r\n        {\r\n            case 0:\r\n                lstrcpy(pDispInfo->item.pszText,pBootImage->m_FullPath.c_str());\r\n                break;\r\n\r\n            case 1:\r\n                {\r\n                    switch (pBootImage->m_iEmulation)\r\n                    {\r\n                        case PROJECTBI_BOOTEMU_FLOPPY:\r\n                            lstrcpy(pDispInfo->item.pszText,lngGetString(BOOTEMU_FLOPPY));\r\n                            break;\r\n\r\n                        case PROJECTBI_BOOTEMU_HARDDISK:\r\n                            lstrcpy(pDispInfo->item.pszText,lngGetString(BOOTEMU_HARDDISK));\r\n                            break;\r\n\r\n                        default:\r\n                            lstrcpy(pDispInfo->item.pszText,lngGetString(BOOTEMU_NONE));\r\n                            break;\r\n                    }\r\n                }\r\n                break;\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_boot_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropBootPage : public CPropertyPageImpl<CProjectPropBootPage>\r\n{\r\nprivate:\r\n    HIMAGELIST m_hToolBarImageList;\r\n    CListViewCtrl m_ListView;\r\n    CToolBarCtrl m_ToolBar;\r\n\r\n    bool Translate();\r\n\r\n    void InitToolBarImageList();\r\n    void AddToolBarButton(int iCommand,int iBitmap);\r\n    void CreateToolBarCtrl();\r\n\r\n    void FillListView();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPBOOT };\r\n\r\n    CProjectPropBootPage();\r\n    ~CProjectPropBootPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropBootPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(ID_BOOT_ADD,OnListAdd)\r\n        COMMAND_ID_HANDLER(ID_BOOT_REMOVE,OnListRemove)\r\n        COMMAND_ID_HANDLER(ID_BOOT_EDIT,OnListEdit)\r\n\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnToolBarGetInfo)\r\n        NOTIFY_HANDLER(IDC_LIST,LVN_ITEMCHANGED,OnListItemChanged)\r\n        NOTIFY_HANDLER(IDC_LIST,LVN_GETDISPINFO,OnListGetDispInfo)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropBootPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnListAdd(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnListRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnListEdit(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnToolBarGetInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnListGetDispInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_dlg.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n\r\nCProjectPropDlg::CProjectPropDlg() : CPropertySheetImpl<CProjectPropDlg>(lngGetString(PROJECTPROP_TITLE),0,NULL)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_HASHELP | PSH_NOCONTEXTHELP;\r\n\r\n    m_hGeneralPage = ::CreatePropertySheetPage(m_GeneralPage);\r\n    m_hFileSysPage = ::CreatePropertySheetPage(m_FileSysPage);\r\n    m_hIsoPage = ::CreatePropertySheetPage(m_IsoPage);\r\n    m_hFieldsPage = ::CreatePropertySheetPage(m_FieldsPage);\r\n    m_hBootPage = ::CreatePropertySheetPage(m_BootPage);\r\n    m_hUdfPage = ::CreatePropertySheetPage(m_UdfPage);\r\n    m_hAudioPage = ::CreatePropertySheetPage(m_AudioPage);\r\n\r\n    AddPage(m_hGeneralPage);\r\n\r\n    switch (g_ProjectManager.GetProjectType())\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            AddPage(m_hFileSysPage);\r\n\r\n            if (g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO)\r\n            {\r\n                AddPage(m_hUdfPage);\r\n            }\r\n\r\n            if (g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO || \r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO)\r\n            {\r\n                AddPage(m_hIsoPage);\r\n                AddPage(m_hFieldsPage);\r\n                AddPage(m_hBootPage);\r\n            }\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            AddPage(m_hAudioPage);\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            AddPage(m_hAudioPage);\r\n            AddPage(m_hFileSysPage);\r\n\r\n            if (g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO)\r\n            {\r\n                AddPage(m_hUdfPage);\r\n            }\r\n\r\n            if (g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO || \r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_ISO_UDF ||\r\n                g_ProjectSettings.m_iFileSystem == FILESYSTEM_DVDVIDEO)\r\n            {\r\n                AddPage(m_hIsoPage);\r\n                AddPage(m_hFieldsPage);\r\n                AddPage(m_hBootPage);\r\n            }\r\n            break;\r\n    };\r\n}\r\n\r\nCProjectPropDlg::~CProjectPropDlg()\r\n{\r\n}\r\n\r\nLRESULT CProjectPropDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectPropDlg::OnSetFileSystem(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    switch (lParam)\r\n    {\r\n        case FILESYSTEM_ISO:\r\n            if (wParam == FILESYSTEM_UDF)\t// Check previous selection.\r\n            {\r\n                m_hIsoPage = ::CreatePropertySheetPage(m_IsoPage);\r\n                m_hFieldsPage = ::CreatePropertySheetPage(m_FieldsPage);\r\n                m_hBootPage = ::CreatePropertySheetPage(m_BootPage);\r\n\r\n                AddPage(m_hIsoPage);\r\n                AddPage(m_hFieldsPage);\r\n                AddPage(m_hBootPage);\r\n            }\r\n            \r\n            if (wParam != FILESYSTEM_ISO)\r\n            {\r\n                RemovePage(m_hUdfPage);\r\n            }\r\n            break;\r\n\r\n        case FILESYSTEM_UDF:\r\n            if (wParam != FILESYSTEM_UDF)\t// Check previous selection.\r\n            {\r\n                RemovePage(m_hIsoPage);\r\n                RemovePage(m_hFieldsPage);\r\n                RemovePage(m_hBootPage);\r\n            }\r\n\r\n            if (wParam == FILESYSTEM_ISO)\r\n            {\r\n                m_hUdfPage = ::CreatePropertySheetPage(m_UdfPage);\r\n\r\n                AddPage(m_hUdfPage);\r\n            }\r\n            break;\r\n\r\n        case FILESYSTEM_ISO_UDF:\r\n        case FILESYSTEM_DVDVIDEO:\r\n            if (wParam == FILESYSTEM_UDF)\t// Check previous selection.\r\n            {\r\n                m_hIsoPage = ::CreatePropertySheetPage(m_IsoPage);\r\n                m_hFieldsPage = ::CreatePropertySheetPage(m_FieldsPage);\r\n                m_hBootPage = ::CreatePropertySheetPage(m_BootPage);\r\n\r\n                AddPage(m_hIsoPage);\r\n                AddPage(m_hFieldsPage);\r\n                AddPage(m_hBootPage);\r\n            }\r\n            else if (wParam == FILESYSTEM_ISO)\r\n            {\r\n                m_hUdfPage = ::CreatePropertySheetPage(m_UdfPage);\r\n\r\n                InsertPage(2,m_hUdfPage);\r\n            }\r\n            break;\r\n    }\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"project_prop_general_page.hh\"\r\n#include \"project_prop_file_sys_page.hh\"\r\n#include \"project_prop_iso_page.hh\"\r\n#include \"project_prop_fields_page.hh\"\r\n#include \"project_prop_audio_page.hh\"\r\n#include \"project_prop_boot_page.hh\"\r\n#include \"project_prop_udf_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nclass CProjectPropDlg : public CPropertySheetImpl<CProjectPropDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CProjectPropGeneralPage m_GeneralPage;\r\n    CProjectPropFileSysPage m_FileSysPage;\r\n    CProjectPropIsoPage m_IsoPage;\r\n    CProjectPropFieldsPage m_FieldsPage;\r\n    CProjectPropBootPage m_BootPage;\r\n    CProjectPropUdfPage m_UdfPage;\r\n    CProjectPropAudioPage m_AudioPage;\r\n\r\n    HPROPSHEETPAGE m_hGeneralPage;\r\n    HPROPSHEETPAGE m_hFileSysPage;\r\n    HPROPSHEETPAGE m_hIsoPage;\r\n    HPROPSHEETPAGE m_hFieldsPage;\r\n    HPROPSHEETPAGE m_hBootPage;\r\n    HPROPSHEETPAGE m_hUdfPage;\r\n    HPROPSHEETPAGE m_hAudioPage;\r\n\r\npublic:\r\n    CProjectPropDlg();\r\n    ~CProjectPropDlg();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_SETFILESYSTEM,OnSetFileSystem);\r\n\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CProjectPropDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnSetFileSystem(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_fields_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_fields_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n\r\nCProjectPropFieldsPage::CProjectPropFieldsPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_FIELDS,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropFieldsPage::~CProjectPropFieldsPage()\r\n{\r\n}\r\n\r\nbool CProjectPropFieldsPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_PUBLISHERSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_PUBLISHERSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_PUBLISHERSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_PREPARERSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_PREPARERSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_PREPARERSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_SYSTEMSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_SYSTEMSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_SYSTEMSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_VOLUMESTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_VOLUMESTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_VOLUMESTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_COPYRIGHTSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_COPYRIGHTSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_COPYRIGHTSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_ABSTRACTSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_ABSTRACTSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_ABSTRACTSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_BIBLIOGRAPHICSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_BIBLIOGRAPHICSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_BIBLIOGRAPHICSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n\r\n    // Make sure that the edit controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_PUBLISHEREDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_PREPAREREDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_SYSTEMEDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_VOLUMEEDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_COPYRIGHTEDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_ABSTRACTEDIT,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_BIBLIOGRAPHICEDIT,iMaxStaticRight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropFieldsPage::OnApply()\r\n{\r\n    GetDlgItemText(IDC_PUBLISHEREDIT,g_ProjectSettings.m_szPublisher,127);\r\n    GetDlgItemText(IDC_PREPAREREDIT,g_ProjectSettings.m_szPreparer,127);\r\n    GetDlgItemText(IDC_SYSTEMEDIT,g_ProjectSettings.m_szSystem,127);\r\n    GetDlgItemText(IDC_VOLUMEEDIT,g_ProjectSettings.m_szVolumeSet,127);\r\n\r\n    GetDlgItemText(IDC_COPYRIGHTEDIT,g_ProjectSettings.m_szCopyright,36);\r\n    GetDlgItemText(IDC_ABSTRACTEDIT,g_ProjectSettings.m_szAbstract,36);\r\n    GetDlgItemText(IDC_BIBLIOGRAPHICEDIT,g_ProjectSettings.m_szBibliographic,36);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropFieldsPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropFieldsPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Set field length limits.\r\n    ::SendMessage(GetDlgItem(IDC_PUBLISHEREDIT),EM_SETLIMITTEXT,127,0);\r\n    ::SendMessage(GetDlgItem(IDC_PREPAREREDIT),EM_SETLIMITTEXT,127,0);\r\n    ::SendMessage(GetDlgItem(IDC_SYSTEMEDIT),EM_SETLIMITTEXT,127,0);\r\n    ::SendMessage(GetDlgItem(IDC_VOLUMEEDIT),EM_SETLIMITTEXT,127,0);\r\n\r\n    ::SendMessage(GetDlgItem(IDC_COPYRIGHTEDIT),EM_SETLIMITTEXT,36,0);\r\n    ::SendMessage(GetDlgItem(IDC_ABSTRACTEDIT),EM_SETLIMITTEXT,36,0);\r\n    ::SendMessage(GetDlgItem(IDC_BIBLIOGRAPHICEDIT),EM_SETLIMITTEXT,36,0);\r\n\r\n    // Load the default settings.\r\n    SetDlgItemText(IDC_PUBLISHEREDIT,g_ProjectSettings.m_szPublisher);\r\n    SetDlgItemText(IDC_PREPAREREDIT,g_ProjectSettings.m_szPreparer);\r\n    SetDlgItemText(IDC_SYSTEMEDIT,g_ProjectSettings.m_szSystem);\r\n    SetDlgItemText(IDC_VOLUMEEDIT,g_ProjectSettings.m_szVolumeSet);\r\n\r\n    SetDlgItemText(IDC_COPYRIGHTEDIT,g_ProjectSettings.m_szCopyright);\r\n    SetDlgItemText(IDC_ABSTRACTEDIT,g_ProjectSettings.m_szAbstract);\r\n    SetDlgItemText(IDC_BIBLIOGRAPHICEDIT,g_ProjectSettings.m_szBibliographic);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_fields_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropFieldsPage : public CPropertyPageImpl<CProjectPropFieldsPage>\r\n{\r\nprivate:\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPFIELDS };\r\n\r\n    CProjectPropFieldsPage();\r\n    ~CProjectPropFieldsPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropFieldsPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropFieldsPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_file_sys_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_file_sys_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nCProjectPropFileSysPage::CProjectPropFileSysPage()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_FILESYSTEM,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropFileSysPage::~CProjectPropFileSysPage()\r\n{\r\n}\r\n\r\nbool CProjectPropFileSysPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    if (pLng->GetValuePtr(IDC_FILESYSSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_FILESYSSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropFileSysPage::OnApply()\r\n{\r\n    g_ProjectSettings.m_iFileSystem = (int)m_FileSysCombo.GetItemData(m_FileSysCombo.GetCurSel());\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropFileSysPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropFileSysPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup the file system combo box.\r\n    m_FileSysCombo = GetDlgItem(IDC_FILESYSCOMBO);\r\n\r\n    int iIndex = 0;\r\n    m_FileSysCombo.AddString(_T(\"ISO9660\"));\r\n    m_FileSysCombo.SetItemData(iIndex++,FILESYSTEM_ISO);\r\n    m_FileSysCombo.AddString(_T(\"ISO9660 + UDF\"));\r\n    m_FileSysCombo.SetItemData(iIndex++,FILESYSTEM_ISO_UDF);\r\n    m_FileSysCombo.AddString(_T(\"ISO9660 + UDF (DVD-Video)\"));\r\n    m_FileSysCombo.SetItemData(iIndex++,FILESYSTEM_DVDVIDEO);\r\n    m_FileSysCombo.AddString(_T(\"UDF\"));\r\n    m_FileSysCombo.SetItemData(iIndex++,FILESYSTEM_UDF);\t\r\n\r\n    bool bFoundItem = false;\r\n    for (int i = 0; i < m_FileSysCombo.GetCount(); i++)\r\n    {\r\n        if (static_cast<int>(m_FileSysCombo.GetItemData(i)) == g_ProjectSettings.m_iFileSystem)\r\n        {\r\n            m_FileSysCombo.SetCurSel(i);\r\n            bFoundItem = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (!bFoundItem)\r\n        m_FileSysCombo.SetCurSel(0);\r\n\r\n    m_iSelFileSystem = g_ProjectSettings.m_iFileSystem;\r\n\r\n    if (g_ProjectSettings.m_bMultiSession)\r\n        m_FileSysCombo.EnableWindow(FALSE);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CProjectPropFileSysPage::OnFileSysChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ::SendMessage(GetParent(),WM_SETFILESYSTEM,m_iSelFileSystem,m_FileSysCombo.GetItemData(m_FileSysCombo.GetCurSel()));\r\n\r\n    m_iSelFileSystem = (int)m_FileSysCombo.GetItemData(m_FileSysCombo.GetCurSel());\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_file_sys_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropFileSysPage : public CPropertyPageImpl<CProjectPropFileSysPage>\r\n{\r\nprivate:\r\n    int m_iSelFileSystem;\t// To keep track of the previously selected file system.\r\n    CComboBox m_FileSysCombo;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPFILESYS };\r\n\r\n    CProjectPropFileSysPage();\r\n    ~CProjectPropFileSysPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropFileSysPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_HANDLER(IDC_FILESYSCOMBO,CBN_SELCHANGE,OnFileSysChange)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropFileSysPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnFileSysChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include \"project_prop_general_page.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"settings.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCProjectPropGeneralPage::CProjectPropGeneralPage()\r\n{\r\n    m_hIcon = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_GENERAL,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropGeneralPage::~CProjectPropGeneralPage()\r\n{\r\n    if (m_hIcon != NULL)\r\n        DestroyIcon(m_hIcon);\r\n}\r\n\r\nbool CProjectPropGeneralPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDC_TYPELABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TYPELABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_SIZELABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_SIZELABELSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_CONTAINSLABELSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_CONTAINSLABELSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropGeneralPage::OnApply()\r\n{\r\n    GetDlgItemText(IDC_NAMEEDIT,g_ProjectSettings.m_szLabel,127);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropGeneralPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nvoid CProjectPropGeneralPage::SetupDataProject()\r\n{\r\n    TCHAR szBuffer[64];\r\n\r\n    // Create the icon.\r\n    m_hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_DATAICON),\r\n        IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Label name.\r\n    SetDlgItemText(IDC_NAMEEDIT,g_ProjectSettings.m_szLabel);\r\n\r\n    // Type.\r\n    SetDlgItemText(IDC_TYPESTATIC,lngGetString(PROJECT_DATA));\r\n\r\n    // Size.\r\n    unsigned __int64 uiSize = g_ProjectManager.GetProjectSize();\r\n    TCHAR szSizeText[32];\r\n    FormatBytes(szBuffer,uiSize);\r\n    lsprintf(szSizeText,_T(\" (%I64d Bytes)\"),uiSize);\r\n    lstrcat(szBuffer,szSizeText);\r\n    SetDlgItemText(IDC_SIZESTATIC,szBuffer);\r\n\r\n    // Contents.\r\n    unsigned __int64 uiFileCount,uiFolderCount,uiTrackCount;\r\n    g_ProjectManager.GetProjectContents(uiFileCount,uiFolderCount,uiTrackCount);\r\n    lsnprintf_s(szBuffer,64,lngGetString(PROJECT_CONTENTS),uiFileCount,uiFolderCount,uiTrackCount);\r\n    SetDlgItemText(IDC_CONTAINSSTATIC,szBuffer);\r\n}\r\n\r\nvoid CProjectPropGeneralPage::SetupAudioProject()\r\n{\r\n    TCHAR szBuffer[64];\r\n\r\n    // Create the icon.\r\n    m_hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_AUDIOICON),\r\n        IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Label name.\r\n    SetDlgItemText(IDC_NAMEEDIT,lngGetString(MISC_NOTAVAILABLE));\r\n    ::EnableWindow(GetDlgItem(IDC_NAMEEDIT),false);\r\n\r\n    // Type.\r\n    SetDlgItemText(IDC_TYPESTATIC,lngGetString(PROJECT_AUDIO));\r\n\r\n    // Size.\r\n    lsnprintf_s(szBuffer,64,lngGetString(MISC_MINUTES),g_ProjectManager.GetProjectSize()/(1000 * 60));\r\n    SetDlgItemText(IDC_SIZESTATIC,szBuffer);\r\n\r\n    // Contents.\r\n    unsigned __int64 uiFileCount,uiFolderCount,uiTrackCount;\r\n    g_ProjectManager.GetProjectContents(uiFileCount,uiFolderCount,uiTrackCount);\r\n    lsnprintf_s(szBuffer,64,lngGetString(PROJECT_CONTENTS),uiFileCount,uiFolderCount,uiTrackCount);\r\n    SetDlgItemText(IDC_CONTAINSSTATIC,szBuffer);\r\n}\r\n\r\nvoid CProjectPropGeneralPage::SetupMixedProject()\r\n{\r\n    TCHAR szBuffer[64];\r\n\r\n    // Create the icon.\r\n    m_hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_MIXEDICON),\r\n        IMAGE_ICON,GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    SendMessage(GetDlgItem(IDC_ICONSTATIC),STM_SETICON,(WPARAM)m_hIcon,0L);\r\n\r\n    // Label name.\r\n    SetDlgItemText(IDC_NAMEEDIT,g_ProjectSettings.m_szLabel);\r\n\r\n    // Type.\r\n    SetDlgItemText(IDC_TYPESTATIC,lngGetString(PROJECT_MIXED));\r\n\r\n    // Size.\r\n    unsigned __int64 uiSize = g_ProjectManager.GetProjectSize();\r\n    TCHAR szSizeText[32];\r\n    FormatBytes(szBuffer,uiSize);\r\n    lsprintf(szSizeText,_T(\" (%I64d Bytes)\"),uiSize);\r\n    lstrcat(szBuffer,szSizeText);\r\n    SetDlgItemText(IDC_SIZESTATIC,szBuffer);\r\n\r\n    // Contents.\r\n    unsigned __int64 uiFileCount,uiFolderCount,uiTrackCount;\r\n    g_ProjectManager.GetProjectContents(uiFileCount,uiFolderCount,uiTrackCount);\r\n    lsnprintf_s(szBuffer,64,lngGetString(PROJECT_CONTENTS),uiFileCount,uiFolderCount,uiTrackCount);\r\n    SetDlgItemText(IDC_CONTAINSSTATIC,szBuffer);\r\n}\r\n\r\nLRESULT CProjectPropGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Set edit field length limit.\r\n    ::SendMessage(GetDlgItem(IDC_NAMEEDIT),EM_SETLIMITTEXT,127,0);\r\n\r\n    switch (g_ProjectManager.GetProjectType())\r\n    {\r\n        case PROJECTTYPE_AUDIO:\r\n            SetupAudioProject();\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            SetupMixedProject();\r\n            break;\r\n\r\n        case PROJECTTYPE_DATA:\r\n            SetupDataProject();\r\n            break;\r\n    };\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropGeneralPage : public CPropertyPageImpl<CProjectPropGeneralPage>\r\n{\r\nprivate:\r\n    HICON m_hIcon;\r\n\r\n    void SetupDataProject();\r\n    void SetupAudioProject();\r\n    void SetupMixedProject();\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPGENERAL };\r\n\r\n    CProjectPropGeneralPage();\r\n    ~CProjectPropGeneralPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_iso_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_iso_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n\r\nCProjectPropIsoPage::CProjectPropIsoPage()\r\n{\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropIsoPage::~CProjectPropIsoPage()\r\n{\r\n}\r\n\r\nbool CProjectPropIsoPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_LEVELSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_LEVELSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_LEVELSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_FORMATSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_FORMATSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_FORMATSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_CHARSETSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_CHARSETSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_CHARSETSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n    if (pLng->GetValuePtr(IDC_JOLIETCHECK,szStrValue))\r\n        SetDlgItemText(IDC_JOLIETCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_JOLIETLONGNAMESCHECK,szStrValue))\r\n        SetDlgItemText(IDC_JOLIETLONGNAMESCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_OMITVNCHECK,szStrValue))\r\n        SetDlgItemText(IDC_OMITVNCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DEEPDIRCHECK,szStrValue))\r\n        SetDlgItemText(IDC_DEEPDIRCHECK,szStrValue);\r\n\r\n    // Make sure that the edit controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_LEVELCOMBO,iMaxStaticRight);\r\n        UpdateEditPos(m_hWnd,IDC_FORMATCOMBO,iMaxStaticRight);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropIsoPage::OnApply()\r\n{\r\n    g_ProjectSettings.m_iIsoLevel = m_LevelCombo.GetCurSel();\r\n    g_ProjectSettings.m_iIsoFormat = m_FormatCombo.GetCurSel();\r\n    g_ProjectSettings.m_IsoCharSet = static_cast<CProjectSettings::IsoCharSet>(m_CharSetCombo.GetCurSel());\r\n    g_ProjectSettings.m_bJoliet = IsDlgButtonChecked(IDC_JOLIETCHECK) == TRUE;\r\n    g_ProjectSettings.m_bJolietLongNames = IsDlgButtonChecked(IDC_JOLIETLONGNAMESCHECK) == TRUE;\r\n    g_ProjectSettings.m_bOmitVerNum = IsDlgButtonChecked(IDC_OMITVNCHECK) == TRUE;\r\n    g_ProjectSettings.m_bDeepDirs = IsDlgButtonChecked(IDC_DEEPDIRCHECK) == TRUE;\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropIsoPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropIsoPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup the level combo box.\r\n    m_LevelCombo = GetDlgItem(IDC_LEVELCOMBO);\r\n    m_LevelCombo.AddString(lngGetString(PROJECTPROP_ISOLEVEL1));\r\n    m_LevelCombo.AddString(lngGetString(PROJECTPROP_ISOLEVEL2));\r\n    m_LevelCombo.AddString(lngGetString(PROJECTPROP_ISOLEVEL3));\r\n    m_LevelCombo.AddString(lngGetString(PROJECTPROP_ISOLEVEL4));\r\n    m_LevelCombo.SetCurSel(g_ProjectSettings.m_iIsoLevel);\r\n\r\n    // Format combo box.\r\n    m_FormatCombo = GetDlgItem(IDC_FORMATCOMBO);\r\n    m_FormatCombo.AddString(lngGetString(PROJECTPROP_MODE1));\r\n    m_FormatCombo.AddString(lngGetString(PROJECTPROP_MODE2));\r\n    m_FormatCombo.SetCurSel(g_ProjectSettings.m_iIsoFormat);\r\n\r\n    // Character set combo box.\r\n    m_CharSetCombo = GetDlgItem(IDC_CHARSETCOMBO);\r\n    m_CharSetCombo.AddString(lngGetString(PROJECTPROP_ISO_CHARSET_ISO));\r\n    m_CharSetCombo.AddString(_T(\"DOS\"));\r\n    m_CharSetCombo.AddString(_T(\"ASCII\"));\r\n    m_CharSetCombo.SetCurSel(g_ProjectSettings.m_IsoCharSet);\r\n\r\n    // Joliet.\r\n    CheckDlgButton(IDC_JOLIETCHECK,g_ProjectSettings.m_bJoliet);\r\n    CheckDlgButton(IDC_JOLIETLONGNAMESCHECK,g_ProjectSettings.m_bJolietLongNames);\r\n    ::EnableWindow(GetDlgItem(IDC_JOLIETLONGNAMESCHECK),g_ProjectSettings.m_bJoliet);\r\n\r\n    // Miscellaneous.\r\n    CheckDlgButton(IDC_OMITVNCHECK,g_ProjectSettings.m_bOmitVerNum);\r\n    CheckDlgButton(IDC_DEEPDIRCHECK,g_ProjectSettings.m_bDeepDirs);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CProjectPropIsoPage::OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    LRESULT lResult = DefWindowProc();\r\n\r\n    if (HIWORD(wParam) == BN_CLICKED)\r\n    {\r\n        // IDC_JOLIETCHECK clicked?\r\n        if (LOWORD(wParam) == IDC_JOLIETCHECK)\r\n        {\r\n            bool bJoliet = IsDlgButtonChecked(IDC_JOLIETCHECK) == TRUE;\r\n            ::EnableWindow(GetDlgItem(IDC_JOLIETLONGNAMESCHECK),bJoliet);\r\n        }\r\n    }\r\n\r\n    bHandled = false;\r\n    return lResult;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_iso_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropIsoPage : public CPropertyPageImpl<CProjectPropIsoPage>\r\n{\r\nprivate:\r\n    CComboBox m_LevelCombo;\r\n    CComboBox m_FormatCombo;\r\n    CComboBox m_CharSetCombo;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPISO };\r\n\r\n    CProjectPropIsoPage();\r\n    ~CProjectPropIsoPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropIsoPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_COMMAND,OnCommand)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropIsoPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_udf_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_prop_udf_page.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n\r\nCProjectPropUdfPage::CProjectPropUdfPage()\r\n{\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCProjectPropUdfPage::~CProjectPropUdfPage()\r\n{\r\n}\r\n\r\nbool CProjectPropUdfPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a projectprop translation section.\r\n    if (!pLng->EnterSection(_T(\"projectprop\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    if (pLng->GetValuePtr(IDC_VERSIONSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_VERSIONSTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nbool CProjectPropUdfPage::OnApply()\r\n{\r\n    return true;\r\n}\r\n\r\nvoid CProjectPropUdfPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/working_with_projects/project_settings.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nLRESULT CProjectPropUdfPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup the version combo box.\r\n    CComboBox VersionCombo = GetDlgItem(IDC_VERSIONCOMBO);\r\n    VersionCombo.AddString(_T(\"1.02\"));\r\n    VersionCombo.SetCurSel(0);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/project_prop_udf_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CProjectPropUdfPage : public CPropertyPageImpl<CProjectPropUdfPage>\r\n{\r\nprivate:\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_PROJECTPROPUDF };\r\n\r\n    CProjectPropUdfPage();\r\n    ~CProjectPropUdfPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CProjectPropUdfPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CProjectPropUdfPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/read_options_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/util.hh>\r\n#include \"read_options_page.hh\"\r\n#include \"ctrl_messages.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"core2.hh\"\r\n#include \"core2_util.hh\"\r\n#include \"version.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"visual_styles.hh\"\r\n\r\nCReadOptionsPage::CReadOptionsPage(bool bEnableClone,bool bEnableSpeed)\r\n{\r\n    m_bEnableClone = bEnableClone;\r\n    m_bEnableSpeed = bEnableSpeed;\r\n    m_hRefreshIcon = NULL;\r\n    m_hRefreshImageList = NULL;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TITLE_READ,szStrValue))\r\n                SetTitle(szStrValue);\r\n        }\r\n    }\r\n\r\n    m_psp.dwFlags |= PSP_HASHELP;\r\n}\r\n\r\nCReadOptionsPage::~CReadOptionsPage()\r\n{\r\n    if (m_hRefreshImageList != NULL)\r\n        ImageList_Destroy(m_hRefreshImageList);\r\n\r\n    if (m_hRefreshIcon != NULL)\r\n        DestroyIcon(m_hRefreshIcon);\r\n}\r\n\r\nbool CReadOptionsPage::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a burn translation section.\r\n    if (!pLng->EnterSection(_T(\"read\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n    int iMaxStaticRight = 0;\r\n\r\n    if (pLng->GetValuePtr(IDC_NOREADERRCHECK,szStrValue))\r\n        SetDlgItemText(IDC_NOREADERRCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_READSUBCHANNELCHECK,szStrValue))\r\n        SetDlgItemText(IDC_READSUBCHANNELCHECK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_READSPEEDSTATIC,szStrValue))\r\n    {\r\n        SetDlgItemText(IDC_READSPEEDSTATIC,szStrValue);\r\n\r\n        // Update the static width if necessary.\r\n        int iStaticRight = UpdateStaticWidth(m_hWnd,IDC_READSPEEDSTATIC,szStrValue);\r\n        if (iStaticRight > iMaxStaticRight)\r\n            iMaxStaticRight = iStaticRight;\r\n    }\r\n\r\n    // Make sure that the edit/combo controls are not in the way of the statics.\r\n    if (iMaxStaticRight > 75)\r\n        UpdateEditPos(m_hWnd,IDC_READSPEEDCOMBO,iMaxStaticRight,true);\r\n\r\n    return true;\r\n}\r\n\r\nbool CReadOptionsPage::OnApply()\r\n{\r\n    // Remember the configuration.\r\n    g_ReadSettings.m_bIgnoreErr = IsDlgButtonChecked(IDC_NOREADERRCHECK) == TRUE;\r\n    g_ReadSettings.m_bClone = IsDlgButtonChecked(IDC_READSUBCHANNELCHECK) == TRUE;\r\n    g_ReadSettings.m_iReadSpeed = m_ReadSpeedCombo.GetItemData(m_ReadSpeedCombo.GetCurSel());\r\n\r\n    return true;\r\n}\r\n\r\nvoid CReadOptionsPage::OnHelp()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/read_options.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n}\r\n\r\nvoid CReadOptionsPage::UpdateSpeeds()\r\n{\r\n    ckmmc::Device &Device =\r\n        *reinterpret_cast<ckmmc::Device *>(::SendMessage(GetParent(),WM_GETDEVICE,1,0));\r\n\r\n    // Maximum read speed.\r\n    m_ReadSpeedCombo.ResetContent();\r\n    m_ReadSpeedCombo.AddString(lngGetString(MISC_MAXIMUM));\r\n    m_ReadSpeedCombo.SetItemData(0,0xFFFFFFFF);\r\n    m_ReadSpeedCombo.SetCurSel(0);\r\n\r\n    // Get current profile.\r\n    ckmmc::Device::Profile Profile = Device.profile();\r\n    if (Profile != ckmmc::Device::ckPROFILE_NONE)\r\n    {\r\n        const std::vector<ckcore::tuint32> &ReadSpeeds = Device.read_speeds();\r\n\r\n        std::vector<ckcore::tuint32>::const_iterator it;\r\n        for (it = ReadSpeeds.begin(); it != ReadSpeeds.end(); it++)\r\n        {\r\n            m_ReadSpeedCombo.AddString(ckmmc::util::kb_to_disp_speed(*it,Profile).c_str());\r\n            m_ReadSpeedCombo.SetItemData(m_ReadSpeedCombo.GetCount() - 1,\r\n                static_cast<DWORD_PTR>(ckmmc::util::kb_to_human_speed(*it,\r\n                                       ckmmc::Device::ckPROFILE_CDR)));\r\n        }\r\n    }\r\n}\r\n\r\nvoid CReadOptionsPage::CheckMedia()\r\n{\r\n    if (m_bEnableSpeed)\r\n    {\r\n        UpdateSpeeds();\r\n    }\r\n    else\r\n    {\r\n        m_ReadSpeedCombo.ResetContent();\r\n        m_ReadSpeedCombo.AddString(lngGetString(MISC_AUTO));\r\n        m_ReadSpeedCombo.SetCurSel(0);\r\n    }\r\n}\r\n\r\nLRESULT CReadOptionsPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    m_ReadSpeedCombo = GetDlgItem(IDC_READSPEEDCOMBO);\r\n\r\n    CheckDlgButton(IDC_NOREADERRCHECK,g_ReadSettings.m_bIgnoreErr);\r\n\r\n    // Enable/disable options.\r\n    if (!m_bEnableClone)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_READSUBCHANNELCHECK),FALSE);\r\n        CheckDlgButton(IDC_READSUBCHANNELCHECK,m_bCloneCheck);\r\n    }\r\n    else\r\n    {\r\n        CheckDlgButton(IDC_READSUBCHANNELCHECK,g_ReadSettings.m_bClone);\r\n    }\r\n\r\n    if (!m_bEnableSpeed)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_READSPEEDSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_READSPEEDCOMBO),FALSE);\r\n    }\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CReadOptionsPage::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if ((BOOL)wParam == TRUE)\r\n        CheckMedia();\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nLRESULT CReadOptionsPage::OnCheckMedia(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CheckMedia();\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n\r\nvoid CReadOptionsPage::SetCloneMode(bool bEnable)\r\n{\r\n    m_bCloneCheck = bEnable;\r\n\r\n    if (IsWindow())\r\n        CheckDlgButton(IDC_READSUBCHANNELCHECK,bEnable);\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/read_options_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"ctrl_messages.hh\"\r\n\r\nclass CReadOptionsPage : public CPropertyPageImpl<CReadOptionsPage>\r\n{\r\nprivate:\r\n    bool m_bEnableClone;\r\n    bool m_bEnableSpeed;\r\n    bool m_bCloneCheck;\t\t// The initial state of the read subchannel data.\r\n    HICON m_hRefreshIcon;\r\n    HIMAGELIST m_hRefreshImageList;\r\n    CComboBox m_ReadSpeedCombo;\r\n\r\n    bool Translate();\r\n    void UpdateSpeeds();\r\n    void CheckMedia();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_READOPTIONS };\r\n\r\n    CReadOptionsPage(bool bEnableClone,bool bEnableSpeed);\r\n    ~CReadOptionsPage();\r\n\r\n    bool OnApply();\r\n    void OnHelp();\r\n\r\n    BEGIN_MSG_MAP(CReadOptionsPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        MESSAGE_HANDLER(WM_CHECKMEDIA,OnCheckMedia)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CReadOptionsPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnCheckMedia(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void SetCloneMode(bool bEnable);\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/save_tracks_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include \"save_tracks_dlg.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCSaveTracksDlg::CSaveTracksDlg()\r\n{\r\n    m_pEncoder = NULL;\r\n}\r\n\r\nCSaveTracksDlg::~CSaveTracksDlg()\r\n{\r\n}\r\n\r\nbool CSaveTracksDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a edittrack translation section.\r\n    if (!pLng->EnterSection(_T(\"savetracks\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDD_SAVETRACKSDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDC_TARGETSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_TARGETSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_AUDIOFORMATSTATIC,szStrValue))\r\n        SetDlgItemText(IDC_AUDIOFORMATSTATIC,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_AUDIOFORMATBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_AUDIOFORMATBUTTON,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Setup the target edit control.\r\n    ::SendMessage(GetDlgItem(IDC_TARGETEDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n    SetDlgItemText(IDC_TARGETEDIT,g_SaveTracksSettings.m_szTarget);\r\n\r\n    // Setup the audio format combo box.\r\n    m_AudioFormatCombo = GetDlgItem(IDC_AUDIOFORMATCOMBO);\r\n    m_AudioFormatCombo.ResetContent();\r\n\r\n    // The first item is always wave. Not the wave encoder, but the cdrtools\r\n    // default encoder.\r\n    m_AudioFormatCombo.AddString(_T(\"Wave\"));\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        // Skip any installed wave codecs since cdrtools has its own.\r\n        if (!lstrcmp(g_CodecManager.m_Codecs[i]->irc_string(IRC_STR_FILEEXT),_T(\".wav\")))\r\n            continue;\r\n\r\n        if (g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_ENCODER)\r\n        {\r\n            m_AudioFormatCombo.AddString(g_CodecManager.m_Codecs[i]->irc_string(IRC_STR_ENCODER));\r\n            m_AudioFormatCombo.SetItemData(m_AudioFormatCombo.GetCount() - 1,(DWORD_PTR)g_CodecManager.m_Codecs[i]);\r\n        }\r\n    }\r\n\r\n    m_AudioFormatCombo.SetCurSel(0);\r\n    ::EnableWindow(GetDlgItem(IDC_AUDIOFORMATBUTTON),FALSE);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Target folder.\r\n    TCHAR szFolderPath[MAX_PATH];\r\n    GetDlgItemText(IDC_TARGETEDIT,szFolderPath,MAX_PATH - 1);\r\n\r\n    if (szFolderPath == NULL || lstrlen(szFolderPath) < 3 || szFolderPath[1] != ':')\r\n    {\r\n        MessageBox(lngGetString(ERROR_TARGETFOLDER),lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return FALSE;\r\n    }\r\n\r\n    // Check if the target path exist.\r\n    const ckcore::Path Path(szFolderPath);\r\n    if (!ckcore::Directory::exist(Path))\r\n    {\r\n        if (MessageBox(lngSlowFormatStr(CONFIRM_CREATE_DIR_PATH,szFolderPath).c_str(),\r\n                       lngGetString(GENERAL_QUESTION),\r\n                       MB_YESNO | MB_ICONQUESTION) != IDYES)\r\n        {\r\n            return FALSE;\r\n        }\r\n\r\n        if (!ckcore::Directory::create(Path))\r\n        {\r\n            MessageBox(lngSlowFormatStr(CANNOT_CREATE_DIR_PATH,szFolderPath).c_str(),\r\n                       lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n            return FALSE;\r\n        }\r\n    }\r\n\r\n    lstrcpy(g_SaveTracksSettings.m_szTarget,szFolderPath);\r\n\r\n    // Encoder.\r\n    if (m_AudioFormatCombo.GetCurSel() == 0)\r\n        m_pEncoder = NULL;\r\n    else\r\n        m_pEncoder = (CCodec *)m_AudioFormatCombo.GetItemData(m_AudioFormatCombo.GetCurSel());\r\n\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnAudioFormatChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (m_AudioFormatCombo.GetCurSel() == 0)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_AUDIOFORMATBUTTON),FALSE);\r\n    }\r\n    else\r\n    {\r\n        CCodec *pEncoder = (CCodec *)m_AudioFormatCombo.GetItemData(m_AudioFormatCombo.GetCurSel());\r\n        ::EnableWindow(GetDlgItem(IDC_AUDIOFORMATBUTTON),pEncoder->irc_capabilities() & IRC_HAS_CONFIG);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnClickedAudioFormatButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // This should never happen.\r\n    if (m_AudioFormatCombo.GetCurSel() == 0)\r\n        return 0;\r\n\r\n    CCodec *pEncoder = (CCodec *)m_AudioFormatCombo.GetItemData(m_AudioFormatCombo.GetCurSel());\r\n    pEncoder->irc_encode_config();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSaveTracksDlg::OnClickedBrowseButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CFolderDialog FolderDialog(m_hWnd,lngGetString(MISC_SPECIFYTRACKFOLDER),BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS);\r\n    \r\n    if (FolderDialog.DoModal() == IDOK)\r\n        SetDlgItemText(IDC_TARGETEDIT,FolderDialog.GetFolderPath());\r\n\r\n    return 0;\r\n}\r\n\r\nCCodec *CSaveTracksDlg::GetEncoder()\r\n{\r\n    return m_pEncoder;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/save_tracks_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"infrarecorder.hh\"\r\n\r\nclass CSaveTracksDlg : public CDialogImpl<CSaveTracksDlg>\r\n{\r\nprivate:\r\n    CComboBox m_AudioFormatCombo;\r\n    CCodec *m_pEncoder;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_SAVETRACKSDLG };\r\n\r\n    CSaveTracksDlg();\r\n    ~CSaveTracksDlg();\r\n\r\n    BEGIN_MSG_MAP(CSaveTracksDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_HANDLER(IDC_AUDIOFORMATCOMBO,CBN_SELCHANGE,OnAudioFormatChange)\r\n        COMMAND_HANDLER(IDC_AUDIOFORMATBUTTON,BN_CLICKED,OnClickedAudioFormatButton)\r\n        COMMAND_HANDLER(IDC_BROWSEBUTTON,BN_CLICKED,OnClickedBrowseButton)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnAudioFormatChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnClickedAudioFormatButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnClickedBrowseButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    CCodec *GetEncoder();\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/simple_progress_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <comutil.h>\r\n#include <base/string_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"device_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"version.hh\"\r\n#include \"simple_progress_dlg.hh\"\r\n\r\nstatic const int SUBITEM_TEXT = 1;\r\n\r\nCSimpleProgressDlg::CSimpleProgressDlg() : m_pProcess(NULL),m_bAppMode(false),\r\n    m_bRealMode(false),m_bCancelled(false),m_hWndHost(NULL)\r\n{\r\n    // Load the icons.\r\n    m_hListImageList = ImageList_Create(16,16,ILC_COLOR32,0,4);\r\n\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_INFORMATION));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_WARNING));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_ERROR));\r\n    ImageList_AddIcon(m_hListImageList,LoadIcon(NULL,IDI_WINLOGO));\r\n\r\n    SMOKE_INIT\r\n}\r\n\r\nCSimpleProgressDlg::~CSimpleProgressDlg()\r\n{\r\n    if (m_hListImageList != NULL)\r\n        ImageList_Destroy(m_hListImageList);\r\n}\r\n\r\nBOOL CSimpleProgressDlg::PreTranslateMessage(MSG *pMsg)\r\n{\r\n    return CWindow::IsDialogMessage(pMsg);\r\n}\r\n\r\nBOOL CSimpleProgressDlg::OnIdle()\r\n{\r\n    return FALSE;\r\n}\r\n\r\nbool CSimpleProgressDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a progress translation section.\r\n    if (!pLng->EnterSection(_T(\"progress\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDCANCEL,szStrValue))\r\n        SetDlgItemText(IDCANCEL,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_RELOADBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_RELOADBUTTON,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nvoid CSimpleProgressDlg::AttachProcess(ckcore::Process *pProcess)\r\n{\r\n    m_pProcess = pProcess;\r\n}\r\n\r\nvoid CSimpleProgressDlg::AttachHost(HWND hWndHost)\r\n{\r\n    m_hWndHost = hWndHost;\r\n}\r\n\r\nvoid CSimpleProgressDlg::SetAppMode(bool bAppMode)\r\n{\r\n    m_bAppMode = bAppMode;\r\n}\r\n\r\nvoid CSimpleProgressDlg::SetRealMode(bool bRealMode)\r\n{\r\n    m_bRealMode = bRealMode;\r\n}\r\n\r\nvoid CSimpleProgressDlg::set_status(const TCHAR *szStatus,...)\r\n{\r\n    // Prepare the string.\r\n    TCHAR szStatusStr[256];\r\n    lstrcpy(szStatusStr,lngGetString(PROGRESS_STATUS));\r\n\r\n    unsigned int uiFreeSpace = sizeof(szStatusStr)/sizeof(TCHAR) - lstrlen(szStatusStr) - 1;\r\n    if ((unsigned int)lstrlen(szStatus) > uiFreeSpace)\r\n        lstrncat(szStatusStr,szStatus,uiFreeSpace);\r\n    else\r\n        lstrcat(szStatusStr,szStatus);\r\n\r\n    // Parse the variable argument list.\r\n    va_list args;\r\n    va_start(args,szStatus);\r\n\r\n    _vsnwprintf(m_szStringBuffer,PROGRESS_STRINGBUFFER_SIZE - 1,szStatusStr,args);\r\n\r\n    SetDlgItemText(IDC_STATUSSTATIC,m_szStringBuffer);\r\n}\r\n\r\nvoid CSimpleProgressDlg::notify(ckcore::Progress::MessageType Type,const TCHAR *szMessage,...)\r\n{\r\n    int iItemIndex = m_ListView.GetItemCount();\r\n\r\n    // Time.\r\n    SYSTEMTIME st;\r\n    GetLocalTime(&st);\r\n\r\n    TCHAR szTime[9];\t// xx:yy:zz\r\n    lsprintf(szTime,_T(\"%.2d:%.2d:%.2d\"),st.wHour,st.wMinute,st.wSecond);\r\n    szTime[8] = '\\0';\r\n\r\n    // Convert the log type to an index.\r\n    int iImageIndex = 0;\r\n    switch (Type)\r\n    {\r\n        case ckcore::Progress::ckINFORMATION:\r\n            iImageIndex = 0;\r\n            break;\r\n        case ckcore::Progress::ckWARNING:\r\n            iImageIndex = 1;\r\n            break;\r\n        case ckcore::Progress::ckERROR:\r\n            iImageIndex = 2;\r\n            break;\r\n        case ckcore::Progress::ckEXTERNAL:\r\n            iImageIndex = 3;\r\n            break;\r\n    }\r\n\r\n    m_ListView.AddItem(iItemIndex,0,szTime,iImageIndex);\r\n\r\n    // Parse the variable argument list.\r\n    va_list args;\r\n    va_start(args,szMessage);\r\n\r\n    _vsnwprintf(m_szStringBuffer,PROGRESS_STRINGBUFFER_SIZE - 1,szMessage,args);\r\n\r\n    m_ListView.AddItem(iItemIndex,SUBITEM_TEXT,m_szStringBuffer);\r\n\r\n    m_ListView.SetColumnWidth(SUBITEM_TEXT,LVSCW_AUTOSIZE);\r\n    m_ListView.EnsureVisible(iItemIndex,false);\r\n}\r\n\r\nbool CSimpleProgressDlg::cancelled()\r\n{\r\n    return m_bCancelled;\r\n}\r\n\r\nvoid CSimpleProgressDlg::SetDevice(ckmmc::Device &Device)\r\n{\r\n    ckcore::tstring DeviceStr = lngGetString(PROGRESS_DEVICE);\r\n    DeviceStr += NDeviceUtil::GetDeviceName(Device);\r\n\r\n    SetDlgItemText(IDC_DEVICESTATIC,DeviceStr.c_str());\r\n}\r\n\r\nvoid CSimpleProgressDlg::NotifyCompleted()\r\n{\r\n    ::EnableWindow(GetDlgItem(IDOK),true);\r\n    SendMessage(WM_NEXTDLGCTL,(WPARAM)::GetDlgItem(m_hWnd,IDOK),0);\t// Change default focus to the OK button.\r\n    ::EnableWindow(GetDlgItem(IDCANCEL),false);\r\n\r\n    if (m_bCancelled)\r\n    {\r\n        set_status(lngGetString(PROGRESS_CANCELED));\r\n        notify(ckcore::Progress::ckWARNING,lngGetString(PROGRESS_CANCELED));\r\n    }\r\n\r\n    SMOKE_STOP\r\n}\r\n\r\nvoid CSimpleProgressDlg::AllowReload()\r\n{\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_SHOW);\r\n}\r\n\r\nvoid CSimpleProgressDlg::AllowCancel(bool bAllow)\r\n{\r\n    ::EnableWindow(GetDlgItem(IDCANCEL),bAllow);\r\n}\r\n\r\nvoid CSimpleProgressDlg::Reset()\r\n{\r\n    m_bRealMode = false;\r\n    m_bCancelled = false;\r\n}\r\n\r\nbool CSimpleProgressDlg::RequestNextDisc()\r\n{\r\n    return lngMessageBox(m_hWnd,INFO_NEXTCOPY,GENERAL_INFORMATION,MB_OKCANCEL | MB_ICONINFORMATION) == IDOK;\r\n}\r\n\r\nvoid CSimpleProgressDlg::StartSmoke()\r\n{\r\n    SMOKE_START\r\n}\r\n\r\nLRESULT CSimpleProgressDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    DlgResize_Init();\r\n\r\n    CenterWindow(GetParent());\r\n\r\n    // If we're in application mode, add a minimize button to the window.\r\n    // UPDATE: This does not work, nor is it a good idea regarding the smoke effect.\r\n    /*if (m_bAppMode)\r\n        ModifyStyle(0,WS_MINIMIZEBOX,0);*/\r\n\r\n    // Initialize the list view.\r\n    m_ListView = GetDlgItem(IDC_MESSAGELIST);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_NORMAL);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_SMALL);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    m_ListView.AddColumn(lngGetString(COLUMN_TIME),0);\r\n    m_ListView.SetColumnWidth(0,70);\r\n    m_ListView.AddColumn(lngGetString(COLUMN_EVENT),1);\r\n    m_ListView.SetColumnWidth(1,350);\r\n\r\n    // Disable the OK button.\r\n    ::EnableWindow(GetDlgItem(IDOK),false);\r\n    ::EnableWindow(GetDlgItem(IDCANCEL),true);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CSimpleProgressDlg::OnReload(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Send a CR-LF message to inform CD-tools that the drive has been reloaded.\r\n    if (m_pProcess != NULL)\r\n        m_pProcess->write(\"\\r\\n\",2);\r\n\r\n    // Hide the reload button.\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_HIDE);\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CSimpleProgressDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Re-enable the main window.\r\n    //g_MainFrame->EnableWindow(true);\r\n    if (::IsWindow(m_hWndHost))\r\n        ::EnableWindow(m_hWndHost,true);\r\n\r\n    DestroyWindow();\r\n\r\n    // If we're in application mode we post a quit message.\r\n    if (m_bAppMode)\r\n        ::PostQuitMessage(wID);\r\n\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CSimpleProgressDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Make sure that we're allowed to cancel.\r\n    if (!::IsWindowEnabled(GetDlgItem(IDCANCEL)))\r\n        return TRUE;\r\n\r\n    // If we're in real mode we dispay a warning message informing the user that\r\n    // aborting might permanently damage the CD.\r\n    if (m_bRealMode)\r\n    {\r\n        if (lngMessageBox(m_hWnd,CONFIRM_WRITECANCEL,GENERAL_WARNING,MB_YESNO | MB_ICONWARNING) == IDNO)\r\n            return TRUE;\r\n    }\r\n\r\n    m_bCancelled = true;\r\n\r\n    if (m_pProcess != NULL)\r\n        m_pProcess->kill();\r\n\r\n    // Hide the reload button.\r\n    ::ShowWindow(GetDlgItem(IDC_RELOADBUTTON),SW_HIDE);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CSimpleProgressDlg::OnListViewDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    ATLASSERT(iCtrlID == IDC_MESSAGELIST);\r\n    LPNMITEMACTIVATE pItemActivate = (LPNMITEMACTIVATE)pNMH;\r\n\r\n    _bstr_t LineText;\r\n    m_ListView.GetItemText(pItemActivate->iItem,SUBITEM_TEXT,LineText.GetBSTR());\r\n\r\n    MessageBox(LineText,_T(\"Log line\"),MB_OK | MB_ICONINFORMATION);\r\n\r\n    bHandled = TRUE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/simple_progress_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/process.hh>\r\n#include <ckmmc/device.hh>\r\n#include \"resource.h\"\r\n#include \"advanced_progress.hh\"\r\n#include \"effects.hh\"\r\n#include \"version.hh\"\r\n\r\nclass CSimpleProgressDlg : public CDialogImpl<CSimpleProgressDlg>,\r\n                           public CDialogResize<CSimpleProgressDlg>,\r\n                           public CAdvancedProgress,public CMessageFilter,\r\n                           public CIdleHandler\r\n{\r\nprivate:\r\n    HIMAGELIST m_hListImageList;\r\n    CListViewCtrl m_ListView;\r\n\r\n    ckcore::Process *m_pProcess;\r\n    bool m_bAppMode;\r\n    bool m_bRealMode;\r\n    bool m_bCancelled;\r\n\r\n    HWND m_hWndHost;\r\n\r\n    bool Translate();\r\n\r\npublic:\r\n    enum { IDD = IDD_SIMPLEPROGRESSDLG };\r\n\r\n    CSimpleProgressDlg();\r\n    ~CSimpleProgressDlg();\r\n\r\n    virtual BOOL PreTranslateMessage(MSG *pMsg);\r\n    virtual BOOL OnIdle();\r\n\r\n    void AttachProcess(ckcore::Process *pProcess);\r\n    void AttachHost(HWND hWndHost);\r\n\r\n    void SetAppMode(bool bAppMode);\r\n    void SetRealMode(bool bRealMode);\r\n\r\n    // ckcore::Progress.\r\n    void set_status(const TCHAR *szStatus,...);\r\n    void notify(ckcore::Progress::MessageType Type,const TCHAR *szMessage,...);\r\n    bool cancelled();\r\n\r\n    void SetDevice(ckmmc::Device &Device);\r\n\r\n    void NotifyCompleted();\r\n\r\n    void AllowReload();\r\n    void AllowCancel(bool bAllow);\r\n\r\n    void Reset();\r\n\r\n    bool RequestNextDisc();\r\n\r\n    void StartSmoke();\r\n\r\n    BEGIN_MSG_MAP(CSimpleProgressDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDC_RELOADBUTTON,OnReload)\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n\r\n        NOTIFY_HANDLER(IDC_MESSAGELIST,NM_DBLCLK,OnListViewDblClick)\r\n\r\n        SMOKE_EVENTS\r\n\r\n        CHAIN_MSG_MAP(CDialogResize<CSimpleProgressDlg>)\r\n    END_MSG_MAP()\r\n\r\n    // Resize maps.\r\n    BEGIN_DLGRESIZE_MAP(CSimpleProgressDlg)\r\n        DLGRESIZE_CONTROL(IDC_STATUSSTATIC,DLSZ_SIZE_X)\r\n        DLGRESIZE_CONTROL(IDC_MESSAGELIST,DLSZ_SIZE_X | DLSZ_SIZE_Y)\r\n        DLGRESIZE_CONTROL(IDC_BEVELSTATIC,DLSZ_SIZE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_DEVICESTATIC,DLSZ_SIZE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDOK,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDCANCEL,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_RELOADBUTTON,DLSZ_MOVE_X | DLSZ_MOVE_Y)\r\n    END_DLGRESIZE_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnReload(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnListViewDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    SMOKE_IMPL\r\n};\r\n\r\nextern CSimpleProgressDlg * g_pSimpleProgressDlg;"
  },
  {
    "path": "src/app/dialog/splash_window.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/graph_util.hh>\r\n#include \"resource.h\"\r\n#include \"infrarecorder.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"splash_window.hh\"\r\n\r\nCSplashWindow::CSplashWindow()\r\n{\r\n    m_hTextBkBrush = ::CreateSolidBrush(SPLASHWINDOW_TEXTBKCOLOR);\r\n\r\n    // Load the function dynamically.\r\n    HMODULE hUser32 = GetModuleHandle(_T(\"USER32.DLL\"));\r\n    m_pUpdateLayeredWindow = (tUpdateLayeredWindow)GetProcAddress(hUser32,\"UpdateLayeredWindow\");\r\n\r\n    // Load a 32-bit transparent bitmap for Windows 2000 and newer systems.\r\n    if (m_pUpdateLayeredWindow != NULL)\r\n        LoadBitmap();\r\n}\r\n\r\nCSplashWindow::~CSplashWindow()\r\n{\r\n    ::DeleteObject(m_hTextBkBrush);\r\n}\r\n\r\nLRESULT CSplashWindow::OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    SIZE sSplashBitmap;\r\n    m_SplashBitmap.GetSize(sSplashBitmap);\r\n    SetWindowPos(HWND_TOPMOST,0,0,sSplashBitmap.cx,sSplashBitmap.cy,SWP_NOMOVE);\r\n\r\n    CenterWindow(HWND_DESKTOP);\r\n\r\n    // For per-pixel alpha transparency the window needs to be layered.\r\n    if (m_pUpdateLayeredWindow != NULL)\r\n        ModifyStyleEx(0,WS_EX_LAYERED);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CSplashWindow::OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CPaintDC dc(m_hWnd);\r\n\r\n    if (m_pUpdateLayeredWindow == NULL)\r\n        return 0;\r\n\r\n    RECT rcClient;\r\n    GetClientRect(&rcClient);\r\n\r\n    HDC hMemDC = CreateCompatibleDC(dc);\r\n    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC,m_SplashBitmap);\r\n\r\n    DrawText(hMemDC);\r\n    DrawBitmap(dc,hMemDC);\r\n\r\n    SelectObject(hMemDC,hOldBitmap);\r\n\r\n    ReleaseDC(dc);\r\n    ReleaseDC(hMemDC);\r\n\r\n    return 0;\r\n}\r\n\r\nvoid CSplashWindow::DrawBitmap(HDC hScreenDC,HDC hMemDC)\r\n{\r\n    SIZE sSplashBitmap;\r\n    m_SplashBitmap.GetSize(sSplashBitmap);\r\n\r\n    // Calculate window dimensions.\r\n    RECT rcWindow;\r\n    GetWindowRect(&rcWindow);\r\n\r\n    POINT ptWindowPos;\r\n    ptWindowPos.x = rcWindow.left;\r\n    ptWindowPos.y = rcWindow.top;\r\n\r\n    BLENDFUNCTION bfPixelFunction = { AC_SRC_OVER,0,255,AC_SRC_ALPHA };\r\n    POINT ptSource = { 0,0 };\r\n\r\n    m_pUpdateLayeredWindow(m_hWnd,hScreenDC,&ptWindowPos,&sSplashBitmap,hMemDC,&ptSource,0,&bfPixelFunction,ULW_ALPHA);\r\n}\r\n\r\nvoid CSplashWindow::DrawText(HDC hDC)\r\n{\r\n    HFONT hOldFont = (HFONT)SelectObject(hDC,AtlGetDefaultGuiFont());\r\n\r\n    // Calculate the text height.\r\n    SIZE sTextSize;\r\n    GetTextExtentPoint32(hDC,m_InfoText.c_str(),\r\n                         static_cast<int>(m_InfoText.size()),&sTextSize);\r\n\r\n    RECT rcText = { 33,125,280,125 + sTextSize.cy };\r\n\r\n    // Do the actual drawing.\r\n    FillRect(hDC,&rcText,m_hTextBkBrush);\r\n\r\n    ::SetBkColor(hDC,SPLASHWINDOW_TEXTBKCOLOR);\r\n    ::SetTextColor(hDC,::GetSysColor(COLOR_WINDOWTEXT));\r\n\r\n    ::DrawText(hDC,m_InfoText.c_str(),\r\n               static_cast<int>(m_InfoText.size()),&rcText,\r\n               DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE);\r\n\r\n    SelectObject(hDC,hOldFont);\r\n    \r\n    // Get bitmap information.\r\n    BITMAP bmpInfo;\r\n    m_SplashBitmap.GetBitmap(&bmpInfo);\r\n\r\n    // Since the regular GDI functions (with a few exceptions) clear the alpha bit\r\n    // when they are used we need to set it, since we don't want to draw\r\n    // transparent text.\r\n    unsigned char *pDataBits = (unsigned char *)bmpInfo.bmBits;\r\n\r\n    int iStart = bmpInfo.bmHeight - rcText.bottom;\r\n    int iEnd = bmpInfo.bmHeight - rcText.top;\r\n\r\n    for (int y = iStart; y < iEnd; y++)\r\n    {\r\n        unsigned char *pPixel = pDataBits + bmpInfo.bmWidth * 4 * y;\r\n\r\n        pPixel += 4 * rcText.left;\r\n\r\n        for (int x = rcText.left; x < rcText.right; x++)\r\n        {\r\n            pPixel[3] = 0xFF;\r\n            pPixel += 4;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CSplashWindow::SetInfoText(const TCHAR *szInfoText)\r\n{\r\n    m_InfoText = szInfoText;\r\n\r\n    // Force redraw.\r\n    InvalidateRect(NULL);\r\n\r\n    // Process the message queue.\r\n    ProcessMessages();\r\n}\r\n\r\nvoid CSplashWindow::LoadBitmap()\r\n{\r\n    // Load the bitmap.\r\n    HBITMAP hBitmap = (HBITMAP)LoadImage(_Module.GetModuleInstance(),MAKEINTRESOURCE(IDB_SPLASHBITMAP),\r\n        IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);\r\n    m_SplashBitmap.Attach(hBitmap);\r\n\r\n    // Precaclulate multiply the transparency.\r\n    BITMAP bmpInfo;\r\n    m_SplashBitmap.GetBitmap(&bmpInfo);\r\n\r\n    unsigned char *pDataBits = (unsigned char *)bmpInfo.bmBits;\r\n\r\n    for (int y = 0; y < bmpInfo.bmHeight; y++)\r\n    {\r\n        unsigned char *pPixel = pDataBits + bmpInfo.bmWidth * 4 * y;\r\n\r\n        for (int x = 0; x < bmpInfo.bmWidth; x++)\r\n        {\r\n            pPixel[0] = pPixel[0] * pPixel[3] / 255;\r\n            pPixel[1] = pPixel[1] * pPixel[3] / 255;\r\n            pPixel[2] = pPixel[2] * pPixel[3] / 255;\r\n\r\n            pPixel += 4;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CSplashWindow::event_status(ckmmc::DeviceManager::ScanCallback::Status Status)\r\n{\r\n    if (Status == ckmmc::DeviceManager::ScanCallback::ckEVENT_DEV_SCAN)\r\n        SetInfoText(lngGetString(INIT_SCANBUS));\r\n    else if (Status == ckmmc::DeviceManager::ScanCallback::ckEVENT_DEV_CAP)\r\n        SetInfoText(lngGetString(INIT_LOADCAPABILITIES));\r\n}\r\n\r\nbool CSplashWindow::event_device(ckmmc::Device::Address &Addr)\r\n{\r\n    return true;\r\n}\r\n\r\nvoid CSplashWindow::SafeCreate()\r\n{\r\n    Create(HWND_DESKTOP,CWindow::rcDefault);\r\n}\r\n\r\nvoid CSplashWindow::SafeDestroy()\r\n{\r\n    DestroyWindow();\r\n}"
  },
  {
    "path": "src/app/dialog/splash_window.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckmmc/devicemanager.hh>\r\n\r\n#define SPLASHWINDOW_TEXTBKCOLOR\t\t\t\tRGB(255,255,255)\r\n\r\n#if (_WIN32_WINNT < 0x0500)\r\n#define WS_EX_LAYERED\t\t\t\t\t\t\t0x00080000\r\n#define ULW_ALPHA\t\t\t\t\t\t\t\t0x00000002\r\n#endif\r\n\r\ntypedef BOOL (WINAPI *tUpdateLayeredWindow)(HWND hWnd,HDC hdcDst,POINT *pptDst,\r\n                                            SIZE *psize,HDC hdcSrc,POINT *pptSrc,\r\n                                            COLORREF crKey,BLENDFUNCTION *pblend,\r\n                                            DWORD dwFlags);\r\n\r\nclass CSplashWindow : public CWindowImpl<CSplashWindow,CWindow,CWinTraits<WS_POPUP | WS_VISIBLE,WS_EX_TOOLWINDOW> >,\r\n    public ckmmc::DeviceManager::ScanCallback\r\n{\r\nprivate:\r\n    CBitmap m_SplashBitmap;\r\n\r\n    HBRUSH m_hTextBkBrush;\r\n\r\n    ckcore::tstring m_InfoText;\r\n\r\n    tUpdateLayeredWindow m_pUpdateLayeredWindow;\r\n    void DrawBitmap(HDC hScreenDC,HDC hMemDC);\r\n    void DrawText(HDC hDC);\r\n    void LoadBitmap();\r\n\r\n    void SetInfoText(const TCHAR *szInfoText);\r\n\r\n    /*\r\n     * ckmmc::DeviceManager::ScanCallback interface.\r\n     */\r\n    void event_status(ckmmc::DeviceManager::ScanCallback::Status Status);\r\n    bool event_device(ckmmc::Device::Address &Addr);\r\n\r\npublic:\r\n    CSplashWindow();\r\n    ~CSplashWindow();\r\n\r\n    BEGIN_MSG_MAP(CSplashWindow)\r\n        MESSAGE_HANDLER(WM_CREATE,OnCreate)\r\n        MESSAGE_HANDLER(WM_PAINT,OnPaint)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    void SafeCreate();\r\n    void SafeDestroy();\r\n};\r\n"
  },
  {
    "path": "src/app/dialog/tracks_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckmmc/devicemanager.hh>\r\n#include <base/string_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"scsi.hh\"\r\n#include \"wait_dlg.hh\"\r\n#include \"version.hh\"\r\n#include \"progress_dlg.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"device_util.hh\"\r\n#include \"core.hh\"\r\n#include \"core2.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"save_tracks_dlg.hh\"\r\n#include \"tracks_dlg.hh\"\r\n\r\nCTracksDlg::CTracksDlg(bool bAppMode)\r\n{\r\n    m_bAppMode = bAppMode;\r\n\r\n    m_hListImageList = NULL;\r\n    m_hToolBarImageList = NULL;\r\n\r\n    m_pEncoder = NULL;\r\n}\r\n\r\nCTracksDlg::~CTracksDlg()\r\n{\r\n    if (m_hListImageList)\r\n        ImageList_Destroy(m_hListImageList);\r\n\r\n    if (m_hToolBarImageList)\r\n        ImageList_Destroy(m_hToolBarImageList);\r\n}\r\n\r\nbool CTracksDlg::Translate()\r\n{\r\n    if (g_LanguageSettings.m_pLngProcessor == NULL)\r\n        return false;\r\n\r\n    CLngProcessor *pLng = g_LanguageSettings.m_pLngProcessor;\r\n    \r\n    // Make sure that there is a tracks translation section.\r\n    if (!pLng->EnterSection(_T(\"tracks\")))\r\n        return false;\r\n\r\n    // Translate.\r\n    TCHAR *szStrValue;\r\n\r\n    if (pLng->GetValuePtr(IDD_TRACKSDLG,szStrValue))\t\t\t// Title.\r\n        SetWindowText(szStrValue);\r\n    if (pLng->GetValuePtr(IDOK,szStrValue))\r\n        SetDlgItemText(IDOK,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_HELPBUTTON,szStrValue))\r\n        SetDlgItemText(IDC_HELPBUTTON,szStrValue);\r\n    if (pLng->GetValuePtr(IDC_DRIVESTATIC,szStrValue))\r\n        SetDlgItemText(IDC_DRIVESTATIC,szStrValue);\r\n\r\n    return true;\r\n}\r\n\r\nunsigned long CTracksDlg::MSFToLBA(unsigned long ulMin,unsigned long ulSec,\r\n                                   unsigned long ulFrame)\r\n{\r\n    return ((ulMin * 60 * 75) + (ulSec * 75) + ulFrame - 150);\r\n}\r\n\r\nvoid CTracksDlg::InitListImageList()\r\n{\r\n    m_hListImageList = ImageList_Create(16,16,ILC_COLOR32,4,5);\r\n\r\n    HICON hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_DATAICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hListImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n\r\n    hIcon = (HICON)LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDI_AUDIOICON),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    ImageList_AddIcon(m_hListImageList,hIcon);\r\n    DestroyIcon(hIcon);\r\n}\r\n\r\nvoid CTracksDlg::InitToolBarImageList()\r\n{\r\n    // Create the image list.\r\n    HBITMAP hBitmap;\r\n\r\n    // Get color depth (minimum requirement is 32-bits for alpha blended images).\r\n    int iBitsPixel = GetDeviceCaps(::GetDC(HWND_DESKTOP),BITSPIXEL);\r\n    \r\n    if (g_WinVer.m_ulMajorCCVersion >= 6 && iBitsPixel >= 32)\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_TRACKTOOLBARBITMAP));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32,0,3);\r\n        ImageList_Add(m_hToolBarImageList,hBitmap,NULL);\r\n    }\r\n    else\r\n    {\r\n        hBitmap = LoadBitmap(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDB_TRACKTOOLBARBITMAP_));\r\n\r\n        m_hToolBarImageList = ImageList_Create(16,16,ILC_COLOR32 | ILC_MASK,0,3);\r\n        ImageList_AddMasked(m_hToolBarImageList,hBitmap,RGB(255,0,255));\r\n    }\r\n\r\n    DeleteObject(hBitmap);\r\n}\r\n\r\nvoid CTracksDlg::AddToolBarSeparator()\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_SEP;\r\n    tbButton.iBitmap = 0;\r\n    tbButton.idCommand = 0;\r\n    tbButton.iString = 0;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CTracksDlg::AddToolBarButton(int iCommand,int iBitmap)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = 0;\r\n    tbButton.dwData = 0;\r\n    m_ToolBar.InsertButton(m_ToolBar.GetButtonCount(),&tbButton);\r\n}\r\n\r\nvoid CTracksDlg::CreateToolBarCtrl()\r\n{\r\n    RECT rcListView;\r\n    ::GetWindowRect(GetDlgItem(IDC_TRACKLIST),&rcListView);\r\n    ScreenToClient(&rcListView);\r\n\r\n    RECT rcToolBar = { 0,0,100,100 };\r\n    m_ToolBar.Create(m_hWnd,rcToolBar,NULL,ATL_SIMPLE_TOOLBAR_PANE_STYLE,NULL);\r\n    m_ToolBar.SetImageList(m_hToolBarImageList);\r\n    m_ToolBar.SetButtonStructSize();\r\n\r\n    // Create the buttons.\r\n    AddToolBarButton(ID_TRACK_READ,0);\r\n    AddToolBarButton(ID_TRACK_VERIFY,1);\r\n    AddToolBarSeparator();\r\n    AddToolBarButton(ID_TRACK_ERASE,2);\r\n\r\n    // Update the toolbar position.\r\n    m_ToolBar.SetWindowPos(NULL,\r\n        rcListView.left,\r\n        rcListView.bottom + 4,\r\n        rcListView.right - rcListView.left,\r\n        HIWORD(m_ToolBar.GetButtonSize()),0);\r\n}\r\n\r\nLRESULT CTracksDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    // Add the window to the task bar and add a minimize button to the dialog if\r\n    // the windows is in application mode.\r\n    /*if (m_bAppMode)\r\n    {\r\n        ModifyStyle(WS_POPUPWINDOW | WS_DLGFRAME | DS_MODALFRAME,(WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX) | WS_OVERLAPPED,0);\r\n        ModifyStyleEx(WS_EX_DLGMODALFRAME,WS_EX_APPWINDOW,0);\r\n\r\n        // Set icons.\r\n        HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n            IMAGE_ICON,::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n        SetIcon(hIcon,TRUE);\r\n        HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n            IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR);\r\n        SetIcon(hIconSmall,FALSE);\r\n    }*/\r\n    if (m_bAppMode)\r\n    {\r\n        ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU);\r\n        ModifyStyleEx(0,WS_EX_APPWINDOW);\r\n\r\n        HMENU hSysMenu = GetSystemMenu(FALSE);\r\n        ::InsertMenu(hSysMenu,0,MF_BYPOSITION,SC_RESTORE,_T(\"&Restore\"));\r\n        ::InsertMenu(hSysMenu,2,MF_BYPOSITION,SC_MINIMIZE,_T(\"Mi&nimize\"));\r\n        ::InsertMenu(hSysMenu,3,MF_BYPOSITION | MF_SEPARATOR,0,_T(\"\"));\r\n    }\r\n\r\n    // Image lists.\r\n    InitListImageList();\r\n    InitToolBarImageList();\r\n\r\n    // Create tool bar.\r\n    CreateToolBarCtrl();\r\n\r\n    // Recorder combo box.\r\n    m_DeviceCombo = GetDlgItem(IDC_DEVICECOMBO);\r\n\r\n    std::vector<ckmmc::Device *>::const_iterator it;\r\n    for (it = g_DeviceManager.devices().begin(); it !=\r\n        g_DeviceManager.devices().end(); it++)\r\n    {\r\n        const ckmmc::Device *pDevice = *it;\r\n\r\n        m_DeviceCombo.AddString(NDeviceUtil::GetDeviceName(*pDevice).c_str());\r\n        m_DeviceCombo.SetItemData(m_DeviceCombo.GetCount() - 1,\r\n                                  reinterpret_cast<DWORD_PTR>(pDevice));\r\n    }\r\n\r\n    if (m_DeviceCombo.GetCount() == 0)\r\n    {\r\n        m_DeviceCombo.AddString(lngGetString(FAILURE_NODEVICES));\r\n        m_DeviceCombo.EnableWindow(false);\r\n\r\n        // Disable the OK button.\r\n        ::EnableWindow(GetDlgItem(IDOK),false);\r\n    }\r\n\r\n    m_DeviceCombo.SetCurSel(0);\r\n\r\n    // List view.\r\n    m_ListView = GetDlgItem(IDC_TRACKLIST);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_SMALL);\r\n\r\n    m_ListView.InsertColumn(0,lngGetString(COLUMN_TRACK),LVCFMT_LEFT,45,0);\r\n    m_ListView.InsertColumn(1,lngGetString(COLUMN_ADDRESS),LVCFMT_RIGHT,70,1);\r\n    m_ListView.InsertColumn(2,lngGetString(COLUMN_LENGTH),LVCFMT_LEFT,118,2);\r\n\r\n    // Update the list view.\r\n    BOOL bDymmy;\r\n    OnDeviceChange(NULL,NULL,NULL,bDymmy);\r\n\r\n    // Translate the window.\r\n    Translate();\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CTracksDlg::OnDeviceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // MCI_STATUS_MEDIA_PRESENT?\r\n    bHandled = false;\r\n\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_DeviceCombo.GetItemData(\r\n                                          m_DeviceCombo.GetCurSel()));\r\n\r\n    // Empty the list view and disable the toolbar buttons.\r\n    m_ListView.DeleteAllItems();\r\n    m_ToolBar.EnableButton(ID_TRACK_READ,false);\r\n    m_ToolBar.EnableButton(ID_TRACK_VERIFY,false);\r\n    m_ToolBar.EnableButton(ID_TRACK_ERASE,false);\r\n\r\n    // Rescan the bus.\r\n    CWaitDlg WaitDlg;\r\n    WaitDlg.Create(m_hWnd);\r\n    WaitDlg.ShowWindow(SW_SHOW);\r\n        // Initialize device (detect drive letter, open handle, count tracks).\r\n        WaitDlg.SetMessage(lngGetString(INIT_DEVICECD));\r\n\r\n        TCHAR szDriveLetter[3];\r\n        szDriveLetter[0] = pDevice->address().device_[0];\r\n        szDriveLetter[1] = ':';\r\n        szDriveLetter[2] = '\\0';\r\n    \r\n        // Open the device by specifying the device name.\r\n        unsigned long ulResult = 0;\r\n        unsigned long ulDeviceID = 0;\r\n        unsigned long ulNumTracks = 0;\r\n        MCI_OPEN_PARMS mciOpenParms;\r\n        MCI_SET_PARMS mciSetParms;\r\n        MCI_STATUS_PARMS mciStatusParms;\r\n\r\n        mciOpenParms.lpstrDeviceType = (TCHAR *)MCI_DEVTYPE_CD_AUDIO;\r\n        mciOpenParms.lpstrElementName = szDriveLetter;\r\n        ulResult = mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,(DWORD_PTR)&mciOpenParms);\r\n        if (ulResult != 0)\r\n        {\r\n            WaitDlg.DestroyWindow();\r\n            return 0;\r\n        }\r\n\r\n        ulDeviceID = mciOpenParms.wDeviceID;\r\n\r\n        // Set the time format to minute/second/frame (MSF) format. \r\n        mciSetParms.dwTimeFormat = MCI_FORMAT_MSF;\r\n        ulResult = mciSendCommand(ulDeviceID,MCI_SET,MCI_SET_TIME_FORMAT, (DWORD_PTR)&mciSetParms);\r\n        if (ulResult != 0) \r\n        {\r\n            mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n\r\n            WaitDlg.DestroyWindow();\r\n            return 0;\r\n        }\r\n\r\n        // Get the number of tracks.\r\n        mciStatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;\r\n        ulResult = mciSendCommand(ulDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD_PTR)&mciStatusParms);\r\n        if (ulResult != 0) \r\n        {\r\n            mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n\r\n            WaitDlg.DestroyWindow();\r\n            return 0;\r\n        }\r\n\r\n        ulNumTracks = (unsigned long)mciStatusParms.dwReturn;\r\n\r\n        // Track information.\r\n        TCHAR szBuffer[128];\r\n        unsigned int uiListItemCount = 0;\r\n\r\n        for (unsigned long i = 1; i <= ulNumTracks; i++)\r\n        {\r\n            mciStatusParms.dwTrack = i;\r\n            mciStatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK;\r\n            ulResult = mciSendCommand(ulDeviceID,MCI_STATUS,MCI_STATUS_ITEM | MCI_TRACK,(DWORD_PTR)&mciStatusParms);\r\n            if (ulResult != 0) \r\n            {\r\n                mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n\r\n                WaitDlg.DestroyWindow();\r\n                return 0;\r\n            }\r\n\r\n            // Add the new list item.\r\n            lsprintf(szBuffer,_T(\"%d\"),i);\r\n            m_ListView.AddItem(uiListItemCount,0,szBuffer,mciStatusParms.dwReturn == MCI_CDA_TRACK_AUDIO);\r\n\r\n            // Wait dialog message.\r\n            lsnprintf_s(szBuffer,128,lngGetString(INIT_TRACK),i);\r\n            WaitDlg.SetMessage(szBuffer);\r\n\r\n            // Track position.\r\n            mciStatusParms.dwItem = MCI_STATUS_POSITION;\r\n            ulResult = mciSendCommand(ulDeviceID,MCI_STATUS,MCI_STATUS_ITEM | MCI_TRACK,(DWORD_PTR)&mciStatusParms);\r\n            if (ulResult != 0) \r\n            {\r\n                mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n\r\n                WaitDlg.DestroyWindow();\r\n                return 0;\r\n            }\r\n\r\n            lsprintf(szBuffer,_T(\"%d\"),MSFToLBA(\r\n                MCI_MSF_MINUTE(mciStatusParms.dwReturn),\r\n                MCI_MSF_SECOND(mciStatusParms.dwReturn),\r\n                MCI_MSF_FRAME(mciStatusParms.dwReturn)));\r\n            m_ListView.AddItem(uiListItemCount,1,szBuffer);\r\n\r\n            // Track length.\r\n            mciStatusParms.dwItem = MCI_STATUS_LENGTH;\r\n            ulResult = mciSendCommand(ulDeviceID,MCI_STATUS,MCI_STATUS_ITEM | MCI_TRACK,(DWORD_PTR)&mciStatusParms);\r\n            if (ulResult != 0) \r\n            {\r\n                mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n\r\n                WaitDlg.DestroyWindow();\r\n                return 0;\r\n            }\r\n\r\n            unsigned long ulMin = MCI_MSF_MINUTE(mciStatusParms.dwReturn);\r\n            unsigned long ulSec = MCI_MSF_SECOND(mciStatusParms.dwReturn);\r\n            unsigned long ulFrame = MCI_MSF_FRAME(mciStatusParms.dwReturn);\r\n            unsigned long ulSecLen = MSFToLBA(ulMin,ulSec,ulFrame);\r\n\r\n            lsprintf(szBuffer,_T(\"%02d:%02d:%02d (%d)\"),\r\n                ulMin,ulSec,ulFrame,ulSecLen);\r\n            m_ListView.AddItem(uiListItemCount,2,szBuffer);\r\n\r\n            // Set the item data to the length of the track (in sectors).\r\n            m_ListView.SetItemData(uiListItemCount,ulSecLen);\r\n\r\n            uiListItemCount++;\r\n        }\r\n\r\n        mciSendCommand(ulDeviceID,MCI_CLOSE,0,NULL);\r\n    WaitDlg.DestroyWindow();\r\n\r\n    return 0;\r\n}\r\n\r\nbool CTracksDlg::IsDataTrack(int iTrackIndex)\r\n{\r\n    LVITEM lvItem;\r\n    memset(&lvItem,0,sizeof(LVITEM));\r\n\r\n    lvItem.iItem = iTrackIndex;\r\n    lvItem.iSubItem = 0;\r\n    lvItem.mask = LVIF_IMAGE;\r\n        m_ListView.GetItem(&lvItem);\r\n\r\n    return lvItem.iImage == 0;\r\n}\r\n\r\nunsigned long CTracksDlg::GetTrackAddress(int iTrackIndex)\r\n{\r\n    TCHAR szTextBuffer[32];\r\n\r\n    LVITEM lvItem;\r\n    memset(&lvItem,0,sizeof(LVITEM));\r\n\r\n    lvItem.iItem = iTrackIndex;\r\n    lvItem.iSubItem = 1;\r\n    lvItem.pszText = szTextBuffer;\r\n    lvItem.cchTextMax = 32;\r\n    lvItem.mask = LVIF_TEXT;\r\n        m_ListView.GetItem(&lvItem);\r\n\r\n    return _wtoi(szTextBuffer);\r\n}\r\n\r\nbool CTracksDlg::EncodeTrack(const TCHAR *szFileName,CCodec *pEncoder)\r\n{\r\n    // Find which codec that can be uses for decoding the source file.\r\n    CCodec *pDecoder = NULL;\r\n\r\n    // Source file information.\r\n    int iNumChannels = -1;\r\n    int iSampleRate = -1;\r\n    int iBitRate = -1;\r\n    unsigned __int64 uiDuration = 0;\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        // We're only interested in decoders.\r\n        if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_DECODER) == 0)\r\n            continue;\r\n\r\n        if (g_CodecManager.m_Codecs[i]->irc_decode_init(szFileName,iNumChannels,\r\n            iSampleRate,iBitRate,uiDuration))\r\n        {\r\n            pDecoder = g_CodecManager.m_Codecs[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (pDecoder == NULL)\r\n    {\r\n        TCHAR szNameBuffer[MAX_PATH];\r\n        lstrcpy(szNameBuffer,szFileName);\r\n        ExtractFileName(szNameBuffer);\r\n\r\n        g_pProgressDlg->notify(ckcore::Progress::ckERROR,\r\n            lngGetString(ERROR_NODECODER),szNameBuffer);\r\n        return false;\r\n    }\r\n\r\n    // Setup the encoder.\r\n    TCHAR szTargetFile[MAX_PATH];\r\n    lstrcpy(szTargetFile,szFileName);\r\n    ChangeFileExt(szTargetFile,pEncoder->irc_string(IRC_STR_FILEEXT));\r\n\r\n    // Initialize the encoder.\r\n    if (!pEncoder->irc_encode_init(szTargetFile,iNumChannels,iSampleRate,iBitRate))\r\n    {\r\n        g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_CODECINIT),\r\n            pEncoder->irc_string(IRC_STR_ENCODER),\r\n            iNumChannels,iSampleRate,iBitRate,uiDuration);\r\n\r\n        pDecoder->irc_decode_exit();\r\n        return false;\r\n    }\r\n\r\n    // Encode/decode-process.\r\n    __int64 iBytesRead = 0;\r\n    unsigned __int64 uiCurrentTime = 0;\r\n\r\n#define ENCODE_BUFFER_FACTOR\t\t1024\r\n\r\n    // Allocate buffer memory.\r\n    unsigned int uiBufferSize = iNumChannels * ((iBitRate / iSampleRate) >> 3) * ENCODE_BUFFER_FACTOR;\r\n    unsigned char *pBuffer = new unsigned char[uiBufferSize];\r\n\r\n    while (true)\r\n    {\r\n        iBytesRead = pDecoder->irc_decode_process(pBuffer,uiBufferSize,uiCurrentTime);\r\n        if (iBytesRead <= 0)\r\n            break;\r\n\r\n        if (pEncoder->irc_encode_process(pBuffer,iBytesRead) < 0)\r\n        {\r\n            g_pProgressDlg->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_ENCODEDATA));\r\n            break;\r\n        }\r\n\r\n        // Update the progres bar.\r\n        unsigned char ucPercent = (unsigned char)(((double)uiCurrentTime/uiDuration) * 100);\r\n        g_pProgressDlg->set_progress(ucPercent);\r\n    }\r\n\r\n    // Free buffer memory.\r\n    delete [] pBuffer;\r\n\r\n    // Flush.\r\n    pEncoder->irc_encode_flush();\r\n    g_pProgressDlg->set_progress(100);\r\n\r\n    // Destroy the codecs.\r\n    pEncoder->irc_encode_exit();\r\n    pDecoder->irc_decode_exit();\r\n\r\n    ExtractFileName(szTargetFile);\r\n\r\n    g_pProgressDlg->notify(ckcore::Progress::ckINFORMATION,\r\n        lngGetString(SUCCESS_ENCODETRACK),szTargetFile);\r\n\r\n    return true;\r\n}\r\n\r\nunsigned long WINAPI CTracksDlg::ReadTrackThread(LPVOID lpThreadParameter)\r\n{\r\n    CTracksDlg *pTracksDlg = (CTracksDlg *)lpThreadParameter;\r\n\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(pTracksDlg->m_DeviceCombo.GetItemData(\r\n                                          pTracksDlg->m_DeviceCombo.GetCurSel()));\r\n\r\n    // Get the selected tracks.\r\n    TCHAR szTextBuffer[32];\r\n    bool bData;\r\n    unsigned long ulAddress;\r\n    unsigned long ulLength;\r\n\r\n    unsigned int uiSelCount = pTracksDlg->m_ListView.GetSelectedCount();\r\n    unsigned int uiCurTrack = 1;\r\n\r\n    int iItemIndex = -1;\r\n    iItemIndex = pTracksDlg->m_ListView.GetNextItem(iItemIndex,LVNI_SELECTED);\r\n\r\n    // Holds the full track name.\r\n    TCHAR szFilePath[MAX_PATH];\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        // Get the track type.\r\n        bData = pTracksDlg->IsDataTrack(iItemIndex);\r\n\r\n        // File path.\r\n        if (bData)\r\n            lsprintf(szTextBuffer,_T(\"Track %d.iso\"),iItemIndex + 1);\r\n        else\r\n            lsprintf(szTextBuffer,_T(\"Track %d.wav\"),iItemIndex + 1);\r\n\r\n        lstrcpy(szFilePath,pTracksDlg->m_szFolderPath);\r\n        lstrcat(szFilePath,_T(\"\\\\\"));\r\n        lstrcat(szFilePath,szTextBuffer);\r\n\r\n        // Get the track address.\r\n        ulAddress = pTracksDlg->GetTrackAddress(iItemIndex);\r\n\r\n        // Get the track length.\r\n        ulLength = (unsigned long)pTracksDlg->m_ListView.GetItemData(iItemIndex);\r\n\r\n        // Check if we're on the last track. We need to know when to finish the progress window.\r\n        if (uiCurTrack == uiSelCount)\r\n        {\r\n            if (bData)\r\n            {\r\n                bool bResult = g_Core2.ReadDataTrack(*pDevice,g_pProgressDlg,\r\n                                                     static_cast<unsigned char>(iItemIndex + 1),\r\n                                                     true,szFilePath);\r\n\r\n                g_pProgressDlg->set_progress(100);\r\n                g_pProgressDlg->NotifyCompleted();\r\n\r\n                if (bResult)\r\n                {\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n                }\r\n                else\r\n                {\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_FAILED));\r\n                    ckcore::File::remove(szFilePath);\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (pTracksDlg->m_pEncoder != NULL)\r\n                {\r\n                    if (g_Core.ReadAudioTrackEx(*pDevice,g_pProgressDlg,szFilePath,iItemIndex + 1) != BURNRESULT_OK)\r\n                    {\r\n                        ckcore::File::remove(szFilePath);\r\n                        return 0;\r\n                    }\r\n\r\n                    // Encode.\r\n                    TCHAR szStatus[256];\r\n                    lsnprintf_s(szStatus,256,lngGetString(PROGRESS_ENCODETRACK),\r\n                        pTracksDlg->m_pEncoder->irc_string(IRC_STR_ENCODER));\r\n\r\n                    g_pProgressDlg->set_status(szStatus);\r\n\r\n                    if (EncodeTrack(szFilePath,pTracksDlg->m_pEncoder))\r\n                        ckcore::File::remove(szFilePath);\r\n\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_DONE));\r\n                    g_pProgressDlg->NotifyCompleted();\r\n                }\r\n                else\r\n                {\r\n                    if (!g_Core.ReadAudioTrack(*pDevice,g_pProgressDlg,szFilePath,iItemIndex + 1))\r\n                    {\r\n                        ckcore::File::remove(szFilePath);\r\n                        return 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (bData)\r\n            {\r\n                if (g_Core2.ReadDataTrack(*pDevice,g_pProgressDlg,static_cast<unsigned char>(iItemIndex + 1),\r\n                                          true,szFilePath))\r\n                {\r\n                    g_pProgressDlg->set_progress(0);\r\n                }\r\n                else\r\n                {\r\n                    ckcore::File::remove(szFilePath);\r\n\r\n                    g_pProgressDlg->set_progress(100);\r\n                    g_pProgressDlg->set_status(lngGetString(PROGRESS_FAILED));\r\n                    g_pProgressDlg->NotifyCompleted();\r\n                    return 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (g_Core.ReadAudioTrackEx(*pDevice,g_pProgressDlg,szFilePath,iItemIndex + 1) != BURNRESULT_OK)\r\n                {\r\n                    ckcore::File::remove(szFilePath);\r\n                    return 0;\r\n                }\r\n\r\n                // Encode audio.\r\n                if (pTracksDlg->m_pEncoder != NULL)\r\n                {\r\n                    TCHAR szStatus[256];\r\n                    lsnprintf_s(szStatus,256,lngGetString(PROGRESS_ENCODETRACK),\r\n                        pTracksDlg->m_pEncoder->irc_string(IRC_STR_ENCODER));\r\n\r\n                    g_pProgressDlg->set_status(szStatus);\r\n\r\n                    if (EncodeTrack(szFilePath,pTracksDlg->m_pEncoder))\r\n                        ckcore::File::remove(szFilePath);\r\n                }\r\n\r\n                // Check if the encoding has been canceled.\r\n                if (g_pProgressDlg->cancelled())\r\n                {\r\n                    g_pProgressDlg->NotifyCompleted();\r\n                    return 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        uiCurTrack++;\r\n\r\n        iItemIndex = pTracksDlg->m_ListView.GetNextItem(iItemIndex,LVNI_SELECTED);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nunsigned long WINAPI CTracksDlg::ScanTrackThread(LPVOID lpThreadParameter)\r\n{\r\n    CTracksDlg *pTracksDlg = (CTracksDlg *)lpThreadParameter;\r\n\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(pTracksDlg->m_DeviceCombo.GetItemData(\r\n                                          pTracksDlg->m_DeviceCombo.GetCurSel()));\r\n\r\n    // Get the selected tracks.\r\n    unsigned long ulAddress;\r\n    unsigned long ulLength;\r\n\r\n    unsigned int uiSelCount = pTracksDlg->m_ListView.GetSelectedCount();\r\n    unsigned int uiCurTrack = 1;\r\n\r\n    int iItemIndex = -1;\r\n    iItemIndex = pTracksDlg->m_ListView.GetNextItem(iItemIndex,LVNI_SELECTED);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        // Get the track address.\r\n        ulAddress = pTracksDlg->GetTrackAddress(iItemIndex);\r\n\r\n        // Get the track length.\r\n        ulLength = (unsigned long)pTracksDlg->m_ListView.GetItemData(iItemIndex);\r\n\r\n        // Check if we're on the last track. We need to know when to finish the progress window.\r\n        if (uiCurTrack == uiSelCount)\r\n        {\r\n            if (!g_Core.ScanTrack(*pDevice,g_pProgressDlg,iItemIndex + 1,\r\n                                  ulAddress,ulAddress + ulLength))\r\n            {\r\n                return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (g_Core.ScanTrackEx(*pDevice,g_pProgressDlg,iItemIndex + 1,\r\n                                   ulAddress,ulAddress + ulLength) != BURNRESULT_OK)\r\n            {\r\n                return 0;\r\n            }\r\n        }\r\n\r\n        uiCurTrack++;\r\n\r\n        iItemIndex = pTracksDlg->m_ListView.GetNextItem(iItemIndex,LVNI_SELECTED);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnReadTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CSaveTracksDlg SaveTracksDlg;\r\n    if (SaveTracksDlg.DoModal() == IDOK)\r\n    {\r\n        ckmmc::Device *pDevice =\r\n            reinterpret_cast<ckmmc::Device *>(m_DeviceCombo.GetItemData(\r\n                                              m_DeviceCombo.GetCurSel()));\r\n\r\n        // Disable the main frame.\r\n        EnableWindow(false);\r\n\r\n        // Create and display the progress dialog.\r\n        if (!g_pProgressDlg->IsWindow())\r\n            g_pProgressDlg->Create(m_hWnd);\r\n\r\n        g_pProgressDlg->ShowWindow(true);\r\n        g_pProgressDlg->SetWindowText(lngGetString(STITLE_READTRACK));\r\n        g_pProgressDlg->Reset();\r\n        g_pProgressDlg->AttachProcess(&g_Core);\r\n        g_pProgressDlg->AttachHost(m_hWnd);\r\n        ProcessMessages();\r\n\r\n        // Set the device information.\r\n        g_pProgressDlg->SetDevice(*pDevice);\r\n        g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n        lstrcpy(m_szFolderPath,g_SaveTracksSettings.m_szTarget);\r\n        m_pEncoder = SaveTracksDlg.GetEncoder();\r\n\r\n        // Create the new thread.\r\n        unsigned long ulThreadID = 0;\r\n        HANDLE hThread = ::CreateThread(NULL,0,ReadTrackThread,this,0,&ulThreadID);\r\n        ::CloseHandle(hThread);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnVerifyTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    ckmmc::Device *pDevice =\r\n        reinterpret_cast<ckmmc::Device *>(m_DeviceCombo.GetItemData(\r\n                                          m_DeviceCombo.GetCurSel()));\r\n\r\n    // Disable the main frame.\r\n    EnableWindow(false);\r\n\r\n    // Create and display the progress dialog.\r\n    if (!g_pProgressDlg->IsWindow())\r\n        g_pProgressDlg->Create(m_hWnd);\r\n\r\n    g_pProgressDlg->ShowWindow(true);\r\n    g_pProgressDlg->SetWindowText(lngGetString(STITLE_SCANTRACK));\r\n    g_pProgressDlg->Reset();\r\n    g_pProgressDlg->AttachProcess(&g_Core);\r\n    g_pProgressDlg->AttachHost(m_hWnd);\r\n    ProcessMessages();\r\n\r\n    // Set the device information.\r\n    g_pProgressDlg->SetDevice(*pDevice);\r\n    g_pProgressDlg->set_status(lngGetString(PROGRESS_INIT));\r\n\r\n    // Create the new thread.\r\n    unsigned long ulThreadID = 0;\r\n    HANDLE hThread = ::CreateThread(NULL,0,ScanTrackThread,this,0,&ulThreadID);\r\n    ::CloseHandle(hThread);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnEraseTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    MessageBox(_T(\"Not yet implemented.\"),_T(\"Information\"),MB_OK | MB_ICONINFORMATION);\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnToolBarGetInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n\r\n    // The string ID is the same as the button ID.\r\n    LPTOOLTIPTEXT pTipText = (LPTOOLTIPTEXT)pNMH;\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a hint translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"hint\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr((unsigned long)pTipText->hdr.idFrom,szStrValue))\r\n            {\r\n                pTipText->lpszText = szStrValue;\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    pTipText->lpszText = MAKEINTRESOURCE(pTipText->hdr.idFrom);\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ListView.GetSelectedCount() > 0)\r\n    {\r\n        m_ToolBar.EnableButton(ID_TRACK_READ,true);\r\n        m_ToolBar.EnableButton(ID_TRACK_VERIFY,true);\r\n        m_ToolBar.EnableButton(ID_TRACK_ERASE,true);\r\n    }\r\n    else\r\n    {\r\n        m_ToolBar.EnableButton(ID_TRACK_READ,false);\r\n        m_ToolBar.EnableButton(ID_TRACK_VERIFY,false);\r\n        m_ToolBar.EnableButton(ID_TRACK_ERASE,false);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnListKeyDown(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPNMLVKEYDOWN KeyDown = (LPNMLVKEYDOWN)pNMH;\r\n\r\n    // Ctrl+A = select all\r\n    if (KeyDown->wVKey == _T('A') && (GetKeyState(VK_CONTROL) & 0x8000))\r\n    {\r\n        const int iItemCount = m_ListView.GetItemCount();\r\n\r\n        for (int i = 0; i < iItemCount; ++i )\r\n        {\r\n            ATLVERIFY(TRUE == m_ListView.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED));\r\n        }\r\n\r\n        bHandled = TRUE;\r\n    }\r\n    else\r\n    {\r\n        bHandled = FALSE;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CTracksDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    EndDialog(wID);\r\n    return FALSE;\r\n}\r\n\r\nLRESULT CTracksDlg::OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,lngGetManual());\r\n    lstrcat(szFileName,_T(\"::/how_to_use/manage_tracks.html\"));\r\n\r\n    HtmlHelp(m_hWnd,szFileName,HH_DISPLAY_TOC,NULL);\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/dialog/tracks_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n#include \"infrarecorder.hh\"\r\n\r\nclass CTracksDlg : public CDialogImpl<CTracksDlg>\r\n{\r\nprivate:\r\n    bool m_bAppMode;\r\n    HIMAGELIST m_hListImageList;\r\n    HIMAGELIST m_hToolBarImageList;\r\n\r\n    CComboBox m_DeviceCombo;\r\n    CListViewCtrl m_ListView;\r\n    CToolBarCtrl m_ToolBar;\r\n\r\n    // Needed to make the thread access what target folder that where selected.\r\n    TCHAR m_szFolderPath[MAX_PATH];\r\n    CCodec *m_pEncoder;\r\n\r\n    static bool EncodeTrack(const TCHAR *szFileName,CCodec *pEncoder);\r\n    static unsigned long WINAPI ReadTrackThread(LPVOID lpThreadParameter);\r\n    static unsigned long WINAPI ScanTrackThread(LPVOID lpThreadParameter);\r\n\r\n    unsigned long MSFToLBA(unsigned long ulMin,unsigned long ulSec,unsigned long ulFrame);\r\n\r\n    bool Translate();\r\n\r\n    void InitListImageList();\r\n    void InitToolBarImageList();\r\n\r\n    void AddToolBarSeparator();\r\n    void AddToolBarButton(int iCommand,int iBitmap);\r\n    void CreateToolBarCtrl();\r\n\r\n    bool IsDataTrack(int iTrackIndex);\r\n    unsigned long GetTrackAddress(int iTrackIndex);\r\n\r\npublic:\r\n    enum { IDD = IDD_TRACKSDLG };\r\n\r\n    CTracksDlg(bool bAppMode);\r\n    ~CTracksDlg();\r\n\r\nprivate:\r\n    BEGIN_MSG_MAP(CTracksDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_HANDLER(IDC_DEVICECOMBO,CBN_SELCHANGE,OnDeviceChange)\r\n        COMMAND_ID_HANDLER(ID_TRACK_READ,OnReadTrack)\r\n        COMMAND_ID_HANDLER(ID_TRACK_VERIFY,OnVerifyTrack)\r\n        COMMAND_ID_HANDLER(ID_TRACK_ERASE,OnEraseTrack)\r\n        NOTIFY_CODE_HANDLER(TTN_GETDISPINFO,OnToolBarGetInfo)\r\n        NOTIFY_HANDLER(IDC_TRACKLIST,LVN_ITEMCHANGED,OnListItemChanged)\r\n        NOTIFY_HANDLER(IDC_TRACKLIST,LVN_KEYDOWN,OnListKeyDown)\r\n\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnOK)\r\n        COMMAND_HANDLER(IDC_HELPBUTTON,BN_CLICKED,OnHelp)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDeviceChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnReadTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnVerifyTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnEraseTrack(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnToolBarGetInfo(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnListItemChanged(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnListKeyDown(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnHelp(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};"
  },
  {
    "path": "src/app/dialog/wait_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"wait_dlg.hh\"\r\n\r\nCWaitDlg::CWaitDlg()\r\n{\r\n}\r\n\r\nCWaitDlg::~CWaitDlg()\r\n{\r\n}\r\n\r\nvoid CWaitDlg::SetMessage(const TCHAR *szMessage)\r\n{\r\n    SetDlgItemText(IDC_INFOSTATIC,szMessage);\r\n}\r\n\r\nLRESULT CWaitDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    CenterWindow(GetParent());\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CWaitDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/app/dialog/wait_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\nclass CWaitDlg : public CDialogImpl<CWaitDlg>\r\n{\r\npublic:\r\n    enum { IDD = IDD_WAITDLG };\r\n\r\n    CWaitDlg();\r\n    ~CWaitDlg();\r\n\r\n    void SetMessage(const TCHAR *szMessage);\r\n\r\n    BEGIN_MSG_MAP(CWaitDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/app/directory_monitor.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"directory_monitor.hh\"\r\n\r\nCDirectoryMonitor::CDirectoryMonitor()\r\n{\r\n}\r\n\r\nCDirectoryMonitor::~CDirectoryMonitor()\r\n{\r\n}\r\n\r\n/*\r\n    CDirectoryMonitor::Register\r\n    ---------------------------\r\n    Register the change notify entry using SHChangeNotifyEntry. The hWndNotify\r\n    handle should be the window to receive the messages.  uiMsg the notification\r\n    number. It returns true of no errors occured, false otherwise.\r\n*/\r\nbool CDirectoryMonitor::Register(HWND hWndNotify,unsigned int uiMsg,int iFilter,\r\n    LPITEMIDLIST pidl,bool bRecursive)\r\n{\r\n    SHChangeNotifyEntry shNotifyEntry = { pidl,bRecursive };\r\n\r\n    /*\r\n    Where are these defined?\r\n    SHCNRF_InterruptLevel = 0x0001\r\n    SHCNRF_ShellLevel = 0x0002\r\n    SHCNRF_RecursiveInterrupt = 0x1000\r\n    SHCNRF_NewDelivery = 0x8000\r\n    */\r\n\r\n    int iFlags = 0x0003; // SHCNRF_InterruptLevel & SHCNRF_ShellLevel\r\n\r\n    if (bRecursive)\r\n        iFlags |= 0x1000;\r\n\r\n    m_ulNotifyID = SHChangeNotifyRegister(hWndNotify,iFlags,iFilter,uiMsg,1,&shNotifyEntry);\r\n\r\n    if (!m_ulNotifyID)\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CDirectoryMonitor::Deregister()\r\n{\r\n    if (!m_ulNotifyID)\r\n        return false;\r\n\r\n    if (SUCCEEDED(SHChangeNotifyDeregister(m_ulNotifyID)))\r\n        return true;\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/app/directory_monitor.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CDirectoryMonitor\r\n{\r\nprivate:\r\n    unsigned long m_ulNotifyID;\r\n\r\npublic:\r\n    CDirectoryMonitor();\r\n    ~CDirectoryMonitor();\r\n\r\n    bool Register(HWND hWndNotify,unsigned int uiMsg,int iFilter,LPITEMIDLIST pidl,\r\n        bool bRecursive);\r\n    bool Deregister();\r\n};\r\n"
  },
  {
    "path": "src/app/effects.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"effects.hh\"\r\n"
  },
  {
    "path": "src/app/effects.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Configuration.\r\n#define EFFECTWINDOW_HEIGHT\t\t\t\t256\r\n#define EFFECTWINDOW_OVERLAP\t\t\t25\r\n\r\n// Messages.\r\n#define WM_CKEFFECTS_INITIALIZED\t\t\tWM_APP + 0\r\n#define WM_CKEFFECTS_DESTROY\t\t\t\tWM_APP + 1\r\n#define WM_CKEFFECTS_STARTSMOKE\t\t\t\tWM_APP + 2\r\n#define WM_CKEFFECTS_STOPSMOKE\t\t\t\tWM_APP + 3\r\n#define WM_CKEFFECTS_KILLSMOKE\t\t\t\tWM_APP + 4\r\n\r\n#define SMOKE_INIT\\\r\n    m_hWndEffects = NULL;\r\n\r\n#define SMOKE_START\\\r\n    if (m_hWndEffects == NULL)\\\r\n    {\\\r\n        if (g_WinVer.m_ulMajorVersion == MAJOR_WINVISTA &&\\\r\n            g_WinVer.m_ulMinorVersion == MINOR_WINVISTA &&\\\r\n            g_GlobalSettings.m_bSmoke)\\\r\n        {\\\r\n            bool bHasDependencies = false;\\\r\n            HINSTANCE hDummy = LoadLibrary(_T(\"d3d8thk.dll\"));\\\r\n            if (hDummy)\\\r\n            {\\\r\n                FreeLibrary(hDummy);\\\r\n                hDummy = LoadLibrary(_T(\"d3d9.dll\"));\\\r\n                if (hDummy)\\\r\n                {\\\r\n                    FreeLibrary(hDummy);\\\r\n                    hDummy = LoadLibrary(_T(\"d3dx9_32.dll\"));\\\r\n                    if (hDummy)\\\r\n                    {\\\r\n                        FreeLibrary(hDummy);\\\r\n                        hDummy = LoadLibrary(_T(\"dwmapi.dll\"));\\\r\n                        if (hDummy)\\\r\n                        {\\\r\n                            FreeLibrary(hDummy);\\\r\n                            bHasDependencies = true;\\\r\n                        }\\\r\n                    }\\\r\n                }\\\r\n            }\\\r\n            if (bHasDependencies)\\\r\n            {\\\r\n                RECT rcWindow;\\\r\n                GetWindowRect(&rcWindow);\\\r\n                TCHAR szParam[128];\\\r\n                lsprintf(szParam,_T(\"-host=%I64x -dim=%d,%d,%d,%d\"),(__int64)m_hWnd,rcWindow.left,\\\r\n                    rcWindow.top - EFFECTWINDOW_HEIGHT + EFFECTWINDOW_OVERLAP,\\\r\n                    rcWindow.right - rcWindow.left,EFFECTWINDOW_HEIGHT);\\\r\n                TCHAR szFileName[MAX_PATH];\\\r\n                GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\\\r\n                ExtractFilePath(szFileName);\\\r\n                IncludeTrailingBackslash(szFileName);\\\r\n                lstrcat(szFileName,_T(\"smoke.exe\"));\\\r\n                ShellExecute(HWND_DESKTOP,_T(\"open\"),szFileName,szParam,NULL,SW_SHOWDEFAULT);\\\r\n            }\\\r\n        }\\\r\n    }\r\n\r\n#define SMOKE_STOP\\\r\n    if (m_hWndEffects != NULL)\\\r\n    {\\\r\n        ::PostMessage(m_hWndEffects,WM_CKEFFECTS_DESTROY,NULL,NULL);\\\r\n        m_hWndEffects = NULL;\\\r\n    }\r\n\r\n#define SMOKE_EVENTS\\\r\n    MESSAGE_HANDLER(WM_WINDOWPOSCHANGED,OnWindowPosChanged)\\\r\n    MESSAGE_HANDLER(WM_SIZE,OnSize)\\\r\n    MESSAGE_HANDLER(WM_ACTIVATEAPP,OnActivateApp)\\\r\n    MESSAGE_HANDLER(WM_CKEFFECTS_INITIALIZED,OnEffectInitialized)\r\n\r\n#define SMOKE_IMPL\\\r\n    LRESULT OnWindowPosChanged(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\\\r\n    {\\\r\n        WINDOWPOS *pWindowPos = (WINDOWPOS *)lParam;\\\r\n        if (m_hWndEffects != NULL)\\\r\n        {\\\r\n            RECT rcWindow;\\\r\n            ::GetWindowRect(m_hWndEffects,&rcWindow);\\\r\n            ::MoveWindow(m_hWndEffects,pWindowPos->x,pWindowPos->y - EFFECTWINDOW_HEIGHT + EFFECTWINDOW_OVERLAP,rcWindow.right - rcWindow.left,\\\r\n                rcWindow.bottom - rcWindow.top,TRUE);\\\r\n        }\\\r\n        bHandled = false;\\\r\n        return TRUE;\\\r\n    }\\\r\n    LRESULT OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\\\r\n    {\\\r\n        switch (wParam)\\\r\n        {\\\r\n            case SIZE_MINIMIZED:\\\r\n                ::PostMessage(m_hWndEffects,WM_CKEFFECTS_KILLSMOKE,NULL,NULL);\\\r\n                break;\\\r\n            case SIZE_RESTORED:\\\r\n                ::PostMessage(m_hWndEffects,WM_CKEFFECTS_STARTSMOKE,NULL,NULL);\\\r\n                break;\\\r\n        }\\\r\n        bHandled = false;\\\r\n        return TRUE;\\\r\n    }\\\r\n    LRESULT OnActivateApp(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\\\r\n    {\\\r\n        if (m_hWndEffects)\\\r\n        {\\\r\n            ::SetWindowPos(m_hWndEffects,m_hWnd,0,0,0,0,\\\r\n                SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_ASYNCWINDOWPOS);\\\r\n        }\\\r\n        bHandled = false;\\\r\n        return TRUE;\\\r\n    }\\\r\n    LRESULT OnEffectInitialized(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\\\r\n    {\\\r\n        m_hWndEffects = (HWND)lParam;\\\r\n        ::PostMessage(m_hWndEffects,WM_CKEFFECTS_STARTSMOKE,NULL,NULL);\\\r\n        return TRUE;\\\r\n    }\\\r\n    private:\\\r\n    HWND m_hWndEffects;\\\r\n    public:\r\n"
  },
  {
    "path": "src/app/enum_fmt_etc.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"enum_fmt_etc.hh\"\r\n\r\nHRESULT CreateEnumFmtEtc(unsigned int uiNumFormats,FORMATETC *pFormats,\r\n    IEnumFORMATETC **ppEnumFormatEtc)\r\n{\r\n    if (uiNumFormats == 0 || pFormats == NULL || ppEnumFormatEtc == NULL)\r\n        return E_INVALIDARG;\r\n\r\n    *ppEnumFormatEtc = new CEnumFmtEtc(pFormats,uiNumFormats);\r\n\r\n    return (*ppEnumFormatEtc) ? S_OK : E_OUTOFMEMORY;\r\n}\r\n\r\nCEnumFmtEtc::CEnumFmtEtc(FORMATETC *pFormats,unsigned int uiNumFormats)\r\n{\r\n    m_lRefCount = 1;\r\n\r\n    m_uiFormatIndex = 0;\r\n    m_uiNumFormats = uiNumFormats;\r\n    m_pFormats = new FORMATETC[uiNumFormats];\r\n\r\n    for (unsigned int i = 0; i < uiNumFormats; i++)\r\n    {\r\n        memcpy(&m_pFormats[i],&pFormats[i],sizeof(FORMATETC));\r\n\r\n        if (pFormats->ptd)\r\n        {\r\n            m_pFormats[i].ptd = (DVTARGETDEVICE *)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));\r\n            memcpy(&m_pFormats[i].ptd,&pFormats[i].ptd,sizeof(DVTARGETDEVICE));\r\n        }\r\n    }\r\n}\r\n\r\nCEnumFmtEtc::~CEnumFmtEtc()\r\n{\r\n    if (m_pFormats)\r\n    {\r\n        for (unsigned int i = 0; i < m_uiNumFormats; i++)\r\n        {\r\n            if (m_pFormats[i].ptd)\r\n                CoTaskMemFree(m_pFormats[i].ptd);\r\n        }\r\n\r\n        delete [] m_pFormats;\r\n    }\r\n}\r\n\r\nvoid CEnumFmtEtc::SetIndex(unsigned int uiFormatIndex)\r\n{\r\n    m_uiFormatIndex = uiFormatIndex;\r\n}\r\n\r\nULONG __stdcall CEnumFmtEtc::AddRef()\r\n{\r\n    // Increment object reference count.\r\n    return InterlockedIncrement(&m_lRefCount);\r\n}\r\n\r\nULONG __stdcall CEnumFmtEtc::Release()\r\n{\r\n    // Decrement object reference count.\r\n    LONG lCount = InterlockedDecrement(&m_lRefCount);\r\n        \r\n    if (lCount == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        return lCount;\r\n    }\r\n}\r\n\r\nHRESULT __stdcall CEnumFmtEtc::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    // Check to see what interface has been requested.\r\n    if (iid == IID_IEnumFORMATETC || iid == IID_IUnknown)\r\n    {\r\n        AddRef();\r\n        *ppvObject = this;\r\n        return S_OK;\r\n    }\r\n    else\r\n    {\r\n        *ppvObject = 0;\r\n        return E_NOINTERFACE;\r\n    }\r\n}\r\n\r\nHRESULT __stdcall CEnumFmtEtc::Next(ULONG celt,FORMATETC *pFormatEtc,ULONG *pceltFetched)\r\n{\r\n    unsigned int uiCopied = 0;\r\n\r\n    if (celt == 0 || pFormatEtc == 0)\r\n        return E_INVALIDARG;\r\n\r\n    while (m_uiFormatIndex < m_uiNumFormats && uiCopied < celt)\r\n    {\r\n        // Copy the format data.\r\n        memcpy(&pFormatEtc[uiCopied],&m_pFormats[m_uiFormatIndex],sizeof(FORMATETC));\r\n\r\n        if (m_pFormats[m_uiFormatIndex].ptd)\r\n        {\r\n            pFormatEtc[uiCopied].ptd = (DVTARGETDEVICE *)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));\r\n            memcpy(&pFormatEtc[uiCopied].ptd,&m_pFormats[m_uiFormatIndex].ptd,sizeof(DVTARGETDEVICE));\r\n        }\r\n\r\n        uiCopied++;\r\n        m_uiFormatIndex++;\r\n    }\r\n\r\n    if (pceltFetched != 0) \r\n        *pceltFetched = uiCopied;\r\n\r\n    // Was all requested data copied?\r\n    return (uiCopied == celt) ? S_OK : S_FALSE;\r\n}\r\n\r\nHRESULT __stdcall CEnumFmtEtc::Skip(ULONG celt)\r\n{\r\n    m_uiFormatIndex += celt;\r\n    return (m_uiFormatIndex <= m_uiNumFormats) ? S_OK : S_FALSE;\r\n}\r\n\r\nHRESULT __stdcall CEnumFmtEtc::Reset()\r\n{\r\n    m_uiFormatIndex = 0;\r\n    return S_OK;\r\n}\r\n\r\nHRESULT __stdcall CEnumFmtEtc::Clone(IEnumFORMATETC **ppEnumFormatEtc)\r\n{\r\n    HRESULT hResult;\r\n\r\n    // Make a duplicate enumerator.\r\n    hResult = CreateEnumFmtEtc(m_uiNumFormats,m_pFormats,ppEnumFormatEtc);\r\n\r\n    if (hResult == S_OK)\r\n        ((CEnumFmtEtc *)*ppEnumFormatEtc)->SetIndex(m_uiFormatIndex);\r\n\r\n    return hResult;\r\n}\r\n"
  },
  {
    "path": "src/app/enum_fmt_etc.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CEnumFmtEtc : public IEnumFORMATETC\r\n{\r\nprivate:\r\n    long m_lRefCount;\r\n\r\n    unsigned int m_uiNumFormats;\r\n    unsigned int m_uiFormatIndex;\r\n    FORMATETC *m_pFormats;\r\n\r\npublic:\r\n    CEnumFmtEtc(FORMATETC *pFormats,unsigned int uiNumFormats);\r\n    ~CEnumFmtEtc();\r\n\r\n    void SetIndex(unsigned int uiFormatIndex);\r\n\r\n    // IUnknown members.\r\n    HRESULT __stdcall QueryInterface(REFIID iid,void **ppvObject);\r\n    ULONG __stdcall AddRef();\r\n    ULONG __stdcall Release();\r\n\r\n    // IEnumFormatEtc members.\r\n    HRESULT __stdcall Next(ULONG celt,FORMATETC *rgelt,ULONG *pceltFetched);\r\n    HRESULT __stdcall Skip(ULONG celt); \r\n    HRESULT __stdcall Reset();\r\n    HRESULT __stdcall Clone(IEnumFORMATETC **ppEnumFormatEtc);\r\n};\r\n\r\nHRESULT CreateEnumFmtEtc(unsigned int uiNumFormats,FORMATETC *pFormats,\r\n    IEnumFORMATETC **ppEnumFormatEtc);\r\n"
  },
  {
    "path": "src/app/files_data_object.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"files_data_object.hh\"\r\n#include \"enum_fmt_etc.hh\"\r\n\r\nCFilesDataObject::CFilesDataObject()\r\n{\r\n    // Reference count must ALWAYS start at 1.\r\n    m_lRefCount = 1;\r\n\r\n    memset(&m_FormatEtc,0,sizeof(m_FormatEtc));\r\n    m_FormatEtc.cfFormat = CF_HDROP;\r\n    m_FormatEtc.dwAspect = DVASPECT_CONTENT;\r\n    m_FormatEtc.lindex = 0;\r\n    m_FormatEtc.ptd = NULL;\r\n    m_FormatEtc.tymed = TYMED_HGLOBAL;\r\n\r\n    memset(&m_StgMedium,0,sizeof(m_StgMedium));\r\n    m_StgMedium.tymed = TYMED_HGLOBAL;\r\n}\r\n\r\nCFilesDataObject::~CFilesDataObject()\r\n{\r\n    ReleaseStgMedium(&m_StgMedium);\r\n}\r\n\r\nbool CFilesDataObject::IsFormatSupported(FORMATETC *pFormatEtc)\r\n{\r\n    if (m_FormatEtc.cfFormat == pFormatEtc->cfFormat &&\r\n        m_FormatEtc.dwAspect == pFormatEtc->dwAspect &&\r\n        m_FormatEtc.tymed & pFormatEtc->tymed)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nvoid CFilesDataObject::Reset()\r\n{\r\n    m_Files.clear();\r\n}\r\n\r\nvoid CFilesDataObject::AddFile(const TCHAR *szFileName)\r\n{\r\n    m_Files.push_back(szFileName);\r\n}\r\n\r\nHRESULT __stdcall CFilesDataObject::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    // Check to see what interface has been requested.\r\n    if (iid == IID_IDataObject || iid == IID_IUnknown)\r\n    {\r\n        AddRef();\r\n        *ppvObject = this;\r\n        return S_OK;\r\n    }\r\n    else\r\n    {\r\n        *ppvObject = 0;\r\n        return E_NOINTERFACE;\r\n    }\r\n}\r\n\r\nULONG __stdcall CFilesDataObject::AddRef()\r\n{\r\n    // Increment object reference count.\r\n    return InterlockedIncrement(&m_lRefCount);\r\n}\r\n\r\nULONG __stdcall CFilesDataObject::Release()\r\n{\r\n    // Decrement object reference count.\r\n    LONG lCount = InterlockedDecrement(&m_lRefCount);\r\n        \r\n    if (lCount == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        return lCount;\r\n    }\r\n}\r\n\r\nHRESULT __stdcall CFilesDataObject::GetData(FORMATETC *pFormatEtc,STGMEDIUM *pStgMedium)\r\n{\r\n    if (!IsFormatSupported(pFormatEtc))\r\n        return DV_E_FORMATETC;\r\n\r\n    // Calculate the memory needed for the file names.\r\n    size_t iTotalNameLength = 0;\r\n    std::vector<tstring>::const_iterator itFile;\r\n    for (itFile = m_Files.begin(); itFile != m_Files.end(); itFile++)\r\n        iTotalNameLength += (unsigned int)(*itFile).length() + 1;\r\n\r\n    // Copy the file name data into global memory buffer.\r\n    pStgMedium->tymed = m_StgMedium.tymed;\r\n    pStgMedium->pUnkForRelease = 0;\r\n    pStgMedium->hGlobal = GlobalAlloc(GMEM_SHARE,sizeof(DROPFILES) + (iTotalNameLength + 1) * sizeof(TCHAR));\r\n    DROPFILES *pDropFiles = (DROPFILES *)GlobalLock(pStgMedium->hGlobal);\r\n\r\n    pDropFiles->pFiles = sizeof(DROPFILES);\r\n    pDropFiles->fWide = TRUE;\r\n\r\n    TCHAR *szFiles = (TCHAR *)((unsigned char *)pDropFiles + sizeof(DROPFILES));\r\n    size_t iPos = 0;\r\n\r\n    // Copy the file names into the global memory.\r\n    for (itFile = m_Files.begin(); itFile != m_Files.end(); itFile++)\r\n    {\r\n        size_t iPathLength = (*itFile).length();\r\n\r\n        memcpy(szFiles + iPos,(*itFile).c_str(),iPathLength * sizeof(TCHAR) + sizeof(TCHAR));\r\n        iPos += iPathLength + 1;\r\n    }\r\n\r\n    szFiles[iTotalNameLength] = '\\0';\r\n\r\n    GlobalUnlock(pDropFiles);\r\n    return S_OK;\r\n}\r\n\r\nHRESULT CFilesDataObject::GetDataHere(FORMATETC *pFormatEtc,STGMEDIUM *pMedium)\r\n{\r\n    return DATA_E_FORMATETC;\r\n}\r\n\r\nHRESULT __stdcall CFilesDataObject::QueryGetData(FORMATETC *pFormatEtc)\r\n{\r\n    return IsFormatSupported(pFormatEtc) ? S_OK : DV_E_FORMATETC;\r\n}\r\n\r\nHRESULT CFilesDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatEct,FORMATETC *pFormatEtcOut)\r\n{\r\n    // MUST be set to NULL.\r\n    pFormatEtcOut->ptd = NULL;\r\n\r\n    return E_NOTIMPL;\r\n}\r\n\r\nHRESULT __stdcall CFilesDataObject::SetData(FORMATETC *pFormatEtc,STGMEDIUM *pMedium,BOOL fRelease)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nHRESULT __stdcall CFilesDataObject::EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC **ppEnumFormatEtc)\r\n{\r\n    if (dwDirection == DATADIR_GET)\r\n    {\r\n        // Windows 2000 and newer only.\r\n        //return SHCreateStdEnumFmtEtc(1,&m_FormatEtc,ppEnumFormatEtc);\r\n        return CreateEnumFmtEtc(1,&m_FormatEtc,ppEnumFormatEtc);\r\n    }\r\n    else\r\n    {\r\n        return E_NOTIMPL;\r\n    }\r\n}\r\n\r\nHRESULT CFilesDataObject::DAdvise(FORMATETC *pFormatEtc,DWORD advf,IAdviseSink *pAdvSink, \r\n    DWORD *pdwConnection)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n\r\nHRESULT CFilesDataObject::DUnadvise(DWORD dwConnection)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n\r\nHRESULT CFilesDataObject::EnumDAdvise(IEnumSTATDATA **ppEnumAdvise)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n"
  },
  {
    "path": "src/app/files_data_object.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <base/string_util.hh>\r\n\r\nclass CFilesDataObject : public IDataObject\r\n{\r\nprivate:\r\n    long m_lRefCount;\r\n\r\n    FORMATETC m_FormatEtc;\r\n    STGMEDIUM m_StgMedium;\r\n\r\n    std::vector<tstring> m_Files;\r\n\r\n    bool IsFormatSupported(FORMATETC *pFormatEtc);\r\n\r\npublic:\r\n    CFilesDataObject();\r\n    ~CFilesDataObject();\r\n\r\n    void Reset();\r\n    void AddFile(const TCHAR *szFileName);\r\n\r\n    // IUnknown members.\r\n    HRESULT __stdcall QueryInterface(REFIID iid,void **ppvObject);\r\n    ULONG __stdcall AddRef();\r\n    ULONG __stdcall Release();\r\n        \r\n    // IDataObject members.\r\n    HRESULT __stdcall GetData(FORMATETC *pFormatEtc,STGMEDIUM *pmedium);\r\n    HRESULT __stdcall GetDataHere(FORMATETC *pFormatEtc,STGMEDIUM *pmedium);\r\n    HRESULT __stdcall QueryGetData(FORMATETC *pFormatEtc);\r\n    HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC *pFormatEct,FORMATETC *pFormatEtcOut);\r\n    HRESULT __stdcall SetData(FORMATETC *pFormatEtc,STGMEDIUM *pMedium,BOOL fRelease);\r\n    HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc);\r\n    HRESULT __stdcall DAdvise(FORMATETC *pFormatEtc,DWORD advf,IAdviseSink *,DWORD *);\r\n    HRESULT __stdcall DUnadvise(DWORD dwConnection);\r\n    HRESULT __stdcall EnumDAdvise(IEnumSTATDATA **ppEnumAdvise);\r\n};\r\n"
  },
  {
    "path": "src/app/infrarecorder.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"Resource.h\"\r\n#include \"main_frm.hh\"\r\n#include <ckcore/exception.hh>\r\n#include <base/file_util.hh>\r\n#include \"progress_dlg.hh\"\r\n#include \"simple_progress_dlg.hh\"\r\n#include \"splash_window.hh\"\r\n#include \"log_dlg.hh\"\r\n#include \"settings.hh\"\r\n#include \"settings_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"action_manager.hh\"\r\n#include \"temp_manager.hh\"\r\n#include \"info_dlg.hh\"\r\n#include \"about_window.hh\"\r\n#include \"infrarecorder.hh\"\r\n\r\nCAppModule _Module;\r\n\r\n// Global codec manager object.\r\nCCodecManager g_CodecManager;\r\n\r\n// Global device manager object.\r\nckmmc::DeviceManager g_DeviceManager;\r\n\r\n// Global pointers to GUI objects owned by this file.\r\nCLogDlg *g_pLogDlg = NULL;\r\nCMainFrame *g_pMainFrame = NULL;\r\nCProgressDlg *g_pProgressDlg = NULL;\r\nCSimpleProgressDlg *g_pSimpleProgressDlg = NULL;\r\nCAboutWindow *g_pAboutWnd = NULL;\r\n\r\n#ifdef _DEBUG\r\nconst ckcore::tchar SAVE_ENGLISH_STRINGS_PARAM[] = _T(\"-englishstrings \");\r\n\r\nstatic int SaveEnglishStrings(const TCHAR * const szFileName)\r\n{\r\n    try\r\n    {\r\n        const ckcore::tchar BLANKS[] = _T(\" \\t\");\r\n        ckcore::tstring FileName(szFileName);\r\n        TrimStr(FileName,BLANKS);\r\n\r\n        if (FileName.empty())\r\n            throw ckcore::Exception2(_T(\"Missing filename.\"));\r\n\r\n        ckcore::File File(FileName.c_str());\r\n\r\n        if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n            throw ckcore::Exception2(_T(\"Error opening file for writing.\"));\r\n\r\n        // Write byte order mark.\r\n        unsigned short usBOM = BOM_UTF32BE;\r\n        File.write(&usBOM,2);\r\n\r\n        const ckcore::tchar CRLF[] = ckT(\"\\r\\n\");\r\n\r\n        WriteString(File,CRLF);\r\n        WriteString(File,ckT(\"[strings]\"));\r\n        WriteString(File,CRLF);\r\n\r\n        for (unsigned i = 0; i < _countof(g_szStringTable); ++i)\r\n        {\r\n            const TCHAR * const szEnglishStr = g_szStringTable[i];\r\n\r\n            if (szEnglishStr[0] == _T('\\0'))\r\n                continue;\r\n\r\n            ckcore::tstring Str = ckcore::string::formatstr(_T(\"0x%04x=%s%s\"),i,szEnglishStr,CRLF);\r\n            WriteString(File,Str.c_str());\r\n        }\r\n\r\n        ATLVERIFY(true == File.close());\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        ckcore::rethrow_with_pfx(e,_T(\"Error processing command-line option %s: \"),SAVE_ENGLISH_STRINGS_PARAM);\r\n    }\r\n    \r\n    return 0;\r\n}\r\n#endif\r\n\r\nvoid PerformDeviceScan()\r\n{\r\n    // Launch the splash window by the safe function because splash screens\r\n    // are not supported on systems older than Windows 2000.\r\n    CSplashWindow SplashWindow;\r\n    SplashWindow.SafeCreate();\r\n\r\n    g_DeviceManager.scan(&SplashWindow);\r\n\r\n    SplashWindow.SafeDestroy();\r\n\r\n    if (g_DeviceManager.devices().size() == 0)\r\n    {\r\n        if (g_GlobalSettings.m_bNoDevWarning)\r\n        {\r\n            CInfoDlg InfoDlg(&g_GlobalSettings.m_bNoDevWarning,\r\n                             lngGetString(WARNING_NODEVICES),\r\n                             INFODLG_NOCANCEL | INFODLG_ICONWARNING);\r\n            InfoDlg.DoModal();\r\n        }\r\n    }\r\n}\r\n\r\nint Run(LPTSTR lpstrCmdLine = NULL,int nCmdShow = SW_SHOWDEFAULT)\r\n{\r\n    CMessageLoop MainLoop;\r\n    _Module.AddMessageLoop(&MainLoop);\r\n\r\n    if (g_pMainFrame->CreateEx() == NULL)\r\n    {\r\n        ATLTRACE(_T(\"Main window creation failed!\\n\"));\r\n        return 0;\r\n    }\r\n\r\n    // Load the last used window position and size.\r\n    if (g_DynamicSettings.m_rcWindow.left != -1 &&\r\n        g_DynamicSettings.m_rcWindow.right != -1 &&\r\n        g_DynamicSettings.m_rcWindow.top != -1 &&\r\n        g_DynamicSettings.m_rcWindow.bottom != -1)\r\n    {\r\n        if (g_pMainFrame->m_bDefaultWizard)\r\n        {\r\n            RECT rcWindow = g_DynamicSettings.m_rcWindow;\r\n            rcWindow.right = rcWindow.left + 500;\r\n            rcWindow.bottom = rcWindow.top + 400;\r\n\r\n            g_pMainFrame->SetWindowPos(HWND_TOP,&rcWindow,0);\r\n        }\r\n        else\r\n        {\r\n            g_pMainFrame->SetWindowPos(HWND_TOP,&g_DynamicSettings.m_rcWindow,0);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (g_pMainFrame->m_bDefaultWizard)\r\n        {\r\n            RECT rcWindow = g_DynamicSettings.m_rcWindow;\r\n            rcWindow.right = rcWindow.left + 500;\r\n            rcWindow.bottom = rcWindow.top + 400;\r\n\r\n            g_pMainFrame->SetWindowPos(HWND_TOP,&rcWindow,0);\r\n        }\r\n\r\n        g_pMainFrame->CenterWindow();\r\n    }\r\n\r\n    g_pMainFrame->ShowWindow(g_DynamicSettings.m_bWinMaximized ? SW_SHOWMAXIMIZED : nCmdShow);\r\n\r\n    int nRet = MainLoop.Run();\r\n        _Module.RemoveMessageLoop();\r\n    return nRet;\r\n}\r\n\r\nINT_PTR ParseAndRun(LPTSTR lpstrCmdLine,int nCmdShow = SW_SHOWDEFAULT)\r\n{\r\n    g_pMainFrame->m_bDefaultWizard = g_GlobalSettings.m_bShowWizard;\r\n\r\n    // FIXME: This is an absolutely horrible parameter parsing implementation.\r\n\r\n    // Default project selection.\r\n    if (!lstrncmp(lpstrCmdLine,_T(\"-project=\"),9))\r\n    {\r\n        lpstrCmdLine += 9;\r\n        if (!lstrncmp(lpstrCmdLine,_T(\"data\"),4))\r\n        {\r\n            g_pMainFrame->m_iDefaultProjType = PROJECTTYPE_DATA;\r\n            g_pMainFrame->m_bDefaultWizard = false;\r\n\r\n            lpstrCmdLine += 4;\r\n        }\r\n        else if (!lstrncmp(lpstrCmdLine,_T(\"audio\"),5))\r\n        {\r\n            g_pMainFrame->m_iDefaultProjType = PROJECTTYPE_AUDIO;\r\n            g_pMainFrame->m_bDefaultWizard = false;\r\n\r\n            lpstrCmdLine += 5;\r\n        }\r\n        else if (!lstrncmp(lpstrCmdLine,_T(\"mixed\"),5))\r\n        {\r\n            g_pMainFrame->m_iDefaultProjType = PROJECTTYPE_MIXED;\r\n            g_pMainFrame->m_bDefaultWizard = false;\r\n\r\n            lpstrCmdLine += 5;\r\n        }\r\n        else if (!lstrncmp(lpstrCmdLine,_T(\"dvdvideo\"),8))\r\n        {\r\n            g_pMainFrame->m_iDefaultProjType = PROJECTTYPE_DATA;\r\n            g_pMainFrame->m_iDefaultMedia = SPACEMETER_SIZE_DVD;\r\n            g_pMainFrame->m_bDefaultProjDVDVideo = true;\r\n            g_pMainFrame->m_bDefaultWizard = false;\r\n\r\n            lpstrCmdLine += 8;\r\n        }\r\n\r\n        if (*lpstrCmdLine)\r\n            lpstrCmdLine++;\r\n    }\r\n\r\n    // Default media selection.\r\n    if (!lstrncmp(lpstrCmdLine,_T(\"-media=\"),7))\r\n    {\r\n        lpstrCmdLine += 7;\r\n        if (!lstrcmp(lpstrCmdLine,_T(\"dldvd\")))\r\n            g_pMainFrame->m_iDefaultMedia = SPACEMETER_SIZE_DLDVD;\r\n        else if (!lstrcmp(lpstrCmdLine,_T(\"dvd\")))\r\n            g_pMainFrame->m_iDefaultMedia = SPACEMETER_SIZE_DVD;\r\n        else if (!lstrcmp(lpstrCmdLine,_T(\"cd\")))\r\n            g_pMainFrame->m_iDefaultMedia = SPACEMETER_SIZE_703MB;\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-burnimage\")))\r\n    {\r\n        return g_ActionManager.BurnImage(NULL,true);\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-copyimage\")))\r\n    {\r\n        return g_ActionManager.CopyImage(NULL,true);\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-tracks\")))\r\n    {\r\n        return g_ActionManager.ManageTracks(true);\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-erase\")))\r\n    {\r\n        return g_ActionManager.Erase(NULL,true);\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-fixate\")))\r\n    {\r\n        return g_ActionManager.Fixate(NULL,true);\r\n    }\r\n    else if (!lstrcmp(lpstrCmdLine,_T(\"-copydisc\")))\r\n    {\r\n        return g_ActionManager.CopyDisc(NULL,true);\r\n    }\r\n    // From the shell extension.\r\n    else if (!lstrncmp(lpstrCmdLine,_T(\"-burnimage \"),11))\r\n    {\r\n        return g_ActionManager.BurnImageEx(NULL,true,lpstrCmdLine + 11);\r\n    }\r\n    else if (!lstrncmp(lpstrCmdLine,_T(\"-burnproject \"),13))\r\n    {\r\n        CWaitCursor WaitCursor;\t\t// This displays the hourglass cursor.\r\n\r\n        if (g_ProjectManager.LoadProject(lpstrCmdLine + 13))\r\n            return g_ActionManager.BurnCompilation(NULL,true);\r\n\r\n        return false;\r\n    }\r\n#ifdef _DEBUG\r\n    else if (!lstrncmp(lpstrCmdLine,SAVE_ENGLISH_STRINGS_PARAM,_countof(SAVE_ENGLISH_STRINGS_PARAM) - 1))\r\n    {\r\n        return SaveEnglishStrings(lpstrCmdLine + _countof(SAVE_ENGLISH_STRINGS_PARAM) - 1);\r\n    }\r\n#endif\r\n    // General, open file.\r\n    else if (lpstrCmdLine[0] != '\\0')\r\n    {\r\n        TCHAR *szFullPath = new TCHAR[lstrlen(lpstrCmdLine) + 1];\r\n\r\n        // Strip quotes.\r\n        if (lpstrCmdLine[0] == '\\\"')\r\n        {\r\n            lstrcpy(szFullPath,lpstrCmdLine + 1);\r\n            szFullPath[lstrlen(szFullPath) - 1] = '\\0';\r\n        }\r\n        else\r\n        {\r\n            lstrcpy(szFullPath,lpstrCmdLine);\r\n        }\r\n\r\n        // Check what type of file that was specified.\r\n        int iDelim = LastDelimiter(lpstrCmdLine,'.');\r\n        if (iDelim != -1)\r\n        {\r\n            // FIXME: Move this check to a common class for disc image management?\r\n            if (!lstrcmpi(szFullPath + iDelim,_T(\".iso\")) ||\r\n                !lstrcmpi(szFullPath + iDelim,_T(\".img\")) ||\r\n                !lstrcmpi(szFullPath + iDelim,_T(\".cue\")) ||\r\n                !lstrcmpi(szFullPath + iDelim,_T(\".bin\")) ||\r\n                !lstrcmpi(szFullPath + iDelim,_T(\".raw\")))\r\n                return g_ActionManager.BurnImageEx(NULL,true,szFullPath);\r\n        }\r\n\r\n        g_pMainFrame->m_bDefaultWizard = false;\r\n\r\n        lstrcpy(g_pMainFrame->m_szProjectFile,szFullPath);\r\n        delete [] szFullPath;\r\n    }\r\n\r\n    return Run(lpstrCmdLine,nCmdShow);\r\n}\r\n\r\nint WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpstrCmdLine,int nCmdShow)\r\n{\r\n    try\r\n    {\r\n#ifdef _DEBUG\r\n        // In debug builds, generate a memory leak report on exit.\r\n        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);\r\n#endif\r\n\r\n        // We need to call OleInitialize(), instead of CoInitialize(),\r\n        // because the main frame will be calling RegisterDragDrop() later.\r\n        HRESULT hRes = OleInitialize(NULL);\r\n        if (!SUCCEEDED(hRes))\r\n            ckcore::throw_from_hresult(hRes,_T(\"Error during OleInitialize: \" ));\r\n\r\n        // This resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used.\r\n        ::DefWindowProc(NULL,0,0,0L);\r\n\r\n        AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);\r\n\r\n        hRes = _Module.Init(NULL,hInstance);\r\n        ATLASSERT(SUCCEEDED(hRes));\r\n\r\n        INT_PTR nRet;\r\n        CLogDlg LogDlg;  // After LogDlg.Create() we must call LogDlg.DestroyWindow(),\r\n                         // even if an exception is thrown. Otherwise, the application\r\n                         // will crash on shutdown.\r\n\r\n        try\t// Also acts as scope for variable 'MainFrame' etc.\r\n        {\r\n            // In order for it to work under Visual Studio 2005 Express / ATL 3.0,\r\n            // the constructor for CMainFrame etc. must run after _Module.Init() has been\r\n            // called, and the destructor must run before _Module.Term().\r\n            CMainFrame MainFrame;\r\n            CProgressDlg ProgressDlg;\r\n            CSimpleProgressDlg SimpleProgressDlg;\r\n            CAboutWindow AboutWnd;\r\n\r\n            g_pLogDlg = &LogDlg;\r\n            g_pMainFrame = &MainFrame;\r\n            g_pProgressDlg = &ProgressDlg;\r\n            g_pSimpleProgressDlg = &SimpleProgressDlg;\r\n            g_pAboutWnd = &AboutWnd;\r\n\r\n            // Load the configuration.\r\n            g_SettingsManager.Load();\r\n\r\n            // Create the log dialog.\r\n            LogDlg.Create(HWND_DESKTOP);\r\n\r\n            // Translate some of the string tables.\r\n            lngTranslateTables();\r\n\r\n            // Initialize, SCSI buses etc.\r\n            PerformDeviceScan();\r\n\r\n            // Load the codecs.\r\n            TCHAR szCodecPath[MAX_PATH];\r\n            GetModuleFileName(NULL,szCodecPath,MAX_PATH - 1);\r\n\r\n            ExtractFilePath(szCodecPath);\r\n            lstrcat(szCodecPath,_T(\"codecs\\\\\"));\r\n\r\n            if (!g_CodecManager.LoadCodecs(szCodecPath))\r\n            {\r\n                if (g_GlobalSettings.m_bCodecWarning)\r\n                {\r\n                    CInfoDlg InfoDlg(&g_GlobalSettings.m_bCodecWarning,lngGetString(ERROR_LOADCODECS),INFODLG_NOCANCEL | INFODLG_ICONWARNING);\r\n                    InfoDlg.DoModal();\r\n                }\r\n            }\r\n\r\n            // Display the main window.\r\n            nRet = ParseAndRun(lpstrCmdLine,nCmdShow);\r\n\r\n            // Remove any temporary files.\r\n            g_TempManager.CleanUp();\r\n\r\n            // Destroy the log dialog.\r\n            if (LogDlg.IsWindow())\r\n                LogDlg.DestroyWindow();\r\n        }\r\n        catch ( ... )\r\n        {\r\n            // If someone tries to touch g_pMainFrame etc. after the object has been destroyed,\r\n            // we need to find out.\r\n            g_pLogDlg = NULL;\r\n            g_pMainFrame = NULL;\r\n            g_pProgressDlg = NULL;\r\n            g_pSimpleProgressDlg = NULL;\r\n            g_pAboutWnd = NULL;\r\n\r\n            // Destroy the log dialog.\r\n            if (LogDlg.IsWindow())\r\n                LogDlg.DestroyWindow();\r\n\r\n            _Module.Term();\r\n            OleUninitialize();\r\n\r\n            throw;\r\n        }\r\n\r\n        // If someone tries to touch g_pMainFrame etc. after the object has been destroyed,\r\n        // we need to find out.\r\n        g_pLogDlg = NULL;\r\n        g_pMainFrame = NULL;\r\n        g_pProgressDlg = NULL;\r\n        g_pSimpleProgressDlg = NULL;\r\n        g_pAboutWnd = NULL;\r\n\r\n        _Module.Term();\r\n        OleUninitialize();\r\n\r\n        return (int)nRet;\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        ATLVERIFY(0 != MessageBox(NULL,\r\n                                  ckcore::get_except_msg(e).c_str(),\r\n                                  lngGetString(GENERAL_ERROR),\r\n                                  MB_OK | MB_ICONERROR | MB_APPLMODAL));\r\n        return 1;\r\n    }\r\n}\r\n\r\nvoid ProcessMessages()\r\n{\r\n    MSG Msg;\r\n    while (::PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) \r\n    { \r\n        TranslateMessage(&Msg);\r\n        DispatchMessage(&Msg);\r\n    }\r\n}"
  },
  {
    "path": "src/app/infrarecorder.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <ckmmc/devicemanager.hh>\r\n#include <base/codec_manager.hh>\r\n\r\nvoid ProcessMessages();\r\n\r\nextern CCodecManager g_CodecManager;\r\nextern ckmmc::DeviceManager g_DeviceManager;\r\n"
  },
  {
    "path": "src/app/infrarecorder.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"atlres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (United States) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"atlres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Menu\r\n//\r\n\r\nIDR_MAINFRAME MENU\r\nBEGIN\r\n    POPUP \"&File\"\r\n    BEGIN\r\n        POPUP \"&New Project\"\r\n        BEGIN\r\n            MENUITEM \"Data &CD\",                    ID_NEWPROJECT_DATACD\r\n            MENUITEM \"Data CD (&multi-session)\",    ID_NEWPROJECT_DATACDMS\r\n            MENUITEM \"Data &DVD\",                   ID_NEWPROJECT_DATADVD\r\n            MENUITEM SEPARATOR\r\n            MENUITEM \"&Audio CD\",                   ID_NEWPROJECT_AUDIO\r\n            MENUITEM \"Mi&xed-Mode CD\",              ID_NEWPROJECT_MIXED\r\n            MENUITEM SEPARATOR\r\n            MENUITEM \"DVD-&Video Disc...\",          ID_NEWPROJECT_DVDVIDEO\r\n        END\r\n        MENUITEM \"&Open Project...\\tCtrl+O\",    ID_FILE_OPEN\r\n        MENUITEM \"&Save Project\\tCtrl+S\",       ID_FILE_SAVE\r\n        MENUITEM \"Save Project &As...\",         ID_FILE_SAVE_AS\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"Project &Properties...\",      ID_FILE_PROJECTPROPERTIES\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"E&xit\",                       ID_APP_EXIT\r\n    END\r\n    POPUP \"&Edit\"\r\n    BEGIN\r\n        MENUITEM \"&New Folder\",                 ID_EDIT_NEWFOLDER\r\n        MENUITEM \"Rena&me\\tF2\",                 ID_EDIT_RENAME\r\n        MENUITEM \"&Remove\\tDel\",                ID_EDIT_REMOVE\r\n        POPUP \"&Add\"\r\n        BEGIN\r\n            MENUITEM \"&Selected\",                   ID_ADD_SELECTED\r\n            MENUITEM \"&All\",                        ID_ADD_ALL\r\n        END\r\n        MENUITEM \"Im&port...\",                  ID_EDIT_IMPORT\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"Select &All\\tCtrl+A\",         ID_EDIT_SELECTALL\r\n        MENUITEM \"&Invert Selection\",           ID_EDIT_INVERTSELECTION\r\n    END\r\n    POPUP \"&Actions\"\r\n    BEGIN\r\n        POPUP \"Burn &Compilation\"\r\n        BEGIN\r\n            MENUITEM \"to a Compact &Disc...\",       ID_BURNCOMPILATION_COMPACTDISC\r\n            MENUITEM \"to a Disc &Image...\",         ID_BURNCOMPILATION_DISCIMAGE\r\n        END\r\n        MENUITEM \"Burn &Image...\",              ID_ACTIONS_BURNIMAGE\r\n        POPUP \"C&opy Disc\"\r\n        BEGIN\r\n            MENUITEM \"to a Compact &Disc...\",       ID_COPYDISC_COMPACTDISC\r\n            MENUITEM \"to a Disc &Image...\",         ID_COPYDISC_DISCIMAGE\r\n        END\r\n        MENUITEM \"&Manage Tracks...\",           ID_ACTIONS_MANAGETRACKS\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"E&rase/Format Disc...\",       ID_ACTIONS_ERASERE\r\n        MENUITEM \"C&lose Disc...\",              ID_ACTIONS_FIXATEDISC\r\n        MENUITEM SEPARATOR\r\n        POPUP \"Disc &Information\"\r\n        BEGIN\r\n            MENUITEM \"(no drives found)\",           ID_DISCINFORMATION_, GRAYED\r\n        END\r\n        MENUITEM \"Import &Session...\",          ID_ACTIONS_IMPORTSESSION\r\n        MENUITEM SEPARATOR\r\n        POPUP \"&Eject Disc\"\r\n        BEGIN\r\n            MENUITEM \"(no drives found)\",           ID_EJECTDISC_, GRAYED\r\n        END\r\n    END\r\n    POPUP \"&View\"\r\n    BEGIN\r\n        POPUP \"&Toolbars\"\r\n        BEGIN\r\n            MENUITEM \"&Standard Buttons\",           ID_VIEW_STANDARDTOOLBAR\r\n            MENUITEM SEPARATOR\r\n            MENUITEM \"&Customize...\",               ID_VIEW_TBCUSTOMIZE\r\n        END\r\n        MENUITEM \"&Status Bar\",                 ID_VIEW_STATUS_BAR\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"Program &Log...\",             ID_VIEW_PROGRAMLOG\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"Lar&ge Icons\",                32792\r\n        MENUITEM \"S&mall Icons\",                32793\r\n        MENUITEM \"&List\",                       32794\r\n        MENUITEM \"&Details\",                    32795\r\n    END\r\n    POPUP \"&Options\"\r\n    BEGIN\r\n        MENUITEM \"&Configuration...\",           ID_OPTIONS_CONFIGURATION\r\n        MENUITEM \"&Devices...\",                 ID_OPTIONS_DEVICES\r\n    END\r\n    POPUP \"&Help\"\r\n    BEGIN\r\n        MENUITEM \"&Help Topics\",                ID_HELP_HELPTOPICS\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"&About InfraRecorder...\",     ID_APP_ABOUT\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Icon\r\n//\r\n\r\n// Icon with lowest ID value placed first to ensure application icon\r\n// remains consistent on all systems.\r\nIDR_MAINFRAME           ICON                    \"Resources\\\\icon-main.ico\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_PROPPAGE_DEVICEGENERAL DIALOGEX 0, 0, 274, 234\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,21,20\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,31,259,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Static\",IDC_NAMESTATIC,56,13,210,8\r\n    LTEXT           \"Type:\",IDC_TYPELABELSTATIC,7,39,46,8\r\n    LTEXT           \"Location:\",IDC_LOCATIONLABELSTATIC,7,54,46,8\r\n    LTEXT           \"Static\",IDC_TYPESTATIC,56,39,210,8\r\n    LTEXT           \"Static\",IDC_LOCATIONSTATIC,56,54,210,8\r\n    LTEXT           \"Buffer size:\",IDC_BUFFERLABELSTATIC,7,70,45,8\r\n    LTEXT           \"Static\",IDC_BUFFERSTATIC,56,70,210,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC2,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,86,259,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Maximum read speed:\",IDC_MAXREADLABELSTATIC,7,93,259,8\r\n    LTEXT           \"Static\",IDC_MAXREADSTATIC,12,103,254,8\r\n    LTEXT           \"Maximum write speed:\",IDC_MAXWRITELABELSTATIC,7,118,259,8\r\n    LTEXT           \"Static\",IDC_MAXWRITESTATIC,12,128,254,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC3,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,144,259,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Read:\",IDC_READSTATIC,7,151,45,8\r\n    CONTROL         \"CD-R\",IDC_READCDRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,150,33,10\r\n    CONTROL         \"DVD-RAM\",IDC_READDVDRAMCHECK,\"Button\",BS_3STATE | WS_TABSTOP,215,150,47,10\r\n    CONTROL         \"CD-RW\",IDC_READCDRWCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,150,39,10\r\n    CONTROL         \"DVD-ROM\",IDC_READDVDROMCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,163,47,10\r\n    CONTROL         \"DVD-R\",IDC_READDVDRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,162,150,37,10\r\n    LTEXT           \"Write:\",IDC_WRITESTATIC,7,192,45,8\r\n    CONTROL         \"CD-R\",IDC_WRITECDRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,192,33,10\r\n    CONTROL         \"CD-RW\",IDC_WRITECDRWCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,192,39,10\r\n    CONTROL         \"DVD-R\",IDC_WRITEDVDRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,162,192,37,10\r\n    CONTROL         \"DVD-RAM\",IDC_WRITEDVDRAMCHECK,\"Button\",BS_3STATE | WS_TABSTOP,215,192,47,10\r\n    CONTROL         \"DVD+R\",IDC_READDVDPLUSRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,163,39,10\r\n    CONTROL         \"DVD+RW\",IDC_READDVDPLUSRWCHECK,\"Button\",BS_3STATE | WS_TABSTOP,162,163,46,10\r\n    CONTROL         \"DVD+R DL\",IDC_READDVDPLUSRDLCHECK,\"Button\",BS_3STATE | WS_TABSTOP,215,163,49,10\r\n    CONTROL         \"DVD+RW DL\",IDC_READDVDPLUSRWDLCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,176,52,10\r\n    CONTROL         \"BD\",IDC_READBDCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,176,25,10\r\n    CONTROL         \"HD-DVD\",IDC_READHDDVDCHECK,\"Button\",BS_3STATE | WS_TABSTOP,162,176,41,10\r\n    CONTROL         \"DVD+R\",IDC_WRITEDVDPLUSRCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,205,39,10\r\n    CONTROL         \"DVD+RW\",IDC_WRITEDVDPLUSRWCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,205,46,10\r\n    CONTROL         \"DVD+R DL\",IDC_WRITEDVDPLUSRDLCHECK,\"Button\",BS_3STATE | WS_TABSTOP,162,205,49,10\r\n    CONTROL         \"DVD+RW DL\",IDC_WRITEDVDPLUSRWDLCHECK,\"Button\",BS_3STATE | WS_TABSTOP,215,205,56,10\r\n    CONTROL         \"BD\",IDC_WRITEBDCHECK,\"Button\",BS_3STATE | WS_TABSTOP,56,218,25,10\r\n    CONTROL         \"HD-DVD\",IDC_WRITEHDDVDCHECK,\"Button\",BS_3STATE | WS_TABSTOP,109,218,41,10\r\nEND\r\n\r\nIDD_PROPPAGE_DEVICEADVANCED DIALOGEX 0, 0, 274, 234\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Advanced\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Advanced information:\",IDC_INFOSTATIC,7,7,90,8\r\n    CONTROL         \"\",IDC_ADVLIST,\"SysListView32\",LVS_REPORT | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP,7,19,260,208\r\nEND\r\n\r\nIDD_PROPPAGE_BURNIMAGEGENERAL DIALOGEX 0, 0, 227, 196\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,20,20\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,31,213,1,WS_EX_STATICEDGE\r\n    COMBOBOX        IDC_RECORDERCOMBO,57,11,145,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Write speed:\",IDC_WRITESPEEDSTATIC,7,72,49,8\r\n    COMBOBOX        IDC_WRITESPEEDCOMBO,57,70,117,102,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Write method:\",IDC_WRITEMETHODSTATIC,7,88,49,8\r\n    COMBOBOX        IDC_WRITEMETHODCOMBO,57,86,117,86,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"\",IDC_BEVELSTATIC2,\"Static\",SS_ETCHEDHORZ | WS_GROUP,8,120,212,1,WS_EX_STATICEDGE\r\n    CONTROL         \"Eject the disc after writing\",IDC_EJECTCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,127,213,10\r\n    CONTROL         \"Simulation\",IDC_SIMULATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,140,213,10\r\n    CONTROL         \"Buffer underrun protection\",IDC_BUPCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,153,213,10\r\n    CONTROL         \"Pad data tracks\",IDC_PADCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,165,213,10\r\n    CONTROL         \"Close the disc after writing\",IDC_FIXATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,178,213,10\r\n    CONTROL         \"On the fly\",IDC_ONFLYCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,213,10\r\n    CONTROL         \"\",IDC_BEVELSTATIC3,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,64,213,1,WS_EX_STATICEDGE\r\n    CONTROL         \"Verify the disc after writing\",IDC_VERIFYCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,50,213,10\r\n    PUSHBUTTON      \"\",IDC_REFRESHBUTTON,206,11,14,13,BS_ICON\r\n    LTEXT           \"Copies:\",IDC_NUMCOPIESSTATIC,7,104,45,8\r\n    COMBOBOX        IDC_NUMCOPIESCOMBO,57,103,48,30,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\nIDD_PROPPAGE_BURNIMAGEADVANCED DIALOGEX 0, 0, 227, 134\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Advanced\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Allow overburning\",IDC_OVERBURNCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,213,10\r\n    CONTROL         \"Swap audio byte order\",IDC_SWABCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,213,10\r\n    CONTROL         \"Ignore medium size\",IDC_IGNORESIZECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,213,10\r\n    CONTROL         \"Set the SCSI IMMED flag\",IDC_IMMEDCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,45,213,10\r\n    CONTROL         \"Yamaha Audio Master Q. R.\",IDC_AUDIOMASTERCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,58,213,10\r\n    CONTROL         \"Forcespeed mode\",IDC_FORCESPEEDCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,71,213,10\r\n    CONTROL         \"Plextor VariRec write mode\",IDC_VARIRECCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,83,213,10\r\n    CONTROL         \"\",IDC_VARIRECSLIDER,\"msctls_trackbar32\",TBS_AUTOTICKS | TBS_TOOLTIPS | WS_TABSTOP,7,96,100,20\r\n    EDITTEXT        IDC_VARIRECEDIT,109,97,24,13,ES_AUTOHSCROLL | ES_READONLY\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPGENERAL DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,20,20\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,31,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Type:\",IDC_TYPELABELSTATIC,7,38,49,8\r\n    EDITTEXT        IDC_NAMEEDIT,57,11,162,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Size:\",IDC_SIZELABELSTATIC,7,53,47,8\r\n    LTEXT           \"Contains:\",IDC_CONTAINSLABELSTATIC,7,68,48,8\r\n    LTEXT           \"Static\",IDC_TYPESTATIC,57,38,162,8\r\n    LTEXT           \"Static\",IDC_SIZESTATIC,57,53,162,8\r\n    LTEXT           \"Static\",IDC_CONTAINSSTATIC,57,68,162,8\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPISO DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"ISO\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Level:\",IDC_LEVELSTATIC,7,9,50,8\r\n    COMBOBOX        IDC_LEVELCOMBO,57,7,162,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,57,212,1,WS_EX_STATICEDGE\r\n    CONTROL         \"Use Joliet file name extension\",IDC_JOLIETCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,64,212,10\r\n    CONTROL         \"Allow more than 64 characters for Joliet names\",IDC_JOLIETLONGNAMESCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,19,77,200,10\r\n    LTEXT           \"Format:\",IDC_FORMATSTATIC,7,25,49,8\r\n    COMBOBOX        IDC_FORMATCOMBO,57,23,162,108,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"Omit version numbers from ISO9660 file names\",IDC_OMITVNCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,90,212,10\r\n    CONTROL         \"Allow more than 8 directories of path depth\",IDC_DEEPDIRCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,103,212,10\r\n    COMBOBOX        IDC_CHARSETCOMBO,57,39,162,108,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Character set:\",IDC_CHARSETSTATIC,7,41,49,8\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPFIELDS DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Fields\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    EDITTEXT        IDC_PUBLISHEREDIT,57,7,162,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Publisher:\",IDC_PUBLISHERSTATIC,7,8,49,8\r\n    EDITTEXT        IDC_PREPAREREDIT,57,23,162,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_SYSTEMEDIT,57,39,162,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_VOLUMEEDIT,57,55,162,13,ES_AUTOHSCROLL\r\n    LTEXT           \"System:\",IDC_SYSTEMSTATIC,7,40,47,8\r\n    LTEXT           \"Preparer:\",IDC_PREPARERSTATIC,7,24,47,8\r\n    LTEXT           \"Volume set:\",IDC_VOLUMESTATIC,7,56,48,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,72,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Copyright file:\",IDC_COPYRIGHTSTATIC,7,80,49,8\r\n    EDITTEXT        IDC_COPYRIGHTEDIT,57,78,162,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_ABSTRACTEDIT,57,94,162,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_BIBLIOGRAPHICEDIT,57,110,162,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Abstract file:\",IDC_ABSTRACTSTATIC,7,96,49,8\r\n    LTEXT           \"Bibliographic...\",IDC_BIBLIOGRAPHICSTATIC,7,112,49,8\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPAUDIO DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Audio\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Album title:\",IDC_ALBUMSTATIC,7,9,49,8\r\n    EDITTEXT        IDC_ALBUMEDIT,57,7,161,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_ARTISTEDIT,57,23,161,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Artist:\",IDC_ARTISTSTATIC,7,25,49,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,40,212,1,WS_EX_STATICEDGE\r\n    CONTROL         \"\",IDC_TRACKLIST,\"SysListView32\",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,46,211,90\r\n    LTEXT           \"Double-click on a track to edit its settings.\",IDC_INFOSTATIC,7,139,211,8\r\nEND\r\n\r\nIDD_PROPPAGE_CONFIGGENERAL DIALOGEX 0, 0, 247, 188\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Check if autorun is enabled on each startup\",IDC_AUTORUNCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,7,233,10\r\n    CONTROL         \"Remember the last active folder\",IDC_REMEMBERSHELLCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,14,102,219,10\r\n    GROUPBOX        \"Explorer folder\",IDC_SHELLFOLDERGROUPSTATIC,7,56,233,60\r\n    LTEXT           \"Enter the folder that you want to be the default folder in the explorer view part of the program.\",IDC_SHELLFOLDERINFOSTATIC,14,66,218,18\r\n    EDITTEXT        IDC_SHELLFOLDEREDIT,14,85,201,13,ES_AUTOHSCROLL\r\n    PUSHBUTTON      \"...\",IDC_SHELLFOLDERBROWSEBUTTON,220,85,14,13\r\n    CONTROL         \"Associate InfraRecorder with .irp (InfraRecorder Project) files\",IDC_ASSOCIATECHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,233,10\r\n    GROUPBOX        \"Temporary folder\",IDC_TEMPFOLDERGROUPSTATIC,7,119,233,49\r\n    LTEXT           \"The folder specified below will be used when data has to be temporarily stored on your harddrive.\",IDC_TEMPFOLDERINFOSTATIC,14,129,218,18\r\n    EDITTEXT        IDC_TEMPFOLDEREDIT,14,149,201,13,ES_AUTOHSCROLL\r\n    PUSHBUTTON      \"...\",IDC_TEMPFOLDERBROWSEBUTTON,220,149,14,13\r\n    CONTROL         \"Associate InfraRecorder with disc images (.iso, .img and .cue)\",IDC_ASSOCIATEDISCIMAGECHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,45,233,10\r\n    CONTROL         \"Display welcome screen at startup\",IDC_WIZARDCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,233,10\r\nEND\r\n\r\nIDD_PROPPAGE_CONFIGADVANCED DIALOGEX 0, 0, 247, 188\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Advanced\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Enable program log (not recomended for regular use)\",IDC_LOGCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,233,10\r\n    GROUPBOX        \"FIFO buffer size\",IDC_FIFOGROUPSTATIC,7,30,233,57\r\n    LTEXT           \"This option allows you to change the amount of memory that will be used as a RAM buffer. This is the secondary buffer in addition to your recorder's physical buffer.\",IDC_FIFOINFOSTATIC,14,40,219,27\r\n    EDITTEXT        IDC_FIFOEDIT,14,68,41,13,ES_AUTOHSCROLL,WS_EX_RIGHT\r\n    LTEXT           \"MiB\",IDC_FIFOMBSTATIC,59,70,12,8\r\n    CONTROL         \"Enable smoke effect (requires Windows Vista Aero)\",IDC_SMOKECHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,233,10\r\nEND\r\n\r\nIDD_PROPPAGE_CONFIGLANGUAGE DIALOGEX 0, 0, 247, 188\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Language\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Language:\",IDC_LANGUAGESTATIC,7,7,233,8\r\n    COMBOBOX        IDC_LANGUAGECOMBO,7,18,131,163,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Please note that InfraRecorder needs to be restarted for new language settings to take affect.\",IDC_LANGUAGEINFOSTATIC,7,39,233,24\r\nEND\r\n\r\nIDD_PROPPAGE_CONFIGSHELLEXT DIALOGEX 0, 0, 247, 188\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Shell Extension\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Enable InfraRecorder shell extension\",IDC_SHELLEXTCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,233,10\r\n    CONTROL         \"Display context menu items in a submenu\",IDC_SHELLEXTSUBMENUCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,233,10\r\n    LTEXT           \"Register the shell extension with the following file extensions:\",IDC_SHELLEXTTEXTSTATIC,7,48,202,8\r\n    CONTROL         \"Display menu item icons\",IDC_SHELLEXTICONCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,233,10\r\n    CONTROL         \"\",IDC_SHELLEXTLIST,\"SysListView32\",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,59,233,75\r\nEND\r\n\r\nIDD_PROPPAGE_COPYDISCGENERAL DIALOGEX 0, 0, 227, 210\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    COMBOBOX        IDC_SOURCECOMBO,57,7,163,184,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Source:\",IDC_SOURCESTATIC,7,9,49,8\r\n    COMBOBOX        IDC_TARGETCOMBO,57,23,145,168,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Target:\",IDC_TARGETSTATIC,7,24,49,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,40,213,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Write speed:\",IDC_WRITESPEEDSTATIC,7,102,49,8\r\n    COMBOBOX        IDC_WRITESPEEDCOMBO,57,100,117,103,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Write method:\",IDC_WRITEMETHODSTATIC,7,118,49,8\r\n    COMBOBOX        IDC_WRITEMETHODCOMBO,57,116,117,87,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"\",IDC_BEVELSTATIC4,\"Static\",SS_ETCHEDHORZ | WS_GROUP,8,134,211,1,WS_EX_STATICEDGE\r\n    CONTROL         \"Eject the disc after writing\",IDC_EJECTCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,141,213,10\r\n    CONTROL         \"Simulation\",IDC_SIMULATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,154,213,10\r\n    CONTROL         \"Buffer underrun protection\",IDC_BUPCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,167,213,10\r\n    CONTROL         \"Pad data tracks\",IDC_PADCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,180,213,10\r\n    CONTROL         \"Close the disc after writing\",IDC_FIXATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,193,213,10\r\n    CONTROL         \"On the fly\",IDC_ONFLYCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,47,213,10\r\n    CONTROL         \"\",IDC_BEVELSTATIC5,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,94,211,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Copying on the fly is risky. Please make sure that your source device can read at least as fast as you will write.\",IDC_ONFLYSTATIC,19,59,201,17\r\n    CONTROL         \"Clone disc (recommended)\",IDC_CLONECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,79,213,10\r\n    PUSHBUTTON      \"\",IDC_REFRESHBUTTON,206,23,14,13,BS_ICON\r\nEND\r\n\r\nIDD_PROPPAGE_DISCGENERAL DIALOGEX 0, 0, 227, 214\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,20,20\r\n    LTEXT           \"Static\",IDC_NAMESTATIC,57,13,163,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,31,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Disc type:\",IDC_TYPELABELSTATIC,7,39,49,8\r\n    LTEXT           \"Static\",IDC_TYPESTATIC,57,39,163,8\r\n    LTEXT           \"Book type:\",IDC_BOOKLABELSTATIC,7,54,49,8\r\n    LTEXT           \"Static\",IDC_BOOKSTATIC,57,54,163,8\r\n    LTEXT           \"Region:\",IDC_REGIONLABELSTATIC,7,70,48,8\r\n    LTEXT           \"Static\",IDC_REGIONSTATIC,57,70,163,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC2,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,86,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Layers:\",IDC_LAYERLABELSTATIC,7,94,47,8\r\n    LTEXT           \"Static\",IDC_LAYERSTATIC,57,94,163,8\r\n    LTEXT           \"Static\",IDC_TRACKSTATIC,57,110,163,8\r\n    LTEXT           \"Tracks:\",IDC_TRACKLABELSTATIC,7,110,49,8\r\n    LTEXT           \"Static\",IDC_SESSIONSTATIC,57,126,163,8\r\n    LTEXT           \"Sessions:\",IDC_SESSIONLABELSTATIC,7,126,48,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC4,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,142,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Static\",IDC_STATUSSTATIC,57,150,163,17\r\n    LTEXT           \"Status:\",IDC_STATUSLABELSTATIC,7,150,49,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC5,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,174,211,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Used space:\",IDC_USEDSPACELABELSTATIC,7,182,50,8\r\n    LTEXT           \"Static\",IDC_USEDSPACESTATIC,57,182,163,8\r\n    LTEXT           \"Static\",IDC_FREESPACESTATIC,57,198,163,8\r\n    LTEXT           \"Free space:\",IDC_FREESPACELABELSTATIC,7,198,49,8\r\nEND\r\n\r\nIDD_PROPPAGE_READOPTIONS DIALOGEX 0, 0, 227, 158\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Read\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Ignore read errors\",IDC_NOREADERRCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,213,10\r\n    CONTROL         \"Read all sub-channel data and the full TOC\",IDC_READSUBCHANNELCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,213,10\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,32,212,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Read speed:\",IDC_READSPEEDSTATIC,7,40,50,8\r\n    COMBOBOX        IDC_READSPEEDCOMBO,57,38,117,113,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\nIDD_PROPPAGE_COPYIMAGEGENERAL DIALOGEX 0, 0, 227, 139\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Source:\",IDC_SOURCESTATIC,7,9,49,8\r\n    PUSHBUTTON      \"...\",IDC_BROWSEBUTTON,206,23,14,13\r\n    COMBOBOX        IDC_SOURCECOMBO,57,7,145,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Image file:\",IDC_IMAGESTATIC,7,24,45,8\r\n    EDITTEXT        IDC_IMAGEEDIT,57,23,145,13,ES_AUTOHSCROLL | ES_READONLY\r\n    PUSHBUTTON      \"\",IDC_REFRESHBUTTON,206,7,14,13,BS_ICON\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPBOOT DIALOGEX 0, 0, 226, 153\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"Boot\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Boot images:\",IDC_BOOTSTATIC,7,7,131,8\r\n    CONTROL         \"\",IDC_LIST,\"SysListView32\",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,18,212,108\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPFILESYS DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"File System\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"File system:\",IDC_FILESYSSTATIC,7,9,50,8\r\n    COMBOBOX        IDC_FILESYSCOMBO,57,7,162,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\nIDD_PROPPAGE_PROJECTPROPUDF DIALOGEX 0, 0, 226, 154\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"UDF\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Version:\",IDC_VERSIONSTATIC,7,9,50,8\r\n    COMBOBOX        IDC_VERSIONCOMBO,57,7,162,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO\r\nBEGIN\r\n    IDD_PROPPAGE_DEVICEGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 266\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 227\r\n    END\r\n\r\n    IDD_PROPPAGE_DEVICEADVANCED, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 267\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 227\r\n    END\r\n\r\n    IDD_PROPPAGE_BURNIMAGEGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 189\r\n    END\r\n\r\n    IDD_PROPPAGE_BURNIMAGEADVANCED, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 127\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPISO, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPFIELDS, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPAUDIO, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 218\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\n\r\n    IDD_PROPPAGE_CONFIGGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 240\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 181\r\n    END\r\n\r\n    IDD_PROPPAGE_CONFIGADVANCED, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 240\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 181\r\n    END\r\n\r\n    IDD_PROPPAGE_CONFIGLANGUAGE, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 240\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 181\r\n    END\r\n\r\n    IDD_PROPPAGE_CONFIGSHELLEXT, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 240\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 181\r\n    END\r\n\r\n    IDD_PROPPAGE_COPYDISCGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 203\r\n    END\r\n\r\n    IDD_PROPPAGE_DISCGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 207\r\n    END\r\n\r\n    IDD_PROPPAGE_READOPTIONS, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 151\r\n    END\r\n\r\n    IDD_PROPPAGE_COPYIMAGEGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 220\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 132\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPBOOT, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 146\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPFILESYS, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\n\r\n    IDD_PROPPAGE_PROJECTPROPUDF, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 219\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Accelerator\r\n//\r\n\r\nIDR_MAINFRAME ACCELERATORS\r\nBEGIN\r\n    VK_DELETE,      ID_EDIT_REMOVE,         VIRTKEY, NOINVERT\r\n    VK_F2,          ID_EDIT_RENAME,         VIRTKEY, NOINVERT\r\n    \"O\",            ID_FILE_OPEN,           VIRTKEY, CONTROL, NOINVERT\r\n    \"P\",            ID_FILE_PRINT,          VIRTKEY, CONTROL, NOINVERT\r\n    \"S\",            ID_FILE_SAVE,           VIRTKEY, CONTROL, NOINVERT\r\n    VK_F6,          ID_NEXT_PANE,           VIRTKEY, NOINVERT\r\n    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT, NOINVERT\r\n    \"V\",            ID_SHELL_PASTE,         VIRTKEY, CONTROL, NOINVERT\r\n    \"A\",            ID_EDIT_SELECTALL,      VIRTKEY, CONTROL, NOINVERT\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n FILEVERSION 0,53,0,0\r\n PRODUCTVERSION 0,53,0,0\r\n FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n FILEFLAGS 0x1L\r\n#else\r\n FILEFLAGS 0x0L\r\n#endif\r\n FILEOS 0x4L\r\n FILETYPE 0x2L\r\n FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"CompanyName\", \"Christian Kindahl\"\r\n            VALUE \"FileDescription\", \"InfraRecorder\"\r\n            VALUE \"FileVersion\", \"0.53.0.0\"\r\n            VALUE \"InternalName\", \"InfraRecorder\"\r\n            VALUE \"LegalCopyright\", \"Copyright  2006-2012 Christian Kindahl\"\r\n            VALUE \"OriginalFilename\", \"InfraRecorder.exe\"\r\n            VALUE \"ProductName\", \"InfraRecorder\"\r\n            VALUE \"ProductVersion\", \"0.53.0.0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// String Table\r\n//\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    IDR_MAINFRAME           \"InfraRecorder\"\r\n    ID_VIEW_UPLEVEL         \"Go up one level.\"\r\n    ID_TRACK_READ           \"Save the selected track(s) to your hard drive.\"\r\n    ID_TRACK_VERIFY         \"Scan the selected track(s) for errors.\"\r\n    ID_TRACK_ERASE          \"Erase the selected track(s) from the disc.\"\r\n    ID_SHELLEXT_ADD         \"Add a new file extension to the list.\"\r\n    ID_SHELLEXT_REMOVE      \"Remove the selected file extension from the list.\"\r\n    ID_BOOT_ADD             \"Add a new boot image to the project.\"\r\n    ID_BOOT_REMOVE          \"Remove the selected boot image from the project.\"\r\n    ID_BOOT_EDIT            \"Edit the selected boot image.\"\r\n    ID_NEWPROJECT_DATA      \"Create a new data project.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_FILE_OPEN            \"Open an existing project.\"\r\n    ID_FILE_CLOSE           \"Close the active document\\nClose\"\r\n    ID_FILE_SAVE            \"Save the active project.\"\r\n    ID_FILE_SAVE_AS         \"Save the active project with a new name.\"\r\n    ID_FILE_PAGE_SETUP      \"Change the printing options\\nPage Setup\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_APP_ABOUT            \"Display program information, version number and copyright.\"\r\n    ID_APP_EXIT             \"Quit the application.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_NEXT_PANE            \"Switch to the next window pane\\nNext Pane\"\r\n    ID_PREV_PANE            \"Switch back to the previous window pane\\nPrevious Pane\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_VIEW_TOOLBAR         \"Show or hide the toolbar.\\nToggle ToolBar\"\r\n    ID_VIEW_STATUS_BAR      \"Show or hide the status bar.\\nToggle StatusBar\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ATL_IDS_SCSIZE          \"Change the window size\"\r\n    ATL_IDS_SCMOVE          \"Change the window position\"\r\n    ATL_IDS_SCMINIMIZE      \"Reduce the window to an icon\"\r\n    ATL_IDS_SCMAXIMIZE      \"Enlarge the window to full size\"\r\n    ATL_IDS_SCNEXTWINDOW    \"Switch to the next document window\"\r\n    ATL_IDS_SCPREVWINDOW    \"Switch to the previous document window\"\r\n    ATL_IDS_SCCLOSE         \"Close the active window and prompts to save the documents\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ATL_IDS_SCRESTORE       \"Restore the window to normal size\"\r\n    ATL_IDS_SCTASKLIST      \"Activate Task List\"\r\n    ATL_IDS_MDICHILD        \"Activate this window\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ATL_IDS_IDLEMESSAGE     \"Ready\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ATL_IDS_MRU_FILE        \"Open this document\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_ACTIONS_ERASERE      \"Erase or format a disc.\"\r\n    ID_VIEW_PROGRAMLOG      \"View the program log.\"\r\n    ID_ACTIONS_BURNIMAGE    \"Write the contents of a disc-image to a CD.\"\r\n    ID_OPTIONS_CONFIGURATION \"Configure InfraRecorder.\"\r\n    ID_OPTIONS_DEVICES      \"View device properties and edit the device configuration.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_NEWPROJECT_DATACD    \"Create a new data CD project.\"\r\n    ID_NEWPROJECT_AUDIO     \"Create a new audio CD project.\"\r\n    ID_NEWPROJECT_MIXED     \"Create a new mixed-mode CD project.\"\r\n    ID_EDIT_NEWFOLDER       \"Add a new folder to the project.\"\r\n    ID_EDIT_RENAME          \"Rename the selected item.\"\r\n    ID_EDIT_REMOVE          \"Remove the selected item(s) from the project.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_FILE_PROJECTPROPERTIES \"Display and change project settings.\"\r\n    ID_BURNCOMPILATION_DISCIMAGE \r\n                            \"Burn the current compilation to a disc image.\"\r\n    ID_BURNCOMPILATION_COMPACTDISC \r\n                            \"Burn the current compilation to a physical compact disc.\"\r\n    ID_ACTIONS_FIXATEDISC   \"Close a disc that has not already been closed.\"\r\n    ID_ACTIONS_MANAGETRACKS \"View disc track layout, save tracks and verify tracks.\"\r\n    ID_COPYDISC_COMPACTDISC \"Copy the contents of a CD directly to another CD.\"\r\n    ID_COPYDISC_DISCIMAGE   \"Copy the contents of a CD to a disc image.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_ADD_SELECTED         \"Add the selected object(s) to the project.\"\r\n    ID_ADD_ALL              \"Add all object(s) to the project.\"\r\n    ID_ACTIONS_DISCINFORMATION \"Display disc information.\"\r\n    ID_ACTIONS_IMPORTSESSION \r\n                            \"Import an existing session to your current project.\"\r\n    ID_HELP_HELPTOPICS      \"Display help topics.\"\r\n    ID_NEWPROJECT_DVDVIDEO  \"Create a new DVD-Video disc project.\"\r\n    ID_NEWPROJECT_DATADVD   \"Create a new data DVD project.\"\r\nEND\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    ID_EDIT_SELECTALL       \"Select all items in the window.\"\r\n    ID_EDIT_INVERTSELECTION \"Reverse which items are selected and which are not.\"\r\n    ID_NEWPROJECT_DATACDMS  \"Create a new multi-session data CD project.\"\r\n    ID_EDIT_IMPORT          \"Import file(s) to the project.\"\r\nEND\r\n\r\n#endif    // English (United States) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Swedish (Sweden) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)\r\nLANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH\r\n#pragma code_page(1252)\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Menu\r\n//\r\n\r\nIDR_PROJLISTSELMENU MENU\r\nBEGIN\r\n    POPUP \"Popup Menu\"\r\n    BEGIN\r\n        MENUITEM \"Rena&me\",                     ID_EDIT_RENAME\r\n        MENUITEM \"&Remove\",                     ID_EDIT_REMOVE\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"&Properties...\",              ID_POPUPMENU_PROPERTIES\r\n    END\r\nEND\r\n\r\nIDR_PROJLISTNOSELMENU MENU\r\nBEGIN\r\n    POPUP \"Popup Menu\"\r\n    BEGIN\r\n        POPUP \"&View\"\r\n        BEGIN\r\n            MENUITEM \"Lar&ge Icons\",                32792\r\n            MENUITEM \"S&mall Icons\",                32793\r\n            MENUITEM \"&List\",                       32794\r\n            MENUITEM \"&Details\",                    32795\r\n        END\r\n        MENUITEM SEPARATOR\r\n        MENUITEM \"&New Folder\",                 ID_EDIT_NEWFOLDER\r\n    END\r\nEND\r\n\r\nIDR_SHELLTREEMENU MENU\r\nBEGIN\r\n    POPUP \"Popup Menu\"\r\n    BEGIN\r\n        MENUITEM \"&Properties\",                 ID_POPUPMENU_SHELLTREE_PROPERTIES\r\n    END\r\nEND\r\n\r\nIDR_DIAGNOSTICSMENU MENU\r\nBEGIN\r\n    POPUP \"\"\r\n    BEGIN\r\n        MENUITEM \"&Device Scan\",                ID_DIAGNOSTICS_DEVICESCAN\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Icon\r\n//\r\n\r\n// Icon with lowest ID value placed first to ensure application icon\r\n// remains consistent on all systems.\r\nIDI_MIXEDICON           ICON                    \"Resources\\\\project-mixed.ico\"\r\nIDI_AUDIOICON           ICON                    \"Resources\\\\project-audio.ico\"\r\nIDI_DATAICON            ICON                    \"Resources\\\\project-data.ico\"\r\nIDI_VIDEOICON           ICON                    \"Resources\\\\project-video.ico\"\r\nIDI_PROJECTICON         ICON                    \"Resources\\\\icon-project.ico\"\r\nIDI_REFRESHICON         ICON                    \"Resources\\\\icon-refresh.ico\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_PROGRESSDLG DIALOGEX 0, 0, 338, 143\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,225,122,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,281,122,50,14\r\n    CONTROL         \"\",IDC_TOTALPROGRESS,\"msctls_progress32\",WS_BORDER,7,18,324,9\r\n    LTEXT           \"\",IDC_TOTALSTATIC,7,7,324,8\r\n    CONTROL         \"\",IDC_MESSAGELIST,\"SysListView32\",LVS_REPORT | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,47,324,50\r\n    LTEXT           \"\",IDC_STATUSSTATIC,7,36,324,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,103,324,1,WS_EX_STATICEDGE\r\n    LTEXT           \"\",IDC_DEVICESTATIC,7,107,324,8\r\n    LTEXT           \"Write-buffer:\",IDC_BUFFERSTATIC,13,117,44,8\r\n    CONTROL         \"\",IDC_BUFFERPROGRESS,\"msctls_progress32\",WS_BORDER,59,117,86,9\r\n    PUSHBUTTON      \"Reload\",IDC_RELOADBUTTON,170,122,50,14,NOT WS_VISIBLE\r\nEND\r\n\r\nIDD_SIMPLEPROGRESSDLG DIALOGEX 0, 0, 338, 108\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,225,87,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,281,87,50,14\r\n    CONTROL         \"\",IDC_MESSAGELIST,\"SysListView32\",LVS_REPORT | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,18,324,50\r\n    LTEXT           \"\",IDC_STATUSSTATIC,7,7,324,8\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,73,324,1,WS_EX_STATICEDGE\r\n    LTEXT           \"\",IDC_DEVICESTATIC,7,78,324,8\r\n    PUSHBUTTON      \"Reload\",IDC_RELOADBUTTON,170,87,50,14,NOT WS_VISIBLE\r\nEND\r\n\r\nIDD_ERASEDLG DIALOGEX 0, 0, 250, 115\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Erase/Format Disc\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,193,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,193,24,50,14\r\n    LTEXT           \"Recorder:\",IDC_RECORDERSTATIC,7,7,177,8\r\n    COMBOBOX        IDC_RECORDERCOMBO,7,18,161,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Erase method:\",IDC_METHODSTATIC,7,39,123,8\r\n    COMBOBOX        IDC_METHODCOMBO,7,50,124,58,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"Ignore illegal TOC (force erase)\",IDC_FORCECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,72,236,10\r\n    CONTROL         \"Eject the disc after erasing\",IDC_EJECTCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,85,236,10\r\n    CONTROL         \"Simulation\",IDC_SIMULATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,236,10\r\n    PUSHBUTTON      \"Help\",IDC_HELPBUTTON,193,41,50,14\r\n    PUSHBUTTON      \"\",IDC_REFRESHBUTTON,172,18,14,13,BS_ICON\r\n    COMBOBOX        IDC_SPEEDCOMBO,135,50,51,58,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Speed:\",IDC_SPEEDSTATIC,135,39,51,8\r\nEND\r\n\r\nIDD_LOGDLG DIALOGEX 0, 0, 320, 147\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME\r\nCAPTION \"Program Log\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,263,7,50,14\r\n    PUSHBUTTON      \"Save &As...\",ID_SAVEASBUTTON,263,126,50,14\r\n    EDITTEXT        IDC_LOGEDIT,7,7,249,133,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL\r\n    PUSHBUTTON      \"&Diagnostics\",IDC_DIAGNOSTICSBUTTON,263,24,50,14\r\n    PUSHBUTTON      \"&Files\",IDC_FILESBUTTON,263,41,50,14\r\nEND\r\n\r\nIDD_DEVICESDLG DIALOGEX 0, 0, 305, 105\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Devices\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,248,7,50,14\r\n    CONTROL         \"\",IDC_DEVICELIST,\"SysListView32\",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,18,234,80\r\n    LTEXT           \"Double-click on a device to view its detailed information.\",IDC_INFOSTATIC,7,7,219,8\r\n    PUSHBUTTON      \"Rescan\",IDC_RESCANBUTTON,248,84,50,14\r\n    PUSHBUTTON      \"Help\",IDC_HELPBUTTON,248,24,50,14\r\nEND\r\n\r\nIDD_WAITDLG DIALOGEX 0, 0, 145, 51\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    CTEXT           \"\",IDC_INFOSTATIC,7,7,131,37,SS_CENTERIMAGE\r\nEND\r\n\r\nIDD_EDITTRACKDLG DIALOGEX 0, 0, 240, 70\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,183,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,183,24,50,14\r\n    LTEXT           \"Track title:\",IDC_TITLESTATIC,7,7,169,8\r\n    LTEXT           \"Artist name:\",IDC_ARTISTSTATIC,7,39,169,8\r\n    EDITTEXT        IDC_TITLEEDIT,7,18,169,13,ES_AUTOHSCROLL\r\n    EDITTEXT        IDC_ARTISTEDIT,7,50,169,13,ES_AUTOHSCROLL\r\nEND\r\n\r\nIDD_FIXATEDLG DIALOGEX 0, 0, 250, 70\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Close Disc\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,193,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,193,24,50,14\r\n    LTEXT           \"Recorder:\",IDC_RECORDERSTATIC,7,7,179,8\r\n    COMBOBOX        IDC_RECORDERCOMBO,7,18,179,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"Eject the disc after closing\",IDC_EJECTCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,40,178,10\r\n    CONTROL         \"Simulation\",IDC_SIMULATECHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,7,53,178,10\r\n    PUSHBUTTON      \"Help\",IDC_HELPBUTTON,193,41,50,14\r\nEND\r\n\r\nIDD_TRACKSDLG DIALOGEX 0, 0, 251, 161\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Tracks\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"Close\",IDOK,194,7,50,14\r\n    LTEXT           \"Device:\",IDC_DRIVESTATIC,7,7,179,8\r\n    CONTROL         \"\",IDC_TRACKLIST,\"SysListView32\",LVS_REPORT | LVS_SHAREIMAGELISTS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,36,179,103\r\n    PUSHBUTTON      \"Help\",IDC_HELPBUTTON,194,24,50,14\r\n    COMBOBOX        IDC_DEVICECOMBO,7,18,179,144,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\nIDD_NEWFILEEXTDLG DIALOGEX 0, 0, 240, 70\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"New File Extension\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,183,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,183,24,50,14\r\n    LTEXT           \"Description:\",IDC_DESCSTATIC,7,7,170,8\r\n    EDITTEXT        IDC_DESCEDIT,7,18,169,13,ES_AUTOHSCROLL\r\n    LTEXT           \"File extensions (separated by a comma):\",IDC_EXTSTATIC,7,39,169,8\r\n    EDITTEXT        IDC_EXTEDIT,7,50,170,13,ES_AUTOHSCROLL\r\nEND\r\n\r\nIDD_INFODLG DIALOGEX 0, 0, 281, 60\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,224,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,224,24,50,14\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,20,20\r\n    LTEXT           \"\",IDC_INFOSTATIC,33,7,185,34\r\n    CONTROL         \"Do not display this message again\",IDC_DISPLAYMSGCHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,33,43,186,10\r\nEND\r\n\r\nIDD_IMPORTSESSIONDLG DIALOGEX 0, 0, 250, 85\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Import Session\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,193,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,193,24,50,14\r\n    LTEXT           \"Device:\",IDC_DRIVESTATIC,7,7,179,8\r\n    COMBOBOX        IDC_DEVICECOMBO,7,18,179,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    LTEXT           \"Static\",IDC_USEDSPACESTATIC,73,70,170,8\r\n    LTEXT           \"Used space:\",IDC_USEDSPACELABELSTATIC,7,70,64,8\r\n    LTEXT           \"Track to import:\",IDC_TRACKSTATIC,7,38,179,8\r\n    COMBOBOX        IDC_TRACKCOMBO,7,49,179,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\nIDD_SAVETRACKSDLG DIALOGEX 0, 0, 240, 70\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Save Tracks\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,183,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,183,24,50,14\r\n    LTEXT           \"Target folder:\",IDC_TARGETSTATIC,7,7,46,8\r\n    EDITTEXT        IDC_TARGETEDIT,7,18,150,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Audio track output format:\",IDC_AUDIOFORMATSTATIC,7,39,86,8\r\n    COMBOBOX        IDC_AUDIOFORMATCOMBO,7,50,109,85,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    PUSHBUTTON      \"...\",IDC_BROWSEBUTTON,162,18,14,13\r\n    PUSHBUTTON      \"Settings...\",IDC_AUDIOFORMATBUTTON,121,50,55,13\r\nEND\r\n\r\nIDD_ADDBOOTIMAGEDLG DIALOGEX 0, 0, 240, 103\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Add Boot Image\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",IDOK,183,7,50,14\r\n    PUSHBUTTON      \"Cancel\",IDCANCEL,183,24,50,14\r\n    LTEXT           \"Emulation type:\",IDC_EMULATIONSTATIC,7,7,168,8\r\n    COMBOBOX        IDC_EMULATIONCOMBO,7,18,91,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    GROUPBOX        \"Advanced options\",IDC_OPTIONSSTATIC,7,39,169,57\r\n    CONTROL         \"Don't make image bootable\",IDC_NOBOOTCHECK,\"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,14,50,158,10\r\n    EDITTEXT        IDC_BOOTSEGMENTEDIT,90,61,80,13,ES_AUTOHSCROLL,WS_EX_RIGHT\r\n    PUSHBUTTON      \"Help\",IDC_HELPBUTTON,183,41,50,14\r\n    LTEXT           \"Boot load size:\",IDC_BOOTSIZESTATIC,14,78,74,8\r\n    EDITTEXT        IDC_BOOTSIZEEDIT,90,77,80,13,ES_AUTOHSCROLL,WS_EX_RIGHT\r\n    LTEXT           \"Boot load segment:\",IDC_BOOTSEGMENTSTATIC,14,62,75,8\r\nEND\r\n\r\nIDD_CONFIRMFILEREPLACEDLG DIALOGEX 0, 0, 286, 122\r\nSTYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Confirm File Replace\"\r\nFONT 8, \"MS Shell Dlg\", 400, 0, 0x1\r\nBEGIN\r\n    DEFPUSHBUTTON   \"No\",IDC_NOBUTTON,145,101,50,14\r\n    PUSHBUTTON      \"No to All\",IDC_NOALLBUTTON,199,101,50,14\r\n    PUSHBUTTON      \"Yes\",IDC_YESBUTTON,37,101,50,14\r\n    PUSHBUTTON      \"Yes to All\",IDC_YESALLBUTTON,91,101,50,14\r\n    ICON            \"\",IDC_ICONSTATIC,7,7,21,20\r\n    LTEXT           \"The target folder already contains a file named:\",IDC_INFOSTATIC,33,7,246,22\r\n    LTEXT           \"Would you like to replace the existing file\",IDC_REPLACEINFOSTATIC,33,29,246,8\r\n    ICON            \"\",IDC_OLDICONSTATIC,36,40,21,20\r\n    LTEXT           \"\",IDC_OLDSIZESTATIC,62,41,217,8\r\n    LTEXT           \"\",IDC_OLDDATESTATIC,62,51,217,8\r\n    LTEXT           \"with this one?\",IDC_REPLACEINFO2STATIC,33,63,228,8\r\n    ICON            \"\",IDC_NEWICONSTATIC,36,74,21,20\r\n    LTEXT           \"\",IDC_NEWSIZESTATIC,62,75,217,8\r\n    LTEXT           \"\",IDC_NEWDATESTATIC,62,85,217,8\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO\r\nBEGIN\r\n    IDD_PROGRESSDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 331\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 136\r\n    END\r\n\r\n    IDD_SIMPLEPROGRESSDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 331\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 101\r\n    END\r\n\r\n    IDD_ERASEDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 243\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 108\r\n    END\r\n\r\n    IDD_LOGDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 313\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 140\r\n    END\r\n\r\n    IDD_DEVICESDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 298\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 98\r\n    END\r\n\r\n    IDD_WAITDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 138\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 44\r\n    END\r\n\r\n    IDD_EDITTRACKDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 233\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 63\r\n    END\r\n\r\n    IDD_FIXATEDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 243\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 63\r\n    END\r\n\r\n    IDD_TRACKSDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 244\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 154\r\n    END\r\n\r\n    IDD_NEWFILEEXTDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 233\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 63\r\n    END\r\n\r\n    IDD_INFODLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 274\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 53\r\n    END\r\n\r\n    IDD_IMPORTSESSIONDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 243\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 78\r\n    END\r\n\r\n    IDD_SAVETRACKSDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 233\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 63\r\n    END\r\n\r\n    IDD_ADDBOOTIMAGEDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 233\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 96\r\n    END\r\n\r\n    IDD_CONFIRMFILEREPLACEDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 279\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 115\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// PNG\r\n//\r\n\r\nIDR_WELCOMELOGOPNG      PNG                     \"Resources\\\\background-welcome_logo.png\"\r\nIDR_BUTTONFPNG          PNG                     \"Resources\\\\Buttons\\\\button-focus.png\"\r\nIDR_BUTTONHPNG          PNG                     \"Resources\\\\Buttons\\\\button-hover.png\"\r\nIDR_BUTTONHFPNG         PNG                     \"Resources\\\\Buttons\\\\button-hover_focus.png\"\r\nIDR_BUTTONNPNG          PNG                     \"Resources\\\\Buttons\\\\button-normal.png\"\r\nIDR_MBUTTONFPNG         PNG                     \"Resources\\\\Buttons\\\\multi_button-focus.png\"\r\nIDR_MBUTTONHPNG         PNG                     \"Resources\\\\Buttons\\\\multi_button-hover.png\"\r\nIDR_MBUTTONHFPNG        PNG                     \"Resources\\\\Buttons\\\\multi_button-hover_focus.png\"\r\nIDR_MBUTTONHFS1PNG      PNG                     \"Resources\\\\Buttons\\\\multi_button-hover_focus_specific1.png\"\r\nIDR_MBUTTONHFS2PNG      PNG                     \"Resources\\\\Buttons\\\\multi_button-hover_focus_specific2.png\"\r\nIDR_MBUTTONHS1PNG       PNG                     \"Resources\\\\Buttons\\\\multi_button-hover_specific1.png\"\r\nIDR_MBUTTONHS2PNG       PNG                     \"Resources\\\\Buttons\\\\multi_button-hover_specific2.png\"\r\nIDR_MBUTTONNPNG         PNG                     \"Resources\\\\Buttons\\\\multi_button-normal.png\"\r\nIDR_WIZARDAUDIOPNG      PNG                     \"Resources\\\\Wizard\\\\icon-audio_disc.png\"\r\nIDR_WIZARDCOPYPNG       PNG                     \"Resources\\\\Wizard\\\\icon-copy_disc.png\"\r\nIDR_WIZARDDATAPNG       PNG                     \"Resources\\\\Wizard\\\\icon-data_disc.png\"\r\nIDR_WIZARDREADPNG       PNG                     \"Resources\\\\Wizard\\\\icon-read_disc.png\"\r\nIDR_WIZARDVIDEOPNG      PNG                     \"Resources\\\\Wizard\\\\icon-video_disc.png\"\r\nIDR_WIZARDWRITEPNG      PNG                     \"Resources\\\\Wizard\\\\icon-write_image.png\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Bitmap\r\n//\r\n\r\nIDB_SPLASHBITMAP        BITMAP                  \"Resources\\\\background-splash.bmp\"\r\nIDB_MINITOOLBARBITMAP   BITMAP                  \"Resources\\\\toolbar-mini.bmp\"\r\nIDB_MINITOOLBARBITMAP_  BITMAP                  \"Resources\\\\toolbar-mini_.bmp\"\r\nIDB_TRACKTOOLBARBITMAP  BITMAP                  \"Resources\\\\toolbar-track.bmp\"\r\nIDB_TRACKTOOLBARBITMAP_ BITMAP                  \"Resources\\\\toolbar-track_.bmp\"\r\nIDB_MAINSMALLBITMAP     BITMAP                  \"Resources\\\\toolbar-main_small.bmp\"\r\nIDB_MAINSMALLBITMAP_    BITMAP                  \"Resources\\\\toolbar-main_small_.bmp\"\r\nIDB_MAINLARGEBITMAP     BITMAP                  \"Resources\\\\toolbar-main_large.bmp\"\r\nIDB_MAINLARGEBITMAP_    BITMAP                  \"Resources\\\\toolbar-main_large_.bmp\"\r\nIDB_PANECLOSEBITMAP     BITMAP                  \"Resources\\\\button-close.bmp\"\r\nIDB_ABOUTBITMAP         BITMAP                  \"Resources\\\\background-about.bmp\"\r\n#endif    // Swedish (Sweden) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/app/infrarecorder_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"infrarecorder\"\r\n\tProjectGUID=\"{949B73FF-BD75-47C0-B965-328513C481B4}\"\r\n\tRootNamespace=\"infrarecorder\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcored.lib ckfilesystemd.lib ckmmcd.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcored.lib ckfilesystemd.lib ckmmcd.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"false\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tBufferSecurityCheck=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcore.lib ckfilesystem.lib ckmmc.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"false\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tBufferSecurityCheck=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcore.lib ckfilesystem.lib ckmmc.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;PORTABLE\"\r\n\t\t\t\tMinimalRebuild=\"false\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tBufferSecurityCheck=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcore.lib ckfilesystem.lib ckmmc.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/infrarecorder.tlb\"\r\n\t\t\t\tHeaderFileName=\"infrarecorder.h\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"infrarecorder_i.c\"\r\n\t\t\t\tProxyFileName=\"infrarecorder_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)&quot;;&quot;$(ProjectDir)control\\&quot;;&quot;$(ProjectDir)core\\&quot;;&quot;$(ProjectDir)dialog\\&quot;;&quot;$(ProjectDir)utility\\&quot;;&quot;$(ProjectDir)..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;PORTABLE\"\r\n\t\t\t\tMinimalRebuild=\"false\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tBufferSecurityCheck=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"htmlhelp.lib winmm.lib ckcore.lib ckfilesystem.lib ckmmc.lib libpng.lib zlib.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\action_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\advanced_progress.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\directory_monitor.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\effects.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\enum_fmt_etc.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\files_data_object.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\infrarecorder.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\pidl_helper.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\png_file.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_data_object.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_drop_source.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_drop_target_base.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\registry.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_table.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\temp_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\toolbar_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\tree_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\version.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\visual_styles.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"control\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_button.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_combo_box.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_container.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_edit_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_header_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_multi_button.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_toolbar_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\double_buffered_static.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\drop_down_button.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\gradient_static.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\label_container.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\mini_html_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\project_list_view_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\project_tree_view_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\shell_list_view_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\space_meter.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\title_tip_list_view_ctrl.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\welcome_pane.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"core\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\cd_text.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_blank.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_format.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_info.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_read.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_stream.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\diagnostics.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\scsi.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"dialog\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\about_window.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\add_boot_image_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_advanced_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_image_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_image_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_advanced_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_language_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_shell_ext_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\confirm_file_replace_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_disc_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_disc_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_image_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_image_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_advanced_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\devices_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\disc_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\disc_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\edit_track_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\erase_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\fixate_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\import_session_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\info_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\log_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\main_frm.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\main_view.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\new_file_ext_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\progress_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_audio_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_boot_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_fields_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_file_sys_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_general_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_iso_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_udf_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\read_options_page.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\save_tracks_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\simple_progress_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\splash_window.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\tracks_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\wait_dlg.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"utility\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\audio_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\device_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\lang_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\shell_ext_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\trans_util.cc\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t\t<FileConfiguration\r\n\t\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t<Tool\r\n\t\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</FileConfiguration>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\action_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\advanced_progress.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\atl_compat.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\ctrl_messages.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\directory_monitor.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\effects.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\enum_fmt_etc.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\files_data_object.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\infrarecorder.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\pidl_helper.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\png_file.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_data_object.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_drop_source.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_drop_target_base.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\project_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\registry.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_table.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\temp_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\toolbar_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\translated_strings.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\tree_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\version.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\visual_styles.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"control\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_button.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_combo_box.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_container.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_edit_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_header_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_multi_button.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\custom_toolbar_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\double_buffered_static.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\drop_down_button.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\gradient_static.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\label_container.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\mini_html_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\project_list_view_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\project_tree_view_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\shell_list_view_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\space_meter.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\title_tip_list_view_ctrl.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\control\\welcome_pane.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"core\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\cd_text.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\cdrtools_parse_strings.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_blank.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_format.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_info.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_read.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_stream.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\core2_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\diagnostics.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\core\\scsi.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"dialog\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\about_window.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\add_boot_image_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_advanced_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_image_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\burn_image_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_advanced_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_language_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\config_shell_ext_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\confirm_file_replace_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_disc_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_disc_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_image_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\copy_image_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_advanced_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\device_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\devices_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\disc_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\disc_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\edit_track_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\erase_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\fixate_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\import_session_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\info_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\log_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\main_frm.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\main_view.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\new_file_ext_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\progress_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_audio_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_boot_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_fields_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_file_sys_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_general_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_iso_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\project_prop_udf_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\read_options_page.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\save_tracks_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\simple_progress_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\splash_window.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\tracks_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\dialog\\wait_dlg.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t\t<Filter\r\n\t\t\t\tName=\"utility\"\r\n\t\t\t\t>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\audio_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\device_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\lang_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\shell_ext_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t\t<File\r\n\t\t\t\t\tRelativePath=\".\\utility\\trans_util.hh\"\r\n\t\t\t\t\t>\r\n\t\t\t\t</File>\r\n\t\t\t</Filter>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\background-about.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\background-splash.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\background-welcome_logo.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\button-close.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\button-focus.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\button-hover.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\button-hover_focus.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\button-normal.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-audio_disc.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-copy_disc.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-data_disc.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-main.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-project.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-read_disc.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-refresh.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-video_disc.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\wizard\\icon-write_image.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\infrarecorder.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-focus.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover_focus.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover_focus_specific1.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover_focus_specific2.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover_specific1.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-hover_specific2.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\buttons\\multi_button-normal.png\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\project-audio.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\project-data.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\project-mixed.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\project-video.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-main_large.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-main_large_.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-main_small.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-main_small_.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-mini.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-mini_.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-track.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar-track_.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\toolbar_track_.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t\t<Global\r\n\t\t\tName=\"RESOURCE_FILE\"\r\n\t\t\tValue=\"infrarecorder.rc\"\r\n\t\t/>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/app/infrarecorder_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseP|Win32\">\n      <Configuration>ReleaseP</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseP|x64\">\n      <Configuration>ReleaseP</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|Win32\">\n      <Configuration>Template</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|x64\">\n      <Configuration>Template</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>infrarecorder</ProjectName>\n    <ProjectGuid>{949B73FF-BD75-47C0-B965-328513C481B4}</ProjectGuid>\n    <RootNamespace>infrarecorder</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKMMCDIR)\\lib64\\;$(CKROOTDIR)\\ckmmc\\lib64\\;$(CKFILESYSTEMDIR)\\lib64\\;$(CKROOTDIR)\\ckfilesystem\\lib64\\;$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(CKMMCDIR)\\lib64\\;$(CKROOTDIR)\\ckmmc\\lib64\\;$(CKFILESYSTEMDIR)\\lib64\\;$(CKROOTDIR)\\ckfilesystem\\lib64\\;$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKMMCDIR)\\include\\;$(CKROOTDIR)\\ckmmc\\include\\;$(CKFILESYSTEMDIR)\\include\\;$(CKROOTDIR)\\ckfilesystem\\include\\;$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKMMCDIR)\\lib64\\;$(CKROOTDIR)\\ckmmc\\lib64\\;$(CKFILESYSTEMDIR)\\lib64\\;$(CKROOTDIR)\\ckfilesystem\\lib64\\;$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKMMCDIR)\\lib\\;$(CKROOTDIR)\\ckmmc\\lib\\;$(CKFILESYSTEMDIR)\\lib\\;$(CKROOTDIR)\\ckfilesystem\\lib\\;$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(CKMMCDIR)\\lib\\;$(CKROOTDIR)\\ckmmc\\lib\\;$(CKFILESYSTEMDIR)\\lib\\;$(CKROOTDIR)\\ckfilesystem\\lib\\;$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKMMCDIR)\\lib\\;$(CKROOTDIR)\\ckmmc\\lib\\;$(CKFILESYSTEMDIR)\\lib\\;$(CKROOTDIR)\\ckfilesystem\\lib\\;$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level4</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcored.lib;ckfilesystemd.lib;ckmmcd.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level4</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcored.lib;ckfilesystemd.lib;ckmmcd.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>MaxSpeed</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>false</MinimalRebuild>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <BasicRuntimeChecks>Default</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <BufferSecurityCheck>true</BufferSecurityCheck>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcore.lib;ckfilesystem.lib;ckmmc.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>MaxSpeed</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>false</MinimalRebuild>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <BasicRuntimeChecks>Default</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <BufferSecurityCheck>true</BufferSecurityCheck>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcore.lib;ckfilesystem.lib;ckmmc.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>MaxSpeed</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;PORTABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>false</MinimalRebuild>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <BasicRuntimeChecks>Default</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <BufferSecurityCheck>true</BufferSecurityCheck>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcore.lib;ckfilesystem.lib;ckmmc.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)infrarecorder.tlb</TypeLibraryName>\n      <HeaderFileName>infrarecorder.h</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>infrarecorder_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>infrarecorder_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>MaxSpeed</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir);$(ProjectDir)control\\;$(ProjectDir)core\\;$(ProjectDir)dialog\\;$(ProjectDir)utility\\;$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS;PORTABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>false</MinimalRebuild>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <BasicRuntimeChecks>Default</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <BufferSecurityCheck>true</BufferSecurityCheck>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>htmlhelp.lib;winmm.lib;ckcore.lib;ckfilesystem.lib;ckmmc.lib;libpng15.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"action_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"advanced_progress.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"directory_monitor.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"effects.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"enum_fmt_etc.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"files_data_object.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"infrarecorder.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"pidl_helper.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"png_file.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"project_data_object.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"project_drop_source.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"project_drop_target_base.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"project_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"registry.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"settings_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"string_table.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"temp_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"toolbar_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"tree_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"version.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"visual_styles.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_button.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_combo_box.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_container.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_edit_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_header_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_multi_button.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_toolbar_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\double_buffered_static.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\drop_down_button.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\gradient_static.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\label_container.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\mini_html_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\project_list_view_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\project_tree_view_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\shell_list_view_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\space_meter.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\title_tip_list_view_ctrl.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"control\\welcome_pane.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\cd_text.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_blank.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_format.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_info.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_read.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_stream.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\diagnostics.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"core\\scsi.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\about_window.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\add_boot_image_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_advanced_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_image_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_image_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_advanced_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_language_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_shell_ext_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\confirm_file_replace_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_disc_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_disc_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_image_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_image_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_advanced_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\devices_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\disc_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\disc_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\edit_track_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\erase_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\fixate_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\import_session_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\info_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\log_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\main_frm.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\main_view.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\new_file_ext_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\progress_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_audio_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_boot_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_fields_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_file_sys_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_iso_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_udf_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\read_options_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\save_tracks_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\simple_progress_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\splash_window.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\tracks_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\wait_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"utility\\audio_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"utility\\device_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"utility\\lang_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"utility\\shell_ext_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"utility\\trans_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"action_manager.hh\" />\n    <None Include=\"advanced_progress.hh\" />\n    <None Include=\"atl_compat.hh\" />\n    <None Include=\"ctrl_messages.hh\" />\n    <None Include=\"directory_monitor.hh\" />\n    <None Include=\"effects.hh\" />\n    <None Include=\"enum_fmt_etc.hh\" />\n    <None Include=\"files_data_object.hh\" />\n    <None Include=\"infrarecorder.hh\" />\n    <None Include=\"pidl_helper.hh\" />\n    <None Include=\"png_file.hh\" />\n    <None Include=\"project_data_object.hh\" />\n    <None Include=\"project_drop_source.hh\" />\n    <None Include=\"project_drop_target_base.hh\" />\n    <None Include=\"project_manager.hh\" />\n    <None Include=\"registry.hh\" />\n    <None Include=\"settings.hh\" />\n    <None Include=\"settings_manager.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"string_table.hh\" />\n    <None Include=\"temp_manager.hh\" />\n    <None Include=\"toolbar_manager.hh\" />\n    <None Include=\"translated_strings.hh\" />\n    <None Include=\"tree_manager.hh\" />\n    <None Include=\"version.hh\" />\n    <None Include=\"visual_styles.hh\" />\n    <None Include=\"control\\custom_button.hh\" />\n    <None Include=\"control\\custom_combo_box.hh\" />\n    <None Include=\"control\\custom_container.hh\" />\n    <None Include=\"control\\custom_edit_ctrl.hh\" />\n    <None Include=\"control\\custom_header_ctrl.hh\" />\n    <None Include=\"control\\custom_multi_button.hh\" />\n    <None Include=\"control\\custom_toolbar_ctrl.hh\" />\n    <None Include=\"control\\double_buffered_static.hh\" />\n    <None Include=\"control\\drop_down_button.hh\" />\n    <None Include=\"control\\gradient_static.hh\" />\n    <None Include=\"control\\label_container.hh\" />\n    <None Include=\"control\\mini_html_ctrl.hh\" />\n    <None Include=\"control\\project_list_view_ctrl.hh\" />\n    <None Include=\"control\\project_tree_view_ctrl.hh\" />\n    <None Include=\"control\\shell_list_view_ctrl.hh\" />\n    <None Include=\"control\\space_meter.hh\" />\n    <None Include=\"control\\title_tip_list_view_ctrl.hh\" />\n    <None Include=\"control\\welcome_pane.hh\" />\n    <None Include=\"core\\cd_text.hh\" />\n    <None Include=\"core\\cdrtools_parse_strings.hh\" />\n    <None Include=\"core\\core.hh\" />\n    <None Include=\"core\\core2.hh\" />\n    <None Include=\"core\\core2_blank.hh\" />\n    <None Include=\"core\\core2_format.hh\" />\n    <None Include=\"core\\core2_info.hh\" />\n    <None Include=\"core\\core2_read.hh\" />\n    <None Include=\"core\\core2_stream.hh\" />\n    <None Include=\"core\\core2_util.hh\" />\n    <None Include=\"core\\diagnostics.hh\" />\n    <None Include=\"core\\scsi.hh\" />\n    <None Include=\"dialog\\about_window.hh\" />\n    <None Include=\"dialog\\add_boot_image_dlg.hh\" />\n    <None Include=\"dialog\\burn_advanced_page.hh\" />\n    <None Include=\"dialog\\burn_image_dlg.hh\" />\n    <None Include=\"dialog\\burn_image_general_page.hh\" />\n    <None Include=\"dialog\\config_advanced_page.hh\" />\n    <None Include=\"dialog\\config_dlg.hh\" />\n    <None Include=\"dialog\\config_general_page.hh\" />\n    <None Include=\"dialog\\config_language_page.hh\" />\n    <None Include=\"dialog\\config_shell_ext_page.hh\" />\n    <None Include=\"dialog\\confirm_file_replace_dlg.hh\" />\n    <None Include=\"dialog\\copy_disc_dlg.hh\" />\n    <None Include=\"dialog\\copy_disc_general_page.hh\" />\n    <None Include=\"dialog\\copy_image_dlg.hh\" />\n    <None Include=\"dialog\\copy_image_general_page.hh\" />\n    <None Include=\"dialog\\device_advanced_page.hh\" />\n    <None Include=\"dialog\\device_dlg.hh\" />\n    <None Include=\"dialog\\device_general_page.hh\" />\n    <None Include=\"dialog\\devices_dlg.hh\" />\n    <None Include=\"dialog\\disc_dlg.hh\" />\n    <None Include=\"dialog\\disc_general_page.hh\" />\n    <None Include=\"dialog\\edit_track_dlg.hh\" />\n    <None Include=\"dialog\\erase_dlg.hh\" />\n    <None Include=\"dialog\\fixate_dlg.hh\" />\n    <None Include=\"dialog\\import_session_dlg.hh\" />\n    <None Include=\"dialog\\info_dlg.hh\" />\n    <None Include=\"dialog\\log_dlg.hh\" />\n    <None Include=\"dialog\\main_frm.hh\" />\n    <None Include=\"dialog\\main_view.hh\" />\n    <None Include=\"dialog\\new_file_ext_dlg.hh\" />\n    <None Include=\"dialog\\progress_dlg.hh\" />\n    <None Include=\"dialog\\project_prop_audio_page.hh\" />\n    <None Include=\"dialog\\project_prop_boot_page.hh\" />\n    <None Include=\"dialog\\project_prop_dlg.hh\" />\n    <None Include=\"dialog\\project_prop_fields_page.hh\" />\n    <None Include=\"dialog\\project_prop_file_sys_page.hh\" />\n    <None Include=\"dialog\\project_prop_general_page.hh\" />\n    <None Include=\"dialog\\project_prop_iso_page.hh\" />\n    <None Include=\"dialog\\project_prop_udf_page.hh\" />\n    <None Include=\"dialog\\read_options_page.hh\" />\n    <None Include=\"dialog\\save_tracks_dlg.hh\" />\n    <None Include=\"dialog\\simple_progress_dlg.hh\" />\n    <None Include=\"dialog\\splash_window.hh\" />\n    <None Include=\"dialog\\tracks_dlg.hh\" />\n    <None Include=\"dialog\\wait_dlg.hh\" />\n    <None Include=\"utility\\audio_util.hh\" />\n    <None Include=\"utility\\device_util.hh\" />\n    <None Include=\"utility\\lang_util.hh\" />\n    <None Include=\"utility\\shell_ext_util.hh\" />\n    <None Include=\"utility\\trans_util.hh\" />\n    <None Include=\"resources\\background-about.bmp\" />\n    <None Include=\"resources\\background-splash.bmp\" />\n    <None Include=\"resources\\background-welcome_logo.png\" />\n    <None Include=\"resources\\button-close.bmp\" />\n    <None Include=\"resources\\buttons\\button-focus.png\" />\n    <None Include=\"resources\\buttons\\button-hover.png\" />\n    <None Include=\"resources\\buttons\\button-hover_focus.png\" />\n    <None Include=\"resources\\buttons\\button-normal.png\" />\n    <None Include=\"resources\\wizard\\icon-audio_disc.png\" />\n    <None Include=\"resources\\wizard\\icon-copy_disc.png\" />\n    <None Include=\"resources\\wizard\\icon-data_disc.png\" />\n    <None Include=\"resources\\icon-main.ico\" />\n    <None Include=\"resources\\icon-project.ico\" />\n    <None Include=\"resources\\wizard\\icon-read_disc.png\" />\n    <None Include=\"resources\\icon-refresh.ico\" />\n    <None Include=\"resources\\wizard\\icon-video_disc.png\" />\n    <None Include=\"resources\\wizard\\icon-write_image.png\" />\n    <None Include=\"resources\\buttons\\multi_button-focus.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover_focus.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover_focus_specific1.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover_focus_specific2.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover_specific1.png\" />\n    <None Include=\"resources\\buttons\\multi_button-hover_specific2.png\" />\n    <None Include=\"resources\\buttons\\multi_button-normal.png\" />\n    <None Include=\"resources\\project-audio.ico\" />\n    <None Include=\"resources\\project-data.ico\" />\n    <None Include=\"resources\\project-mixed.ico\" />\n    <None Include=\"resources\\project-video.ico\" />\n    <None Include=\"resources\\toolbar-main_large.bmp\" />\n    <None Include=\"resources\\toolbar-main_large_.bmp\" />\n    <None Include=\"resources\\toolbar-main_small.bmp\" />\n    <None Include=\"resources\\toolbar-main_small_.bmp\" />\n    <None Include=\"resources\\toolbar-mini.bmp\" />\n    <None Include=\"resources\\toolbar-mini_.bmp\" />\n    <None Include=\"resources\\toolbar-track.bmp\" />\n    <None Include=\"resources\\toolbar-track_.bmp\" />\n    <None Include=\"resources\\toolbar_track_.bmp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"infrarecorder.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n  <ProjectExtensions>\n    <VisualStudio>\n      <UserProperties RESOURCE_FILE=\"infrarecorder.rc\" />\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/app/infrarecorder_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{d85c6bed-28d6-420b-af8f-ede0217d10dc}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>\n    </Filter>\n    <Filter Include=\"Source Files\\control\">\n      <UniqueIdentifier>{1f2547c6-c107-48fd-95f8-6b902e5496cd}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\core\">\n      <UniqueIdentifier>{b9d0e8e3-351c-4a30-ad56-adda8e3d77fe}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\dialog\">\n      <UniqueIdentifier>{1d87a704-ef86-428c-9275-904ca3cdb4bc}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\utility\">\n      <UniqueIdentifier>{fcb35f20-d0bf-4159-8263-ca8767d27618}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{e901b0d8-2399-4d03-8b03-a1c9a3d7cb9d}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\\control\">\n      <UniqueIdentifier>{f5fe78e4-6571-4719-b9c7-2d8dc16f1de2}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\core\">\n      <UniqueIdentifier>{71c00cda-4259-42b7-b432-6f42bc3b1c0e}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\dialog\">\n      <UniqueIdentifier>{730528af-b1b8-4eb3-99a5-8c22fb865ba2}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Header Files\\utility\">\n      <UniqueIdentifier>{2594990d-46e8-42f3-aa59-15d435e67ea8}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{781d6da1-ed1a-48c5-aa4b-f8ce12a3af5d}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"action_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"advanced_progress.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"directory_monitor.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"effects.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"enum_fmt_etc.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"files_data_object.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"infrarecorder.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"pidl_helper.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"png_file.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"project_data_object.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"project_drop_source.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"project_drop_target_base.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"project_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"registry.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"settings_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"string_table.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"temp_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"toolbar_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"tree_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"version.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"visual_styles.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_button.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_combo_box.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_container.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_edit_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_header_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_multi_button.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\custom_toolbar_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\double_buffered_static.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\drop_down_button.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\gradient_static.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\label_container.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\mini_html_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\project_list_view_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\project_tree_view_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\shell_list_view_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\space_meter.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\title_tip_list_view_ctrl.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"control\\welcome_pane.cc\">\n      <Filter>Source Files\\control</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\cd_text.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_blank.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_format.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_info.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_read.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_stream.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\core2_util.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\diagnostics.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"core\\scsi.cc\">\n      <Filter>Source Files\\core</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\about_window.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\add_boot_image_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_advanced_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_image_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\burn_image_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_advanced_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_language_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\config_shell_ext_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\confirm_file_replace_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_disc_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_disc_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_image_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\copy_image_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_advanced_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\device_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\devices_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\disc_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\disc_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\edit_track_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\erase_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\fixate_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\import_session_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\info_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\log_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\main_frm.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\main_view.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\new_file_ext_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\progress_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_audio_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_boot_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_fields_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_file_sys_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_general_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_iso_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\project_prop_udf_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\read_options_page.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\save_tracks_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\simple_progress_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\splash_window.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\tracks_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dialog\\wait_dlg.cc\">\n      <Filter>Source Files\\dialog</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utility\\audio_util.cc\">\n      <Filter>Source Files\\utility</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utility\\device_util.cc\">\n      <Filter>Source Files\\utility</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utility\\lang_util.cc\">\n      <Filter>Source Files\\utility</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utility\\shell_ext_util.cc\">\n      <Filter>Source Files\\utility</Filter>\n    </ClCompile>\n    <ClCompile Include=\"utility\\trans_util.cc\">\n      <Filter>Source Files\\utility</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"action_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"advanced_progress.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"atl_compat.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"ctrl_messages.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"directory_monitor.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"effects.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"enum_fmt_etc.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"files_data_object.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"infrarecorder.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"pidl_helper.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"png_file.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"project_data_object.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"project_drop_source.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"project_drop_target_base.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"project_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"registry.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"settings.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"settings_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"string_table.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"temp_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"toolbar_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"translated_strings.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"tree_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"version.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"visual_styles.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"control\\custom_button.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_combo_box.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_container.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_edit_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_header_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_multi_button.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\custom_toolbar_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\double_buffered_static.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\drop_down_button.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\gradient_static.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\label_container.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\mini_html_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\project_list_view_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\project_tree_view_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\shell_list_view_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\space_meter.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\title_tip_list_view_ctrl.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"control\\welcome_pane.hh\">\n      <Filter>Header Files\\control</Filter>\n    </None>\n    <None Include=\"core\\cd_text.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\cdrtools_parse_strings.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_blank.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_format.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_info.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_read.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_stream.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\core2_util.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\diagnostics.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"core\\scsi.hh\">\n      <Filter>Header Files\\core</Filter>\n    </None>\n    <None Include=\"dialog\\about_window.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\add_boot_image_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\burn_advanced_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\burn_image_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\burn_image_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\config_advanced_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\config_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\config_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\config_language_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\config_shell_ext_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\confirm_file_replace_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\copy_disc_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\copy_disc_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\copy_image_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\copy_image_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\device_advanced_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\device_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\device_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\devices_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\disc_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\disc_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\edit_track_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\erase_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\fixate_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\import_session_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\info_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\log_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\main_frm.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\main_view.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\new_file_ext_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\progress_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_audio_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_boot_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_fields_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_file_sys_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_general_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_iso_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\project_prop_udf_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\read_options_page.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\save_tracks_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\simple_progress_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\splash_window.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\tracks_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"dialog\\wait_dlg.hh\">\n      <Filter>Header Files\\dialog</Filter>\n    </None>\n    <None Include=\"utility\\audio_util.hh\">\n      <Filter>Header Files\\utility</Filter>\n    </None>\n    <None Include=\"utility\\device_util.hh\">\n      <Filter>Header Files\\utility</Filter>\n    </None>\n    <None Include=\"utility\\lang_util.hh\">\n      <Filter>Header Files\\utility</Filter>\n    </None>\n    <None Include=\"utility\\shell_ext_util.hh\">\n      <Filter>Header Files\\utility</Filter>\n    </None>\n    <None Include=\"utility\\trans_util.hh\">\n      <Filter>Header Files\\utility</Filter>\n    </None>\n    <None Include=\"resources\\background-about.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\background-splash.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\background-welcome_logo.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\button-close.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\button-focus.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\button-hover.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\button-hover_focus.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\button-normal.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-audio_disc.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-copy_disc.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-data_disc.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-main.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-project.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-read_disc.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-refresh.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-video_disc.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\wizard\\icon-write_image.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-focus.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover_focus.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover_focus_specific1.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover_focus_specific2.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover_specific1.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-hover_specific2.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\buttons\\multi_button-normal.png\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\project-audio.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\project-data.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\project-mixed.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\project-video.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-main_large.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-main_large_.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-main_small.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-main_small_.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-mini.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-mini_.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-track.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar-track_.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"resources\\toolbar_track_.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"infrarecorder.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/app/pidl_helper.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"pidl_helper.hh\"\r\n\r\nCPidlHelper::CPidlHelper()\r\n{\r\n    if (FAILED(SHGetMalloc(&m_spMalloc)))\r\n        m_spMalloc = NULL;\r\n}\r\n\r\nCPidlHelper::~CPidlHelper()\r\n{\r\n}\r\n\r\n/*\r\n    CPidlHelper::FreePidl\r\n    ---------------------\r\n    Frees the pidl using ILFree. It assumes that the pidl has been allocated using\r\n    ILClone or its equivalent.\r\n*/\r\nvoid CPidlHelper::FreePidl(LPITEMIDLIST &pidl)\r\n{\r\n    // FIXME: Use CoTaskMemFree(pidl); on Windows 2000 and newer.\r\n    ILFree(pidl);\r\n    pidl = NULL;\r\n}\r\n\r\n/*\r\n    CPidlHelper::Split\r\n    ------------------\r\n    Splits the pidl into a parent pidl and a relative child pidl. The caller is\r\n    responsible for freeing the pidls created. The function returns true if the\r\n    pidls where successfully created, false otherwise.\r\n*/\r\nbool CPidlHelper::Split(LPCITEMIDLIST pidl,LPITEMIDLIST *pParent,LPITEMIDLIST *pChild)\r\n{\r\n    if (pParent)\r\n    {\r\n        *pParent = NULL;\r\n        ILRemoveLastID(*pParent = ILClone(pidl));\r\n\r\n        if (!*pParent)\r\n            return false;\r\n    }\r\n\r\n    if (pChild)\r\n    {\r\n        *pChild = NULL;\r\n        *pChild = ILClone(ILFindLastID(pidl));\r\n\r\n        if (!*pChild)\r\n        {\r\n            ILFree(*pParent);\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CPidlHelper::GetPathName\r\n    ------------------------\r\n    Puts iMaxLength number of bits of the pidls name into szPathName. It assumes\r\n    that pidl is a single SHITEMID that belongs to pParent. It return true if no\r\n    errors occured, false otherwise.\r\n*/\r\nbool CPidlHelper::GetPathName(IShellFolder *pParent,LPCITEMIDLIST pidl,\r\n    TCHAR *szPathName,int iMaxLength)\r\n{\r\n    if (!pidl || !pParent)\r\n        return false;\r\n\r\n    STRRET strret;\r\n    if (FAILED(pParent->GetDisplayNameOf(pidl,SHGDN_FORPARSING/* | SHGDN_FORADDRESSBAR*/,&strret)))\r\n        return false;\r\n\r\n    // Get pidl from name.\r\n    return STRRET2TCHAR(pidl,&strret,szPathName,iMaxLength);\r\n}\r\n\r\n/*\r\n    CPidlHelper::GetDisplayPathName\r\n    -------------------------------\r\n    Puts iMaxLength number of bits of the pidls display name into szPathName.\r\n    It assumes that pidl is a single SHITEMID that belongs to pParent. It return\r\n    true if no errors occured, false otherwise.\r\n*/\r\nbool CPidlHelper::GetDisplayPathName(IShellFolder *pParent,LPCITEMIDLIST pidl,\r\n    TCHAR *szPathName,int iMaxLength)\r\n{\r\n    if (!pidl || !pParent)\r\n        return false;\r\n\r\n    STRRET strret;\r\n    if (FAILED(pParent->GetDisplayNameOf(pidl,SHGDN_FORPARSING | SHGDN_FORADDRESSBAR,&strret)))\r\n        return false;\r\n\r\n    return STRRET2TCHAR(pidl,&strret,szPathName,iMaxLength);\r\n}\r\n\r\n/*\r\n    CPidlHelper::GetPathName\r\n    ------------------------\r\n    Puts the pidls name into szPathName. It return true if no errors occured,\r\n    false otherwise.\r\n*/\r\nbool CPidlHelper::GetPathName(LPCITEMIDLIST pidl,TCHAR *szPathName)\r\n{\r\n    if (!pidl)\r\n        return false;\r\n\r\n    SHGetPathFromIDList(pidl,szPathName);\r\n\r\n    if (!lstrlen(szPathName))\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CPidlHelper::GetPidl\r\n    --------------------\r\n    Generates a pidl from a path name. The function returns true if no errors\r\n    occured, otherwise it returns false.\r\n*/\r\nbool CPidlHelper::GetPidl(TCHAR *szPathName,LPITEMIDLIST *ppidl)\r\n{\r\n    CComBSTR cbsPath(szPathName);\r\n    USES_CONVERSION;\r\n    LPWSTR wszPath = const_cast<LPWSTR>(T2CW(szPathName));\r\n    //HRVERIFY(wszPath);\r\n\r\n    CComPtr<IShellFolder>spShellFolder;\r\n    SHGetDesktopFolder(&spShellFolder);\r\n\r\n    ULONG dwEaten;\r\n    spShellFolder->ParseDisplayName(0,0,wszPath,&dwEaten,ppidl,0);\r\n\r\n    return (ppidl != NULL);\r\n}\r\n\r\n/*\r\n    CPidlHelper::strret2TCHAR\r\n    -------------------------\r\n    Converts a STREET structure to a TCHAR string of iMaxChars length. It assumes\r\n    that szTarget is a buffer large enough to contain the string. True is returned\r\n    upong success, false otherwise.\r\n*/\r\nbool CPidlHelper::STRRET2TCHAR(LPCITEMIDLIST pidl,STRRET *psr,TCHAR *szTarget,\r\n                              int iMaxChars,bool bFreeOleStr)\r\n{\r\n    USES_CONVERSION;\r\n\r\n    if (!m_spMalloc)\r\n        return false;\r\n\r\n    TCHAR *pszTmp = NULL;\r\n\r\n    switch (psr->uType)\r\n    {\r\n        case STRRET_WSTR:\r\n            pszTmp = W2T(psr->pOleStr);\r\n\r\n            /*if (bFreeOleStr)\r\n                m_spMalloc->Free(psr->pOleStr);*/\r\n            break;\r\n\r\n        case STRRET_OFFSET:\r\n            pszTmp = A2T((char *)pidl + psr->uOffset);\r\n            break;\r\n\r\n        case STRRET_CSTR:\r\n            pszTmp = A2T(psr->cStr);\r\n            break;\r\n    }\r\n\r\n    if (pszTmp != NULL)\r\n    {\r\n        lstrcpyn(szTarget,pszTmp,iMaxChars);\r\n\r\n        // The ole-string can't be freed before we have copied the result string.\r\n        if (psr->uType == STRRET_WSTR && bFreeOleStr)\r\n            m_spMalloc->Free(psr->pOleStr);\r\n    }\r\n\r\n    return NULL != pszTmp;\r\n}\r\n\r\nLPITEMIDLIST CPidlHelper::CreatePidl(unsigned int uiSize)\r\n{\r\n    LPITEMIDLIST pidl = NULL;\r\n\r\n    IMalloc* pMalloc;\r\n    if (FAILED(SHGetMalloc(&pMalloc)))\r\n        return false;\r\n\r\n    pidl = (LPITEMIDLIST)pMalloc->Alloc(uiSize);\r\n    if (pidl)\r\n       ZeroMemory(pidl,uiSize);\r\n\r\n    pMalloc->Release();\r\n    return pidl;\r\n}\r\n\r\nITEMIDLIST *CPidlHelper::GetNextPidlItem(LPCITEMIDLIST pidl)\r\n{\r\n    if (pidl)\r\n       return (ITEMIDLIST *)(BYTE *)(((BYTE *)pidl) + pidl->mkid.cb);\r\n    else\r\n       return NULL;\r\n}\r\n\r\nunsigned int CPidlHelper::GetPidlSize(LPCITEMIDLIST pidl)\r\n{\r\n    unsigned int uiTotal = 0;\r\n    ITEMIDLIST *pidlTemp = (ITEMIDLIST *)pidl;\r\n\r\n    if (pidlTemp)\r\n    {\r\n        while (pidlTemp->mkid.cb)\r\n        {\r\n            uiTotal += pidlTemp->mkid.cb;\r\n            pidlTemp = GetNextPidlItem(pidlTemp);\r\n        }  \r\n\r\n        // Requires a 16 bit zero value for the NULL terminator.\r\n        uiTotal += 2 * sizeof(BYTE);\r\n    }\r\n\r\n    return uiTotal;\r\n}\r\n\r\nLPITEMIDLIST CPidlHelper::ConcatenatePidl(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)\r\n{\r\n    LPITEMIDLIST pidlNew;\r\n    unsigned int cb1 = 0,cb2 = 0;\r\n\r\n    if (pidl1)\r\n        cb1 = GetPidlSize(pidl1) - (2 * sizeof(BYTE));\r\n\r\n    cb2 = GetPidlSize(pidl2);\r\n    pidlNew = CreatePidl(cb1 + cb2);\r\n\r\n    if (pidlNew)\r\n    {\r\n        if (pidl1)   \r\n            CopyMemory(pidlNew, pidl1, cb1);\r\n\r\n       CopyMemory(((LPBYTE)pidlNew) + cb1, pidl2, cb2);\r\n    }\r\n\r\n    return pidlNew;\r\n}\r\n"
  },
  {
    "path": "src/app/pidl_helper.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CPidlHelper \r\n{\r\nprotected:\r\n    CComPtr<IMalloc> m_spMalloc;\r\n\r\nprivate:\r\n    LPITEMIDLIST CreatePidl(unsigned int uiSize);\r\n    ITEMIDLIST *GetNextPidlItem(LPCITEMIDLIST pidl);\r\n    unsigned int GetPidlSize(LPCITEMIDLIST pidl);\r\n\r\npublic:\r\n    CPidlHelper();\r\n    virtual ~CPidlHelper();\r\n\r\n    bool GetPathName(IShellFolder *pParent,LPCITEMIDLIST pidl,TCHAR *szPathName,int iMaxLength = MAX_PATH);\r\n    bool GetDisplayPathName(IShellFolder *pParent,LPCITEMIDLIST pidl,TCHAR *szPathName,int iMaxLength = MAX_PATH);\r\n    bool GetPathName(LPCITEMIDLIST pidl,TCHAR *szPathName);\r\n    bool GetPidl(TCHAR *szPathName,LPITEMIDLIST *ppidl);\r\n    bool Split(LPCITEMIDLIST pidl,LPITEMIDLIST *pParent,LPITEMIDLIST *pChild);\r\n    bool STRRET2TCHAR(LPCITEMIDLIST pidl,STRRET *psr,TCHAR *szTarget,int iMaxChars = MAX_PATH,bool bFreeOleStr = true);\r\n    void FreePidl(LPITEMIDLIST &pidl);\r\n\r\n    LPITEMIDLIST ConcatenatePidl(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2);\r\n};\r\n"
  },
  {
    "path": "src/app/png_file.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"png_file.hh\"\r\n#include <pngpriv.h>\t// FIXME: Recent versions of libpng hides functionality used by this class.\r\n\r\nCPngFile::CPngFile() : m_ulWidth(0),m_ulHeight(0),m_pRowData(NULL)\r\n{\r\n}\r\n\r\nCPngFile::~CPngFile()\r\n{\r\n    Close();\r\n}\r\n\r\nvoid CPngFile::ReadMemFile(png_structp pPng,png_bytep pData,png_size_t iSize)\r\n{\r\n    CMemFile *pMemFile = (CMemFile *)pPng->io_ptr;\r\n    if (pMemFile->m_iRemainBytes >= iSize)\r\n    {\r\n        memcpy(pData,pMemFile->m_pData,iSize);\r\n        pMemFile->m_pData += iSize;\r\n        pMemFile->m_iRemainBytes -= iSize;\r\n    }\r\n    else\r\n    {\r\n        png_error(pPng,\"io error\");\r\n    }\r\n}\r\n\r\nbool CPngFile::Open(unsigned short usResourceId)\r\n{\r\n    HRSRC hPngResource = FindResource(NULL,MAKEINTRESOURCE(usResourceId),_T(\"PNG\"));\r\n    if (hPngResource == NULL)\r\n        return false;\r\n\r\n    unsigned long ulSize = SizeofResource(NULL,hPngResource);\r\n    HGLOBAL hPngData = LoadResource(NULL,hPngResource);\r\n    unsigned char *pData = (unsigned char *)LockResource(hPngData);\r\n\r\n    if (pData == NULL)\r\n        return false;\r\n\r\n    // Read the data.\r\n    CMemFile MemFile(pData,ulSize);\r\n\r\n    // Create data structures.\r\n    png_structp pRead = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);\r\n    png_infop pInfo = png_create_info_struct(pRead);\r\n\r\n    png_set_read_fn(pRead,&MemFile,ReadMemFile);\r\n\r\n    // Read entire image.\r\n    png_read_png(pRead,pInfo,PNG_TRANSFORM_EXPAND,0);\r\n    \r\n    if (pInfo->valid & PNG_INFO_IDAT && pInfo->pixel_depth == 32)\r\n    {\r\n        m_ulWidth = pInfo->width;\r\n        m_ulHeight = pInfo->height;\r\n        m_pRowData = pInfo->row_pointers;\r\n        pInfo->row_pointers = NULL;\r\n\r\n        for (unsigned long y = 0; y < m_ulHeight; y++)\r\n        {\r\n            unsigned char *pRowData = m_pRowData[y];\r\n            for (unsigned long x = 0; x < m_ulWidth; x++)\r\n            {\r\n                pRowData[0] = (pRowData[0] * pRowData[3]) / 255;\r\n                pRowData[1] = (pRowData[1] * pRowData[3]) / 255;\r\n                pRowData[2] = (pRowData[2] * pRowData[3]) / 255;\r\n                pRowData[3] = ~pRowData[3];\r\n                pRowData += 4;\r\n            }\r\n        }\r\n\r\n        png_destroy_read_struct(&pRead,&pInfo,0);\r\n\r\n        GlobalUnlock(hPngData);\r\n        return true;\r\n    }\r\n\r\n    png_destroy_read_struct(&pRead,&pInfo,0);\r\n\r\n    GlobalUnlock(hPngData);\r\n    return true;\r\n}\r\n\r\nbool CPngFile::Open(const TCHAR *szFullPath)\r\n{\r\n    FILE *pFile = _wfopen(szFullPath,_T(\"rb\"));\r\n    if (pFile == NULL)\r\n        return false;\r\n\r\n    // Create data structures.\r\n    png_structp pRead = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);\r\n    png_infop pInfo = png_create_info_struct(pRead);\r\n\r\n    png_init_io(pRead,pFile);\r\n\r\n    // Read entire image.\r\n    png_read_png(pRead,pInfo,PNG_TRANSFORM_EXPAND,0);\r\n    fclose(pFile);\r\n\r\n    if (pInfo->valid & PNG_INFO_IDAT && pInfo->pixel_depth == 32)\r\n    {\r\n        m_ulWidth = pInfo->width;\r\n        m_ulHeight = pInfo->height;\r\n        m_pRowData = pInfo->row_pointers;\r\n        pInfo->row_pointers = NULL;\r\n\r\n        for (unsigned long y = 0; y < m_ulHeight; y++)\r\n        {\r\n            unsigned char *pData = m_pRowData[y];\r\n            for (unsigned long x = 0; x < m_ulWidth; x++)\r\n            {\r\n                pData[0] = (pData[0] * pData[3]) / 255;\r\n                pData[1] = (pData[1] * pData[3]) / 255;\r\n                pData[2] = (pData[2] * pData[3]) / 255;\r\n                pData[3] = ~pData[3];\r\n                pData += 4;\r\n            }\r\n        }\r\n\r\n        png_destroy_read_struct(&pRead,&pInfo,0);\r\n        return true;\r\n    }\r\n\r\n    png_destroy_read_struct(&pRead,&pInfo,0);\r\n    return false;\r\n}\r\n\r\nbool CPngFile::Close()\r\n{\r\n    if (m_pRowData == NULL)\r\n        return false;\r\n\r\n    // FIXME: This does not work if libpng is linked dynamically. Maybe look into\r\n    //\t\t  saving the pInfo structure and free it with png_destroy_read_struct\r\n    //\t\t  here.\r\n    for (unsigned long y = 0; y < m_ulHeight; y++)\r\n        free(m_pRowData[y]);\r\n\r\n    free(m_pRowData);\r\n    return true;\r\n}\r\n\r\nbool CPngFile::Draw(HDC hDC,int iX,int iY,int iWidth,int iHeight)\r\n{\r\n    if (iWidth > (int)m_ulWidth)\r\n        iWidth = m_ulWidth;\r\n\r\n    if (iHeight > (int)m_ulHeight)\r\n        iHeight = m_ulHeight;\r\n\r\n    if (iWidth == 0 || iHeight == 0)\r\n        return false;\r\n\r\n    HDC hMemDC = NULL;\r\n    HBITMAP hDestBitmap = NULL,hOldBitmap = NULL;\r\n\r\n    unsigned char *pDestBits = NULL;\r\n    unsigned char **pRowData = m_pRowData + m_ulHeight - 1 - (m_ulHeight - iHeight);\r\n\r\n    //Do alpla blend\r\n    int iLineTailDest = (((24 * iWidth) + 31) / 32 * 4) - 3 * iWidth;\r\n    \r\n    BITMAPINFO bmi;\r\n    ZeroMemory(&bmi,sizeof(bmi));\r\n\r\n    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r\n    bmi.bmiHeader.biWidth = iWidth;\r\n    bmi.bmiHeader.biHeight = iHeight;\r\n    bmi.bmiHeader.biPlanes = 1;\r\n    bmi.bmiHeader.biBitCount = 24;\r\n    bmi.bmiHeader.biCompression = BI_RGB;\r\n\r\n    // Create device context.\r\n    hMemDC = CreateCompatibleDC(hDC);\r\n\r\n    hDestBitmap = CreateDIBSection(hDC,&bmi,DIB_RGB_COLORS,(void **)&pDestBits,NULL,0);\r\n    hOldBitmap = (HBITMAP)SelectObject(hMemDC,hDestBitmap);\r\n\r\n    BitBlt(hMemDC,0,0,iWidth,iHeight,hDC,iX,iY,SRCCOPY);\r\n\r\n    BYTE *p1 = pDestBits;\r\n    for (int y = 0; y < iHeight; y++)\r\n    {\r\n        BYTE *p2 = *(pRowData--);\r\n        for (int x = 0; x < iWidth; x++)\r\n        {\r\n            *p1++ = ((p2[3] * (*p1)) >> 8) + p2[2];\t// B\r\n            *p1++ = ((p2[3] * (*p1)) >> 8) + p2[1];\t// G\r\n            *p1++ = ((p2[3] * (*p1)) >> 8) + p2[0];\t// R\r\n\r\n            p2 += 4;\r\n        }\r\n        p1 += iLineTailDest;\r\n    }\r\n\r\n    // Render.\r\n    BitBlt(hDC,iX,iY,iWidth,iHeight,hMemDC,0,0,SRCCOPY);\r\n    SelectObject(hMemDC,hOldBitmap);\r\n\r\n    //Free memory.\r\n    DeleteObject(hDestBitmap);\r\n    DeleteDC(hMemDC);\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/app/png_file.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <png.h>\r\n\r\nclass CPngFile\r\n{\r\nprivate:\r\n    class CMemFile\r\n    {\r\n    public:\r\n        unsigned char *m_pData;\r\n        size_t m_iRemainBytes;\r\n\r\n        CMemFile(unsigned char *pData,size_t iRemainBytes) :\r\n            m_pData(pData),m_iRemainBytes(iRemainBytes)\r\n        {\r\n        }\r\n    };\r\n\r\n    unsigned long m_ulWidth;\r\n    unsigned long m_ulHeight;\r\n\r\n    unsigned char **m_pRowData;\r\n\r\n    static void ReadMemFile(png_structp pPng,png_bytep pData,png_size_t iSize);\r\n\r\npublic:\r\n    CPngFile();\r\n    ~CPngFile();\r\n\r\n    bool Open(unsigned short usResourceId);\r\n    bool Open(const TCHAR *szFullPath);\r\n    bool Close();\r\n\r\n    bool Draw(HDC hDC,int iX,int iY,int iWidth,int iHeight);\r\n};\r\n"
  },
  {
    "path": "src/app/project_data_object.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_data_object.hh\"\r\n#include \"enum_fmt_etc.hh\"\r\n\r\nCProjectDataObject::CProjectDataObject()\r\n{\r\n    // Reference count must ALWAYS start at 1.\r\n    m_lRefCount = 1;\r\n\r\n    memset(&m_FormatEtc,0,sizeof(m_FormatEtc));\r\n    m_FormatEtc.cfFormat = static_cast<CLIPFORMAT>(::RegisterClipboardFormat(_T(PROJECT_CF_NAME)));\r\n    m_FormatEtc.dwAspect = DVASPECT_CONTENT;\r\n    m_FormatEtc.lindex = 0;\r\n    m_FormatEtc.ptd = NULL;\r\n    m_FormatEtc.tymed = TYMED_HGLOBAL;\r\n\r\n    memset(&m_StgMedium,0,sizeof(m_StgMedium));\r\n    m_StgMedium.tymed = TYMED_HGLOBAL;\r\n\r\n    // No files have yet been extracted.\r\n    m_bOperationPerformed = false;\r\n\r\n    m_pParent = NULL;\r\n}\r\n\r\nCProjectDataObject::~CProjectDataObject()\r\n{\r\n    ReleaseStgMedium(&m_StgMedium);\r\n}\r\n\r\nvoid CProjectDataObject::Reset()\r\n{\r\n    m_bOperationPerformed = false;\r\n    m_FileItems.clear();\r\n}\r\n\r\nvoid CProjectDataObject::AddFile(CItemData *pFileItem)\r\n{\r\n    m_FileItems.push_back(pFileItem);\r\n}\r\n\r\nvoid CProjectDataObject::SetParent(CProjectNode *pParent)\r\n{\r\n    m_pParent = pParent;\r\n}\r\n\r\nbool CProjectDataObject::IsFormatSupported(FORMATETC *pFormatEtc)\r\n{\r\n    if (m_FormatEtc.cfFormat == pFormatEtc->cfFormat &&\r\n        m_FormatEtc.dwAspect == pFormatEtc->dwAspect &&\r\n        m_FormatEtc.tymed & pFormatEtc->tymed)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nHRESULT __stdcall CProjectDataObject::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    // Check to see what interface has been requested.\r\n    if (iid == IID_IDataObject || iid == IID_IUnknown)\r\n    {\r\n        AddRef();\r\n        *ppvObject = this;\r\n        return S_OK;\r\n    }\r\n    else\r\n    {\r\n        *ppvObject = 0;\r\n        return E_NOINTERFACE;\r\n    }\r\n}\r\n\r\nULONG __stdcall CProjectDataObject::AddRef()\r\n{\r\n    // Increment object reference count.\r\n    return InterlockedIncrement(&m_lRefCount);\r\n}\r\n\r\nULONG __stdcall CProjectDataObject::Release()\r\n{\r\n    // Decrement object reference count.\r\n    LONG lCount = InterlockedDecrement(&m_lRefCount);\r\n        \r\n    if (lCount == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        return lCount;\r\n    }\r\n}\r\n\r\nHRESULT __stdcall CProjectDataObject::GetData(FORMATETC *pFormatEtc,STGMEDIUM *pStgMedium)\r\n{\r\n    if (!IsFormatSupported(pFormatEtc))\r\n        return DV_E_FORMATETC;\r\n\r\n    // Copy the storage medium data.\r\n    pStgMedium->tymed = m_StgMedium.tymed;\r\n    pStgMedium->pUnkForRelease = 0;\r\n    pStgMedium->hGlobal = GlobalAlloc(GMEM_SHARE,sizeof(CProjectDropData) + sizeof(CItemData *) * m_FileItems.size());\r\n\r\n    CProjectDropData *pDropData = (CProjectDropData *)GlobalLock(pStgMedium->hGlobal);\r\n    pDropData->m_pParent = m_pParent;\r\n    pDropData->m_ppData = (CItemData **)(pDropData + sizeof(CProjectDropData));\r\n\r\n    // Copy the file names into the global memory.\r\n    unsigned int uiPos = 0;\r\n    std::vector<CItemData *>::const_iterator it;\r\n    for (it = m_FileItems.begin(); it != m_FileItems.end(); it++)\r\n        pDropData->m_ppData[uiPos++] = (CItemData *)*it;\r\n\r\n    GlobalUnlock(pDropData);\r\n    return S_OK;\r\n}\r\n\r\nHRESULT CProjectDataObject::GetDataHere(FORMATETC *pFormatEtc,STGMEDIUM *pMedium)\r\n{\r\n    return DATA_E_FORMATETC;\r\n}\r\n\r\nHRESULT __stdcall CProjectDataObject::QueryGetData(FORMATETC *pFormatEtc)\r\n{\r\n    return IsFormatSupported(pFormatEtc) ? S_OK : DV_E_FORMATETC;\r\n}\r\n\r\nHRESULT CProjectDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatEct,FORMATETC *pFormatEtcOut)\r\n{\r\n    // MUST be set to NULL.\r\n    pFormatEtcOut->ptd = NULL;\r\n\r\n    return E_NOTIMPL;\r\n}\r\n\r\nHRESULT __stdcall CProjectDataObject::SetData(FORMATETC *pFormatEtc,STGMEDIUM *pMedium,BOOL fRelease)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\nHRESULT __stdcall CProjectDataObject::EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC **ppEnumFormatEtc)\r\n{\r\n    if (dwDirection == DATADIR_GET)\r\n    {\r\n        // Windows 2000 and newer only.\r\n        //return SHCreateStdEnumFmtEtc(1,&m_FormatEtc,ppEnumFormatEtc);\r\n        return CreateEnumFmtEtc(1,&m_FormatEtc,ppEnumFormatEtc);\r\n    }\r\n    else\r\n    {\r\n        return E_NOTIMPL;\r\n    }\r\n}\r\n\r\nHRESULT CProjectDataObject::DAdvise(FORMATETC *pFormatEtc,DWORD advf,IAdviseSink *pAdvSink, \r\n    DWORD *pdwConnection)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n\r\nHRESULT CProjectDataObject::DUnadvise(DWORD dwConnection)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n\r\nHRESULT CProjectDataObject::EnumDAdvise(IEnumSTATDATA **ppEnumAdvise)\r\n{\r\n    return OLE_E_ADVISENOTSUPPORTED;\r\n}\r\n"
  },
  {
    "path": "src/app/project_data_object.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"tree_manager.hh\"\r\n\r\n#define PROJECT_CF_NAME\t\t\t\"IRPROJECT\"\r\n\r\nclass CProjectDropData\r\n{\r\npublic:\r\n    CProjectNode *m_pParent;\r\n    CItemData **m_ppData;\r\n};\r\n\r\nclass CProjectDataObject : public IDataObject\r\n{\r\nprivate:\r\n    bool m_bOperationPerformed;\r\n    long m_lRefCount;\r\n    FORMATETC m_FormatEtc;\r\n    STGMEDIUM m_StgMedium;\r\n\r\n    std::vector<CItemData *> m_FileItems;\r\n    CProjectNode *m_pParent;\r\n\r\n    bool IsFormatSupported(FORMATETC *pFormatEtc);\r\n\r\npublic:\r\n    CProjectDataObject();\r\n    ~CProjectDataObject();\r\n\r\n    void Reset();\r\n    void AddFile(CItemData *pFileItem);\r\n    void SetParent(CProjectNode *pParent);\r\n\r\n    // IUnknown members.\r\n    HRESULT __stdcall QueryInterface(REFIID iid,void **ppvObject);\r\n    ULONG __stdcall AddRef();\r\n    ULONG __stdcall Release();\r\n        \r\n    // IDataObject members.\r\n    HRESULT __stdcall GetData(FORMATETC *pFormatEtc,STGMEDIUM *pmedium);\r\n    HRESULT __stdcall GetDataHere(FORMATETC *pFormatEtc,STGMEDIUM *pmedium);\r\n    HRESULT __stdcall QueryGetData(FORMATETC *pFormatEtc);\r\n    HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC *pFormatEct,FORMATETC *pFormatEtcOut);\r\n    HRESULT __stdcall SetData(FORMATETC *pFormatEtc,STGMEDIUM *pMedium,BOOL fRelease);\r\n    HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc);\r\n    HRESULT __stdcall DAdvise(FORMATETC *pFormatEtc,DWORD advf,IAdviseSink *,DWORD *);\r\n    HRESULT __stdcall DUnadvise(DWORD dwConnection);\r\n    HRESULT __stdcall EnumDAdvise(IEnumSTATDATA **ppEnumAdvise);\r\n};\r\n"
  },
  {
    "path": "src/app/project_drop_source.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_drop_source.hh\"\r\n\r\nCProjectDropSource::CProjectDropSource()\r\n{\r\n    m_lRefCount = 1;\r\n}\r\n\r\nCProjectDropSource::~CProjectDropSource()\r\n{\r\n}\r\n\r\nHRESULT __stdcall CProjectDropSource::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    // Check to see what interface has been requested.\r\n    if (iid == IID_IDropSource || iid == IID_IUnknown)\r\n    {\r\n        AddRef();\r\n        *ppvObject = this;\r\n        return S_OK;\r\n    }\r\n    else\r\n    {\r\n        *ppvObject = 0;\r\n        return E_NOINTERFACE;\r\n    }\r\n}\r\n\r\nULONG __stdcall CProjectDropSource::AddRef()\r\n{\r\n    // Increment object reference count.\r\n    return InterlockedIncrement(&m_lRefCount);\r\n}\r\n\r\nULONG __stdcall CProjectDropSource::Release()\r\n{\r\n    // Decrement object reference count.\r\n    LONG lCount = InterlockedDecrement(&m_lRefCount);\r\n        \r\n    if (lCount == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        return lCount;\r\n    }\r\n}\r\n\r\nHRESULT __stdcall CProjectDropSource::QueryContinueDrag(BOOL fEscapePressed,DWORD grfKeyState)\r\n{\r\n    // If the escape key has been pressed we cancel the operation.\r\n    if (fEscapePressed == TRUE)\r\n        return DRAGDROP_S_CANCEL;\r\n\r\n    // If the left button has been released we should drop.\r\n    if ((grfKeyState & MK_LBUTTON) == 0)\r\n        return DRAGDROP_S_DROP;\r\n\r\n    return S_OK;\r\n}\r\n\r\nHRESULT __stdcall CProjectDropSource::GiveFeedback(DWORD dwEffect)\r\n{\r\n    return DRAGDROP_S_USEDEFAULTCURSORS;\r\n}\r\n"
  },
  {
    "path": "src/app/project_drop_source.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CProjectDropSource : public IDropSource\r\n{\r\nprivate:\r\n    long m_lRefCount;\r\n\r\npublic:\r\n    CProjectDropSource();\r\n    ~CProjectDropSource();\r\n\r\n    // IUnknown members.\r\n    HRESULT __stdcall QueryInterface(REFIID iid,void ** ppvObject);\r\n    ULONG __stdcall AddRef();\r\n    ULONG __stdcall Release();\r\n\r\n    // IDropSource members.\r\n    HRESULT __stdcall QueryContinueDrag(BOOL fEscapePressed,DWORD grfKeyState);\r\n    HRESULT __stdcall GiveFeedback(DWORD dwEffect);\r\n};\r\n"
  },
  {
    "path": "src/app/project_drop_target_base.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"project_drop_target_base.hh\"\r\n#include \"project_data_object.hh\"\r\n\r\nCProjectDropTargetBase::CProjectDropTargetBase()\r\n{\r\n    m_uiClipFormat = ::RegisterClipboardFormat(_T(PROJECT_CF_NAME));\r\n\r\n    m_lRefCount = 1;\r\n}\r\n\r\nCProjectDropTargetBase::~CProjectDropTargetBase()\r\n{\r\n}\r\n\r\nHRESULT __stdcall CProjectDropTargetBase::QueryInterface(REFIID iid,void **ppvObject)\r\n{\r\n    // Check to see what interface has been requested.\r\n    if (iid == IID_IDropTarget || iid == IID_IUnknown)\r\n    {\r\n        AddRef();\r\n        *ppvObject = this;\r\n        return S_OK;\r\n    }\r\n    else\r\n    {\r\n        *ppvObject = 0;\r\n        return E_NOINTERFACE;\r\n    }\r\n}\r\n\r\nULONG __stdcall CProjectDropTargetBase::AddRef()\r\n{\r\n    // Increment object reference count.\r\n    return InterlockedIncrement(&m_lRefCount);\r\n}\r\n\r\nULONG __stdcall CProjectDropTargetBase::Release()\r\n{\r\n    // Decrement object reference count.\r\n    LONG lCount = InterlockedDecrement(&m_lRefCount);\r\n        \r\n    if (lCount == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        return lCount;\r\n    }\r\n}\r\n\r\nCProjectDropTargetBase::eDropType CProjectDropTargetBase::QueryDataObject(IDataObject *pDataObject)\r\n{\r\n    FORMATETC fmtetc = { CF_HDROP,0,DVASPECT_CONTENT,-1,TYMED_HGLOBAL };\r\n    if (pDataObject->QueryGetData(&fmtetc) == S_OK)\r\n        return DT_HDROP;\r\n\r\n    fmtetc.cfFormat = static_cast<CLIPFORMAT>(m_uiClipFormat);\r\n    if (pDataObject->QueryGetData(&fmtetc) == S_OK)\r\n        return DT_IRPROJECT;\r\n\r\n    return DT_NONE;\r\n}\r\n\r\nHRESULT __stdcall CProjectDropTargetBase::DragEnter(IDataObject *pDataObject,DWORD grfKeyState,\r\n                                                POINTL pt,DWORD *pdwEffect)\r\n{\r\n    m_DropType = QueryDataObject(pDataObject);\r\n\r\n    *pdwEffect = DROPEFFECT_NONE;\r\n    return S_OK;\r\n}\r\n\r\nHRESULT __stdcall CProjectDropTargetBase::DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect)\r\n{\r\n    if (m_DropType != DT_NONE && OnDragOver(pt))\r\n        *pdwEffect = m_DropType == DT_HDROP ? DROPEFFECT_COPY : DROPEFFECT_MOVE;\r\n    else\r\n        *pdwEffect = DROPEFFECT_NONE;\r\n\r\n    return S_OK;\r\n}\r\n\r\nHRESULT __stdcall CProjectDropTargetBase::DragLeave()\r\n{\r\n    OnDragLeave();\r\n    return S_OK;\r\n}\r\n\r\nHRESULT __stdcall CProjectDropTargetBase::Drop(IDataObject *pDataObject,DWORD grfKeyState,\r\n                                                   POINTL pt,DWORD *pdwEffect)\r\n{\r\n    if (m_DropType != DT_NONE && OnDrop(pt,pDataObject))\r\n        *pdwEffect = m_DropType == DT_HDROP ? DROPEFFECT_COPY : DROPEFFECT_MOVE;\r\n    else\r\n        *pdwEffect = DROPEFFECT_NONE;\r\n\r\n    return S_OK;\r\n}\r\n"
  },
  {
    "path": "src/app/project_drop_target_base.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nclass CProjectDropTargetBase : public IDropTarget\r\n{\r\nprotected:\r\n    // Custom InfraRecorder clip board format identifier.\r\n    unsigned int m_uiClipFormat;\r\n\r\nprivate:\r\n    enum eDropType\r\n    {\r\n        DT_NONE,\r\n        DT_HDROP,\r\n        DT_IRPROJECT\r\n    };\r\n\r\n    eDropType m_DropType;\r\n    long m_lRefCount;\r\n\r\n    eDropType QueryDataObject(IDataObject *pDataObject);\r\n\r\npublic:\r\n    CProjectDropTargetBase();\r\n    ~CProjectDropTargetBase();\r\n\r\n    // IUnknown implementation.\r\n    HRESULT __stdcall QueryInterface(REFIID iid,void **ppvObject);\r\n    ULONG __stdcall AddRef();\r\n    ULONG __stdcall Release();\r\n\r\n    // IDropTarget implementation.\r\n    HRESULT __stdcall DragEnter(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);\r\n    HRESULT __stdcall DragOver(DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);\r\n    HRESULT __stdcall DragLeave();\r\n    HRESULT __stdcall Drop(IDataObject *pDataObject,DWORD grfKeyState,POINTL pt,DWORD *pdwEffect);\r\n\r\n    // To be implemented by inheritor.\r\n    virtual bool OnDragOver(POINTL ptCursor) = 0;\r\n    virtual bool OnDrop(POINTL ptCursor,IDataObject *pDataObject) = 0;\r\n    virtual void OnDragLeave() = 0;\r\n};\r\n"
  },
  {
    "path": "src/app/project_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <cassert>\r\n#include <ckcore/filestream.hh>\r\n#include <ckcore/directory.hh>\r\n#include <ckcore/convert.hh>\r\n#include <ckcore/linereader.hh>\r\n#include <base/string_util.hh>\r\n#include \"string_table.hh\"\r\n#include \"main_frm.hh\"\r\n#include \"audio_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"cd_text.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"project_manager.hh\"\r\n\r\nCProjectManager g_ProjectManager;\r\n\r\nCProjectManager::CFileTransaction::CFileTransaction(eMode Mode) : m_Mode(Mode)\r\n{\r\n}\r\n\r\nCProjectManager::CFileTransaction::~CFileTransaction()\r\n{\r\n}\r\n\r\nbool CProjectManager::CFileTransaction::AddDataFile(CProjectNode *pParentNode,const TCHAR *szFileName,\r\n                                                    const TCHAR *szFilePath,const TCHAR *szFullPath,\r\n                                                    FILETIME *pFileTime,unsigned __int64 uiSize)\r\n{\r\n    // Make sure that a file with this name does not already exist.\r\n    CItemData *pExistingItemData = g_TreeManager.GetChildItem(pParentNode,szFileName);\r\n    if (pExistingItemData != NULL)\r\n    {\r\n        if (m_ReplaceDlg.Execute(szFullPath,pExistingItemData))\r\n            g_ProjectManager.RemoveFile(pParentNode,pExistingItemData);\r\n        else\r\n            return false;\r\n    }\r\n\r\n    // Add the new item.\r\n    CItemData *pItemData = new CItemData();\r\n    if (m_Mode == MODE_IMPORT)\r\n        pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED | PROJECTITEM_FLAG_ISLOCKED;\r\n\r\n    // Paths.\r\n    pItemData->SetFileName(szFileName);\r\n    pItemData->SetFilePath(szFilePath);\r\n    lstrcpy(pItemData->szFullPath,szFullPath);\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(szFileName,FILE_ATTRIBUTE_NORMAL,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n\r\n    // File time.\r\n    FILETIME LocalFileTime;\r\n    if (FileTimeToLocalFileTime(pFileTime,&LocalFileTime) == TRUE)\r\n        FileTimeToDosDateTime(&LocalFileTime,&pItemData->usFileDate,&pItemData->usFileTime);\r\n\r\n    // File size.\r\n    pItemData->uiSize = uiSize;\r\n\r\n    pParentNode->m_Files.push_back(pItemData);\r\n\r\n    // Increase the total length counter.\r\n    g_ProjectManager.m_pSpaceMeter->IncreaseAllocatedSize(pItemData->uiSize);\r\n\r\n    return true;\r\n}\r\n\r\nCItemData *CProjectManager::CFileTransaction::\r\n    AddDataFile(CProjectNode *pParentNode,const TCHAR *szFullPath)\r\n{\r\n    // Make sure that a file with this name does not already exist.\r\n    TCHAR szFileName[MAX_PATH];\r\n    lstrcpy(szFileName,szFullPath);\r\n    ExtractFileName(szFileName);\r\n\r\n    CItemData *pExistingItemData = g_TreeManager.GetChildItem(pParentNode,szFileName);\r\n    if (pExistingItemData != NULL)\r\n    {\r\n        if (m_ReplaceDlg.Execute(szFullPath,pExistingItemData))\r\n            g_ProjectManager.RemoveFile(pParentNode,pExistingItemData);\r\n        else\r\n            return false;\r\n    }\r\n\r\n    // Add the new item.\r\n    CItemData *pItemData = new CItemData();\r\n    if (m_Mode == MODE_IMPORT)\r\n        pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED | PROJECTITEM_FLAG_ISLOCKED;\r\n\r\n    // Paths.\r\n    pItemData->SetFileName(szFileName);\r\n\r\n    TCHAR *szSafeFilePath = pItemData->BeginEditFilePath();\r\n        lstrcpy(szSafeFilePath,pParentNode->pItemData->GetFilePath());\r\n        lstrcat(szSafeFilePath,pParentNode->pItemData->GetFileName());\r\n        lstrcat(szSafeFilePath,_T(\"/\"));\r\n    pItemData->EndEditFilePath();\r\n\r\n    lstrcpy(pItemData->szFullPath,szFullPath);\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(szFullPath,FILE_ATTRIBUTE_NORMAL,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n\r\n    // File time.\r\n    struct tm AccessTime,ModifyTime,CreateTime;\r\n    ckcore::File::time(szFullPath,AccessTime,ModifyTime,CreateTime);\r\n    ckcore::convert::tm_to_dostime(ModifyTime,pItemData->usFileDate,pItemData->usFileTime);\r\n\r\n    // File size.\r\n    pItemData->uiSize = ckcore::File::size(szFullPath);\r\n\r\n    pParentNode->m_Files.push_back(pItemData);\r\n\r\n    // Increase the total length counter.\r\n    g_ProjectManager.m_pSpaceMeter->IncreaseAllocatedSize(pItemData->uiSize);\r\n\r\n    return pItemData;\r\n}\r\n\r\nCProjectNode *CProjectManager::CFileTransaction::\r\n    AddFolder(CProjectNode *pParentNode,const TCHAR *szFolderName,\r\n        const TCHAR *szFolderPath,const TCHAR *szFullPath,\r\n        FILETIME *pFileTime)\r\n{\r\n    // Make sure that this folder does not already exist.\r\n    CProjectNode *pExistingNode = g_TreeManager.GetChildNode(pParentNode,szFolderName);\r\n    if (pExistingNode != NULL)\r\n        return pExistingNode;\r\n\r\n    // Add a new node.\r\n    CProjectNode *pNode = new CProjectNode(pParentNode);\r\n    if (m_Mode == MODE_IMPORT)\r\n        pNode->pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED | PROJECTITEM_FLAG_ISLOCKED;\r\n\r\n    // Paths.\r\n    pNode->pItemData->SetFileName(szFolderName);\r\n    pNode->pItemData->SetFilePath(szFolderPath);\r\n    lstrcpy(pNode->pItemData->szFullPath,szFullPath);\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n    else\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,_T(\"\"));\r\n    }\r\n\r\n    // File time.\r\n    FILETIME LocalFileTime;\r\n    if (FileTimeToLocalFileTime(pFileTime,&LocalFileTime) == TRUE)\r\n        FileTimeToDosDateTime(&LocalFileTime,&pNode->pItemData->usFileDate,&pNode->pItemData->usFileTime);\r\n\r\n    pParentNode->m_Children.push_back(pNode);\r\n\r\n    g_TreeManager.AddTreeNode(pParentNode->m_hTreeItem,pNode);\r\n    return pNode;\r\n}\r\n\r\nCProjectNode *CProjectManager::CFileTransaction::\r\n    AddFolder(CProjectNode *pParentNode,const TCHAR *szFullPath)\r\n{\r\n    // Make sure that this folder does not already exist.\r\n    TCHAR szFolderName[MAX_PATH];\r\n    lstrcpy(szFolderName,szFullPath);\r\n    ExtractFileName(szFolderName);\r\n\r\n    CProjectNode *pExistingNode = g_TreeManager.GetChildNode(pParentNode,szFolderName);\r\n    if (pExistingNode != NULL)\r\n        return pExistingNode;\r\n\r\n    // Add a new node.\r\n    CProjectNode *pNode = new CProjectNode(pParentNode);\r\n    if (m_Mode == MODE_IMPORT)\r\n        pNode->pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED | PROJECTITEM_FLAG_ISLOCKED;\r\n\r\n    // Paths.\r\n    pNode->pItemData->SetFileName(szFolderName);\r\n\r\n    TCHAR *szSafeFilePath = pNode->pItemData->BeginEditFilePath();\r\n        lstrcpy(szSafeFilePath,pParentNode->pItemData->GetFilePath());\r\n        lstrcat(szSafeFilePath,pParentNode->pItemData->GetFileName());\r\n        lstrcat(szSafeFilePath,_T(\"/\"));\r\n    pNode->pItemData->EndEditFilePath();\r\n\r\n    lstrcpy(pNode->pItemData->szFullPath,szFullPath);\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n    else\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,_T(\"\"));\r\n    }\r\n\r\n    // Directory time.\r\n    struct tm AccessTime,ModifyTime,CreateTime;\r\n    ckcore::Directory::time(szFullPath,AccessTime,ModifyTime,CreateTime);\r\n    ckcore::convert::tm_to_dostime(ModifyTime,pNode->pItemData->usFileDate,\r\n                                   pNode->pItemData->usFileTime);\r\n\r\n    pParentNode->m_Children.push_back(pNode);\r\n\r\n    g_TreeManager.AddTreeNode(pParentNode->m_hTreeItem,pNode);\r\n    return pNode;\r\n}\r\n\r\nbool CProjectManager::CFileTransaction::\r\n    AddAudioFile(CProjectNode *pParentNode,const TCHAR *szFullPath)\r\n{\r\n    // Check if M3U play list, in that case import the contents from it.\r\n    ckcore::Path FullPath(szFullPath);\r\n    if (!ckcore::string::astrcmpi(FullPath.ext_name().c_str(),ckT(\"m3u\")))\r\n        return g_ProjectManager.Import(szFullPath);\r\n\r\n    bool bEncoded = false;\r\n    unsigned __int64 uiDuration = 0;\r\n\r\n    // If the audio file is not a Wave file, try to find a codec that can handle it.\r\n    if (GetAudioFormat(szFullPath) != AUDIOFORMAT_WAVE)\r\n    {\r\n        // Audio file information.\r\n        int iNumChannels = -1;\r\n        int iSampleRate = -1;\r\n        int iBitRate = -1;\r\n\r\n        for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n        {\r\n            // We're only interested in decoders.\r\n            if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_DECODER) == 0)\r\n                continue;\r\n\r\n            if (g_CodecManager.m_Codecs[i]->irc_decode_init(szFullPath,iNumChannels,\r\n                iSampleRate,iBitRate,uiDuration))\r\n            {\r\n                // Exit the decoder immediately since we don't want to decode the file yet.\r\n                g_CodecManager.m_Codecs[i]->irc_decode_exit();\r\n                bEncoded = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (!bEncoded)\r\n        {\r\n            lngMessageBox(*g_pMainFrame,FAILURE_UNSUPAUDIO,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n    }\r\n\r\n    CItemData *pItemData = new CItemData();\r\n    if (m_Mode == MODE_IMPORT)\r\n        pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED | PROJECTITEM_FLAG_ISLOCKED;\r\n\r\n    // Paths.\r\n    TCHAR *szSafeFileName = pItemData->BeginEditFileName();\r\n        lstrcpy(szSafeFileName,szFullPath);\r\n        ExtractFileName(szSafeFileName);\r\n    pItemData->EndEditFileName();\r\n\r\n    TCHAR *szSafeFilePath = pItemData->BeginEditFilePath();\r\n        lstrcpy(szSafeFilePath,pParentNode->pItemData->GetFilePath());\r\n        lstrcat(szSafeFilePath,pParentNode->pItemData->GetFileName());\r\n        lstrcat(szSafeFilePath,_T(\"/\"));\r\n    pItemData->EndEditFilePath();\r\n\r\n    lstrcpy(pItemData->szFullPath,szFullPath);\r\n\r\n    // Track length.\r\n    if (bEncoded)\r\n        pItemData->GetAudioData()->uiTrackLength = uiDuration;\r\n    else\r\n        pItemData->GetAudioData()->uiTrackLength = GetAudioLength(szFullPath);\r\n\r\n    if (g_ProjectManager.m_iProjectType == PROJECTTYPE_MIXED)\t// Count using the Mode-1 sector size since the spacemeter in these projects are based on that disc size.\r\n        pItemData->uiSize = (pItemData->GetAudioData()->uiTrackLength / 1000) * 75 * 2048;\r\n    else\r\n        pItemData->uiSize = pItemData->GetAudioData()->uiTrackLength;\r\n\r\n    pParentNode->m_Files.push_back(pItemData);\r\n\r\n    // Increase the total length counter.\r\n    g_ProjectManager.m_pSpaceMeter->IncreaseAllocatedSize(pItemData->uiSize);\r\n    return true;\r\n}\r\n\r\nvoid CProjectManager::CFileTransaction::AddFilesInFolder(CProjectNode *pParentNode,\r\n                                                         std::vector<CProjectNode *> &FolderStack)\r\n{\r\n    // Real parent path.\r\n    TCHAR szRealParentPath[MAX_PATH];\r\n    lstrcpy(szRealParentPath,pParentNode->pItemData->szFullPath);\r\n    IncludeTrailingBackslash(szRealParentPath);\r\n\r\n    // Search path.\r\n    TCHAR szSearchPath[MAX_PATH];\r\n    lstrcpy(szSearchPath,szRealParentPath);\r\n    lstrcat(szSearchPath,TEXT(\"*\"));\r\n\r\n    // Internal parent path.\r\n    TCHAR szParentPath[MAX_PATH];\r\n    lstrcpy(szParentPath,pParentNode->pItemData->GetFilePath());\r\n    lstrcat(szParentPath,pParentNode->pItemData->GetFileName());\r\n    lstrcat(szParentPath,_T(\"/\"));\r\n\r\n    WIN32_FIND_DATA FileData;\r\n    HANDLE hFind = FindFirstFile(szSearchPath,&FileData);\r\n\r\n    if (hFind != INVALID_HANDLE_VALUE)\r\n    {\r\n        if (lstrcmp(FileData.cFileName,TEXT(\".\")) && lstrcmp(FileData.cFileName,TEXT(\"..\")))\r\n        {\r\n            if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n            {\r\n                TCHAR szFullName[MAX_PATH];\r\n                lstrcpy(szFullName,szRealParentPath);\r\n                lstrcat(szFullName,FileData.cFileName);\r\n\r\n                FolderStack.push_back(AddFolder(pParentNode,FileData.cFileName,szParentPath,szFullName,&FileData.ftLastWriteTime));\r\n            }\r\n            else\r\n            {\r\n                TCHAR szFullName[MAX_PATH];\r\n                lstrcpy(szFullName,szRealParentPath);\r\n                lstrcat(szFullName,FileData.cFileName);\r\n\r\n                unsigned __int64 uiFileSize = 0;\r\n\r\n                if (FileData.nFileSizeHigh == 0)\r\n                    uiFileSize = FileData.nFileSizeLow;\r\n                else\r\n                    uiFileSize = ((unsigned __int64)FileData.nFileSizeHigh << 32) | FileData.nFileSizeLow;\r\n\r\n                AddDataFile(pParentNode,FileData.cFileName,szParentPath,szFullName,&FileData.ftLastWriteTime,uiFileSize);\r\n            }\r\n        }\r\n\r\n        while (FindNextFile(hFind,&FileData) != 0) \r\n        {\r\n            if (lstrcmp(FileData.cFileName,TEXT(\".\")) && lstrcmp(FileData.cFileName,TEXT(\"..\")))\r\n            {\r\n                if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n                {\r\n                    TCHAR szFullName[MAX_PATH];\r\n                    lstrcpy(szFullName,szRealParentPath);\r\n                    lstrcat(szFullName,FileData.cFileName);\r\n\r\n                    FolderStack.push_back(AddFolder(pParentNode,FileData.cFileName,szParentPath,szFullName,&FileData.ftLastWriteTime));\r\n                }\r\n                else\r\n                {\r\n                    TCHAR szFullName[MAX_PATH];\r\n                    lstrcpy(szFullName,szRealParentPath);\r\n                    lstrcat(szFullName,FileData.cFileName);\r\n\r\n                    unsigned __int64 uiFileSize = 0;\r\n\r\n                    if (FileData.nFileSizeHigh == 0)\r\n                        uiFileSize = FileData.nFileSizeLow;\r\n                    else\r\n                        uiFileSize = ((unsigned __int64)FileData.nFileSizeHigh << 32) | FileData.nFileSizeLow;\r\n\r\n                    AddDataFile(pParentNode,FileData.cFileName,szParentPath,szFullName,&FileData.ftLastWriteTime,uiFileSize);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    FindClose(hFind);\r\n}\r\n\r\n/**\r\n    Adds the specified file to specifed node. If pTargetNode is NULL then the\r\n    file will be added to the current folder (node) in the project view.\r\n    @param szFullPath the absolute path to a file on the file system.\r\n    @param pTargetNode the node that the file should be added to.\r\n    @return true if successfull, otherwise false.\r\n*/\r\nbool CProjectManager::CFileTransaction::\r\n    AddFile(const TCHAR *szFullPath,CProjectNode *pTargetNode)\r\n{\r\n    // Check if we're realing with a folder.\r\n    if (ckcore::Directory::exist(szFullPath))\r\n    {\r\n        // We can't add folder to an audio disc.\r\n        if (g_ProjectManager.m_iViewType != PROJECTVIEWTYPE_DATA)\r\n        {\r\n            lngMessageBox(*g_pMainFrame,ERROR_AUDIOADDFOLDER,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n            return false;\r\n        }\r\n\r\n        // Add this folder.\r\n        if (pTargetNode == NULL)\r\n            pTargetNode = AddFolder(g_TreeManager.GetCurrentNode(),szFullPath);\r\n        else\r\n            pTargetNode = AddFolder(pTargetNode,szFullPath);\r\n\r\n        std::vector<CProjectNode *> FolderStack;\r\n        AddFilesInFolder(pTargetNode,FolderStack);\r\n\r\n        while (FolderStack.size() > 0)\r\n        { \r\n            pTargetNode = FolderStack[FolderStack.size() - 1];\r\n            FolderStack.pop_back();\r\n\r\n            AddFilesInFolder(pTargetNode,FolderStack);\r\n        }\r\n\r\n        g_TreeManager.Refresh();\r\n        g_ProjectManager.m_pTreeView->Expand(g_TreeManager.GetRootNode()->m_hTreeItem);\r\n    }\r\n    else\r\n    {\r\n        if (pTargetNode == NULL)\r\n            pTargetNode = g_TreeManager.GetCurrentNode();\r\n\r\n        if (g_ProjectManager.m_iViewType == PROJECTVIEWTYPE_DATA &&\r\n            pTargetNode != g_ProjectManager.m_pMixAudioNode)\r\n        {\r\n            AddDataFile(pTargetNode,szFullPath);\r\n        }\r\n        else\r\n        {\r\n            AddAudioFile(pTargetNode,szFullPath);\r\n        }\r\n\r\n        g_TreeManager.Refresh();\r\n    }\r\n\r\n    g_ProjectManager.m_bModified = true;\r\n    return true;\r\n}\r\n\r\n/**\r\n    Adds the specified file to specifed path in the project.\r\n    @param szFullPath the absolute path to a file on the file system.\r\n    @param szProjectPath the target path in the project.\r\n    @return If successfull, a pointer to the CItemData object of the new item. If\r\n    unsuccessfull the function returns NULL.\r\n    @see AddFile(const TCHAR *szFullPath,CProjectNode *pTargetNode)\r\n*/\r\nCItemData *CProjectManager::CFileTransaction::\r\n    AddFile(const TCHAR *szFullPath,const TCHAR *szProjectPath)\r\n{\r\n    CProjectNode *pParent = g_TreeManager.AddPath(szProjectPath);\r\n    if (pParent == NULL)\r\n        return NULL;\r\n\r\n    return AddDataFile(pParent,szFullPath);\r\n}\r\n\r\n/**\r\n    Moves the specified item to the specified new parent node.\r\n    @param pItemParent the current parent node of pItemData.\r\n    @param pItemData the item to move.\r\n    @param pNewParent the new node that pItemData should be moved to.\r\n    @return true if successfull, otherwise false.\r\n*/\r\nbool CProjectManager::CFileTransaction::\r\n    MoveFile(CProjectNode *pItemParent,CItemData *pItemData,CProjectNode *pNewParent)\r\n{\r\n    // We can only move files in data projects.\r\n    if (g_ProjectManager.m_iViewType != PROJECTVIEWTYPE_DATA)\r\n        return false;\r\n\r\n    // Check if a file or folder already exists in the destination folder.\r\n    CItemData *pExistingItemData = g_TreeManager.GetChildItem(pNewParent,pItemData->GetFileName());\r\n    if (pExistingItemData != NULL)\r\n    {\r\n        // It does not make sense to move oneself to itself.\r\n        if (pExistingItemData == pItemData)\r\n            return false;\r\n\r\n        if (m_ReplaceDlg.Execute(pItemData,pExistingItemData))\r\n            g_ProjectManager.RemoveFile(pNewParent,pExistingItemData);\r\n        else\r\n            return false;\r\n    }\r\n\r\n    if (!g_TreeManager.MoveEntry(pItemParent,pItemData,pNewParent))\r\n        lngMessageBox(*g_pMainFrame,ERROR_MOVESAMESRCDST,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n\r\n    g_TreeManager.Refresh();\r\n\r\n    g_ProjectManager.m_bModified = true;\r\n    return true;\r\n}\r\n\r\n/**\r\n    Moves the specified item to the current folder (node) in the project view.\r\n    @param pItemParent the current parent node of pItemData.\r\n    @param pItemData the item to move.\r\n    @return true if successfull, otherwise false.\r\n    @see MoveFile(CProjectNode *pItemParent,CItemData *pItemData,CProjectNode *pNewParent)\r\n*/\r\nbool CProjectManager::CFileTransaction::\r\n    MoveFileToCurrent(CProjectNode *pItemParent,CItemData *pItemData)\r\n{\r\n    return MoveFile(pItemParent,pItemData,g_TreeManager.GetCurrentNode());\r\n}\r\n\r\nCProjectManager::CProjectManager()\r\n{\r\n    m_iProjectType = -1;\r\n    m_iProjectMedia = -1;\r\n    m_iViewType = -1;\r\n    m_iActiveView = AV_TREE;\r\n\r\n    m_pProjectView = NULL;\r\n    m_pContainer = NULL;\r\n    m_pSpaceMeter = NULL;\r\n    m_pListView = NULL;\r\n    m_pTreeView = NULL;\r\n}\r\n\r\nCProjectManager::~CProjectManager()\r\n{\r\n}\r\n\r\nLRESULT CProjectManager::OnNewFolder(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Make sure that this action is allowed to happen (accelerators does not care about menu item state).\r\n    if (g_pMainFrame->UIGetState(ID_EDIT_NEWFOLDER) & g_pMainFrame->UPDUI_DISABLED)\r\n        return 0;\r\n\r\n    switch (m_iActiveView)\r\n    {\r\n        case AV_TREE:\r\n            TreeAddNewFolder(m_pActionNode);\r\n            break;\r\n\r\n        case AV_LIST:\r\n            ListAddNewFolder();\r\n            break;\r\n    };\r\n\r\n    m_bModified = true;\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectManager::OnRename(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Make sure that this action is allowed to happen (accelerators does not care about menu item state).\r\n    if (g_pMainFrame->UIGetState(ID_EDIT_RENAME) & g_pMainFrame->UPDUI_DISABLED)\r\n        return 0;\r\n\r\n    switch (m_iActiveView)\r\n    {\r\n        case AV_TREE:\r\n            // We can't rename locked items.\r\n            if (!(m_pActionNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED))\r\n                m_pTreeView->EditLabel(m_pActionNode->m_hTreeItem);\r\n            break;\r\n\r\n        case AV_LIST:\r\n            int iItemIndex = -1;\r\n            iItemIndex = m_pListView->GetNextItem(iItemIndex,LVNI_SELECTED | LVNI_FOCUSED);\r\n\r\n            // Make sure that atleast one item is selected with focus.\r\n            if (iItemIndex == -1)\r\n                break;\r\n\r\n            CItemData *pItemData = (CItemData *)m_pListView->GetItemData(iItemIndex);\r\n\r\n            if (!(pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED))\r\n                m_pListView->EditLabel(iItemIndex);\r\n            break;\r\n    };\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CProjectManager::OnRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    // Make sure that this action is allowed to happen (accelerators does not care about menu item state).\r\n    if (g_pMainFrame->UIGetState(ID_EDIT_REMOVE) & g_pMainFrame->UPDUI_DISABLED)\r\n        return 0;\r\n\r\n    // We need to store the current active view since it will change after the message box has been shown.\r\n    int iActiveView = m_iActiveView;\r\n\r\n    if (lngMessageBox(*g_pMainFrame,CONFIRM_REMOVEITEMS,GENERAL_QUESTION,MB_YESNO | MB_ICONQUESTION) != IDYES)\r\n        return 0;\r\n\r\n    switch (iActiveView)\r\n    {\r\n        case AV_TREE:\r\n            TreeRemoveNode(m_pActionNode);\r\n            break;\r\n\r\n        case AV_LIST:\r\n            ListRemoveSel();\r\n            break;\r\n    };\r\n\r\n    m_iActiveView = iActiveView;\r\n\r\n    m_bModified = true;\r\n    return 0;\r\n}\r\n\r\nvoid CProjectManager::SetupDataListView()\r\n{\r\n    m_iViewType = PROJECTVIEWTYPE_DATA;\r\n\r\n    // Remove all columns.\r\n    int iColCount = m_pListView->GetHeader().GetItemCount();\r\n\r\n    for (int i = 0; i < iColCount; i++)\r\n        m_pListView->DeleteColumn(0);\r\n\r\n    // Add the new columns.\r\n    m_pListView->InsertColumn(0,lngGetString(COLUMN_NAME),LVCFMT_LEFT,250,COLUMN_SUBINDEX_NAME);\r\n    m_pListView->InsertColumn(1,lngGetString(COLUMN_SIZE),LVCFMT_RIGHT,100,COLUMN_SUBINDEX_SIZE);\r\n    m_pListView->InsertColumn(2,lngGetString(COLUMN_TYPE),LVCFMT_LEFT,180,COLUMN_SUBINDEX_TYPE);\r\n    m_pListView->InsertColumn(3,lngGetString(COLUMN_MODIFIED),LVCFMT_LEFT,120,COLUMN_SUBINDEX_MODIFIED);\r\n    m_pListView->InsertColumn(4,lngGetString(COLUMN_PATH),LVCFMT_LEFT,120,COLUMN_SUBINDEX_PATH);\r\n\r\n    // Update menu items.\r\n    EnableAll(ID_EDIT_NEWFOLDER,true,g_pMainFrame->m_hProjListNoSelMenu);\r\n    EnableAll(ID_EDIT_RENAME,false,g_pMainFrame->m_hProjListSelMenu);\r\n    EnableAll(ID_EDIT_REMOVE,false);\r\n\r\n    // Enable editing of names.\r\n    unsigned long ulViewStyle = m_pListView->GetWindowLong(GWL_STYLE);\r\n    m_pListView->SetWindowLong(GWL_STYLE,ulViewStyle | LVS_EDITLABELS);\r\n\r\n    // Specifiy the sort-column.\r\n    SendMessage(m_pListView->GetHeader(),WM_CHC_SETSORTCOLUMN,0,0);\r\n}\r\n\r\nvoid CProjectManager::SetupAudioListView()\r\n{\r\n    m_iViewType = PROJECTVIEWTYPE_AUDIO;\r\n\r\n    // Remove all columns.\r\n    int iColCount = m_pListView->GetHeader().GetItemCount();\r\n\r\n    for (int i = 0; i < iColCount; i++)\r\n        m_pListView->DeleteColumn(0);\r\n\r\n    // Add the new columns.\r\n    m_pListView->InsertColumn(0,lngGetString(COLUMN_TRACK),LVCFMT_LEFT,45,COLUMN_SUBINDEX_TRACK);\r\n    m_pListView->InsertColumn(1,lngGetString(COLUMN_TITLE),LVCFMT_LEFT,220,COLUMN_SUBINDEX_TITLE);\r\n    m_pListView->InsertColumn(2,lngGetString(COLUMN_LENGTH),LVCFMT_LEFT,60,COLUMN_SUBINDEX_LENGTH);\r\n    m_pListView->InsertColumn(3,lngGetString(COLUMN_LOCATION),LVCFMT_LEFT,450,COLUMN_SUBINDEX_LOCATION);\r\n\r\n    // Update menu items.\r\n    EnableAll(ID_EDIT_NEWFOLDER,false,g_pMainFrame->m_hProjListNoSelMenu);\r\n    EnableAll(ID_EDIT_RENAME,false,g_pMainFrame->m_hProjListSelMenu);\r\n    EnableAll(ID_EDIT_REMOVE,false);\r\n\r\n    // Disable editing of names.\r\n    unsigned long ulViewStyle = m_pListView->GetWindowLong(GWL_STYLE);\r\n    m_pListView->SetWindowLong(GWL_STYLE,ulViewStyle & ~LVS_EDITLABELS);\r\n\r\n    // Specifiy the sort-column.\r\n    SendMessage(m_pListView->GetHeader(),WM_CHC_SETSORTCOLUMN,1,0);\r\n}\r\n\r\n/**\r\n    Assigns graphical controls to the project manage so that they will be\r\n    properly updated when the project changes.\r\n    @param pProjectView project splitter view control.\r\n    @param pContainer project list view container control.\r\n    @param pSpaceMeter space meter control.\r\n    @param pListView project list view control.\r\n    @param pTreeView project tree view control.\r\n*/\r\nvoid CProjectManager::AssignControls(CSplitterWindow *pProjectView,CCustomContainer *pContainer,\r\n                                     CSpaceMeter *pSpaceMeter,CListViewCtrl *pListView,\r\n                                     CTreeViewCtrlEx *pTreeView)\r\n{\r\n    m_pProjectView = pProjectView;\r\n    m_pContainer = pContainer;\r\n    m_pSpaceMeter = pSpaceMeter;\r\n    m_pListView = pListView;\r\n    m_pTreeView = pTreeView;\r\n}\r\n\r\n/**\r\n    Creates a new empty data project.\r\n    @param bDVD specifies whether the project should be recorded to DVD media or\r\n    not.\r\n*/\r\nvoid CProjectManager::NewDataProject(int iDiscMedia)\r\n{\r\n    // Reset the old project settings.\r\n    g_ProjectSettings.Reset();\r\n\r\n    m_bModified = false;\r\n\r\n    if (m_pProjectView != NULL)\r\n        m_pProjectView->SetSinglePaneMode(SPLIT_PANE_NONE);\r\n\r\n    CloseProject();\r\n\r\n    m_iProjectType = PROJECTTYPE_DATA;\r\n    m_iProjectMedia = iDiscMedia;\r\n\r\n    if (m_pProjectView != NULL)\r\n        SetupDataListView();\r\n\r\n    // Get system date and time.\r\n    SYSTEMTIME st;\r\n    GetLocalTime(&st);\r\n    TCHAR szDate[8];\r\n    GetDateFormat(LOCALE_USER_DEFAULT,0,&st,_T(\"yyMMdd_\"),szDate,8);\r\n    TCHAR szDateTime[12];\r\n    lsprintf(szDateTime,_T(\"%s%.2d%.2d\"),szDate,st.wHour,st.wMinute);\r\n\r\n    // Insert tree root item.\r\n    g_TreeManager.CreateTree(szDateTime,PROJECTTREE_IMAGEINDEX_DATA);\r\n\r\n    // Update the space meter.\r\n    if (m_pSpaceMeter != NULL)\r\n    {\r\n        m_pSpaceMeter->SetDisplayMode(PROJECTVIEWTYPE_DATA);\r\n        m_pSpaceMeter->SetDiscSize(m_iProjectMedia);\r\n\r\n        m_pSpaceMeter->SetAllocatedSize(0);\r\n    }\r\n\r\n    // Project settings.\r\n    lstrcpy(g_ProjectSettings.m_szLabel,szDateTime);\r\n\r\n    // Enable/disable menu items.\r\n    g_pMainFrame->UIEnable(ID_BURNCOMPILATION_DISCIMAGE,true);\r\n    g_pMainFrame->UIEnable(ID_ACTIONS_IMPORTSESSION,true);\r\n}\r\n\r\n/**\r\n    Creates a mew empty audio project.\r\n*/\r\nvoid CProjectManager::NewAudioProject(int iDiscMedia)\r\n{\r\n    // Reset the old project settings.\r\n    g_ProjectSettings.Reset();\r\n\r\n    m_bModified = false;\r\n\r\n    if (m_pProjectView != NULL)\r\n        m_pProjectView->SetSinglePaneMode(SPLIT_PANE_RIGHT);\r\n\r\n    CloseProject();\r\n\r\n    m_iProjectType = PROJECTTYPE_AUDIO;\r\n    m_iProjectMedia = iDiscMedia;\r\n\r\n    if (m_pListView != NULL)\r\n        SetupAudioListView();\r\n\r\n    // Insert tree root item.\r\n    g_TreeManager.CreateTree(lngGetString(PROJECT_AUDIO),PROJECTTREE_IMAGEINDEX_AUDIO);\r\n\r\n    // Update the space meter.\r\n    if (m_pSpaceMeter != NULL)\r\n    {\r\n        m_pSpaceMeter->SetDisplayMode(PROJECTVIEWTYPE_AUDIO);\r\n        m_pSpaceMeter->SetDiscSize(m_iProjectMedia);\r\n        m_pSpaceMeter->SetAllocatedSize(0);\r\n    }\r\n\r\n    // Project settings.\r\n    g_ProjectSettings.m_szLabel[0] = '\\0';\r\n\r\n    // Enable/disable menu items.\r\n    g_pMainFrame->UIEnable(ID_BURNCOMPILATION_DISCIMAGE,false);\r\n    g_pMainFrame->UIEnable(ID_ACTIONS_IMPORTSESSION,false);\r\n}\r\n\r\n/**\r\n    Creates a new empty mixed mode project.\r\n*/\r\nvoid CProjectManager::NewMixedProject(int iDiscMedia)\r\n{\r\n    // Reset the old project settings.\r\n    g_ProjectSettings.Reset();\r\n\r\n    m_bModified = false;\r\n\r\n    if (m_pProjectView != NULL)\r\n        m_pProjectView->SetSinglePaneMode(SPLIT_PANE_NONE);\r\n\r\n    CloseProject();\r\n\r\n    m_iProjectType = PROJECTTYPE_MIXED;\r\n    m_iProjectMedia = iDiscMedia;\r\n\r\n    // By default we display the data view.\r\n    if (m_pListView != NULL)\r\n        SetupDataListView();\r\n\r\n    // Insert tree root item.\r\n    g_TreeManager.CreateTree(lngGetString(PROJECT_MIXED),PROJECTTREE_IMAGEINDEX_MIXED);\r\n\r\n    // Get system date and time.\r\n    SYSTEMTIME st;\r\n    GetLocalTime(&st);\r\n    TCHAR szDate[8];\r\n    GetDateFormat(LOCALE_USER_DEFAULT,0,&st,_T(\"yyMMdd_\"),szDate,8);\r\n    TCHAR szDateTime[12];\r\n    lsprintf(szDateTime,_T(\"%s%.2d%.2d\"),szDate,st.wHour,st.wMinute);\r\n\r\n    m_pMixDataNode = g_TreeManager.InsertVirtualRoot(szDateTime,PROJECTTREE_IMAGEINDEX_DATA);\r\n    m_pMixAudioNode = g_TreeManager.InsertVirtualRoot(lngGetString(PROJECT_AUDIO),PROJECTTREE_IMAGEINDEX_AUDIO);\r\n\r\n    if (m_pTreeView != NULL)\r\n        m_pTreeView->Select(m_pMixDataNode->m_hTreeItem,TVGN_CARET);\r\n\r\n    // Update the space meter.\r\n    if (m_pSpaceMeter != NULL)\r\n    {\r\n        m_pSpaceMeter->SetDisplayMode(PROJECTVIEWTYPE_DATA);\r\n        m_pSpaceMeter->SetDiscSize(m_iProjectMedia);\r\n        m_pSpaceMeter->SetAllocatedSize(0);\r\n    }\r\n\r\n    // Project settings.\r\n    lstrcpy(g_ProjectSettings.m_szLabel,szDateTime);\r\n\r\n    // Enable/disable menu items.\r\n    g_pMainFrame->UIEnable(ID_BURNCOMPILATION_DISCIMAGE,true);\r\n    g_pMainFrame->UIEnable(ID_ACTIONS_IMPORTSESSION,false);\r\n}\r\n\r\n/**\r\n    Changes to project data view for mixed mode projects.\r\n*/\r\nvoid CProjectManager::DataSelected()\r\n{\r\n    if (m_iProjectType != PROJECTTYPE_MIXED)\r\n        return;\r\n\r\n    SetupDataListView();\r\n}\r\n\r\n/**\r\n    Changes to project audio view for mixed mode projects.\r\n*/\r\nvoid CProjectManager::AudioSelected()\r\n{\r\n    if (m_iProjectType != PROJECTTYPE_MIXED)\r\n        return;\r\n\r\n    SetupAudioListView();\r\n}\r\n\r\n/**\r\n    Generates a new sub folder name for the specified parent node. For example\r\n    if a folder named \"New Folder\" already exists in that parent, the new one\r\n    should be nameed \"New Folder (2)\" (unless that one already exists).\r\n    @param pParent parent node that the new folder should be created in.\r\n    @param szFolderName the output string that should hold the generated folder\r\n    name.\r\n    @param uiFolderNameSize the size of the szFolderName variable (in TCHARs).\r\n    @return true if successfull, false otherwise.\r\n*/\r\nbool CProjectManager::GenerateNewFolderName(CProjectNode *pParent,TCHAR *szFolderName,\r\n                                            unsigned int uiFolderNameSize)\r\n{\r\n    if (g_TreeManager.GetChildItem(pParent,lngGetString(MISC_NEWFOLDER)) != NULL)\r\n    {\r\n        TCHAR szFolderNamePattern[64];\r\n\r\n        size_t iMaxLen = sizeof(szFolderNamePattern) - (1 + 10 + 3);\r\n        if ((size_t)lstrlen(lngGetString(MISC_NEWFOLDER)) > iMaxLen)\r\n            lstrncpy(szFolderNamePattern,lngGetString(MISC_NEWFOLDER),iMaxLen);\r\n        else\r\n            lstrcpy(szFolderNamePattern,lngGetString(MISC_NEWFOLDER));\r\n        lstrcat(szFolderNamePattern,_T(\" (%u)\"));\r\n\r\n        for (unsigned int i = 2; i < 0xFFFFFFFF; i++)\r\n        {\r\n            lsprintf(szFolderName,szFolderNamePattern,i);\r\n            if (!g_TreeManager.GetChildItem(pParent,szFolderName) != NULL)\r\n                return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n    else\r\n    {\r\n        if ((unsigned int)lstrlen(lngGetString(MISC_NEWFOLDER)) >= uiFolderNameSize)\r\n            lstrncpy(szFolderName,lngGetString(MISC_NEWFOLDER),uiFolderNameSize - 1);\r\n        else\r\n            lstrcpy(szFolderName,lngGetString(MISC_NEWFOLDER));\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Adds a new empty folder to the current folder (node) in the project through\r\n    the project list view.\r\n*/\r\nbool CProjectManager::ListAddNewFolder()\r\n{\r\n    CProjectNode *pCurNode = g_TreeManager.GetCurrentNode();\r\n\r\n    TCHAR szFolderName[64];\r\n    if (!GenerateNewFolderName(pCurNode,szFolderName,sizeof(szFolderName)))\r\n        return false;\r\n\r\n    // Create the new node.\r\n    CProjectNode *pNode = new CProjectNode(pCurNode);\r\n\r\n    // Paths.\r\n    pNode->pItemData->SetFileName(szFolderName);\r\n\r\n    TCHAR *szSafeFilePath = pNode->pItemData->BeginEditFilePath();\r\n        g_TreeManager.GetCurrentPath(szSafeFilePath);\r\n    pNode->pItemData->EndEditFilePath();\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n    else\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,_T(\"\"));\r\n    }\r\n\r\n    // File time.\r\n    SYSTEMTIME SystemTime;\r\n    GetLocalTime(&SystemTime);\r\n\r\n    FILETIME FileTime;\r\n    SystemTimeToFileTime(&SystemTime,&FileTime);\r\n\r\n    FileTimeToDosDateTime(&FileTime,&pNode->pItemData->usFileDate,&pNode->pItemData->usFileTime);\r\n\r\n    // Add the new node as a child to the current.\r\n    pCurNode->m_Children.push_back(pNode);\r\n\r\n    g_TreeManager.AddTreeNode(pCurNode->m_hTreeItem,pNode);\r\n    g_TreeManager.Refresh();\r\n\r\n    m_pTreeView->Expand(pCurNode->m_hTreeItem);\r\n    return true;\r\n}\r\n\r\n/**\r\n    Adds a new empty folder to the current folder (node) in the project through\r\n    the project tree view.\r\n*/\r\nbool CProjectManager::TreeAddNewFolder(CProjectNode *pParentNode)\r\n{\r\n    TCHAR szFolderName[64];\r\n    if (!GenerateNewFolderName(pParentNode,szFolderName,sizeof(szFolderName)))\r\n        return false;\r\n\r\n    // Create the new node.\r\n    CProjectNode *pNode = new CProjectNode(pParentNode);\r\n\r\n    // Paths.\r\n    pNode->pItemData->SetFileName(szFolderName);\r\n\r\n    TCHAR *szSafeFilePath = pNode->pItemData->BeginEditFilePath();\r\n        lstrcpy(szSafeFilePath,pParentNode->pItemData->GetFilePath());\r\n        lstrcat(szSafeFilePath,pParentNode->pItemData->GetFileName());\r\n        lstrcat(szSafeFilePath,_T(\"/\"));\r\n    pNode->pItemData->EndEditFilePath();\r\n\r\n    // File type.\r\n    SHFILEINFO shFileInfo;\r\n    if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n        sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n    }\r\n    else\r\n    {\r\n        lstrcpy(pNode->pItemData->szFileType,_T(\"\"));\r\n    }\r\n\r\n    // File time.\r\n    SYSTEMTIME SystemTime;\r\n    GetLocalTime(&SystemTime);\r\n\r\n    FILETIME FileTime;\r\n    SystemTimeToFileTime(&SystemTime,&FileTime);\r\n\r\n    FileTimeToDosDateTime(&FileTime,&pNode->pItemData->usFileDate,&pNode->pItemData->usFileTime);\r\n\r\n    pParentNode->m_Children.push_back(pNode);\r\n\r\n    g_TreeManager.AddTreeNode(pParentNode->m_hTreeItem,pNode);\r\n    g_TreeManager.Refresh();\r\n\r\n    m_pTreeView->Expand(pParentNode->m_hTreeItem);\r\n    return true;\r\n}\r\n\r\n/**\r\n    Removes the specified file from the specified parent folder (node).\r\n    @param pParentNode parent of the folder file to be removed from the project.\r\n    @param pItemData item that should be removed.\r\n*/\r\nvoid CProjectManager::RemoveFile(CProjectNode *pParentNode,CItemData *pItemData)\r\n{\r\n    // Update the space meter.\r\n    m_pSpaceMeter->DecreaseAllocatedSize(pItemData->uiSize);\r\n\r\n    // Remove the items.\r\n    g_TreeManager.RemoveEntry(pParentNode,pItemData);\r\n}\r\n\r\n/**\r\n    Removes the selected files and folders (in the list view) from the project.\r\n*/\r\nvoid CProjectManager::ListRemoveSel()\r\n{\r\n    int iItemIndex = -1;\r\n    iItemIndex = m_pListView->GetNextItem(iItemIndex,LVNI_SELECTED);\r\n\r\n    while (iItemIndex != -1)\r\n    {\r\n        CItemData *pItemData = (CItemData *)m_pListView->GetItemData(iItemIndex);\r\n\r\n        // If the item is locked, skip it.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n        {\r\n            iItemIndex = m_pListView->GetNextItem(iItemIndex,LVNI_SELECTED);\r\n            continue;\r\n        }\r\n\r\n        // Update the space meter.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n            m_pSpaceMeter->DecreaseAllocatedSize(g_TreeManager.GetNodeSize(g_TreeManager.GetCurrentNode(),pItemData));\r\n        else\r\n            m_pSpaceMeter->DecreaseAllocatedSize(pItemData->uiSize);\r\n\r\n        // Remove the items.\r\n        g_TreeManager.RemoveEntry(g_TreeManager.GetCurrentNode(),pItemData);\r\n\r\n        iItemIndex = m_pListView->GetNextItem(iItemIndex,LVNI_SELECTED);\r\n    }\r\n\r\n    g_TreeManager.Refresh();\r\n}\r\n\r\n/**\r\n    Removes the selected folder (in the tree view) from the project.\r\n*/\r\nvoid CProjectManager::TreeRemoveNode(CProjectNode *pNode)\r\n{\r\n    // It's not possible to remove locked items.\r\n    if (pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISLOCKED)\r\n        return;\r\n\r\n    // Update the space meter.\r\n    m_pSpaceMeter->DecreaseAllocatedSize(g_TreeManager.GetNodeSize(pNode));\r\n\r\n    // Remove the node.\r\n    g_TreeManager.RemoveEntry(pNode);\r\n    g_TreeManager.Refresh();\r\n\r\n    NotifyTreeSelChanged((CProjectNode *)m_pTreeView->GetSelectedItem().GetData());\r\n}\r\n\r\n/**\r\n    Used for notifying the project manager that the list view selection has\r\n    changed.\r\n    @param uiSelCount new number of selected item in the list view.\r\n*/\r\nvoid CProjectManager::NotifyListSelChanged(unsigned int uiSelCount)\r\n{\r\n    if (m_iViewType == PROJECTVIEWTYPE_DATA)\r\n    {\r\n        if (uiSelCount > 0)\r\n        {\r\n            EnableAll(ID_EDIT_RENAME,true,g_pMainFrame->m_hProjListSelMenu);\r\n            EnableAll(ID_EDIT_REMOVE,true,g_pMainFrame->m_hProjListSelMenu);\r\n        }\r\n        else\r\n        {\r\n            EnableAll(ID_EDIT_RENAME,false,g_pMainFrame->m_hProjListSelMenu);\r\n            EnableAll(ID_EDIT_REMOVE,false,g_pMainFrame->m_hProjListSelMenu);\r\n        }\r\n    }\r\n    else if (m_iViewType == PROJECTVIEWTYPE_AUDIO)\r\n    {\r\n        if (uiSelCount > 0)\r\n            EnableAll(ID_EDIT_REMOVE,true,g_pMainFrame->m_hProjListSelMenu);\r\n        else\r\n            EnableAll(ID_EDIT_REMOVE,false,g_pMainFrame->m_hProjListSelMenu);\r\n    }\r\n\r\n    // Currently the properties menu item only works when right-clicking on the project tree root.\r\n    g_ProjectManager.EnableAll(ID_POPUPMENU_PROPERTIES,false,g_pMainFrame->m_hProjListSelMenu);\r\n}\r\n\r\n/**\r\n    Used for notifying the project manager that the tree view selection has\r\n    changed.\r\n    @param pNode new selected node.\r\n*/\r\nvoid CProjectManager::NotifyTreeSelChanged(CProjectNode *pNode)\r\n{\r\n    if (m_iProjectType == PROJECTTYPE_DATA)\r\n    {\r\n        g_ProjectManager.EnableAll(ID_EDIT_RENAME,true,g_pMainFrame->m_hProjListSelMenu);\r\n        g_ProjectManager.EnableAll(ID_EDIT_REMOVE,pNode != g_TreeManager.GetRootNode(),g_pMainFrame->m_hProjListSelMenu);\r\n    }\r\n    else if (m_iProjectType == PROJECTTYPE_MIXED)\r\n    {\r\n        if (pNode == m_pMixAudioNode)\r\n        {\r\n            g_ProjectManager.EnableAll(ID_EDIT_RENAME,false,g_pMainFrame->m_hProjListSelMenu);\r\n            g_ProjectManager.EnableAll(ID_EDIT_REMOVE,false,g_pMainFrame->m_hProjListSelMenu);\r\n        }\r\n        else\r\n        {\r\n            g_ProjectManager.EnableAll(ID_EDIT_RENAME,true,g_pMainFrame->m_hProjListSelMenu);\r\n            g_ProjectManager.EnableAll(ID_EDIT_REMOVE,pNode != m_pMixDataNode,g_pMainFrame->m_hProjListSelMenu);\r\n        }\r\n    }\r\n\r\n    // Currently the properties menu item only works when right-clicking on the project tree root.\r\n    if (pNode == g_TreeManager.GetRootNode())\r\n        g_ProjectManager.EnableAll(ID_POPUPMENU_PROPERTIES,true,g_pMainFrame->m_hProjListSelMenu);\r\n    else\r\n        g_ProjectManager.EnableAll(ID_POPUPMENU_PROPERTIES,false,g_pMainFrame->m_hProjListSelMenu);\r\n}\r\n\r\n/**\r\n    Sets the current active (selected) tree node.\r\n    @param pNode the new node that should be treated as active.\r\n*/\r\nvoid CProjectManager::TreeSetActionNode(CProjectNode *pNode)\r\n{\r\n    m_pActionNode = pNode;\r\n}\r\n\r\n/**\r\n    Used for notifying the project manager that the project tree view has been\r\n    activated and now has focus.\r\n*/\r\nvoid CProjectManager::TreeSetActive()\r\n{\r\n    m_iActiveView = AV_TREE;\r\n}\r\n\r\n/**\r\n    Used for notifying the project manager that the project list view has been\r\n    activated and now has focus.\r\n*/\r\nvoid CProjectManager::ListSetActive()\r\n{\r\n    m_iActiveView = AV_LIST;\r\n}\r\n\r\n/**\r\n    Deletes all items imported from multisession discs from the project.\r\n*/\r\nvoid CProjectManager::DeleteImportedItems()\r\n{\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            g_TreeManager.DeleteImportedItems(g_TreeManager.GetRootNode());\r\n            break;\r\n    };\r\n\r\n    g_TreeManager.Refresh();\r\n}\r\n\r\n/**\r\n    Closes the project.\r\n*/\r\nvoid CProjectManager::CloseProject()\r\n{\r\n    m_iActiveView = AV_TREE;\r\n\r\n    // Remove all items from the list and tree view.\r\n    if (m_pTreeView != NULL)\r\n        m_pTreeView->DeleteAllItems();\r\n    if (m_pListView != NULL)\r\n        m_pListView->DeleteAllItems();\r\n\r\n    g_TreeManager.DestroyTree();\r\n}\r\n\r\nvoid CProjectManager::EnableAll(int iID,bool bEnable,HMENU hMenu)\r\n{\r\n    g_pMainFrame->UIEnable(iID,bEnable);\r\n    m_pContainer->EnableToolbarButton(iID,bEnable);\r\n\r\n    if (hMenu != NULL)\r\n        ::EnableMenuItem(hMenu,iID,bEnable ? MF_ENABLED : MF_GRAYED);\r\n}\r\n\r\n/**\r\n    Returns the current view type.\r\n    @return the current view type.\r\n*/\r\nint CProjectManager::GetViewType()\r\n{\r\n    return m_iViewType;\r\n}\r\n\r\n/**\r\n    Returns the current project type.\r\n    @return the current project type.\r\n*/\r\nint CProjectManager::GetProjectType()\r\n{\r\n    return m_iProjectType;\r\n}\r\n\r\n/**\r\n    Saves the current project to the specified Xml structure.\r\n    @param pXml the Xml container which the project should be saved to.\r\n*/\r\nvoid CProjectManager::SaveProjectData(CXmlProcessor *pXml)\r\n{\r\n    m_bModified = false;\r\n\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            pXml->AddElement(_T(\"Data\"),_T(\"\"),true);\r\n                g_TreeManager.SaveNodeFileData(pXml,g_TreeManager.GetRootNode());\r\n            pXml->LeaveElement();\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            pXml->AddElement(_T(\"Audio\"),_T(\"\"),true);\r\n                g_TreeManager.SaveNodeAudioData(pXml,g_TreeManager.GetRootNode());\r\n            pXml->LeaveElement();\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            pXml->AddElement(_T(\"Data\"),_T(\"\"),true);\r\n                g_TreeManager.SaveNodeFileData(pXml,m_pMixDataNode);\r\n            pXml->LeaveElement();\r\n\r\n            pXml->AddElement(_T(\"Audio\"),_T(\"\"),true);\r\n                g_TreeManager.SaveNodeAudioData(pXml,m_pMixAudioNode);\r\n            pXml->LeaveElement();\r\n            break;\r\n    };\r\n}\r\n\r\n/**\r\n    Loads the project from the specified Xml structure.\r\n    @param pXml the Xml container which the project should be loaded from.\r\n    @return true if the project was successfylly loaded, false otherwise.\r\n*/\r\nbool CProjectManager::LoadProjectData(CXmlProcessor *pXml)\r\n{\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            if (!pXml->EnterElement(_T(\"Data\")))\r\n                return true;\r\n\r\n            g_TreeManager.LoadNodeFileData(pXml,g_TreeManager.GetRootNode());\r\n\r\n            pXml->LeaveElement();\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            if (!pXml->EnterElement(_T(\"Audio\")))\r\n                return true;\r\n\r\n            g_TreeManager.LoadNodeAudioData(pXml,g_TreeManager.GetRootNode(),PROJECTTYPE_AUDIO);\r\n\r\n            pXml->LeaveElement();\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            if (!pXml->EnterElement(_T(\"Data\")))\r\n                return true;\r\n\r\n            g_TreeManager.LoadNodeFileData(pXml,m_pMixDataNode);\r\n\r\n            pXml->LeaveElement();\r\n\r\n            if (!pXml->EnterElement(_T(\"Audio\")))\r\n                return true;\r\n\r\n            g_TreeManager.LoadNodeAudioData(pXml,m_pMixAudioNode,PROJECTTYPE_MIXED);\r\n\r\n            pXml->LeaveElement();\r\n            break;\r\n    };\r\n\r\n    return true;\r\n}\r\n\r\nvoid CProjectManager::SaveProjectFileSys(CXmlProcessor *pXml)\r\n{\r\n    pXml->AddElement(_T(\"FileSystem\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Identifier\"),g_ProjectSettings.m_iFileSystem);\r\n    pXml->LeaveElement();\r\n}\r\n\r\nbool CProjectManager::LoadProjectFileSys(CXmlProcessor *pXml)\r\n{\r\n    if (!pXml->EnterElement(_T(\"FileSystem\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Identifier\"),&g_ProjectSettings.m_iFileSystem);\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nvoid CProjectManager::SaveProjectISO(CXmlProcessor *pXml)\r\n{\r\n    pXml->AddElement(_T(\"ISO\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Level\"),g_ProjectSettings.m_iIsoLevel);\r\n        pXml->AddElement(_T(\"Format\"),g_ProjectSettings.m_iIsoFormat);\r\n        pXml->AddElement(_T(\"CharSet\"),g_ProjectSettings.m_IsoCharSet);\r\n        pXml->AddElement(_T(\"DeepDirs\"),g_ProjectSettings.m_bDeepDirs);\r\n        pXml->AddElement(_T(\"Joliet\"),_T(\"\"),true);\r\n            pXml->AddElementAttr(_T(\"enable\"),g_ProjectSettings.m_bJoliet);\r\n            pXml->AddElement(_T(\"LongNames\"),g_ProjectSettings.m_bJolietLongNames);\r\n        pXml->LeaveElement();\r\n        pXml->AddElement(_T(\"OmitVerNum\"),g_ProjectSettings.m_bOmitVerNum);\r\n    pXml->LeaveElement();\r\n}\r\n\r\nbool CProjectManager::LoadProjectISO(CXmlProcessor *pXml)\r\n{\r\n    if (!pXml->EnterElement(_T(\"ISO\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Level\"),&g_ProjectSettings.m_iIsoLevel);\r\n    pXml->GetSafeElementData(_T(\"Format\"),&g_ProjectSettings.m_iIsoFormat);\r\n\r\n    int iCharSet = 0;\r\n    pXml->GetSafeElementData(_T(\"CharSet\"),&iCharSet);\r\n    g_ProjectSettings.m_IsoCharSet = static_cast<CProjectSettings::IsoCharSet>(iCharSet);\r\n\r\n    pXml->GetSafeElementData(_T(\"DeepDirs\"),&g_ProjectSettings.m_bDeepDirs);\r\n\r\n    if (!pXml->EnterElement(_T(\"Joliet\")))\r\n    {\r\n        pXml->LeaveElement();\r\n        return false;\r\n    }\r\n\r\n    pXml->GetSafeElementAttrValue(_T(\"enable\"),&g_ProjectSettings.m_bJoliet);\r\n    pXml->GetSafeElementData(_T(\"LongNames\"),&g_ProjectSettings.m_bJolietLongNames);\r\n    pXml->LeaveElement();\r\n\r\n    pXml->GetSafeElementData(_T(\"OmitVerNum\"),&g_ProjectSettings.m_bOmitVerNum);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nvoid CProjectManager::SaveProjectFields(CXmlProcessor *pXml)\r\n{\r\n    pXml->AddElement(_T(\"Fields\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Publisher\"),g_ProjectSettings.m_szPublisher);\r\n        pXml->AddElement(_T(\"Preparer\"),g_ProjectSettings.m_szPreparer);\r\n        pXml->AddElement(_T(\"System\"),g_ProjectSettings.m_szSystem);\r\n        pXml->AddElement(_T(\"VolumeSet\"),g_ProjectSettings.m_szVolumeSet);\r\n\r\n        pXml->AddElement(_T(\"Files\"),_T(\"\"),true);\r\n            pXml->AddElement(_T(\"Copyright\"),g_ProjectSettings.m_szCopyright);\r\n            pXml->AddElement(_T(\"Abstract\"),g_ProjectSettings.m_szAbstract);\r\n            pXml->AddElement(_T(\"Bibliographic\"),g_ProjectSettings.m_szBibliographic);\r\n        pXml->LeaveElement();\r\n    pXml->LeaveElement();\r\n}\r\n\r\nbool CProjectManager::LoadProjectFields(CXmlProcessor *pXml)\r\n{\r\n    if (!pXml->EnterElement(_T(\"Fields\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Publisher\"),g_ProjectSettings.m_szPublisher,127);\r\n    pXml->GetSafeElementData(_T(\"Preparer\"),g_ProjectSettings.m_szPreparer,127);\r\n    pXml->GetSafeElementData(_T(\"System\"),g_ProjectSettings.m_szSystem,127);\r\n    pXml->GetSafeElementData(_T(\"VolumeSet\"),g_ProjectSettings.m_szVolumeSet,127);\r\n\r\n    if (!pXml->EnterElement(_T(\"Files\")))\r\n    {\r\n        pXml->LeaveElement();\r\n        return false;\r\n    }\r\n\r\n    pXml->GetSafeElementData(_T(\"Copyright\"),g_ProjectSettings.m_szCopyright,36);\r\n    pXml->GetSafeElementData(_T(\"Abstract\"),g_ProjectSettings.m_szAbstract,36);\r\n    pXml->GetSafeElementData(_T(\"Bibliographic\"),g_ProjectSettings.m_szBibliographic,36);\r\n    pXml->LeaveElement();\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nvoid CProjectManager::SaveProjectBoot(CXmlProcessor *pXml)\r\n{\r\n    pXml->AddElement(_T(\"Boot\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Images\"),_T(\"\"),true);\r\n            int iCounter = 0;\r\n            TCHAR szName[32];\r\n\r\n            std::list <CProjectBootImage *>::iterator itNodeObject;\r\n            for (itNodeObject = g_ProjectSettings.m_BootImages.begin(); itNodeObject != g_ProjectSettings.m_BootImages.end(); itNodeObject++)\r\n            {\r\n                CProjectBootImage *pBootImage = *itNodeObject;\r\n                lsnprintf_s(szName,32,_T(\"Image%d\"),iCounter);\r\n\r\n                pXml->AddElement(szName,_T(\"\"),true);\r\n                    pXml->AddElement(_T(\"FullPath\"),pBootImage->m_FullPath.c_str());\r\n                    pXml->AddElement(_T(\"LocalName\"),pBootImage->m_LocalName.c_str());\r\n                    pXml->AddElement(_T(\"Emulation\"),pBootImage->m_iEmulation);\r\n                    pXml->AddElement(_T(\"NoBoot\"),pBootImage->m_bNoBoot);\r\n                    pXml->AddElement(_T(\"LoadSegment\"),pBootImage->m_uiLoadSegment);\r\n                    pXml->AddElement(_T(\"LoadSize\"),pBootImage->m_uiLoadSize);\r\n                pXml->LeaveElement();\r\n            }\r\n        pXml->LeaveElement();\r\n    pXml->LeaveElement();\r\n}\r\n\r\nbool CProjectManager::LoadProjectBoot(CXmlProcessor *pXml)\r\n{\r\n    if (!pXml->EnterElement(_T(\"Boot\")))\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Images\")))\r\n    {\r\n        pXml->LeaveElement();\r\n        return false;\r\n    }\r\n\r\n    TCHAR szFileName[MAX_PATH];\r\n\r\n    for (unsigned int i = 0; i < pXml->GetElementChildCount(); i++)\r\n    {\r\n        if (!pXml->EnterElement(i))\r\n        {\r\n            pXml->LeaveElement();\r\n            pXml->LeaveElement();\r\n            return false;\r\n        }\r\n\r\n        CProjectBootImage *pBootImage = new CProjectBootImage();\r\n\r\n        pXml->GetSafeElementData(_T(\"FullPath\"),szFileName,MAX_PATH - 1);\r\n        pBootImage->m_FullPath = szFileName;\r\n\r\n        pXml->GetSafeElementData(_T(\"LocalName\"),szFileName,MAX_PATH - 1);\r\n        pBootImage->m_LocalName = szFileName;\r\n\r\n        pXml->GetSafeElementData(_T(\"Emulation\"),&pBootImage->m_iEmulation);\r\n        pXml->GetSafeElementData(_T(\"NoBoot\"),&pBootImage->m_bNoBoot);\r\n\r\n        int iLoadSegment = 0;\r\n        pXml->GetSafeElementData(_T(\"LoadSegment\"),&iLoadSegment);\r\n        pBootImage->m_uiLoadSegment = static_cast<ckcore::tuint16>(iLoadSegment);\r\n\r\n        int iLoadSize = 0;\r\n        pXml->GetSafeElementData(_T(\"LoadSize\"),&iLoadSize);\t\r\n        pBootImage->m_uiLoadSize = static_cast<ckcore::tuint16>(iLoadSize);\r\n\r\n        g_ProjectSettings.m_BootImages.push_back(pBootImage);\r\n\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\n/**\r\n    Saves the current project to the specified file. The file will be created if\r\n    it does not exists and overwritten otherwise.\r\n    @param szFullPath the absolute path to a project file on the file system.\r\n    @return true if the project was successfully saved, false otherwise.\r\n*/\r\nbool CProjectManager::SaveProject(const TCHAR *szFullPath)\r\n{\r\n    CXmlProcessor Xml;\r\n\r\n    Xml.AddElement(_T(\"InfraRecorder\"),_T(\"\"),true);\r\n        Xml.AddElement(_T(\"Project\"),_T(\"\"),true);\r\n            Xml.AddElementAttr(_T(\"version\"),PROJECTMANAGER_FILEVERSION);\r\n            Xml.AddElementAttr(_T(\"type\"),m_iProjectType);\r\n            Xml.AddElementAttr(_T(\"media\"),m_iProjectMedia);\r\n\r\n            switch (m_iProjectType)\r\n            {\r\n                case PROJECTTYPE_DATA:\r\n                    Xml.AddElement(_T(\"Label\"),g_ProjectSettings.m_szLabel);\r\n                    SaveProjectFileSys(&Xml);\r\n                    SaveProjectISO(&Xml);\r\n                    SaveProjectFields(&Xml);\r\n                    SaveProjectBoot(&Xml);\r\n                    break;\r\n\r\n                case PROJECTTYPE_AUDIO:\r\n                    Xml.AddElement(_T(\"AlbumName\"),g_ProjectSettings.m_szAlbumName);\r\n                    Xml.AddElement(_T(\"AlbumArtist\"),g_ProjectSettings.m_szAlbumArtist);\r\n                    break;\r\n\r\n                case PROJECTTYPE_MIXED:\r\n                    Xml.AddElement(_T(\"Label\"),g_ProjectSettings.m_szLabel);\r\n                    Xml.AddElement(_T(\"AlbumName\"),g_ProjectSettings.m_szAlbumName);\r\n                    Xml.AddElement(_T(\"AlbumArtist\"),g_ProjectSettings.m_szAlbumArtist);\r\n\r\n                    SaveProjectFileSys(&Xml);\r\n                    SaveProjectISO(&Xml);\r\n                    SaveProjectFields(&Xml);\r\n                    break;\r\n            };\r\n\r\n            SaveProjectData(&Xml);\r\n        Xml.LeaveElement();\r\n    Xml.LeaveElement();\r\n\r\n    return Xml.Save(szFullPath) == XMLRES_OK;\r\n}\r\n\r\n/**\r\n    Loads project data from the specified file.\r\n    @param szFullPath the absolute path to a project file on the file system.\r\n    @return true if the project was successfully loaded, false otherwise.\r\n*/\r\nbool CProjectManager::LoadProject(const TCHAR *szFullPath)\r\n{\r\n    CXmlProcessor Xml;\r\n\r\n    int iResult = Xml.Load(szFullPath);\r\n    if (iResult != XMLRES_OK && iResult != XMLRES_FILEERROR)\r\n    {\r\n        TCHAR szMessage[128];\r\n        lsnprintf_s(szMessage,128,lngGetString(ERROR_LOADPROJECTXML),iResult);\r\n\r\n        MessageBox(*g_pMainFrame,szMessage,lngGetString(GENERAL_ERROR),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    if (!Xml.EnterElement(_T(\"InfraRecorder\")))\r\n        return false;\r\n\r\n    if (!Xml.EnterElement(_T(\"Project\")))\r\n        return false;\r\n\r\n    // Version check.\r\n    int iVersion = 0;\r\n    Xml.GetSafeElementAttrValue(_T(\"version\"),&iVersion);\r\n\r\n    if (iVersion > PROJECTMANAGER_FILEVERSION)\r\n    {\r\n        lngMessageBox(*g_pMainFrame,ERROR_PROJECTVERSION,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    if (iVersion < PROJECTMANAGER_FILEVERSION)\r\n        lngMessageBox(*g_pMainFrame,WARNING_OLDPROJECT,GENERAL_WARNING,MB_OK | MB_ICONWARNING);\r\n\r\n    // Project type.\r\n    int iType = -1;\r\n    Xml.GetSafeElementAttrValue(_T(\"type\"),&iType);\r\n\r\n    int iMedia = false;\r\n    Xml.GetSafeElementAttrValue(_T(\"media\"),&iMedia);\r\n\r\n    switch (iType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            NewDataProject(iMedia);\r\n\r\n            // Label.\r\n            Xml.GetSafeElementData(_T(\"Label\"),g_ProjectSettings.m_szLabel,MAX_PATH - 1);\r\n            SetDiscLabel(g_ProjectSettings.m_szLabel);\r\n\r\n            // Data information.\r\n            LoadProjectFileSys(&Xml);\r\n            LoadProjectISO(&Xml);\r\n            LoadProjectFields(&Xml);\r\n            LoadProjectBoot(&Xml);\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            NewAudioProject(iMedia);\r\n\r\n            // Album information.\r\n            Xml.GetSafeElementData(_T(\"AlbumName\"),g_ProjectSettings.m_szAlbumName,159);\r\n            Xml.GetSafeElementData(_T(\"AlbumArtist\"),g_ProjectSettings.m_szAlbumArtist,159);\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            NewMixedProject(iMedia);\r\n\r\n            // Label.\r\n            Xml.GetSafeElementData(_T(\"Label\"),g_ProjectSettings.m_szLabel,MAX_PATH - 1);\r\n            SetDiscLabel(g_ProjectSettings.m_szLabel);\r\n\r\n            // Album information.\r\n            Xml.GetSafeElementData(_T(\"AlbumName\"),g_ProjectSettings.m_szAlbumName,159);\r\n            Xml.GetSafeElementData(_T(\"AlbumArtist\"),g_ProjectSettings.m_szAlbumArtist,159);\r\n\r\n            // Data information.\r\n            LoadProjectFileSys(&Xml);\r\n            LoadProjectISO(&Xml);\r\n            LoadProjectFields(&Xml);\r\n            break;\r\n\r\n        default:\r\n            lngMessageBox(*g_pMainFrame,ERROR_LOADPROJECT,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n            return false;\r\n    }\r\n\r\n    // Project data.\r\n    if (!LoadProjectData(&Xml))\r\n    {\r\n        lngMessageBox(*g_pMainFrame,ERROR_LOADPROJECT,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n\r\n    // Try to expand the root item for data projects.\r\n    if (iType == PROJECTTYPE_DATA)\r\n        m_pTreeView->Expand(g_TreeManager.GetRootNode()->m_hTreeItem);\r\n\r\n    // Update the space meter.\r\n    if (m_pSpaceMeter != NULL)\r\n        m_pSpaceMeter->SetAllocatedSize(g_TreeManager.GetNodeSize(g_TreeManager.GetRootNode()));\r\n\r\n    Xml.LeaveElement();\r\n    Xml.LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Obtains project information.\r\n    @param uiFileCount number of files in the project.\r\n    @param uiFolderCount number of folders in the project.\r\n    @param uiTrackCount number of tracks in the project.\r\n*/\r\nvoid CProjectManager::GetProjectContents(unsigned __int64 &uiFileCount,unsigned __int64 &uiFolderCount,\r\n                                         unsigned __int64 &uiTrackCount)\r\n{\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            g_TreeManager.GetNodeContents(g_TreeManager.GetRootNode(),uiFileCount,uiFolderCount);\r\n            uiTrackCount = 0;\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            g_TreeManager.GetNodeContents(g_TreeManager.GetRootNode(),uiTrackCount,uiFolderCount);\r\n            uiFileCount = 0;\r\n            uiFolderCount = 0;\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            g_TreeManager.GetNodeContents(m_pMixAudioNode,uiTrackCount,uiFolderCount);\r\n            g_TreeManager.GetNodeContents(m_pMixDataNode,uiFileCount,uiFolderCount);\r\n            break;\r\n    };\r\n}\r\n\r\n/**\r\n    Returns the project size in bytes.\r\n    @return the project size in bytes.\r\n*/\r\nunsigned __int64 CProjectManager::GetProjectSize()\r\n{\r\n    return m_pSpaceMeter->GetAllocatedSize();\r\n}\r\n\r\n/*\r\n    CProjectManager::GetProjectAudioSize\r\n    ------------------------------------\r\n    Returns the number of bytes of CD audio that the project contains.\r\n*/\r\n// Working, but not used.\r\n/*unsigned __int64 CProjectManager::GetProjectAudioSize()\r\n{\r\n    switch (GetProjectType())\r\n    {\r\n    case PROJECTTYPE_AUDIO:\r\n        return GetProjectSize();\r\n\r\n    case PROJECTTYPE_MIXED:\r\n        return g_TreeManager.GetNodeSize(m_pMixAudioNode);\r\n    }\r\n\r\n    return 0;\r\n}*/\r\n\r\n/**\r\n    Returns the data root node of a mixed mode project.\r\n    @return the data root node of a mixed mode project.\r\n*/\r\nCProjectNode *CProjectManager::GetMixDataRootNode()\r\n{\r\n    return m_pMixDataNode;\r\n}\r\n\r\n/**\r\n    Returns the audio root node of a mixed mode project.\r\n    @return the audio root node of a mixed mode project.\r\n*/\r\nCProjectNode *CProjectManager::GetMixAudioRootNode()\r\n{\r\n    return m_pMixAudioNode;\r\n}\r\n\r\n/**\r\n    Updates the specifed list view with all audio files in an audio or mixed mode\r\n    project.\r\n    @param pListView the list view which should be updated.\r\n*/\r\nvoid CProjectManager::ListAudioTracks(CListViewCtrl *pListView)\r\n{\r\n    if (m_iProjectType == PROJECTTYPE_AUDIO)\r\n        g_TreeManager.ListNodeFiles(g_TreeManager.GetRootNode(),pListView);\r\n    else if (m_iProjectType == PROJECTTYPE_MIXED)\r\n        g_TreeManager.ListNodeFiles(m_pMixAudioNode,pListView);\r\n}\r\n\r\n/**\r\n    Fills the specified vector with the absolute file system paths of all audio\r\n    tracks in project.\r\n    @param AudioTracks the target vector which should be updated with the\r\n    absolute paths.\r\n*/\r\nvoid CProjectManager::GetAudioTracks(std::vector<TCHAR *> &AudioTracks)\r\n{\r\n    if (m_iProjectType == PROJECTTYPE_AUDIO)\r\n        g_TreeManager.GetNodeFullPaths(g_TreeManager.GetRootNode(),AudioTracks);\r\n    else if (m_iProjectType == PROJECTTYPE_MIXED)\r\n        g_TreeManager.GetNodeFullPaths(m_pMixAudioNode,AudioTracks);\r\n}\r\n\r\n/**\r\n    Decodes the specified audio file to a file with the specified temporary file\r\n    path.\r\n    @param szFullPath absolute path to the file to be decoded.\r\n    @param szFullTempPath absolute path to the decoded file which should be\r\n    created.\r\n    @param pProgress progress feedback object.\r\n    @return true if successfull, false otherwise.\r\n*/\r\nbool CProjectManager::DecodeAudioTrack(const TCHAR *szFullPath,const TCHAR *szFullTempPath,\r\n                                       CAdvancedProgress *pProgress)\r\n{\r\n    // Find which codec that can be uses for decoding the source file.\r\n    CCodec *pDecoder = NULL;\r\n\r\n    // Audio file information.\r\n    int iNumChannels = -1;\r\n    int iSampleRate = -1;\r\n    int iBitRate = -1;\r\n    unsigned __int64 uiDuration = 0;\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        // We're only interested in decoders.\r\n        if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_DECODER) == 0)\r\n            continue;\r\n\r\n        if (g_CodecManager.m_Codecs[i]->irc_decode_init(szFullPath,iNumChannels,\r\n            iSampleRate,iBitRate,uiDuration))\r\n        {\r\n            pDecoder = g_CodecManager.m_Codecs[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (pDecoder == NULL)\r\n    {\r\n        TCHAR szNameBuffer[MAX_PATH];\r\n        lstrcpy(szNameBuffer,szFullPath);\r\n        ExtractFileName(szNameBuffer);\r\n\r\n        pProgress->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_NODECODER),szNameBuffer);\r\n        return false;\r\n    }\r\n\r\n    // Find the wave encoder.\r\n    CCodec *pEncoder = NULL;\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_ENCODER) == 0)\r\n            continue;\r\n\r\n        if (!lstrcmp(g_CodecManager.m_Codecs[i]->irc_string(IRC_STR_FILEEXT),_T(\".wav\")))\r\n        {\r\n            pEncoder = g_CodecManager.m_Codecs[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (pEncoder == NULL)\r\n    {\r\n        pProgress->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_WAVECODEC));\r\n\r\n        pDecoder->irc_decode_exit();\r\n        return false;\r\n    }\r\n\r\n    // Initialize the encoder.\r\n    if (!pEncoder->irc_encode_init(szFullTempPath,iNumChannels,iSampleRate,iBitRate))\r\n    {\r\n        pProgress->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_CODECINIT),\r\n            pEncoder->irc_string(IRC_STR_ENCODER),\r\n            iNumChannels,iSampleRate,iBitRate,uiDuration);\r\n\r\n        pDecoder->irc_decode_exit();\r\n        return false;\r\n    }\r\n\r\n    // Encode/decode-process.\r\n    __int64 iBytesRead = 0;\r\n    unsigned __int64 uiCurrentTime = 0;\r\n\r\n    // FIXME: This macro should not be placed here.\r\n#define ENCODE_BUFFER_FACTOR\t\t1024\r\n\r\n    // Allocate buffer memory.\r\n    unsigned int uiBufferSize = iNumChannels * ((iBitRate / iSampleRate) >> 3) * ENCODE_BUFFER_FACTOR;\r\n    unsigned char *pBuffer = new unsigned char[uiBufferSize];\r\n\r\n    while (true)\r\n    {\r\n        iBytesRead = pDecoder->irc_decode_process(pBuffer,uiBufferSize,uiCurrentTime);\r\n        if (iBytesRead <= 0)\r\n            break;\r\n\r\n        if (pEncoder->irc_encode_process(pBuffer,iBytesRead) < 0)\r\n        {\r\n            pProgress->notify(ckcore::Progress::ckERROR,lngGetString(ERROR_ENCODEDATA));\r\n            break;\r\n        }\r\n\r\n        // Update the progres bar.\r\n        unsigned char ucPercent = (unsigned char)(((double)uiCurrentTime/uiDuration) * 100);\r\n        pProgress->set_progress(ucPercent);\r\n    }\r\n\r\n    // Free buffer memory.\r\n    delete [] pBuffer;\r\n\r\n    // Flush.\r\n    pEncoder->irc_encode_flush();\r\n    pProgress->set_progress(100);\r\n\r\n    // Destroy the codecs.\r\n    pEncoder->irc_encode_exit();\r\n    pDecoder->irc_decode_exit();\r\n\r\n    TCHAR szNameBuffer[MAX_PATH];\r\n    lstrcpy(szNameBuffer,szFullPath);\r\n    ExtractFileName(szNameBuffer);\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,\r\n        lngGetString(SUCCESS_DECODETRACK),szNameBuffer);\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Decodes any necessary (that are not in a compatible format) track in the\r\n    specified audio tracks vector. The decoded audio tracks vector will be\r\n    updated with the new temporary file paths of the decoded tracks. Please\r\n    note that the caller needs to free the memory allocated for the strings\r\n    added to the decoded tracks vector.\r\n    @param AudioTracks vector of aboslute file paths to audio tracks that\r\n    should be decoded.\r\n    @param DecodedTracks output vector of absolute file paths to the decoded\r\n    tracks.\r\n    @param pProgress progress feedback object.\r\n    @return true if successfull, false otherwise.\r\n*/\r\nbool CProjectManager::DecodeAudioTracks(std::vector<TCHAR *> &AudioTracks,\r\n                                        std::vector<TCHAR *> &DecodedTracks,\r\n                                        CAdvancedProgress *pProgress)\r\n{\r\n    if (pProgress == NULL)\r\n        return false;\r\n\r\n    for (unsigned int i = 0; i < AudioTracks.size(); i++)\r\n    {\r\n        // Return if the user has canceled the operaiton.\r\n        if (pProgress->cancelled())\r\n            return false;\r\n\r\n        // If the track isn't a wave file it needs to be decoded.\r\n        if (GetAudioFormat(AudioTracks[i]) != AUDIOFORMAT_WAVE)\r\n        {\r\n            TCHAR szFileName[MAX_PATH];\r\n            lstrcpy(szFileName,AudioTracks[i]);\r\n            ExtractFileName(szFileName);\r\n\r\n            // Create temporary file name.\r\n            TCHAR *szTempName = new TCHAR[MAX_PATH];\r\n            lstrcpy(szTempName,g_GlobalSettings.m_szTempPath);\r\n            lstrcat(szTempName,szFileName);\r\n            ChangeFileExt(szTempName,_T(\".wav\"));\r\n\r\n            // Decode the track.\r\n            if (DecodeAudioTrack(AudioTracks[i],szTempName,pProgress))\r\n            {\r\n                DecodedTracks.push_back(szTempName);\r\n                AudioTracks[i] = szTempName;\r\n            }\r\n            else\r\n            {\r\n                delete [] szTempName;\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Saves the project CD-Text data to the specified file.\r\n    @param szFullPath the absolute path of the file that should contain the\r\n    CD-Text data. The file will be created if it doesn't exist. If it already\r\n    exists it will be overwritten.\r\n    @return true if the file was successfully created, false otherwise.\r\n*/\r\nbool CProjectManager::SaveCDText(const TCHAR *szFullPath)\r\n{\r\n    std::vector<CItemData *> Files;\r\n\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_MIXED:\r\n            g_TreeManager.GetNodeFiles(m_pMixAudioNode,Files);\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            g_TreeManager.GetNodeFiles(g_TreeManager.GetRootNode(),Files);\r\n            break;\r\n    };\r\n\r\n    CCdText CdText;\r\n    return CdText.WriteFileEx(szFullPath,g_ProjectSettings.m_szAlbumName,g_ProjectSettings.m_szAlbumArtist,Files);\r\n}\r\n\r\n/**\r\n    Verifies all files in the specified folder (node). The number of failed\r\n    readings will be obtained.\r\n    @param pNode folder (node) containing all files to be verified.\r\n    @param FolderStack vector of folders (nodes) that will be updated as new\r\n    sub folders are detected.\r\n    @param pProgress progress feedback object.\r\n    @param szFileNameBuffer file name buffer used for improving performance.\r\n    @param iPathStripLen number of characters that should be stripped from\r\n    the current project path.\r\n    @param pCrc32File helper object for calculating a CRC32 checksum.\r\n    @param uiFailCount number of files that failed the CRC32 verification.\r\n    @return true if completed (with or without errors), and false if cancelled.\r\n*/\r\nbool CProjectManager::VerifyLocalFiles(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n                                       CAdvancedProgress *pProgress,TCHAR *szFileNameBuffer,int iPathStripLen,\r\n                                       ckcore::Progresser &FileProgresser,unsigned __int64 &uiFailCount,\r\n                                       std::map<tstring,tstring> &FilePathMap)\r\n{\r\n    ckcore::CrcStream FileCrcStream(ckcore::CrcStream::ckCRC_32);\r\n\r\n    TCHAR szStatus[MAX_PATH + 32];\r\n    tstring FileName;\r\n\r\n    TCHAR szDriveLetter[3];\r\n    szDriveLetter[0] = szFileNameBuffer[0];\r\n    szDriveLetter[1] = szFileNameBuffer[1];\r\n    szDriveLetter[2] = '\\0';\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n        FolderStack.push_back(*itNodeObject);\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        // Ignore files that are already on the disc. We have nothing to\r\n        // compare them against.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            continue;\r\n\r\n        // Don't overwrite the drive letter.\r\n        lstrcpy(szFileNameBuffer + 2,pItemData->GetFilePath() + iPathStripLen);\r\n        lstrcat(szFileNameBuffer,pItemData->GetFileName());\r\n\r\n        lsnprintf_s(szStatus,MAX_PATH + 32,lngGetString(STATUS_VERIFY),szFileNameBuffer);\r\n        pProgress->set_status(szStatus);\r\n\r\n        // Calculate CRC of file on the hard drive.\r\n        ckcore::FileInStream FileStream1(pItemData->szFullPath);\r\n        if (!FileStream1.open())\r\n            return false;\r\n\r\n        FileCrcStream.reset();\r\n        if (!ckcore::stream::copy(FileStream1,FileCrcStream,FileProgresser))\r\n            return false;\r\n\r\n        FileStream1.close();\r\n        unsigned long ulGoodCrc = FileCrcStream.checksum();\r\n\r\n        // Calculate CRC of the file on the disc.\r\n        FileName = szDriveLetter;\r\n        FileName.append(FilePathMap[szFileNameBuffer + 2]);\r\n\r\n        ckcore::FileInStream FileStream2(FileName.c_str());\r\n        if (!FileStream2.open())\r\n            return false;\r\n\r\n        FileCrcStream.reset();\r\n        if (!ckcore::stream::copy(FileStream2,FileCrcStream,FileProgresser))\r\n            return false;\r\n\r\n        FileStream2.close();\r\n        unsigned long ulTestCrc = FileCrcStream.checksum();\r\n\r\n        // Compare the CRC of the file on the disc to the one on the harddrive.\r\n        if (ulTestCrc != ulGoodCrc)\r\n        {\r\n            if (ulTestCrc == 0)\r\n            {\r\n                pProgress->notify(ckcore::Progress::ckERROR,\r\n                    lngGetString(FAILURE_VERIFYNOFILE),FileName.c_str() + 3);\r\n            }\r\n            else\r\n            {\r\n                pProgress->notify(ckcore::Progress::ckERROR,\r\n                    lngGetString(FAILURE_VERIFYREADERROR),/*szFileNameBuffer*/FileName.c_str(),ulTestCrc,ulGoodCrc);\r\n            }\r\n\r\n            uiFailCount++;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n     Performs a CRC check comparission on the files on the hard disk and the CD.\r\n     @param pProgress progress feedback object.\r\n     @param szDriveLetter drive letter of the device containg the CD to be\r\n     verified.\r\n     @return true of the operation completed successfully (with or without\r\n     errors), and false if the operation was cancelled.\r\n*/\r\nbool CProjectManager::VerifyCompilation(CAdvancedProgress *pProgress,const TCHAR *szDriveLetter,\r\n                                        std::map<tstring,tstring> &FilePathMap)\r\n{\r\n    int iPathStripLen = 0;\r\n\r\n    CProjectNode *pRootNode = NULL;\r\n    switch (g_ProjectManager.GetProjectType())\r\n    {\r\n        case PROJECTTYPE_MIXED:\r\n            pRootNode = GetMixDataRootNode();\r\n\r\n            iPathStripLen = lstrlen(pRootNode->pItemData->GetFileName()) + 1;\r\n            break;\r\n\r\n        default:\r\n            pRootNode = g_TreeManager.GetRootNode();\r\n            break;\r\n    }\r\n\r\n    pProgress->notify(ckcore::Progress::ckINFORMATION,lngGetString(PROGRESS_BEGINVERIFY));\r\n\r\n    // It's important the the first two characters contain <drive letter>:.\r\n    TCHAR szFileNameBuffer[MAX_PATH];\r\n    lstrcpy(szFileNameBuffer,szDriveLetter);\r\n\r\n    unsigned __int64 uiFailCount = 0;\r\n\r\n    ckcore::Progresser FileProgresser(*pProgress,g_TreeManager.GetNodeSize(pRootNode) << 1);\r\n\r\n    std::vector<CProjectNode *> FolderStack;\r\n    if (!VerifyLocalFiles(pRootNode,FolderStack,pProgress,szFileNameBuffer,iPathStripLen,FileProgresser,uiFailCount,FilePathMap))\r\n        return false;\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pRootNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        if (!VerifyLocalFiles(pRootNode,FolderStack,pProgress,szFileNameBuffer,iPathStripLen,FileProgresser,uiFailCount,FilePathMap))\r\n            return false;\r\n    }\r\n    \r\n    // Display the final message.\r\n    if (uiFailCount == 0)\r\n    {\r\n        pProgress->notify(ckcore::Progress::ckINFORMATION,\r\n            lngGetString(SUCCESS_VERIFY));\r\n    }\r\n    else\r\n    {\r\n        pProgress->notify(ckcore::Progress::ckINFORMATION,\r\n            lngGetString(FAILURE_VERIFY),uiFailCount);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n    Updates the label of the current project.\r\n    @param szLabelName new label.\r\n*/\r\nvoid CProjectManager::SetDiscLabel(TCHAR *szLabelName)\r\n{\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n            if (m_pTreeView != NULL)\r\n                m_pTreeView->SetItemText(g_TreeManager.GetRootNode()->m_hTreeItem,szLabelName);\r\n            break;\r\n\r\n        case PROJECTTYPE_AUDIO:\r\n            szLabelName[0] = '\\0';\r\n            break;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            if (m_pTreeView != NULL)\r\n                m_pTreeView->SetItemText(m_pMixDataNode->m_hTreeItem,szLabelName);\r\n            break;\r\n    };\r\n}\r\n\r\n/**\r\n    Updates the modified status of the current project.\r\n    @param bModified true if the project has been modified after last save,\r\n    false otherwise.\r\n*/\r\nvoid CProjectManager::SetModified(bool bModified)\r\n{\r\n    m_bModified = bModified;\r\n}\r\n\r\n/**\r\n    Returns the modified status of the current project.\r\n    @return the modified status of the current project.\r\n*/\r\nbool CProjectManager::GetModified()\r\n{\r\n    return m_bModified;\r\n}\r\n\r\nbool CProjectManager::IsEmpty() const\r\n{\r\n    switch (m_iProjectType)\r\n    {\r\n        case PROJECTTYPE_DATA:\r\n        case PROJECTTYPE_AUDIO:\r\n            return g_TreeManager.GetRootNode()->m_Children.size() == 0;\r\n\r\n        case PROJECTTYPE_MIXED:\r\n            return m_pMixAudioNode->m_Children.size() == 0 &&\r\n                   m_pMixDataNode->m_Children.size() == 0;\r\n\r\n        default:\r\n            assert(false);\r\n            break;\r\n    };\r\n\r\n    return false;\r\n}\r\n\r\n/**\r\n * Imports a single file into the project.\r\n * @param [in] BasePath The base path to use in order to build full path if the\r\n *                      specified file path is relative.\r\n * @param [in] FilePath The full or relative file path.\r\n * @param [in] Transaction The transaction object to update with the new file.\r\n * @return If successful true is returned, if not false is returned.\r\n */\r\nbool CProjectManager::ImportFile(ckcore::Path &BasePath,\r\n                                 ckcore::tstring &FilePath,\r\n                                 CFileTransaction &Transaction)\r\n{\r\n    // Check if full file path.\r\n    bool bFullPath = FilePath.size() > 1 && (FilePath[1] == ':' ||\r\n        (FilePath[0] == '\\\\' && FilePath[1] == '\\\\'));\r\n\r\n    if (bFullPath)\r\n        return Transaction.AddFile(FilePath.c_str());\r\n\r\n    // Create full path from relative path.\r\n    ckcore::Path FullPath = BasePath;\r\n    FullPath += FilePath.c_str();\r\n\r\n    return Transaction.AddFile(FullPath.name().c_str());\r\n}\r\n\r\n/**\r\n * Imports data from a file list (text file containing one file or folder on\r\n * each line). The file can be in M3U format, supporting comments starting with\r\n * the '#'-character.\r\n * @param [in] szFullPath Path to the file list.\r\n * @return If successful true is returned, if not false is returned.\r\n */\r\nbool CProjectManager::Import(const TCHAR *szFullPath)\r\n{\r\n    // Open the selected file for reading.\r\n    ckcore::FileInStream FileStream(szFullPath);\r\n    if (!FileStream.open())\r\n        return false;\r\n\r\n    // Calculate the base path name in case the listed files have relative paths.\r\n    ckcore::Path BasePath(szFullPath);\r\n    BasePath = BasePath.dir_name().c_str();\r\n\r\n    CFileTransaction Transaction;\r\n\r\n    // Read the file line by line.\r\n    ckcore::LineReader<ckcore::tchar>::Encoding FileEnc =\r\n        ckcore::LineReader<ckcore::tchar>::encoding(FileStream);\r\n    FileStream.seek(0,ckcore::InStream::ckSTREAM_BEGIN);\r\n\r\n    // Check if ANSI or UTF-16 encoding.\r\n    if (FileEnc == ckcore::LineReader<ckcore::tchar>::ckENCODING_ANSI)\r\n    {\r\n        ckcore::LineReader<char> LineReader(FileStream);\r\n        while (!LineReader.end())\r\n        {\r\n            ckcore::tstring Line =\r\n                ckcore::string::ansi_to_auto<1024>(LineReader.read_line().c_str());\r\n\r\n            // Skip empty and commented lines.\r\n            if (Line.empty())\r\n                continue;\r\n\r\n            if (Line[0] == '#')\r\n                continue;\r\n\r\n            // Remove any trailing path delimiters.\r\n            if (Line[Line.size() - 1] == '\\\\' || Line[Line.size() - 1] == '/')\r\n                Line.resize(Line.size() - 1);\r\n\r\n            if (!ImportFile(BasePath,Line,Transaction))\r\n            {\r\n                TCHAR szBuffer[1024];\r\n                lsprintf(szBuffer,lngGetString(ERROR_PROJECT_IMPORT_FILE),\r\n                    Line.c_str());\r\n\r\n                MessageBox(HWND_DESKTOP,szBuffer,lngGetString(GENERAL_ERROR),\r\n                    MB_OK | MB_ICONERROR);\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        ckcore::LineReader<wchar_t> LineReader(FileStream);\r\n        while (!LineReader.end())\r\n        {\r\n            ckcore::tstring Line =\r\n                ckcore::string::utf16_to_auto<1024>(LineReader.read_line().c_str());\r\n            \r\n            // Skip empty and commented lines.\r\n            if (Line.empty())\r\n                continue;\r\n\r\n            if (Line[0] == '#')\r\n                continue;\r\n\r\n            // Remove any trailing path delimiters.\r\n            if (Line[Line.size() - 1] == '\\\\' || Line[Line.size() - 1] == '/')\r\n                Line.resize(Line.size() - 1);\r\n\r\n            if (!ImportFile(BasePath,Line,Transaction))\r\n            {\r\n                TCHAR szBuffer[1024];\r\n                lsprintf(szBuffer,lngGetString(ERROR_PROJECT_IMPORT_FILE),\r\n                    Line.c_str());\r\n\r\n                MessageBox(HWND_DESKTOP,szBuffer,lngGetString(GENERAL_ERROR),\r\n                    MB_OK | MB_ICONERROR);\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/project_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/crcstream.hh>\r\n#include <ckfilesystem/filesystemhelper.hh>\r\n#include <base/xml_processor.hh>\r\n#include \"space_meter.hh\"\r\n#include \"tree_manager.hh\"\r\n#include \"custom_container.hh\"\r\n#include \"advanced_progress.hh\"\r\n#include \"confirm_file_replace_dlg.hh\"\r\n\r\n// Specifies what column index each data column has.\r\n#define COLUMN_SUBINDEX_NAME\t\t\t\t0\r\n#define COLUMN_SUBINDEX_SIZE\t\t\t\t1\r\n#define COLUMN_SUBINDEX_TYPE\t\t\t\t2\r\n#define COLUMN_SUBINDEX_MODIFIED\t\t\t3\r\n#define COLUMN_SUBINDEX_PATH\t\t\t\t4\r\n\r\n// Specifies what column index each audio column has.\r\n#define COLUMN_SUBINDEX_TRACK\t\t\t\t0\r\n#define COLUMN_SUBINDEX_TITLE\t\t\t\t1\r\n#define COLUMN_SUBINDEX_LENGTH\t\t\t\t2\r\n#define COLUMN_SUBINDEX_LOCATION\t\t\t3\r\n\r\n#define PROJECTVIEWTYPE_DATA\t\t\t\t0\r\n#define PROJECTVIEWTYPE_AUDIO\t\t\t\t1\r\n\r\n#define PROJECTTYPE_DATA\t\t\t\t\t0\r\n#define PROJECTTYPE_AUDIO\t\t\t\t\t1\r\n#define PROJECTTYPE_MIXED\t\t\t\t\t2\r\n\r\n// What project file version does this build use.\r\n#define PROJECTMANAGER_FILEVERSION\t\t\t3\r\n\r\n/// Class for project content management.\r\n/**\r\n    Implements core project functionallity such as creating and loading projects,\r\n    adding, removing and moving files.\r\n*/\r\nclass CProjectManager\r\n{\r\npublic:\r\n    /// Class for performing file transactions within a project.\r\n    /**\r\n        Implements support for adding and moving files to/within a project.\r\n    */\r\n    class CFileTransaction\r\n    {\r\n    public:\r\n        enum eMode\r\n        {\r\n            MODE_NORMAL,\r\n            MODE_IMPORT\r\n        };\r\n\r\n    private:\r\n        eMode m_Mode;\r\n        CConfirmFileReplaceDlg m_ReplaceDlg;\r\n\r\n        void AddFilesInFolder(CProjectNode *pParentNode,std::vector<CProjectNode *> &FolderStack);\r\n\r\n        bool AddDataFile(CProjectNode *pParentNode,const TCHAR *szFileName,\r\n            const TCHAR *szFilePath,const TCHAR *szFullPath,FILETIME *pFileTime,\r\n            unsigned __int64 uiSize);\r\n        CItemData *AddDataFile(CProjectNode *pParentNode,const TCHAR *szFullPath);\r\n        CProjectNode *AddFolder(CProjectNode *pParentNode,const TCHAR *szFolderName,\r\n            const TCHAR *szFolderPath,const TCHAR *szFullPath,FILETIME *pFileTime);\r\n        CProjectNode *AddFolder(CProjectNode *pParentNode,const TCHAR *szFullPath);\r\n        bool AddAudioFile(CProjectNode *pParentNode,const TCHAR *szFullPath);\r\n\r\n    public:\r\n        CFileTransaction(eMode Mode = MODE_NORMAL);\r\n        ~CFileTransaction();\r\n\r\n        bool AddFile(const TCHAR *szFullPath,CProjectNode *pTargetNode = NULL);\r\n        CItemData *AddFile(const TCHAR *szFullPath,const TCHAR *szProjectPath);\r\n\r\n        bool MoveFile(CProjectNode *pItemParent,CItemData *pItemData,CProjectNode *pNewParent);\r\n        bool MoveFileToCurrent(CProjectNode *pItemParent,CItemData *pItemData);\r\n    };\r\n\r\nprivate:\r\n    int m_iProjectType;\r\n    int m_iProjectMedia;\r\n    int m_iViewType;\r\n    int m_iActiveView;\t\t\t\t// Tells us what view (tree or list) that last had focus.\r\n    bool m_bModified;\t\t\t\t// Set to true if the project has been modified since the last save.\r\n\r\n    CProjectNode *m_pActionNode;\t// Used for random internal temporary purposes.\r\n\r\n    CSplitterWindow *m_pProjectView;\r\n    CCustomContainer *m_pContainer;\r\n    CSpaceMeter *m_pSpaceMeter;\r\n    CListViewCtrl *m_pListView;\r\n    CTreeViewCtrlEx *m_pTreeView;\r\n\r\n    CProjectNode *m_pMixDataNode;\r\n    CProjectNode *m_pMixAudioNode;\r\n\r\n    void SetupDataListView();\r\n    void SetupAudioListView();\r\n\r\n    bool DecodeAudioTrack(const TCHAR *szFullPath,const TCHAR *szFullTempPath,\r\n        CAdvancedProgress *pProgress);\r\n\r\n    bool VerifyLocalFiles(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n        CAdvancedProgress *pProgress,TCHAR *szFileNameBuffer,int iPathStripLen,\r\n        ckcore::Progresser &FileProgresser,unsigned __int64 &uiFailCount,\r\n        std::map<tstring,tstring> &FilePathMap);\r\n\r\n    bool GenerateNewFolderName(CProjectNode *pParent,TCHAR *szFolderName,\r\n        unsigned int uiFolderNameSize);\r\n\r\n    void CloseProject();\r\n    void SaveProjectData(CXmlProcessor *pXML);\r\n    bool LoadProjectData(CXmlProcessor *pXML);\r\n    void SaveProjectFileSys(CXmlProcessor *pXML);\r\n    bool LoadProjectFileSys(CXmlProcessor *pXML);\r\n    void SaveProjectISO(CXmlProcessor *pXML);\r\n    bool LoadProjectISO(CXmlProcessor *pXML);\r\n    void SaveProjectFields(CXmlProcessor *pXML);\r\n    bool LoadProjectFields(CXmlProcessor *pXML);\r\n    void SaveProjectBoot(CXmlProcessor *pXML);\r\n    bool LoadProjectBoot(CXmlProcessor *pXML);\r\n\r\n    enum eActiveView\r\n    {\r\n        AV_TREE,\r\n        AV_LIST\r\n    };\r\n\r\n    bool ImportFile(ckcore::Path &BasePath,ckcore::tstring &FilePath,\r\n        CFileTransaction &Transaction);\r\n\r\npublic:\r\n    CProjectManager();\r\n    ~CProjectManager();\r\n\r\n    LRESULT OnNewFolder(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRename(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnRemove(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    void AssignControls(CSplitterWindow *pProjectView,CCustomContainer *pContainer,\r\n        CSpaceMeter *pSpaceMeter,CListViewCtrl *pListView,CTreeViewCtrlEx *pTreeView);\r\n\r\n    void EnableAll(int iID,bool bEnable,HMENU hMenu = NULL);\r\n\r\n    void NewDataProject(int iDiscMedia);\r\n    void NewAudioProject(int iDiscMedia);\r\n    void NewMixedProject(int iDiscMedia);\r\n\r\n    void DataSelected();\r\n    void AudioSelected();\r\n\r\n    bool ListAddNewFolder();\r\n    bool TreeAddNewFolder(CProjectNode *pParentNode);\r\n\r\n    void RemoveFile(CProjectNode *pParentNode,CItemData *pItemData);\r\n\r\n    void ListRemoveSel();\r\n    void TreeRemoveNode(CProjectNode *pNode);\r\n    void NotifyListSelChanged(unsigned int uiSelCount);\r\n    void NotifyTreeSelChanged(CProjectNode *pNode);\r\n    void TreeSetActionNode(CProjectNode *pNode);\r\n\r\n    void TreeSetActive();\r\n    void ListSetActive();\r\n\r\n    void DeleteImportedItems();\r\n\r\n    int GetViewType();\r\n    int GetProjectType();\r\n    void GetProjectContents(unsigned __int64 &uiFileCount,unsigned __int64 &uiFolderCount,\r\n        unsigned __int64 &uiTrackCount);\r\n    unsigned __int64 GetProjectSize();\r\n    //unsigned __int64 GetProjectAudioSize();\r\n    CProjectNode *GetMixDataRootNode();\r\n    CProjectNode *GetMixAudioRootNode();\r\n\r\n    void ListAudioTracks(CListViewCtrl *pListView);\r\n    void GetAudioTracks(std::vector<TCHAR *> &AudioTracks);\r\n    bool DecodeAudioTracks(std::vector<TCHAR *> &AudioTracks,\r\n        std::vector<TCHAR *> &DecodedTracks,CAdvancedProgress *pProgress);\r\n    bool SaveCDText(const TCHAR *szFullPath);\r\n\r\n    bool VerifyCompilation(CAdvancedProgress *pProgress,const TCHAR *szDriveLetter,\r\n        std::map<tstring,tstring> &FilePathMap);\r\n\r\n    void SetDiscLabel(TCHAR *szLabelName);\r\n\r\n    void SetModified(bool bModified);\r\n    bool GetModified();\r\n\r\n    bool IsEmpty() const;\r\n\r\n    bool SaveProject(const TCHAR *szFullPath);\r\n    bool LoadProject(const TCHAR *szFullPath);\r\n\r\n    bool Import(const TCHAR *szFullPath);\r\n};\r\n\r\nextern CProjectManager g_ProjectManager;\r\n"
  },
  {
    "path": "src/app/registry.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"registry.hh\"\r\n\r\nCRegistry::CRegistry()\r\n{\r\n    m_hRootKey = HKEY_CURRENT_USER;\r\n}\r\n\r\nCRegistry::~CRegistry()\r\n{\r\n}\r\n\r\nvoid CRegistry::SetRoot(HKEY hKey)\r\n{\r\n    m_hRootKey = hKey;\r\n}\r\n\r\nbool CRegistry::OpenKey(const TCHAR *szKeyName,bool bCreate)\r\n{\r\n    if (RegOpenKeyEx(m_hRootKey,szKeyName,0,KEY_ALL_ACCESS,&m_hKey) == ERROR_SUCCESS)\r\n        return true;\r\n\r\n    if (bCreate)\r\n    {\r\n        DWORD dwResult;\r\n\r\n        if (RegCreateKeyEx(m_hRootKey,szKeyName,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hKey,&dwResult) == ERROR_SUCCESS)\r\n            return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::CloseKey()\r\n{\r\n    if (RegCloseKey(m_hKey) == ERROR_SUCCESS)\r\n        return true;\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::DeleteKey(const TCHAR *szKeyName)\r\n{\r\n    if (RegDeleteKey(m_hKey,szKeyName) == ERROR_SUCCESS)\r\n        return true;\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::ReadBool(const TCHAR *szValueName,bool &bResult)\r\n{\r\n    DWORD dwValue,dwSize = sizeof(DWORD),dwType = REG_DWORD;\r\n\r\n    if (RegQueryValueEx(m_hKey,szValueName,NULL,&dwType,(LPBYTE)&dwValue,&dwSize) == ERROR_SUCCESS)\r\n    {\r\n        bResult = dwValue >= 1 ? true : false;\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::ReadInteger(const TCHAR *szValueName,int &iResult)\r\n{\r\n    DWORD dwValue,dwSize = sizeof(DWORD),dwType = REG_DWORD;\r\n\r\n    if (RegQueryValueEx(m_hKey,szValueName,NULL,&dwType,(LPBYTE)&dwValue,&dwSize) == ERROR_SUCCESS)\r\n    {\r\n        iResult = (int)dwValue;\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::ReadInteger64(const TCHAR *szValueName,__int64 &iResult)\r\n{\r\n    DWORD dwSize = sizeof(__int64),dwType = REG_QWORD;\r\n    LARGE_INTEGER liValue;\r\n\r\n    if (RegQueryValueEx(m_hKey,szValueName,NULL,&dwType,(LPBYTE)&liValue,&dwSize) == ERROR_SUCCESS)\r\n    {\r\n        iResult = (__int64)liValue.QuadPart;\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::ReadString(const TCHAR *szValueName,TCHAR *szResult,\r\n    unsigned long ulBufferSize)\r\n{\r\n    DWORD dwBufferSize = ulBufferSize;\r\n\r\n    if (RegQueryValueEx(m_hKey,szValueName,NULL,NULL,(LPBYTE)szResult,\r\n        &dwBufferSize) == ERROR_SUCCESS)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::ReadStringEx(const TCHAR *szValueName,TCHAR *&szResult)\r\n{\r\n    unsigned long ulBufferSize = STRING_CHUNK_SIZE;\r\n    szResult = new TCHAR[STRING_CHUNK_SIZE];\r\n    long lResult = 0;\r\n\r\n    while ((lResult = RegQueryValueEx(m_hKey,szValueName,NULL,NULL,(LPBYTE)szResult,\r\n        &ulBufferSize)) == ERROR_MORE_DATA)\r\n    {\r\n        // Increase the buffer size.\r\n        ulBufferSize += STRING_CHUNK_SIZE;\r\n\r\n        // Reallocate memory for the buffer. Why doesn't the realloc code work?\r\n        //realloc(szResult,ulBufferSize);\r\n        delete [] szResult;\r\n        szResult = new TCHAR[ulBufferSize];\r\n    }\r\n\r\n    if (lResult != ERROR_SUCCESS)\r\n    {\r\n        delete [] szResult;\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CRegistry::WriteBool(const TCHAR *szValueName,bool bValue)\r\n{\r\n    DWORD dwValue = (DWORD)bValue;\r\n\r\n    if (RegSetValueEx(m_hKey,szValueName,NULL,(DWORD)REG_DWORD,(LPBYTE)&dwValue,\r\n        (DWORD)sizeof(DWORD)) == ERROR_SUCCESS)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::WriteInteger(const TCHAR *szValueName,int iValue)\r\n{\r\n    DWORD dwValue = (DWORD)iValue;\r\n\r\n    if (RegSetValueEx(m_hKey,szValueName,NULL,(DWORD)REG_DWORD,(LPBYTE)&dwValue,\r\n        (DWORD)sizeof(DWORD)) == ERROR_SUCCESS)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::WriteInteger64(const TCHAR *szValueName,__int64 iValue)\r\n{\r\n    LARGE_INTEGER liValue;\r\n    liValue.QuadPart = iValue;\r\n\r\n    if (RegSetValueEx(m_hKey,szValueName,NULL,(DWORD)REG_QWORD,(LPBYTE)&liValue,\r\n        (DWORD)sizeof(__int64)) == ERROR_SUCCESS)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::WriteString(const TCHAR *szValueName,TCHAR *szValue,unsigned long ulBufferSize)\r\n{\r\n    if (RegSetValueEx(m_hKey,szValueName,NULL,REG_SZ,(LPBYTE)szValue,ulBufferSize) == ERROR_SUCCESS)\r\n        return true;\r\n\r\n    return false;\r\n}\r\n\r\nbool CRegistry::WriteStringEx(const TCHAR *szValueName,TCHAR *szValue)\r\n{\r\n    unsigned long ulBufferSize = lstrlen(szValue);\r\n\r\n    if (RegSetValueEx(m_hKey,szValueName,NULL,REG_SZ,(LPBYTE)szValue,ulBufferSize) == ERROR_SUCCESS)\r\n        return true;\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/app/registry.hh",
    "content": " /*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define STRING_CHUNK_SIZE\t\t\t\t128\r\n\r\nclass CRegistry\r\n{\r\nprivate:\r\n    HKEY m_hRootKey;\r\n    HKEY m_hKey;\r\n\r\npublic:\r\n    CRegistry();\r\n    ~CRegistry();\r\n\r\n    void SetRoot(HKEY hKey);\r\n    bool OpenKey(const TCHAR *szKeyName,bool bCreate = true);\r\n    bool CloseKey();\r\n    bool DeleteKey(const TCHAR *szKeyName);\r\n\r\n    bool ReadBool(const TCHAR *szValueName,bool &bResult);\r\n    bool ReadInteger(const TCHAR *szValueName,int &iResult);\r\n    bool ReadInteger64(const TCHAR *szValueName,__int64 &iResult);\r\n    bool ReadString(const TCHAR *szValueName,TCHAR *szResult,unsigned long ulBufferSize);\r\n    bool ReadStringEx(const TCHAR *szValueName,TCHAR *&szResult);\r\n\r\n    bool WriteBool(const TCHAR *szValueName,bool bValue);\r\n    bool WriteInteger(const TCHAR *szValueName,int iValue);\r\n    bool WriteInteger64(const TCHAR *szValueName,__int64 iValue);\r\n    bool WriteString(const TCHAR *szValueName,TCHAR *szValue,unsigned long ulBufferSize);\r\n    bool WriteStringEx(const TCHAR *szValueName,TCHAR *szValue);\r\n};\r\n"
  },
  {
    "path": "src/app/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by infrarecorder.rc\r\n//\r\n#define IDD_PROPPAGE_DEVICEGENERAL      106\r\n#define IDR_MAINFRAME                   128\r\n#define ID_VIEW_UPLEVEL                 129\r\n#define ID_TRACK_READ                   130\r\n#define ID_TRACK_VERIFY                 131\r\n#define ID_TRACK_ERASE                  132\r\n#define ID_SHELLEXT_ADD                 133\r\n#define ID_SHELLEXT_REMOVE              134\r\n#define ID_SHELL_PASTE                  135\r\n#define ID_BOOT_ADD                     135\r\n#define ID_BOOT_REMOVE                  136\r\n#define ID_BOOT_EDIT                    137\r\n#define IDR_MAINFRAME_PORTABLE          138\r\n#define ID_NEWPROJECT_DATA              138\r\n#define IDD_PROGRESSDLG                 201\r\n#define IDD_SIMPLEPROGRESSDLG           202\r\n#define IDD_ERASEDLG                    203\r\n#define IDB_SPLASHBITMAP                204\r\n#define IDD_LOGDLG                      205\r\n#define IDD_DEVICESDLG                  206\r\n#define IDD_PROPPAGE_DEVICEADVANCED     207\r\n#define IDD_PROPPAGE_BURNIMAGEGENERAL   208\r\n#define IDD_PROPPAGE_BURNIMAGEADVANCED  209\r\n#define IDD_WAITDLG                     210\r\n#define IDI_MIXEDICON                   211\r\n#define IDD_PROPPAGE_PROJECTPROPGENERAL 211\r\n#define IDI_AUDIOICON                   212\r\n#define IDD_PROPPAGE_PROJECTPROPISO     212\r\n#define IDI_DATAICON                    213\r\n#define IDD_PROPPAGE_PROJECTPROPFIELDS  213\r\n#define IDI_VIDEOICON                   214\r\n#define IDR_PROJLISTSELMENU             214\r\n#define IDD_PROPPAGE_PROJECTPROPAUDIO   214\r\n#define IDR_PROJLISTNOSELMENU           215\r\n#define IDB_MINITOOLBARBITMAP           216\r\n#define IDB_MINITOOLBARBITMAP_          217\r\n#define IDD_EDITTRACKDLG                218\r\n#define IDD_FIXATEDLG                   219\r\n#define IDD_TRACKSDLG                   220\r\n#define IDD_PROPPAGE_CONFIGGENERAL      221\r\n#define IDD_PROPPAGE_CONFIGADVANCED     222\r\n#define IDB_TRACKTOOLBARBITMAP          223\r\n#define IDD_PROPPAGE_CONFIGLANGUAGE     223\r\n#define IDB_TRACKTOOLBARBITMAP_         224\r\n#define IDD_PROPPAGE_CONFIGSHELLEXT     224\r\n#define IDD_NEWFILEEXTDLG               225\r\n#define IDD_PROPPAGE_COPYDISCGENERAL    226\r\n#define IDB_MAINSMALLBITMAP             228\r\n#define IDB_MAINSMALLBITMAP_            229\r\n#define IDD_INFODLG                     231\r\n#define IDD_PROPPAGE_DISCGENERAL        232\r\n#define IDD_IMPORTSESSIONDLG            233\r\n#define IDI_PROJECTICON                 238\r\n#define IDD_SAVETRACKSDLG               239\r\n#define IDD_PROPPAGE_READOPTIONS        240\r\n#define IDD_PROPPAGE_COPYIMAGEGENERAL   241\r\n#define IDD_PROPPAGE_PROJECTPROPBOOT    242\r\n#define IDD_ADDBOOTIMAGEDLG             243\r\n#define IDR_DIAGNOSTICSMENU             244\r\n#define IDI_REFRESHICON                 247\r\n#define IDD_CONFIRMFILEREPLACEDLG       248\r\n#define IDB_MAINLARGEBITMAP             249\r\n#define IDD_PROPPAGE_PROJECTPROPFILESYS 249\r\n#define IDB_MAINLARGEBITMAP_            250\r\n#define IDD_PROPPAGE_PROJECTPROPUDF     250\r\n#define IDB_PANECLOSEBITMAP             251\r\n#define IDB_BITMAP1                     275\r\n#define IDR_WELCOMELOGOPNG              278\r\n#define IDR_BUTTONFPNG                  279\r\n#define IDR_BUTTONHPNG                  280\r\n#define IDR_BUTTONHFPNG                 281\r\n#define IDR_BUTTONNPNG                  282\r\n#define IDR_MBUTTONFPNG                 283\r\n#define IDR_MBUTTONHPNG                 284\r\n#define IDR_MBUTTONHFPNG                285\r\n#define IDR_MBUTTONHFS1PNG              286\r\n#define IDR_MBUTTONHFS2PNG              287\r\n#define IDR_MBUTTONHS1PNG               288\r\n#define IDR_MBUTTONHS2PNG               289\r\n#define IDR_MBUTTONNPNG                 290\r\n#define IDR_WIZARDAUDIOPNG              291\r\n#define IDR_WIZARDCOPYPNG               292\r\n#define IDR_WIZARDDATAPNG               293\r\n#define IDR_WIZARDREADPNG               294\r\n#define IDR_WIZARDVIDEOPNG              295\r\n#define IDR_WIZARDWRITEPNG              296\r\n#define IDB_BITMAP2                     297\r\n#define IDB_ABOUTBITMAP                 297\r\n#define IDR_SHELLTREEMENU               298\r\n#define IDC_TOTALPROGRESS               1000\r\n#define IDC_TOTALSTATIC                 1001\r\n#define IDC_MESSAGELIST                 1004\r\n#define IDC_MESSAGESTATIC               1005\r\n#define IDC_STATUSSTATIC                1005\r\n#define IDC_BEVELSTATIC                 1006\r\n#define IDC_DEVICESTATIC                1007\r\n#define IDC_BEVELSTATIC2                1007\r\n#define IDC_BUFFERSTATIC                1008\r\n#define IDC_BEVELSTATIC4                1008\r\n#define IDC_BUFFERPROGRESS              1009\r\n#define IDC_BEVELSTATIC3                1009\r\n#define IDC_BEVELSTATIC5                1009\r\n#define IDC_RECORDERSTATIC              1010\r\n#define IDC_RECORDERCOMBO               1011\r\n#define IDC_METHODSTATIC                1012\r\n#define IDC_METHODCOMBO                 1013\r\n#define IDC_FORCECHECK                  1014\r\n#define IDC_EJECTCHECK                  1015\r\n#define IDC_SIMULATECHECK               1016\r\n#define IDC_LOGEDIT                     1017\r\n#define IDC_BUTTON1                     1018\r\n#define IDC_RESCANBUTTON                1018\r\n#define IDC_RELOADBUTTON                1018\r\n#define IDC_BROWSEBUTTON                1018\r\n#define IDC_DIAGNOSTICSBUTTON           1018\r\n#define IDC_YESALLBUTTON                1018\r\n#define ID_SAVEASBUTTON                 1019\r\n#define IDC_DEVICELIST                  1020\r\n#define IDC_INFOSTATIC                  1021\r\n#define IDC_ICONSTATIC                  1022\r\n#define IDC_NAMESTATIC                  1023\r\n#define IDC_OLDICONSTATIC               1023\r\n#define IDC_TYPELABELSTATIC             1024\r\n#define IDC_NEWICONSTATIC               1024\r\n#define IDC_LOCATIONLABELSTATIC         1025\r\n#define IDC_TYPESTATIC                  1026\r\n#define IDC_LOCATIONSTATIC              1027\r\n#define IDC_BUFFERLABELSTATIC           1028\r\n#define IDC_MAXREADLABELSTATIC          1029\r\n#define IDC_MAXREADSTATIC               1030\r\n#define IDC_MAXWRITELABELSTATIC         1031\r\n#define IDC_MAXWRITESTATIC              1032\r\n#define IDC_READSTATIC                  1033\r\n#define IDC_READCDRCHECK                1034\r\n#define IDC_READDVDRAMCHECK             1035\r\n#define IDC_READCDRWCHECK               1036\r\n#define IDC_READDVDROMCHECK             1037\r\n#define IDC_READDVDRCHECK               1038\r\n#define IDC_WRITESTATIC                 1039\r\n#define IDC_WRITECDRCHECK               1040\r\n#define IDC_WRITECDRWCHECK              1041\r\n#define IDC_WRITEDVDRCHECK              1042\r\n#define IDC_WRITEDVDRAMCHECK            1043\r\n#define IDC_ADVLIST                     1044\r\n#define IDC_READDVDPLUSRCHECK           1044\r\n#define IDC_READDVDPLUSRWCHECK          1045\r\n#define IDC_WRITESPEEDSTATIC            1046\r\n#define IDC_READDVDPLUSRDLCHECK         1046\r\n#define IDC_WRITESPEEDCOMBO             1047\r\n#define IDC_READDVDPLUSRWDLCHECK        1047\r\n#define IDC_WRITEMETHODSTATIC           1048\r\n#define IDC_READBDCHECK                 1048\r\n#define IDC_WRITEMETHODCOMBO            1049\r\n#define IDC_READHDDVDCHECK              1049\r\n#define IDC_WRITEDVDPLUSRCHECK          1050\r\n#define IDC_WRITEDVDPLUSRWCHECK         1051\r\n#define IDC_BUPCHECK                    1052\r\n#define IDC_WRITEDVDPLUSRDLCHECK        1052\r\n#define IDC_PADCHECK                    1053\r\n#define IDC_WRITEDVDPLUSRWDLCHECK       1053\r\n#define IDC_FIXATECHECK                 1054\r\n#define IDC_WRITEBDCHECK                1054\r\n#define IDC_OVERBURNCHECK               1055\r\n#define IDC_WRITEBDCHECK2               1055\r\n#define IDC_WRITEHDDVDCHECK             1055\r\n#define IDC_SWABCHECK                   1056\r\n#define IDC_IGNORESIZECHECK             1057\r\n#define IDC_IMMEDCHECK                  1058\r\n#define IDC_AUDIOMASTERCHECK            1059\r\n#define IDC_FORCESPEEDCHECK             1060\r\n#define IDC_VARIRECCHECK                1061\r\n#define IDC_VARIRECSLIDER               1062\r\n#define IDC_VARIRECEDIT                 1063\r\n#define IDC_NAMEEDIT                    1065\r\n#define IDC_SIZELABELSTATIC             1066\r\n#define IDC_CONTAINSLABELSTATIC         1067\r\n#define IDC_SIZESTATIC                  1068\r\n#define IDC_CONTAINSSTATIC              1069\r\n#define IDC_LEVELSTATIC                 1070\r\n#define IDC_LEVELCOMBO                  1071\r\n#define IDC_JOLIETCHECK                 1074\r\n#define IDC_JOLIETLONGNAMESCHECK        1075\r\n#define IDC_PUBLISHEREDIT               1076\r\n#define IDC_PUBLISHERSTATIC             1077\r\n#define IDC_PREPAREREDIT                1078\r\n#define IDC_SYSTEMEDIT                  1079\r\n#define IDC_VOLUMEEDIT                  1080\r\n#define IDC_PREPARERSTATIC              1081\r\n#define IDC_SYSTEMSTATIC                1082\r\n#define IDC_VOLUMESTATIC                1083\r\n#define IDC_COPYRIGHTSTATIC             1084\r\n#define IDC_COPYRIGHTEDIT               1085\r\n#define IDC_ABSTRACTEDIT                1086\r\n#define IDC_BIBLIOGRAPHICEDIT           1087\r\n#define IDC_ABSTRACTSTATIC              1088\r\n#define IDC_BIBLIOGRAPHICSTATIC         1089\r\n#define IDC_FORMATCOMBO                 1092\r\n#define IDC_FORMATSTATIC                1093\r\n#define IDC_ALBUMSTATIC                 1094\r\n#define IDC_CHARSETCOMBO                1094\r\n#define IDC_ALBUMEDIT                   1095\r\n#define IDC_FORMATSTATIC2               1095\r\n#define IDC_CHARSETSTATIC               1095\r\n#define IDC_ARTISTEDIT                  1096\r\n#define IDC_ARTISTSTATIC                1097\r\n#define IDC_TRACKLIST                   1098\r\n#define IDC_TITLESTATIC                 1099\r\n#define IDC_TITLEEDIT                   1100\r\n#define IDC_DEVICECOMBO                 1103\r\n#define IDC_DRIVESTATIC                 1104\r\n#define IDC_AUTORUNCHECK                1105\r\n#define IDC_LOGCHECK                    1106\r\n#define IDC_TRACKCOMBO                  1106\r\n#define IDC_LANGUAGESTATIC              1107\r\n#define IDC_LANGUAGECOMBO               1108\r\n#define IDC_LANGUAGEINFOSTATIC          1109\r\n#define IDC_SHELLEXTCHECK               1110\r\n#define IDC_SHELLEXTSUBMENUCHECK        1111\r\n#define IDC_SHELLEXTTEXTSTATIC          1112\r\n#define IDC_SHELLEXTICONCHECK           1113\r\n#define IDC_SHELLEXTLIST                1114\r\n#define IDC_DESCSTATIC                  1115\r\n#define IDC_DESCEDIT                    1116\r\n#define IDC_EXTSTATIC                   1117\r\n#define IDC_EXTEDIT                     1118\r\n#define IDC_SOURCECOMBO                 1119\r\n#define IDC_SOURCESTATIC                1120\r\n#define IDC_COMBO2                      1121\r\n#define IDC_TARGETCOMBO                 1121\r\n#define IDC_TARGETSTATIC                1122\r\n#define IDC_IMAGESTATIC                 1127\r\n#define IDC_IMAGEEDIT                   1128\r\n#define IDC_ONFLYCHECK                  1129\r\n#define IDC_ONFLYSTATIC                 1130\r\n#define IDC_REMEMBERSHELLCHECK          1131\r\n#define IDC_SHELLFOLDERGROUPSTATIC      1134\r\n#define IDC_SHELLFOLDERINFOSTATIC       1135\r\n#define IDC_SHELLFOLDEREDIT             1136\r\n#define IDC_SHELLFOLDERBROWSEBUTTON     1137\r\n#define IDC_DISPLAYMSGCHECK             1138\r\n#define IDC_SHELLFOLDERBROWSEBUTTON2    1138\r\n#define IDC_TEMPFOLDERBROWSEBUTTON      1138\r\n#define IDC_BOOKLABELSTATIC             1139\r\n#define IDC_BOOKSTATIC                  1140\r\n#define IDC_REGIONLABELSTATIC           1141\r\n#define IDC_REGIONSTATIC                1142\r\n#define IDC_LAYERLABELSTATIC            1143\r\n#define IDC_LAYERSTATIC                 1144\r\n#define IDC_TRACKSTATIC                 1145\r\n#define IDC_TRACKLABELSTATIC            1146\r\n#define IDC_SESSIONSTATIC               1147\r\n#define IDC_SESSIONLABELSTATIC          1148\r\n#define IDC_STATUSLABELSTATIC           1149\r\n#define IDC_USEDSPACESTATIC             1150\r\n#define IDC_USEDSPACELABELSTATIC        1151\r\n#define IDC_FREESPACESTATIC             1152\r\n#define IDC_FREESPACELABELSTATIC        1153\r\n#define IDC_HELPBUTTON                  1157\r\n#define IDC_VERSIONSTATIC               1160\r\n#define IDC_ASSOCIATECHECK              1161\r\n#define IDC_CLONECHECK                  1161\r\n#define IDC_NOREADERRCHECK              1161\r\n#define IDC_TEMPFOLDERGROUPSTATIC       1162\r\n#define IDC_TEMPFOLDERINFOSTATIC        1163\r\n#define IDC_TEMPFOLDEREDIT              1164\r\n#define IDC_TARGETEDIT                  1165\r\n#define IDC_AUDIOFORMATSTATIC           1166\r\n#define IDC_AUDIOFORMATCOMBO            1167\r\n#define IDC_AUDIOFORMATBUTTON           1168\r\n#define IDC_FIFOGROUPSTATIC             1171\r\n#define IDC_FIFOINFOSTATIC              1172\r\n#define IDC_FIFOEDIT                    1173\r\n#define IDC_FIFOMBSTATIC                1174\r\n#define IDC_NOREADCORRCHECK             1175\r\n#define IDC_SUBCHANNELCHECK             1176\r\n#define IDC_READSUBCHANNELCHECK         1176\r\n#define IDC_READSPEEDSTATIC             1177\r\n#define IDC_READSPEEDCOMBO              1178\r\n#define IDC_SPIN1                       1179\r\n#define IDC_BOOTSTATIC                  1180\r\n#define IDC_LIST                        1181\r\n#define IDC_BOOTCATALOGEDIT             1182\r\n#define IDC_BOOTCATALOGSTATIC           1183\r\n#define IDC_EMULATIONSTATIC             1185\r\n#define IDC_EMULATIONCOMBO              1186\r\n#define IDC_OPTIONSSTATIC               1187\r\n#define IDC_NOBOOTCHECK                 1188\r\n#define IDC_BOOTINFOTABLECHECK          1189\r\n#define IDC_BOOTSEGMENTEDIT             1190\r\n#define IDC_BOOTSEGMENTSTATIC           1191\r\n#define IDC_BOOTSIZEEDIT                1192\r\n#define IDC_BOOTSIZESTATIC              1193\r\n#define IDC_CHECK2                      1196\r\n#define IDC_CHECK                       1196\r\n#define IDC_OMITVNCHECK                 1196\r\n#define IDC_CHECK1                      1197\r\n#define IDC_VERIFYCHECK                 1197\r\n#define IDC_SMOKECHECK                  1197\r\n#define IDC_DEEPDIRCHECK                1197\r\n#define IDC_DRIVELETTERCOMBO            1198\r\n#define IDC_SPEEDCOMBO                  1199\r\n#define IDC_SPEEDSTATIC                 1200\r\n#define IDC_FILESBUTTON                 1201\r\n#define IDC_YESBUTTON                   1202\r\n#define IDC_NOBUTTON                    1203\r\n#define IDC_BUTTON2                     1204\r\n#define IDC_NOALLBUTTON                 1204\r\n#define IDC_REPLACEINFOSTATIC           1206\r\n#define IDC_OLDSIZESTATIC               1207\r\n#define IDC_OLDDATESTATIC               1208\r\n#define IDC_REPLACEINFO2STATIC          1209\r\n#define IDC_REFRESHBUTTON               1209\r\n#define IDC_NEWSIZESTATIC               1210\r\n#define IDC_FILESYSSTATIC               1210\r\n#define IDC_NEWDATESTATIC               1211\r\n#define IDC_FILESYSCOMBO                1211\r\n#define IDC_VERSIONCOMBO                1212\r\n#define IDC_PARTACCESSSTATIC            1214\r\n#define IDC_ASSOCIATEDISCIMAGECHECK     1215\r\n#define IDC_DATACDBUTTON                1220\r\n#define IDC_DATADVDBUTTON               1221\r\n#define IDC_IDC_WHITESTATIC             1223\r\n#define IDC_WIZARDCHECK                 1224\r\n#define IDC_BUTTON3                     1225\r\n#define IDC_NUMCOPIESSTATIC             1226\r\n#define IDC_NUMCOPIESCOMBO              1228\r\n#define IDC_PROJECTTREEVIEW             10001\r\n#define IDC_PROJECTLISTVIEW             10002\r\n#define IDC_SHELLTREEVIEW               10003\r\n#define IDC_SHELLLISTVIEW               10004\r\n#define IDC_TBCUSTOMIZE_TEXTCOMBO       10005\r\n#define IDC_TBCUSTOMIZE_ICONCOMBO       10006\r\n#define ID_MENUROOT_FILE                11001\r\n#define ID_MENUROOT_EDIT                11002\r\n#define ID_MENUROOT_ACTIONS             11003\r\n#define ID_MENUROOT_VIEW                11004\r\n#define ID_MENUROOT_OPTIONS             11005\r\n#define ID_MENUROOT_HELP                11006\r\n#define ID_ACTIONS_ERASERE              32772\r\n#define ID_ACTIONS_EJECT                32773\r\n#define ID_EJECTDISC_                   32776\r\n#define ID_VIEW_PROGRAMLOG              32778\r\n#define ID_ACTIONS_BURNIMAGE            32780\r\n#define ID_OPTIONS_CONFIGURATION        32781\r\n#define ID_OPTIONS_DEVICES              32782\r\n#define ID_FILE_NEWPROJECT              32783\r\n#define ID_NEWPROJECT_DATACD            32784\r\n#define ID_NEWPROJECT_AUDIO             32785\r\n#define ID_NEWPROJECT_MIXED             32786\r\n#define ID_EDIT_NEWFOLDER               32787\r\n#define ID_Menu                         32788\r\n#define ID_EDIT_RENAME                  32790\r\n#define ID_EDIT_REMOVE                  32791\r\n#define ID_VIEW_LARGEICONS              32792\r\n#define ID_VIEW_SMALLICONS              32793\r\n#define ID_VIEW_LIST                    32794\r\n#define ID_VIEW_DETAILS                 32795\r\n#define ID_ACTIONS_BURNCOMPILATION      32800\r\n#define ID_FILE_PROJECTPROPERTIES       32801\r\n#define ID_BURNCOMPILATION_DISCIMAGE    32804\r\n#define ID_BURNCOMPILATION_COMPACTDISC  32805\r\n#define ID_ACTIONS_FIXATEDISC           32806\r\n#define ID_ACTIONS_MANAGETRACKS         32807\r\n#define ID_ACTIONS_COPYDISC             32808\r\n#define ID_COPYDISC_COMPACTDISC         32811\r\n#define ID_COPYDISC_DISCIMAGE           32812\r\n#define ID_EDIT_ADDPROJECT              32814\r\n#define ID_ADD_SELECTED                 32818\r\n#define ID_ADD_ALL                      32819\r\n#define ID_ACTIONS_DISCINFORMATION      32821\r\n#define ID_ACTIONS_IMPORTSESSION        32822\r\n#define ID_DISCINFORMATION_             32823\r\n#define ID_HELP_HELPTOPICS              32824\r\n#define ID_NEWPROJECT_DVDVIDEO          32826\r\n#define ID_NEWPROJECT_DATADVD           32827\r\n#define ID__DEVICESCAN                  32828\r\n#define ID__DIAGNOSTICS_DEVICESCAN      32829\r\n#define ID_DIAGNOSTICS_DEVICESCAN       32830\r\n#define ID_VIEW_TOOLBARS                32831\r\n#define ID_TOOLBARS_STANDARDBUTTONS     32832\r\n#define ID_TOOLBARS_CUSTOMIZE           32833\r\n#define ID_VIEW_STANDARDTOOLBAR         32834\r\n#define ID_VIEW_TBCUSTOMIZE             32835\r\n#define ID_EDIT_SELECTALL               32836\r\n#define ID_EDIT_INVERTSELECTION         32837\r\n#define ID_POPUPMENU_PROPERTIES         32840\r\n#define ID_NEWPROJECT_DATACD32841       32841\r\n#define ID_NEWPROJECT_DATACDMS          32842\r\n#define ID_EDIT_IMPORT                  32843\r\n#define ID_POPUPMENU_SHELLTREE_PROPERTIES 32844\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        298\r\n#define _APS_NEXT_COMMAND_VALUE         32845\r\n#define _APS_NEXT_CONTROL_VALUE         1229\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/app/settings.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include \"main_frm.hh\"\r\n#include \"toolbar_manager.hh\"\r\n#include \"settings.hh\"\r\n\r\nCLanguageSettings g_LanguageSettings;\r\nCGlobalSettings g_GlobalSettings;\r\nCDynamicSettings g_DynamicSettings;\r\nCEraseSettings g_EraseSettings;\r\nCFixateSettings g_FixateSettings;\r\nCBurnImageSettings g_BurnImageSettings;\r\nCProjectSettings g_ProjectSettings;\r\nCCopyDiscSettings g_CopyDiscSettings;\r\nCBurnAdvancedSettings g_BurnAdvancedSettings;\r\nCSaveTracksSettings g_SaveTracksSettings;\r\nCReadSettings g_ReadSettings;\r\n\r\nbool CLanguageSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Language\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"LanguageFile\"),m_szLanguageFile);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CLanguageSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Language\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"LanguageFile\"),m_szLanguageFile,MAX_PATH - 1);\r\n\r\n    // Calculate full path.\r\n    TCHAR szFullPath[MAX_PATH];\r\n    ::GetModuleFileName(NULL,szFullPath,MAX_PATH - 1);\r\n    ExtractFilePath(szFullPath);\r\n    lstrcat(szFullPath,_T(\"languages\\\\\"));\r\n    lstrcat(szFullPath,m_szLanguageFile);\r\n\r\n    if (ckcore::File::exist(szFullPath))\r\n    {\r\n        m_pLngProcessor = new CLngProcessor(szFullPath);\r\n        m_pLngProcessor->Load();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CGlobalSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Global\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"AutoRunCheck\"),m_bAutoRunCheck);\r\n        pXml->AddElement(_T(\"Log\"),m_bLog);\r\n        pXml->AddElement(_T(\"RememberShell\"),m_bRememberShell);\r\n        pXml->AddElement(_T(\"CopyWarning\"),m_bCopyWarning);\r\n        pXml->AddElement(_T(\"RawImageInfo\"),m_bRawImageInfo);\r\n        pXml->AddElement(_T(\"CharSetWarning\"),m_bCharSetWarning);\r\n        pXml->AddElement(_T(\"WriteSpeedWarning\"),m_bWriteSpeedWarning);\r\n        pXml->AddElement(_T(\"CodecWarning\"),m_bCodecWarning);\r\n        pXml->AddElement(_T(\"FixateWarning\"),m_bFixateWarning);\r\n        pXml->AddElement(_T(\"NoDevWarning\"),m_bNoDevWarning);\r\n        pXml->AddElement(_T(\"Smoke\"),m_bSmoke);\r\n        pXml->AddElement(_T(\"Wizard\"),m_bShowWizard);\r\n        pXml->AddElement(_T(\"GraceTime\"),m_iGraceTime);\r\n        pXml->AddElement(_T(\"FIFO\"),m_iFIFOSize);\r\n        if (m_iFIFOSize > FIFO_MAX)\r\n            m_iFIFOSize = FIFO_MAX;\r\n        else if (m_iFIFOSize < FIFO_MIN)\r\n            m_iFIFOSize = FIFO_MIN;\r\n\r\n        // Temporary folder.\r\n        pXml->AddElement(_T(\"TempPath\"),m_szTempPath);\r\n\r\n        // Shell extension.\r\n        pXml->AddElement(_T(\"ShellExtension\"),_T(\"\"),true);\r\n            pXml->AddElementAttr(_T(\"submenu\"),m_bShellExtSubMenu);\r\n            pXml->AddElementAttr(_T(\"icons\"),m_bShellExtIcon);\r\n            pXml->AddElementAttr(_T(\"count\"),(int)m_szShellExt.size());\r\n\r\n            TCHAR szItemName[32];\r\n            int iItemCount = 0;\r\n            std::list<tstring>::iterator itNodeObject;\r\n            for (itNodeObject = m_szShellExt.begin(); itNodeObject != m_szShellExt.end(); itNodeObject++)\r\n            {\r\n                lsprintf(szItemName,_T(\"Item%i\"),iItemCount++);\r\n                pXml->AddElement(szItemName,(*itNodeObject).c_str());\r\n            }\r\n        pXml->LeaveElement();\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CGlobalSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Global\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"AutoRunCheck\"),&m_bAutoRunCheck);\r\n    pXml->GetSafeElementData(_T(\"Log\"),&m_bLog);\r\n    pXml->GetSafeElementData(_T(\"RememberShell\"),&m_bRememberShell);\r\n    pXml->GetSafeElementData(_T(\"CopyWarning\"),&m_bCopyWarning);\r\n    pXml->GetSafeElementData(_T(\"RawImageInfo\"),&m_bRawImageInfo);\r\n    pXml->GetSafeElementData(_T(\"CharSetWarning\"),&m_bCharSetWarning);\r\n    pXml->GetSafeElementData(_T(\"WriteSpeedWarning\"),&m_bWriteSpeedWarning);\r\n    pXml->GetSafeElementData(_T(\"CodecWarning\"),&m_bCodecWarning);\r\n    pXml->GetSafeElementData(_T(\"FixateWarning\"),&m_bFixateWarning);\r\n    pXml->GetSafeElementData(_T(\"NoDevWarning\"),&m_bNoDevWarning);\r\n    pXml->GetSafeElementData(_T(\"Smoke\"),&m_bSmoke);\r\n    pXml->GetSafeElementData(_T(\"Wizard\"),&m_bShowWizard);\r\n    pXml->GetSafeElementData(_T(\"GraceTime\"),&m_iGraceTime);\r\n    pXml->GetSafeElementData(_T(\"FIFO\"),&m_iFIFOSize);\r\n\r\n    // Temporary folder.\r\n    pXml->GetSafeElementData(_T(\"TempPath\"),m_szTempPath,MAX_PATH - 1);\r\n    if (!ckcore::Directory::exist(m_szTempPath))\r\n    {\r\n        // If the folder does not exist, create it.\r\n        if (m_szTempPath == NULL || lstrlen(m_szTempPath) < 3 || m_szTempPath[1] != ':')\r\n        {\r\n            IncludeTrailingBackslash(m_szTempPath);\r\n            ckcore::Directory::create(m_szTempPath);\r\n        }\r\n        else\r\n        {\r\n            GetTempPath(MAX_PATH - 1,m_szTempPath);\r\n        }\r\n    }\r\n\r\n    // Shell extension.\r\n    if (pXml->EnterElement(_T(\"ShellExtension\")))\r\n    {\r\n        pXml->GetSafeElementAttrValue(_T(\"submenu\"),&m_bShellExtSubMenu);\r\n        pXml->GetSafeElementAttrValue(_T(\"icons\"),&m_bShellExtIcon);\r\n\r\n        int iItemCount = 0;\r\n        TCHAR szItemName[32];\r\n        TCHAR szBuffer[128];\r\n\r\n        pXml->GetSafeElementAttrValue(_T(\"count\"),&iItemCount);\r\n        m_szShellExt.clear();\r\n\r\n        for (int i = 0; i < iItemCount; i++)\r\n        {\r\n            lsprintf(szItemName,_T(\"Item%i\"),i);\r\n\r\n            pXml->GetSafeElementData(szItemName,szBuffer,127);\r\n            m_szShellExt.push_back(szBuffer);\r\n        }\r\n\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CDynamicSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Dynamic\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"ProjectListViewStyle\"),m_iPrjListViewStyle);\r\n        pXml->AddElement(_T(\"ToolBar\"),m_bViewToolBar,true);\r\n            pXml->AddElementAttr(_T(\"text\"),m_iToolBarText);\r\n            pXml->AddElementAttr(_T(\"icon\"),m_iToolBarIcon);\r\n        pXml->LeaveElement();\r\n        pXml->AddElement(_T(\"StatusBar\"),m_bViewStatusBar);\r\n\r\n        pXml->AddElement(_T(\"WindowLeft\"),m_rcWindow.left);\r\n        pXml->AddElement(_T(\"WindowRight\"),m_rcWindow.right);\r\n        pXml->AddElement(_T(\"WindowTop\"),m_rcWindow.top);\r\n        pXml->AddElement(_T(\"WindowBottom\"),m_rcWindow.bottom);\r\n        pXml->AddElement(_T(\"WindowMaximized\"),m_bWinMaximized);\r\n\r\n        pXml->AddElement(_T(\"ShellDir\"),m_szShellDir);\r\n\r\n        // Save the toolbar button configuration.\r\n        g_ToolBarManager.Save(pXml);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CDynamicSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Dynamic\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"ProjectListViewStyle\"),&m_iPrjListViewStyle);\r\n\r\n    if (pXml->EnterElement(_T(\"ToolBar\")))\r\n    {\r\n        pXml->GetSafeElementData(&m_bViewToolBar);\r\n        pXml->GetSafeElementAttrValue(_T(\"text\"),&m_iToolBarText);\r\n        pXml->GetSafeElementAttrValue(_T(\"icon\"),&m_iToolBarIcon);\r\n        pXml->LeaveElement();\r\n\r\n        // Validate the values.\r\n        if (m_iToolBarText > TOOLBAR_TEXT_DONTSHOW || m_iToolBarText < 0)\r\n            m_iToolBarText = TOOLBAR_TEXT_DONTSHOW;\r\n        if (m_iToolBarIcon > TOOLBAR_ICON_LARGE || m_iToolBarIcon < 0)\r\n            m_iToolBarIcon = TOOLBAR_ICON_SMALL;\r\n    }\r\n\r\n    pXml->GetSafeElementData(_T(\"StatusBar\"),&m_bViewStatusBar);\r\n\r\n    pXml->GetSafeElementData(_T(\"WindowLeft\"),&m_rcWindow.left);\r\n    pXml->GetSafeElementData(_T(\"WindowRight\"),&m_rcWindow.right);\r\n    pXml->GetSafeElementData(_T(\"WindowTop\"),&m_rcWindow.top);\r\n    pXml->GetSafeElementData(_T(\"WindowBottom\"),&m_rcWindow.bottom);\r\n    pXml->GetSafeElementData(_T(\"WindowMaximized\"),&m_bWinMaximized);\r\n\r\n    pXml->GetSafeElementData(_T(\"ShellDir\"),m_szShellDir,MAX_PATH - 1);\r\n\r\n    // Save the toolbar button configuration.\r\n    g_ToolBarManager.Load(pXml);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nvoid CDynamicSettings::Apply()\r\n{\r\n    // Apply the project list view style.\r\n    switch (m_iPrjListViewStyle)\r\n    {\r\n        case LISTVIEWSTYLE_LARGEICONS:\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_CHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LIST,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_DETAILS,MF_BYCOMMAND | MF_UNCHECKED);\r\n\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LARGEICONS,true);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_SMALLICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LIST,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_DETAILS,false);\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_SMALLICONS:\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_CHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LIST,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_DETAILS,MF_BYCOMMAND | MF_UNCHECKED);\r\n\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LARGEICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_SMALLICONS,true);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LIST,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_DETAILS,false);\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_LIST:\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LIST,MF_BYCOMMAND | MF_CHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_DETAILS,MF_BYCOMMAND | MF_UNCHECKED);\r\n\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LARGEICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_SMALLICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LIST,true);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_DETAILS,false);\r\n            break;\r\n\r\n        case LISTVIEWSTYLE_DETAILS:\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LARGEICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_SMALLICONS,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_LIST,MF_BYCOMMAND | MF_UNCHECKED);\r\n            CheckMenuItem(g_pMainFrame->m_hProjListNoSelMenu,ID_VIEW_DETAILS,MF_BYCOMMAND | MF_CHECKED);\r\n\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LARGEICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_SMALLICONS,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_LIST,false);\r\n            g_pMainFrame->UISetCheck(ID_VIEW_DETAILS,true);\r\n            break;\r\n    };\r\n\r\n    g_pMainFrame->m_ProjectListView.SetViewStyle(m_iPrjListViewStyle);\r\n}\r\n\r\nbool CEraseSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Erase\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Mode\"),m_iMode);\r\n        pXml->AddElement(_T(\"Force\"),m_bForce);\r\n        pXml->AddElement(_T(\"Eject\"),m_bEject);\r\n        pXml->AddElement(_T(\"Simulate\"),m_bSimulate);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CEraseSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Erase\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Mode\"),&m_iMode);\r\n    pXml->GetSafeElementData(_T(\"Force\"),&m_bForce);\r\n    pXml->GetSafeElementData(_T(\"Eject\"),&m_bEject);\r\n    pXml->GetSafeElementData(_T(\"Simulate\"),&m_bSimulate);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CFixateSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Fixate\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Eject\"),m_bEject);\r\n        pXml->AddElement(_T(\"Simulate\"),m_bSimulate);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CFixateSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Fixate\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Eject\"),&m_bEject);\r\n    pXml->GetSafeElementData(_T(\"Simulate\"),&m_bSimulate);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CBurnImageSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"BurnImage\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"OnFly\"),m_bOnFly);\r\n        pXml->AddElement(_T(\"Verify\"),m_bVerify);\r\n        pXml->AddElement(_T(\"Eject\"),m_bEject);\r\n        pXml->AddElement(_T(\"Simulate\"),m_bSimulate);\r\n        pXml->AddElement(_T(\"BUP\"),m_bBUP);\r\n        pXml->AddElement(_T(\"PadTracks\"),m_bPadTracks);\r\n        pXml->AddElement(_T(\"Fixate\"),m_bFixate);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CBurnImageSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"BurnImage\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"OnFly\"),&m_bOnFly);\r\n    pXml->GetSafeElementData(_T(\"Verify\"),&m_bVerify);\r\n    pXml->GetSafeElementData(_T(\"Eject\"),&m_bEject);\r\n    pXml->GetSafeElementData(_T(\"Simulate\"),&m_bSimulate);\r\n    pXml->GetSafeElementData(_T(\"BUP\"),&m_bBUP);\r\n    pXml->GetSafeElementData(_T(\"PadTracks\"),&m_bPadTracks);\r\n    pXml->GetSafeElementData(_T(\"Fixate\"),&m_bFixate);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CProjectSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    return false;\r\n}\r\n\r\nbool CProjectSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    return false;\r\n}\r\n\r\nbool CCopyDiscSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"CopyDisc\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"OnFly\"),m_bOnFly);\r\n        pXml->AddElement(_T(\"Clone\"),m_bClone);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CCopyDiscSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"CopyDisc\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"OnFly\"),&m_bOnFly);\r\n    pXml->GetSafeElementData(_T(\"Clone\"),&m_bClone);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CBurnAdvancedSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"BurnAdvanced\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Overburn\"),m_bOverburn);\r\n        pXml->AddElement(_T(\"Swab\"),m_bSwab);\r\n        pXml->AddElement(_T(\"IgnoreSize\"),m_bIgnoreSize);\r\n        pXml->AddElement(_T(\"Immed\"),m_bImmed);\r\n        pXml->AddElement(_T(\"AudioMaster\"),m_bAudioMaster);\r\n        pXml->AddElement(_T(\"ForceSpeed\"),m_bForceSpeed);\r\n        pXml->AddElement(_T(\"VariRec\"),m_bVariRec,true);\r\n            pXml->AddElementAttr(_T(\"value\"),m_iVariRec);\r\n        pXml->LeaveElement();\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CBurnAdvancedSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"BurnAdvanced\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Overburn\"),&m_bOverburn);\r\n    pXml->GetSafeElementData(_T(\"Swab\"),&m_bSwab);\r\n    pXml->GetSafeElementData(_T(\"IgnoreSize\"),&m_bIgnoreSize);\r\n    pXml->GetSafeElementData(_T(\"Immed\"),&m_bImmed);\r\n    pXml->GetSafeElementData(_T(\"AudioMaster\"),&m_bAudioMaster);\r\n    pXml->GetSafeElementData(_T(\"ForceSpeed\"),&m_bForceSpeed);\r\n\r\n    if (pXml->EnterElement(_T(\"VariRec\")))\r\n    {\r\n        pXml->GetSafeElementData(&m_bVariRec);\r\n        pXml->GetSafeElementAttrValue(_T(\"value\"),&m_iVariRec);\r\n        \r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CSaveTracksSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"SaveTracks\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"Target\"),m_szTarget);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CSaveTracksSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"SaveTracks\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"Target\"),m_szTarget,MAX_PATH - 1);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CReadSettings::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Read\"),_T(\"\"),true);\r\n        pXml->AddElement(_T(\"IgnoreErr\"),m_bIgnoreErr);\r\n        pXml->AddElement(_T(\"Clone\"),m_bClone);\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CReadSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Read\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"IgnoreErr\"),&m_bIgnoreErr);\r\n    pXml->GetSafeElementData(_T(\"Clone\"),&m_bClone);\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}"
  },
  {
    "path": "src/app/settings.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <list>\r\n#include <ckmmc/device.hh>\r\n#include <base/string_util.hh>\r\n#include <base/xml_processor.hh>\r\n#include <base/lng_processor.hh>\r\n#include \"tree_manager.hh\"\r\n\r\n#define WRITEMETHOD_SAO\t\t\t\t\t0\r\n#define WRITEMETHOD_TAO\t\t\t\t\t1\r\n#define WRITEMETHOD_TAONOPREGAP\t\t\t2\r\n#define WRITEMETHOD_RAW96R\t\t\t\t3\r\n#define WRITEMETHOD_RAW16\t\t\t\t4\r\n#define WRITEMETHOD_RAW96P\t\t\t\t5\r\n\r\n#define LISTVIEWSTYLE_LARGEICONS\t\t0\r\n#define LISTVIEWSTYLE_SMALLICONS\t\t1\r\n#define LISTVIEWSTYLE_LIST\t\t\t\t2\r\n#define LISTVIEWSTYLE_DETAILS\t\t\t3\r\n\r\n#define TOOLBAR_TEXT_SHOW\t\t\t\t0\r\n#define TOOLBAR_TEXT_SHOWRIGHT\t\t\t1\r\n#define TOOLBAR_TEXT_DONTSHOW\t\t\t2\r\n#define TOOLBAR_ICON_SMALL\t\t\t\t0\r\n#define TOOLBAR_ICON_LARGE\t\t\t\t1\r\n\r\n// FIFO_MAX was previously set to 128 MiB, which I found to be too low nowadays.\r\n// Just think of the 4.7 GiB on a DVD, or the upcoming 25 GiB on a Blu-ray,\r\n// those devices can write 128 MiB in a few of seconds. However,\r\n// the hardware buffers on the recorders are still ridiculously small,\r\n// and I don't like constantly relying on the standard hardware buffer underrun protection\r\n// (BURN-Proof, SafeBurn and so on), because they tend to cause small errors and\r\n// they hope that the error correction will compensate.\r\n//\r\n// There seems to be some FIFO size limit in cdrecord (version 2.01.01a61 under Cygwin,\r\n// bundled with InfraRecorder 0.50 as of Sept 2009), but it's not well documented.\r\n// I've done some tests under Windows XP & Vista, and 850 MiB seems to be fine, but 900 MiB fails.\r\n// The chosen 800 MiB limit is just some arbitrary number below those figures.\r\n// This is the error message you get if you set it too high:\r\n//  [...]/binary32/cdrtools/cdrecord: Cannot allocate memory. Cannot get mmap for 1047592960 Bytes on /dev/zero.\r\n// It seems strange that cdrecord needs to mmap /dev/zero for that purpose, but maybe that'll\r\n// change in the future.\r\n#define FIFO_MAX\t\t\t\t\t\t800  // In MiB.\r\n#define FIFO_MIN\t\t\t\t\t\t4\r\n\r\n#define FILESYSTEM_ISO                  0\r\n#define FILESYSTEM_ISO_UDF              1\r\n#define FILESYSTEM_DVDVIDEO\t\t\t\t2\r\n#define FILESYSTEM_UDF\t\t\t\t\t3\r\n\r\nclass ISettings\r\n{\r\npublic:\r\n    virtual bool Save(CXmlProcessor *pXml) = 0;\r\n    virtual bool Load(CXmlProcessor *pXml) = 0;\r\n};\r\n\r\nclass CLanguageSettings : public ISettings\r\n{\r\npublic:\r\n    TCHAR m_szLanguageFile[MAX_PATH];\r\n    CLngProcessor *m_pLngProcessor;\r\n\r\n    CLanguageSettings()\r\n    {\r\n        m_szLanguageFile[0] = '\\0';\r\n        m_pLngProcessor = NULL;\r\n    }\r\n\r\n    ~CLanguageSettings()\r\n    {\r\n        if (m_pLngProcessor != NULL)\r\n        {\r\n            delete m_pLngProcessor;\r\n            m_pLngProcessor = NULL;\r\n        }\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CGlobalSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bAutoRunCheck;\r\n    bool m_bLog;\r\n    bool m_bRememberShell;\r\n    bool m_bCopyWarning;\t\t// Display the warning message about audio discs when trying to copy a disc.\r\n    bool m_bRawImageInfo;\t\t// Display information about raw write methods when writing a \"raw\" disc image.\r\n    bool m_bCharSetWarning;\t\t// Display the warning if the character set could not be recognized.\r\n    bool m_bWriteSpeedWarning;\t// Display a warning when changing the write speed of a recorder.\r\n    bool m_bCodecWarning;\t\t// Display a warning when a codec failed to load.\r\n    bool m_bFixateWarning;\t\t// Display a warning when trying to disable disc fixation.\r\n    bool m_bNoDevWarning;\t\t// Display a warning when no devices are found in the system.\r\n    bool m_bSmoke;\r\n    bool m_bShowWizard;\r\n    int m_iGraceTime;\r\n    int m_iFIFOSize;\r\n\r\n    TCHAR m_szTempPath[MAX_PATH];\r\n\r\n    // Shell extension.\r\n    bool m_bShellExtSubMenu;\r\n    bool m_bShellExtIcon;\r\n\r\n    std::list<tstring> m_szShellExt;\r\n\r\n    // For internal use only (at this moment).\r\n    TCHAR m_szCDRToolsPath[MAX_PATH];\r\n    TCHAR m_szCDRToolsPathCyg[MAX_PATH + 12];\r\n\r\n    CGlobalSettings()\r\n    {\r\n        m_bAutoRunCheck = true;\r\n        m_bLog = true;\r\n        m_bRememberShell = true;\r\n        m_bCopyWarning = true;\r\n        m_bRawImageInfo = true;\r\n        m_bCharSetWarning = true;\r\n        m_bWriteSpeedWarning = true;\r\n        m_bCodecWarning = true;\r\n        m_bFixateWarning = true;\r\n        m_bNoDevWarning = true;\r\n        m_bSmoke = true;\r\n        m_bShowWizard = true;\r\n        m_iGraceTime = 5;\t\t\t// Five seconds by default.\r\n        m_iFIFOSize = 4;\t\t\t// 4 MiB by default.\r\n\r\n        // Path to system temporary directory.\r\n        m_szTempPath[0] = '\\0';\r\n        GetTempPath(MAX_PATH - 1,m_szTempPath);\r\n\r\n        // Shell extension.\r\n        m_bShellExtSubMenu = false;\r\n        m_bShellExtIcon = true;\r\n\r\n        m_szShellExt.push_back(_T(\"Disc Images|.iso, .cue\"));\r\n        m_szShellExt.push_back(_T(\"Raw Images|.bin, .raw\"));\r\n        m_szShellExt.push_back(_T(\"InfraRecorder Projects|.irp\"));\r\n\r\n        // Path to cdrtools.\r\n        GetModuleFileName(NULL,m_szCDRToolsPath,MAX_PATH - 1);\r\n        ExtractFilePath(m_szCDRToolsPath);\r\n\r\n#ifdef CDRKIT\r\n        lstrcat(m_szCDRToolsPath,_T(\"cdrkit\\\\\"));\r\n#else\r\n        lstrcat(m_szCDRToolsPath,_T(\"cdrtools\\\\\"));\r\n#endif\r\n\r\n        // Cygwin version of the path.\r\n        GetCygwinFileName(m_szCDRToolsPath,m_szCDRToolsPathCyg);\r\n    }\r\n\r\n    ~CGlobalSettings()\r\n    {\r\n        // Shell extension.\r\n        m_szShellExt.clear();\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CDynamicSettings : public ISettings\r\n{\r\npublic:\r\n    int m_iPrjListViewStyle;\r\n    int m_iToolBarText;\r\n    int m_iToolBarIcon;\r\n    bool m_bViewToolBar;\r\n    bool m_bViewStatusBar;\r\n    bool m_bWinMaximized;\r\n\r\n    // Window rectangle.\r\n    RECT m_rcWindow;\r\n\r\n    // Contains the active path displayed in the explorer view.\r\n    TCHAR m_szShellDir[MAX_PATH];\r\n\r\n    CDynamicSettings()\r\n    {\r\n        m_iPrjListViewStyle = LISTVIEWSTYLE_DETAILS;\r\n        m_iToolBarText = TOOLBAR_TEXT_DONTSHOW;\r\n        m_iToolBarIcon = TOOLBAR_ICON_SMALL;\r\n        m_bViewToolBar = true;\r\n        m_bViewStatusBar = true;\r\n        m_bWinMaximized = false;\r\n\r\n        // -1 means not set.\r\n        m_rcWindow.left = -1;\r\n        m_rcWindow.right = -1;\r\n        m_rcWindow.top = -1;\r\n        m_rcWindow.bottom = -1;\r\n\r\n        // The default shell path should be the desktop.\r\n        if (!SHGetSpecialFolderPath(NULL,m_szShellDir,CSIDL_DESKTOP,false))\r\n            m_szShellDir[0] = '\\0';\r\n    }\r\n\r\n    ~CDynamicSettings()\r\n    {\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n    void Apply();\r\n};\r\n\r\nclass CEraseSettings : public ISettings\r\n{\r\npublic:\r\n    int m_iMode;\r\n    bool m_bForce;\r\n    bool m_bEject;\r\n    bool m_bSimulate;\r\n\r\n    // For internal use only, should never be saved.\r\n    ckmmc::Device *m_pRecorder;\r\n    unsigned int m_uiSpeed;\r\n\r\n    CEraseSettings()\r\n    {\r\n        m_iMode = 1;\r\n        m_bForce = false;\r\n        m_bEject = true;\r\n        m_bSimulate = false;\r\n\r\n        m_pRecorder = NULL;\r\n        m_uiSpeed = 0xFFFFFFFF;\t\t// Maximum.\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CFixateSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bEject;\r\n    bool m_bSimulate;\r\n\r\n    // For internal use only, should never be saved.\r\n    ckmmc::Device *m_pRecorder;\r\n\r\n    CFixateSettings()\r\n    {\r\n        m_bEject = true;\r\n        m_bSimulate = false;\r\n\r\n        m_pRecorder = NULL;\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CBurnImageSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bOnFly;\r\n    bool m_bVerify;\r\n    bool m_bEject;\r\n    bool m_bSimulate;\r\n    bool m_bBUP;\r\n    bool m_bPadTracks;\r\n    bool m_bFixate;\r\n\r\n    // For internal use only, should never be saved.\r\n    ckmmc::Device *m_pRecorder;\r\n    int m_iWriteMethod;\r\n    int m_iWriteSpeed;  // Multiple of what has been defined as single speed for the current medium, -1 for maximum speed.\r\n    long m_lNumCopies;\r\n\r\n    CBurnImageSettings()\r\n    {\r\n        m_bOnFly = false;\r\n        m_bVerify = false;\r\n        m_bEject = true;\r\n        m_bSimulate = false;\r\n        m_bBUP = true;\r\n        m_bPadTracks = true;\r\n        m_bFixate = true;\r\n\r\n        m_pRecorder = NULL;\r\n        m_iWriteMethod = 0;\r\n        m_iWriteSpeed = -1;\r\n\r\n        // For internal use only, should never be saved.\r\n        m_pRecorder= NULL;\r\n        m_lNumCopies = 1;\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\n// Class used to destribe a project boot image.\r\n#define PROJECTBI_BOOTEMU_NONE\t\t\t\t0\r\n#define PROJECTBI_BOOTEMU_FLOPPY\t\t\t1\r\n#define PROJECTBI_BOOTEMU_HARDDISK\t\t\t2\r\n\r\nclass CProjectBootImage\t// FIXME: Make m_iLoadSegment and m_iLoadSize unsigned short, m_iEmulation to enum type and m_iLoadSize to LoadLen (sectors).\r\n{\r\npublic:\r\n    bool m_bNoBoot;\r\n    int m_iEmulation;\r\n    ckcore::tuint16 m_uiLoadSegment;\r\n    ckcore::tuint16 m_uiLoadSize;\r\n    ckcore::tstring m_FullPath;\t\t\t// Full path to the file on the harddrive.\r\n    ckcore::tstring m_LocalName;\t\t// Internal name.\r\n\r\n    CProjectBootImage()\r\n    {\r\n        m_bNoBoot = false;\r\n        m_iEmulation = PROJECTBI_BOOTEMU_FLOPPY;\r\n        m_uiLoadSegment = 0x7c0;\r\n        m_uiLoadSize = 4;\r\n    }\r\n};\r\n\r\nclass CProjectSettings : public ISettings\r\n{\r\npublic:\r\n    int m_iFileSystem;\r\n    int m_iIsoLevel;\r\n    int m_iIsoFormat;\t// FIXME: Use defined values here. Rename?\r\n    enum IsoCharSet\r\n    {\r\n        CHARSET_ISO,\r\n        CHARSET_DOS,\r\n        CHARSET_ASCII\r\n    } m_IsoCharSet;\r\n    bool m_bJoliet;\r\n    bool m_bJolietLongNames;\r\n    bool m_bOmitVerNum;\r\n    bool m_bDeepDirs;\r\n    TCHAR m_szLabel[128];\r\n    TCHAR m_szPublisher[128];\r\n    TCHAR m_szPreparer[128];\r\n    TCHAR m_szSystem[128];\r\n    TCHAR m_szVolumeSet[128];\r\n    TCHAR m_szCopyright[37];\r\n    TCHAR m_szAbstract[37];\r\n    TCHAR m_szBibliographic[37];\r\n\r\n    TCHAR m_szAlbumName[160];\r\n    TCHAR m_szAlbumArtist[160];\r\n\r\n    // Boot information.\r\n    std::list<CProjectBootImage *> m_BootImages;\r\n\r\n    // Multi session related, are only changed when importing an existing session.\r\n    // They should not be saved in a project.\r\n    bool m_bMultiSession;\r\n    unsigned __int64 m_uiImportTrackAddr;\r\n    unsigned __int64 m_uiImportTrackLen;\r\n    unsigned __int64 m_uiNextWritableAddr;\r\n    ckmmc::Device *m_pDevice;\r\n\r\n    CProjectSettings()\r\n    {\r\n        // We don't want to display an error message if the code page is not\r\n        // found two times. First when the object enters scope and later when\r\n        // the new project is created (from the NewDataProject function).\r\n        Reset();\r\n    }\r\n\r\n    ~CProjectSettings()\r\n    {\r\n        // Free any boot image information.\r\n        std::list <CProjectBootImage *>::iterator itImageObject;\r\n        for (itImageObject = m_BootImages.begin(); itImageObject != m_BootImages.end(); itImageObject++)\r\n            delete *itImageObject;\r\n\r\n        m_BootImages.clear();\r\n    }\r\n\r\n    /*\r\n        CProjectSettings::GetBootImage\r\n        ------------------------------\r\n        Returns the CProjectBootImage object that is associated with the specified\r\n        file name (full local file name of a file on the hard disk).\r\n    */\r\n    CProjectBootImage *GetBootImage(const TCHAR *szFileName)\r\n    {\r\n        std::list <CProjectBootImage *>::iterator itImageObject;\r\n        for (itImageObject = m_BootImages.begin(); itImageObject != m_BootImages.end(); itImageObject++)\r\n        {\r\n            if (!ComparePaths((*itImageObject)->m_FullPath.c_str(),szFileName))\r\n                return *itImageObject;\r\n        }\r\n\r\n        return NULL;\r\n    }\r\n\r\n    void Reset()\r\n    {\r\n        m_iFileSystem = FILESYSTEM_ISO;\r\n        m_iIsoLevel = 2;\r\n        m_iIsoFormat = 0;\r\n        m_iIsoFormat = CHARSET_ISO;\r\n        m_bJoliet = true;\r\n        m_bJolietLongNames = true;\r\n        m_bOmitVerNum = false;\r\n        m_bDeepDirs = true;\r\n\r\n        m_szLabel[0] = '\\0';\r\n        m_szPublisher[0] = '\\0';\r\n        m_szPreparer[0] = '\\0';\r\n        m_szSystem[0] = '\\0';\r\n        m_szVolumeSet[0] = '\\0';\r\n        m_szCopyright[0] = '\\0';\r\n        m_szAbstract[0] = '\\0';\r\n        m_szBibliographic[0] = '\\0';\r\n\r\n        m_szAlbumName[0] = '\\0';\r\n        m_szAlbumArtist[0] = '\\0';\r\n\r\n        std::list <CProjectBootImage *>::iterator itImageObject;\r\n        for (itImageObject = m_BootImages.begin(); itImageObject != m_BootImages.end(); itImageObject++)\r\n            delete *itImageObject;\r\n\r\n        m_BootImages.clear();\r\n\r\n        // Multi session related, are only changed when importing an existing session.\r\n        m_bMultiSession = false;\r\n        m_uiImportTrackAddr = 0;\r\n        m_uiImportTrackLen = 0;\r\n        m_uiNextWritableAddr = 0;\r\n        m_pDevice = NULL;\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CCopyDiscSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bOnFly;\r\n    bool m_bClone;\r\n\r\n    // For internal use only, should never be saved.\r\n    ckmmc::Device *m_pSource;\r\n    ckmmc::Device *m_pTarget;\r\n\r\n    // Size of the source drive media in sectors.\r\n    unsigned __int64 m_uiSourceSize;\r\n\r\n    CCopyDiscSettings()\r\n    {\r\n        m_bOnFly = false;\r\n        m_bClone = true;\r\n\r\n        m_pSource = NULL;\r\n        m_pTarget = NULL;\r\n        m_uiSourceSize = 0;\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CBurnAdvancedSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bOverburn;\r\n    bool m_bSwab;\r\n    bool m_bIgnoreSize;\r\n    bool m_bImmed;\r\n    bool m_bAudioMaster;\r\n    bool m_bForceSpeed;\r\n    bool m_bVariRec;\r\n    int m_iVariRec;\r\n\r\n    CBurnAdvancedSettings()\r\n    {\r\n        m_bOverburn = false;\r\n        m_bSwab = false;\r\n        m_bIgnoreSize = false;\r\n        m_bImmed = false;\r\n        m_bAudioMaster = true;\r\n        m_bForceSpeed = false;\r\n        m_bVariRec = false;\r\n        m_iVariRec = 0;\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CSaveTracksSettings : public ISettings\r\n{\r\npublic:\r\n    TCHAR m_szTarget[MAX_PATH];\r\n\r\n    CSaveTracksSettings()\r\n    {\r\n        m_szTarget[0] = '\\0';\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CReadSettings : public ISettings\r\n{\r\npublic:\r\n    bool m_bIgnoreErr;\r\n    bool m_bClone;\r\n\r\n    // For internal use only, should never be saved.\r\n    INT_PTR m_iReadSpeed;\t\t// Read speed (audio multiple).\r\n\r\n    CReadSettings()\r\n    {\r\n        m_bIgnoreErr = false;\r\n        m_bClone = false;\r\n        m_iReadSpeed = -1;\t// -1 = Maximum.\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nextern CLanguageSettings g_LanguageSettings;\r\nextern CGlobalSettings g_GlobalSettings;\r\nextern CDynamicSettings g_DynamicSettings;\r\nextern CEraseSettings g_EraseSettings;\r\nextern CFixateSettings g_FixateSettings;\r\nextern CBurnImageSettings g_BurnImageSettings;\r\nextern CProjectSettings g_ProjectSettings;\r\nextern CCopyDiscSettings g_CopyDiscSettings;\r\nextern CBurnAdvancedSettings g_BurnAdvancedSettings;\r\nextern CSaveTracksSettings g_SaveTracksSettings;\r\nextern CReadSettings g_ReadSettings;"
  },
  {
    "path": "src/app/settings_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include <base/string_util.hh>\r\n#include <base/xml_processor.hh>\r\n#include \"settings_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCSettingsManager g_SettingsManager;\r\n\r\nCSettingsManager::CSettingsManager()\r\n{\r\n    RegisterObject(&g_LanguageSettings);\r\n    RegisterObject(&g_GlobalSettings);\r\n    RegisterObject(&g_DynamicSettings);\r\n    RegisterObject(&g_EraseSettings);\r\n    RegisterObject(&g_FixateSettings);\r\n    RegisterObject(&g_BurnImageSettings);\r\n    RegisterObject(&g_CopyDiscSettings);\r\n    RegisterObject(&g_BurnAdvancedSettings);\r\n    RegisterObject(&g_SaveTracksSettings);\r\n    RegisterObject(&g_ReadSettings);\r\n}\r\n\r\nCSettingsManager::~CSettingsManager()\r\n{\r\n    m_Settings.clear();\r\n}\r\n\r\nvoid CSettingsManager::RegisterObject(ISettings *pSettings)\r\n{\r\n    m_Settings.push_back(pSettings);\r\n}\r\n\r\nbool CSettingsManager::GetConfigPath(TCHAR *szConfigPath)\r\n{\r\n#ifdef PORTABLE\r\n    GetModuleFileName(NULL,szConfigPath,MAX_PATH - 1);\r\n    ExtractFilePath(szConfigPath);\r\n#else\r\n    if (!SUCCEEDED(SHGetFolderPath(HWND_DESKTOP,CSIDL_APPDATA | CSIDL_FLAG_CREATE,NULL,\r\n        SHGFP_TYPE_CURRENT,szConfigPath)))\r\n        return false;\r\n\r\n    IncludeTrailingBackslash(szConfigPath);\r\n    lstrcat(szConfigPath,_T(\"InfraRecorder\\\\\"));\r\n\r\n    // Create the file path if it doesn't exist.\r\n    ckcore::Directory::create(szConfigPath);\r\n#endif\r\n\r\n    lstrcat(szConfigPath,_T(\"settings.xml\"));\r\n    return true;\r\n}\r\n\r\nbool CSettingsManager::Save()\r\n{\r\n    CXmlProcessor Xml;\r\n    bool bResult = true;\r\n\r\n    Xml.AddElement(_T(\"InfraRecorder\"),_T(\"\"),true);\r\n        Xml.AddElement(_T(\"Settings\"),_T(\"\"),true);\r\n            for (unsigned int i = 0; i < m_Settings.size(); i++)\r\n            {\r\n                if (!m_Settings[i]->Save(&Xml))\r\n                    bResult = false;\r\n            }\r\n        Xml.LeaveElement();\r\n    Xml.LeaveElement();\r\n\r\n    // Get the correct file-path.\r\n    TCHAR szConfigPath[MAX_PATH];\r\n    if (!GetConfigPath(szConfigPath))\r\n        return false;\r\n\r\n    return bResult && Xml.Save(szConfigPath);\r\n}\r\n\r\nbool CSettingsManager::Load()\r\n{\r\n    CXmlProcessor Xml;\r\n    bool bResult = true;\r\n\r\n    // Get the correct file-path.\r\n    TCHAR szConfigPath[MAX_PATH];\r\n    if (!GetConfigPath(szConfigPath))\r\n        return false;\r\n\r\n    // Load the file.\r\n    int iResult = Xml.Load(szConfigPath);\r\n    if (iResult != XMLRES_OK && iResult != XMLRES_FILEERROR)\r\n    {\r\n        TCHAR szMessage[128];\r\n        lsnprintf_s(szMessage,128,lngGetString(ERROR_LOADSETTINGS),iResult);\r\n\r\n        MessageBox(HWND_DESKTOP,szMessage,lngGetString(GENERAL_WARNING),MB_OK | MB_ICONWARNING);\r\n        return false;\r\n    }\r\n\r\n    if (!Xml.EnterElement(_T(\"InfraRecorder\")))\r\n        return false;\r\n\r\n    if (!Xml.EnterElement(_T(\"Settings\")))\r\n        return false;\r\n\r\n    for (unsigned int i = 0; i < m_Settings.size(); i++)\r\n    {\r\n        if (!m_Settings[i]->Load(&Xml))\r\n            bResult = false;\r\n    }\r\n\r\n    Xml.LeaveElement();\r\n    Xml.LeaveElement();\r\n\r\n    return bResult;\r\n}\r\n"
  },
  {
    "path": "src/app/settings_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"settings.hh\"\r\n\r\nclass CSettingsManager\r\n{\r\nprivate:\r\n    std::vector<ISettings *> m_Settings;\r\n\r\n    void RegisterObject(ISettings *pSettings);\r\n\r\n    bool GetConfigPath(TCHAR *szConfigPath);\r\n\r\npublic:\r\n    CSettingsManager();\r\n    ~CSettingsManager();\r\n\r\n    bool Save();\r\n    bool Load();\r\n};\r\n\r\nextern CSettingsManager g_SettingsManager;\r\n"
  },
  {
    "path": "src/app/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n\r\n#if (_ATL_VER < 0x0700)\r\n#include <atlimpl.cpp>\r\n#endif\r\n"
  },
  {
    "path": "src/app/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#pragma warning (disable: 4100)\t\t// \"unreferenced formal parameter\".\r\n#pragma warning (disable: 4706)\t\t// \"assignment within conditional expression\".\r\n\r\n// Change these values to use different versions.\r\n#define WINVER\t\t\t0x0400\r\n#define _WIN32_WINNT\t0x0500\r\n#define _WIN32_IE\t\t0x0500\r\n#define _RICHEDIT_VER\t0x0100\r\n\r\n#define VERSION_COMPATIBILITY_CHECK\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n\r\nextern CAppModule _Module;\r\n\r\n#include <atlwin.h>\r\n#include <atlframe.h>\r\n#include <atlctrls.h>\r\n#include <atldlgs.h>\r\n#include <atlctrlw.h>\r\n#include <atlctrlx.h>\t\t// CWaitCursor\r\n#include <atlsplit.h>\t\t// CSplitterWindowImpl\r\n#include <htmlhelp.h>\r\n#include <dbt.h>            // WM_DEVICECHANGE.\r\n#include \"atl_compat.hh\"\r\n\r\n#include <ckcore/types.hh>\r\nusing namespace ckcore;\r\n\r\n// Manifest.\r\n#if defined _M_IX86\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_IA64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_X64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#else\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#endif\r\n\r\n// Button image list support.\r\n#if (_WIN32_WINNT < 0x501)\r\n#define BUTTON_IMAGELIST_ALIGN_CENTER   4\r\n\r\ntypedef struct\r\n{\r\n    HIMAGELIST  himl;   // Index: Normal, hot pushed, disabled. If count is less than 4, we use index 1\r\n    RECT        margin; // Margin around icon.\r\n    UINT        uAlign;\r\n} BUTTON_IMAGELIST, *PBUTTON_IMAGELIST;\r\n\r\n#define BCM_FIRST               0x1600\r\n#define BCM_SETIMAGELIST        (BCM_FIRST + 0x0002)\r\n#endif\r\n"
  },
  {
    "path": "src/app/string_table.cc",
    "content": "/*\n * InfraRecorder - CD/DVD burning software\n * Copyright (C) 2006-2012 Christian Kindahl\n * \n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"stdafx.hh\"\n#include \"string_table.hh\"\n\nconst TCHAR *g_szStringTable[END_OF_STRING_TABLE_GUARD] =\n{\n    #define TRSTR(a,b) b,\n    #include \"translated_strings.hh\"\n    #undef TRSTR\n};\n\n_STATIC_ASSERT(END_OF_STRING_TABLE_GUARD == _countof(g_szStringTable));\n"
  },
  {
    "path": "src/app/string_table.hh",
    "content": "/*\n * InfraRecorder - CD/DVD burning software\n * Copyright (C) 2006-2012 Christian Kindahl\n * \n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nenum eStringTable\n{\n    #define TRSTR(a,b) a,\n    #include \"translated_strings.hh\"\n    #undef TRSTR\n\n    END_OF_STRING_TABLE_GUARD\n};\n\nextern const TCHAR *g_szStringTable[END_OF_STRING_TABLE_GUARD];\n"
  },
  {
    "path": "src/app/temp_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include \"temp_manager.hh\"\r\n#include \"settings.hh\"\r\n\r\nCTempManager g_TempManager;\r\n\r\nCTempManager::CTempManager()\r\n{\r\n    m_szEmptyDir[0] = '\\0';\r\n}\r\n\r\nCTempManager::~CTempManager()\r\n{\r\n}\r\n\r\n/*\r\n    CTempManager::AddObject\r\n    -----------------------\r\n    Adds a new file or folder to the list of files and folder to be removed when\r\n    the application closes. Please note that directories has to be empty to be able\r\n    to remove them.\r\n*/\r\nvoid CTempManager::AddObject(const TCHAR *szFileName)\r\n{\r\n    m_szFileNames.push_back(szFileName);\r\n}\r\n\r\nvoid CTempManager::CleanUp()\r\n{\r\n    // Remove the empty directory (if created).\r\n    ckcore::Directory::remove(m_szEmptyDir);\r\n    m_szEmptyDir[0] = '\\0';\r\n\r\n    // Remove any files.\r\n    for (unsigned int i = 0; i < m_szFileNames.size(); i++)\r\n    {\r\n        ckcore::File File(m_szFileNames[i].c_str());\r\n        ckcore::Directory Directory(m_szFileNames[i].c_str());\r\n\r\n        if (File.exist())\r\n            File.remove();\r\n        else if (Directory.exist())\r\n            Directory.remove();\r\n    }\r\n\r\n    m_szFileNames.clear();\r\n}\r\n\r\nconst TCHAR *CTempManager::GetEmtpyDirectory()\r\n{\r\n    if (m_szEmptyDir[0] == '\\0')\r\n    {\r\n        ckcore::Directory TempDir = ckcore::Directory::temp();\r\n        TempDir.create();\r\n\r\n        lstrcpy(m_szEmptyDir,TempDir.name().c_str());\r\n    }\r\n\r\n    return m_szEmptyDir;\r\n}\r\n"
  },
  {
    "path": "src/app/temp_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n\r\nclass CTempManager\r\n{\r\nprivate:\r\n    std::vector<std::wstring> m_szFileNames;\r\n\r\n    // Temporary empty directory.\r\n    TCHAR m_szEmptyDir[MAX_PATH];\r\n\r\npublic:\r\n    CTempManager();\r\n    ~CTempManager();\r\n\r\n    void AddObject(const TCHAR *szFileName);\r\n    void CleanUp();\r\n\r\n    const TCHAR *GetEmtpyDirectory();\r\n};\r\n\r\nextern CTempManager g_TempManager;\r\n"
  },
  {
    "path": "src/app/toolbar_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"toolbar_manager.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"trans_util.hh\"\r\n#include \"main_frm.hh\"\r\n\r\nCToolBarManager g_ToolBarManager;\r\n\r\nCToolBarManager::CCustomizeDlg::CCustomizeDlg(int iText,int iIcon)\r\n{\r\n    m_iText = iText;\r\n    m_iIcon = iIcon;\r\n}\r\n\r\nCToolBarManager::CCustomizeDlg::~CCustomizeDlg()\r\n{\r\n}\r\n\r\nLRESULT CToolBarManager::CCustomizeDlg::OnInitDialog(UINT uMsg,WPARAM wParam,\r\n                                                     LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Increase the window height.\r\n    RECT rcWindow,rcClient;\r\n    GetWindowRect(&rcWindow);\r\n    GetClientRect(&rcClient);\r\n\r\n    rcWindow.bottom += 58;\r\n    SetWindowPos(0,0,0,rcWindow.right - rcWindow.left,rcWindow.bottom - rcWindow.top,SWP_NOZORDER | SWP_NOMOVE);\r\n\r\n    // Create the text options label.\r\n    RECT rcTextStatic = { 6,rcClient.bottom + 2,80,rcClient.bottom + 19 };\r\n    HWND hWndStatic = m_TextStatic.Create(m_hWnd,rcTextStatic,lngGetString(TBCUSTOMIZE_TEXTOPTIONS),\r\n        WS_CHILD | WS_VISIBLE | WS_GROUP);\r\n    m_TextStatic.SetFont(AtlGetDefaultGuiFont());\r\n    int iTextRight = UpdateStaticWidth(m_hWnd,hWndStatic,lngGetString(TBCUSTOMIZE_TEXTOPTIONS));\r\n\r\n    // Create the text options combo box.\r\n    RECT rcTextCombo = { 80,rcClient.bottom,263,rcClient.bottom + 200 };\r\n    m_TextComboBox.Create(m_hWnd,rcTextCombo,NULL,WS_CHILD | WS_VISIBLE |\r\n        WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL,\r\n        0,IDC_TBCUSTOMIZE_TEXTCOMBO);\r\n    m_TextComboBox.SetFont(AtlGetDefaultGuiFont());\r\n    m_TextComboBox.AddString(lngGetString(TBCUSTOMIZE_SHOWTEXT));\r\n    m_TextComboBox.AddString(lngGetString(TBCUSTOMIZE_SHOWTEXTRIGHT));\r\n    m_TextComboBox.AddString(lngGetString(TBCUSTOMIZE_NOTEXT));\r\n    m_TextComboBox.SetCurSel(m_iText);\r\n\r\n    // Create the icon options label.\r\n    RECT rcIconStatic = { 6,rcClient.bottom + 31,80,rcClient.bottom + 48 };\r\n    hWndStatic = m_IconStatic.Create(m_hWnd,rcIconStatic,lngGetString(TBCUSTOMIZE_ICONOPTIONS),\r\n        WS_CHILD | WS_VISIBLE | WS_GROUP);\r\n    m_IconStatic.SetFont(AtlGetDefaultGuiFont());\r\n    int iIconRight = UpdateStaticWidth(m_hWnd,hWndStatic,lngGetString(TBCUSTOMIZE_ICONOPTIONS));\r\n\r\n    // Create the icon options combo box.\r\n    RECT rcIconCombo = { 80,rcClient.bottom + 29,263,rcClient.bottom + 200 };\r\n    m_IconComboBox.Create(m_hWnd,rcIconCombo,NULL,WS_CHILD | WS_VISIBLE |\r\n        WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBS_DROPDOWNLIST | CBS_AUTOHSCROLL,\r\n        0,IDC_TBCUSTOMIZE_ICONCOMBO);\r\n    m_IconComboBox.SetFont(AtlGetDefaultGuiFont());\r\n    m_IconComboBox.AddString(lngGetString(TBCUSTOMIZE_ICONSMALL));\r\n    m_IconComboBox.AddString(lngGetString(TBCUSTOMIZE_ICONLARGE));\r\n    m_IconComboBox.SetCurSel(m_iIcon);\r\n\r\n    // Update the static width if necessary.\r\n    int iMaxRight = iTextRight > iIconRight ? iTextRight : iIconRight;\r\n    if (iMaxRight > 80)\r\n    {\r\n        UpdateEditPos(m_hWnd,IDC_TBCUSTOMIZE_TEXTCOMBO,iMaxRight,true);\r\n        UpdateEditPos(m_hWnd,IDC_TBCUSTOMIZE_ICONCOMBO,iMaxRight,true);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CToolBarManager::CCustomizeDlg::OnTCSelChange(WORD wNotifyCode,WORD wID,\r\n                                                      HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    m_iText = m_TextComboBox.GetCurSel();\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CToolBarManager::CCustomizeDlg::OnICSelChange(WORD wNotifyCode,WORD wID,\r\n                                                      HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    m_iIcon = m_IconComboBox.GetCurSel();\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nint CToolBarManager::CCustomizeDlg::GetTextOption()\r\n{\r\n    return m_iText;\r\n}\r\n\r\nint CToolBarManager::CCustomizeDlg::GetIconOption()\r\n{\r\n    return m_iIcon;\r\n}\r\n\r\nCToolBarManager::CToolBarManager()\r\n{\r\n    m_pToolBar = NULL;\r\n    Reset();\r\n}\r\n\r\nCToolBarManager::~CToolBarManager()\r\n{\r\n}\r\n\r\nvoid CToolBarManager::AddSeparator()\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_SEP;\r\n    tbButton.iBitmap = NULL;\r\n    tbButton.idCommand = NULL;\r\n    tbButton.iString = NULL;\r\n    tbButton.dwData = NULL;\r\n\r\n    m_Buttons[ID_TOOLBAR_SEPARATOR] = tbButton;\r\n}\r\n\r\nvoid CToolBarManager::AddButton(int iCommand,int iBitmap,int iString)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = NULL;\r\n    tbButton.dwData = iString;\r\n\r\n    m_Buttons[iCommand] = tbButton;\r\n}\r\n\r\nvoid CToolBarManager::AddDropDownButton(int iBitmap,int iCommand,int iString)\r\n{\r\n    TBBUTTON tbButton;\r\n    tbButton.fsState = TBSTATE_ENABLED;\r\n    tbButton.fsStyle = TBSTYLE_BUTTON | BTNS_DROPDOWN | TBSTYLE_AUTOSIZE;\r\n    tbButton.iBitmap = iBitmap;\r\n    tbButton.idCommand = iCommand;\r\n    tbButton.iString = NULL;\r\n    tbButton.dwData = iString;\r\n\r\n    m_Buttons[iCommand] = tbButton;\r\n}\r\n\r\nvoid CToolBarManager::Reset()\r\n{\r\n    m_Buttons.clear();\r\n    m_SelButtons.clear();\r\n\r\n    // Add all different buttons to the internal button structure.\r\n    AddButton(ID_FILE_OPEN,0,TOOLBAR_OPEN);\r\n    AddButton(ID_FILE_SAVE,1,TOOLBAR_SAVE);\r\n    AddButton(ID_FILE_PROJECTPROPERTIES,3,TOOLBAR_PROJECTPROPERTIES);\r\n    AddButton(ID_APP_EXIT,4,TOOLBAR_EXIT);\r\n    AddButton(ID_BURNCOMPILATION_COMPACTDISC,8,TOOLBAR_BURNCOMPILATION);\r\n    AddButton(ID_ACTIONS_BURNIMAGE,9,TOOLBAR_BURNIMAGE);\r\n    AddButton(ID_COPYDISC_COMPACTDISC,10,TOOLBAR_COPY);\r\n    AddButton(ID_ACTIONS_MANAGETRACKS,11,TOOLBAR_TRACKS);\r\n    AddButton(ID_ACTIONS_ERASERE,12,TOOLBAR_ERASE);\r\n    AddButton(ID_ACTIONS_FIXATEDISC,13,TOOLBAR_FIXATE);\r\n    AddButton(ID_VIEW_PROGRAMLOG,14,TOOLBAR_LOG);\r\n    AddButton(ID_OPTIONS_CONFIGURATION,15,TOOLBAR_CONFIGURATION);\r\n    AddButton(ID_OPTIONS_DEVICES,16,TOOLBAR_DEVICES);\r\n    AddButton(ID_HELP_HELPTOPICS,17,TOOLBAR_HELP);\r\n    AddButton(ID_APP_ABOUT,18,TOOLBAR_ABOUT);\r\n    AddSeparator();\r\n\r\n    // Setup the default toolbar button configuration.\r\n    m_SelButtons.push_back(ID_FILE_OPEN);\r\n    m_SelButtons.push_back(ID_FILE_SAVE);\r\n    m_SelButtons.push_back(ID_TOOLBAR_SEPARATOR);\r\n    m_SelButtons.push_back(ID_BURNCOMPILATION_COMPACTDISC);\r\n    m_SelButtons.push_back(ID_ACTIONS_BURNIMAGE);\r\n    m_SelButtons.push_back(ID_COPYDISC_COMPACTDISC);\r\n    m_SelButtons.push_back(ID_ACTIONS_ERASERE);\r\n    m_SelButtons.push_back(ID_TOOLBAR_SEPARATOR);\r\n    m_SelButtons.push_back(ID_OPTIONS_CONFIGURATION);\r\n    m_SelButtons.push_back(ID_OPTIONS_DEVICES);\r\n    m_SelButtons.push_back(ID_TOOLBAR_SEPARATOR);\r\n    m_SelButtons.push_back(ID_APP_EXIT);\r\n}\r\n\r\nbool CToolBarManager::FillToolBarCtrl(CToolBarCtrl *pToolBar)\r\n{\r\n    m_pToolBar = pToolBar;\r\n\r\n    pToolBar->SetButtonStructSize();\r\n\r\n    std::vector<int>::const_iterator itButtons;\r\n    int iIndex = 0;\r\n    for (itButtons = m_SelButtons.begin(); itButtons !=\r\n        m_SelButtons.end(); itButtons++,iIndex++)\r\n    {\r\n        // Should be use button text?\r\n        if (g_DynamicSettings.m_iToolBarText == TOOLBAR_TEXT_DONTSHOW)\r\n            m_Buttons[*itButtons].iString = (unsigned int)NULL;\r\n        else\r\n            m_Buttons[*itButtons].iString = (INT_PTR)lngGetString((unsigned int)m_Buttons[*itButtons].dwData);\r\n\r\n        if (!pToolBar->InsertButton(iIndex,&m_Buttons[*itButtons]))\r\n            return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool CToolBarManager::Save(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    pXml->AddElement(_T(\"Buttons\"),_T(\"\"),true);\r\n        TCHAR szTemp[16];\r\n\r\n        int iIndex = 0;\r\n        std::vector<int>::const_iterator itSelButton;\r\n        for (itSelButton = m_SelButtons.begin(); itSelButton !=\r\n            m_SelButtons.end(); itSelButton++,iIndex++)\r\n        {\r\n            lsprintf(szTemp,_T(\"Item%i\"),iIndex);\r\n            pXml->AddElement(szTemp,*itSelButton);\r\n        }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CToolBarManager::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Buttons\")))\r\n        return false;\r\n\r\n    m_SelButtons.clear();\r\n\r\n    TCHAR szTemp[16];\r\n    for (unsigned int i = 0; i < pXml->GetElementChildCount(); i++)\r\n    {\r\n        lsprintf(szTemp,_T(\"Item%i\"),i);\r\n\r\n        int iButton = -1;\r\n        pXml->GetSafeElementData(szTemp,&iButton);\r\n        m_SelButtons.push_back(iButton);\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CToolBarManager::Customize()\r\n{\r\n    if (m_pToolBar == NULL)\r\n        return false;\r\n\r\n    m_pCustomizeDlg = new CCustomizeDlg(g_DynamicSettings.m_iToolBarText,\r\n        g_DynamicSettings.m_iToolBarIcon);\r\n    m_hCBTHook = ::SetWindowsHookEx(WH_CBT,CBTProc,0,::GetCurrentThreadId());\r\n\r\n    m_pToolBar->Customize();\r\n\r\n    ::UnhookWindowsHookEx(m_hCBTHook);\r\n    m_hCBTHook = NULL;\r\n\r\n    // Fix to make sure that the toolbar is appropriately updated according the its buttons.\r\n    if (m_pCustomizeDlg->GetTextOption() == TOOLBAR_TEXT_SHOW &&\r\n        g_DynamicSettings.m_iToolBarText != TOOLBAR_TEXT_SHOW)\r\n    {\r\n        SIZE sButton;\r\n        sButton.cx = 50;\r\n        sButton.cy = 50;\r\n        m_pToolBar->SetButtonSize(sButton);\r\n    }\r\n\r\n    // Update the settings.\r\n    g_DynamicSettings.m_iToolBarText = m_pCustomizeDlg->GetTextOption();\r\n    g_DynamicSettings.m_iToolBarIcon = m_pCustomizeDlg->GetIconOption();\r\n\r\n    delete m_pCustomizeDlg;\r\n    m_pCustomizeDlg = NULL;\r\n\r\n    // Update the toolbar style.\r\n    unsigned long ulStyle = m_pToolBar->GetStyle() & (~TBSTYLE_LIST);\r\n    ulStyle |= g_DynamicSettings.m_iToolBarText == TOOLBAR_TEXT_SHOWRIGHT ? TBSTYLE_LIST : 0;\r\n    m_pToolBar->SetStyle(ulStyle);\r\n\r\n    // Update the button selection map.\r\n    m_SelButtons.clear();\r\n\r\n    for (int i = 0; i < m_pToolBar->GetButtonCount(); i++)\r\n    {\r\n        TBBUTTON tbButton;\r\n        m_pToolBar->GetButton(i,&tbButton);\r\n\r\n        if (tbButton.fsStyle & TBSTYLE_SEP)\r\n            m_SelButtons.push_back(ID_TOOLBAR_SEPARATOR);\r\n        else\r\n            m_SelButtons.push_back(tbButton.idCommand);\r\n    }\r\n\r\n    // Delete all buttons.\r\n    for (int i = m_pToolBar->GetButtonCount() - 1; i >= 0; i--)\r\n        m_pToolBar->DeleteButton(i);\r\n\r\n    switch (g_DynamicSettings.m_iToolBarIcon)\r\n    {\r\n        case TOOLBAR_ICON_SMALL:\r\n            m_pToolBar->SetImageList(g_pMainFrame->GetToolBarSmall());\r\n            break;\r\n\r\n        case TOOLBAR_ICON_LARGE:\r\n            m_pToolBar->SetImageList(g_pMainFrame->GetToolBarLarge());\r\n            break;\r\n    }\r\n\r\n    // Re-add all buttons.\r\n    FillToolBarCtrl(m_pToolBar);\r\n\r\n    // Update toolbar height.\r\n    int iButtonHeight = HIWORD(m_pToolBar->GetButtonSize());\r\n\r\n    RECT rcToolBar;\r\n    m_pToolBar->GetWindowRect(&rcToolBar);\r\n    GetParentWindow(m_pToolBar).ScreenToClient(&rcToolBar);\r\n    m_pToolBar->MoveWindow(rcToolBar.left,rcToolBar.top,rcToolBar.right - rcToolBar.left,iButtonHeight);\r\n\r\n    // Repaint.\r\n    m_pToolBar->Invalidate();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarBeginAdjust(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nCToolBarManager::CCustomizeDlg *CToolBarManager::m_pCustomizeDlg = NULL;\r\nHHOOK CToolBarManager::m_hCBTHook = NULL;\r\n\r\nLRESULT CALLBACK CToolBarManager::CBTProc(int nCode,WPARAM wParam,LPARAM lParam)\r\n{\r\n    try\r\n    {\r\n        if ((nCode == HCBT_CREATEWND) && (m_pCustomizeDlg) && (m_pCustomizeDlg->m_hWnd == NULL))\r\n        {\r\n            // Subclass standard customize toolbar dialog.\r\n            HWND hWnd = (HWND)wParam;\r\n            m_pCustomizeDlg->SubclassWindow(hWnd);\r\n        }\r\n    }\r\n    catch (...)\t// If exception is not caught then we can get in infinite loop as assert window is opened.\r\n    {\r\n        // Call next hook.\r\n        LRESULT lResult = ::CallNextHookEx(m_hCBTHook,nCode,wParam,lParam);\r\n\r\n        ::UnhookWindowsHookEx(m_hCBTHook);\r\n        m_hCBTHook = NULL;\r\n\r\n        if (m_pCustomizeDlg)\r\n        {\r\n            delete m_pCustomizeDlg;\r\n            m_pCustomizeDlg = NULL;\r\n        }\r\n\r\n        return lResult;\r\n    }\r\n\r\n    return ::CallNextHookEx(m_hCBTHook,nCode,wParam,lParam);\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarInitCustomize(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    // Remove the help button.\r\n    bHandled = true;\r\n    return TBNRF_HIDEHELP;\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarQueryInsert(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n    return true;\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarQueryDelete(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    bHandled = true;\r\n    return true;\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarGetButtonInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    LPTBNOTIFY lpTbNotify = (LPTBNOTIFY)pNMH;\r\n\r\n    if (lpTbNotify->iItem < (int)m_Buttons.size())\r\n    {\r\n        std::map<int,TBBUTTON>::const_iterator itButton = m_Buttons.begin();\r\n        for (int i = 0; i < lpTbNotify->iItem; i++)\r\n            itButton++;\r\n\r\n        lpTbNotify->tbButton = itButton->second;\r\n        lpTbNotify->tbButton.iString = (INT_PTR)lngGetString(\r\n            (unsigned int)lpTbNotify->tbButton.dwData);\r\n\r\n        lstrcpy(lpTbNotify->pszText,lngGetString(\r\n            (unsigned int)lpTbNotify->tbButton.dwData));\r\n        lpTbNotify->cchText = lstrlen(lpTbNotify->pszText);\r\n\r\n        // Syncronize with the menu. If the corresponding menu item is disabled\r\n        // the toolbar button should be disabled as well.\r\n        /*CMenuItemInfo mii;\r\n        mii.fMask = MIIM_STATE;\r\n\r\n        if (GetMenuItemInfo(g_pMainFrame->m_CmdBar.GetMenu(),lpTbNotify->tbButton.idCommand,FALSE,&mii))\r\n        {\r\n            if (mii.fState & MFS_DISABLED)\r\n                lpTbNotify->tbButton.fsState = TBSTATE_INDETERMINATE;\r\n            else\r\n                lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;\r\n        }*/\r\n\r\n        bHandled = true;\r\n        return true;\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nLRESULT CToolBarManager::OnToolBarReset(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    // Reset the toolbar button configuration.\r\n    Reset();\r\n\r\n    // Delete all buttons.\r\n    for (int i = m_pToolBar->GetButtonCount() - 1; i >= 0; i--)\r\n        m_pToolBar->DeleteButton(i);\r\n\r\n    // Re-add all buttons.\r\n    FillToolBarCtrl(m_pToolBar);\r\n\r\n    bHandled = true;\r\n    return 0;\r\n}"
  },
  {
    "path": "src/app/toolbar_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <map>\r\n#include <base/xml_processor.hh>\r\n#include \"resource.h\"\r\n\r\nclass CToolBarManager\r\n{\r\nprivate:\r\n    class CCustomizeDlg : public CWindowImpl<CCustomizeDlg,CWindow>\r\n    {\r\n    private:\r\n        CStatic m_TextStatic;\r\n        CStatic m_IconStatic;\r\n        CComboBox m_TextComboBox;\r\n        CComboBox m_IconComboBox;\r\n        int m_iText;\r\n        int m_iIcon;\r\n\r\n    public:\r\n        CCustomizeDlg(int iText,int iIcon);\r\n        ~CCustomizeDlg();\r\n\r\n        int GetTextOption();\r\n        int GetIconOption();\r\n\r\n        BEGIN_MSG_MAP(CCustomizeDlg)\r\n            COMMAND_HANDLER(IDC_TBCUSTOMIZE_TEXTCOMBO,CBN_SELCHANGE,OnTCSelChange)\r\n            COMMAND_HANDLER(IDC_TBCUSTOMIZE_ICONCOMBO,CBN_SELCHANGE,OnICSelChange)\r\n            MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        END_MSG_MAP()\r\n\r\n        LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n        LRESULT OnTCSelChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n        LRESULT OnICSelChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    };\r\n\r\n    enum\r\n    {\r\n        ID_TOOLBAR_SEPARATOR = 0\r\n    };\r\n\r\n    CToolBarCtrl *m_pToolBar;\r\n    std::map<int,TBBUTTON> m_Buttons;\r\n    std::vector<int> m_SelButtons;\r\n\r\n    void AddButton(int iBitmap,int iCommand,int iString);\r\n    void AddDropDownButton(int iBitmap,int iCommand,int iString);\r\n    void AddSeparator();\r\n    void Reset();\r\n\r\n    // Customize dialog hook.\r\n    static CCustomizeDlg *m_pCustomizeDlg;\r\n    static HHOOK m_hCBTHook;\r\n    static LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);\r\n\r\npublic:\r\n    CToolBarManager();\r\n    ~CToolBarManager();\r\n\r\n    bool FillToolBarCtrl(CToolBarCtrl *pToolBar);\r\n\r\n    bool Save(CXmlProcessor *pXml);\r\n    bool Load(CXmlProcessor *pXml);\r\n\r\n    bool Customize();\r\n\r\n    // Events.\r\n    LRESULT OnToolBarBeginAdjust(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnToolBarInitCustomize(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnToolBarQueryInsert(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnToolBarQueryDelete(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnToolBarGetButtonInfo(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n    LRESULT OnToolBarReset(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n\r\nextern CToolBarManager g_ToolBarManager;\r\n"
  },
  {
    "path": "src/app/translated_strings.hh",
    "content": "\r\n\tTRSTR(GENERAL_ERROR /* 0x0000 */, _T(\"Error\"))\r\n\tTRSTR(GENERAL_WARNING /* 0x0001 */, _T(\"Warning\"))\r\n\r\n\tTRSTR(GENERAL_INFORMATION /* 0x0002 */, _T(\"Information\"))\r\n\tTRSTR(GENERAL_QUESTION /* 0x0003 */, _T(\"Question\"))\r\n\r\n\tTRSTR(ERROR_REGISTRYWRITE /* 0x0004 */, _T(\"Unable to write to the registry. Your user account might not have permissions to perform the requested operation.\"))\r\n\tTRSTR(ERROR_FILEWRITE /* 0x0005 */, _T(\"An error occured while trying to save the file. The file has not been successfully created.\"))\r\n\tTRSTR(ERROR_LOADSETTINGS /* 0x0006 */, _T(\"Unable to load the configuration file, it may be corrupt. The XML processor returned: %d.\"))\r\n\tTRSTR(ERROR_AUDIOADDFOLDER /* 0x0007 */, _T(\"You can't add folders to an audio project.\"))\r\n\tTRSTR(ERROR_LOADPROJECTXML /* 0x0008 */, _T(\"Unable to parse project file, it may be corrupt. The XML processor returned: %d.\"))\r\n\tTRSTR(ERROR_LOADPROJECT /* 0x0009 */, _T(\"Unable to parse project file, it may be corrupt.\"))\r\n\tTRSTR(ERROR_PROJECTVERSION /* 0x000a */, _T(\"The project has been created with a newer version of InfraRecorder. You need to update InfraRecorder to open this project.\"))\r\n\tTRSTR(ERROR_UNSUPCHARSET /* 0x000b */, _T(\"The active character set could not be automatically detected. The registry suggests the following body character set: %s.\"))\r\n\tTRSTR(ERROR_RELOADDRIVE /* 0x000c */, _T(\"Please reload the drive and press the 'Reload' button.\"))\r\n\tTRSTR(ERROR_SECTOR /* 0x000d */, _T(\"Error on sector %d not corrected.\"))\r\n\tTRSTR(ERROR_COMMANDLINE /* 0x000e */, _T(\"The internal command line is too long for your system to handle. The length limit on your system is %d characters. Please try to shorten the file paths in your project and try again.\"))\r\n\r\n\t// OBSOLETE.\r\n\tTRSTR(CONFIRM_AUTORUNENABLED /* 0x000f */, _T(\"InfraRecorder has noticed that autorun is enabled. Leaving autorun enabled causes Windows to poll the CD drive while recording, which might damage your CD. Do you want to turn off autorun (recommended)?\"))\r\n\tTRSTR(CONFIRM_WRITECANCEL /* 0x0010 */, _T(\"Are you sure that you want to abort the operation? Aborting might damage your CD permanently.\"))\r\n\tTRSTR(CONFIRM_REMOVEITEMS /* 0x0011 */, _T(\"Are you sure that you want to remove the selected item(s) from the project?\"))\r\n\tTRSTR(CONFIRM_SAVEPROJECT /* 0x0012 */, _T(\"The project has been modified, do you want to save the changes?\"))\r\n\tTRSTR(CONFIRM_CREATEMIXIMAGE /* 0x0013 */, _T(\"Only the data track can be recorded to a disc image from mixed-mode projects. Do you want to continue?\"))\r\n\r\n\tTRSTR(INIT_SCANBUS /* 0x0014 */, _T(\"Scanning SCSI/IDE bus...\"))\r\n\tTRSTR(INIT_LOADCAPABILITIES /* 0x0015 */, _T(\"Loading device capabilities...\"))\r\n\tTRSTR(STRINGTABLE_PLACEHOLDER0 /* 0x0016 */, _T(\"\"))\r\n\tTRSTR(INIT_FOUNDDEVICES /* 0x0017 */, _T(\"InfraRecorder has detected changes in your hardware configuration. Would you like to update your device configuration now?\"))\r\n\tTRSTR(INIT_DEVICECD /* 0x0018 */, _T(\"Initializing device...\"))\r\n\tTRSTR(INIT_TRACK /* 0x0019 */, _T(\"Loading information from track %d.\"))\r\n\r\n\tTRSTR(FAILURE_SCANBUS /* 0x001a */, _T(\"InfraRecorder failed to scan your SCSI/IDE busses. Please make sure that your system is properly configured.\"))\r\n\tTRSTR(FAILURE_LOADCAP /* 0x001b */, _T(\"InfraRecorder failed to load device capabilities.\"))\r\n\tTRSTR(FAILURE_LOADINFOEX /* 0x001c */, _T(\"InfraRecorder failed to load extended device information.\"))\r\n\tTRSTR(FAILURE_NORECORDERS /* 0x001d */, _T(\"No recorders available\"))\r\n\tTRSTR(FAILURE_NODEVICES /* 0x001e */, _T(\"No devices available\"))\r\n\tTRSTR(FAILURE_CDRTOOLS /* 0x001f */, _T(\"An error occured while trying to perform the selected operation.\"))\r\n\tTRSTR(FAILURE_NOMEDIA /* 0x0020 */, _T(\"Unable to load drive media. Please insert a valid disc into the drive.\"))\r\n\tTRSTR(FAILURE_UNSUPRW /* 0x0021 */,_T(\"The disc is not rewritable or your recorder might not support the operation.\"))\r\n\tTRSTR(FAILURE_ERASE /* 0x0022 */, _T(\"Couldn't erase disc using the selected method.\"))\r\n\tTRSTR(FAILURE_BADSECTORSIZE /* 0x0023 */, _T(\"Unsupported sector size of %d bytes.\"))\r\n\tTRSTR(FAILURE_WRITE /* 0x0024 */, _T(\"A write error occurred. Please see program log for more details.\"))\r\n\tTRSTR(FAILURE_UNSUPAUDIO /* 0x0025 */, _T(\"The file you are trying to add is not supported.\"))\r\n\tTRSTR(FAILURE_FILENOTFOUND /* 0x0026 */, _T(\"Unable to locate the file:\"))\r\n\tTRSTR(FAILURE_CREATECDTEXT /* 0x0027 */, _T(\"An error occured while trying to save the CD-Text binary data. The CD-Text information will not be recorded.\"))\r\n\tTRSTR(FAILURE_AUDIOCODING /* 0x0028 */, _T(\"Inappropriate audio coding in file:\"))\t\t\t\r\n\tTRSTR(FAILURE_LOADDRIVE /* 0x0029 */, _T(\"The drive could not automatically be reloaded.\"))\r\n\tTRSTR(FAILURE_READSOURCEDISC /* 0x002a */, _T(\"Can't read source disc. Retrying from sector %d.\"))\r\n\tTRSTR(FAILURE_DEEPDIR /* 0x002b */, _T(\"The directory structure is too deep for '%s' (%d), maximum allowed depth is %d.\"))\r\n\tTRSTR(FAILURE_DVDSUPPORT /* 0x002c */, _T(\"DVD media found. DVD write support is not available in this version.\"))\r\n\r\n\t// Project properties.\r\n\tTRSTR(PROJECTPROP_TITLE /* 0x002d */, _T(\"Project Properties\"))\r\n\tTRSTR(PROJECTPROP_ISOLEVEL1 /* 0x002e */, _T(\"Level 1 (11 character file names)\"))\r\n\tTRSTR(PROJECTPROP_ISOLEVEL2 /* 0x002f */, _T(\"Level 2 (31 character file names)\"))\r\n\tTRSTR(PROJECTPROP_ISOLEVEL3 /* 0x0030 */, _T(\"Level 3 (files larger than 4 GiB)\"))\r\n\tTRSTR(PROJECTPROP_MODE1 /* 0x0031 */, _T(\"Mode 1\"))\r\n\tTRSTR(PROJECTPROP_MODE2 /* 0x0032 */, _T(\"Mode 2 XA (multisession)\"))\r\n\tTRSTR(PROJECTPROP_TRACKPROP /* 0x0033 */, _T(\"Properties of Track %d\"))\r\n\r\n\t// Container titles.\r\n\tTRSTR(TITLE_EXPLORERVIEW /* 0x0034 */, _T(\"Explorer View\"))\r\n\tTRSTR(TITLE_PROJECTVIEW /* 0x0035 */, _T(\"Disc Layout\"))\r\n\r\n\t// Miscellaneous.\r\n\tTRSTR(MISC_MAXIMUM /* 0x0036 */, _T(\"Maximum\"))\r\n\tTRSTR(MISC_NOTAVAILABLE /* 0x0037 */, _T(\"Not available\"))\r\n\tTRSTR(MISC_BURN /* 0x0038 */, _T(\"Burn \"))\r\n\tTRSTR(MISC_BURNCOMPILATION /* 0x0039 */, _T(\"Burn Compilation\"))\r\n\tTRSTR(MISC_NEWFOLDER /* 0x003a */, _T(\"New Folder\"))\r\n\tTRSTR(MISC_MINUTES /* 0x003b */, _T(\"%I64d minutes\"))\r\n\tTRSTR(MISC_AUTODETECT /* 0x003c */, _T(\" (automatically detected)\"))\r\n\tTRSTR(MISC_SPECIFYTRACKFOLDER /* 0x003d */, _T(\"Please select the folder where you want the track(s) to be saved:\"))\r\n\tTRSTR(MISC_SPECIFYFOLDER /* 0x003e */, _T(\"Please select a folder:\"))\r\n\r\n\t// Projects.\r\n\tTRSTR(PROJECT_DATA /* 0x003f */, _T(\"Data Project\"))\r\n\tTRSTR(PROJECT_AUDIO /* 0x0040 */, _T(\"Audio Project\"))\r\n\tTRSTR(PROJECT_MIXED /* 0x0041 */, _T(\"Mixed-Mode CD Project\"))\r\n\tTRSTR(PROJECT_CONTENTS /* 0x0042 */, _T(\"%I64d Files, %I64d Folders, %I64d Tracks\"))\r\n\r\n\t// Properties.\r\n\tTRSTR(PROPERTIES_TITLE /* 0x0043 */, _T(\"Properties of \"))\r\n\tTRSTR(PROPERTIES_DEVICELOC /* 0x0044 */, _T(\"Bus %d, Target %d, Lun %d\"))\r\n\r\n\t// Advanced properties.\r\n\tTRSTR(ADVPROP_MODE2FORM1 /* 0x0045 */, _T(\"Read mode 2 form 1 blocks\"))\r\n\tTRSTR(ADVPROP_MODE2FORM2 /* 0x0046 */, _T(\"Read mode 2 form 2 blocks\"))\r\n\tTRSTR(ADVPROP_READDIGAUDIO /* 0x0047 */, _T(\"Read digital audio blocks\"))\r\n\tTRSTR(ADVPROP_READMULTSESSION /* 0x0048 */, _T(\"Read multi-session discs\"))\r\n\tTRSTR(ADVPROP_READFIXPACKET /* 0x0049 */, _T(\"Read fixed-packet CD media using method 2\"))\r\n\tTRSTR(ADVPROP_READBARCODE /* 0x004a */, _T(\"Read CD bar code\"))\r\n\tTRSTR(ADVPROP_READRWSUBCODE /* 0x004b */, _T(\"Read R-W subcode information\"))\r\n\tTRSTR(ADVPROP_READRAWPWSC /* 0x004c */, _T(\"Read raw P-W subcode data from lead in\"))\r\n\tTRSTR(ADVPROP_SIMULATION /* 0x004d */, _T(\"Support test writing (simulation)\"))\r\n\tTRSTR(ADVPROP_BUFRECORDING /* 0x004e */, _T(\"Support Buffer Underrun Free recording\"))\r\n\tTRSTR(ADVPROP_C2EP /* 0x004f */, _T(\"Support C2 error pointers\"))\r\n\tTRSTR(ADVPROP_EJECTCDSS /* 0x0050 */, _T(\"Support CD ejection via START/STOP command\"))\r\n\tTRSTR(ADVPROP_CHANGEDISCSIDE /* 0x0051 */, _T(\"Support changing side of disc\"))\r\n\tTRSTR(ADVPROP_INDIVIDUALDP /* 0x0052 */, _T(\"Support Individual Disc Present feature\"))\r\n\tTRSTR(ADVPROP_RETURNCDCN /* 0x0053 */, _T(\"Return CD media catalog number\"))\r\n\tTRSTR(ADVPROP_RETURNCDISRC /* 0x0054 */, _T(\"Return CD ISRC information\"))\r\n\tTRSTR(ADVPROP_DELIVCOMPOSITE /* 0x0055 */, _T(\"Deliver composite A/V data\"))\r\n\tTRSTR(ADVPROP_PLAYAUDIOCD /* 0x0056 */, _T(\"Play audio discs\"))\r\n\tTRSTR(ADVPROP_HASLESIC /* 0x0057 */, _T(\"Have load-empty-slot-in-changer feature\"))\r\n\tTRSTR(ADVPROP_LMOPU /* 0x0058 */, _T(\"Lock media on power up via prevent jumper\"))\r\n\tTRSTR(ADVPROP_ALLOWML /* 0x0059 */, _T(\"Allow media to be locked in the drive via PREVENT/ALLOW command\"))\r\n\tTRSTR(ADVPROP_RESTARTNSDARA /* 0x005a */, _T(\"Restart non-streamed digital audio reads accurateley\"))\r\n\tTRSTR(ADVPROP_RETURNRWSUBCODE /* 0x005b */, _T(\"Return R-W subcode de-interleaved and error-corrected\"))\r\n\tTRSTR(ADVPROP_INDIVIDUALVC /* 0x005c */, _T(\"Support individual channel volume settings\"))\r\n\tTRSTR(ADVPROP_INDEPENDENTMUTE /* 0x005d */, _T(\"Support independent mute setting for each channel\"))\r\n\tTRSTR(ADVPROP_DOPORT1 /* 0x005e */, _T(\"Support digital output on port 1\"))\r\n\tTRSTR(ADVPROP_DOPORT2 /* 0x005f */, _T(\"Support digital output on port 2\"))\r\n\tTRSTR(ADVPROP_DOSENDDIGDAT /* 0x0060 */, _T(\"Send digital data LSB-first\"))\r\n\tTRSTR(ADVPROP_DOSETLRCK /* 0x0061 */, _T(\"Set LRCK high for left-channel data\"))\r\n\tTRSTR(ADVPROP_HASVALIDDATA /* 0x0062 */, _T(\"Have valid data on falling edge of clock\"))\r\n\tTRSTR(DEVICETYPE_CDREADER /* 0x0063 */, _T(\"CD-Reader\"))\r\n\tTRSTR(DEVICETYPE_DVDREADER /* 0x0064 */, _T(\"CD/DVD-Reader\"))\r\n\tTRSTR(DEVICETYPE_CDRECORDER /* 0x0065 */, _T(\"CD-Recorder\"))\r\n\tTRSTR(DEVICETYPE_DVDRECORDER /* 0x0066 */, _T(\"CD/DVD-Recorder\"))\r\n\r\n\t// Disc blanking.\r\n\tTRSTR(BLANKMODE_FULL /* 0x0067 */, _T(\"Blank the entire disc\"))\r\n\tTRSTR(BLANKMODE_MINIMAL /* 0x0068 */, _T(\"Minimally blank the disc\"))\r\n\tTRSTR(BLANKMODE_UNCLOSE /* 0x0069 */, _T(\"Unclose last session\"))\r\n\tTRSTR(BLANKMODE_SESSION /* 0x006a */, _T(\"Blank last session\"))\r\n\r\n\t// Write methods.\r\n\tTRSTR(WRITEMODE_SAO /* 0x006b */, _T(\"Session-At-Once (SAO)\"))\r\n\tTRSTR(WRITEMODE_TAO /* 0x006c */, _T(\"Track-At-Once (TAO)\"))\r\n\tTRSTR(WRITEMODE_TAONOPREGAP /* 0x006d */, _T(\"TAO with zero pregap\"))\r\n\tTRSTR(WRITEMODE_RAW96R /* 0x006e */, _T(\"Raw writing (raw96r)\"))\r\n\tTRSTR(WRITEMODE_RAW16 /* 0x006f */, _T(\"Raw writing (raw16)\"))\r\n\tTRSTR(WRITEMODE_RAW96P /* 0x0070 */, _T(\"Raw writing (raw96p)\"))\r\n\r\n\t// Eject menu.\r\n\tTRSTR(EJECTMENU_NODRIVES /* 0x0071 */, _T(\"(no drives found)\"))\r\n\r\n\t// Write modes.\r\n\tTRSTR(WRITEMODE_REAL /* 0x0072 */, _T(\"real write\"))\t\r\n\tTRSTR(WRITEMODE_SIMULATION /* 0x0073 */, _T(\"simulation\"))\t\r\n\r\n\t// Column titles.\r\n\tTRSTR(COLUMN_TIME /* 0x0074 */, _T(\"Time\"))\r\n\tTRSTR(COLUMN_EVENT /* 0x0075 */, _T(\"Event\"))\r\n\tTRSTR(COLUMN_ID /* 0x0076 */, _T(\"ID\"))\r\n\tTRSTR(COLUMN_VENDOR /* 0x0077 */, _T(\"Vendor\"))\r\n\tTRSTR(COLUMN_IDENTIFICATION /* 0x0078 */, _T(\"Identification\"))\r\n\tTRSTR(COLUMN_REVISION /* 0x0079 */,    _T(\"Revision\"))\r\n\tTRSTR(COLUMN_NAME /* 0x007a */,\t\t_T(\"Name\"))\r\n\tTRSTR(COLUMN_SIZE /* 0x007b */,\t\t_T(\"Size\"))\r\n\tTRSTR(COLUMN_TYPE /* 0x007c */,\t\t_T(\"Type\"))\r\n\tTRSTR(COLUMN_MODIFIED /* 0x007d */,\t_T(\"Modified\"))\r\n\tTRSTR(COLUMN_PATH /* 0x007e */,\t\t_T(\"Path\"))\r\n\tTRSTR(COLUMN_TRACK /* 0x007f */,\t\t_T(\"Track\"))\r\n\tTRSTR(COLUMN_TITLE /* 0x0080 */,\t\t_T(\"Title\"))\r\n\tTRSTR(COLUMN_LENGTH /* 0x0081 */,\t\t_T(\"Length\"))\r\n\tTRSTR(COLUMN_LOCATION /* 0x0082 */,\t_T(\"Location\"))\r\n\tTRSTR(COLUMN_ARTIST /* 0x0083 */,\t\t_T(\"Artist\"))\r\n\tTRSTR(COLUMN_ADDRESS /* 0x0084 */,\t\t_T(\"Address\"))\r\n\tTRSTR(COLUMN_DESCRIPTION /* 0x0085 */, _T(\"Description\"))\r\n\tTRSTR(COLUMN_EXTENSIONS /* 0x0086 */,\t_T(\"Extensions\"))\r\n\r\n\t// Status dialog.\r\n\tTRSTR(PROGRESS_STATUS /* 0x0087 */,          _T(\"Status: \"))\r\n\tTRSTR(PROGRESS_DEVICE /* 0x0088 */,\t\t  _T(\"Device: \"))\r\n\tTRSTR(PROGRESS_TOTAL /* 0x0089 */,\t\t\t  _T(\"Total progress: %d%%\"))\r\n\tTRSTR(PROGRESS_INIT /* 0x008a */,\t\t\t  _T(\"Preparing to perform the selected operation.\"))\r\n\tTRSTR(PROGRESS_DONE /* 0x008b */,\t\t\t  _T(\"Operation completed.\"))\t\t\t\t\t\r\n\tTRSTR(PROGRESS_CANCELED /* 0x008c */,\t\t  _T(\"Operation canceled.\"))\r\n\tTRSTR(PROGRESS_GRACETIME /* 0x008d */,\t\t  _T(\"Last chance to abort, operation will start in %d seconds.\"))\r\n\tTRSTR(PROGRESS_BEGINERASE /* 0x008e */,\t  _T(\"Started to erase disc in %s mode.\"))\r\n\tTRSTR(PROGRESS_BEGINFIXATE /* 0x008f */,\t  _T(\"Started to close disc in %s mode.\"))\r\n\tTRSTR(PROGRESS_BEGINWRITE /* 0x0090 */,\t  _T(\"Started to write disc in %s mode.\"))\r\n\tTRSTR(PROGRESS_BEGINTRACK /* 0x0091 */,\t  _T(\"Started to write track %d.\"))\t\t\t\r\n\tTRSTR(PROGRESS_BEGINDISCIMAGE /* 0x0092 */,  _T(\"Started to write disc image.\"))\r\n\tTRSTR(PROGRESS_IMAGEDEVICE /* 0x0093 */,\t  _T(\"Virtual Disc Image Recorder\"))\r\n\tTRSTR(PROGRESS_BEGINREADTRACK /* 0x0094 */,  _T(\"Started to read track %d.\"))\r\n\tTRSTR(PROGRESS_BEGINSCANTRACK /* 0x0095 */,  _T(\"Started to scan track %d.\"))\r\n\tTRSTR(PROGRESS_BEGINREADDISC /* 0x0096 */,\t  _T(\"Started to read disc.\"))\t\t\t\t\r\n\r\n\t// Status strings.\r\n\tTRSTR(STATUS_ERASE /* 0x0097 */,       _T(\"Erasing disc.\"))\r\n\tTRSTR(STATUS_WRITEDATA /* 0x0098 */,\t_T(\"Writing data.\"))\t\t\t\t\t\t\t// FIXME: Obsolete.\t\r\n\tTRSTR(STATUS_WRITE /* 0x0099 */,\t\t_T(\"Writing track %d of %d at %.1fx speed.\"))\t// FIXME: Obsolete.\t\r\n\tTRSTR(STATUS_WRITEPREGAP /* 0x009a */,\t_T(\"Writing pregap for track %d at %ld.\"))\t\t// FIXME: Obsolete.\r\n\tTRSTR(STATUS_FILLBUFFER /* 0x009b */,\t_T(\"Waiting for reader process to fill input buffer.\"))\t// FIXME: Obsolete.\t\r\n\tTRSTR(STATUS_FIXATE /* 0x009c */,\t\t_T(\"Closing disc.\"))\t\t\t\t\t\t\t// FIXME: Obsolete.\t\r\n\tTRSTR(STATUS_WRITEIMAGE /* 0x009d */,\t_T(\"Writing disc image.\"))\r\n\tTRSTR(STATUS_READTRACK /* 0x009e */,\t_T(\"Reading track.\"))\r\n\tTRSTR(STATUS_SCANTRACK /* 0x009f */,\t_T(\"Scanning track.\"))\r\n\tTRSTR(STATUS_C2TOTAL /* 0x00a0 */,\t\t_T(\"Found %d bytes of C2 errors in %d sectors.\"))\r\n\tTRSTR(STATUS_C2RATE /* 0x00a1 */,\t\t_T(\"The C2 error rate is %f%%.\"))\r\n\tTRSTR(STATUS_READDISC /* 0x00a2 */,\t_T(\"Reading disc.\"))\t\t\t\t\t\t\t// FIXME: Obsolete.\t\r\n\r\n\t// Status titles.\r\n\tTRSTR(STITLE_ERASE /* 0x00a3 */,          _T(\"Erasing Disc\"))\r\n\tTRSTR(STITLE_BURNIMAGE /* 0x00a4 */,\t   _T(\"Burning Image\"))\r\n\tTRSTR(STITLE_CREATEIMAGE /* 0x00a5 */,\t   _T(\"Creating Image\"))\r\n\tTRSTR(STITLE_BURNCOMPILATION /* 0x00a6 */,_T(\"Burning Compilation\"))\r\n\tTRSTR(STITLE_FIXATE /* 0x00a7 */,\t\t   _T(\"Closing Disc\"))\r\n\tTRSTR(STITLE_READTRACK /* 0x00a8 */,\t   _T(\"Reading Track\"))\r\n\tTRSTR(STITLE_SCANTRACK /* 0x00a9 */,\t   _T(\"Scanning Track\"))\r\n\tTRSTR(STITLE_COPYDISC /* 0x00aa */,\t   _T(\"Copying Disc\"))\r\n\r\n\t// Sucess messages.\r\n\tTRSTR(SUCCESS_ERASE /* 0x00ab */,       _T(\"The disc was successfully erased.\"))\r\n\tTRSTR(SUCCESS_WRITE /* 0x00ac */,\t\t _T(\"The data was successfully written to the disc.\"))// FIXME: Obsolete.\r\n\tTRSTR(SUCCESS_FIXATE /* 0x00ad */,\t\t _T(\"The disc was successfully closed.\"))\t\t\t\t// FIXME: Obsolete.\r\n\tTRSTR(SUCCESS_CREATEIMAGE /* 0x00ae */, _T(\"The disc image was successfully created.\"))\r\n\tTRSTR(SUCCESS_READTRACK /* 0x00af */,\t _T(\"Done reading track %d.\"))\r\n\tTRSTR(SUCCESS_SCANTRACK /* 0x00b0 */,\t _T(\"Done scanning track %d.\"))\r\n\tTRSTR(SUCCESS_READDISC /* 0x00b1 */,\t _T(\"Done reading disc.\"))\t\t\t\t\t\t\t\t// FIXME: Obsolete.\r\n\r\n\t// Warning messages.\r\n\tTRSTR(WARNING_FIXATE /* 0x00b2 */,\t_T(\"Some drives don't like closing in simulation mode.\"))\t// FIXME: Obsolete.\r\n\r\n\t// Information messages.\r\n\tTRSTR(INFO_UNSUPERASEMODE /* 0x00b3 */, _T(\"Some recorders does not support all erase modes.\"))\t// FIXME: Obsolete.\r\n\tTRSTR(INFO_ERASERETRY /* 0x00b4 */, _T(\"You can try the erase entire disc method.\"))\t\t// FIXME: Obsolete.\r\n\r\n\t// Property page titles.\r\n\tTRSTR(TITLE_GENERAL /* 0x00b5 */,       _T(\"General\"))\r\n\tTRSTR(TITLE_ADVANCED /* 0x00b6 */,\t\t _T(\"Advanced\"))\r\n\tTRSTR(TITLE_FIELDS /* 0x00b7 */,\t\t _T(\"Fields\"))\r\n\tTRSTR(TITLE_AUDIO /* 0x00b8 */,\t\t _T(\"Audio\"))\r\n\tTRSTR(TITLE_CONFIGURATION /* 0x00b9 */, _T(\"Configuration\"))\r\n\tTRSTR(TITLE_LANGUAGE /* 0x00ba */,\t\t _T(\"Language\"))\r\n\tTRSTR(TITLE_SHELLEXT /* 0x00bb */,\t\t _T(\"Shell Extension\"))\r\n\r\n\t// Copy disc.\r\n\tTRSTR(COPYDISC_TITLE /* 0x00bc */, _T(\"Copy Disc\"))\r\n\r\n\t// Disc information.\r\n\tTRSTR(DISC_UNKNOWN /* 0x00bd */,             _T(\"Unknown\"))\r\n\tTRSTR(DISC_SEQUENTIAL /* 0x00be */,\t\t  _T(\"(sequential)\"))\r\n\tTRSTR(DISC_RESTRICTEDOVERWRITE /* 0x00bf */, _T(\"(restricted overwrite)\"))\r\n\tTRSTR(DISC_REVISION /* 0x00c0 */,\t\t\t  _T(\"revision\"))\r\n\tTRSTR(DISC_NOREGION /* 0x00c1 */,\t\t\t  _T(\"Not region protected\"))\r\n\tTRSTR(DISC_BLANK /* 0x00c2 */,\t\t\t\t  _T(\"blank\"))\r\n\tTRSTR(DISC_INCOMPLETE /* 0x00c3 */,\t\t  _T(\"incomplete\"))\r\n\tTRSTR(DISC_FIXATED /* 0x00c4 */,\t\t\t  _T(\"closed\"))\r\n\tTRSTR(DISC_RANDOMACCESS /* 0x00c5 */,\t\t  _T(\"random access\"))\r\n\tTRSTR(DISC_EMPTY /* 0x00c6 */,\t\t\t\t  _T(\"empty\"))\r\n\tTRSTR(DISC_RESERVED /* 0x00c7 */,\t\t\t  _T(\"reserved\"))\r\n\tTRSTR(DISC_COMPLETE /* 0x00c8 */,\t\t\t  _T(\"complete\"))\r\n\tTRSTR(DISC_NOT /* 0x00c9 */,\t\t\t\t  _T(\"not \"))\r\n\tTRSTR(DISC_STATUS /* 0x00ca */,\t\t\t  _T(\"The disc is %s, the last session is %s, the disc can %sbe erased.\"))\r\n\r\n\t// Miscellaneous.\r\n\tTRSTR(WARNING_DISCSIZE /* 0x00cb */, _T(\"The data may not fit on the current disc.\"))// FIXME: Obsolete.\r\n\tTRSTR(FAILURE_OPENSESSION /* 0x00cc */, _T(\"Could not open a new session.\"))\t\t\t// FIXME: Obsolete.\r\n\r\n\t// Added version 0.40.\r\n\tTRSTR(ERROR_LOADCODECS /* 0x00cd */, _T(\"An error occured while trying to load the installed codecs. Please make sure that the installed codecs are compatible with this version of InfraRecorder.\"))\r\n\tTRSTR(PROGRESS_DECODETRACKS /* 0x00ce */, _T(\"Decoding audio tracks.\"))\r\n\tTRSTR(ERROR_NODECODER /* 0x00cf */,\t   _T(\"Unable to find a suitable decoder for the audio file: %s.\"))\r\n\tTRSTR(ERROR_WAVECODEC /* 0x00d0 */,\t   _T(\"Unable to find the wave encoder. Please verify your codec configuration.\"))\r\n\tTRSTR(ERROR_CODECINIT /* 0x00d1 */,\t   _T(\"Failed to initialize the %s encoder (%d,%d,%d,%I64d).\"))\r\n\tTRSTR(ERROR_ENCODEDATA /* 0x00d2 */,\t   _T(\"Encoder failed, could not encode data.\"))\r\n\tTRSTR(SUCCESS_DECODETRACK /* 0x00d3 */,   _T(\"Decoded the audio file: %s.\"))\r\n\tTRSTR(ERROR_TARGETFOLDER /* 0x00d4 */,\t   _T(\"The selected target folder is invalid. Please select another target folder.\"))\r\n\tTRSTR(SUCCESS_ENCODETRACK /* 0x00d5 */,   _T(\"Encoded the audio file: %s.\"))\r\n\tTRSTR(PROGRESS_ENCODETRACK /* 0x00d6 */,  _T(\"Encoding track (%s).\"))\r\n\r\n\t// Added version 0.41.\r\n\tTRSTR(ERROR_FIFOSIZE /* 0x00d7 */,\t\t\t\t  _T(\"Invalid FIFO buffer size. The size must be at least %i MiB and at most %i MiB.\"))\r\n\tTRSTR(PROJECTPROP_ISOLEVEL4 /* 0x00d8 */,\t\t  _T(\"Level 4 (ISO-9660 version 2)\"))\r\n\tTRSTR(WARNING_CLONEWRITEMETHOD /* 0x00d9 */,\t  _T(\"It's recommended to write a cloned disc using the raw96r or raw16 write method. The selected recorder supports none of these modes.\"))\r\n\tTRSTR(TITLE_READ /* 0x00da */,\t\t\t\t\t  _T(\"Read\"))\r\n\tTRSTR(MISC_AUTO /* 0x00db */,\t\t\t\t\t  _T(\"Automatic\"))\r\n\tTRSTR(COPYIMAGE_TITLE /* 0x00dc */,\t\t\t  _T(\"Copy to Disc Image\"))\r\n\tTRSTR(INFO_COPYDISC /* 0x00dd */,\t\t\t\t  _T(\"Audio discs and multi-session discs must be copied in clone mode to be copied correctly. Please note that it's not possible to clone a disc on the fly.\"))\r\n\tTRSTR(INFO_RAWIMAGE /* 0x00de */,\t\t\t\t  _T(\"The selected disc image seems to include a TOC-file. It's recommended that you record images that includes a TOC and sub-channel data using a raw write method. InfraRecorder will automatically suggest one for you.\"))\r\n\tTRSTR(PROGRESS_BEGINESTIMAGESIZE /* 0x00df */,\t  _T(\"Started to estimate file system size.\"))\r\n\tTRSTR(SUCCESS_ESTIMAGESIZE /* 0x00e0 */,\t\t  _T(\"Done estimating file system size (%I64d sectors).\"))\r\n\tTRSTR(ERROR_ESTIMAGESIZE /* 0x00e1 */,\t\t\t  _T(\"An error occured while estimating the file system size. Can not continue.\"))\r\n\tTRSTR(PROGRESS_ESTIMAGESIZE /* 0x00e2 */,\t\t  _T(\"Estimating file system size.\"))\r\n\tTRSTR(SPACEMETER_USED /* 0x00e3 */,\t\t\t  _T(\"Used: \"))\r\n\tTRSTR(SPACEMETER_FREE /* 0x00e4 */,\t\t\t  _T(\"Free: \"))\r\n\tTRSTR(ADVPROP_SAO /* 0x00e5 */,\t\t\t\t  _T(\"Write in session-at-once (SAO) mode\"))\r\n\tTRSTR(ADVPROP_TAO /* 0x00e6 */,\t\t\t\t  _T(\"Write in track-at-once (TAO) mode\"))\r\n\tTRSTR(ADVPROP_RAW96R /* 0x00e7 */,\t\t\t\t  _T(\"Write in raw96r mode\"))\r\n\tTRSTR(ADVPROP_RAW16 /* 0x00e8 */,\t\t\t\t  _T(\"Write in raw16 mode\"))\r\n\tTRSTR(ADVPROP_RAW96P /* 0x00e9 */,\t\t\t\t  _T(\"Write in raw96p mode\"))\r\n\tTRSTR(INFO_WRITESPEED /* 0x00ea */,\t\t\t  _T(\"This option should only be changed when InfraRecorder has detected the wrong write speeds. It does not allow your recorder to write faster than its specification or faster than the media allows.\"))\r\n\tTRSTR(TITLE_BOOT /* 0x00eb */,\t\t\t\t\t  _T(\"Boot\"))\r\n\tTRSTR(ERROR_NUMBOOTIMAGES /* 0x00ec */,\t\t  _T(\"You can't add more boot images. The maximum number of allowed boot images in one project is 63.\"))\r\n\tTRSTR(BOOTEMU_NONE /* 0x00ed */,\t\t\t\t  _T(\"None\"))\r\n\tTRSTR(BOOTEMU_FLOPPY /* 0x00ee */,\t\t\t\t  _T(\"Floppy\"))\r\n\tTRSTR(BOOTEMU_HARDDISK /* 0x00ef */,\t\t\t  _T(\"Hard disk\"))\r\n\tTRSTR(COLUMN_EMULATION /* 0x00f0 */,\t\t\t  _T(\"Emulation\"))\r\n\tTRSTR(TITLE_EDITBOOTIMAGE /* 0x00f1 */,\t\t  _T(\"Edit Boot Image\"))\r\n\r\n\t// Added version 0.42.\r\n\tTRSTR(PROJECT_DVDVIDEO /* 0x00f2 */,         _T(\"DVD-Video Project\"))\r\n\tTRSTR(WARNING_OLDPROJECT /* 0x00f3 */,\t\t  _T(\"The project you are trying to open is created by an older version of InfraRecorder. It might not open correctly.\"))\r\n\tTRSTR(MISC_SPECIFYDVDFOLDER /* 0x00f4 */,\t  _T(\"Please select the folder that contains all the DVD-files that you want to record. The folder should include a subfolder named VIDEO_TS:\"))\r\n\tTRSTR(ERROR_INVALIDDVDFOLDER /* 0x00f5 */,\t  _T(\"The selected folder does not contain a valid DVD-Video file structure (the folder VIDEO_TS is missing). Please select another folder.\"))\r\n\tTRSTR(FAILURE_WRITELEADIN /* 0x00f6 */,\t  _T(\"A write error occurred. Failed to write lead-in.\"))\t\t// FIXME: Obsolete.\r\n\tTRSTR(FAILURE_INITDRIVE /* 0x00f7 */,\t\t  _T(\"Failed to initialize the recorder.\"))\t\t\t\t\t// FIXME: Obsolete.\r\n\tTRSTR(FAILURE_DVDRWDUMMY /* 0x00f8 */,\t\t  _T(\"DVD+RW discs can not be written in simulation mode.\"))// FIXME: Obsolete.\r\n\tTRSTR(PROGRESS_RELOADMEDIA /* 0x00f9 */,\t  _T(\"Reloading media.\"))\r\n\tTRSTR(STATUS_VERIFY /* 0x00fa */,\t\t\t  _T(\"Verifying '%s'.\"))\r\n\tTRSTR(SUCCESS_VERIFY /* 0x00fb */,\t\t\t  _T(\"Done verifying disc. No errors found.\"))\r\n\tTRSTR(FAILURE_VERIFY /* 0x00fc */,\t\t\t  _T(\"Done verifying disc, %d read error(s) occured.\"))\r\n\tTRSTR(PROGRESS_BEGINVERIFY /* 0x00fd */,\t  _T(\"Started disc verification.\"))\r\n\tTRSTR(FAILURE_VERIFYNOFILE /* 0x00fe */,\t  _T(\"The file '%s' could not be found on the disc.\"))\r\n\tTRSTR(FAILURE_VERIFYREADERROR /* 0x00ff */,  _T(\"Read error in '%s' (0x%.8X != 0x%.8X).\"))\r\n\r\n\tTRSTR(STRINGTABLE_PLACEHOLDER1 = 0x0100, _T(\"\"))\r\n\tTRSTR(STRINGTABLE_PLACEHOLDER2 = 0x0101, _T(\"\"))\r\n\tTRSTR(STRINGTABLE_PLACEHOLDER3 = 0x0102, _T(\"\"))\r\n\r\n\t// Added version 0.43.\r\n\tTRSTR(DRIVELETTER_TITLE /* 0x0103 */,        _T(\"Drive Letter of %s %s %s\"))\r\n\tTRSTR(FORMATMODE_QUICK /* 0x0104 */,\t\t  _T(\"Quick format\"))\r\n\tTRSTR(FORMATMODE_FULL /* 0x0105 */,\t\t  _T(\"Full format\"))\r\n\tTRSTR(MEDIA_INSERT /* 0x0106 */,\t\t\t  _T(\"(please insert a disc)\"))\r\n\tTRSTR(MEDIA_UNSUPPORTED /* 0x0107 */,\t\t  _T(\"(unsupported media)\"))\r\n\tTRSTR(STATUS_FORMAT /* 0x0108 */,\t\t\t  _T(\"Formatting disc.\"))\r\n\tTRSTR(STATUS_FORMATBKGND /* 0x0109 */,\t\t  _T(\"Formatting disc in background.\"))\r\n\tTRSTR(STATUS_CLOSETRACK /* 0x010a */,\t\t  _T(\"Closing track.\"))\r\n\tTRSTR(PROGRESS_BEGINFORMAT /* 0x010b */,\t  _T(\"Started to format disc in %s mode.\"))\r\n\tTRSTR(FAILURE_FORMAT /* 0x010c */,\t\t\t  _T(\"Could not format the disc.\"))\r\n\tTRSTR(FAILURE_STOPBKGNDFORMAT /* 0x010d */,  _T(\"Could not stop the background format process.\"))\r\n\tTRSTR(SUCCESS_FORMAT /* 0x010e */,\t\t\t  _T(\"The disc was successfully formatted.\"))\r\n\r\n\t// Added version 0.44.\r\n\tTRSTR(STATUS_REREADSECTOR /* 0x010f */,       _T(\"Reading sector %u (retry %u of %u).\"))\r\n\tTRSTR(STATUS_READTRACK2 /* 0x0110 */,\t\t   _T(\"Reading disc at %.1fx speed.\"))\r\n\tTRSTR(ERROR_MOVESAMESRCDST /* 0x0111 */,\t   _T(\"The destination folder is a subfolder of the source folder.\"))\r\n\tTRSTR(MISC_MODIFIED /* 0x0112 */,\t\t\t   _T(\"modified:\"))\r\n\tTRSTR(ERROR_EXISTINGFILENAME /* 0x0113 */,\t   _T(\"The destination folder already contains a file or folder named '%s'.\"))\r\n\tTRSTR(TBCUSTOMIZE_TEXTOPTIONS /* 0x0114 */,   _T(\"Text options:\"))\r\n\tTRSTR(TBCUSTOMIZE_ICONOPTIONS /* 0x0115 */,   _T(\"Icon options:\"))\r\n\tTRSTR(TBCUSTOMIZE_SHOWTEXT /* 0x0116 */,\t   _T(\"Show text labels\"))\r\n\tTRSTR(TBCUSTOMIZE_SHOWTEXTRIGHT /* 0x0117 */, _T(\"Selective text on right\"))\r\n\tTRSTR(TBCUSTOMIZE_NOTEXT /* 0x0118 */,\t\t   _T(\"No text labels\"))\r\n\tTRSTR(TBCUSTOMIZE_ICONSMALL /* 0x0119 */,\t   _T(\"Small icons\"))\r\n\tTRSTR(TBCUSTOMIZE_ICONLARGE /* 0x011a */,\t   _T(\"Large icons\"))\r\n\tTRSTR(TOOLBAR_OPEN /* 0x011b */,\t\t\t   _T(\"Open\"))\r\n\tTRSTR(TOOLBAR_SAVE /* 0x011c */,\t\t\t   _T(\"Save\"))\r\n\tTRSTR(TOOLBAR_PROJECTPROPERTIES /* 0x011d */, _T(\"Properties\"))\r\n\tTRSTR(TOOLBAR_EXIT /* 0x011e */,\t\t\t   _T(\"Exit\"))\r\n\tTRSTR(TOOLBAR_BURNCOMPILATION /* 0x011f */,   _T(\"Burn Project\"))\r\n\tTRSTR(TOOLBAR_BURNIMAGE /* 0x0120 */,\t\t   _T(\"Burn Image\"))\r\n\tTRSTR(TOOLBAR_COPY /* 0x0121 */,\t\t\t   _T(\"Copy\"))\r\n\tTRSTR(TOOLBAR_TRACKS /* 0x0122 */,\t\t\t   _T(\"Tracks\"))\r\n\tTRSTR(TOOLBAR_ERASE /* 0x0123 */,\t\t\t   _T(\"Erase\"))\r\n\tTRSTR(TOOLBAR_FIXATE /* 0x0124 */,\t\t\t   _T(\"Close\"))\r\n\tTRSTR(TOOLBAR_LOG /* 0x0125 */,\t\t\t   _T(\"Log\"))\r\n\tTRSTR(TOOLBAR_CONFIGURATION /* 0x0126 */,\t   _T(\"Configuration\"))\r\n\tTRSTR(TOOLBAR_DEVICES /* 0x0127 */,\t\t   _T(\"Devices\"))\r\n\tTRSTR(TOOLBAR_HELP /* 0x0128 */,\t\t\t   _T(\"Help\"))\r\n\tTRSTR(TOOLBAR_ABOUT /* 0x0129 */,\t\t\t   _T(\"About\"))\r\n\tTRSTR(STRINGTABLE_PLACEHOLDER4 /* 0x012a */,\t\t   _T(\"\"))\r\n\tTRSTR(MEDIA_INSERTBLANK /* 0x012b */,\t\t   _T(\"(please insert a blank disc)\"))\r\n\tTRSTR(INFO_INSERTBLANK /* 0x012c */,\t\t   _T(\"Please insert the blank disc which should be recorded.\"))\r\n\tTRSTR(INFO_INSERTSOURCE /* 0x012d */,\t\t   _T(\"Please insert the source disc that should be copied.\"))\r\n\tTRSTR(WARNING_NOFIXATION /* 0x012e */,\t\t   _T(\"Please note that disabling the closing step does not create a multi-session disc. Please see the help documentation for more information.\"))\r\n\r\n\t// Added version 0.45.\r\n\tTRSTR(INFO_RELOAD /* 0x012f */,          _T(\"Unable to automatically reload the media. Please try to reload it manually, and then press OK.\"))\r\n\tTRSTR(PROGRESS_FAILED /* 0x0130 */,\t  _T(\"Operation failed.\"))\r\n\tTRSTR(FAILURE_CREATEIMAGE /* 0x0131 */,  _T(\"Failed to create disc image.\"))\r\n\tTRSTR(TITLE_FILESYSTEM /* 0x0132 */,\t  _T(\"File System\"))\r\n\tTRSTR(ERROR_IMPORTSESSION /* 0x0133 */,  _T(\"Unable to import session, could not list disc contents.\"))\r\n\tTRSTR(MISC_SESSION /* 0x0134 */,\t\t  _T(\"Session\"))\r\n\tTRSTR(MISC_TRACK /* 0x0135 */,\t\t\t  _T(\"track\"))\r\n\tTRSTR(MISC_MODE /* 0x0136 */,\t\t\t  _T(\"mode\"))\r\n\tTRSTR(MISC_ERASENONEMPTY /* 0x0137 */,\t  _T(\"The inserted disc does not appear to be empty, do you want to erase it first?\"))\r\n\tTRSTR(WARNING_IMPORTFS /* 0x0138 */,\t  _T(\"Multi-session discs require an ISO9660 file system (without any additional file systems). Do you want InfraRecorder to change your project to use this file system and continue?\"))\r\n\tTRSTR(STITLE_VERIFYDISC /* 0x0139 */,\t  _T(\"Verifying Disc\"))\r\n\r\n\t// Added version 0.46.\r\n\tTRSTR(ERROR_NUMCOPIES /* 0x013a */, _T(\"Invalid number of copies. Please specify a number larger than zero.\"))\r\n\tTRSTR(INFO_NEXTCOPY /* 0x013b */, _T(\"Please insert a new blank disc to create another copy.\"))\r\n\tTRSTR(INFO_CREATECOPY /* 0x013c */, _T(\"Creating copy %d of %d.\"))\r\n\r\n\t// Added version 0.50.\r\n\tTRSTR(ERROR_PROJECT_IMPORT /* 0x013d */, _T(\"Unable to import, does the selected source file exist?\"))\r\n\tTRSTR(ERROR_PROJECT_IMPORT_FILE /* 0x013e */, _T(\"Could not import the file \\\"%s\\\".\"))\r\n\tTRSTR(COLUMN_DRIVE /* 0x013f */, _T(\"Drive\"))\r\n\tTRSTR(CONFIRM_CREATE_DIR_PATH /* 0x0140 */, _T(\"Directory \\\"%s\\\" does not exist. Do you want it to be created?\" ))\r\n\tTRSTR(CANNOT_CREATE_DIR_PATH  /* 0x0141 */, _T(\"Cannot create directory \\\"%s\\\".\" ))\r\n\tTRSTR(WARNING_MISSPROJFILE /* 0x0142 */, _T(\"The project file \\\"%s\\\" could not be found on your computer. It will be removed from the project.\"))\r\n\tTRSTR(WARNING_NODEVICES /* 0x0143 */, _T(\"InfraRecorder was unable to find any disc devices in your system.\\n\\nPlease note that Windows 2000, XP and 2003 systems require administrator permissions to access disc devices. Often this can be circumvented by changing your system settings. Please consult the InfraRecorder FAQ in the manual for further information.\"))\r\n\r\n\t// Added version 0.53.\r\n\tTRSTR(STITLE_PREPOPERATION /* 0x0144 */, _T(\"Preparing Operation\"))\r\n\tTRSTR(STATUS_GATHER_FILE_INFO /* 0x0145 */, _T(\"Gathering project file information.\"))\r\n    TRSTR(PROJECTPROP_ISO_CHARSET_ISO /* 0x0146 */, _T(\"ISO9660 (standard)\"))\r\n    TRSTR(WARNING_BAD_DVDVIDEO /* 0x00147 */, _T(\"InfraRecorder video projects requires the content to be in DVD-Video format. This does not appear to be the case. InfraRecorder could not find the required file: VIDEO_TS/VIDEO_TS.IFO.\\n\\nPlease convert any video files into DVD-Video format before burning them as video projects in InfraRecorder.\\n\\nDo you want to continue anyways?\"))\r\n    TRSTR(WARNING_EMPTY_PROJECT /* 0x00148 */, _T(\"You have no added any files to the current project. Do you want to continue, creating an empty file system?\"))"
  },
  {
    "path": "src/app/tree_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <queue>\r\n#include <base/string_util.hh>\r\n#include \"main_frm.hh\"\r\n#include \"string_table.hh\"\r\n#include \"temp_manager.hh\"\r\n#include \"settings.hh\"\r\n#include \"project_manager.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"audio_util.hh\"\r\n#include \"infrarecorder.hh\"\r\n#include \"tree_manager.hh\"\r\n\r\nCTreeManager g_TreeManager;\r\n\r\n/*\r\n    CItemData\r\n*/\r\nCItemData::CItemData()\r\n{\r\n    m_szFileName[0] = '\\0';\r\n    m_szFilePath[0] = '\\0';\r\n\r\n    m_pAudioData = NULL;\r\n    m_pIsoData = NULL;\r\n\r\n    szFullPath[0] = '\\0';\r\n    szFileType[0] = '\\0';\r\n    usFileDate = 0;\r\n    usFileTime = 0;\r\n    uiSize = 0;\r\n\r\n    /*uiTrackLength = 0;\r\n    szTrackTitle[0] = '\\0';\r\n    szTrackArtist[0] = '\\0';*/\r\n\r\n    ucFlags = 0;\r\n}\r\n\r\nCItemData::~CItemData()\r\n{\r\n    // Free any optional data.\r\n    if (m_pAudioData != NULL)\r\n    {\r\n        delete m_pAudioData;\r\n        m_pAudioData = NULL;\r\n    }\r\n\r\n    if (m_pIsoData != NULL)\r\n    {\r\n        delete m_pIsoData;\r\n        m_pIsoData = NULL;\r\n    }\r\n}\r\n\r\nvoid CItemData::FileNameChanged()\r\n{\r\n    /*if (ucFlags & PROJECTITEM_FLAG_ISBOOTIMAGE)\r\n    {\r\n        CProjectBootImage *pBootImage = g_ProjectSettings.GetBootImage(szFullPath);\r\n        if (pBootImage != NULL)\r\n        {\r\n            pBootImage->m_LocalName = m_szFileName;\r\n        }\r\n    }*/\r\n}\r\n\r\nvoid CItemData::FilePathChanged()\r\n{\r\n    /*if (ucFlags & PROJECTITEM_FLAG_ISBOOTIMAGE)\r\n    {\r\n        CProjectBootImage *pBootImage = g_ProjectSettings.GetBootImage(szFullPath);\r\n        if (pBootImage != NULL)\r\n        {\r\n            pBootImage->m_LocalPath = m_szFilePath;\r\n        }\r\n    }*/\r\n}\r\n\r\nvoid CItemData::SetFileName(const TCHAR *szFileName)\r\n{\r\n    lstrcpy(m_szFileName,szFileName);\r\n    FileNameChanged();\r\n}\r\n\r\nconst TCHAR *CItemData::GetFileName()\r\n{\r\n    return m_szFileName;\r\n}\r\n\r\nvoid CItemData::SetFilePath(const TCHAR *szFilePath)\r\n{\r\n    lstrcpy(m_szFilePath,szFilePath);\r\n    FilePathChanged();\r\n}\r\n\r\nconst TCHAR *CItemData::GetFilePath()\r\n{\r\n    return m_szFilePath;\r\n}\r\n\r\nTCHAR *CItemData::BeginEditFileName()\r\n{\r\n    return m_szFileName;\r\n}\r\n\r\nvoid CItemData::EndEditFileName()\r\n{\r\n    FileNameChanged();\r\n}\r\n\r\nTCHAR *CItemData::BeginEditFilePath()\r\n{\r\n    return m_szFilePath;\r\n}\r\n\r\nvoid CItemData::EndEditFilePath()\r\n{\r\n    FilePathChanged();\r\n}\r\n\r\nCItemData::CAudioData *CItemData::GetAudioData()\r\n{\r\n    if (m_pAudioData == NULL)\r\n        m_pAudioData = new CAudioData();\r\n\r\n    return m_pAudioData;\r\n}\r\n\r\nbool CItemData::HasAudioData()\r\n{\r\n    return m_pAudioData != NULL;\r\n}\r\n\r\nCItemData::CIsoData *CItemData::GetIsoData()\r\n{\r\n    if (m_pIsoData == NULL)\r\n        m_pIsoData = new CIsoData();\r\n    \r\n    return m_pIsoData;\r\n}\r\n\r\nbool CItemData::HasIsoData()\r\n{\r\n    return m_pIsoData != NULL;\r\n}\r\n\r\n/*\r\n    CProjectNode\r\n*/\r\nvoid CProjectNode::Sort(unsigned int uiSortColumn,bool bSortUp,bool bSortAudio)\r\n{\r\n    CChildComparator ChildComparator(uiSortColumn,bSortUp,bSortAudio);\r\n    CFileComparator FileComparator(uiSortColumn,bSortUp,bSortAudio);\r\n\r\n    m_Children.sort(ChildComparator);\r\n    m_Files.sort(FileComparator);\r\n}\r\n\r\n/*\r\n    CChildComparator\r\n*/\r\nbool CChildComparator::operator() (const CProjectNode *pSafeNode1,\r\n                                   const CProjectNode *pSafeNode2)\r\n{\r\n    CItemData *pItemData1,*pItemData2;\r\n\r\n    if (m_bSortUp)\r\n    {\r\n        pItemData1 = pSafeNode1->pItemData;\r\n        pItemData2 = pSafeNode2->pItemData;\r\n    }\r\n    else\r\n    {\r\n        pItemData1 = pSafeNode2->pItemData;\r\n        pItemData2 = pSafeNode1->pItemData;\r\n    }\r\n\r\n    switch (m_uiSortColumn)\r\n    {\r\n        case COLUMN_SUBINDEX_NAME:\r\n            return lstrcmp(pItemData1->GetFileName(),pItemData2->GetFileName()) < 0;\r\n\r\n        // No reason to sort these columns, they are all the same.\r\n        case COLUMN_SUBINDEX_TYPE:\r\n        case COLUMN_SUBINDEX_SIZE:\r\n            return false;\r\n\r\n        case COLUMN_SUBINDEX_MODIFIED:\r\n            FILETIME ftFileTime1,ftFileTime2;\r\n                DosDateTimeToFileTime(pItemData1->usFileDate,pItemData1->usFileTime,&ftFileTime1);\r\n                DosDateTimeToFileTime(pItemData2->usFileDate,pItemData2->usFileTime,&ftFileTime2);\r\n            return CompareFileTime(&ftFileTime1,&ftFileTime2) < 0;\r\n\r\n        case COLUMN_SUBINDEX_PATH:\r\n            return lstrcmp(pItemData1->GetFilePath(),pItemData2->GetFilePath()) < 0;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CFileComparator\r\n*/\r\nbool CFileComparator::operator() (const CItemData *pSafeItemData1,\r\n                                  const CItemData *pSafeItemData2)\r\n{\r\n    CItemData *pItemData1,*pItemData2;\r\n\r\n    if (m_bSortUp)\r\n    {\r\n        pItemData1 = (CItemData *)pSafeItemData1;\r\n        pItemData2 = (CItemData *)pSafeItemData2;\r\n    }\r\n    else\r\n    {\r\n        pItemData1 = (CItemData *)pSafeItemData2;\r\n        pItemData2 = (CItemData *)pSafeItemData1;\r\n    }\r\n\r\n    if (!m_bSortAudio)\r\n    {\r\n        switch (m_uiSortColumn)\r\n        {\r\n            case COLUMN_SUBINDEX_NAME:\r\n                return lstrcmp(pItemData1->GetFileName(),pItemData2->GetFileName()) < 0;\r\n\r\n            case COLUMN_SUBINDEX_TYPE:\r\n                return lstrcmp(pItemData1->szFileType,pItemData2->szFileType) < 0;\r\n\r\n            case COLUMN_SUBINDEX_MODIFIED:\r\n                FILETIME ftFileTime1,ftFileTime2;\r\n                    DosDateTimeToFileTime(pItemData1->usFileDate,pItemData1->usFileTime,&ftFileTime1);\r\n                    DosDateTimeToFileTime(pItemData2->usFileDate,pItemData2->usFileTime,&ftFileTime2);\r\n                return CompareFileTime(&ftFileTime1,&ftFileTime2) < 0;\r\n\r\n            case COLUMN_SUBINDEX_SIZE:\r\n                if (pItemData1->uiSize < pItemData2->uiSize)\r\n                    return true;\r\n                else\r\n                    return false;\r\n\r\n            case COLUMN_SUBINDEX_PATH:\r\n                return lstrcmp(pItemData1->GetFilePath(),pItemData2->GetFilePath()) < 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        switch (m_uiSortColumn)\r\n        {\r\n            case COLUMN_SUBINDEX_TRACK:\r\n                return true;\r\n\r\n            case COLUMN_SUBINDEX_TITLE:\r\n                {\r\n                    // If no title is specified the file name is displayed.\r\n                    const TCHAR *szTitle1 = pItemData1->GetAudioData()->szTrackTitle;\r\n                    if (szTitle1[0] == '\\0')\r\n                        szTitle1 = pItemData1->GetFileName();\r\n\r\n                    const TCHAR *szTitle2 = pItemData2->GetAudioData()->szTrackTitle;\r\n                    if (szTitle2[0] == '\\0')\r\n                        szTitle2 = pItemData2->GetFileName();\r\n\r\n                    return lstrcmp(szTitle1,szTitle2) < 0;\r\n                }\r\n\r\n            case COLUMN_SUBINDEX_LENGTH:\r\n                if (pItemData1->GetAudioData()->uiTrackLength < pItemData2->GetAudioData()->uiTrackLength)\r\n                    return true;\r\n                else\r\n                    return false;\r\n\r\n            case COLUMN_SUBINDEX_LOCATION:\r\n                return lstrcmp(pItemData1->szFullPath,pItemData2->szFullPath) < 0;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CTreeManager\r\n*/\r\nCTreeManager::CTreeManager()\r\n{\r\n    m_pTreeView = NULL;\r\n    m_pListView = NULL;\r\n}\r\n\r\nCTreeManager::~CTreeManager()\r\n{\r\n    // Destroy the tree if it hasn't been destroyed.\r\n    DestroyTree();\r\n}\r\n\r\nvoid CTreeManager::AssignControls(CTreeViewCtrlEx *pTreeView,CListViewCtrl *pListView)\r\n{\r\n    m_pTreeView = pTreeView;\r\n    m_pListView = pListView;\r\n}\r\n\r\nHTREEITEM CTreeManager::AddTreeNode(HTREEITEM hParentItem,CProjectNode *pNode)\r\n{\r\n    TV_ITEM tvItem = { 0 };\r\n    TV_INSERTSTRUCT tvInsert = { 0 };\r\n\r\n    tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n    tvItem.pszText = LPSTR_TEXTCALLBACK;\r\n    tvItem.iImage = PROJECTTREE_IMAGEINDEX_FOLDER;\r\n    tvItem.lParam = (LPARAM)pNode;\r\n    tvItem.cChildren = false;\r\n\r\n    tvInsert.item = tvItem;\r\n    tvInsert.hInsertAfter = TVI_LAST;\r\n    tvInsert.hParent = hParentItem;\r\n\r\n    HasChildren(hParentItem,true);\r\n\r\n    // Insert the tree item.\r\n    pNode->m_hTreeItem = m_pTreeView->InsertItem(&tvInsert);\r\n    return pNode->m_hTreeItem;\r\n}\r\n\r\nHTREEITEM CTreeManager::GetTreeChildFromParent(HTREEITEM hParentItem,TCHAR *szText)\r\n{\r\n    HTREEITEM hItem = m_pTreeView->GetChildItem(hParentItem);\r\n\r\n    while (hItem)\r\n    {\r\n        CProjectNode *pNode = (CProjectNode *)m_pTreeView->GetItemData(hItem);\r\n\r\n        if (pNode)\r\n        {\r\n            if (!lstrcmp(pNode->pItemData->GetFileName(),szText))\r\n                return hItem;\r\n        }\r\n\r\n        hItem = m_pTreeView->GetNextVisibleItem(hItem);\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool CTreeManager::HasChildren(HTREEITEM hItem,bool bHasChildren)\r\n{\r\n    TVITEM tvItem = { 0 };\r\n    tvItem.hItem = hItem;\r\n    tvItem.mask = TVIF_CHILDREN;\r\n    m_pTreeView->GetItem(&tvItem);\r\n\r\n    tvItem.cChildren = bHasChildren;\r\n\r\n    if (SUCCEEDED(m_pTreeView->SetItem(&tvItem)))\r\n        return true;\r\n\r\n    return false;\r\n}\r\n\r\nCProjectNode *CTreeManager::GetDirFromParent(CProjectNode *pParent,const TCHAR *szName)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParent->m_Children.begin(); itNodeObject != pParent->m_Children.end(); itNodeObject++)\r\n    {\r\n        CProjectNode *pChild = *itNodeObject;\r\n\r\n        if (!lstrcmp(pChild->pItemData->GetFileName(),szName))\r\n            return pChild;\r\n    }\r\n\r\n    return m_pRootNode;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetNodeFromPath\r\n    -----------------------------\r\n    Returns the CProjectNode that corresponds to the specified path.\r\n*/\r\nCProjectNode *CTreeManager::GetNodeFromPath(const TCHAR *szPath)\r\n{\r\n    int iLastDelimiter = 0;\r\n    CProjectNode *pCurrentNode = m_pRootNode;\r\n\r\n    for (int i = 0; i < lstrlen(szPath); i++)\r\n    {\r\n        if (szPath[i] == '\\\\' || szPath[i] == '/')\r\n        {\r\n            TCHAR *szSubPath = SubString(szPath,iLastDelimiter,i - iLastDelimiter);\r\n                pCurrentNode = GetDirFromParent(pCurrentNode,szSubPath);\r\n            delete [] szSubPath;\r\n\r\n            iLastDelimiter = i + 1;\r\n        }\r\n    }\r\n\r\n    // UPDATE: 2007-02-01\r\n    //return pCurrentNode;\r\n    return pCurrentNode == m_pRootNode ? NULL : pCurrentNode;\r\n}\r\n\r\nCProjectNode *CTreeManager::AddPath(const TCHAR *szPath)\r\n{\r\n    CProjectNode *pFoundNode = GetNodeFromPath(szPath);\r\n    if (pFoundNode != NULL)\r\n        return pFoundNode;\r\n\r\n    return NodalizePath(szPath);\r\n}\r\n\r\n/*\r\n    FIXME: The following function is very similar to GetDirFromParent.\r\n*/\r\nCProjectNode *CTreeManager::GetChildFromParent(CProjectNode *pParentNode,const TCHAR *szText)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParentNode->m_Children.begin(); itNodeObject != pParentNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        CProjectNode *pChildNode = *itNodeObject;\r\n\r\n        if (pChildNode)\r\n        {\r\n            if (!lstrcmp(pChildNode->pItemData->GetFileName(),szText))\r\n                return pChildNode;\r\n        }\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nCProjectNode *CTreeManager::NodalizePath(const TCHAR *szPath)\r\n{\r\n    CProjectNode *pParentNode = m_pRootNode;\r\n    HTREEITEM hParentTreeNode = m_pRootNode->m_hTreeItem;\r\n\r\n    int iLastDelimiter = 1;\r\n    int iPathLength = lstrlen(szPath);\r\n\r\n    // The first character should always be '\\\\' or '/'.\r\n    for (int i = 1; i < iPathLength; i++)\r\n    {\r\n        if (szPath[i] == '\\\\' || szPath[i] == '/')\r\n        {\r\n            TCHAR *szText = SubString(szPath,iLastDelimiter,i - iLastDelimiter);\r\n            CProjectNode *pTemp = GetChildFromParent(pParentNode,szText);\r\n\r\n            // Local tree item.\r\n            HTREEITEM hTreeTemp = NULL;\r\n            if (m_pTreeView != NULL)\r\n                hTreeTemp = GetTreeChildFromParent(hParentTreeNode,szText);\r\n\r\n            // Create the new node.\r\n            if (pTemp == NULL)\r\n            {\r\n                CProjectNode *pChildNode = new CProjectNode(pParentNode);\r\n\r\n                // Item text.\r\n                pChildNode->pItemData->SetFileName(szText);\r\n\r\n                // Get the system icon index.\r\n                SHFILEINFO shFileInfo;\r\n\r\n                // HACK: Force a folder icon to be used.\r\n                if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n                    sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME))\r\n                {\r\n                    pChildNode->iIconIndex = shFileInfo.iIcon;\r\n                    lstrcpy(pChildNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n                }\r\n\r\n                TCHAR *szFilePath = pChildNode->pItemData->BeginEditFilePath();\r\n                lstrcpy(szFilePath,pParentNode->pItemData->GetFilePath());\r\n                lstrcat(szFilePath,pParentNode->pItemData->GetFileName());\r\n                lstrcat(szFilePath,_T(\"/\"));\r\n                pChildNode->pItemData->EndEditFilePath();\r\n\r\n                pParentNode->m_Children.push_back(pChildNode);\r\n                pParentNode = pChildNode;\r\n\r\n                // Local tree item.\r\n                if (m_pTreeView != NULL)\r\n                    hParentTreeNode = AddTreeNode(hParentTreeNode,pChildNode);\r\n            }\r\n            else\r\n            {\r\n                pParentNode = pTemp;\r\n\r\n                // Local tree item.\r\n                hParentTreeNode = hTreeTemp;\r\n            }\r\n\r\n            iLastDelimiter = i + 1;\r\n            delete [] szText;\r\n        }\r\n    }\r\n\r\n    return pParentNode;\r\n}\r\n\r\nvoid CTreeManager::ListNode(CProjectNode *pNode)\r\n{\r\n    unsigned int uiItemCount = 0;\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        // Add the item to the listview.\r\n        LVITEM lvi = { 0 };\r\n        lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;\r\n\r\n        lvi.iItem = uiItemCount++;\r\n        lvi.iSubItem = 0;\r\n        lvi.pszText = LPSTR_TEXTCALLBACK;\r\n        lvi.cchTextMax = MAX_PATH - 1;\r\n        lvi.iImage = I_IMAGECALLBACK;\r\n        lvi.lParam = (LPARAM)((CProjectNode *)*itNodeObject)->pItemData;\r\n\r\n        m_pListView->InsertItem(&lvi);\r\n    }\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        // Add the item to the listview.\r\n        LVITEM lvi = { 0 };\r\n        lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;\r\n\r\n        lvi.iItem = uiItemCount++;\r\n        lvi.iSubItem = 0;\r\n        lvi.pszText = LPSTR_TEXTCALLBACK;\r\n        lvi.cchTextMax = MAX_PATH - 1;\r\n        lvi.iImage = I_IMAGECALLBACK;\r\n        lvi.lParam = (LPARAM)*itFileObject;\r\n\r\n        m_pListView->InsertItem(&lvi);\r\n    }\r\n}\r\n\r\nvoid CTreeManager::SelectPath(const TCHAR *szPath)\r\n{\r\n    int iLastDelimiter = 0;\r\n    CProjectNode *pCurrentNode = m_pRootNode;\r\n\r\n    m_pListView->DeleteAllItems();\r\n\r\n    for (int i = 0; i < lstrlen(szPath); i++)\r\n    {\r\n        if (szPath[i] == '\\\\' || szPath[i] == '/')\r\n        {\r\n            TCHAR *szTempPath = SubString(szPath,iLastDelimiter,i - iLastDelimiter);\r\n            pCurrentNode = GetDirFromParent(pCurrentNode,szTempPath);\r\n            delete [] szTempPath;\r\n\r\n            iLastDelimiter = i + 1;\r\n        }\r\n    }\r\n\r\n    ListNode(pCurrentNode);\r\n\r\n    // Copy the path to m_szCurrentPath.\r\n    if (pCurrentNode == m_pRootNode)\r\n        lstrcpy(m_szCurrentPath,_T(\"/\"));\r\n    else\r\n        lstrcpy(m_szCurrentPath,szPath);\r\n\r\n    m_pCurrentNode = pCurrentNode;\r\n\r\n    // FIXME: Sort the list view.\r\n    /*tSortData SortData;\r\n    SortData.iSubItem = g_MainFrame->m_ListViewHeader.m_iSortCol;\r\n    SortData.bSortUp = g_MainFrame->m_ListViewHeader.m_bSortUp;\r\n\r\n    g_MainFrame->m_ListView.SortItemsEx(g_MainFrame->MainListViewCompareProc,(LPARAM)&SortData);*/\r\n}\r\n\r\nvoid CTreeManager::Refresh()\r\n{\r\n    m_pListView->DeleteAllItems();\r\n\r\n    ListNode(m_pCurrentNode);\r\n\r\n    m_pTreeView->Expand(m_pRootNode->m_hTreeItem);\r\n}\r\n\r\nvoid CTreeManager::CreateTree(const TCHAR *szRootName,int iImage)\r\n{\r\n    // We need to make sure that any previous tree is destroyed.\r\n    DestroyTree();\r\n\r\n    // Allocate memory for a new root node.\r\n    m_pRootNode = new CProjectNode(NULL);\r\n    m_pRootNode->iIconIndex = iImage;\r\n    m_pRootNode->pItemData->ucFlags |= PROJECTITEM_FLAG_ISPROJECTROOT;\r\n\r\n    if (m_pTreeView != NULL)\r\n    {\r\n        TV_ITEM tvRootNode = { 0 };\r\n        TV_INSERTSTRUCT tvInsert = { 0 };\r\n\r\n        // Set the tree view item parameters.\r\n        tvRootNode.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n        tvRootNode.lParam = (LPARAM)m_pRootNode;\r\n        tvRootNode.pszText = (TCHAR *)szRootName;\r\n        tvRootNode.iImage = tvRootNode.iSelectedImage = iImage;\r\n        tvRootNode.cChildren = false;\r\n\r\n        tvInsert.item = tvRootNode;\r\n        tvInsert.hInsertAfter = TVI_LAST;\r\n\r\n        // Insert the item to the tree, select it and then expand it.\r\n        m_pRootNode->m_hTreeItem = m_pTreeView->InsertItem(&tvInsert);\r\n\r\n        // Finally we select the root node.\r\n        m_pTreeView->SelectItem(m_pRootNode->m_hTreeItem);\r\n    }\r\n\r\n    // Initialize the paths.\r\n    m_szCurrentPath[0] = '/';\r\n    m_szCurrentPath[1] = '\\0';\r\n    m_pCurrentNode = m_pRootNode;\r\n}\r\n\r\nCProjectNode *CTreeManager::InsertVirtualRoot(const TCHAR *szNodeName,int iImage)\r\n{\r\n    // Allocate memory for a new node.\r\n    CProjectNode *pNode = new CProjectNode(m_pRootNode);\r\n    pNode->iIconIndex = iImage;\r\n    pNode->pItemData->SetFileName(szNodeName);\r\n    pNode->pItemData->SetFilePath(_T(\"/\"));\r\n    pNode->pItemData->ucFlags |= PROJECTITEM_FLAG_ISPROJECTROOT;\r\n\r\n    m_pRootNode->m_Children.push_back(pNode);\r\n\r\n    if (m_pTreeView != NULL)\r\n    {\r\n        TV_ITEM tvNode = { 0 };\r\n        TV_INSERTSTRUCT tvInsert = { 0 };\r\n\r\n        // Set the tree view item parameters.\r\n        tvNode.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n        tvNode.lParam = (LPARAM)pNode;\r\n        tvNode.pszText = (TCHAR *)szNodeName;\r\n        tvNode.iImage = tvNode.iSelectedImage = iImage;\r\n        tvNode.cChildren = false;\r\n\r\n        tvInsert.item = tvNode;\r\n        tvInsert.hInsertAfter = TVI_LAST;\r\n        tvInsert.hParent = m_pRootNode->m_hTreeItem;\r\n\r\n        // Insert the item to the tree, select it and then expand it.\r\n        pNode->m_hTreeItem = m_pTreeView->InsertItem(&tvInsert);\r\n\r\n        HasChildren(m_pRootNode->m_hTreeItem,true);\r\n        m_pTreeView->Expand(m_pRootNode->m_hTreeItem);\r\n    }\r\n\r\n    return pNode;\r\n}\r\n\r\nvoid CTreeManager::DestroyTree()\r\n{\r\n    // If the root node hasn't yet been free we free it.\r\n    if (m_pRootNode)\r\n    {\r\n        delete m_pRootNode;\r\n        m_pRootNode = NULL;\r\n    }\r\n}\r\n\r\nvoid CTreeManager::RebuildLocalPaths(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack)\r\n{\r\n    TCHAR szPath[MAX_PATH];\r\n    lstrcpy(szPath,pNode->pItemData->GetFilePath());\r\n    lstrcat(szPath,pNode->pItemData->GetFileName());\r\n    lstrcat(szPath,_T(\"/\"));\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        (*itNodeObject)->pItemData->SetFilePath(szPath);\r\n\r\n        FolderStack.push_back(*itNodeObject);\r\n    }\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n        (*itFileObject)->SetFilePath(szPath);\r\n}\r\n\r\nvoid CTreeManager::RebuildPaths(const TCHAR *szStartPath)\r\n{\r\n    CProjectNode *pCurNode = GetNodeFromPath(szStartPath);\r\n\r\n    std::vector<CProjectNode *> FolderStack;\r\n    RebuildLocalPaths(pCurNode,FolderStack);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        RebuildLocalPaths(pCurNode,FolderStack);\r\n    }\r\n}\r\n\r\nbool CTreeManager::RemoveEntry(CProjectNode *pNode)\r\n{\r\n    HTREEITEM hParentItem = m_pTreeView->GetParentItem(pNode->m_hTreeItem);\r\n    if (!hParentItem)\r\n        return false;\r\n\r\n    // If the item we're deleting is the current directory we need to update\r\n    // the current directory to the parent.\r\n    if (pNode == m_pCurrentNode)\r\n        m_pTreeView->SelectItem(hParentItem);\r\n\r\n    // Remove the node from the path list.\r\n    TCHAR szFullName[MAX_PATH];\r\n    lstrcpy(szFullName,pNode->pItemData->GetFilePath());\r\n    lstrcat(szFullName,pNode->pItemData->GetFileName());\r\n\r\n    // Delete the node.\r\n    m_pTreeView->DeleteItem(pNode->m_hTreeItem);\r\n\r\n    CProjectNode *pParent = (CProjectNode *)m_pTreeView->GetItemData(hParentItem);\r\n    pParent->m_Children.remove(pNode);\r\n    delete pNode;\r\n\r\n    if (pParent->m_Children.size() == 0)\r\n        HasChildren(pParent->m_hTreeItem,false);\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CTreeManager::RemoveEntry\r\n    -------------------------\r\n    Removes the child or file entry in pNode that points to the same data as\r\n    the pItemData pointer. It returns true if the item was found, otherwise false.\r\n    All data associated with the pItemData object will be deallocated.\r\n*/\r\nbool CTreeManager::RemoveEntry(CProjectNode *pNode,CItemData *pItemData)\r\n{\r\n    // Look for matching nodes.\r\n    CProjectNode *pFoundNode = NULL;\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        if ((*itNodeObject)->pItemData == pItemData)\r\n        {\r\n            pFoundNode = *itNodeObject;\r\n            break;\r\n        }\r\n    }\r\n\r\n    // It's not safe to remove the node from the iterating loop so we need\r\n    // to remove it here.\r\n    if (pFoundNode != NULL)\r\n    {\r\n        // Delete the node.\r\n        m_pTreeView->DeleteItem(pFoundNode->m_hTreeItem);\r\n\r\n        delete pFoundNode;\r\n        pNode->m_Children.remove(pFoundNode);\r\n\r\n        if (pNode->m_Children.size() == 0)\r\n            HasChildren(pNode->m_hTreeItem,false);\r\n\r\n        return true;\r\n    }\r\n\r\n    // If we have reached this far we know that the pItemData belongs to a file.\r\n    delete pItemData;\r\n    pNode->m_Files.remove(pItemData);\r\n\r\n    return true;\r\n}\r\n\r\nbool CTreeManager::RemoveEntry(const TCHAR *szLocalPath,const TCHAR *szFullPath)\r\n{\r\n    CProjectNode *pNode = GetNodeFromPath(szLocalPath);\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        if (!ComparePaths((*itFileObject)->szFullPath,szFullPath))\r\n            return RemoveEntry(pNode,(*itFileObject));\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CTreeManager::MoveEntry\r\n    -----------------------\r\n    Moves the item with the specified pItemData in the specified parent to the\r\n    new parent. The function returns true if successfull, false otherwise (the\r\n    only valid cause of a failure is when the destination folder is a subfolder\r\n    of the source folder).\r\n*/\r\nbool CTreeManager::MoveEntry(CProjectNode *pParent,CItemData *pItemData,CProjectNode *pNewParent)\r\n{\r\n    // Check if we are about to move a file or folder.\r\n    if (pItemData->ucFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n    {\r\n        // Locate the tree node accosiacted with the folder item.\r\n        CProjectNode *pItemNode = ResolveNode(pParent,pItemData);\r\n\r\n        // The node was not found.\r\n        if (pItemNode == NULL)\r\n            return false;\r\n\r\n        // Make sure that the destination folder is not a subfolder of the source folder.\r\n        if (IsSubNode(pItemNode,pNewParent))\r\n            return false;\r\n\r\n        pParent->m_Children.remove(pItemNode);\r\n        pNewParent->m_Children.push_back(pItemNode);\r\n\r\n        class CParentChild\r\n        {\r\n        public:\r\n            HTREEITEM m_hParent;\r\n            HTREEITEM m_hChild;\r\n\r\n            CParentChild(HTREEITEM hParent,HTREEITEM hChild)\r\n            {\r\n                m_hParent = hParent;\r\n                m_hChild = hChild;\r\n            }\r\n        };\r\n\r\n        // We need to remember the old node so we can delete it when we're done.\r\n        HTREEITEM hOldNode = pItemNode->m_hTreeItem;\r\n\r\n        std::queue<CParentChild> NodeQueue;\r\n        NodeQueue.push(CParentChild(pNewParent->m_hTreeItem,pItemNode->m_hTreeItem));\r\n\r\n        while (!NodeQueue.empty())\r\n        {\r\n            // Insert the current item at the new position.\r\n            TVITEM tvItem = { 0 };\r\n            tvItem.hItem = NodeQueue.front().m_hChild;\r\n            tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;\r\n\r\n            m_pTreeView->GetItem(&tvItem);\r\n\r\n            TVINSERTSTRUCT tvInsert = { 0 };\r\n            tvInsert.item = tvItem;\r\n            tvInsert.hInsertAfter = TVI_LAST;\r\n            tvInsert.hParent = NodeQueue.front().m_hParent;\r\n\r\n            HTREEITEM hNewItem = m_pTreeView->InsertItem(&tvInsert);\r\n            CProjectNode *pNewNode = (CProjectNode *)m_pTreeView->GetItemData(hNewItem);\r\n            pNewNode->m_hTreeItem = hNewItem;\r\n\r\n            // Update all file paths.\r\n            TCHAR *szNewNodePath = pNewNode->pItemData->BeginEditFilePath();\r\n                CProjectNode *pParentNode = (CProjectNode *)m_pTreeView->GetItemData(NodeQueue.front().m_hParent);\r\n                lstrcpy(szNewNodePath,pParentNode->pItemData->GetFilePath());\r\n                //IncludeTrailingBackslash(szFilePath);\r\n                lstrcat(szNewNodePath,pParentNode->pItemData->GetFileName());\r\n                lstrcat(szNewNodePath,_T(\"/\"));\r\n\r\n                // Set the same file path for all files in the folder.\r\n                std::list<CItemData *>::iterator itFile;\r\n                for (itFile = pNewNode->m_Files.begin(); itFile != pNewNode->m_Files.end(); itFile++)\r\n                {\r\n                    TCHAR *szFilePath = (*itFile)->BeginEditFilePath();\r\n                        lstrcpy(szFilePath,szNewNodePath);\r\n                        lstrcat(szFilePath,pNewNode->pItemData->GetFileName());\r\n                        lstrcat(szFilePath,_T(\"/\"));\r\n                    (*itFile)->EndEditFilePath();\r\n                }\r\n            pNewNode->pItemData->EndEditFilePath();\r\n\r\n            // Add the childs to the queue.\r\n            HTREEITEM hChild = m_pTreeView->GetChildItem(NodeQueue.front().m_hChild);\r\n            if (hChild != NULL)\r\n            {\r\n                NodeQueue.push(CParentChild(hNewItem,hChild));\r\n                while ((hChild = m_pTreeView->GetNextSiblingItem(hChild)) != NULL)\r\n                    NodeQueue.push(CParentChild(hNewItem,hChild));\r\n            }\r\n\r\n            NodeQueue.pop();\r\n        }\r\n\r\n        // Delete the old node.\r\n        m_pTreeView->DeleteItem(hOldNode);\r\n\r\n        // Update the old parent's child status if it no longer has any children.\r\n        if (m_pTreeView->GetChildItem(pParent->m_hTreeItem) == NULL)\r\n            HasChildren(pParent->m_hTreeItem,false);\r\n\r\n        // Make sure that the new parent knows that it has children.\r\n        HasChildren(pNewParent->m_hTreeItem,true);\r\n    }\r\n    else\r\n    {\r\n        pParent->m_Files.remove(pItemData);\r\n        pNewParent->m_Files.push_back(pItemData);\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    CTreeManager::IsSubNode\r\n    -----------------------\r\n    Returns true if pNode2 is a sub node of pNode1.\r\n*/\r\nbool CTreeManager::IsSubNode(CProjectNode *pNode1,CProjectNode *pNode2)\r\n{\r\n    CProjectNode *pCurNode = pNode2;\r\n    while (pCurNode != NULL)\r\n    {\r\n        if (pCurNode == pNode1)\r\n            return true;\r\n\r\n        pCurNode = pCurNode->m_pParent;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetChildItem\r\n    --------------------------\r\n    Checks if pParent has a child node or contains a file with the specified\r\n    name szName. The function returns the CItemData object of that item. If no\r\n    such item exists the function returns NULL.\r\n*/\r\nCItemData *CTreeManager::GetChildItem(CProjectNode *pParent,const TCHAR *szName)\r\n{\r\n    // Check all children of pParent.\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParent->m_Children.begin(); itNodeObject != pParent->m_Children.end(); itNodeObject++)\r\n    {\r\n        if (!lstrcmp((*itNodeObject)->pItemData->GetFileName(),szName))\r\n            return (*itNodeObject)->pItemData;\r\n    }\r\n\r\n    // Check all files in pParent.\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pParent->m_Files.begin(); itFileObject != pParent->m_Files.end(); itFileObject++)\r\n    {\r\n        if (!lstrcmp((*itFileObject)->GetFileName(),szName))\r\n            return *itFileObject;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetChildItem\r\n    --------------------------\r\n    Checks if pParent has a child node with the specified name szName. The\r\n    function returns the CProjectNode object of that child. If no such node\r\n    exists the function returns NULL.\r\n*/\r\nCProjectNode *CTreeManager::GetChildNode(CProjectNode *pParent,const TCHAR *szName)\r\n{\r\n    // Check all children of pParent.\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParent->m_Children.begin(); itNodeObject != pParent->m_Children.end(); itNodeObject++)\r\n    {\r\n        if (!lstrcmp((*itNodeObject)->pItemData->GetFileName(),szName))\r\n            return *itNodeObject;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\n/*\r\n    CTreeManager::ResolveNode\r\n    -------------------------\r\n    Resolved the CItemData object in the pParent node to the actual node\r\n    object. The function returns NULL if unsuccessfull.\r\n*/\r\nCProjectNode *CTreeManager::ResolveNode(CProjectNode *pParent,CItemData *pNodeItem)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParent->m_Children.begin(); itNodeObject != pParent->m_Children.end(); itNodeObject++)\r\n    {\r\n        if ((*itNodeObject)->pItemData == pNodeItem)\r\n            return *itNodeObject;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nvoid CTreeManager::GetCurrentPath(TCHAR *szCurrentPath)\r\n{\r\n    lstrcpy(szCurrentPath,m_szCurrentPath);\r\n}\r\n\r\nvoid CTreeManager::SetCurrentPath(const TCHAR *szCurrentPath)\r\n{\r\n    lstrcpy(m_szCurrentPath,szCurrentPath);\r\n}\r\n\r\nCProjectNode *CTreeManager::GetCurrentNode()\r\n{\r\n    return m_pCurrentNode;\r\n}\r\n\r\nCProjectNode *CTreeManager::GetRootNode()\r\n{\r\n    return m_pRootNode;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetDirFromParent\r\n    ------------------------------\r\n    Returns the CProjectNode object of the sub directory with the name szText\r\n    which is located inside pParent.\r\n*/\r\nCProjectNode *CTreeManager::GetDirFromParent(CProjectNode *pParent,TCHAR *szText)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParent->m_Children.begin(); itNodeObject != pParent->m_Children.end(); itNodeObject++)\r\n    {\r\n        CProjectNode *pChild = (CProjectNode *)*itNodeObject;\r\n\r\n        if (!lstrcmp(pChild->pItemData->GetFileName(),szText))\r\n            return pChild;\r\n    }\r\n\r\n    return m_pRootNode;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetLocalSizeFromNode\r\n    ----------------------------------\r\n    Calculates the size of all the files (not recursivly) in the specified node.\r\n*/\r\nunsigned __int64 CTreeManager::GetLocalSizeFromNode(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack)\r\n{\r\n    unsigned __int64 uiSize = 0;\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n        FolderStack.push_back(*itNodeObject);\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n        uiSize += (*itFileObject)->uiSize;\r\n\r\n    return uiSize;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetNodeSize\r\n    -------------------------\r\n    Calculates the size of the specified node.\r\n*/\r\nunsigned __int64 CTreeManager::GetNodeSize(CProjectNode *pNode)\r\n{\r\n    std::vector<CProjectNode *> FolderStack;\r\n    unsigned __int64 uiSize = GetLocalSizeFromNode(pNode,FolderStack);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        uiSize += GetLocalSizeFromNode(pNode,FolderStack);\r\n    }\r\n\r\n    return uiSize;\r\n}\r\n\r\n/*\r\n    CTreeManager::GetNodeSize\r\n    -------------------------\r\n    Calculates the size of the node matching the pItemData pointer in the\r\n    pParentNode.\r\n*/\r\nunsigned __int64 CTreeManager::GetNodeSize(CProjectNode *pParentNode,CItemData *pItemData)\r\n{\r\n    CProjectNode *pCurNode = NULL;\r\n\r\n    // Look for matching nodes.\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pParentNode->m_Children.begin(); itNodeObject != pParentNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        if ((*itNodeObject)->pItemData == pItemData)\r\n        {\r\n            pCurNode = *itNodeObject;\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (pCurNode == NULL)\r\n        return 0;\r\n\r\n    return GetNodeSize(pCurNode);\r\n\r\n    // Calulate the size.\r\n    /*std::vector<CProjectNode *> FolderStack;\r\n    unsigned __int64 uiSize = GetLocalSizeFromNode(pCurNode,FolderStack);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        uiSize += GetLocalSizeFromNode(pCurNode,FolderStack);\r\n    }\r\n\r\n    return uiSize;*/\r\n}\r\n\r\nvoid CTreeManager::GetLocalNodeContents(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n                                        unsigned __int64 &uiFileCount,unsigned __int64 &uiNodeCount)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n        FolderStack.push_back(*itNodeObject);\r\n\r\n    uiFileCount += pNode->m_Files.size();\r\n    uiNodeCount += pNode->m_Children.size();\r\n}\r\n\r\nvoid CTreeManager::GetNodeContents(CProjectNode *pRootNode,unsigned __int64 &uiFileCount,unsigned __int64 &uiNodeCount)\r\n{\r\n    CProjectNode *pCurNode = pRootNode;\r\n\r\n    uiFileCount = 0;\r\n    uiNodeCount = 0;\r\n\r\n    // Save the information.\r\n    std::vector<CProjectNode *> FolderStack;\r\n    GetLocalNodeContents(pCurNode,FolderStack,uiFileCount,uiNodeCount);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        GetLocalNodeContents(pCurNode,FolderStack,uiFileCount,uiNodeCount);\r\n    }\r\n}\r\n\r\n/*\r\n    CTreeManager::RecursiveLocalSetFlags\r\n    ------------------------------------\r\n    Recursivly sets the specified flags to all files and folder of the\r\n    specified node.\r\n*/\r\nvoid CTreeManager::RecursiveLocalSetFlags(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n                                          unsigned char ucFlags)\r\n{\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        FolderStack.push_back(*itNodeObject);\r\n        (*itNodeObject)->pItemData->ucFlags |= ucFlags;\r\n    }\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n        (*itFileObject)->ucFlags |= ucFlags;\r\n}\r\n\r\nvoid CTreeManager::RecursiveSetFlags(CProjectNode *pRootNode,unsigned char ucFlags)\r\n{\r\n    CProjectNode *pCurNode = pRootNode;\r\n\r\n    // Save the information.\r\n    std::vector<CProjectNode *> FolderStack;\r\n    RecursiveLocalSetFlags(pCurNode,FolderStack,ucFlags);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        RecursiveLocalSetFlags(pCurNode,FolderStack,ucFlags);\r\n    }\r\n}\r\n\r\nvoid CTreeManager::DeleteImportedItems(CProjectNode *pRootNode)\r\n{\r\n    // Select the root.\r\n    m_pTreeView->SelectItem(pRootNode->m_hTreeItem);\r\n\r\n    // Find the locked nodes.\r\n    std::vector<CProjectNode *> FolderStack;\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pRootNode->m_Children.begin(); itNodeObject != pRootNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        if ((*itNodeObject)->pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            FolderStack.push_back(*itNodeObject);\r\n    }\r\n\r\n    // Remove the locked nodes.\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    while (FolderStack.size() > 0)\r\n    {\r\n        CProjectNode *pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        // Remove the node from the path list.\r\n        lstrcpy(szFullName,pCurNode->pItemData->GetFilePath());\r\n        lstrcat(szFullName,pCurNode->pItemData->GetFileName());\r\n\r\n        // Delete the node.\r\n        m_pTreeView->DeleteItem(pCurNode->m_hTreeItem);\r\n\r\n        delete pCurNode;\r\n        pRootNode->m_Children.remove(pCurNode);\r\n    }\r\n\r\n    if (pRootNode->m_Children.size() == 0)\r\n        HasChildren(pRootNode->m_hTreeItem,false);\r\n\r\n    // Find the locked files.\r\n    std::vector<CItemData *> FileStack;\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pRootNode->m_Files.begin(); itFileObject != pRootNode->m_Files.end(); itFileObject++)\r\n    {\r\n        if ((*itFileObject)->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            FileStack.push_back(*itFileObject);\r\n    }\r\n\r\n    // Remove the locked files.\r\n    while (FileStack.size() > 0)\r\n    {\r\n        CItemData *pCurFile = FileStack[FileStack.size() - 1];\r\n        FileStack.pop_back();\r\n\r\n        // Delete the file.\r\n        delete pCurFile;\r\n        pRootNode->m_Files.remove(pCurFile);\r\n    }\r\n}\r\n\r\nvoid CTreeManager::GetNodeFullPaths(CProjectNode *pRootNode,std::vector<TCHAR *> &FullPaths)\r\n{\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pRootNode->m_Files.begin(); itFileObject != pRootNode->m_Files.end(); itFileObject++)\r\n        FullPaths.push_back(((CItemData *)*itFileObject)->szFullPath);\r\n}\r\n\r\nvoid CTreeManager::GetNodeFiles(CProjectNode *pNode,std::vector<CItemData *> &Files)\r\n{\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n        Files.push_back(*itFileObject);\r\n}\r\n\r\nvoid CTreeManager::ListNodeFiles(CProjectNode *pNode,CListViewCtrl *pListView)\r\n{\r\n    unsigned int uiItemCount = 0;\r\n    TCHAR szBuffer[16];\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        lsprintf(szBuffer,_T(\"%d\"),uiItemCount + 1);\r\n\r\n        pListView->AddItem(uiItemCount,0,szBuffer);\r\n        pListView->AddItem(uiItemCount,1,pItemData->GetAudioData()->szTrackTitle);\r\n        pListView->AddItem(uiItemCount,2,pItemData->GetAudioData()->szTrackArtist);\r\n        pListView->SetItemData(uiItemCount,(DWORD_PTR)pItemData);\r\n\r\n        uiItemCount++;\r\n    }\r\n}\r\n\r\n/*\r\n    CTreeManager::HasExtraAudioData\r\n    -------------------------------\r\n    Returns true if all items in pNode contains both track title and artist\r\n    information.\r\n*/\r\nbool CTreeManager::HasExtraAudioData(CProjectNode *pNode)\r\n{\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        if (pItemData->GetAudioData()->szTrackArtist[0] == '\\0' ||\r\n            pItemData->GetAudioData()->szTrackTitle[0] == '\\0')\r\n        {\r\n            return false;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CTreeManager::SaveLocalNodeFileData(CXmlProcessor *pXml,CProjectNode *pNode,\r\n                                         std::vector<CProjectNode *> &FolderStack,\r\n                                         unsigned int &uiFileCount,unsigned int uiRootLength)\r\n{\r\n    // Save the item information.\r\n    TCHAR szEntryName[32];\r\n    TCHAR szInternalName[MAX_PATH];\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        FolderStack.push_back(*itNodeObject);\r\n\r\n        CItemData *pItemData = (*itNodeObject)->pItemData;\r\n\r\n        // Don't save imported items.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            continue;\r\n\r\n        lsprintf(szEntryName,_T(\"File%d\"),uiFileCount++);\r\n        pXml->AddElement(szEntryName,_T(\"\"),true);\r\n            pXml->AddElementAttr(_T(\"flags\"),(int)pItemData->ucFlags);\r\n\r\n            lstrcpy(szInternalName,pItemData->GetFilePath() + uiRootLength);\r\n            lstrcat(szInternalName,pItemData->GetFileName());\r\n\r\n            pXml->AddElement(_T(\"InternalName\"),szInternalName);\r\n            pXml->AddElement(_T(\"FullPath\"),pItemData->szFullPath);\r\n\r\n            FILETIME LocalFileTime;\r\n            DosDateTimeToFileTime(pItemData->usFileDate,pItemData->usFileTime,&LocalFileTime);\r\n            ULARGE_INTEGER iLocalFileTime;\r\n            memcpy(&iLocalFileTime,&LocalFileTime,sizeof(FILETIME));\r\n            pXml->AddElement(_T(\"FileTime\"),(__int64)iLocalFileTime.QuadPart);\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        // Don't save imported items.\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            continue;\r\n\r\n        lsprintf(szEntryName,_T(\"File%d\"),uiFileCount++);\r\n        pXml->AddElement(szEntryName,_T(\"\"),true);\r\n            pXml->AddElementAttr(_T(\"flags\"),(int)pItemData->ucFlags);\r\n\r\n            lstrcpy(szInternalName,pItemData->GetFilePath() + uiRootLength);\r\n            lstrcat(szInternalName,pItemData->GetFileName());\r\n\r\n            pXml->AddElement(_T(\"InternalName\"),szInternalName);\r\n            pXml->AddElement(_T(\"FullPath\"),pItemData->szFullPath);\r\n\r\n            FILETIME LocalFileTime;\r\n            DosDateTimeToFileTime(pItemData->usFileDate,pItemData->usFileTime,&LocalFileTime);\r\n            ULARGE_INTEGER iLocalFileTime;\r\n            memcpy(&iLocalFileTime,&LocalFileTime,sizeof(FILETIME));\r\n            pXml->AddElement(_T(\"FileTime\"),(__int64)iLocalFileTime.QuadPart);\r\n        pXml->LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CTreeManager::SaveNodeFileData(CXmlProcessor *pXml,CProjectNode *pRootNode)\r\n{\r\n    CProjectNode *pCurNode = pRootNode;\r\n\r\n    unsigned int uiRootLength = lstrlen(pRootNode->pItemData->GetFilePath()) +\r\n        lstrlen(pRootNode->pItemData->GetFileName());\r\n\r\n    // Save the information.\r\n    unsigned int uiFileCount = 0;\r\n\r\n    std::vector<CProjectNode *> FolderStack;\r\n    SaveLocalNodeFileData(pXml,pCurNode,FolderStack,uiFileCount,uiRootLength);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        SaveLocalNodeFileData(pXml,pCurNode,FolderStack,uiFileCount,uiRootLength);\r\n    }\r\n}\r\n\r\nvoid CTreeManager::SaveNodeAudioData(CXmlProcessor *pXml,CProjectNode *pRootNode)\r\n{\r\n    unsigned int uiRootLength = lstrlen(pRootNode->pItemData->GetFilePath()) +\r\n        lstrlen(pRootNode->pItemData->GetFileName());\r\n\r\n    // Save the information.\r\n    unsigned int uiFileCount = 0;\r\n    TCHAR szEntryName[32];\r\n    TCHAR szInternalName[MAX_PATH];\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pRootNode->m_Files.begin(); itFileObject != pRootNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        lsprintf(szEntryName,_T(\"File%d\"),uiFileCount++);\r\n        pXml->AddElement(szEntryName,_T(\"\"),true);\r\n            lstrcpy(szInternalName,pItemData->GetFilePath() + uiRootLength);\r\n            lstrcat(szInternalName,pItemData->GetFileName());\r\n\r\n            pXml->AddElement(_T(\"InternalName\"),szInternalName);\r\n            pXml->AddElement(_T(\"FullPath\"),pItemData->szFullPath);\r\n\r\n            if (pItemData->HasAudioData())\r\n            {\r\n                pXml->AddElement(_T(\"TrackTitle\"),pItemData->GetAudioData()->szTrackTitle);\r\n                pXml->AddElement(_T(\"TrackArtist\"),pItemData->GetAudioData()->szTrackArtist);\r\n            }\r\n        pXml->LeaveElement();\r\n    }\r\n}\r\n\r\nbool CTreeManager::LoadNodeFileData(CXmlProcessor *pXml,CProjectNode *pRootNode)\r\n{\r\n    TCHAR szInternalName[MAX_PATH];\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    for (unsigned int i = 0; i < pXml->GetElementChildCount(); i++)\r\n    {\r\n        if (!pXml->EnterElement(i))\r\n            return false;\r\n\r\n        int iFlags = 0;\r\n        pXml->GetSafeElementAttrValue(_T(\"flags\"),&iFlags);\r\n\r\n        // Temporary borrow the szFullName variable. It's safe.\r\n        pXml->GetSafeElementData(_T(\"InternalName\"),szFullName,MAX_PATH - 1);\r\n        lstrcpy(szInternalName,pRootNode->pItemData->GetFilePath());\r\n        lstrcat(szInternalName,pRootNode->pItemData->GetFileName());\r\n        lstrcat(szInternalName,szFullName);\r\n\r\n        pXml->GetSafeElementData(_T(\"FullPath\"),szFullName,MAX_PATH - 1);\r\n\r\n        // Check that the file exist.\r\n        if (!(iFlags & PROJECTITEM_FLAG_ISFOLDER) && !ckcore::File::exist(szFullName))\r\n        {\r\n            MessageBox(*g_pMainFrame,ckcore::string::formatstr(lngGetString(WARNING_MISSPROJFILE),szFullName).c_str(),\r\n                       lngGetString(GENERAL_WARNING),MB_OK | MB_ICONWARNING);\r\n\r\n            pXml->LeaveElement();\r\n            continue;\r\n        }\r\n\r\n        // File time.\r\n        ULARGE_INTEGER iLocalFileTime;\r\n        __int64 iTemp = 0;\r\n        pXml->GetSafeElementData(_T(\"FileTime\"),&iTemp);\r\n        iLocalFileTime.QuadPart = iTemp;\r\n\r\n        FILETIME LocalFileTime;\r\n        memcpy(&LocalFileTime,&iLocalFileTime,sizeof(FILETIME));\r\n\r\n        //if (bIsFolder)\r\n        if (iFlags & PROJECTITEM_FLAG_ISFOLDER)\r\n        {\r\n            // Include a trailing backslash to indicate that we're dealing with a folder.\r\n            TCHAR szTemp[MAX_PATH];\r\n            lstrcpy(szTemp,szInternalName);\r\n            IncludeTrailingBackslash(szTemp);\r\n\r\n            CProjectNode *pNode = AddPath(szTemp);\r\n\r\n            pNode->pItemData->ucFlags = (unsigned char)iFlags;\r\n\r\n            lstrcpy(pNode->pItemData->szFullPath,szFullName);\r\n\r\n            // Copy the modified time.\r\n            FileTimeToDosDateTime(&LocalFileTime,\r\n                &pNode->pItemData->usFileDate,\r\n                &pNode->pItemData->usFileTime);\r\n        }\r\n        else\r\n        {\r\n            CItemData *pItemData = new CItemData();\r\n\r\n            pItemData->ucFlags = (unsigned char)iFlags;\r\n\r\n            // Paths.\r\n            TCHAR *szFileNameBuffer = pItemData->BeginEditFileName();\r\n                lstrcpy(szFileNameBuffer,szInternalName);\r\n                ExtractFileName(szFileNameBuffer);\r\n            pItemData->EndEditFileName();\r\n\r\n            TCHAR *szFilePathBuffer = pItemData->BeginEditFilePath();\r\n                lstrcpy(szFilePathBuffer,szInternalName);\r\n                if (!ExtractFilePath(szFilePathBuffer))\r\n                    lstrcpy(szFilePathBuffer,_T(\"/\"));\r\n            pItemData->EndEditFilePath();\r\n            \r\n            lstrcpy(pItemData->szFullPath,szFullName);\r\n\r\n            // File type.\r\n            SHFILEINFO shFileInfo;\r\n            if (SHGetFileInfo(pItemData->GetFileName(),FILE_ATTRIBUTE_NORMAL,&shFileInfo,\r\n                sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME))\r\n            {\r\n                lstrcpy(pItemData->szFileType,shFileInfo.szTypeName);\r\n            }\r\n\r\n            CProjectNode *pCurrentNode;\r\n            if (pItemData->GetFilePath()[1] != '\\0')\t// pData->szFilePath[1] == '\\0' => pData->szFilePath = \"\\\\\"\r\n                pCurrentNode = g_TreeManager.AddPath(szInternalName);\r\n            else\r\n                pCurrentNode = g_TreeManager.m_pRootNode;\r\n\r\n            // Modified time.\r\n            FileTimeToDosDateTime(&LocalFileTime,&pItemData->usFileDate,&pItemData->usFileTime);\r\n\r\n            // Size.\r\n            pItemData->uiSize = ckcore::File::size(szFullName);\r\n\r\n            pCurrentNode->m_Files.push_back(pItemData);\r\n        }\r\n\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n// FIXME: This function actually duplicates functionallity from the project manager.\r\nbool CTreeManager::LoadNodeAudioData(CXmlProcessor *pXml,CProjectNode *pRootNode,\r\n                                     int iProjectType)\r\n{\r\n    TCHAR szInternalName[MAX_PATH];\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    for (unsigned int i = 0; i < pXml->GetElementChildCount(); i++)\r\n    {\r\n        if (!pXml->EnterElement(i))\r\n            return false;\r\n\r\n        pXml->GetSafeElementData(_T(\"InternalName\"),szInternalName,MAX_PATH - 1);\r\n        pXml->GetSafeElementData(_T(\"FullPath\"),szFullName,MAX_PATH - 1);\r\n\r\n        CItemData *pItemData = new CItemData();\r\n\r\n        // Paths.\r\n        TCHAR *szFileNameBuffer = pItemData->BeginEditFileName();\r\n            lstrcpy(szFileNameBuffer,szInternalName);\r\n            ExtractFileName(szFileNameBuffer);\r\n        pItemData->EndEditFileName();\r\n\r\n        TCHAR *szFilePathBuffer = pItemData->BeginEditFilePath();\r\n            lstrcpy(szFilePathBuffer,szInternalName);\r\n            if (!ExtractFilePath(szFilePathBuffer))\r\n                lstrcpy(szFilePathBuffer,_T(\"/\"));\r\n        pItemData->EndEditFilePath();\r\n\r\n        lstrcpy(pItemData->szFullPath,szFullName);\r\n\r\n        // Check that the file exist.\r\n        if (!ckcore::File::exist(szFullName))\r\n        {\r\n            MessageBox(*g_pMainFrame,ckcore::string::formatstr(lngGetString(WARNING_MISSPROJFILE),szFullName).c_str(),\r\n                       lngGetString(GENERAL_WARNING),MB_OK | MB_ICONWARNING);\r\n\r\n            pXml->LeaveElement();\r\n            continue;\r\n        }\r\n\r\n        // Check file encoding.\r\n        bool bEncoded = false;\r\n        unsigned __int64 uiDuration = 0;\r\n\r\n        // If the audio file is not a Wave file, try to find a codec that can handle it.\r\n        if (GetAudioFormat(szFullName) != AUDIOFORMAT_WAVE)\r\n        {\r\n            // Audio file information.\r\n            int iNumChannels = -1;\r\n            int iSampleRate = -1;\r\n            int iBitRate = -1;\r\n\r\n            for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n            {\r\n                // We're only interested in decoders.\r\n                if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_DECODER) == 0)\r\n                    continue;\r\n\r\n                if (g_CodecManager.m_Codecs[i]->irc_decode_init(szFullName,iNumChannels,\r\n                    iSampleRate,iBitRate,uiDuration))\r\n                {\r\n                    // Exit the decoder immediately since we don't want to decode the file yet.\r\n                    g_CodecManager.m_Codecs[i]->irc_decode_exit();\r\n                    bEncoded = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (!bEncoded)\r\n            {\r\n                lngMessageBox(*g_pMainFrame,FAILURE_UNSUPAUDIO,GENERAL_ERROR,MB_OK | MB_ICONERROR);\r\n\r\n                pXml->LeaveElement();\r\n                continue;\r\n            }\r\n        }\r\n\r\n        // Track length.\r\n        if (bEncoded)\r\n            pItemData->GetAudioData()->uiTrackLength = uiDuration;\r\n        else\r\n            pItemData->GetAudioData()->uiTrackLength = GetAudioLength(szFullName);\r\n\r\n        // Track size.\r\n        if (iProjectType == PROJECTTYPE_MIXED)\t// Count using the Mode-1 sector size since the spacemeter in these projects are based on that disc size.\r\n            pItemData->uiSize = (pItemData->GetAudioData()->uiTrackLength / 1000) * 75 * 2048;\r\n        else\r\n            pItemData->uiSize = pItemData->GetAudioData()->uiTrackLength;\r\n\r\n        // Track information.\r\n        if (pXml->EnterElement(_T(\"TrackTitle\")))\r\n        {\r\n            pXml->LeaveElement();\r\n            pXml->GetSafeElementData(_T(\"TrackTitle\"),pItemData->GetAudioData()->szTrackTitle,159);\t// FIXME: Constant value?!\r\n        }\r\n\r\n        if (pXml->EnterElement(_T(\"TrackArtist\")))\r\n        {\r\n            pXml->LeaveElement();\r\n            pXml->GetSafeElementData(_T(\"TrackArtist\"),pItemData->GetAudioData()->szTrackArtist,159);\r\n        }\r\n\r\n        pRootNode->m_Files.push_back(pItemData);\r\n\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nvoid CTreeManager::GetLocalPathList(ckfilesystem::FileSet &Files,CProjectNode *pNode,\r\n                                    std::vector<CProjectNode *> &FolderStack,int iPathStripLen)\r\n{\r\n    TCHAR szInternalFilePath[MAX_PATH];\r\n    bool bHasChildren = false;\r\n\r\n    std::list <CProjectNode *>::iterator itNodeObject;\r\n    for (itNodeObject = pNode->m_Children.begin(); itNodeObject != pNode->m_Children.end(); itNodeObject++)\r\n    {\r\n        CItemData *pItemData = (*itNodeObject)->pItemData;\r\n\r\n        // Skip imported folders.\r\n        /*if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            continue;*/\r\n\r\n        bHasChildren = true;\r\n\r\n        FolderStack.push_back(*itNodeObject);\r\n\r\n        // Force slash delimiters (no backslash delimiters allowed).\r\n        TCHAR *szFilePathBuffer = pItemData->BeginEditFilePath();\r\n            ForceSlashDelimiters(szFilePathBuffer + iPathStripLen);\r\n        pItemData->EndEditFilePath();\r\n\r\n        ForceSlashDelimiters(pItemData->szFullPath);\r\n\r\n        lstrcpy(szInternalFilePath,pItemData->GetFilePath() + iPathStripLen);\r\n        lstrcat(szInternalFilePath,pItemData->GetFileName());\r\n\r\n        // Handle import data.\r\n        unsigned char ucFlags = ckfilesystem::FileDescriptor::FLAG_DIRECTORY;\r\n        void *pData = NULL;\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n        {\r\n            ucFlags |= ckfilesystem::FileDescriptor::FLAG_IMPORTED;\r\n            pData = pItemData->GetIsoData();\r\n        }\r\n\r\n        // If the insertion fails, the auto_ptr will automatically release the memory.\r\n        std::auto_ptr< ckfilesystem::FileDescriptor > fd(\r\n            new ckfilesystem::FileDescriptor(\r\n                    szInternalFilePath,\r\n                    pItemData->szFullPath,\r\n                    ucFlags,\r\n                    pData ) );\r\n        Files.insert( fd.get() );\r\n        fd.release();\r\n    }\r\n\r\n    std::list <CItemData *>::iterator itFileObject;\r\n    for (itFileObject = pNode->m_Files.begin(); itFileObject != pNode->m_Files.end(); itFileObject++)\r\n    {\r\n        CItemData *pItemData = (*itFileObject);\r\n\r\n        // Skip imported files.\r\n        /*if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n            continue;*/\r\n\r\n        bHasChildren = true;\r\n\r\n        // Force slash delimiters (no backslash delimiters allowed).\r\n        TCHAR *szFilePathBuffer = pItemData->BeginEditFilePath();\r\n            ForceSlashDelimiters(szFilePathBuffer + iPathStripLen);\r\n        pItemData->EndEditFilePath();\r\n\r\n        ForceSlashDelimiters(pItemData->szFullPath);\r\n\r\n        lstrcpy(szInternalFilePath,pItemData->GetFilePath() + iPathStripLen);\r\n        lstrcat(szInternalFilePath,pItemData->GetFileName());\r\n\r\n        // Handle import data.\r\n        unsigned char ucFlags = 0;\r\n        void *pData = NULL;\r\n        if (pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n        {\r\n            ucFlags |= ckfilesystem::FileDescriptor::FLAG_IMPORTED;\r\n            pData = pItemData->GetIsoData();\r\n        }\r\n\r\n        // If the insertion fails, the auto_ptr will automatically release the memory.\r\n        std::auto_ptr< ckfilesystem::FileDescriptor > fd(\r\n            new ckfilesystem::FileDescriptor(\r\n                    szInternalFilePath,\r\n                    pItemData->szFullPath,\r\n                    ucFlags,\r\n                    pData ) );\r\n        Files.insert( fd.get() );\r\n        fd.release();\r\n    }\r\n\r\n    // If the folder does not have children, add it manually.\r\n    if (!bHasChildren)\r\n    {\r\n        // Force slash delimiters (no backslash delimiters allowed).\r\n        TCHAR *szFilePathBuffer = pNode->pItemData->BeginEditFilePath();\r\n            ForceSlashDelimiters(szFilePathBuffer + iPathStripLen);\r\n        pNode->pItemData->EndEditFilePath();\r\n\r\n        ForceSlashDelimiters(pNode->pItemData->szFullPath);\r\n\r\n        lstrcpy(szInternalFilePath,pNode->pItemData->GetFilePath() + iPathStripLen);\r\n        lstrcat(szInternalFilePath,pNode->pItemData->GetFileName());\r\n\r\n        // Copy the file name of a temporary empty directory.\r\n        TCHAR szEmptyFolder[MAX_PATH];\r\n        lstrcpy(szEmptyFolder,g_TempManager.GetEmtpyDirectory());\r\n        ForceSlashDelimiters(szEmptyFolder);\r\n\r\n        // Handle import data.\r\n        unsigned char ucFlags = ckfilesystem::FileDescriptor::FLAG_DIRECTORY;\r\n        void *pData = NULL;\r\n        if (pNode->pItemData->ucFlags & PROJECTITEM_FLAG_ISIMPORTED)\r\n        {\r\n            ucFlags |= ckfilesystem::FileDescriptor::FLAG_IMPORTED;\r\n            pData = pNode->pItemData->GetIsoData();\r\n        }\r\n\r\n        // If the insertion fails, the auto_ptr will automatically release the memory.\r\n        std::auto_ptr< ckfilesystem::FileDescriptor > fd(\r\n            new ckfilesystem::FileDescriptor(\r\n                    szInternalFilePath,\r\n                    szEmptyFolder,\r\n                    ucFlags,\r\n                    pData ) );\r\n        Files.insert( fd.get() );\r\n        fd.release();\r\n    }\r\n}\r\n\r\nvoid CTreeManager::GetPathList(ckfilesystem::FileSet &Files,CProjectNode *pRootNode,int iPathStripLen)\r\n{\r\n    CProjectNode *pCurNode = pRootNode;\r\n\r\n    // Save the information.\r\n    std::vector<CProjectNode *> FolderStack;\r\n    GetLocalPathList(Files,pCurNode,FolderStack,iPathStripLen);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        pCurNode = FolderStack[FolderStack.size() - 1];\r\n        FolderStack.pop_back();\r\n\r\n        GetLocalPathList(Files,pCurNode,FolderStack,iPathStripLen);\r\n    }\r\n}\r\n\r\nvoid CTreeManager::ImportLocalIsoTree(ckfilesystem::IsoTreeNode *pLocalIsoNode,\r\n                                      CProjectNode *pLocalNode,\r\n                                      std::vector<std::pair<ckfilesystem::IsoTreeNode *,\r\n                                      CProjectNode *> > &FolderStack)\r\n{\r\n    std::vector<ckfilesystem::IsoTreeNode *>::const_iterator itIsoNode;\r\n    for (itIsoNode = pLocalIsoNode->children_.begin(); itIsoNode !=\r\n        pLocalIsoNode->children_.end(); itIsoNode++)\r\n    {\r\n        if ((*itIsoNode)->file_flags_ & DIRRECORD_FILEFLAG_DIRECTORY)\r\n        {\r\n            // Try to locate the corresponding project node.\r\n            CProjectNode *pCurNode = NULL;\r\n\r\n            std::list<CProjectNode *>::const_iterator itNode;\r\n            for (itNode = pLocalNode->m_Children.begin(); itNode != pLocalNode->m_Children.end(); itNode++)\r\n            {\r\n                if (!lstrcmpi((*itNode)->pItemData->GetFileName(),(*itIsoNode)->file_name_.c_str()))\r\n                {\r\n                    pCurNode = *itNode;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // Create a new node if necessary.\r\n            if (pCurNode == NULL)\r\n            {\r\n                pCurNode = new CProjectNode(pLocalNode);\r\n                pCurNode->pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED;\r\n                pCurNode->pItemData->SetFileName((*itIsoNode)->file_name_.c_str());\r\n\r\n                TCHAR *szFilePath = pCurNode->pItemData->BeginEditFilePath();\r\n                lstrcpy(szFilePath,pLocalNode->pItemData->GetFilePath());\r\n                lstrcat(szFilePath,pLocalNode->pItemData->GetFileName());\r\n                lstrcat(szFilePath,_T(\"/\"));\r\n                pCurNode->pItemData->EndEditFilePath();\r\n\r\n                ckfilesystem::iso_make_dosdatetime((*itIsoNode)->rec_timestamp_,\r\n                    pCurNode->pItemData->usFileDate,\r\n                    pCurNode->pItemData->usFileTime);\r\n\r\n                // Force a folder icon to be used.\r\n                SHFILEINFO shFileInfo;\r\n                if (SHGetFileInfo(_T(\"\"),FILE_ATTRIBUTE_DIRECTORY,&shFileInfo,\r\n                    sizeof(shFileInfo),SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME))\r\n                {\r\n                    pCurNode->iIconIndex = shFileInfo.iIcon;\r\n                    lstrcpy(pCurNode->pItemData->szFileType,shFileInfo.szTypeName);\r\n                }\r\n\r\n                // Add ISO9660 data.\r\n                CItemData::CIsoData *pIsoData = pCurNode->pItemData->GetIsoData();\r\n\r\n                pIsoData->file_flags_ = (*itIsoNode)->file_flags_;\r\n                pIsoData->file_unit_size_ = (*itIsoNode)->file_unit_size_;\r\n                pIsoData->interleave_gap_size_ = (*itIsoNode)->interleave_gap_size_;\r\n                pIsoData->volseq_num_ = (*itIsoNode)->volseq_num_;\r\n                pIsoData->extent_loc_ = (*itIsoNode)->extent_loc_;\r\n                pIsoData->extent_len_ = (*itIsoNode)->extent_len_;\r\n\r\n                memcpy(&pIsoData->rec_timestamp_,&(*itIsoNode)->rec_timestamp_,\r\n                    sizeof(ckfilesystem::tiso_dir_record_datetime));\r\n\r\n                // Finalize.\r\n                pLocalNode->m_Children.push_back(pCurNode);\r\n\r\n                AddTreeNode(pLocalNode->m_hTreeItem,pCurNode);\r\n            }\r\n\r\n            FolderStack.push_back(std::make_pair(*itIsoNode,pCurNode));\r\n        }\r\n        else\r\n        {\r\n            CItemData *pItemData = new CItemData();\r\n            pItemData->ucFlags |= PROJECTITEM_FLAG_ISIMPORTED;\r\n            pItemData->uiSize = (*itIsoNode)->extent_len_;\r\n            pItemData->SetFileName((*itIsoNode)->file_name_.c_str());\r\n\r\n            TCHAR *szFilePath = pItemData->BeginEditFilePath();\r\n            lstrcpy(szFilePath,pLocalNode->pItemData->GetFilePath());\r\n            lstrcat(szFilePath,pLocalNode->pItemData->GetFileName());\r\n            lstrcat(szFilePath,_T(\"/\"));\r\n            pItemData->EndEditFilePath();\r\n\r\n            ckfilesystem::iso_make_dosdatetime((*itIsoNode)->rec_timestamp_,\r\n                                               pItemData->usFileDate,pItemData->usFileTime);\r\n\r\n            // Add ISO9660 data.\r\n            CItemData::CIsoData *pIsoData = pItemData->GetIsoData();\r\n\r\n            pIsoData->file_flags_ = (*itIsoNode)->file_flags_;\r\n            pIsoData->file_unit_size_ = (*itIsoNode)->file_unit_size_;\r\n            pIsoData->interleave_gap_size_ = (*itIsoNode)->interleave_gap_size_;\r\n            pIsoData->volseq_num_ = (*itIsoNode)->volseq_num_;\r\n            pIsoData->extent_loc_ = (*itIsoNode)->extent_loc_;\r\n            pIsoData->extent_len_ = (*itIsoNode)->extent_len_;\r\n\r\n            memcpy(&pIsoData->rec_timestamp_,&(*itIsoNode)->rec_timestamp_,\r\n                sizeof(ckfilesystem::tiso_dir_record_datetime));\r\n\r\n            // Finalize.\r\n            pLocalNode->m_Files.push_back(pItemData);\r\n        }\r\n    }\r\n}\r\n\r\nvoid CTreeManager::ImportIsoTree(ckfilesystem::IsoTreeNode *pIsoRootNode,CProjectNode *pRootNode)\r\n{\r\n    // Save the information.\r\n    std::vector<std::pair<ckfilesystem::IsoTreeNode *,CProjectNode *> > FolderStack;\r\n    ImportLocalIsoTree(pIsoRootNode,pRootNode,FolderStack);\r\n\r\n    while (FolderStack.size() > 0)\r\n    { \r\n        ckfilesystem::IsoTreeNode *pIsoNode = FolderStack.back().first;\r\n        CProjectNode *pNode = FolderStack.back().second;\r\n\r\n        FolderStack.pop_back();\r\n\r\n        ImportLocalIsoTree(pIsoNode,pNode,FolderStack);\r\n    }\r\n}"
  },
  {
    "path": "src/app/tree_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <list>\r\n#include <vector>\r\n#include <ckfilesystem/fileset.hh>\r\n#include <ckfilesystem/isoreader.hh>\r\n#include <ckfilesystem/isowriter.hh>\r\n#include <base/xml_processor.hh>\r\n#include <base/string_container.hh>\r\n\r\n#define PROJECTITEM_FLAG_ISFOLDER\t\t\t\t\t1\r\n#define PROJECTITEM_FLAG_ISLOCKED\t\t\t\t\t2\r\n#define PROJECTITEM_FLAG_ISIMPORTED\t\t\t\t\t4\r\n#define PROJECTITEM_FLAG_ISDVDVIDEO\t\t\t\t\t8\r\n#define PROJECTITEM_FLAG_ISPROJECTROOT\t\t\t\t16\r\n\r\nclass CProjectNode;\r\n\r\n// This structure represents a file (or folder) inside the project view.\r\nclass CItemData\r\n{\r\npublic:\r\n    class CAudioData\r\n    {\r\n    public:\r\n        unsigned __int64 uiTrackLength;\r\n        TCHAR szTrackTitle[160];\r\n        TCHAR szTrackArtist[160];\r\n\r\n        CAudioData()\r\n        {\r\n            uiTrackLength = 0;\r\n            szTrackTitle[0] = '\\0';\r\n            szTrackArtist[0] = '\\0';\r\n        }\r\n    };\r\n\r\n    typedef ckfilesystem::IsoImportData CIsoData;\r\n\r\nprivate:\r\n    TCHAR m_szFileName[MAX_PATH];\t// File name in the project (disc image).\r\n    TCHAR m_szFilePath[MAX_PATH];\t// File path in the project (disc image).\r\n\r\n    void FileNameChanged();\r\n    void FilePathChanged();\r\n\r\n    // Only allocated when needed.\r\n    CAudioData *m_pAudioData;\r\n    CIsoData *m_pIsoData;\r\n\r\npublic:\r\n    CItemData();\r\n    ~CItemData();\r\n\r\n    //TCHAR szFileName[MAX_PATH];\t\t// File name in the project (disc image).\r\n    //TCHAR szFilePath[MAX_PATH];\t\t// File path in the project (disc image).\r\n    TCHAR szFullPath[MAX_PATH];\t\t\t// Real file path on the harddrive.\r\n    TCHAR szFileType[80];\r\n    unsigned short usFileDate;\r\n    unsigned short usFileTime;\r\n    unsigned __int64 uiSize;\t\t// In data and mixed-mode projects this\r\n                                    // variable holds the file size in bytes.\r\n                                    // In audio projects it holds the same\r\n                                    // information as uiTrackLength.\r\n\r\n    // Only used in audio mode. Audio track length in milliseconds.\r\n    // UPDATE: An object with this information is only created when needed.\r\n    /*unsigned __int64 uiTrackLength;\r\n    TCHAR szTrackTitle[160];\r\n    TCHAR szTrackArtist[160];*/\r\n\r\n    unsigned char ucFlags;\r\n\r\n    // Getters and setters.\r\n    void SetFileName(const TCHAR *szFileName);\r\n    const TCHAR *GetFileName();\r\n    void SetFilePath(const TCHAR *szFilePath);\r\n    const TCHAR *GetFilePath();\r\n\r\n    TCHAR *BeginEditFileName();\r\n    void EndEditFileName();\r\n    TCHAR *BeginEditFilePath();\r\n    void EndEditFilePath();\r\n\r\n    bool HasAudioData();\r\n    CAudioData *GetAudioData();\r\n    bool HasIsoData();\r\n    CIsoData *GetIsoData();\r\n};\r\n\r\nclass CProjectNode\r\n{\r\npublic:\r\n    std::list<CProjectNode *> m_Children;\r\n    std::list<CItemData *> m_Files;\r\n    CProjectNode *m_pParent;\r\n    CItemData *pItemData;\r\n    int iIconIndex;\r\n    HTREEITEM m_hTreeItem;\r\n\r\n    CProjectNode(CProjectNode *pParent)\r\n    {\r\n        m_pParent = pParent;\r\n        m_hTreeItem = NULL;\r\n\r\n        // Initialize the default data.\r\n        pItemData = new CItemData();\r\n        pItemData->ucFlags = PROJECTITEM_FLAG_ISFOLDER;\r\n    }\r\n        \r\n    ~CProjectNode()\r\n    {\r\n        delete pItemData;\r\n\r\n        // Free the children.\r\n        std::list <CProjectNode *>::iterator itNodeObject;\r\n        for (itNodeObject = m_Children.begin(); itNodeObject != m_Children.end(); itNodeObject++)\r\n            delete *itNodeObject;\r\n\r\n        m_Children.clear();\r\n\r\n        // Free the file data.\r\n        std::list <CItemData *>::iterator itFileObject;\r\n        for (itFileObject = m_Files.begin(); itFileObject != m_Files.end(); itFileObject++)\r\n            delete *itFileObject;\r\n\r\n        m_Files.clear();\r\n    }\r\n\r\n    void Sort(unsigned int uiSortColumn,bool bSortUp,bool bSortAudio);\r\n};\r\n\r\nclass CChildComparator\r\n{\r\nprivate:\r\n    unsigned int m_uiSortColumn;\r\n    bool m_bSortUp;\r\n    bool m_bSortAudio;\r\n\r\npublic:\r\n    CChildComparator(unsigned int uiSortColumn,bool bSortUp,bool bSortAudio)\r\n    {\r\n        m_uiSortColumn = uiSortColumn;\r\n        m_bSortUp = bSortUp;\r\n        m_bSortAudio = bSortAudio;\r\n    }\r\n\r\n    bool operator() (const CProjectNode *pSafeNode1,const CProjectNode *pSafeNode2);\r\n};\r\n\r\nclass CFileComparator\r\n{\r\nprivate:\r\n    unsigned int m_uiSortColumn;\r\n    bool m_bSortUp;\r\n    bool m_bSortAudio;\r\n\r\npublic:\r\n    CFileComparator(unsigned int uiSortColumn,bool bSortUp,bool bSortAudio)\r\n    {\r\n        m_uiSortColumn = uiSortColumn;\r\n        m_bSortUp = bSortUp;\r\n        m_bSortAudio = bSortAudio;\r\n    }\r\n\r\n    bool operator() (const CItemData *pSafeItemData1,const CItemData *pSafeItemData2);\r\n};\r\n\r\nclass CTreeManager\r\n{\r\nprivate:\r\n    CTreeViewCtrlEx *m_pTreeView;\r\n    CListViewCtrl *m_pListView;\r\n\r\n    CProjectNode *m_pRootNode;\r\n    CProjectNode *m_pCurrentNode;\r\n\r\n    TCHAR m_szCurrentPath[MAX_PATH];\r\n\r\n    HTREEITEM GetTreeChildFromParent(HTREEITEM hParentItem,TCHAR *szText);\r\n    bool HasChildren(HTREEITEM hItem,bool bHasChildren);\r\n\r\n    CProjectNode *GetDirFromParent(CProjectNode *pParent,const TCHAR *szName);\r\n    CProjectNode *NodalizePath(const TCHAR *szPath);\r\n    CProjectNode *GetChildFromParent(CProjectNode *pParentNode,const TCHAR *szText);\r\n\r\n    void ListNode(CProjectNode *pNode);\r\n\r\n    void RebuildLocalPaths(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack);\r\n    unsigned __int64 GetLocalSizeFromNode(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack);\r\n\r\n    void SaveLocalNodeFileData(CXmlProcessor *pXml,CProjectNode *pNode,\r\n        std::vector<CProjectNode *> &FolderStack,unsigned int &uiFileCount,\r\n        unsigned int uiRootLength);\r\n\r\n    void GetLocalPathList(ckfilesystem::FileSet &Files,CProjectNode *pNode,\r\n        std::vector<CProjectNode *> &FolderStack,int iPathStripLen);\r\n\r\n    void GetLocalNodeContents(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n        unsigned __int64 &uiFileCount,unsigned __int64 &uiNodeCount);\r\n    void RecursiveLocalSetFlags(CProjectNode *pNode,std::vector<CProjectNode *> &FolderStack,\r\n        unsigned char ucFlags);\r\n\r\npublic:\r\n    CTreeManager();\r\n    ~CTreeManager();\r\n\r\n    void AssignControls(CTreeViewCtrlEx *pTreeView,CListViewCtrl *pListView);\r\n    void CreateTree(const TCHAR *szRootName,int iImage);\r\n    void DestroyTree();\r\n\r\n    HTREEITEM AddTreeNode(HTREEITEM hParentItem,CProjectNode *pNode);\r\n    CProjectNode *AddPath(const TCHAR *szPath);\r\n    CProjectNode *InsertVirtualRoot(const TCHAR *szNodeName,int iImage);\r\n    void SelectPath(const TCHAR *szPath);\r\n    void Refresh();\r\n    void RebuildPaths(const TCHAR *szStartPath);\r\n    bool RemoveEntry(CProjectNode *pNode);\r\n    bool RemoveEntry(CProjectNode *pNode,CItemData *pItemData);\r\n    bool RemoveEntry(const TCHAR *szLocalPath,const TCHAR *szFullPath);\r\n    bool MoveEntry(CProjectNode *pParent,CItemData *pItemData,CProjectNode *pNewParent);\r\n\r\n    bool IsSubNode(CProjectNode *pNode1,CProjectNode *pNode2);\r\n\r\n    CItemData *GetChildItem(CProjectNode *pParent,const TCHAR *szName);\r\n    CProjectNode *GetChildNode(CProjectNode *pParent,const TCHAR *szName);\r\n\r\n    CProjectNode *ResolveNode(CProjectNode *pParent,CItemData *pNodeItem);\r\n\r\n    void GetCurrentPath(TCHAR *szCurrentPath);\r\n    void SetCurrentPath(const TCHAR *szCurrentPath);\r\n    CProjectNode *GetCurrentNode();\r\n    CProjectNode *GetRootNode();\r\n    CProjectNode *GetDirFromParent(CProjectNode *pParent,TCHAR *szText);\r\n    CProjectNode *GetNodeFromPath(const TCHAR *szPath);\r\n\r\n    unsigned __int64 GetNodeSize(CProjectNode *pNode);\r\n    unsigned __int64 GetNodeSize(CProjectNode *pParentNode,CItemData *pItemData);\r\n    void GetNodeContents(CProjectNode *pRootNode,unsigned __int64 &uiFileCount,\r\n        unsigned __int64 &uiNodeCount);\r\n    void RecursiveSetFlags(CProjectNode *pRootNode,unsigned char ucFlags);\r\n    void DeleteImportedItems(CProjectNode *pRootNode);\r\n    void GetNodeFullPaths(CProjectNode *pRootNode,std::vector<TCHAR *> &FullPaths);\r\n    void GetNodeFiles(CProjectNode *pNode,std::vector<CItemData *> &Files);\r\n    void ListNodeFiles(CProjectNode *pNode,CListViewCtrl *pListView);\r\n\r\n    bool HasExtraAudioData(CProjectNode *pNode);\r\n\r\n    // Save/load routines.\r\n    void SaveNodeFileData(CXmlProcessor *pXml,CProjectNode *pRootNode);\r\n    void SaveNodeAudioData(CXmlProcessor *pXml,CProjectNode *pRootNode);\r\n    bool LoadNodeFileData(CXmlProcessor *pXml,CProjectNode *pRootNode);\r\n    bool LoadNodeAudioData(CXmlProcessor *pXml,CProjectNode *pRootNode,int iProjectType);\r\n\r\n    void GetPathList(ckfilesystem::FileSet &Files,CProjectNode *pRootNode,int iPathStripLen = 0);\r\n\r\n    void ImportLocalIsoTree(ckfilesystem::IsoTreeNode *pLocalIsoNode,CProjectNode *pLocalNode,\r\n        std::vector<std::pair<ckfilesystem::IsoTreeNode *,CProjectNode *> > &FolderStack);\r\n    void ImportIsoTree(ckfilesystem::IsoTreeNode *pIsoRootNode,CProjectNode *pRootNode);\r\n};\r\n\r\nextern CTreeManager g_TreeManager;\r\n"
  },
  {
    "path": "src/app/utility/audio_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/file.hh>\r\n#include <base/string_util.hh>\r\n#include \"audio_util.hh\"\r\n\r\nbool IsWave(const TCHAR *szFileName)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return false;\r\n\r\n    // Validate ID.\r\n    char szBuffer[4];\r\n    if (File.read(szBuffer,4) == -1)\r\n        return false;\r\n\r\n    if (strncmp(szBuffer,\"RIFF\",4))\r\n        return false;\r\n\r\n    // Ignore size.\r\n    File.seek(4,ckcore::File::ckFILE_CURRENT);\r\n\r\n    // Validate type.\r\n    if (File.read(szBuffer,4) == -1)\r\n        return false;\r\n\r\n    if (strncmp(szBuffer,\"WAVE\",4))\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nint GetAudioFormat(const TCHAR *szFileName)\r\n{\r\n    if (IsWave(szFileName))\r\n        return AUDIOFORMAT_WAVE;\r\n\r\n    return AUDIOFORMAT_UNKNOWN;\r\n}\r\n\r\nint GetAudioLength(const TCHAR *szFileName)\r\n{\r\n    TCHAR szCommand[MAX_PATH + 33],szResult[256],szLength[256];\r\n    int iLength = 0;\r\n\r\n    lsprintf(szCommand,_T(\"open \\\"%s\\\" type waveaudio alias seq\"),szFileName);\r\n    mciSendString(szCommand,szResult,256,NULL);\r\n    mciSendString(_T(\"status seq length\"),szLength,256,NULL);\r\n    mciSendString(_T(\"close seq\"),szResult,255,NULL);\r\n\r\n    return _wtoi(szLength);\r\n}\r\n\r\n/*int GetAudioInfo(const TCHAR *szFileName)\r\n{\r\n    HANDLE hFile = fs_open(szFileName,_T(\"rb\"));\r\n    if (hFile == INVALID_HANDLE_VALUE)\r\n        return false;\r\n\r\n    // Header chunk.\r\n    char szBuffer[4];\r\n    fs_read(szBuffer,4,hFile);\r\n\r\n    if (strncmp(szBuffer,\"RIFF\",4))\r\n    {\r\n        fs_close(hFile);\r\n        return AUDIOLENGTH_BADFORMAT;\r\n    }\r\n\r\n    fs_seek(hFile,4,FILE_CURRENT);\r\n    fs_read(szBuffer,4,hFile);\r\n\r\n    if (strncmp(szBuffer,\"WAVE\",4))\r\n    {\r\n        fs_close(hFile);\r\n        return AUDIOLENGTH_BADFORMAT;\r\n    }\r\n\r\n    // Format chunk.\r\n    fs_read(szBuffer,4,hFile);\r\n\r\n    if (strncmp(szBuffer,\"fmt \",4))\r\n    {\r\n        fs_close(hFile);\r\n        return AUDIOLENGTH_BADFORMAT;\r\n    }\r\n\r\n    unsigned long ulSize = 0;\r\n    fs_read(&ulSize,sizeof(unsigned long),hFile);\r\n\r\n    unsigned short usCompCode = 0;\r\n    unsigned short usNumChannels = 0;\r\n    unsigned long ulSampleRate = 0;\r\n    unsigned long ulBytesPerSec = 0;\r\n    unsigned short usBlockAlign = 0;\r\n    unsigned short usBitsPerSample = 0;\r\n\r\n    fs_read(&usCompCode,sizeof(unsigned short),hFile);\r\n    fs_read(&usNumChannels,sizeof(unsigned short),hFile);\r\n    fs_read(&ulSampleRate,sizeof(unsigned long),hFile);\r\n    fs_read(&ulBytesPerSec,sizeof(unsigned long),hFile);\r\n    fs_read(&usBlockAlign,sizeof(unsigned short),hFile);\r\n    fs_read(&usBitsPerSample,sizeof(unsigned short),hFile);\r\n\r\n    fs_close(hFile);\r\n    return AUDIOLENGTH_BADFORMAT;\r\n}*/\r\n"
  },
  {
    "path": "src/app/utility/audio_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define AUDIOFORMAT_UNKNOWN\t\t\t0\r\n#define AUDIOFORMAT_WAVE\t\t\t1\r\n\r\n#define AUDIOLENGTH_BADFORMAT\t\t0\r\n\r\nint GetAudioFormat(const TCHAR *szFileName);\r\nint GetAudioLength(const TCHAR *szFileName);\r\n//int GetAudioInfo(const TCHAR *szFileName);\r\n"
  },
  {
    "path": "src/app/utility/device_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/convert.hh>\r\n#include \"device_util.hh\"\r\n\r\nnamespace NDeviceUtil\r\n{\r\n    /**\r\n     * Convert the address of the specified device into string form making\r\n     * it compatible with command line usage of the back-end applications.\r\n     * @param [in] device The device to obtain the address from.\r\n     * @return The address in command line string form.\r\n     */\r\n    ckcore::tstring GetDeviceAddr(const ckmmc::Device &device)\r\n    {\r\n        const ckmmc::Device::Address &addr = device.address();\r\n    #ifdef USE_CDRKIT\r\n        return addr.device_;\r\n    #else\r\n        ckcore::tchar buffer[64];\r\n        ckcore::convert::sprintf(buffer,sizeof(buffer),ckT(\"%d,%d,%d\"),\r\n                                 addr.bus_,addr.target_,addr.lun_);\r\n\r\n        return buffer;\r\n    #endif\r\n    }\r\n\r\n    /**\r\n     * Convert the address of the specified device into string form making\r\n     * it compatible with command line usage of the back-end applications.\r\n     * @param [in] device The device to obtain the address from.\r\n     * @return The address in command line string form.\r\n     */\r\n    std::string GetDeviceAddrA(const ckmmc::Device &device)\r\n    {\r\n        const ckmmc::Device::Address &addr = device.address();\r\n    #ifdef USE_CDRKIT\r\n        return addr.device_;\r\n    #else\r\n        char buffer[64];\r\n        sprintf(buffer,\"%d,%d,%d\",addr.bus_,addr.target_,addr.lun_);\r\n\r\n        return buffer;\r\n    #endif\r\n    }\r\n\r\n    ckcore::tstring GetDeviceName(const ckmmc::Device &device)\r\n    {\r\n        const ckmmc::Device::Address &addr = device.address();\r\n\r\n        return addr.device_ + ckT(\": \") + device.name();\r\n    }\r\n};\r\n"
  },
  {
    "path": "src/app/utility/device_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/types.hh>\r\n#include <ckmmc/device.hh>\r\n\r\nnamespace NDeviceUtil\r\n{\r\n    ckcore::tstring GetDeviceAddr(const ckmmc::Device &device);\r\n    std::string GetDeviceAddrA(const ckmmc::Device &device);\r\n    ckcore::tstring GetDeviceName(const ckmmc::Device &device);\r\n};\r\n"
  },
  {
    "path": "src/app/utility/lang_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckfilesystem/stringtable.hh>\r\n#include <base/string_util.hh>\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nconst TCHAR *g_szHelpFile = _T(\"InfraRecorder.chm\");\r\n\r\nconst TCHAR *lngGetString(unsigned int uiID)\r\n{\r\n    ATLASSERT( uiID < _countof(g_szStringTable) );\r\n\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"strings\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(uiID,szStrValue))\r\n                return szStrValue;\r\n        }\r\n    }\r\n\r\n    // Load internal (English) string.\r\n    return g_szStringTable[uiID];\r\n}\r\n\r\nconst TCHAR *lngGetManual()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"translation\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(TRANSLATION_ID_MANUAL,szStrValue))\r\n                return szStrValue;\r\n        }\r\n    }\r\n\r\n    // Return default file name.\r\n    return g_szHelpFile;\r\n}\r\n\r\nint lngMessageBox(HWND hWnd,unsigned int uiTextID,unsigned int uiCaptionID,unsigned int uiType)\r\n{\r\n    return MessageBox(hWnd,lngGetString(uiTextID),lngGetString(uiCaptionID),uiType);\r\n}\r\n\r\nvoid lngTranslateTables()\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\t\r\n        // Make sure that there is a strings translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"filesystem\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::WARNING_FSDIRLEVEL,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::WARNING_FSDIRLEVEL,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::WARNING_SKIPFILE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::WARNING_SKIPFILE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::WARNING_SKIP4GFILE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::WARNING_SKIP4GFILE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::WARNING_SKIP4GFILEISO,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::WARNING_SKIP4GFILEISO,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::ERROR_PATHTABLESIZE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::ERROR_PATHTABLESIZE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::ERROR_OPENWRITE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::ERROR_OPENWRITE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::ERROR_OPENREAD,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::ERROR_OPENREAD,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::STATUS_BUILDTREE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::STATUS_BUILDTREE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::STATUS_WRITEDATA,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::STATUS_WRITEDATA,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::STATUS_WRITEISOTABLE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::STATUS_WRITEISOTABLE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::STATUS_WRITEJOLIETTABLE,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::STATUS_WRITEJOLIETTABLE,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::STATUS_WRITEDIRENTRIES,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::STATUS_WRITEDIRENTRIES,szStrValue);\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(ckfilesystem::StringTable::ERROR_DVDVIDEO,szStrValue))\r\n                ckfilesystem::StringTable::instance().set_string(ckfilesystem::StringTable::ERROR_DVDVIDEO,szStrValue);\r\n        }\r\n    }\r\n}\r\n\r\nckcore::tstring lngSlowFormatStr(const eStringTable TranslatedFormatStr,...)\r\n{\r\n    ckcore::tstring Result;\r\n\r\n    va_list Args;\r\n    va_start(Args,TranslatedFormatStr);\r\n\r\n    ckcore::string::vformatstr(Result,lngGetString(TranslatedFormatStr),Args);\r\n\r\n    va_end(Args);\r\n    return Result;\r\n}"
  },
  {
    "path": "src/app/utility/lang_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define TRANSLATION_ID_AUTHOR\t\t\t1\r\n#define TRANSLATION_ID_DATE\t\t\t\t2\r\n#define TRANSLATION_ID_VERSION\t\t\t3\r\n#define TRANSLATION_ID_MANUAL\t\t\t4\r\n\r\nconst TCHAR *lngGetString(unsigned int uiID);\r\nconst TCHAR *lngGetManual();\r\nint lngMessageBox(HWND hWnd,unsigned int uiTextID,unsigned int uiCaptionID,unsigned int uiType);\r\nvoid lngTranslateTables();\r\nckcore::tstring lngSlowFormatStr(const eStringTable TranslatedFormatStr,...);\r\n"
  },
  {
    "path": "src/app/utility/shell_ext_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"shell_ext_util.hh\"\r\n#include <base/string_util.hh>\r\n\r\nbool ExecShellExtFunction(const char *szFunctionName)\r\n{\r\n    // Calculate file path.\r\n    TCHAR szFileName[MAX_PATH];\r\n    ::GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,_T(\"shell.dll\"));\r\n\r\n    // Load library.\r\n    HINSTANCE hInstance = LoadLibrary(szFileName);\r\n    if (!hInstance)\r\n        return false;\r\n\r\n    // Call the function.\r\n    HRESULT (STDAPICALLTYPE* pfn)();\r\n\r\n    (FARPROC&) pfn = GetProcAddress(hInstance,szFunctionName);\r\n    if (pfn == NULL)\r\n    {\r\n        FreeLibrary(hInstance);\r\n        return false;\r\n    }\r\n\r\n    if (FAILED(pfn()))\r\n    {\r\n        FreeLibrary(hInstance);\r\n        return false;\r\n    }\r\n\r\n    FreeLibrary(hInstance);\r\n    return true;\r\n}\r\n\r\n/*\r\n    RegisterShellExtension\r\n    ----------------------\r\n    Registers the shell extension.\r\n*/\r\nbool RegisterShellExtension()\r\n{\r\n    return ExecShellExtFunction(\"DllRegisterServer\");\r\n}\r\n\r\n/*\r\n    RegisterShellExtension\r\n    ----------------------\r\n    Unregisters the shell extension.\r\n*/\r\nbool UnregisterShellExtension()\r\n{\r\n    return ExecShellExtFunction(\"DllUnregisterServer\");\r\n}\r\n\r\n/*\r\n    IsShellExtensionRegistered\r\n    --------------------------\r\n    Returns true if the shell extension is registered with the system,\r\n    it returns false otherwise.\r\n*/\r\nbool IsShellExtensionRegistered()\r\n{\r\n    CRegistry Reg;\r\n    Reg.SetRoot(HKEY_CLASSES_ROOT);\r\n\r\n    if (Reg.OpenKey(_T(\"AppID\\\\shell.DLL\"),false))\r\n    {\r\n        TCHAR szAppID[39];\r\n\r\n        if (Reg.ReadString(_T(\"AppID\"),szAppID,39 * sizeof(TCHAR)))\r\n        {\r\n            Reg.CloseKey();\r\n\r\n            if (!lstrcmp(szAppID,_T(IRSHELL_APPID)))\r\n                return true;\r\n        }\r\n\r\n        Reg.CloseKey();\r\n        return false;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    InstallExtension\r\n    ----------------\r\n    Associates a file extension with the shell extension.\r\n*/\r\nbool InstallExtension(const TCHAR *szFileExt,CRegistry *pReg)\r\n{\r\n    if (pReg->OpenKey(szFileExt))\r\n    {\r\n        TCHAR szKeyName[64];\r\n\r\n        // If no key is specified we create our own.\r\n        if (!pReg->ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)) || !lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            // Extension key name.\r\n            lstrcpy(szKeyName,_T(\"iriso\"));\r\n\r\n            if (!pReg->WriteString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n            {\r\n                pReg->CloseKey();\r\n                return false;\r\n            }\r\n\r\n            pReg->CloseKey();\r\n\r\n            // Key name description.\r\n            if (!pReg->OpenKey(_T(\"iriso\"),true))\r\n                return false;\r\n\r\n            if (!pReg->WriteString(_T(\"\"),_T(\"InfraRecorder disc image\"),25 * sizeof(TCHAR)))\r\n            {\r\n                pReg->CloseKey();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // Open key name and install shell extension.\r\n        pReg->CloseKey();\r\n\r\n        TCHAR szFullName[256];\r\n        lstrcpy(szFullName,szKeyName),\r\n        lstrcat(szFullName,_T(\"\\\\ShellEx\\\\ContextMenuHandlers\\\\Shell\"));\r\n\r\n        if (!pReg->OpenKey(szFullName))\r\n            return false;\r\n\r\n        if (!pReg->WriteString(_T(\"\"),_T(IRSHELL_GUID),38 * sizeof(TCHAR)))\r\n        {\r\n            pReg->CloseKey();\r\n            return false;\r\n        }\r\n\r\n        pReg->CloseKey();\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool InstallProjectExtension(CRegistry *pReg)\r\n{\r\n    if (pReg->OpenKey(_T(\".irp\")))\r\n    {\r\n        TCHAR szKeyName[64];\r\n\r\n        // If no key is specified we create our own.\r\n        if (!pReg->ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)) || !lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            // Extension key name.\r\n            lstrcpy(szKeyName,_T(\"irproject\"));\r\n\r\n            if (!pReg->WriteString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n            {\r\n                pReg->CloseKey();\r\n                return false;\r\n            }\r\n\r\n            pReg->CloseKey();\r\n\r\n            // Key name description.\r\n            if (!pReg->OpenKey(_T(\"irproject\"),true))\r\n                return false;\r\n\r\n            if (!pReg->WriteString(_T(\"\"),_T(\"InfraRecorder project\"),25 * sizeof(TCHAR)))\r\n            {\r\n                pReg->CloseKey();\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // Open key name and install shell extension.\r\n        pReg->CloseKey();\r\n\r\n        TCHAR szFullName[256];\r\n        lstrcpy(szFullName,szKeyName),\r\n        lstrcat(szFullName,_T(\"\\\\ShellEx\\\\ContextMenuHandlers\\\\Shell\"));\r\n\r\n        if (!pReg->OpenKey(szFullName))\r\n            return false;\r\n\r\n        if (!pReg->WriteString(_T(\"\"),_T(IRSHELL_GUID),38 * sizeof(TCHAR)))\r\n        {\r\n            pReg->CloseKey();\r\n            return false;\r\n        }\r\n\r\n        pReg->CloseKey();\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/*\r\n    UninstallExtension\r\n    ------------------\r\n    Removes the association of a file extension with the shell extension.\r\n*/\r\nbool UninstallExtension(const TCHAR *szFileExt,CRegistry *pReg)\r\n{\r\n    if (!pReg->OpenKey(szFileExt,false))\r\n        return true;\r\n\r\n    TCHAR szKeyName[64];\r\n    if (pReg->ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n    {\r\n        pReg->CloseKey();\r\n\r\n        if (lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            TCHAR szFullName[256];\r\n            lstrcpy(szFullName,szKeyName),\r\n            lstrcat(szFullName,_T(\"\\\\ShellEx\\\\ContextMenuHandlers\"));\r\n\r\n            if (!pReg->OpenKey(szFullName,false))\r\n                return false;\r\n\r\n            bool bResult = pReg->DeleteKey(_T(\"Shell\"));\r\n                pReg->CloseKey();\r\n            return bResult;\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/*\r\n    IsExtensionInstalled\r\n    --------------------\r\n    Returns true if the shell extension is associated with the speicifed\r\n    file extension, otherwise it returns false.\r\n*/\r\nbool IsExtensionInstalled(const TCHAR *szFileExt,CRegistry *pReg)\r\n{\r\n    if (!pReg->OpenKey(szFileExt,false))\r\n        return false;\r\n\r\n    TCHAR szKeyName[64];\r\n    if (pReg->ReadString(_T(\"\"),szKeyName,64 * sizeof(TCHAR)))\r\n    {\r\n        pReg->CloseKey();\r\n\r\n        if (lstrcmp(szKeyName,_T(\"\")))\r\n        {\r\n            TCHAR szFullName[256];\r\n            lstrcpy(szFullName,szKeyName),\r\n            lstrcat(szFullName,_T(\"\\\\ShellEx\\\\ContextMenuHandlers\\\\Shell\"));\r\n\r\n            if (!pReg->OpenKey(szFullName,false))\r\n                return false;\r\n\r\n            pReg->CloseKey();\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/app/utility/shell_ext_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"registry.hh\"\r\n\r\n#define IRSHELL_APPID\t\t\"{8E8DAC3C-E7C5-4495-9903-430C1F38CF86}\"\r\n#define IRSHELL_GUID\t\t\"{7022C5BB-445E-4300-99F2-0B7EDA907A53}\"\r\n\r\nbool RegisterShellExtension();\r\nbool UnregisterShellExtension();\r\nbool IsShellExtensionRegistered();\r\n\r\nbool InstallExtension(const TCHAR *szFileExt,CRegistry *pReg);\r\nbool InstallProjectExtension(CRegistry *pReg);\r\nbool UninstallExtension(const TCHAR *szFileExt,CRegistry *pReg);\r\nbool IsExtensionInstalled(const TCHAR *szFileExt,CRegistry *pReg);\r\n"
  },
  {
    "path": "src/app/utility/trans_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"trans_util.hh\"\r\n\r\n/*\r\n    UpdateStaticWidth\r\n    -----------------\r\n    Updates the width of the specified static control so it fits the specified\r\n    text. The function return the right end position of the static control.\r\n*/\r\nint UpdateStaticWidth(HWND hParentWnd,HWND hCtrlWnd,const TCHAR *szText)\r\n{\r\n    // Calculate text width using the default system font.\r\n    HDC hDC = GetDC(hParentWnd);\r\n    HFONT hOldFont = (HFONT)::SelectObject(hDC,AtlGetDefaultGuiFont());\r\n\r\n    RECT rcText = { 0 };\r\n    ::DrawText(hDC,szText,lstrlen(szText),&rcText,DT_LEFT | DT_CALCRECT | DT_SINGLELINE);\r\n\r\n    ::SelectObject(hDC,hOldFont);\r\n    ::ReleaseDC(hParentWnd,hDC);\r\n\r\n    if (rcText.right < 75)\r\n        return -1;\r\n\r\n    // Get static rectangle.\r\n    RECT rcStatic = { 0 };\r\n    ::GetWindowRect(hCtrlWnd,&rcStatic);\r\n\r\n    ::ScreenToClient(hParentWnd,(LPPOINT)&rcStatic);\r\n    ::ScreenToClient(hParentWnd,((LPPOINT)&rcStatic) + 1);\r\n\r\n    // Update static rectangle.\r\n    rcStatic.right = rcStatic.left + rcText.right + TRANSUTIL_STATICEDIT_SPACING;\r\n    ::MoveWindow(hCtrlWnd,rcStatic.left,rcStatic.top,rcStatic.right - rcStatic.left,rcStatic.bottom - rcStatic.top,TRUE);\r\n\r\n    return rcStatic.right;\r\n}\r\n\r\nint UpdateStaticWidth(HWND hParentWnd,int iStaticID,const TCHAR *szText)\r\n{\r\n    return UpdateStaticWidth(hParentWnd,GetDlgItem(hParentWnd,iStaticID),szText);\r\n}\r\n\r\n/*\r\n    UpdateEditPos\r\n    -------------\r\n    Updates the left position of the specified edit control. If bMove is set to\r\n    true the edit control will be moved (the right position will be updated as\r\n    well).\r\n*/\r\nvoid UpdateEditPos(HWND hParentWnd,int iEditID,int iLeft,bool bMove)\r\n{\r\n    RECT rcEdit = { 0 };\r\n    ::GetWindowRect(::GetDlgItem(hParentWnd,iEditID),&rcEdit);\r\n    ::ScreenToClient(hParentWnd,(LPPOINT)&rcEdit);\r\n    ::ScreenToClient(hParentWnd,((LPPOINT)&rcEdit) + 1);\r\n\r\n    int iDiff = rcEdit.left - iLeft;\r\n    rcEdit.left = iLeft;\r\n\r\n    ::MoveWindow(::GetDlgItem(hParentWnd,iEditID),rcEdit.left,\r\n        rcEdit.top,rcEdit.right - rcEdit.left - (bMove ? iDiff : 0),\r\n        rcEdit.bottom - rcEdit.top,TRUE);\r\n}\r\n\r\nint UpdateStaticHeight(HWND hParentWnd,int iStaticID,const TCHAR *szText)\r\n{\r\n    RECT rcStatic = { 0 };\r\n    ::GetWindowRect(::GetDlgItem(hParentWnd,iStaticID),&rcStatic);\r\n    ::ScreenToClient(hParentWnd,(LPPOINT)&rcStatic);\r\n    ::ScreenToClient(hParentWnd,((LPPOINT)&rcStatic) + 1);\r\n\r\n    HDC hDC = GetDC(hParentWnd);\r\n    HFONT hOldFont = (HFONT)::SelectObject(hDC,AtlGetDefaultGuiFont());\r\n\r\n    RECT rcText = { 0 };\r\n    rcText.right = rcStatic.right - rcStatic.left;\r\n    int iTextHeight = DrawText(hDC,szText,lstrlen(szText),&rcText,DT_LEFT | DT_CALCRECT | DT_WORDBREAK);\r\n    int iDiff = iTextHeight - (rcStatic.bottom - rcStatic.top);\r\n\r\n    if (iDiff > 0)\r\n        ::MoveWindow(::GetDlgItem(hParentWnd,iStaticID),rcStatic.left,rcStatic.top,rcStatic.right - rcStatic.left,iTextHeight,TRUE);\r\n\r\n    ::SelectObject(hDC,hOldFont);\r\n    ::ReleaseDC(hParentWnd,hDC);\r\n    return iDiff;\r\n}\r\n"
  },
  {
    "path": "src/app/utility/trans_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#define TRANSUTIL_STATICEDIT_SPACING\t\t6\r\n\r\nint UpdateStaticWidth(HWND hParentWnd,HWND hCtrlWnd,const TCHAR *szText);\r\nint UpdateStaticWidth(HWND hParentWnd,int iStaticID,const TCHAR *szText);\r\nvoid UpdateEditPos(HWND hParentWnd,int iEditID,int iLeft,bool bMove = false);\r\nint UpdateStaticHeight(HWND hParentWnd,int iStaticID,const TCHAR *szText);\r\n"
  },
  {
    "path": "src/app/version.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"version.hh\"\r\n\r\n#ifdef VERSION_COMPATIBILITY_CHECK\r\nCWinVer g_WinVer;\r\n\r\n#pragma comment(lib,\"Version.lib\")\r\n\r\nCWinVer::CWinVer()\r\n{\r\n    m_ulMajorVersion = 0;\r\n    m_ulMinorVersion = 0;\r\n\r\n    m_ulMajorIEVersion = 0;\r\n    m_ulMinorIEVersion = 0;\r\n\r\n    // Get Windows version information.\r\n    OSVERSIONINFO ovInfo;\r\n    ovInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r\n\r\n    if (GetVersionEx(&ovInfo))\r\n    {\r\n        m_ulMajorVersion = ovInfo.dwMajorVersion;\r\n        m_ulMinorVersion = ovInfo.dwMinorVersion;\r\n    }\r\n\r\n    // Get Internet Explorer version information.\r\n    VS_FIXEDFILEINFO *wxFileInfo;\r\n\r\n    unsigned long ulDummy,ulVersionSize = GetFileVersionInfoSize(_T(\"shlwapi.dll\"),NULL);\r\n\r\n    if (ulVersionSize > 0)\r\n    {\r\n        unsigned char *pBuffer = new unsigned char[ulVersionSize];\r\n\r\n        if (GetFileVersionInfo(_T(\"shlwapi.dll\"),NULL,ulVersionSize,pBuffer))\r\n        {\r\n            if (VerQueryValue(pBuffer,_T(\"\\\\\"),(void **)&wxFileInfo,(unsigned int *)&ulDummy))\r\n            {\r\n                m_ulMajorIEVersion = wxFileInfo->dwFileVersionMS/65536;\r\n                m_ulMinorIEVersion = wxFileInfo->dwFileVersionMS%65536;\r\n            }\r\n        }\r\n\r\n        delete [] pBuffer;\r\n    }\r\n\r\n    // Get Common Controls version information;\r\n    ulVersionSize = GetFileVersionInfoSize(_T(\"comctl32.dll\"),NULL);\r\n\r\n    if (ulVersionSize > 0)\r\n    {\r\n        unsigned char *pBuffer = new unsigned char[ulVersionSize];\r\n\r\n        if (GetFileVersionInfo(_T(\"comctl32.dll\"),NULL,ulVersionSize,pBuffer))\r\n        {\r\n            if (VerQueryValue(pBuffer,_T(\"\\\\\"),(void **)&wxFileInfo,(unsigned int *)&ulDummy))\r\n            {\r\n                m_ulMajorCCVersion = wxFileInfo->dwFileVersionMS/65536;\r\n                m_ulMinorCCVersion = wxFileInfo->dwFileVersionMS%65536;\r\n            }\r\n        }\r\n\r\n        delete [] pBuffer;\r\n    }\r\n}\r\n\r\nCWinVer::~CWinVer()\r\n{\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "src/app/version.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#ifdef VERSION_COMPATIBILITY_CHECK\r\n\r\n/*\r\n    Major\r\n    -----\r\n     4 = Windows NT 4.0, Windows Me, Windows 98, or Windows 95.\r\n     5 = Windows Server 2003, Windows XP, or Windows 2000\r\n\r\n    Minor\r\n    -----\r\n     0 = Windows 2000, Windows NT 4.0, or Windows 95\r\n     1 = Windows XP\r\n     2 = Windows Server 2003\r\n    10 = Windows 98\r\n    90 = Windows Me\r\n*/\r\n\r\n#define MAJOR_WINNT\t\t\t4\r\n#define MAJOR_WIN95\t\t\t4\r\n#define MAJOR_WIN98\t\t\t4\r\n#define MAJOR_WINME\t\t\t4\r\n#define MAJOR_WIN2000\t\t5\r\n#define MAJOR_WINXP\t\t\t5\r\n#define MAJOR_WIN2003\t\t5\r\n#define MAJOR_WINVISTA\t\t6\r\n\r\n#define MINOR_WINNT4\t\t0\r\n#define MINOR_WIN95\t\t\t0\r\n#define MINOR_WIN2000\t\t0\r\n#define MINOR_WINVISTA\t\t0\r\n#define MINOR_WINXP\t\t\t1\r\n#define MINOR_WIN2003\t\t2\r\n#define MINOR_WIN98\t\t\t10\r\n#define MINOR_WINME\t\t\t90\r\n\r\nclass CWinVer\r\n{\r\npublic:\r\n    // Windows.\r\n    unsigned long m_ulMajorVersion;\r\n    unsigned long m_ulMinorVersion;\r\n\r\n    // Internet Explorer.\r\n    unsigned long m_ulMajorIEVersion;\r\n    unsigned long m_ulMinorIEVersion;\r\n\r\n    // Common Controls.\r\n    unsigned long m_ulMajorCCVersion;\r\n    unsigned long m_ulMinorCCVersion;\r\n\r\n    CWinVer();\r\n    ~CWinVer();\r\n};\r\n\r\nextern CWinVer g_WinVer;\r\n\r\n#endif\r\n"
  },
  {
    "path": "src/app/visual_styles.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"visual_styles.hh\"\r\n\r\nCVisualStyles g_VisualStyles;\r\n\r\nCVisualStyles::CVisualStyles()\r\n{\r\n    m_hInstance = LoadLibrary(_T(\"uxtheme.dll\"));\r\n}\r\n\r\nCVisualStyles::~CVisualStyles()\r\n{\r\n    if (m_hInstance != NULL)\r\n        FreeLibrary(m_hInstance);\r\n                \r\n    m_hInstance = NULL;\r\n}\r\n\r\nbool CVisualStyles::Supported()\r\n{\r\n    return (m_hInstance != NULL);\r\n}\r\n\r\nbool CVisualStyles::IsThemeActive()\r\n{\r\n    if (!Supported())\r\n        return false;\r\n                \r\n    PFNISTHEMEACTIVE pfn = (PFNISTHEMEACTIVE)GetProcAddress(m_hInstance,\"IsThemeActive\");\r\n\r\n    if (!pfn)\r\n        return false;\r\n                \r\n    return (*pfn)();\r\n}\r\n\r\nbool CVisualStyles::IsAppThemed()\r\n{\r\n    if (!Supported())\r\n        return false;\r\n                \r\n    PFNISAPPTHEMED pfnIsAppThemed = (PFNISAPPTHEMED)GetProcAddress(m_hInstance,\"IsAppThemed\");\r\n\r\n    if (!pfnIsAppThemed)\r\n        return false;\r\n\r\n    return (*pfnIsAppThemed)();\r\n}\r\n\r\nHTHEME CVisualStyles::OpenThemeData(HWND hwnd,LPCWSTR pszClassList)\r\n{\r\n    if (!Supported())\r\n        return NULL;\r\n\r\n    PFNOPENTHEMEDATA pfnOpenThemeData = (PFNOPENTHEMEDATA)GetProcAddress(m_hInstance,\"OpenThemeData\");\r\n\r\n    if (!pfnOpenThemeData)\r\n        return NULL;\r\n\r\n    return (*pfnOpenThemeData)(hwnd,pszClassList);\r\n}\r\n\r\nHRESULT CVisualStyles::CloseThemeData(HTHEME hTheme)\r\n{\r\n    if (!Supported())\r\n        return false;\r\n\r\n    PFNCLOSETHEMEDATA pfnCloseThemeData = (PFNCLOSETHEMEDATA)GetProcAddress(m_hInstance,\"CloseThemeData\");\r\n\r\n    if (!pfnCloseThemeData)\r\n        return false;\r\n\r\n    return (*pfnCloseThemeData)(hTheme);\r\n}\r\n\r\nHRESULT CVisualStyles::DrawThemeBackground(HTHEME hTheme,HDC hdc,\r\n    int iPartId,int iStateId,const RECT *pRect,const RECT *pClipRect)\r\n{\r\n    if (!Supported())\r\n        return false;\r\n                \r\n    PFNDRAWTHEMEBACKGROUND pfnDrawThemeBackground =\r\n        (PFNDRAWTHEMEBACKGROUND)GetProcAddress(m_hInstance,\"DrawThemeBackground\");\r\n\r\n    if (!pfnDrawThemeBackground)\r\n        return false;\r\n\r\n    return (*pfnDrawThemeBackground)(hTheme,hdc,iPartId,iStateId,pRect,pClipRect);\r\n}\r\n\r\nHRESULT CVisualStyles::GetThemeColor(HTHEME hTheme,int iPartId,int iStateId,\r\n    int iPropId,COLORREF *pColor)\r\n{\r\n    if (!Supported())\r\n        return false;\r\n\r\n    PFNGETTHEMECOLOR pfnGetThemeColor =\r\n        (PFNGETTHEMECOLOR)GetProcAddress(m_hInstance,\"GetThemeColor\");\r\n\r\n    if (!pfnGetThemeColor)\r\n        return false;\r\n\r\n    return (*pfnGetThemeColor)(hTheme,iPartId,iStateId,iPropId,pColor);\r\n}\r\n"
  },
  {
    "path": "src/app/visual_styles.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <uxtheme.h>\r\n#include <tmschema.h>\r\n\r\ntypedef bool (__stdcall *PFNISTHEMEACTIVE)();\r\ntypedef bool(__stdcall *PFNISAPPTHEMED)();\r\n\r\ntypedef HTHEME(__stdcall *PFNOPENTHEMEDATA)(HWND hwnd,LPCWSTR pszClassList);\r\ntypedef HRESULT(__stdcall *PFNCLOSETHEMEDATA)(HTHEME hTheme);\r\ntypedef HRESULT(__stdcall *PFNDRAWTHEMEBACKGROUND)(HTHEME hTheme,HDC hdc, \r\n    int iPartId,int iStateId,const RECT *pRect,const RECT *pClipRect);\r\ntypedef HRESULT(__stdcall *PFNGETTHEMECOLOR)(HTHEME hTheme,int iPartId, \r\n    int iStateId,int iPropId,COLORREF *pColor);\r\n\r\nclass CVisualStyles\r\n{\r\nprivate:\r\n    HINSTANCE m_hInstance;\r\n        \r\n    bool Supported();\r\n\r\npublic:\r\n    CVisualStyles();\r\n    ~CVisualStyles();\r\n\r\n    bool IsThemeActive();\r\n    bool IsAppThemed();\r\n\r\n    HTHEME OpenThemeData(HWND hwnd,LPCWSTR pszClassList);\r\n    HRESULT CloseThemeData(HTHEME hTheme);\r\n    HRESULT DrawThemeBackground(HTHEME hTheme,HDC hdc,int iPartId,int iStateId,\r\n        const RECT *pRect,const RECT *pClipRect);\r\n    HRESULT GetThemeColor(HTHEME hTheme,int iPartId,int iStateId,int iPropId,\r\n        COLORREF *pColor);\r\n};\r\n\r\nextern CVisualStyles g_VisualStyles;\r\n"
  },
  {
    "path": "src/base/base_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"base\"\r\n\tProjectGUID=\"{81EA1BB3-2BA0-4600-9081-2D2CB9203466}\"\r\n\tRootNamespace=\"base\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\check_fmt_str_placeholders.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codec_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\file_util.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\graph_util.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lng_processor.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_container.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_conv.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_util.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\xml_processor.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\check_fmt_str_placeholders.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codec_const.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codec_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\custom_string.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\file_util.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\graph_util.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lng_processor.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_container.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_conv.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_util.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\xml_processor.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/base/base_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>base</ProjectName>\n    <ProjectGuid>{81EA1BB3-2BA0-4600-9081-2D2CB9203466}</ProjectGuid>\n    <RootNamespace>base</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BASE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"check_fmt_str_placeholders.cc\" />\n    <ClCompile Include=\"codec_manager.cc\" />\n    <ClCompile Include=\"file_util.cc\" />\n    <ClCompile Include=\"graph_util.cc\" />\n    <ClCompile Include=\"lng_processor.cc\" />\n    <ClCompile Include=\"string_container.cc\" />\n    <ClCompile Include=\"string_conv.cc\" />\n    <ClCompile Include=\"string_util.cc\" />\n    <ClCompile Include=\"xml_processor.cc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"check_fmt_str_placeholders.hh\" />\n    <None Include=\"codec_const.hh\" />\n    <None Include=\"codec_manager.hh\" />\n    <None Include=\"custom_string.hh\" />\n    <None Include=\"file_util.hh\" />\n    <None Include=\"graph_util.hh\" />\n    <None Include=\"lng_processor.hh\" />\n    <None Include=\"string_container.hh\" />\n    <None Include=\"string_conv.hh\" />\n    <None Include=\"string_util.hh\" />\n    <None Include=\"xml_processor.hh\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/base/base_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"check_fmt_str_placeholders.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"codec_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"file_util.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"graph_util.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"lng_processor.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"string_container.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"string_conv.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"string_util.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"xml_processor.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"check_fmt_str_placeholders.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"codec_const.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"codec_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"custom_string.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"file_util.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"graph_util.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"lng_processor.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"string_container.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"string_conv.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"string_util.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"xml_processor.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/base/check_fmt_str_placeholders.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <windows.h>\r\n#include <atlbase.h>\r\n#include \"check_fmt_str_placeholders.hh\"\t// Include file for this module comes first.\r\n#include \"string_util.hh\"\r\n#include <ckcore/exception.hh>\r\n\r\n#define MAX_PARAM_POSITION ((unsigned)100)\r\n\r\nCFmtStrPlaceholderAnalysis::~CFmtStrPlaceholderAnalysis(void)\r\n{\r\n    for (CVectorOfFmtStrPlaceholder::const_iterator it = m_Placeholders.begin();\r\n         it != m_Placeholders.end();\r\n         ++it)\r\n    {\r\n        const CFmtStrPlaceholder * const pElem = *it;\r\n        delete pElem;\r\n    }\r\n}\r\n\r\nvoid CFmtStrPlaceholderAnalysis::ClearForReuse(void)\r\n{\r\n    // Optimised for reuse: this routine does not free any malloc'ed memory.\r\n    for (unsigned i = 0; i < m_uPlaceholderCount; ++i)\r\n    {\r\n        m_Placeholders[i]->ClearForReuse();\r\n    }\r\n\r\n    Init();\r\n}\r\n\r\nvoid CFmtStrPlaceholderAnalysis::InsertPlaceholder(\r\n                        const unsigned uPlaceholderPos,  // The first position is number 1.\r\n                        const bool bIsPositionalPlaceholder,\r\n                        const ckcore::tchar * const szPlaceholderStr,\r\n                        const unsigned uPlaceholderStrLen)\r\n{\r\n    ATLASSERT(szPlaceholderStr != NULL);\r\n    ATLASSERT(uPlaceholderStrLen > 0);\r\n\r\n    if (uPlaceholderPos < 1 || uPlaceholderPos > MAX_PARAM_POSITION)\r\n        throw ckcore::Exception2(ckcore::string::formatstr( _T(\"Invalid placeholder number %u.\"),uPlaceholderPos).c_str());\r\n\r\n    if (m_uPlaceholderCount > 0)\r\n    {\r\n        if (m_bPositionalPlaceholders != bIsPositionalPlaceholder)\r\n            throw ckcore::Exception2(_T(\"Cannot mix positional and non-positional placeholders.\"));\r\n    }\r\n\r\n    m_bPositionalPlaceholders = bIsPositionalPlaceholder;\r\n\r\n    m_uPlaceholderCount = (std::max)(m_uPlaceholderCount,uPlaceholderPos);\r\n\r\n    if (m_Placeholders.size() < m_uPlaceholderCount)\r\n        m_Placeholders.resize(m_uPlaceholderCount);\r\n\r\n    if (m_Placeholders[uPlaceholderPos - 1] == NULL)\r\n        m_Placeholders[uPlaceholderPos - 1] = new CFmtStrPlaceholder;\r\n\r\n    CFmtStrPlaceholder * const plh = m_Placeholders[uPlaceholderPos - 1];\r\n\r\n    // According to the format string specification, you can reference the same\r\n    // argument from several placeholders, an each placeholder can have\r\n    // different format specifiers. However, we don't allow it here, because of\r\n    // the extra complication that would add to this testing class. Fortunately,\r\n    // this feature is rarely used.\r\n    if (!plh->m_Placeholder.empty())\r\n        throw ckcore::Exception2(ckcore::string::formatstr(_T(\"Placeholder %u already used.\"),uPlaceholderPos).c_str());\r\n    \r\n    plh->m_Placeholder.insert(plh->m_Placeholder.begin(),\r\n                              szPlaceholderStr,szPlaceholderStr + uPlaceholderStrLen);\r\n}\r\n\r\n// ----------------------------------------------------------------------------\r\n// WARNING: This format string parser is not complete, and will not process all\r\n//          possible cases and find all possible errors. Writing a full parser\r\n//          which could also accomodate cross-platform differences is not a\r\n//\t\t\ttrivial task.I have made however a reasonably effort to error on\r\n//\t\t\tall unsupported cases.\r\n// ----------------------------------------------------------------------------\r\n\r\n// Advances p as necessary.\r\nstatic bool IsPlaceholderLength(const ckcore::tchar ** const p)\r\n{\r\n    // According to the Microsoft documentation, these are the possible\r\n    // indicators for field [length] inside a format string:\r\n    //   {h | l | ll | I | I32 | I64}\r\n\r\n    switch (**p)\r\n    {\r\n        case _T('h'):\r\n            ++*p;\r\n            return true;\r\n\r\n        case _T('l'):\r\n            ++*p;\r\n\r\n            if (**p == 'l')\r\n                ++*p;\r\n\r\n            return true;\r\n            \r\n        case _T('I'):\r\n            {\r\n                ++*p;\r\n\r\n                const ckcore::tchar *t = *p;\r\n\r\n                if (*t == _T('3'))\r\n                {\r\n                    ++t;\r\n\r\n                    if (*t == _T('2'))\r\n                    {\r\n                        ++t;\r\n                        *p = t;\r\n                        return true;\r\n                    }\r\n                }\r\n                else if (*t == _T('6'))\r\n                {\r\n                    ++t;\r\n\r\n                    if (*t == _T('4'))\r\n                    {\r\n                        ++t;\r\n                        *p = t;\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                return true;  // An 'I' alone.\r\n            }\r\n\r\n        default:\r\n            return false;\r\n    }\r\n}\r\n\r\nstatic bool IsPlaceholderType(const ckcore::tchar c)\r\n{\r\n    switch (c)\r\n    {\r\n        case _T('d'):\r\n        case _T('i'):\r\n        case _T('u'):\r\n        case _T('f'):\r\n        case _T('F'):\r\n        case _T('e'):\r\n        case _T('E'):\r\n        case _T('g'):\r\n        case _T('G'):\r\n        case _T('x'):\r\n        case _T('X'):\r\n        case _T('o'):\r\n        case _T('s'):\r\n        case _T('c'):\r\n        case _T('p'):\r\n        case _T('n'):\r\n            return true;\r\n\r\n        default:\r\n            return false;\r\n    }\r\n}\r\n\r\nstatic bool IsPlaceholderFlag(const ckcore::tchar c)\r\n{\r\n    switch ( c )\r\n    {\r\n        case _T('-'):\r\n        case _T('+'):\r\n        case _T('0'):\r\n        case _T(' '):\r\n        case _T('#'):\r\n            return true;\r\n\r\n        default:\r\n            return false;\r\n    }\r\n}\r\n\r\nstatic bool ReadPositionalParam(const ckcore::tchar ** const p,unsigned * const uPlaceholderPos)\r\n{\r\n    // Skip any digits at the current position, and look at the next character;\r\n    // If it's a dollar ($) symbol, then this was a positional parameter.\r\n    // If not, it may be the [width] field or something else.\r\n    const ckcore::tchar *scan = *p;\r\n\r\n    if (*scan < _T('0') || *scan > _T('9'))\r\n        return false;\r\n\r\n    unsigned uVal = 0;\r\n\r\n    do\r\n    {\r\n        // If the value of MAX_PARAM_POSITION changes, make sure that it' still\r\n        // ten times lower than the maximum integer value. Otherwise, we need\r\n        // to explicitly test here against integer overflow when multiplying.\r\n        ATLASSERT(MAX_PARAM_POSITION <= 1000);\r\n\r\n        uVal *= 10;\r\n        uVal += *scan - _T('0');\r\n\r\n        if (uVal > MAX_PARAM_POSITION)\r\n            throw ckcore::Exception2(_T(\"Integer too big parsing the positional parameter.\"));\r\n\r\n        ++scan;\r\n    }\r\n    while (*scan >= _T('0') && *scan <= _T('9'));\r\n\r\n    if (*scan != _T('$'))\r\n        return false;\r\n\r\n    *uPlaceholderPos = uVal;\r\n    *p = scan + 1;\r\n    return true;\r\n}\r\n\r\nvoid CFmtStrPlaceholderAnalysis::AnalyzeFormatString(const ckcore::tchar * const szFmtStr)\r\n{\r\n    // The analysis results should be empty upon entry.\r\n    ATLASSERT(m_uPlaceholderCount == 0);\r\n\r\n    // printf format string format\r\n    //\r\n    //    %[parameter] [flags] [width] [.precision] [length] type \r\n    //\r\n    //  [parameter] is an optional positional argument specifier like \"1$\".\r\n    //  That means, old-style \"%s\" would look like \"%1$s\" for the first\r\n    //  positional argument.\r\n    unsigned uPlaceholderPos = 1;\r\n\r\n    for (const ckcore::tchar * p = szFmtStr; *p != _T('\\0');)\r\n    {\r\n        if (*p != _T('%'))\r\n        {\r\n            ++p;\r\n            continue;\r\n        }\r\n\r\n        const ckcore::tchar * const placeholderStart = p;\r\n\r\n        ++p;\r\n\r\n        if (*p == _T('%'))\r\n        {\r\n            ++p;\r\n            continue;\r\n        }\r\n\r\n        try\r\n        {\r\n            if (*p == _T('\\0'))\r\n                throw ckcore::Exception2(_T(\"Invalid placeholder at the end of the string.\"));\r\n\r\n            const bool bIsPositionalParam = ReadPositionalParam(&p,&uPlaceholderPos);\r\n\r\n            while (IsPlaceholderFlag(*p))\r\n                ++p;\r\n\r\n            // Skip the optional width.\r\n            while (*p >= _T('1') && *p <= _T('9'))\r\n                ++p;\r\n\r\n            // Skip the optional precision.\r\n            if (*p == _T('.'))\r\n            {\r\n                ++p;\r\n\r\n                while (*p >= _T('0') && *p <= _T('9'))\r\n                    ++p;\r\n            }\r\n\r\n            // Skip the optional length.\r\n            IsPlaceholderLength(&p);\r\n        \r\n            if (IsPlaceholderType(*p))\r\n            {\r\n                ++p;\r\n                InsertPlaceholder(uPlaceholderPos,\r\n                                  bIsPositionalParam,\r\n                                  placeholderStart,\r\n                                  p - placeholderStart);\r\n\r\n                ++uPlaceholderPos;\r\n                continue;\r\n            }\r\n\r\n            throw ckcore::Exception2(_T(\"Invalid or unsupported placeholder.\"));\r\n        }\r\n        catch (const std::exception &e)\r\n        {\r\n            ckcore::rethrow_with_pfx(e,_T(\"Error at line position %d: \"),\r\n                                     placeholderStart - szFmtStr + 1);\r\n        }\r\n    }\r\n\r\n    // Check here that there are no empty placeholders.\r\n    //\r\n    // Microsoft's implementation of _printf_p does generate a run-time error\r\n    // if any of the parameters are left unreferenced. This can only be detected\r\n    // if the unreferenced parameter is in the middle of other parameters.\r\n    // For example, for a format string like \"%1$s %3$s\", the run-time library\r\n    // complains that parameter 2 is not used.\r\n    for (unsigned i = 0; i < m_uPlaceholderCount; ++i)\r\n    {\r\n        if (m_Placeholders[i] == NULL || m_Placeholders[i]->m_Placeholder.empty())\r\n            throw ckcore::Exception2(ckcore::string::formatstr(_T(\"Positional argument %u not referenced in the format string.\"),i + 1).c_str());\r\n    }\r\n}\r\n\r\nvoid CFmtStrPlaceholderAnalysis::ComparePlaceholderAnalyses(const CFmtStrPlaceholderAnalysis * const pAnalysis1,\r\n                                                            const CFmtStrPlaceholderAnalysis * const pAnalysis2)\r\n{\r\n    // NOTE: This method is static.\r\n    if (pAnalysis1->m_uPlaceholderCount != pAnalysis2->m_uPlaceholderCount)\r\n    {\r\n        throw ckcore::Exception2(_T(\"The strings being compared do not contain the same number of placeholders.\"));\r\n    }\r\n\r\n    if (pAnalysis1->m_uPlaceholderCount > 0 &&\r\n        pAnalysis1->m_bPositionalPlaceholders != pAnalysis2->m_bPositionalPlaceholders)\r\n    {\r\n        throw ckcore::Exception2(_T(\"The strings being compared are not using the same type of placeholders (positional vs non-positional).\"));\r\n    }\r\n\r\n    for (unsigned int i = 0; i < pAnalysis1->m_uPlaceholderCount; ++i)\r\n    {\r\n        const CFmtStrPlaceholder * const plh1 = pAnalysis1->m_Placeholders[i];\r\n        const CFmtStrPlaceholder * const plh2 = pAnalysis2->m_Placeholders[i];\r\n\r\n        if (plh1->m_Placeholder != plh2->m_Placeholder)\r\n        {\r\n            throw ckcore::Exception2(\r\n                    ckcore::string::formatstr(_T(\"Placeholder number %u in the second string (\\\"%s\\\") differs from the corresponding one in the first string (\\\"%s\\\").\"),\r\n                                              i + 1,\r\n                                              plh2->m_Placeholder.c_str(),\r\n                                              plh1->m_Placeholder.c_str()).c_str());\r\n        }\r\n    }\r\n}\r\n\r\nvoid ComparePlaceholdersInTranslatedStr(const ckcore::tchar * const szSectionName,\r\n                                        const unsigned uStringId,\r\n                                        const ckcore::tchar * const szReferencedFmtStr,\r\n                                        const ckcore::tchar * const szTranslatedFmtStr,\r\n                                        CFmtStrPlaceholderAnalysis * const pAnalysis1,\t// Reused for performance\r\n                                        CFmtStrPlaceholderAnalysis * const pAnalysis2)\t// Reused for performance\r\n{\r\n    pAnalysis1->ClearForReuse();\r\n    pAnalysis2->ClearForReuse();\r\n\r\n    try\r\n    {\r\n        try\r\n        {\r\n            pAnalysis1->AnalyzeFormatString(szReferencedFmtStr);\r\n        }\r\n        catch (const std::exception &e)\r\n        {\r\n            ckcore::rethrow_with_pfx(e,_T(\"Error parsing the reference string: \"));\r\n        }\r\n\r\n        try\r\n        {\r\n            pAnalysis2->AnalyzeFormatString(szTranslatedFmtStr);\r\n        }\r\n        catch ( const std::exception &e)\r\n        {\r\n            ckcore::rethrow_with_pfx(e,_T(\"Error parsing the translated string: \"));\r\n        }\r\n\r\n        CFmtStrPlaceholderAnalysis::ComparePlaceholderAnalyses(pAnalysis1,pAnalysis2);\r\n    }\r\n    catch (const std::exception &e)\r\n    {\r\n        ckcore::rethrow_with_pfx(e,_T(\"Error in section [%s], string ID 0x%X: \"),\r\n                                 szSectionName,uStringId);\r\n    }\r\n}"
  },
  {
    "path": "src/base/check_fmt_str_placeholders.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#include <ckcore/types.hh>\r\n#include <vector>\r\n\r\nclass CFmtStrPlaceholder\r\n{\r\npublic:\r\n    // In the future, we will probably have here more data about this placeholder.\r\n    ckcore::tstring m_Placeholder;  // Examples: \"%s\", \"%1$s\", \"%3d\".\r\n\r\n    void ClearForReuse(void)\r\n    {\r\n        m_Placeholder.clear();\r\n    }\r\n};\r\n\r\ntypedef std::vector<CFmtStrPlaceholder *> CVectorOfFmtStrPlaceholder;\r\n\r\nclass CFmtStrPlaceholderAnalysis\r\n{\r\npublic:\r\n    CFmtStrPlaceholderAnalysis(void) { Init(); }\r\n    ~CFmtStrPlaceholderAnalysis(void);\r\n\r\n    void AnalyzeFormatString(const ckcore::tchar *szFmtStr);\r\n\r\n    static void ComparePlaceholderAnalyses(const CFmtStrPlaceholderAnalysis *pAnalysis1,\r\n                                           const CFmtStrPlaceholderAnalysis *pAnalysis2);\r\n    void ClearForReuse(void);\r\n\r\nprotected:\r\n    \r\n    unsigned m_uPlaceholderCount;\t// Always <= m_placeholders.size(). Note that, when reusing an object,\r\n                                    // m_placeholders.size() could be bigger.\r\n\r\n    CVectorOfFmtStrPlaceholder m_Placeholders;\r\n\r\n    bool m_bPositionalPlaceholders;\t// Like \"%1$s\", as opposed to \"%s\".\r\n\r\n    void Init(void)\r\n    {\r\n        m_uPlaceholderCount = 0;\r\n        m_bPositionalPlaceholders = false;\r\n    }\r\n\r\n    void InsertPlaceholder(unsigned uPlaceholderPos,\r\n                           bool bIsPositionalPlaceholder,\r\n                           const ckcore::tchar *szPlaceholderStr,\r\n                           unsigned uPlaceholderStrLen);\r\n};\r\n\r\nvoid ComparePlaceholdersInTranslatedStr(const ckcore::tchar *szSectionName,\r\n                                        unsigned uStringId,\r\n                                        const ckcore::tchar *szReferencedFmtStr,\r\n                                        const ckcore::tchar *szTranslatedFmtStr,\r\n                                        CFmtStrPlaceholderAnalysis *pAnalysis1,\r\n                                        CFmtStrPlaceholderAnalysis *pAnalysis2);\r\n"
  },
  {
    "path": "src/base/codec_const.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <windows.h>\r\n\r\n// Callback function definitions.\r\n#define IRC_MESSAGE_INFO\t\t\t0\r\n#define IRC_MESSAGE_WARNING\t\t\t1\r\n#define IRC_MESSAGE_ERROR\t\t\t2\r\n\r\ntypedef void CALLBACK tirc_send_message(int iType,const TCHAR *szMessage);\r\n\r\n// Exported codec function types.\r\ntypedef int (WINAPI *tirc_capabilities)();\r\ntypedef TCHAR *(WINAPI *tirc_string)(unsigned int uiID);\r\ntypedef bool (WINAPI *tirc_set_callback)(tirc_send_message *pSendMessage);\r\ntypedef bool (WINAPI *tirc_decode_init)(const TCHAR *szFileName,int &iNumChannels,int &iSampleRate,int &iBitRate,unsigned __int64 &uiDuration);\r\ntypedef __int64 (WINAPI *tirc_decode_process)(unsigned char *pBuffer,__int64 iBufferSize,unsigned __int64 &uiTime);\r\ntypedef bool (WINAPI *tirc_decode_exit)();\r\ntypedef bool (WINAPI *tirc_encode_init)(const TCHAR *szFileName,int iNumChannels,int iSampleRate,int iBitRate);\r\ntypedef __int64 (WINAPI *tirc_encode_process)(unsigned char *pBuffer,__int64 iDataSize);\r\ntypedef __int64 (WINAPI *tirc_encode_flush)();\r\ntypedef bool (WINAPI *tirc_encode_exit)();\r\ntypedef bool (WINAPI *tirc_encode_config)();\r\n\r\n// Capability flags.\r\n#define IRC_HAS_DECODER\t\t\t\t0x0001\r\n#define IRC_HAS_ENCODER\t\t\t\t0x0002\r\n#define IRC_HAS_CONFIG\t\t\t\t0x0004\r\n\r\n// String identifiers.\r\n#define IRC_STR_VERSION\t\t\t\t0\r\n#define IRC_STR_ABOUT\t\t\t\t1\r\n#define IRC_STR_ENCODER\t\t\t\t2\r\n#define IRC_STR_FILEEXT\t\t\t\t3\r\n"
  },
  {
    "path": "src/base/codec_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <ckcore/directory.hh>\r\n#include <ckcore/path.hh>\r\n#include \"codec_manager.hh\"\r\n\r\nCCodec::CCodec()\r\n{\r\n    m_hInstance = NULL;\r\n}\r\n\r\nCCodec::~CCodec()\r\n{\r\n    if (m_hInstance)\r\n        FreeLibrary(m_hInstance);\r\n}\r\n\r\nbool CCodec::Load(const TCHAR *szFileName)\r\n{\r\n    m_hInstance = LoadLibrary(szFileName);\r\n    if (m_hInstance == NULL)\r\n        return false;\r\n\r\n    irc_capabilities = (tirc_capabilities)GetProcAddress(m_hInstance,\"irc_capabilities\");\r\n    if (!irc_capabilities)\r\n        return false;\r\n\r\n    irc_string = (tirc_string)GetProcAddress(m_hInstance,\"irc_string\");\r\n    if (!irc_string)\r\n        return false;\r\n\r\n    irc_set_callback = (tirc_set_callback)GetProcAddress(m_hInstance,\"irc_set_callback\");\r\n    if (!irc_set_callback)\r\n        return false;\r\n\r\n    irc_decode_init = (tirc_decode_init)GetProcAddress(m_hInstance,\"irc_decode_init\");\r\n    if (!irc_decode_init)\r\n        return false;\r\n\r\n    irc_decode_process = (tirc_decode_process)GetProcAddress(m_hInstance,\"irc_decode_process\");\r\n    if (!irc_decode_process)\r\n        return false;\r\n\r\n    irc_decode_exit = (tirc_decode_exit)GetProcAddress(m_hInstance,\"irc_decode_exit\");\r\n    if (!irc_decode_exit)\r\n        return false;\r\n\r\n    irc_encode_init = (tirc_encode_init)GetProcAddress(m_hInstance,\"irc_encode_init\");\r\n    if (!irc_encode_init)\r\n        return false;\r\n\r\n    irc_encode_process = (tirc_encode_process)GetProcAddress(m_hInstance,\"irc_encode_process\");\r\n    if (!irc_encode_process)\r\n        return false;\r\n\r\n    irc_encode_flush = (tirc_encode_flush)GetProcAddress(m_hInstance,\"irc_encode_flush\");\r\n    if (!irc_encode_flush)\r\n        return false;\r\n\r\n    irc_encode_exit = (tirc_encode_exit)GetProcAddress(m_hInstance,\"irc_encode_exit\");\r\n    if (!irc_encode_exit)\r\n        return false;\r\n\r\n    irc_encode_config = (tirc_encode_config)GetProcAddress(m_hInstance,\"irc_encode_config\");\r\n    if (!irc_encode_config)\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CCodec::GetFileName(TCHAR *szFileName,unsigned long ulBufSize)\r\n{\r\n    return ::GetModuleFileName(m_hInstance,szFileName,ulBufSize) != 0;\r\n}\r\n\r\nCCodecManager::CCodecManager()\r\n{\r\n    m_bIsLoaded = false;\r\n}\r\n\r\nCCodecManager::~CCodecManager()\r\n{\r\n    for (unsigned int iIndex = 0; iIndex < m_Codecs.size(); iIndex++)\r\n    {\r\n        // Remove the object from m_Instances.\r\n        std::vector <CCodec *>::iterator itObject = m_Codecs.begin() + iIndex;\r\n        delete *itObject;\r\n    }\r\n\r\n    m_Codecs.clear();\r\n}\r\n\r\nbool CCodecManager::LoadCodec(const TCHAR *szFileName)\r\n{\r\n    CCodec *pCodec = new CCodec();\r\n\r\n    if (!pCodec->Load(szFileName))\r\n    {\r\n        delete pCodec;\r\n        return false;\r\n    }\r\n\r\n    m_Codecs.push_back(pCodec);\r\n    return true;\r\n}\r\n\r\nbool CCodecManager::LoadCodecs(const TCHAR *szCodecPath)\r\n{\r\n    ckcore::Path CodecPath = szCodecPath;\r\n\r\n    ckcore::Directory CodecDir(CodecPath);\r\n    ckcore::Directory::Iterator itDir;\r\n    for (itDir = CodecDir.begin(); itDir != CodecDir.end(); itDir++)\r\n    {\r\n        ckcore::Path PluginPath = CodecPath + (*itDir).c_str();\r\n\r\n        if (!lstrcmpi(PluginPath.ext_name().c_str(),ckT(\"irc\")))\r\n        {\r\n            if (!LoadCodec(PluginPath.name().c_str()))\r\n                return false;\r\n        }\r\n    }\r\n\r\n    m_bIsLoaded = true;\r\n    return true;\r\n}\r\n\r\nbool CCodecManager::IsLoaded()\r\n{\r\n    return m_bIsLoaded;\r\n}\r\n"
  },
  {
    "path": "src/base/codec_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"codec_const.hh\"\r\n\r\n// Local structures.\r\nclass CCodec\r\n{\r\nprivate:\r\n    HINSTANCE m_hInstance;\r\n\r\npublic:\r\n    CCodec();\r\n    ~CCodec();\r\n\r\n    bool Load(const TCHAR *szFileName);\r\n    bool GetFileName(TCHAR *szFileName,unsigned long ulBufSize);\r\n\r\n    tirc_capabilities irc_capabilities;\r\n    tirc_string irc_string;\r\n    tirc_set_callback irc_set_callback;\r\n    tirc_decode_init irc_decode_init;\r\n    tirc_decode_process irc_decode_process;\r\n    tirc_decode_exit irc_decode_exit;\r\n    tirc_encode_init irc_encode_init;\r\n    tirc_encode_process irc_encode_process;\r\n    tirc_encode_flush irc_encode_flush;\r\n    tirc_encode_exit irc_encode_exit;\r\n    tirc_encode_config irc_encode_config;\r\n};\r\n\r\nclass CCodecManager\r\n{\r\nprivate:\r\n    bool m_bIsLoaded;\r\n\r\n    bool LoadCodec(const TCHAR *szFileName);\r\n\r\npublic:\r\n    CCodecManager();\r\n    ~CCodecManager();\r\n\r\n    std::vector<CCodec *> m_Codecs;\r\n\r\n    bool LoadCodecs(const TCHAR *szCodecPath);\r\n    bool IsLoaded();\r\n};\r\n"
  },
  {
    "path": "src/base/custom_string.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"string_util.hh\"\r\n\r\n#define CSTRING_DEFAULT_LENGTH\t\t\t256\r\n#define CSTRING_MEM_INCRATIO\t\t\t2\r\n\r\nclass CCustomString\r\n{\r\nprivate:\r\n    TCHAR *m_szString;\r\n    unsigned int m_uiSize;\r\n    unsigned int m_uiPos;\r\n\r\npublic:\r\n    CCustomString()\r\n    {\r\n        m_uiSize = CSTRING_DEFAULT_LENGTH;\r\n        m_uiPos = 0;\r\n        m_szString = new TCHAR[m_uiSize];\r\n    }\r\n\r\n    CCustomString(unsigned int uiSize)\r\n    {\r\n        m_uiSize = uiSize;\r\n        m_uiPos = 0;\r\n        m_szString = new TCHAR[m_uiSize];\r\n    }\r\n\r\n    ~CCustomString()\r\n    {\r\n        delete [] m_szString;\r\n    }\r\n\r\n    void Reset()\r\n    {\r\n        m_uiPos = 0;\r\n    }\r\n\r\n    void ReAllocate(unsigned int uiSize)\r\n    {\r\n        m_uiSize = uiSize;\r\n        m_uiPos = 0;\r\n\r\n        delete [] m_szString;\r\n        m_szString = new TCHAR[m_uiSize];\r\n    }\r\n\r\n    void Append(TCHAR c)\r\n    {\r\n        if (m_uiPos >= m_uiSize)\r\n        {\r\n            m_uiSize *= CSTRING_MEM_INCRATIO;\r\n\r\n            TCHAR *szNewString = new TCHAR[m_uiSize];\r\n            lstrncpy(szNewString,m_szString,m_uiSize / CSTRING_MEM_INCRATIO);\r\n\r\n            delete [] m_szString;\r\n            m_szString = szNewString;\r\n        }\r\n\r\n        m_szString[m_uiPos++] = c;\r\n    }\r\n\r\n    void AppendString(const TCHAR *szString)\r\n    {\r\n        size_t iStrLen = lstrlen(szString);\r\n        for (size_t i = 0; i < iStrLen; i++)\r\n            Append(szString[i]);\r\n    }\r\n\r\n    void CopyFromHtml(const TCHAR *szNewString)\r\n    {\r\n        size_t iNewStrLen = lstrlen(szNewString);\r\n\r\n        Reset();\r\n\r\n        for (size_t i = 0; i < iNewStrLen; i++)\r\n        {\r\n            if (szNewString[i] == '&')\r\n                AppendString(_T(\"&amp;\"));\r\n            else if (szNewString[i] == '\"')\r\n                AppendString(_T(\"&quot;\"));\r\n            else if (szNewString[i] == '<')\r\n                AppendString(_T(\"&lt;\"));\r\n            else if (szNewString[i] == '>')\r\n                AppendString(_T(\"&gt;\"));\r\n            else\r\n                Append(szNewString[i]);\r\n        }\r\n\r\n        Append('\\0');\r\n    }\r\n\r\n    void CopyFrom(const TCHAR *szNewString)\r\n    {\r\n        lstrcpy(m_szString,szNewString);\r\n        m_uiPos = lstrlen(szNewString);\r\n    }\r\n\r\n    unsigned int Length()\r\n    {\r\n        return m_uiPos;\r\n    }\r\n\r\n    operator TCHAR *()\r\n    {\r\n        return m_szString;\r\n    }\r\n};\r\n\r\nclass CCustomStringA\r\n{\r\nprivate:\r\n    char *m_szString;\r\n    unsigned int m_uiSize;\r\n    unsigned int m_uiPos;\r\n\r\npublic:\r\n    CCustomStringA()\r\n    {\r\n        m_uiSize = CSTRING_DEFAULT_LENGTH;\r\n        m_uiPos = 0;\r\n        m_szString = new char[m_uiSize];\r\n    }\r\n\r\n    CCustomStringA(unsigned int uiSize)\r\n    {\r\n        m_uiSize = uiSize;\r\n        m_uiPos = 0;\r\n        m_szString = new char[m_uiSize];\r\n    }\r\n\r\n    ~CCustomStringA()\r\n    {\r\n        delete [] m_szString;\r\n    }\r\n\r\n    void Reset()\r\n    {\r\n        m_uiPos = 0;\r\n    }\r\n\r\n    void ReAllocate(unsigned int uiSize)\r\n    {\r\n        m_uiSize = uiSize;\r\n        m_uiPos = 0;\r\n\r\n        delete [] m_szString;\r\n        m_szString = new char[m_uiSize];\r\n    }\r\n\r\n    void Append(char c)\r\n    {\r\n        if (m_uiPos >= m_uiSize)\r\n        {\r\n            m_uiSize *= CSTRING_MEM_INCRATIO;\r\n\r\n            char *szNewString = new char[m_uiSize];\r\n            strcpy(szNewString,m_szString);\r\n\r\n            delete [] m_szString;\r\n            m_szString = szNewString;\r\n        }\r\n\r\n        m_szString[m_uiPos++] = c;\r\n    }\r\n\r\n    void CopyFrom(const char *szNewString)\r\n    {\r\n        strcpy(m_szString,szNewString);\r\n        m_uiPos = (unsigned int)strlen(szNewString);\r\n    }\r\n\r\n    unsigned int Length()\r\n    {\r\n        return m_uiPos;\r\n    }\r\n\r\n    operator char *()\r\n    {\r\n        return m_szString;\r\n    }\r\n};\r\n"
  },
  {
    "path": "src/base/file_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <ckcore/types.hh>\r\n#include <ckcore/string.hh>\r\n#include <ckcore/exception.hh>\r\n#include \"file_util.hh\"\r\n\r\nvoid WriteString(ckcore::File &File,const ckcore::tchar *szString)\r\n{\r\n    const ckcore::tuint32 uiByteCount =\r\n        static_cast<ckcore::tuint32>(ckcore::string::astrlen(szString) * sizeof(ckcore::tchar));\r\n    \r\n    if (uiByteCount != File.write(szString,uiByteCount))\r\n        throw ckcore::Exception2(ckT(\"Error writing to the file.\"));\t// FIXME: Improve message output.\r\n}"
  },
  {
    "path": "src/base/file_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/types.hh>\r\n#include <ckcore/file.hh>\r\n\r\nvoid WriteString(ckcore::File &File,const ckcore::tchar *szString);\r\n"
  },
  {
    "path": "src/base/graph_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <windows.h>\r\n#include \"graph_util.hh\"\r\n\r\nvoid DrawVertGradientRect(HDC hDC,RECT *pRect,COLORREF cTop,COLORREF cBottom)\r\n{\r\n    unsigned int uiClientHeight = pRect->bottom - pRect->top;\r\n\r\n    RECT rcBand;\r\n    rcBand.left = pRect->left;\r\n    rcBand.right = pRect->right;\r\n\r\n    int iBeginRGB[3];\r\n    int iRGBDiff[3];\r\n    int iR,iG,iB;\r\n\r\n    iBeginRGB[0] = GetRValue(cTop);\r\n    iBeginRGB[1] = GetGValue(cTop);\r\n    iBeginRGB[2] = GetBValue(cTop);\r\n\r\n    iRGBDiff[0] = GetRValue(cBottom) - iBeginRGB[0];\r\n    iRGBDiff[1] = GetGValue(cBottom) - iBeginRGB[1];\r\n    iRGBDiff[2] = GetBValue(cBottom) - iBeginRGB[2];\r\n\r\n    for (int i = pRect->top,j = 0; i < pRect->bottom; i++,j++)\r\n    {\r\n        iR = iBeginRGB[0] + MulDiv(j,iRGBDiff[0],uiClientHeight);\r\n        iG = iBeginRGB[1] + MulDiv(j,iRGBDiff[1],uiClientHeight);\r\n        iB = iBeginRGB[2] + MulDiv(j,iRGBDiff[2],uiClientHeight);\r\n\r\n        rcBand.top = (int)(i);\r\n        rcBand.bottom = (int)((i + 1));\r\n\r\n        HBRUSH hBrush = CreateSolidBrush(RGB(iR,iG,iB));\r\n            FillRect(hDC,&rcBand,hBrush);\r\n        DeleteObject(hBrush);\r\n    }\r\n}\r\n\r\nvoid DrawHorGradientRect(HDC hDC,RECT *pRect,COLORREF cLeft,COLORREF cRight)\r\n{\r\n    unsigned int uiClientWidth = pRect->right - pRect->left;\r\n\r\n    RECT rcBand;\r\n    rcBand.top = pRect->top;\r\n    rcBand.bottom = pRect->bottom;\r\n\r\n    int iBeginRGB[3];\r\n    int iRGBDiff[3];\r\n    int iR,iG,iB;\r\n\r\n    iBeginRGB[0] = GetRValue(cLeft);\r\n    iBeginRGB[1] = GetGValue(cLeft);\r\n    iBeginRGB[2] = GetBValue(cLeft);\r\n\r\n    iRGBDiff[0] = GetRValue(cRight) - iBeginRGB[0];\r\n    iRGBDiff[1] = GetGValue(cRight) - iBeginRGB[1];\r\n    iRGBDiff[2] = GetBValue(cRight) - iBeginRGB[2];\r\n\r\n    for (int i = pRect->left,j = 0; i < pRect->right; i++,j++)\r\n    {\r\n        iR = iBeginRGB[0] + MulDiv(j,iRGBDiff[0],uiClientWidth);\r\n        iG = iBeginRGB[1] + MulDiv(j,iRGBDiff[1],uiClientWidth);\r\n        iB = iBeginRGB[2] + MulDiv(j,iRGBDiff[2],uiClientWidth);\r\n\r\n        rcBand.left = (int)(i);\r\n        rcBand.right = (int)((i + 1));\r\n\r\n        HBRUSH hBrush = CreateSolidBrush(RGB(iR,iG,iB));\r\n            FillRect(hDC,&rcBand,hBrush);\r\n        DeleteObject(hBrush);\r\n    }\r\n}\r\n\r\nvoid ContractRect(RECT *pRect,int iSize)\r\n{\r\n    pRect->left += iSize;\r\n    pRect->right -= iSize;\r\n    pRect->top += iSize;\r\n    pRect->bottom -= iSize;\r\n}\r\n"
  },
  {
    "path": "src/base/graph_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nvoid DrawVertGradientRect(HDC hDC,RECT *pRect,COLORREF cTop,COLORREF cBottom);\r\nvoid DrawHorGradientRect(HDC hDC,RECT *pRect,COLORREF cLeft,COLORREF cRight);\r\nvoid ContractRect(RECT *pRect,int iSize);\r\n"
  },
  {
    "path": "src/base/lng_processor.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <tchar.h>\r\n#include <windows.h>\r\n#include \"lng_processor.hh\"\r\n#include \"string_conv.hh\"\r\n#include \"string_util.hh\"\r\n\r\nCLngProcessor::CLngProcessor(const TCHAR *szFullPath) : m_File(szFullPath)\r\n{\r\n    m_ulBufferSize = 0;\r\n    m_ulBufferPos = 0;\r\n\r\n    memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n    // Set the current child to the root.\r\n    m_pCurrent = NULL;\r\n}\r\n\r\nCLngProcessor::~CLngProcessor()\r\n{\r\n    Clear();\r\n}\r\n\r\nvoid CLngProcessor::Clear()\r\n{\r\n    // Free the children.\r\n    for (unsigned int iIndex = 0; iIndex < m_pSections.size(); iIndex++)\r\n    {\r\n        // Remove the object from m_Instances.\r\n        std::vector <CLngSection *>::iterator itObject = m_pSections.begin() + iIndex;\r\n        delete *itObject;\r\n    }\r\n\r\n    m_pSections.clear();\r\n}\r\n\r\nbool CLngProcessor::ReadNext(TCHAR &c)\r\n{\r\n    if (m_ulBufferPos == m_ulBufferSize)\r\n    {\r\n        memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n        ckcore::tint64 iRead = m_File.read(m_ucBuffer,sizeof(m_ucBuffer));\r\n        if (iRead == -1)\r\n            return false;\r\n\r\n        m_ulBufferSize = (unsigned long)iRead;\r\n        m_ulBufferSize /= sizeof(TCHAR);\r\n        m_ulBufferPos = 0;\r\n\r\n        TCHAR sz;\r\n        sz = true;\r\n\r\n        if (m_ulBufferSize == 0)\r\n            return false;\r\n    }\r\n\r\n    m_iRemainBytes -= sizeof(TCHAR);\r\n    c = m_ucBuffer[m_ulBufferPos++];\r\n    return true;\r\n}\r\n\r\nvoid CLngProcessor::ReadBack()\r\n{\r\n    if (m_ulBufferPos > 0)\r\n    {\r\n        m_iRemainBytes += sizeof(TCHAR);\r\n        m_ulBufferPos--;\r\n    }\r\n}\r\n\r\n/*\r\n    CLngProcessor::Load\r\n    -------------------\r\n    Loads the specified XML into a tree structure in memory. Varius return values.\r\n*/\r\nint CLngProcessor::Load()\r\n{\r\n    // Open the file.\r\n    if (!m_File.open(ckcore::File::ckOPEN_READ))\r\n        return LNGRES_FILEERROR;\r\n\r\n    // If the application is in an unicode environment we need to check what\r\n    // byte-order us used.\r\n    unsigned short usBOM = 0;\r\n    if (m_File.read(&usBOM,2) == -1)\r\n        return LNGRES_FILEERROR;\r\n\r\n    switch (usBOM)\r\n    {\r\n        // Currently the only supported byte-order.\r\n        case BOM_UTF32BE:\r\n            break;\r\n\r\n        case BOM_UTF8:\r\n        case BOM_UTF32LE:\r\n        case BOM_SCSU:\r\n            return LNGRES_UNSUPBOM;\r\n\r\n        default:\r\n            // If no BOM is found the file pointer has to be re-moved to the beginning.\r\n            if (m_File.seek(0,ckcore::File::ckFILE_BEGIN) == -1)\r\n                return LNGRES_FILEERROR;\r\n\r\n            break;\r\n    };\r\n\r\n    // Clear all current sections.\r\n    Clear();\r\n\r\n    // Set the current section to NULL.\r\n    m_pCurrent = NULL;\r\n\r\n    // The current section (when parsing).\r\n    CLngSection *pCurSection = NULL;\r\n\r\n    CCustomString szNameBuffer(11);\r\n\r\n    m_iRemainBytes = m_File.size() - m_File.tell();\r\n\r\n    bool bBreak = false;\r\n\r\n    int iCount = 0;\r\n\r\n    while (m_iRemainBytes)\r\n    {\r\n        iCount++;\r\n\r\n        TCHAR uc;\r\n        if (!ReadNext(uc))\r\n            break;\r\n\r\n        // Trim.\r\n        while (uc == ' ' || uc == '\\t' || uc == '\\r' || uc == '\\n')\r\n        {\r\n            if (!ReadNext(uc))\r\n            {\r\n                bBreak = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (bBreak)\r\n            break;\r\n\r\n        // We have found the beginning of a section.\r\n        if (uc == '[')\r\n        {\r\n            if (!ReadNext(uc))\r\n                break;\r\n\r\n            pCurSection = new CLngSection();\r\n            m_pSections.push_back(pCurSection);\r\n\r\n            while (uc != ']')\r\n            {\r\n                pCurSection->m_szName.Append(uc);\r\n                if (!ReadNext(uc))\r\n                    break;\r\n            }\r\n\r\n            pCurSection->m_szName.Append('\\0');\r\n        }\r\n        else\r\n        {\r\n            // Ignore all values that are not associated with a section.\r\n            if (pCurSection == NULL)\r\n                continue;\r\n\r\n            // If we didn't find a section we have found a value.\r\n            CLngValue *pNewValue = new CLngValue();\r\n\r\n            while (uc != '=')\r\n            {\r\n                szNameBuffer.Append(uc);\r\n                if (!ReadNext(uc))\r\n                    break;\r\n            }\r\n\r\n            szNameBuffer.Append('\\0');\r\n            lsscanf(szNameBuffer,_T(\"%x\"),&pNewValue->ulName);\r\n            szNameBuffer.Reset();\r\n\r\n            // Skip the '='.\r\n            if (!ReadNext(uc))\r\n                break;\r\n\r\n            while (uc != '\\n' && uc != '\\r')\r\n            {\r\n                // Look for esacpe.\r\n                if (uc == '\\\\')\r\n                {\r\n                    TCHAR uc0 = '\\0';\r\n                    if (!ReadNext(uc0))\r\n                    {\r\n                        szNameBuffer.Append(uc);\r\n                        break;\r\n                    }\r\n\r\n                    if (uc0 == '\\n' || uc0 == '\\r')\r\n                        break;\r\n\r\n                    switch (uc0)\r\n                    {\r\n                        case 'n':\r\n                            pNewValue->m_szValue.Append('\\n');\r\n                            break;\r\n                        default:\r\n                            pNewValue->m_szValue.Append(uc);\r\n                            pNewValue->m_szValue.Append(uc0);\r\n                            break;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    pNewValue->m_szValue.Append(uc);\r\n                }\r\n\r\n                if (!ReadNext(uc))\r\n                    break;\r\n            }\r\n\r\n            pNewValue->m_szValue.Append('\\0');\r\n\r\n            pCurSection->m_Values.push_back(pNewValue);\r\n        }\r\n    }\r\n\r\n    return LNGRES_OK;\r\n}\r\n\r\nbool CLngProcessor::EnterSection(const TCHAR *szSectionName)\r\n{\r\n    // First, check if we're already in the requested section.\r\n    if (m_pCurrent != NULL && !lstrcmp(szSectionName,m_pCurrent->m_szName))\r\n        return true;\r\n\r\n    for (unsigned int i = 0; i < m_pSections.size(); i++)\r\n    {\r\n        if (!lstrcmp(szSectionName,m_pSections[i]->m_szName))\r\n        {\r\n            m_pCurrent = m_pSections[i];\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CLngProcessor::GetValue(unsigned long ulName,TCHAR *szValue,unsigned int uiMaxValueLen)\r\n{\r\n    if (m_pCurrent == NULL)\r\n        return false;\r\n    \r\n    for (unsigned int i = 0; i < m_pCurrent->m_Values.size(); i++)\r\n    {\r\n        if (m_pCurrent->m_Values[i]->ulName == ulName)\r\n        {\r\n            if ((unsigned int)lstrlen(m_pCurrent->m_Values[i]->m_szValue) > uiMaxValueLen)\r\n                lstrncpy(szValue,m_pCurrent->m_Values[i]->m_szValue,uiMaxValueLen);\r\n            else\r\n                lstrcpy(szValue,m_pCurrent->m_Values[i]->m_szValue);\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CLngProcessor::GetValuePtr(unsigned long ulName,TCHAR *&szValue)\r\n{\r\n    if (m_pCurrent == NULL)\r\n        return false;\r\n    \r\n    for (unsigned int i = 0; i < m_pCurrent->m_Values.size(); i++)\r\n    {\r\n        if (m_pCurrent->m_Values[i]->ulName == ulName)\r\n        {\r\n            szValue = m_pCurrent->m_Values[i]->m_szValue;\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/base/lng_processor.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/file.hh>\r\n#include \"custom_string.hh\"\r\n\r\n#define BOM_UTF8\t\t\t\t0xEFBBBF\r\n#define BOM_UTF32BE\t\t\t\t0x0000FEFF\r\n#define BOM_UTF32LE\t\t\t\t0xFFFE0000\r\n#define BOM_SCSU\t\t\t\t0x0EFEFF\r\n\r\n#define LNG_NAMELENGTH\t\t\t128\r\n#define LNG_VALUELENGTH\t\t\t128\r\n\r\n#define LNG_BUFFER_SIZE\t\t\t1024\r\n\r\n// Return values.\r\n#define LNGRES_FAIL\t\t\t\t0x00\r\n#define LNGRES_OK\t\t\t\t0x01\r\n#define LNGRES_FILEERROR\t\t0x02\r\n#define LNGRES_UNSUPBOM\t\t\t0x03\r\n\r\nclass CLngValue\r\n{\r\npublic:\r\n    unsigned long ulName;\r\n    CCustomString m_szValue;\r\n\r\n    CLngValue() : m_szValue(LNG_VALUELENGTH)\r\n    {\r\n        ulName = 0;\r\n        m_szValue[0] = '\\0';\r\n    }\r\n\r\n    CLngValue(unsigned int uiValueLength) :\r\n        m_szValue(uiValueLength)\r\n    {\r\n        ulName = 0;\r\n        m_szValue[0] = '\\0';\r\n    }\r\n};\r\n\r\nclass CLngSection\r\n{\r\npublic:\r\n    CCustomString m_szName;\r\n    std::vector<CLngValue *> m_Values;\r\n\r\n    CLngSection() : m_szName(LNG_NAMELENGTH)\r\n    {\r\n        m_szName[0] = '\\0';\r\n    }\r\n\r\n    CLngSection(unsigned int uiNameLength) :\r\n        m_szName(uiNameLength)\r\n    {\r\n        m_szName[0] = '\\0';\r\n    }\r\n\r\n    ~CLngSection()\r\n    {\r\n        Clear();\r\n    }\r\n\r\n    void Clear()\r\n    {\r\n        // Free the children.\r\n        for (unsigned int iIndex = 0; iIndex < m_Values.size(); iIndex++)\r\n        {\r\n            // Remove the object from m_Instances.\r\n            std::vector <CLngValue *>::iterator itObject = m_Values.begin() + iIndex;\r\n            delete *itObject;\r\n        }\r\n\r\n        m_Values.clear();\r\n    }\r\n};\r\n\r\nclass CLngProcessor\r\n{\r\nprotected:\r\n    ckcore::File m_File;\r\n\r\n    TCHAR m_ucBuffer[LNG_BUFFER_SIZE];\r\n    unsigned long m_ulBufferSize;\r\n    unsigned long m_ulBufferPos;\r\n\r\n    __int64 m_iRemainBytes;\r\n\r\n    std::vector<CLngSection *> m_pSections;\r\n    CLngSection *m_pCurrent;\r\n\r\n    void Clear();\r\n\r\n    bool ReadNext(TCHAR &c);\r\n    void ReadBack();\r\n\r\npublic:\r\n    CLngProcessor(const TCHAR *szFullPath);\r\n    ~CLngProcessor();\r\n\r\n    int Load();\r\n\r\n    bool EnterSection(const TCHAR *szSectionName);\r\n\r\n    bool GetValue(unsigned long ulName,TCHAR *szValue,unsigned int uiMaxValueLen);\r\n    bool GetValuePtr(unsigned long ulName,TCHAR *&szValue);\r\n};\r\n"
  },
  {
    "path": "src/base/string_container.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <tchar.h>\r\n#include <windows.h>\r\n#include \"string_container.hh\"\r\n#include \"custom_string.hh\"\r\n\r\nCStringContainer::CStringContainer()\r\n{\r\n    m_ulBufferSize = 0;\r\n    m_ulBufferPos = 0;\r\n\r\n    memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n}\r\n\r\nCStringContainer::~CStringContainer()\r\n{\r\n    m_szStrings.clear();\r\n}\r\n\r\nbool CStringContainer::ReadNext(ckcore::File &File,TCHAR &c)\r\n{\r\n    if (m_ulBufferPos == m_ulBufferSize)\r\n    {\r\n        memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n        ckcore::tint64 iRead = File.read(m_ucBuffer,sizeof(m_ucBuffer));\r\n        if (iRead == -1)\r\n            return false;\r\n\r\n        m_ulBufferSize = (unsigned long)iRead;\r\n        m_ulBufferSize /= sizeof(TCHAR);\r\n        m_ulBufferPos = 0;\r\n\r\n        if (m_ulBufferSize == 0)\r\n            return false;\r\n    }\r\n\r\n    m_iRemainBytes -= sizeof(TCHAR);\r\n    c = m_ucBuffer[m_ulBufferPos++];\r\n    return true;\r\n}\r\n\r\n/*\r\n    CStringContainer::SaveToFile\r\n    ----------------------------\r\n    Saves the container data to the file with the specified file name. If bCRLF\r\n    is set each line will be terminated with <Carriage-Return><Line-Feed>,\r\n    otherwise only a new line (Line-Feed) will be used.\r\n*/\r\nint CStringContainer::SaveToFile(const TCHAR *szFileName,bool bCRLF)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return SCRES_FAIL;\r\n\r\n    // Write byte order mark.\r\n    unsigned short usBOM = BOM_UTF32BE;\r\n    if (File.write(&usBOM,2) == -1)\r\n        return SCRES_FAIL;\r\n\r\n    // Find the longest string.\r\n    unsigned int uiLongestString = 0;\r\n    for (unsigned int i = 0; i < m_szStrings.size(); i++)\r\n    {\r\n        if (m_szStrings[i].length() > uiLongestString)\r\n            uiLongestString = (unsigned int)m_szStrings[i].length();\r\n    }\r\n\r\n    // Write the strings to the file.\r\n    TCHAR *szBuffer = new TCHAR[uiLongestString + 3];\r\n\r\n    for (unsigned int i = 0; i < m_szStrings.size(); i++)\r\n    {\r\n        lstrcpy(szBuffer,m_szStrings[i].c_str());\r\n\r\n        if (bCRLF)\r\n            lstrcat(szBuffer,TEXT(\"\\r\\n\"));\r\n        else\r\n            lstrcat(szBuffer,TEXT(\"\\n\"));\r\n\r\n        if (File.write((void *)szBuffer,lstrlen(szBuffer) * sizeof(TCHAR)) == -1)\r\n        {\r\n            delete [] szBuffer;\r\n            return SCRES_FAIL;\r\n        }\r\n    }\r\n\r\n    delete [] szBuffer;\r\n    return SCRES_OK;\r\n}\r\n\r\nint CStringContainer::LoadFromFile(const TCHAR *szFileName)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return SCRES_FAIL;\r\n\r\n    // Read byte order mark.\r\n    unsigned short usBOM = 0;\r\n    if (File.read(&usBOM,2) == -1)\r\n        return SCRES_FAIL;\r\n\r\n    switch (usBOM)\r\n    {\r\n        // Currently the only supported byte-order.\r\n        case BOM_UTF32BE:\r\n            break;\r\n\r\n        case BOM_UTF8:\r\n        case BOM_UTF32LE:\r\n        case BOM_SCSU:\r\n            return SCRES_UNSUPBOM;\r\n\r\n        default:\r\n            // If no BOM is found the file pointer has to be re-moved to the beginning.\r\n            if (File.seek(0,ckcore::File::ckFILE_BEGIN) == -1)\r\n                return SCRES_FAIL;\r\n\r\n            break;\r\n    };\r\n\r\n    // Read the file data.\r\n    CCustomString Buffer(256);\r\n    m_iRemainBytes = File.size();\r\n\r\n    while (m_iRemainBytes)\r\n    {\r\n        TCHAR uc;\r\n        if (!ReadNext(File,uc))\r\n            break;\r\n\r\n        if (uc == '\\r')\r\n        {\r\n            continue;\r\n        }\r\n        else if (uc == '\\n')\r\n        {\r\n            Buffer.Append('\\0');\r\n            m_szStrings.push_back((TCHAR *)Buffer);\r\n            Buffer.Reset();\r\n            continue;\r\n        }\r\n\r\n        Buffer.Append(uc);\r\n    }\r\n\r\n    return SCRES_OK;\r\n}\r\n\r\nCStringContainerA::CStringContainerA()\r\n{\r\n    m_ulBufferSize = 0;\r\n    m_ulBufferPos = 0;\r\n\r\n    memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n}\r\n\r\nCStringContainerA::~CStringContainerA()\r\n{\r\n    m_szStrings.clear();\r\n}\r\n\r\nbool CStringContainerA::ReadNext(ckcore::File &File,char &c)\r\n{\r\n    if (m_ulBufferPos == m_ulBufferSize)\r\n    {\r\n        memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n        ckcore::tint64 iRead = File.read(m_ucBuffer,sizeof(m_ucBuffer));\r\n        if (iRead == -1)\r\n            return false;\r\n\r\n        m_ulBufferSize = (unsigned long)iRead;\r\n        m_ulBufferPos = 0;\r\n\r\n        if (m_ulBufferSize == 0)\r\n            return false;\r\n    }\r\n\r\n    m_iRemainBytes--;\r\n    c = m_ucBuffer[m_ulBufferPos++];\r\n    return true;\r\n}\r\n\r\n/*\r\n    CStringContainer::SaveToFile\r\n    ----------------------------\r\n    Saves the container data to the file with the specified file name. If bCRLF\r\n    is set each line will be terminated with <Carriage-Return><Line-Feed>,\r\n    otherwise only a new line (Line-Feed) will be used.\r\n*/\r\nint CStringContainerA::SaveToFile(const TCHAR *szFileName,bool bCRLF)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return SCRES_FAIL;\r\n\r\n    // Find the longest string.\r\n    unsigned int uiLongestString = 0;\r\n    for (unsigned int i = 0; i < m_szStrings.size(); i++)\r\n    {\r\n        if (m_szStrings[i].length() > uiLongestString)\r\n            uiLongestString = (unsigned int)m_szStrings[i].length();\r\n    }\r\n\r\n    // Write the strings to the file.\r\n    char *szBuffer = new char[uiLongestString + 3];\r\n\r\n    for (unsigned int i = 0; i < m_szStrings.size(); i++)\r\n    {\r\n        strcpy(szBuffer,m_szStrings[i].c_str());\r\n\r\n        if (bCRLF)\r\n            strcat(szBuffer,\"\\r\\n\");\r\n        else\r\n            strcat(szBuffer,\"\\n\");\r\n\r\n        if (File.write((void *)szBuffer,(unsigned long)strlen(szBuffer)) == -1)\r\n        {\r\n            delete [] szBuffer;\r\n            return SCRES_FAIL;\r\n        }\r\n    }\r\n\r\n    delete [] szBuffer;\r\n    return SCRES_OK;\r\n}\r\n\r\nint CStringContainerA::LoadFromFile(const TCHAR *szFileName)\r\n{\r\n    ckcore::File File(szFileName);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return SCRES_FAIL;\r\n\r\n    // Read the file data.\r\n    CCustomStringA Buffer(256);\r\n    m_iRemainBytes = File.size();\r\n\r\n    while (m_iRemainBytes)\r\n    {\r\n        char uc;\r\n        if (!ReadNext(File,uc))\r\n            break;\r\n\r\n        if (uc == '\\r')\r\n        {\r\n            continue;\r\n        }\r\n        else if (uc == '\\n')\r\n        {\r\n            Buffer.Append('\\0');\r\n            m_szStrings.push_back((char *)Buffer);\r\n            Buffer.Reset();\r\n            continue;\r\n        }\r\n\r\n        Buffer.Append(uc);\r\n    }\r\n\r\n    return SCRES_OK;\r\n}\r\n"
  },
  {
    "path": "src/base/string_container.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/file.hh>\r\n\r\n#define BOM_UTF8\t\t\t\t0xEFBBBF\r\n#define BOM_UTF32BE\t\t\t\t0x0000FEFF\r\n#define BOM_UTF32LE\t\t\t\t0xFFFE0000\r\n#define BOM_SCSU\t\t\t\t0x0EFEFF\r\n\r\n#define SCRES_FAIL\t\t\t\t0x00\r\n#define SCRES_OK\t\t\t\t0x01\r\n#define SCRES_UNSUPBOM\t\t\t0x02\r\n\r\n#define SC_BUFFER_SIZE\t\t\t1024\r\n\r\nclass CStringContainer\r\n{\r\nprivate:\r\n    TCHAR m_ucBuffer[SC_BUFFER_SIZE];\r\n    unsigned long m_ulBufferSize;\r\n    unsigned long m_ulBufferPos;\r\n\r\n    __int64 m_iRemainBytes;\r\n\r\n    bool ReadNext(ckcore::File &File,TCHAR &c);\r\n\r\npublic:\r\n    std::vector<std::wstring> m_szStrings;\r\n\r\n    CStringContainer();\r\n    ~CStringContainer();\r\n\r\n    int SaveToFile(const TCHAR *szFileName,bool bCRLF = true);\r\n    int LoadFromFile(const TCHAR *szFileName);\r\n};\r\n\r\nclass CStringContainerA\r\n{\r\nprivate:\r\n    char m_ucBuffer[SC_BUFFER_SIZE];\r\n    unsigned long m_ulBufferSize;\r\n    unsigned long m_ulBufferPos;\r\n\r\n    __int64 m_iRemainBytes;\r\n\r\n    bool ReadNext(ckcore::File &File,char &c);\r\n\r\npublic:\r\n    std::vector<std::string> m_szStrings;\r\n\r\n    CStringContainerA();\r\n    ~CStringContainerA();\r\n\r\n    int SaveToFile(const TCHAR *szFileName,bool bCRLF = true);\r\n    int LoadFromFile(const TCHAR *szFileName);\r\n};\r\n"
  },
  {
    "path": "src/base/string_conv.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <windows.h>\r\n#include \"string_conv.hh\"\r\n\r\nint StringToInt(const TCHAR *szString)\r\n{\r\n    return _wtoi(szString);\r\n}\r\n\r\n__int64 StringToInt64(const TCHAR *szString)\r\n{\r\n    return _wtoi64(szString);\r\n}\r\n\r\ndouble StringToDouble(const TCHAR *szString)\r\n{\r\n    return _wtof(szString);\r\n}\r\n\r\nlong StringToLong(const TCHAR *szString)\r\n{\r\n    return _wtol(szString);\r\n}\r\n"
  },
  {
    "path": "src/base/string_conv.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\nint StringToInt(const TCHAR *szString);\r\n__int64 StringToInt64(const TCHAR *szString);\r\ndouble StringToDouble(const TCHAR *szString);\r\nlong StringToLong(const TCHAR *szString);\r\n"
  },
  {
    "path": "src/base/string_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <wchar.h>\r\n#include <windows.h>\r\n#include <atlbase.h>\r\n#include <ckcore/types.hh>\r\n#include \"string_util.hh\"\r\n\r\n// FIXME: Backslash in the name is missleading.\r\nTCHAR *IncludeTrailingBackslash(TCHAR *szPath)\r\n{\r\n    int iLength = lstrlen(szPath);\r\n\r\n    if (szPath[iLength - 1] != '\\\\' && szPath[iLength - 1] != '/')\r\n    {\r\n        szPath[iLength] = '\\\\';\r\n        szPath[iLength + 1] = '\\0';\r\n    }\r\n\r\n    return szPath;\r\n}\r\n\r\n// FIXME: Backslash in the name is missleading.\r\nTCHAR *ExcludeTrailingBackslash(TCHAR *szPath)\r\n{\r\n    int iLength = lstrlen(szPath);\r\n\r\n    if (szPath[iLength - 1] == '\\\\' || szPath[iLength - 1] == '/')\r\n        szPath[iLength - 1] = '\\0';\r\n\r\n    return szPath;\r\n}\r\n\r\nTCHAR *SubString(const TCHAR *szText,unsigned int uiStart,unsigned int uiLength)\r\n{\r\n    TCHAR *szResult;\r\n    int iLength = lstrlen(szText);\r\n\r\n    if (!szText || (uiStart + uiLength > (unsigned int)iLength))\r\n    {\r\n        szResult = new TCHAR[1];\r\n        szResult[0] = '\\0';\r\n\r\n        return szResult;\r\n    }\r\n\r\n    szResult = new TCHAR[uiLength + 1];\r\n    unsigned int j = 0;\r\n\r\n    for (unsigned int i = uiStart; i < uiStart + uiLength; i++,j++)\r\n        szResult[j] = szText[i];\r\n\r\n    szResult[j] = '\\0';\r\n\r\n    return szResult;\r\n}\r\n\r\nvoid FormatBytes(TCHAR *szBuffer,unsigned __int64 iBytes)\r\n{\r\n    if (iBytes < 1024)\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes & 0xFFFFFFFF),TEXT(\"Bytes\"));\r\n    else if (iBytes < 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%.02f %s\"),(double)iBytes/(1024.0),TEXT(\"KiB\"));\r\n    else if (iBytes < 1024 * 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%.02f %s\"),(double)iBytes/(1024.0 * 1024.0),TEXT(\"MiB\"));\r\n    else if (iBytes < (signed __int64)1024 * 1024 * 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%.02f %s\"),(double)iBytes/(1024.0 * 1024.0 * 1024.0),TEXT(\"GiB\"));\r\n    else\r\n        swprintf(szBuffer,TEXT(\"%.02f %s\"),(double)iBytes/(1024.0 * 1024.0 * 1024.0 * 1024.0),TEXT(\"TiB\"));\r\n}\r\n\r\n/*\r\n    Same as FormatBytes but does not include any decimals.\r\n*/\r\nvoid FormatBytesEx(TCHAR *szBuffer,unsigned __int64 iBytes)\r\n{\r\n    if (iBytes < 1024)\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes & 0xFFFFFFFF),TEXT(\"Bytes\"));\r\n    else if (iBytes < 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes/(1024.0)),TEXT(\"KiB\"));\r\n    else if (iBytes < 1024 * 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes/(1024.0 * 1024.0)),TEXT(\"MiB\"));\r\n    else if (iBytes < (signed __int64)1024 * 1024 * 1024 * 1024)\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes/(1024.0 * 1024.0 * 1024.0)),TEXT(\"GiB\"));\r\n    else\r\n        swprintf(szBuffer,TEXT(\"%d %s\"),(int)(iBytes/(1024.0 * 1024.0 * 1024.0 * 1024.0)),TEXT(\"TiB\"));\r\n}\r\n\r\nclass CNumberFmt\r\n{\r\nprivate:\r\n    TCHAR m_szDecimalSep[10];\r\n    TCHAR m_szThousandSep[10];\r\n\r\npublic:\r\n    NUMBERFMT m_NumberFmt;\r\n\r\n    void RetrieveDefaults(void);\r\n};\r\n\r\nvoid CNumberFmt::RetrieveDefaults(void)\r\n{\r\n    // Please avoid memset to clear the data structures,\r\n    // as it confuses test software like BoundsChecker,\r\n    // it's actually slower (!) and is not really portable.\r\n    m_szDecimalSep[0]  = _T('\\0');\r\n    m_szThousandSep[0] = _T('\\0');\r\n\r\n    m_NumberFmt.NumDigits     = 0;\r\n    m_NumberFmt.LeadingZero   = 0;\r\n    m_NumberFmt.Grouping      = 0;\r\n    m_NumberFmt.lpDecimalSep  = m_szDecimalSep;\r\n    m_NumberFmt.lpThousandSep = m_szThousandSep;\r\n    m_NumberFmt.NegativeOrder = 0;\r\n\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_IDIGITS | LOCALE_RETURN_NUMBER,\r\n                                 LPTSTR(&m_NumberFmt.NumDigits),\r\n                                 sizeof(m_NumberFmt.NumDigits) / sizeof(TCHAR)));\r\n\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_ILZERO | LOCALE_RETURN_NUMBER,\r\n                                 LPTSTR(&m_NumberFmt.LeadingZero),\r\n                                 sizeof(m_NumberFmt.LeadingZero) / sizeof(TCHAR)));\r\n\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_SDECIMAL,\r\n                                 m_szDecimalSep,\r\n                                 _countof(m_szDecimalSep)));\r\n\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_STHOUSAND,\r\n                                 m_szThousandSep,\r\n                                 _countof( m_szThousandSep)));\r\n\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_INEGNUMBER | LOCALE_RETURN_NUMBER,\r\n                                 LPTSTR(&m_NumberFmt.NegativeOrder),\r\n                                 sizeof(m_NumberFmt.NegativeOrder) / sizeof(TCHAR)));\r\n\r\n    TCHAR szBuffer[100]; // Huge, but just in case.\r\n    ATLVERIFY(0 != GetLocaleInfo(LOCALE_USER_DEFAULT,\r\n                                 LOCALE_SGROUPING,\r\n                                 szBuffer,\r\n                                 _countof(szBuffer)));\r\n\r\n    // Now the ugly part. Have to convert from something like string \"3;2;0\" to\r\n    // int 32.\r\n    for (const TCHAR *pParseGrpS = szBuffer; *pParseGrpS != _T('\\0'); ++pParseGrpS)\r\n    {\r\n        if ((*pParseGrpS >= _T('1')) && (*pParseGrpS <= _T('9')))\r\n            m_NumberFmt.Grouping = m_NumberFmt.Grouping * 10 + (*pParseGrpS - _T('0'));\r\n\r\n        if ((*pParseGrpS != _T('0')) && !pParseGrpS[1])\r\n            m_NumberFmt.Grouping *= 10;\r\n    }\r\n}\r\n\r\n// Formats the given integer number according to the locale, adding for example\r\n// thousand separators. The only difference to the default formatting is that\r\n// no decimal digits are displayed.\r\nvoid FormatInteger(unsigned __int64 uiValue,TCHAR *szBuffer,\r\n                   unsigned uiBufferSize)\r\n{\r\n    const unsigned MIN_CHAR_COUNT = 80;\t\t\t\t// The documentation for _ui64tot_s says 65 characters max.\r\n    ATLASSERT(uiBufferSize >= MIN_CHAR_COUNT * 2);  // We certainly need less than that, but I don't know exactly how much.\r\n\r\n    TCHAR szNumber[MIN_CHAR_COUNT];\r\n    _ui64tot_s(uiValue,szNumber,_countof(szNumber),10);\r\n\r\n    CNumberFmt Fmt;\r\n    Fmt.RetrieveDefaults();\r\n    Fmt.m_NumberFmt.NumDigits = 0;\r\n\r\n    ATLVERIFY(0 != GetNumberFormat(LOCALE_USER_DEFAULT,\r\n                                   0,\r\n                                   szNumber,\r\n                                   &Fmt.m_NumberFmt,\r\n                                   szBuffer,\r\n                                   uiBufferSize));\r\n}\r\n\r\nint LastDelimiter(const TCHAR *szString,TCHAR cDelimiter)\r\n{    \r\n    int iLength = lstrlen(szString);\r\n\r\n    for (int i = iLength - 1; i >= 0; i--)\r\n    {\r\n        if (szString[i] == cDelimiter)\r\n            return i;\r\n    }\r\n\r\n    return -1;\r\n}\r\n\r\nint FirstDelimiter(const TCHAR *szString,TCHAR cDelimiter)\r\n{\r\n    int iLength = lstrlen(szString);\r\n\r\n    for (int i = 0; i < iLength; i++)\r\n    {\r\n        if (szString[i] == cDelimiter)\r\n            return i;    \r\n    }\r\n\r\n    return -1;\r\n}\r\n\r\nbool ExtractFilePath(TCHAR *szFileName)\r\n{\r\n    int iLastDelimiter = LastDelimiter(szFileName,'\\\\');\r\n\r\n    if (LastDelimiter(szFileName,'/') > iLastDelimiter)\r\n        iLastDelimiter = LastDelimiter(szFileName,'/');\r\n\r\n    if (iLastDelimiter == -1)\r\n        return false;\r\n\r\n    szFileName[iLastDelimiter + 1] = '\\0';\t\r\n    return true;\r\n}\r\n\r\nbool ExtractFileName(TCHAR *szFileName)\r\n{\r\n    int iLastDelimiter = LastDelimiter(szFileName,'\\\\');\r\n\r\n    if (LastDelimiter(szFileName,'/') > iLastDelimiter)\r\n        iLastDelimiter = LastDelimiter(szFileName,'/');\r\n\r\n    if (iLastDelimiter == -1)\r\n        return false;\r\n\r\n    lstrcpy(szFileName,szFileName + (iLastDelimiter + 1));\r\n    return true;\r\n}\r\n\r\nbool ChangeFileExt(TCHAR *szFileName,const TCHAR *szFileExt)\r\n{\r\n    unsigned int uiLastDelimiter = LastDelimiter(szFileName,'.');\r\n\r\n    const TCHAR *pFileExt = szFileExt;\r\n    TCHAR *pFileName = szFileName + uiLastDelimiter;\r\n\r\n    do\r\n    {\r\n        *pFileName = *pFileExt;\r\n        *pFileName++;\r\n    } while (*pFileExt++);\r\n\r\n    return true;\r\n}\r\n\r\nvoid ForceSlashDelimiters(TCHAR *szFileName)\r\n{\r\n    unsigned int uiLength = lstrlen(szFileName);\r\n\r\n    for (unsigned int i = 0; i < uiLength; i++)\r\n    {\r\n        if (szFileName[i] == '\\\\')\r\n            szFileName[i] = '/';\r\n    }\r\n}\r\n\r\n/*\r\n    ComparePaths\r\n    ------------\r\n    Works exactly like the strcmp function except that the path delimiters /\r\n    and \\ are concidered to be equal.\r\n*/\r\nint ComparePaths(const TCHAR *szPath1,const TCHAR *szPath2)\r\n{\r\n    int iResult = 0;\r\n\r\n    while (true)\r\n    {\r\n        while (!(iResult = *(unsigned char *)szPath1 - *(unsigned char *)szPath2) && *szPath2)\r\n            ++szPath1,++szPath2;\r\n\r\n        if (*(unsigned char *)szPath1 != '\\\\' && *(unsigned char *)szPath1 != '/')\r\n            break;\r\n\r\n        if (*(unsigned char *)szPath2 != '\\\\' && *(unsigned char *)szPath2 != '/')\r\n            break;\r\n\r\n        ++szPath1,++szPath2;\r\n    }\r\n\r\n    if (iResult < 0)\r\n        iResult = -1;\r\n    else if (iResult > 0)\r\n        iResult = 1;\r\n\r\n    return iResult;\r\n}\r\n\r\n/*\r\n    TrimRight\r\n    ---------\r\n    Removes all white-spaces on the right side of a string.\r\n*/\r\nvoid TrimRight(TCHAR *szString)\r\n{\r\n    for (int i = lstrlen(szString) - 1; i >= 0; i--)\r\n    {\r\n        if (szString[i] == ' ')\r\n            szString[i] = '\\0';\r\n        else\r\n            break;\r\n    }\r\n}\r\n\r\nvoid TrimLeft(ckcore::tstring &Str,const ckcore::tchar * const szCharsToRemove)\r\n{\r\n    ckcore::tstring::size_type Pos = Str.find_first_not_of(szCharsToRemove);\r\n\r\n    if (Pos != ckcore::tstring::npos)\r\n        Str.erase(0,Pos);\r\n    else\r\n        Str.clear();\r\n}\r\n\r\nvoid TrimRight(ckcore::tstring &Str,const ckcore::tchar * const szCharsToRemove)\r\n{\r\n    ckcore::tstring::size_type Pos = Str.find_last_not_of(szCharsToRemove);\r\n\r\n    if (Pos != ckcore::tstring::npos)\r\n        Str.erase(Pos + 1);\r\n    else\r\n        Str.clear();\r\n}\r\n\r\n/*\r\n    SkipInteger\r\n    -----------\r\n    Locates the end of the integer and return a pointer to that location.\r\n*/\r\nchar *SkipInteger(char *szString)\r\n{\r\n    // Skip all white spaces.\r\n    while (*szString == ' ')\r\n        *szString++;\r\n\r\n    // Skip all digits.\r\n    while (isdigit(*szString))\r\n        *szString++;\r\n\r\n    return szString;\r\n}\r\n\r\n/*\r\n    Converts an ANSI string into UTF-16 (BE). iTargetSize should be the size\r\n    of szTarget counted in wchar_ts.\r\n*/\r\nvoid AnsiToUnicode(wchar_t *szTarget,const char *szSource,int iTargetSize)\r\n{\r\n    int iConverted = MultiByteToWideChar(::AreFileApisANSI() ? CP_ACP : CP_OEMCP,MB_PRECOMPOSED,\r\n        szSource,(int)strlen(szSource) + 1,szTarget,iTargetSize);\r\n\r\n    if (iConverted == iTargetSize)\r\n        szTarget[iTargetSize - 1] = '\\0';\r\n}\r\n\r\n/*\r\n    Converts a UTF-16 (BE) string into ANSI. iTargetSize should be the size\r\n    of szTarget counted in bytes.\r\n*/\r\nvoid UnicodeToAnsi(char *szTarget,const wchar_t *szSource,int iTargetSize)\r\n{\r\n    int iConverted = WideCharToMultiByte(::AreFileApisANSI() ? CP_ACP : CP_OEMCP,0,\r\n        szSource,(int)lstrlenW(szSource) + 1,szTarget,iTargetSize,NULL,NULL);\r\n\r\n    if (iConverted == iTargetSize)\r\n        szTarget[iTargetSize - 1] = '\\0';\r\n}\r\n\r\nckcore::tstring GetCygwinFileName(const TCHAR *szFileName)\r\n{\r\n    size_t uiLength = lstrlen(szFileName);\r\n\r\n    ckcore::tstring CygPath;\r\n\r\n    // Check if UNC path.\r\n    if (uiLength > 2 && szFileName[0] == '\\\\' && szFileName[1] == '\\\\')\r\n    {\r\n        CygPath = szFileName;\r\n\r\n        // Replace all backslashes by slashes.\r\n        ckcore::tstring::iterator it;\r\n        for (it = CygPath.begin(); it != CygPath.end(); it++)\r\n        {\r\n            TCHAR &c = *it;\r\n            if (c == '\\\\')\r\n                c = '/';\r\n        }\r\n    }\r\n    else\t// If not UNC path convert to proper cygwin path.\r\n    {\r\n        CygPath = _T(\"/cygdrive/\");\r\n\r\n        // Copy the drive letter.\r\n        CygPath.push_back(szFileName[0]);\r\n        CygPath.push_back('/');\r\n\r\n        CygPath.append(szFileName + 3);\r\n\r\n        // Replace all backslashes by slashes.\r\n        ckcore::tstring::iterator it;\r\n        for (it = CygPath.begin(); it != CygPath.end(); it++)\r\n        {\r\n            TCHAR &c = *it;\r\n            if (c == '\\\\')\r\n                c = '/';\r\n        }\r\n    }\r\n\r\n    return CygPath;\r\n}\r\n\r\nvoid GetCygwinFileName(const TCHAR *szFileName,TCHAR *szCygwinFileName)\r\n{\r\n    // Check if UNC path.\r\n    size_t uiLength = lstrlen(szFileName);\r\n    if (uiLength > 2 && szFileName[0] == '\\\\' && szFileName[1] == '\\\\')\r\n    {\r\n        lstrcpy(szCygwinFileName,szFileName);\r\n\r\n        // Replace all backslashes by slashes.\r\n        for (size_t i = 0; i < uiLength; i++)\r\n        {\r\n            if (szCygwinFileName[i] == '\\\\')\r\n                szCygwinFileName[i] = '/';\r\n        }\r\n    }\r\n    else\t// If not UNC path convert to proper cygwin path.\r\n    {\r\n        lstrcpy(szCygwinFileName,_T(\"/cygdrive/\"));\r\n\r\n        // Copy the drive letter.\r\n        szCygwinFileName[10] = szFileName[0];\r\n        szCygwinFileName[11] = '/';\r\n        szCygwinFileName[12] = '\\0';\r\n\r\n        lstrcat(szCygwinFileName,szFileName + 3);\r\n\r\n        // Replace all backslashes by slashes.\r\n        uiLength = lstrlen(szCygwinFileName);\r\n        for (size_t i = 13; i < uiLength; i++)\r\n        {\r\n            if (szCygwinFileName[i] == '\\\\')\r\n                szCygwinFileName[i] = '/';\r\n        }\r\n    }\r\n}\r\n\r\n/*\r\n    lsnprintf_s\r\n    -----------\r\n    A secure version of lsprintf which does not allow buffer overruns and alwways\r\n    terminates with a null character.\r\n*/\r\nvoid lsnprintf_s(TCHAR *szBuffer,int iBufferLength,const TCHAR *szFormatString,...)\r\n{\r\n    va_list vlArgs;\r\n    va_start(vlArgs,szFormatString);\r\n\r\n    int iCount = _vsnwprintf(szBuffer,iBufferLength - 1,szFormatString,vlArgs);\r\n    if (iCount < 0 || iCount == iBufferLength)\r\n        szBuffer[iBufferLength - 1] = '\\0';\r\n}"
  },
  {
    "path": "src/base/string_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/types.hh>\r\n\r\n#ifndef _T\r\n#define _T TEXT\r\n#endif\r\n\r\nTCHAR *IncludeTrailingBackslash(TCHAR *szPath);\r\nTCHAR *ExcludeTrailingBackslash(TCHAR *szPath);\r\nTCHAR *SubString(const TCHAR *szText,unsigned int uiStart,unsigned int uiLength);\r\n\r\nvoid FormatBytes(TCHAR *szBuffer,unsigned __int64 iBytes);\r\nvoid FormatBytesEx(TCHAR *szBuffer,unsigned __int64 iBytes);\r\nvoid FormatInteger(unsigned __int64 uiValue,TCHAR *szBuffer,unsigned uiBufferSize);\r\n\r\nint LastDelimiter(const TCHAR *szString,TCHAR cDelimiter);\r\nint FirstDelimiter(const TCHAR *szString,TCHAR cDelimiter);\r\nbool ExtractFilePath(TCHAR *szFileName);\r\nbool ExtractFileName(TCHAR *szFileName);\r\nbool ChangeFileExt(TCHAR *szFileName,const TCHAR *szFileExt);\r\nvoid ForceSlashDelimiters(TCHAR *szFileName);\r\nint ComparePaths(const TCHAR *szPath1,const TCHAR *szPath2);\r\n\r\nvoid TrimRight(TCHAR *szString);\r\nvoid TrimRight(ckcore::tstring &Str,const ckcore::tchar * const szCharsToRemove);\r\nvoid TrimLeft(ckcore::tstring &Str,const ckcore::tchar * const szCharsToRemove);\r\ninline void TrimStr(ckcore::tstring &Str,const ckcore::tchar * const szCharsToRemove)\r\n{\r\n    TrimRight(Str,szCharsToRemove); TrimLeft(Str,szCharsToRemove);\r\n}\r\n\r\nchar *SkipInteger(char *szString);\r\n\r\nvoid AnsiToUnicode(wchar_t *szTarget,const char *szSource,int iTargetSize);\r\nvoid UnicodeToAnsi(char *szTarget,const wchar_t *szSource,int iTargetSize);\r\n\r\nvoid GetCygwinFileName(const TCHAR *szFileName,TCHAR *szCygwinFileName);\r\nckcore::tstring GetCygwinFileName(const TCHAR *szFileName);\r\n\r\nvoid lsnprintf_s(TCHAR *szBuffer,int iBufferLength,const TCHAR *szFormatString,...);\r\n\r\n#define lstrncmp wcsncmp\r\n#define lsscanf swscanf\r\n#define lsprintf swprintf\r\n#define lstrncpy _tcsncpy\r\n#define lstrncat wcsncat"
  },
  {
    "path": "src/base/xml_processor.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <tchar.h>\r\n#include <windows.h>\r\n#include \"xml_processor.hh\"\r\n#include \"string_conv.hh\"\r\n\r\nconst wchar_t CXmlProcessor::m_szXMLHeader[] = _T(\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-16\\\" standalone=\\\"yes\\\"?>\\r\\n\");\r\n\r\nCXmlProcessor::CXmlProcessor(eMode Mode) : m_Mode(Mode)\r\n{\r\n    m_ulBufferSize = 0;\r\n    m_ulBufferPos = 0;\r\n\r\n    memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n    m_pRoot = new CXmlElement();\r\n    lstrcpy(m_pRoot->m_szName,_T(\"Root\"));\r\n\r\n    // Set the current child to the root.\r\n    m_pCurrent = m_pRoot;\r\n}\r\n\r\nCXmlProcessor::~CXmlProcessor()\r\n{\r\n    delete m_pRoot;\r\n}\r\n\r\nvoid CXmlProcessor::DumpBuffer()\r\n{\r\n    ckcore::File File(_T(\"xml_buffer_dump.txt\"));\r\n    if (File.open(ckcore::File::ckOPEN_WRITE))\r\n        File.write(m_ucBuffer,sizeof(m_ucBuffer));\r\n}\r\n\r\nbool CXmlProcessor::ReadNext(ckcore::File &File,TCHAR &c)\r\n{\r\n    if (m_ulBufferPos == m_ulBufferSize)\r\n    {\r\n        memset(m_ucBuffer,0,sizeof(m_ucBuffer));\r\n\r\n        ckcore::tint64 iRead = File.read(m_ucBuffer,sizeof(m_ucBuffer));\r\n        if (iRead == -1)\r\n            return false;\r\n\r\n        m_ulBufferSize = (unsigned long)iRead;\r\n        m_ulBufferSize /= sizeof(TCHAR);\r\n        m_ulBufferPos = 0;\r\n\r\n        TCHAR sz;\r\n        sz = true;\r\n\r\n        if (m_ulBufferSize == 0)\r\n            return false;\r\n    }\r\n\r\n    m_iRemainBytes -= sizeof(TCHAR);\r\n    c = m_ucBuffer[m_ulBufferPos++];\r\n    return true;\r\n}\r\n\r\nvoid CXmlProcessor::ReadBack()\r\n{\r\n    if (m_ulBufferPos > 0)\r\n    {\r\n        m_iRemainBytes += sizeof(TCHAR);\r\n        m_ulBufferPos--;\r\n    }\r\n}\r\n\r\n/*\r\n    CXmlProcessor::ReadTagAttr\r\n    -----------------------\r\n    Reads the current tag's attributes. It returns false if the element is empty\r\n    and true if it's not. \r\n*/\r\nbool CXmlProcessor::ReadTagAttr(ckcore::File &File,CXmlElement *pElement)\r\n{\r\n    TCHAR uc;\r\n    if (!ReadNext(File,uc))\r\n        return false;\r\n\r\n    CXmlAttribute *pAttr = new CXmlAttribute();\r\n\r\n    while (uc != '>')\r\n    {\r\n        // Check if this is an empty element.\r\n        if (uc == '/')\r\n        {\r\n            if (!ReadNext(File,uc))\r\n            {\r\n                delete pAttr;\r\n                return false;\r\n            }\r\n\r\n            if (uc == '>')\r\n            {\r\n                delete pAttr;\r\n                return false;\r\n            }\r\n\r\n            pAttr->m_szName.Append('/');\r\n            pElement->m_ulAttrLength++;\r\n        }\r\n\r\n        // Check if we have reached a \". In that case we expect a value.\r\n        if (uc == '=')\r\n        {\r\n            pAttr->m_szName.Append('\\0');\r\n\r\n            // Skip the first \".\r\n            ReadNext(File,uc);\r\n\r\n            ReadNext(File,uc);\r\n            while (uc != '\"')\r\n            {\r\n                pAttr->m_szValue.Append(uc);\r\n                pElement->m_ulAttrLength++;\r\n\r\n                if (!ReadNext(File,uc))\r\n                    break;\r\n            }\r\n\r\n            pAttr->m_szValue.Append('\\0');\r\n            pElement->m_Attributes.push_back(pAttr);\r\n\r\n            // Allocate memory for the next attribute.\r\n            pAttr = new CXmlAttribute();\r\n        }\r\n        else\r\n        {\r\n            if (uc != ' ')\r\n            {\r\n                pAttr->m_szName.Append(uc);\r\n                pElement->m_ulAttrLength++;\r\n            }\r\n        }\r\n\r\n        if (!ReadNext(File,uc))\r\n        {\r\n            delete pAttr;\r\n            return false;\r\n        }\r\n    }\r\n\r\n    delete pAttr;\r\n    return true;\r\n}\r\n\r\n/*\r\n    CXmlProcessor::ReadNextTag\r\n    -----------------------\r\n    Reads the next tag in the file. It returns false if the element is empty\r\n    and true if it's not.\r\n*/\r\nbool CXmlProcessor::ReadNextTag(ckcore::File &File,CXmlElement *pElement)\r\n{\r\n    TCHAR uc;\r\n    if (!ReadNext(File,uc))\r\n        return false;\r\n\r\n    bool bResult = true;\r\n\r\n    while (uc != '>')\r\n    {\r\n        if (uc == ' ')\r\n        {\r\n            bResult = ReadTagAttr(File,pElement);\r\n            break;\r\n        }\r\n\r\n        pElement->m_szName.Append(uc);\r\n        if (!ReadNext(File,uc))\r\n            return false;\r\n    }\r\n\r\n    pElement->m_szName.Append('\\0');\r\n    return bResult;\r\n}\r\n\r\n/*\r\n    CXmlProcessor::Load\r\n    -------------------\r\n    Loads the specified XML into a tree structure in memory. Varius return values.\r\n*/\r\nint CXmlProcessor::Load(const TCHAR *szFullPath)\r\n{\r\n    // Open the file.\r\n    ckcore::File File(szFullPath);\r\n    if (!File.open(ckcore::File::ckOPEN_READ))\r\n        return XMLRES_FILEERROR;\r\n\r\n    // If the application is in an unicode environment we need to check what\r\n    // byte-order us used.\r\n    unsigned short usBOM = 0;\r\n    if (File.read(&usBOM,2) == -1)\r\n        return XMLRES_FILEERROR;\r\n\r\n    switch (usBOM)\r\n    {\r\n        // Currently the only supported byte-order.\r\n        case BOM_UTF32BE:\r\n            break;\r\n\r\n        case BOM_UTF8:\r\n        case BOM_UTF32LE:\r\n        case BOM_SCSU:\r\n            return XMLRES_UNSUPBOM;\r\n\r\n        default:\r\n            // If no BOM is found the file pointer has to be re-moved to the beginning.\r\n            if (File.seek(0,ckcore::File::ckFILE_BEGIN) == -1)\r\n                return XMLRES_FILEERROR;\r\n\r\n            break;\r\n    };\r\n\r\n    // Clear the root.\r\n    m_pRoot->Clear();\r\n    CXmlElement *pCurElem = m_pRoot;\r\n\r\n    // Set the current child to the root.\r\n    m_pCurrent = m_pRoot;\r\n\r\n    m_iRemainBytes = File.size();\r\n\r\n    unsigned int uiDataPos = 0;\r\n\r\n    bool bHandleData = false;\r\n\r\n    while (m_iRemainBytes)\r\n    {\r\n        TCHAR uc;\r\n        if (!ReadNext(File,uc))\r\n            break;\r\n\r\n        // We have found the beginning of a tag.\r\n        if (uc == '<')\r\n        {\r\n            if (!ReadNext(File,uc))\r\n                break;\r\n\r\n            // Check if we have reached the end of a section.\r\n            if (uc == '/')\r\n            {\r\n                CCustomString szTemp(XML_NAMELENGTH);\r\n                \r\n                if (!ReadNext(File,uc))\r\n                    break;\r\n\r\n                while (uc != '>')\r\n                {\r\n                    szTemp.Append(uc);\r\n                    if (!ReadNext(File,uc))\r\n                        break;\r\n                }\r\n\r\n                szTemp.Append('\\0');\r\n\r\n                if (lstrcmp(pCurElem->m_szName,szTemp))\r\n                {\r\n                    return XMLRES_BADSYNC;\r\n                }\r\n                else\r\n                {\r\n                    bHandleData = false;\r\n\r\n                    if (uiDataPos != 0)\r\n                    {\r\n                        pCurElem->m_szData.Append('\\0');\r\n                        uiDataPos = 0;\r\n                    }\r\n\r\n                    pCurElem = pCurElem->m_pParent;\r\n                }\r\n            }\r\n            else if (uc == '?')\t// Check if we have reached a processing unstruction.\r\n            {\r\n                TCHAR cTemp;\r\n                if (!ReadNext(File,cTemp))\r\n                    break;\r\n\r\n                while (cTemp != '>')\r\n                {\r\n                    if (!ReadNext(File,cTemp))\r\n                        break;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                ReadBack();\r\n\r\n                if (uiDataPos != 0)\r\n                {\r\n                    pCurElem->m_szData.Append('\\0');\r\n                    uiDataPos = 0;\r\n                }\r\n\r\n                // Add the new element.\r\n                CXmlElement *pNewElem = new CXmlElement();\t\r\n                pNewElem->m_pParent = pCurElem;\r\n\r\n                bHandleData = ReadNextTag(File,pNewElem);\r\n\r\n                if (pCurElem != NULL)\r\n                    pCurElem->m_Children.push_back(pNewElem);\r\n\r\n                if (bHandleData)\r\n                    pCurElem = pNewElem;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            // Filter some characters.\r\n            if (uc == '\\t' || uc == '\\n' || uc == '\\r')\r\n                continue;\r\n\r\n            pCurElem->m_szData.Append(uc);\r\n            uiDataPos++;\r\n        }\r\n    }\r\n\r\n    return XMLRES_OK;\r\n}\r\n\r\nvoid CXmlProcessor::SaveEntity(ckcore::File &File,unsigned int uiIndent,CXmlElement *pElement)\r\n{\r\n    // If the element contains no information we skip it.\r\n    if (pElement->m_Children.size() == 0 &&\r\n        /*pElement->m_szAttr[0] == '\\0' &&*/\r\n        pElement->m_Attributes.size() == 0 &&\r\n        pElement->m_szData[0] == '\\0')\r\n    {\r\n        return;\r\n    }\r\n\r\n    // The length of the complete attributes string when printed to the buffer.\r\n    unsigned long ulAttrLength = pElement->m_ulAttrLength +\r\n        (unsigned long)pElement->m_Attributes.size() * 4;\r\n    \r\n    // The epsilon value compensates for some <, > and / characters.\r\n    TCHAR *szOutBuf = new TCHAR[\r\n        pElement->m_szName.Length() * 2 +\r\n        pElement->m_szData.Length() +\r\n        ulAttrLength +\r\n        uiIndent +\r\n        XML_OUTBUF_EPSILON];\r\n    unsigned int i = 0;\r\n\r\n    // Indent.\r\n    for (i = 0; i < uiIndent; i++)\r\n        szOutBuf[i] = '\\t';\r\n    \r\n    szOutBuf[i++] = '<';\r\n    szOutBuf[i] = '\\0';\r\n\r\n    // Name.\r\n    lstrcat(szOutBuf,pElement->m_szName);\r\n\r\n    // Attributes.\r\n    for (i = 0; i < pElement->m_Attributes.size(); i++)\r\n    {\r\n        lstrcat(szOutBuf,_T(\" \"));\r\n        lstrcat(szOutBuf,pElement->m_Attributes[i]->m_szName);\r\n        lstrcat(szOutBuf,_T(\"=\\\"\"));\r\n        lstrcat(szOutBuf,pElement->m_Attributes[i]->m_szValue);\r\n        lstrcat(szOutBuf,_T(\"\\\"\"));\r\n    }\r\n\r\n    // End of the tag.\r\n    if (pElement->m_Children.size() != 0)\r\n    {\r\n        if (pElement->m_szData[0] == '\\0')\r\n            lstrcat(szOutBuf,_T(\">\\r\\n\"));\r\n        else\r\n            lstrcat(szOutBuf,_T(\">\"));\r\n    }\r\n    else\r\n    {\r\n        if (pElement->m_szData[0] == '\\0')\r\n            lstrcat(szOutBuf,_T(\"/>\\r\\n\"));\r\n        else\r\n            lstrcat(szOutBuf,_T(\">\"));\r\n    }\r\n\r\n    // Write to the file.\r\n    File.write(szOutBuf,lstrlen(szOutBuf) * sizeof(TCHAR));\r\n\r\n    // Write the data.\r\n    if (pElement->m_szData[0] != '\\0')\r\n    {\r\n        lstrcpy(szOutBuf,pElement->m_szData);\r\n\r\n        // ...\r\n        if (pElement->m_Children.size() != 0)\r\n            lstrcat(szOutBuf,_T(\"\\r\\n\"));\r\n        // ...\r\n\r\n        File.write(szOutBuf,lstrlen(szOutBuf) * sizeof(TCHAR));\r\n    }\r\n\r\n    // Traverse the children.\r\n    for (i = 0; i < pElement->m_Children.size(); i++)\r\n        SaveEntity(File,uiIndent + 1,pElement->m_Children[i]);\r\n\r\n    // Re-indent if necessary.\r\n    if (pElement->m_Children.size() != 0)\r\n    {\r\n        for (i = 0; i < uiIndent; i++)\r\n            szOutBuf[i] = '\\t';\r\n    }\r\n    else\r\n    {\r\n         i = 0;\r\n    }\r\n    \r\n    // If the element has data or has children we should include a full termination tag.\r\n    if (pElement->m_szData[0] != '\\0' ||\r\n        pElement->m_Children.size() != 0)\r\n    {\r\n        szOutBuf[i++] = '<';\r\n        szOutBuf[i++] = '/';\r\n        szOutBuf[i] = '\\0';\r\n\r\n        lstrcat(szOutBuf,pElement->m_szName);\r\n        lstrcat(szOutBuf,_T(\">\\r\\n\"));\r\n\r\n        File.write(szOutBuf,lstrlen(szOutBuf) * sizeof(TCHAR));\r\n    }\r\n\r\n    delete [] szOutBuf;\r\n}\r\n\r\n/*\r\n    CXmlProcessor::Save\r\n    -------------------\r\n    Saves the current loaded XML-structure to a file with the specified filename.\r\n    Various return values.\r\n*/\r\nint CXmlProcessor::Save(const TCHAR *szFullPath)\r\n{\r\n    // Open the file.\r\n    ckcore::File File(szFullPath);\r\n    if (!File.open(ckcore::File::ckOPEN_WRITE))\r\n        return XMLRES_FILEERROR;\r\n\r\n    // Write byte-order mark.\r\n#ifdef XML_SAVE_BOM\r\n    unsigned short usBOM = BOM_UTF32BE;\r\n    if (File.write(&usBOM,2) == -1)\r\n    {\r\n        File.remove();\r\n        return XMLRES_FILEERROR;\r\n    }\r\n#endif\r\n\r\n    // Write the header.\r\n    if (File.write((void *)m_szXMLHeader,lstrlen(m_szXMLHeader) * sizeof(TCHAR)) == -1)\r\n    {\r\n        File.remove();\r\n        return XMLRES_FILEERROR;\r\n    }\r\n\r\n    for (unsigned int i = 0; i < m_pRoot->m_Children.size(); i++)\r\n        SaveEntity(File,0,m_pRoot->m_Children[i]);\r\n\r\n    return XMLRES_OK;\r\n}\r\n\r\n/*\r\n    XMLProcessor::EnterElement\r\n    --------------------------\r\n    Enters the specified element if it exists. True is returned upon success,\r\n    false if the specified element was not found.\r\n*/\r\nbool CXmlProcessor::EnterElement(const TCHAR *szName)\r\n{\r\n    for (unsigned int i = 0; i < m_pCurrent->m_Children.size(); i++)\r\n    {\r\n        if (!lstrcmp(m_pCurrent->m_Children[i]->m_szName,szName))\r\n        {\r\n            m_pCurrent = m_pCurrent->m_Children[i];\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nbool CXmlProcessor::EnterElement(unsigned int uiIndex)\r\n{\r\n    if (uiIndex >= m_pCurrent->m_Children.size())\r\n        return false;\r\n\r\n    m_pCurrent = m_pCurrent->m_Children[uiIndex];\r\n    return true;\r\n}\r\n\r\n/*\r\n    CXmlProcessor::LeaveElement\r\n    ---------------------------\r\n    Leaves the current element. True is returned if the operation was successful,\r\n    otherwise false is returned.\r\n*/\r\nbool CXmlProcessor::LeaveElement()\r\n{\r\n    if (m_pCurrent->m_pParent != NULL)\r\n    {\r\n        m_pCurrent = m_pCurrent->m_pParent;\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nunsigned int CXmlProcessor::GetElementChildCount()\r\n{\r\n    return (unsigned int)m_pCurrent->m_Children.size();\r\n}\r\n\r\nbool CXmlProcessor::GetElementAttrValue(const TCHAR *szAttrName,TCHAR *&szValue)\r\n{\r\n    for (unsigned int i = 0; i < m_pCurrent->m_Attributes.size(); i++)\r\n    {\r\n        if (!lstrcmp(m_pCurrent->m_Attributes[i]->m_szName,szAttrName))\r\n        {\r\n            szValue = m_pCurrent->m_Attributes[i]->m_szValue;\r\n            return true;\r\n        }\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,TCHAR *szValue,int iMaxLength)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData) && lstrlen(szData) < iMaxLength)\r\n        lstrcpy(szValue,szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,bool *pValue)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData))\r\n        *pValue = StringToInt(szData) != 0;\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,int *pValue)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData))\r\n        *pValue = StringToInt(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,__int64 *pValue)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData))\r\n        *pValue = StringToInt64(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,double *pValue)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData))\r\n        *pValue = StringToDouble(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementAttrValue(const TCHAR *szAttrName,long *pValue)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementAttrValue(szAttrName,szData))\r\n        *pValue = StringToLong(szData);\r\n}\r\n\r\nbool CXmlProcessor::GetElementData(TCHAR *&szData)\r\n{\r\n    if (m_pCurrent->m_szData[0] == '\\0')\r\n        return false;\r\n\r\n    szData = m_pCurrent->m_szData;\r\n    return true;\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,TCHAR *pData,int iMaxLength)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n        {\r\n            if (lstrlen(szData) < iMaxLength)\r\n                lstrcpy(pData,szData);\r\n        }\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,bool *pData)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n            *pData = StringToInt(szData) != 0;\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,int *pData)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n            *pData = StringToInt(szData);\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,__int64 *pData)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n            *pData = StringToInt64(szData);\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,double *pData)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n            *pData = StringToDouble(szData);\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(const TCHAR *szName,long *pData)\r\n{\r\n    if (EnterElement(szName))\r\n    {\r\n        TCHAR *szData = NULL;\r\n        if (GetElementData(szData))\r\n            *pData = StringToLong(szData);\r\n\r\n        LeaveElement();\r\n    }\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(TCHAR *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        lstrcpy(pData,szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(bool *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        *pData = StringToInt(szData) != 0;\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(int *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        *pData = StringToInt(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(__int64 *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        *pData = StringToInt64(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(double *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        *pData = StringToDouble(szData);\r\n}\r\n\r\nvoid CXmlProcessor::GetSafeElementData(long *pData)\r\n{\r\n    TCHAR *szData = NULL;\r\n    if (GetElementData(szData))\r\n        *pData = StringToLong(szData);\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,const TCHAR *szData,bool bEnter)\r\n{\r\n    CXmlElement *pNewElem = new CXmlElement(lstrlen(szName) + 1,lstrlen(szData) + 1);\r\n    if (!pNewElem)\r\n        return false;\r\n\r\n    pNewElem->m_pParent = m_pCurrent;\r\n    pNewElem->m_szName.CopyFrom(szName);\r\n\r\n    if (m_Mode == MODE_HTML)\r\n        pNewElem->m_szData.CopyFromHtml(szData);\r\n    else\r\n        pNewElem->m_szData.CopyFrom(szData);\r\n\r\n    m_pCurrent->m_Children.push_back(pNewElem);\r\n\r\n    if (bEnter)\r\n        m_pCurrent = pNewElem;\r\n\r\n    return true;\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,bool bData,bool bEnter)\r\n{\r\n    return AddElement(szName,(int)bData,bEnter);\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,int iData,bool bEnter)\r\n{\r\n    TCHAR szTemp[16];\r\n    _itow(iData,szTemp,10);\r\n\r\n    return AddElement(szName,szTemp,bEnter);\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,__int64 iData,bool bEnter)\r\n{\r\n    TCHAR szTemp[32];\r\n    _i64tow(iData,szTemp,10);\r\n\r\n    return AddElement(szName,szTemp,bEnter);\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,double dData,bool bEnter)\r\n{\r\n    TCHAR szTemp[32];\r\n    swprintf(szTemp,_T(\"%f\"),dData);\r\n\r\n    return AddElement(szName,szTemp,bEnter);\r\n}\r\n\r\nbool CXmlProcessor::AddElement(const TCHAR *szName,long lData,bool bEnter)\r\n{\r\n    TCHAR szTemp[16];\r\n    _ltow(lData,szTemp,10);\r\n\r\n    return AddElement(szName,szTemp,bEnter);\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,const TCHAR *szValue)\r\n{\r\n    CXmlAttribute *pNewAttr = new CXmlAttribute(lstrlen(szAttrName) + 1,lstrlen(szValue) + 1);\r\n    if (!pNewAttr)\r\n        return false;\r\n\r\n    pNewAttr->m_szName.CopyFrom(szAttrName);\r\n\r\n    if (m_Mode == MODE_HTML)\r\n        pNewAttr->m_szValue.CopyFromHtml(szValue);\r\n    else\r\n        pNewAttr->m_szValue.CopyFrom(szValue);\r\n\r\n    m_pCurrent->m_Attributes.push_back(pNewAttr);\r\n    m_pCurrent->m_ulAttrLength += lstrlen(szAttrName) + lstrlen(szValue);\r\n    return true;\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,bool bValue)\r\n{\r\n    return AddElementAttr(szAttrName,(int)bValue);\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,int iValue)\r\n{\r\n    TCHAR szTemp[16];\r\n    _itow(iValue,szTemp,10);\r\n\r\n    return AddElementAttr(szAttrName,szTemp);\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,__int64 iValue)\r\n{\r\n    TCHAR szTemp[32];\r\n    _i64tow(iValue,szTemp,10);\r\n\r\n    return AddElementAttr(szAttrName,szTemp);\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,double dValue)\r\n{\r\n    TCHAR szTemp[32];\r\n    swprintf(szTemp,_T(\"%f\"),dValue);\r\n\r\n    return AddElementAttr(szAttrName,szTemp);\r\n}\r\n\r\nbool CXmlProcessor::AddElementAttr(const TCHAR *szAttrName,long lValue)\r\n{\r\n    TCHAR szTemp[16];\r\n    _ltow(lValue,szTemp,10);\r\n\r\n    return AddElementAttr(szAttrName,szTemp);\r\n}\r\n"
  },
  {
    "path": "src/base/xml_processor.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include <ckcore/file.hh>\r\n#include \"custom_string.hh\"\r\n\r\n#define BOM_UTF8\t\t\t\t0xEFBBBF\r\n#define BOM_UTF32BE\t\t\t\t0x0000FEFF\r\n#define BOM_UTF32LE\t\t\t\t0xFFFE0000\r\n#define BOM_SCSU\t\t\t\t0x0EFEFF\r\n\r\n#define XML_NAMELENGTH\t\t\t128\r\n//#define XML_ATTRLENGTH\t\t\t256\r\n#define XML_DATALENGTH\t\t\t256\r\n\r\n// ...\r\n#define XML_ATTR_NAMELENGTH\t\t32\r\n#define XML_ATTR_VALUELENGTH\t16\r\n// ...\r\n\r\n#define XML_OUTBUF_EPSILON\t\t16\r\n#define XML_BUFFER_SIZE\t\t\t1024\r\n#define XML_SAVE_BOM\r\n\r\n// Return values.\r\n#define XMLRES_FAIL\t\t\t\t0x00\r\n#define XMLRES_OK\t\t\t\t0x01\r\n#define XMLRES_BADSYNC\t\t\t0x02\r\n#define XMLRES_FILEERROR\t\t0x03\r\n#define XMLRES_UNSUPBOM\t\t\t0x04\r\n\r\nclass CXmlAttribute\r\n{\r\npublic:\r\n    CCustomString m_szName;\r\n    CCustomString m_szValue;\r\n\r\n    CXmlAttribute() : m_szName(XML_ATTR_NAMELENGTH), m_szValue(XML_ATTR_VALUELENGTH)\r\n    {\r\n    }\r\n\r\n    CXmlAttribute(unsigned int uiNameLength,unsigned int uiValueLength) :\r\n        m_szName(uiNameLength), m_szValue(uiValueLength)\r\n    {\r\n    }\r\n};\r\n\r\nclass CXmlElement\r\n{\r\npublic:\r\n    CCustomString m_szName;\r\n    CCustomString m_szData;\r\n\r\n    unsigned long m_ulAttrLength;\r\n\r\n    std::vector<CXmlAttribute *> m_Attributes;\r\n    std::vector<CXmlElement *> m_Children;\r\n    CXmlElement *m_pParent;\r\n\r\n    CXmlElement() : m_szName(XML_NAMELENGTH), m_szData(XML_DATALENGTH)\r\n    {\r\n        m_szName[0] = '\\0';\r\n        m_szData[0] = '\\0';\r\n\r\n        m_ulAttrLength = 0;\r\n    }\r\n\r\n    CXmlElement(unsigned int uiNameLength,unsigned int uiDataLength) :\r\n        m_szName(uiNameLength), m_szData(uiDataLength)\r\n    {\r\n        m_szName[0] = '\\0';\r\n        m_szData[0] = '\\0';\r\n\r\n        m_ulAttrLength = 0;\r\n    }\r\n\r\n    ~CXmlElement()\r\n    {\r\n        Clear();\r\n    }\r\n\r\n    void Clear()\r\n    {\r\n        // Free the children.\r\n        for (unsigned int iIndex = 0; iIndex < m_Children.size(); iIndex++)\r\n        {\r\n            // Remove the object from m_Instances.\r\n            std::vector <CXmlElement *>::iterator itObject = m_Children.begin() + iIndex;\r\n            delete *itObject;\r\n        }\r\n\r\n        m_Children.clear();\r\n\r\n        // ...\r\n        for (unsigned int iIndex = 0; iIndex < m_Attributes.size(); iIndex++)\r\n        {\r\n            // Remove the object from m_Instances.\r\n            std::vector <CXmlAttribute *>::iterator itObject = m_Attributes.begin() + iIndex;\r\n            delete *itObject;\r\n        }\r\n\r\n        m_Children.clear();\r\n    }\r\n};\r\n\r\nclass CXmlProcessor\r\n{\r\npublic:\r\n    enum eMode\r\n    {\r\n        MODE_NORMAL,\r\n        MODE_HTML\r\n    };\r\n\r\nprivate:\r\n    eMode m_Mode;\r\n\r\n    TCHAR m_ucBuffer[XML_BUFFER_SIZE];\r\n    unsigned long m_ulBufferSize;\r\n    unsigned long m_ulBufferPos;\r\n\r\n    __int64 m_iRemainBytes;\r\n\r\n    CXmlElement *m_pRoot;\r\n    CXmlElement *m_pCurrent;\r\n\r\n    void DumpBuffer();\r\n\r\n    bool ReadNext(ckcore::File &File,TCHAR &c);\r\n    void ReadBack();\r\n\r\n    bool ReadTagAttr(ckcore::File &File,CXmlElement *pElement);\r\n    bool ReadNextTag(ckcore::File &File,CXmlElement *pElement);\r\n\r\n    void SaveEntity(ckcore::File &File,unsigned int uiIndent,CXmlElement *pElement);\r\n\r\n    static const wchar_t m_szXMLHeader[];\r\n\r\npublic:\r\n    CXmlProcessor(eMode Mode = MODE_NORMAL);\r\n    ~CXmlProcessor();\r\n\r\n    int Load(const TCHAR *szFullPath);\r\n    int Save(const TCHAR *szFullPath);\r\n\r\n    bool EnterElement(const TCHAR *szName);\r\n    bool EnterElement(unsigned int uiIndex);\r\n    bool LeaveElement();\r\n\r\n    unsigned int GetElementChildCount();\r\n\r\n    bool GetElementAttrValue(const TCHAR *szAttrName,TCHAR *&szValue);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,TCHAR *szValue,int iMaxLength);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,bool *pValue);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,int *pValue);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,__int64 *pValue);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,double *pValue);\r\n    void GetSafeElementAttrValue(const TCHAR *szAttrName,long *pValue);\r\n\r\n    bool GetElementData(TCHAR *&szData);\r\n    void GetSafeElementData(const TCHAR *szName,TCHAR *pData,int iMaxLength);\r\n    void GetSafeElementData(const TCHAR *szName,bool *pData);\r\n    void GetSafeElementData(const TCHAR *szName,int *pData);\r\n    void GetSafeElementData(const TCHAR *szName,__int64 *pData);\r\n    void GetSafeElementData(const TCHAR *szName,double *pData);\r\n    void GetSafeElementData(const TCHAR *szName,long *pData);\r\n\r\n    void GetSafeElementData(TCHAR *pData);\r\n    void GetSafeElementData(bool *pData);\r\n    void GetSafeElementData(int *pData);\r\n    void GetSafeElementData(__int64 *pData);\r\n    void GetSafeElementData(double *pData);\r\n    void GetSafeElementData(long *pData);\r\n\r\n    bool AddElement(const TCHAR *szName,const TCHAR *szData,bool bEnter = false);\r\n    bool AddElement(const TCHAR *szName,bool bData,bool bEnter = false);\r\n    bool AddElement(const TCHAR *szName,int iData,bool bEnter = false);\r\n    bool AddElement(const TCHAR *szName,__int64 iData,bool bEnter = false);\r\n    bool AddElement(const TCHAR *szName,double dData,bool bEnter = false);\r\n    bool AddElement(const TCHAR *szName,long uData,bool bEnter = false);\r\n    bool AddElementAttr(const TCHAR *szAttrName,const TCHAR *szValue);\r\n    bool AddElementAttr(const TCHAR *szAttrName,bool bValue);\r\n    bool AddElementAttr(const TCHAR *szAttrName,int iValue);\r\n    bool AddElementAttr(const TCHAR *szAttrName,__int64 iValue);\r\n    bool AddElementAttr(const TCHAR *szAttrName,double dValue);\r\n    bool AddElementAttr(const TCHAR *szAttrName,long lValue);\r\n};\r\n"
  },
  {
    "path": "src/codecs/lame/config_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_dlg.hh\"\r\n\r\nCConfigDlg::CConfigDlg(CEncoderConfig *pConfig) : CPropertySheetImpl<CConfigDlg>(_T(\"Configuration\"),0,NULL)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW;\r\n\r\n    m_GeneralPage.SetConfig(pConfig);\r\n    AddPage(m_GeneralPage);\r\n}\r\n\r\nCConfigDlg::~CConfigDlg()\r\n{\r\n}\r\n\r\nLRESULT CConfigDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/codecs/lame/config_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"config_general_page.hh\"\r\n\r\nclass CConfigDlg : public CPropertySheetImpl<CConfigDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CConfigGeneralPage m_GeneralPage;\r\n\r\npublic:\r\n    CConfigDlg(CEncoderConfig *pConfig);\r\n    ~CConfigDlg();\r\n\r\n    BEGIN_MSG_MAP(CConfigDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CConfigDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/lame/config_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_general_page.hh\"\r\n\r\nCConfigGeneralPage::CConfigGeneralPage()\r\n{\r\n    m_pConfig = NULL;\r\n}\r\n\r\nCConfigGeneralPage::~CConfigGeneralPage()\r\n{\r\n}\r\n\r\nbool CConfigGeneralPage::SetConfig(CEncoderConfig *pConfig)\r\n{\r\n    if (pConfig == NULL)\r\n        return false;\r\n\r\n    m_pConfig = pConfig;\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::OnApply()\r\n{\r\n    m_pConfig->m_bMono = IsDlgButtonChecked(IDC_MONOCHECK) == TRUE;\r\n    m_pConfig->m_bBitrateMode = IsDlgButtonChecked(IDC_BITRATERADIO) == TRUE;\r\n    m_pConfig->m_bConstantBitrate = IsDlgButtonChecked(IDC_BITRATECHECK) == TRUE;\r\n    m_pConfig->m_bFastVBR = m_VBRModeComboBox.GetCurSel() == 1;\r\n\r\n    m_pConfig->m_iPreset = m_PresetComboBox.GetCurSel();\r\n    m_pConfig->m_iEncodeQuality = m_EncQualityComboBox.GetCurSel();\r\n    m_pConfig->m_iBitrate = m_BitrateTrackBar.GetPos();\r\n    m_pConfig->m_iQuality = m_QualityTrackBar.GetPos();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Fill the preset combo box.\r\n    m_PresetComboBox = GetDlgItem(IDC_PRESETCOMBO);\r\n    m_PresetComboBox.AddString(_T(\"Custom\"));\r\n    m_PresetComboBox.AddString(_T(\"Medium (VBR 150-180 kbps)\"));\r\n    m_PresetComboBox.AddString(_T(\"Standard (VBR 170-210 kbps)\"));\r\n    m_PresetComboBox.AddString(_T(\"Extreme (VBR 200-240 kbps)\"));\r\n    m_PresetComboBox.AddString(_T(\"Insane (CBR 320 kbps)\"));\r\n    m_PresetComboBox.SetCurSel(m_pConfig->m_iPreset);\r\n\r\n    // Fill the encode quality combo box.\r\n    m_EncQualityComboBox = GetDlgItem(IDC_ENCODEQUALITYCOMBO);\r\n    m_EncQualityComboBox.AddString(_T(\"Fast\"));\r\n    m_EncQualityComboBox.AddString(_T(\"Standard\"));\r\n    m_EncQualityComboBox.AddString(_T(\"High\"));\r\n    m_EncQualityComboBox.SetCurSel(m_pConfig->m_iEncodeQuality);\r\n\r\n    // Fill the VBR mode combo box.\r\n    m_VBRModeComboBox = GetDlgItem(IDC_VBRMODECOMBO);\r\n    m_VBRModeComboBox.AddString(_T(\"Standard\"));\r\n    m_VBRModeComboBox.AddString(_T(\"Fast\"));\r\n    m_VBRModeComboBox.SetCurSel((int)m_pConfig->m_bFastVBR);\r\n\r\n    // Perform a Windows XP theme check here to move the radio button.\r\n    /*CStatic BitrateStatic = GetDlgItem(IDC_BITRATESTATIC);\r\n\r\n    RECT rcWindow;\r\n    BitrateStatic.GetWindowRect(&rcWindow);\r\n    ScreenToClient(&rcWindow);\r\n\r\n    rcWindow.left -= 2;\r\n    BitrateStatic.MoveWindow(&rcWindow);*/\r\n\r\n    // Setup the bitrate slider.\r\n    m_BitrateTrackBar = GetDlgItem(IDC_BITRATESLIDER);\r\n    m_BitrateTrackBar.SetRange(8,320);\r\n    m_BitrateTrackBar.SetPageSize(8);\r\n    m_BitrateTrackBar.SetLineSize(8);\r\n    m_BitrateTrackBar.SetTic(16);\r\n    m_BitrateTrackBar.SetTic(24);\r\n    m_BitrateTrackBar.SetTic(32);\r\n    m_BitrateTrackBar.SetTic(40);\r\n    m_BitrateTrackBar.SetTic(48);\r\n    m_BitrateTrackBar.SetTic(56);\r\n    m_BitrateTrackBar.SetTic(64);\r\n    m_BitrateTrackBar.SetTic(80);\r\n    m_BitrateTrackBar.SetTic(96);\r\n    m_BitrateTrackBar.SetTic(112);\r\n    m_BitrateTrackBar.SetTic(128);\r\n    m_BitrateTrackBar.SetTic(144);\r\n    m_BitrateTrackBar.SetTic(160);\r\n    m_BitrateTrackBar.SetTic(192);\r\n    m_BitrateTrackBar.SetTic(224);\r\n    m_BitrateTrackBar.SetTic(256);\r\n    m_BitrateTrackBar.SetPos(m_pConfig->m_iBitrate);\r\n\r\n    // Setup the quality slider.\r\n    m_QualityTrackBar = GetDlgItem(IDC_QUALITYSLIDER);\r\n    m_QualityTrackBar.SetRange(0,9);\r\n    m_QualityTrackBar.SetPos(m_pConfig->m_iQuality);\r\n\r\n    // We select the bitrate mode by default.\r\n    if (m_pConfig->m_bBitrateMode)\r\n        CheckDlgButton(IDC_BITRATERADIO,BST_CHECKED);\r\n    else\r\n        CheckDlgButton(IDC_QUALITYRADIO,BST_CHECKED);\r\n\r\n    SelectBitrateMode(m_pConfig->m_bBitrateMode);\r\n\r\n    // Select the default (standard) preset.\r\n    SelectPreset(m_pConfig->m_iPreset);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnHScroll(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    if (IsDlgButtonChecked(IDC_BITRATERADIO) && LOWORD(wParam) == TB_THUMBTRACK)\r\n    {\r\n        unsigned int uiPos = HIWORD(wParam);\r\n\r\n        // Jump to the closest position that have a tic.\r\n        if (uiPos < 71)\r\n        {\r\n            uiPos >>= 3;\r\n            uiPos <<= 3;\r\n        }\r\n        else if (uiPos < 175)\r\n        {\r\n            uiPos >>= 4;\r\n            uiPos <<= 4;\r\n        }\r\n        else if (uiPos < 287)\r\n        {\r\n            uiPos >>= 5;\r\n            uiPos <<= 5;\r\n        }\r\n        else\r\n        {\r\n            uiPos = 320;\r\n        }\r\n\r\n        m_BitrateTrackBar.SetPos(uiPos);\r\n    }\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nvoid CConfigGeneralPage::SelectBitrateMode(BOOL bSelect)\r\n{\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYSTATIC),!bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYSLIDER),!bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYHIGHSTATIC),!bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYLOWSTATIC),!bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_VBRMODESTATIC),!bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_VBRMODECOMBO),!bSelect);\r\n\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATESTATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATESLIDER),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATE8STATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATE64STATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATE128STATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATE192STATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATE320STATIC),bSelect);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATECHECK),bSelect);\r\n}\r\n\r\nvoid CConfigGeneralPage::SelectPreset(int iPreset)\r\n{\r\n    if (iPreset != CONFIG_PRESET_CUSTOM)\r\n    {\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYSLIDER),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYHIGHSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYLOWSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_VBRMODESTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_VBRMODECOMBO),FALSE);\r\n\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATESTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATESLIDER),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATE8STATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATE64STATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATE128STATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATE192STATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATE320STATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATECHECK),FALSE);\r\n\r\n        // Controls not covered by the SelectBitrateMode function.\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATERADIO),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYRADIO),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_ENCODEQUALITYSTATIC),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_ENCODEQUALITYCOMBO),FALSE);\r\n        ::EnableWindow(GetDlgItem(IDC_MONOCHECK),FALSE);\r\n    }\r\n    else\r\n    {\r\n        SelectBitrateMode(IsDlgButtonChecked(IDC_BITRATERADIO));\r\n\r\n        // Controls not covered by the SelectBitrateMode function.\r\n        ::EnableWindow(GetDlgItem(IDC_BITRATERADIO),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_QUALITYRADIO),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_ENCODEQUALITYSTATIC),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_ENCODEQUALITYCOMBO),TRUE);\r\n        ::EnableWindow(GetDlgItem(IDC_MONOCHECK),TRUE);\r\n    }\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_QUALITYRADIO,BST_UNCHECKED);\r\n    SelectBitrateMode(TRUE);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnQualityCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_BITRATERADIO,BST_UNCHECKED);\r\n    SelectBitrateMode(FALSE);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnPresetChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    SelectPreset(m_PresetComboBox.GetCurSel());\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/codecs/lame/config_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\n#define CONFIG_PRESET_CUSTOM\t\t0\r\n#define CONFIG_PRESET_MEDIUM\t\t1\r\n#define CONFIG_PRESET_STANDARD\t\t2\r\n#define CONFIG_PRESET_EXTREME\t\t3\r\n#define CONFIG_PRESET_INSANE\t\t4\r\n\r\n#define CONFIG_EQ_FAST\t\t\t\t0\r\n#define CONFIG_EQ_STANDARD\t\t\t1\r\n#define CONFIG_EQ_HIGH\t\t\t\t2\r\n\r\nclass CEncoderConfig\r\n{\r\npublic:\r\n    CEncoderConfig()\r\n    {\r\n        m_bMono = false;\r\n        m_bBitrateMode = true;\r\n        m_bConstantBitrate = false;\r\n        m_bFastVBR = false;\r\n        m_iPreset = CONFIG_PRESET_STANDARD;\r\n        m_iEncodeQuality = CONFIG_EQ_STANDARD;\r\n        m_iBitrate = 192;\r\n        m_iQuality = 4;\r\n    }\r\n\r\n    bool m_bMono;\r\n    bool m_bBitrateMode;\r\n    bool m_bConstantBitrate;\r\n    bool m_bFastVBR;\r\n    int m_iPreset;\r\n    int m_iEncodeQuality;\r\n    int m_iBitrate;\r\n    int m_iQuality;\r\n};\r\n\r\nclass CConfigGeneralPage : public CPropertyPageImpl<CConfigGeneralPage>\r\n{\r\nprivate:\r\n    CComboBox m_PresetComboBox;\r\n    CComboBox m_EncQualityComboBox;\r\n    CComboBox m_VBRModeComboBox;\r\n    CTrackBarCtrl m_BitrateTrackBar;\r\n    CTrackBarCtrl m_QualityTrackBar;\r\n\r\n    void SelectBitrateMode(BOOL bSelect);\r\n    void SelectPreset(int iPreset);\r\n\r\n    CEncoderConfig *m_pConfig;\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGGENERAL };\r\n\r\n    CConfigGeneralPage();\r\n    ~CConfigGeneralPage();\r\n\r\n    bool SetConfig(CEncoderConfig *pConfig);\r\n    bool OnApply();\r\n\r\n    BEGIN_MSG_MAP(CConfigGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_HSCROLL,OnHScroll)\r\n\r\n        COMMAND_ID_HANDLER(IDC_BITRATERADIO,OnBitrateCheck)\r\n        COMMAND_ID_HANDLER(IDC_QUALITYRADIO,OnQualityCheck)\r\n        COMMAND_HANDLER(IDC_PRESETCOMBO,CBN_SELCHANGE,OnPresetChange)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnHScroll(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnQualityCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnPresetChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/lame/lame.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/codec_const.hh>\r\n#include \"config_dlg.hh\"\r\n#include \"lame_encoder.hh\"\r\n\r\n// Capability flags.\r\nint capabilities = IRC_HAS_ENCODER | IRC_HAS_CONFIG;\r\n\r\n// Version and about strings.\r\nTCHAR *str_version = _T(\"0.53.0.0\");\r\nTCHAR *str_about = _T(\"InfraRecorder MP3 Encoder\\n\\nCopyright  2006-2012 Christian Kindahl.\\n\\nThis codec is using the libmp3lame (LAME) library.\\nVisit: http://lame.sourceforge.net/ for more information.\\n\\nPlease note that personal and/or commercial use of\\ncompiled versions of this codec requires a patent license\\nin some countries. Please check before using this codec.\");\r\nTCHAR *str_encoder = _T(\"MP3\");\r\nTCHAR *str_file_ext = _T(\".mp3\");\r\n\r\n// Global variables.\r\nLameEncoder *lame_encoder = NULL;\r\n\r\n// Encoder configuration.\r\nCEncoderConfig encoder_cfg;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)\r\n{\r\n    return TRUE;\r\n}\r\n\r\n/**\r\n * Returns bit information on what operations that are supported by the codec.\r\n * @return Bit information on what operations that are supported by the codec.\r\n */\r\nint WINAPI irc_capabilities()\r\n{\r\n    return capabilities;\r\n}\r\n\r\nTCHAR *WINAPI irc_string(unsigned int uiID)\r\n{\r\n    switch (uiID)\r\n    {\r\n        case IRC_STR_VERSION:\r\n            return str_version;\r\n\r\n        case IRC_STR_ABOUT:\r\n            return str_about;\r\n\r\n        case IRC_STR_ENCODER:\r\n            return str_encoder;\r\n\r\n        case IRC_STR_FILEEXT:\r\n            return str_file_ext;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool WINAPI irc_set_callback(tirc_send_message *pSendMessage)\r\n{\r\n    if (pSendMessage == NULL)\r\n        return false;\r\n\r\n    LameBase::set_callback(pSendMessage);\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_decode_init(const TCHAR *szFileName,int &iNumChannels,\r\n                            int &iSampleRate,int &iBitRate,\r\n                            unsigned __int64 &uiDuration)\r\n{\r\n    return false;\r\n}\r\n\r\n__int64 WINAPI irc_decode_process(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  unsigned __int64 &uiTime)\r\n{\r\n    return -1;\r\n}\r\n\r\nbool WINAPI irc_decode_exit()\r\n{\r\n    return false;\r\n}\r\n\r\nbool WINAPI irc_encode_init(const TCHAR *szFileName,int iNumChannels,\r\n                            int iSampleRate,int iBitRate)\r\n{\r\n    if (lame_encoder != NULL)\r\n        return false;\r\n\r\n    lame_encoder = new LameEncoder(szFileName,iNumChannels,iSampleRate,iBitRate,encoder_cfg);\r\n    if (!lame_encoder->initialize())\r\n    {\r\n        delete lame_encoder;\r\n        lame_encoder = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_encode_process(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    if (lame_encoder == NULL)\r\n        return -1;\r\n\r\n    return lame_encoder->encode(pBuffer,iDataSize);\r\n}\r\n\r\n__int64 WINAPI irc_encode_flush()\r\n{\r\n    if (lame_encoder == NULL)\r\n        return -1;\r\n\r\n    return lame_encoder->flush();\r\n}\r\n\r\nbool WINAPI irc_encode_exit()\r\n{\r\n    if (lame_encoder == NULL)\r\n        return false;\r\n\r\n    delete lame_encoder;\r\n    lame_encoder = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_config()\r\n{\r\n    CConfigDlg ConfigDlg(&encoder_cfg);\r\n    ConfigDlg.DoModal();\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/codecs/lame/lame.def",
    "content": "LIBRARY\t\"lame.irc\"\r\nEXPORTS\r\n\tirc_capabilities\r\n\tirc_string\r\n\tirc_set_callback\r\n\tirc_decode_init\r\n\tirc_decode_process\r\n\tirc_decode_exit\r\n\tirc_encode_init\r\n\tirc_encode_process\r\n\tirc_encode_flush\r\n\tirc_encode_exit\r\n\tirc_encode_config\r\n"
  },
  {
    "path": "src/codecs/lame/lame.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"afxres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"afxres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_PROPPAGE_CONFIGGENERAL DIALOGEX 0, 0, 214, 156\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Preset:\",IDC_PRESETSTATIC,7,9,24,8\r\n    COMBOBOX        IDC_PRESETCOMBO,60,7,147,65,CBS_DROPDOWNLIST | \r\n                    WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"\",IDC_BEVELSTATIC,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,\r\n                    25,200,1,WS_EX_STATICEDGE\r\n    LTEXT           \"Encode quality:\",IDC_ENCODEQUALITYSTATIC,7,33,50,8\r\n    COMBOBOX        IDC_ENCODEQUALITYCOMBO,60,31,69,30,CBS_DROPDOWNLIST | \r\n                    WS_VSCROLL | WS_TABSTOP\r\n    CONTROL         \"Mono encoding\",IDC_MONOCHECK,\"Button\",BS_AUTOCHECKBOX | \r\n                    WS_TABSTOP,134,32,73,10\r\n    CONTROL         \"\",IDC_BEVELSTATIC2,\"Static\",SS_ETCHEDHORZ | WS_GROUP,7,\r\n                    48,199,1,WS_EX_STATICEDGE\r\n    CONTROL         \"Bitrate mode\",IDC_BITRATERADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,53,200,10\r\n    LTEXT           \"Bitrate:\",IDC_BITRATESTATIC,19,63,35,8\r\n    CONTROL         \"\",IDC_BITRATESLIDER,\"msctls_trackbar32\",TBS_TOOLTIPS | \r\n                    WS_TABSTOP,52,63,155,12\r\n    LTEXT           \"320\",IDC_BITRATE320STATIC,195,76,13,8\r\n    LTEXT           \"128\",IDC_BITRATE128STATIC,107,76,13,8\r\n    LTEXT           \"192\",IDC_BITRATE192STATIC,136,76,13,8\r\n    LTEXT           \"64\",IDC_BITRATE64STATIC,80,76,9,8\r\n    LTEXT           \"8\",IDC_BITRATE8STATIC,56,76,8,8\r\n    CONTROL         \"Restrict encoder to constant bitrate\",IDC_BITRATECHECK,\r\n                    \"Button\",BS_AUTOCHECKBOX | WS_TABSTOP,56,86,151,10\r\n    CONTROL         \"Quality mode\",IDC_QUALITYRADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,100,200,10\r\n    LTEXT           \"Quality:\",IDC_QUALITYSTATIC,19,110,26,8\r\n    CONTROL         \"\",IDC_QUALITYSLIDER,\"msctls_trackbar32\",TBS_AUTOTICKS | \r\n                    TBS_TOOLTIPS | WS_TABSTOP,52,110,155,12\r\n    LTEXT           \"High\",IDC_QUALITYHIGHSTATIC,52,123,15,8\r\n    LTEXT           \"Low\",IDC_QUALITYLOWSTATIC,195,123,14,8\r\n    LTEXT           \"VBR mode:\",IDC_VBRMODESTATIC,19,136,36,8\r\n    COMBOBOX        IDC_VBRMODECOMBO,60,135,69,30,CBS_DROPDOWNLIST | \r\n                    WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO \r\nBEGIN\r\n    IDD_PROPPAGE_CONFIGGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 207\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 147\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/codecs/lame/lame_base.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/string.hh>\r\n#include \"lame_base.hh\"\r\n\r\ntirc_send_message *LameBase::send_message_ = NULL;\r\n\r\nLameBase::LameBase()\r\n{\r\n    // Initialize LAME.\r\n    lame_gfp_ = lame_init();\r\n\r\n    // Change error, debug and message handlers.\r\n    lame_set_errorf(lame_gfp_,handler_errorf);\r\n    lame_set_debugf(lame_gfp_,handler_debugf);\r\n    lame_set_msgf(lame_gfp_,handler_msgf);\r\n}\r\n\r\nLameBase::~LameBase()\r\n{\r\n    // Close LAME.\r\n    lame_close(lame_gfp_);\r\n}\r\n\r\nvoid LameBase::set_callback(tirc_send_message *callback)\r\n{\r\n    send_message_ = callback;\r\n}\r\n\r\nbool LameBase::send_message(int type,const TCHAR * msg)\r\n{\r\n    if (send_message_ == NULL)\r\n        return false;\r\n\r\n    send_message_(type,msg);\r\n    return true;\r\n}\r\n\r\nvoid LameBase::handler_errorf(const char *format,va_list ap)\r\n{\r\n    // The 64-bit compiler does not support this type of usage of va_start.\r\n#ifdef _M_X64\r\n    send_message(IRC_MESSAGE_ERROR,_T(\"Unknown error in lame.irc (x64 build).\"));\r\n#else\r\n    va_start(ap,format);\r\n\r\n    int len = _vscprintf(format,ap) + 1;\r\n    char *msg = new char[len];\r\n    vsprintf(msg,format,ap);\r\n\r\n    ckcore::tstring msg_str = ckcore::string::ansi_to_auto<8192>(msg);\r\n    send_message(IRC_MESSAGE_ERROR,msg_str.c_str());\r\n\r\n    delete [] msg;\r\n#endif\r\n}\r\n\r\nvoid LameBase::handler_debugf(const char *format,va_list ap)\r\n{\r\n    // Ignore debug messages.\r\n}\r\n\r\nvoid LameBase::handler_msgf(const char *format,va_list ap)\r\n{\r\n#ifdef _M_X64\r\n    // Ignore information messages.\r\n#else\r\n    va_start(ap,format);\r\n\r\n    int len = _vscprintf(format,ap) + 1;\r\n    char *msg = new char[len];\r\n    vsprintf(msg,format,ap);\r\n\r\n    ckcore::tstring msg_str = ckcore::string::ansi_to_auto<8192>(msg);\r\n    send_message(IRC_MESSAGE_INFO,msg_str.c_str());\r\n\r\n    delete [] msg;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "src/codecs/lame/lame_base.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/types.hh>\r\n#include <lame.h>\r\n#include <base/codec_const.hh>\r\n\r\nclass LameBase\r\n{\r\nprivate:\r\n    static tirc_send_message *send_message_;\r\n\r\n    static void handler_errorf(const char *format,va_list ap);\r\n    static void handler_debugf(const char *format,va_list ap);\r\n    static void handler_msgf(const char *format,va_list ap);\r\n\r\nprotected:\r\n    lame_global_flags *lame_gfp_;\r\n\r\n    static bool send_message(int type,const TCHAR * msg);\r\n\r\npublic:\r\n    LameBase();\r\n    virtual ~LameBase();\r\n\r\n    static void set_callback(tirc_send_message *callback);\r\n};\r\n"
  },
  {
    "path": "src/codecs/lame/lame_encoder.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"lame_encoder.hh\"\r\n\r\nLameEncoder::LameEncoder(const TCHAR *file_path,\r\n                         int num_channels,int sample_rate,int bit_rate,\r\n                         CEncoderConfig &encoder_cfg)\r\n    : file_(file_path),\r\n      num_channels_(num_channels),sample_rate_(sample_rate),bit_rate_(bit_rate),\r\n      encoder_cfg_(encoder_cfg)\r\n{\r\n}\r\n\r\nbool LameEncoder::initialize()\r\n{\r\n    // Setup format settings.\r\n    lame_set_num_channels(lame_gfp_,num_channels_);\r\n    lame_set_in_samplerate(lame_gfp_,sample_rate_);\r\n\r\n    // Configure the encoder.\r\n    switch (encoder_cfg_.m_iPreset)\r\n    {\r\n        case 0:\t\t// Custom.\r\n        {\r\n            if (encoder_cfg_.m_iEncodeQuality == CONFIG_EQ_FAST)\r\n                lame_set_quality(lame_gfp_,7);\r\n            else if (encoder_cfg_.m_iEncodeQuality == CONFIG_EQ_HIGH)\r\n                lame_set_quality(lame_gfp_,2);\r\n\r\n            if (encoder_cfg_.m_bMono)\r\n                lame_set_mode(lame_gfp_,MONO);\r\n\r\n            if (encoder_cfg_.m_bBitrateMode)\r\n            {\r\n                // Bitrate mode.\r\n                if (encoder_cfg_.m_bConstantBitrate)\r\n                {\r\n                    // CBR.\r\n                    lame_set_VBR(lame_gfp_,vbr_off);\r\n                    lame_set_brate(lame_gfp_,encoder_cfg_.m_iBitrate);\r\n                }\r\n                else\r\n                {\r\n                    // ARB.\r\n                    lame_set_VBR(lame_gfp_,vbr_abr);\r\n                    lame_set_VBR_mean_bitrate_kbps(lame_gfp_,encoder_cfg_.m_iBitrate);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                // Quality mode.\r\n                lame_set_VBR(lame_gfp_,encoder_cfg_.m_bFastVBR ? vbr_mtrh : vbr_rh);\r\n                lame_set_VBR_q(lame_gfp_,encoder_cfg_.m_iQuality);\r\n            }\r\n\r\n            break;\r\n        }\r\n\r\n        case 1:\t\t// Medium.\r\n            lame_set_preset(lame_gfp_,MEDIUM);\r\n            break;\r\n\r\n        case 2:\t\t// Standard.\r\n            lame_set_preset(lame_gfp_,STANDARD);\r\n            break;\r\n\r\n        case 3:\t\t// Extreme.\r\n            lame_set_preset(lame_gfp_,EXTREME);\r\n            break;\r\n\r\n        case 4:\t\t// Insane.\r\n            lame_set_preset(lame_gfp_,INSANE);\r\n            break;\r\n    }\r\n\r\n    // Initialize parameters.\r\n    if (lame_init_params(lame_gfp_) < 0)\r\n        return false;\r\n\r\n    // Resize encode buffer.\r\n    buffer_.resize(num_channels_ * ((bit_rate_ / sample_rate_) >> 3) * BUFFER_FACTOR);\r\n\r\n    // Open file.\r\n    return file_.open(ckcore::File::ckOPEN_WRITE);\r\n}\r\n\r\n__int64 LameEncoder::encode(unsigned char *buffer,__int64 data_size)\r\n{\r\n    if (data_size > 0xffffffff)\r\n        return -1;\r\n\r\n    if (!file_.test())\r\n        return -1;\r\n\r\n    unsigned int sample_size = (bit_rate_ / sample_rate_) >> 3;\r\n    unsigned int num_samples = (static_cast<unsigned int>(data_size) / sample_size) / num_channels_;\r\n\r\n    int written = lame_encode_buffer_interleaved(lame_gfp_,reinterpret_cast<short int *>(buffer),\r\n                                                 num_samples,buffer_,buffer_.size());\r\n\r\n    if (written > 0)\r\n    {\r\n        if (file_.write(buffer_,written) == -1)\r\n            return -1;\r\n    }\r\n    else if (written < 0)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    return (__int64)written;\r\n}\r\n\r\n__int64 LameEncoder::flush()\r\n{\r\n    return lame_encode_flush(lame_gfp_,buffer_,buffer_.size());\r\n}\r\n"
  },
  {
    "path": "src/codecs/lame/lame_encoder.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/buffer.hh>\r\n#include <ckcore/file.hh>\r\n#include <ckcore/types.hh>\r\n#include <lame.h>\r\n#include \"config_dlg.hh\"\r\n#include \"lame_base.hh\"\r\n\r\nclass LameEncoder : public LameBase\r\n{\r\nprivate:\r\n    enum\r\n    {\r\n        BUFFER_FACTOR = 4096\r\n    };\r\n\r\nprivate:\r\n    ckcore::File file_;\r\n    int num_channels_;\r\n    int sample_rate_;\r\n    int bit_rate_;\r\n\r\n    ckcore::Buffer<unsigned char,int> buffer_;\r\n    CEncoderConfig &encoder_cfg_;\r\n\r\npublic:\r\n    LameEncoder(const TCHAR *file_path,\r\n                int num_channels,int sample_rate,int bit_rate,\r\n                CEncoderConfig &encoder_cfg);\r\n\r\n    bool initialize();\r\n    __int64 encode(unsigned char *buffer,__int64 data_size);\r\n    __int64 flush();\r\n};\r\n"
  },
  {
    "path": "src/codecs/lame/lame_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"lame\"\r\n\tProjectGUID=\"{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}\"\r\n\tRootNamespace=\"lame\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\lame\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:LIBCMT\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"lame.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/lame.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\lame\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:LIBCMT\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"lame.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/lame.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\lame\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"lame.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\lame\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/LTCG\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"lame.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame_base.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame_encoder.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame_base.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame_encoder.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lame.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t\t<Global\r\n\t\t\tName=\"RESOURCE_FILE\"\r\n\t\t\tValue=\"lame.rc\"\r\n\t\t/>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/codecs/lame/lame_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|Win32\">\n      <Configuration>Template</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|x64\">\n      <Configuration>Template</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>lame</ProjectName>\n    <ProjectGuid>{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}</ProjectGuid>\n    <RootNamespace>lame</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">.irc</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\lame\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:LIBCMT %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>lame.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)lame.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\lame\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:LIBCMT %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>lame.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)lame.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\lame\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>lame.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\lame\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;LAME_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>lame.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"lame.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"lame_base.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"lame_encoder.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"lame.def\" />\n    <None Include=\"config_dlg.hh\" />\n    <None Include=\"config_general_page.hh\" />\n    <None Include=\"lame_base.hh\" />\n    <None Include=\"lame_encoder.hh\" />\n    <None Include=\"stdafx.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"lame.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\..\\dep\\lame\\vc_solution\\vc9_libmp3lame.vcxproj\">\n      <Project>{20536101-3b0e-43ef-94f9-080d595dac57}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\dep\\lame\\vc_solution\\vc9_mpglib.vcxproj\">\n      <Project>{e2dab91a-8248-4625-8a85-2c2c2a390dd8}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n  <ProjectExtensions>\n    <VisualStudio>\n      <UserProperties RESOURCE_FILE=\"lame.rc\" />\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/codecs/lame/lame_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"lame.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"lame_base.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"lame_encoder.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"lame.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"config_dlg.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"config_general_page.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"lame_base.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"lame_encoder.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"lame.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/codecs/lame/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by lame.rc\r\n//\r\n#define IDD_PROPPAGE_CONFIGGENERAL      106\r\n#define IDC_PRESETSTATIC                1001\r\n#define IDC_PRESETCOMBO                 1002\r\n#define IDC_BEVELSTATIC                 1003\r\n#define IDC_BEVELSTATIC2                1004\r\n#define IDC_ENCODEQUALITYSTATIC         1005\r\n#define IDC_ENCODEQUALITYCOMBO          1006\r\n#define IDC_MONOCHECK                   1007\r\n#define IDC_BITRATERADIO                1008\r\n#define IDC_BITRATESTATIC               1009\r\n#define IDC_BITRATESLIDER               1011\r\n#define IDC_BITRATE320STATIC            1012\r\n#define IDC_BITRATE128STATIC            1013\r\n#define IDC_BITRATE192STATIC            1014\r\n#define IDC_BITRATE64STATIC             1015\r\n#define IDC_BITRATE8STATIC              1016\r\n#define IDC_BITRATECHECK                1017\r\n#define IDC_QUALITYRADIO                1018\r\n#define IDC_QUALITYSTATIC               1019\r\n#define IDC_QUALITYSLIDER               1020\r\n#define IDC_QUALITYHIGHSTATIC           1021\r\n#define IDC_QUALITYLOWSTATIC            1022\r\n#define IDC_VBRMODESTATIC               1023\r\n#define IDC_COMBO2                      1024\r\n#define IDC_VBRMODECOMBO                1024\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        102\r\n#define _APS_NEXT_COMMAND_VALUE         40001\r\n#define _APS_NEXT_CONTROL_VALUE         1025\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/codecs/lame/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/codecs/lame/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Exclude rarely-used stuff from Windows headers.\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n#include <atlctrls.h>\r\n#include <atlctrlw.h>\r\n#include <atldlgs.h>\r\n"
  },
  {
    "path": "src/codecs/sndfile/library_helper.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <sndfile.h>\r\n#include \"library_helper.hh\"\r\n\r\nCLibraryHelper::CLibraryHelper()\r\n{\r\n    m_hDllInstance = NULL;\r\n    irc_sf_open = NULL;\r\n    irc_sf_close = NULL;\r\n    irc_sf_format_check = NULL;\r\n    irc_sf_read_raw = NULL;\r\n    irc_sf_write_raw = NULL;\r\n}\r\n\r\nCLibraryHelper::~CLibraryHelper()\r\n{\r\n}\r\n\r\nbool CLibraryHelper::Load(const TCHAR *szFileName)\r\n{\r\n    m_hDllInstance = LoadLibrary(szFileName);\r\n    if (m_hDllInstance == NULL)\r\n        return false;\r\n\r\n    irc_sf_open = (tirc_sf_open)GetProcAddress(m_hDllInstance,\"sf_open\");\r\n    if (irc_sf_open == NULL)\r\n        return false;\r\n\r\n    irc_sf_close = (tirc_sf_close)GetProcAddress(m_hDllInstance,\"sf_close\");\r\n    if (irc_sf_close == NULL)\r\n        return false;\r\n\r\n    irc_sf_format_check = (tirc_sf_format_check)GetProcAddress(m_hDllInstance,\"sf_format_check\");\r\n    if (irc_sf_format_check == NULL)\r\n        return false;\r\n\r\n    irc_sf_read_raw = (tirc_sf_read_raw)GetProcAddress(m_hDllInstance,\"sf_read_raw\");\r\n    if (irc_sf_read_raw == NULL)\r\n        return false;\r\n\r\n    irc_sf_write_raw = (tirc_sf_write_raw)GetProcAddress(m_hDllInstance,\"sf_write_raw\");\r\n    if (irc_sf_write_raw == NULL)\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CLibraryHelper::Unload()\r\n{\r\n    if (m_hDllInstance != NULL)\r\n        return false;\r\n\r\n    FreeLibrary(m_hDllInstance);\r\n    m_hDllInstance = NULL;\r\n\r\n    irc_sf_open = NULL;\r\n    irc_sf_close = NULL;\r\n    irc_sf_format_check = NULL;\r\n    irc_sf_read_raw = NULL;\r\n    irc_sf_write_raw = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool CLibraryHelper::IsLoaded()\r\n{\r\n    return m_hDllInstance != NULL;\r\n}\r\n"
  },
  {
    "path": "src/codecs/sndfile/library_helper.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\ntypedef SNDFILE *(*tirc_sf_open)(const char *path,int mode,SF_INFO *sfinfo);\r\ntypedef int (*tirc_sf_close)(SNDFILE *sndfile);\r\ntypedef int (*tirc_sf_format_check)(const SF_INFO *info);\r\ntypedef sf_count_t (*tirc_sf_read_raw)(SNDFILE *sndfile,void *ptr,sf_count_t bytes);\r\ntypedef sf_count_t (*tirc_sf_write_raw)(SNDFILE *sndfile,const void *ptr,sf_count_t bytes);\r\n\r\nclass CLibraryHelper\r\n{\r\nprivate:\r\n    HINSTANCE m_hDllInstance;\r\n\r\npublic:\r\n    CLibraryHelper();\r\n    ~CLibraryHelper();\r\n\r\n    bool Load(const TCHAR *szFileName);\r\n    bool Unload();\r\n    bool IsLoaded();\r\n\r\n    tirc_sf_open irc_sf_open;\r\n    tirc_sf_close irc_sf_close;\r\n    tirc_sf_format_check irc_sf_format_check;\r\n    tirc_sf_read_raw irc_sf_read_raw;\r\n    tirc_sf_write_raw irc_sf_write_raw;\r\n};\r\n"
  },
  {
    "path": "src/codecs/sndfile/sndfile.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/string.hh>\r\n#include <base/codec_const.hh>\r\n#include <base/string_util.hh>\r\n#include <sndfile.h>\r\n#include \"library_helper.hh\"\r\n\r\ntirc_send_message *g_pSendMessage = NULL;\r\n\r\n// Capability flags.\r\nint g_iCapabilities = IRC_HAS_DECODER | IRC_HAS_ENCODER;\r\n\r\n// Version and about strings.\r\nTCHAR *g_szVersion = _T(\"0.53.0.0\");\r\nTCHAR *g_szAbout = _T(\"InfraRecorder Wave Codec\\n\\nCopyright  2006-2012 Christian Kindahl.\\n\\nThis codec is based on the libsndfile library, created\\nby Erik de Castro Lopo. More information can be\\nfound on the libsndfile website:\\nhttp://www.mega-nerd.com/libsndfile/\");\r\nTCHAR *g_szEncoder = _T(\"Wave\");\r\nTCHAR *g_szFileExt = _T(\".wav\");\r\n\r\n// Global variables.\r\nSNDFILE *g_hInFile = NULL;\r\nSNDFILE *g_hOutFile = NULL;\r\nunsigned int g_uiDecSampleRate = 0;\r\nunsigned int g_uiDecFrameSize = 0;\r\nunsigned __int64 g_uiDecCurrentTime = 0;\r\n\r\n// Library helper (since this codec uses dynamic loading of libsndfile.dll).\r\nCLibraryHelper g_LibraryHelper;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)\r\n{\r\n    switch (ul_reason_for_call)\r\n    {\r\n        case DLL_PROCESS_ATTACH:\r\n        case DLL_THREAD_ATTACH:\r\n            // Calculate the full library file name.\r\n            TCHAR szFileName[MAX_PATH];\r\n            ::GetModuleFileName((HMODULE)hModule,szFileName,MAX_PATH - 1);\r\n\r\n            ExtractFilePath(szFileName);\r\n            lstrcat(szFileName,_T(\"libsndfile-1.dll\"));\r\n\r\n            // Tell the library helper to load the library.\r\n            g_LibraryHelper.Load(szFileName);\r\n            break;\r\n\r\n        case DLL_PROCESS_DETACH:\r\n        case DLL_THREAD_DETACH:\r\n            // The codec has been detached, unload the libsndfile library.\r\n            g_LibraryHelper.Unload();\r\n            break;\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n\r\n/*\r\n    irc_capabilities\r\n    ----------------\r\n    Returns bit information on what operations that are supported by the codec.\r\n*/\r\nint WINAPI irc_capabilities()\r\n{\r\n    return g_iCapabilities;\r\n}\r\n\r\nTCHAR *WINAPI irc_string(unsigned int uiID)\r\n{\r\n    switch (uiID)\r\n    {\r\n        case IRC_STR_VERSION:\r\n            return g_szVersion;\r\n\r\n        case IRC_STR_ABOUT:\r\n            return g_szAbout;\r\n\r\n        case IRC_STR_ENCODER:\r\n            return g_szEncoder;\r\n\r\n        case IRC_STR_FILEEXT:\r\n            return g_szFileExt;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool WINAPI irc_set_callback(tirc_send_message *pSendMessage)\r\n{\r\n    if (pSendMessage == NULL)\r\n        return false;\r\n\r\n    g_pSendMessage = pSendMessage;\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_decode_init(const TCHAR *szFileName,int &iNumChannels,\r\n                            int &iSampleRate,int &iBitRate,unsigned __int64 &uiDuration)\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    std::string ansi_file_name = ckcore::string::auto_to_ansi<8192>(szFileName);\r\n\r\n    SF_INFO\tsfInfo;\r\n\r\n    g_hInFile = g_LibraryHelper.irc_sf_open(ansi_file_name.c_str(),SFM_READ,&sfInfo);\r\n    if (g_hInFile == NULL)\r\n        return false;\r\n\r\n    // Get file information.\r\n    iNumChannels = sfInfo.channels;\r\n    iSampleRate = sfInfo.samplerate;\r\n\r\n    switch (sfInfo.format & SF_FORMAT_SUBMASK)\r\n    {\r\n        case SF_FORMAT_PCM_S8:\r\n        case SF_FORMAT_PCM_U8:\r\n            iBitRate = sfInfo.samplerate << 3;\r\n            break;\r\n\r\n        case SF_FORMAT_PCM_16:\r\n        case SF_FORMAT_DWVW_16:\r\n            iBitRate = sfInfo.samplerate << 4;\r\n            break;\r\n\r\n        case SF_FORMAT_PCM_24:\r\n        case SF_FORMAT_DWVW_24:\r\n            iBitRate = sfInfo.samplerate * 24;\r\n            break;\r\n\r\n        case SF_FORMAT_PCM_32:\r\n        case SF_FORMAT_FLOAT:\r\n            iBitRate = sfInfo.samplerate << 5;\r\n            break;\r\n\r\n        case SF_FORMAT_DOUBLE:\r\n            iBitRate = sfInfo.samplerate << 6;\r\n            break;\r\n\r\n        case SF_FORMAT_G721_32:\r\n            iBitRate = 32000;\r\n            break;\r\n\r\n        case SF_FORMAT_G723_24:\r\n            iBitRate = 24000;\r\n            break;\r\n\r\n        case SF_FORMAT_G723_40:\r\n            iBitRate = 40000;\r\n            break;\r\n\r\n        case SF_FORMAT_DWVW_12:\r\n            iBitRate = sfInfo.samplerate * 12;\r\n            break;\r\n\r\n        /*case SF_FORMAT_ULAW:\r\n        case SF_FORMAT_ALAW:\r\n        case SF_FORMAT_IMA_ADPCM:\r\n        case SF_FORMAT_MS_ADPCM:\r\n        case SF_FORMAT_GSM610:\r\n        SF_FORMAT_VOX_ADPCM:\r\n        case SF_FORMAT_DWVW_N:\r\n        SF_FORMAT_DPCM_8:\r\n        SF_FORMAT_DPCM_16:*/\r\n\r\n        default:\r\n            iBitRate = -1;\r\n\r\n            g_LibraryHelper.irc_sf_close(g_hInFile);\r\n            g_hInFile = NULL;\r\n            return false;\r\n            //break;\r\n    }\r\n\r\n    // Calculate file duration (in milliseconds).\r\n    uiDuration = 0;\r\n    if (sfInfo.samplerate != 0)\r\n        uiDuration = (sfInfo.frames / sfInfo.samplerate) * 1000;\r\n\r\n    g_uiDecCurrentTime = 0;\r\n\r\n    // We need to remember the samplerate and frame size so we can calculate\r\n    // the current time when decoding the file.\r\n    g_uiDecSampleRate = iSampleRate;\r\n    g_uiDecFrameSize = ((iBitRate / iSampleRate) >> 3) * iNumChannels;\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_decode_process(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  unsigned __int64 &uiTime)\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return -1;\r\n\r\n    if (iBufferSize < 0)\r\n        return -1;\r\n\r\n    if (g_hInFile == NULL)\r\n        return -1;\r\n\r\n    __int64 iRead = g_LibraryHelper.irc_sf_read_raw(g_hInFile,pBuffer,iBufferSize);\r\n\r\n    // Current time (in milliseconds).\r\n    g_uiDecCurrentTime += ((iRead / g_uiDecFrameSize) * 1000) / g_uiDecSampleRate;\r\n    uiTime = g_uiDecCurrentTime;\r\n\r\n    return iRead;\r\n}\r\n\r\nbool WINAPI irc_decode_exit()\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    if (g_hInFile == NULL)\r\n        return false;\r\n\r\n    g_LibraryHelper.irc_sf_close(g_hInFile);\r\n    g_hInFile = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_init(const TCHAR *szFileName,int iNumChannels,\r\n                            int iSampleRate,int iBitRate)\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    SF_INFO sfInfo;\r\n    sfInfo.channels = iNumChannels;\r\n    sfInfo.samplerate = iSampleRate;\r\n    sfInfo.format = SF_FORMAT_WAV;\r\n\r\n    switch (iBitRate / iSampleRate)\r\n    {\r\n        case 8:\r\n            sfInfo.format |= SF_FORMAT_PCM_S8;\r\n            break;\r\n\r\n        case 16:\r\n            sfInfo.format |= SF_FORMAT_PCM_16;\r\n            break;\r\n\r\n        case 24:\r\n            sfInfo.format |= SF_FORMAT_PCM_24;\r\n            break;\r\n\r\n        case 32:\r\n            sfInfo.format |= SF_FORMAT_PCM_32;\r\n            break;\r\n\r\n        default:\r\n            return false;\r\n    }\r\n\r\n    if (!g_LibraryHelper.irc_sf_format_check(&sfInfo))\r\n        return false;\r\n\r\n    std::string ansi_file_name = ckcore::string::auto_to_ansi<8192>(szFileName);\r\n\r\n    g_hOutFile = g_LibraryHelper.irc_sf_open(ansi_file_name.c_str(),SFM_WRITE,&sfInfo);\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_encode_process(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return -1;\r\n\r\n    if (iDataSize < 0)\r\n        return -1;\r\n\r\n    if (g_hOutFile == NULL)\r\n        return -1;\r\n\r\n    return g_LibraryHelper.irc_sf_write_raw(g_hOutFile,pBuffer,iDataSize);\r\n}\r\n\r\n__int64 WINAPI irc_encode_flush()\r\n{\r\n    return 0;\r\n}\r\n\r\nbool WINAPI irc_encode_exit()\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    if (g_hOutFile == NULL)\r\n        return false;\r\n\r\n    g_LibraryHelper.irc_sf_close(g_hOutFile);\r\n    g_hOutFile = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_config()\r\n{\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/codecs/sndfile/sndfile.def",
    "content": "LIBRARY\t\"sndfile.irc\"\r\nEXPORTS\r\n\tirc_capabilities\r\n\tirc_string\r\n\tirc_set_callback\r\n\tirc_decode_init\r\n\tirc_decode_process\r\n\tirc_decode_exit\r\n\tirc_encode_init\r\n\tirc_encode_process\r\n\tirc_encode_flush\r\n\tirc_encode_exit\r\n\tirc_encode_config\r\n"
  },
  {
    "path": "src/codecs/sndfile/sndfile_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"sndfile\"\r\n\tProjectGUID=\"{533889C9-1598-4823-BFA9-7C97FD35D6DF}\"\r\n\tRootNamespace=\"sndfile\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"sndfile.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/sndfile.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"sndfile.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/sndfile.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"sndfile.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\&quot;;&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"sndfile.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\library_helper.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\sndfile.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\sndfile.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\library_helper.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/codecs/sndfile/sndfile_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>sndfile</ProjectName>\n    <ProjectGuid>{533889C9-1598-4823-BFA9-7C97FD35D6DF}</ProjectGuid>\n    <RootNamespace>sndfile</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">.irc</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>sndfile.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)sndfile.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>sndfile.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)sndfile.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>sndfile.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\..\\dep\\libsndfile\\include\\;$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SNDFILE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>sndfile.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"library_helper.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"sndfile.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"sndfile.def\" />\n    <None Include=\"library_helper.hh\" />\n    <None Include=\"stdafx.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/codecs/sndfile/sndfile_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"library_helper.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"sndfile.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"sndfile.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"library_helper.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/codecs/sndfile/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/codecs/sndfile/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Exclude rarely-used stuff from Windows headers.\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#ifndef _T\r\n#define _T TEXT\r\n#endif\r\n\r\n#include <windows.h>\r\n"
  },
  {
    "path": "src/codecs/vorbis/config_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_dlg.hh\"\r\n\r\nCConfigDlg::CConfigDlg(CEncoderConfig *pConfig) : CPropertySheetImpl<CConfigDlg>(_T(\"Configuration\"),0,NULL)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW;\r\n\r\n    m_GeneralPage.SetConfig(pConfig);\r\n    AddPage(m_GeneralPage);\r\n}\r\n\r\nCConfigDlg::~CConfigDlg()\r\n{\r\n}\r\n\r\nLRESULT CConfigDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/codecs/vorbis/config_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"config_general_page.hh\"\r\n\r\nclass CConfigDlg : public CPropertySheetImpl<CConfigDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CConfigGeneralPage m_GeneralPage;\r\n\r\npublic:\r\n    CConfigDlg(CEncoderConfig *pConfig);\r\n    ~CConfigDlg();\r\n\r\n    BEGIN_MSG_MAP(CConfigDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CConfigDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/vorbis/config_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_general_page.hh\"\r\n#include <base/string_util.hh>\r\n\r\nCConfigGeneralPage::CConfigGeneralPage()\r\n{\r\n    m_pConfig = NULL;\r\n}\r\n\r\nCConfigGeneralPage::~CConfigGeneralPage()\r\n{\r\n}\r\n\r\nbool CConfigGeneralPage::SetConfig(CEncoderConfig *pConfig)\r\n{\r\n    if (pConfig == NULL)\r\n        return false;\r\n\r\n    m_pConfig = pConfig;\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::ValidateBitrateValue(int iControl,int &iValue)\r\n{\r\n    TCHAR szBuffer[4];\r\n\r\n    GetDlgItemText(iControl,szBuffer,4);\r\n    iValue = _wtoi(szBuffer);\r\n\r\n    return iValue > 47 && iValue < 501;\r\n}\r\n\r\nbool CConfigGeneralPage::OnApply()\r\n{\r\n    // Bitrates.\r\n    int iValue;\r\n\r\n    if (!ValidateBitrateValue(IDC_BITRATEEDIT,iValue))\r\n    {\r\n        MessageBox(_T(\"Invalid constant bitrate value. The value must be between 48 and 500 (inclusive).\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n    m_pConfig->m_iBitrate = iValue;\r\n\r\n    if (!ValidateBitrateValue(IDC_MINBITRATEEDIT,iValue))\r\n    {\r\n        MessageBox(_T(\"Invalid minimum bitrate value. The value must be between 48 and 500 (inclusive).\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n    m_pConfig->m_iMinBitrate = iValue;\r\n\r\n    if (!ValidateBitrateValue(IDC_MAXBITRATEEDIT,iValue))\r\n    {\r\n        MessageBox(_T(\"Invalid maximum bitrate value. The value must be between 48 and 500 (inclusive).\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n    m_pConfig->m_iMaxBitrate = iValue;\r\n\r\n    if (!ValidateBitrateValue(IDC_AVBITRATEEDIT,iValue))\r\n    {\r\n        MessageBox(_T(\"Invalid average bitrate value. The value must be between 48 and 500 (inclusive).\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n        return false;\r\n    }\r\n    m_pConfig->m_iAvBitrate = iValue;\r\n\r\n    // Mode.\r\n    if (IsDlgButtonChecked(IDC_QUALITYRADIO))\r\n        m_pConfig->m_iMode = CONFIG_MODE_QUALITY;\r\n    else if (IsDlgButtonChecked(IDC_BITRATERADIO))\r\n        m_pConfig->m_iMode = CONFIG_MODE_BITRATE;\r\n    else if (IsDlgButtonChecked(IDC_VARBITRATERADIO))\r\n        m_pConfig->m_iMode = CONFIG_MODE_VARBITRATE;\r\n    else\r\n        m_pConfig->m_iMode = CONFIG_MODE_AVBITRATE;\r\n\r\n    // Quality.\r\n    m_pConfig->m_iQuality = m_QualityTrackBar.GetPos();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Setup the quality slider.\r\n    m_QualityTrackBar = GetDlgItem(IDC_QUALITYSLIDER);\r\n    for (unsigned int i = 0; i <= 100; i += 10)\r\n        m_QualityTrackBar.SetTic(i);\r\n\r\n    m_QualityTrackBar.SetLineSize(10);\r\n    m_QualityTrackBar.SetPageSize(20);\r\n    m_QualityTrackBar.SetRange(0,100);\r\n    m_QualityTrackBar.SetPos(m_pConfig->m_iQuality);\r\n\r\n    // Initialize the edit controls.\r\n    TCHAR szBuffer[4];\r\n    lsprintf(szBuffer,_T(\"%d\"),m_pConfig->m_iBitrate);\r\n    ::SendMessage(GetDlgItem(IDC_BITRATEEDIT),EM_SETLIMITTEXT,3,0);\r\n    SetDlgItemText(IDC_BITRATEEDIT,szBuffer);\r\n\r\n    lsprintf(szBuffer,_T(\"%d\"),m_pConfig->m_iMinBitrate);\r\n    ::SendMessage(GetDlgItem(IDC_MINBITRATEEDIT),EM_SETLIMITTEXT,3,0);\r\n    SetDlgItemText(IDC_MINBITRATEEDIT,szBuffer);\r\n\r\n    lsprintf(szBuffer,_T(\"%d\"),m_pConfig->m_iMaxBitrate);\r\n    ::SendMessage(GetDlgItem(IDC_MAXBITRATEEDIT),EM_SETLIMITTEXT,3,0);\r\n    SetDlgItemText(IDC_MAXBITRATEEDIT,szBuffer);\r\n\r\n    lsprintf(szBuffer,_T(\"%d\"),m_pConfig->m_iAvBitrate);\r\n    ::SendMessage(GetDlgItem(IDC_AVBITRATEEDIT),EM_SETLIMITTEXT,3,0);\r\n    SetDlgItemText(IDC_AVBITRATEEDIT,szBuffer);\r\n\r\n    // Select the default mode.\r\n    switch (m_pConfig->m_iMode)\r\n    {\r\n        case CONFIG_MODE_QUALITY:\r\n            CheckDlgButton(IDC_QUALITYRADIO,BST_CHECKED);\r\n            break;\r\n\r\n        case CONFIG_MODE_BITRATE:\r\n            CheckDlgButton(IDC_BITRATERADIO,BST_CHECKED);\r\n            break;\r\n\r\n        case CONFIG_MODE_VARBITRATE:\r\n            CheckDlgButton(IDC_VARBITRATERADIO,BST_CHECKED);\r\n            break;\r\n\r\n        case CONFIG_MODE_AVBITRATE:\r\n            CheckDlgButton(IDC_AVBITRATERADIO,BST_CHECKED);\r\n            break;\r\n    }\r\n\r\n    SelectMode(m_pConfig->m_iMode);\r\n\r\n    return TRUE;\r\n}\r\n\r\nvoid CConfigGeneralPage::SelectMode(int iMode)\r\n{\r\n    // Quality mode.\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYSTATIC),iMode == CONFIG_MODE_QUALITY);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYSLIDER),iMode == CONFIG_MODE_QUALITY);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYHIGHSTATIC),iMode == CONFIG_MODE_QUALITY);\r\n    ::EnableWindow(GetDlgItem(IDC_QUALITYLOWSTATIC),iMode == CONFIG_MODE_QUALITY);\r\n\r\n    // Constant bitrate mode.\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATESTATIC),iMode == CONFIG_MODE_BITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATEEDIT),iMode == CONFIG_MODE_BITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_BITRATESPIN),iMode == CONFIG_MODE_BITRATE);\r\n\r\n    // Variable bitrate mode.\r\n    ::EnableWindow(GetDlgItem(IDC_MINBITRATESTATIC),iMode == CONFIG_MODE_VARBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_MINBITRATEEDIT),iMode == CONFIG_MODE_VARBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_MINBITRATESPIN),iMode == CONFIG_MODE_VARBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_MAXBITRATESTATIC),iMode == CONFIG_MODE_VARBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_MAXBITRATEEDIT),iMode == CONFIG_MODE_VARBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_MAXBITRATESPIN),iMode == CONFIG_MODE_VARBITRATE);\r\n\r\n    // Average bitrate mode.\r\n    ::EnableWindow(GetDlgItem(IDC_AVBITRATESTATIC),iMode == CONFIG_MODE_AVBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_AVBITRATEEDIT),iMode == CONFIG_MODE_AVBITRATE);\r\n    ::EnableWindow(GetDlgItem(IDC_AVBITRATESPIN),iMode == CONFIG_MODE_AVBITRATE);\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnQualityCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_BITRATERADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_VARBITRATERADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_AVBITRATERADIO,BST_UNCHECKED);\r\n    SelectMode(CONFIG_MODE_QUALITY);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_QUALITYRADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_VARBITRATERADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_AVBITRATERADIO,BST_UNCHECKED);\r\n    SelectMode(CONFIG_MODE_BITRATE);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnVarBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_QUALITYRADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_BITRATERADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_AVBITRATERADIO,BST_UNCHECKED);\r\n    SelectMode(CONFIG_MODE_VARBITRATE);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnAvBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CheckDlgButton(IDC_QUALITYRADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_BITRATERADIO,BST_UNCHECKED);\r\n    CheckDlgButton(IDC_VARBITRATERADIO,BST_UNCHECKED);\r\n    SelectMode(CONFIG_MODE_AVBITRATE);\r\n\r\n    bHandled = false;\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnBitrateSpin(int idCtrl,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    NMUPDOWN *lpnmud = (NMUPDOWN *)pNMH;\r\n\r\n    TCHAR szBuffer[4];\r\n\r\n    // Get the control value.\r\n    switch (idCtrl)\r\n    {\r\n        case IDC_BITRATESPIN:\r\n            GetDlgItemText(IDC_BITRATEEDIT,szBuffer,4);\r\n            break;\r\n\r\n        case IDC_MINBITRATESPIN:\r\n            GetDlgItemText(IDC_MINBITRATEEDIT,szBuffer,4);\r\n            break;\r\n\r\n        case IDC_MAXBITRATESPIN:\r\n            GetDlgItemText(IDC_MAXBITRATEEDIT,szBuffer,4);\r\n            break;\r\n\r\n        case IDC_AVBITRATESPIN:\r\n            GetDlgItemText(IDC_AVBITRATEEDIT,szBuffer,4);\r\n            break;\r\n    }\r\n\r\n    int iValue = _wtoi(szBuffer);\r\n\r\n    // Calculate the new value.\r\n    if (lpnmud->iDelta < 0)\r\n    {\r\n        if (iValue < 48)\r\n            iValue = 48;\r\n        else if (iValue < 71)\r\n        {\r\n            iValue >>= 3;\r\n            iValue <<= 3;\r\n            iValue += 8;\r\n        }\r\n        else if (iValue < 175)\r\n        {\r\n            iValue >>= 4;\r\n            iValue <<= 4;\r\n            iValue += 16;\r\n        }\r\n        else\r\n        {\r\n            iValue >>= 5;\r\n            iValue <<= 5;\r\n            iValue += 32;\r\n        }\r\n\r\n        if (iValue > 500)\r\n            iValue = 500;\r\n    }\r\n    else\r\n    {\r\n        if (iValue > 500)\r\n            iValue = 500;\r\n        else if (iValue < 71)\r\n        {\r\n            iValue >>= 3;\r\n            iValue <<= 3;\r\n            iValue -= 8;\r\n        }\r\n        else if (iValue < 175)\r\n        {\r\n            iValue >>= 4;\r\n            iValue <<= 4;\r\n            iValue -= 16;\r\n        }\r\n        else\r\n        {\r\n            iValue >>= 5;\r\n            iValue <<= 5;\r\n            iValue -= 32;\r\n        }\r\n\r\n        if (iValue < 48)\r\n            iValue = 48;\r\n    }\r\n\r\n    // Set the new value.\r\n    lsprintf(szBuffer,_T(\"%d\"),iValue);\r\n    switch (idCtrl)\r\n    {\r\n        case IDC_BITRATESPIN:\r\n            SetDlgItemText(IDC_BITRATEEDIT,szBuffer);\r\n            break;\r\n\r\n        case IDC_MINBITRATESPIN:\r\n            SetDlgItemText(IDC_MINBITRATEEDIT,szBuffer);\r\n            break;\r\n\r\n        case IDC_MAXBITRATESPIN:\r\n            SetDlgItemText(IDC_MAXBITRATEEDIT,szBuffer);\r\n            break;\r\n\r\n        case IDC_AVBITRATESPIN:\r\n            SetDlgItemText(IDC_AVBITRATEEDIT,szBuffer);\r\n            break;\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/codecs/vorbis/config_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\n#define CONFIG_MODE_QUALITY\t\t\t\t0\r\n#define CONFIG_MODE_BITRATE\t\t\t\t1\r\n#define CONFIG_MODE_VARBITRATE\t\t\t2\r\n#define CONFIG_MODE_AVBITRATE\t\t\t3\r\n\r\nclass CEncoderConfig\r\n{\r\npublic:\r\n    CEncoderConfig()\r\n    {\r\n        m_iMode = CONFIG_MODE_QUALITY;\r\n        m_iQuality = 50;\r\n\r\n        m_iBitrate = 192;\r\n        m_iMinBitrate = 128;\r\n        m_iMaxBitrate = 256;\r\n        m_iAvBitrate = 192;\r\n    }\r\n\r\n    int m_iMode;\r\n    int m_iQuality;\r\n    int m_iBitrate;\r\n    int m_iMinBitrate;\r\n    int m_iMaxBitrate;\r\n    int m_iAvBitrate;\r\n};\r\n\r\nclass CConfigGeneralPage : public CPropertyPageImpl<CConfigGeneralPage>\r\n{\r\nprivate:\r\n    CTrackBarCtrl m_QualityTrackBar;\r\n\r\n    bool ValidateBitrateValue(int iControl,int &iValue);\r\n    void SelectMode(int iMode);\r\n\r\n    CEncoderConfig *m_pConfig;\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGGENERAL };\r\n\r\n    CConfigGeneralPage();\r\n    ~CConfigGeneralPage();\r\n\r\n    bool SetConfig(CEncoderConfig *pConfig);\r\n    bool OnApply();\r\n\r\n    BEGIN_MSG_MAP(CConfigGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        COMMAND_ID_HANDLER(IDC_QUALITYRADIO,OnQualityCheck)\r\n        COMMAND_ID_HANDLER(IDC_BITRATERADIO,OnBitrateCheck)\r\n        COMMAND_ID_HANDLER(IDC_VARBITRATERADIO,OnVarBitrateCheck)\r\n        COMMAND_ID_HANDLER(IDC_AVBITRATERADIO,OnAvBitrateCheck)\r\n        NOTIFY_HANDLER(IDC_BITRATESPIN,UDN_DELTAPOS,OnBitrateSpin)\r\n        NOTIFY_HANDLER(IDC_MINBITRATESPIN,UDN_DELTAPOS,OnBitrateSpin)\r\n        NOTIFY_HANDLER(IDC_MAXBITRATESPIN,UDN_DELTAPOS,OnBitrateSpin)\r\n        NOTIFY_HANDLER(IDC_AVBITRATESPIN,UDN_DELTAPOS,OnBitrateSpin)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n\r\n    LRESULT OnQualityCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnVarBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnAvBitrateCheck(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnBitrateSpin(int idCtrl,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/vorbis/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by irVorbis.rc\r\n//\r\n#define IDD_PROPPAGE_CONFIGGENERAL      106\r\n#define IDC_BITRATERADIO                1008\r\n#define IDC_BITRATESTATIC               1009\r\n#define IDC_QUALITYRADIO                1018\r\n#define IDC_QUALITYSTATIC               1019\r\n#define IDC_QUALITYSLIDER               1020\r\n#define IDC_QUALITYHIGHSTATIC           1021\r\n#define IDC_QUALITYLOWSTATIC            1022\r\n#define IDC_MINBITRATESPIN              1025\r\n#define IDC_MINBITRATEEDIT              1026\r\n#define IDC_VARBITRATERADIO             1027\r\n#define IDC_AVBITRATERADIO              1028\r\n#define IDC_MINBITRATESTATIC            1029\r\n#define IDC_BITRATESPIN                 1030\r\n#define IDC_BITRATEEDIT                 1031\r\n#define IDC_MAXBITRATESTATIC            1032\r\n#define IDC_MAXBITRATESPIN              1033\r\n#define IDC_MAXBITRATEEDIT              1034\r\n#define IDC_AVBITRATESTATIC             1035\r\n#define IDC_AVBITRATESPIN               1036\r\n#define IDC_AVBITRATEEDIT               1037\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        102\r\n#define _APS_NEXT_COMMAND_VALUE         40001\r\n#define _APS_NEXT_CONTROL_VALUE         1036\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/codecs/vorbis/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/codecs/vorbis/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Exclude rarely-used stuff from Windows headers.\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n#include <atlctrls.h>\r\n#include <atlctrlw.h>\r\n#include <atldlgs.h>\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/file.hh>\r\n#include <base/codec_const.hh>\r\n#include <stdlib.h>\r\n#include <time.h>\r\n#include <vorbis/vorbisenc.h>\r\n#include <vorbis/vorbisfile.h>\r\n#include \"config_dlg.hh\"\r\n#include \"vorbis.hh\"\r\n\r\n/*#ifdef _M_X64\r\n#pragma comment(lib,\"libogg/win32/Static_Release/ogg_static_x64.lib\")\r\n#else\r\n#pragma comment(lib,\"libogg/win32/Static_Release/ogg_static.lib\")\r\n#endif\r\n\r\n#pragma comment(lib,\"libvorbis/win32/Vorbis_Static_Release/vorbis_static.lib\")\r\n#pragma comment(lib,\"libvorbis/win32/VorbisEnc_Static_Release/vorbisenc_static.lib\")\r\n#pragma comment(lib,\"libvorbis/win32/VorbisFile_Static_Release/vorbisfile_static.lib\")*/\r\n\r\ntirc_send_message *g_pSendMessage = NULL;\r\n\r\n// Capability flags.\r\nint g_iCapabilities = IRC_HAS_DECODER | IRC_HAS_ENCODER | IRC_HAS_CONFIG;\r\n\r\n// Version and about strings.\r\nTCHAR *g_szVersion = _T(\"0.53.0.0\");\r\nTCHAR *g_szAbout = _T(\"InfraRecorder Ogg Vorbis Codec\\n\\nCopyright  2006-2012 Christian Kindahl.\\n\\nThis codec is using the following 3rd party libraries:\\n - libogg: Copyright  2002, Xiph.org Foundation.\\n - libvorbis: Copyright  2002-2004 Xiph.org Foundation.\");\r\nTCHAR *g_szEncoder = _T(\"Ogg Vorbis\");\r\nTCHAR *g_szFileExt = _T(\".ogg\");\r\n\r\n// Global variables.\r\nckcore::File *g_pFile = NULL;\r\nFILE *g_hInFile = NULL;\r\nint g_iNumChannels = -1;\r\nint g_iSampleRate = -1;\r\nint g_iBitRate = -1;\r\n\r\n// Encoding.\r\nogg_page og;\r\nogg_stream_state os;\r\nvorbis_dsp_state vd;\r\nvorbis_block vb;\r\nvorbis_info vi;\r\n\r\n// Decoding.\r\nOggVorbis_File vf;\r\n\r\n// Encoder configuration.\r\nCEncoderConfig g_EncoderConfig;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)\r\n{\r\n    return TRUE;\r\n}\r\n\r\n/*\r\n    irc_capabilities\r\n    ----------------\r\n    Returns bit information on what operations that are supported by the codec.\r\n*/\r\nint WINAPI irc_capabilities()\r\n{\r\n    return g_iCapabilities;\r\n}\r\n\r\nTCHAR *WINAPI irc_string(unsigned int uiID)\r\n{\r\n    switch (uiID)\r\n    {\r\n        case IRC_STR_VERSION:\r\n            return g_szVersion;\r\n\r\n        case IRC_STR_ABOUT:\r\n            return g_szAbout;\r\n\r\n        case IRC_STR_ENCODER:\r\n            return g_szEncoder;\r\n\r\n        case IRC_STR_FILEEXT:\r\n            return g_szFileExt;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool WINAPI irc_set_callback(tirc_send_message *pSendMessage)\r\n{\r\n    if (pSendMessage == NULL)\r\n        return false;\r\n\r\n    g_pSendMessage = pSendMessage;\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_decode_init(const TCHAR *szFileName,int &iNumChannels,\r\n                            int &iSampleRate,int &iBitRate,unsigned __int64 &uiDuration)\r\n{\r\n    // Get file handle.\r\n    g_hInFile = _wfopen(szFileName,_T(\"rb\"));\r\n\r\n    if (g_hInFile == NULL)\r\n        return false;\r\n\r\n    // Open Vorbis bitstream.\r\n    if (ov_open(g_hInFile,&vf,NULL,0) < 0)\r\n        return false;\r\n\r\n    // Throw the comments plus a few lines about the bitstream we're decoding.\r\n    {\r\n        char **ppTemp = ov_comment(&vf,-1)->user_comments;\r\n        vorbis_info *vi = ov_info(&vf,-1);\r\n\r\n        while (*ppTemp)\r\n            ++ppTemp;\r\n\r\n        iNumChannels = vi->channels;\r\n        iSampleRate = vi->rate;\r\n        iBitRate = iSampleRate << 4;\r\n    }\r\n\r\n    // Get file duration (in milliseconds).\r\n    uiDuration = (unsigned __int64)ov_time_total(&vf,-1) * 1000;\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_decode_process(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  unsigned __int64 &uiTime)\r\n{\r\n    static int iCurrentSection;\r\n\r\n    if (iBufferSize > 0xFFFFFFFF)\r\n        return -1;\r\n\r\n    unsigned long ulRead = ov_read(&vf,(char *)pBuffer,(unsigned int)iBufferSize,0,2,1,&iCurrentSection);\r\n    if (ulRead < 0)\r\n        return -1;\r\n\r\n    // Current time (in milliseconds).\r\n    uiTime = (unsigned __int64)ov_time_tell(&vf) * 1000;\r\n\r\n    return ulRead;\r\n}\r\n\r\nbool WINAPI irc_decode_exit()\r\n{\r\n    // Close the file handle.\r\n    if (g_hInFile != NULL)\r\n    {\r\n        fclose(g_hInFile);\r\n        g_hInFile = NULL;\r\n    }\r\n\r\n    // Exit the decoder.\r\n    ov_clear(&vf);\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_init(const TCHAR *szFileName,int iNumChannels,\r\n                            int iSampleRate,int iBitRate)\r\n{\r\n    // Currently we only support a maximum of six channels.\r\n    if (iNumChannels > 6)\r\n        return false;\r\n\r\n    if (g_pFile != NULL)\r\n        return false;\r\n\r\n    g_iNumChannels = iNumChannels;\r\n    g_iSampleRate = iSampleRate;\r\n    g_iBitRate = iBitRate;\r\n\r\n    // Open output file.\r\n    g_pFile = new ckcore::File(szFileName);\r\n    if (!g_pFile->open(ckcore::File::ckOPEN_WRITE))\r\n    {\r\n        delete g_pFile;\r\n        g_pFile = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    // Initialize encoder.\r\n    vorbis_info_init(&vi);\r\n\r\n    // Variable bit rate.\r\n    /*if (vorbis_encode_init_vbr(&vi,iNumChannels,iSampleRate,0.1f))\r\n        return false;*/\r\n\r\n    // Setup configuration.\r\n    switch (g_EncoderConfig.m_iMode)\r\n    {\r\n        case CONFIG_MODE_QUALITY:\r\n            if (vorbis_encode_init_vbr(&vi,iNumChannels,iSampleRate,\r\n                (float)g_EncoderConfig.m_iQuality/100.0f) < 0)\r\n                return false;\r\n            break;\r\n\r\n        case CONFIG_MODE_BITRATE:\r\n            if (vorbis_encode_init(&vi,iNumChannels,iSampleRate,g_EncoderConfig.m_iBitrate * 1000,\r\n                g_EncoderConfig.m_iBitrate * 1000,g_EncoderConfig.m_iBitrate * 1000) < 0)\r\n                return false;\r\n            break;\r\n\r\n        case CONFIG_MODE_VARBITRATE:\r\n            if (vorbis_encode_init(&vi,iNumChannels,iSampleRate,g_EncoderConfig.m_iMaxBitrate * 1000,\r\n                -1,g_EncoderConfig.m_iMinBitrate * 1000) < 0)\r\n                return false;\r\n            break;\r\n\r\n        case CONFIG_MODE_AVBITRATE:\r\n            if (vorbis_encode_init(&vi,iNumChannels,iSampleRate,-1,\r\n                g_EncoderConfig.m_iAvBitrate * 1000,-1) < 0)\r\n                return false;\r\n            break;\r\n    }\r\n\r\n    // Add a comment.\r\n    vorbis_comment vc;\r\n    vorbis_comment_init(&vc);\r\n    vorbis_comment_add_tag(&vc,\"ENCODER\",\"irVorbis.irc\");\r\n\r\n    // Set up the analysis state and auxiliary encoding storage.\r\n    vorbis_analysis_init(&vd,&vi);\r\n    vorbis_block_init(&vd,&vb);\r\n\r\n    // Pick a random serial number; that way we can more likely build chained streams just by concatenation.\r\n    srand((int)time(NULL));\r\n    ogg_stream_init(&os,rand());\r\n\r\n    // Write the three header packets.\r\n    {\r\n        ogg_packet opHeader;\r\n        ogg_packet opHeaderComment;\r\n        ogg_packet opHeaderCode;\r\n\r\n        vorbis_analysis_headerout(&vd,&vc,&opHeader,&opHeaderComment,&opHeaderCode);\r\n        ogg_stream_packetin(&os,&opHeader);\r\n        ogg_stream_packetin(&os,&opHeaderComment);\r\n        ogg_stream_packetin(&os,&opHeaderCode);\r\n\r\n        // This ensures the actual audio data will start on a new page, as per spec.\r\n        int iResult;\r\n\r\n        while ((iResult = ogg_stream_flush(&os,&og)))\r\n        {\r\n            if (iResult == 0)\r\n                break;\r\n\r\n            g_pFile->write(og.header,og.header_len);\r\n            g_pFile->write(og.body,og.body_len);\r\n        }\r\n    }\r\n\r\n    vorbis_comment_clear(&vc);\r\n    return true;\r\n}\r\n\r\n/*\r\n    irc_encode_flush_ex\r\n    -------------------\r\n    Internal function. Flushes the vorbis buffer and writes the output to the\r\n    file.\r\n*/\r\n__int64 irc_encode_flush_ex()\r\n{\r\n    __int64 iWritten = 0;\r\n\r\n    // Vorbis does some data preanalysis, then divvies up blocks for\r\n    // more involved (potentially parallel) processing. Get a single\r\n    // block for encoding now.\r\n    ogg_packet op;\r\n\r\n    while (vorbis_analysis_blockout(&vd,&vb) == 1)\r\n    {\r\n        // Analysis, assume we want to use bitrate management.\r\n        vorbis_analysis(&vb,NULL);\r\n        vorbis_bitrate_addblock(&vb);\r\n\r\n        while (vorbis_bitrate_flushpacket(&vd,&op))\r\n        {\r\n            // Weld the packet into the bitstream.\r\n            ogg_stream_packetin(&os,&op);\r\n    \r\n            // Write out pages (if any).\r\n            while (true)\r\n            {\r\n                if (ogg_stream_pageout(&os,&og) == 0)\r\n                    break;\r\n\r\n                g_pFile->write(og.header,og.header_len);\r\n                g_pFile->write(og.body,og.body_len);\r\n\r\n                iWritten += og.header_len + og.body_len;\r\n      \r\n                // This could be set above, but for illustrative purposes, I do\r\n                // it here (to show that vorbis does know where the stream ends).\r\n                if (ogg_page_eos(&og))\r\n                    return iWritten;\r\n            }\r\n        }\r\n    }\r\n\r\n    return iWritten;\r\n}\r\n\r\n__int64 WINAPI irc_encode_process(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    // The Vorbis encoder can only support 0xFFFFFFFF samples per analysis.\r\n    if (iDataSize > 0xFFFFFFFF)\r\n        return -1;\r\n\r\n    // Deinterleave.\r\n    unsigned int uiSampleSize = (g_iBitRate / g_iSampleRate) >> 3;\r\n    unsigned int uiNumSamples = ((int)iDataSize / uiSampleSize) / g_iNumChannels;\r\n\r\n    float **ppBuffer = vorbis_analysis_buffer(&vd,uiNumSamples);\r\n\r\n    // The following code is in serious need of optimization.\r\n    unsigned int uiSampleBitSize = g_iBitRate / g_iSampleRate;\r\n    float fScaler = (float)((int)1 << (uiSampleBitSize - 1));\r\n\r\n    switch (g_iNumChannels)\r\n    {\r\n        // Three channels.\r\n        case 3:\r\n            for (unsigned int i = 0; i < uiNumSamples; i++)\r\n            {\r\n                int iTemp1 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize]);\r\n                int iTemp2 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize]);\r\n                int iTemp3 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize]);\r\n\r\n                unsigned int uiLastJ = uiSampleSize - 1;\r\n                unsigned int uiShift = 8;\r\n\r\n                for (unsigned int j = 1; j < uiSampleSize; j++)\r\n                {\r\n                    if (j != uiLastJ)\r\n                    {\r\n                        iTemp1 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                    }\r\n                    else\r\n                    {\r\n                        iTemp1 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                    }\r\n\r\n                    uiShift += 8;\r\n                }\r\n\r\n                ppBuffer[0][i] = iTemp1/fScaler;\r\n                ppBuffer[1][i] = iTemp2/fScaler;\r\n                ppBuffer[2][i] = iTemp3/fScaler;\r\n            }\r\n            break;\r\n\r\n        // Five channels.\r\n        case 5:\r\n            for (unsigned int i = 0; i < uiNumSamples; i++)\r\n            {\r\n                // 6-channels.\r\n                int iTemp1 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize]);\r\n                int iTemp2 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize]);\r\n                int iTemp3 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize]);\r\n                int iTemp4 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize]);\r\n                int iTemp5 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize]);\r\n    \r\n                unsigned int uiLastJ = uiSampleSize - 1;\r\n                unsigned int uiShift = 8;\r\n\r\n                for (unsigned int j = 1; j < uiSampleSize; j++)\r\n                {\r\n                    if (j != uiLastJ)\r\n                    {\r\n                        iTemp1 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                        iTemp4 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize + j] << uiShift);\r\n                        iTemp5 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize + j] << uiShift);\r\n                    }\r\n                    else\r\n                    {\r\n                        iTemp1 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                        iTemp4 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize + j] << uiShift);\r\n                        iTemp5 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize + j] << uiShift);\r\n                    }\r\n\r\n                    uiShift += 8;\r\n                }\r\n\r\n                ppBuffer[0][i] = iTemp1/fScaler;\r\n                ppBuffer[1][i] = iTemp2/fScaler;\r\n                ppBuffer[2][i] = iTemp3/fScaler;\r\n                ppBuffer[3][i] = iTemp4/fScaler;\r\n                ppBuffer[4][i] = iTemp5/fScaler;\r\n            }\r\n            break;\r\n\r\n        // Six channels.\r\n        case 6:\r\n            for (unsigned int i = 0; i < uiNumSamples; i++)\r\n            {\r\n                // 6-channels.\r\n                int iTemp1 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize]);\r\n                int iTemp2 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize]);\r\n                int iTemp3 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize]);\r\n                int iTemp4 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize]);\r\n                int iTemp5 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 5 * uiSampleSize]);\r\n                int iTemp6 = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize]);\r\n\r\n                unsigned int uiLastJ = uiSampleSize - 1;\r\n                unsigned int uiShift = 8;\r\n\r\n                for (unsigned int j = 1; j < uiSampleSize; j++)\r\n                {\r\n                    if (j != uiLastJ)\r\n                    {\r\n                        iTemp1 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                        iTemp4 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize + j] << uiShift);\r\n                        iTemp5 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 5 * uiSampleSize + j] << uiShift);\r\n                        iTemp6 |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize + j] << uiShift);\r\n                    }\r\n                    else\r\n                    {\r\n                        iTemp1 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 0 * uiSampleSize + j] << uiShift);\r\n                        iTemp2 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 2 * uiSampleSize + j] << uiShift);\r\n                        iTemp3 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 1 * uiSampleSize + j] << uiShift);\r\n                        iTemp4 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 4 * uiSampleSize + j] << uiShift);\r\n                        iTemp5 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 5 * uiSampleSize + j] << uiShift);\r\n                        iTemp6 |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + 3 * uiSampleSize + j] << uiShift);\r\n                    }\r\n\r\n                    uiShift += 8;\r\n                }\r\n\r\n                ppBuffer[0][i] = iTemp1/fScaler;\r\n                ppBuffer[1][i] = iTemp2/fScaler;\r\n                ppBuffer[2][i] = iTemp3/fScaler;\r\n                ppBuffer[3][i] = iTemp4/fScaler;\r\n                ppBuffer[4][i] = iTemp5/fScaler;\r\n                ppBuffer[5][i] = iTemp6/fScaler;\r\n            }\r\n            break;\r\n\r\n        // One, two and four channels.\r\n        case 1:\r\n        case 2:\r\n        case 4:\r\n            for (unsigned int i = 0; i < uiNumSamples; i++)\r\n            {\r\n                for (int k = 0; k < g_iNumChannels; k++)\r\n                {\r\n                    int iTemp = (0xFF & (int)pBuffer[i * (uiSampleSize * g_iNumChannels) + k * uiSampleSize]);\r\n\r\n                    unsigned int uiLastJ = uiSampleSize - 1;\r\n                    unsigned int uiShift = 8;\r\n\r\n                    for (unsigned int j = 1; j < uiSampleSize; j++)\r\n                    {\r\n                        if (j != uiLastJ)\r\n                            iTemp |= ((unsigned char)pBuffer[i * (uiSampleSize * g_iNumChannels) + k * uiSampleSize + j] << uiShift);\r\n                        else\r\n                            iTemp |= ((signed char)pBuffer[i * (uiSampleSize * g_iNumChannels) + k * uiSampleSize + j] << uiShift);\r\n\r\n                        uiShift += 8;\r\n                    }\r\n\r\n                    ppBuffer[k][i] = iTemp/fScaler;\r\n                }\r\n            }\r\n            break;\r\n\r\n        default:\r\n            return -1;\r\n    }\r\n    \r\n    // Tell the library how much we actually submitted.\r\n    vorbis_analysis_wrote(&vd,uiNumSamples);\r\n\r\n    return irc_encode_flush_ex();\r\n}\r\n\r\n__int64 WINAPI irc_encode_flush()\r\n{\r\n    vorbis_analysis_wrote(&vd,0);\r\n\r\n    return irc_encode_flush_ex();\r\n}\r\n\r\nbool WINAPI irc_encode_exit()\r\n{\r\n    // Close the out file.\r\n    if (g_pFile == NULL)\r\n        return false;\r\n\r\n    delete g_pFile;\r\n    g_pFile = NULL;\r\n\r\n    // Destroy the encoder.\r\n    ogg_stream_clear(&os);\r\n    vorbis_block_clear(&vb);\r\n    vorbis_dsp_clear(&vd);\r\n    vorbis_info_clear(&vi);\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_config()\r\n{\r\n    CConfigDlg ConfigDlg(&g_EncoderConfig);\r\n    ConfigDlg.DoModal();\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis.def",
    "content": "LIBRARY\t\"vorbis.irc\"\r\nEXPORTS\r\n\tirc_capabilities\r\n\tirc_string\r\n\tirc_set_callback\r\n\tirc_decode_init\r\n\tirc_decode_process\r\n\tirc_decode_exit\r\n\tirc_encode_init\r\n\tirc_encode_process\r\n\tirc_encode_flush\r\n\tirc_encode_exit\r\n\tirc_encode_config\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n/*typedef struct\r\n{\r\n    // Vorbis variables.\r\n    ogg_page og;\r\n    ogg_stream_state os;\r\n    vorbis_dsp_state vd;\r\n    vorbis_block vb;\r\n    vorbis_info vi;\r\n};*/\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"afxres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"afxres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_PROPPAGE_CONFIGGENERAL DIALOGEX 0, 0, 214, 145\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    CONTROL         \"Constant bitrate mode\",IDC_BITRATERADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,41,200,10\r\n    CONTROL         \"Quality mode (recommended)\",IDC_QUALITYRADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,7,200,10\r\n    LTEXT           \"Quality:\",IDC_QUALITYSTATIC,19,17,26,8\r\n    CONTROL         \"\",IDC_QUALITYSLIDER,\"msctls_trackbar32\",TBS_TOOLTIPS | \r\n                    WS_TABSTOP,52,17,155,12\r\n    LTEXT           \"High\",IDC_QUALITYHIGHSTATIC,195,30,15,8\r\n    LTEXT           \"Low\",IDC_QUALITYLOWSTATIC,52,30,14,8\r\n    CONTROL         \"\",IDC_MINBITRATESPIN,\"msctls_updown32\",UDS_ARROWKEYS,\r\n                    101,78,11,13\r\n    EDITTEXT        IDC_MINBITRATEEDIT,61,78,40,13,ES_RIGHT | ES_AUTOHSCROLL\r\n    CONTROL         \"Variable bitrate mode\",IDC_VARBITRATERADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,68,200,10\r\n    CONTROL         \"Average bitrate mode\",IDC_AVBITRATERADIO,\"Button\",\r\n                    BS_AUTORADIOBUTTON,7,112,200,10\r\n    LTEXT           \"Min bitrate:\",IDC_MINBITRATESTATIC,19,80,38,8\r\n    LTEXT           \"Bitrate:\",IDC_BITRATESTATIC,19,53,25,8\r\n    CONTROL         \"\",IDC_BITRATESPIN,\"msctls_updown32\",UDS_ARROWKEYS,101,\r\n                    51,11,13\r\n    EDITTEXT        IDC_BITRATEEDIT,61,51,40,13,ES_RIGHT | ES_AUTOHSCROLL\r\n    LTEXT           \"Max bitrate:\",IDC_MAXBITRATESTATIC,19,96,40,8\r\n    CONTROL         \"\",IDC_MAXBITRATESPIN,\"msctls_updown32\",UDS_ARROWKEYS,\r\n                    101,94,11,13\r\n    EDITTEXT        IDC_MAXBITRATEEDIT,61,94,40,13,ES_RIGHT | ES_AUTOHSCROLL\r\n    LTEXT           \"Bitrate:\",IDC_AVBITRATESTATIC,19,124,25,8\r\n    CONTROL         \"\",IDC_AVBITRATESPIN,\"msctls_updown32\",UDS_ARROWKEYS,101,\r\n                    122,11,13\r\n    EDITTEXT        IDC_AVBITRATEEDIT,61,122,40,13,ES_RIGHT | ES_AUTOHSCROLL\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO \r\nBEGIN\r\n    IDD_PROPPAGE_CONFIGGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 207\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 136\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"vorbis\"\r\n\tProjectGUID=\"{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}\"\r\n\tRootNamespace=\"vorbis\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:LIBCMT\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"vorbis.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/vorbis.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:LIBCMT\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"vorbis.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/vorbis.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"vorbis.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\&quot;;&quot;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"vorbis.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\vorbis.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\vorbis.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\vorbis.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\vorbis.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t\t<Global\r\n\t\t\tName=\"RESOURCE_FILE\"\r\n\t\t\tValue=\"vorbis.rc\"\r\n\t\t/>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/codecs/vorbis/vorbis_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|Win32\">\n      <Configuration>Template</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|x64\">\n      <Configuration>Template</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>vorbis</ProjectName>\n    <ProjectGuid>{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}</ProjectGuid>\n    <RootNamespace>vorbis</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">.irc</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:LIBCMT %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>vorbis.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)vorbis.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:LIBCMT %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>vorbis.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)vorbis.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>vorbis.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;$(ProjectDir)..\\..\\..\\dep\\libogg\\include\\;$(ProjectDir)..\\..\\..\\dep\\libvorbis\\include\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;VORBIS_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>vorbis.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"vorbis.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"vorbis.def\" />\n    <None Include=\"config_dlg.hh\" />\n    <None Include=\"config_general_page.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"vorbis.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"vorbis.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\..\\dep\\libogg\\win32\\VS2010\\libogg_static.vcxproj\">\n      <Project>{15cbfeff-7965-41f5-b4e2-21e8795c9159}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\dep\\libvorbis\\win32\\VS2010\\libvorbisfile\\libvorbisfile_static.vcxproj\">\n      <Project>{cebde98b-a6aa-46e6-bc79-faaf823db9ec}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\dep\\libvorbis\\win32\\VS2010\\libvorbis\\libvorbis_static.vcxproj\">\n      <Project>{3a214e06-b95e-4d61-a291-1f8df2ec10fd}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n  <ProjectExtensions>\n    <VisualStudio>\n      <UserProperties RESOURCE_FILE=\"vorbis.rc\" />\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/codecs/vorbis/vorbis_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"vorbis.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"vorbis.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"config_dlg.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"config_general_page.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"vorbis.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"vorbis.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/codecs/wave/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/codecs/wave/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Exclude rarely-used stuff from Windows headers.\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#ifndef _T\r\n#define _T TEXT\r\n#endif\r\n\r\n#include <windows.h>\r\n"
  },
  {
    "path": "src/codecs/wave/wave.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <vfw.h>\r\n#include <base/codec_const.hh>\r\n#include \"wave_writer.hh\"\r\n\r\n#pragma comment(lib,\"vfw32.lib\")\r\n\r\ntirc_send_message *g_pSendMessage = NULL;\r\n\r\n// Capability flags.\r\nint g_iCapabilities = IRC_HAS_DECODER | IRC_HAS_ENCODER;\r\n\r\n// Version and about strings.\r\nTCHAR *g_szVersion = _T(\"0.53.0.0\");\r\nTCHAR *g_szAbout = _T(\"InfraRecorder Wave Codec\\n\\nCopyright  2006-2012 Christian Kindahl.\");\r\nTCHAR *g_szEncoder = _T(\"Wave\");\r\nTCHAR *g_szFileExt = _T(\".wav\");\r\n\r\n// Global variables.\r\nPAVIFILE g_pAVIFile = NULL;\r\nPAVISTREAM g_pAVIStream = NULL;\r\nlong g_lCurSample = 0;\r\nCWaveWriter g_WaveWriter;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)\r\n{\r\n    switch (ul_reason_for_call)\r\n    {\r\n        // Initialize COM for the current thread if it hasn't already been initialized.\r\n        case DLL_PROCESS_ATTACH:\r\n        case DLL_THREAD_ATTACH:\r\n            AVIFileInit();\r\n            break;\r\n\r\n        case DLL_PROCESS_DETACH:\r\n        case DLL_THREAD_DETACH:\r\n            AVIFileExit();\r\n            break;\r\n    };\r\n\r\n    return TRUE;\r\n}\r\n\r\n/*\r\n    irc_capabilities\r\n    ----------------\r\n    Returns bit information on what operations that are supported by the codec.\r\n*/\r\nint WINAPI irc_capabilities()\r\n{\r\n    return g_iCapabilities;\r\n}\r\n\r\nTCHAR *WINAPI irc_string(unsigned int uiID)\r\n{\r\n    switch (uiID)\r\n    {\r\n        case IRC_STR_VERSION:\r\n            return g_szVersion;\r\n\r\n        case IRC_STR_ABOUT:\r\n            return g_szAbout;\r\n\r\n        case IRC_STR_ENCODER:\r\n            return g_szEncoder;\r\n\r\n        case IRC_STR_FILEEXT:\r\n            return g_szFileExt;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool WINAPI irc_set_callback(tirc_send_message *pSendMessage)\r\n{\r\n    if (pSendMessage == NULL)\r\n        return false;\r\n\r\n    g_pSendMessage = pSendMessage;\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_decode_init(const TCHAR *szFileName,int &iNumChannels,\r\n                            int &iSampleRate,int &iBitRate,unsigned __int64 &uiDuration)\r\n{\r\n    // Open the file.\r\n    HRESULT hResult = AVIFileOpen(&g_pAVIFile,szFileName,OF_SHARE_DENY_NONE,NULL);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    // Get the first stream in the file (we assume only one audio stream).\r\n    hResult = AVIFileGetStream(g_pAVIFile,&g_pAVIStream,streamtypeAUDIO,0);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    // Gather stream information.\r\n    long lAudioInfoSize = 0;\r\n    hResult = AVIStreamFormatSize(g_pAVIStream,0,&lAudioInfoSize);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    if (lAudioInfoSize < sizeof(WAVEFORMATEX))\r\n        lAudioInfoSize = sizeof(WAVEFORMATEX);\r\n\r\n    WAVEFORMATEX *pAudioInfo = (WAVEFORMATEX *)new unsigned char[lAudioInfoSize];\r\n    if (pAudioInfo == NULL)\r\n        return false;\r\n\r\n    hResult = AVIStreamReadFormat(g_pAVIStream,0,pAudioInfo,&lAudioInfoSize);\r\n    if (FAILED(hResult))\r\n    {\r\n        delete [] pAudioInfo;\r\n        return false;\r\n    }\r\n\r\n    if (pAudioInfo->wFormatTag == WAVE_FORMAT_PCM)\r\n        pAudioInfo->cbSize = 0;\r\n\r\n    iNumChannels = pAudioInfo->nChannels;\r\n    iSampleRate = pAudioInfo->nSamplesPerSec;\r\n    iBitRate = iSampleRate * pAudioInfo->wBitsPerSample;\r\n\r\n    // Get stream duration in milliseconds.\r\n    long lLength = AVIStreamLength(g_pAVIStream);\r\n    uiDuration = AVIStreamSampleToTime(g_pAVIStream,lLength);\r\n\r\n    g_lCurSample = AVIStreamStart(g_pAVIStream);\r\n\r\n    delete [] pAudioInfo;\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_decode_process(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  unsigned __int64 &uiTime)\r\n{\r\n    if (iBufferSize > 0x7FFFFFFF)\r\n        return -1;\r\n\r\n    long lProcessed = 0;\r\n    long lProcessedSamples = 0;\r\n\r\n    HRESULT hResult = AVIStreamRead(g_pAVIStream,g_lCurSample,AVISTREAMREAD_CONVENIENT,\r\n        pBuffer,(long)iBufferSize,&lProcessed,&lProcessedSamples);\r\n    if (FAILED(hResult))\r\n        return -1;\r\n\r\n    g_lCurSample += lProcessedSamples;\r\n    uiTime = AVIStreamSampleToTime(g_pAVIStream,g_lCurSample);\r\n    return lProcessed;\r\n}\r\n\r\nbool WINAPI irc_decode_exit()\r\n{\r\n    HRESULT hResult = AVIStreamRelease(g_pAVIStream);\r\n    if (FAILED(hResult))\r\n        return false;\r\n    g_pAVIStream = NULL;\r\n\r\n    hResult = AVIFileRelease(g_pAVIFile);\r\n    if (FAILED(hResult))\r\n        return false;\r\n    g_pAVIFile = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_init(const TCHAR *szFileName,int iNumChannels,\r\n                            int iSampleRate,int iBitRate)\r\n{\r\n    return g_WaveWriter.Open(szFileName,iNumChannels,iSampleRate,iBitRate);\r\n}\r\n\r\n__int64 WINAPI irc_encode_process(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    return g_WaveWriter.Write(pBuffer,iDataSize);\r\n}\r\n\r\n__int64 WINAPI irc_encode_flush()\r\n{\r\n    return 0;\r\n}\r\n\r\nbool WINAPI irc_encode_exit()\r\n{\r\n    return g_WaveWriter.Close();\r\n}\r\n\r\nbool WINAPI irc_encode_config()\r\n{\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wave/wave.def",
    "content": "LIBRARY\t\"wave.irc\"\r\nEXPORTS\r\n\tirc_capabilities\r\n\tirc_string\r\n\tirc_set_callback\r\n\tirc_decode_init\r\n\tirc_decode_process\r\n\tirc_decode_exit\r\n\tirc_encode_init\r\n\tirc_encode_process\r\n\tirc_encode_flush\r\n\tirc_encode_exit\r\n\tirc_encode_config\r\n"
  },
  {
    "path": "src/codecs/wave/wave_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"wave\"\r\n\tProjectGUID=\"{1A7358F8-3F30-4079-8BAB-9399B76B5187}\"\r\n\tRootNamespace=\"wave\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"wave.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"wave.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"wave.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"wave.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wave.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wave.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wave_writer.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wave_writer.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/codecs/wave/wave_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>wave</ProjectName>\n    <ProjectGuid>{1A7358F8-3F30-4079-8BAB-9399B76B5187}</ProjectGuid>\n    <RootNamespace>wave</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">.irc</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>wave.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>wave.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>wave.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WAVE_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>wave.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"wave.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"wave_writer.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Use</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"wave.def\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"wave_writer.hh\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/codecs/wave/wave_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"wave.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"wave_writer.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"wave.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"wave_writer.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/codecs/wave/wave_writer.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"wave_writer.hh\"\r\n\r\nCWaveWriter::CWaveWriter() : m_pFile(NULL)\r\n{\r\n    m_iNumChannels = 0;\r\n    m_iSampleRate = 0;\r\n    m_iBitRate = 0;\r\n    m_iBitsPerSample = 0;\r\n    m_ulNumSamples = 0;\r\n}\r\n\r\nCWaveWriter::~CWaveWriter()\r\n{\r\n    if (m_pFile != NULL)\r\n        Close();\r\n}\r\n\r\nbool CWaveWriter::WriteHeader()\r\n{\r\n    if (m_pFile == NULL)\r\n        return false;\r\n\r\n    unsigned char ucHeader[44];\r\n    unsigned long ulBytes = (m_iBitsPerSample + 7) / 8;\r\n    unsigned long ulDataSize = m_ulNumSamples * ulBytes;\r\n\r\n    // The \"RIFF\" label.\r\n    ucHeader[ 0] = 'R';\r\n    ucHeader[ 1] = 'I';\r\n    ucHeader[ 2] = 'F';\r\n    ucHeader[ 3] = 'F';\r\n\r\n    // Size of the next chunk.\r\n    unsigned long ulTemp = ulDataSize + (44 - 8) < WAVEWRITER_MAXSIZE ?\r\n        ulDataSize + (44 - 8) : WAVEWRITER_MAXSIZE;\r\n    ucHeader[ 4] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[ 5] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[ 6] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[ 7] = (unsigned char)(ulTemp >> 24);\r\n\r\n    // The \"WAVE\" label.\r\n    ucHeader[ 8] = 'W';\r\n    ucHeader[ 9] = 'A';\r\n    ucHeader[10] = 'V';\r\n    ucHeader[11] = 'E';\r\n\r\n    // The \"fmt \" label.\r\n    ucHeader[12] = 'f';\r\n    ucHeader[13] = 'm';\r\n    ucHeader[14] = 't';\r\n    ucHeader[15] = ' ';\r\n\r\n    // Length of the PCM declaration (2+2+4+4+2+2).\r\n    ucHeader[16] = 0x10;\r\n    ucHeader[17] = 0x00;\r\n    ucHeader[18] = 0x00;\r\n    ucHeader[19] = 0x00;\r\n\r\n    // We only support uncompressed linear PCM data.\r\n    ucHeader[20] = 0x01;\r\n    ucHeader[21] = 0x00;\r\n\r\n    // Number of channels.\r\n    ucHeader[22] = (unsigned char)(m_iNumChannels >> 0);\r\n    ucHeader[23] = (unsigned char)(m_iNumChannels >> 8);\r\n\r\n    // Sample frequency.\r\n    ulTemp = (unsigned long)(m_iSampleRate + 0.5);\r\n    ucHeader[24] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[25] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[26] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[27] = (unsigned char)(ulTemp >> 24);\r\n\r\n    // Bytes per second in the data stream.\r\n    ulTemp *= ulBytes * m_iNumChannels;\r\n    ucHeader[28] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[29] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[30] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[31] = (unsigned char)(ulTemp >> 24);\r\n\r\n    // Bytes per sample time.\r\n    ulTemp = ulBytes * m_iNumChannels;\r\n    ucHeader[32] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[33] = (unsigned char)(ulTemp >>  8);\r\n\r\n    // Bits per single sample.\r\n    ucHeader[34] = (unsigned char)(m_iBitsPerSample >> 0);\r\n    ucHeader[35] = (unsigned char)(m_iBitsPerSample >> 8);\r\n\r\n    // The \"data\" label.\r\n    ucHeader[36] = 'd';\r\n    ucHeader[37] = 'a';\r\n    ucHeader[38] = 't';\r\n    ucHeader[39] = 'a';\r\n\r\n    // Real length of PCM data\r\n    ulTemp = ulDataSize < WAVEWRITER_MAXSIZE ? ulDataSize : WAVEWRITER_MAXSIZE;\r\n    ucHeader[40] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[41] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[42] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[43] = (unsigned char)(ulTemp >> 24);\r\n\r\n    return m_pFile->write(ucHeader,sizeof(ucHeader)) != -1;\r\n}\r\n\r\nbool CWaveWriter::WriteExtensibleHeader()\r\n{\r\n    if (m_pFile == NULL)\r\n        return false;\r\n\r\n    unsigned char ucHeader[68];\r\n    unsigned long ulBytes = (m_iBitsPerSample + 7) / 8;\r\n    float fDataSize = (float)ulBytes * m_ulNumSamples;\r\n\r\n    // Create the channel mask.\r\n    unsigned long ulChannelMask;\r\n    switch (m_iNumChannels)\r\n    {\r\n        case 3:\r\n            ulChannelMask = 7;\r\n            break;\r\n\r\n        case 4:\r\n            ulChannelMask = 51;\r\n            break;\r\n\r\n        case 5:\r\n            ulChannelMask = 55;\r\n            break;\r\n\r\n        case 6:\r\n            ulChannelMask = 63;\r\n            break;\r\n\r\n        default:\r\n            ulChannelMask = 0;\r\n            break;\r\n    }\r\n\r\n    // The \"RIFF\" header.\r\n    ucHeader[0] = 'R'; ucHeader[1] = 'I'; ucHeader[2] = 'F'; ucHeader[3] = 'F';\r\n\r\n    unsigned long ulTemp = (fDataSize + (68 - 8) < (float)WAVEWRITER_MAXSIZE) ?\r\n            (unsigned long)fDataSize + (68 - 8) : (unsigned long)WAVEWRITER_MAXSIZE;\r\n    ucHeader[4] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[5] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[6] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[7] = (unsigned char)(ulTemp >> 24);\r\n\r\n    // The \"WAVE\" header.\r\n    ucHeader[8] = 'W'; ucHeader[9] = 'A'; ucHeader[10] = 'V'; ucHeader[11] = 'E';\r\n\r\n    // The \"fmt \" header.\r\n    ucHeader[12] = 'f'; ucHeader[13] = 'm'; ucHeader[14] = 't'; ucHeader[15] = ' ';\r\n\r\n    ucHeader[16] = 0x28; ucHeader[17] = 0x00; ucHeader[18] = 0x00; ucHeader[19] = 0x00;\r\n\r\n    // Extensible format data.\r\n    ucHeader[20] = 0xFE; ucHeader[21] = 0xFF;\r\n\r\n    ucHeader[22] = (unsigned char)(m_iNumChannels >> 0);\r\n    ucHeader[23] = (unsigned char)(m_iNumChannels >> 8);\r\n\r\n    ulTemp = (unsigned long)(m_iSampleRate + 0.5);\r\n    ucHeader[24] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[25] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[26] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[27] = (unsigned char)(ulTemp >> 24);\r\n\r\n    ulTemp = m_iSampleRate * ulBytes * m_iNumChannels;\r\n    ucHeader[28] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[29] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[30] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[31] = (unsigned char)(ulTemp >> 24);\r\n\r\n    ulTemp = ulBytes * m_iNumChannels;\r\n    ucHeader[32] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[33] = (unsigned char)(ulTemp >>  8);\r\n\r\n    ucHeader[34] = (unsigned char)(m_iBitsPerSample >> 0);\r\n    ucHeader[35] = (unsigned char)(m_iBitsPerSample >> 8);\r\n\r\n    // cbSize.\r\n    ucHeader[36] = (unsigned char)(22);\r\n    ucHeader[37] = (unsigned char)(0);\r\n\r\n    // wValidBitsPerSample.\r\n    ucHeader[38] = (unsigned char)(m_iBitsPerSample >> 0);\r\n    ucHeader[39] = (unsigned char)(m_iBitsPerSample >> 8);\r\n\r\n    // dwChannelMask.\r\n    ulTemp = ulChannelMask;\r\n    ucHeader[40] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[41] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[42] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[43] = (unsigned char)(ulTemp >> 24);\r\n\r\n    // SubFormat (KSDATAFORMAT_SUBTYPE_PCM: 00000001-0000-0010-8000-00aa00389b71).\r\n    ucHeader[44] = 0x01;\r\n    ucHeader[45] = 0x00;\r\n    ucHeader[46] = 0x00;\r\n    ucHeader[47] = 0x00;\r\n    ucHeader[48] = 0x00; ucHeader[49] = 0x00; ucHeader[50] = 0x10; ucHeader[51] = 0x00;ucHeader[52] = 0x80; ucHeader[53] = 0x00;\r\n    ucHeader[54] = 0x00; ucHeader[55] = 0xaa; ucHeader[56] = 0x00; ucHeader[57] = 0x38; ucHeader[58] = 0x9b; ucHeader[59] = 0x71;\r\n    // End of extensiable format data.\r\n\r\n    // The \"data\" label.\r\n    ucHeader[60] = 'd'; ucHeader[61] = 'a'; ucHeader[62] = 't'; ucHeader[63] = 'a';\r\n\r\n    ulTemp = fDataSize < WAVEWRITER_MAXSIZE ?\r\n            (unsigned long)fDataSize : (unsigned long)WAVEWRITER_MAXSIZE;\r\n    ucHeader[64] = (unsigned char)(ulTemp >>  0);\r\n    ucHeader[65] = (unsigned char)(ulTemp >>  8);\r\n    ucHeader[66] = (unsigned char)(ulTemp >> 16);\r\n    ucHeader[67] = (unsigned char)(ulTemp >> 24);\r\n\r\n    return m_pFile->write(ucHeader,sizeof(ucHeader)) != -1;\r\n}\r\n\r\nbool CWaveWriter::Open(const TCHAR *szFileName,int iNumChannels,\r\n                       int iSampleRate,int iBitRate)\r\n{\r\n    if (m_pFile != NULL)\r\n        return false;\r\n\r\n    m_pFile = new ckcore::File(szFileName);\r\n    if (!m_pFile->open(ckcore::File::ckOPEN_WRITE))\r\n    {\r\n        delete m_pFile;\r\n        m_pFile = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    m_iNumChannels = iNumChannels;\r\n    m_iSampleRate = iSampleRate;\r\n    m_iBitRate = iBitRate;\r\n\r\n    m_iBitsPerSample = m_iBitRate / m_iSampleRate;\r\n    m_ulNumSamples = 0;\r\n\r\n    // Write the wave header.\r\n    if (m_iNumChannels > 2)\r\n        WriteExtensibleHeader();\r\n    else\r\n        WriteHeader();\r\n\r\n    return true;\r\n}\r\n\r\nbool CWaveWriter::Close()\r\n{\r\n    if (m_pFile == NULL)\r\n        return false;\r\n\r\n    // Re-write the header (contains updated information).\r\n    m_pFile->seek(0,ckcore::File::ckFILE_BEGIN);\r\n    if (m_iNumChannels > 2)\r\n        WriteExtensibleHeader();\r\n    else\r\n        WriteHeader();\r\n\r\n    delete m_pFile;\r\n    m_pFile = NULL;\r\n\r\n    return true;\r\n}\r\n\r\n__int64 CWaveWriter::Write(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    if (iDataSize > 0xFFFFFFFF)\r\n        return -1;\r\n\r\n    int iBytesPerSample = m_iBitsPerSample >> 3;\r\n    m_ulNumSamples += (unsigned long)iDataSize / iBytesPerSample;\r\n    return m_pFile->write(pBuffer,(unsigned long)iDataSize);\r\n}\r\n"
  },
  {
    "path": "src/codecs/wave/wave_writer.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <ckcore/file.hh>\r\n\r\n#define WAVEWRITER_MAXSIZE\t\t\t\t\t4294967040LU\r\n\r\nclass CWaveWriter\r\n{\r\nprivate:\r\n    ckcore::File *m_pFile;\r\n\r\n    int m_iNumChannels;\r\n    int m_iSampleRate;\r\n    int m_iBitRate;\r\n    int m_iBitsPerSample;\r\n    unsigned long m_ulNumSamples;\r\n\r\n    bool WriteHeader();\r\n    bool WriteExtensibleHeader();\r\n\r\npublic:\r\n    CWaveWriter();\r\n    ~CWaveWriter();\r\n\r\n    bool Open(const TCHAR *szFileName,int iNumChannels,\r\n        int iSampleRate,int iBitRate);\r\n    bool Close();\r\n    __int64 Write(unsigned char *pBuffer,__int64 iDataSize);\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/config_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"config_dlg.hh\"\r\n\r\nCConfigDlg::CConfigDlg(CEncoderConfig *pConfig) : CPropertySheetImpl<CConfigDlg>(_T(\"Configuration\"),0,NULL)\r\n{\r\n    m_bCentered = false;\r\n\r\n    m_psh.dwFlags |= PSH_NOAPPLYNOW;\r\n\r\n    m_GeneralPage.SetConfig(pConfig);\r\n    AddPage(m_GeneralPage);\r\n}\r\n\r\nCConfigDlg::~CConfigDlg()\r\n{\r\n}\r\n\r\nLRESULT CConfigDlg::OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the window, once.\r\n    if (wParam == TRUE && !m_bCentered)\r\n    {\r\n        CenterWindow();\r\n        m_bCentered = true;\r\n    }\r\n\r\n    bHandled = FALSE;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/config_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"config_general_page.hh\"\r\n\r\nclass CConfigDlg : public CPropertySheetImpl<CConfigDlg>\r\n{\r\nprivate:\r\n    bool m_bCentered;\r\n\r\n    CConfigGeneralPage m_GeneralPage;\r\n\r\npublic:\r\n    CConfigDlg(CEncoderConfig *pConfig);\r\n    ~CConfigDlg();\r\n\r\n    BEGIN_MSG_MAP(CConfigDlg)\r\n        MESSAGE_HANDLER(WM_SHOWWINDOW,OnShowWindow)\r\n        CHAIN_MSG_MAP(CPropertySheetImpl<CConfigDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnShowWindow(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/config_general_page.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/string_util.hh>\r\n#include <wmsdk.h>\r\n#include \"config_general_page.hh\"\r\n\r\nCConfigGeneralPage::CConfigGeneralPage()\r\n{\r\n    m_pConfig = NULL;\r\n}\r\n\r\nCConfigGeneralPage::~CConfigGeneralPage()\r\n{\r\n}\r\n\r\nbool CConfigGeneralPage::SetConfig(CEncoderConfig *pConfig)\r\n{\r\n    if (pConfig == NULL)\r\n        return false;\r\n\r\n    m_pConfig = pConfig;\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::OnApply()\r\n{\r\n    m_pConfig->m_iProfile = (int)m_ProfileList.GetItemData(m_ProfileList.GetCurSel());\r\n\r\n    return true;\r\n}\r\n\r\nbool CConfigGeneralPage::FillProfileList()\r\n{\r\n    HRESULT hResult = S_OK;\r\n    IWMProfileManager *pIWMProfileManager = NULL;\r\n    IWMProfileManager2 *pIWMProfileManager2 = NULL;\r\n    IWMProfile *pIWMProfile = NULL;\r\n\r\n    TCHAR szProfileName[256];\r\n\r\n    do\r\n    {\r\n        // Create profile manager.\r\n        hResult = g_LibraryHelper.irc_WMCreateProfileManager(&pIWMProfileManager);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        hResult = pIWMProfileManager->QueryInterface(IID_IWMProfileManager2,(void **)&pIWMProfileManager2);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        // Set system profile version to 8.0.\r\n        hResult = pIWMProfileManager2->SetSystemProfileVersion(WMT_VER_8_0);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        unsigned long ulNumProfiles = 0;\r\n        hResult = pIWMProfileManager->GetSystemProfileCount(&ulNumProfiles);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        // Iterate all system profiles.\r\n        for (unsigned int i = 0; i < ulNumProfiles; i++)\r\n        {\r\n            hResult = pIWMProfileManager->LoadSystemProfile(i,&pIWMProfile);\r\n            if (FAILED(hResult))\r\n                break;\r\n\r\n            unsigned long ulProfileNameLen = 255;\r\n            hResult = pIWMProfile->GetName(szProfileName,&ulProfileNameLen);\r\n            if (FAILED(hResult))\r\n                break;\r\n\r\n            if (!lstrncmp(szProfileName,_T(\"Windows Media Audio\"),19))\r\n            {\r\n                szProfileName[16] = 'W';\r\n                szProfileName[17] = 'M';\r\n                szProfileName[18] = 'A';\r\n\r\n                // Add the profile to the list.\r\n                m_ProfileList.AddString(szProfileName + 16);\r\n                m_ProfileList.SetItemData(m_ProfileList.GetCount() - 1,i);\r\n            }\r\n    \r\n            if (pIWMProfile != NULL)\r\n            {\r\n                pIWMProfile->Release();\r\n                pIWMProfile = NULL;\r\n            }\r\n        }\r\n\r\n        if (FAILED(hResult))\r\n            break;\r\n    }\r\n    while (false);\r\n\r\n    // Release all resources.\r\n    if (pIWMProfile != NULL)\r\n    {\r\n        pIWMProfile->Release();\r\n        pIWMProfile = NULL;\r\n    }\r\n\r\n    if (pIWMProfileManager != NULL)\r\n    {\r\n        pIWMProfileManager->Release();\r\n        pIWMProfileManager = NULL;\r\n    }\r\n\r\n    if (pIWMProfileManager2 != NULL)\r\n    {\r\n        pIWMProfileManager2->Release();\r\n        pIWMProfileManager2 = NULL;\r\n    }\r\n\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    // Select the last profile that we found.\r\n    m_ProfileList.SetCurSel(m_ProfileList.GetCount() - 1);\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CConfigGeneralPage::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Initialize the profile list.\r\n    m_ProfileList = GetDlgItem(IDC_PROFILELIST);\r\n    FillProfileList();\r\n\r\n    return TRUE;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/config_general_page.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include \"resource.h\"\r\n\r\n#define CONFIG_PRESET_CUSTOM\t\t0\r\n#define CONFIG_PRESET_MEDIUM\t\t1\r\n#define CONFIG_PRESET_STANDARD\t\t2\r\n#define CONFIG_PRESET_EXTREME\t\t3\r\n#define CONFIG_PRESET_INSANE\t\t4\r\n\r\n#define CONFIG_EQ_FAST\t\t\t\t0\r\n#define CONFIG_EQ_STANDARD\t\t\t1\r\n#define CONFIG_EQ_HIGH\t\t\t\t2\r\n\r\nclass CEncoderConfig\r\n{\r\npublic:\r\n    CEncoderConfig()\r\n    {\r\n        // Profile number 21 should hopefully be 128 kbps.\r\n        m_iProfile = 21;\r\n    }\r\n\r\n    int m_iProfile;\r\n};\r\n\r\nclass CConfigGeneralPage : public CPropertyPageImpl<CConfigGeneralPage>\r\n{\r\nprivate:\r\n    CListBox m_ProfileList;\r\n\r\n    CEncoderConfig *m_pConfig;\r\n\r\n    bool FillProfileList();\r\n\r\npublic:\r\n    enum { IDD = IDD_PROPPAGE_CONFIGGENERAL };\r\n\r\n    CConfigGeneralPage();\r\n    ~CConfigGeneralPage();\r\n\r\n    bool SetConfig(CEncoderConfig *pConfig);\r\n    bool OnApply();\r\n\r\n    BEGIN_MSG_MAP(CConfigGeneralPage)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n\r\n        CHAIN_MSG_MAP(CPropertyPageImpl<CConfigGeneralPage>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/library_helper.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <wmsdk.h>\r\n#include \"library_helper.hh\"\r\n\r\nCLibraryHelper::CLibraryHelper()\r\n{\r\n    m_hDllInstance = NULL;\r\n    irc_WMCreateProfileManager = NULL;\r\n    irc_WMCreateWriter = NULL;\r\n    irc_WMCreateSyncReader = NULL;\r\n}\r\n\r\nCLibraryHelper::~CLibraryHelper()\r\n{\r\n}\r\n\r\nbool CLibraryHelper::Load(const TCHAR *szFileName)\r\n{\r\n    m_hDllInstance = LoadLibrary(szFileName);\r\n    if (m_hDllInstance == NULL)\r\n        return false;\r\n\r\n    irc_WMCreateProfileManager = (tirc_WMCreateProfileManager)GetProcAddress(m_hDllInstance,\"WMCreateProfileManager\");\r\n    if (irc_WMCreateProfileManager == NULL)\r\n        return false;\r\n\r\n    irc_WMCreateWriter = (tirc_WMCreateWriter)GetProcAddress(m_hDllInstance,\"WMCreateWriter\");\r\n    if (irc_WMCreateWriter == NULL)\r\n        return false;\r\n\r\n    irc_WMCreateSyncReader = (tirc_WMCreateSyncReader)GetProcAddress(m_hDllInstance,\"WMCreateSyncReader\");\r\n    if (irc_WMCreateSyncReader == NULL)\r\n        return false;\r\n\r\n    return true;\r\n}\r\n\r\nbool CLibraryHelper::Unload()\r\n{\r\n    if (m_hDllInstance != NULL)\r\n        return false;\r\n\r\n    FreeLibrary(m_hDllInstance);\r\n    m_hDllInstance = NULL;\r\n\r\n    irc_WMCreateProfileManager = NULL;\r\n    irc_WMCreateWriter = NULL;\r\n    irc_WMCreateSyncReader = NULL;\r\n\r\n    return true;\r\n}\r\n\r\nbool CLibraryHelper::IsLoaded()\r\n{\r\n    return m_hDllInstance != NULL;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/library_helper.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\ntypedef HRESULT (__stdcall *tirc_WMCreateProfileManager)(IWMProfileManager **ppProfileManager);\r\ntypedef HRESULT (__stdcall *tirc_WMCreateWriter)(IUnknown *pUnkCert,IWMWriter **ppWriter);\r\ntypedef HRESULT (__stdcall *tirc_WMCreateSyncReader)(IUnknown *pUnkCert,DWORD dwRights,IWMSyncReader **ppSyncReader);\r\n\r\nclass CLibraryHelper\r\n{\r\nprivate:\r\n    HINSTANCE m_hDllInstance;\r\n\r\npublic:\r\n    CLibraryHelper();\r\n    ~CLibraryHelper();\r\n\r\n    bool Load(const TCHAR *szFileName);\r\n    bool Unload();\r\n    bool IsLoaded();\r\n\r\n    tirc_WMCreateProfileManager irc_WMCreateProfileManager;\r\n    tirc_WMCreateWriter irc_WMCreateWriter;\r\n    tirc_WMCreateSyncReader irc_WMCreateSyncReader;\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/read_stream.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"read_stream.hh\"\r\n\r\nCReadStream::CReadStream()\r\n{\r\n    m_cRefs = 1;\r\n    m_hFile = INVALID_HANDLE_VALUE;\r\n}\r\n\r\nCReadStream::~CReadStream()\r\n{\r\n    if (m_hFile != INVALID_HANDLE_VALUE)\r\n        CloseHandle(m_hFile);\r\n}\r\n\r\n// IStream methods.\r\nHRESULT CReadStream::Open(const TCHAR *szFileName)\r\n{\r\n    HRESULT hResult = S_OK;\r\n\r\n    m_hFile = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,\r\n        OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);\r\n\r\n    if (m_hFile == INVALID_HANDLE_VALUE)\r\n        return HRESULT_FROM_WIN32(GetLastError());\r\n\r\n    if (GetFileType(m_hFile) != FILE_TYPE_DISK)\r\n    {\r\n        CloseHandle(m_hFile);\r\n        m_hFile = INVALID_HANDLE_VALUE;\r\n\r\n        return E_FAIL;\r\n    }\r\n\r\n    return hResult;\r\n}\r\n\r\nHRESULT CReadStream::Read(void *pv,ULONG cb,ULONG *pcbRead)\r\n{\r\n    if (!ReadFile(m_hFile,pv,cb,pcbRead,NULL))\r\n        return HRESULT_FROM_WIN32(GetLastError());\r\n\r\n    return S_OK;\r\n}\r\n\r\nHRESULT CReadStream::Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin,\r\n                          ULARGE_INTEGER *plibNewPosition)\r\n{\r\n    unsigned long ulMoveMethod;\r\n\r\n    switch (dwOrigin)\r\n    {\r\n        case STREAM_SEEK_SET:\r\n            ulMoveMethod = FILE_BEGIN;\r\n            break;\r\n\r\n        case STREAM_SEEK_CUR:\r\n            ulMoveMethod = FILE_CURRENT;\r\n            break;\r\n\r\n        case STREAM_SEEK_END:\r\n            ulMoveMethod = FILE_END;\r\n            break;\r\n\r\n        default:\r\n            return E_INVALIDARG;\r\n    };\r\n\r\n    unsigned long ulPos = SetFilePointer(m_hFile,dlibMove.LowPart,NULL,ulMoveMethod);\r\n\r\n    if (ulPos == 0xFFFFFFFF)\r\n        return HRESULT_FROM_WIN32(GetLastError());\r\n\r\n    if (plibNewPosition != NULL)\r\n    {\r\n        plibNewPosition->LowPart = ulPos;\r\n        plibNewPosition->HighPart = 0;\r\n    }\r\n\r\n    return S_OK;\r\n}\r\n\r\nHRESULT CReadStream::Stat(STATSTG *pstatstg,DWORD grfStatFlag)\r\n{\r\n    if (pstatstg == NULL || grfStatFlag != STATFLAG_NONAME)\r\n        return E_INVALIDARG;\r\n\r\n    unsigned long ulFileSize = GetFileSize(m_hFile,NULL);\r\n\r\n    if (ulFileSize == 0xFFFFFFFF)\r\n        return HRESULT_FROM_WIN32(GetLastError());\r\n\r\n    memset(pstatstg,0,sizeof(STATSTG));\r\n\r\n    pstatstg->type = STGTY_STREAM;\r\n    pstatstg->cbSize.LowPart = ulFileSize;\r\n\r\n    return S_OK;\r\n}\r\n\r\n// IStream unimplemented methods.\r\nHRESULT STDMETHODCALLTYPE CReadStream::Write(void const *pv,ULONG cb,ULONG *pcbWritten)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::SetSize(ULARGE_INTEGER libNewSize)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::CopyTo(IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::Commit(DWORD grfCommitFlags)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::Revert()\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::LockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::UnlockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\nHRESULT STDMETHODCALLTYPE CReadStream::Clone(IStream **ppstm)\r\n{\r\n    return E_NOTIMPL;\r\n}\r\n\r\n// IUnknown methods.\r\nHRESULT CReadStream::QueryInterface(REFIID riid,void **ppv)\r\n{\r\n    if (riid == IID_IUnknown || riid == IID_IStream)\r\n    {\r\n        *ppv = this;\r\n        AddRef();\r\n\r\n        return S_OK;\r\n    }\r\n        \r\n    return E_NOINTERFACE;\r\n}\r\n\r\nULONG CReadStream::AddRef()\r\n{\r\n    return InterlockedIncrement(&m_cRefs);\r\n}\r\n\r\nULONG CReadStream::Release()\r\n{\r\n    if (InterlockedDecrement(&m_cRefs) == 0)\r\n    {\r\n        delete this;\r\n        return 0;\r\n    }\r\n    \r\n    return 0xBAD;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/read_stream.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <objidl.h>\r\n\r\nclass CReadStream : public IStream\r\n{\r\nprivate:\r\n    HANDLE m_hFile;\r\n    LONG m_cRefs;\r\n\r\npublic:\r\n    CReadStream();\r\n    ~CReadStream();\r\n\r\n    HRESULT Open(const TCHAR *szFileName);\r\n\r\n    // IStream methods.\r\n    HRESULT STDMETHODCALLTYPE Read(void *pv,ULONG cb,ULONG *pcbRead);\r\n    HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition);\r\n    HRESULT STDMETHODCALLTYPE Stat(STATSTG *pstatstg,DWORD grfStatFlag);\r\n\r\n    HRESULT STDMETHODCALLTYPE Write(void const *pv,ULONG cb,ULONG *pcbWritten);\r\n    HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER libNewSize);\r\n    HRESULT STDMETHODCALLTYPE CopyTo(IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten);\r\n    HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags);\r\n    HRESULT STDMETHODCALLTYPE Revert();\r\n    HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType);\r\n    HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType);\r\n    HRESULT STDMETHODCALLTYPE Clone(IStream **ppstm);\r\n\r\n    // IUnknown methods.\r\n    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,void **ppv);\r\n    ULONG STDMETHODCALLTYPE AddRef();\r\n    ULONG STDMETHODCALLTYPE Release();\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by irWMA.rc\r\n//\r\n#define IDD_PROPPAGE_CONFIGGENERAL      106\r\n#define IDC_PROFILESTATIC               1001\r\n#define IDC_LIST1                       1002\r\n#define IDC_PROFILELIST                 1002\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        101\r\n#define _APS_NEXT_COMMAND_VALUE         40001\r\n#define _APS_NEXT_CONTROL_VALUE         1003\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/codecs/wma/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n\r\n// Library helper (since this codec uses dynamic loading of wmvcore.dll).\r\nCLibraryHelper g_LibraryHelper;\r\n"
  },
  {
    "path": "src/codecs/wma/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Exclude rarely-used stuff from Windows headers.\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n#include <atlctrls.h>\r\n#include <atlctrlw.h>\r\n#include <atldlgs.h>\r\n\r\n#include <wmsdk.h>\r\n#include \"library_helper.hh\"\r\n\r\nextern CLibraryHelper g_LibraryHelper;\r\n"
  },
  {
    "path": "src/codecs/wma/wma.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <base/codec_const.hh>\r\n#include <vfw.h>\r\n#include \"config_dlg.hh\"\r\n#include \"wma_reader.hh\"\r\n\r\ntirc_send_message *g_pSendMessage = NULL;\r\n\r\n// Capability flags.\r\nint g_iCapabilities = IRC_HAS_DECODER | IRC_HAS_ENCODER | IRC_HAS_CONFIG;\r\n\r\n// Version and about strings.\r\nTCHAR *g_szVersion = _T(\"0.53.0.0\");\r\nTCHAR *g_szAbout = _T(\"InfraRecorder WMA Codec\\n\\nCopyright  2006-2012 Christian Kindahl.\");\r\nTCHAR *g_szEncoder = _T(\"Windows Media Audio\");\r\nTCHAR *g_szFileExt = _T(\".wma\");\r\n\r\n// Global variables.\r\nIWMWriter *g_pWMWriter = NULL;\r\nIWMProfile *g_pWMProfile = NULL;\r\nunsigned __int64 g_uiEncodedData = 0;\r\nint g_iBitRate = 0;\r\n\r\nCWMAReader *g_pWMAReader = NULL;\r\n\r\n// Encoder configuration.\r\nCEncoderConfig g_EncoderConfig;\r\n\r\n// Is set to true of we should uninitialize COM when we close.\r\nbool g_bDeInitializeCOM = false;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)\r\n{\r\n    switch (ul_reason_for_call)\r\n    {\r\n        // Initialize COM for the current thread if it hasn't already been initialized.\r\n        case DLL_PROCESS_ATTACH:\r\n        case DLL_THREAD_ATTACH:\r\n            if (CoInitialize(NULL) == S_OK)\r\n                g_bDeInitializeCOM = true;\r\n\r\n            // Tell the library helper to load the WM library.\r\n            g_LibraryHelper.Load(_T(\"wmvcore.dll\"));\r\n            break;\r\n\r\n        case DLL_PROCESS_DETACH:\r\n        case DLL_THREAD_DETACH:\r\n            if (g_bDeInitializeCOM)\r\n                CoUninitialize();\r\n\r\n            // The codec has been detached, unload the libsndfile library.\r\n            g_LibraryHelper.Unload();\r\n            break;\r\n    };\r\n \r\n    return TRUE;\r\n}\r\n\r\nbool LocalSendMessage(int iType,const TCHAR *szMessage)\r\n{\r\n    if (g_pSendMessage == NULL)\r\n        return false;\r\n\r\n    g_pSendMessage(iType,szMessage);\r\n    return true;\r\n}\r\n\r\nHRESULT LoadSystemProfile(unsigned long ulProfileIndex,IWMProfile **ppIWMProfile)\r\n{\r\n    HRESULT hResult = S_OK;\r\n    IWMProfileManager *pIWMProfileManager = NULL;\r\n    IWMProfileManager2 *pIWMProfileManager2 = NULL;\r\n\r\n    if (ppIWMProfile == NULL)\r\n        return E_POINTER;\r\n\r\n    do\r\n    {\r\n        // Create profile manager.\r\n        hResult = g_LibraryHelper.irc_WMCreateProfileManager(&pIWMProfileManager);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        hResult = pIWMProfileManager->QueryInterface(IID_IWMProfileManager2,\r\n            (void **)&pIWMProfileManager2);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        // Set system profile version to 8.0.\r\n        hResult = pIWMProfileManager2->SetSystemProfileVersion(WMT_VER_8_0);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        // Load the system profile by index.\r\n        hResult = pIWMProfileManager->LoadSystemProfile(ulProfileIndex,ppIWMProfile);\r\n        if (FAILED(hResult))\r\n            break;\r\n    }\r\n    while (false);\r\n\r\n    // Release all resources.\r\n    if (pIWMProfileManager2 != NULL)\r\n        pIWMProfileManager2->Release();\r\n\r\n    if (pIWMProfileManager != NULL)\r\n        pIWMProfileManager->Release();\r\n\r\n    return hResult;\r\n}\r\n\r\n/*\r\n    irc_capabilities\r\n    ----------------\r\n    Returns bit information on what operations that are supported by the codec.\r\n*/\r\nint WINAPI irc_capabilities()\r\n{\r\n    return g_iCapabilities;\r\n}\r\n\r\nTCHAR *WINAPI irc_string(unsigned int uiID)\r\n{\r\n    switch (uiID)\r\n    {\r\n        case IRC_STR_VERSION:\r\n            return g_szVersion;\r\n\r\n        case IRC_STR_ABOUT:\r\n            return g_szAbout;\r\n\r\n        case IRC_STR_ENCODER:\r\n            return g_szEncoder;\r\n\r\n        case IRC_STR_FILEEXT:\r\n            return g_szFileExt;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool WINAPI irc_set_callback(tirc_send_message *pSendMessage)\r\n{\r\n    if (pSendMessage == NULL)\r\n        return false;\r\n\r\n    g_pSendMessage = pSendMessage;\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_decode_init(const TCHAR *szFileName,int &iNumChannels,\r\n                            int &iSampleRate,int &iBitRate,unsigned __int64 &uiDuration)\r\n{\r\n    if (g_pWMAReader != NULL)\r\n        return false;\r\n\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    // Create the reader.\r\n    g_pWMAReader = new CWMAReader();\r\n\r\n    if (!g_pWMAReader->Open(szFileName))\r\n    {\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    // Load media information.\r\n    IWMOutputMediaProps *pProps = NULL;\r\n    WM_MEDIA_TYPE *pMediaType = NULL;\r\n\r\n    HRESULT hResult = g_pWMAReader->m_pWMReader->GetOutputProps(0,&pProps);\r\n    if (FAILED(hResult))\r\n    {\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    // Load media type information.\r\n    unsigned long ulType = 0;\r\n    hResult = pProps->GetMediaType(NULL,&ulType);\r\n    if (FAILED(hResult))\r\n    {\r\n        pProps->Release();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    pMediaType = (WM_MEDIA_TYPE *)new unsigned char[ulType];\r\n    if (pMediaType == NULL)\r\n    {\r\n        pProps->Release();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    hResult = pProps->GetMediaType(pMediaType,&ulType);\r\n    if (FAILED(hResult))\r\n    {\r\n        delete [] pMediaType;\r\n\r\n        pProps->Release();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    if (pMediaType->majortype != WMMEDIATYPE_Audio)\r\n    {\r\n        delete [] pMediaType;\r\n\r\n        pProps->Release();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    if (pMediaType->formattype != WMFORMAT_WaveFormatEx)\r\n    {\r\n        delete [] pMediaType;\r\n\r\n        pProps->Release();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    WAVEFORMATEX *pAudioInfo = (WAVEFORMATEX *)pMediaType->pbFormat;\r\n\r\n    iNumChannels = pAudioInfo->nChannels;\r\n    iSampleRate = pAudioInfo->nSamplesPerSec;\r\n    iBitRate = iSampleRate * pAudioInfo->wBitsPerSample;\r\n\r\n    // Clean up.\r\n    delete [] pMediaType;\r\n    pProps->Release();\r\n\r\n    // Load header information.\r\n    IWMHeaderInfo *pHeaderInfo;\r\n    hResult = g_pWMAReader->m_pWMReader->QueryInterface(IID_IWMHeaderInfo,(VOID **)&pHeaderInfo);\r\n    if (FAILED(hResult))\r\n    {\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    unsigned short usStreamNum = 0;\r\n    unsigned short usLength = 0;\r\n    unsigned char *pBuffer = NULL;\r\n    WMT_ATTR_DATATYPE wmtType;\r\n\r\n    // Get value length.\r\n    hResult = pHeaderInfo->GetAttributeByName(&usStreamNum,\r\n        g_wszWMDuration,&wmtType,NULL,&usLength);\r\n    if (FAILED(hResult) && (hResult != ASF_E_NOTFOUND))\r\n    {\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    pBuffer = new unsigned char[usLength];\r\n    if (pBuffer == NULL)\r\n    {\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n\r\n        return false;\r\n    }\r\n\r\n    // Get the actual value.\r\n    hResult = pHeaderInfo->GetAttributeByName(&usStreamNum,\r\n        g_wszWMDuration,&wmtType,pBuffer,&usLength);\r\n\r\n    uiDuration = *(unsigned __int64 *)pBuffer;\r\n    uiDuration /= 10000;\t\t// The duration should be specified in milliseconds.\r\n    delete [] pBuffer;\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_decode_process(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  unsigned __int64 &uiTime)\r\n{\r\n    if (g_pWMAReader == NULL)\r\n        return false;\r\n\r\n    __int64 iProcessed = 0;\r\n    unsigned __int64 uiTempTime = 0;\r\n\r\n    HRESULT hResult = g_pWMAReader->DecodeSamples(pBuffer,iBufferSize,iProcessed,uiTempTime);\r\n    if (FAILED(hResult))\r\n    {\r\n        if (hResult != NS_E_NO_MORE_SAMPLES)\r\n            return -1;\r\n    }\r\n\r\n    // Current time (in milliseconds).\r\n    uiTime = uiTempTime / 10000;\r\n\r\n    return iProcessed;\r\n}\r\n\r\nbool WINAPI irc_decode_exit()\r\n{\r\n    if (g_pWMAReader != NULL)\r\n    {\r\n        HRESULT hResult = g_pWMAReader->Close();\r\n\r\n        delete g_pWMAReader;\r\n        g_pWMAReader = NULL;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_init(const TCHAR *szFileName,int iNumChannels,\r\n                            int iSampleRate,int iBitRate)\r\n{\r\n    if (g_pWMWriter != NULL || g_pWMProfile != NULL)\r\n        return false;\r\n\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    // Currently only one configuration of input data is supported.\r\n    if (iNumChannels != 2 || iSampleRate != 44100 || iBitRate != (iSampleRate << 4))\r\n        return false;\r\n\r\n    // Load profile.\r\n    HRESULT hResult = LoadSystemProfile(g_EncoderConfig.m_iProfile,&g_pWMProfile);\r\n    if (FAILED(hResult))\r\n    {\r\n        LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to load the selected system profile.\"));\r\n        return false;\r\n    }\r\n\r\n    // Create a WMWriter for the output file and set the profile.\r\n    hResult = g_LibraryHelper.irc_WMCreateWriter(NULL,&g_pWMWriter);\r\n    if (FAILED(hResult))\r\n    {\r\n        LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to create WMWriter.\"));\r\n        return false;\r\n    }\r\n\r\n    //  Save profile to writer.\r\n    hResult = g_pWMWriter->SetProfile(g_pWMProfile);\r\n    if (FAILED(hResult))\r\n    {\r\n        LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to set WMWriter profile.\"));\r\n        return false;\r\n    }\r\n\r\n    // Set output file name.\r\n    hResult = g_pWMWriter->SetOutputFilename(szFileName);\r\n    if (FAILED(hResult))\r\n    {\r\n        LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to set WMWrite output file name.\"));\r\n        return false;\r\n    }\r\n\r\n    // Start writing.\r\n    hResult = g_pWMWriter->BeginWriting();\r\n    if (FAILED(hResult))\r\n    {\r\n        if (hResult == NS_E_AUDIO_CODEC_NOT_INSTALLED)\r\n            LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to start the writing process: The required audio codec is not installed.\"));\r\n        else if (hResult == NS_E_INVALID_OUTPUT_FORMAT)\r\n            LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to start the writing process: Invalid output format.\"));\r\n        else if (hResult == NS_E_AUDIO_CODEC_ERROR)\r\n            LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to start the writing process: An unexpected error occurred with the audio codec.\"));\r\n        else\r\n            LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to start the writing process.\"));\r\n\r\n        return false;\r\n    }\r\n\r\n    g_uiEncodedData = 0;\r\n    g_iBitRate = iBitRate;\r\n\r\n    return true;\r\n}\r\n\r\n__int64 WINAPI irc_encode_process(unsigned char *pBuffer,__int64 iDataSize)\r\n{\r\n    if (iDataSize > 0xFFFFFFFF)\r\n        return false;\r\n\r\n    if (g_pWMWriter == NULL || g_pWMProfile == NULL)\r\n        return false;\r\n\r\n    /*HRESULT hResult = WriteSample(pWMWriter,qwSMPTEAvgTimePerFrame,FALSE,dwArbitraryInput, uiRead, ucReadBuffer, iBitRate, iProcessedData );\r\n    if (FAILED(hResult))\r\n        return -1;*/\r\n\r\n    HRESULT\thResult = S_OK;\r\n    INSSBuffer *pSample  = NULL;\r\n    unsigned char *pbBuffer = NULL;\r\n    unsigned long ulBufferSize = 0;\r\n\r\n    hResult = g_pWMWriter->AllocateSample((unsigned long)iDataSize,&pSample);\r\n    if (FAILED(hResult))\r\n    {\r\n        if (pSample != NULL)\r\n            pSample->Release();\r\n\r\n        LocalSendMessage(IRC_MESSAGE_ERROR,_T(\"Failed to allocate memory for output sample.\"));\r\n        return -1;\r\n    }\r\n\r\n    hResult = pSample->GetBufferAndLength(&pbBuffer,&ulBufferSize);\r\n    if (FAILED(hResult))\r\n    {\r\n        if (pSample != NULL)\r\n            pSample->Release();\r\n\r\n        return -1;\r\n    }\r\n\r\n    // This feels stupid. It would be better if I could assign a pointer to the INSSBuffer instead.\r\n    memcpy(pbBuffer,pBuffer,(int)iDataSize);\r\n\r\n    /*hResult = pSample->SetLength((unsigned long)iDataSize);\r\n    if (FAILED(hResult))\r\n    {\r\n        if (pSample != NULL)\r\n            pSample->Release();\r\n\r\n        return -1;\r\n    }*/\r\n\r\n    int iByteRate = g_iBitRate >> 3;\r\n    unsigned __int64 uiTime = ((g_uiEncodedData * 10000000) / iByteRate) >> 1;\r\n\r\n    // Write the sample to the output stream.\r\n    hResult = g_pWMWriter->WriteSample(0,uiTime,0,pSample);\r\n\r\n    if (pSample != NULL)\r\n        pSample->Release();\r\n\r\n    if (FAILED(hResult))\r\n        return -1;\r\n\r\n    g_uiEncodedData += iDataSize;\r\n    return 0;\r\n}\r\n\r\n__int64 WINAPI irc_encode_flush()\r\n{\r\n    HRESULT hResult = g_pWMWriter->Flush();\r\n    if (FAILED(hResult))\r\n        return -1;\r\n\r\n    return 0;\r\n}\r\n\r\nbool WINAPI irc_encode_exit()\r\n{\r\n    // Release the writer resources.\r\n    if (g_pWMWriter != NULL)\r\n    {\r\n        HRESULT hResult = g_pWMWriter->EndWriting();\r\n        if (FAILED(hResult))\r\n            return false;\r\n\r\n        g_pWMWriter->Release();\r\n        g_pWMWriter = NULL;\r\n    }\r\n\r\n    // Release the profile resources.\r\n    if (g_pWMProfile != NULL)\r\n    {\r\n        g_pWMProfile->Release();\r\n        g_pWMProfile = NULL;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nbool WINAPI irc_encode_config()\r\n{\r\n    if (!g_LibraryHelper.IsLoaded())\r\n        return false;\r\n\r\n    CConfigDlg ConfigDlg(&g_EncoderConfig);\r\n    ConfigDlg.DoModal();\r\n\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/wma.def",
    "content": "LIBRARY\t\"wma.irc\"\r\nEXPORTS\r\n\tirc_capabilities\r\n\tirc_string\r\n\tirc_set_callback\r\n\tirc_decode_init\r\n\tirc_decode_process\r\n\tirc_decode_exit\r\n\tirc_encode_init\r\n\tirc_encode_process\r\n\tirc_encode_flush\r\n\tirc_encode_exit\r\n\tirc_encode_config\r\n"
  },
  {
    "path": "src/codecs/wma/wma.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"afxres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"afxres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_PROPPAGE_CONFIGGENERAL DIALOGEX 0, 0, 214, 121\r\nSTYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r\nCAPTION \"General\"\r\nFONT 8, \"MS Shell Dlg\", 0, 0, 0x0\r\nBEGIN\r\n    LTEXT           \"Profile:\",IDC_PROFILESTATIC,7,7,24,8\r\n    LISTBOX         IDC_PROFILELIST,7,18,200,96,LBS_NOINTEGRALHEIGHT | \r\n                    LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO \r\nBEGIN\r\n    IDD_PROPPAGE_CONFIGGENERAL, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 207\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 114\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/codecs/wma/wma_reader.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"wma_reader.hh\"\r\n\r\nCWMAReader::CWMAReader()\r\n{\r\n    m_pWMReader = NULL;\r\n    m_pStream = NULL;\r\n\r\n    m_pSample = NULL;\r\n    m_pSampleBuffer = NULL;\r\n    m_ulSampleBufferSize = 0;\r\n    m_ulSampleBufferPos = 0;\r\n\r\n    m_uiCurrentTime = 0;\r\n}\r\n\r\nCWMAReader::~CWMAReader()\r\n{\r\n    if (m_pSample != NULL)\r\n    {\r\n        m_pSample->Release();\r\n        m_pSample = NULL;\r\n    }\r\n\r\n    if (m_pWMReader != NULL)\r\n    {\r\n        m_pWMReader->Release();\r\n        m_pWMReader = NULL;\r\n    }\r\n\r\n    if (m_pStream != NULL)\r\n    {\r\n        delete m_pStream;\r\n        m_pStream = NULL;\r\n    }\r\n}\r\n\r\nHRESULT CWMAReader::GetStreamNumber(IWMProfile *pProfile,unsigned short &usStreamNumber)\r\n{\r\n    HRESULT hResult = S_OK;\r\n    IWMStreamConfig *pStream = NULL;\r\n    unsigned long ulStreamCount = 0;\r\n    GUID pguidStreamType;\r\n\r\n    if (pProfile == NULL)\r\n        return E_INVALIDARG;\r\n\r\n    hResult = pProfile->GetStreamCount(&ulStreamCount);\r\n    if (FAILED(hResult))\r\n        return hResult;\r\n\r\n    usStreamNumber = 0;\r\n\r\n    // Make sure that the file only contains audio streams.\r\n    for (unsigned long i = 0; i < ulStreamCount; i++)\r\n    {\r\n        hResult = pProfile->GetStream(i,&pStream);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        unsigned short usLocalStreamNumber = 0;\r\n\r\n        // Get the stream number of the current stream.\r\n        hResult = pStream->GetStreamNumber(&usLocalStreamNumber);\r\n        if (FAILED(hResult))\r\n            break;\r\n\r\n        hResult = pStream->GetStreamType(&pguidStreamType);\r\n        if (FAILED(hResult))\r\n            break ;\r\n        \r\n        if (pguidStreamType == WMMEDIATYPE_Audio)\r\n            usStreamNumber = usLocalStreamNumber;\r\n\r\n        if (pStream != NULL)\r\n        {\r\n            pStream->Release();\r\n            pStream = NULL;\r\n        }\r\n    }\r\n\r\n    return hResult;\r\n}\r\n\r\nbool CWMAReader::Open(const TCHAR *szFileName)\r\n{\r\n    if (szFileName == NULL)\r\n        return false;\r\n\r\n    HRESULT hResult = S_OK;\r\n\r\n    // Create reader.\r\n    if (m_pWMReader == NULL)\r\n    {\r\n        hResult = g_LibraryHelper.irc_WMCreateSyncReader(NULL,0,&m_pWMReader);\r\n        if (FAILED(hResult))\r\n            return false;\r\n    }\r\n\r\n    // Open file stream.\r\n    if (m_pStream == NULL)\r\n    {\r\n        m_pStream = new CReadStream();\r\n        if (m_pStream == NULL)\r\n            return false;\r\n    }\r\n\r\n    hResult = m_pStream->Open(szFileName);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    hResult = m_pWMReader->OpenStream(m_pStream);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    // Get profile interface.\r\n    IWMProfile *pProfile = NULL;\r\n    \r\n    hResult = m_pWMReader->QueryInterface(IID_IWMProfile,(void **)&pProfile);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    //return false;\r\n\r\n    // Find out the audio stream number.\r\n    unsigned short usStreamNumber = 0;\r\n    hResult = GetStreamNumber(pProfile,usStreamNumber);\r\n\r\n    if (pProfile != NULL)\r\n        pProfile->Release();\r\n\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    if (usStreamNumber != 0)\r\n    {\r\n        WMT_STREAM_SELECTION wmtSS = WMT_ON;\r\n        hResult = m_pWMReader->SetStreamsSelected(1,&usStreamNumber,&wmtSS);\r\n        if (FAILED(hResult))\r\n            return false;\r\n\r\n        hResult = m_pWMReader->SetReadStreamSamples(usStreamNumber,FALSE);\r\n        if (FAILED(hResult))\r\n            return false;\r\n    }\r\n\r\n    // Set duration.\r\n    hResult = m_pWMReader->SetRange(0,0);\r\n    if (FAILED(hResult))\r\n        return false;\r\n\r\n    m_uiCurrentTime = 0;\r\n    return true;\r\n}\r\n\r\nbool CWMAReader::Close()\r\n{\r\n    if (m_pWMReader != NULL)\r\n    {\r\n        HRESULT hResult = m_pWMReader->Close();\r\n        if (FAILED(hResult))\r\n            return false;\r\n\r\n        m_pWMReader->Release();\r\n        m_pWMReader = NULL;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\nHRESULT CWMAReader::DecodeSamples(unsigned char *pBuffer,__int64 iBufferSize,\r\n                                  __int64 &iProcessed,unsigned __int64 &uiTime)\r\n{\r\n    iProcessed = 0;\r\n\r\n    // If there are any data left in the internal buffer, copy it directly to the\r\n    // specified buffer.\r\n    if (m_ulSampleBufferSize > m_ulSampleBufferPos)\r\n    {\r\n        unsigned long ulInBuffer = m_ulSampleBufferSize - m_ulSampleBufferPos;\r\n\r\n        if (ulInBuffer > iBufferSize)\r\n        {\r\n            memcpy(pBuffer,m_pSampleBuffer + m_ulSampleBufferPos,(int)iBufferSize);\r\n            m_ulSampleBufferPos += (unsigned long)iBufferSize;\r\n\r\n            iProcessed = iBufferSize;\r\n        }\r\n        else\r\n        {\r\n            memcpy(pBuffer,m_pSampleBuffer + m_ulSampleBufferPos,ulInBuffer);\r\n\r\n            m_ulSampleBufferSize = 0;\r\n            m_ulSampleBufferPos = 0;\r\n            m_pSample->Release();\r\n            m_pSample = NULL;\r\n\r\n            iProcessed = ulInBuffer;\r\n        }\r\n\r\n        uiTime = m_uiCurrentTime;\r\n        return S_OK;\r\n    }\r\n\r\n    // Now when the internal buffer is empty, read more samples to the\r\n    // internal buffer.\r\n    HRESULT hResult = S_OK;\r\n\r\n    unsigned short usStreamNum = 0;\r\n    unsigned __int64 uiSampleTime = 0;\r\n    unsigned __int64 uiDuration = 0;\r\n    unsigned long ulFlags = 0;\r\n    unsigned long ulOutputNum = 0;\r\n\r\n    hResult = m_pWMReader->GetNextSample(0,&m_pSample,&uiSampleTime,&uiDuration,\r\n        &ulFlags,&ulOutputNum,&usStreamNum);\r\n    if (FAILED(hResult))\r\n        return hResult;\r\n\r\n    // Buffer management.\r\n    hResult = m_pSample->GetBufferAndLength(&m_pSampleBuffer,&m_ulSampleBufferSize);\r\n    if (FAILED(hResult))\r\n        return hResult;\r\n\r\n    if (m_ulSampleBufferSize > iBufferSize)\r\n    {\r\n        memcpy(pBuffer,m_pSampleBuffer,(int)iBufferSize);\r\n\r\n        m_ulSampleBufferPos += (unsigned long)iBufferSize;\r\n        iProcessed = iBufferSize;\r\n    }\r\n    else\r\n    {\r\n        memcpy(pBuffer,m_pSampleBuffer,m_ulSampleBufferSize);\r\n        iProcessed = m_ulSampleBufferSize;\r\n\r\n        m_ulSampleBufferSize = 0;\r\n\r\n        m_pSample->Release();\r\n        m_pSample = NULL;\r\n    }\r\n\r\n    // Update the internal time variable.\r\n    m_uiCurrentTime = uiSampleTime;\r\n    uiTime = m_uiCurrentTime;\r\n\r\n    return hResult;\r\n}\r\n"
  },
  {
    "path": "src/codecs/wma/wma_reader.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <wmsdk.h>\r\n#include \"read_stream.hh\"\r\n\r\nclass CWMAReader\r\n{\r\nprivate:\r\n    CReadStream *m_pStream;\r\n\r\n    INSSBuffer *m_pSample;\r\n    unsigned char *m_pSampleBuffer;\r\n    unsigned long m_ulSampleBufferSize;\r\n    unsigned long m_ulSampleBufferPos;\r\n\r\n    unsigned __int64 m_uiCurrentTime;\r\n\r\n    HRESULT GetStreamNumber(IWMProfile *pProfile,unsigned short &usStreamNumber);\r\n\r\npublic:\r\n    IWMSyncReader *m_pWMReader;\r\n\r\n    CWMAReader();\r\n    ~CWMAReader();\r\n\r\n    bool Open(const TCHAR *szFileName);\r\n    bool Close();\r\n\r\n    HRESULT DecodeSamples(unsigned char *pBuffer,__int64 iBufferSize,\r\n        __int64 &iProcessed,unsigned __int64 &uiTime);\r\n};\r\n"
  },
  {
    "path": "src/codecs/wma/wma_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"wma\"\r\n\tProjectGUID=\"{DA677405-57CD-4E24-AC27-4250A4BF0D1C}\"\r\n\tRootNamespace=\"wma\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"wma.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/wma.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"wma.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/wma.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"wma.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\\codecs\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).irc\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"wma.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tCommandLine=\"copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\releasep\\codecs\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\library_helper.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\read_stream.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wma.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wma.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wma_reader.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_dlg.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\config_general_page.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\library_helper.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\read_stream.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wma_reader.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\wma.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/codecs/wma/wma_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>wma</ProjectName>\n    <ProjectGuid>{DA677405-57CD-4E24-AC27-4250A4BF0D1C}</ProjectGuid>\n    <RootNamespace>wma</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\codecs\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">.irc</TargetExt>\n    <TargetExt Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">.irc</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <ModuleDefinitionFile>wma.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)wma.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <ModuleDefinitionFile>wma.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)wma.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <ModuleDefinitionFile>wma.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WMA_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <ModuleDefinitionFile>wma.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(TargetPath) $(ProjectDir)..\\..\\..\\bin\\$(Platform)\\releasep\\codecs</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"library_helper.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"read_stream.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"wma.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"wma_reader.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"wma.def\" />\n    <None Include=\"config_dlg.hh\" />\n    <None Include=\"config_general_page.hh\" />\n    <None Include=\"library_helper.hh\" />\n    <None Include=\"read_stream.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"wma_reader.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"wma.rc\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/codecs/wma/wma_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"config_dlg.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"config_general_page.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"library_helper.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"read_stream.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"wma.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"wma_reader.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"wma.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"config_dlg.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"config_general_page.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"library_helper.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"read_stream.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"wma_reader.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"wma.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/infrarecorder_vc08.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"infrarecorder\", \"app\\infrarecorder_vc08.vcproj\", \"{949B73FF-BD75-47C0-B965-328513C481B4}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"shell\", \"shell\\shell_vc08.vcproj\", \"{A6B8E42F-4793-4995-9D63-2906375407AD}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"base\", \"base\\base_vc08.vcproj\", \"{81EA1BB3-2BA0-4600-9081-2D2CB9203466}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"codectester\", \"tools\\codectester\\codectester_vc08.vcproj\", \"{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tools\", \"tools\", \"{2C836544-04C4-4839-AAF0-CE9526E167F6}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"main\", \"main\", \"{8D08569A-D3CE-4690-A244-AA1704ED3147}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"translationtool\", \"tools\\translationtool\\translationtool_vc08.vcproj\", \"{890C6C24-55F8-466B-91BE-221F6214C3B8}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"lame\", \"codecs\\lame\\lame_vc08.vcproj\", \"{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1} = {4B152319-0AF6-4E1B-A284-805D6483C5F1}\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4} = {0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"codecs\", \"codecs\", \"{B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libmp3lame_vc8\", \"..\\dep\\lame\\libmp3lame\\libmp3lame_vc8.vcproj\", \"{4B152319-0AF6-4E1B-A284-805D6483C5F1}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"dependencies\", \"dependencies\", \"{342929BB-3FEE-47E9-A6ED-C391DE6A018D}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"mpglib_vc8\", \"..\\dep\\lame\\mpglib\\mpglib_vc8.vcproj\", \"{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"sndfile\", \"codecs\\sndfile\\sndfile_vc08.vcproj\", \"{533889C9-1598-4823-BFA9-7C97FD35D6DF}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"wave\", \"codecs\\wave\\wave_vc08.vcproj\", \"{1A7358F8-3F30-4079-8BAB-9399B76B5187}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"wma\", \"codecs\\wma\\wma_vc08.vcproj\", \"{DA677405-57CD-4E24-AC27-4250A4BF0D1C}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"vorbis\", \"codecs\\vorbis\\vorbis_vc08.vcproj\", \"{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD} = {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} = {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159} = {15CBFEFF-7965-41F5-B4E2-21E8795C9159}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libogg_static\", \"..\\dep\\libogg\\win32\\VS2005\\libogg_static.vcproj\", \"{15CBFEFF-7965-41F5-B4E2-21E8795C9159}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libvorbis_static\", \"..\\dep\\libvorbis\\win32\\VS2005\\libvorbis\\libvorbis_static.vcproj\", \"{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libvorbisfile\", \"..\\dep\\libvorbis\\win32\\VS2005\\libvorbisfile\\libvorbisfile_static.vcproj\", \"{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"setup\", \"setup\", \"{4A43E150-27F3-4779-B894-9D5471CB90F9}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ir_plugin\", \"setup\\ir_plugin\\ir_plugin_vc08.vcproj\", \"{BC845F0A-9F4D-4A2F-8366-30B816498DBD}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"setup_nsis\", \"setup\\setup_nsis_vc08.vcproj\", \"{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C} = {DA677405-57CD-4E24-AC27-4250A4BF0D1C}\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD} = {BC845F0A-9F4D-4A2F-8366-30B816498DBD}\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED} = {571D4215-38A0-42CE-8AB7-DEEE9D2154ED}\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD} = {A6B8E42F-4793-4995-9D63-2906375407AD}\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C} = {44E47ABA-9695-4A96-BC52-53585C6AAA3C}\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF} = {533889C9-1598-4823-BFA9-7C97FD35D6DF}\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4} = {949B73FF-BD75-47C0-B965-328513C481B4}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"setup_wix\", \"setup\\setup_wix_vc08.vcproj\", \"{295627F8-6235-4E9D-992F-F200A7F40173}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4} = {949B73FF-BD75-47C0-B965-328513C481B4}\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187} = {1A7358F8-3F30-4079-8BAB-9399B76B5187}\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C} = {44E47ABA-9695-4A96-BC52-53585C6AAA3C}\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD} = {A6B8E42F-4793-4995-9D63-2906375407AD}\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C} = {DA677405-57CD-4E24-AC27-4250A4BF0D1C}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"help\", \"help\", \"{176EBD88-B63B-466F-BB4F-3C331C89BF24}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"help_english\", \"..\\doc\\english\\help_english_vc08.vcproj\", \"{44E47ABA-9695-4A96-BC52-53585C6AAA3C}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{5B05DB5E-5941-4418-A8D1-37101F2A8E07}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"tests\", \"tests\\tests_vc08.vcproj\", \"{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {81EA1BB3-2BA0-4600-9081-2D2CB9203466}\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\t\tReleaseP|Win32 = ReleaseP|Win32\r\n\t\tReleaseP|x64 = ReleaseP|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|x64.Build.0 = Release|x64\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|Win32.ActiveCfg = ReleaseP|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|Win32.Build.0 = ReleaseP|Win32\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|x64.ActiveCfg = ReleaseP|x64\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|x64.Build.0 = ReleaseP|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|x64.Build.0 = Release|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|Win32.ActiveCfg = ReleaseP|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|Win32.Build.0 = ReleaseP|Win32\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|x64.ActiveCfg = ReleaseP|x64\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|x64.Build.0 = ReleaseP|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|x64.Build.0 = Release|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|x64.Build.0 = Release|x64\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|x64.Build.0 = Release|x64\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|x64.Build.0 = Release|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.Release|x64.Build.0 = Release|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.Release|x64.Build.0 = Release|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|x64.Build.0 = Release|x64\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|x64.Build.0 = Release|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|x64.Build.0 = Release|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|x64.Build.0 = Release|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.Build.0 = Release|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|x64.Build.0 = Release|x64\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.ReleaseP|x64.ActiveCfg = Release|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.ReleaseP|x64.ActiveCfg = Release|Win32\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|x64.Build.0 = Release|x64\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|x64.Build.0 = Debug|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|x64.Build.0 = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|Win32.ActiveCfg = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|Win32.Build.0 = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|x64.ActiveCfg = Release|Win32\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|x64.Build.0 = Release|Win32\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|x64.Build.0 = Release|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|Win32.ActiveCfg = Release|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|x64.ActiveCfg = Release|x64\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(NestedProjects) = preSolution\r\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\r\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\r\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\r\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD} = {2C836544-04C4-4839-AAF0-CE9526E167F6}\r\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8} = {2C836544-04C4-4839-AAF0-CE9526E167F6}\r\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\r\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\r\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\r\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\r\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\r\n\t\t{4B152319-0AF6-4E1B-A284-805D6483C5F1} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\r\n\t\t{0AB48E5D-FAA5-402B-84D6-2F5166D90DD4} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\r\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\r\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\r\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\r\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\r\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\r\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\r\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C} = {176EBD88-B63B-466F-BB4F-3C331C89BF24}\r\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160} = {5B05DB5E-5941-4418-A8D1-37101F2A8E07}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "src/infrarecorder_vc10.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tools\", \"tools\", \"{2C836544-04C4-4839-AAF0-CE9526E167F6}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"main\", \"main\", \"{8D08569A-D3CE-4690-A244-AA1704ED3147}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"codecs\", \"codecs\", \"{B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"dependencies\", \"dependencies\", \"{342929BB-3FEE-47E9-A6ED-C391DE6A018D}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"setup\", \"setup\", \"{4A43E150-27F3-4779-B894-9D5471CB90F9}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"help\", \"help\", \"{176EBD88-B63B-466F-BB4F-3C331C89BF24}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{5B05DB5E-5941-4418-A8D1-37101F2A8E07}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"infrarecorder\", \"app\\infrarecorder_vc10.vcxproj\", \"{949B73FF-BD75-47C0-B965-328513C481B4}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"shell\", \"shell\\shell_vc10.vcxproj\", \"{A6B8E42F-4793-4995-9D63-2906375407AD}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"base\", \"base\\base_vc10.vcxproj\", \"{81EA1BB3-2BA0-4600-9081-2D2CB9203466}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"codectester\", \"tools\\codectester\\codectester_vc10.vcxproj\", \"{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"translationtool\", \"tools\\translationtool\\translationtool_vc10.vcxproj\", \"{890C6C24-55F8-466B-91BE-221F6214C3B8}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"lame\", \"codecs\\lame\\lame_vc10.vcxproj\", \"{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libmp3lame-static\", \"..\\dep\\lame\\vc_solution\\vc9_libmp3lame.vcxproj\", \"{20536101-3B0E-43EF-94F9-080D595DAC57}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libmpghip-static\", \"..\\dep\\lame\\vc_solution\\vc9_mpglib.vcxproj\", \"{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"sndfile\", \"codecs\\sndfile\\sndfile_vc10.vcxproj\", \"{533889C9-1598-4823-BFA9-7C97FD35D6DF}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"wave\", \"codecs\\wave\\wave_vc10.vcxproj\", \"{1A7358F8-3F30-4079-8BAB-9399B76B5187}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"wma\", \"codecs\\wma\\wma_vc10.vcxproj\", \"{DA677405-57CD-4E24-AC27-4250A4BF0D1C}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"vorbis\", \"codecs\\vorbis\\vorbis_vc10.vcxproj\", \"{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libogg_static\", \"..\\dep\\libogg\\win32\\VS2010\\libogg_static.vcxproj\", \"{15CBFEFF-7965-41F5-B4E2-21E8795C9159}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libvorbis_static\", \"..\\dep\\libvorbis\\win32\\VS2010\\libvorbis\\libvorbis_static.vcxproj\", \"{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libvorbisfile\", \"..\\dep\\libvorbis\\win32\\VS2010\\libvorbisfile\\libvorbisfile_static.vcxproj\", \"{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ir_plugin\", \"setup\\ir_plugin\\ir_plugin_vc10.vcxproj\", \"{BC845F0A-9F4D-4A2F-8366-30B816498DBD}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"setup_nsis\", \"setup\\setup_nsis_vc10.vcxproj\", \"{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"setup_wix\", \"setup\\setup_wix_vc10.vcxproj\", \"{295627F8-6235-4E9D-992F-F200A7F40173}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"help_english\", \"..\\doc\\english\\help_english_vc10.vcxproj\", \"{44E47ABA-9695-4A96-BC52-53585C6AAA3C}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"tests\", \"tests\\tests_vc10.vcxproj\", \"{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\t\tReleaseP|Win32 = ReleaseP|Win32\n\t\tReleaseP|x64 = ReleaseP|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Debug|x64.Build.0 = Debug|x64\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|Win32.Build.0 = Release|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|x64.ActiveCfg = Release|x64\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.Release|x64.Build.0 = Release|x64\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|Win32.ActiveCfg = ReleaseP|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|Win32.Build.0 = ReleaseP|Win32\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|x64.ActiveCfg = ReleaseP|x64\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4}.ReleaseP|x64.Build.0 = ReleaseP|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Debug|x64.Build.0 = Debug|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|Win32.Build.0 = Release|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|x64.ActiveCfg = Release|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.Release|x64.Build.0 = Release|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|Win32.ActiveCfg = ReleaseP|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|Win32.Build.0 = ReleaseP|Win32\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|x64.ActiveCfg = ReleaseP|x64\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD}.ReleaseP|x64.Build.0 = ReleaseP|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Debug|x64.Build.0 = Debug|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|Win32.Build.0 = Release|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|x64.ActiveCfg = Release|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.Release|x64.Build.0 = Release|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Debug|x64.Build.0 = Debug|x64\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|Win32.Build.0 = Release|Win32\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|x64.ActiveCfg = Release|x64\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.Release|x64.Build.0 = Release|x64\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Debug|x64.Build.0 = Debug|x64\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|Win32.Build.0 = Release|Win32\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|x64.ActiveCfg = Release|x64\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.Release|x64.Build.0 = Release|x64\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Debug|x64.Build.0 = Debug|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|Win32.Build.0 = Release|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|x64.ActiveCfg = Release|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.Release|x64.Build.0 = Release|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Debug|x64.Build.0 = Debug|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Release|Win32.Build.0 = Release|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Release|x64.ActiveCfg = Release|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.Release|x64.Build.0 = Release|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Debug|x64.Build.0 = Debug|x64\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|Win32.Build.0 = Release|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|x64.ActiveCfg = Release|x64\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.Release|x64.Build.0 = Release|x64\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8}.ReleaseP|x64.ActiveCfg = Release|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Debug|x64.Build.0 = Debug|x64\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|Win32.Build.0 = Release|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|x64.ActiveCfg = Release|x64\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.Release|x64.Build.0 = Release|x64\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Debug|x64.Build.0 = Debug|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|Win32.Build.0 = Release|Win32\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|x64.ActiveCfg = Release|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.Release|x64.Build.0 = Release|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Debug|x64.Build.0 = Debug|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|Win32.Build.0 = Release|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|x64.ActiveCfg = Release|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.Release|x64.Build.0 = Release|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Debug|x64.Build.0 = Debug|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|Win32.Build.0 = Release|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|x64.ActiveCfg = Release|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.Release|x64.Build.0 = Release|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.Build.0 = Debug|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.Build.0 = Release|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.ActiveCfg = Release|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.Build.0 = Release|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.ReleaseP|x64.Build.0 = Release|x64\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Debug|x64.ActiveCfg = Debug|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|Win32.Build.0 = Release|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.Release|x64.ActiveCfg = Release|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD}.ReleaseP|x64.ActiveCfg = Release|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Debug|x64.ActiveCfg = Debug|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|Win32.Build.0 = Release|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.Release|x64.ActiveCfg = Release|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}.ReleaseP|x64.ActiveCfg = Release|Win32\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|x64.ActiveCfg = Release|x64\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.Release|x64.Build.0 = Release|x64\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|x64.ActiveCfg = Debug|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Debug|x64.Build.0 = Debug|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|Win32.Build.0 = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|x64.ActiveCfg = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.Release|x64.Build.0 = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|Win32.ActiveCfg = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|Win32.Build.0 = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|x64.ActiveCfg = Release|Win32\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C}.ReleaseP|x64.Build.0 = Release|Win32\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Debug|x64.Build.0 = Debug|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|Win32.Build.0 = Release|Win32\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|x64.ActiveCfg = Release|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.Release|x64.Build.0 = Release|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|Win32.ActiveCfg = Release|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|x64.ActiveCfg = Release|x64\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}.ReleaseP|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{662C79E3-70D3-4F83-BAAF-EC663B93BAFD} = {2C836544-04C4-4839-AAF0-CE9526E167F6}\n\t\t{890C6C24-55F8-466B-91BE-221F6214C3B8} = {2C836544-04C4-4839-AAF0-CE9526E167F6}\n\t\t{949B73FF-BD75-47C0-B965-328513C481B4} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\n\t\t{A6B8E42F-4793-4995-9D63-2906375407AD} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\n\t\t{81EA1BB3-2BA0-4600-9081-2D2CB9203466} = {8D08569A-D3CE-4690-A244-AA1704ED3147}\n\t\t{E595EE31-3670-4F99-AAC0-C06B2B5D02E9} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\n\t\t{533889C9-1598-4823-BFA9-7C97FD35D6DF} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\n\t\t{1A7358F8-3F30-4079-8BAB-9399B76B5187} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\n\t\t{DA677405-57CD-4E24-AC27-4250A4BF0D1C} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\n\t\t{571D4215-38A0-42CE-8AB7-DEEE9D2154ED} = {B13D61CA-7A76-4A61-A488-2F8D06DAF06C}\n\t\t{20536101-3B0E-43EF-94F9-080D595DAC57} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\n\t\t{E2DAB91A-8248-4625-8A85-2C2C2A390DD8} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\n\t\t{15CBFEFF-7965-41F5-B4E2-21E8795C9159} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\n\t\t{3A214E06-B95E-4D61-A291-1F8DF2EC10FD} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\n\t\t{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} = {342929BB-3FEE-47E9-A6ED-C391DE6A018D}\n\t\t{BC845F0A-9F4D-4A2F-8366-30B816498DBD} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\n\t\t{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\n\t\t{295627F8-6235-4E9D-992F-F200A7F40173} = {4A43E150-27F3-4779-B894-9D5471CB90F9}\n\t\t{44E47ABA-9695-4A96-BC52-53585C6AAA3C} = {176EBD88-B63B-466F-BB4F-3C331C89BF24}\n\t\t{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160} = {5B05DB5E-5941-4418-A8D1-37101F2A8E07}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/setup/ir_plugin/ir_plugin.cc",
    "content": "/*\r\n * Copyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include <base/string_util.hh>\r\n#include \"settings.hh\"\r\n\r\ntypedef struct _stack_t\r\n{\r\n    struct _stack_t *pNext;\r\n    char szText[1];\t\t\t\t// This should be the length of iStringSize.\r\n} stack_t;\r\n\r\nBOOL APIENTRY DllMain(HANDLE hModule, \r\n                      DWORD  ul_reason_for_call, \r\n                      LPVOID lpReserved)\r\n{\r\n    return TRUE;\r\n}\r\n\r\nbool GetConfigPath(TCHAR *szConfigPath)\r\n{\r\n    if (!SUCCEEDED(SHGetFolderPath(HWND_DESKTOP,CSIDL_APPDATA | CSIDL_FLAG_CREATE,NULL,\r\n        SHGFP_TYPE_CURRENT,szConfigPath)))\r\n        return false;\r\n\r\n    IncludeTrailingBackslash(szConfigPath);\r\n    lstrcat(szConfigPath,_T(\"InfraRecorder\\\\\"));\r\n\r\n    // Create the file path if it doesn't exist.\r\n    ckcore::Directory::create(szConfigPath);\r\n\r\n    lstrcat(szConfigPath,_T(\"settings.xml\"));\r\n    return true;\r\n}\r\n\r\nvoid __declspec(dllexport) CreateConfig(HWND hWndParent,int iStringSize,\r\n                                        char *szVariables,stack_t **ppStackTop)\r\n{\r\n    // The config file name is on the top of the stack.\r\n    TCHAR szConfigFileName[MAX_PATH];\r\n    stack_t *pStackEntry = *ppStackTop;\r\n\r\n    // UPDATE: The first is now ignored since the configuration file is\r\n    // stored in a common place.\r\n    GetConfigPath(szConfigFileName);\r\n\r\n    pStackEntry = pStackEntry->pNext;\r\n    AnsiToUnicode(g_LanguageSettings.m_szLanguageFile,pStackEntry->szText,MAX_PATH);\r\n\r\n    // Only create new config file if one does not already exist.\r\n    if (!ckcore::File::exist(szConfigFileName))\r\n    {\r\n        // Save the config file.\r\n        CXmlProcessor Xml;\r\n\r\n        Xml.AddElement(_T(\"InfraRecorder\"),_T(\"\"),true);\r\n            Xml.AddElement(_T(\"Settings\"),_T(\"\"),true);\r\n                g_LanguageSettings.Save(&Xml);\r\n            Xml.LeaveElement();\r\n        Xml.LeaveElement();\r\n\r\n        Xml.Save(szConfigFileName);\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/setup/ir_plugin/ir_plugin.def",
    "content": "LIBRARY\tir_plugin\r\nEXPORTS\r\n\tCreateConfig\r\n"
  },
  {
    "path": "src/setup/ir_plugin/ir_plugin_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"ir_plugin\"\r\n\tProjectGUID=\"{BC845F0A-9F4D-4A2F-8366-30B816498DBD}\"\r\n\tRootNamespace=\"ir_plugin\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;IRINSTALLPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\"ir_plugin.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/ir_plugin.pdb\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/ir_plugin.lib\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;IRINSTALLPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\"ir_plugin.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/ir_plugin.lib\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\ir_plugin.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\ir_plugin.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/setup/ir_plugin/ir_plugin_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>ir_plugin</ProjectName>\n    <ProjectGuid>{BC845F0A-9F4D-4A2F-8366-30B816498DBD}</ProjectGuid>\n    <RootNamespace>ir_plugin</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;IRINSTALLPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>ir_plugin.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ProgramDatabaseFile>$(OutDir)ir_plugin.pdb</ProgramDatabaseFile>\n      <SubSystem>Windows</SubSystem>\n      <ImportLibrary>$(OutDir)ir_plugin.lib</ImportLibrary>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;IRINSTALLPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>ir_plugin.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <ImportLibrary>$(OutDir)ir_plugin.lib</ImportLibrary>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"ir_plugin.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"ir_plugin.def\" />\n    <None Include=\"settings.hh\" />\n    <None Include=\"stdafx.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/setup/ir_plugin/ir_plugin_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"ir_plugin.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"ir_plugin.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"settings.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/setup/ir_plugin/settings.cc",
    "content": "/*\r\n * Copyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"settings.hh\"\r\n\r\nCLanguageSettings g_LanguageSettings;\r\n\r\nbool CLanguageSettings::Save(CXmlProcessor *pXML)\r\n{\r\n    if (pXML == NULL)\r\n        return false;\r\n\r\n    pXML->AddElement(_T(\"Language\"),_T(\"\"),true);\r\n        pXML->AddElement(_T(\"LanguageFile\"),m_szLanguageFile);\r\n    pXML->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nbool CLanguageSettings::Load(CXmlProcessor *pXML)\r\n{\r\n    if (pXML == NULL)\r\n        return false;\r\n\r\n    if (!pXML->EnterElement(_T(\"Language\")))\r\n        return false;\r\n\r\n    pXML->GetSafeElementData(_T(\"LanguageFile\"),m_szLanguageFile,MAX_PATH - 1);\r\n\r\n    if (ckcore::File::exist(m_szLanguageFile))\r\n    {\r\n        m_pLngProcessor = new CLngProcessor(m_szLanguageFile);\r\n        m_pLngProcessor->Load();\r\n    }\r\n\r\n    pXML->LeaveElement();\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/setup/ir_plugin/settings.hh",
    "content": "/*\r\n * Copyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n#pragma once\r\n#include <list>\r\n#include <base/string_util.hh>\r\n#include <base/xml_processor.hh>\r\n#include <base/lng_processor.hh>\r\n\r\nclass ISettings\r\n{\r\npublic:\r\n    virtual bool Save(CXmlProcessor *pXML) = 0;\r\n    virtual bool Load(CXmlProcessor *pXML) = 0;\r\n};\r\n\r\nclass CLanguageSettings : public ISettings\r\n{\r\npublic:\r\n    TCHAR m_szLanguageFile[MAX_PATH];\r\n    CLngProcessor *m_pLngProcessor;\r\n\r\n    CLanguageSettings()\r\n    {\r\n        m_szLanguageFile[0] = '\\0';\r\n        m_pLngProcessor = NULL;\r\n    }\r\n\r\n    ~CLanguageSettings()\r\n    {\r\n        if (m_pLngProcessor != NULL)\r\n        {\r\n            delete m_pLngProcessor;\r\n            m_pLngProcessor = NULL;\r\n        }\r\n    }\r\n\r\n    bool Save(CXmlProcessor *pXML);\r\n    bool Load(CXmlProcessor *pXML);\r\n};\r\n\r\nextern CLanguageSettings g_LanguageSettings;\r\n"
  },
  {
    "path": "src/setup/ir_plugin/stdafx.cc",
    "content": "/*\r\n * Copyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/setup/ir_plugin/stdafx.hh",
    "content": "/*\r\n * Copyright (C) 2006-2012 Christian Kindahl, christian dot kindahl at gmail dot com\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 2 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program; if not, write to the Free Software\r\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n */\r\n\r\n#pragma once\r\n\r\n#define WIN32_LEAN_AND_MEAN\t\t// Exclude rarely-used stuff from Windows headers\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n#include <shlobj.h>\r\n\r\n#ifndef _T\r\n#define _T TEXT\r\n#endif\r\n"
  },
  {
    "path": "src/setup/setup_nsis.nsi",
    "content": "; Infra Recorder Installation Script\r\n;  written by Christian Kindahl\r\n;\r\n;--------------------------------\r\n; Include Modern UI\r\n\r\n  !include \"MUI.nsh\"\r\n  !include \"LogicLib.nsh\"\r\n  !include \"FileFunc.nsh\"\r\n\r\n;--------------------------------\r\n; Definitions\r\n\r\n  !define MUI_COMPONENTSPAGE_SMALLDESC\r\n  ;!define MUI_HEADERIMAGE\r\n  ;!define MUI_HEADERIMAGE_BITMAP \"resources\\header-logo.bmp\"\r\n  ;!define MUI_HEADERIMAGE_RIGHT\r\n  !define MUI_ABORTWARNING\r\n\r\n;--------------------------------\r\n; Plugins\r\n\r\n  !addplugindir ir_plugin\\win32\\release\\\r\n\r\n;--------------------------------\r\n; StrStr function.\r\nFunction StrStr \r\n  ; Get input from user\r\n  Exch $R0\r\n  Exch\r\n  Exch $R1\r\n  Push $R2\r\n  Push $R3\r\n  Push $R4\r\n  Push $R5\r\n \r\n  ; Get \"String\" and \"SubString\" length\r\n  StrLen $R2 $R0\r\n  StrLen $R3 $R1\r\n  ; Start \"StartCharPos\" counter\r\n  StrCpy $R4 0\r\n \r\n  ; Loop until \"SubString\" is found or \"String\" reaches its end\r\n  ${Do}\r\n    ; Remove everything before and after the searched part (\"TempStr\")\r\n    StrCpy $R5 $R1 $R2 $R4\r\n \r\n    ; Compare \"TempStr\" with \"SubString\"\r\n    ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}\r\n    ; If not \"SubString\", this could be \"String\"'s end\r\n    ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}\r\n    ; If not, continue the loop\r\n    IntOp $R4 $R4 + 1\r\n  ${Loop}\r\n \r\n  ; Remove part before \"SubString\" on \"String\" (if there has one)\r\n  StrCpy $R0 $R1 `` $R4\r\n \r\n  ; Return output to user\r\n  Pop $R5\r\n  Pop $R4\r\n  Pop $R3\r\n  Pop $R2\r\n  Pop $R1\r\n  Exch $R0\r\nFunctionEnd\r\n\r\n;--------------------------------\r\n; StrLower function\r\nFunction StrLower \r\n  Exch $0 ; Original string \r\n  Push $1 ; Final string \r\n  Push $2 ; Current character \r\n  Push $3 \r\n  Push $4 \r\n  StrCpy $1 \"\" \r\nLoop: \r\n  StrCpy $2 $0 1 ; Get next character \r\n  StrCmp $2 \"\" Done \r\n  StrCpy $0 $0 \"\" 1 \r\n  StrCpy $3 122 ; 122 = ASCII code for z \r\nLoop2: \r\n  IntFmt $4 %c $3 ; Get character from current ASCII code \r\n  StrCmp $2 $4 Match \r\n  IntOp $3 $3 - 1 \r\n  StrCmp $3 91 NoMatch Loop2 ; 90 = ASCII code one beyond Z \r\nMatch: \r\n  StrCpy $2 $4 ; It 'matches' (either case) so grab the lowercase version \r\n  NoMatch: \r\n  StrCpy $1 $1$2 ; Append to the final string \r\n  Goto Loop \r\nDone: \r\n  StrCpy $0 $1 ; Return the final string \r\n  Pop $4 \r\n  Pop $3 \r\n  Pop $2 \r\n  Pop $1 \r\n  Exch $0 \r\nFunctionEnd\r\n\r\n;--------------------------------\r\n; General\r\n\r\n  ; Application name.\r\n  Name \"InfraRecorder\"\r\n\r\n  ; Default installation folder.\r\n  InstallDir \"$PROGRAMFILES\\InfraRecorder\"\r\n  \r\n  ; Get installation folder from registry if available.\r\n  InstallDirRegKey HKCU \"Software\\InfraRecorder\" \"\"\r\n\r\n!ifdef INNER\r\n  !echo \"Inner invocation\"\r\n\r\n  ; Output file.\r\n  OutFile \"$%TEMP%\\ir.exe\"\r\n\r\n  ; Compression settings.\r\n  SetCompress off\r\n!else\r\n  !echo \"Outer invocation\"\r\n \r\n  ; Call makensis again, defining INNER. This writes an installer for us which, \r\n  ; when it is invoked, will just write the uninstaller to some location, and\r\n  ; then exit.\r\n  !system \"$\\\"${NSISDIR}\\makensis$\\\" /DINNER setup_nsis.nsi\" = 0\r\n \r\n  ; Run that installer we just created. Since it calls quit the return value\r\n  ; isn't zero.\r\n  !system \"$%TEMP%\\ir.exe\" = 2\r\n \r\n  ; That will have written an uninstaller binary for us. Now we sign it.\r\n  !system \"call ..\\..\\sign.bat $%TEMP%\\uninstall.exe\" = 0\r\n \r\n  ; Output file.\r\n  OutFile \"..\\..\\dist\\ir.exe\"\r\n\r\n  ; Compression settings.\r\n  ;SetCompress off\r\n  SetCompress force\r\n  SetCompressor /SOLID lzma\r\n!endif\r\n\r\n;--------------------------------\r\n; Pages\r\n\r\n  !insertmacro MUI_PAGE_WELCOME\r\n  !insertmacro MUI_PAGE_LICENSE \"..\\..\\license.txt\"\r\n  !insertmacro MUI_PAGE_COMPONENTS\r\n  !insertmacro MUI_PAGE_DIRECTORY\r\n  !insertmacro MUI_PAGE_INSTFILES\r\n  \r\n  !insertmacro MUI_UNPAGE_WELCOME\r\n  !insertmacro MUI_UNPAGE_CONFIRM\r\n  !insertmacro MUI_UNPAGE_INSTFILES\r\n  \r\n;--------------------------------\r\n; Languages\r\n\r\n  !insertmacro MUI_LANGUAGE \"Arabic\"\r\n;  !insertmacro MUI_LANGUAGE \"Armenian\"\r\n  !insertmacro MUI_LANGUAGE \"Basque\"\r\n  !insertmacro MUI_LANGUAGE \"Bosnian\"\r\n  !insertmacro MUI_LANGUAGE \"Bulgarian\"\r\n  !insertmacro MUI_LANGUAGE \"Catalan\"\r\n  !insertmacro MUI_LANGUAGE \"SimpChinese\"\r\n  !insertmacro MUI_LANGUAGE \"TradChinese\"\r\n;  !insertmacro MUI_LANGUAGE \"Chuvash\"\r\n  !insertmacro MUI_LANGUAGE \"Croatian\"\r\n  !insertmacro MUI_LANGUAGE \"Czech\"\r\n  !insertmacro MUI_LANGUAGE \"Danish\"\r\n  !insertmacro MUI_LANGUAGE \"Dutch\"\r\n  !insertmacro MUI_LANGUAGE \"English\"\r\n  !insertmacro MUI_LANGUAGE \"Estonian\"\r\n  !insertmacro MUI_LANGUAGE \"Farsi\"\r\n  !insertmacro MUI_LANGUAGE \"Finnish\"\r\n  !insertmacro MUI_LANGUAGE \"French\"\r\n  !insertmacro MUI_LANGUAGE \"Galician\"\r\n  !insertmacro MUI_LANGUAGE \"German\"\r\n;  !insertmacro MUI_LANGUAGE \"Georgian\"\r\n  !insertmacro MUI_LANGUAGE \"Greek\"\r\n  !insertmacro MUI_LANGUAGE \"Hebrew\"\r\n  !insertmacro MUI_LANGUAGE \"Hungarian\"\r\n  !insertmacro MUI_LANGUAGE \"Indonesian\"\r\n  !insertmacro MUI_LANGUAGE \"Italian\"\r\n  !insertmacro MUI_LANGUAGE \"Japanese\"\r\n  !insertmacro MUI_LANGUAGE \"Korean\"\r\n  !insertmacro MUI_LANGUAGE \"Latvian\"\r\n  !insertmacro MUI_LANGUAGE \"Lithuanian\"\r\n  !insertmacro MUI_LANGUAGE \"Macedonian\"\r\n  !insertmacro MUI_LANGUAGE \"Norwegian\"\r\n  !insertmacro MUI_LANGUAGE \"Polish\"\r\n  !insertmacro MUI_LANGUAGE \"Portuguese\"\r\n  !insertmacro MUI_LANGUAGE \"PortugueseBR\"\r\n  !insertmacro MUI_LANGUAGE \"Romanian\"\r\n  !insertmacro MUI_LANGUAGE \"Russian\"\r\n  !insertmacro MUI_LANGUAGE \"Serbian\"\r\n  !insertmacro MUI_LANGUAGE \"SerbianLatin\"\r\n  !insertmacro MUI_LANGUAGE \"Slovak\"\r\n  !insertmacro MUI_LANGUAGE \"Slovenian\"\r\n  !insertmacro MUI_LANGUAGE \"Spanish\"\r\n  !insertmacro MUI_LANGUAGE \"Swedish\"\r\n  !insertmacro MUI_LANGUAGE \"Thai\"\r\n  !insertmacro MUI_LANGUAGE \"Turkish\"\r\n  !insertmacro MUI_LANGUAGE \"Ukrainian\"\r\n;  !insertmacro MUI_LANGUAGE \"Valencian\"\r\n;  !insertmacro MUI_LANGUAGE \"Vietnamese\"\r\n\r\n;--------------------------------\r\n; A customized language selection dialog.\r\n!macro IR_MUI_LANGDLL_DISPLAY\r\n\r\n  !verbose push\r\n  !verbose ${MUI_VERBOSE}\r\n\r\n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\r\n    IfSilent mui.langdll_done\r\n  !endif\r\n\r\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE \"InfraRecorder Language\"\r\n  !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO \"Please select a language to use in InfraRecorder.\"\r\n\r\n  !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\r\n\r\n    ReadRegStr $MUI_TEMP1 \"${MUI_LANGDLL_REGISTRY_ROOT}\" \"${MUI_LANGDLL_REGISTRY_KEY}\" \"${MUI_LANGDLL_REGISTRY_VALUENAME}\"\r\n    StrCmp $MUI_TEMP1 \"\" mui.langdll_show\r\n      StrCpy $LANGUAGE $MUI_TEMP1\r\n      !ifndef MUI_LANGDLL_ALWAYSSHOW\r\n        Goto mui.langdll_done\r\n      !endif\r\n    mui.langdll_show:\r\n\r\n  !endif\r\n\r\n  LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" A ${MUI_LANGDLL_LANGUAGES} \"\"\r\n;  !ifdef MUI_LANGDLL_ALLLANGUAGES\r\n;    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" A ${MUI_LANGDLL_LANGUAGES} \"\"\r\n;  !else\r\n;    LangDLL::LangDialog \"${MUI_LANGDLL_WINDOWTITLE}\" \"${MUI_LANGDLL_INFO}\" AC ${MUI_LANGDLL_LANGUAGES_CP} \"\"\r\n;  !endif\r\n\r\n  Pop $LANGUAGE\r\n  StrCmp $LANGUAGE \"cancel\" 0 +2\r\n    Abort\r\n\r\n  !ifdef NSIS_CONFIG_SILENT_SUPPORT\r\n    mui.langdll_done:\r\n  !else ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME\r\n    mui.langdll_done:\r\n  !endif\r\n\r\n  !verbose pop\r\n\r\n!macroend\r\n\r\n;--------------------------------\r\n; Installation types\r\n\r\n  InstType \"Full\"\r\n  InstType \"Minimal\"\r\n\r\n;--------------------------------\r\n; Installer Functions\r\n!insertmacro GetParameters\r\n\r\nFunction .onInit\r\n!ifdef INNER\r\n  ; If INNER is defined, then we aren't supposed to do anything except write\r\n  ; out the installer. This is better than processing a command line option as\r\n  ; it means this entire code path is not present in the final (real)\r\n  ; installer.\r\n  WriteUninstaller \"$%TEMP%\\uninstall.exe\"\r\n  Quit\r\n!endif\r\n\r\n  ; Display the language selector.\r\n  !insertmacro IR_MUI_LANGDLL_DISPLAY\r\n\r\n  ; Parse the command-line.\r\n  ;Call GetParameters\r\n  ;Pop $3\r\n  ${GetParameters} $3\r\n  ;Search for quoted /LANGUAGE.\r\n  StrCpy $2 '\"'\r\n  Push $3\r\n  Push '\"/LANGUAGE='\r\n  Call StrStr\r\n  Pop $1\r\n  StrCpy $1 $1 \"\" 1 # skip quote\r\n  StrCmp $1 \"\" \"\" Next\r\n    ;Search for non quoted /LANGUAGE.\r\n    StrCpy $2 ' '\r\n    Push $3\r\n    Push '/LANGUAGE='\r\n    Call StrStr\r\n    Pop $1\r\nNext:\r\n  StrCmp $1 \"\" done\r\n    ;Copy the value after /LANGUAGE=.\r\n    StrCpy $1 $1 \"\" 10\r\n  ; Search for the next parameter.\r\n  Push $1\r\n  Push $2\r\n  Call StrStr\r\n  Pop $2\r\n  StrCmp $2 \"\" Done\r\n  StrLen $2 $2\r\n  StrCpy $1 $1 -$2\r\nDone:\r\n\r\n  ; Convert the language parameter to lowercase.\r\n  Push $1\r\n  Call StrLower\r\n  Pop $1\r\n  ;MessageBox MB_OK $1\r\n\r\n  ClearErrors\r\n  UserInfo::GetName\r\n  IfErrors Win9x\r\n  UserInfo::GetAccountType\r\n  Pop $0\r\n  StrCmp $0 \"Admin\" 0 +3\r\n  \tSetShellVarContext all\r\n  \tGoto cont_done\r\n  \tSetShellVarContext current\r\n  Win9x:\r\n  \tSetShellVarContext current\r\n  cont_done:\r\nFunctionEnd\r\n\r\n;--------------------------------\r\n; Language Strings\r\n\r\n  ; Language strings (Albanian)\r\n  LangString NAME_SecCore ${LANG_ALBANIAN} \"Skedart baz t InfraRecorder (t domosdoshme)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ALBANIAN} \"Shkurtoret e Menus Start\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ALBANIAN} \"Shkurtore e Desktopit\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ALBANIAN} \"Shkurtore e hapjes s shpejt\"\r\n  LangString NAME_SecLang ${LANG_ALBANIAN} \"Skedart e gjuhs\"\r\n  LangString DESC_SecCore ${LANG_ALBANIAN} \"Skedart baz q duhen pr t prdorur InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ALBANIAN} \"Shto ikonat n menun start pr akses t shpejt.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ALBANIAN} \"Shto nj ikon n desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ALBANIAN} \"Shto nj ikon n shiritin e hapjes s shpejt.\"\r\n  LangString DESC_SecLang ${LANG_ALBANIAN} \"Skedart e gjuhs q prdoren pr t mbshtetur gjuh t tjera n InfraRecorder.\"\r\n\r\n  ; Language strings (Arabic)\r\n  LangString NAME_SecCore ${LANG_ARABIC} \" Infrarecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_ARABIC} \"   \"\r\n  LangString NAME_SecDeskShortcut ${LANG_ARABIC} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_ARABIC} \"   \"\r\n  LangString NAME_SecLang ${LANG_ARABIC} \" \"\r\n  LangString DESC_SecCore ${LANG_ARABIC} \"  \"\r\n  LangString DESC_SecStartShortcut ${LANG_ARABIC} \"     \"\r\n  LangString DESC_SecDeskShortcut ${LANG_ARABIC} \"    \"\r\n  LangString DESC_SecQuickShortcut ${LANG_ARABIC} \"     \"\r\n  LangString DESC_SecLang ${LANG_ARABIC} \"       \"\r\n\r\n  ; Language strings (Armenian)\r\n  LangString NAME_SecCore ${LANG_ARMENIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ARMENIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ARMENIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ARMENIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_ARMENIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_ARMENIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ARMENIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ARMENIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ARMENIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_ARMENIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Basque)\r\n  LangString NAME_SecCore ${LANG_BASQUE} \"InfraRecorder Core Artxiboak (beharrezkoak)\"\r\n  LangString NAME_SecStartShortcut ${LANG_BASQUE} \"Hasiera Menuaren Laburbideak\"\r\n  LangString NAME_SecDeskShortcut ${LANG_BASQUE} \"Idazmahaiaren Laburbidea\"\r\n  LangString NAME_SecQuickShortcut ${LANG_BASQUE} \"Laburbide Arina\"\r\n  LangString NAME_SecLang ${LANG_BASQUE} \"Hizkuntza artxiboak\"\r\n  LangString DESC_SecCore ${LANG_BASQUE} \"InfraRecorder erabiltzeko behar diren artxiboak\"\r\n  LangString DESC_SecStartShortcut ${LANG_BASQUE} \"Ikonoak gehitzen dizkio zure hasiera menuari akzesoa errazagoa izan dadin\"\r\n  LangString DESC_SecDeskShortcut ${LANG_BASQUE} \"Ikonoak gehitzen dizkio zure idazmahaiari\"\r\n  LangString DESC_SecQuickShortcut ${LANG_BASQUE} \"Ikono bat gehitzen dio arin-hasteko barrari\"\r\n  LangString DESC_SecLang ${LANG_BASQUE} \"Hizkuntza desberdinak onartzeko erabiltzen diren artxiboak\"\r\n\r\n  ; Language strings (Bosnian)\r\n  LangString NAME_SecCore ${LANG_BOSNIAN} \"Kljucna datoteka InfraRecorder-a (zahtijevano)\"\r\n  LangString NAME_SecStartShortcut ${LANG_BOSNIAN} \"Precica za Start Menu\"\r\n  LangString NAME_SecDeskShortcut ${LANG_BOSNIAN} \"Precica za Desktop\"\r\n  LangString NAME_SecQuickShortcut ${LANG_BOSNIAN} \"Precica za Brzo pokretanje\"\r\n  LangString NAME_SecLang ${LANG_BOSNIAN} \"Datoteke jezika\"\r\n  LangString DESC_SecCore ${LANG_BOSNIAN} \"InfraRecorder zahtijeva kljucne datoteke.\"\r\n  LangString DESC_SecStartShortcut ${LANG_BOSNIAN} \"Dodaj ikonu u start menu za jednostavniji pristup.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_BOSNIAN} \"Dodaj ikonu na desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_BOSNIAN} \"Dodaj ikonu za brzo pokretanje.\"\r\n  LangString DESC_SecLang ${LANG_BOSNIAN} \"Datoteke jezika se koriste za prikaz InfraRecorder-a u razlicitim jezicima.\"\r\n\r\n  ; Language strings (Bulgarian)\r\n  LangString NAME_SecCore ${LANG_BULGARIAN} \"   InfraRecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_BULGARIAN} \"    \"\r\n  LangString NAME_SecDeskShortcut ${LANG_BULGARIAN} \"    \"\r\n  LangString NAME_SecQuickShortcut ${LANG_BULGARIAN} \"    quick launch\"\r\n  LangString NAME_SecLang ${LANG_BULGARIAN} \"  \"\r\n  LangString DESC_SecCore ${LANG_BULGARIAN} \"       InfraRecorder\"\r\n  LangString DESC_SecStartShortcut ${LANG_BULGARIAN} \"        .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_BULGARIAN} \"      \"\r\n  LangString DESC_SecQuickShortcut ${LANG_BULGARIAN} \"     quick launch\"\r\n  LangString DESC_SecLang ${LANG_BULGARIAN} \"          InfraRecorder\"\r\n\r\n  ; Language strings (Catalan)\r\n  LangString NAME_SecCore ${LANG_CATALAN} \"Fitxers del nucli InfraRecorder (necessari)\"\r\n  LangString NAME_SecStartShortcut ${LANG_CATALAN} \"Dreceres en men Inici\"\r\n  LangString NAME_SecDeskShortcut ${LANG_CATALAN} \"Drecera en Escriptori\"\r\n  LangString NAME_SecQuickShortcut ${LANG_CATALAN} \"Drecera d'execuci rpida\"\r\n  LangString NAME_SecLang ${LANG_CATALAN} \"Fitxers de idioma\"\r\n  LangString DESC_SecCore ${LANG_CATALAN} \"Els fitxers del nucli necessaris per utilitzar el InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_CATALAN} \"Afegeix icones al vostre men Inici per facilitar l'accs.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_CATALAN} \"Afegeix una icona al vostre escriptori.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_CATALAN} \"Afegeix una icona a la vostre barra d'execuci rpida.\"\r\n  LangString DESC_SecLang ${LANG_CATALAN} \"Fitxers de idioma utilitzats per donar suport a diferents idiomes en el InfraRecorder.\"\r\n\r\n  ; Language strings (Croatian)\r\n  LangString NAME_SecCore ${LANG_CROATIAN} \"InfraRecorder Jezgrene Datoteke (obavezne)\"\r\n  LangString NAME_SecStartShortcut ${LANG_CROATIAN} \"Start Meni Precaci\"\r\n  LangString NAME_SecDeskShortcut ${LANG_CROATIAN} \"Desktop Precac\"\r\n  LangString NAME_SecQuickShortcut ${LANG_CROATIAN} \"Quick Launch Precac\"\r\n  LangString NAME_SecLang ${LANG_CROATIAN} \"Datoteke Jezika\"\r\n  LangString DESC_SecCore ${LANG_CROATIAN} \"Jezgrene datoteke nune za upotrebu InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_CROATIAN} \"Dodaje ikoneu Start meni radi lakeg pokretanja.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_CROATIAN} \"Dodaje ikonu na va desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_CROATIAN} \"Dodaje ikonu u va Quick Launch liniju.\"\r\n  LangString DESC_SecLang ${LANG_CROATIAN} \"Datoteke jezika koritene za razlicite prijevode InfraRecorder-a.\"\r\n\r\n  ; Language strings (Czech)\r\n  LangString NAME_SecCore ${LANG_CZECH} \"Zkladn soubory InfraRecorderu (nezbytn)\"\r\n  LangString NAME_SecStartShortcut ${LANG_CZECH} \"Zstupci v nabdce Start\"\r\n  LangString NAME_SecDeskShortcut ${LANG_CZECH} \"Zstupce na Ploe\"\r\n  LangString NAME_SecQuickShortcut ${LANG_CZECH} \"Zstupce v panelu Snadn sputn\"\r\n  LangString NAME_SecLang ${LANG_CZECH} \"Jazykov soubory\"\r\n  LangString DESC_SecCore ${LANG_CZECH} \"Zkladn soubory potebn ke sputn InfraRecorderu.\"\r\n  LangString DESC_SecStartShortcut ${LANG_CZECH} \"Pid ikony do nabdky Start.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_CZECH} \"Pid ikonu na Plochu.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_CZECH} \"Pid ikonu do panelu Snadnho sputn.\"\r\n  LangString DESC_SecLang ${LANG_CZECH} \"Jazykov soubory zajiujc InfraRecorderu podporu rznch jazyk.\"\r\n\r\n  ; Language strings (Danish)\r\n  LangString NAME_SecCore ${LANG_DANISH} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_DANISH} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_DANISH} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_DANISH} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_DANISH} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_DANISH} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_DANISH} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_DANISH} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_DANISH} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_DANISH} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Dutch)\r\n  LangString NAME_SecCore ${LANG_DUTCH} \"InfraRecorder essentile bestanden (benodigd)\"\r\n  LangString NAME_SecStartShortcut ${LANG_DUTCH} \"Start Menu snelkoppelingen\"\r\n  LangString NAME_SecDeskShortcut ${LANG_DUTCH} \"Bureaublad snelkoppeling\"\r\n  LangString NAME_SecQuickShortcut ${LANG_DUTCH} \"Snel starten snelkoppeling\"\r\n  LangString NAME_SecLang ${LANG_DUTCH} \"Taal bestanden\"\r\n  LangString DESC_SecCore ${LANG_DUTCH} \"De essentile bestanden zijn nodig om InfraRecorder te kunnen gebruiken.\"\r\n  LangString DESC_SecStartShortcut ${LANG_DUTCH} \"Voegt pictogrammen toe aan het start menu voor snelle toegang.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_DUTCH} \"Voegt een pictogram op het bureaublad toe.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_DUTCH} \"Voegt een pictogram toe aan Snel starten op de taakbalk.\"\r\n  LangString DESC_SecLang ${LANG_DUTCH} \"Taal bestanden gebruikt voor ondersteuning van verschillende talen in InfraRecorder.\"\r\n\r\n  ; Language strings (English)\r\n  LangString NAME_SecCore ${LANG_ENGLISH} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ENGLISH} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ENGLISH} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ENGLISH} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_ENGLISH} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_ENGLISH} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ENGLISH} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ENGLISH} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ENGLISH} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_ENGLISH} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Estonian)\r\n  LangString NAME_SecCore ${LANG_ESTONIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ESTONIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ESTONIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ESTONIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_ESTONIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_ESTONIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ESTONIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ESTONIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ESTONIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_ESTONIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Farsi)\r\n  LangString NAME_SecCore ${LANG_FARSI} \"(   ј(\"\r\n  LangString NAME_SecStartShortcut ${LANG_FARSI} \"   \"\r\n  LangString NAME_SecDeskShortcut ${LANG_FARSI} \" Ҙ\"\r\n  LangString NAME_SecQuickShortcut ${LANG_FARSI} \"  \"\r\n  LangString NAME_SecLang ${LANG_FARSI} \" \"\r\n  LangString DESC_SecCore ${LANG_FARSI} \"     ј   \"\r\n  LangString DESC_SecStartShortcut ${LANG_FARSI} \"         \"\r\n  LangString DESC_SecDeskShortcut ${LANG_FARSI} \"    Ҙ\"\r\n  LangString DESC_SecQuickShortcut ${LANG_FARSI} \"      \"\r\n  LangString DESC_SecLang ${LANG_FARSI} \"          ј   \"\r\n\r\n  ; Language strings (Finnish)\r\n  LangString NAME_SecCore ${LANG_FINNISH} \"InfraRecorderin perustiedosto (pakollinen)\"\r\n  LangString NAME_SecStartShortcut ${LANG_FINNISH} \"Kynnistvalikon pikakuvakkeet\"\r\n  LangString NAME_SecDeskShortcut ${LANG_FINNISH} \"Typydn pikakuvake\"\r\n  LangString NAME_SecQuickShortcut ${LANG_FINNISH} \"Pikakynnistyspalkin kuvake\"\r\n  LangString NAME_SecLang ${LANG_FINNISH} \"Kielitiedostot\"\r\n  LangString DESC_SecCore ${LANG_FINNISH} \"InfraRecorder'in kyttmiseen tarvittavat keskeiset tiedostot.\"\r\n  LangString DESC_SecStartShortcut ${LANG_FINNISH} \"Lis kuvakkeet Kynnist-valikkoon kytn helpottamiseksi.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_FINNISH} \"Lis kuvake typydlle.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_FINNISH} \"Lis kuvake pikakynnistyspalkkiin.\"\r\n  LangString DESC_SecLang ${LANG_FINNISH} \"Kielitiedostojen avulla InfraRecorderia voidaan kytt eri kielill.\"\r\n\r\n  ; Language strings (French)\r\n  LangString NAME_SecCore ${LANG_FRENCH} \"Fichiers requis pour InfraRecorder\"\r\n  LangString NAME_SecStartShortcut ${LANG_FRENCH} \"Raccourcis dans le Menu Dmarrer\"\r\n  LangString NAME_SecDeskShortcut ${LANG_FRENCH} \"Raccourcis sur le Bureau\"\r\n  LangString NAME_SecQuickShortcut ${LANG_FRENCH} \"Raccourci pour la barre de lancement rapide\"\r\n  LangString NAME_SecLang ${LANG_FRENCH} \"Fichiers de Langues\"\r\n  LangString DESC_SecCore ${LANG_FRENCH} \"Fichier requis pour le fonctionnement d'InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_FRENCH} \"Ajouter des icones  votre Menu Dmarrer pour un accs simplifi.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_FRENCH} \"Ajouter un icone sur le Bureau.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_FRENCH} \"Ajouter un icone  votre barre de lancement rapide.\"\r\n  LangString DESC_SecLang ${LANG_FRENCH} \"Fichiers de langues ncessaires pour la traduction d'InfraRecorder.\"\r\n\r\n  ; Language strings (Galician)\r\n  LangString NAME_SecCore ${LANG_GALICIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_GALICIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_GALICIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_GALICIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_GALICIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_GALICIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_GALICIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_GALICIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_GALICIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_GALICIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (German)\r\n  LangString NAME_SecCore ${LANG_GERMAN} \"InfraRecorder Programmdateien (notwendig)\"\r\n  LangString NAME_SecStartShortcut ${LANG_GERMAN} \"Startmen-Eintrge\"\r\n  LangString NAME_SecDeskShortcut ${LANG_GERMAN} \"Desktop-Eintrag\"\r\n  LangString NAME_SecQuickShortcut ${LANG_GERMAN} \"Schnellstart-Eintrag\"\r\n  LangString NAME_SecLang ${LANG_GERMAN} \"Zustzliche Sprachen\"\r\n  LangString DESC_SecCore ${LANG_GERMAN} \"Alle bentigten Programmdateien fr den Einsatz von InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_GERMAN} \"Fr leichten Zugriff Symbole zum Startmen hinzufgen.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_GERMAN} \"Symbol auf dem Desktop erstellen.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_GERMAN} \"Symbol auf Schnellstartleiste erstellen.\"\r\n  LangString DESC_SecLang ${LANG_GERMAN} \"Weitere Sprachdateien fr den mehrsprachigen Betrieb von InfraRecorder hinzufgen.\"\r\n\r\n  ; Language strings (Georgian)\r\n  LangString NAME_SecCore ${LANG_GEORGIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_GEORGIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_GEORGIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_GEORGIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_GEORGIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_GEORGIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_GEORGIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_GEORGIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_GEORGIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_GEORGIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Greek)\r\n  LangString NAME_SecCore ${LANG_GREEK} \"   InfraRecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_GREEK} \"   \"\r\n  LangString NAME_SecDeskShortcut ${LANG_GREEK} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_GREEK} \"    \"\r\n  LangString NAME_SecLang ${LANG_GREEK} \" \"\r\n  LangString DESC_SecCore ${LANG_GREEK} \"        InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_GREEK} \"       .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_GREEK} \"      .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_GREEK} \"       .\"\r\n  LangString DESC_SecLang ${LANG_GREEK} \"          InfraRecorder.\"\r\n\r\n  ; Language strings (Hebrew)\r\n  LangString NAME_SecCore ${LANG_HEBREW} \"Infra Recorder   (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_HEBREW} \"  \"\r\n  LangString NAME_SecDeskShortcut ${LANG_HEBREW} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_HEBREW} \"   \"\r\n  LangString NAME_SecLang ${LANG_HEBREW} \"  \"\r\n  LangString DESC_SecCore ${LANG_HEBREW} \"    .\"\r\n  LangString DESC_SecStartShortcut ${LANG_HEBREW} \"   .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_HEBREW} \"    .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_HEBREW} \"    .\"\r\n  LangString DESC_SecLang ${LANG_HEBREW} \"     .\"\r\n\r\n  ; Language strings (Hungarian)\r\n  LangString NAME_SecCore ${LANG_HUNGARIAN} \"InfraRecorder Programfjlok (szksges)\"\r\n  LangString NAME_SecStartShortcut ${LANG_HUNGARIAN} \"Start Men Parancsikonok\"\r\n  LangString NAME_SecDeskShortcut ${LANG_HUNGARIAN} \"Asztali Parancsikon\"\r\n  LangString NAME_SecQuickShortcut ${LANG_HUNGARIAN} \"Gyorsindt Parancsikon\"\r\n  LangString NAME_SecLang ${LANG_HUNGARIAN} \"Nyelvi Fjlok\"\r\n  LangString DESC_SecCore ${LANG_HUNGARIAN} \"A programfjlok szksgesek az InfraRecorder hasznlathoz.\"\r\n  LangString DESC_SecStartShortcut ${LANG_HUNGARIAN} \"Ikonok hozzadsa a start menhz a gyorsabb elrs rdekben.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_HUNGARIAN} \"Ikon elhelyezse az asztalra.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_HUNGARIAN} \"Ikon elhelyezse a gyorsindt pulton.\"\r\n  LangString DESC_SecLang ${LANG_HUNGARIAN} \"A nyelvi fjlok segtsgvel klnbz nyelveken hasznlhatja az InfraRecordert.\"\r\n\r\n  ; Language strings (Indonesian)\r\n  LangString NAME_SecCore ${LANG_INDONESIAN} \"Berkas Inti InfraRecorder (dibutuhkan)\"\r\n  LangString NAME_SecStartShortcut ${LANG_INDONESIAN} \"Jalan Pintas Menu Start\"\r\n  LangString NAME_SecDeskShortcut ${LANG_INDONESIAN} \"Jalan Pintas Destop\"\r\n  LangString NAME_SecQuickShortcut ${LANG_INDONESIAN} \"Jalan Pintas Luncur Cepat\"\r\n  LangString NAME_SecLang ${LANG_INDONESIAN} \"Berkas Bahasa\"\r\n  LangString DESC_SecCore ${LANG_INDONESIAN} \"Berkas inti yang dibutuhkan untuk menggunakan InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_INDONESIAN} \"Tambah ikon ke menu start anda untuk kemudahan akses.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_INDONESIAN} \"Tambah ikon ke destop anda.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_INDONESIAN} \"Tambah ikon ke batang luncur cepat anda.\"\r\n  LangString DESC_SecLang ${LANG_INDONESIAN} \"Berkas bahasa yang digunakan untuk dukungan bahasa yang berbeda di InfraRecorder.\"\r\n\r\n  ; Language strings (Italian)\r\n  LangString NAME_SecCore ${LANG_ITALIAN} \"File del programma InfraRecorder (Necessari)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ITALIAN} \"Collegamenti del menu' avvio\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ITALIAN} \"Icona sul desktop\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ITALIAN} \"Icona in avvio veloce\"\r\n  LangString NAME_SecLang ${LANG_ITALIAN} \"File per le lingue\"\r\n  LangString DESC_SecCore ${LANG_ITALIAN} \"I file del programma InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ITALIAN} \"Aggiunge le icone del programma al menu avvio per un comodo accesso.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ITALIAN} \"Aggiunge una icona sul desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ITALIAN} \"Aggiunge una icona alla barra di avvio veloce.\"\r\n  LangString DESC_SecLang ${LANG_ITALIAN} \"File usati da InfraRecorder per il supporto delle lingue.\"\r\n\r\n  ; Language strings (Japanese)\r\n  LangString NAME_SecCore ${LANG_JAPANESE} \"InfraRecorder {̃t@C (K{)\"\r\n  LangString NAME_SecStartShortcut ${LANG_JAPANESE} \"[X^[g] j[ V[gJbg\"\r\n  LangString NAME_SecDeskShortcut ${LANG_JAPANESE} \"fXNgbv V[gJbg\"\r\n  LangString NAME_SecQuickShortcut ${LANG_JAPANESE} \"[NCbNN] V[gJbg\"\r\n  LangString NAME_SecLang ${LANG_JAPANESE} \"t@C\"\r\n  LangString DESC_SecCore ${LANG_JAPANESE} \"{̃t@C InfraRecorder gp̂ɕKvłB\"\r\n  LangString DESC_SecStartShortcut ${LANG_JAPANESE} \"ȒPȃANZX̂߂ɃACRg [X^[g] j[ɒǉ܂B\"\r\n  LangString DESC_SecDeskShortcut ${LANG_JAPANESE} \"ACRg̃fXNgbvɒǉ܂B\"\r\n  LangString DESC_SecQuickShortcut ${LANG_JAPANESE} \"ACRg [NCbNN] o[ɒǉ܂B\"\r\n  LangString DESC_SecLang ${LANG_JAPANESE} \"t@C InfraRecorder قȂŃT|[ĝɎgp܂B\"\r\n\r\n  ; Language strings (Korean)\r\n  LangString NAME_SecCore ${LANG_KOREAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_KOREAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_KOREAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_KOREAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_KOREAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_KOREAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_KOREAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_KOREAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_KOREAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_KOREAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Latvian)\r\n  LangString NAME_SecCore ${LANG_LATVIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_LATVIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_LATVIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_LATVIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_LATVIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_LATVIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_LATVIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_LATVIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_LATVIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_LATVIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Lithuanian)\r\n  LangString NAME_SecCore ${LANG_LITHUANIAN} \"InfraRecorder pagrindiniai failai (btini)\"\r\n  LangString NAME_SecStartShortcut ${LANG_LITHUANIAN} \"Start Menu nuorodos\"\r\n  LangString NAME_SecDeskShortcut ${LANG_LITHUANIAN} \"Darbastalio nuoroda\"\r\n  LangString NAME_SecQuickShortcut ${LANG_LITHUANIAN} \"Greito paleidimo nuoroda\"\r\n  LangString NAME_SecLang ${LANG_LITHUANIAN} \"Kalbos failai\"\r\n  LangString DESC_SecCore ${LANG_LITHUANIAN} \"Pagrindiniai failai bti norint naudotis InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_LITHUANIAN} \"Sukuria ikonas  start meniu greitam prijimui.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_LITHUANIAN} \"Sukuria ikon ant darbastalio.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_LITHUANIAN} \"Sukuria ikon  greito paleidimo juost.\"\r\n  LangString DESC_SecLang ${LANG_LITHUANIAN} \"Kalbos failai reikalingi norint kad InfraRecorder vartotojo ssaja dirbt skirtingomis kalbomis.\"\r\n\r\n  ; Language strings (Macedonian)\r\n  LangString NAME_SecCore ${LANG_MACEDONIAN} \"   InfraRecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_MACEDONIAN} \"   \"\r\n  LangString NAME_SecDeskShortcut ${LANG_MACEDONIAN} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_MACEDONIAN} \"     \"\r\n  LangString NAME_SecLang ${LANG_MACEDONIAN} \" \"\r\n  LangString DESC_SecCore ${LANG_MACEDONIAN} \"      InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_MACEDONIAN} \"       .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_MACEDONIAN} \"    .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_MACEDONIAN} \"      .\"\r\n  LangString DESC_SecLang ${LANG_MACEDONIAN} \"        InfraRecorder.\"\r\n\r\n  ; Language strings (Norwegian)\r\n  LangString NAME_SecCore ${LANG_NORWEGIAN} \"InfraRecorder kjernefiler (obligatorisk)\"\r\n  LangString NAME_SecStartShortcut ${LANG_NORWEGIAN} \"Snarvei i startmenyen\"\r\n  LangString NAME_SecDeskShortcut ${LANG_NORWEGIAN} \"Snarvei p skrivebordet\"\r\n  LangString NAME_SecQuickShortcut ${LANG_NORWEGIAN} \"Snarvei p hurtigstartlinjen\"\r\n  LangString NAME_SecLang ${LANG_NORWEGIAN} \"Sprkfiler\"\r\n  LangString DESC_SecCore ${LANG_NORWEGIAN} \"Installerer kjernefiler som kreves for  kjre InfraRecorder\"\r\n  LangString DESC_SecStartShortcut ${LANG_NORWEGIAN} \"Oppretter programmappe for InfraRecorder i startmenyen\"\r\n  LangString DESC_SecDeskShortcut ${LANG_NORWEGIAN} \"Oppretter programikon for InfraRecorder p skrivebordet\"\r\n  LangString DESC_SecQuickShortcut ${LANG_NORWEGIAN} \"Oppretter programikon for InfraRecorder p hurtigstartlinjen\"\r\n  LangString DESC_SecLang ${LANG_NORWEGIAN} \"Installerer sprkfiler som tillater bruk av ulike sprk i InfraRecorder\"\r\n\r\n  ; Language strings (Polish)\r\n  LangString NAME_SecCore ${LANG_POLISH} \"Gwne pliki InfraRecorder (wymagane)\"\r\n  LangString NAME_SecStartShortcut ${LANG_POLISH} \"Skrty menu Start\"\r\n  LangString NAME_SecDeskShortcut ${LANG_POLISH} \"Skrty na pulpicie\"\r\n  LangString NAME_SecQuickShortcut ${LANG_POLISH} \"Skrty w szybkim uruchamianiu\"\r\n  LangString NAME_SecLang ${LANG_POLISH} \"Pliki jzykowe\"\r\n  LangString DESC_SecCore ${LANG_POLISH} \"Gwne pliki wymagane przez InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_POLISH} \"Dodaje ikony w menu Start.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_POLISH} \"Dodaje ikon na pulpicie.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_POLISH} \"Dodaje ikon w pasku szybkiego uruchamiania.\"\r\n  LangString DESC_SecLang ${LANG_POLISH} \"Pliki jzykowe dla obsugi innych jzykw w InfraRecorder.\"\r\n\r\n  ; Language strings (Portuguese)\r\n  LangString NAME_SecCore ${LANG_PORTUGUESE} \"Ficheiros Base do 'InfraRecorder' (obrigatorios)\"\r\n  LangString NAME_SecStartShortcut ${LANG_PORTUGUESE} \"Atalhos do Menu de Programas\"\r\n  LangString NAME_SecDeskShortcut ${LANG_PORTUGUESE} \"Atalho do Ambiente de Trabalho\"\r\n  LangString NAME_SecQuickShortcut ${LANG_PORTUGUESE} \"Atalho da Barra de Iniciacao Rapida\"\r\n  LangString NAME_SecLang ${LANG_PORTUGUESE} \"Ficheiros de Linguas\"\r\n  LangString DESC_SecCore ${LANG_PORTUGUESE} \"Os ficheiros base obrigatorios para correr o 'InfraRecorder'.\"\r\n  LangString DESC_SecStartShortcut ${LANG_PORTUGUESE} \"Adiciona 'icons' ao menu de programas para um melhor acesso.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_PORTUGUESE} \"Adiciona um 'icon' ao ambiente de trabalho.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_PORTUGUESE} \"Adiciona um 'icon' a barra de iniciacao rapida.\"\r\n  LangString DESC_SecLang ${LANG_PORTUGUESE} \"Ficheiros de linguas usados para suportar o 'InfraRecorder' em modo multi-lingual.\"\r\n\r\n  ; Language strings (Brazilian Portuguese)\r\n  LangString NAME_SecCore ${LANG_PORTUGUESEBR} \"Arquivos de Ncleo do InfraRecorder (requeridos)\"\r\n  LangString NAME_SecStartShortcut ${LANG_PORTUGUESEBR} \"Atalhos do Menu Iniciar\"\r\n  LangString NAME_SecDeskShortcut ${LANG_PORTUGUESEBR} \"Atalho do Desktop\"\r\n  LangString NAME_SecQuickShortcut ${LANG_PORTUGUESEBR} \"Atalho da Barra de Inicializao Rpida\"\r\n  LangString NAME_SecLang ${LANG_PORTUGUESEBR} \"Arquivos de Linguagem\"\r\n  LangString DESC_SecCore ${LANG_PORTUGUESEBR} \"Os arquivos de ncleo requeridos pelo InfraRecorder\"\r\n  LangString DESC_SecStartShortcut ${LANG_PORTUGUESEBR} \"Adiciona cones ao menu iniciar para acesso fcil\"\r\n  LangString DESC_SecDeskShortcut ${LANG_PORTUGUESEBR} \"Adicionar um cone no Desktop\"\r\n  LangString DESC_SecQuickShortcut ${LANG_PORTUGUESEBR} \"Adicionar um cone na Barra de Inicializao Rpida\"\r\n  LangString DESC_SecLang ${LANG_PORTUGUESEBR} \"Arquivos de linguagem utilizados para o suporte multilnge no InfraRecorder\"\r\n\r\n  ; Language strings (Romanian)\r\n  LangString NAME_SecCore ${LANG_ROMANIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_ROMANIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_ROMANIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_ROMANIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_ROMANIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_ROMANIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_ROMANIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_ROMANIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_ROMANIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_ROMANIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Russian)\r\n  LangString NAME_SecCore ${LANG_RUSSIAN} \"  InfraRecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_RUSSIAN} \"   \"\r\n  LangString NAME_SecDeskShortcut ${LANG_RUSSIAN} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_RUSSIAN} \"    \"\r\n  LangString NAME_SecLang ${LANG_RUSSIAN} \" \"\r\n  LangString DESC_SecCore ${LANG_RUSSIAN} \" ,    InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_RUSSIAN} \"         .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_RUSSIAN} \"    .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_RUSSIAN} \"     .\"\r\n  LangString DESC_SecLang ${LANG_RUSSIAN} \"       InfraRecorder.\"\r\n\r\n  ; Language strings (Cyrillic Serbian)\r\n  LangString NAME_SecCore ${LANG_SERBIAN} \"InfraRecorder  ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_SERBIAN} \"  \"\r\n  LangString NAME_SecDeskShortcut ${LANG_SERBIAN} \"  \"\r\n  LangString NAME_SecQuickShortcut ${LANG_SERBIAN} \"  \"\r\n  LangString NAME_SecLang ${LANG_SERBIAN} \" \"\r\n  LangString DESC_SecCore ${LANG_SERBIAN} \"   InfraRecorder-.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SERBIAN} \"       .\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SERBIAN} \"    .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SERBIAN} \"     .\"\r\n  LangString DESC_SecLang ${LANG_SERBIAN} \"   InfraRecorder.\"\r\n\r\n  ; Language strings (Latin Serbian)\r\n  LangString NAME_SecCore ${LANG_SERBIANLATIN} \"InfraRecorder datoteke (potrebno)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SERBIANLATIN} \"Preica Start menija\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SERBIANLATIN} \"Preica radne povrine\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SERBIANLATIN} \"Preica brzog pokretanja\"\r\n  LangString NAME_SecLang ${LANG_SERBIANLATIN} \"Jezike datoteke\"\r\n  LangString DESC_SecCore ${LANG_SERBIANLATIN} \"Datoteke za rad InfraRecorder-a.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SERBIANLATIN} \"Dodaj ikone u start meniju za laki pristup.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SERBIANLATIN} \"Dodaj ikonu na radnoj povrini.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SERBIANLATIN} \"Dodaj ikonu na traku brzog pokretanja.\"\r\n  LangString DESC_SecLang ${LANG_SERBIANLATIN} \"Jezike datoteke za InfraRecorder.\"\r\n\r\n  ; Language strings (Slovak)\r\n  LangString NAME_SecCore ${LANG_SLOVAK} \"Zkladn sbory InfraRecorderu (nutn)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SLOVAK} \"Odkazy v menu tart\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SLOVAK} \"Odkaz na Plochu\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SLOVAK} \"Odkaz do panelu Rchle spustenie\"\r\n  LangString NAME_SecLang ${LANG_SLOVAK} \"Sbory jazykov\"\r\n  LangString DESC_SecCore ${LANG_SLOVAK} \"Zkladn sbory nutn na pouvanie InfraRecorderu\"\r\n  LangString DESC_SecStartShortcut ${LANG_SLOVAK} \"Prid ikony do ponuky tart pre zjednodunie prstupu.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SLOVAK} \"Prid ikonu na Plochu\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SLOVAK} \"Prid ikonu do Vho panelu Rchle spustenie.\"\r\n  LangString DESC_SecLang ${LANG_SLOVAK} \"Sbory jazykov, pouit pre podporu rznych jazykov InfraRecorderu\"\r\n\r\n  ; Language strings (Slovenian)\r\n  LangString NAME_SecCore ${LANG_SLOVENIAN} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SLOVENIAN} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SLOVENIAN} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SLOVENIAN} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_SLOVENIAN} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_SLOVENIAN} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SLOVENIAN} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SLOVENIAN} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SLOVENIAN} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_SLOVENIAN} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Simplified Chinese)\r\n  LangString NAME_SecCore ${LANG_SIMPCHINESE} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SIMPCHINESE} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SIMPCHINESE} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SIMPCHINESE} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_SIMPCHINESE} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_SIMPCHINESE} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SIMPCHINESE} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SIMPCHINESE} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SIMPCHINESE} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_SIMPCHINESE} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Spanish)\r\n  LangString NAME_SecCore ${LANG_SPANISH} \"Ncleo de InfraRecorder (requerido)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SPANISH} \"Accesos directos en men de inicio\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SPANISH} \"Acceso directo en el escritorio\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SPANISH} \"Acceso directo en inicio rpido\"\r\n  LangString NAME_SecLang ${LANG_SPANISH} \"Archivos de idiomas\"\r\n  LangString DESC_SecCore ${LANG_SPANISH} \"El ncleo de archivos necesario para usar InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SPANISH} \"Agrega iconos a su men de inicio para acceder fcilmente.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SPANISH} \"Agrega un icono a su escritorio.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SPANISH} \"Agrega un icono a su barra de inicio rpido.\"\r\n  LangString DESC_SecLang ${LANG_SPANISH} \"Archivos usados para soporte de diferentes idiomas en InfraRecorder.\"\r\n\r\n  ; Language strings (Swedish)\r\n  LangString NAME_SecCore ${LANG_SWEDISH} \"InfraRecorder huvudfiler (krvs)\"\r\n  LangString NAME_SecStartShortcut ${LANG_SWEDISH} \"Startmeny genvgar\"\r\n  LangString NAME_SecDeskShortcut ${LANG_SWEDISH} \"Skrivbord genvg\"\r\n  LangString NAME_SecQuickShortcut ${LANG_SWEDISH} \"Snabbstart genvg\"\r\n  LangString NAME_SecLang ${LANG_SWEDISH} \"Sprkfiler\"\r\n  LangString DESC_SecCore ${LANG_SWEDISH} \"Huvudfilerna som krvs fr att anvnda InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_SWEDISH} \"Lgger till ikoner p din startmeny.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_SWEDISH} \"Lgger till en ikon p ditt skrivbord.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_SWEDISH} \"Lgger till en ikon p snabbstartfltet.\"\r\n  LangString DESC_SecLang ${LANG_SWEDISH} \"Sprkfiler som anvnds fr att stdja olika sprk i InfraRecorder.\"\r\n\r\n  ; Language strings (Thai)\r\n  LangString NAME_SecCore ${LANG_THAI} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_THAI} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_THAI} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_THAI} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_THAI} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_THAI} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_THAI} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_THAI} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_THAI} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_THAI} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n  ; Language strings (Traditional Chinese)\r\n  LangString NAME_SecCore ${LANG_TRADCHINESE} \"InfraRecorder֤ɮ(nw)\"\r\n  LangString NAME_SecStartShortcut ${LANG_TRADCHINESE} \"}l\\|\"\r\n  LangString NAME_SecDeskShortcut ${LANG_TRADCHINESE} \"ୱ|\"\r\n  LangString NAME_SecQuickShortcut ${LANG_TRADCHINESE} \"ֳtҰʼb\"\r\n  LangString NAME_SecLang ${LANG_TRADCHINESE} \"yɮ\"\r\n  LangString DESC_SecCore ${LANG_TRADCHINESE} \" InfraRecorder һݭn֤ɮ\"\r\n  LangString DESC_SecStartShortcut ${LANG_TRADCHINESE} \"W[ϥܦܶ}l\\\"\r\n  LangString DESC_SecDeskShortcut ${LANG_TRADCHINESE} \"W[ϥܦܮୱ\"\r\n  LangString DESC_SecQuickShortcut ${LANG_TRADCHINESE} \"W[ϥܦܧֳtҰ\"\r\n  LangString DESC_SecLang ${LANG_TRADCHINESE} \" InfraRecorder 䴩Pay\"\r\n\r\n  ; Language strings (Turkish)\r\n  LangString NAME_SecCore ${LANG_TURKISH} \"InfraRecorder Ana Dosyalar (Gerekli)\"\r\n  LangString NAME_SecStartShortcut ${LANG_TURKISH} \"Balat Mens Ksayollar\"\r\n  LangString NAME_SecDeskShortcut ${LANG_TURKISH} \"Masast Ksayolu\"\r\n  LangString NAME_SecQuickShortcut ${LANG_TURKISH} \"Hzl Balat Ksayolu\"\r\n  LangString NAME_SecLang ${LANG_TURKISH} \"Dil Dosyalar\"\r\n  LangString DESC_SecCore ${LANG_TURKISH} \"InfraRecorder' kullanabilmek iin gereken ana dosyalar.\"\r\n  LangString DESC_SecStartShortcut ${LANG_TURKISH} \"Balat Mensne programa hzl eriebilmek iin simgeleri ekler.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_TURKISH} \"Masastne simge ekler.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_TURKISH} \"Hzl Balata simge ekler\"\r\n  LangString DESC_SecLang ${LANG_TURKISH} \"InfraRecorder' farkl dillerde kullanabilmek iin dil dosyalar.\"\r\n\r\n  ; Language strings (Ukrainian)\r\n  LangString NAME_SecCore ${LANG_UKRAINIAN} \"  InfraRecorder ()\"\r\n  LangString NAME_SecStartShortcut ${LANG_UKRAINIAN} \"   ''\"\r\n  LangString NAME_SecDeskShortcut ${LANG_UKRAINIAN} \"   \"\r\n  LangString NAME_SecQuickShortcut ${LANG_UKRAINIAN} \"    \"\r\n  LangString NAME_SecLang ${LANG_UKRAINIAN} \" \"\r\n  LangString DESC_SecCore ${LANG_UKRAINIAN} \"     InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_UKRAINIAN} \"     ''   ...\"\r\n  LangString DESC_SecDeskShortcut ${LANG_UKRAINIAN} \"     .\"\r\n  LangString DESC_SecQuickShortcut ${LANG_UKRAINIAN} \"     .\"\r\n  LangString DESC_SecLang ${LANG_UKRAINIAN} \"        InfraRecorder.\"\r\n\r\n  ; Language strings (Vietnamese)\r\n  LangString NAME_SecCore ${LANG_VIETNAMESE} \"InfraRecorder Core Files (required)\"\r\n  LangString NAME_SecStartShortcut ${LANG_VIETNAMESE} \"Start Menu Shortcuts\"\r\n  LangString NAME_SecDeskShortcut ${LANG_VIETNAMESE} \"Desktop Shortcut\"\r\n  LangString NAME_SecQuickShortcut ${LANG_VIETNAMESE} \"Quick Launch Shortcut\"\r\n  LangString NAME_SecLang ${LANG_VIETNAMESE} \"Language Files\"\r\n  LangString DESC_SecCore ${LANG_VIETNAMESE} \"The core files required to use InfraRecorder.\"\r\n  LangString DESC_SecStartShortcut ${LANG_VIETNAMESE} \"Adds icons to your start menu for easy access.\"\r\n  LangString DESC_SecDeskShortcut ${LANG_VIETNAMESE} \"Adds an icon to your desktop.\"\r\n  LangString DESC_SecQuickShortcut ${LANG_VIETNAMESE} \"Adds an icon to your quick launch bar.\"\r\n  LangString DESC_SecLang ${LANG_VIETNAMESE} \"Language files used for supporting different languages in InfraRecorder.\"\r\n\r\n;--------------------------------\r\n; Installer Sections\r\n\r\nSection $(NAME_SecCore) SecCore\r\n  SectionIn 1 2 RO\r\n\r\n  SetOutPath \"$INSTDIR\"\r\n  File \"..\\..\\readme.txt\"\r\n  File \"..\\..\\license.txt\"\r\n  File \"..\\..\\doc\\english\\infrarecorder.chm\"\r\n  File \"..\\..\\bin\\win32\\release\\infrarecorder.exe\"\r\n  File \"..\\..\\bin\\win32\\release\\shell.dll\"\r\n  File \"..\\..\\dep\\smoke\\win32\\smoke.exe\"\r\n\r\n  SetOutPath \"$INSTDIR\\codecs\"\r\n  ;File \"..\\..\\bin\\win32\\release\\codecs\\wave.irc\"\r\n  File \"..\\..\\bin\\win32\\release\\codecs\\sndfile.irc\"\r\n  File \"..\\..\\dep\\libsndfile\\win32\\libsndfile-1.dll\"\r\n  File \"..\\..\\bin\\win32\\release\\codecs\\wma.irc\"\r\n  File \"..\\..\\bin\\win32\\release\\codecs\\vorbis.irc\"\r\n\r\n!ifdef CDRKIT\r\n  SetOutPath \"$INSTDIR\\cdrkit\"\r\n  File \"..\\..\\dep\\cdrkit\\icedax.exe\"\r\n  File \"..\\..\\dep\\cdrkit\\wodim.exe\"\r\n  File \"..\\..\\dep\\cdrkit\\cygwin1.dll\"\r\n  File \"..\\..\\dep\\cdrkit\\readom.exe\"\r\n  File \"..\\..\\dep\\cdrkit\\COPYING\"\r\n!else\r\n  SetOutPath \"$INSTDIR\\cdrtools\"\r\n  File \"..\\..\\dep\\cdrtools\\cdda2wav.exe\"\r\n  File \"..\\..\\dep\\cdrtools\\cdrecord.exe\"\r\n  File \"..\\..\\dep\\cdrtools\\cygwin1.dll\"\r\n  File \"..\\..\\dep\\cdrtools\\readcd.exe\"\r\n  File \"..\\..\\dep\\cdrtools\\COPYING\"\r\n!endif\r\n  \r\n  ; Store installation folder.\r\n  WriteRegStr HKCU \"Software\\InfraRecorder\" \"\" $INSTDIR\r\n  \r\n  ; Create uninstaller.\r\n!ifndef INNER\r\n  SetOutPath \"$INSTDIR\"\r\n \r\n  ; Package the signed uninstaller.\r\n  File $%TEMP%\\uninstall.exe\r\n!endif\r\n\r\n  ; Add an entry to Add/Remove Programs.\r\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InfraRecorder\" \\\r\n\t\"DisplayName\" \"InfraRecorder\"\r\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InfraRecorder\" \\\r\n\t\"Publisher\" \"Christian Kindahl\"\r\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InfraRecorder\" \\\r\n\t\"UninstallString\" \"$\\\"$INSTDIR\\uninstall.exe$\\\"\"\r\n  WriteRegStr HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InfraRecorder\" \\\r\n\t\"DisplayIcon\" \"$INSTDIR\\infrarecorder.exe\"\r\nSectionEnd\r\n\r\nSection $(NAME_SecStartShortcut) SecStartShortcut\r\n  SectionIn 1\r\n\r\n  ; Start menu shortcuts.\r\n  CreateDirectory \"$SMPROGRAMS\\InfraRecorder\"\r\n  CreateShortCut \"$SMPROGRAMS\\InfraRecorder\\InfraRecorder.lnk\" \"$INSTDIR\\infrarecorder.exe\"\r\n  CreateShortCut \"$SMPROGRAMS\\InfraRecorder\\InfraRecorder Help.lnk\" \"$INSTDIR\\infrarecorder.chm\"\r\n  CreateShortCut \"$SMPROGRAMS\\InfraRecorder\\Uninstall.lnk\" \"$INSTDIR\\uninstall.exe\"\r\nSectionEnd\r\n\r\nSection $(NAME_SecDeskShortcut) SecDeskShortcut\r\n  SectionIn 1\r\n\r\n  CreateShortCut \"$DESKTOP\\InfraRecorder.lnk\" \"$INSTDIR\\infrarecorder.exe\"\r\nSectionEnd\r\n\r\nSection $(NAME_SecQuickShortcut) SecQuickShortcut\r\n  SectionIn 1\r\n\r\n  ; Quick launch shortcut.\r\n  CreateShortCut \"$QUICKLAUNCH\\InfraRecorder.lnk\" \"$INSTDIR\\infrarecorder.exe\"\r\nSectionEnd\r\n\r\nSection $(NAME_SecLang) SecLang\r\n  SectionIn 1\r\n\r\n  SetOutPath \"$INSTDIR\\languages\"\r\n\r\n  File \"..\\..\\etc\\translations\\software\\albanian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\arabic.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\armenian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\basque.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\bosnian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\bulgarian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\catalan.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\chinese-simplified.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\chinese-traditional.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\chuvash.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\croatian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\czech.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\danish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\dutch.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\estonian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\farsi.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\finnish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\french.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\galician.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\german.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\georgian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\greek.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\hebrew.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\hungarian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\indonesian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\italian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\japanese.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\korean.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\latvian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\lithuanian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\macedonian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\norwegian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\polish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\portuguese.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\portuguese-brazilian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\romanian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\russian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\serbian-cyrillic.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\serbian-latin.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\slovak.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\slovenian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\spanish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\swedish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\thai.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\turkish.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\ukrainian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\valencian.irl\"\r\n  File \"..\\..\\etc\\translations\\software\\vietnamese.irl\"\r\n  File \"..\\..\\etc\\translations\\help\\czech.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\french.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\german.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\russian.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\thai.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\turkish.chm\"\r\n  File \"..\\..\\etc\\translations\\help\\ukrainian.chm\"\r\n\r\n  ; Check if a language has been specified by the commandline.\r\n  ; http://www.microsoft.com/globaldev/reference/oslocversion.mspx\r\n  ; http://www.microsoft.com/globaldev/reference/lcid-all.mspx\r\n  ${Switch} $1\r\n    ${case} \"albanian\"\r\n      StrCpy $LANGUAGE ${LANG_ALBANIAN}\r\n      ${break}\r\n    ${case} \"arabic\"\t; 1025\r\n      StrCpy $LANGUAGE ${LANG_ARABIC}\r\n      ${break}\r\n    ${case} \"armenian\"\r\n      StrCpy $LANGUAGE ${LANG_ARMENIAN}\r\n      ${break}\r\n    ${case} \"basque\"\t; 1069\r\n      StrCpy $LANGUAGE ${LANG_BASQUE}\r\n      ${break}\r\n    ${case} \"bosnian\"\t; 5146\r\n      StrCpy $LANGUAGE ${LANG_BOSNIAN}\r\n      ${break}\r\n    ${case} \"bulgarian\"\t; 1026\r\n      StrCpy $LANGUAGE ${LANG_BULGARIAN}\r\n      ${break}\r\n    ${case} \"catalan\"\t; 1027\r\n      StrCpy $LANGUAGE ${LANG_CATALAN}\r\n      ${break}\r\n    ${Case} \"simpchinese\"\t; 2052\r\n      StrCpy $LANGUAGE ${LANG_SIMPCHINESE}\r\n      ${Break}\r\n    ${Case} \"tradchinese\"\t; 1028\r\n      StrCpy $LANGUAGE ${LANG_TRADCHINESE}\r\n      ${Break}\r\n    ${Case} \"chuvash\"\r\n      StrCpy $LANGUAGE ${LANG_CHUVASH}\r\n      ${Break}\r\n    ${Case} \"croatian\"\t; 1050\r\n      StrCpy $LANGUAGE ${LANG_CROATIAN}\r\n      ${Break}\r\n    ${case} \"czech\"\t; 1029\r\n      StrCpy $LANGUAGE ${LANG_CZECH}\r\n      ${break}\r\n    ${case} \"danish\"\t; 1030\r\n      StrCpy $LANGUAGE ${LANG_DANISH}\r\n      ${break}\r\n    ${Case} \"dutch\"\t; 1043\r\n      StrCpy $LANGUAGE ${LANG_DUTCH}\r\n      ${Break}\r\n    ${Case} \"english\"\t; 1033\r\n      StrCpy $LANGUAGE ${LANG_ENGLISH}\r\n      ${Break}\r\n    ${Case} \"estonian\"\r\n      StrCpy $LANGUAGE ${LANG_ESTONIAN}\r\n      ${Break}\r\n    ${Case} \"farsi\"\r\n      StrCpy $LANGUAGE ${LANG_FARSI}\r\n      ${Break}\r\n    ${Case} \"finnish\"\t; 1035\r\n      StrCpy $LANGUAGE ${LANG_FINNISH}\r\n      ${Break}\r\n    ${Case} \"french\"\t; 1036\r\n      StrCpy $LANGUAGE ${LANG_FRENCH}\r\n      ${Break}\r\n    ${Case} \"galician\"\r\n      StrCpy $LANGUAGE ${LANG_GALICIAN}\r\n      ${Break}\r\n    ${Case} \"german\"\t; 1031\r\n      StrCpy $LANGUAGE ${LANG_GERMAN}\r\n      ${Break}\r\n    ${Case} \"georgian\"\r\n      StrCpy $LANGUAGE ${LANG_GEORGIAN}\r\n      ${Break}\r\n    ${Case} \"greek\"\t; 1032\r\n      StrCpy $LANGUAGE ${LANG_GREEK}\r\n      ${Break}\r\n    ${Case} \"hebrew\"\t; 1037\r\n      StrCpy $LANGUAGE ${LANG_HEBREW}\r\n      ${Break}\r\n    ${Case} \"hungarian\"\t; 1038\r\n      StrCpy $LANGUAGE ${LANG_HUNGARIAN}\r\n      ${Break}\r\n    ${Case} \"indonesian\"; 1057\r\n      StrCpy $LANGUAGE ${LANG_INDONESIAN}\r\n      ${Break}\r\n    ${Case} \"italian\"\t; 1040\r\n      StrCpy $LANGUAGE ${LANG_ITALIAN}\r\n      ${Break}\r\n    ${Case} \"japanese\"\t; 1041\r\n      StrCpy $LANGUAGE ${LANG_JAPANESE}\r\n      ${Break}\r\n    ${Case} \"korean\"\t; 1042\r\n      StrCpy $LANGUAGE ${LANG_KOREAN}\r\n      ${Break}\r\n    ${Case} \"latvian\"\r\n      StrCpy $LANGUAGE ${LANG_LATVIAN}\r\n      ${Break}\r\n    ${Case} \"lithuanian\"; 1063\r\n      StrCpy $LANGUAGE ${LANG_LITHUANIAN}\r\n      ${Break}\r\n    ${Case} \"macedonian\"\r\n      StrCpy $LANGUAGE ${LANG_MACEDONIAN}\r\n      ${Break}\r\n    ${Case} \"norwegian\"; 1044\r\n      StrCpy $LANGUAGE ${LANG_NORWEGIAN}\r\n      ${Break}\r\n    ${Case} \"polish\"; \t1045\r\n      StrCpy $LANGUAGE ${LANG_POLISH}\r\n      ${Break}\r\n    ${Case} \"portuguese\"; 2070\r\n      StrCpy $LANGUAGE ${LANG_PORTUGUESE}\r\n      ${Break}\r\n    ${Case} \"portuguesebr\"; 1046\r\n      StrCpy $LANGUAGE ${LANG_PORTUGUESEBR}\r\n      ${Break}\r\n    ${Case} \"romanian\"; 1048\r\n      StrCpy $LANGUAGE ${LANG_ROMANIAN}\r\n      ${Break}\r\n    ${Case} \"russian\"\t; 1049\r\n      StrCpy $LANGUAGE ${LANG_RUSSIAN}\r\n      ${Break}\r\n    ${Case} \"serbian\"\t; 3098\r\n      StrCpy $LANGUAGE ${LANG_SERBIAN}\r\n      ${Break}\r\n    ${Case} \"serbianlatin\"; 2074\r\n      StrCpy $LANGUAGE ${LANG_SERBIANLATIN}\r\n      ${Break}\r\n    ${Case} \"slovak\"\t; 1051\r\n      StrCpy $LANGUAGE ${LANG_SLOVAK}\r\n      ${Break}\r\n    ${Case} \"slovenian\"\t; 1060\r\n      StrCpy $LANGUAGE ${LANG_SLOVENIAN}\r\n      ${Break}\r\n    ${Case} \"spanish\"\t; 1034\r\n      StrCpy $LANGUAGE ${LANG_SPANISH}\r\n      ${Break}\r\n    ${Case} \"swedish\"\t; 1053\r\n      StrCpy $LANGUAGE ${LANG_SWEDISH}\r\n      ${Break}\r\n    ${Case} \"thai\"\t; 1054\r\n      StrCpy $LANGUAGE ${LANG_THAI}\r\n      ${Break}\r\n    ${Case} \"turkish\"\t; 1055\r\n      StrCpy $LANGUAGE ${LANG_TURKISH}\r\n      ${Break}\r\n    ${Case} \"ukrainian\"\t; 1058\r\n      StrCpy $LANGUAGE ${LANG_UKRAINIAN}\r\n      ${Break}\r\n    ${Case} \"valencian\"\t; 1058\r\n      StrCpy $LANGUAGE ${LANG_VALENCIAN}\r\n      ${Break}\r\n    ${Case} \"vietnamese\"\r\n      StrCpy $LANGUAGE ${LANG_VIETNAMESE}\r\n      ${Break}\r\n  ${EndSwitch}\r\n\r\n  ; Calculate file name of the translation file.\r\n  ; http://www.microsoft.com/globaldev/reference/oslocversion.mspx\r\n  ; http://www.microsoft.com/globaldev/reference/lcid-all.mspx\r\n  ${Switch} $LANGUAGE\r\n    ${Case} ${LANG_ALBANIAN}\r\n      StrCpy $0 \"albanian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_ARABIC}\t; 1025\r\n      StrCpy $0 \"arabic.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_ARMENIAN}\r\n      StrCpy $0 \"armenian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_BASQUE}\t; 1069\r\n      StrCpy $0 \"basque.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_BOSNIAN}\t; 5146\r\n      StrCpy $0 \"bosnian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_BULGARIAN}\t; 1026\r\n      StrCpy $0 \"bulgarian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_CATALAN}\t; 1027\r\n      StrCpy $0 \"catalan.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SIMPCHINESE}\t; 2052\r\n      StrCpy $0 \"chinese-simplified.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_TRADCHINESE}\t; 1028\r\n      StrCpy $0 \"chinese-traditional.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_CHUVASH}\r\n      StrCpy $0 \"chuvash.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_CROATIAN}\t; 1050\r\n      StrCpy $0 \"croatian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_CZECH}\t; 1029\r\n      StrCpy $0 \"czech.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_DANISH}\t; 1030\r\n      StrCpy $0 \"danish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_DUTCH}\t; 1043\r\n      StrCpy $0 \"dutch.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_ENGLISH}\t; 1033\r\n      StrCpy $0 \"\"\r\n      ${Break}\r\n    ${Case} ${LANG_ESTONIAN}\r\n      StrCpy $0 \"estonian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_FARSI}\r\n      StrCpy $0 \"farsi.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_FINNISH}\t; 1035\r\n      StrCpy $0 \"finnish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_FRENCH}\t; 1036\r\n      StrCpy $0 \"french.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_GALICIAN}\r\n      StrCpy $0 \"galician.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_GERMAN}\t; 1031\r\n      StrCpy $0 \"german.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_GEORGIAN}\r\n      StrCpy $0 \"georgian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_GREEK}\t; 1032\r\n      StrCpy $0 \"greek.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_HEBREW}\t; 1037\r\n      StrCpy $0 \"hebrew.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_HUNGARIAN}\t; 1038\r\n      StrCpy $0 \"hungarian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_INDONESIAN}\t; 1057\r\n      StrCpy $0 \"indonesian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_ITALIAN}\t; 1040\r\n      StrCpy $0 \"italian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_JAPANESE}\t; 1041\r\n      StrCpy $0 \"japanese.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_KOREAN}\t; 1042\r\n      StrCpy $0 \"korean.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_LATVIAN}\r\n      StrCpy $0 \"latvian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_LITHUANIAN}\t; 1063\r\n      StrCpy $0 \"lithuanian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_MACEDONIAN}\r\n      StrCpy $0 \"macedonian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_NORWEGIAN}\t; 1044\r\n      StrCpy $0 \"norwegian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_POLISH}\t; 1045\r\n      StrCpy $0 \"polish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_PORTUGUESE}\t; 2070\r\n      StrCpy $0 \"portuguese.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_PORTUGUESEBR}\t; 1046\r\n      StrCpy $0 \"portuguese-brazilian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_ROMANIAN}\t; 1048\r\n      StrCpy $0 \"romanian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_RUSSIAN}\t; 1049\r\n      StrCpy $0 \"russian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SERBIAN}\t; 3098\r\n      StrCpy $0 \"serbian-cyrillic.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SERBIANLATIN} ; 2074\r\n      StrCpy $0 \"serbian-latin.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SLOVAK}\t; 1051\r\n      StrCpy $0 \"slovak.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SLOVENIAN}\t; 1060\r\n      StrCpy $0 \"slovenian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SPANISH}\t; 1034\r\n      StrCpy $0 \"spanish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_SWEDISH}\t; 1053\r\n      StrCpy $0 \"swedish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_THAI}\t; 1054\r\n      StrCpy $0 \"thai.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_TURKISH}\t; 1055\r\n      StrCpy $0 \"turkish.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_UKRAINIAN}\t; 1058\r\n      StrCpy $0 \"ukrainian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_VALENCIAN}\r\n      StrCpy $0 \"valencian.irl\"\r\n      ${Break}\r\n    ${Case} ${LANG_VIETNAMESE}\r\n      StrCpy $0 \"vietnamese.irl\"\r\n      ${Break}\r\n  ${EndSwitch}\r\n\r\n  ; Create a configuration file with a preselected language file (if the\r\n  ; selected language is not English).\r\n  ${If} $0 != \"\"\r\n    ir_plugin::CreateConfig \"$INSTDIR\\settings.xml\" \"$0\"\r\n  ${EndIf}\r\nSectionEnd\r\n\r\n;--------------------------------\r\n; Description Macros\r\n\r\n  ; Assign language strings to sections\r\n  !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\r\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} $(DESC_SecCore)\r\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecStartShortcut} $(DESC_SecStartShortcut)\r\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecDeskShortcut} $(DESC_SecDeskShortcut)\r\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecQuickShortcut} $(DESC_SecQuickShortcut)\r\n    !insertmacro MUI_DESCRIPTION_TEXT ${SecLang} $(DESC_SecLang)\r\n  !insertmacro MUI_FUNCTION_DESCRIPTION_END\r\n\r\n;--------------------------------\r\n; Uninstaller Section\r\n!ifdef INNER\r\nSection \"Uninstall\"\r\n  ; Delete program directory.\r\n  RMDir /r /REBOOTOK \"$INSTDIR\"\r\n\r\n  ; Delete start menu shortcuts.\r\n  RMDir /r \"$SMPROGRAMS\\InfraRecorder\"\r\n\r\n  ; Delete desktop shortcut.\r\n  Delete \"$DESKTOP\\InfraRecorder.lnk\"\r\n\r\n  ; Delete quick launch shortcut.\r\n  Delete \"$QUICKLAUNCH\\InfraRecorder.lnk\"\r\n\r\n  DeleteRegKey /ifempty HKCU \"Software\\InfraRecorder\"\r\n\r\n  ; Remove InfraRecorder from Add/Remove Programs.\r\n  DeleteRegKey HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InfraRecorder\"\r\nSectionEnd\r\n!endif\r\n"
  },
  {
    "path": "src/setup/setup_nsis_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"setup_nsis\"\r\n\tProjectGUID=\"{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}\"\r\n\tRootNamespace=\"setup_nsis\"\r\n\tKeyword=\"MakeFileProj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"makensis.exe $(ProjectDir)setup_nsis.nsi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.exe&#x0D;&#x0A;makensis.exe $(ProjectDir)setup_nsis.nsi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tOutput=\"setup_nsis.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"makensis.exe $(ProjectDir)setup_nsis.nsi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.exe&#x0D;&#x0A;makensis.exe $(ProjectDir)setup_nsis.nsi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.exe\"\r\n\t\t\t\tOutput=\"setup_nsis.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\setup_nsis.nsi\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/setup/setup_nsis_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>setup_nsis</ProjectName>\n    <ProjectGuid>{B8D2451B-06E5-4EBD-8B84-3FA7492A41FF}</ProjectGuid>\n    <RootNamespace>setup_nsis</RootNamespace>\n    <Keyword>MakeFileProj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">makensis.exe $(ProjectDir)setup_nsis.nsi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir.exe</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del ..\\..\\dist\\ir.exe\nmakensis.exe $(ProjectDir)setup_nsis.nsi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir.exe</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del ..\\..\\dist\\ir.exe</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">setup_nsis.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">makensis.exe $(ProjectDir)setup_nsis.nsi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir.exe</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del ..\\..\\dist\\ir.exe\nmakensis.exe $(ProjectDir)setup_nsis.nsi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir.exe</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del ..\\..\\dist\\ir.exe</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">setup_nsis.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">C:\\Program Files (x86)\\NSIS;$(ExecutablePath)</ExecutablePath>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">C:\\Program Files (x86)\\NSIS;$(ExecutablePath)</ExecutablePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <None Include=\"setup_nsis.nsi\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\doc\\english\\help_english_vc10.vcxproj\">\n      <Project>{44e47aba-9695-4a96-bc52-53585c6aaa3c}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\app\\infrarecorder_vc10.vcxproj\">\n      <Project>{949b73ff-bd75-47c0-b965-328513c481b4}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\codecs\\sndfile\\sndfile_vc10.vcxproj\">\n      <Project>{533889c9-1598-4823-bfa9-7c97fd35d6df}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\codecs\\vorbis\\vorbis_vc10.vcxproj\">\n      <Project>{571d4215-38a0-42ce-8ab7-deee9d2154ed}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\codecs\\wma\\wma_vc10.vcxproj\">\n      <Project>{da677405-57cd-4e24-ac27-4250a4bf0d1c}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\shell\\shell_vc10.vcxproj\">\n      <Project>{a6b8e42f-4793-4995-9d63-2906375407ad}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"ir_plugin\\ir_plugin_vc10.vcxproj\">\n      <Project>{bc845f0a-9f4d-4a2f-8366-30b816498dbd}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/setup/setup_nsis_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"setup_nsis.nsi\">\n      <Filter>Source Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/setup/setup_wix.bat",
    "content": "candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\\r\nlight -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\r\n"
  },
  {
    "path": "src/setup/setup_wix.wxs",
    "content": "<?xml version=\"1.0\"?>\r\n\r\n<!--General Configuration-->\r\n<?define Arch=\"x64\"?>\r\n<?define ProductName=\"InfraRecorder\"?>\r\n<?define VerMajor=\"0\"?>\r\n<?define VerMinor=\"53\"?>\r\n<?define VerRev=\"00\"?>\r\n<?define VerBuild=\"00\"?>\r\n\r\n<!--Main Definitions-->\r\n<?if $(var.Arch)=\"x64\"?>\r\n<?define CpuId=\"2\"?>\r\n<?define ProgramFolder=\"ProgramFiles64Folder\"?>\r\n<?define VerPostStr=\" (x64 edition)\"?>\r\n<?define Is64=\"yes\"?>\r\n<?define Platforms=\"x64\"?>\r\n<?else?>\r\n<?define CpuId=\"1\"?>\r\n<?define ProgramFolder=\"ProgramFilesFolder\"?>\r\n<?define VerPostStr=\"\"?>\r\n<?define Is64=\"no\"?>\r\n<?define Platforms=\"Intel\"?>\r\n<?endif?>\r\n\r\n<!--<?define BaseId=\"2C22EA92-CB30-4933-9B67-A7A0582DBEA4\"?>-->\r\n<?define BaseId=\"2C22EA92-CB30-493$(var.CpuId)\"?>\r\n<?define BaseVerId=\"$(var.BaseId)-0$(var.VerMajor)$(var.VerMinor)-$(var.VerRev)$(var.VerBuild)\"?>\r\n<?define ProductId=\"$(var.BaseVerId)01000000\"?>\r\n<?define PackageId=\"$(var.BaseVerId)02000000\"?>\r\n<?define BaseCompId=\"$(var.BaseVerId)0300\"?>\r\n<?define UpgradeCode=\"$(var.BaseId)-0000-000004000000\"?>\r\n\r\n<!--Component IDs-->\r\n<?define CompMain=\"$(var.BaseCompId)0000\"?>\r\n<?define CompShellExt=\"$(var.BaseCompId)0002\"?>\r\n<?define CompCodecs=\"$(var.BaseCompId)0003\"?>\r\n<?define CompLang=\"$(var.BaseCompId)0004\"?>\r\n<?define CompCdrtools=\"$(var.BaseCompId)0005\"?>\r\n<?define CompDoc=\"$(var.BaseCompId)0006\"?>\r\n<?define CompHelp=\"$(var.BaseCompId)0007\"?>\r\n<?define CompEffects=\"$(var.BaseCompId)0008\"?>\r\n<?define CompShortcuts=\"$(var.BaseCompId)0100\"?>\r\n\r\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\r\n  <Product Id=\"$(var.ProductId)\"\r\n           Name=\"$(var.ProductName) $(var.VerMajor).$(var.VerMinor)$(var.VerPostStr)\"\r\n           Language=\"1033\"\r\n           Version=\"$(var.VerMajor).$(var.VerMinor).$(var.VerRev).$(var.VerBuild)\"\r\n           Manufacturer=\"Christian Kindahl\"\r\n           UpgradeCode=\"$(var.UpgradeCode)\">\r\n\r\n    <Package Id=\"$(var.PackageId)\"\r\n             Description=\"$(var.ProductName)$(var.VerPostStr)\"\r\n             Comments=\"$(var.ProductName)$(var.VerPostStr)\"\r\n             Manufacturer=\"Christian Kindahl\"\r\n             InstallerVersion=\"200\"\r\n             Compressed=\"yes\"\r\n             Platforms=\"$(var.Platforms)\"/>\r\n\r\n    <Media Id=\"1\" Cabinet=\"InfraRecorder.cab\" EmbedCab=\"yes\" CompressionLevel=\"high\"/>\r\n\r\n    <Directory Id=\"TARGETDIR\" Name=\"SourceDir\">\r\n      <!--<Directory Id=\"ProgramMenuFolder\"/>-->\r\n      <!--<Property Id=\"ALLUSERS\" Value=\"1\"/>-->\r\n\r\n      <Directory Id=\"$(var.ProgramFolder)\" Name=\"Files\">\r\n        <Directory Id=\"INSTALLDIR\" Name=\"InfraRecorder\">\r\n\r\n          <Component Id=\"Main\" Guid=\"$(var.CompMain)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n            <File Id=\"infrarecorder.exe\" Name=\"infrarecorder.exe\" Source=\"..\\..\\bin\\x64\\release\\infrarecorder.exe\"/>\r\n            <RemoveFolder Id=\"MyRemFolder\" Directory=\"InfraProgramMenu\" On=\"uninstall\"/>\r\n          </Component>\r\n\r\n          <Component Id=\"ShellExt\" Guid=\"$(var.CompShellExt)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n            <File Id=\"shell.dll\" Name=\"shell.dll\" Source=\"..\\..\\bin\\x64\\release\\shell.dll\"/>\r\n          </Component>\r\n\r\n          <Component Id=\"Effects\" Guid=\"$(var.CompEffects)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n            <File Id=\"snoke.exe\" Name=\"smoke.exe\" Source=\"..\\..\\dep\\smoke\\x64\\smoke.exe\"/>\r\n          </Component>\r\n\r\n          <Component Id=\"Doc\" Guid=\"$(var.CompDoc)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n            <File Id=\"readme.txt\" Name=\"readme.txt\" Source=\"..\\..\\readme.txt\"/>\r\n            <File Id=\"license.txt\" Name=\"license.txt\" Source=\"..\\..\\license.txt\"/>\r\n          </Component>\r\n\r\n          <Component Id=\"Help\" Guid=\"$(var.CompHelp)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n            <File Id=\"infrarecorder.chm\" Name=\"infrarecorder.chm\" Source=\"..\\..\\doc\\english\\infrarecorder.chm\"/>\r\n          </Component>\r\n\r\n          <Directory Id=\"cdrtools\" Name=\"cdrtools\">\r\n            <Component Id=\"Cdrtools\" Guid=\"$(var.CompCdrtools)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n              <File Id=\"cdda2wav.exe\" Name=\"cdda2wav.exe\" Source=\"..\\..\\dep\\cdrtools\\cdda2wav.exe\"/>\r\n              <File Id=\"cdrecord.exe\" Name=\"cdrecord.exe\" Source=\"..\\..\\dep\\cdrtools\\cdrecord.exe\"/>\r\n              <File Id=\"COPYING\" Name=\"COPYING\" Source=\"..\\..\\dep\\cdrtools\\COPYING\"/>\r\n              <File Id=\"cygwin1.dll\" Name=\"cygwin1.dll\" Source=\"..\\..\\dep\\cdrtools\\cygwin1.dll\"/>\r\n              <File Id=\"readcd.exe\" Name=\"readcd.exe\" Source=\"..\\..\\dep\\cdrtools\\readcd.exe\"/>\r\n            </Component>\r\n          </Directory>\r\n\r\n          <Directory Id=\"codecs\" Name=\"codecs\">\r\n            <Component Id=\"Codecs\" Guid=\"$(var.CompCodecs)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n              <File Id=\"wave.irc\" Name=\"wave.irc\" Source=\"..\\..\\bin\\x64\\release\\codecs\\wave.irc\"/>\r\n              <File Id=\"wma.irc\" Name=\"wma.irc\" Source=\"..\\..\\bin\\x64\\release\\codecs\\wma.irc\"/>\r\n            </Component>\r\n          </Directory>\r\n\r\n          <Directory Id=\"languages\" Name=\"languages\">\r\n            <Component Id=\"Lang\" Guid=\"$(var.CompLang)\" DiskId=\"1\" Win64=\"$(var.Is64)\">\r\n              <File Id=\"albanian.irl\" Name=\"albanian.irl\" Source=\"..\\..\\etc\\translations\\software\\albanian.irl\"/>\r\n              <File Id=\"arabic.irl\" Name=\"arabic.irl\" Source=\"..\\..\\etc\\translations\\software\\arabic.irl\"/>\r\n              <File Id=\"armenian.irl\" Name=\"armenian.irl\" Source=\"..\\..\\etc\\translations\\software\\armenian.irl\"/>\r\n              <File Id=\"basque.irl\" Name=\"basque.irl\" Source=\"..\\..\\etc\\translations\\software\\basque.irl\"/>\r\n              <File Id=\"bosnian.irl\" Name=\"bosnian.irl\" Source=\"..\\..\\etc\\translations\\software\\bosnian.irl\"/>\r\n              <File Id=\"bulgarian.irl\" Name=\"bulgarian.irl\" Source=\"..\\..\\etc\\translations\\software\\bulgarian.irl\"/>\r\n              <File Id=\"catalan.irl\" Name=\"catalan.irl\" Source=\"..\\..\\etc\\translations\\software\\catalan.irl\"/>\r\n              <File Id=\"chinese_simplified.irl\" Name=\"chinese-simplified.irl\" Source=\"..\\..\\etc\\translations\\software\\chinese-simplified.irl\"/>\r\n              <File Id=\"chinese_traditional.irl\" Name=\"chinese-traditional.irl\" Source=\"..\\..\\etc\\translations\\software\\chinese-traditional.irl\"/>\r\n              <File Id=\"chuvash.irl\" Name=\"chuvash.irl\" Source=\"..\\..\\etc\\translations\\software\\chuvash.irl\"/>\r\n              <File Id=\"croatian.irl\" Name=\"croatian.irl\" Source=\"..\\..\\etc\\translations\\software\\croatian.irl\"/>\r\n              <File Id=\"czech.irl\" Name=\"czech.irl\" Source=\"..\\..\\etc\\translations\\software\\czech.irl\"/>\r\n              <File Id=\"danish.irl\" Name=\"danish.irl\" Source=\"..\\..\\etc\\translations\\software\\danish.irl\"/>\r\n              <File Id=\"dutch.irl\" Name=\"dutch.irl\" Source=\"..\\..\\etc\\translations\\software\\dutch.irl\"/>\r\n              <File Id=\"estonian.irl\" Name=\"estonian.irl\" Source=\"..\\..\\etc\\translations\\software\\estonian.irl\"/>\r\n              <File Id=\"farsi.irl\" Name=\"farsi.irl\" Source=\"..\\..\\etc\\translations\\software\\farsi.irl\"/>\r\n              <File Id=\"finnish.irl\" Name=\"finnish.irl\" Source=\"..\\..\\etc\\translations\\software\\finnish.irl\"/>\r\n              <File Id=\"french.irl\" Name=\"french.irl\" Source=\"..\\..\\etc\\translations\\software\\french.irl\"/>\r\n              <File Id=\"galician.irl\" Name=\"galician.irl\" Source=\"..\\..\\etc\\translations\\software\\galician.irl\"/>\r\n              <File Id=\"german.irl\" Name=\"german.irl\" Source=\"..\\..\\etc\\translations\\software\\german.irl\"/>\r\n              <File Id=\"georgian.irl\" Name=\"georgian.irl\" Source=\"..\\..\\etc\\translations\\software\\georgian.irl\"/>\r\n              <File Id=\"greek.irl\" Name=\"greek.irl\" Source=\"..\\..\\etc\\translations\\software\\greek.irl\"/>\r\n              <File Id=\"hebrew.irl\" Name=\"hebrew.irl\" Source=\"..\\..\\etc\\translations\\software\\hebrew.irl\"/>\r\n              <File Id=\"hungarian.irl\" Name=\"hungarian.irl\" Source=\"..\\..\\etc\\translations\\software\\hungarian.irl\"/>\r\n              <File Id=\"indonesian.irl\" Name=\"indonesian.irl\" Source=\"..\\..\\etc\\translations\\software\\indonesian.irl\"/>\r\n              <File Id=\"italian.irl\" Name=\"italian.irl\" Source=\"..\\..\\etc\\translations\\software\\italian.irl\"/>\r\n              <File Id=\"japanese.irl\" Name=\"japanese.irl\" Source=\"..\\..\\etc\\translations\\software\\japanese.irl\"/>\r\n              <File Id=\"korean.irl\" Name=\"korean.irl\" Source=\"..\\..\\etc\\translations\\software\\korean.irl\"/>\r\n              <File Id=\"latvian.irl\" Name=\"latvian.irl\" Source=\"..\\..\\etc\\translations\\software\\latvian.irl\"/>\r\n              <File Id=\"lithuanian.irl\" Name=\"lithuanian.irl\" Source=\"..\\..\\etc\\translations\\software\\lithuanian.irl\"/>\r\n              <File Id=\"macedonian.irl\" Name=\"macedonian.irl\" Source=\"..\\..\\etc\\translations\\software\\macedonian.irl\"/>\r\n              <File Id=\"norwegian.irl\" Name=\"norwegian.irl\" Source=\"..\\..\\etc\\translations\\software\\norwegian.irl\"/>\r\n              <File Id=\"polish.irl\" Name=\"polish.irl\" Source=\"..\\..\\etc\\translations\\software\\polish.irl\"/>\r\n              <File Id=\"portuguese.irl\" Name=\"portuguese.irl\" Source=\"..\\..\\etc\\translations\\software\\portuguese.irl\"/>\r\n              <File Id=\"portuguese_brazilian.irl\" Name=\"portuguese-brazilian.irl\" Source=\"..\\..\\etc\\translations\\software\\portuguese-brazilian.irl\"/>\r\n              <File Id=\"romanian.irl\" Name=\"romanian.irl\" Source=\"..\\..\\etc\\translations\\software\\romanian.irl\"/>\r\n              <File Id=\"russian.irl\" Name=\"russian.irl\" Source=\"..\\..\\etc\\translations\\software\\russian.irl\"/>\r\n              <File Id=\"serbian_cyrillic.irl\" Name=\"serbian-cyrillic.irl\" Source=\"..\\..\\etc\\translations\\software\\serbian-cyrillic.irl\"/>\r\n              <File Id=\"serbian_latin.irl\" Name=\"serbian-latin.irl\" Source=\"..\\..\\etc\\translations\\software\\serbian-latin.irl\"/>\r\n              <File Id=\"slovak.irl\" Name=\"slovak.irl\" Source=\"..\\..\\etc\\translations\\software\\slovak.irl\"/>\r\n              <File Id=\"slovenian.irl\" Name=\"slovenian.irl\" Source=\"..\\..\\etc\\translations\\software\\slovenian.irl\"/>\r\n              <File Id=\"spanish.irl\" Name=\"spanish.irl\" Source=\"..\\..\\etc\\translations\\software\\spanish.irl\"/>\r\n              <File Id=\"swedish.irl\" Name=\"swedish.irl\" Source=\"..\\..\\etc\\translations\\software\\swedish.irl\"/>\r\n              <File Id=\"thai.irl\" Name=\"thai.irl\" Source=\"..\\..\\etc\\translations\\software\\thai.irl\"/>\r\n              <File Id=\"turkish.irl\" Name=\"turkish.irl\" Source=\"..\\..\\etc\\translations\\software\\turkish.irl\"/>\r\n              <File Id=\"ukrainian.irl\" Name=\"ukrainian.irl\" Source=\"..\\..\\etc\\translations\\software\\ukrainian.irl\"/>\r\n              <File Id=\"valencian.irl\" Name=\"valencian.irl\" Source=\"..\\..\\etc\\translations\\software\\valencian.irl\"/>\r\n              <File Id=\"vietnamese.irl\" Name=\"vietnamese.irl\" Source=\"..\\..\\etc\\translations\\software\\vietnamese.irl\"/>\r\n\r\n              <File Id=\"czech.chm\" Name=\"czech.chm\" Source=\"..\\..\\etc\\translations\\help\\czech.chm\"/>\r\n              <File Id=\"german.chm\" Name=\"german.chm\" Source=\"..\\..\\etc\\translations\\help\\german.chm\"/>\r\n              <File Id=\"french.chm\" Name=\"french.chm\" Source=\"..\\..\\etc\\translations\\help\\french.chm\"/>\r\n              <File Id=\"russian.chm\" Name=\"russian.chm\" Source=\"..\\..\\etc\\translations\\help\\russian.chm\"/>\r\n              <File Id=\"thai.chm\" Name=\"thai.chm\" Source=\"..\\..\\etc\\translations\\help\\thai.chm\"/>\r\n              <File Id=\"turkish.chm\" Name=\"turkish.chm\" Source=\"..\\..\\etc\\translations\\help\\turkish.chm\"/>\r\n              <File Id=\"ukrainian.chm\" Name=\"ukrainian.chm\" Source=\"..\\..\\etc\\translations\\help\\ukrainian.chm\"/>\r\n            </Component>\r\n          </Directory>\r\n        </Directory>\r\n      </Directory>\r\n\r\n      <Directory Id=\"ProgramMenuFolder\" Name=\"Programs\">\r\n        <Directory Id=\"InfraProgramMenu\" Name=\"InfraRecorder\"/>\r\n      </Directory>\r\n    </Directory>\r\n\r\n    <DirectoryRef Id=\"InfraProgramMenu\">\r\n      <Component Id=\"Shortcuts\" Guid=\"$(var.CompShortcuts)\">\r\n        <Shortcut Id=\"StartMenuInfraRecorderShortcut\" Name=\"InfraRecorder\"\r\n                  Target=\"[INSTALLDIR]infrarecorder.exe\"\r\n                  WorkingDirectory=\"INSTALLDIR\"/>\r\n        <Shortcut Id=\"StartMenuHelpShortcut\" Name=\"InfraRecorder Help\"\r\n                  Target=\"[INSTALLDIR]infrarecorder.chm\"\r\n                  WorkingDirectory=\"INSTALLDIR\"/>\r\n        <RemoveFolder Id=\"InfraProgramMenu\" On=\"uninstall\"/>\r\n        <RegistryValue Root=\"HKCU\" Key=\"Software\\InfraRecorder\" Name=\"installed\" Type=\"integer\" Value=\"1\" KeyPath=\"yes\"/>\r\n      </Component>\r\n    </DirectoryRef>\r\n\r\n    <Feature Id=\"Full\" Title=\"InfraRecorder\" Description=\"The complete package.\"\r\n             Display=\"expand\" Level=\"1\" ConfigurableDirectory=\"INSTALLDIR\"\r\n             Absent=\"disallow\" AllowAdvertise=\"no\">\r\n      <Feature Id=\"Program\" Title=\"Program files\" Description=\"The core files required to use InfraRecorder.\" Level=\"1\"\r\n               Absent=\"disallow\" AllowAdvertise=\"no\">\r\n        <ComponentRef Id=\"Main\"/>\r\n        <ComponentRef Id=\"ShellExt\"/>\r\n        <ComponentRef Id=\"Effects\"/>\r\n        <ComponentRef Id=\"Cdrtools\"/>\r\n        <ComponentRef Id=\"Codecs\"/>\r\n        <ComponentRef Id=\"Doc\"/>\r\n        <ComponentRef Id=\"Help\"/>\r\n        <ComponentRef Id=\"Shortcuts\"/>\r\n      </Feature>\r\n      <Feature Id=\"LanguageFiles\" Title=\"Localization files\" Description=\"Language files used for supporting different languages in InfraRecorder.\"\r\n               Level=\"1\" AllowAdvertise=\"no\">\r\n        <ComponentRef Id=\"Lang\"/>\r\n      </Feature>\r\n    </Feature>\r\n\r\n    <Property Id=\"WIXUI_INSTALLDIR\" Value=\"INSTALLDIR\"/>\r\n    <UIRef Id=\"WixUI_InstallDir\"/>\r\n    <WixVariable Id=\"WixUILicenseRtf\" Value=\"..\\..\\license.rtf\"/>\r\n\r\n    <Icon Id=\"iconmain.ico\" SourceFile=\"..\\..\\src\\app\\resources\\icon-main.ico\"/>\r\n    <Property Id=\"ARPPRODUCTICON\" Value=\"iconmain.ico\"/>\r\n\r\n  </Product>\r\n</Wix>\r\n"
  },
  {
    "path": "src/setup/setup_wix_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"setup_wix\"\r\n\tProjectGUID=\"{295627F8-6235-4E9D-992F-F200A7F40173}\"\r\n\tRootNamespace=\"setup_wix\"\r\n\tKeyword=\"MakeFileProj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj&#x0D;&#x0A;candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj\"\r\n\t\t\t\tOutput=\"setup_wix.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj&#x0D;&#x0A;candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj\"\r\n\t\t\t\tOutput=\"setup_wix.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj&#x0D;&#x0A;candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj\"\r\n\t\t\t\tOutput=\"setup_wix.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCNMakeTool\"\r\n\t\t\t\tBuildCommandLine=\"candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tReBuildCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj&#x0D;&#x0A;candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi&#x0D;&#x0A;call ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi\"\r\n\t\t\t\tCleanCommandLine=\"del ..\\..\\dist\\ir.msi&#x0D;&#x0A;del ..\\..\\dist\\ir.wixpdb&#x0D;&#x0A;del ..\\..\\obj\\setup_wix\\setup_wix.wixobj\"\r\n\t\t\t\tOutput=\"setup_wix.exe\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG\"\r\n\t\t\t\tIncludeSearchPath=\"\"\r\n\t\t\t\tForcedIncludes=\"\"\r\n\t\t\t\tAssemblySearchPath=\"\"\r\n\t\t\t\tForcedUsingAssemblies=\"\"\r\n\t\t\t\tCompileAsManaged=\"\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\setup_wix.wxs\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/setup/setup_wix_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>setup_wix</ProjectName>\n    <ProjectGuid>{295627F8-6235-4E9D-992F-F200A7F40173}</ProjectGuid>\n    <RootNamespace>setup_wix</RootNamespace>\n    <Keyword>MakeFileProj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Makefile</ConfigurationType>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj\ncandle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">setup_wix.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj\ncandle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">setup_wix.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj\ncandle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">setup_wix.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <NMakeBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">candle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeBuildCommandLine>\n    <NMakeReBuildCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj\ncandle setup_wix.wxs -out ..\\..\\obj\\setup_wix\\ &amp;&amp; light -ext WixUIExtension -cultures:en-us ..\\..\\obj\\setup_wix\\setup_wix.wixobj -out ..\\..\\dist\\ir_x64.msi\ncall ..\\..\\sign.bat ..\\..\\dist\\ir_x64.msi</NMakeReBuildCommandLine>\n    <NMakeCleanCommandLine Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">del ..\\..\\dist\\ir.msi\ndel ..\\..\\dist\\ir.wixpdb\ndel ..\\..\\obj\\setup_wix\\setup_wix.wixobj</NMakeCleanCommandLine>\n    <NMakeOutput Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">setup_wix.exe</NMakeOutput>\n    <NMakePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>\n    <NMakeIncludeSearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(NMakeIncludeSearchPath)</NMakeIncludeSearchPath>\n    <NMakeForcedIncludes Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(NMakeForcedIncludes)</NMakeForcedIncludes>\n    <NMakeAssemblySearchPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>\n    <NMakeForcedUsingAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">C:\\Program Files (x86)\\Windows Installer XML v3.5\\bin;$(ExecutablePath)</ExecutablePath>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">C:\\Program Files (x86)\\Windows Installer XML v3.5\\bin;$(ExecutablePath)</ExecutablePath>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">C:\\Program Files (x86)\\Windows Installer XML v3.5\\bin;$(ExecutablePath)</ExecutablePath>\n    <ExecutablePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">C:\\Program Files (x86)\\Windows Installer XML v3.5\\bin;$(ExecutablePath)</ExecutablePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <None Include=\"setup_wix.wxs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\doc\\english\\help_english_vc10.vcxproj\">\n      <Project>{44e47aba-9695-4a96-bc52-53585c6aaa3c}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\app\\infrarecorder_vc10.vcxproj\">\n      <Project>{949b73ff-bd75-47c0-b965-328513c481b4}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\codecs\\wave\\wave_vc10.vcxproj\">\n      <Project>{1a7358f8-3f30-4079-8bab-9399b76b5187}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\codecs\\wma\\wma_vc10.vcxproj\">\n      <Project>{da677405-57cd-4e24-ac27-4250a4bf0d1c}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\shell\\shell_vc10.vcxproj\">\n      <Project>{a6b8e42f-4793-4995-9d63-2906375407ad}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/setup/setup_wix_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"setup_wix.wxs\">\n      <Filter>Source Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/shell/lang_util.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings.hh\"\r\n#include \"string_table.hh\"\r\n\r\nTCHAR *lngGetString(unsigned int uiID)\r\n{\r\n    // Try to load translated string.\r\n    if (g_LanguageSettings.m_pLngProcessor != NULL)\r\n    {\r\n        // Make sure that there is a main translation section.\r\n        if (g_LanguageSettings.m_pLngProcessor->EnterSection(_T(\"shell\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            if (g_LanguageSettings.m_pLngProcessor->GetValuePtr(uiID,szStrValue))\r\n                return szStrValue;\r\n        }\r\n    }\r\n\r\n    // Load internal (English) string.\r\n    return g_szStringTable[uiID];\r\n}\r\n\r\nint lngMessageBox(HWND hWnd,unsigned int uiTextID,unsigned int uiCaptionID,unsigned int uiType)\r\n{\r\n    return MessageBox(hWnd,lngGetString(uiTextID),lngGetString(uiCaptionID),uiType);\r\n}\r\n"
  },
  {
    "path": "src/shell/lang_util.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\nTCHAR *lngGetString(unsigned int uiID);\r\nint lngMessageBox(HWND hWnd,unsigned int uiTextID,unsigned int uiCaptionID,unsigned int uiType);\r\n"
  },
  {
    "path": "src/shell/readme.txt",
    "content": "Important note to VC7 and VC8 users:\r\n * You may need to change the order of the default include paths in order to\r\n   compile the project. Make sure that $(VCInstallDir)PlatformSDK\\include\r\n   is above ($VCInstallDir)include in the list.\r\n"
  },
  {
    "path": "src/shell/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by shell.rc\r\n//\r\n#define IDS_PROJNAME                    100\r\n#define IDR_SHELL                       101\r\n#define IDR_SHELLEXT                    102\r\n#define IDB_BITMAP1                     201\r\n#define IDB_BURNBITMAP                  201\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        202\r\n#define _APS_NEXT_COMMAND_VALUE         32768\r\n#define _APS_NEXT_CONTROL_VALUE         201\r\n#define _APS_NEXT_SYMED_VALUE           103\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/shell/settings.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/file.hh>\r\n#include \"settings.hh\"\r\n\r\nCLanguageSettings g_LanguageSettings;\r\nCGlobalSettings g_GlobalSettings;\r\n\r\nbool CLanguageSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Language\")))\r\n        return false;\r\n\r\n    pXml->GetSafeElementData(_T(\"LanguageFile\"),m_szLanguageFile,MAX_PATH - 1);\r\n\r\n    // Calculate full path.\r\n    TCHAR szFullPath[MAX_PATH];\r\n    ::GetModuleFileName(NULL,szFullPath,MAX_PATH - 1);\r\n    ExtractFilePath(szFullPath);\r\n    lstrcat(szFullPath,_T(\"Languages\\\\\"));\r\n    lstrcat(szFullPath,m_szLanguageFile);\r\n\r\n    if (ckcore::File::exist(szFullPath))\r\n    {\r\n        m_pLngProcessor = new CLngProcessor(szFullPath);\r\n        m_pLngProcessor->Load();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n\r\nbool CGlobalSettings::Load(CXmlProcessor *pXml)\r\n{\r\n    if (pXml == NULL)\r\n        return false;\r\n\r\n    if (!pXml->EnterElement(_T(\"Global\")))\r\n        return false;\r\n\r\n    // Shell extension.\r\n    if (pXml->EnterElement(_T(\"ShellExtension\")))\r\n    {\r\n        pXml->GetSafeElementAttrValue(_T(\"submenu\"),&m_bShellExtSubMenu);\r\n        pXml->GetSafeElementAttrValue(_T(\"icons\"),&m_bShellExtIcon);\r\n\r\n        pXml->LeaveElement();\r\n    }\r\n\r\n    pXml->LeaveElement();\r\n    return true;\r\n}\r\n"
  },
  {
    "path": "src/shell/settings.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <base/xml_processor.hh>\r\n#include <base/lng_processor.hh>\r\n\r\nclass ISettings\r\n{\r\npublic:\r\n    virtual bool Load(CXmlProcessor *pXml) = 0;\r\n};\r\n\r\nclass CLanguageSettings : public ISettings\r\n{\r\npublic:\r\n    TCHAR m_szLanguageFile[MAX_PATH];\r\n    CLngProcessor *m_pLngProcessor;\r\n\r\n    CLanguageSettings()\r\n    {\r\n        m_szLanguageFile[0] = '\\0';\r\n        m_pLngProcessor = NULL;\r\n    }\r\n\r\n    ~CLanguageSettings()\r\n    {\r\n        if (m_pLngProcessor != NULL)\r\n        {\r\n            delete m_pLngProcessor;\r\n            m_pLngProcessor = NULL;\r\n        }\r\n    }\r\n\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nclass CGlobalSettings : public ISettings\r\n{\r\npublic:\r\n    // Shell extension.\r\n    bool m_bShellExtSubMenu;\r\n    bool m_bShellExtIcon;\r\n\r\n    CGlobalSettings()\r\n    {\r\n        // Shell extension.\r\n        m_bShellExtSubMenu = false;\r\n        m_bShellExtIcon = true;\r\n    }\r\n\r\n    bool Load(CXmlProcessor *pXml);\r\n};\r\n\r\nextern CLanguageSettings g_LanguageSettings;\r\nextern CGlobalSettings g_GlobalSettings;\r\n"
  },
  {
    "path": "src/shell/settings_manager.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/directory.hh>\r\n#include <base/string_util.hh>\r\n#include <base/xml_processor.hh>\r\n#include \"settings_manager.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n\r\nCSettingsManager g_SettingsManager;\r\n\r\nCSettingsManager::CSettingsManager()\r\n{\r\n    RegisterObject(&g_LanguageSettings);\r\n    RegisterObject(&g_GlobalSettings);\r\n}\r\n\r\nCSettingsManager::~CSettingsManager()\r\n{\r\n    m_Settings.clear();\r\n}\r\n\r\nvoid CSettingsManager::RegisterObject(ISettings *pSettings)\r\n{\r\n    m_Settings.push_back(pSettings);\r\n}\r\n\r\nbool CSettingsManager::GetConfigPath(TCHAR *szConfigPath)\r\n{\r\n#ifdef PORTABLE\r\n    GetModuleFileName(NULL,szConfigPath,MAX_PATH - 1);\r\n    ExtractFilePath(szConfigPath);\r\n#else\r\n    if (!SUCCEEDED(SHGetFolderPath(HWND_DESKTOP,CSIDL_APPDATA | CSIDL_FLAG_CREATE,NULL,\r\n        SHGFP_TYPE_CURRENT,szConfigPath)))\r\n        return false;\r\n\r\n    IncludeTrailingBackslash(szConfigPath);\r\n    lstrcat(szConfigPath,_T(\"InfraRecorder\\\\\"));\r\n\r\n    // Create the file path if it doesn't exist.\r\n    ckcore::Directory::create(szConfigPath);\r\n#endif\r\n\r\n    lstrcat(szConfigPath,_T(\"settings.xml\"));\r\n    return true;\r\n}\r\n\r\nbool CSettingsManager::Load()\r\n{\r\n    CXmlProcessor Xml;\r\n    bool bResult = true;\r\n\r\n    // Get the correct file-path.\r\n    TCHAR szConfigPath[MAX_PATH];\r\n    if (!GetConfigPath(szConfigPath))\r\n        return false;\r\n\r\n    // Load the file.\r\n    int iResult = Xml.Load(szConfigPath);\r\n    if (iResult != XMLRES_OK && iResult != XMLRES_FILEERROR)\r\n        return false;\r\n\r\n    if (!Xml.EnterElement(_T(\"InfraRecorder\")))\r\n        return false;\r\n\r\n    if (!Xml.EnterElement(_T(\"Settings\")))\r\n        return false;\r\n\r\n    for (unsigned int i = 0; i < m_Settings.size(); i++)\r\n    {\r\n        if (!m_Settings[i]->Load(&Xml))\r\n            bResult = false;\r\n    }\r\n\r\n    Xml.LeaveElement();\r\n    Xml.LeaveElement();\r\n\r\n    return bResult;\r\n}\r\n"
  },
  {
    "path": "src/shell/settings_manager.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <vector>\r\n#include \"settings.hh\"\r\n\r\nclass CSettingsManager\r\n{\r\nprivate:\r\n    std::vector<ISettings *> m_Settings;\r\n\r\n    void RegisterObject(ISettings *pSettings);\r\n\r\n    bool GetConfigPath(TCHAR *szConfigPath);\r\n\r\npublic:\r\n    CSettingsManager();\r\n    ~CSettingsManager();\r\n\r\n    bool Load();\r\n};\r\n\r\nextern CSettingsManager g_SettingsManager;\r\n"
  },
  {
    "path": "src/shell/shell.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"shell.hh\"\r\n\r\nclass CShellModule : public CAtlDllModuleT<CShellModule>\r\n{\r\npublic :\r\n    DECLARE_LIBID(LIBID_ShellLib)\r\n    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SHELL,\"{8E8DAC3C-E7C5-4495-9903-430C1F38CF86}\")\r\n};\r\n\r\nCShellModule _AtlModule;\r\nHINSTANCE g_DllInstance = NULL;\r\n\r\nextern \"C\" BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)\r\n{\r\n    g_DllInstance = hInstance;\r\n    return _AtlModule.DllMain(dwReason,lpReserved); \r\n}\r\n\r\n/*\r\n    DllCanUnloadNow\r\n    ---------------\r\n    Used to determine whether the DLL can be unloaded by OLE.\r\n*/\r\nSTDAPI DllCanUnloadNow()\r\n{\r\n    return _AtlModule.DllCanUnloadNow();\r\n}\r\n\r\n/*\r\n    DllGetClassObject\r\n    -----------------\r\n    Returns a class factory to create an object of the requested type.\r\n*/\r\nSTDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppv)\r\n{\r\n    return _AtlModule.DllGetClassObject(rclsid,riid,ppv);\r\n}\r\n\r\n/*\r\n    DllRegisterServer\r\n    -----------------\r\n    Adds entries to the system registry.\r\n*/\r\nSTDAPI DllRegisterServer()\r\n{\r\n    HRESULT hr = _AtlModule.DllRegisterServer(FALSE);\r\n    return hr;\r\n}\r\n\r\n/*\r\n    DllUnregisterServer\r\n    -------------------\r\n    Removes entries from the system registry.\r\n*/\r\nSTDAPI DllUnregisterServer()\r\n{\r\n    HRESULT hr = _AtlModule.DllUnregisterServer(FALSE);\r\n    return hr;\r\n}\r\n"
  },
  {
    "path": "src/shell/shell.def",
    "content": "; shell.def : Declares the module parameters.\r\n\r\nLIBRARY      \"shell.DLL\"\r\n\r\nEXPORTS\r\n\tDllCanUnloadNow\t\tPRIVATE\r\n\tDllGetClassObject\tPRIVATE\r\n\tDllRegisterServer\tPRIVATE\r\n\tDllUnregisterServer\tPRIVATE\r\n"
  },
  {
    "path": "src/shell/shell.idl",
    "content": "// shell.idl : IDL source for shell\r\n//\r\n\r\n// This file will be processed by the MIDL tool to\r\n// produce the type library (shell.tlb) and marshalling code.\r\n\r\nimport \"oaidl.idl\";\r\nimport \"ocidl.idl\";\r\n\r\n[\r\n\tobject,\r\n\tuuid(02CEB95B-2C12-40CD-A434-D9F699F4B1AA),\r\n\thelpstring(\"IShellExt Interface\"),\r\n\tpointer_default(unique)\r\n]\r\ninterface IShellExt : IUnknown{\r\n};\r\n[\r\n\tuuid(D346209A-7395-4EBF-BFC2-E16294570A1B),\r\n\tversion(1.0),\r\n\thelpstring(\"Shell 1.0 Type Library\")\r\n]\r\nlibrary ShellLib\r\n{\r\n\timportlib(\"stdole2.tlb\");\r\n\t[\r\n\t\tuuid(7022C5BB-445E-4300-99F2-0B7EDA907A53),\r\n\t\thelpstring(\"ShellExt Class\")\r\n\t]\r\n\tcoclass ShellExt\r\n\t{\r\n\t\t[default] interface IShellExt;\r\n\t};\r\n};\r\n"
  },
  {
    "path": "src/shell/shell.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"winres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Swedish (Sweden) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)\r\nLANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH\r\n#pragma code_page(1252)\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"winres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n FILEVERSION 0,53,0,0\r\n PRODUCTVERSION 0,53,0,0\r\n FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n FILEFLAGS 0x1L\r\n#else\r\n FILEFLAGS 0x0L\r\n#endif\r\n FILEOS 0x4L\r\n FILETYPE 0x2L\r\n FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"FileDescription\", \"InfraRecorder Shell Extension\"\r\n            VALUE \"FileVersion\", \"0.53.0.0\"\r\n            VALUE \"InternalName\", \"shell.dll\"\r\n            VALUE \"LegalCopyright\", \"Copyright  2006-2012 Christian Kindahl\"\r\n            VALUE \"OriginalFilename\", \"shell.dll\"\r\n            VALUE \"ProductName\", \"InfraRecorder Shell Extension\"\r\n            VALUE \"ProductVersion\", \"0.53.0.0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// REGISTRY\r\n//\r\n\r\nIDR_SHELL               REGISTRY                \"shell.rgs\"\r\nIDR_SHELLEXT            REGISTRY                \"shell_ext.rgs\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Bitmap\r\n//\r\n\r\nIDB_BURNBITMAP          BITMAP                  \"Resources\\\\icon-burn.bmp\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// String Table\r\n//\r\n\r\nSTRINGTABLE\r\nBEGIN\r\n    IDS_PROJNAME            \"shell\"\r\nEND\r\n\r\n#endif    // Swedish (Sweden) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n"
  },
  {
    "path": "src/shell/shell.rgs",
    "content": "HKCR\r\n{\r\n\tNoRemove AppID\r\n\t{\r\n\t\t'%APPID%' = s 'shell'\r\n\t\t'shell.DLL'\r\n\t\t{\r\n\t\t\tval AppID = s '%APPID%'\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/shell/shell.vcproj.vspscc",
    "content": "﻿\"\"\r\n{\r\n\"FILE_VERSION\" = \"9237\"\r\n\"ENLISTMENT_CHOICE\" = \"NEVER\"\r\n\"PROJECT_FILE_RELATIVE_PATH\" = \"\"\r\n\"NUMBER_OF_EXCLUDED_FILES\" = \"1\"\r\n\"EXCLUDED_FILE0\" = \"irShell_i.c\"\r\n\"ORIGINAL_PROJECT_FILE_PATH\" = \"\"\r\n\"NUMBER_OF_NESTED_PROJECTS\" = \"0\"\r\n\"SOURCE_CONTROL_SETTINGS_PROVIDER\" = \"PROJECT\"\r\n}\r\n"
  },
  {
    "path": "src/shell/shell_ext.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include <ckcore/types.hh>\r\n#include <base/string_util.hh>\r\n#include \"shell_ext.hh\"\r\n#include \"string_table.hh\"\r\n#include \"lang_util.hh\"\r\n#include \"settings_manager.hh\"\r\n\r\nCShellExt::CShellExt()\r\n{\r\n    // Load the configuration.\r\n    g_SettingsManager.Load();\r\n\r\n    // Load bitmaps.\r\n    m_hBurnBitmap = LoadBitmap(g_DllInstance,MAKEINTRESOURCE(IDB_BURNBITMAP));\r\n}\r\n\r\nCShellExt::~CShellExt()\r\n{\r\n    // Unload bitmaps.\r\n    if (m_hBurnBitmap != NULL)\r\n        DeleteObject(m_hBurnBitmap);\r\n}\r\n\r\nHRESULT CShellExt::FinalConstruct()\r\n{\r\n    return S_OK;\r\n}\r\n    \r\nvoid CShellExt::FinalRelease() \r\n{\r\n}\r\n\r\n/*\r\n    CShellExt::IsSeparatorItem\r\n    ----------------------------\r\n    Checks if the specified menu item is a separator and returns true if it is\r\n    and false otherwise.\r\n*/\r\nbool CShellExt::IsSeparatorItem(HMENU hMenu,unsigned int uiPosition)\r\n{\r\n    MENUITEMINFO mii;\r\n    memset(&mii,0,sizeof(MENUITEMINFO));\r\n    mii.cbSize = sizeof(MENUITEMINFO);\r\n    mii.fMask = MIIM_TYPE;\r\n\r\n    ::GetMenuItemInfo(hMenu,uiPosition,TRUE,&mii);\r\n\r\n    return mii.fType == MFT_SEPARATOR;\r\n}\r\n\r\n/*\r\n    CShellExt::IsProjectFile\r\n    --------------------------\r\n    Determines wheter the specified file is a project file or not. The function\r\n    returns true if it is a project file, false otherwise.\r\n*/\r\nbool CShellExt::IsProjectFile(const TCHAR *szFileName)\r\n{\r\n    ckcore::Path FilePath(szFileName);\r\n    return !lstrcmpi(FilePath.ext_name().c_str(),ckT(\"irp\"));\r\n}\r\n\r\nSTDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pidlFolder,\r\n                                   LPDATAOBJECT pDataObj,HKEY hProgID)\r\n{\r\n    FORMATETC fmt = { CF_HDROP,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL };\r\n    STGMEDIUM stg = { TYMED_HGLOBAL };\r\n\r\n    // Check if there is any CF_HDROP data in the data object.\r\n    if (FAILED(pDataObj->GetData(&fmt,&stg)))\r\n        return E_INVALIDARG;\r\n\r\n    // Get pointer to data.\r\n    HDROP hDrop = (HDROP)GlobalLock(stg.hGlobal);\r\n    if (hDrop == NULL)\r\n        return E_INVALIDARG;\r\n\r\n    // Get file name.\r\n    unsigned int uiNumFiles = DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n    HRESULT hResult = E_INVALIDARG;\r\n    \r\n    if (uiNumFiles > 0)\r\n    {\r\n        if (DragQueryFile(hDrop,0,m_szFileName,MAX_PATH - 1))\r\n        {\r\n            hResult = S_OK;\r\n\r\n            // Check if we're dealing with a project file.\r\n            m_bIsProject = IsProjectFile(m_szFileName);\r\n        }\r\n    }\r\n\r\n    GlobalUnlock(stg.hGlobal);\r\n    ReleaseStgMedium(&stg);\r\n\r\n    return hResult;\r\n}\r\n\r\n/*\r\n    CShellExt::FillProjectMenu\r\n    ----------------------------\r\n    Fills the menu with project related items and retursn the next menu index to\r\n    be used by any following menu items.\r\n*/\r\nunsigned int CShellExt::FillProjectMenu(HMENU hMenu,unsigned int uiMenuIndex,\r\n                                        unsigned int uiFirstCmd)\r\n{\r\n    // Burn project.\r\n    InsertMenu(hMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiFirstCmd++,lngGetString(MENU_BURNPROJECT));\r\n    if (g_GlobalSettings.m_bShellExtIcon)\r\n        SetMenuItemBitmaps(hMenu,uiMenuIndex,MF_BYPOSITION,m_hBurnBitmap,NULL);\r\n    uiMenuIndex++;\r\n\r\n    // Open project.\r\n    InsertMenu(hMenu,uiMenuIndex++,MF_STRING | MF_BYPOSITION,uiFirstCmd++,lngGetString(MENU_OPENPROJECT));\r\n    \r\n    return uiMenuIndex;\r\n}\r\n\r\n/*\r\n    CShellExt::FillDiscImageMenu\r\n    ------------------------------\r\n    Fills the menu with disc image related items and returns the next menu index\r\n    to be used by any following menu items.\r\n*/\r\nunsigned int CShellExt::FillDiscImageMenu(HMENU hMenu,unsigned int uiMenuIndex,\r\n                                          unsigned int uiFirstCmd)\r\n{\r\n    // Burn image.\r\n    InsertMenu(hMenu,uiMenuIndex,MF_STRING | MF_BYPOSITION,uiFirstCmd++,lngGetString(MENU_BURNIMAGE));\r\n    if (g_GlobalSettings.m_bShellExtIcon)\r\n        SetMenuItemBitmaps(hMenu,uiMenuIndex,MF_BYPOSITION,m_hBurnBitmap,NULL);\r\n    uiMenuIndex++;\r\n\r\n    return uiMenuIndex;\r\n}\r\n\r\nHRESULT CShellExt::QueryContextMenu(HMENU hmenu,UINT uMenuIndex,UINT uidFirstCmd,\r\n                                    UINT uidLastCmd,UINT uFlags)\r\n{\r\n    // Check if we should add any items.\r\n    if (uFlags & CMF_DEFAULTONLY)\r\n        return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,0);\r\n\r\n    unsigned int uiFirstMenuIndex = uMenuIndex;\r\n\r\n    // If the item before our item is not a separator we add a new separator.\r\n    if (!IsSeparatorItem(hmenu,uMenuIndex - 1))\r\n        InsertMenu(hmenu,uMenuIndex++,MF_SEPARATOR | MF_BYPOSITION,0,NULL);\r\n\r\n    // Should we add the menu items in a submenu?\r\n    if (g_GlobalSettings.m_bShellExtSubMenu)\r\n    {\r\n        HMENU hPopupMenu = CreatePopupMenu();\r\n\r\n        if (m_bIsProject)\r\n            FillProjectMenu(hPopupMenu,0,uidFirstCmd);\r\n        else\r\n            FillDiscImageMenu(hPopupMenu,0,uidFirstCmd);\r\n\r\n        InsertMenu(hmenu,uMenuIndex++,MF_BYPOSITION | MF_POPUP,(UINT_PTR)hPopupMenu,_T(\"InfraRecorder\"));\r\n    }\r\n    else\r\n    {\r\n        if (m_bIsProject)\r\n            uMenuIndex = FillProjectMenu(hmenu,uMenuIndex,uidFirstCmd);\r\n        else\r\n            uMenuIndex = FillDiscImageMenu(hmenu,uMenuIndex,uidFirstCmd);\r\n    }\r\n\r\n    // If the item below our items is not a separator we add a new separator.\r\n    if ((unsigned int)GetMenuItemCount(hmenu) > uMenuIndex)\r\n    {\r\n        if (!IsSeparatorItem(hmenu,uMenuIndex))\r\n            InsertMenu(hmenu,uMenuIndex++,MF_SEPARATOR | MF_BYPOSITION,0,NULL);\r\n    }\r\n\r\n    return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,uMenuIndex - uiFirstMenuIndex);\r\n}\r\n\r\nHRESULT CShellExt::GetProjectCommandString(LPSTR pszName,UINT cchMax,bool bUnicode,\r\n                                           UINT_PTR uiID)\r\n{\r\nUSES_CONVERSION;\r\n\r\n    switch (uiID)\r\n    {\r\n        case 0:\r\n            if (bUnicode)\r\n                lstrcpynW((LPWSTR)pszName,T2CW(lngGetString(HINT_BURNPROJECT)),cchMax);\r\n            else\r\n                lstrcpynA(pszName,T2CA(lngGetString(HINT_BURNPROJECT)),cchMax);\r\n\r\n            return S_OK;\r\n\r\n        case 1:\r\n            if (bUnicode)\r\n                lstrcpynW((LPWSTR)pszName,T2CW(lngGetString(HINT_OPENPROJECT)),cchMax);\r\n            else\r\n                lstrcpynA(pszName,T2CA(lngGetString(HINT_OPENPROJECT)),cchMax);\r\n\r\n            return S_OK;\r\n    }\r\n\r\n    return E_INVALIDARG;\r\n}\r\n\r\nHRESULT CShellExt::GetDiscImageCommandString(LPSTR pszName,UINT cchMax,bool bUnicode,\r\n                                             UINT_PTR uiID)\r\n{\r\nUSES_CONVERSION;\r\n\r\n    switch (uiID)\r\n    {\r\n        case 0:\r\n            if (bUnicode)\r\n                lstrcpynW((LPWSTR)pszName,T2CW(lngGetString(HINT_BURNIMAGE)),cchMax);\r\n            else\r\n                lstrcpynA(pszName,T2CA(lngGetString(HINT_BURNIMAGE)),cchMax);\r\n\r\n            return S_OK;\r\n    }\r\n\r\n    return E_INVALIDARG;\r\n}\r\n\r\nHRESULT CShellExt::GetCommandString(UINT_PTR idCmd,UINT uFlags,UINT *pwReserved,\r\n                                    LPSTR pszName,UINT cchMax)\r\n{\r\n    // Currently only help strings are supported/supplied.\r\n    if (uFlags & GCS_HELPTEXT)\r\n    {\r\n        if (m_bIsProject)\r\n            return GetProjectCommandString(pszName,cchMax,(uFlags & GCS_UNICODE) != 0,idCmd);\r\n        else\r\n            return GetDiscImageCommandString(pszName,cchMax,(uFlags & GCS_UNICODE) != 0,idCmd);\r\n    }\r\n\r\n    return E_INVALIDARG;\r\n}\r\n\r\nHRESULT CShellExt::InvokeProjectCommand(HWND hWnd,unsigned int uiID)\r\n{\r\n    TCHAR szParam[MAX_PATH];\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(g_DllInstance,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,_T(\"InfraRecorder.exe\"));\r\n\r\n    switch (uiID)\r\n    {\r\n        case 0:\t\t// Burn project.\r\n            lstrcpy(szParam,_T(\"-burnproject \"));\r\n            lstrcat(szParam,m_szFileName);\r\n\r\n            ShellExecute(HWND_DESKTOP,_T(\"open\"),szFileName,szParam,NULL,SW_SHOWDEFAULT);\r\n            return S_OK;\r\n\r\n        case 1:\t\t// Open project.\r\n            ShellExecute(HWND_DESKTOP,_T(\"open\"),szFileName,m_szFileName,NULL,SW_SHOWDEFAULT);\r\n            return S_OK;\r\n    }\r\n\r\n    return E_INVALIDARG;\r\n}\r\n\r\nHRESULT CShellExt::InvokeDiscImageCommand(HWND hWnd,unsigned int uiID)\r\n{\r\n    TCHAR szParam[MAX_PATH];\r\n    TCHAR szFileName[MAX_PATH];\r\n    GetModuleFileName(g_DllInstance,szFileName,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szFileName);\r\n    lstrcat(szFileName,_T(\"InfraRecorder.exe\"));\r\n\r\n    switch (uiID)\r\n    {\r\n        case 0:\t\t// Burn image.\r\n            lstrcpy(szParam,_T(\"-burnimage \"));\r\n            lstrcat(szParam,m_szFileName);\r\n\r\n            ShellExecute(HWND_DESKTOP,_T(\"open\"),szFileName,szParam,NULL,SW_SHOWDEFAULT);\r\n            return S_OK;\r\n    }\r\n\r\n    return E_INVALIDARG;\r\n}\r\n\r\nHRESULT CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO pCmdInfo)\r\n{\r\n    // Abort if lpVerb points to a string.\r\n    if (HIWORD(pCmdInfo->lpVerb) != 0)\r\n        return E_INVALIDARG;\r\n\r\n    if (m_bIsProject)\r\n        return InvokeProjectCommand(pCmdInfo->hwnd,LOWORD(pCmdInfo->lpVerb));\r\n    else\r\n        return InvokeDiscImageCommand(pCmdInfo->hwnd,LOWORD(pCmdInfo->lpVerb));\r\n}\r\n"
  },
  {
    "path": "src/shell/shell_ext.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <shlobj.h>\r\n#include <comdef.h>\r\n#include \"resource.h\"\r\n#include \"shell.hh\"\r\n\r\nclass ATL_NO_VTABLE CShellExt : \r\n    public CComObjectRootEx<CComSingleThreadModel>,\r\n    public CComCoClass<CShellExt,&CLSID_ShellExt>,\r\n    public IShellExtInit,\r\n    public IContextMenu\r\n{\r\nprivate:\r\n    // Is set to true if the selected file is an InfraRecorder project.\r\n    bool m_bIsProject;\r\n\r\n    // Bitmaps.\r\n    HBITMAP m_hBurnBitmap;\r\n\r\n    bool IsSeparatorItem(HMENU hMenu,unsigned int uiPosition);\r\n    bool IsProjectFile(const TCHAR *szFileName);\r\n\r\n    unsigned int FillProjectMenu(HMENU hMenu,unsigned int uiMenuIndex,unsigned int uiFirstCmd);\r\n    unsigned int FillDiscImageMenu(HMENU hMenu,unsigned int uiMenuIndex,unsigned int uiFirstCmd);\r\n\r\n    HRESULT GetProjectCommandString(LPSTR pszName,UINT cchMax,bool bUnicode,UINT_PTR uiID);\r\n    HRESULT GetDiscImageCommandString(LPSTR pszName,UINT cchMax,bool bUnicode,UINT_PTR uiID);\r\n\r\n    HRESULT InvokeProjectCommand(HWND hWnd,unsigned int uiID);\r\n    HRESULT InvokeDiscImageCommand(HWND hWnd,unsigned int uiID);\r\n\r\nprotected:\r\n    TCHAR m_szFileName[MAX_PATH];\r\n\r\npublic:\r\n    CShellExt();\r\n    ~CShellExt();\r\n\r\n    DECLARE_REGISTRY_RESOURCEID(IDR_SHELLEXT)\r\n\r\n    DECLARE_NOT_AGGREGATABLE(CShellExt)\r\n\r\n    BEGIN_COM_MAP(CShellExt)\r\n        COM_INTERFACE_ENTRY(IShellExtInit)\r\n        COM_INTERFACE_ENTRY(IContextMenu)\r\n    END_COM_MAP()\r\n\r\n    DECLARE_PROTECT_FINAL_CONSTRUCT()\r\n\r\n    HRESULT FinalConstruct();\t\r\n    void FinalRelease();\r\n\r\n    // IShellExtInit.\r\n    STDMETHODIMP Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT pDataObj,HKEY hProgID);\r\n\r\n    // IContextMenu.\r\n    STDMETHODIMP QueryContextMenu(HMENU hmenu,UINT uMenuIndex,UINT uidFirstCmd,\r\n        UINT uidLastCmd,UINT uFlags);\r\n    STDMETHODIMP GetCommandString(UINT_PTR idCmd,UINT uFlags,UINT *pwReserved,\r\n        LPSTR pszName,UINT cchMax);\r\n    STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO pCmdInfo);\r\n};\r\n\r\nOBJECT_ENTRY_AUTO(__uuidof(ShellExt),CShellExt)\r\n"
  },
  {
    "path": "src/shell/shell_ext.rgs",
    "content": "HKCR\r\n{\r\n\tNoRemove CLSID\r\n\t{\r\n\t\tForceRemove {7022C5BB-445E-4300-99F2-0B7EDA907A53} = s 'ShellExt Class'\r\n\t\t{\r\n\t\t\tInprocServer32 = s '%MODULE%'\r\n\t\t\t{\r\n\t\t\t\tval ThreadingModel = s 'Apartment'\r\n\t\t\t}\r\n\t\t\tval AppID = s '%APPID%'\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/shell/shell_ps.def",
    "content": "\r\nLIBRARY      \"irShellPS\"\r\n\r\nEXPORTS\r\n\tDllGetClassObject       PRIVATE\r\n\tDllCanUnloadNow         PRIVATE\r\n\tGetProxyDllInfo         PRIVATE\r\n\tDllRegisterServer\t\tPRIVATE\r\n\tDllUnregisterServer\t\tPRIVATE\r\n"
  },
  {
    "path": "src/shell/shell_ps_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"shell_ps\"\r\n\tProjectGUID=\"{2BF62A6B-B632-4DF4-AC25-F29FEA93E3E0}\"\r\n\tRootNamespace=\"shell_ps\"\r\n\tKeyword=\"AtlPSProj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"DebugPS\"\r\n\t\t\tIntermediateDirectory=\"DebugPS\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"ReleasePS\"\r\n\t\t\tIntermediateDirectory=\"ReleasePS\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"3\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"3\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseA|Win32\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseA|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"3\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\tOutputDirectory=\"$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"3\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\tOutputDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Checking for required files\"\r\n\t\t\t\tCommandLine=\"if exist dlldata.c goto :END&#x0D;&#x0A;echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.&#x0D;&#x0A;Exit 1&#x0D;&#x0A;:END&#x0D;&#x0A;\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"3\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib oleaut32.lib uuid.lib\"\r\n\t\t\t\tModuleDefinitionFile=\"shell_ps.def\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Generated Files\"\r\n\t\t\tSourceControlFiles=\"false\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\dlldata.c\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_i.c\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_p.c\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<File\r\n\t\t\tRelativePath=\".\\shell_ps.def\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/shell/shell_ps_vc08.vcproj.vspscc",
    "content": "﻿\"\"\r\n{\r\n\"FILE_VERSION\" = \"9237\"\r\n\"ENLISTMENT_CHOICE\" = \"NEVER\"\r\n\"PROJECT_FILE_RELATIVE_PATH\" = \"\"\r\n\"NUMBER_OF_EXCLUDED_FILES\" = \"3\"\r\n\"EXCLUDED_FILE0\" = \"irShell_p.c\"\r\n\"EXCLUDED_FILE1\" = \"dlldata.c\"\r\n\"EXCLUDED_FILE2\" = \"irShell_i.c\"\r\n\"ORIGINAL_PROJECT_FILE_PATH\" = \"\"\r\n\"NUMBER_OF_NESTED_PROJECTS\" = \"0\"\r\n\"SOURCE_CONTROL_SETTINGS_PROVIDER\" = \"PROJECT\"\r\n}\r\n"
  },
  {
    "path": "src/shell/shell_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"shell\"\r\n\tProjectGUID=\"{A6B8E42F-4793-4995-9D63-2906375407AD}\"\r\n\tRootNamespace=\"shell\"\r\n\tKeyword=\"AtlProj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;PORTABLE\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tUseOfATL=\"1\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/shell.tlb\"\r\n\t\t\t\tHeaderFileName=\"shell.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"shell_i.c\"\r\n\t\t\t\tProxyFileName=\"shell_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;PORTABLE\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1053\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tIgnoreImportLibrary=\"true\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tModuleDefinitionFile=\".\\shell.def\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tImportLibrary=\"$(OutDir)/shell.lib\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t\tDescription=\"Performing registration\"\r\n\t\t\t\tCommandLine=\"regsvr32 /s /c &quot;$(TargetPath)&quot;\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lang_util.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings_manager.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell.def\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell.idl\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_ext.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_table.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lang_util.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\settings_manager.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_ext.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\string_table.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\version.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-burn.bmp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell.rgs\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_ext.rgs\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Generated Files\"\r\n\t\t\tSourceControlFiles=\"false\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\shell_i.c\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"ReleaseP|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/shell/shell_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseP|Win32\">\n      <Configuration>ReleaseP</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseP|x64\">\n      <Configuration>ReleaseP</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>shell</ProjectName>\n    <ProjectGuid>{A6B8E42F-4793-4995-9D63-2906375407AD}</ProjectGuid>\n    <RootNamespace>shell</RootNamespace>\n    <Keyword>AtlProj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseOfAtl>Static</UseOfAtl>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <IgnoreImportLibrary Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">true</IgnoreImportLibrary>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</PostBuildEventUseInBuild>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">false</PostBuildEventUseInBuild>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</PostBuildEventUseInBuild>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</PostBuildEventUseInBuild>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">false</PostBuildEventUseInBuild>\n    <PostBuildEventUseInBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</PostBuildEventUseInBuild>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;PORTABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)shell.tlb</TypeLibraryName>\n      <HeaderFileName>shell.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>shell_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>shell_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;_ATL_NO_UUIDOF;PORTABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x041d</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <ModuleDefinitionFile>.\\shell.def</ModuleDefinitionFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <ImportLibrary>$(OutDir)shell.lib</ImportLibrary>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n    <PostBuildEvent>\n      <Message>Performing registration</Message>\n      <Command>regsvr32 /s /c \"$(TargetPath)\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"lang_util.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"settings_manager.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"shell.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"shell_ext.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"string_table.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"shell_i.c\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='ReleaseP|x64'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"shell.def\" />\n    <None Include=\"lang_util.hh\" />\n    <None Include=\"settings.hh\" />\n    <None Include=\"settings_manager.hh\" />\n    <None Include=\"shell_ext.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"string_table.hh\" />\n    <None Include=\"version.hh\" />\n    <None Include=\"resources\\icon-burn.bmp\" />\n    <None Include=\"shell.rgs\" />\n    <None Include=\"shell_ext.rgs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Midl Include=\"shell.idl\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"shell.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/shell/shell_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\n    </Filter>\n    <Filter Include=\"Generated Files\">\n      <UniqueIdentifier>{5537b3aa-7890-4cba-a792-675e3fd92e04}</UniqueIdentifier>\n      <SourceControlFiles>False</SourceControlFiles>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"lang_util.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"settings.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"settings_manager.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"shell.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"shell_ext.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"string_table.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"shell_i.c\">\n      <Filter>Generated Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"shell.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"lang_util.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"settings.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"settings_manager.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"shell_ext.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"string_table.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"version.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-burn.bmp\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"shell.rgs\">\n      <Filter>Resource Files</Filter>\n    </None>\n    <None Include=\"shell_ext.rgs\">\n      <Filter>Resource Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Midl Include=\"shell.idl\">\n      <Filter>Source Files</Filter>\n    </Midl>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"shell.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/shell/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n"
  },
  {
    "path": "src/shell/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n#ifndef STRICT\r\n#define STRICT\r\n#endif\r\n\r\n// Modify the following defines if you have to target a platform prior to the ones specified below.\r\n// Refer to MSDN for the latest info on corresponding values for different platforms.\r\n#ifndef WINVER\t\t\t\t\t// Allow use of features specific to Windows 95 and Windows NT 4 or later.\r\n#define WINVER 0x0400\t\t\t// Change this to the appropriate value to target Windows 98 and Windows 2000 or later.\r\n#endif\r\n\r\n#define _WIN32_WINNT\t0x0500\r\n\r\n#ifndef _WIN32_WINDOWS\t\t\t// Allow use of features specific to Windows 98 or later.\r\n#define _WIN32_WINDOWS 0x0410\t// Change this to the appropriate value to target Windows Me or later.\r\n#endif\r\n\r\n#ifndef _WIN32_IE\t\t\t\t// Allow use of features specific to IE 4.0 or later.\r\n#define _WIN32_IE 0x0500\t\t// Change this to the appropriate value to target IE 5.0 or later.\r\n#endif\r\n\r\n#define _ATL_APARTMENT_THREADED\r\n#define _ATL_NO_AUTOMATIC_NAMESPACE\r\n\r\n#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS\t// Some CString constructors will be explicit.\r\n\r\n// Turns off ATL's hiding of some common and often safely ignored warning messages.\r\n#define _ATL_ALL_WARNINGS\r\n\r\n#include \"resource.h\"\r\n#include <atlbase.h>\r\n#include <atlcom.h>\r\n#include <shlobj.h>\r\n\r\n// Global DLL insance supplied by the DLL entrypoint.\r\nextern HINSTANCE g_DllInstance;\r\n\r\nusing namespace ATL;\r\n"
  },
  {
    "path": "src/shell/string_table.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n\r\nTCHAR *g_szStringTable[] = {\r\n    _T(\"Burn image...\"),\r\n    _T(\"Burn project...\"),\r\n    _T(\"Open with InfraRecorder\"),\r\n\r\n    _T(\"Write the disc image contents to a compact disc.\"),\r\n    _T(\"Write the project contents to a compact disc.\"),\r\n    _T(\"Open the project with InfraRecorder.\")\r\n};\r\n"
  },
  {
    "path": "src/shell/string_table.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\nenum eStringTable\r\n{\r\n    MENU_BURNIMAGE = 0,\r\n    MENU_BURNPROJECT,\r\n    MENU_OPENPROJECT,\r\n\r\n    HINT_BURNIMAGE,\r\n    HINT_BURNPROJECT,\r\n    HINT_OPENPROJECT\r\n};\r\n\r\nextern TCHAR *g_szStringTable[];\r\n"
  },
  {
    "path": "src/shell/version.hh",
    "content": "#define CK_FILEVERSION\t\t\t\t0,46,0,0\r\n#define CK_PRODUCTVERSION\t\t\t0,46,0,0\r\n#define CK_FILEVERSIONSTR\t\t\t\"0.46.0.0\\0\"\r\n#define CK_PRODUCTVERSIONSTR\t\t\"0.46.0.0\\0\"\r\n"
  },
  {
    "path": "src/tests/codec.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <cxxtest/TestSuite.h>\r\n#include <ckcore/buffer.hh>\r\n#include <ckcore/crcstream.hh>\r\n#include <ckcore/exception.hh>\r\n#include <ckcore/file.hh>\r\n#include <ckcore/filestream.hh>\r\n#include <ckcore/stream.hh>\r\n#include <ckcore/types.hh>\r\n#include <base/codec_manager.hh>\r\n\r\n#define TEST_CODE(decoder,encoder)                                      \\\r\n{                                                                       \\\r\n    ckcore::Buffer<unsigned char> buffer(num_channels * ((bit_rate / sample_rate) >> 3) * 1024);\\\r\n                                                                        \\\r\n    __int64 read = 0;                                                   \\\r\n    unsigned __int64 time = 0;                                          \\\r\n    while (true)                                                        \\\r\n    {                                                                   \\\r\n        read = decoder.irc_decode_process(buffer,buffer.size(),time);   \\\r\n        if (read <= 0)                                                  \\\r\n            break;                                                      \\\r\n                                                                        \\\r\n        bool res = encoder.irc_encode_process(buffer,read) >= 0;        \\\r\n        TS_ASSERT(res);                                                 \\\r\n        if (!res)                                                       \\\r\n            break;                                                      \\\r\n    }                                                                   \\\r\n                                                                        \\\r\n    TS_ASSERT(encoder.irc_encode_flush() != -1);                        \\\r\n}\r\n\r\n#define TEST_INIT(decoder,encoder,src_file,dst_file)                    \\\r\n    int num_channels = -1,sample_rate = -1,bit_rate = -1;               \\\r\n    unsigned __int64 duration = 0;                                      \\\r\n    TS_ASSERT(decoder.irc_decode_init(src_file,num_channels,sample_rate,bit_rate,duration));\\\r\n    TS_ASSERT(encoder.irc_encode_init(dst_file,num_channels,sample_rate,bit_rate));\r\n\r\n#define TEST_EXIT(decoder,encoder)                                      \\\r\n    TS_ASSERT(encoder.irc_encode_exit());                               \\\r\n    TS_ASSERT(decoder.irc_decode_exit());\r\n\r\nckcore::tuint32 get_file_crc(const ckcore::tchar * file_path)\r\n{\r\n    ckcore::FileInStream fis(file_path);\r\n    if (!fis.open())\r\n    {\r\n        ckcore::tstringstream msg;\r\n        msg << ckT(\"could not open \\\"\") << file_path\r\n            << ckT(\"\\\" in order to compute its check-sum.\");\r\n        throw ckcore::Exception2(msg.str());\r\n    }\r\n\r\n    ckcore::CrcStream cs(ckcore::CrcStream::ckCRC_32);\r\n    if (!ckcore::stream::copy(fis,cs))\r\n    {\r\n        ckcore::tstringstream msg;\r\n        msg << ckT(\"could not compute check-sum of \\\"\") << file_path\r\n            << ckT(\"\\\".\");\r\n        throw ckcore::Exception2(msg.str());\r\n    }\r\n\r\n    return cs.checksum();\r\n}\r\n\r\nclass CodecTestSuite : public CxxTest::TestSuite\r\n{\r\npublic:\r\n    void test_mp3_encoder()\r\n    {\r\n#if 1\r\n        CCodec sndfile_codec;\r\n        TS_ASSERT(sndfile_codec.Load(ckT(\"codecs\\\\sndfile.irc\")));\r\n        TS_ASSERT_EQUALS(sndfile_codec.irc_capabilities(),IRC_HAS_DECODER | IRC_HAS_ENCODER);\r\n\r\n        CCodec lame_codec;\r\n        TS_ASSERT(lame_codec.Load(ckT(\"codecs\\\\lame.irc\")));\r\n        TS_ASSERT_EQUALS(lame_codec.irc_capabilities(),IRC_HAS_ENCODER | IRC_HAS_CONFIG);\r\n\r\n        // Create temporary destination file.\r\n        ckcore::File tmp = ckcore::File::temp(ckT(\"ir_test\"));\r\n\r\n        // Initialize the Wave decoder.\r\n        TEST_INIT(sndfile_codec,lame_codec,ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1.wav\"),tmp.name().c_str());\r\n\r\n        TS_ASSERT_EQUALS(num_channels,2);\r\n        TS_ASSERT_EQUALS(sample_rate,44100);\r\n        TS_ASSERT_EQUALS(bit_rate,705600);\r\n        TS_ASSERT_EQUALS(duration,12000);\r\n\r\n        TEST_CODE(sndfile_codec,lame_codec);\r\n        TEST_EXIT(sndfile_codec,lame_codec);\r\n\r\n        // Compute CRCs.\r\n        ckcore::tuint32 crc_ref = get_file_crc(ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1-sndfile_lame-standard.mp3\"));\r\n        ckcore::tuint32 crc_tst = get_file_crc(tmp.name().c_str());\r\n\r\n        // Remove temporary destination file.\r\n        TS_ASSERT(tmp.remove());\r\n\r\n        // Compare CRCs.\r\n        TS_ASSERT_EQUALS(crc_ref,crc_tst);\r\n\r\n        //std::cout << num_channels << std::endl << sample_rate << std::endl << bit_rate << std::endl << duration << std::endl;\r\n#endif\r\n    }\r\n\r\n    void test_wma_encoder()\r\n    {\r\n#if 1\r\n        CCodec sndfile_codec;\r\n        TS_ASSERT(sndfile_codec.Load(ckT(\"codecs\\\\sndfile.irc\")));\r\n        TS_ASSERT_EQUALS(sndfile_codec.irc_capabilities(),IRC_HAS_DECODER | IRC_HAS_ENCODER);\r\n\r\n        CCodec wma_codec;\r\n        TS_ASSERT(wma_codec.Load(ckT(\"codecs\\\\wma.irc\")));\r\n        TS_ASSERT_EQUALS(wma_codec.irc_capabilities(),IRC_HAS_DECODER | IRC_HAS_ENCODER | IRC_HAS_CONFIG);\r\n\r\n        // Create temporary destination file.\r\n        ckcore::File tmp = ckcore::File::temp(ckT(\"ir_test\"));\r\n\r\n        // Initialize the Wave decoder.\r\n        TEST_INIT(sndfile_codec,wma_codec,ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1.wav\"),tmp.name().c_str());\r\n\r\n        TS_ASSERT_EQUALS(num_channels,2);\r\n        TS_ASSERT_EQUALS(sample_rate,44100);\r\n        TS_ASSERT_EQUALS(bit_rate,705600);\r\n        TS_ASSERT_EQUALS(duration,12000);\r\n\r\n        TEST_CODE(sndfile_codec,wma_codec);\r\n        TEST_EXIT(sndfile_codec,wma_codec);\r\n\r\n        // WMAs seems to inherit some randomness making a CRC comparison\r\n        // usless, instead compare file sizes for now.\r\n        ckcore::tint64 size_ref = ckcore::File::size(ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1-sndfile_wma-128.wma\"));\r\n        ckcore::tint64 size_tst = tmp.size();\r\n\r\n        // Remove temporary destination file.\r\n        TS_ASSERT(tmp.remove());\r\n\r\n        // Compare file sizes.\r\n        TS_ASSERT_EQUALS(size_ref,size_tst);\r\n\r\n        //std::cout << num_channels << std::endl << sample_rate << std::endl << bit_rate << std::endl << duration << std::endl;\r\n#endif\r\n    }\r\n\r\n    void test_ogg_encoder()\r\n    {\r\n#if 1\r\n        CCodec sndfile_codec;\r\n        TS_ASSERT(sndfile_codec.Load(ckT(\"codecs\\\\sndfile.irc\")));\r\n        TS_ASSERT_EQUALS(sndfile_codec.irc_capabilities(),IRC_HAS_DECODER | IRC_HAS_ENCODER);\r\n\r\n        CCodec vorbis_codec;\r\n        TS_ASSERT(vorbis_codec.Load(ckT(\"codecs\\\\vorbis.irc\")));\r\n        TS_ASSERT_EQUALS(vorbis_codec.irc_capabilities(),IRC_HAS_DECODER | IRC_HAS_ENCODER | IRC_HAS_CONFIG);\r\n\r\n        // Create temporary destination file.\r\n        ckcore::File tmp = ckcore::File::temp(ckT(\"ir_test\"));\r\n\r\n        // Initialize the Wave decoder.\r\n        TEST_INIT(sndfile_codec,vorbis_codec,ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1.wav\"),tmp.name().c_str());\r\n\r\n        TS_ASSERT_EQUALS(num_channels,2);\r\n        TS_ASSERT_EQUALS(sample_rate,44100);\r\n        TS_ASSERT_EQUALS(bit_rate,705600);\r\n        TS_ASSERT_EQUALS(duration,12000);\r\n\r\n        TEST_CODE(sndfile_codec,vorbis_codec);\r\n        TEST_EXIT(sndfile_codec,vorbis_codec);\r\n\r\n        // Ogg Vorbis files seems to inherit some randomness making a CRC\r\n        // comparison usless, instead compare file sizes for now.\r\n        ckcore::tint64 size_ref = ckcore::File::size(ckT(\"..\\\\..\\\\..\\\\src\\\\tests\\\\data\\\\audio\\\\audio_test_1-sndfile_ogg-quality_mid.ogg\"));\r\n        ckcore::tint64 size_tst = tmp.size();\r\n\r\n        // Remove temporary destination file.\r\n        TS_ASSERT(tmp.remove());\r\n\r\n        // Compare file sizes.\r\n        TS_ASSERT_EQUALS(size_ref,size_tst);\r\n\r\n        //std::cout << num_channels << std::endl << sample_rate << std::endl << bit_rate << std::endl << duration << std::endl;\r\n#endif\r\n    }\r\n};\r\n"
  },
  {
    "path": "src/tests/tests_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"tests\"\r\n\tProjectGUID=\"{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}\"\r\n\tRootNamespace=\"tests\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Generating test program.\"\r\n\t\t\t\tCommandLine=\"perl -w &quot;c:\\program files\\cxxtest\\cxxtestgen.pl&quot; --error-printer -o test.cc codec.hh\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t\tDescription=\"Performing Custom Build Step\"\r\n\t\t\t\tCommandLine=\"\"\r\n\t\t\t\tOutputs=\"\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Generating test program.\"\r\n\t\t\t\tCommandLine=\"perl -w &quot;c:\\program files\\cxxtest\\cxxtestgen.pl&quot; --error-printer -o test.cc codec.hh\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t\tDescription=\"Performing Custom Build Step\"\r\n\t\t\t\tCommandLine=\"\"\r\n\t\t\t\tOutputs=\"\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Generating test program.\"\r\n\t\t\t\tCommandLine=\"perl -w &quot;c:\\program files\\cxxtest\\cxxtestgen.pl&quot; --error-printer -o test.cc codec.hh\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;TEST_SRC_DIR=&quot;&quot;.&quot;&quot;\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t\tDescription=\"Generating test program.\"\r\n\t\t\t\tCommandLine=\"perl -w &quot;c:\\program files\\cxxtest\\cxxtestgen.pl&quot; --error-printer -o test.cc codec.hh\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tOutputFile=\"$(OutDir)\\$(ProjectName).exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\test.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codec.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav\"\r\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\r\n\t\t\t>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/tests/tests_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>tests</ProjectName>\n    <ProjectGuid>{2C35640E-0BF9-4BAE-8A0E-3DE5A691D160}</ProjectGuid>\n    <RootNamespace>tests</RootNamespace>\n    <Keyword>Win32Proj</Keyword>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;C:\\Program Files\\cxxtest;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;C:\\Program Files\\cxxtest;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;C:\\Program Files\\cxxtest;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;C:\\Program Files\\cxxtest;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <PreBuildEvent>\n      <Message>Generating test program.</Message>\n      <Command>perl -w \"c:\\program files\\cxxtest\\cxxtestgen.pl\" --error-printer -o test.cc codec.hh</Command>\n    </PreBuildEvent>\n    <CustomBuildStep>\n      <Message>Performing Custom Build Step</Message>\n      <Command>\n      </Command>\n      <Outputs>%(Outputs)</Outputs>\n    </CustomBuildStep>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <PreBuildEvent>\n      <Message>Generating test program.</Message>\n      <Command>perl -w \"c:\\program files\\cxxtest\\cxxtestgen.pl\" --error-printer -o test.cc codec.hh</Command>\n    </PreBuildEvent>\n    <CustomBuildStep>\n      <Message>Performing Custom Build Step</Message>\n      <Command>\n      </Command>\n      <Outputs>%(Outputs)</Outputs>\n    </CustomBuildStep>\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <PreBuildEvent>\n      <Message>Generating test program.</Message>\n      <Command>perl -w \"c:\\program files\\cxxtest\\cxxtestgen.pl\" --error-printer -o test.cc codec.hh</Command>\n    </PreBuildEvent>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;TEST_SRC_DIR=.;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <PreBuildEvent>\n      <Message>Generating test program.</Message>\n      <Command>perl -w \"c:\\program files\\cxxtest\\cxxtestgen.pl\" --error-printer -o test.cc codec.hh</Command>\n    </PreBuildEvent>\n    <Midl>\n      <TargetEnvironment>X64</TargetEnvironment>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <OutputFile>$(OutDir)$(ProjectName).exe</OutputFile>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Console</SubSystem>\n      <OptimizeReferences>true</OptimizeReferences>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"test.cc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"codec.hh\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/tests/tests_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"test.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"codec.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/tools/codectester/codectester.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"main_dlg.hh\"\r\n\r\nCAppModule _Module;\r\n\r\nint Run(LPTSTR lpstrCmdLine = NULL,int nCmdShow = SW_SHOWDEFAULT)\r\n{\r\n    CMessageLoop MainLoop;\r\n    _Module.AddMessageLoop(&MainLoop);\r\n\r\n    CMainDlg MainDlg;\r\n\r\n    if (MainDlg.Create(NULL) == NULL)\r\n    {\r\n        ATLTRACE(_T(\"Main dialog creation failed!\\n\"));\r\n        return 0;\r\n    }\r\n\r\n    MainDlg.ShowWindow(nCmdShow);\r\n\r\n    int nRet = MainLoop.Run();\r\n\r\n    _Module.RemoveMessageLoop();\r\n    return nRet;\r\n}\r\n\r\nint WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpstrCmdLine,int nCmdShow)\r\n{\r\n    HRESULT hRes = ::CoInitialize(NULL);\r\n    // If you are running on NT 4.0 or higher you can use the following call instead to \r\n    // make the EXE free threaded. This means that calls come in on a random RPC thread.\r\n    //HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);\r\n    ATLASSERT(SUCCEEDED(hRes));\r\n\r\n    // This resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used.\r\n    ::DefWindowProc(NULL,0,0,0L);\r\n\r\n    AtlInitCommonControls(ICC_BAR_CLASSES);\t// Add flags to support other controls.\r\n\r\n    hRes = _Module.Init(NULL,hInstance);\r\n    ATLASSERT(SUCCEEDED(hRes));\r\n\r\n    int nRet = Run(lpstrCmdLine,nCmdShow);\r\n\r\n    _Module.Term();\r\n    ::CoUninitialize();\r\n\r\n    return nRet;\r\n}\r\n"
  },
  {
    "path": "src/tools/codectester/codectester.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n"
  },
  {
    "path": "src/tools/codectester/codectester.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"Resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"atlres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"Resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"atlres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Icon\r\n//\r\n\r\n// Icon with lowest ID value placed first to ensure application icon\r\n// remains consistent on all systems.\r\nIDR_MAINFRAME           ICON                    \"resources\\\\icon-main.ico\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_MAINDLG DIALOGEX 0, 0, 328, 190\r\nSTYLE DS_SETFONT | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Codec Tester\"\r\nFONT 8, \"MS Sans Serif\", 0, 0, 0x0\r\nBEGIN\r\n    DEFPUSHBUTTON   \"Start\",IDOK,271,18,50,14\r\n    PUSHBUTTON      \"Exit\",IDCANCEL,271,35,50,14\r\n    PUSHBUTTON      \"About...\",ID_APP_ABOUT,271,169,50,14\r\n    LTEXT           \"Installed codecs (double-click to view copyright note):\",IDC_INSTALLEDSTATIC,7,7,170,8\r\n    CONTROL         \"\",IDC_LIST,\"SysListView32\",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,18,257,102\r\n    GROUPBOX        \"Parameters\",IDC_OPTIONSSTATIC,7,123,257,59\r\n    CONTROL         \"\",IDC_PROGRESS,\"msctls_progress32\",NOT WS_VISIBLE | WS_BORDER,7,124,258,10\r\n    LTEXT           \"Source file:\",IDC_INPUTSTATIC,12,134,36,8\r\n    EDITTEXT        IDC_INPUTEDIT,61,132,177,13,ES_AUTOHSCROLL\r\n    PUSHBUTTON      \"...\",IDC_INPUTBUTTON,243,132,15,13\r\n    LTEXT           \"Target folder:\",IDC_OUTPUTSTATIC,12,150,43,8\r\n    EDITTEXT        IDC_OUTPUTEDIT,61,148,177,13,ES_AUTOHSCROLL\r\n    LTEXT           \"Target format:\",IDC_FORMATSTATIC,12,166,45,8\r\n    COMBOBOX        IDC_FORMATCOMBO,62,164,98,49,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r\n    PUSHBUTTON      \"...\",IDC_OUTPUTBUTTON,243,148,15,13\r\n    PUSHBUTTON      \"Help...\",IDC_HELPBUTTON,271,152,50,14\r\n    PUSHBUTTON      \"Configure...\",IDC_ENCODERCONFIGBUTTON,164,164,43,13\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO \r\nBEGIN\r\n    IDD_MAINDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 321\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 183\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Accelerator\r\n//\r\n\r\nIDR_MAINFRAME ACCELERATORS \r\nBEGIN\r\n    \"N\",            ID_FILE_NEW,            VIRTKEY, CONTROL\r\n    \"O\",            ID_FILE_OPEN,           VIRTKEY, CONTROL\r\n    \"S\",            ID_FILE_SAVE,           VIRTKEY, CONTROL\r\n    \"P\",            ID_FILE_PRINT,          VIRTKEY, CONTROL\r\n    \"Z\",            ID_EDIT_UNDO,           VIRTKEY, CONTROL\r\n    \"X\",            ID_EDIT_CUT,            VIRTKEY, CONTROL\r\n    \"C\",            ID_EDIT_COPY,           VIRTKEY, CONTROL\r\n    \"V\",            ID_EDIT_PASTE,          VIRTKEY, CONTROL\r\n    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT\r\n    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT\r\n    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL\r\n    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT\r\n    VK_F6,          ID_NEXT_PANE,           VIRTKEY \r\n    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n FILEVERSION 0,4,0,3\r\n PRODUCTVERSION 0,4,0,3\r\n FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n FILEFLAGS 0x1L\r\n#else\r\n FILEFLAGS 0x0L\r\n#endif\r\n FILEOS 0x4L\r\n FILETYPE 0x2L\r\n FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"FileDescription\", \"InfraRecorder Codec Tester\"\r\n            VALUE \"FileVersion\", \"0.4.0.3\"\r\n            VALUE \"InternalName\", \"codectester\"\r\n            VALUE \"LegalCopyright\", \"Copyright  2006-2010 Christian Kindahl\"\r\n            VALUE \"OriginalFilename\", \"codectester.exe\"\r\n            VALUE \"ProductName\", \"InfraRecorder Codec Tester\"\r\n            VALUE \"ProductVersion\", \"0.4.0.3\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// String Table\r\n//\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    IDR_MAINFRAME           \"CodecTester\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_FILE_NEW             \"Create a new document\\nNew\"\r\n    ID_FILE_OPEN            \"Open an existing document\\nOpen\"\r\n    ID_FILE_CLOSE           \"Close the active document\\nClose\"\r\n    ID_FILE_SAVE            \"Save the active document\\nSave\"\r\n    ID_FILE_SAVE_AS         \"Save the active document with a new name\\nSave As\"\r\n    ID_FILE_PAGE_SETUP      \"Change the printing options\\nPage Setup\"\r\n    ID_FILE_PRINT_SETUP     \"Change the printer and printing options\\nPrint Setup\"\r\n    ID_FILE_PRINT           \"Print the active document\\nPrint\"\r\n    ID_FILE_PRINT_PREVIEW   \"Display full pages\\nPrint Preview\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_APP_ABOUT            \"Display program information, version number and copyright\\nAbout\"\r\n    ID_APP_EXIT             \"Quit the application; prompts to save documents\\nExit\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_NEXT_PANE            \"Switch to the next window pane\\nNext Pane\"\r\n    ID_PREV_PANE            \"Switch back to the previous window pane\\nPrevious Pane\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_WINDOW_NEW           \"Open another window for the active document\\nNew Window\"\r\n    ID_WINDOW_ARRANGE       \"Arrange icons at the bottom of the window\\nArrange Icons\"\r\n    ID_WINDOW_CASCADE       \"Arrange windows so they overlap\\nCascade Windows\"\r\n    ID_WINDOW_TILE_HORZ     \"Arrange windows as non-overlapping tiles\\nTile Windows\"\r\n    ID_WINDOW_TILE_VERT     \"Arrange windows as non-overlapping tiles\\nTile Windows\"\r\n    ID_WINDOW_SPLIT         \"Split the active window into panes\\nSplit\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_EDIT_CLEAR           \"Erase the selection\\nErase\"\r\n    ID_EDIT_CLEAR_ALL       \"Erase everything\\nErase All\"\r\n    ID_EDIT_COPY            \"Copy the selection and put it on the Clipboard\\nCopy\"\r\n    ID_EDIT_CUT             \"Cut the selection and put it on the Clipboard\\nCut\"\r\n    ID_EDIT_FIND            \"Find the specified text\\nFind\"\r\n    ID_EDIT_PASTE           \"Insert Clipboard contents\\nPaste\"\r\n    ID_EDIT_REPEAT          \"Repeat the last action\\nRepeat\"\r\n    ID_EDIT_REPLACE         \"Replace specific text with different text\\nReplace\"\r\n    ID_EDIT_SELECT_ALL      \"Select the entire document\\nSelect All\"\r\n    ID_EDIT_UNDO            \"Undo the last action\\nUndo\"\r\n    ID_EDIT_REDO            \"Redo the previously undone action\\nRedo\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_SCSIZE          \"Change the window size\"\r\n    ATL_IDS_SCMOVE          \"Change the window position\"\r\n    ATL_IDS_SCMINIMIZE      \"Reduce the window to an icon\"\r\n    ATL_IDS_SCMAXIMIZE      \"Enlarge the window to full size\"\r\n    ATL_IDS_SCNEXTWINDOW    \"Switch to the next document window\"\r\n    ATL_IDS_SCPREVWINDOW    \"Switch to the previous document window\"\r\n    ATL_IDS_SCCLOSE         \"Close the active window and prompts to save the documents\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_SCRESTORE       \"Restore the window to normal size\"\r\n    ATL_IDS_SCTASKLIST      \"Activate Task List\"\r\n    ATL_IDS_MDICHILD        \"Activate this window\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_IDLEMESSAGE     \"Ready\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_MRU_FILE        \"Open this document\"\r\nEND\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Swedish resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n#endif    // Swedish resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/tools/codectester/codectester_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"codectester\"\r\n\tProjectGUID=\"{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}\"\r\n\tRootNamespace=\"codectester\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/codectester.tlb\"\r\n\t\t\t\tHeaderFileName=\"codectester.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"codectester_i.c\"\r\n\t\t\t\tProxyFileName=\"codectester_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/codectester.tlb\"\r\n\t\t\t\tHeaderFileName=\"codectester.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"codectester_i.c\"\r\n\t\t\t\tProxyFileName=\"codectester_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"true\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/codectester.tlb\"\r\n\t\t\t\tHeaderFileName=\"codectester.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"codectester_i.c\"\r\n\t\t\t\tProxyFileName=\"codectester_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:atlmincrt.lib\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"true\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/codectester.tlb\"\r\n\t\t\t\tHeaderFileName=\"codectester.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"codectester_i.c\"\r\n\t\t\t\tProxyFileName=\"codectester_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"&quot;$(ProjectDir)..\\..\\&quot;\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:atlmincrt.lib\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codectester.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\main_dlg.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codectester.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\main_dlg.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\codectester.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-main.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t\t<Global\r\n\t\t\tName=\"RESOURCE_FILE\"\r\n\t\t\tValue=\"codectester.rc\"\r\n\t\t/>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/tools/codectester/codectester_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|Win32\">\n      <Configuration>Template</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|x64\">\n      <Configuration>Template</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>codectester</ProjectName>\n    <ProjectGuid>{662C79E3-70D3-4F83-BAAF-EC663B93BAFD}</ProjectGuid>\n    <RootNamespace>codectester</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)codectester.tlb</TypeLibraryName>\n      <HeaderFileName>codectester.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>codectester_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>codectester_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)codectester.tlb</TypeLibraryName>\n      <HeaderFileName>codectester.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>codectester_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>codectester_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)codectester.tlb</TypeLibraryName>\n      <HeaderFileName>codectester.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>codectester_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>codectester_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:atlmincrt.lib %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)codectester.tlb</TypeLibraryName>\n      <HeaderFileName>codectester.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>codectester_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>codectester_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:atlmincrt.lib %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"codectester.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"main_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"codectester.hh\" />\n    <None Include=\"main_dlg.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"resources\\icon-main.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"codectester.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n  <ProjectExtensions>\n    <VisualStudio>\n      <UserProperties RESOURCE_FILE=\"codectester.rc\" />\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/tools/codectester/codectester_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{ce6fd350-77e2-441a-9fd4-dfe011fb9a7c}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{8dc5110c-0bcf-47ae-b5e9-0c2b79cdb582}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{edbcdaee-2964-4ab4-b83b-8fed990499f0}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"codectester.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main_dlg.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"codectester.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"main_dlg.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-main.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"codectester.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/tools/codectester/main_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include <base/string_util.hh>\r\n#include <base/codec_manager.hh>\r\n#include \"main_dlg.hh\"\r\n\r\nCCodecManager g_CodecManager;\r\n\r\nBOOL CMainDlg::PreTranslateMessage(MSG *pMsg)\r\n{\r\n    return CWindow::IsDialogMessage(pMsg);\r\n}\r\n\r\nBOOL CMainDlg::OnIdle()\r\n{\r\n    return FALSE;\r\n}\r\n\r\nvoid CALLBACK CodecMessage(int iType,const TCHAR *szMessage)\r\n{\r\n    switch (iType)\r\n    {\r\n        case IRC_MESSAGE_WARNING:\r\n            MessageBox(HWND_DESKTOP,szMessage,_T(\"Warning\"),MB_OK | MB_ICONWARNING);\r\n            break;\r\n\r\n        case IRC_MESSAGE_ERROR:\r\n            MessageBox(HWND_DESKTOP,szMessage,_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n            break;\r\n\r\n        default:\r\n            MessageBox(HWND_DESKTOP,szMessage,_T(\"Information\"),MB_OK | MB_ICONINFORMATION);\r\n            break;\r\n    }\r\n}\r\n\r\nvoid CMainDlg::InitializeListView()\r\n{\r\n    // Create the image list.\r\n    m_hListImageList = NULL;\r\n    HINSTANCE hInstance = LoadLibrary(_T(\"shell32.dll\"));\r\n        HICON hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(278),IMAGE_ICON,16,16,LR_LOADTRANSPARENT);\r\n    FreeLibrary(hInstance);\r\n\r\n    m_hListImageList = ImageList_Create(16,16,ILC_COLOR32,0,1);\r\n    ImageList_AddIcon(m_hListImageList,hIcon);\r\n\r\n    DestroyIcon(hIcon);\r\n\r\n    // Setup the list view.\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_NORMAL);\r\n    m_ListView.SetImageList(m_hListImageList,LVSIL_SMALL);\r\n    m_ListView.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);\r\n\r\n    // Add the columns.\r\n    m_ListView.AddColumn(_T(\"Name\"),0);\r\n    m_ListView.SetColumnWidth(0,150);\r\n    m_ListView.AddColumn(_T(\"Version\"),1,-1,LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM,LVCFMT_RIGHT);\r\n    m_ListView.SetColumnWidth(1,55);\r\n}\r\n\r\nvoid CMainDlg::FillListView()\r\n{\r\n    TCHAR szFileName[MAX_PATH];\r\n    int iItemCount = 0;\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        if (g_CodecManager.m_Codecs[i]->GetFileName(szFileName,MAX_PATH - 1))\r\n        {\r\n            ExtractFileName(szFileName);\r\n            m_ListView.AddItem(iItemCount,0,szFileName,0);\r\n            m_ListView.AddItem(iItemCount,1,g_CodecManager.m_Codecs[i]->irc_string(IRC_STR_VERSION),0);\r\n\r\n            iItemCount++;\r\n        }\r\n    }\r\n}\r\n\r\nvoid CMainDlg::FillComboBox()\r\n{\r\n    m_ComboBox.ResetContent();\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        if (g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_ENCODER)\r\n        {\r\n            m_ComboBox.AddString(g_CodecManager.m_Codecs[i]->irc_string(IRC_STR_ENCODER));\r\n            m_ComboBox.SetItemData(m_ComboBox.GetCount() - 1,(DWORD_PTR)g_CodecManager.m_Codecs[i]);\r\n        }\r\n    }\r\n\r\n    if (m_ComboBox.GetCount() == 0)\r\n    {\r\n        DisableApp();\r\n        return;\r\n    }\r\n\r\n    m_ComboBox.SetCurSel(0);\r\n\r\n    CCodec *pEncoder = (CCodec *)m_ComboBox.GetItemData(0);\r\n    ::EnableWindow(GetDlgItem(IDC_ENCODERCONFIGBUTTON),pEncoder->irc_capabilities() & IRC_HAS_CONFIG);\r\n}\r\n\r\nvoid CMainDlg::DisableApp()\r\n{\r\n    m_ComboBox.AddString(_T(\"None\"));\r\n    m_ComboBox.EnableWindow(FALSE);\r\n    ::EnableWindow(GetDlgItem(IDOK),FALSE);\r\n\r\n    m_ComboBox.SetCurSel(0);\r\n}\r\n\r\nLRESULT CMainDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the dialog on the screen.\r\n    CenterWindow();\r\n\r\n    m_ListView = GetDlgItem(IDC_LIST);\r\n    m_ComboBox = GetDlgItem(IDC_FORMATCOMBO);\r\n\r\n    // Set icons.\r\n    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n        IMAGE_ICON,::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    SetIcon(hIcon, TRUE);\r\n    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n        IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR);\r\n    SetIcon(hIconSmall,FALSE);\r\n\r\n    // Register object for message filtering and idle updates.\r\n    CMessageLoop *pLoop = _Module.GetMessageLoop();\r\n    ATLASSERT(pLoop != NULL);\r\n    pLoop->AddMessageFilter(this);\r\n    pLoop->AddIdleHandler(this);\r\n\r\n    UIAddChildWindowContainer(m_hWnd);\r\n\r\n    // Initialize the list view.\r\n    InitializeListView();\r\n\r\n    // Setup controls.\r\n    ::SendMessage(GetDlgItem(IDC_INPUTEDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n    ::SendMessage(GetDlgItem(IDC_OUTPUTEDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n\r\n    // Temp...\r\n    //SetDlgItemText(IDC_INPUTEDIT,_T(\"C:\\\\Temp\\\\AudioFiles\\\\Test2.wav\"));\r\n    //SetDlgItemText(IDC_OUTPUTEDIT,_T(\"C:\\\\Temp\\\\AudioOut\\\\\"));\r\n    // Temp...\r\n\r\n    // Load the codecs.\r\n    TCHAR szCodecPath[MAX_PATH];\r\n    GetModuleFileName(NULL,szCodecPath,MAX_PATH - 1);\r\n\r\n    ExtractFilePath(szCodecPath);\r\n    lstrcat(szCodecPath,_T(\"codecs\\\\\"));\r\n\r\n    if (g_CodecManager.LoadCodecs(szCodecPath))\r\n    {\r\n        // Fill the codec list view.\r\n        FillListView();\r\n\r\n        // Fill the target format combo box.\r\n        FillComboBox();\r\n    }\r\n    else\r\n    {\r\n        MessageBox(_T(\"Unable to load codecs.\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n\r\n        DisableApp();\r\n    }\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CMainDlg::OnAppAbout(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    MessageBox(_T(\"Copyright  2006-2012 Christian Kindahl\"),_T(\"About\"),MB_OK | MB_ICONINFORMATION);\r\n    return 0;\r\n}\r\n\r\nvoid CMainDlg::BeginProcess()\r\n{\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTSTATIC),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTEDIT),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTBUTTON),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTSTATIC),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTEDIT),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTBUTTON),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_FORMATSTATIC),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_FORMATCOMBO),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_OPTIONSSTATIC),SW_HIDE);\r\n    ::ShowWindow(GetDlgItem(IDC_PROGRESS),SW_SHOW);\r\n    SendDlgItemMessage(IDC_PROGRESS,PBM_SETRANGE32,0,100);\r\n}\r\n\r\nvoid CMainDlg::EndProcess()\r\n{\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTSTATIC),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTEDIT),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_INPUTBUTTON),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTSTATIC),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTEDIT),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_OUTPUTBUTTON),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_FORMATSTATIC),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_FORMATCOMBO),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_OPTIONSSTATIC),SW_SHOW);\r\n    ::ShowWindow(GetDlgItem(IDC_PROGRESS),SW_HIDE);\r\n}\r\n\r\nLRESULT CMainDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    TCHAR szSourceFile[MAX_PATH];\r\n    GetDlgItemText(IDC_INPUTEDIT,szSourceFile,MAX_PATH - 1);\r\n\r\n    // Display the progress bar.\r\n    BeginProcess();\r\n\r\n    // Find which codec that can be uses for decoding the source file.\r\n    CCodec *pDecoder = NULL;\r\n\r\n    // Source file information.\r\n    int iNumChannels = -1;\r\n    int iSampleRate = -1;\r\n    int iBitRate = -1;\r\n    unsigned __int64 uiDuration = 0;\r\n\r\n    for (unsigned int i = 0; i < g_CodecManager.m_Codecs.size(); i++)\r\n    {\r\n        // We're only interested in decoders.\r\n        if ((g_CodecManager.m_Codecs[i]->irc_capabilities() & IRC_HAS_DECODER) == 0)\r\n            continue;\r\n\r\n        if (g_CodecManager.m_Codecs[i]->irc_decode_init(szSourceFile,iNumChannels,\r\n            iSampleRate,iBitRate,uiDuration))\r\n        {\r\n            pDecoder = g_CodecManager.m_Codecs[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (pDecoder == NULL)\r\n    {\r\n        MessageBox(_T(\"There is no installed codec that support the specified source file.\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n\r\n        EndProcess();\r\n        return 0;\r\n    }\r\n\r\n    // Encoder.\r\n    CCodec *pEncoder = (CCodec *)m_ComboBox.GetItemData(m_ComboBox.GetCurSel());\r\n\r\n    // Setup target path.\r\n    TCHAR szTargetFile[MAX_PATH],szTargetFileName[MAX_PATH];\r\n    lstrcpy(szTargetFileName,szSourceFile);\r\n    ExtractFileName(szTargetFileName);\r\n    ChangeFileExt(szTargetFileName,pEncoder->irc_string(IRC_STR_FILEEXT));\r\n\r\n    GetDlgItemText(IDC_OUTPUTEDIT,szTargetFile,MAX_PATH - 1);\r\n    IncludeTrailingBackslash(szTargetFile);\r\n    lstrcat(szTargetFile,szTargetFileName);\r\n\r\n    // Initialize the encoder.\r\n    if (!pEncoder->irc_encode_init(szTargetFile,iNumChannels,iSampleRate,iBitRate))\r\n    {\r\n        MessageBox(_T(\"Failed to initialize the encoder.\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n\r\n        EndProcess();\r\n        return 0;\r\n    }\r\n\r\n    // Setup callbacks.\r\n    pDecoder->irc_set_callback(CodecMessage);\r\n    pEncoder->irc_set_callback(CodecMessage);\r\n\r\n    // Encode/decode-process.\r\n    __int64 iBytesRead = 0;\r\n    unsigned __int64 uiCurrentTime = 0;\r\n\r\n    // Allocate buffer memory.\r\n    unsigned int uiBufferSize = iNumChannels * ((iBitRate / iSampleRate) >> 3) * ENCODE_BUFFER_FACTOR;\r\n    unsigned char *pBuffer = new unsigned char[uiBufferSize];\r\n\r\n    while (true)\r\n    {\r\n        iBytesRead = pDecoder->irc_decode_process(pBuffer,uiBufferSize,uiCurrentTime);\r\n        if (iBytesRead <= 0)\r\n            break;\r\n\r\n        if (pEncoder->irc_encode_process(pBuffer,iBytesRead) < 0)\r\n        {\r\n            MessageBox(_T(\"Failed to encode data.\"),_T(\"Error\"),MB_OK | MB_ICONERROR);\r\n            break;\r\n        }\r\n\r\n        // Update the progres bar.\r\n        int iPercent = (int)(((double)uiCurrentTime/uiDuration) * 100);\r\n        SendDlgItemMessage(IDC_PROGRESS,PBM_SETPOS,(WPARAM)iPercent,0);\r\n\r\n        TCHAR szTemp[25];\r\n        swprintf(szTemp,_T(\"%d\"),iPercent);\r\n        SetWindowText(szTemp);\r\n    }\r\n\r\n    // Free buffer memory.\r\n    delete [] pBuffer;\r\n\r\n    // Flush.\r\n    pEncoder->irc_encode_flush();\r\n\r\n    // Destroy the codecs.\r\n    pEncoder->irc_encode_exit();\r\n    pDecoder->irc_decode_exit();\r\n\r\n    // Hide the progress bar.\r\n    EndProcess();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CloseDialog(wID);\r\n    return 0;\r\n}\r\n\r\nvoid CMainDlg::CloseDialog(int iVal)\r\n{\r\n    DestroyWindow();\r\n    ::PostQuitMessage(iVal);\r\n\r\n    // Destroy the image list.\r\n    if (m_hListImageList)\r\n        ImageList_Destroy(m_hListImageList);\r\n}\r\n\r\nLRESULT CMainDlg::OnBnClickedInputbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"All Files (*.*)\\0*.*\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n        SetDlgItemText(IDC_INPUTEDIT,FileDialog.m_szFileName);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnBnClickedOutputbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CFolderDialog FolderDialog(m_hWnd,_T(\"Please select a target folder:\"),BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS);\r\n    \r\n    if (FolderDialog.DoModal() == IDOK)\r\n        SetDlgItemText(IDC_OUTPUTEDIT,FolderDialog.GetFolderPath());\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnBnClickedHelpbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    MessageBox(_T(\"A decoder will automatically be choosen to match the selected source file. If no such decoder can be found the process will be aborted.\"),_T(\"Help\"),MB_OK | MB_ICONINFORMATION);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnBnClickedEncoderConfigButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CCodec *pEncoder = (CCodec *)m_ComboBox.GetItemData(m_ComboBox.GetCurSel());\r\n    pEncoder->irc_encode_config();\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnEncoderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CCodec *pEncoder = (CCodec *)m_ComboBox.GetItemData(m_ComboBox.GetCurSel());\r\n    ::EnableWindow(GetDlgItem(IDC_ENCODERCONFIGBUTTON),pEncoder->irc_capabilities() & IRC_HAS_CONFIG);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled)\r\n{\r\n    if (m_ListView.GetSelectedCount() > 0)\r\n    {\r\n        unsigned int uiCodec = m_ListView.GetSelectedIndex();\r\n\r\n        MessageBox(g_CodecManager.m_Codecs[uiCodec]->irc_string(IRC_STR_ABOUT),_T(\"Information\"),MB_OK | MB_ICONINFORMATION);\r\n    }\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/tools/codectester/main_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#define ENCODE_BUFFER_FACTOR\t\t\t1024\r\n\r\n#pragma once\r\n\r\nclass CMainDlg : public CDialogImpl<CMainDlg>,public CUpdateUI<CMainDlg>,\r\n    public CMessageFilter,public CIdleHandler\r\n{\r\nprivate:\r\n    HIMAGELIST m_hListImageList;\r\n    CListViewCtrl m_ListView;\r\n    CComboBox m_ComboBox;\r\n\r\n    void InitializeListView();\r\n    void FillListView();\r\n    void FillComboBox();\r\n\r\n    void DisableApp();\r\n\r\n    void BeginProcess();\r\n    void EndProcess();\r\n\r\npublic:\r\n    enum { IDD = IDD_MAINDLG };\r\n\r\n    virtual BOOL PreTranslateMessage(MSG *pMsg);\r\n    virtual BOOL OnIdle();\r\n\r\n    BEGIN_UPDATE_UI_MAP(CMainDlg)\r\n    END_UPDATE_UI_MAP()\r\n\r\n    BEGIN_MSG_MAP(CMainDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        COMMAND_ID_HANDLER(ID_APP_ABOUT,OnAppAbout)\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_HANDLER(IDC_INPUTBUTTON,BN_CLICKED,OnBnClickedInputbutton)\r\n        COMMAND_HANDLER(IDC_OUTPUTBUTTON,BN_CLICKED,OnBnClickedOutputbutton)\r\n        COMMAND_HANDLER(IDC_HELPBUTTON,BN_CLICKED,OnBnClickedHelpbutton)\r\n        COMMAND_HANDLER(IDC_ENCODERCONFIGBUTTON,BN_CLICKED,OnBnClickedEncoderConfigButton)\r\n        COMMAND_HANDLER(IDC_FORMATCOMBO,CBN_SELCHANGE,OnEncoderChange)\r\n        NOTIFY_HANDLER(IDC_LIST,NM_DBLCLK,OnListDblClick)\r\n    END_MSG_MAP()\r\n\r\n    void CloseDialog(int iVal);\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnAppAbout(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBnClickedInputbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBnClickedOutputbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBnClickedHelpbutton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnBnClickedEncoderConfigButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnEncoderChange(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnListDblClick(int iCtrlID,LPNMHDR pNMH,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/tools/codectester/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by CodecTester.rc\r\n//\r\n#define IDR_MAINFRAME                   128\r\n#define IDD_MAINDLG                     129\r\n#define IDC_INSTALLEDSTATIC             1000\r\n#define IDC_LIST                        1001\r\n#define IDC_INPUTSTATIC                 1002\r\n#define IDC_INPUTEDIT                   1003\r\n#define IDC_OUTPUTSTATIC                1004\r\n#define IDC_OUTPUTEDIT                  1005\r\n#define IDC_FORMATSTATIC                1006\r\n#define IDC_FORMATCOMBO                 1007\r\n#define IDC_INPUTBUTTON                 1008\r\n#define IDC_INPUTBUTTON2                1009\r\n#define IDC_OUTPUTBUTTON                1009\r\n#define IDC_PROGRESS                    1010\r\n#define IDC_OPTIONSSTATIC               1011\r\n#define IDC_HELPBUTTON                  1012\r\n#define IDC_BUTTON1                     1013\r\n#define IDC_ENCODERCONFIGBUTTON         1013\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        201\r\n#define _APS_NEXT_COMMAND_VALUE         32772\r\n#define _APS_NEXT_CONTROL_VALUE         1014\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/tools/codectester/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n\r\n#if (_ATL_VER < 0x0700)\r\n#include <atlimpl.cpp>\r\n#endif //(_ATL_VER < 0x0700)\r\n"
  },
  {
    "path": "src/tools/codectester/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Change these values to use different versions.\r\n#define WINVER\t\t\t0x0400\r\n//#define _WIN32_WINNT\t0x0400\r\n#define _WIN32_IE\t\t0x0400\r\n#define _RICHEDIT_VER\t0x0100\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n\r\nextern CAppModule _Module;\r\n\r\n#include <atlwin.h>\r\n#include <atlframe.h>\r\n#include <atlctrls.h>\r\n#include <atldlgs.h>\r\n\r\n// Manifest.\r\n#if defined _M_IX86\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_IA64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_X64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#else\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#endif\r\n"
  },
  {
    "path": "src/tools/translationtool/lng_analyzer.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"lng_analyzer.hh\"\r\n\r\nCLngAnalyzer::CLngAnalyzer(const TCHAR *szFullPath) : CLngProcessor(szFullPath)\r\n{\r\n}\r\n\r\nCLngAnalyzer::~CLngAnalyzer()\r\n{\r\n}\r\n\r\nunsigned int CLngAnalyzer::GetNumValues()\r\n{\r\n    unsigned int uiResult = 0;\r\n\r\n    for (unsigned int i = 0; i < m_pSections.size(); i++)\r\n        uiResult += (unsigned int)m_pSections[i]->m_Values.size();\r\n\r\n    return uiResult;\r\n}\r\n\r\nunsigned int CLngAnalyzer::GetNumSections()\r\n{\r\n    return (unsigned int)m_pSections.size();\r\n}\r\n\r\nCLngSection *CLngAnalyzer::GetSection(unsigned int uiIndex)\r\n{\r\n    if (uiIndex > m_pSections.size())\r\n        return NULL;\r\n\r\n    return m_pSections[uiIndex];\r\n}\r\n\r\nCLngSection *CLngAnalyzer::GetSection(const TCHAR *szName)\r\n{\r\n    for (unsigned int i = 0; i < m_pSections.size(); i++)\r\n    {\r\n        if (!lstrcmp(m_pSections[i]->m_szName,szName))\r\n            return m_pSections[i];\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nbool CLngAnalyzer::SectionHasValue(CLngSection *pSection,unsigned long ulName)\r\n{\r\n    for (unsigned int i = 0; i < pSection->m_Values.size(); i++)\r\n    {\r\n        if (pSection->m_Values[i]->ulName == ulName)\r\n            return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/tools/translationtool/lng_analyzer.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <base/lng_processor.hh>\r\n\r\nclass CLngAnalyzer : public CLngProcessor\r\n{\r\npublic:\r\n    CLngAnalyzer(const TCHAR *szFullPath);\r\n    ~CLngAnalyzer();\r\n\r\n    unsigned int GetNumValues();\r\n    unsigned int GetNumSections();\r\n    CLngSection *GetSection(unsigned int uiIndex);\r\n    CLngSection *GetSection(const TCHAR *szName);\r\n    bool SectionHasValue(CLngSection *pSection,unsigned long ulName);\r\n};\r\n"
  },
  {
    "path": "src/tools/translationtool/main_dlg.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"lng_analyzer.hh\"\r\n#include \"main_dlg.hh\"\r\n\r\nBOOL CMainDlg::PreTranslateMessage(MSG *pMsg)\r\n{\r\n    return CWindow::IsDialogMessage(pMsg);\r\n}\r\n\r\nBOOL CMainDlg::OnIdle()\r\n{\r\n    return FALSE;\r\n}\r\n\r\nvoid CMainDlg::CloseDialog(int iVal)\r\n{\r\n    DestroyWindow();\r\n    ::PostQuitMessage(iVal);\r\n}\r\n\r\nLRESULT CMainDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    // Center the dialog on the screen.\r\n    CenterWindow();\r\n\r\n    DlgResize_Init(true,true,WS_CLIPCHILDREN);\r\n\r\n    // Set icons.\r\n    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n        IMAGE_ICON,::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR);\r\n    SetIcon(hIcon,TRUE);\r\n    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), \r\n        IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR);\r\n    SetIcon(hIconSmall,FALSE);\r\n\r\n    // Register object for message filtering and idle updates.\r\n    CMessageLoop *pLoop = _Module.GetMessageLoop();\r\n    ATLASSERT(pLoop != NULL);\r\n    pLoop->AddMessageFilter(this);\r\n    pLoop->AddIdleHandler(this);\r\n\r\n    UIAddChildWindowContainer(m_hWnd);\r\n\r\n    // Setup controls.\r\n    ::SendMessage(GetDlgItem(IDC_REFEDIT),EM_SETLIMITTEXT,MAX_PATH - 1,0);\r\n    ::EnableWindow(GetDlgItem(IDC_EXPORTBUTTON),FALSE);\r\n    m_TransList = GetDlgItem(IDC_TRANSLIST);\r\n\r\n    return TRUE;\r\n}\r\n\r\nLRESULT CMainDlg::OnDropFiles(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)\r\n{\r\n    HDROP hDrop = (HDROP)wParam;\r\n\r\n    POINT ptDrop;\r\n    TCHAR szFullName[MAX_PATH];\r\n\r\n    if (DragQueryPoint(hDrop,&ptDrop) > 0)\r\n    {\r\n        unsigned int uiNumFiles = DragQueryFile(hDrop,0xFFFFFFFF,NULL,NULL);\r\n\r\n        for (unsigned int i = 0; i < uiNumFiles; i++)\r\n        {\r\n            if (DragQueryFile(hDrop,i,szFullName,MAX_PATH - 1))\r\n                m_TransList.AddString(szFullName);\r\n        }\r\n    }\r\n\r\n    DragFinish(hDrop);\r\n\r\n    bHandled = false;\r\n    return 0;\r\n}\r\n\r\nbool CMainDlg::AnalyzeTranslation(const TCHAR *szFileName,CXmlProcessor *pXml)\r\n{\r\n    ::EnableWindow(GetDlgItem(IDC_EXPORTBUTTON),FALSE);\r\n\r\n    TCHAR szRefFile[MAX_PATH];\r\n    GetDlgItemText(IDC_REFEDIT,szRefFile,MAX_PATH - 1);\r\n\r\n    CLngAnalyzer RefFile(szRefFile);\r\n    CLngAnalyzer LangFile(szFileName);\r\n\r\n    if (RefFile.Load() != LNGRES_OK)\r\n        return false;\r\n\r\n    if (LangFile.Load() != LNGRES_OK)\r\n        return false;\r\n\r\n    // Add some translation information.\r\n    pXml->AddElement(_T(\"Header\"),_T(\"\"),true);\r\n        if (LangFile.EnterSection(_T(\"translation\")))\r\n        {\r\n            TCHAR *szStrValue;\r\n            // Author.\r\n            if (LangFile.GetValuePtr(1,szStrValue))\r\n                pXml->AddElement(_T(\"Author\"),szStrValue);\r\n            else\r\n                pXml->AddElement(_T(\"Author\"),_T(\"Unknown\"));\r\n\r\n            // Date.\r\n            if (LangFile.GetValuePtr(2,szStrValue))\r\n                pXml->AddElement(_T(\"Date\"),szStrValue);\r\n            else\r\n                pXml->AddElement(_T(\"Date\"),_T(\"Unknown\"));\r\n\r\n            // Version.\r\n            if (LangFile.GetValuePtr(3,szStrValue))\r\n                pXml->AddElement(_T(\"Version\"),szStrValue);\r\n            else\r\n                pXml->AddElement(_T(\"Version\"),_T(\"Unknown\"));\r\n\r\n            // Help.\r\n            if (LangFile.GetValuePtr(4,szStrValue))\r\n                pXml->AddElement(_T(\"Help\"),_T(\"Yes\"));\r\n            else\r\n                pXml->AddElement(_T(\"Help\"),_T(\"No\"));\r\n        }\r\n        else\r\n        {\r\n            pXml->AddElement(_T(\"Author\"),_T(\"Unknown\"));\r\n            pXml->AddElement(_T(\"Version\"),_T(\"Unknown\"));\r\n            pXml->AddElement(_T(\"Date\"),_T(\"Unknown\"));\r\n            pXml->AddElement(_T(\"Help\"),_T(\"Unknown\"));\r\n        }\r\n\r\n        // Ignore the values in the translation section.\r\n        unsigned int uiRefTransCount = 0;\r\n        CLngSection *pTempSection = RefFile.GetSection(_T(\"translation\"));\r\n        if (pTempSection != NULL)\r\n            uiRefTransCount = (unsigned int)pTempSection->m_Values.size();\r\n\r\n        unsigned int uiLangTransCount = 0;\r\n        pTempSection = LangFile.GetSection(_T(\"translation\"));\r\n        if (pTempSection != NULL)\r\n            uiLangTransCount = (unsigned int)pTempSection->m_Values.size();\r\n\r\n        pXml->AddElement(_T(\"SectionRatio\"),(double)LangFile.GetNumSections()/RefFile.GetNumSections());\r\n        pXml->AddElement(_T(\"ValueRatio\"),(double)(LangFile.GetNumValues() - uiLangTransCount)/(RefFile.GetNumValues() - uiRefTransCount));\r\n    pXml->LeaveElement();\r\n\r\n    pXml->AddElement(_T(\"Missing\"),_T(\"\"),true);\r\n        // Perform the comparission.\r\n        TCHAR szBuffer[32];\r\n        unsigned int uiSectionCount = 0;\r\n\r\n        for (unsigned int i = 0; i < RefFile.GetNumSections(); i++)\r\n        {\r\n            CLngSection *pRefSection = RefFile.GetSection(i);\r\n            if (pRefSection == NULL)\r\n                return false;\r\n\r\n            // Skip the [translation] section.\r\n            if (!lstrcmp(pRefSection->m_szName,_T(\"translation\")))\r\n                continue;\r\n\r\n            CLngSection *pLangSection = LangFile.GetSection(pRefSection->m_szName);\r\n            if (pLangSection == NULL)\r\n            {\r\n                lsprintf(szBuffer,_T(\"Item%d\"),uiSectionCount++);\r\n\r\n                pXml->AddElement(szBuffer,_T(\"\"),true);\r\n                pXml->AddElementAttr(_T(\"name\"),pRefSection->m_szName);\r\n                    for (unsigned int j = 0; j < pRefSection->m_Values.size(); j++)\r\n                    {\r\n                        lsprintf(szBuffer,_T(\"Item%d\"),j);\r\n\r\n                        pXml->AddElement(szBuffer,pRefSection->m_Values[j]->m_szValue,true);\r\n                        pXml->AddElementAttr(_T(\"name\"),(long)pRefSection->m_Values[j]->ulName);\r\n                        pXml->LeaveElement();\r\n                    }\r\n                pXml->LeaveElement();\r\n            }\r\n            else\r\n            {\r\n                bool bAddSection = false;\r\n                unsigned int uiValueCount = 0;\r\n\r\n                // Compare the section values.\r\n                for (unsigned int j = 0; j < pRefSection->m_Values.size(); j++)\r\n                {\r\n                    if (!LangFile.SectionHasValue(pLangSection,pRefSection->m_Values[j]->ulName))\r\n                    {\r\n                        // Add a new section if it hasn't already been added.\r\n                        if (!bAddSection)\r\n                        {\r\n                            lsprintf(szBuffer,_T(\"Item%d\"),uiSectionCount++);\r\n\r\n                            pXml->AddElement(szBuffer,_T(\"\"),true);\r\n                            pXml->AddElementAttr(_T(\"name\"),pRefSection->m_szName);\r\n\r\n                            bAddSection = true;\r\n                        }\r\n\r\n                        lsprintf(szBuffer,_T(\"Item%d\"),uiValueCount++);\r\n\r\n                        pXml->AddElement(szBuffer,pRefSection->m_Values[j]->m_szValue,true);\r\n                        pXml->AddElementAttr(_T(\"name\"),(long)pRefSection->m_Values[j]->ulName);\r\n                        pXml->LeaveElement();\r\n                    }\r\n                }\r\n\r\n                // Don't forget to leave any entered sections.\r\n                if (bAddSection)\r\n                    pXml->LeaveElement();\r\n            }\r\n        }\r\n    pXml->LeaveElement();\r\n\r\n    return true;\r\n}\r\n\r\nLRESULT CMainDlg::OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    for (int i = 0; i < m_TransList.GetCount(); i++)\r\n    {\r\n        TCHAR szTransFileName[MAX_PATH];\r\n        m_TransList.GetText(i,szTransFileName);\r\n\r\n        // Analyze the current translation.\r\n        CXmlProcessor Xml(CXmlProcessor::MODE_HTML);\r\n        Xml.AddElement(_T(\"InfraRecorder\"),_T(\"\"),true);\r\n            Xml.AddElement(_T(\"Translation\"),_T(\"\"),true);\r\n\r\n                AnalyzeTranslation(szTransFileName,&Xml);\r\n\r\n            Xml.LeaveElement();\r\n        Xml.LeaveElement();\r\n\r\n        // Calculate new file name.\r\n        ExtractFileName(szTransFileName);\r\n        ChangeFileExt(szTransFileName,_T(\".xml\"));\r\n\r\n        szTransFileName[0] = towlower(szTransFileName[0]);\r\n\r\n        TCHAR szFileName[MAX_PATH];\r\n        ::GetModuleFileName(NULL,szFileName,MAX_PATH - 1);\r\n        ExtractFilePath(szFileName);\r\n        lstrcat(szFileName,szTransFileName);\r\n\r\n        // Save the Xml document.\r\n        Xml.Save(szFileName);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    CloseDialog(wID);\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnClickedBrowseButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"Infra Recorder Languages (*.irl)\\0*.irl\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n        SetDlgItemText(IDC_REFEDIT,FileDialog.m_szFileName);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnClickedTransAddButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    WTL::CFileDialog FileDialog(true,0,0,OFN_FILEMUSTEXIST | OFN_EXPLORER,\r\n        _T(\"Infra Recorder Languages (*.irl)\\0*.irl\\0\\0\"),m_hWnd);\r\n\r\n    if (FileDialog.DoModal() == IDOK)\r\n        m_TransList.AddString(FileDialog.m_szFileName);\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnClickedTransRemoveButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    if (m_TransList.GetCount() > 0 && m_TransList.GetCurSel() >= 0)\r\n        m_TransList.DeleteString(m_TransList.GetCurSel());\r\n\r\n    return 0;\r\n}\r\n\r\nLRESULT CMainDlg::OnClickedTransClearButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled)\r\n{\r\n    m_TransList.ResetContent();\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "src/tools/translationtool/main_dlg.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n#include <base/xml_processor.hh>\r\n\r\nclass CMainDlg : public CDialogImpl<CMainDlg>,public CUpdateUI<CMainDlg>,\r\n    public CMessageFilter,public CIdleHandler,public CDialogResize<CMainDlg>\r\n{\r\nprivate:\r\n    CListBox m_TransList;\r\n\r\n    bool AnalyzeTranslation(const TCHAR *szFileName,CXmlProcessor *pXml);\r\n\r\npublic:\r\n    enum { IDD = IDD_MAINDLG };\r\n\r\n    void CloseDialog(int iVal);\r\n\r\n    virtual BOOL PreTranslateMessage(MSG *pMsg);\r\n    virtual BOOL OnIdle();\r\n\r\n    BEGIN_UPDATE_UI_MAP(CMainDlg)\r\n    END_UPDATE_UI_MAP()\r\n\r\n    BEGIN_DLGRESIZE_MAP(CMainDlg)\r\n        DLGRESIZE_CONTROL(IDOK,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(IDCANCEL,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(IDC_REFBUTTON,DLSZ_MOVE_X)\r\n        DLGRESIZE_CONTROL(IDC_TRANSADDBUTTON,DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_TRANSREMOVEBUTTON,DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_TRANSCLEARBUTTON,DLSZ_MOVE_Y)\r\n        DLGRESIZE_CONTROL(IDC_REFEDIT,DLSZ_SIZE_X)\r\n        DLGRESIZE_CONTROL(IDC_TRANSLIST,DLSZ_SIZE_X | DLSZ_SIZE_Y)\r\n    END_DLGRESIZE_MAP()\r\n\r\n    BEGIN_MSG_MAP(CMainDlg)\r\n        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)\r\n        MESSAGE_HANDLER(WM_DROPFILES,OnDropFiles)\r\n        COMMAND_ID_HANDLER(IDOK,OnOK)\r\n        COMMAND_ID_HANDLER(IDCANCEL,OnCancel)\r\n        COMMAND_HANDLER(IDC_REFBUTTON,BN_CLICKED,OnClickedBrowseButton)\r\n        COMMAND_HANDLER(IDC_TRANSADDBUTTON,BN_CLICKED,OnClickedTransAddButton)\r\n        COMMAND_HANDLER(IDC_TRANSREMOVEBUTTON,BN_CLICKED,OnClickedTransRemoveButton)\r\n        COMMAND_HANDLER(IDC_TRANSCLEARBUTTON,BN_CLICKED,OnClickedTransClearButton)\r\n\r\n        CHAIN_MSG_MAP(CDialogResize<CMainDlg>)\r\n    END_MSG_MAP()\r\n\r\n    LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnDropFiles(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled);\r\n    LRESULT OnOK(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnCancel(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n\r\n    LRESULT OnClickedBrowseButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnClickedTransAddButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnClickedTransRemoveButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n    LRESULT OnClickedTransClearButton(WORD wNotifyCode,WORD wID,HWND hWndCtl,BOOL &bHandled);\r\n};\r\n"
  },
  {
    "path": "src/tools/translationtool/resource.h",
    "content": "//{{NO_DEPENDENCIES}}\r\n// Microsoft Visual C++ generated include file.\r\n// Used by TranslationTool.rc\r\n//\r\n#define IDR_MAINFRAME                   128\r\n#define IDD_MAINDLG                     129\r\n#define IDC_REFSTATIC                   1001\r\n#define IDC_REFEDIT                     1002\r\n#define IDC_REFBUTTON                   1005\r\n#define IDC_EXPORTBUTTON                1010\r\n#define IDC_TRANSSTATIC                 1011\r\n#define IDC_TRANSLIST                   1012\r\n#define IDC_TRANSADDBUTTON              1013\r\n#define IDC_TRANSREMOVEBUTTON           1014\r\n#define IDC_TRANSCLEARBUTTON            1015\r\n\r\n// Next default values for new objects\r\n// \r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        201\r\n#define _APS_NEXT_COMMAND_VALUE         32772\r\n#define _APS_NEXT_CONTROL_VALUE         1016\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "src/tools/translationtool/stdafx.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n\r\n#if (_ATL_VER < 0x0700)\r\n#include <atlimpl.cpp>\r\n#endif //(_ATL_VER < 0x0700)\r\n"
  },
  {
    "path": "src/tools/translationtool/stdafx.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#pragma once\r\n\r\n// Change these values to use different versions.\r\n#define WINVER\t\t\t0x0400\r\n//#define _WIN32_WINNT\t0x0400\r\n#define _WIN32_IE\t\t0x0400\r\n#define _RICHEDIT_VER\t0x0100\r\n\r\n#include <atlbase.h>\r\n#include <atlapp.h>\r\n\r\nextern CAppModule _Module;\r\n\r\n#include <atlwin.h>\r\n#include <atlframe.h>\r\n#include <atlctrls.h>\r\n#include <atldlgs.h>\r\n\r\n#include \"../../app/atl_compat.hh\"\r\n\r\n// Manifest.\r\n#if defined _M_IX86\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_IA64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#elif defined _M_X64\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#else\r\n#pragma comment(linker,\"/manifestdependency:\\\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\")\r\n#endif\r\n"
  },
  {
    "path": "src/tools/translationtool/translationtool.cc",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include \"stdafx.hh\"\r\n#include \"resource.h\"\r\n#include \"main_dlg.hh\"\r\n\r\nCAppModule _Module;\r\n\r\nint Run(LPTSTR lpstrCmdLine = NULL,int nCmdShow = SW_SHOWDEFAULT)\r\n{\r\n    CMessageLoop MainLoop;\r\n    _Module.AddMessageLoop(&MainLoop);\r\n\r\n    CMainDlg MainDlg;\r\n\r\n    if (MainDlg.Create(NULL) == NULL)\r\n    {\r\n        ATLTRACE(_T(\"Main dialog creation failed!\\n\"));\r\n        return 0;\r\n    }\r\n\r\n    MainDlg.ShowWindow(nCmdShow);\r\n\r\n    int nRet = MainLoop.Run();\r\n\r\n    _Module.RemoveMessageLoop();\r\n    return nRet;\r\n}\r\n\r\nint WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpstrCmdLine,int nCmdShow)\r\n{\r\n    HRESULT hRes = ::CoInitialize(NULL);\r\n    // If you are running on NT 4.0 or higher you can use the following call instead to \r\n    // make the EXE free threaded. This means that calls come in on a random RPC thread.\r\n    //HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);\r\n    ATLASSERT(SUCCEEDED(hRes));\r\n\r\n    // This resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used.\r\n    ::DefWindowProc(NULL,0,0,0L);\r\n\r\n    AtlInitCommonControls(ICC_BAR_CLASSES);\t// Add flags to support other controls.\r\n\r\n    hRes = _Module.Init(NULL,hInstance);\r\n    ATLASSERT(SUCCEEDED(hRes));\r\n\r\n    int nRet = Run(lpstrCmdLine,nCmdShow);\r\n\r\n    _Module.Term();\r\n    ::CoUninitialize();\r\n\r\n    return nRet;\r\n}\r\n"
  },
  {
    "path": "src/tools/translationtool/translationtool.hh",
    "content": "/*\r\n * InfraRecorder - CD/DVD burning software\r\n * Copyright (C) 2006-2012 Christian Kindahl\r\n * \r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n * \r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n * \r\n * You should have received a copy of the GNU General Public License\r\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n */\r\n"
  },
  {
    "path": "src/tools/translationtool/translationtool.rc",
    "content": "// Microsoft Visual C++ generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include \"atlres.h\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE \r\nBEGIN\r\n    \"#include \"\"atlres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Icon\r\n//\r\n\r\n// Icon with lowest ID value placed first to ensure application icon\r\n// remains consistent on all systems.\r\nIDR_MAINFRAME           ICON                    \"resources\\\\icon-main.ico\"\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_MAINDLG DIALOGEX 0, 0, 322, 116\r\nSTYLE DS_SETFONT | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME\r\nCAPTION \"TranslationTool\"\r\nFONT 8, \"MS Sans Serif\", 0, 0, 0x0\r\nBEGIN\r\n    DEFPUSHBUTTON   \"Analyze\",IDOK,265,7,50,14\r\n    PUSHBUTTON      \"Exit\",IDCANCEL,265,24,50,14\r\n    LTEXT           \"Reference file:\",IDC_REFSTATIC,7,9,47,8\r\n    EDITTEXT        IDC_REFEDIT,60,7,173,13,ES_AUTOHSCROLL\r\n    PUSHBUTTON      \"...\",IDC_REFBUTTON,238,7,14,13\r\n    LTEXT           \"Translations:\",IDC_TRANSSTATIC,7,25,41,8\r\n    LISTBOX         IDC_TRANSLIST,60,23,192,69,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,WS_EX_ACCEPTFILES\r\n    PUSHBUTTON      \"Add\",IDC_TRANSADDBUTTON,60,95,33,14\r\n    PUSHBUTTON      \"Remove\",IDC_TRANSREMOVEBUTTON,97,95,33,14\r\n    PUSHBUTTON      \"Clear\",IDC_TRANSCLEARBUTTON,134,95,33,14\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// DESIGNINFO\r\n//\r\n\r\n#ifdef APSTUDIO_INVOKED\r\nGUIDELINES DESIGNINFO \r\nBEGIN\r\n    IDD_MAINDLG, DIALOG\r\n    BEGIN\r\n        LEFTMARGIN, 7\r\n        RIGHTMARGIN, 315\r\n        TOPMARGIN, 7\r\n        BOTTOMMARGIN, 109\r\n    END\r\nEND\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Accelerator\r\n//\r\n\r\nIDR_MAINFRAME ACCELERATORS \r\nBEGIN\r\n    \"N\",            ID_FILE_NEW,            VIRTKEY, CONTROL\r\n    \"O\",            ID_FILE_OPEN,           VIRTKEY, CONTROL\r\n    \"S\",            ID_FILE_SAVE,           VIRTKEY, CONTROL\r\n    \"P\",            ID_FILE_PRINT,          VIRTKEY, CONTROL\r\n    \"Z\",            ID_EDIT_UNDO,           VIRTKEY, CONTROL\r\n    \"X\",            ID_EDIT_CUT,            VIRTKEY, CONTROL\r\n    \"C\",            ID_EDIT_COPY,           VIRTKEY, CONTROL\r\n    \"V\",            ID_EDIT_PASTE,          VIRTKEY, CONTROL\r\n    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT\r\n    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT\r\n    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL\r\n    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT\r\n    VK_F6,          ID_NEXT_PANE,           VIRTKEY \r\n    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n FILEVERSION 1,0,0,1\r\n PRODUCTVERSION 1,0,0,1\r\n FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n FILEFLAGS 0x1L\r\n#else\r\n FILEFLAGS 0x0L\r\n#endif\r\n FILEOS 0x4L\r\n FILETYPE 0x2L\r\n FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"FileDescription\", \"InfraRecorder Translation Tool\"\r\n            VALUE \"FileVersion\", \"1.0.0.1\"\r\n            VALUE \"InternalName\", \"translationtool\"\r\n            VALUE \"LegalCopyright\", \"Copyright  2006-2010 Christian Kindahl\"\r\n            VALUE \"OriginalFilename\", \"translationtool.exe\"\r\n            VALUE \"ProductName\", \"InfraRecorder Translation Tool\"\r\n            VALUE \"ProductVersion\", \"1.0.0.1\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// String Table\r\n//\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    IDR_MAINFRAME           \"TranslationTool\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_FILE_NEW             \"Create a new document\\nNew\"\r\n    ID_FILE_OPEN            \"Open an existing document\\nOpen\"\r\n    ID_FILE_CLOSE           \"Close the active document\\nClose\"\r\n    ID_FILE_SAVE            \"Save the active document\\nSave\"\r\n    ID_FILE_SAVE_AS         \"Save the active document with a new name\\nSave As\"\r\n    ID_FILE_PAGE_SETUP      \"Change the printing options\\nPage Setup\"\r\n    ID_FILE_PRINT_SETUP     \"Change the printer and printing options\\nPrint Setup\"\r\n    ID_FILE_PRINT           \"Print the active document\\nPrint\"\r\n    ID_FILE_PRINT_PREVIEW   \"Display full pages\\nPrint Preview\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_APP_ABOUT            \"Display program information, version number and copyright\\nAbout\"\r\n    ID_APP_EXIT             \"Quit the application; prompts to save documents\\nExit\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_NEXT_PANE            \"Switch to the next window pane\\nNext Pane\"\r\n    ID_PREV_PANE            \"Switch back to the previous window pane\\nPrevious Pane\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_WINDOW_NEW           \"Open another window for the active document\\nNew Window\"\r\n    ID_WINDOW_ARRANGE       \"Arrange icons at the bottom of the window\\nArrange Icons\"\r\n    ID_WINDOW_CASCADE       \"Arrange windows so they overlap\\nCascade Windows\"\r\n    ID_WINDOW_TILE_HORZ     \"Arrange windows as non-overlapping tiles\\nTile Windows\"\r\n    ID_WINDOW_TILE_VERT     \"Arrange windows as non-overlapping tiles\\nTile Windows\"\r\n    ID_WINDOW_SPLIT         \"Split the active window into panes\\nSplit\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ID_EDIT_CLEAR           \"Erase the selection\\nErase\"\r\n    ID_EDIT_CLEAR_ALL       \"Erase everything\\nErase All\"\r\n    ID_EDIT_COPY            \"Copy the selection and put it on the Clipboard\\nCopy\"\r\n    ID_EDIT_CUT             \"Cut the selection and put it on the Clipboard\\nCut\"\r\n    ID_EDIT_FIND            \"Find the specified text\\nFind\"\r\n    ID_EDIT_PASTE           \"Insert Clipboard contents\\nPaste\"\r\n    ID_EDIT_REPEAT          \"Repeat the last action\\nRepeat\"\r\n    ID_EDIT_REPLACE         \"Replace specific text with different text\\nReplace\"\r\n    ID_EDIT_SELECT_ALL      \"Select the entire document\\nSelect All\"\r\n    ID_EDIT_UNDO            \"Undo the last action\\nUndo\"\r\n    ID_EDIT_REDO            \"Redo the previously undone action\\nRedo\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_SCSIZE          \"Change the window size\"\r\n    ATL_IDS_SCMOVE          \"Change the window position\"\r\n    ATL_IDS_SCMINIMIZE      \"Reduce the window to an icon\"\r\n    ATL_IDS_SCMAXIMIZE      \"Enlarge the window to full size\"\r\n    ATL_IDS_SCNEXTWINDOW    \"Switch to the next document window\"\r\n    ATL_IDS_SCPREVWINDOW    \"Switch to the previous document window\"\r\n    ATL_IDS_SCCLOSE         \"Close the active window and prompts to save the documents\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_SCRESTORE       \"Restore the window to normal size\"\r\n    ATL_IDS_SCTASKLIST      \"Activate Task List\"\r\n    ATL_IDS_MDICHILD        \"Activate this window\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_IDLEMESSAGE     \"Ready\"\r\nEND\r\n\r\nSTRINGTABLE \r\nBEGIN\r\n    ATL_IDS_MRU_FILE        \"Open this document\"\r\nEND\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// Swedish resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n3 TEXTINCLUDE \r\nBEGIN\r\n    \"\\r\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n#endif    // Swedish resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "src/tools/translationtool/translationtool_vc08.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"translationtool\"\r\n\tProjectGUID=\"{890C6C24-55F8-466B-91BE-221F6214C3B8}\"\r\n\tRootNamespace=\"translationtool\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/translationtool.tlb\"\r\n\t\t\t\tHeaderFileName=\"translationtool.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"translationtool_i.c\"\r\n\t\t\t\tProxyFileName=\"translationtool_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"false\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/translationtool.tlb\"\r\n\t\t\t\tHeaderFileName=\"translationtool.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"translationtool_i.c\"\r\n\t\t\t\tProxyFileName=\"translationtool_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"_DEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalDependencies=\"ckcored.lib\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"true\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"1\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/translationtool.tlb\"\r\n\t\t\t\tHeaderFileName=\"translationtool.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"translationtool_i.c\"\r\n\t\t\t\tProxyFileName=\"translationtool_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:atlmincrt.lib\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(ProjectDir)..\\..\\..\\bin\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tInheritedPropertySheets=\"$(VCInstallDir)VCProjectDefaults\\UpgradeFromVC71.vsprops\"\r\n\t\t\tATLMinimizesCRunTimeLibraryUsage=\"true\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tMkTypLibCompatible=\"false\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t\tGenerateStublessProxies=\"true\"\r\n\t\t\t\tTypeLibraryName=\"$(IntDir)/translationtool.tlb\"\r\n\t\t\t\tHeaderFileName=\"translationtool.hh\"\r\n\t\t\t\tDLLDataFileName=\"\"\r\n\t\t\t\tInterfaceIdentifierFileName=\"translationtool_i.c\"\r\n\t\t\t\tProxyFileName=\"translationtool_p.c\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(ProjectDir)..\\..\\\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS\"\r\n\t\t\t\tExceptionHandling=\"1\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"0\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"NDEBUG\"\r\n\t\t\t\tCulture=\"1033\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"$(IntDir)\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tAdditionalOptions=\"/NODEFAULTLIB:atlmincrt.lib\"\r\n\t\t\t\tAdditionalDependencies=\"ckcore.lib\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lng_analyzer.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\main_dlg.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\translationtool.cc\"\r\n\t\t\t\t>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tPrecompiledHeaderThrough=\"stdafx.hh\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\lng_analyzer.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\main_dlg.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resource.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\stdafx.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\translationtool.hh\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Resource Files\"\r\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\resources\\icon-main.ico\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\".\\translationtool.rc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t\t<Global\r\n\t\t\tName=\"RESOURCE_FILE\"\r\n\t\t\tValue=\"translationtool.rc\"\r\n\t\t/>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "src/tools/translationtool/translationtool_vc10.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|Win32\">\n      <Configuration>Template</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Template|x64\">\n      <Configuration>Template</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectName>translationtool</ProjectName>\n    <ProjectGuid>{890C6C24-55F8-466B-91BE-221F6214C3B8}</ProjectGuid>\n    <RootNamespace>translationtool</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</LinkIncremental>\n    <OutDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\bin\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(ProjectDir)..\\..\\..\\obj\\$(ProjectName)\\$(Platform)\\$(Configuration)\\</IntDir>\n    <LinkIncremental Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</LinkIncremental>\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|Win32'\" />\n    <CodeAnalysisRuleSet Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\">AllRules.ruleset</CodeAnalysisRuleSet>\n    <CodeAnalysisRules Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <CodeAnalysisRuleAssemblies Condition=\"'$(Configuration)|$(Platform)'=='Template|x64'\" />\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\lib64\\;$(CKROOTDIR)\\ckcore\\lib64\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <LibraryPath Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">$(CKCOREDIR)\\lib\\;$(CKROOTDIR)\\ckcore\\lib\\;$(LibraryPath)</LibraryPath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n    <IncludePath Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">$(CKCOREDIR)\\include\\;$(CKROOTDIR)\\ckcore\\include\\;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)translationtool.tlb</TypeLibraryName>\n      <HeaderFileName>translationtool.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>translationtool_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>translationtool_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)translationtool.tlb</TypeLibraryName>\n      <HeaderFileName>translationtool.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>translationtool_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>translationtool_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <Optimization>Disabled</Optimization>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MinimalRebuild>true</MinimalRebuild>\n      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalDependencies>ckcored.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>Win32</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)translationtool.tlb</TypeLibraryName>\n      <HeaderFileName>translationtool.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>translationtool_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>translationtool_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:atlmincrt.lib %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX86</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Midl>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MkTypLibCompatible>false</MkTypLibCompatible>\n      <TargetEnvironment>X64</TargetEnvironment>\n      <GenerateStublessProxies>true</GenerateStublessProxies>\n      <TypeLibraryName>$(IntDir)translationtool.tlb</TypeLibraryName>\n      <HeaderFileName>translationtool.hh</HeaderFileName>\n      <DllDataFileName>\n      </DllDataFileName>\n      <InterfaceIdentifierFileName>translationtool_i.c</InterfaceIdentifierFileName>\n      <ProxyFileName>translationtool_p.c</ProxyFileName>\n    </Midl>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(ProjectDir)..\\..\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n      <PreprocessorDefinitions>WIN32;_WINDOWS;STRICT;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ExceptionHandling>Sync</ExceptionHandling>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <DebugInformationFormat>\n      </DebugInformationFormat>\n    </ClCompile>\n    <ResourceCompile>\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <Culture>0x0409</Culture>\n      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ResourceCompile>\n    <Link>\n      <AdditionalOptions>/NODEFAULTLIB:atlmincrt.lib %(AdditionalOptions)</AdditionalOptions>\n      <AdditionalDependencies>ckcore.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <SubSystem>Windows</SubSystem>\n      <TargetMachine>MachineX64</TargetMachine>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"lng_analyzer.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"main_dlg.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n    <ClCompile Include=\"translationtool.cc\">\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">stdafx.hh</PrecompiledHeaderFile>\n      <PrecompiledHeaderFile Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">stdafx.hh</PrecompiledHeaderFile>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"lng_analyzer.hh\" />\n    <None Include=\"main_dlg.hh\" />\n    <None Include=\"stdafx.hh\" />\n    <None Include=\"translationtool.hh\" />\n    <None Include=\"resources\\icon-main.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"translationtool.rc\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\base\\base_vc10.vcxproj\">\n      <Project>{81ea1bb3-2ba0-4600-9081-2d2cb9203466}</Project>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n  <ProjectExtensions>\n    <VisualStudio>\n      <UserProperties RESOURCE_FILE=\"translationtool.rc\" />\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/tools/translationtool/translationtool_vc10.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{7f135e9d-1a42-46d4-b255-985930f45d55}</UniqueIdentifier>\n      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{a6feaf20-fce1-48ec-bda2-3d15b4297a65}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{09219bad-a1c3-4acb-b33c-67f59cf986d7}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;jpg;jpeg;jpe;manifest</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"lng_analyzer.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"main_dlg.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"translationtool.cc\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"lng_analyzer.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"main_dlg.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"stdafx.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"translationtool.hh\">\n      <Filter>Header Files</Filter>\n    </None>\n    <None Include=\"resources\\icon-main.ico\">\n      <Filter>Resource Files</Filter>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"resource.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ResourceCompile Include=\"translationtool.rc\">\n      <Filter>Resource Files</Filter>\n    </ResourceCompile>\n  </ItemGroup>\n</Project>"
  }
]