summaryrefslogtreecommitdiff
path: root/UChecksum.pas
diff options
context:
space:
mode:
Diffstat (limited to 'UChecksum.pas')
-rw-r--r--UChecksum.pas70
1 files changed, 44 insertions, 26 deletions
diff --git a/UChecksum.pas b/UChecksum.pas
index b7ef508..0de5fda 100644
--- a/UChecksum.pas
+++ b/UChecksum.pas
@@ -63,7 +63,7 @@ var
implementation
-uses ULocale, UCoreUtils, ULibc, UCore, DateUtils, md5, crc;
+uses ULocale, UCoreUtils, ULibc, UCore, UError, DateUtils, md5, crc;
type TFileListItem = class
public
@@ -198,18 +198,27 @@ end;
function TFChecksum.ProcessFile(FileName: string): boolean;
const ChksumBlockSize = 32768; // Maximum of PByteArray
var FD: TEngineFileDes;
- Error, Count, i, Start: integer;
+ Count, i, Start: integer;
Buffer: Pointer;
s: string;
Stat: PDataItem;
IsMD5: boolean;
+ Error: PGError;
begin
Result := False;
- Stat := Engine.GetFileInfo(FileName, True, True);
+ Error := nil;
+ Stat := Engine.GetFileInfo(FileName, True, True, @Error);
+ if Stat = nil then begin
+ if Error <> nil then begin
+ ShowError(Self, Format('An error occured while opening file ''%s''', [StrToUTF8(ExtractFileName(FileName))]), Error);
+ g_error_free(Error);
+ end;
+ Exit;
+ end;
if (Stat <> nil) and (Stat.Size > 128*1024) then begin
i := integer(Application.MessageBox(Format(LANGTheFileSYouAreTryingToOpenIsQuiteBig, [StrToUTF8(ExtractFileName(FileName))]), [mbYes, mbNo], mbWarning, mbNone, mbNo));
- if (i = integer(mbNo)) or (i = 251) then Exit;
FreeDataItem(Stat);
+ if (i = integer(mbNo)) or (i = 251) then Exit;
end;
IsMD5 := (Pos('MD5', WideUpperCase(ExtractFileName(FileName))) > 0) or ((Pos('SFV', WideUpperCase(ExtractFileName(FileName))) = 0) and (Pos('SUM', WideUpperCase(ExtractFileName(FileName))) > 0));
if IsMD5 then MD5Present := True
@@ -225,20 +234,23 @@ begin
Application.MessageBox(LANGAnErrorOccuredWhileInitializingMemoryBlock, [mbOK], mbError, mbNone, mbOK);
Exit;
end;
- Error := 0;
- FD := Engine.OpenFile(FileName, omRead, Error);
- if Error <> 0 then begin
- Application.MessageBox(Format(LANGAnErrorOccuredWhileOpeningFileSS, [StrToUTF8(ExtractFileName(FileName)), GetErrorString(Error)]), [mbOK], mbError, mbNone, mbOK);
+ FD := Engine.OpenFile(FileName, omRead, @Error);
+ if FD = nil then begin
+ if Error <> nil then begin
+ ShowError(Self, Format('An error occured while opening file ''%s''', [StrToUTF8(ExtractFileName(FileName))]), Error);
+ g_error_free(Error);
+ end;
libc_free(Buffer);
Exit;
end;
s := '';
CommentOpen := True;
repeat
- Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, Error);
- if Error <> 0 then begin
- Application.MessageBox(Format(LANGAnErrorOccuredWhileReadingFileSS, [StrToUTF8(ExtractFileName(FileName)), GetErrorString(Error)]), [mbOK], mbError, mbNone, mbOK);
- Engine.CloseFile(FD);
+ Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, @Error);
+ if Error <> nil then begin
+ ShowError(Self, Format('An error occured while reading file ''%s''', [StrToUTF8(ExtractFileName(FileName))]), Error);
+ g_error_free(Error);
+ Engine.CloseFile(FD, nil);
libc_free(Buffer);
Exit;
end;
@@ -259,7 +271,7 @@ begin
if Length(s) > 0 then ProcessLine(s, ExtractFilePath(FileName), IsMD5);
CommentOpen := False;
- Engine.CloseFile(FD);
+ Engine.CloseFile(FD, nil);
libc_free(Buffer);
Result := True;
end;
@@ -270,6 +282,7 @@ var Item: TFileListItem;
S1, S2: string;
i: integer;
Stat: PDataItem;
+ Error: PGError;
begin
TrimCRLFESC(s);
if Length(s) < 1 then Exit;
@@ -312,7 +325,8 @@ begin
Item.Name := ExtractFileName(s2);
Item.FullPath := IncludeTrailingPathDelimiter(Path) + s2;
end;
- Stat := Engine.GetFileInfo(Item.FullPath, True, True);
+ Error := nil;
+ Stat := Engine.GetFileInfo(Item.FullPath, True, True, nil);
if Assigned(Stat) then begin
Item.Size := Stat.Size;
FreeDataItem(Stat);
@@ -373,7 +387,7 @@ end;
procedure TFChecksum.GoProcess;
const ChksumBlockSize = 65536*4;
-var i, Error, Count: integer;
+var i, ErrNum, Count: integer;
FD: TEngineFileDes;
Buffer: Pointer;
MaxSize, OldPos: Int64;
@@ -382,6 +396,7 @@ var i, Error, Count: integer;
CRC: LongWord;
MDContext: TMDContext;
MDDigest: TMDDigest;
+ Error: PGError;
begin
if List.Count = 0 then Exit;
CheckButton.Caption := LANGCheckButtonCaptionStop;
@@ -417,18 +432,21 @@ begin
Data := List[i];
CRC := 0;
if Data.IsMD5 then MDInit(MDContext, MD_VERSION_5);
- Error := 0;
- FD := Engine.OpenFile(Data.FullPath, omRead, Error);
- if Error <> 0 then begin
+ Error := nil;
+ FD := Engine.OpenFile(Data.FullPath, omRead, @Error);
+ if Error <> nil then begin
Data.Status := 3;
+ g_error_free(Error);
Continue;
end;
repeat
- Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, Error);
- if Error <> 0 then begin
+ Error := nil;
+ Count := Engine.ReadFile(FD, Buffer, ChksumBlockSize, @Error);
+ if Error <> nil then begin
Data.Status := 3;
- Engine.CloseFile(FD);
- Continue;
+ g_error_free(Error);
+ Engine.CloseFile(FD, nil);
+ Break;
end;
if not Data.IsMD5 then CRC := CRC32(CRC, Buffer, Count)
else MDUpdate(MDContext, Buffer^, Count);
@@ -436,7 +454,7 @@ begin
ProgressBar.Text := Format('%d %%', [Trunc(ProgressBar.Fraction * 100)]);
Application.ProcessMessages;
until (Count < ChksumBlockSize) or Stop;
- Engine.CloseFile(FD);
+ Engine.CloseFile(FD, nil);
if Stop then Break;
if not Data.IsMD5 then Data.Status := Ord(not (CRC = Data.CRC)) + 1 else begin
MDFinal(MDContext, MDDigest);
@@ -455,11 +473,11 @@ begin
StatLabel.Caption := LANGChecksumInterrupted;
CheckButton.SetFocus;
end else begin
- Error := 0;
+ ErrNum := 0;
if List.Count > 0 then
for i := 0 to List.Count - 1 do
- if TFileListItem(List[i]).Status <> 1 then Inc(Error);
- StatLabel.Caption := Format(LANGChecksumDOK, [Round(100 * (List.Count - Error) / List.Count)]);
+ if TFileListItem(List[i]).Status <> 1 then Inc(ErrNum);
+ StatLabel.Caption := Format(LANGChecksumDOK, [Round(100 * (List.Count - ErrNum) / List.Count)]);
ActionArea.SetFocus;
end;
StatLabel.UseMarkup := True;