--- oup/current/Helper/LevelDB.pas 2007/02/25 17:20:22 113 +++ oup/current/Helper/LevelDB.pas 2007/03/28 02:23:44 133 @@ -65,11 +65,8 @@ var Stream_Body, Stream_Names: TMemoryStream; Stream_Dat, Stream_Raw, Stream_Sep: TFileStream; -// Data, rawdata: Tdata; BeginTime, FileTime: Double; Step: Integer; -// rawlist: TRawDataList; -// datlinks: TDatLinks; OniImage: TOniImage; LevelID: Integer; TimeFormat: TFormatSettings; @@ -78,12 +75,24 @@ var Connection: TDataAccess; ConRepMsg: TStatusMessages; + FileID: Integer; + Strings: TStrings; i, j: Integer; temps: String; + tempi: Integer; + tempb: Byte; FileInfo: TFileInfo; + DatLinks: TDatLinkList; + RawLinks: TRawDataList; DatFileStream, RawFileStream: TMemoryStream; + +// ########################### + datsum, linksum, rawsum: Int64; + freq: Int64; + tempticks1, tempticks2: Int64; +// ########################### const Steps: Byte = 3; @@ -145,15 +154,20 @@ begin begin ShowMessage('Couldn''t delete file. Aborting'); Exit; - end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then - begin - ShowMessage('Couldn''t delete file. Aborting'); - Exit; - end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then - begin - ShowMessage('Couldn''t delete file. Aborting'); - Exit; end; + if FileExists(AnsiReplaceStr(Target, '.dat', '.raw')) then + if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then + begin + ShowMessage('Couldn''t delete file. Aborting'); + Exit; + end; + if FileExists(AnsiReplaceStr(Target, '.dat', '.sep')) then + if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then + if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then + begin + ShowMessage('Couldn''t delete file. Aborting'); + Exit; + end; end else begin ShowMessage('Aborting'); Exit; @@ -269,73 +283,77 @@ begin lbl_estimation.Caption := 'Estimated finishing time: unknown'; Application.ProcessMessages; + QueryPerformanceFrequency(freq); + datsum := 0; + linksum := 0; + rawsum := 0; + FileTime := Time; - for i := 0 to DatHeader.Files - 1 do + for FileID := 0 to DatHeader.Files - 1 do begin - FileInfo := Connection.GetFileInfo(i); + FileInfo := Connection.GetFileInfo(FileID); for j := 0 to 3 do - FilesHeader[i].Extension[j] := FileInfo.Extension[4 - j]; + FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j]; if FileInfo.Size > 0 then begin - // DatLinks:=; - FilesHeader[i].DataAddr := Stream_Body.Size + 8; + QueryPerformanceCounter(tempticks1); + + FilesHeader[FileID].DataAddr := Stream_Body.Size + 8; DatFileStream := TMemoryStream.Create; - Connection.LoadDatFile(i, DatFileStream); - DatFileStream.Seek(4, soFromBeginning); + Connection.LoadDatFile(FileID, TStream(DatFileStream)); + DatFileStream.Seek(0, soFromBeginning); + DatFileStream.Write(FileID, 4); DatFileStream.Write(LevelID, 4); - if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then + QueryPerformanceCounter(tempticks2); + datsum := datsum + (tempticks2 - tempticks1); + + DatLinks := Connection.GetDatLinks(FileID); + if Length(DatLinks) > 0 then + begin + for i := 0 to High(DatLinks) do + begin + DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning); + if DatLinks[i].DestID < 0 then + tempi := 0 + else + tempi := DatLinks[i].DestID * 256 + 1; + DatFileStream.Write(tempi, 4); + end; + end; + + QueryPerformanceCounter(tempticks1); + linksum := linksum + (tempticks1 - tempticks2); + + RawLinks := Connection.GetRawList(FileID); + if Length(RawLinks) > 0 then begin - rawlist := OniDataConnection.GetRawList(i); - if Length(rawlist) > 0 then + for i := 0 to High(RawLinks) do begin - for j := 0 to High(rawlist) do + if RawLinks[i].RawSize > 0 then begin - if rawlist[j].raw_size > 0 then + RawFileStream := TMemoryStream.Create; + Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream)); + RawFileStream.Seek(0, soFromBeginning); + if RawLinks[i].LocSep then begin - if (UpperCase(fileinfo.Extension) = 'TXMP') and - ((Data[$88] and $01) > 0) then - begin - OniImage.LoadFromTXMP(Connection, i); - OniImage.GetMipMappedImage(rawdata); - rawlist[j].raw_size := OniImage.GetImageDataSize(True); - Data[$90] := $08; - Data[$89] := 32; -{ if data[$90]<>OniImage.StoreType then begin - data[$90]:=OniImage.StoreType; - data[$89]:=(data[$89] and $CF) or $20; - end; -} end - else - begin - SetLength(rawdata, rawlist[j].raw_size); - OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]); - end; - // data[$88]:=data[$88] and $FE; - - if rawlist[j].loc_sep then - begin - rawlist[j].raw_addr := Stream_Sep.Size; - Stream_Sep.Write(rawdata[0], Length(rawdata)); - end - else - begin - rawlist[j].raw_addr := Stream_Raw.Size; - Stream_Raw.Write(rawdata[0], Length(rawdata)); - end; - end - else - rawlist[j].raw_addr := 0; - Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF; - Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF; - Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF; - Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF; - end; + RawLinks[i].RawAddr := Stream_Sep.Size; + Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size); + end else begin + RawLinks[i].RawAddr := Stream_Raw.Size; + Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size); + end; + end else + RawLinks[i].RawAddr := 0; + DatFileStream.Seek(RawLinks[i].SrcOffset, soFromBeginning); + DatFileStream.Write(RawLinks[i].RawAddr, 4); end; end; + DatFileStream.Seek(0, soFromBeginning); + Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size); - Stream_Body.Write(Data[0], Length(Data)); - // + QueryPerformanceCounter(tempticks2); + rawsum := rawsum + (tempticks2 - tempticks1); end else FilesHeader[i].DataAddr := 0; @@ -350,14 +368,19 @@ begin FilesHeader[i].FileSize := fileinfo.Size; FilesHeader[i].FileType := fileinfo.FileType; - if ((i mod 10) = 0) and (i >= 100) then + if ((FileID mod 10) = 0) and (FileID >= 100) then lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr( - (Time - FileTime) / i * (progress.Max - i + 1) * 1.1, TimeFormat ); - progress.Position := i + 1; - lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max); + (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, TimeFormat ); + progress.Position := FileID + 1; + lbl_progress.Caption := 'Files done: ' + IntToStr(FileID + 1) + '/' + IntToStr(progress.Max); Application.ProcessMessages; end; + ShowMessage('AvgDats: ' + FloatToStr((datsum / progress.Max) / freq) + #13#10 + + 'AvgLinks: ' + FloatToStr((linksum / progress.Max) / freq) + #13#10 + + 'AvgRaws: ' + FloatToStr((rawsum / progress.Max) / freq) + ); + Stream_Dat.Write(DatHeader, SizeOf(DatHeader)); for i := 0 to High(FilesHeader) do Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i])); @@ -369,6 +392,7 @@ begin DatHeader.DataSize := Stream_Body.Size; DatHeader.NamesSize := Stream_Names.Size; DatHeader.DataAddr := Stream_Dat.Size; + Stream_Body.Seek(0, soFromBeginning); Stream_Dat.CopyFrom(Stream_Body, Stream_Body.Size); DatHeader.NamesAddr := Stream_Dat.Size; @@ -382,7 +406,8 @@ begin Stream_Body.Free; Stream_Names.Free; Stream_Raw.Free; - if OniDataConnection.OSisMac then + + if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then Stream_Sep.Free; progress.Position := progress.Max; @@ -398,7 +423,7 @@ begin converting := False; - CloseDataConnection(DataConnections[conIndex]); +// CloseDataConnection(DataConnections[conIndex]); end; @@ -408,7 +433,7 @@ procedure TForm_LevelDB.HandleFile; var i: Byte; begin - for i := 1 to Length(ConvertHandlers) do +{ for i := 1 to Length(ConvertHandlers) do if UpperCase(ConvertHandlers[i].Ext) = UpperCase(ext) then if ConvertHandlers[i].needed then begin @@ -417,12 +442,13 @@ begin end else Break; -end; +}end; procedure TForm_LevelDB.CreateDatabase(Source, target: String); +{ var DataBase: TABSDatabase; Query: TABSQuery; @@ -454,9 +480,10 @@ const else group_progress.Caption := 'Creating DB (FINISHED)'; end; +} begin - if CreateDataConnection(Source, ODB_Dat) = nil then +{ if CreateDataConnection(Source, ODB_Dat) = nil then begin ShowMessage('Could not connect to .dat-file'); Exit; @@ -659,14 +686,15 @@ begin database.Free; CloseDataConnection(DataConnections[conIndex]); +} end; -procedure TForm_LevelDB.stop_convert; +procedure TForm_LevelDB.StopConvert; begin - btn_abortok.Caption := '&Close'; +{ btn_abortok.Caption := '&Close'; btn_abortok.Default := True; converting := False; lbl_estimation.Caption := 'ABORTED'; @@ -677,7 +705,7 @@ begin begin DeleteFile(loaded_filename); end; -end; +}end; @@ -700,7 +728,7 @@ end; - +{ procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord); var link: LongWord; @@ -1732,10 +1760,10 @@ begin begin end; end; +} - - +{ procedure InsertHandler(ext: String; needed: Boolean; handler: THandler); begin SetLength(ConvertHandlers, Length(ConvertHandlers) + 1); @@ -1743,9 +1771,9 @@ begin ConvertHandlers[High(ConvertHandlers)].needed := needed; ConvertHandlers[High(ConvertHandlers)].handler := handler; end; - +} begin - InsertHandler('ABNA', False, nil); +{ InsertHandler('ABNA', False, nil); // InsertHandler('AGDB',True,AGDB); InsertHandler('AGDB', False, nil); InsertHandler('AGQC', False, nil); @@ -1843,4 +1871,4 @@ begin InsertHandler('WMM_', False, nil); InsertHandler('WMMB', True, WMMB); InsertHandler('WPGE', True, WPGE); -end. +}end.