Browse Source

* Fix bug ID #19856 (adapted and completed patch by Chad B)

git-svn-id: trunk@18195 -
michael 14 years ago
parent
commit
1dfa1d5f26

+ 10 - 0
packages/fcl-process/src/os2/pipes.inc

@@ -32,3 +32,13 @@ begin
   Result := 0;
 end;
 
+function TInputPipeStream.GetPosition: Int64;
+begin
+  Result:=FPos;
+end;
+
+procedure TInputPipeStream.InvalidSeek;
+begin
+  Raise EPipeSeek.Create (ENoSeekMsg);
+end;
+

+ 9 - 22
packages/fcl-process/src/pipes.pp

@@ -32,16 +32,19 @@ Type
     Private
       FPos : Int64;
       function GetNumBytesAvailable: DWord;
+    protected
+      function GetPosition: Int64; override;
+      procedure InvalidSeek; override;
     public
       Function Write (Const Buffer; Count : Longint) :Longint; Override;
-      Function Seek (Offset : Longint;Origin : Word) : longint;override;
+      function Seek(const Offset: int64; Origin: TSeekOrigin): int64; override;
       Function Read (Var Buffer; Count : Longint) : longint; Override;
       property NumBytesAvailable: DWord read GetNumBytesAvailable;
     end;
 
   TOutputPipeStream = Class(THandleStream)
     Public
-      Function Seek (Offset : Longint;Origin : Word) : longint;override;
+      function Seek(const Offset: int64; Origin: TSeekOrigin): int64; override;
       Function Read (Var Buffer; Count : Longint) : longint; Override;
     end;
 
@@ -90,26 +93,10 @@ begin
   Inc(FPos,Result);
 end;
 
-Function TInputPipeStream.Seek (Offset : Longint;Origin : Word) : longint;
-
-Const BufSize = 100;
-
-Var Buf : array[1..BufSize] of Byte;
+function TInputPipeStream.Seek(const Offset: int64; Origin: TSeekOrigin): int64;
 
 begin
-  If (Origin=soFromCurrent) and (Offset=0) then
-     result:=FPos;
-  { Try to fake seek by reading and discarding }
-  if Not((Origin=soFromCurrent) and (Offset>=0) or
-         ((Origin=soFrombeginning) and (OffSet>=FPos))) then
-     Raise EPipeSeek.Create(ENoSeekMSg);
-  if Origin=soFromBeginning then
-    Dec(Offset,FPos);
-  While ((Offset Div BufSize)>0)
-        and (Read(Buf,SizeOf(Buf))=BufSize) do
-     Dec(Offset,BufSize);
-  If (Offset>0) then
-    Read(Buf,BufSize);
+  FakeSeekForward(Offset,Origin,FPos);
   Result:=FPos;
 end;
 
@@ -124,10 +111,10 @@ begin
   Result := 0;
 end;
 
-Function TOutputPipeStream.Seek (Offset : Longint;Origin : Word) : longint;
+function TOutputPipeStream.Seek(const Offset: int64; Origin: TSeekOrigin): int64;
 
 begin
-  Raise EPipeSeek.Create (ENoSeekMsg);
+  InvalidSeek;
 end;
 
 end.

+ 10 - 0
packages/fcl-process/src/unix/pipes.inc

@@ -30,3 +30,13 @@ begin
     Result := 0;
 end;
 
+function TInputPipeStream.GetPosition: Int64;
+begin
+  Result:=FPos;
+end;
+
+procedure TInputPipeStream.InvalidSeek;
+begin
+  Raise EPipeSeek.Create (ENoSeekMsg);
+end;
+

+ 9 - 0
packages/fcl-process/src/win/pipes.inc

@@ -41,3 +41,12 @@ begin
     Result := 0;
 end;
 
+function TInputPipeStream.GetPosition: Int64;
+begin
+  Result:=FPos;
+end;
+
+procedure TInputPipeStream.InvalidSeek;
+begin
+  Raise EPipeSeek.Create (ENoSeekMsg);
+end;