ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Helper/LevelDB.pas
(Generate patch)

Comparing oup/current/Helper/LevelDB.pas (file contents):
Revision 112 by alloc, Thu Feb 22 00:37:39 2007 UTC vs.
Revision 132 by alloc, Wed Mar 28 01:41:10 2007 UTC

# Line 1 | Line 1
1   unit LevelDB;
2
2   interface
4
3   uses
4    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5    Dialogs, ComCtrls, StdCtrls, StrUtils;
# Line 27 | Line 25 | var
25    Form_LevelDB: TForm_LevelDB;
26  
27   implementation
30
28   {$R *.dfm}
32
29   uses ABSMain, ABSDecUtil, Main,
30 <    ConnectionManager, TypeDefs, DataAccess, OniImgClass;
30 >    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data;
31  
32   type
33    THandler = procedure(FileID: Integer);
# Line 69 | Line 65 | var
65    Stream_Body, Stream_Names:          TMemoryStream;
66    Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
67  
72 //  FileCount: Integer;
73 //  temps, temps2: String;
74 //  Data, rawdata: Tdata;
68    BeginTime, FileTime: Double;
69    Step:     Integer;
77 //  rawlist:  TRawDataList;
78 //  extlist:  TExtensionsMap;
79 //  fileinfo: TFileInfo;
80 //  datlinks: TDatLinks;
70    OniImage:   TOniImage;
71    LevelID:    Integer;
72    TimeFormat: TFormatSettings;
# Line 86 | Line 75 | var
75    Connection: TDataAccess;
76    ConRepMsg:  TStatusMessages;
77  
78 +  FileID:     Integer;
79 +
80    Strings:    TStrings;
81    i, j:       Integer;
82 +  temps:      String;
83 +  tempi:      Integer;
84 +  tempb:      Byte;
85 +  FileInfo:   TFileInfo;
86 +  DatLinks:   TDatLinkList;
87 +  RawLinks:   TRawDataList;
88 +
89 +  DatFileStream, RawFileStream: TMemoryStream;
90 +
91 + // ###########################
92 +  datsum, linksum, rawsum: Int64;
93 +  freq: Int64;
94 +  tempticks1, tempticks2: Int64;
95 + // ###########################
96   const
97    Steps: Byte = 3;
98  
# Line 149 | Line 154 | begin
154        begin
155          ShowMessage('Couldn''t delete file. Aborting');
156          Exit;
152      end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then
153      begin
154        ShowMessage('Couldn''t delete file. Aborting');
155        Exit;
156      end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
157      begin
158        ShowMessage('Couldn''t delete file. Aborting');
159        Exit;
157        end;
158 +      if FileExists(AnsiReplaceStr(Target, '.dat', '.raw')) then
159 +        if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then
160 +        begin
161 +          ShowMessage('Couldn''t delete file. Aborting');
162 +          Exit;
163 +        end;
164 +      if FileExists(AnsiReplaceStr(Target, '.dat', '.sep')) then
165 +        if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
166 +          if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
167 +          begin
168 +            ShowMessage('Couldn''t delete file. Aborting');
169 +            Exit;
170 +          end;
171      end else begin
172        ShowMessage('Aborting');
173        Exit;
# Line 208 | Line 218 | begin
218      end;
219    end;
220  
221 <  
222 <  extlist := OniDataConnection.GetExtendedExtensionsList;
223 <  for i := 0 to High(DatHeader.Ident) do
224 <    DatHeader.Ident[i] := OniDataConnection.LevelInfo.Ident[i];
225 <  DatHeader.Files := OniDataConnection.GetFilesCount;
221 >  for i := 0 to High(DatHeader.OSIdent) do
222 >    case Connection.DataOS of
223 >      DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i];
224 >      DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
225 >      DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
226 >    end;
227 >  for i := 0 to High(DatHeader.GlobalIdent) do
228 >    DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i];
229 >  DatHeader.Files := Connection.GetFileCount;
230    DatHeader.NamedFiles := Length(NamedFilesHeader);
231 <  DatHeader.Extensions := Length(extlist);
231 >
232 >  Strings := Connection.GetExtensionsList(EF_ExtCount);
233 >
234 >  DatHeader.Extensions := Strings.Count;
235    DatHeader.DataAddr   := 0;
236    DatHeader.DataSize   := 0;
237    DatHeader.NamesAddr  := 0;
# Line 226 | Line 243 | begin
243  
244  
245    DoStep('Writing extensions-header');
246 <  progress.Max := Length(OniDataConnection.GetExtensionsList);
246 >  progress.Max := Strings.Count;
247    Application.ProcessMessages;
248 <
232 <  for i := 0 to High(ExtensionsHeader) do
248 >  for i := 0 to Strings.Count - 1 do
249    begin
250 <    ExtensionsHeader[i].Ident     := extlist[i].Ident;
251 <    ExtensionsHeader[i].Extension := extlist[i].Extension;
252 <    SetLength(temps, 4);
250 >    temps := Strings.Strings[i];
251 >    ExtensionsHeader[i].ExtCount := StrToInt( MidStr(
252 >            temps,
253 >            Pos('(', temps) + 1,
254 >            Pos(')', temps) - Pos('(', temps) - 1 ) );
255 >    temps := MidStr(temps, 1, 4);
256      for j := 0 to 3 do
257 <      temps[j + 1] := ExtensionsHeader[i].Extension[3 - j];
258 <    ExtensionsHeader[i].ExtCount :=
259 <      Length(OniDataConnection.GetFilesList(temps, '', False, stIDAsc));
257 >      ExtensionsHeader[i].Extension[j] := temps[4-j];
258 >    for j := 0 to High(FileTypes) do
259 >      if FileTypes[j].Extension = temps then
260 >        Break;
261 >    if j < Length(FileTypes) then
262 >    begin
263 >      case Connection.DataOS of
264 >        DOS_WIN:     ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
265 >        DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
266 >        DOS_MAC:     ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
267 >        DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
268 >      end;
269 >    end else begin
270 >      ShowMessage('Unknown Extension: ' + Strings.Strings[i]);
271 >      Exit;
272 >    end;
273      progress.Position    := i + 1;
274      lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' +
275 <      IntToStr(Length(extlist));
275 >      IntToStr(Strings.Count);
276      Application.ProcessMessages;
277    end;
278  
247
279    DoStep('Storing files-data');
280    progress.Position := 0;
281    progress.Max      := DatHeader.Files;
# Line 252 | Line 283 | begin
283    lbl_estimation.Caption := 'Estimated finishing time: unknown';
284    Application.ProcessMessages;
285  
286 <  begintime := Time;
287 <  for i := 0 to DatHeader.Files - 1 do
286 >  QueryPerformanceFrequency(freq);
287 >  datsum := 0;
288 >  linksum := 0;
289 >  rawsum := 0;
290 >
291 >  FileTime := Time;
292 >  for FileID := 0 to DatHeader.Files - 1 do
293    begin
294 <    fileinfo := OniDataConnection.GetFileInfo(i);
294 >    FileInfo := Connection.GetFileInfo(FileID);
295      for j := 0 to 3 do
296 <      FilesHeader[i].Extension[j] := fileinfo.Extension[4 - j];
297 <    if fileinfo.Size > 0 then
296 >      FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
297 >    if FileInfo.Size > 0 then
298      begin
299 <      //        DatLinks:=;
300 <      FilesHeader[i].DataAddr := Stream_Body.Size + 8;
301 <      Data    := OniDataConnection.LoadDatFile(i);
302 <      Data[4] := (levelid) and $FF;
303 <      Data[5] := (levelid shr 8) and $FF;
304 <      Data[6] := (levelid shr 16) and $FF;
305 <      Data[7] := (levelid shr 24) and $FF;
299 >      QueryPerformanceCounter(tempticks1);
300 >
301 >      FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
302 >      DatFileStream := TMemoryStream.Create;
303 >      Connection.LoadDatFile(FileID, TStream(DatFileStream));
304 >      DatFileStream.Seek(4, soFromBeginning);
305 >      DatFileStream.Write(LevelID, 4);
306 >
307 >      QueryPerformanceCounter(tempticks2);
308 >      datsum := datsum + (tempticks2 - tempticks1);
309 >
310 >      DatLinks := Connection.GetDatLinks(FileID);
311 >      if Length(DatLinks) > 0 then
312 >      begin
313 >        for i := 0 to High(DatLinks) do
314 >        begin
315 >          DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning);
316 >          if DatLinks[i].DestID < 0 then
317 >            tempi := 0
318 >          else
319 >            tempi := DatLinks[i].DestID * 256 + 1;
320 >          DatFileStream.Write(tempi, 4);
321 >        end;
322 >      end;
323 >
324 >      QueryPerformanceCounter(tempticks1);
325 >      linksum := linksum + (tempticks1 - tempticks2);
326  
327 <      if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then
327 >      RawLinks := Connection.GetRawList(FileID);
328 >      if Length(RawLinks) > 0 then
329        begin
330 <        rawlist := OniDataConnection.GetRawList(i);
274 <        if Length(rawlist) > 0 then
330 >        for i := 0 to High(RawLinks) do
331          begin
332 <          for j := 0 to High(rawlist) do
332 >          if RawLinks[i].RawSize > 0 then
333            begin
334 <            if rawlist[j].raw_size > 0 then
334 >            RawFileStream := TMemoryStream.Create;
335 >            Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
336 >            RawFileStream.Seek(0, soFromBeginning);
337 >            if RawLinks[i].LocSep then
338              begin
339 <              if (UpperCase(fileinfo.Extension) = 'TXMP') and
340 <                ((Data[$88] and $01) > 0) then
341 <              begin
342 <                OniImage.LoadFromTXMP(Connection, i);
343 <                OniImage.GetMipMappedImage(rawdata);
344 <                rawlist[j].raw_size := OniImage.GetImageDataSize(True);
345 <                Data[$90] := $08;
346 <                Data[$89] := 32;
347 < {                  if data[$90]<>OniImage.StoreType then begin
348 <                    data[$90]:=OniImage.StoreType;
290 <                    data[$89]:=(data[$89] and $CF) or $20;
291 <                  end;
292 < }                end
293 <              else
294 <              begin
295 <                SetLength(rawdata, rawlist[j].raw_size);
296 <                OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]);
297 <              end;
298 <              //                data[$88]:=data[$88] and $FE;
299 <
300 <              if rawlist[j].loc_sep then
301 <              begin
302 <                rawlist[j].raw_addr := Stream_Sep.Size;
303 <                Stream_Sep.Write(rawdata[0], Length(rawdata));
304 <              end
305 <              else
306 <              begin
307 <                rawlist[j].raw_addr := Stream_Raw.Size;
308 <                Stream_Raw.Write(rawdata[0], Length(rawdata));
309 <              end;
310 <            end
311 <            else
312 <              rawlist[j].raw_addr := 0;
313 <            Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF;
314 <            Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF;
315 <            Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF;
316 <            Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF;
317 <          end;
339 >              RawLinks[i].RawAddr := Stream_Sep.Size;
340 >              Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size);
341 >            end else begin
342 >              RawLinks[i].RawAddr := Stream_Raw.Size;
343 >              Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size);
344 >            end;
345 >          end else
346 >            RawLinks[i].RawAddr := 0;
347 >          DatFileStream.Seek(RawLinks[i].SrcOffset, soFromBeginning);
348 >          DatFileStream.Write(RawLinks[i].RawAddr, 4);
349          end;
350        end;
351 +      DatFileStream.Seek(0, soFromBeginning);
352 +      Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size);
353  
354 <      Stream_Body.Write(Data[0], Length(Data));
355 <      //
354 >      QueryPerformanceCounter(tempticks2);
355 >      rawsum := rawsum + (tempticks2 - tempticks1);
356      end
357      else
358        FilesHeader[i].DataAddr := 0;
# Line 334 | Line 367 | begin
367      FilesHeader[i].FileSize := fileinfo.Size;
368      FilesHeader[i].FileType := fileinfo.FileType;
369  
370 <    if ((i mod 10) = 0) and (i >= 100) then
370 >    if ((FileID mod 10) = 0) and (FileID >= 100) then
371        lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
372 <        (Time - begintime) / i * (progress.Max - i + 1) * 1.1, timeformat );
373 <    progress.Position := i + 1;
374 <    lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max);
372 >        (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, TimeFormat );
373 >    progress.Position := FileID + 1;
374 >    lbl_progress.Caption := 'Files done: ' + IntToStr(FileID + 1) + '/' + IntToStr(progress.Max);
375      Application.ProcessMessages;
376    end;
377  
378 +  ShowMessage('AvgDats: ' + FloatToStr((datsum / progress.Max) / freq) + #13#10 +
379 +      'AvgLinks: ' + FloatToStr((linksum / progress.Max) / freq) + #13#10 +
380 +      'AvgRaws: ' + FloatToStr((rawsum / progress.Max) / freq)
381 +   );
382 +
383    Stream_Dat.Write(DatHeader, SizeOf(DatHeader));
384    for i := 0 to High(FilesHeader) do
385      Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i]));
# Line 366 | Line 404 | begin
404    Stream_Body.Free;
405    Stream_Names.Free;
406    Stream_Raw.Free;
407 <  if OniDataConnection.OSisMac then
407 >
408 >  if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
409      Stream_Sep.Free;
410  
411    progress.Position      := progress.Max;
412    lbl_progress.Caption   := 'Files done: ' + IntToStr(progress.Max) + '/' +
413      IntToStr(progress.Max);
414 <  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')';
414 >  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')';
415  
416    DoStep('FIN');
417    btn_abortok.Caption := '&OK';
# Line 382 | Line 421 | begin
421  
422    converting := False;
423  
424 <  CloseDataConnection(DataConnections[conIndex]);
424 > //  CloseDataConnection(DataConnections[conIndex]);
425   end;
426  
427  
# Line 392 | Line 431 | procedure TForm_LevelDB.HandleFile;
431   var
432    i: Byte;
433   begin
434 <  for i := 1 to Length(ConvertHandlers) do
434 > {  for i := 1 to Length(ConvertHandlers) do
435      if UpperCase(ConvertHandlers[i].Ext) = UpperCase(ext) then
436        if ConvertHandlers[i].needed then
437        begin
# Line 401 | Line 440 | begin
440        end
441        else
442          Break;
443 < end;
443 > }end;
444  
445  
446  
447  
448   procedure TForm_LevelDB.CreateDatabase(Source, target: String);
449 + {
450   var
451    DataBase:    TABSDatabase;
452    Query:       TABSQuery;
# Line 438 | Line 478 | const
478      else
479        group_progress.Caption := 'Creating DB (FINISHED)';
480    end;
481 + }
482  
483   begin
484 <  if CreateDataConnection(Source, ODB_Dat) = nil then
484 > {  if CreateDataConnection(Source, ODB_Dat) = nil then
485    begin
486      ShowMessage('Could not connect to .dat-file');
487      Exit;
# Line 643 | Line 684 | begin
684    database.Free;
685  
686    CloseDataConnection(DataConnections[conIndex]);
687 + }
688   end;
689  
690  
691  
692  
693 < procedure TForm_LevelDB.stop_convert;
693 > procedure TForm_LevelDB.StopConvert;
694   begin
695 <  btn_abortok.Caption := '&Close';
695 > {  btn_abortok.Caption := '&Close';
696    btn_abortok.Default := True;
697    converting := False;
698    lbl_estimation.Caption := 'ABORTED';
# Line 661 | Line 703 | begin
703    begin
704      DeleteFile(loaded_filename);
705    end;
706 < end;
706 > }end;
707  
708  
709  
# Line 684 | Line 726 | end;
726  
727  
728  
729 <
729 > {
730   procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord);
731   var
732    link: LongWord;
# Line 1716 | Line 1758 | begin
1758    begin
1759    end;
1760   end;
1761 + }
1762  
1763  
1764 <
1722 <
1764 > {
1765   procedure InsertHandler(ext: String; needed: Boolean; handler: THandler);
1766   begin
1767    SetLength(ConvertHandlers, Length(ConvertHandlers) + 1);
# Line 1727 | Line 1769 | begin
1769    ConvertHandlers[High(ConvertHandlers)].needed  := needed;
1770    ConvertHandlers[High(ConvertHandlers)].handler := handler;
1771   end;
1772 <
1772 > }
1773   begin
1774 <  InsertHandler('ABNA', False, nil);
1774 > {  InsertHandler('ABNA', False, nil);
1775    //  InsertHandler('AGDB',True,AGDB);
1776    InsertHandler('AGDB', False, nil);
1777    InsertHandler('AGQC', False, nil);
# Line 1827 | Line 1869 | begin
1869    InsertHandler('WMM_', False, nil);
1870    InsertHandler('WMMB', True, WMMB);
1871    InsertHandler('WPGE', True, WPGE);
1872 < end.
1872 > }end.

Diff Legend

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