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 |
|
|
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 |
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; |
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; |
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; |
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; |
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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; |
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; |
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; |
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; |
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; |
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 |
|
|