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 192 by alloc, Thu May 24 17:48:18 2007 UTC vs.
Revision 248 by alloc, Mon Nov 26 11:02:28 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;
14    protected
15    public
20    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write FUnloadWhenUnused;
21
16      constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
17      procedure Close; override;
18  
# Line 37 | 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 69 | Line 64 | var
64    Fdat_filesmap: TFilesMap;
65    Fdat_namedfilesmap: TNamedFilesMap;
66   begin
72  FUnloadWhenUnused := True;
73  FDatOpened := False;
74  FRawOpened := False;
67    Msg := SM_UnknownError;
68    if not FileExists(DatFilename) then
69    begin
# Line 153 | 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;
156    FConnectionID := ConnectionID;
157    FChangeRights := [CR_EditDat, CR_EditRaw, CR_AppendRaw];
158 +
159 +  inherited;
160   end;
161  
162  
# Line 166 | Line 164 | end;
164  
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 234 | 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 321 | Line 321 | begin
321    begin
322      if not Assigned(Target) then
323        Target := TMemoryStream.Create;
324 <    if not FDatOpened then
325 <      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);
330 <    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 341 | Line 335 | procedure TAccess_OniArchive.UpdateDatFi
335   begin
336    if fileid < GetFileCount then
337    begin
344    if not FDatOpened then
345      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
338      Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
339      Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size);
348    if UnloadWhenUnused then
349    begin
350      Fdat_file.Free;
351      FDatOpened := False;
352    end
353    else
354      FDatOpened := True;
340    end;
341   end;
342  
# Line 363 | Line 348 | begin
348    begin
349      if not Assigned(Target) then
350        Target := TMemoryStream.Create;
366    if not FDatOpened then
367      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);
372    if UnloadWhenUnused then
373    begin
374      FDatOpened := False;
375      Fdat_file.Free;
376    end
377    else
378      FDatOpened := True;
355    end;
356   end;
357  
# Line 383 | Line 359 | procedure TAccess_OniArchive.UpdateDatFi
359   begin
360    if fileid < GetFileCount then
361    begin
386    if not FDatOpened then
387      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
362      Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
363      Fdat_file.CopyFrom(Src, Size);
390    if UnloadWhenUnused then
391    begin
392      Fdat_file.Free;
393      FDatOpened := False;
394    end
395    else
396      FDatOpened := True;
364    end;
365   end;
366  
# Line 438 | 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 451 | Line 441 | begin
441      Target := TMemoryStream.Create;
442    if not LocSep then
443    begin
454    if not FRawOpened then
455      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
456        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;
463    if UnloadWhenUnused then
464    begin
465      FRawOpened := False;
466      Fraw_file.Free;
467    end
468    else
469      FRawOpened := True;
450    end
451    else
452    begin
473    if not FSepOpened then
474      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
475        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;
482    if UnloadWhenUnused then
483    begin
484      FSepOpened := False;
485      Fsep_file.Free;
486    end
487    else
488      FSepOpened := True;
459    end;
460   end;
461  
# Line 511 | Line 481 | begin
481      raw_info := Self.GetRawInfo(FileID, DatOffset);
482      if not raw_info.LocSep then
483      begin
514      if not FRawOpened then
515        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
516          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);
521      if UnloadWhenUnused then
522      begin
523        FRawOpened := False;
524        Fraw_file.Free;
525      end
526      else
527        FRawOpened := True;
488      end
489      else
490      begin
531      if FUnloadWhenUnused or not FSepOpened then
532        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
533          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);
538      if UnloadWhenUnused then
539      begin
540        FSepOpened := False;
541        Fsep_file.Free;
542      end
543      else
544        FSepOpened := True;
495      end;
496    end;
497   end;
# Line 555 | Line 505 | begin
505      raw_info := GetRawInfo(FileID, DatOffset);
506      if not raw_info.LocSep then
507      begin
558      if not FRawOpened then
559        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
560          fmOpenReadWrite);
508        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
509        Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
563      if UnloadWhenUnused then
564      begin
565        FRawOpened := False;
566        Fraw_file.Free;
567      end
568      else
569        FRawOpened := True;
510      end
511      else
512      begin
573      if not FSepOpened then
574        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
575          fmOpenReadWrite);
513        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
514        Fsep_file.CopyFrom(Src, raw_info.RawSize);
578      if UnloadWhenUnused then
579      begin
580        FSepOpened := False;
581        Fsep_file.Free;
582      end
583      else
584        FSepOpened := True;
515      end;
516    end;
517   end;
# Line 614 | Line 544 | begin
544      raw_info := GetRawInfo(FileID, DatOffset);
545      if not raw_info.LocSep then
546      begin
617      if not FRawOpened then
618        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
619          fmOpenReadWrite);
547        Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
548        Fraw_file.CopyFrom(Src, Size);
622      if UnloadWhenUnused then
623      begin
624        FRawOpened := False;
625        Fraw_file.Free;
626      end
627      else
628        FRawOpened := True;
549      end
550      else
551      begin
632      if not FSepOpened then
633        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
634          fmOpenReadWrite);
552        Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
553        Fsep_file.CopyFrom(Src, Size);
637      if UnloadWhenUnused then
638      begin
639        FSepOpened := False;
640        Fsep_file.Free;
641      end
642      else
643        FSepOpened := True;
554      end;
555    end;
556   end;
# Line 652 | Line 562 | const
562   begin
563    if not LocSep then
564    begin
655    if not FRawOpened then
656      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
657        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 662 | 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));
665    if UnloadWhenUnused then
666    begin
667      FRawOpened := False;
668      Fraw_file.Free;
669    end
670    else
671      FRawOpened := True;
572    end
573    else
574    begin
675    if not FSepOpened then
676      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
677        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 682 | 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));
685    if UnloadWhenUnused then
686    begin
687      FSepOpened := False;
688      Fsep_file.Free;
689    end
690    else
691      FSepOpened := True;
582    end;
583   end;
584  

Diff Legend

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