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 252 by alloc, Sun Dec 16 14:44:16 2007 UTC vs.
Revision 256 by alloc, Sat Oct 18 23:27:59 2008 UTC

# Line 11 | Line 11 | type
11      Fsep_file:           TFileStream;
12      Fdat_files:          TFiles;
13      Fdat_extensionsmap:  TExtensionsMap;
14 +    FUnloadWhenUnused:   Boolean;
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 SetUnloadWhenUnused;
22 +
23      constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
24      procedure Close; override;
25  
# Line 64 | Line 71 | var
71    Fdat_filesmap: TFilesMap;
72    Fdat_namedfilesmap: TNamedFilesMap;
73   begin
74 +  FUnloadWhenUnused := True;
75 +  FDatOpened := False;
76 +  FRawOpened := False;
77    Msg := SM_UnknownError;
78    if not FileExists(DatFilename) then
79    begin
# Line 71 | Line 81 | begin
81      Exit;
82    end;
83    FFileName := DatFilename;
84 <  Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
84 >  Fdat_file := TFileStream.Create(FFileName, fmOpenRead);
85    Fdat_file.Read(Fdat_header, SizeOf(Fdat_header));
86    header_pc  := True;
87    header_mac := True;
# Line 145 | Line 155 | begin
155    Fdat_file.Read(FLevelNumber, 1);
156    FLevelNumber := FLevelNumber div 2;
157  
158 <  Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
149 <    fmOpenReadWrite);
150 <  if not (FDataOS = DOS_WIN) then
151 <    Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
152 <      fmOpenReadWrite);
158 >  Fdat_file.Free;
159  
160    Msg := SM_OK;
161    FBackend := DB_ONI;
# Line 162 | Line 168 | end;
168  
169  
170  
171 + procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean);
172 + begin
173 +  FUnloadWhenUnused := doit;
174 +  if FUnloadWhenUnused then
175 +  begin
176 +    if FDatOpened then
177 +    begin
178 +      FDatOpened := False;
179 +      Fdat_file.Free;
180 +    end;
181 +    if FRawOpened then
182 +    begin
183 +      FRawOpened := False;
184 +      Fraw_file.Free;
185 +    end;
186 +    if FSepOpened then
187 +    begin
188 +      FSepOpened := False;
189 +      Fsep_file.Free;
190 +    end;
191 +  end
192 +  else
193 +  begin
194 +    if not FDatOpened then
195 +    begin
196 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
197 +      FDatOpened := True;
198 +    end;
199 +    if not FRawOpened then
200 +    begin
201 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
202 +        fmOpenReadWrite);
203 +      FRawOpened := True;
204 +    end;
205 +    if (not FSepOpened) and (FDataOS <> DOS_WIN) then
206 +    begin
207 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
208 +        fmOpenReadWrite);
209 +      FSepOpened := True;
210 +    end;
211 +  end;
212 + end;
213 +
214 +
215 +
216 +
217 +
218   procedure TAccess_OniArchive.Close;
219   begin
220 <  if Assigned(Fdat_file) then
220 >  if FDatOpened then
221      Fdat_file.Free;
222 <  if Assigned(Fraw_file) then
222 >  if FRawOpened then
223      Fraw_file.Free;
224 <  if Assigned(Fsep_file) then
224 >  if FSepOpened then
225      Fsep_file.Free;
226    Self.Free;
227   end;
# Line 323 | Line 376 | begin
376        Target := TMemoryStream.Create;
377      if GetFileInfo(FileID).Size > 0 then
378      begin
379 +      if not FDatOpened then
380 +        Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
381        Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
382        streampos := Target.Position;
383        Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size);
384        Target.Seek(streampos, soFromBeginning);
385 +      if UnloadWhenUnused then
386 +      begin
387 +        Fdat_file.Free;
388 +        FDatOpened := False;
389 +      end
390 +      else
391 +        FDatOpened := True;
392      end;
393    end;
394   end;
# Line 335 | Line 397 | procedure TAccess_OniArchive.UpdateDatFi
397   begin
398    if fileid < GetFileCount then
399    begin
400 +    if not FDatOpened then
401 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
402      Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
403      Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size);
404 +    if UnloadWhenUnused then
405 +    begin
406 +      Fdat_file.Free;
407 +      FDatOpened := False;
408 +    end
409 +    else
410 +      FDatOpened := True;
411    end;
412   end;
413  
# Line 348 | Line 419 | begin
419    begin
420      if not Assigned(Target) then
421        Target := TMemoryStream.Create;
422 +    if not FDatOpened then
423 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
424      Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
425      streampos := Target.Position;
426      Target.CopyFrom(Fdat_file, size);
427      Target.Seek(streampos, soFromBeginning);
428 +    if UnloadWhenUnused then
429 +    begin
430 +      FDatOpened := False;
431 +      Fdat_file.Free;
432 +    end
433 +    else
434 +      FDatOpened := True;
435    end;
436   end;
437  
# Line 359 | Line 439 | procedure TAccess_OniArchive.UpdateDatFi
439   begin
440    if fileid < GetFileCount then
441    begin
442 +    if not FDatOpened then
443 +      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
444      Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
445      Fdat_file.CopyFrom(Src, Size);
446 +    if UnloadWhenUnused then
447 +    begin
448 +      Fdat_file.Free;
449 +      FDatOpened := False;
450 +    end
451 +    else
452 +      FDatOpened := True;
453    end;
454   end;
455  
# Line 441 | Line 530 | begin
530      Target := TMemoryStream.Create;
531    if not LocSep then
532    begin
533 +    if not FRawOpened then
534 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
535 +        fmOpenReadWrite);
536      if RawAddr <= Fraw_file.Size then
537      begin
538        Fraw_file.Seek(RawAddr, soFromBeginning);
539        Target.CopyFrom(Fraw_file, size);
540        Target.Seek(0, soFromBeginning);
541      end;
542 +    if UnloadWhenUnused then
543 +    begin
544 +      FRawOpened := False;
545 +      Fraw_file.Free;
546 +    end
547 +    else
548 +      FRawOpened := True;
549    end
550    else
551    begin
552 +    if not FSepOpened then
553 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
554 +        fmOpenReadWrite);
555      if RawAddr <= Fsep_file.Size then
556      begin
557        Fsep_file.Seek(RawAddr, soFromBeginning);
558        Target.CopyFrom(Fsep_file, size);
559        Target.Seek(0, soFromBeginning);
560      end;
561 +    if UnloadWhenUnused then
562 +    begin
563 +      FSepOpened := False;
564 +      Fsep_file.Free;
565 +    end
566 +    else
567 +      FSepOpened := True;
568    end;
569   end;
570  
# Line 481 | Line 590 | begin
590      raw_info := Self.GetRawInfo(FileID, DatOffset);
591      if not raw_info.LocSep then
592      begin
593 +      if not FRawOpened then
594 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
595 +          fmOpenReadWrite);
596        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
597        streampos := Target.Position;
598        Target.CopyFrom(Fraw_file, raw_info.RawSize);
599        Target.Seek(streampos, soFromBeginning);
600 +      if UnloadWhenUnused then
601 +      begin
602 +        FRawOpened := False;
603 +        Fraw_file.Free;
604 +      end
605 +      else
606 +        FRawOpened := True;
607      end
608      else
609      begin
610 +      if FUnloadWhenUnused or not FSepOpened then
611 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
612 +          fmOpenReadWrite);
613        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
614        streampos := Target.Position;
615        Target.CopyFrom(Fsep_file, raw_info.RawSize);
616        Target.Seek(streampos, soFromBeginning);
617 +      if UnloadWhenUnused then
618 +      begin
619 +        FSepOpened := False;
620 +        Fsep_file.Free;
621 +      end
622 +      else
623 +        FSepOpened := True;
624      end;
625    end;
626   end;
# Line 505 | Line 634 | begin
634      raw_info := GetRawInfo(FileID, DatOffset);
635      if not raw_info.LocSep then
636      begin
637 +      if not FRawOpened then
638 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
639 +          fmOpenReadWrite);
640        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
641        Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
642 +      if UnloadWhenUnused then
643 +      begin
644 +        FRawOpened := False;
645 +        Fraw_file.Free;
646 +      end
647 +      else
648 +        FRawOpened := True;
649      end
650      else
651      begin
652 +      if not FSepOpened then
653 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
654 +          fmOpenReadWrite);
655        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
656        Fsep_file.CopyFrom(Src, raw_info.RawSize);
657 +      if UnloadWhenUnused then
658 +      begin
659 +        FSepOpened := False;
660 +        Fsep_file.Free;
661 +      end
662 +      else
663 +        FSepOpened := True;
664      end;
665    end;
666   end;
# Line 544 | Line 693 | begin
693      raw_info := GetRawInfo(FileID, DatOffset);
694      if not raw_info.LocSep then
695      begin
696 +      if not FRawOpened then
697 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
698 +          fmOpenReadWrite);
699        Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
700        Fraw_file.CopyFrom(Src, Size);
701 +      if UnloadWhenUnused then
702 +      begin
703 +        FRawOpened := False;
704 +        Fraw_file.Free;
705 +      end
706 +      else
707 +        FRawOpened := True;
708      end
709      else
710      begin
711 +      if not FSepOpened then
712 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
713 +          fmOpenReadWrite);
714        Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
715        Fsep_file.CopyFrom(Src, Size);
716 +      if UnloadWhenUnused then
717 +      begin
718 +        FSepOpened := False;
719 +        Fsep_file.Free;
720 +      end
721 +      else
722 +        FSepOpened := True;
723      end;
724    end;
725   end;
# Line 562 | Line 731 | const
731   begin
732    if not LocSep then
733    begin
734 +    if not FRawOpened then
735 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
736 +        fmOpenReadWrite);
737      if (Fraw_file.Size mod 32) > 0 then
738        Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
739      Result := Fraw_file.Size;
# Line 569 | Line 741 | begin
741      Fraw_file.CopyFrom(Src, Src.Size);
742      if (Fraw_file.Size mod 32) > 0 then
743        Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
744 +    if UnloadWhenUnused then
745 +    begin
746 +      FRawOpened := False;
747 +      Fraw_file.Free;
748 +    end
749 +    else
750 +      FRawOpened := True;
751    end
752    else
753    begin
754 +    if not FSepOpened then
755 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
756 +        fmOpenReadWrite);
757      if (Fsep_file.Size mod 32) > 0 then
758        Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
759      Result := Fsep_file.Size;
# Line 579 | Line 761 | begin
761      Fsep_file.CopyFrom(Src, Src.Size);
762      if (Fsep_file.Size mod 32) > 0 then
763        Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
764 +    if UnloadWhenUnused then
765 +    begin
766 +      FSepOpened := False;
767 +      Fsep_file.Free;
768 +    end
769 +    else
770 +      FSepOpened := True;
771    end;
772   end;
773  

Diff Legend

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