ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/DataAccess/Access_OniArchive.pas
(Generate patch)

Comparing oup/current/DataAccess/Access_OniArchive.pas (file contents):
Revision 148 by alloc, Sun Apr 1 16:37:25 2007 UTC vs.
Revision 209 by alloc, Mon Jun 4 22:07:29 2007 UTC

# Line 15 | Line 15 | type
15      FDatOpened:          Boolean;
16      FRawOpened:          Boolean;
17      FSepOpened:          Boolean;
18 +    procedure SetUnloadWhenUnused(doit: Boolean);
19    protected
20    public
21 <    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused;
21 >    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused;
22  
23      constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
24      procedure Close; override;
# Line 52 | Line 53 | type
53   implementation
54  
55   uses
56 <  SysUtils, StrUtils, Data, Functions, RawList, DatLinks;
56 >  SysUtils, StrUtils, Data, Functions, RawList, DatLinks, Math;
57  
58  
59   (*
# Line 164 | Line 165 | end;
165  
166  
167  
168 + procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean);
169 + begin
170 +  FUnloadWhenUnused := doit;
171 +  if FUnloadWhenUnused then
172 +  begin
173 +    if FDatOpened then
174 +    begin
175 +      FDatOpened := False;
176 +      Fdat_file.Free;
177 +    end;
178 +    if FRawOpened then
179 +    begin
180 +      FRawOpened := False;
181 +      Fraw_file.Free;
182 +    end;
183 +    if FSepOpened then
184 +    begin
185 +      FSepOpened := False;
186 +      Fsep_file.Free;
187 +    end;
188 +  end
189 +  else
190 +  begin
191 +    if not FDatOpened then
192 +    begin
193 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
194 +      FDatOpened := True;
195 +    end;
196 +    if not FRawOpened then
197 +    begin
198 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
199 +        fmOpenReadWrite);
200 +      FRawOpened := True;
201 +    end;
202 +    if (not FSepOpened) and (FDataOS <> DOS_WIN) then
203 +    begin
204 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
205 +        fmOpenReadWrite);
206 +      FSepOpened := True;
207 +    end;
208 +  end;
209 + end;
210 +
211 +
212 +
213 +
214 +
215   procedure TAccess_OniArchive.Close;
216   begin
217    if FDatOpened then
# Line 559 | Line 607 | begin
607          Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
608            fmOpenReadWrite);
609        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
610 <      Fraw_file.CopyFrom(Src, raw_info.RawSize);
610 >      Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
611        if UnloadWhenUnused then
612        begin
613          FRawOpened := False;
# Line 646 | Line 694 | begin
694   end;
695  
696   function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Src: TStream): Integer;
697 + const
698 +  EmptyBytes: Array[0..31] of Byte = (
699 +      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 );
700   begin
701    if not LocSep then
702    begin
703      if not FRawOpened then
704        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
705          fmOpenReadWrite);
706 +    if (Fraw_file.Size mod 32) > 0 then
707 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
708      Result := Fraw_file.Size;
709      Fraw_file.Seek(0, soFromEnd);
710      Fraw_file.CopyFrom(Src, Src.Size);
711 +    if (Fraw_file.Size mod 32) > 0 then
712 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
713      if UnloadWhenUnused then
714      begin
715        FRawOpened := False;
# Line 668 | Line 723 | begin
723      if not FSepOpened then
724        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
725          fmOpenReadWrite);
726 +    if (Fsep_file.Size mod 32) > 0 then
727 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
728      Result := Fsep_file.Size;
729      Fsep_file.Seek(0, soFromEnd);
730      Fsep_file.CopyFrom(Src, Src.Size);
731 +    if (Fsep_file.Size mod 32) > 0 then
732 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
733      if UnloadWhenUnused then
734      begin
735        FSepOpened := False;

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)