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 231 by alloc, Wed Jun 20 22:24:04 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;
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 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 369 | Line 319 | var
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
374      if not Assigned(Target) then
375        Target := TMemoryStream.Create;
376      if not FDatOpened then
377        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);
382      if UnloadWhenUnused then
383      begin
384        Fdat_file.Free;
385        FDatOpened := False;
386      end
387      else
388        FDatOpened := True;
330      end;
331    end;
332   end;
# Line 394 | Line 335 | procedure TAccess_OniArchive.UpdateDatFi
335   begin
336    if fileid < GetFileCount then
337    begin
397    if not FDatOpened then
398      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
338      Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
339      Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size);
401    if UnloadWhenUnused then
402    begin
403      Fdat_file.Free;
404      FDatOpened := False;
405    end
406    else
407      FDatOpened := True;
340    end;
341   end;
342  
# Line 416 | Line 348 | begin
348    begin
349      if not Assigned(Target) then
350        Target := TMemoryStream.Create;
419    if not FDatOpened then
420      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);
425    if UnloadWhenUnused then
426    begin
427      FDatOpened := False;
428      Fdat_file.Free;
429    end
430    else
431      FDatOpened := True;
355    end;
356   end;
357  
# Line 436 | Line 359 | procedure TAccess_OniArchive.UpdateDatFi
359   begin
360    if fileid < GetFileCount then
361    begin
439    if not FDatOpened then
440      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
362      Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
363      Fdat_file.CopyFrom(Src, Size);
443    if UnloadWhenUnused then
444    begin
445      Fdat_file.Free;
446      FDatOpened := False;
447    end
448    else
449      FDatOpened := True;
364    end;
365   end;
366  
# Line 491 | 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 504 | Line 441 | begin
441      Target := TMemoryStream.Create;
442    if not LocSep then
443    begin
507    if not FRawOpened then
508      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
509        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;
516    if UnloadWhenUnused then
517    begin
518      FRawOpened := False;
519      Fraw_file.Free;
520    end
521    else
522      FRawOpened := True;
450    end
451    else
452    begin
526    if not FSepOpened then
527      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
528        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;
535    if UnloadWhenUnused then
536    begin
537      FSepOpened := False;
538      Fsep_file.Free;
539    end
540    else
541      FSepOpened := True;
459    end;
460   end;
461  
# Line 564 | Line 481 | begin
481      raw_info := Self.GetRawInfo(FileID, DatOffset);
482      if not raw_info.LocSep then
483      begin
567      if not FRawOpened then
568        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
569          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);
574      if UnloadWhenUnused then
575      begin
576        FRawOpened := False;
577        Fraw_file.Free;
578      end
579      else
580        FRawOpened := True;
488      end
489      else
490      begin
584      if FUnloadWhenUnused or not FSepOpened then
585        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
586          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);
591      if UnloadWhenUnused then
592      begin
593        FSepOpened := False;
594        Fsep_file.Free;
595      end
596      else
597        FSepOpened := True;
495      end;
496    end;
497   end;
# Line 608 | Line 505 | begin
505      raw_info := GetRawInfo(FileID, DatOffset);
506      if not raw_info.LocSep then
507      begin
611      if not FRawOpened then
612        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
613          fmOpenReadWrite);
508        Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
509        Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
616      if UnloadWhenUnused then
617      begin
618        FRawOpened := False;
619        Fraw_file.Free;
620      end
621      else
622        FRawOpened := True;
510      end
511      else
512      begin
626      if not FSepOpened then
627        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
628          fmOpenReadWrite);
513        Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
514        Fsep_file.CopyFrom(Src, raw_info.RawSize);
631      if UnloadWhenUnused then
632      begin
633        FSepOpened := False;
634        Fsep_file.Free;
635      end
636      else
637        FSepOpened := True;
515      end;
516    end;
517   end;
# Line 667 | Line 544 | begin
544      raw_info := GetRawInfo(FileID, DatOffset);
545      if not raw_info.LocSep then
546      begin
670      if not FRawOpened then
671        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
672          fmOpenReadWrite);
547        Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
548        Fraw_file.CopyFrom(Src, Size);
675      if UnloadWhenUnused then
676      begin
677        FRawOpened := False;
678        Fraw_file.Free;
679      end
680      else
681        FRawOpened := True;
549      end
550      else
551      begin
685      if not FSepOpened then
686        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
687          fmOpenReadWrite);
552        Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
553        Fsep_file.CopyFrom(Src, Size);
690      if UnloadWhenUnused then
691      begin
692        FSepOpened := False;
693        Fsep_file.Free;
694      end
695      else
696        FSepOpened := True;
554      end;
555    end;
556   end;
# Line 705 | Line 562 | const
562   begin
563    if not LocSep then
564    begin
708    if not FRawOpened then
709      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
710        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 715 | 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));
718    if UnloadWhenUnused then
719    begin
720      FRawOpened := False;
721      Fraw_file.Free;
722    end
723    else
724      FRawOpened := True;
572    end
573    else
574    begin
728    if not FSepOpened then
729      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
730        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 735 | 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));
738    if UnloadWhenUnused then
739    begin
740      FSepOpened := False;
741      Fsep_file.Free;
742    end
743    else
744      FSepOpened := True;
582    end;
583   end;
584  

Diff Legend

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