ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/DataAccess/Access_OniArchive.pas
(Generate patch)

Comparing oup/current/DataAccess/Access_OniArchive.pas (file contents):
Revision 109 by alloc, Wed Feb 21 03:12:33 2007 UTC vs.
Revision 173 by alloc, Wed May 2 13:19:40 2007 UTC

# Line 33 | Line 33 | type
33      procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; override;
34      procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override;
35  
36 +    function GetDatLinks(FileID: Integer): TDatLinkList; override;
37 +    function GetDatLink(FileID, DatOffset: Integer): TDatLink; override;
38      function GetRawList(FileID: Integer): TRawDataList; override;
39      function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
40  
41 <    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
41 >    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload;
42 >    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); overload;
43      procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override;
44      procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override;
45      procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override;
# Line 49 | Line 52 | type
52   implementation
53  
54   uses
55 <  SysUtils, StrUtils, Data, Functions, RawList;
55 >  SysUtils, StrUtils, Data, Functions, RawList, DatLinks;
56  
57  
58   (*
# Line 59 | Line 62 | uses
62  
63  
64   constructor TAccess_OniArchive.Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages);
62 type
63  THeader = packed record
64    Ident:      array[0..$13] of Byte;
65    Files:      Integer;
66    NamedFiles: Integer;
67    Extensions: Integer;
68    DataAddr:   Integer;
69    DataSize:   Integer;
70    NamesAddr:  Integer;
71    NamesSize:  Integer;
72    Ident2:     array[0..$F] of Byte;
73  end;
74  TFilesMap = array of packed record
75    Extension: array[0..$3] of Char;
76    DataAddr:  Integer;
77    NameAddr:  Integer;
78    FileSize:  Integer;
79    FileType:  LongWord;
80  end;
81  TNamedFilesMap = array of packed record
82    FileNumber: Integer;
83    blubb:      Integer;
84  end;
85 const
86  header_ident1_pc: array[0..$13] of Byte =
87    ($1F, $27, $DC, $33, $DF, $BC, $03, $00, $31, $33, $52, $56, $40, $00,
88    $14, $00, $10, $00, $08, $00);
89  header_ident1_mac: array[0..$13] of Byte =
90    ($61, $30, $C1, $23, $DF, $BC, $03, $00, $31, $33, $52, $56, $40, $00,
91    $14, $00, $10, $00, $08, $00);
92  header_ident1_macbeta: array[0..$13] of Byte =
93    ($81, $11, $8D, $23, $DF, $BC, $03, $00, $31, $33, $52, $56, $40, $00,
94    $14, $00, $10, $00, $08, $00);
95  header_ident2: array[0..$F] of Byte =
96    ($99, $CF, $40, $00, $90, $4F, $63, $00, $F4, $55, $5F, $00, $90, $4F, $63, $00);
65   var
66    i: Integer;
67    header_pc, header_mac, header_macbeta: Boolean;
# Line 116 | Line 84 | begin
84    header_pc  := True;
85    header_mac := True;
86    header_macbeta := True;
87 <  for i := 0 to High(Fdat_header.Ident) do
87 >  for i := 0 to High(Fdat_header.GlobalIdent) do
88 >    if Fdat_header.GlobalIdent[i] <> HeaderGlobalIdent[i] then
89 >    begin
90 >      Msg := SM_IncompatibleFile;
91 >      Exit;
92 >    end;
93 >
94 >  for i := 0 to High(Fdat_header.OSIdent) do
95    begin
96 < //    FLevelInfo.Ident[i] := Fdat_header.Ident[i];
122 <    if Fdat_header.Ident[i] <> header_ident1_pc[i] then
96 >    if Fdat_header.OSIdent[i] <> HeaderOSIdentWin[i] then
97        header_pc := False;
98 <    if Fdat_header.Ident[i] <> header_ident1_mac[i] then
98 >    if Fdat_header.OSIdent[i] <> HeaderOSIdentMac[i] then
99        header_mac := False;
100 <    if Fdat_header.Ident[i] <> header_ident1_macbeta[i] then
100 >    if Fdat_header.OSIdent[i] <> HeaderOSIdentMacBeta[i] then
101        header_macbeta := False;
102    end;
103    if not (header_pc xor header_mac xor header_macbeta) then
# Line 249 | Line 223 | var
223        name := fields.Strings[2];
224        extension := fields.Strings[0];
225      end;
226 +    if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then
227 +    begin
228 +      id := fields.Strings[2];
229 +      name := fields.Strings[1];
230 +      extension := fields.Strings[0];
231 +    end;
232    end;
233  
234   begin
# Line 262 | Line 242 | begin
242      begin
243        if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then
244        begin
245 <        if AppSettings.FilenumbersAsHex then
266 <          id := IntToHex(Fdat_files[i].ID, 4)
267 <        else
268 <          id := FormatNumber(Fdat_files[i].ID, 5, '0');
245 >        id := FormatNumber(Fdat_files[i].ID, 5, '0');
246          name := Fdat_files[i].Name;
247          extension := Fdat_files[i].Extension;
248  
# Line 273 | Line 250 | begin
250            ST_IDAsc, ST_IDDesc:     list.Add(id + ';' + name + ';' + extension);
251            ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension);
252            ST_ExtAsc, ST_ExtDesc:   list.Add(extension + ';' + id + ';' + name);
253 +          ST_ExtNameAsc, ST_ExtNameDesc: list.Add(name + ';' + extension + ';' + id);
254          end;
255        end;
256      end;
257    end;
258 <  Result := TStringList.Create;
258 >  if not Assigned(Result) then
259 >    Result := TStringList.Create;
260    if list.Count > 0 then
261    begin
262      fields := TStringList.Create;
263 <    if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc] then
263 >    if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc, ST_ExtNameAsc] then
264        for i := 0 to list.Count - 1 do
265        begin
266          getfields;
# Line 313 | Line 292 | function TAccess_OniArchive.GetExtension
292   var
293    i: Integer;
294   begin
295 <  Result := TStringList.Create;
295 >  if not Assigned(Result) then
296 >    Result := TStringList.Create;
297 >  if Result is TStringList then
298 >    TStringList(Result).Sorted := True;
299    for i := 0 to Length(Fdat_extensionsmap) - 1 do
300    begin
301      with Fdat_extensionsmap[i] do
# Line 417 | Line 399 | end;
399  
400  
401  
402 + function TAccess_OniArchive.GetDatLink(FileID, DatOffset: Integer): TDatLink;
403 + var
404 +  link: Integer;
405 + begin
406 +  Result := DatLinksManager.GetDatLink(FConnectionID, FileID, DatOffset);
407 +  LoadDatFilePart(fileid, Result.SrcOffset, 4, @link);
408 +  if link > 0 then
409 +    Result.DestID := link div 256
410 +  else
411 +    Result.DestID := -1;
412 + end;
413 +
414 +
415 + function TAccess_OniArchive.GetDatLinks(FileID: Integer): TDatLinkList;
416 + var
417 +  i: Integer;
418 +  link: Integer;
419 + begin
420 +  Result := DatLinksManager.GetDatLinks(FConnectionID, FileID);
421 +  if Length(Result) > 0 then
422 +  begin
423 +    for i := 0 to High(Result) do
424 +    begin
425 +      LoadDatFilePart(fileid, Result[i].SrcOffset, 4, @link);
426 +      if link > 0 then
427 +        Result[i].DestID := link div 256
428 +      else
429 +        Result[i].DestID := -1;
430 +    end;
431 +  end;
432 + end;
433 +
434 +
435   function TAccess_OniArchive.GetRawList(FileID: Integer): TRawDataList;
436   begin
437    Result := RawLists.GetRawList(FConnectionID, FileID);
# Line 430 | Line 445 | end;
445  
446  
447  
448 <
434 < procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
448 > procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream);
449   begin
450 +  if not Assigned(Target) then
451 +    Target := TMemoryStream.Create;
452    if not LocSep then
453    begin
454      if not FRawOpened then
# Line 441 | Line 457 | begin
457      if RawAddr <= Fraw_file.Size then
458      begin
459        Fraw_file.Seek(RawAddr, soFromBeginning);
460 <      Fraw_file.Read(target^, size);
460 >      Target.CopyFrom(Fraw_file, size);
461 >      Target.Seek(0, soFromBeginning);
462      end;
463      if UnloadWhenUnused then
464      begin
# Line 459 | Line 476 | begin
476      if RawAddr <= Fsep_file.Size then
477      begin
478        Fsep_file.Seek(RawAddr, soFromBeginning);
479 <      Fsep_file.Read(target^, size);
479 >      Target.CopyFrom(Fsep_file, size);
480 >      Target.Seek(0, soFromBeginning);
481      end;
482      if UnloadWhenUnused then
483      begin
# Line 471 | Line 489 | begin
489    end;
490   end;
491  
492 + procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
493 + var
494 +  data: TStream;
495 + begin
496 +  data := nil;
497 +  LoadRawOffset(LocSep, RawAddr, Size, data);
498 +  data.Read(Target^, Size);
499 +  data.Free;
500 + end;
501 +
502   procedure TAccess_OniArchive.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream);
503   var
504    raw_info: TRawDataInfo;
# Line 576 | Line 604 | begin
604    end;
605   end;
606  
607 +
608   procedure TAccess_OniArchive.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream);
609   var
610    raw_info: TRawDataInfo;
# Line 617 | Line 646 | begin
646   end;
647  
648   function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Src: TStream): Integer;
649 + const
650 +  EmptyBytes: Array[0..31] of Byte = (
651 +      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 );
652   begin
653    if not LocSep then
654    begin
655      if not FRawOpened then
656        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
657          fmOpenReadWrite);
658 +    if (Fraw_file.Size mod 32) > 0 then
659 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
660      Result := Fraw_file.Size;
661      Fraw_file.Seek(0, soFromEnd);
662      Fraw_file.CopyFrom(Src, Src.Size);
663 +    if (Fraw_file.Size mod 32) > 0 then
664 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
665      if UnloadWhenUnused then
666      begin
667        FRawOpened := False;
# Line 639 | Line 675 | begin
675      if not FSepOpened then
676        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
677          fmOpenReadWrite);
678 +    if (Fsep_file.Size mod 32) > 0 then
679 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
680      Result := Fsep_file.Size;
681      Fsep_file.Seek(0, soFromEnd);
682      Fsep_file.CopyFrom(Src, Src.Size);
683 +    if (Fsep_file.Size mod 32) > 0 then
684 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
685      if UnloadWhenUnused then
686      begin
687        FSepOpened := False;

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)