Browse Source

* Override 64-bit version, common fake seek (modified patch from Chad B - bug ID #19848)

git-svn-id: trunk@18194 -
michael 14 years ago
parent
commit
a9c2e6a8ae
1 changed files with 20 additions and 25 deletions
  1. 20 25
      packages/fcl-base/src/bufstream.pp

+ 20 - 25
packages/fcl-base/src/bufstream.pp

@@ -38,6 +38,8 @@ Type
     FCapacity: Integer;
     FCapacity: Integer;
     procedure SetCapacity(const AValue: Integer);
     procedure SetCapacity(const AValue: Integer);
   Protected
   Protected
+    function GetPosition: Int64; override;
+    function GetSize: Int64; override;
     procedure BufferError(const Msg : String);
     procedure BufferError(const Msg : String);
     Procedure FillBuffer; Virtual;
     Procedure FillBuffer; Virtual;
     Procedure FlushBuffer; Virtual;
     Procedure FlushBuffer; Virtual;
@@ -55,7 +57,7 @@ Type
 
 
   TReadBufStream = Class(TBufStream)
   TReadBufStream = Class(TBufStream)
   Public
   Public
-    Function Seek(Offset: Longint; Origin: Word): Longint; override;
+    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
     Function Read(var ABuffer; ACount : LongInt) : Integer; override;
     Function Read(var ABuffer; ACount : LongInt) : Integer; override;
   end;
   end;
 
 
@@ -64,7 +66,7 @@ Type
   TWriteBufStream = Class(TBufStream)
   TWriteBufStream = Class(TBufStream)
   Public
   Public
     Destructor Destroy; override;
     Destructor Destroy; override;
-    Function Seek(Offset: Longint; Origin: Word): Longint; override;
+    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
     Function Write(Const ABuffer; ACount : LongInt) : Integer; override;
     Function Write(Const ABuffer; ACount : LongInt) : Integer; override;
   end;
   end;
 
 
@@ -88,6 +90,16 @@ begin
     end;
     end;
 end;
 end;
 
 
+function TBufStream.GetPosition: Int64;
+begin
+  Result:=FTotalPos;
+end;
+
+function TBufStream.GetSize: Int64;
+begin
+  Result:=Source.Size;
+end;
+
 procedure TBufStream.BufferError(const Msg: String);
 procedure TBufStream.BufferError(const Msg: String);
 begin
 begin
   Raise EStreamError.Create(Msg);
   Raise EStreamError.Create(Msg);
@@ -162,29 +174,11 @@ end;
 
 
 { TReadBufStream }
 { TReadBufStream }
 
 
-function TReadBufStream.Seek(Offset: Longint; Origin: Word): Longint;
-
-var
-  I: Integer;
-  Buf: array [0..4095] of Char;
+function TReadBufStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
 
 
 begin
 begin
-  // Emulate forward seek if possible.
-  if ((Offset>=0) and (Origin = soFromCurrent)) or
-     (((Offset-FTotalPos)>=0) and (Origin = soFromBeginning)) then
-    begin
-    if (Origin=soFromBeginning) then
-      Dec(Offset,FTotalPos);
-    if (Offset>0) then
-      begin
-      for I:=1 to (Offset div sizeof(Buf)) do
-        ReadBuffer(Buf,sizeof(Buf));
-      ReadBuffer(Buf, Offset mod sizeof(Buf));
-      end;
-    Result:=FTotalPos;
-    end
-  else
-    BufferError(SErrInvalidSeek);
+  FakeSeekForward(Offset,Origin,FTotalPos);
+  Result:=FTotalPos; // Pos updated by fake read
 end;
 end;
 
 
 function TReadBufStream.Read(var ABuffer; ACount: LongInt): Integer;
 function TReadBufStream.Read(var ABuffer; ACount: LongInt): Integer;
@@ -226,9 +220,10 @@ begin
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
-function TWriteBufStream.Seek(Offset: Longint; Origin: Word): Longint;
+function TWriteBufStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
+
 begin
 begin
-  if (Offset=0) and (Origin=soFromCurrent) then
+  if (Offset=0) and (Origin=soCurrent) then
     Result := FTotalPos
     Result := FTotalPos
   else
   else
     BufferError(SErrInvalidSeek);
     BufferError(SErrInvalidSeek);