Browse Source

* Patch from Ondrej Pokorny to support streaming to position 0 (bug ID 35724)

git-svn-id: trunk@42250 -
michael 6 years ago
parent
commit
6c1593652b
1 changed files with 20 additions and 3 deletions
  1. 20 3
      packages/fcl-base/src/blowfish.pp

+ 20 - 3
packages/fcl-base/src/blowfish.pp

@@ -59,8 +59,8 @@ Type
     function GetPosition: Int64; override;
     function GetPosition: Int64; override;
     procedure InvalidSeek; override;
     procedure InvalidSeek; override;
   Public
   Public
-    Constructor Create(AKey : TBlowFishKey; AKeySize : Byte; Dest: TStream);
-    Constructor Create(Const KeyPhrase : String; Dest: TStream);
+    Constructor Create(AKey : TBlowFishKey; AKeySize : Byte; Dest: TStream); overload; virtual;
+    Constructor Create(Const KeyPhrase : String; Dest: TStream); overload;
     Destructor Destroy; override;
     Destructor Destroy; override;
     Property BlowFish : TBlowFish Read FBF;
     Property BlowFish : TBlowFish Read FBF;
   end;
   end;
@@ -74,7 +74,11 @@ Type
   end;
   end;
 
 
   TBlowFishDeCryptStream = Class(TBlowFishStream)
   TBlowFishDeCryptStream = Class(TBlowFishStream)
+  private
+    FSourcePos0: Int64;
   public
   public
+    Constructor Create(AKey : TBlowFishKey; AKeySize : Byte; Dest: TStream); override;
+
     function Read(var Buffer; Count: Longint): Longint; override;
     function Read(var Buffer; Count: Longint): Longint; override;
     function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
     function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
   end;
   end;
@@ -652,6 +656,13 @@ end;
     TBlowFishDecryptStream
     TBlowFishDecryptStream
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
 
 
+constructor TBlowFishDeCryptStream.Create(AKey: TBlowFishKey; AKeySize: Byte;
+  Dest: TStream);
+begin
+  inherited Create(AKey, AKeySize, Dest);
+
+  FSourcePos0 := Source.Position;
+end;
 
 
 function TBlowFishDeCryptStream.Read(var Buffer; Count: Longint): Longint;
 function TBlowFishDeCryptStream.Read(var Buffer; Count: Longint): Longint;
 
 
@@ -697,7 +708,13 @@ end;
 function TBlowFishDeCryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
 function TBlowFishDeCryptStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
 
 
 begin
 begin
-  FakeSeekForward(Offset,TSeekOrigin(Origin),FPos);
+  if (Offset=0) and (Origin=soBeginning) then
+  begin // support seek to beginning
+    FBufPos:=0;
+    FPos:=0;
+    Source.Position := FSourcePos0;
+  end else
+    FakeSeekForward(Offset,TSeekOrigin(Origin),FPos);
   Result:=FPos;
   Result:=FPos;
 end;
 end;