X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fsfs%2Fxstreams.pas;h=1861c616d0972578f2fcb967dc051dc4e9fc9443;hb=e115314b89990a3263a0971b47cee316d20d0aab;hp=a9026cfd7dabdf5261e28d1f75522827bddc9a4a;hpb=2fdb1deb5facdcfadb85ab28050bc02451cf7ba8;p=d2df-sdl.git diff --git a/src/sfs/xstreams.pas b/src/sfs/xstreams.pas index a9026cf..1861c61 100644 --- a/src/sfs/xstreams.pas +++ b/src/sfs/xstreams.pas @@ -85,8 +85,13 @@ type 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; @@ -174,10 +179,17 @@ 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; @@ -279,13 +291,20 @@ 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;