--- oup/current/DataAccess/Access_OniArchive.pas 2007/04/01 16:37:25 148 +++ oup/current/DataAccess/Access_OniArchive.pas 2007/06/20 10:57:51 229 @@ -15,9 +15,10 @@ type FDatOpened: Boolean; FRawOpened: Boolean; FSepOpened: Boolean; + procedure SetUnloadWhenUnused(doit: Boolean); protected public - property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused; + property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused; constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; procedure Close; override; @@ -52,7 +53,7 @@ type implementation uses - SysUtils, StrUtils, Data, Functions, RawList, DatLinks; + SysUtils, StrUtils, Data, Functions, RawList, DatLinks, Math; (* @@ -159,11 +160,60 @@ begin FBackend := DB_ONI; FConnectionID := ConnectionID; FChangeRights := [CR_EditDat, CR_EditRaw, CR_AppendRaw]; + + inherited; end; +procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean); +begin + FUnloadWhenUnused := doit; + if FUnloadWhenUnused then + begin + if FDatOpened then + begin + FDatOpened := False; + Fdat_file.Free; + end; + if FRawOpened then + begin + FRawOpened := False; + Fraw_file.Free; + end; + if FSepOpened then + begin + FSepOpened := False; + Fsep_file.Free; + end; + end + else + begin + if not FDatOpened then + begin + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); + FDatOpened := True; + end; + if not FRawOpened then + begin + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); + FRawOpened := True; + end; + if (not FSepOpened) and (FDataOS <> DOS_WIN) then + begin + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); + FSepOpened := True; + end; + end; +end; + + + + + procedure TAccess_OniArchive.Close; begin if FDatOpened then @@ -559,7 +609,7 @@ begin Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), fmOpenReadWrite); Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); - Fraw_file.CopyFrom(Src, raw_info.RawSize); + Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size)); if UnloadWhenUnused then begin FRawOpened := False; @@ -646,15 +696,22 @@ begin end; function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Src: TStream): Integer; +const + EmptyBytes: Array[0..31] of Byte = ( + 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 ); begin if not LocSep then begin if not FRawOpened then Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), fmOpenReadWrite); + if (Fraw_file.Size mod 32) > 0 then + Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32)); Result := Fraw_file.Size; Fraw_file.Seek(0, soFromEnd); Fraw_file.CopyFrom(Src, Src.Size); + if (Fraw_file.Size mod 32) > 0 then + Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32)); if UnloadWhenUnused then begin FRawOpened := False; @@ -668,9 +725,13 @@ begin if not FSepOpened then Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), fmOpenReadWrite); + if (Fsep_file.Size mod 32) > 0 then + Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32)); Result := Fsep_file.Size; Fsep_file.Seek(0, soFromEnd); Fsep_file.CopyFrom(Src, Src.Size); + if (Fsep_file.Size mod 32) > 0 then + Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32)); if UnloadWhenUnused then begin FSepOpened := False;