--- oup/current/Helper/LevelDB.pas 2007/03/30 02:08:49 142 +++ oup/current/Helper/LevelDB.pas 2007/07/17 22:27:16 241 @@ -24,7 +24,8 @@ var implementation {$R *.dfm} uses ABSMain, ABSDecUtil, Main, - ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList; + ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList, + Access_OniArchive; var Converting: Boolean = False; @@ -44,6 +45,9 @@ end; procedure TForm_LevelDB.CreateLevel(Source, Target: String); +const + EmptyBytes: Array[0..31] of Byte = ( + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ); var DatHeader: THeader; FilesHeader: TFilesMap; @@ -199,8 +203,13 @@ begin Stream_Names := TMemoryStream.Create; Stream_Dat := TFileStream.Create(Target, fmCreate); Stream_Raw := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate); + Stream_Raw.Write(EmptyBytes[0], 32); if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then + begin Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate); + Stream_Sep.Write(EmptyBytes[0], 32); + end; + DoStep('Creating header'); progress.Position := 0; @@ -229,7 +238,7 @@ begin for i := 0 to High(DatHeader.OSIdent) do case Connection.DataOS of DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i]; - DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i]; + DOS_MAC, DOS_WINDEMO: DatHeader.OSIdent[i] := HeaderOSIdentMac[i]; DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i]; end; for i := 0 to High(DatHeader.GlobalIdent) do @@ -270,7 +279,11 @@ begin begin case Connection.DataOS of DOS_WIN: ExtensionsHeader[i].Ident := FileTypes[j].IdentWin; - DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; + DOS_WINDEMO: + if FileTypes[j].Extension = 'SNDD' then + ExtensionsHeader[i].Ident := FileTypes[j].IdentWin + else + ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; DOS_MAC: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; end; @@ -335,9 +348,13 @@ begin begin RawLinks[i].RawAddr := Stream_Sep.Size; Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size); + if (Stream_Sep.Size mod 32) > 0 then + Stream_Sep.Write(EmptyBytes[0], 32 - (Stream_Sep.Size mod 32)); end else begin RawLinks[i].RawAddr := Stream_Raw.Size; Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size); + if (Stream_Raw.Size mod 32) > 0 then + Stream_Raw.Write(EmptyBytes[0], 32 - (Stream_Raw.Size mod 32)); end; end else RawLinks[i].RawAddr := 0; @@ -347,6 +364,14 @@ begin end; DatFileStream.Seek(0, soFromBeginning); Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size); + if (Stream_Body.Size mod 32) > 0 then + begin + ShowMessage( + IntToStr(FileID) + '-' + FileInfo.Name + '.' + FileInfo.Extension + #13#10 + + IntToStr(FileInfo.Size) + ' - 0x' + IntToHex(FileInfo.Size, 6) + ' - real: ' + IntToStr(DatFileStream.Size) + ' - 0x' + IntToHex(DatFileStream.Size, 6) + #13#10 + + IntToStr(Stream_Body.Size) + ' - 0x' + IntToHex(Stream_Body.Size, 6) ); + Stream_Body.Write(EmptyBytes[0], 32 - (Stream_Body.Size mod 32)); + end; end else FilesHeader[FileID].DataAddr := 0; @@ -377,12 +402,19 @@ begin for i := 0 to High(ExtensionsHeader) do Stream_Dat.Write(ExtensionsHeader[i], SizeOf(ExtensionsHeader[i])); + if (Stream_Dat.Size mod 32) > 0 then + Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32)); + 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); + + if (Stream_Dat.Size mod 32) > 0 then + Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32)); + DatHeader.NamesAddr := Stream_Dat.Size; Stream_Names.Seek(0, soFromBeginning); Stream_Dat.CopyFrom(Stream_Names, Stream_Names.Size); @@ -463,7 +495,7 @@ const begin DeleteFile(target); end; -end; + end; @@ -561,13 +593,15 @@ begin Query.SQL.Text := 'CREATE INDEX idtargetid ON linkmap (target_id);'; Query.ExecSQL; Query.SQL.Text := - 'CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' + - 'src_link_offset INTEGER, sep BOOLEAN, size INTEGER, ' + + 'CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, name STRING(32), src_id INTEGER, ' + + 'src_link_offset INTEGER, sep BOOLEAN, type STRING(8), size INTEGER, ' + 'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib);'; // Query.SQL.Text:='CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );'; Query.ExecSQL; Query.SQL.Text := 'CREATE INDEX idsrcid ON rawmap (src_id);'; Query.ExecSQL; + Query.SQL.Text := 'CREATE INDEX idtype ON rawmap (type);'; + Query.ExecSQL; Query.SQL.Text := 'CREATE TABLE datfiles ( id INTEGER PRIMARY KEY, extension CHAR(4), ' + 'name STRING(128), contenttype INTEGER, size INTEGER, ' + @@ -604,6 +638,8 @@ begin DoStep('Writing .dat-fileslist'); Application.ProcessMessages; + TAccess_OniArchive(Connection).UnloadWhenUnused := False; + FileTime := Time; Database.StartTransaction; for FileID := 0 to Connection.GetFileCount - 1 do @@ -632,9 +668,11 @@ begin Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, tempdata); mimecoder := TStringFormat_MIME64.Create; Query.SQL.Text := - 'INSERT INTO rawmap (src_id,src_link_offset,sep,size,data) VALUES (' + + 'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size,data) VALUES (' + + '"' + RawLinks[i].Name + '", ' + IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ',' + BoolToStr(RawLinks[i].LocSep) + ', ' + + '"' + RawLinks[i].RawType + '", ' + IntToStr(RawLinks[i].RawSize) + ', ' + 'MimeToBin("' + MimeCoder.StrTo(@tempdata[0], RawLinks[i].RawSize) + '") );'; Query.ExecSQL; @@ -643,9 +681,12 @@ begin else begin Query.SQL.Text := - 'INSERT INTO rawmap (src_id,src_link_offset,sep,size) VALUES (' + + 'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size) VALUES (' + + '"' + RawLinks[i].Name + '", ' + IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ', ' + - BoolToStr(RawLinks[i].LocSep) + ', 0);'; + BoolToStr(RawLinks[i].LocSep) + ', ' + + '"' + RawLinks[i].RawType + '", ' + + '0);'; Query.ExecSQL; end; end; @@ -701,6 +742,7 @@ begin btn_abortok.Default := True; converting := False; + TAccess_OniArchive(Connection).UnloadWhenUnused := True; Query.Close; Query.Free;