diff options
Diffstat (limited to 'UChecksum.pas')
| -rw-r--r-- | UChecksum.pas | 70 |
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; |
