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 229 by alloc, Wed Jun 20 10:57:51 2007 UTC vs.
Revision 252 by alloc, Sun Dec 16 14:44:16 2007 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);
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  
# Line 38 | Line 31 | type
31      function GetDatLink(FileID, DatOffset: Integer): TDatLink; override;
32      function GetRawList(FileID: Integer): TRawDataList; override;
33      function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
34 +    function GetRawsForType(RawType: String): TRawDataList; override;
35  
36      procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload;
37      procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; target: Pointer); overload;
# Line 70 | Line 64 | var
64    Fdat_filesmap: TFilesMap;
65    Fdat_namedfilesmap: TNamedFilesMap;
66   begin
73  FUnloadWhenUnused := True;
74  FDatOpened := False;
75  FRawOpened := False;
67    Msg := SM_UnknownError;
68    if not FileExists(DatFilename) then
69    begin
# Line 80 | Line 71 | begin
71      Exit;
72    end;
73    FFileName := DatFilename;
74 <  Fdat_file := TFileStream.Create(FFileName, fmOpenRead);
74 >  Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
75    Fdat_file.Read(Fdat_header, SizeOf(Fdat_header));
76    header_pc  := True;
77    header_mac := True;
# Line 154 | Line 145 | 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;
# Line 167 | Line 162 | end;
162  
163  
164  
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
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;
# Line 284 | Line 232 | var
232   begin
233    list := TStringList.Create;
234    list.Sorted := True;
235 +  if ext = '*' then
236 +    ext := '';
237    for i := 0 to GetFileCount - 1 do
238    begin
239      if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and
# Line 371 | Line 321 | begin
321    begin
322      if not Assigned(Target) then
323        Target := TMemoryStream.Create;
324 <    if not FDatOpened then
375 <      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
376 <    Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
377 <    streampos := Target.Position;
378 <    Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size);
379 <    Target.Seek(streampos, soFromBeginning);
380 <    if UnloadWhenUnused then
324 >    if GetFileInfo(FileID).Size > 0 then
325      begin
326 <      Fdat_file.Free;
327 <      FDatOpened := False;
328 <    end
329 <    else
330 <      FDatOpened := True;
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);
330 >    end;
331    end;
332   end;
333  
# Line 391 | Line 335 | procedure TAccess_OniArchive.UpdateDatFi
335   begin
336    if fileid < GetFileCount then
337    begin
394    if not FDatOpened then
395      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
338      Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
339      Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size);
398    if UnloadWhenUnused then
399    begin
400      Fdat_file.Free;
401      FDatOpened := False;
402    end
403    else
404      FDatOpened := True;
340    end;
341   end;
342  
# Line 413 | Line 348 | begin
348    begin
349      if not Assigned(Target) then
350        Target := TMemoryStream.Create;
416    if not FDatOpened then
417      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);
422    if UnloadWhenUnused then
423    begin
424      FDatOpened := False;
425      Fdat_file.Free;
426    end
427    else
428      FDatOpened := True;
355    end;
356   end;
357  
# Line 433 | Line 359 | procedure TAccess_OniArchive.UpdateDatFi
359   begin
360    if fileid < GetFileCount then
361    begin
436    if not FDatOpened then
437      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
362      Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
363      Fdat_file.CopyFrom(Src, Size);
440    if UnloadWhenUnused then
441    begin
442      Fdat_file.Free;
443      FDatOpened := False;
444    end
445    else
446      FDatOpened := True;
364    end;
365   end;
366  
# Line 488 | Line 405 | begin
405   end;
406  
407  
408 + function TAccess_OniArchive.GetRawsForType(RawType: String): TRawDataList;
409 + var
410 +  i, j: Integer;
411 +  dats: TStrings;
412 +  list: TRawDataList;
413 + begin
414 +  dats := nil;
415 +  dats := GetFilesList(MidStr(RawType, 1, 4), '', True, ST_IDAsc);
416 +  for i := 0 to dats.Count - 1 do
417 +  begin
418 +    list := GetRawList(StrToInt(MidStr(dats.Strings[i], 1, 5)));
419 +    for j := 0 to Length(list) - 1 do
420 +    begin
421 +      if (list[j].RawType = RawType) and (list[j].RawSize > 0) then
422 +      begin
423 +        SetLength(Result, Length(Result)+1);
424 +        Result[High(Result)] := list[j];
425 +      end;
426 +    end;
427 +  end;
428 + end;
429 +
430 +
431   function TAccess_OniArchive.GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo;
432   begin
433    Result := RawLists.GetRawInfo(FConnectionID, FileID, DatOffset);
# Line 501 | Line 441 | begin
441      Target := TMemoryStream.Create;
442    if not LocSep then
443    begin
504    if not FRawOpened then
505      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
506        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;
513    if UnloadWhenUnused then
514    begin
515      FRawOpened := False;
516      Fraw_file.Free;
517    end
518    else
519      FRawOpened := True;
450    end
451    else
452    begin
523    if not FSepOpened then
524      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
525        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;
532    if UnloadWhenUnused then
533    begin
534      FSepOpened := False;
535      Fsep_file.Free;
536    end
537    else
538      FSepOpened := True;
459    end;
460   end;
461  
# Line 561 | Line 481 | begin
481      raw_info := Self.GetRawInfo(FileID, DatOffset);
482      if not raw_info.LocSep then
483      begin
564      if not FRawOpened then
565        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
566          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);
571      if UnloadWhenUnused then
572      begin
573        FRawOpened := False;
574        Fraw_file.Free;
575      end
576      else
577        FRawOpened := True;
488      end
489      else
490      begin
581      if FUnloadWhenUnused or not FSepOpened then
582        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
583          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);
588      if UnloadWhenUnused then
589      begin
590        FSepOpened := False;
591        Fsep_file.Free;
592      end
593      else
594        FSepOpened := True;
495      end;
496    end;
497   end;
# Line 605 | Line 505 | begin
505      raw_info := GetRawInfo(FileID, DatOffset);
506      if not raw_info.LocSep then
507      begin
608      if not FRawOpened then
609        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
610          fmOpenReadWrite);
508        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
509        Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
613      if UnloadWhenUnused then
614      begin
615        FRawOpened := False;
616        Fraw_file.Free;
617      end
618      else
619        FRawOpened := True;
510      end
511      else
512      begin
623      if not FSepOpened then
624        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
625          fmOpenReadWrite);
513        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
514        Fsep_file.CopyFrom(Src, raw_info.RawSize);
628      if UnloadWhenUnused then
629      begin
630        FSepOpened := False;
631        Fsep_file.Free;
632      end
633      else
634        FSepOpened := True;
515      end;
516    end;
517   end;
# Line 664 | Line 544 | begin
544      raw_info := GetRawInfo(FileID, DatOffset);
545      if not raw_info.LocSep then
546      begin
667      if not FRawOpened then
668        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
669          fmOpenReadWrite);
547        Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
548        Fraw_file.CopyFrom(Src, Size);
672      if UnloadWhenUnused then
673      begin
674        FRawOpened := False;
675        Fraw_file.Free;
676      end
677      else
678        FRawOpened := True;
549      end
550      else
551      begin
682      if not FSepOpened then
683        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
684          fmOpenReadWrite);
552        Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
553        Fsep_file.CopyFrom(Src, Size);
687      if UnloadWhenUnused then
688      begin
689        FSepOpened := False;
690        Fsep_file.Free;
691      end
692      else
693        FSepOpened := True;
554      end;
555    end;
556   end;
# Line 702 | Line 562 | const
562   begin
563    if not LocSep then
564    begin
705    if not FRawOpened then
706      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
707        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;
# Line 712 | Line 569 | begin
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));
715    if UnloadWhenUnused then
716    begin
717      FRawOpened := False;
718      Fraw_file.Free;
719    end
720    else
721      FRawOpened := True;
572    end
573    else
574    begin
725    if not FSepOpened then
726      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
727        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;
# Line 732 | Line 579 | begin
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));
735    if UnloadWhenUnused then
736    begin
737      FSepOpened := False;
738      Fsep_file.Free;
739    end
740    else
741      FSepOpened := True;
582    end;
583   end;
584  

Diff Legend

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