DEADSOFTWARE

sfs: API to temporary disable volume GC
[d2df-sdl.git] / src / sfs / xstreams.pas
index a9026cfd7dabdf5261e28d1f75522827bddc9a4a..1861c616d0972578f2fcb967dc051dc4e9fc9443 100644 (file)
@@ -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;