source: oup/current/Helper/LevelDB.pas@ 121

Last change on this file since 121 was 120, checked in by alloc, 18 years ago
File size: 46.9 KB
Line 
1{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
2{$MINSTACKSIZE $00004000}
3{$MAXSTACKSIZE $00100000}
4{$IMAGEBASE $00400000}
5{$APPTYPE GUI}
6{$WARN SYMBOL_DEPRECATED ON}
7{$WARN SYMBOL_LIBRARY ON}
8{$WARN SYMBOL_PLATFORM ON}
9{$WARN SYMBOL_EXPERIMENTAL ON}
10{$WARN UNIT_LIBRARY ON}
11{$WARN UNIT_PLATFORM ON}
12{$WARN UNIT_DEPRECATED ON}
13{$WARN UNIT_EXPERIMENTAL ON}
14{$WARN HRESULT_COMPAT ON}
15{$WARN HIDING_MEMBER ON}
16{$WARN HIDDEN_VIRTUAL ON}
17{$WARN GARBAGE ON}
18{$WARN BOUNDS_ERROR ON}
19{$WARN ZERO_NIL_COMPAT ON}
20{$WARN STRING_CONST_TRUNCED ON}
21{$WARN FOR_LOOP_VAR_VARPAR ON}
22{$WARN TYPED_CONST_VARPAR ON}
23{$WARN ASG_TO_TYPED_CONST ON}
24{$WARN CASE_LABEL_RANGE ON}
25{$WARN FOR_VARIABLE ON}
26{$WARN CONSTRUCTING_ABSTRACT ON}
27{$WARN COMPARISON_FALSE ON}
28{$WARN COMPARISON_TRUE ON}
29{$WARN COMPARING_SIGNED_UNSIGNED ON}
30{$WARN COMBINING_SIGNED_UNSIGNED ON}
31{$WARN UNSUPPORTED_CONSTRUCT ON}
32{$WARN FILE_OPEN ON}
33{$WARN FILE_OPEN_UNITSRC ON}
34{$WARN BAD_GLOBAL_SYMBOL ON}
35{$WARN DUPLICATE_CTOR_DTOR ON}
36{$WARN INVALID_DIRECTIVE ON}
37{$WARN PACKAGE_NO_LINK ON}
38{$WARN PACKAGED_THREADVAR ON}
39{$WARN IMPLICIT_IMPORT ON}
40{$WARN HPPEMIT_IGNORED ON}
41{$WARN NO_RETVAL ON}
42{$WARN USE_BEFORE_DEF ON}
43{$WARN FOR_LOOP_VAR_UNDEF ON}
44{$WARN UNIT_NAME_MISMATCH ON}
45{$WARN NO_CFG_FILE_FOUND ON}
46{$WARN IMPLICIT_VARIANTS ON}
47{$WARN UNICODE_TO_LOCALE ON}
48{$WARN LOCALE_TO_UNICODE ON}
49{$WARN IMAGEBASE_MULTIPLE ON}
50{$WARN SUSPICIOUS_TYPECAST ON}
51{$WARN PRIVATE_PROPACCESSOR ON}
52{$WARN UNSAFE_TYPE OFF}
53{$WARN UNSAFE_CODE OFF}
54{$WARN UNSAFE_CAST OFF}
55{$WARN OPTION_TRUNCATED ON}
56{$WARN WIDECHAR_REDUCED ON}
57{$WARN DUPLICATES_IGNORED ON}
58{$WARN UNIT_INIT_SEQ ON}
59{$WARN LOCAL_PINVOKE ON}
60{$WARN MESSAGE_DIRECTIVE ON}
61unit LevelDB;
62interface
63uses
64 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
65 Dialogs, ComCtrls, StdCtrls, StrUtils;
66
67type
68 TForm_LevelDB = class(TForm)
69 group_progress: TGroupBox;
70 progress: TProgressBar;
71 lbl_progress: TLabel;
72 btn_abortok: TButton;
73 lbl_estimation: TLabel;
74 procedure btn_abortokClick(Sender: TObject);
75 private
76 procedure HandleFile(Ext: String; FileID: Integer);
77 procedure StopConvert;
78 public
79 procedure CreateDatabase(Source, Target: String);
80 procedure CreateLevel(Source, Target: String);
81 end;
82
83
84var
85 Form_LevelDB: TForm_LevelDB;
86
87implementation
88{$R *.dfm}
89uses ABSMain, ABSDecUtil, Main,
90 ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data;
91
92type
93 THandler = procedure(FileID: Integer);
94 TConvertHandler = record
95 Ext: String[4];
96 Handler: THandler;
97 end;
98
99var
100 ConvertHandlers: array of TConvertHandler;
101// loaded_filename: String;
102 Converting: Boolean = False;
103 Abort: Boolean = False;
104
105
106function GetOpenMsg(msg: TStatusMessages): String;
107begin
108 case msg of
109 SM_AlreadyOpened: Result := 'File already opened.';
110 SM_FileNotFound: Result := 'File not found.';
111 SM_UnknownExtension: Result := 'Unknown extension.';
112 SM_IncompatibleFile: Result := 'Incompatible file format.';
113 SM_UnknownError: Result := 'Unknown error.';
114 end;
115end;
116
117
118procedure TForm_LevelDB.CreateLevel(Source, Target: String);
119var
120 DatHeader: THeader;
121 FilesHeader: TFilesMap;
122 NamedFilesHeader: TNamedFilesMap;
123 ExtensionsHeader: TExtensionsMap;
124
125 Stream_Body, Stream_Names: TMemoryStream;
126 Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
127
128// Data, rawdata: Tdata;
129 BeginTime, FileTime: Double;
130 Step: Integer;
131// rawlist: TRawDataList;
132// datlinks: TDatLinks;
133 OniImage: TOniImage;
134 LevelID: Integer;
135 TimeFormat: TFormatSettings;
136
137 ConID: Integer;
138 Connection: TDataAccess;
139 ConRepMsg: TStatusMessages;
140
141 FileID: Integer;
142
143 Strings: TStrings;
144 i, j: Integer;
145 temps: String;
146 tempi: Integer;
147 tempb: Byte;
148 FileInfo: TFileInfo;
149 DatLinks: TDatLinkList;
150 RawLinks: TRawDataList;
151
152 DatFileStream, RawFileStream: TMemoryStream;
153const
154 Steps: Byte = 3;
155
156
157 procedure DoStep(StepName: String);
158 begin
159 Inc(Step);
160 if StepName <> 'FIN' then
161 group_progress.Caption :=
162 'Creating Dat (Step ' + IntToStr(Step) + '/' + IntToStr(Steps) + ': ' + StepName + ')'
163 else
164 group_progress.Caption := 'Creating Dat (FINISHED)';
165 end;
166
167begin
168
169 //
170 // FILE EXISTS CHECK FÜR DAT/RAW/SEP!!!
171 //
172
173 TimeFormat.ShortTimeFormat := 'hh:nn:ss';
174 TimeFormat.LongTimeFormat := 'hh:nn:ss';
175 TimeFormat.TimeSeparator := ':';
176
177 ConID := ConManager.OpenConnection(Source, ConRepMsg);
178 if not (ConRepMsg in [SM_OK, SM_AlreadyOpened]) then
179 begin
180 ShowMessage('Source-file couldn''t be opened! Aborting' + CrLf + GetOpenMsg(ConRepMsg));
181 Exit;
182 end else
183 Connection := ConManager.Connection[ConID];
184
185 ConID := ConManager.FileOpened(Target);
186 if ConID >= 0 then
187 begin
188 if MessageBox(Self.Handle, PChar('Destination-file is opened, close it in ' +
189 'order to proceed conversion?'), PChar('Destination-file opened'),
190 MB_YESNO + MB_ICONQUESTION) = ID_YES then
191 begin
192 if Form_Main.CheckConnectionCloseable(ConID) then
193 if not ConManager.CloseConnection(ConID, ConRepMsg) then
194 begin
195 ShowMessage('Couldn''t close destination-file. Aborting');
196 Exit;
197 end;
198 end else begin
199 ShowMessage('Aborting');
200 Exit;
201 end;
202 end;
203
204 if FileExists(Target) then
205 begin
206 if MessageBox(Self.Handle, PChar('Destination-file exists. ' +
207 'Overwrite it?'), PChar('Destination-file exists'),
208 MB_YESNO + MB_ICONWARNING) = ID_YES then
209 begin
210 if not DeleteFile(Target) then
211 begin
212 ShowMessage('Couldn''t delete file. Aborting');
213 Exit;
214 end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then
215 begin
216 ShowMessage('Couldn''t delete file. Aborting');
217 Exit;
218 end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
219 begin
220 ShowMessage('Couldn''t delete file. Aborting');
221 Exit;
222 end;
223 end else begin
224 ShowMessage('Aborting');
225 Exit;
226 end;
227 end;
228
229 LevelID := Connection.LevelNumber;
230 LevelID := (LevelID * 2) * 256 * 256 * 256 + $01;
231 OniImage := TOniImage.Create;
232
233 Self.Visible := True;
234 Form_Main.Visible := False;
235 Step := 0;
236 Converting := True;
237 Abort := False;
238 btn_abortok.Caption := '&Abort...';
239 btn_abortok.Default := False;
240 BeginTime := Time;
241
242 Stream_Body := TMemoryStream.Create;
243 Stream_Names := TMemoryStream.Create;
244 Stream_Dat := TFileStream.Create(Target, fmCreate);
245 Stream_Raw := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate);
246 if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
247 Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate);
248
249 DoStep('Creating header');
250 progress.Position := 0;
251 lbl_progress.Caption := '';
252 lbl_estimation.Caption := 'Estimated finishing time: unknown';
253 Application.ProcessMessages;
254
255 SetLength(NamedFilesHeader, 0);
256 Strings := TStringList.Create;
257 Strings := Connection.GetFilesList('', '', False, ST_ExtNameAsc);
258 for i := 0 to Strings.Count - 1 do
259 begin
260 if MidStr(Strings.Strings[i],
261 Pos('-', Strings.Strings[i]) + 1,
262 Length(Strings.Strings[i]) -
263 Pos('.', ReverseString(Strings.Strings[i])) -
264 Pos('-', Strings.Strings[i])
265 ) <> '' then
266 begin
267 SetLength(NamedFilesHeader, Length(NamedFilesHeader) + 1);
268 NamedFilesHeader[High(NamedFilesHeader)].FileNumber := StrToInt(MidStr(Strings.Strings[i], 1, 5));
269 NamedFilesHeader[High(NamedFilesHeader)].blubb := 0;
270 end;
271 end;
272
273 for i := 0 to High(DatHeader.OSIdent) do
274 case Connection.DataOS of
275 DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i];
276 DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
277 DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
278 end;
279 for i := 0 to High(DatHeader.GlobalIdent) do
280 DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i];
281 DatHeader.Files := Connection.GetFileCount;
282 DatHeader.NamedFiles := Length(NamedFilesHeader);
283
284 Strings := Connection.GetExtensionsList(EF_ExtCount);
285
286 DatHeader.Extensions := Strings.Count;
287 DatHeader.DataAddr := 0;
288 DatHeader.DataSize := 0;
289 DatHeader.NamesAddr := 0;
290 DatHeader.NamesSize := 0;
291 for i := 0 to High(DatHeader.Ident2) do
292 DatHeader.Ident2[i] := 0;
293 SetLength(FilesHeader, DatHeader.Files);
294 SetLength(ExtensionsHeader, DatHeader.Extensions);
295
296
297 DoStep('Writing extensions-header');
298 progress.Max := Strings.Count;
299 Application.ProcessMessages;
300 for i := 0 to Strings.Count - 1 do
301 begin
302 temps := Strings.Strings[i];
303 ExtensionsHeader[i].ExtCount := StrToInt( MidStr(
304 temps,
305 Pos('(', temps) + 1,
306 Pos(')', temps) - Pos('(', temps) - 1 ) );
307 temps := MidStr(temps, 1, 4);
308 for j := 0 to 3 do
309 ExtensionsHeader[i].Extension[j] := temps[4-j];
310 for j := 0 to High(FileTypes) do
311 if FileTypes[j].Extension = temps then
312 Break;
313 if j < Length(FileTypes) then
314 begin
315 case Connection.DataOS of
316 DOS_WIN: ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
317 DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
318 DOS_MAC: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
319 DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
320 end;
321 end else begin
322 ShowMessage('Unknown Extension: ' + Strings.Strings[i]);
323 Exit;
324 end;
325 progress.Position := i + 1;
326 lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' +
327 IntToStr(Strings.Count);
328 Application.ProcessMessages;
329 end;
330
331 DoStep('Storing files-data');
332 progress.Position := 0;
333 progress.Max := DatHeader.Files;
334 lbl_progress.Caption := '';
335 lbl_estimation.Caption := 'Estimated finishing time: unknown';
336 Application.ProcessMessages;
337
338 FileTime := Time;
339 for FileID := 0 to DatHeader.Files - 1 do
340 begin
341 FileInfo := Connection.GetFileInfo(FileID);
342 for j := 0 to 3 do
343 FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
344 if FileInfo.Size > 0 then
345 begin
346 FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
347 DatFileStream := TMemoryStream.Create;
348 Connection.LoadDatFile(FileID, TStream(DatFileStream));
349 DatFileStream.Seek(4, soFromBeginning);
350 DatFileStream.Write(LevelID, 4);
351
352 DatLinks := Connection.GetDatLinks(FileID);
353 if Length(DatLinks) > 0 then
354 begin
355 for i := 0 to High(DatLinks) do
356 begin
357 DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning);
358 if DatLinks[i].DestID < 0 then
359 tempi := 0
360 else
361 tempi := DatLinks[i].DestID * 256 + 1;
362 DatFileStream.Write(tempi, 4);
363 end;
364 end;
365
366 RawLinks := Connection.GetRawList(FileID);
367 if Length(RawLinks) > 0 then
368 begin
369 for i := 0 to High(RawLinks) do
370 begin
371 if RawLinks[i].RawSize > 0 then
372 begin
373 RawFileStream := TMemoryStream.Create;
374 if UpperCase(fileinfo.Extension) = 'TXMP' then
375 begin
376 DatFileStream.Seek($88, soFromBeginning);
377 DatFileStream.Read(tempb, 1);
378 if (tempb and $01) > 0 then
379 begin
380 OniImage.Load(Connection.ConnectionID, FileID);
381 if not OniImage.GetMipMappedImage(TStream(RawFileStream)) then
382 begin
383 ShowMessage('MipMapping-Error');
384 RawFileStream.Seek(0, soFromBeginning);
385 tempb := tempb and $FE;
386 DatFileStream.Seek($88, soFromBeginning);
387 DatFileStream.Write(tempb, 1);
388 OniImage.Load(Connection.ConnectionID, FileID);
389 OniImage.GetAsData(TStream(RawFileStream));
390 end else
391 begin
392 // Change of Depth($89), Storetype ($90)
393 DatFileStream.Seek($89, soFromBeginning);
394 DatFileStream.Read(tempb, 1);
395
396 DatFileStream.Seek($90, soFromBeginning);
397 DatFileStream.Read(tempb, 1);
398 Exit;
399 end;
400 end else
401 OniImage.GetAsData(TStream(RawFileStream));
402 end else begin
403 Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
404 end;
405 RawFileStream.Seek(0, soFromBeginning);
406 end else
407 RawLinks[i].RawAddr := 0;
408 end;
409 end;
410
411{
412 if rawlist[j].raw_size > 0 then
413 begin
414 if (UpperCase(fileinfo.Extension) = 'TXMP') and
415 ((Data[$88] and $01) > 0) then
416 begin
417 OniImage.LoadFromTXMP(Connection, i);
418 OniImage.GetMipMappedImage(rawdata);
419 rawlist[j].raw_size := OniImage.GetImageDataSize(True);
420 Data[$90] := $08;
421 Data[$89] := 32;
422(* if data[$90]<>OniImage.StoreType then begin
423 data[$90]:=OniImage.StoreType;
424 data[$89]:=(data[$89] and $CF) or $20;
425 end;
426*) end
427 else
428 begin
429 SetLength(rawdata, rawlist[j].raw_size);
430 OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]);
431 end;
432 // data[$88]:=data[$88] and $FE;
433
434 if rawlist[j].loc_sep then
435 begin
436 rawlist[j].raw_addr := Stream_Sep.Size;
437 Stream_Sep.Write(rawdata[0], Length(rawdata));
438 end
439 else
440 begin
441 rawlist[j].raw_addr := Stream_Raw.Size;
442 Stream_Raw.Write(rawdata[0], Length(rawdata));
443 end;
444 end
445 else
446 rawlist[j].raw_addr := 0;
447 Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF;
448 Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF;
449 Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF;
450 Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF;
451}
452 Stream_Body.Write(Data[0], Length(Data));
453 //
454 end
455 else
456 FilesHeader[i].DataAddr := 0;
457 if Length(fileinfo.Name) > 0 then
458 begin
459 FilesHeader[i].NameAddr := Stream_Names.Size;
460 temps := fileinfo.Extension + fileinfo.Name + Chr(0);
461 Stream_Names.Write(temps[1], Length(temps));
462 end
463 else
464 FilesHeader[i].NameAddr := 0;
465 FilesHeader[i].FileSize := fileinfo.Size;
466 FilesHeader[i].FileType := fileinfo.FileType;
467
468 if ((i mod 10) = 0) and (i >= 100) then
469 lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
470 (Time - FileTime) / i * (progress.Max - i + 1) * 1.1, TimeFormat );
471 progress.Position := i + 1;
472 lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max);
473 Application.ProcessMessages;
474 end;
475
476 Stream_Dat.Write(DatHeader, SizeOf(DatHeader));
477 for i := 0 to High(FilesHeader) do
478 Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i]));
479 for i := 0 to High(NamedFilesHeader) do
480 Stream_Dat.Write(NamedFilesHeader[i], SizeOf(NamedFilesHeader[i]));
481 for i := 0 to High(ExtensionsHeader) do
482 Stream_Dat.Write(ExtensionsHeader[i], SizeOf(ExtensionsHeader[i]));
483
484 DatHeader.DataSize := Stream_Body.Size;
485 DatHeader.NamesSize := Stream_Names.Size;
486 DatHeader.DataAddr := Stream_Dat.Size;
487 Stream_Body.Seek(0, soFromBeginning);
488 Stream_Dat.CopyFrom(Stream_Body, Stream_Body.Size);
489 DatHeader.NamesAddr := Stream_Dat.Size;
490 Stream_Names.Seek(0, soFromBeginning);
491 Stream_Dat.CopyFrom(Stream_Names, Stream_Names.Size);
492
493 Stream_Dat.Seek(0, soFromBeginning);
494 Stream_Dat.Write(DatHeader, SizeOf(DatHeader));
495
496 Stream_Dat.Free;
497 Stream_Body.Free;
498 Stream_Names.Free;
499 Stream_Raw.Free;
500 if OniDataConnection.OSisMac then
501 Stream_Sep.Free;
502
503 progress.Position := progress.Max;
504 lbl_progress.Caption := 'Files done: ' + IntToStr(progress.Max) + '/' +
505 IntToStr(progress.Max);
506 lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')';
507
508 DoStep('FIN');
509 btn_abortok.Caption := '&OK';
510 btn_abortok.Default := True;
511
512 OniImage.Free;
513
514 converting := False;
515
516 CloseDataConnection(DataConnections[conIndex]);
517end;
518
519
520
521
522procedure TForm_LevelDB.HandleFile;
523var
524 i: Byte;
525begin
526 for i := 1 to Length(ConvertHandlers) do
527 if UpperCase(ConvertHandlers[i].Ext) = UpperCase(ext) then
528 if ConvertHandlers[i].needed then
529 begin
530 ConvertHandlers[i].Handler(fileid, dir_dat2db);
531 Break;
532 end
533 else
534 Break;
535end;
536
537
538
539
540procedure TForm_LevelDB.CreateDatabase(Source, target: String);
541var
542 DataBase: TABSDatabase;
543 Query: TABSQuery;
544 MimeCoder: TStringFormat_MIME64;
545
546 i, j: LongWord;
547 temps, temps2: String;
548 Data: Tdata;
549 absolutebegintime, begintime: Double;
550 step: Byte;
551 rawlist: TRawList;
552 extlist: TExtensionsMap;
553 fileinfo: TFileInfo;
554 timeformat: TFormatSettings;
555
556 conIndex: Integer;
557const
558 steps: Byte = 4;
559
560
561
562
563 procedure DoStep(stepname: String);
564 begin
565 Inc(step);
566 if stepname <> 'FIN' then
567 group_progress.Caption :=
568 'Creating DB (Step ' + IntToStr(step) + '/' + IntToStr(steps) + ': ' + stepname + ')'
569 else
570 group_progress.Caption := 'Creating DB (FINISHED)';
571 end;
572
573begin
574 if CreateDataConnection(Source, ODB_Dat) = nil then
575 begin
576 ShowMessage('Could not connect to .dat-file');
577 Exit;
578 end
579 else
580 begin
581 TOniDataDat(OniDataConnection).UnloadWhenUnused := False;
582 end;
583
584 timeformat.LongTimeFormat := 'hh:nn:ss';
585 timeformat.ShortTimeFormat := 'hh:nn:ss';
586 timeformat.TimeSeparator := ':';
587
588 Self.Visible := True;
589 Form_Main.Visible := False;
590 step := 0;
591 converting := True;
592 abort := False;
593 btn_abortok.Caption := '&Abort...';
594 btn_abortok.Default := False;
595 loaded_filename := target;
596
597 absolutebegintime := Time;
598
599 DataBase := TABSDatabase.Create(Self);
600 DataBase.DatabaseName := 'OLDB';
601 DataBase.DatabaseFileName := target;
602 DataBase.CreateDatabase;
603
604 DoStep('Creating tables');
605 progress.Position := 0;
606 lbl_progress.Caption := '';
607 lbl_estimation.Caption := 'Estimated finishing time: unknown';
608 Application.ProcessMessages;
609
610 Query := TABSQuery.Create(Self);
611 Query.DatabaseName := 'OLDB';
612 Query.SQL.Text :=
613 'CREATE TABLE globals ( id AUTOINC PRIMARY KEY, name STRING(128), value STRING(128) );';
614 Query.ExecSQL;
615 Query.SQL.Text :=
616 'CREATE TABLE linkmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, target_id INTEGER );';
617 Query.ExecSQL;
618 Query.SQL.Text :=
619 'CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, sep BOOLEAN, size INTEGER, data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib );';
620 // Query.SQL.Text:='CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
621 Query.ExecSQL;
622 Query.SQL.Text :=
623 'CREATE TABLE datfiles ( id INTEGER PRIMARY KEY, extension CHAR(4), name STRING(128), contenttype INTEGER, size INTEGER, data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib );';
624 // Query.SQL.Text:='CREATE TABLE datfiles ( id INTEGER PRIMARY KEY, extension CHAR(4), name STRING(128), contenttype INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
625 Query.ExecSQL;
626 Query.SQL.Text :=
627 'CREATE TABLE extlist ( id AUTOINC PRIMARY KEY, ext CHAR(4), ident CHAR(16) );';
628 Query.ExecSQL;
629
630 Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("dbversion","' +
631 dbversion + '");';
632 Query.ExecSQL;
633 SetLength(Data, Length(OniDataConnection.LevelInfo.Ident));
634 for i := 0 to High(OniDataConnection.LevelInfo.Ident) do
635 Data[i] := OniDataConnection.LevelInfo.Ident[i];
636 temps := CreateHexString(Data, True);
637 Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("ident","' + temps + '");';
638 Query.ExecSQL;
639 Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("lvl","' +
640 IntToStr(OniDataConnection.LevelInfo.LevelNumber) + '");';
641 Query.ExecSQL;
642 if OniDataConnection.OSisMAC then
643 Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("os","MAC");'
644 else
645 Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("os","PC");';
646 Query.ExecSQL;
647
648 DoStep('Writing extensionslist');
649 progress.Max := Length(OniDataConnection.GetExtensionsList);
650 Application.ProcessMessages;
651
652 extlist := OniDataConnection.GetExtendedExtensionsList;
653 for i := 0 to High(extlist) do
654 begin
655 SetLength(Data, Length(extlist[i].Ident));
656 for j := 0 to High(extlist[i].Ident) do
657 Data[j] := extlist[i].Ident[j];
658 temps := CreateHexString(Data, True);
659 temps2 := extlist[i].Extension[3] + extlist[i].Extension[2] +
660 extlist[i].Extension[1] + extlist[i].Extension[0];
661 Query.SQL.Text := 'INSERT INTO extlist (ext,ident) VALUES ("' +
662 temps2 + '","' + temps + '");';
663 Query.ExecSQL;
664 progress.Position := i;
665 lbl_progress.Caption := 'Extensions done: ' + IntToStr(i) + '/' +
666 IntToStr(Length(extlist));
667 Application.ProcessMessages;
668 if abort then
669 begin
670 stop_convert;
671 Exit;
672 end;
673 end;
674 lbl_progress.Caption := '';
675
676 progress.Position := 0;
677 lbl_progress.Caption := 'Files done: ' + IntToStr(0) + '/' + IntToStr(
678 OniDataConnection.GetFilesCount);
679 lbl_estimation.Caption := 'Estimated finishing time: unknown';
680
681 DoStep('Loading .dat into memory');
682 Application.ProcessMessages;
683
684 progress.Max := OniDataConnection.GetFilesCount;
685 begintime := Time;
686 DoStep('Writing .dat-fileslist');
687 Application.ProcessMessages;
688
689 Database.StartTransaction;
690 for i := 0 to OniDataConnection.GetFilesCount - 1 do
691 begin
692 fileinfo := OniDataConnection.GetFileInfo(i);
693 if (fileinfo.FileType and $02) = 0 then
694 begin
695 mimecoder := TStringFormat_MIME64.Create;
696 Data := OniDataConnection.LoadDatFile(i);
697 Query.SQL.Text :=
698 'INSERT INTO datfiles (id,extension,name,contenttype,size,data) VALUES (' +
699 IntToStr(i) + ',"' + fileinfo.Extension + '","' + fileinfo.Name + '","' + IntToHex(
700 fileinfo.FileType, 8) + '",' + IntToStr(fileinfo.Size) + ',MimeToBin("' +
701 MimeCoder.StrTo(@Data[0], Length(Data)) + '") );';
702 Query.ExecSQL;
703 mimecoder.Free;
704
705 rawlist := OniDataConnection.GetRawList(i);
706 if Length(rawlist) > 0 then
707 begin
708 for j := 0 to High(rawlist) do
709 begin
710 if rawlist[j].raw_size > 0 then
711 begin
712 SetLength(Data, rawlist[j].raw_size);
713 OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, Data);
714 mimecoder := TStringFormat_MIME64.Create;
715 Query.SQL.Text :=
716 'INSERT INTO rawmap (src_id,src_link_offset,sep,size,data) VALUES (' +
717 IntToStr(i) + ',' + IntToStr(rawlist[j].src_offset) + ',' + BoolToStr(
718 rawlist[j].loc_sep) + ',' + IntToStr(rawlist[j].raw_size) + ',MimeToBin("' +
719 MimeCoder.StrTo(@Data[0], rawlist[j].raw_size) + '") );';
720 Query.ExecSQL;
721 mimecoder.Free;
722 end
723 else
724 begin
725 Query.SQL.Text :=
726 'INSERT INTO rawmap (src_id,src_link_offset,sep,size) VALUES (' +
727 IntToStr(i) + ',' + IntToStr(rawlist[j].src_offset) + ',' + BoolToStr(rawlist[j].loc_sep) + ',0);';
728 Query.ExecSQL;
729 end;
730 end;
731 end;
732
733 HandleFile(fileinfo.Extension, i, True);
734 end
735 else
736 begin
737 Query.SQL.Text :=
738 'INSERT INTO datfiles (id,extension,name,contenttype,size) VALUES (' +
739 IntToStr(i) + ',"' + fileinfo.Extension + '","' + fileinfo.Name + '","' + IntToHex(
740 fileinfo.FileType, 8) + '",0);';
741 Query.ExecSQL;
742 end;
743 if ((i mod 100) = 0) and (i > 0) then
744 begin
745 Database.Commit(False);
746 Database.StartTransaction;
747 end;
748 if ((i mod 10) = 0) and (i >= 100) then
749 lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
750 (Time - begintime) / i * (progress.Max - i + 1) * 1.1, timeformat );
751 progress.Position := i;
752 lbl_progress.Caption := 'Files done: ' + IntToStr(i) + '/' + IntToStr(progress.Max);
753 Application.ProcessMessages;
754 if abort then
755 begin
756 stop_convert;
757 Exit;
758 end;
759 end;
760 Database.Commit(False);
761 progress.Position := progress.Max;
762 lbl_progress.Caption := 'Files done: ' + IntToStr(progress.Max) + '/' +
763 IntToStr(progress.Max);
764
765 lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')';
766
767 DoStep('FIN');
768 btn_abortok.Caption := '&OK';
769 btn_abortok.Default := True;
770
771 converting := False;
772
773 database.Close;
774 database.Free;
775
776 CloseDataConnection(DataConnections[conIndex]);
777end;
778
779
780
781
782procedure TForm_LevelDB.stop_convert;
783begin
784 btn_abortok.Caption := '&Close';
785 btn_abortok.Default := True;
786 converting := False;
787 lbl_estimation.Caption := 'ABORTED';
788 group_progress.Caption := 'Creating DB (ABORTED)';
789 DataBase.Close;
790 if MessageBox(Self.Handle, PChar('Delete the unfinished DB-file?'),
791 PChar('Delete file?'), MB_YESNO) = idYes then
792 begin
793 DeleteFile(loaded_filename);
794 end;
795end;
796
797
798
799
800procedure TForm_LevelDB.btn_abortokClick(Sender: TObject);
801begin
802 if converting then
803 begin
804 if MessageBox(Self.Handle,
805 PChar('Do you really want to cancel the convert-progress?'),
806 PChar('Warning: Converting'), MB_YESNO) = idYes then
807 abort := True;
808 end
809 else
810 begin
811 Self.Visible := False;
812 Form_Main.Visible := True;
813 end;
814end;
815
816
817
818
819procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord);
820var
821 link: LongWord;
822begin
823 OniDataConnection.LoadDatFilePart(fileid, offset, 4, @link);
824 if link = 0 then
825 link := $FFFFFFFF
826 else
827 link := link div 256;
828 Query.SQL.Text := 'INSERT INTO linkmap (src_id,src_link_offset,target_id) VALUES (' +
829 IntToStr(fileid) + ',' + IntToStr(offset) + ',' + IntToStr(link) + ');';
830 Query.ExecSQL;
831end;
832
833
834
835
836procedure AISA(fileid: LongWord; dir_dat2db: Boolean);
837var
838 packages: Word;
839 i: LongWord;
840begin
841 if dir_dat2db then
842 begin
843 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
844 if packages > 0 then
845 begin
846 for i := 0 to packages - 1 do
847 InsertDatLinkToDB(fileid, $20 + i * $160 + $28);
848 for i := 0 to packages - 1 do
849 InsertDatLinkToDB(fileid, $20 + i * $160 + $150);
850 end;
851 end
852 else
853 begin
854 end;
855end;
856
857
858
859
860procedure AKEV(fileid: LongWord; dir_dat2db: Boolean);
861var
862 i: LongWord;
863begin
864 if dir_dat2db then
865 begin
866 for i := 0 to 16 do
867 InsertDatLinkToDB(fileid, $8 + i * 4);
868 end
869 else
870 begin
871 end;
872end;
873
874
875
876
877procedure AKOT(fileid: LongWord; dir_dat2db: Boolean);
878var
879 i: LongWord;
880begin
881 if dir_dat2db then
882 begin
883 for i := 0 to 4 do
884 InsertDatLinkToDB(fileid, $8 + i * 4);
885 end
886 else
887 begin
888 end;
889end;
890
891
892
893
894procedure CBPI(fileid: LongWord; dir_dat2db: Boolean);
895var
896 i: LongWord;
897begin
898 if dir_dat2db then
899 begin
900 for i := 0 to 56 do
901 InsertDatLinkToDB(fileid, $8 + i * 4);
902 end
903 else
904 begin
905 end;
906end;
907
908
909
910
911procedure CBPM(fileid: LongWord; dir_dat2db: Boolean);
912var
913 i: LongWord;
914begin
915 if dir_dat2db then
916 begin
917 for i := 0 to 18 do
918 InsertDatLinkToDB(fileid, $8 + i * 4);
919 end
920 else
921 begin
922 end;
923end;
924
925
926
927
928procedure CONS(fileid: LongWord; dir_dat2db: Boolean);
929var
930 i: LongWord;
931begin
932 if dir_dat2db then
933 begin
934 for i := 0 to 1 do
935 InsertDatLinkToDB(fileid, $24 + i * 4);
936 end
937 else
938 begin
939 end;
940end;
941
942
943
944
945procedure CRSA(fileid: LongWord; dir_dat2db: Boolean);
946var
947 packages: LongWord;
948 i: LongWord;
949begin
950 if dir_dat2db then
951 begin
952 OniDataConnection.LoadDatFilePart(fileid, $14, 4, @packages);
953 if packages > 0 then
954 for i := 0 to packages - 1 do
955 InsertDatLinkToDB(fileid, $20 + i * 1100 + $A0);
956 end
957 else
958 begin
959 end;
960end;
961
962
963
964
965procedure DOOR(fileid: LongWord; dir_dat2db: Boolean);
966begin
967 if dir_dat2db then
968 begin
969 InsertDatLinkToDB(fileid, $08);
970 InsertDatLinkToDB(fileid, $10);
971 end
972 else
973 begin
974 end;
975end;
976
977
978
979
980procedure DPGE(fileid: LongWord; dir_dat2db: Boolean);
981begin
982 if dir_dat2db then
983 begin
984 InsertDatLinkToDB(fileid, $40);
985 end
986 else
987 begin
988 end;
989end;
990
991
992
993
994procedure HPGE(fileid: LongWord; dir_dat2db: Boolean);
995begin
996 if dir_dat2db then
997 begin
998 InsertDatLinkToDB(fileid, $0C);
999 end
1000 else
1001 begin
1002 end;
1003end;
1004
1005
1006
1007
1008procedure IGHH(fileid: LongWord; dir_dat2db: Boolean);
1009begin
1010 if dir_dat2db then
1011 begin
1012 InsertDatLinkToDB(fileid, $24);
1013 InsertDatLinkToDB(fileid, $28);
1014 end
1015 else
1016 begin
1017 end;
1018end;
1019
1020
1021
1022
1023procedure IGPA(fileid: LongWord; dir_dat2db: Boolean);
1024var
1025 links: LongWord;
1026 i: LongWord;
1027begin
1028 if dir_dat2db then
1029 begin
1030 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
1031 if links > 0 then
1032 for i := 0 to links - 1 do
1033 InsertDatLinkToDB(fileid, $20 + i * 4);
1034 end
1035 else
1036 begin
1037 end;
1038end;
1039
1040
1041
1042
1043procedure IGPG(fileid: LongWord; dir_dat2db: Boolean);
1044var
1045 i: LongWord;
1046begin
1047 if dir_dat2db then
1048 begin
1049 for i := 0 to 1 do
1050 InsertDatLinkToDB(fileid, $1C + i * 4);
1051 end
1052 else
1053 begin
1054 end;
1055end;
1056
1057
1058
1059
1060procedure IGSA(fileid: LongWord; dir_dat2db: Boolean);
1061var
1062 links: LongWord;
1063 i: LongWord;
1064begin
1065 if dir_dat2db then
1066 begin
1067 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
1068 if links > 0 then
1069 for i := 0 to links - 1 do
1070 InsertDatLinkToDB(fileid, $20 + i * 4);
1071 end
1072 else
1073 begin
1074 end;
1075end;
1076
1077
1078
1079
1080procedure IMPT(fileid: LongWord; dir_dat2db: Boolean);
1081begin
1082 if dir_dat2db then
1083 begin
1084 InsertDatLinkToDB(fileid, $10);
1085 end
1086 else
1087 begin
1088 end;
1089end;
1090
1091
1092
1093
1094procedure IPGE(fileid: LongWord; dir_dat2db: Boolean);
1095begin
1096 if dir_dat2db then
1097 begin
1098 InsertDatLinkToDB(fileid, $0C);
1099 end
1100 else
1101 begin
1102 end;
1103end;
1104
1105
1106
1107
1108procedure KEYI(fileid: LongWord; dir_dat2db: Boolean);
1109var
1110 i: LongWord;
1111begin
1112 if dir_dat2db then
1113 begin
1114 for i := 0 to 9 do
1115 InsertDatLinkToDB(fileid, $08 + i * 4);
1116 end
1117 else
1118 begin
1119 end;
1120end;
1121
1122
1123
1124
1125procedure M3GA(fileid: LongWord; dir_dat2db: Boolean);
1126var
1127 links: LongWord;
1128 i: LongWord;
1129begin
1130 if dir_dat2db then
1131 begin
1132 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
1133 if links > 0 then
1134 for i := 0 to links - 1 do
1135 InsertDatLinkToDB(fileid, $20 + i * 4);
1136 end
1137 else
1138 begin
1139 end;
1140end;
1141
1142
1143
1144
1145procedure M3GM(fileid: LongWord; dir_dat2db: Boolean);
1146var
1147 i: LongWord;
1148begin
1149 if dir_dat2db then
1150 begin
1151 for i := 0 to 6 do
1152 InsertDatLinkToDB(fileid, $0C + i * 4);
1153 end
1154 else
1155 begin
1156 end;
1157end;
1158
1159
1160
1161
1162procedure MTRL(fileid: LongWord; dir_dat2db: Boolean);
1163begin
1164 if dir_dat2db then
1165 begin
1166 InsertDatLinkToDB(fileid, $10);
1167 end
1168 else
1169 begin
1170 end;
1171end;
1172
1173
1174
1175
1176procedure OBDC(fileid: LongWord; dir_dat2db: Boolean);
1177var
1178 packages: Word;
1179 i: LongWord;
1180begin
1181 if dir_dat2db then
1182 begin
1183 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1184 if packages > 0 then
1185 for i := 0 to packages - 1 do
1186 InsertDatLinkToDB(fileid, $20 + i * $18 + $4);
1187 end
1188 else
1189 begin
1190 end;
1191end;
1192
1193
1194
1195
1196procedure OBOA(fileid: LongWord; dir_dat2db: Boolean);
1197var
1198 packages: Word;
1199 i: LongWord;
1200begin
1201 if dir_dat2db then
1202 begin
1203 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1204 if packages > 0 then
1205 for i := 0 to packages - 1 do
1206 begin
1207 InsertDatLinkToDB(fileid, $20 + i * 240 + $0);
1208 InsertDatLinkToDB(fileid, $20 + i * 240 + $4);
1209 InsertDatLinkToDB(fileid, $20 + i * 240 + $8);
1210 end;
1211 end
1212 else
1213 begin
1214 end;
1215end;
1216
1217
1218
1219
1220procedure OFGA(fileid: LongWord; dir_dat2db: Boolean);
1221var
1222 packages: LongWord;
1223 i: LongWord;
1224begin
1225 if dir_dat2db then
1226 begin
1227 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1228 if packages > 0 then
1229 for i := 0 to packages - 1 do
1230 InsertDatLinkToDB(fileid, $20 + i * 12 + $04);
1231 end
1232 else
1233 begin
1234 end;
1235end;
1236
1237
1238
1239
1240procedure ONCC(fileid: LongWord; dir_dat2db: Boolean);
1241var
1242 i: LongWord;
1243begin
1244 if dir_dat2db then
1245 begin
1246 InsertDatLinkToDB(fileid, $28);
1247 InsertDatLinkToDB(fileid, $434);
1248 InsertDatLinkToDB(fileid, $438);
1249 InsertDatLinkToDB(fileid, $43C);
1250 InsertDatLinkToDB(fileid, $C3C);
1251 InsertDatLinkToDB(fileid, $C40);
1252 InsertDatLinkToDB(fileid, $C44);
1253 InsertDatLinkToDB(fileid, $C48);
1254 InsertDatLinkToDB(fileid, $C88);
1255 InsertDatLinkToDB(fileid, $C8C);
1256 end
1257 else
1258 begin
1259 end;
1260end;
1261
1262
1263
1264
1265procedure ONCV(fileid: LongWord; dir_dat2db: Boolean);
1266begin
1267 if dir_dat2db then
1268 begin
1269 InsertDatLinkToDB(fileid, $08);
1270 end
1271 else
1272 begin
1273 end;
1274end;
1275
1276
1277
1278
1279procedure ONLV(fileid: LongWord; dir_dat2db: Boolean);
1280var
1281 i: LongWord;
1282begin
1283 if dir_dat2db then
1284 begin
1285 for i := 0 to 5 do
1286 InsertDatLinkToDB(fileid, $48 + i * 4);
1287 for i := 0 to 5 do
1288 InsertDatLinkToDB(fileid, $64 + i * 4);
1289 InsertDatLinkToDB(fileid, $300);
1290 end
1291 else
1292 begin
1293 end;
1294end;
1295
1296
1297
1298
1299procedure ONOA(fileid: LongWord; dir_dat2db: Boolean);
1300var
1301 packages: LongWord;
1302 i: LongWord;
1303begin
1304 if dir_dat2db then
1305 begin
1306 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1307 if packages > 0 then
1308 for i := 0 to packages - 1 do
1309 InsertDatLinkToDB(fileid, $20 + i * 8 + $04);
1310 end
1311 else
1312 begin
1313 end;
1314end;
1315
1316
1317
1318
1319procedure ONSK(fileid: LongWord; dir_dat2db: Boolean);
1320begin
1321 if dir_dat2db then
1322 begin
1323 InsertDatLinkToDB(fileid, $08);
1324 InsertDatLinkToDB(fileid, $0C);
1325 InsertDatLinkToDB(fileid, $10);
1326 InsertDatLinkToDB(fileid, $14);
1327 InsertDatLinkToDB(fileid, $18);
1328 InsertDatLinkToDB(fileid, $20);
1329 InsertDatLinkToDB(fileid, $44);
1330 end
1331 else
1332 begin
1333 end;
1334end;
1335
1336
1337
1338
1339procedure ONVL(fileid: LongWord; dir_dat2db: Boolean);
1340var
1341 packages: LongWord;
1342 i: LongWord;
1343begin
1344 if dir_dat2db then
1345 begin
1346 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1347 if packages > 0 then
1348 for i := 0 to packages - 1 do
1349 InsertDatLinkToDB(fileid, $20 + i * 4);
1350 end
1351 else
1352 begin
1353 end;
1354end;
1355
1356
1357
1358
1359procedure ONWC(fileid: LongWord; dir_dat2db: Boolean);
1360begin
1361 if dir_dat2db then
1362 begin
1363 InsertDatLinkToDB(fileid, $28);
1364 InsertDatLinkToDB(fileid, $34);
1365 InsertDatLinkToDB(fileid, $40);
1366 InsertDatLinkToDB(fileid, $54);
1367 InsertDatLinkToDB(fileid, $58);
1368 InsertDatLinkToDB(fileid, $5C);
1369 InsertDatLinkToDB(fileid, $60);
1370 InsertDatLinkToDB(fileid, $6FC);
1371 InsertDatLinkToDB(fileid, $700);
1372 end
1373 else
1374 begin
1375 end;
1376end;
1377
1378
1379
1380
1381procedure OPGE(fileid: LongWord; dir_dat2db: Boolean);
1382begin
1383 if dir_dat2db then
1384 begin
1385 InsertDatLinkToDB(fileid, $0C);
1386 end
1387 else
1388 begin
1389 end;
1390end;
1391
1392
1393
1394
1395procedure PSPC(fileid: LongWord; dir_dat2db: Boolean);
1396begin
1397 if dir_dat2db then
1398 begin
1399 InsertDatLinkToDB(fileid, $50);
1400 end
1401 else
1402 begin
1403 end;
1404end;
1405
1406
1407
1408
1409procedure PSPL(fileid: LongWord; dir_dat2db: Boolean);
1410var
1411 packages: LongWord;
1412 i: LongWord;
1413begin
1414 if dir_dat2db then
1415 begin
1416 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1417 if packages > 0 then
1418 for i := 0 to packages - 1 do
1419 InsertDatLinkToDB(fileid, $20 + i * 8 + $4);
1420 end
1421 else
1422 begin
1423 end;
1424end;
1425
1426
1427
1428
1429procedure PSUI(fileid: LongWord; dir_dat2db: Boolean);
1430var
1431 i: LongWord;
1432begin
1433 if dir_dat2db then
1434 begin
1435 for i := 0 to 43 do
1436 InsertDatLinkToDB(fileid, $08 + i * 4);
1437 end
1438 else
1439 begin
1440 end;
1441end;
1442
1443
1444
1445
1446procedure STNA(fileid: LongWord; dir_dat2db: Boolean);
1447var
1448 packages: Word;
1449 i: LongWord;
1450begin
1451 if dir_dat2db then
1452 begin
1453 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1454 if packages > 0 then
1455 for i := 0 to packages - 1 do
1456 InsertDatLinkToDB(fileid, $20 + i * 4);
1457 end
1458 else
1459 begin
1460 end;
1461end;
1462
1463
1464
1465
1466procedure TRAC(fileid: LongWord; dir_dat2db: Boolean);
1467var
1468 packages: Word;
1469 i: LongWord;
1470begin
1471 if dir_dat2db then
1472 begin
1473 InsertDatLinkToDB(fileid, $18);
1474 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1475 if packages > 0 then
1476 for i := 0 to packages - 1 do
1477 InsertDatLinkToDB(fileid, $20 + i * 12 + 8);
1478 end
1479 else
1480 begin
1481 end;
1482end;
1483
1484
1485
1486
1487procedure TRAM(fileid: LongWord; dir_dat2db: Boolean);
1488begin
1489 if dir_dat2db then
1490 begin
1491 InsertDatLinkToDB(fileid, $40);
1492 InsertDatLinkToDB(fileid, $44);
1493 end
1494 else
1495 begin
1496 end;
1497end;
1498
1499
1500
1501
1502procedure TRAS(fileid: LongWord; dir_dat2db: Boolean);
1503begin
1504 if dir_dat2db then
1505 begin
1506 InsertDatLinkToDB(fileid, $08);
1507 end
1508 else
1509 begin
1510 end;
1511end;
1512
1513
1514
1515
1516procedure TRBS(fileid: LongWord; dir_dat2db: Boolean);
1517var
1518 i: LongWord;
1519begin
1520 if dir_dat2db then
1521 begin
1522 for i := 0 to 4 do
1523 InsertDatLinkToDB(fileid, $08 + i * 4);
1524 end
1525 else
1526 begin
1527 end;
1528end;
1529
1530
1531
1532
1533procedure TRCM(fileid: LongWord; dir_dat2db: Boolean);
1534var
1535 i: LongWord;
1536begin
1537 if dir_dat2db then
1538 begin
1539 for i := 0 to 2 do
1540 InsertDatLinkToDB(fileid, $5C + i * 4);
1541 end
1542 else
1543 begin
1544 end;
1545end;
1546
1547
1548
1549
1550procedure TRGA(fileid: LongWord; dir_dat2db: Boolean);
1551var
1552 i: LongWord;
1553 packages: Word;
1554begin
1555 if dir_dat2db then
1556 begin
1557 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1558 if packages > 0 then
1559 for i := 0 to packages - 1 do
1560 InsertDatLinkToDB(fileid, $20 + i * 4);
1561 end
1562 else
1563 begin
1564 end;
1565end;
1566
1567
1568
1569
1570procedure TRGE(fileid: LongWord; dir_dat2db: Boolean);
1571begin
1572 if dir_dat2db then
1573 begin
1574 InsertDatLinkToDB(fileid, $20);
1575 end
1576 else
1577 begin
1578 end;
1579end;
1580
1581
1582
1583
1584procedure TRIG(fileid: LongWord; dir_dat2db: Boolean);
1585begin
1586 if dir_dat2db then
1587 begin
1588 InsertDatLinkToDB(fileid, $18);
1589 InsertDatLinkToDB(fileid, $24);
1590 InsertDatLinkToDB(fileid, $28);
1591 end
1592 else
1593 begin
1594 end;
1595end;
1596
1597
1598
1599
1600procedure TRMA(fileid: LongWord; dir_dat2db: Boolean);
1601var
1602 i: LongWord;
1603 packages: Word;
1604begin
1605 if dir_dat2db then
1606 begin
1607 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1608 if packages > 0 then
1609 for i := 0 to packages - 1 do
1610 InsertDatLinkToDB(fileid, $20 + i * 4);
1611 end
1612 else
1613 begin
1614 end;
1615end;
1616
1617
1618
1619
1620procedure TRSC(fileid: LongWord; dir_dat2db: Boolean);
1621var
1622 i: LongWord;
1623 packages: Word;
1624begin
1625 if dir_dat2db then
1626 begin
1627 OniDataConnection.LoadDatFilePart(fileid, $1E, 2, @packages);
1628 if packages > 0 then
1629 for i := 0 to packages - 1 do
1630 InsertDatLinkToDB(fileid, $20 + i * 4);
1631 end
1632 else
1633 begin
1634 end;
1635end;
1636
1637
1638
1639
1640procedure TSFF(fileid: LongWord; dir_dat2db: Boolean);
1641var
1642 i: LongWord;
1643 packages: LongWord;
1644begin
1645 if dir_dat2db then
1646 begin
1647 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1648 if packages > 0 then
1649 for i := 0 to packages - 1 do
1650 InsertDatLinkToDB(fileid, $20 + i * 4);
1651 end
1652 else
1653 begin
1654 end;
1655end;
1656
1657
1658
1659
1660procedure TSFT(fileid: LongWord; dir_dat2db: Boolean);
1661begin
1662 if dir_dat2db then
1663 begin
1664 InsertDatLinkToDB(fileid, $1C);
1665 end
1666 else
1667 begin
1668 end;
1669end;
1670
1671
1672
1673
1674procedure TURR(fileid: LongWord; dir_dat2db: Boolean);
1675begin
1676 if dir_dat2db then
1677 begin
1678 InsertDatLinkToDB(fileid, $60);
1679 InsertDatLinkToDB(fileid, $6C);
1680 InsertDatLinkToDB(fileid, $74);
1681 end
1682 else
1683 begin
1684 end;
1685end;
1686
1687
1688
1689
1690procedure TXAN(fileid: LongWord; dir_dat2db: Boolean);
1691var
1692 i: LongWord;
1693 packages: LongWord;
1694begin
1695 if dir_dat2db then
1696 begin
1697 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1698 if packages > 0 then
1699 for i := 0 to packages - 1 do
1700 InsertDatLinkToDB(fileid, $20 + i * 4);
1701 end
1702 else
1703 begin
1704 end;
1705end;
1706
1707
1708
1709
1710procedure TXMA(fileid: LongWord; dir_dat2db: Boolean);
1711var
1712 i: LongWord;
1713 packages: LongWord;
1714begin
1715 if dir_dat2db then
1716 begin
1717 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1718 if packages > 0 then
1719 for i := 0 to packages - 1 do
1720 InsertDatLinkToDB(fileid, $20 + i * 4);
1721 end
1722 else
1723 begin
1724 end;
1725end;
1726
1727
1728
1729
1730procedure TXMB(fileid: LongWord; dir_dat2db: Boolean);
1731var
1732 i: LongWord;
1733 packages: LongWord;
1734begin
1735 if dir_dat2db then
1736 begin
1737 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1738 if packages > 0 then
1739 for i := 0 to packages - 1 do
1740 InsertDatLinkToDB(fileid, $20 + i * 4);
1741 end
1742 else
1743 begin
1744 end;
1745end;
1746
1747
1748
1749
1750procedure TXMP(fileid: LongWord; dir_dat2db: Boolean);
1751begin
1752 if dir_dat2db then
1753 begin
1754 InsertDatLinkToDB(fileid, $94);
1755 InsertDatLinkToDB(fileid, $98);
1756 end
1757 else
1758 begin
1759 end;
1760end;
1761
1762
1763
1764
1765procedure TXTC(fileid: LongWord; dir_dat2db: Boolean);
1766begin
1767 if dir_dat2db then
1768 begin
1769 InsertDatLinkToDB(fileid, $08);
1770 end
1771 else
1772 begin
1773 end;
1774end;
1775
1776
1777
1778
1779procedure WMCL(fileid: LongWord; dir_dat2db: Boolean);
1780var
1781 i: LongWord;
1782 packages: LongWord;
1783begin
1784 if dir_dat2db then
1785 begin
1786 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1787 if packages > 0 then
1788 for i := 0 to packages - 1 do
1789 InsertDatLinkToDB(fileid, $20 + i * 8 + $4);
1790 end
1791 else
1792 begin
1793 end;
1794end;
1795
1796
1797
1798
1799procedure WMDD(fileid: LongWord; dir_dat2db: Boolean);
1800var
1801 i: LongWord;
1802 packages: LongWord;
1803begin
1804 if dir_dat2db then
1805 begin
1806 OniDataConnection.LoadDatFilePart(fileid, $11C, 4, @packages);
1807 if packages > 0 then
1808 for i := 0 to packages - 1 do
1809 InsertDatLinkToDB(fileid, $120 + i * $124 + $114);
1810 end
1811 else
1812 begin
1813 end;
1814end;
1815
1816
1817
1818
1819procedure WMMB(fileid: LongWord; dir_dat2db: Boolean);
1820var
1821 i: LongWord;
1822 packages: LongWord;
1823begin
1824 if dir_dat2db then
1825 begin
1826 OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @packages);
1827 if packages > 0 then
1828 for i := 0 to packages - 1 do
1829 InsertDatLinkToDB(fileid, $20 + i * 4);
1830 end
1831 else
1832 begin
1833 end;
1834end;
1835
1836
1837
1838
1839procedure WPGE(fileid: LongWord; dir_dat2db: Boolean);
1840begin
1841 if dir_dat2db then
1842 begin
1843 InsertDatLinkToDB(fileid, $08);
1844 InsertDatLinkToDB(fileid, $0C);
1845 end
1846 else
1847 begin
1848 end;
1849end;
1850
1851
1852
1853
1854procedure InsertHandler(ext: String; needed: Boolean; handler: THandler);
1855begin
1856 SetLength(ConvertHandlers, Length(ConvertHandlers) + 1);
1857 ConvertHandlers[High(ConvertHandlers)].Ext := ext;
1858 ConvertHandlers[High(ConvertHandlers)].needed := needed;
1859 ConvertHandlers[High(ConvertHandlers)].handler := handler;
1860end;
1861
1862begin
1863 InsertHandler('ABNA', False, nil);
1864 // InsertHandler('AGDB',True,AGDB);
1865 InsertHandler('AGDB', False, nil);
1866 InsertHandler('AGQC', False, nil);
1867 InsertHandler('AGQG', False, nil);
1868 InsertHandler('AGQR', False, nil);
1869 InsertHandler('AISA', True, AISA);
1870 InsertHandler('AITR', False, nil);
1871 InsertHandler('AKAA', False, nil);
1872 InsertHandler('AKBA', False, nil);
1873 InsertHandler('AKBP', False, nil);
1874 InsertHandler('AKDA', False, nil);
1875 InsertHandler('AKEV', True, AKEV);
1876 InsertHandler('AKOT', True, AKOT);
1877 InsertHandler('AKVA', False, nil);
1878 InsertHandler('BINA', False, nil);
1879 InsertHandler('CBPI', True, CBPI);
1880 InsertHandler('CBPM', True, CBPM);
1881 InsertHandler('CONS', True, CONS);
1882 InsertHandler('CRSA', True, CRSA);
1883 InsertHandler('DOOR', True, DOOR);
1884 InsertHandler('DPGE', True, DPGE);
1885 InsertHandler('ENVP', False, nil);
1886 InsertHandler('FILM', False, nil);
1887 InsertHandler('HPGE', True, HPGE);
1888 InsertHandler('IDXA', False, nil);
1889 InsertHandler('IGHH', True, IGHH);
1890 InsertHandler('IGPA', True, IGPA);
1891 InsertHandler('IGPG', True, IGPG);
1892 InsertHandler('IGSA', True, IGSA);
1893 InsertHandler('IMPT', True, IMPT);
1894 InsertHandler('IPGE', True, IPGE);
1895 InsertHandler('KEYI', True, KEYI);
1896 InsertHandler('M3GA', True, M3GA);
1897 InsertHandler('M3GM', True, M3GM);
1898 InsertHandler('MTRL', True, MTRL);
1899 InsertHandler('OBAN', False, nil);
1900 InsertHandler('OBDC', True, OBDC);
1901 InsertHandler('OBOA', True, OBOA);
1902 InsertHandler('OFGA', True, OFGA);
1903 InsertHandler('ONCC', True, ONCC);
1904 InsertHandler('ONCP', False, nil);
1905 InsertHandler('ONCV', True, ONCV);
1906 InsertHandler('ONFA', False, nil);
1907 InsertHandler('ONGS', False, nil);
1908 InsertHandler('ONIA', False, nil);
1909 InsertHandler('ONLD', False, nil);
1910 InsertHandler('ONLV', True, ONLV);
1911 InsertHandler('ONMA', False, nil);
1912 InsertHandler('ONOA', True, ONOA);
1913 InsertHandler('ONSA', False, nil);
1914 InsertHandler('ONSK', True, ONSK);
1915 InsertHandler('ONTA', False, nil);
1916 InsertHandler('ONVL', True, ONVL);
1917 InsertHandler('ONWC', True, ONWC);
1918 InsertHandler('OPGE', True, OPGE);
1919 InsertHandler('OSBD', False, nil);
1920 InsertHandler('OTIT', False, nil);
1921 InsertHandler('OTLF', False, nil);
1922 InsertHandler('PLEA', False, nil);
1923 InsertHandler('PNTA', False, nil);
1924 InsertHandler('PSPC', True, PSPC);
1925 InsertHandler('PSPL', True, PSPL);
1926 InsertHandler('PSUI', True, PSUI);
1927 InsertHandler('QTNA', False, nil);
1928 InsertHandler('SNDD', False, nil);
1929 InsertHandler('STNA', True, STNA);
1930 InsertHandler('SUBT', False, nil);
1931 InsertHandler('TRAC', True, TRAC);
1932 InsertHandler('TRAM', True, TRAM);
1933 InsertHandler('TRAS', True, TRAS);
1934 InsertHandler('TRBS', True, TRBS);
1935 InsertHandler('TRCM', True, TRCM);
1936 InsertHandler('TRGA', True, TRGA);
1937 InsertHandler('TRGE', True, TRGE);
1938 InsertHandler('TRIA', False, nil);
1939 InsertHandler('TRIG', True, TRIG);
1940 InsertHandler('TRMA', True, TRMA);
1941 InsertHandler('TRSC', True, TRSC);
1942 InsertHandler('TRTA', False, nil);
1943 InsertHandler('TSFF', True, TSFF);
1944 InsertHandler('TSFL', False, nil);
1945 InsertHandler('TSFT', True, TSFT);
1946 InsertHandler('TSGA', False, nil);
1947 InsertHandler('TSTR', False, nil);
1948 InsertHandler('TURR', True, TURR);
1949 InsertHandler('TXAN', True, TXAN);
1950 InsertHandler('TXCA', False, nil);
1951 InsertHandler('TXMA', True, TXMA);
1952 InsertHandler('TXMB', True, TXMB);
1953 InsertHandler('TXMP', True, TXMP);
1954 InsertHandler('TXTC', True, TXTC);
1955 InsertHandler('VCRA', False, nil);
1956 InsertHandler('WMCL', True, WMCL);
1957 InsertHandler('WMDD', True, WMDD);
1958 InsertHandler('WMM_', False, nil);
1959 InsertHandler('WMMB', True, WMMB);
1960 InsertHandler('WPGE', True, WPGE);
1961end.
Note: See TracBrowser for help on using the repository browser.