--- oup/current/DataAccess/Access_OUP_ADB.pas 2007/04/01 23:47:18 157 +++ oup/current/DataAccess/Access_OUP_ADB.pas 2007/08/10 17:26:03 243 @@ -34,6 +34,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 LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override; procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override; @@ -90,7 +91,7 @@ begin end; if FQuery.FieldByName('name').AsString = 'lvl' then FLevelNumber := StrToInt(FQuery.FieldByName('value').AsString); - if FQuery.FieldByName('name').AsString = 'DataOS' then + if FQuery.FieldByName('name').AsString = 'os' then begin if FQuery.FieldByName('value').AsString = 'WIN' then FDataOS := DOS_WIN @@ -112,6 +113,8 @@ begin FChangeRights := [CR_EditDat, CR_EditRaw, CR_ResizeDat, CR_ResizeRaw]; UpdateListCache; + + inherited; end; @@ -213,6 +216,15 @@ end; + function CompareItems(List: TStringList; I1, I2: Integer): Integer; + var + s1, s2: String; + begin + s1 := MidStr(List[I1], 1, PosEx(';', List[I1], 6) - 1); + s2 := MidStr(List[I2], 1, PosEx(';', List[I2], 6) - 1); + Result := CompareStr(s1, s2); + end; + function TAccess_OUP_ADB.GetFilesList(ext: String; pattern: String; NoEmptyFiles: Boolean; SortType: TSortType): TStrings; var @@ -251,75 +263,56 @@ var end; begin - if not (SortType in [ST_ExtNameAsc, ST_ExtNameDesc]) then - begin - list := TStringList.Create; + list := TStringList.Create; + if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then + list.Sorted := False + else list.Sorted := True; - for i := 0 to GetFileCount - 1 do + 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 + ((Length(pattern) = 0) or + (Pos(UpperCase(pattern), UpperCase(Fdat_files[i].Name)) > 0)) then begin - if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and - ((Length(pattern) = 0) or - (Pos(UpperCase(pattern), UpperCase(Fdat_files[i].Name)) > 0)) then + if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then begin - if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then - begin - id := FormatNumber(Fdat_files[i].ID, 5, '0'); - name := Fdat_files[i].Name; - extension := Fdat_files[i].Extension; - - case SortType of - ST_IDAsc, ST_IDDesc: list.Add(id + ';' + name + ';' + extension); - ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension); - ST_ExtAsc, ST_ExtDesc: list.Add(extension + ';' + id + ';' + name); - ST_ExtNameAsc, ST_ExtNameDesc: list.Add(extension + ';' + name + ';' + id); - end; + id := FormatNumber(Fdat_files[i].ID, 5, '0'); + name := Fdat_files[i].Name; + extension := Fdat_files[i].Extension; + + case SortType of + ST_IDAsc, ST_IDDesc: list.Add(id + ';' + name + ';' + extension); + ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension); + ST_ExtAsc, ST_ExtDesc: list.Add(extension + ';' + id + ';' + name); + ST_ExtNameAsc, ST_ExtNameDesc: list.Add(extension + ';' + name + ';' + id); end; end; end; - if not Assigned(Result) then - Result := TStringList.Create; - if list.Count > 0 then - begin - fields := TStringList.Create; - if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc, ST_ExtNameAsc] then - for i := 0 to list.Count - 1 do - begin - getfields; - Result.Add(id + '-' + name + '.' + extension); - end - else - for i := list.Count - 1 downto 0 do - begin - getfields; - Result.Add(id + '-' + name + '.' + extension); - end; - fields.Free; - end; - list.Free; - end - else + end; + if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then + list.CustomSort(CompareItems); + if not Assigned(Result) then + Result := TStringList.Create; + if list.Count > 0 then begin - FQuery.SQL.Text := 'SELECT id, name, extension FROM datfiles ' + - 'WHERE Length(name) > 0 ORDER BY extension ASC, name ASC;'; - FQuery.Open; - if not Assigned(Result) then - Result := TStringList.Create; - if FQuery.RecordCount > 0 then - begin - FQuery.First; - repeat - name := FormatNumber(FQuery.FieldByName('id').AsInteger, 5, '0') + - '-' + FQuery.FieldByName('name').AsString + '.' + - FQuery.FieldByName('extension').AsString; - if SortType = ST_ExtNameAsc then - Result.Add(name) - else - Result.Insert(0, name); - FQuery.Next; - until FQuery.EOF; - end; - FQuery.Close; + fields := TStringList.Create; + if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc, ST_ExtNameAsc] then + for i := 0 to list.Count - 1 do + begin + getfields; + Result.Add(id + '-' + name + '.' + extension); + end + else + for i := list.Count - 1 downto 0 do + begin + getfields; + Result.Add(id + '-' + name + '.' + extension); + end; + fields.Free; end; + list.Free; end; @@ -499,7 +492,7 @@ var i: Integer; begin SetLength(Result, 0); - FQuery.SQL.Text := 'SELECT [src_link_offset],[size],[sep] FROM rawmap WHERE [src_id]=' + + FQuery.SQL.Text := 'SELECT [src_link_offset],[name],[size],[sep],[type] FROM rawmap WHERE [src_id]=' + IntToStr(fileid) + ' ORDER BY src_link_offset ASC;'; FQuery.Open; if FQuery.RecordCount > 0 then @@ -508,11 +501,13 @@ begin SetLength(Result, FQuery.RecordCount); i := 0; repeat + Result[i].Name := FQuery.FieldByName('name').AsString; Result[i].SrcID := fileid; Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; Result[i].RawAddr := 0; Result[i].RawSize := FQuery.FieldByName('size').AsInteger; Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean; + Result[i].RawType := FQuery.FieldByName('type').AsString; Inc(i); FQuery.Next; until FQuery.EOF; @@ -535,15 +530,48 @@ begin if i < Length(rawlist) then Result := rawlist[i] else begin + Result.Name := ''; Result.SrcID := -1; Result.SrcOffset := -1; Result.RawAddr := -1; Result.RawSize := -1; + Result.RawType := ''; end; end; end; +function TAccess_OUP_ADB.GetRawsForType(RawType: String): TRawDataList; +var + i: Integer; + rawlist: TRawDataList; +begin + SetLength(Result, 0); + FQuery.SQL.Text := 'SELECT [src_id],[src_link_offset],[name],[size],[sep] FROM rawmap ' + + 'WHERE [type]="' + RawType + '" and [size]>0 ORDER BY src_id ASC, src_link_offset ASC;'; + FQuery.Open; + if FQuery.RecordCount > 0 then + begin + FQuery.First; + SetLength(Result, FQuery.RecordCount); + i := 0; + repeat + Result[i].Name := FQuery.FieldByName('name').AsString; + Result[i].SrcID := FQuery.FieldByName('src_id').AsInteger; + Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; + Result[i].RawAddr := 0; + Result[i].RawSize := FQuery.FieldByName('size').AsInteger; + Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean; + Result[i].RawType := RawType; + Inc(i); + FQuery.Next; + until FQuery.EOF; + end; + FQuery.Close; +end; + + + procedure TAccess_OUP_ADB.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); var