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 113 by alloc, Sun Feb 25 17:20:22 2007 UTC vs.
Revision 229 by alloc, Wed Jun 20 10:57:51 2007 UTC

# Line 15 | Line 15 | type
15      FDatOpened:          Boolean;
16      FRawOpened:          Boolean;
17      FSepOpened:          Boolean;
18 +    procedure SetUnloadWhenUnused(doit: Boolean);
19    protected
20    public
21 <    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused;
21 >    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused;
22  
23      constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
24      procedure Close; override;
# Line 34 | Line 35 | type
35      procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override;
36  
37      function GetDatLinks(FileID: Integer): TDatLinkList; override;
38 +    function GetDatLink(FileID, DatOffset: Integer): TDatLink; override;
39      function GetRawList(FileID: Integer): TRawDataList; override;
40      function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
41  
42 <    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
42 >    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload;
43 >    procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); overload;
44      procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override;
45      procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override;
46      procedure LoadRawFilePart(FileID, DatOffset, Offset, Size: Integer; var Target: TStream); overload; override;
# Line 50 | Line 53 | type
53   implementation
54  
55   uses
56 <  SysUtils, StrUtils, Data, Functions, RawList;
56 >  SysUtils, StrUtils, Data, Functions, RawList, DatLinks, Math;
57  
58  
59   (*
# Line 157 | Line 160 | begin
160    FBackend := DB_ONI;
161    FConnectionID := ConnectionID;
162    FChangeRights := [CR_EditDat, CR_EditRaw, CR_AppendRaw];
163 +
164 +  inherited;
165 + end;
166 +
167 +
168 +
169 +
170 + procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean);
171 + begin
172 +  FUnloadWhenUnused := doit;
173 +  if FUnloadWhenUnused then
174 +  begin
175 +    if FDatOpened then
176 +    begin
177 +      FDatOpened := False;
178 +      Fdat_file.Free;
179 +    end;
180 +    if FRawOpened then
181 +    begin
182 +      FRawOpened := False;
183 +      Fraw_file.Free;
184 +    end;
185 +    if FSepOpened then
186 +    begin
187 +      FSepOpened := False;
188 +      Fsep_file.Free;
189 +    end;
190 +  end
191 +  else
192 +  begin
193 +    if not FDatOpened then
194 +    begin
195 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
196 +      FDatOpened := True;
197 +    end;
198 +    if not FRawOpened then
199 +    begin
200 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
201 +        fmOpenReadWrite);
202 +      FRawOpened := True;
203 +    end;
204 +    if (not FSepOpened) and (FDataOS <> DOS_WIN) then
205 +    begin
206 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
207 +        fmOpenReadWrite);
208 +      FSepOpened := True;
209 +    end;
210 +  end;
211   end;
212  
213  
214  
215  
216 +
217   procedure TAccess_OniArchive.Close;
218   begin
219    if FDatOpened then
# Line 397 | Line 449 | end;
449  
450  
451  
452 + function TAccess_OniArchive.GetDatLink(FileID, DatOffset: Integer): TDatLink;
453 + var
454 +  link: Integer;
455 + begin
456 +  Result := DatLinksManager.GetDatLink(FConnectionID, FileID, DatOffset);
457 +  LoadDatFilePart(fileid, Result.SrcOffset, 4, @link);
458 +  if link > 0 then
459 +    Result.DestID := link div 256
460 +  else
461 +    Result.DestID := -1;
462 + end;
463 +
464 +
465 + function TAccess_OniArchive.GetDatLinks(FileID: Integer): TDatLinkList;
466 + var
467 +  i: Integer;
468 +  link: Integer;
469 + begin
470 +  Result := DatLinksManager.GetDatLinks(FConnectionID, FileID);
471 +  if Length(Result) > 0 then
472 +  begin
473 +    for i := 0 to High(Result) do
474 +    begin
475 +      LoadDatFilePart(fileid, Result[i].SrcOffset, 4, @link);
476 +      if link > 0 then
477 +        Result[i].DestID := link div 256
478 +      else
479 +        Result[i].DestID := -1;
480 +    end;
481 +  end;
482 + end;
483 +
484 +
485   function TAccess_OniArchive.GetRawList(FileID: Integer): TRawDataList;
486   begin
487    Result := RawLists.GetRawList(FConnectionID, FileID);
# Line 410 | Line 495 | end;
495  
496  
497  
498 <
414 < procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
498 > procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream);
499   begin
500 +  if not Assigned(Target) then
501 +    Target := TMemoryStream.Create;
502    if not LocSep then
503    begin
504      if not FRawOpened then
# Line 421 | Line 507 | begin
507      if RawAddr <= Fraw_file.Size then
508      begin
509        Fraw_file.Seek(RawAddr, soFromBeginning);
510 <      Fraw_file.Read(target^, size);
510 >      Target.CopyFrom(Fraw_file, size);
511 >      Target.Seek(0, soFromBeginning);
512      end;
513      if UnloadWhenUnused then
514      begin
# Line 439 | Line 526 | begin
526      if RawAddr <= Fsep_file.Size then
527      begin
528        Fsep_file.Seek(RawAddr, soFromBeginning);
529 <      Fsep_file.Read(target^, size);
529 >      Target.CopyFrom(Fsep_file, size);
530 >      Target.Seek(0, soFromBeginning);
531      end;
532      if UnloadWhenUnused then
533      begin
# Line 451 | Line 539 | begin
539    end;
540   end;
541  
542 + procedure TAccess_OniArchive.LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer);
543 + var
544 +  data: TStream;
545 + begin
546 +  data := nil;
547 +  LoadRawOffset(LocSep, RawAddr, Size, data);
548 +  data.Read(Target^, Size);
549 +  data.Free;
550 + end;
551 +
552   procedure TAccess_OniArchive.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream);
553   var
554    raw_info: TRawDataInfo;
# Line 511 | Line 609 | begin
609          Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
610            fmOpenReadWrite);
611        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
612 <      Fraw_file.CopyFrom(Src, raw_info.RawSize);
612 >      Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
613        if UnloadWhenUnused then
614        begin
615          FRawOpened := False;
# Line 556 | Line 654 | begin
654    end;
655   end;
656  
657 +
658   procedure TAccess_OniArchive.UpdateRawFilePart(FileID, DatOffset, Offset, Size: Integer; Src: TStream);
659   var
660    raw_info: TRawDataInfo;
# Line 597 | Line 696 | begin
696   end;
697  
698   function TAccess_OniArchive.AppendRawFile(LocSep: Boolean; Src: TStream): Integer;
699 + const
700 +  EmptyBytes: Array[0..31] of Byte = (
701 +      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 );
702   begin
703    if not LocSep then
704    begin
705      if not FRawOpened then
706        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
707          fmOpenReadWrite);
708 +    if (Fraw_file.Size mod 32) > 0 then
709 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
710      Result := Fraw_file.Size;
711      Fraw_file.Seek(0, soFromEnd);
712      Fraw_file.CopyFrom(Src, Src.Size);
713 +    if (Fraw_file.Size mod 32) > 0 then
714 +      Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
715      if UnloadWhenUnused then
716      begin
717        FRawOpened := False;
# Line 619 | Line 725 | begin
725      if not FSepOpened then
726        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
727          fmOpenReadWrite);
728 +    if (Fsep_file.Size mod 32) > 0 then
729 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
730      Result := Fsep_file.Size;
731      Fsep_file.Seek(0, soFromEnd);
732      Fsep_file.CopyFrom(Src, Src.Size);
733 +    if (Fsep_file.Size mod 32) > 0 then
734 +      Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
735      if UnloadWhenUnused then
736      begin
737        FSepOpened := False;

Diff Legend

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