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 247 by alloc, Fri Aug 10 17:26:03 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 71 | Line 64 | var
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
# Line 155 | 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 168 | Line 162 | end;
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;
# Line 372 | 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
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;
# Line 397 | Line 335 | procedure TAccess_OniArchive.UpdateDatFi
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  
# Line 419 | Line 348 | begin
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  
# Line 439 | Line 359 | procedure TAccess_OniArchive.UpdateDatFi
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  
# Line 530 | Line 441 | begin
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  
# Line 590 | Line 481 | begin
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;
# Line 634 | Line 505 | begin
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;
# Line 693 | Line 544 | begin
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;
# Line 731 | Line 562 | const
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;
# Line 741 | 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));
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;
# Line 761 | 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));
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  

Diff Legend

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