diff --git a/src/sfs/xstreams.pas b/src/sfs/xstreams.pas
index a9026cfd7dabdf5261e28d1f75522827bddc9a4a..1861c616d0972578f2fcb967dc051dc4e9fc9443 100644 (file)
--- a/src/sfs/xstreams.pas
+++ b/src/sfs/xstreams.pas
end;
TSFSMemoryStreamRO = class(TCustomMemoryStream)
+ private
+ fFreeMem: Boolean;
+ fMem: Pointer;
+
public
- constructor Create (pMem: Pointer; pSize: Integer);
+ constructor Create (pMem: Pointer; pSize: Integer; aFreeMem: Boolean=false);
+ destructor Destroy (); override;
function Write (const buffer; count: LongInt): LongInt; override;
end;
procedure TSFSPartialStream.CheckPos ();
begin
+ {
if fSource.Position <> fStartPos+fCurrentPos-Length(fPreBuf) then
begin
fSource.Position := fStartPos+fCurrentPos-Length(fPreBuf);
end;
+ }
+ if fCurrentPos >= length(fPreBuf) then
+ begin
+ //writeln('seeking at ', fCurrentPos, ' (real: ', fStartPos+fCurrentPos-Length(fPreBuf), ')');
+ fSource.Position := fStartPos+fCurrentPos-Length(fPreBuf);
+ end;
fLastReadPos := fCurrentPos;
end;
{ TSFSMemoryStreamRO }
-constructor TSFSMemoryStreamRO.Create (pMem: Pointer; pSize: Integer);
+constructor TSFSMemoryStreamRO.Create (pMem: Pointer; pSize: Integer; aFreeMem: Boolean=false);
begin
+ fFreeMem := aFreeMem;
+ fMem := pMem;
inherited Create();
SetPointer(pMem, pSize);
Position := 0;
end;
+destructor TSFSMemoryStreamRO.Destroy ();
+begin
+ if fFreeMem and (fMem <> nil) then FreeMem(fMem);
+end;
+
function TSFSMemoryStreamRO.Write (const buffer; count: LongInt): LongInt;
begin
result := 0;