--- oup/current/DataAccess/Access_OniArchive.pas 2007/05/24 17:48:18 192 +++ oup/current/DataAccess/Access_OniArchive.pas 2008/10/18 23:27:59 256 @@ -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; @@ -37,6 +38,7 @@ type function GetDatLink(FileID, DatOffset: Integer): TDatLink; override; function GetRawList(FileID: Integer): TRawDataList; override; function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override; + function GetRawsForType(RawType: String): TRawDataList; override; procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload; procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); overload; @@ -159,11 +161,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 @@ -234,6 +285,8 @@ var begin list := TStringList.Create; list.Sorted := True; + if ext = '*' then + ext := ''; for i := 0 to GetFileCount - 1 do begin if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and @@ -321,19 +374,22 @@ begin begin if not Assigned(Target) then Target := TMemoryStream.Create; - if not FDatOpened then - Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); - Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); - streampos := Target.Position; - Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); - Target.Seek(streampos, soFromBeginning); - if UnloadWhenUnused then + if GetFileInfo(FileID).Size > 0 then begin - Fdat_file.Free; - FDatOpened := False; - end - else - FDatOpened := True; + if not FDatOpened then + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); + Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); + streampos := Target.Position; + Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); + Target.Seek(streampos, soFromBeginning); + if UnloadWhenUnused then + begin + Fdat_file.Free; + FDatOpened := False; + end + else + FDatOpened := True; + end; end; end; @@ -438,6 +494,29 @@ begin end; +function TAccess_OniArchive.GetRawsForType(RawType: String): TRawDataList; +var + i, j: Integer; + dats: TStrings; + list: TRawDataList; +begin + dats := nil; + dats := GetFilesList(MidStr(RawType, 1, 4), '', True, ST_IDAsc); + for i := 0 to dats.Count - 1 do + begin + list := GetRawList(StrToInt(MidStr(dats.Strings[i], 1, 5))); + for j := 0 to Length(list) - 1 do + begin + if (list[j].RawType = RawType) and (list[j].RawSize > 0) then + begin + SetLength(Result, Length(Result)+1); + Result[High(Result)] := list[j]; + end; + end; + end; +end; + + function TAccess_OniArchive.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; begin Result := RawLists.GetRawInfo(FConnectionID, FileID, DatOffset);