--- oup/current/DataAccess/Access_OniArchive.pas 2007/06/20 22:24:04 231 +++ oup/current/DataAccess/Access_OniArchive.pas 2009/05/06 13:47:23 321 @@ -38,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; @@ -284,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 @@ -369,10 +372,10 @@ var begin if fileid < GetFileCount then begin + if not Assigned(Target) then + Target := TMemoryStream.Create; if GetFileInfo(FileID).Size > 0 then 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); @@ -491,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); @@ -562,6 +588,8 @@ begin if fileid < GetFileCount then begin raw_info := Self.GetRawInfo(FileID, DatOffset); + if raw_info.RawSize = 0 then + exit; if not raw_info.LocSep then begin if not FRawOpened then