|
@@ -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);
|