/trunk/LICENSE |
---|
0,0 → 1,202 |
Apache License |
Version 2.0, January 2004 |
http://www.apache.org/licenses/ |
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
1. Definitions. |
"License" shall mean the terms and conditions for use, reproduction, |
and distribution as defined by Sections 1 through 9 of this document. |
"Licensor" shall mean the copyright owner or entity authorized by |
the copyright owner that is granting the License. |
"Legal Entity" shall mean the union of the acting entity and all |
other entities that control, are controlled by, or are under common |
control with that entity. For the purposes of this definition, |
"control" means (i) the power, direct or indirect, to cause the |
direction or management of such entity, whether by contract or |
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
outstanding shares, or (iii) beneficial ownership of such entity. |
"You" (or "Your") shall mean an individual or Legal Entity |
exercising permissions granted by this License. |
"Source" form shall mean the preferred form for making modifications, |
including but not limited to software source code, documentation |
source, and configuration files. |
"Object" form shall mean any form resulting from mechanical |
transformation or translation of a Source form, including but |
not limited to compiled object code, generated documentation, |
and conversions to other media types. |
"Work" shall mean the work of authorship, whether in Source or |
Object form, made available under the License, as indicated by a |
copyright notice that is included in or attached to the work |
(an example is provided in the Appendix below). |
"Derivative Works" shall mean any work, whether in Source or Object |
form, that is based on (or derived from) the Work and for which the |
editorial revisions, annotations, elaborations, or other modifications |
represent, as a whole, an original work of authorship. For the purposes |
of this License, Derivative Works shall not include works that remain |
separable from, or merely link (or bind by name) to the interfaces of, |
the Work and Derivative Works thereof. |
"Contribution" shall mean any work of authorship, including |
the original version of the Work and any modifications or additions |
to that Work or Derivative Works thereof, that is intentionally |
submitted to Licensor for inclusion in the Work by the copyright owner |
or by an individual or Legal Entity authorized to submit on behalf of |
the copyright owner. For the purposes of this definition, "submitted" |
means any form of electronic, verbal, or written communication sent |
to the Licensor or its representatives, including but not limited to |
communication on electronic mailing lists, source code control systems, |
and issue tracking systems that are managed by, or on behalf of, the |
Licensor for the purpose of discussing and improving the Work, but |
excluding communication that is conspicuously marked or otherwise |
designated in writing by the copyright owner as "Not a Contribution." |
"Contributor" shall mean Licensor and any individual or Legal Entity |
on behalf of whom a Contribution has been received by Licensor and |
subsequently incorporated within the Work. |
2. Grant of Copyright License. Subject to the terms and conditions of |
this License, each Contributor hereby grants to You a perpetual, |
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
copyright license to reproduce, prepare Derivative Works of, |
publicly display, publicly perform, sublicense, and distribute the |
Work and such Derivative Works in Source or Object form. |
3. Grant of Patent License. Subject to the terms and conditions of |
this License, each Contributor hereby grants to You a perpetual, |
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
(except as stated in this section) patent license to make, have made, |
use, offer to sell, sell, import, and otherwise transfer the Work, |
where such license applies only to those patent claims licensable |
by such Contributor that are necessarily infringed by their |
Contribution(s) alone or by combination of their Contribution(s) |
with the Work to which such Contribution(s) was submitted. If You |
institute patent litigation against any entity (including a |
cross-claim or counterclaim in a lawsuit) alleging that the Work |
or a Contribution incorporated within the Work constitutes direct |
or contributory patent infringement, then any patent licenses |
granted to You under this License for that Work shall terminate |
as of the date such litigation is filed. |
4. Redistribution. You may reproduce and distribute copies of the |
Work or Derivative Works thereof in any medium, with or without |
modifications, and in Source or Object form, provided that You |
meet the following conditions: |
(a) You must give any other recipients of the Work or |
Derivative Works a copy of this License; and |
(b) You must cause any modified files to carry prominent notices |
stating that You changed the files; and |
(c) You must retain, in the Source form of any Derivative Works |
that You distribute, all copyright, patent, trademark, and |
attribution notices from the Source form of the Work, |
excluding those notices that do not pertain to any part of |
the Derivative Works; and |
(d) If the Work includes a "NOTICE" text file as part of its |
distribution, then any Derivative Works that You distribute must |
include a readable copy of the attribution notices contained |
within such NOTICE file, excluding those notices that do not |
pertain to any part of the Derivative Works, in at least one |
of the following places: within a NOTICE text file distributed |
as part of the Derivative Works; within the Source form or |
documentation, if provided along with the Derivative Works; or, |
within a display generated by the Derivative Works, if and |
wherever such third-party notices normally appear. The contents |
of the NOTICE file are for informational purposes only and |
do not modify the License. You may add Your own attribution |
notices within Derivative Works that You distribute, alongside |
or as an addendum to the NOTICE text from the Work, provided |
that such additional attribution notices cannot be construed |
as modifying the License. |
You may add Your own copyright statement to Your modifications and |
may provide additional or different license terms and conditions |
for use, reproduction, or distribution of Your modifications, or |
for any such Derivative Works as a whole, provided Your use, |
reproduction, and distribution of the Work otherwise complies with |
the conditions stated in this License. |
5. Submission of Contributions. Unless You explicitly state otherwise, |
any Contribution intentionally submitted for inclusion in the Work |
by You to the Licensor shall be under the terms and conditions of |
this License, without any additional terms or conditions. |
Notwithstanding the above, nothing herein shall supersede or modify |
the terms of any separate license agreement you may have executed |
with Licensor regarding such Contributions. |
6. Trademarks. This License does not grant permission to use the trade |
names, trademarks, service marks, or product names of the Licensor, |
except as required for reasonable and customary use in describing the |
origin of the Work and reproducing the content of the NOTICE file. |
7. Disclaimer of Warranty. Unless required by applicable law or |
agreed to in writing, Licensor provides the Work (and each |
Contributor provides its Contributions) on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
implied, including, without limitation, any warranties or conditions |
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
PARTICULAR PURPOSE. You are solely responsible for determining the |
appropriateness of using or redistributing the Work and assume any |
risks associated with Your exercise of permissions under this License. |
8. Limitation of Liability. In no event and under no legal theory, |
whether in tort (including negligence), contract, or otherwise, |
unless required by applicable law (such as deliberate and grossly |
negligent acts) or agreed to in writing, shall any Contributor be |
liable to You for damages, including any direct, indirect, special, |
incidental, or consequential damages of any character arising as a |
result of this License or out of the use or inability to use the |
Work (including but not limited to damages for loss of goodwill, |
work stoppage, computer failure or malfunction, or any and all |
other commercial damages or losses), even if such Contributor |
has been advised of the possibility of such damages. |
9. Accepting Warranty or Additional Liability. While redistributing |
the Work or Derivative Works thereof, You may choose to offer, |
and charge a fee for, acceptance of support, warranty, indemnity, |
or other liability obligations and/or rights consistent with this |
License. However, in accepting such obligations, You may act only |
on Your own behalf and on Your sole responsibility, not on behalf |
of any other Contributor, and only if You agree to indemnify, |
defend, and hold each Contributor harmless for any liability |
incurred by, or claims asserted against, such Contributor by reason |
of your accepting any such warranty or additional liability. |
END OF TERMS AND CONDITIONS |
APPENDIX: How to apply the Apache License to your work. |
To apply the Apache License to your work, attach the following |
boilerplate notice, with the fields enclosed by brackets "[]" |
replaced with your own identifying information. (Don't include |
the brackets!) The text should be enclosed in the appropriate |
comment syntax for the file format. We also recommend that a |
file or class name and description of purpose be included on the |
same "printed page" as the copyright notice for easier |
identification within third-party archives. |
Copyright 2020 Daniel Marschall, ViaThinkSoft |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
limitations under the License. |
/trunk/PHP/md5_generate.php |
---|
0,0 → 1,94 |
#!/usr/bin/php |
<?php |
/* |
Copyright 2020 Daniel Marschall, ViaThinkSoft |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
limitations under the License. |
*/ |
// This script generates MD5 files |
// If there is already an MD5 file existing, only new files get appended to the existing MD5 files. |
function _rec($directory) { |
if (!is_dir($directory)) { |
die("Invalid directory path $directory\n"); |
} |
$md5_file = $directory.'/'.basename($directory).'.md5'; |
if (file_exists($md5_file)) { |
$existing_files = md5_get_files($md5_file); |
} else { |
$existing_files = array(); |
} |
foreach (scandir($directory) as $file) { |
if ($file === '.') continue; |
if ($file === '..') continue; |
if (strtolower($file) === 'thumbs.db') continue; |
if (substr($file, -4) === '.md5') continue; |
if (substr($file, -4) === '.sfv') continue; |
$fullpath = $directory . '/' . $file; |
if (is_dir($fullpath)) { |
_rec($fullpath); |
} else { |
### echo "$fullpath\n"; |
$dir = pathinfo($fullpath, PATHINFO_DIRNAME); |
if (!file_exists($md5_file)) { |
file_put_contents($md5_file, "; Generated by ViaThinkSoft\r\n"); // TODO: BOM |
} |
if (!in_array($file, $existing_files)) { |
$md5 = strtolower(md5_file($fullpath)); |
file_put_contents($md5_file, "$md5 *$file\r\n", FILE_APPEND); |
} |
} |
} |
} |
function md5_get_files($filename) { |
$out = array(); |
$lines = file($filename); |
foreach ($lines as $line) { |
$line = str_replace("\xEF\xBB\xBF",'',$line); |
$line = trim($line); |
if ($line == '') continue; |
$line = str_replace('*', ' ', $line); |
$line = str_replace("\t", ' ', $line); |
list($checksum, $origname) = explode(' ', $line, 2); |
$origname = dirname($filename) . '/' . trim($origname); |
$checksum = trim($checksum); |
$out[] = $origname; |
} |
return $out; |
} |
# --- |
if ($argc != 2) { |
echo "Syntax: $argv[0] <directory>\n"; |
exit(2); |
} |
if (!is_dir($argv[1])) { |
echo "Directory not found\n"; |
exit(1); |
} |
_rec($argv[1]); |
echo "Done.\n"; |
/trunk/PHP/md5_verify.php |
---|
0,0 → 1,93 |
#!/usr/bin/php |
<?php |
/* |
Copyright 2020 Daniel Marschall, ViaThinkSoft |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
limitations under the License. |
*/ |
function testmd5($file) { |
// TODO: warn if an entry is multiple times (with different checksums) in a single file |
if (!file_exists($file)) { |
echo "ERROR: File $file does not exist.\n"; |
return; |
} |
$lines = file($file); |
foreach ($lines as $line) { |
$line = str_replace("\xEF\xBB\xBF",'',$line); |
$line = trim($line); |
if ($line == '') continue; |
$line = str_replace('*', ' ', $line); |
$line = str_replace("\t", ' ', $line); |
list($checksum, $origname) = explode(' ', $line, 2); |
$origname = dirname($file) . '/' . trim($origname); |
$checksum = trim($checksum); |
if (!file_exists($origname)) { |
echo "WARNING: File vanished : $origname\n"; |
} else { |
$checksum2 = md5_file($origname); |
if (strtolower($checksum) != strtolower($checksum2)) { |
echo "CHECKSUM FAIL: $origname (expected $checksum, but is $checksum2)\n"; |
} else { |
//echo "OK: $origname\n"; |
} |
} |
// TODO: Also warn about extra files which are not indexed |
} |
} |
function _rec($directory) { |
if (!is_dir($directory)) { |
exit("Invalid directory path $directory\n"); |
} |
if ($dont_add_files = count(glob("$directory/*.md5")) == 0) { |
// echo "Directory $directory has no MD5 file. Skipping.\n"; |
} else { |
$out = array(); |
// echo "Check $directory\n"; |
$md5files = glob('*.md5'); |
foreach ($md5files as $md5file) { |
testmd5($md5file); |
} |
} |
foreach (scandir($directory) as $file) { |
if ($file !== '.' && $file !== '..') { |
$file = $directory . '/' . $file; |
if (is_dir($file)) { |
_rec($file); |
} |
} |
} |
} |
# --- |
if ($argc != 2) { |
echo "Syntax: $argv[0] <directory>\n"; |
exit(2); |
} |
if (!is_dir($argv[1])) { |
echo "Directory not found\n"; |
exit(1); |
} |
_rec($argv[1]); |
echo "Done.\n"; |
/trunk/PHP/sfv_generate.php |
---|
0,0 → 1,103 |
#!/usr/bin/php |
<?php |
/* |
Copyright 2020 Daniel Marschall, ViaThinkSoft |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
limitations under the License. |
*/ |
// This script generates SFV files |
// If there is already an SFV file existing, only new files get appended to the existing SFV files. |
function _rec($directory) { |
if (!is_dir($directory)) { |
die("Invalid directory path $directory\n"); |
} |
$sfv_file = $directory.'/'.basename($directory).'.sfv'; |
if (file_exists($sfv_file)) { |
$existing_files = sfv_get_files($sfv_file); |
} else { |
$existing_files = array(); |
} |
foreach (scandir($directory) as $file) { |
if ($file === '.') continue; |
if ($file === '..') continue; |
if (strtolower($file) === 'thumbs.db') continue; |
if (substr($file, -4) === '.md5') continue; |
if (substr($file, -4) === '.sfv') continue; |
$fullpath = $directory . '/' . $file; |
if (is_dir($fullpath)) { |
_rec($fullpath); |
} else { |
### echo "$fullpath\n"; |
$dir = pathinfo($fullpath, PATHINFO_DIRNAME); |
if (!file_exists($sfv_file)) { |
file_put_contents($sfv_file, "; Generated by ViaThinkSoft\r\n"); // TODO: BOM |
} |
if (!in_array($file, $existing_files)) { |
$crc32 = strtoupper(crc32_file($fullpath)); |
file_put_contents($sfv_file, "$file $crc32\r\n", FILE_APPEND); |
} |
} |
} |
} |
function sfv_get_files($filename) { |
$out = array(); |
$lines = file($filename); |
foreach ($lines as $line) { |
$line = rtrim($line); |
if ($line == '') continue; |
if (substr($line,0,1) == ';') continue; |
$out[] = substr($line, 0, strrpos($line, ' ')); |
} |
return $out; |
} |
function swapEndianness($hex) { |
return implode('', array_reverse(str_split($hex, 2))); |
} |
function crc32_file($filename, $rawOutput = false) { |
$out = bin2hex(hash_file ('crc32b', $filename , true)); |
if (hash('crc32b', 'TEST') == 'b893eaee') { |
// hash_file() in PHP 5.2 has the wrong Endianess! |
// https://bugs.php.net/bug.php?id=47467 |
$out = swapEndianness($out); |
} |
return $out; |
} |
# --- |
if ($argc != 2) { |
echo "Syntax: $argv[0] <directory>\n"; |
exit(2); |
} |
if (!is_dir($argv[1])) { |
echo "Directory not found\n"; |
exit(1); |
} |
_rec($argv[1]); |
echo "Done.\n"; |
/trunk/PHP/sfv_verify.php |
---|
0,0 → 1,105 |
#!/usr/bin/php |
<?php |
/* |
Copyright 2020 Daniel Marschall, ViaThinkSoft |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
limitations under the License. |
*/ |
function testsfv($file) { |
// TODO: warn if an entry is multiple times (with different checksums) in a single file |
if (!file_exists($file)) { |
echo "ERROR: File $file does not exist.\n"; |
return; |
} |
$lines = file($file); |
foreach ($lines as $line) { |
$line = str_replace("\xEF\xBB\xBF",'',$line); |
$line = rtrim($line); |
if ($line == '') continue; |
$checksum = substr($line,-8); |
$origname = rtrim(substr($line,0,strlen($line)-8)); |
$origname = dirname($file) . '/' . trim($origname); |
if (!file_exists($origname)) { |
echo "WARNING: File vanished : $origname\n"; |
} else { |
$checksum2 = crc32_file($origname); |
if (strtolower($checksum) != strtolower($checksum2)) { |
echo "CHECKSUM FAIL: $origname (expected $checksum, but is $checksum2)\n"; |
} else { |
//echo "OK: $origname\n"; |
} |
} |
// TODO: Also warn about extra files which are not indexed |
} |
} |
function swapEndianness($hex) { |
return implode('', array_reverse(str_split($hex, 2))); |
} |
function crc32_file($filename, $rawOutput = false) { |
$out = bin2hex(hash_file ('crc32b', $filename , true)); |
if (hash('crc32b', 'TEST') == 'b893eaee') { |
// hash_file() in PHP 5.2 has the wrong Endianess! |
// https://bugs.php.net/bug.php?id=47467 |
$out = swapEndianness($out); |
} |
return $out; |
} |
function _rec($directory) { |
if (!is_dir($directory)) { |
exit("Invalid directory path $directory\n"); |
} |
if ($dont_add_files = count(glob("$directory/*.sfv")) == 0) { |
// echo "Directory $directory has no SFV file. Skipping.\n"; |
} else { |
$out = array(); |
// echo "Check $directory\n"; |
$sfvfiles = glob('*.sfv'); |
foreach ($sfvfiles as $sfvfile) { |
testsfv($sfvfile); |
} |
} |
foreach (scandir($directory) as $file) { |
if ($file !== '.' && $file !== '..') { |
$file = $directory . '/' . $file; |
if (is_dir($file)) { |
_rec($file); |
} |
} |
} |
} |
# --- |
if ($argc != 2) { |
echo "Syntax: $argv[0] <directory>\n"; |
exit(2); |
} |
if (!is_dir($argv[1])) { |
echo "Directory not found\n"; |
exit(1); |
} |
_rec($argv[1]); |
echo "Done.\n"; |
/trunk/Windows/CRC32.pas |
---|
0,0 → 1,255 |
// CRC32 calculates a cyclic redundancy code (CRC), known as CRC-32, using |
// a byte-wise algorithm. |
// |
// (C) Copyright 1989, 1995-1996, 1999 Earl F. Glynn, Overland Park, KS. |
// All Rights Reserved. |
// |
// This UNIT was derived from the CRCT FORTRAN 77 program given in |
// "Byte-wise CRC Calculations" by Aram Perez in IEEE Micro, June 1983, |
// pp. 40-50. The constants here are for the CRC-32 generator polynomial, |
// as defined in the Microsoft Systems Journal, March 1995, pp. 107-108 |
// |
// This CRC algorithm emphasizes speed at the expense of the 256-element |
// lookup table. |
// |
// Updated for Delphi 4 dynamic arrays and stream I/O. July 1999. |
UNIT CRC32; |
INTERFACE |
USES |
Windows; // DWORD for D3/D4 compatibility |
TYPE |
{$IFDEF VER130} // This is a bit awkward |
// 8-byte integer |
TInteger8 = Int64; // Delphi 5 |
{$ELSE} |
{$IFDEF VER120} |
TInteger8 = Int64; // Delphi 4 |
{$ELSE} |
TInteger8 = COMP; // Delphi 2 or 3 |
{$ENDIF} |
{$ENDIF} |
PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCvalue: DWORD); |
PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; |
VAR TotalBytes: TInteger8; |
VAR error: WORD); |
IMPLEMENTATION |
USES |
{$IFDEF StreamIO} |
SysUtils, // SysErrorMessage |
{$ENDIF} |
Dialogs, // ShowMessage |
Classes, // TMemoryStream |
LongFilenameOperations; // added by ViaThinkSoft |
CONST |
table: ARRAY[0..255] OF DWORD = |
($00000000, $77073096, $EE0E612C, $990951BA, |
$076DC419, $706AF48F, $E963A535, $9E6495A3, |
$0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988, |
$09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91, |
$1DB71064, $6AB020F2, $F3B97148, $84BE41DE, |
$1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7, |
$136C9856, $646BA8C0, $FD62F97A, $8A65C9EC, |
$14015C4F, $63066CD9, $FA0F3D63, $8D080DF5, |
$3B6E20C8, $4C69105E, $D56041E4, $A2677172, |
$3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B, |
$35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940, |
$32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59, |
$26D930AC, $51DE003A, $C8D75180, $BFD06116, |
$21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F, |
$2802B89E, $5F058808, $C60CD9B2, $B10BE924, |
$2F6F7C87, $58684C11, $C1611DAB, $B6662D3D, |
$76DC4190, $01DB7106, $98D220BC, $EFD5102A, |
$71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433, |
$7807C9A2, $0F00F934, $9609A88E, $E10E9818, |
$7F6A0DBB, $086D3D2D, $91646C97, $E6635C01, |
$6B6B51F4, $1C6C6162, $856530D8, $F262004E, |
$6C0695ED, $1B01A57B, $8208F4C1, $F50FC457, |
$65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C, |
$62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65, |
$4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2, |
$4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB, |
$4369E96A, $346ED9FC, $AD678846, $DA60B8D0, |
$44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9, |
$5005713C, $270241AA, $BE0B1010, $C90C2086, |
$5768B525, $206F85B3, $B966D409, $CE61E49F, |
$5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4, |
$59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD, |
$EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A, |
$EAD54739, $9DD277AF, $04DB2615, $73DC1683, |
$E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8, |
$E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1, |
$F00F9344, $8708A3D2, $1E01F268, $6906C2FE, |
$F762575D, $806567CB, $196C3671, $6E6B06E7, |
$FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC, |
$F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5, |
$D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252, |
$D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B, |
$D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60, |
$DF60EFC3, $A867DF55, $316E8EEF, $4669BE79, |
$CB61B38C, $BC66831A, $256FD2A0, $5268E236, |
$CC0C7795, $BB0B4703, $220216B9, $5505262F, |
$C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04, |
$C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D, |
$9B64C2B0, $EC63F226, $756AA39C, $026D930A, |
$9C0906A9, $EB0E363F, $72076785, $05005713, |
$95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38, |
$92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21, |
$86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E, |
$81BE16CD, $F6B9265B, $6FB077E1, $18B74777, |
$88085AE6, $FF0F6A70, $66063BCA, $11010B5C, |
$8F659EFF, $F862AE69, $616BFFD3, $166CCF45, |
$A00AE278, $D70DD2EE, $4E048354, $3903B3C2, |
$A7672661, $D06016F7, $4969474D, $3E6E77DB, |
$AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0, |
$A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9, |
$BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6, |
$BAD03605, $CDD70693, $54DE5729, $23D967BF, |
$B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94, |
$B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D); |
// Use CalcCRC32 as a procedure so CRCValue can be passed in but |
// also returned. This allows multiple calls to CalcCRC32 for |
// the "same" CRC-32 calculation. |
PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCValue: DWORD); |
// The following is a little cryptic (but executes very quickly). |
// The algorithm is as follows: |
// 1. exclusive-or the input byte with the low-order byte of |
// the CRC register to get an INDEX |
// 2. shift the CRC register eight bits to the right |
// 3. exclusive-or the CRC register with the contents of |
// Table[INDEX] |
// 4. repeat steps 1 through 3 for all bytes |
VAR |
i: DWORD; |
q: ^BYTE; |
BEGIN |
q := p; |
FOR i := 0 TO ByteCount-1 DO BEGIN |
CRCvalue := (CRCvalue SHR 8) XOR |
Table[ q^ XOR (CRCvalue AND $000000FF) ]; |
INC(q) |
END |
END {CalcCRC32}; |
{$IFDEF StreamIO} // Contemporary method using TMemoryStream |
// The CRC-32 value calculated here matches the one from the PKZIP program. |
// Use MemoryStream to read file in binary mode. |
PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; |
VAR TotalBytes: TInteger8; |
VAR error: WORD); |
VAR |
Stream: TMemoryStream; |
BEGIN |
error := 0; |
CRCValue := $FFFFFFFF; |
Stream := TMemoryStream.Create; |
TRY |
TRY |
Stream.LoadFromFile(FromName); |
IF Stream.Size > 0 |
THEN CalcCRC32 (Stream.Memory, Stream.Size, CRCvalue) |
EXCEPT |
ON E: EReadError DO |
error := 1 |
END; |
CRCvalue := NOT CRCvalue |
FINALLY |
Stream.Free |
END; |
END {CalcFileCRC32}; |
{$ELSE} // "older" BlockRead method |
// The CRC-32 value calculated here matches the one from the PKZIP program. |
// Use BlockRead to read file in binary mode. |
PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: DWORD; |
VAR TotalBytes: TInteger8; |
VAR error: WORD); |
CONST |
BufferSize = 32768; |
TYPE |
BufferIndex = 0..BufferSize-1; |
TBuffer = ARRAY[BufferIndex] OF BYTE; |
pBuffer = ^TBuffer; |
VAR |
BytesRead: INTEGER; |
FromFile : FILE; |
FromFile2: THandle; |
IOBuffer : pBuffer; |
BEGIN |
New(IOBuffer); |
TRY |
FileMode := 0; {Turbo default is 2 for R/W; 0 is for R/O} |
CRCValue := $FFFFFFFF; |
if Length(FromName) >= MAX_PATH then |
begin |
MyASSIGNFile (FromFile2,FromName); |
MyRESET (FromFile2); |
error := GetLastError; |
end |
else |
begin |
ASSIGN (FromFile,FromName); |
{$I-} RESET (FromFile,1); {$I+} |
error := IOResult; |
end; |
IF error = 0 |
THEN BEGIN |
TotalBytes := 0; |
REPEAT |
if Length(FromName) >= MAX_PATH then // [sic!] "greater equal" is correct! The Delphi functions fail if the filename is 260 or greater, but Microsoft says MAX_PATH is the maximum (legal) length! |
begin |
MyBlockRead (FromFile2, IOBuffer^, BufferSize, BytesRead); |
end |
else |
begin |
{$I-} |
BlockRead (FromFile, IOBuffer^, BufferSize, BytesRead); |
{$I+} |
end; |
error := IOResult; |
IF (error = 0) AND (BytesRead > 0) |
THEN BEGIN |
CalcCRC32 (IOBuffer, BytesRead, CRCvalue); |
TotalBytes := TotalBytes + BytesRead; // can't use INC with COMP |
END |
UNTIL (BytesRead = 0) OR (error > 0); |
if Length(FromName) >= MAX_PATH then |
begin |
MyCLOSEFile (FromFile2) |
end |
else |
begin |
CLOSE (FromFile) |
end; |
END; |
CRCvalue := NOT CRCvalue |
FINALLY |
Dispose(IOBuffer) |
END |
END {CalcFileCRC32}; |
{$ENDIF} |
END {CRC32}. |
/trunk/Windows/Common.pas |
---|
0,0 → 1,13 |
unit Common; |
interface |
type |
TChecksum = class(TObject) |
public |
checksum: string; |
end; |
implementation |
end. |
/trunk/Windows/DelWaste.bat |
---|
0,0 → 1,6 |
@echo off |
del *.dcu |
del *.~* |
del *.local |
del *.stat |
del *.identcache |
/trunk/Windows/LongFilenameOperations.pas |
---|
0,0 → 1,84 |
unit LongFilenameOperations; |
interface |
// These procedures should replace the Delphi internal AssignFile(), Reset(), etc. |
// functions. These functions should be able to support long file names |
// by using the WinAPI (the "long filename" mode is switched when the file |
// name format \\?\ is used). |
procedure MyAssignFile(var hFile: THandle; filename: string); |
procedure MyReset(hFile: THandle); |
procedure MyReadLn(hFile: THandle; var s: string); |
procedure MyCloseFile(hFile: THandle); |
function MyEOF(hFile: THandle): boolean; |
procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
implementation |
uses |
Windows, SysUtils; |
procedure MyAssignFile(var hFile: THandle; filename: string); |
begin |
hFile := CreateFile(PChar(filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0); |
if hFile = INVALID_HANDLE_VALUE then RaiseLastOSError; |
end; |
procedure MyReset(hFile: THandle); |
begin |
SetFilePointer(hFile, 0, nil, FILE_BEGIN); |
end; |
procedure MyReadLn(hFile: THandle; var s: string); |
var |
buf: array [0..0] of ansichar; |
dwread: LongWord; |
begin |
s := ''; |
ReadFile(hFile, buf, 1, dwread, nil); |
while (dwread > 0) do |
begin |
if buf[0] <> #10 then |
begin |
if buf[0] = #13 then exit; |
s := s + string(buf[0]); |
end; |
Readfile(hFile, buf, 1, dwread, nil); |
end; |
end; |
procedure MyCloseFile(hFile: THandle); |
begin |
CloseHandle(hFile); |
end; |
function MyEOF(hFile: THandle): boolean; |
var |
buf: array [0..0] of ansichar; |
dwread: LongWord; |
begin |
Readfile(hFile, buf, 1, dwread, nil); |
if dwread > 0 then |
begin |
SetFilePointer(hFile, -dwread, nil, FILE_CURRENT); |
result := false; |
end |
else |
begin |
result := true; |
end; |
end; |
procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
var |
RecordCount2, RecordsRead2: Cardinal; |
begin |
RecordCount2 := RecordCount; |
RecordsRead2 := RecordsRead; |
ReadFile(hFile, Buffer, RecordCount2, RecordsRead2, nil); |
//RecordCount := RecordCount2; |
RecordsRead := RecordsRead2; |
end; |
end. |
/trunk/Windows/MD5.pas |
---|
0,0 → 1,93 |
unit MD5; |
interface |
uses |
Classes; |
function md5file(const filename: string): string; |
procedure MD5FileToStringList(amd5file: string; slOut: TStringList); |
implementation |
uses |
SysUtils, IdHashMessageDigest, idHash, Common, LongFilenameOperations; |
function md5file(const filename: string): string; |
var |
IdMD5: TIdHashMessageDigest5; |
FS: TFileStream; |
begin |
IdMD5 := TIdHashMessageDigest5.Create; |
FS := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite); |
try |
{$IFDEF UNICODE} // I actually do not know at which version of Delphi/Indy, this has changed. |
Result := IdMD5.HashStreamAsHex(FS); |
{$ELSE} |
Result := IdMD5.AsHex(IdMD5.HashValue(FS)); |
{$ENDIF} |
finally |
FS.Free; |
IdMD5.Free; |
end; |
end; |
procedure MD5FileToStringList(amd5file: string; slOut: TStringList); |
var |
sLine: string; |
originalFilename: string; |
expectedChecksum: string; |
fil: THandle; |
csum: TChecksum; |
firstLinePassed: boolean; |
forceUTF8: boolean; |
begin |
if not FileExists(amd5file) then |
exit; |
MyAssignFile(fil, amd5file); |
try |
MyReset(fil); |
firstLinePassed := false; |
forceUTF8 := false; |
while not MyEOF(fil) do |
begin |
MyReadLn(fil, sLine); |
{$REGION 'Try UTF8 decode'} |
if not firstLinePassed and (length(sLine)>2) and (sLine[1]=#$EF) and (sLine[2]=#$BB) and (sLine[3]=#$BF) then |
begin |
delete(sLine,1,3); // Remove BOM |
forceUTF8 := true; |
end; |
firstLinePassed := true; |
if forceUTF8 or (Pos(#$FFFD, Utf8ToString(RawByteString(sLine))) = 0) then |
sLine := Utf8ToString(RawByteString(sLine)); |
{$ENDREGION} |
if Copy(Trim(sLine),1,1) = ';' then continue; |
// 25bfdef2651071efdd08bb3404797384 *Example.doc |
sLine := Trim(sLine); |
if sLine = '' then |
continue; |
expectedChecksum := Copy(sLine, 1, 32); |
Delete(sLine, 1, 32); |
sLine := Trim(sLine); |
if Copy(sLine, 1, 1) = '*' then |
Delete(sLine, 1, 1); |
sLine := Trim(sLine); |
originalFilename := sLine; |
//slOut.Values[originalFilename] := expectedChecksum; // <-- with this, files cannot have an equal sign |
slOut.OwnsObjects := true; |
csum := TChecksum.Create; |
csum.checksum := expectedChecksum; |
slOut.AddObject(originalFilename, csum); |
end; |
finally |
MyCloseFile(fil); |
end; |
end; |
end. |
/trunk/Windows/MD5DirCheck.dpr |
---|
0,0 → 1,19 |
program MD5DirCheck; |
uses |
Vcl.Forms, |
Unit1 in 'Unit1.pas' {Form1}, |
SFV in 'SFV.pas', |
MD5 in 'MD5.pas', |
CRC32 in 'CRC32.pas', |
Common in 'Common.pas', |
LongFilenameOperations in 'LongFilenameOperations.pas'; |
{$R *.res} |
begin |
Application.Initialize; |
Application.MainFormOnTaskbar := True; |
Application.CreateForm(TForm1, Form1); |
Application.Run; |
end. |
/trunk/Windows/MD5DirCheck.dproj |
---|
0,0 → 1,1035 |
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
<PropertyGroup> |
<ProjectGuid>{1158C929-E612-4310-A28A-16D1439BBC00}</ProjectGuid> |
<ProjectVersion>18.8</ProjectVersion> |
<FrameworkType>VCL</FrameworkType> |
<MainSource>MD5DirCheck.dpr</MainSource> |
<Base>True</Base> |
<Config Condition="'$(Config)'==''">Release</Config> |
<Platform Condition="'$(Platform)'==''">Win32</Platform> |
<TargetedPlatforms>1</TargetedPlatforms> |
<AppType>Application</AppType> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> |
<Base_Win32>true</Base_Win32> |
<CfgParent>Base</CfgParent> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> |
<Base_Win64>true</Base_Win64> |
<CfgParent>Base</CfgParent> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> |
<Cfg_1>true</Cfg_1> |
<CfgParent>Base</CfgParent> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> |
<Cfg_1_Win32>true</Cfg_1_Win32> |
<CfgParent>Cfg_1</CfgParent> |
<Cfg_1>true</Cfg_1> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> |
<Cfg_2>true</Cfg_2> |
<CfgParent>Base</CfgParent> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> |
<Cfg_2_Win32>true</Cfg_2_Win32> |
<CfgParent>Cfg_2</CfgParent> |
<Cfg_2>true</Cfg_2> |
<Base>true</Base> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Base)'!=''"> |
<DCC_E>false</DCC_E> |
<DCC_N>false</DCC_N> |
<DCC_S>false</DCC_S> |
<DCC_F>false</DCC_F> |
<DCC_K>false</DCC_K> |
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace> |
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> |
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> |
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> |
<SanitizedProjectName>MD5DirCheck</SanitizedProjectName> |
<VerInfo_Locale>1031</VerInfo_Locale> |
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Base_Win32)'!=''"> |
<DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;Tee;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> |
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> |
<BT_BuildType>Debug</BT_BuildType> |
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> |
<VerInfo_Keys>CompanyName=ViaThinkSoft;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=(C) 2019 Daniel Marschall, ViaThinkSoft;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> |
<VerInfo_Locale>1033</VerInfo_Locale> |
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Base_Win64)'!=''"> |
<DCC_UsePackage>DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;Tee;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)</DCC_UsePackage> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Cfg_1)'!=''"> |
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> |
<DCC_DebugDCUs>true</DCC_DebugDCUs> |
<DCC_Optimize>false</DCC_Optimize> |
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> |
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> |
<DCC_RemoteDebug>true</DCC_RemoteDebug> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> |
<DCC_RemoteDebug>false</DCC_RemoteDebug> |
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes> |
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> |
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> |
<VerInfo_Locale>1033</VerInfo_Locale> |
<VerInfo_Keys>CompanyName=ViaThinkSoft;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=(C) 2019-2020 Daniel Marschall, ViaThinkSoft;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Cfg_2)'!=''"> |
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> |
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> |
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> |
<DCC_DebugInformation>0</DCC_DebugInformation> |
</PropertyGroup> |
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> |
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes> |
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> |
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> |
<VerInfo_Locale>1033</VerInfo_Locale> |
<VerInfo_Keys>CompanyName=ViaThinkSoft;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=(C) 2019 Daniel Marschall, ViaThinkSoft;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> |
</PropertyGroup> |
<ItemGroup> |
<DelphiCompile Include="$(MainSource)"> |
<MainSource>MainSource</MainSource> |
</DelphiCompile> |
<DCCReference Include="Unit1.pas"> |
<Form>Form1</Form> |
<FormType>dfm</FormType> |
</DCCReference> |
<DCCReference Include="SFV.pas"/> |
<DCCReference Include="MD5.pas"/> |
<DCCReference Include="CRC32.pas"/> |
<DCCReference Include="Common.pas"/> |
<DCCReference Include="LongFilenameOperations.pas"/> |
<BuildConfiguration Include="Release"> |
<Key>Cfg_2</Key> |
<CfgParent>Base</CfgParent> |
</BuildConfiguration> |
<BuildConfiguration Include="Base"> |
<Key>Base</Key> |
</BuildConfiguration> |
<BuildConfiguration Include="Debug"> |
<Key>Cfg_1</Key> |
<CfgParent>Base</CfgParent> |
</BuildConfiguration> |
</ItemGroup> |
<ProjectExtensions> |
<Borland.Personality>Delphi.Personality.12</Borland.Personality> |
<Borland.ProjectType>Application</Borland.ProjectType> |
<BorlandProject> |
<Delphi.Personality> |
<Source> |
<Source Name="MainSource">MD5DirCheck.dpr</Source> |
</Source> |
<Excluded_Packages> |
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k260.bpl">Microsoft Office 2000 Beispiele für gekapselte Komponenten für Automatisierungsserver</Excluded_Packages> |
<Excluded_Packages Name="$(BDSBIN)\dclofficexp260.bpl">Microsoft Office XP Beispiele für gekapselte Komponenten für Automation Server</Excluded_Packages> |
</Excluded_Packages> |
</Delphi.Personality> |
<Deployment Version="3"> |
<DeployFile LocalName="MD5DirCheck.exe" Configuration="Release" Class="ProjectOutput"> |
<Platform Name="Win32"> |
<RemoteName>MD5DirCheck.exe</RemoteName> |
<Overwrite>true</Overwrite> |
</Platform> |
</DeployFile> |
<DeployFile LocalName="MD5DirCheck.exe" Configuration="Debug" Class="ProjectOutput"> |
<Platform Name="Win32"> |
<RemoteName>MD5DirCheck.exe</RemoteName> |
<Overwrite>true</Overwrite> |
</Platform> |
</DeployFile> |
<DeployClass Name="AdditionalDebugSymbols"> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidClassesDexFile"> |
<Platform Name="Android"> |
<RemoteDir>classes</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>classes</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidFileProvider"> |
<Platform Name="Android"> |
<RemoteDir>res\xml</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\xml</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidGDBServer"> |
<Platform Name="Android"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidLibnativeArmeabiFile"> |
<Platform Name="Android"> |
<RemoteDir>library\lib\armeabi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\armeabi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidLibnativeArmeabiv7aFile"> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidLibnativeMipsFile"> |
<Platform Name="Android"> |
<RemoteDir>library\lib\mips</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\mips</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidServiceOutput"> |
<Platform Name="Android"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\arm64-v8a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidServiceOutput_Android32"> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidSplashImageDef"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidSplashStyles"> |
<Platform Name="Android"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="AndroidSplashStylesV21"> |
<Platform Name="Android"> |
<RemoteDir>res\values-v21</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\values-v21</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_Colors"> |
<Platform Name="Android"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_DefaultAppIcon"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_LauncherIcon144"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_LauncherIcon36"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-ldpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-ldpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_LauncherIcon48"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-mdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-mdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_LauncherIcon72"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-hdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-hdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_LauncherIcon96"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_NotificationIcon24"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-mdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-mdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_NotificationIcon36"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-hdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-hdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_NotificationIcon48"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_NotificationIcon72"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_NotificationIcon96"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xxxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xxxhdpi</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_SplashImage426"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-small</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-small</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_SplashImage470"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-normal</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-normal</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_SplashImage640"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-large</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-large</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_SplashImage960"> |
<Platform Name="Android"> |
<RemoteDir>res\drawable-xlarge</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\drawable-xlarge</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="Android_Strings"> |
<Platform Name="Android"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>res\values</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="DebugSymbols"> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="DependencyFramework"> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.framework</Extensions> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.framework</Extensions> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="DependencyModule"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
<Extensions>.dll;.bpl</Extensions> |
</Platform> |
</DeployClass> |
<DeployClass Required="true" Name="DependencyPackage"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
<Extensions>.dylib</Extensions> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
<Extensions>.bpl</Extensions> |
</Platform> |
</DeployClass> |
<DeployClass Name="File"> |
<Platform Name="Android"> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="Android64"> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="iOSDevice32"> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\Resources\StartUp\</RemoteDir> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\Resources\StartUp\</RemoteDir> |
<Operation>0</Operation> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1024"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1024x768"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1536"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1536x2048"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1668"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch1668x2388"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2048"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2048x1536"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2048x2732"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2224"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2388x1668"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch2732x2048"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch768"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPad_Launch768x1024"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1125"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1136x640"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1242"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1242x2688"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1334"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch1792"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch2208"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch2436"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch2688x1242"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch320"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch640"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch640x1136"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch750"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="iPhone_Launch828"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectAndroidManifest"> |
<Platform Name="Android"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectiOSDeviceDebug"> |
<Platform Name="iOSDevice32"> |
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectiOSDeviceResourceRules"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectiOSEntitlements"> |
<Platform Name="iOSDevice32"> |
<RemoteDir>..\</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<RemoteDir>..\</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectiOSInfoPList"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectiOSResource"> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectOSXDebug"> |
<Platform Name="OSX64"> |
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectOSXEntitlements"> |
<Platform Name="OSX32"> |
<RemoteDir>..\</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>..\</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectOSXInfoPList"> |
<Platform Name="OSX32"> |
<RemoteDir>Contents</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectOSXResource"> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\Resources</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\Resources</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Required="true" Name="ProjectOutput"> |
<Platform Name="Android"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\arm64-v8a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSDevice64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="iOSSimulator"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Linux64"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX32"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="OSX64"> |
<RemoteDir>Contents\MacOS</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win32"> |
<Operation>0</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectOutput_Android32"> |
<Platform Name="Android64"> |
<RemoteDir>library\lib\armeabi-v7a</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="ProjectUWPManifest"> |
<Platform Name="Win32"> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win64"> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="UWP_DelphiLogo150"> |
<Platform Name="Win32"> |
<RemoteDir>Assets</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win64"> |
<RemoteDir>Assets</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<DeployClass Name="UWP_DelphiLogo44"> |
<Platform Name="Win32"> |
<RemoteDir>Assets</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
<Platform Name="Win64"> |
<RemoteDir>Assets</RemoteDir> |
<Operation>1</Operation> |
</Platform> |
</DeployClass> |
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> |
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> |
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> |
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> |
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> |
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/> |
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> |
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/> |
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> |
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> |
</Deployment> |
<Platforms> |
<Platform value="Win32">True</Platform> |
<Platform value="Win64">False</Platform> |
</Platforms> |
</BorlandProject> |
<ProjectFileVersion>12</ProjectFileVersion> |
</ProjectExtensions> |
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> |
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> |
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> |
</Project> |
/trunk/Windows/MD5DirCheck.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/trunk/Windows/MD5DirCheck.res |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/trunk/Windows/SFV.pas |
---|
0,0 → 1,83 |
unit SFV; |
interface |
uses |
Classes; |
function CalcFileCRC32(filename: string): string; overload; |
procedure SFVFileToStringList(aSFVFile: string; slOut: TStringList); |
implementation |
uses |
Windows, SysUtils, CRC32, Common, LongFilenameOperations; |
function CalcFileCRC32(filename: string): string; overload; |
var |
checksum: DWORD; |
totalbytes: TInteger8; |
error: Word; |
begin |
CRC32.CalcFileCRC32(filename, checksum, totalbytes, error); |
if error = 0 then |
result := IntToHex(checksum, 8) |
else |
result := ''; |
end; |
procedure SFVFileToStringList(aSFVFile: string; slOut: TStringList); |
var |
sLine: string; |
originalFilename: string; |
expectedChecksum: string; |
fil: THandle; |
csum: TChecksum; |
firstLinePassed: boolean; |
forceUTF8: boolean; |
begin |
if not FileExists(aSFVFile) then |
exit; |
MyAssignFile(fil, aSFVFile); |
try |
MyReset(fil); |
firstLinePassed := false; |
forceUTF8 := false; |
while not MyEOF(fil) do |
begin |
MyReadLn(fil, sLine); |
{$REGION 'Try UTF8 decode'} |
if not firstLinePassed and (length(sLine)>2) and (sLine[1]=#$EF) and (sLine[2]=#$BB) and (sLine[3]=#$BF) then |
begin |
delete(sLine,1,3); // Remove BOM |
forceUTF8 := true; |
end; |
firstLinePassed := true; |
if forceUTF8 or (Pos(#$FFFD, Utf8ToString(RawByteString(sLine))) = 0) then |
sLine := Utf8ToString(RawByteString(sLine)); |
{$ENDREGION} |
if Copy(Trim(sLine),1,1) = ';' then continue; |
// Example.doc 4323C92B |
sLine := TrimRight(sLine); // Trim right, because file names may have leading white spaces |
if sLine = '' then |
continue; |
expectedChecksum := Copy(sLine, 1+Length(sLine)-8, 8); |
sLine := TrimRight(Copy(sLine, 1, Length(sLine)-8)); // Trim right, because file names may have leading white spaces |
originalFilename := sLine; |
//slOut.Values[originalFilename] := expectedChecksum; // <-- with this, files cannot have an equal sign |
slOut.OwnsObjects := true; |
csum := TChecksum.Create; |
csum.checksum := expectedChecksum; |
slOut.AddObject(originalFilename, csum); |
end; |
finally |
MyCloseFile(fil); |
end; |
end; |
end. |
/trunk/Windows/TODO.txt |
---|
0,0 → 1,8 |
Button to select directory |
Button to convert drive letter (X:\) into long file name UNC path (\\?\) |
Pause/Cancel button |
*Maybe* in the future a SFV/MD5 generator. However, TotalCommander can do it too. |
/trunk/Windows/Unit1.dfm |
---|
0,0 → 1,133 |
object Form1: TForm1 |
Left = 0 |
Top = 0 |
Caption = 'Recursive MD5/SFV Directory Checksum checker' |
ClientHeight = 621 |
ClientWidth = 1006 |
Color = clBtnFace |
Font.Charset = DEFAULT_CHARSET |
Font.Color = clWindowText |
Font.Height = -11 |
Font.Name = 'Tahoma' |
Font.Style = [] |
OldCreateOrder = False |
OnShow = FormShow |
DesignSize = ( |
1006 |
621) |
PixelsPerInch = 96 |
TextHeight = 13 |
object Label1: TLabel |
Left = 8 |
Top = 571 |
Width = 958 |
Height = 42 |
Anchors = [akLeft, akRight, akBottom] |
Caption = |
'Hints: MD5/SFV files can be created by TotalCommander or other t' + |
'ools (also recursively). Multiple MD5/SFV files per directory a' + |
're not permitted. To check directories with path names longer t' + |
'han 255 characters, use the "long filename" path format \\?\<GUI' + |
'D>\ (find out GUID by running "mountvol"), instead of the usual' + |
' C:\ file name format.' |
WordWrap = True |
end |
object Button1: TButton |
Left = 776 |
Top = 72 |
Width = 217 |
Height = 33 |
Anchors = [akTop, akRight] |
Caption = 'Check' |
TabOrder = 0 |
OnClick = Button1Click |
end |
object Memo1: TMemo |
Left = 8 |
Top = 184 |
Width = 985 |
Height = 381 |
Anchors = [akLeft, akTop, akRight, akBottom] |
ReadOnly = True |
ScrollBars = ssBoth |
TabOrder = 1 |
ExplicitHeight = 376 |
end |
object cbVerbose: TCheckBox |
Left = 8 |
Top = 59 |
Width = 105 |
Height = 17 |
Caption = 'Verbose output' |
TabOrder = 2 |
end |
object LabeledEdit1: TLabeledEdit |
Left = 8 |
Top = 32 |
Width = 985 |
Height = 21 |
Anchors = [akLeft, akTop, akRight] |
EditLabel.Width = 91 |
EditLabel.Height = 13 |
EditLabel.Caption = 'Directory to check:' |
TabOrder = 3 |
end |
object cbWarnChecksumFileMissing: TCheckBox |
Left = 8 |
Top = 82 |
Width = 353 |
Height = 17 |
Caption = 'Warning if directory with files does not contain a checksum file' |
Checked = True |
State = cbChecked |
TabOrder = 4 |
end |
object cbWarningMissingChecksumFileEntry: TCheckBox |
Left = 8 |
Top = 105 |
Width = 417 |
Height = 17 |
Caption = |
'If checksum file is present: Warn if there are files which do no' + |
't have a checksum' |
Checked = True |
State = cbChecked |
TabOrder = 5 |
end |
object cbWarnVanishedFile: TCheckBox |
Left = 8 |
Top = 128 |
Width = 401 |
Height = 17 |
Caption = |
'If checksum file is present: Warn if files with checksum entries' + |
' vanished' |
Checked = True |
State = cbChecked |
TabOrder = 6 |
end |
object cbWarnChecksumMismatch: TCheckBox |
Left = 8 |
Top = 151 |
Width = 417 |
Height = 17 |
Caption = |
'If checksum file is present: Warn if a checksum does not match t' + |
'he checksum file' |
Checked = True |
State = cbChecked |
TabOrder = 7 |
end |
object RadioGroup1: TRadioGroup |
Left = 440 |
Top = 72 |
Width = 105 |
Height = 97 |
Caption = 'Method' |
ItemIndex = 0 |
Items.Strings = ( |
'SFV (CRC32)' |
'MD5') |
TabOrder = 8 |
end |
end |
/trunk/Windows/Unit1.pas |
---|
0,0 → 1,287 |
unit Unit1; |
interface |
uses |
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, |
System.Classes, Vcl.Graphics, |
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; |
type |
TSeverity = (seOK, seWarning, seCritical); |
TForm1 = class(TForm) |
Button1: TButton; |
Memo1: TMemo; |
cbVerbose: TCheckBox; |
LabeledEdit1: TLabeledEdit; |
cbWarnChecksumFileMissing: TCheckBox; |
cbWarningMissingChecksumFileEntry: TCheckBox; |
cbWarnVanishedFile: TCheckBox; |
cbWarnChecksumMismatch: TCheckBox; |
Label1: TLabel; |
RadioGroup1: TRadioGroup; |
procedure Button1Click(Sender: TObject); |
procedure FormShow(Sender: TObject); |
private |
CheckSumFileCount: integer; |
function CheckDirectory(ADirectory: string; recursive: boolean): TSeverity; |
function VerifyChecksumFile(aChecksumFile: string): TSeverity; |
function GetChecksumSafe(const filename: string): string; |
end; |
var |
Form1: TForm1; |
implementation |
{$R *.dfm} |
uses |
MD5, SFV, Common; |
const |
DUMMY_FILE = 'DUMMY.$$$'; |
procedure TForm1.Button1Click(Sender: TObject); |
var |
sev: TSeverity; |
begin |
Memo1.Clear; |
if not DirectoryExists(LabeledEdit1.Text) then |
begin |
showmessage('Directory does not exist'); |
exit; |
end; |
Application.ProcessMessages; |
CheckSumFileCount := 0; |
sev := CheckDirectory(LabeledEdit1.Text, true); |
Beep; |
case sev of |
seOK: |
showmessage('OK'); |
seWarning: |
showmessage('Warning'); |
seCritical: |
showmessage('Critical'); |
end; |
Caption := Format('Done. Checked %d checksum files.', [CheckSumFileCount]); |
end; |
function SevMax(a, b: TSeverity): TSeverity; |
begin |
if Ord(a) > Ord(b) then |
Result := a |
else |
Result := b; |
end; |
function TForm1.VerifyChecksumFile(aChecksumFile: string): TSeverity; |
var |
slFile: TStringList; |
i: integer; |
originalFilename: string; |
expectedChecksum: string; |
IsFound: boolean; |
SR: TSearchRec; |
fullfilename: string; |
ADirectory: string; |
originalFilenameFull: string; |
begin |
if ExtractFileName(aChecksumFile) <> DUMMY_FILE then |
begin |
Inc(CheckSumFileCount); |
end; |
if cbVerbose.Checked then |
begin |
Form1.Memo1.Lines.Add('Check: ' + aChecksumFile); |
end; |
Result := seOK; |
ADirectory := IncludeTrailingPathDelimiter(ExtractFilePath(aChecksumFile)); |
try |
slFile := TStringList.Create; |
try |
slFile.CaseSensitive := false; |
slFile.OwnsObjects := true; |
if radiogroup1.itemindex = 0 then |
SFVFileToStringList(aChecksumFile, slFile) |
else |
MD5FileToStringList(aChecksumFile, slFile); |
// TODO: If multiple checksum files => put them together into a single array (beware conflicts!) |
// 1. Check existing entries in the checksum file |
for i := 0 to slFile.Count - 1 do |
begin |
originalFilename := slFile.Strings[i]; |
expectedChecksum := TChecksum(slFile.Objects[i]).checksum; |
originalFilenameFull := ADirectory + originalFilename; |
if not FileExists(originalFilenameFull) then |
begin |
if cbWarnVanishedFile.Checked then |
begin |
Form1.Memo1.Lines.Add('FILE VANISHED: ' + originalFilenameFull); |
Result := SevMax(Result, seCritical); |
end; |
end |
else if LowerCase(GetChecksumSafe(originalFilenameFull)) |
= LowerCase(expectedChecksum) then |
begin |
if cbVerbose.Checked then |
begin |
Form1.Memo1.Lines.Add('OK: ' + originalFilenameFull + ' = ' + |
expectedChecksum); |
end; |
Result := SevMax(Result, seOK); |
end |
else |
begin |
if cbWarnChecksumMismatch.Checked then |
begin |
Form1.Memo1.Lines.Add('CHECKSUM MISMATCH: ' + originalFilenameFull + |
' <> ' + expectedChecksum); |
Result := SevMax(Result, seCritical); |
end; |
end; |
end; |
// 2. Checking for entries which are NOT in the checksum file |
IsFound := FindFirst(ADirectory + '*', faAnyFile - faDirectory, SR) = 0; |
while IsFound do |
begin |
fullfilename := ADirectory + SR.Name; |
if (LowerCase(ExtractFileExt(fullfilename)) <> '.md5') and |
(LowerCase(ExtractFileExt(fullfilename)) <> '.sfv') and |
(LowerCase(ExtractFileName(fullfilename)) <> 'thumbs.db') then |
begin |
if slFile.IndexOf(SR.Name) = -1 then //if slFile.Values[SR.Name] = '' then |
begin |
if ExtractFileName(aChecksumFile) = DUMMY_FILE then |
begin |
if cbWarnChecksumFileMissing.Checked then |
begin |
Form1.Memo1.Lines.Add('NEW FILE WITHOUT CHECKSUM FILE: ' + |
fullfilename); |
Result := SevMax(Result, seWarning); |
end; |
end |
else |
begin |
if cbWarningMissingChecksumFileEntry.Checked then |
begin |
Form1.Memo1.Lines.Add('NEW FILE WITHOUT CHECKSUM ENTRY: ' + |
fullfilename); |
Result := SevMax(Result, seWarning); |
end; |
end; |
end; |
end; |
IsFound := FindNext(SR) = 0; |
end; |
FindClose(SR); |
finally |
slFile.Free; |
end; |
except |
on E: Exception do |
begin |
Memo1.Lines.Add('Invalid checksum file: ' + aChecksumFile + ' : ' + E.Message); |
Result := seCritical; |
end; |
end; |
end; |
function TForm1.CheckDirectory(ADirectory: string; recursive: boolean) |
: TSeverity; |
var |
IsFound: boolean; |
SR: TSearchRec; |
fullfilename: string; |
begin |
Caption := ADirectory; |
Application.ProcessMessages; |
if Application.Terminated then Abort; |
Result := seOK; |
ADirectory := IncludeTrailingPathDelimiter(ADirectory); |
// Check checksum files |
if radiogroup1.itemindex = 0 then |
IsFound := FindFirst(ADirectory + '*.sfv', faAnyFile - faDirectory, SR) = 0 |
else |
IsFound := FindFirst(ADirectory + '*.md5', faAnyFile - faDirectory, SR) = 0; |
if not IsFound then |
begin |
fullfilename := ADirectory + DUMMY_FILE; // virtual "empty" file |
Result := SevMax(Result, VerifyChecksumFile(fullfilename)); |
end |
else |
begin |
while IsFound do |
begin |
fullfilename := ADirectory + SR.Name; |
Caption := fullfilename; |
Application.ProcessMessages; |
if Application.Terminated then Abort; |
Result := SevMax(Result, VerifyChecksumFile(fullfilename)); |
IsFound := FindNext(SR) = 0; |
end; |
end; |
FindClose(SR); |
// Check other dirs |
if recursive then |
begin |
IsFound := FindFirst(ADirectory + '*', faAnyFile, SR) = 0; |
while IsFound do |
begin |
fullfilename := ADirectory + SR.Name; |
if DirectoryExists(fullfilename) and (SR.Name <> '.') and (SR.Name <> '..') |
then |
begin |
Result := SevMax(Result, CheckDirectory(fullfilename, recursive)); |
end; |
IsFound := FindNext(SR) = 0; |
end; |
FindClose(SR); |
end; |
end; |
procedure TForm1.FormShow(Sender: TObject); |
begin |
if ParamCount >= 1 then |
begin |
LabeledEdit1.Text := ParamStr(1); |
end; |
end; |
function TForm1.GetChecksumSafe(const filename: string): string; |
begin |
Caption := filename; |
Application.ProcessMessages; |
if Application.Terminated then Abort; |
try |
if radiogroup1.itemindex = 0 then |
Result := CalcFileCRC32(filename) |
else |
Result := md5file(filename); |
except |
on E: Exception do |
begin |
Memo1.Lines.Add('Cannot read file ' + filename + ' : ' + E.Message); |
Result := 'ERROR'; |
end; |
end; |
end; |
end. |