mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
UPD: New verify checksum form
This commit is contained in:
parent
15d71040d5
commit
4de209bcef
4 changed files with 103 additions and 34 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue