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); |
14 |
|
protected |
15 |
|
public |
21 |
– |
property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused; |
22 |
– |
|
16 |
|
constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; |
17 |
|
procedure Close; override; |
18 |
|
|
64 |
|
Fdat_filesmap: TFilesMap; |
65 |
|
Fdat_namedfilesmap: TNamedFilesMap; |
66 |
|
begin |
74 |
– |
FUnloadWhenUnused := True; |
75 |
– |
FDatOpened := False; |
76 |
– |
FRawOpened := False; |
67 |
|
Msg := SM_UnknownError; |
68 |
|
if not FileExists(DatFilename) then |
69 |
|
begin |
145 |
|
Fdat_file.Read(FLevelNumber, 1); |
146 |
|
FLevelNumber := FLevelNumber div 2; |
147 |
|
|
148 |
< |
Fdat_file.Free; |
148 |
> |
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); |
153 |
|
|
154 |
|
Msg := SM_OK; |
155 |
|
FBackend := DB_ONI; |
162 |
|
|
163 |
|
|
164 |
|
|
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 |
– |
|
165 |
|
procedure TAccess_OniArchive.Close; |
166 |
|
begin |
167 |
< |
if FDatOpened then |
167 |
> |
if Assigned(Fdat_file) then |
168 |
|
Fdat_file.Free; |
169 |
< |
if FRawOpened then |
169 |
> |
if Assigned(Fraw_file) then |
170 |
|
Fraw_file.Free; |
171 |
< |
if FSepOpened then |
171 |
> |
if Assigned(Fsep_file) then |
172 |
|
Fsep_file.Free; |
173 |
|
Self.Free; |
174 |
|
end; |
319 |
|
begin |
320 |
|
if fileid < GetFileCount then |
321 |
|
begin |
322 |
+ |
if not Assigned(Target) then |
323 |
+ |
Target := TMemoryStream.Create; |
324 |
|
if GetFileInfo(FileID).Size > 0 then |
325 |
|
begin |
377 |
– |
if not Assigned(Target) then |
378 |
– |
Target := TMemoryStream.Create; |
379 |
– |
if not FDatOpened then |
380 |
– |
Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); |
326 |
|
Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); |
327 |
|
streampos := Target.Position; |
328 |
|
Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); |
329 |
|
Target.Seek(streampos, soFromBeginning); |
385 |
– |
if UnloadWhenUnused then |
386 |
– |
begin |
387 |
– |
Fdat_file.Free; |
388 |
– |
FDatOpened := False; |
389 |
– |
end |
390 |
– |
else |
391 |
– |
FDatOpened := True; |
330 |
|
end; |
331 |
|
end; |
332 |
|
end; |
335 |
|
begin |
336 |
|
if fileid < GetFileCount then |
337 |
|
begin |
400 |
– |
if not FDatOpened then |
401 |
– |
Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); |
338 |
|
Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); |
339 |
|
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; |
340 |
|
end; |
341 |
|
end; |
342 |
|
|
348 |
|
begin |
349 |
|
if not Assigned(Target) then |
350 |
|
Target := TMemoryStream.Create; |
422 |
– |
if not FDatOpened then |
423 |
– |
Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); |
351 |
|
Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); |
352 |
|
streampos := Target.Position; |
353 |
|
Target.CopyFrom(Fdat_file, size); |
354 |
|
Target.Seek(streampos, soFromBeginning); |
428 |
– |
if UnloadWhenUnused then |
429 |
– |
begin |
430 |
– |
FDatOpened := False; |
431 |
– |
Fdat_file.Free; |
432 |
– |
end |
433 |
– |
else |
434 |
– |
FDatOpened := True; |
355 |
|
end; |
356 |
|
end; |
357 |
|
|
359 |
|
begin |
360 |
|
if fileid < GetFileCount then |
361 |
|
begin |
442 |
– |
if not FDatOpened then |
443 |
– |
Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); |
362 |
|
Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); |
363 |
|
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; |
364 |
|
end; |
365 |
|
end; |
366 |
|
|
441 |
|
Target := TMemoryStream.Create; |
442 |
|
if not LocSep then |
443 |
|
begin |
533 |
– |
if not FRawOpened then |
534 |
– |
Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), |
535 |
– |
fmOpenReadWrite); |
444 |
|
if RawAddr <= Fraw_file.Size then |
445 |
|
begin |
446 |
|
Fraw_file.Seek(RawAddr, soFromBeginning); |
447 |
|
Target.CopyFrom(Fraw_file, size); |
448 |
|
Target.Seek(0, soFromBeginning); |
449 |
|
end; |
542 |
– |
if UnloadWhenUnused then |
543 |
– |
begin |
544 |
– |
FRawOpened := False; |
545 |
– |
Fraw_file.Free; |
546 |
– |
end |
547 |
– |
else |
548 |
– |
FRawOpened := True; |
450 |
|
end |
451 |
|
else |
452 |
|
begin |
552 |
– |
if not FSepOpened then |
553 |
– |
Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), |
554 |
– |
fmOpenReadWrite); |
453 |
|
if RawAddr <= Fsep_file.Size then |
454 |
|
begin |
455 |
|
Fsep_file.Seek(RawAddr, soFromBeginning); |
456 |
|
Target.CopyFrom(Fsep_file, size); |
457 |
|
Target.Seek(0, soFromBeginning); |
458 |
|
end; |
561 |
– |
if UnloadWhenUnused then |
562 |
– |
begin |
563 |
– |
FSepOpened := False; |
564 |
– |
Fsep_file.Free; |
565 |
– |
end |
566 |
– |
else |
567 |
– |
FSepOpened := True; |
459 |
|
end; |
460 |
|
end; |
461 |
|
|
481 |
|
raw_info := Self.GetRawInfo(FileID, DatOffset); |
482 |
|
if not raw_info.LocSep then |
483 |
|
begin |
593 |
– |
if not FRawOpened then |
594 |
– |
Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), |
595 |
– |
fmOpenReadWrite); |
484 |
|
Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); |
485 |
|
streampos := Target.Position; |
486 |
|
Target.CopyFrom(Fraw_file, raw_info.RawSize); |
487 |
|
Target.Seek(streampos, soFromBeginning); |
600 |
– |
if UnloadWhenUnused then |
601 |
– |
begin |
602 |
– |
FRawOpened := False; |
603 |
– |
Fraw_file.Free; |
604 |
– |
end |
605 |
– |
else |
606 |
– |
FRawOpened := True; |
488 |
|
end |
489 |
|
else |
490 |
|
begin |
610 |
– |
if FUnloadWhenUnused or not FSepOpened then |
611 |
– |
Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), |
612 |
– |
fmOpenReadWrite); |
491 |
|
Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); |
492 |
|
streampos := Target.Position; |
493 |
|
Target.CopyFrom(Fsep_file, raw_info.RawSize); |
494 |
|
Target.Seek(streampos, soFromBeginning); |
617 |
– |
if UnloadWhenUnused then |
618 |
– |
begin |
619 |
– |
FSepOpened := False; |
620 |
– |
Fsep_file.Free; |
621 |
– |
end |
622 |
– |
else |
623 |
– |
FSepOpened := True; |
495 |
|
end; |
496 |
|
end; |
497 |
|
end; |
505 |
|
raw_info := GetRawInfo(FileID, DatOffset); |
506 |
|
if not raw_info.LocSep then |
507 |
|
begin |
637 |
– |
if not FRawOpened then |
638 |
– |
Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), |
639 |
– |
fmOpenReadWrite); |
508 |
|
Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); |
509 |
|
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; |
510 |
|
end |
511 |
|
else |
512 |
|
begin |
652 |
– |
if not FSepOpened then |
653 |
– |
Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), |
654 |
– |
fmOpenReadWrite); |
513 |
|
Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); |
514 |
|
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; |
515 |
|
end; |
516 |
|
end; |
517 |
|
end; |
544 |
|
raw_info := GetRawInfo(FileID, DatOffset); |
545 |
|
if not raw_info.LocSep then |
546 |
|
begin |
696 |
– |
if not FRawOpened then |
697 |
– |
Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), |
698 |
– |
fmOpenReadWrite); |
547 |
|
Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); |
548 |
|
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; |
549 |
|
end |
550 |
|
else |
551 |
|
begin |
711 |
– |
if not FSepOpened then |
712 |
– |
Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), |
713 |
– |
fmOpenReadWrite); |
552 |
|
Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); |
553 |
|
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; |
554 |
|
end; |
555 |
|
end; |
556 |
|
end; |
562 |
|
begin |
563 |
|
if not LocSep then |
564 |
|
begin |
734 |
– |
if not FRawOpened then |
735 |
– |
Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), |
736 |
– |
fmOpenReadWrite); |
565 |
|
if (Fraw_file.Size mod 32) > 0 then |
566 |
|
Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32)); |
567 |
|
Result := Fraw_file.Size; |
569 |
|
Fraw_file.CopyFrom(Src, Src.Size); |
570 |
|
if (Fraw_file.Size mod 32) > 0 then |
571 |
|
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; |
572 |
|
end |
573 |
|
else |
574 |
|
begin |
754 |
– |
if not FSepOpened then |
755 |
– |
Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), |
756 |
– |
fmOpenReadWrite); |
575 |
|
if (Fsep_file.Size mod 32) > 0 then |
576 |
|
Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32)); |
577 |
|
Result := Fsep_file.Size; |
579 |
|
Fsep_file.CopyFrom(Src, Src.Size); |
580 |
|
if (Fsep_file.Size mod 32) > 0 then |
581 |
|
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; |
582 |
|
end; |
583 |
|
end; |
584 |
|
|