--- oup/current/DataAccess/Access_OniArchive.pas 2007/02/25 17:20:22 113 +++ oup/current/DataAccess/Access_OniArchive.pas 2007/05/24 17:48:18 192 @@ -34,10 +34,12 @@ type procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override; function GetDatLinks(FileID: Integer): TDatLinkList; override; + function GetDatLink(FileID, DatOffset: Integer): TDatLink; override; function GetRawList(FileID: Integer): TRawDataList; override; function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override; - procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); + procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload; + procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); overload; procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override; procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override; procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override; @@ -50,7 +52,7 @@ type implementation uses - SysUtils, StrUtils, Data, Functions, RawList; + SysUtils, StrUtils, Data, Functions, RawList, DatLinks, Math; (* @@ -397,6 +399,39 @@ end; +function TAccess_OniArchive.GetDatLink(FileID, DatOffset: Integer): TDatLink; +var + link: Integer; +begin + Result := DatLinksManager.GetDatLink(FConnectionID, FileID, DatOffset); + LoadDatFilePart(fileid, Result.SrcOffset, 4, @link); + if link > 0 then + Result.DestID := link div 256 + else + Result.DestID := -1; +end; + + +function TAccess_OniArchive.GetDatLinks(FileID: Integer): TDatLinkList; +var + i: Integer; + link: Integer; +begin + Result := DatLinksManager.GetDatLinks(FConnectionID, FileID); + if Length(Result) > 0 then + begin + for i := 0 to High(Result) do + begin + LoadDatFilePart(fileid, Result[i].SrcOffset, 4, @link); + if link > 0 then + Result[i].DestID := link div 256 + else + Result[i].DestID := -1; + end; + end; +end; + + function TAccess_OniArchive.GetRawList(FileID: Integer): TRawDataList; begin Result := RawLists.GetRawList(FConnectionID, FileID); @@ -410,9 +445,10 @@ end; - -procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); +procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); begin + if not Assigned(Target) then + Target := TMemoryStream.Create; if not LocSep then begin if not FRawOpened then @@ -421,7 +457,8 @@ begin if RawAddr <= Fraw_file.Size then begin Fraw_file.Seek(RawAddr, soFromBeginning); - Fraw_file.Read(target^, size); + Target.CopyFrom(Fraw_file, size); + Target.Seek(0, soFromBeginning); end; if UnloadWhenUnused then begin @@ -439,7 +476,8 @@ begin if RawAddr <= Fsep_file.Size then begin Fsep_file.Seek(RawAddr, soFromBeginning); - Fsep_file.Read(target^, size); + Target.CopyFrom(Fsep_file, size); + Target.Seek(0, soFromBeginning); end; if UnloadWhenUnused then begin @@ -451,6 +489,16 @@ begin end; end; +procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); +var + data: TStream; +begin + data := nil; + LoadRawOffset(LocSep, RawAddr, Size, data); + data.Read(Target^, Size); + data.Free; +end; + procedure TAccess_OniArchive.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); var raw_info: TRawDataInfo; @@ -511,7 +559,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; @@ -556,6 +604,7 @@ begin end; end; + procedure TAccess_OniArchive.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream); var raw_info: TRawDataInfo; @@ -597,15 +646,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; @@ -619,9 +675,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;