Index: oup/current/Helper/LevelDB.pas
===================================================================
--- oup/current/Helper/LevelDB.pas	(revision 112)
+++ oup/current/Helper/LevelDB.pas	(revision 113)
@@ -1,6 +1,4 @@
 unit LevelDB;
-
 interface
-
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
@@ -28,9 +26,7 @@
 
 implementation
-
 {$R *.dfm}
-
 uses ABSMain, ABSDecUtil, Main,
-    ConnectionManager, TypeDefs, DataAccess, OniImgClass;
+    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data;
 
 type
@@ -70,12 +66,8 @@
   Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
 
-//  FileCount: Integer;
-//  temps, temps2: String;
 //  Data, rawdata: Tdata;
   BeginTime, FileTime: Double;
   Step:     Integer;
 //  rawlist:  TRawDataList;
-//  extlist:  TExtensionsMap;
-//  fileinfo: TFileInfo;
 //  datlinks: TDatLinks;
   OniImage:   TOniImage;
@@ -89,4 +81,8 @@
   Strings:    TStrings;
   i, j:       Integer;
+  temps:      String;
+  FileInfo:   TFileInfo;
+
+  DatFileStream, RawFileStream: TMemoryStream;
 const
   Steps: Byte = 3;
@@ -209,11 +205,18 @@
   end;
 
-  
-  extlist := OniDataConnection.GetExtendedExtensionsList;
-  for i := 0 to High(DatHeader.Ident) do
-    DatHeader.Ident[i] := OniDataConnection.LevelInfo.Ident[i];
-  DatHeader.Files := OniDataConnection.GetFilesCount;
+  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_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
+    end;
+  for i := 0 to High(DatHeader.GlobalIdent) do
+    DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i];
+  DatHeader.Files := Connection.GetFileCount;
   DatHeader.NamedFiles := Length(NamedFilesHeader);
-  DatHeader.Extensions := Length(extlist);
+
+  Strings := Connection.GetExtensionsList(EF_ExtCount);
+
+  DatHeader.Extensions := Strings.Count;
   DatHeader.DataAddr   := 0;
   DatHeader.DataSize   := 0;
@@ -227,22 +230,36 @@
 
   DoStep('Writing extensions-header');
-  progress.Max := Length(OniDataConnection.GetExtensionsList);
+  progress.Max := Strings.Count;
   Application.ProcessMessages;
-
-  for i := 0 to High(ExtensionsHeader) do
-  begin
-    ExtensionsHeader[i].Ident     := extlist[i].Ident;
-    ExtensionsHeader[i].Extension := extlist[i].Extension;
-    SetLength(temps, 4);
+  for i := 0 to Strings.Count - 1 do
+  begin
+    temps := Strings.Strings[i];
+    ExtensionsHeader[i].ExtCount := StrToInt( MidStr(
+            temps,
+            Pos('(', temps) + 1,
+            Pos(')', temps) - Pos('(', temps) - 1 ) );
+    temps := MidStr(temps, 1, 4);
     for j := 0 to 3 do
-      temps[j + 1] := ExtensionsHeader[i].Extension[3 - j];
-    ExtensionsHeader[i].ExtCount :=
-      Length(OniDataConnection.GetFilesList(temps, '', False, stIDAsc));
+      ExtensionsHeader[i].Extension[j] := temps[4-j];
+    for j := 0 to High(FileTypes) do
+      if FileTypes[j].Extension = temps then
+        Break;
+    if j < Length(FileTypes) then
+    begin
+      case Connection.DataOS of
+        DOS_WIN:     ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
+        DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
+        DOS_MAC:     ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
+        DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
+      end;
+    end else begin
+      ShowMessage('Unknown Extension: ' + Strings.Strings[i]);
+      Exit;
+    end;
     progress.Position    := i + 1;
     lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' +
-      IntToStr(Length(extlist));
+      IntToStr(Strings.Count);
     Application.ProcessMessages;
   end;
-
 
   DoStep('Storing files-data');
@@ -253,19 +270,18 @@
   Application.ProcessMessages;
 
-  begintime := Time;
+  FileTime := Time;
   for i := 0 to DatHeader.Files - 1 do
   begin
-    fileinfo := OniDataConnection.GetFileInfo(i);
+    FileInfo := Connection.GetFileInfo(i);
     for j := 0 to 3 do
-      FilesHeader[i].Extension[j] := fileinfo.Extension[4 - j];
-    if fileinfo.Size > 0 then
+      FilesHeader[i].Extension[j] := FileInfo.Extension[4 - j];
+    if FileInfo.Size > 0 then
     begin
       //        DatLinks:=;
       FilesHeader[i].DataAddr := Stream_Body.Size + 8;
-      Data    := OniDataConnection.LoadDatFile(i);
-      Data[4] := (levelid) and $FF;
-      Data[5] := (levelid shr 8) and $FF;
-      Data[6] := (levelid shr 16) and $FF;
-      Data[7] := (levelid shr 24) and $FF;
+      DatFileStream := TMemoryStream.Create;
+      Connection.LoadDatFile(i, DatFileStream);
+      DatFileStream.Seek(4, soFromBeginning);
+      DatFileStream.Write(LevelID, 4);
 
       if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then
@@ -337,5 +353,5 @@
     if ((i mod 10) = 0) and (i >= 100) then
       lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
-        (Time - begintime) / i * (progress.Max - i + 1) * 1.1, timeformat );
+        (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);
@@ -373,5 +389,5 @@
   lbl_progress.Caption   := 'Files done: ' + IntToStr(progress.Max) + '/' +
     IntToStr(progress.Max);
-  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')';
+  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')';
 
   DoStep('FIN');
