UPD: New verify checksum form

This commit is contained in:
Alexander Koblov 2013-11-16 05:33:21 +00:00
commit 4de209bcef
4 changed files with 103 additions and 34 deletions

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
Verify check sum dialog
Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru)
Copyright (C) 2009-2013 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -28,7 +28,8 @@ unit fCheckSumVerify;
interface
uses
Classes, SysUtils, Forms, Buttons, SynEdit, uOSForms, SynEditMarkupSpecialLine, Graphics;
Classes, SysUtils, Forms, Buttons, SynEdit, uOSForms,
Graphics, uFileSourceCalcChecksumOperation, DCBasicTypes;
type
@ -41,22 +42,53 @@ type
procedure seCheckSumVerifySpecialLineColors(Sender: TObject; Line: integer;
var Special: boolean; var FG, BG: TColor);
private
{ private declarations }
procedure AddHeader(const aText: UTF8String; aCount: Integer; aColor: TColor);
procedure ProcessResult(const aResult: TDynamicStringArray;
const aText: UTF8String; aColor: TColor);
public
{ public declarations }
end;
procedure ShowVerifyCheckSum(const VerifyResult: TStringList);
procedure ShowVerifyCheckSum(const VerifyResult: TVerifyChecksumResult);
implementation
{$R *.lfm}
procedure ShowVerifyCheckSum(const VerifyResult: TStringList);
uses
uLng;
procedure ShowVerifyCheckSum(const VerifyResult: TVerifyChecksumResult);
var
aTotalCount: Integer;
begin
with TfrmCheckSumVerify.Create(Application) do
begin
seCheckSumVerify.Lines.Assign(VerifyResult);
seCheckSumVerify.Lines.BeginUpdate;
try
seCheckSumVerify.Lines.Add(rsCheckSumVerifyGeneral);
aTotalCount:= Length(VerifyResult.Success) + Length(VerifyResult.ReadError) +
Length(VerifyResult.Broken) + Length(VerifyResult.Missing);
// Add header information
AddHeader(rsCheckSumVerifyTotal, aTotalCount, clBlack);
AddHeader(rsCheckSumVerifySuccess, Length(VerifyResult.Success), clGreen);
AddHeader(rsCheckSumVerifyMissing, Length(VerifyResult.Missing), clRed);
AddHeader(rsCheckSumVerifyBroken, Length(VerifyResult.Broken), clRed);
AddHeader(rsCheckSumVerifyReadError, Length(VerifyResult.ReadError), clRed);
// Add broken files
ProcessResult(VerifyResult.Broken, rsCheckSumVerifyBroken, clRed);
// Add read error files
ProcessResult(VerifyResult.ReadError, rsCheckSumVerifyReadError, clRed);
// Add missing files
ProcessResult(VerifyResult.Missing, rsCheckSumVerifyMissing, clRed);
// Add good files
ProcessResult(VerifyResult.Success, rsCheckSumVerifySuccess, clGreen);
finally
seCheckSumVerify.Lines.EndUpdate;
end;
Show;
end;
end;
@ -72,10 +104,31 @@ procedure TfrmCheckSumVerify.seCheckSumVerifySpecialLineColors(Sender: TObject;
var Special: boolean; var FG, BG: TColor);
begin
Special:= True;
if Assigned(seCheckSumVerify.Lines.Objects[Line - 1]) then
FG:= clGreen
FG:= TColor(PtrInt(seCheckSumVerify.Lines.Objects[Line - 1]));
end;
procedure TfrmCheckSumVerify.AddHeader(const aText: UTF8String; aCount: Integer; aColor: TColor);
begin
if aCount = 0 then
seCheckSumVerify.Lines.Add(#32 + aText + #32 + IntToStr(aCount))
else
FG:= clRed;
seCheckSumVerify.Lines.AddObject(#32 + aText + #32 + IntToStr(aCount), TObject(PtrInt(aColor)));
end;
procedure TfrmCheckSumVerify.ProcessResult(const aResult: TDynamicStringArray;
const aText: UTF8String; aColor: TColor);
var
I: Integer;
begin
if Length(aResult) > 0 then
begin
seCheckSumVerify.Lines.Add(EmptyStr);
seCheckSumVerify.Lines.AddObject(aText, TObject(PtrInt(aColor)));
for I:= Low(aResult) to High(aResult) do
begin
seCheckSumVerify.Lines.AddObject(#32 + aResult[I], TObject(PtrInt(aColor)));
end;
end;
end;
end.

View file

@ -15,6 +15,8 @@ uses
type
{ TFileSystemCalcChecksumOperation }
TFileSystemCalcChecksumOperation = class(TFileSourceCalcChecksumOperation)
private
@ -29,7 +31,7 @@ type
FSymLinkOption: TFileSourceOperationOptionSymLink;
FSkipErrors: Boolean;
function CheckSumCalc(aFile: TFile): String;
function CheckSumCalc(aFile: TFile; out aValue: String): Boolean;
procedure InitializeVerifyMode;
procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType);
@ -99,7 +101,6 @@ end;
procedure TFileSystemCalcChecksumOperation.Initialize;
begin
FResult.Clear;
// Get initialized statistics; then we change only what is needed.
FStatistics := RetrieveStatistics;
@ -258,9 +259,7 @@ begin
except
on EFileNotFound do
begin
FResult.Add(Format(rsViewNotFound,
[Copy(FCheckSumFile.ValueFromIndex[I], 2, MaxInt) + ': '])
);
AddString(FResult.Missing, Copy(FCheckSumFile.ValueFromIndex[I], 2, MaxInt));
end
else
begin
@ -285,7 +284,7 @@ begin
if not OneFile then
FCheckSumFile.Clear;
sCheckSum := CheckSumCalc(aFile);
CheckSumCalc(aFile, sCheckSum);
FCheckSumFile.Add(sCheckSum + ' *' +
ExtractDirLevel(FFullFilesTree.Path,
aFile.Path) + aFile.Name);
@ -307,18 +306,24 @@ function TFileSystemCalcChecksumOperation.VerifyChecksumProcessFile(
aFile: TFile; ExpectedChecksum: String): Boolean;
var
sCheckSum: String;
bResult: Boolean;
sFileName: UTF8String;
begin
Result := False;
Result:= False;
sFileName:= ExtractDirLevel(FFullFilesTree.Path, aFile.Path) + aFile.Name;
sCheckSum:= CheckSumCalc(aFile);
bResult:= (CompareText(sCheckSum, ExpectedChecksum) = 0);
FResult.AddObject(ExtractDirLevel(FFullFilesTree.Path, aFile.Path) +
aFile.Name + ': ' +
IfThen(bResult, 'True', 'False'), TObject(PtrInt(bResult)));
if (CheckSumCalc(aFile, sCheckSum) = False) then
AddString(FResult.ReadError, sFileName)
else
begin
if (CompareText(sCheckSum, ExpectedChecksum) = 0) then
AddString(FResult.Success, sFileName)
else
AddString(FResult.Broken, sFileName);
end;
end;
function TFileSystemCalcChecksumOperation.CheckSumCalc(aFile: TFile): String;
function TFileSystemCalcChecksumOperation.CheckSumCalc(aFile: TFile; out
aValue: String): Boolean;
var
hFile: THandle;
Context: THashContext;
@ -326,7 +331,6 @@ var
bRetryRead: Boolean;
TotalBytesToRead: Int64 = 0;
begin
Result:= EmptyStr;
hFile := feInvalidHandle;
BytesToRead := FBufferSize;
@ -334,7 +338,8 @@ begin
try
hFile:= mbFileOpen(aFile.FullPath, fmOpenRead or fmShareDenyNone);
if hFile <> feInvalidHandle then
Result:= hFile <> feInvalidHandle;
if Result then
begin
TotalBytesToRead := mbFileSize(aFile.FullPath);
@ -364,7 +369,7 @@ begin
begin
LogMessage(rsMsgErrERead + ' ' + aFile.FullPath + ': ' + E.Message,
[], lmtError);
Exit;
Exit(False);
end
else
case AskQuestion(rsMsgErrERead + ' ' + aFile.FullPath + ': ',
@ -376,7 +381,7 @@ begin
fsourAbort:
RaiseAbortOperation;
fsourSkip:
Exit;
Exit(False);
end; // case
end;
end;
@ -395,7 +400,7 @@ begin
end;
finally
HashFinal(Context, Result);
HashFinal(Context, aValue);
if hFile <> feInvalidHandle then
begin
FileClose(hFile);

View file

@ -6,6 +6,7 @@ interface
uses
Classes, SysUtils, syncobjs,
DCBasicTypes,
uFileSourceOperation,
uFileSourceOperationTypes,
uFileSource,
@ -16,6 +17,13 @@ type
TCalcCheckSumOperationMode = (checksum_calc, checksum_verify);
TVerifyChecksumResult = record
Success: TDynamicStringArray;
Broken: TDynamicStringArray;
Missing: TDynamicStringArray;
ReadError: TDynamicStringArray;
end;
TFileSourceCalcChecksumOperationStatistics = record
CurrentFile: String;
CurrentFileTotalBytes: Int64;
@ -49,7 +57,7 @@ type
FOneFile: Boolean;
protected
FResult: TStringList;
FResult: TVerifyChecksumResult;
function GetID: TFileSourceOperationType; override;
@ -75,7 +83,7 @@ type
property Mode: TCalcCheckSumOperationMode read FMode write FMode;
property Algorithm: THashAlgorithm read FAlgorithm write FAlgorithm;
property OneFile: Boolean read FOneFile write FOneFile;
property Result: TStringList read FResult;
property Result: TVerifyChecksumResult read FResult;
end;
implementation
@ -114,8 +122,6 @@ begin
FMode := checksum_calc;
FAlgorithm := HASH_MD5;
FOneFile := False;
FResult := TStringList.Create;
end;
destructor TFileSourceCalcChecksumOperation.Destroy;
@ -126,8 +132,6 @@ begin
FreeAndNil(FStatisticsLock);
if Assigned(FFiles) then
FreeAndNil(FFiles);
if Assigned(FResult) then
FreeAndNil(FResult);
end;
function TFileSourceCalcChecksumOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String;

View file

@ -360,6 +360,13 @@ resourcestring
// CheckSumCalcVerify dialog
rsCheckSumVerifyTitle = 'Verify checksum';
rsCheckSumVerifyText = 'Enter checksum and select algorithm:';
// CheckSumVerify dialog
rsCheckSumVerifyGeneral = 'General:';
rsCheckSumVerifyTotal = 'Total:';
rsCheckSumVerifySuccess = 'Success:';
rsCheckSumVerifyMissing = 'Missing:';
rsCheckSumVerifyBroken = 'Broken:';
rsCheckSumVerifyReadError = 'Read error:';
// Drive status
rsDriveNoMedia = '<no media>';
rsDriveNoLabel = '<no label>';