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 248 by alloc, Mon Nov 26 11:02:28 2007 UTC vs.
Revision 321 by alloc, Wed May 6 13:47:23 2009 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 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 479 | Line 588 | begin
588    if fileid < GetFileCount then
589    begin
590      raw_info := Self.GetRawInfo(FileID, DatOffset);
591 +    if raw_info.RawSize = 0 then
592 +      exit;
593      if not raw_info.LocSep then
594      begin
595 +      if not FRawOpened then
596 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
597 +          fmOpenReadWrite);
598        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
599        streampos := Target.Position;
600        Target.CopyFrom(Fraw_file, raw_info.RawSize);
601        Target.Seek(streampos, soFromBeginning);
602 +      if UnloadWhenUnused then
603 +      begin
604 +        FRawOpened := False;
605 +        Fraw_file.Free;
606 +      end
607 +      else
608 +        FRawOpened := True;
609      end
610      else
611      begin
612 +      if FUnloadWhenUnused or not FSepOpened then
613 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
614 +          fmOpenReadWrite);
615        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
616        streampos := Target.Position;
617        Target.CopyFrom(Fsep_file, raw_info.RawSize);
618        Target.Seek(streampos, soFromBeginning);
619 +      if UnloadWhenUnused then
620 +      begin
621 +        FSepOpened := False;
622 +        Fsep_file.Free;
623 +      end
624 +      else
625 +        FSepOpened := True;
626      end;
627    end;
628   end;
# Line 505 | Line 636 | begin
636      raw_info := GetRawInfo(FileID, DatOffset);
637      if not raw_info.LocSep then
638      begin
639 +      if not FRawOpened then
640 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
641 +          fmOpenReadWrite);
642        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
643        Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
644 +      if UnloadWhenUnused then
645 +      begin
646 +        FRawOpened := False;
647 +        Fraw_file.Free;
648 +      end
649 +      else
650 +        FRawOpened := True;
651      end
652      else
653      begin
654 +      if not FSepOpened then
655 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
656 +          fmOpenReadWrite);
657        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
658        Fsep_file.CopyFrom(Src, raw_info.RawSize);
659 +      if UnloadWhenUnused then
660 +      begin
661 +        FSepOpened := False;
662 +        Fsep_file.Free;
663 +      end
664 +      else
665 +        FSepOpened := True;
666      end;
667    end;
668   end;
# Line 544 | Line 695 | begin
695      raw_info := GetRawInfo(FileID, DatOffset);
696      if not raw_info.LocSep then
697      begin
698 +      if not FRawOpened then
699 +        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
700 +          fmOpenReadWrite);
701        Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
702        Fraw_file.CopyFrom(Src, Size);
703 +      if UnloadWhenUnused then
704 +      begin
705 +        FRawOpened := False;
706 +        Fraw_file.Free;
707 +      end
708 +      else
709 +        FRawOpened := True;
710      end
711      else
712      begin
713 +      if not FSepOpened then
714 +        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
715 +          fmOpenReadWrite);
716        Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
717        Fsep_file.CopyFrom(Src, Size);
718 +      if UnloadWhenUnused then
719 +      begin
720 +        FSepOpened := False;
721 +        Fsep_file.Free;
722 +      end
723 +      else
724 +        FSepOpened := True;
725      end;
726    end;
727   end;
# Line 562 | Line 733 | const
733   begin
734    if not LocSep then
735    begin
736 +    if not FRawOpened then
737 +      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
738 +        fmOpenReadWrite);
739      if (Fraw_file.Size mod 32) > 0 then
740        Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
741      Result := Fraw_file.Size;
# Line 569 | Line 743 | begin
743      Fraw_file.CopyFrom(Src, Src.Size);
744      if (Fraw_file.Size mod 32) > 0 then
745        Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
746 +    if UnloadWhenUnused then
747 +    begin
748 +      FRawOpened := False;
749 +      Fraw_file.Free;
750 +    end
751 +    else
752 +      FRawOpened := True;
753    end
754    else
755    begin
756 +    if not FSepOpened then
757 +      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
758 +        fmOpenReadWrite);
759      if (Fsep_file.Size mod 32) > 0 then
760        Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
761      Result := Fsep_file.Size;
# Line 579 | Line 763 | begin
763      Fsep_file.CopyFrom(Src, Src.Size);
764      if (Fsep_file.Size mod 32) > 0 then
765        Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
766 +    if UnloadWhenUnused then
767 +    begin
768 +      FSepOpened := False;
769 +      Fsep_file.Free;
770 +    end
771 +    else
772 +      FSepOpened := True;
773    end;
774   end;
775  

Diff Legend

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