Index: oup/current/Helper/LevelDB.pas
===================================================================
--- oup/current/Helper/LevelDB.pas	(revision 111)
+++ oup/current/Helper/LevelDB.pas	(revision 112)
@@ -1,3 +1,3 @@
-unit Helper_LevelDB;
+unit LevelDB;
 
 interface
@@ -16,6 +16,6 @@
     procedure btn_abortokClick(Sender: TObject);
   private
-    procedure HandleFile(ext: String; fileid: Integer; dir_dat2db: Boolean);
-    procedure stop_convert;
+    procedure HandleFile(Ext: String; FileID: Integer);
+    procedure StopConvert;
   public
     procedure CreateDatabase(Source, Target: String);
@@ -31,67 +31,72 @@
 {$R *.dfm}
 
-uses ABSMain, ABSDecUtil, Main, Functions, Data, OniImgClass, DataStructures, ConnectionManager;
+uses ABSMain, ABSDecUtil, Main,
+    ConnectionManager, TypeDefs, DataAccess, OniImgClass;
 
 type
-  THandler = procedure(fileid: LongWord; dir_dat2db: Boolean);
-
-  TConvertHandlers = record
+  THandler = procedure(FileID: Integer);
+  TConvertHandler = record
     Ext:     String[4];
-    needed:  Boolean;
     Handler: THandler;
   end;
 
 var
-  ConvertHandlers: array of TConvertHandlers;
-  loaded_filename: String;
-  converting: Boolean = False;
-  abort:     Boolean = False;
-  DataBase:  TABSDatabase;
-  Query:     TABSQuery;
-  MimeCoder: TStringFormat_MIME64;
-
-var
-  DatHeader:   THeader;
-  FilesHeader: TFilesMap;
+  ConvertHandlers: array of TConvertHandler;
+//  loaded_filename: String;
+  Converting:  Boolean = False;
+  Abort:       Boolean = False;
+
+
+function GetOpenMsg(msg: TStatusMessages): String;
+begin
+  case msg of
+    SM_AlreadyOpened:    Result := 'File already opened.';
+    SM_FileNotFound:     Result := 'File not found.';
+    SM_UnknownExtension: Result := 'Unknown extension.';
+    SM_IncompatibleFile: Result := 'Incompatible file format.';
+    SM_UnknownError:     Result := 'Unknown error.';
+  end;
+end;
+
+
+procedure TForm_LevelDB.CreateLevel(Source, Target: String);
+var
+  DatHeader:        THeader;
+  FilesHeader:      TFilesMap;
   NamedFilesHeader: TNamedFilesMap;
   ExtensionsHeader: TExtensionsMap;
-  Stream_Body, Stream_Names: TMemoryStream;
+
+  Stream_Body, Stream_Names:          TMemoryStream;
   Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
-  OniDataConnection: TOniData;
-
-
-
-
-procedure TForm_LevelDB.CreateLevel(Source, target: String);
-var
-  files: LongWord;
-
-  i, j:     LongWord;
-  temps, temps2: String;
-  Data, rawdata: Tdata;
-  absolutebegintime, begintime: Double;
-  step:     Byte;
-  rawlist:  TRawList;
-  extlist:  TExtensionsMap;
-  fileinfo: TFileInfo;
-  datlinks: TDatLinks;
-  OniImage: TOniImage;
-  levelid:  LongWord;
-  timeformat: TFormatSettings;
-
-  conIndex: Integer;
-  connection: TOniData;
+
+//  FileCount: Integer;
+//  temps, temps2: String;
+//  Data, rawdata: Tdata;
+  BeginTime, FileTime: Double;
+  Step:     Integer;
+//  rawlist:  TRawDataList;
+//  extlist:  TExtensionsMap;
+//  fileinfo: TFileInfo;
+//  datlinks: TDatLinks;
+  OniImage:   TOniImage;
+  LevelID:    Integer;
+  TimeFormat: TFormatSettings;
+
+  ConID:      Integer;
+  Connection: TDataAccess;
+  ConRepMsg:  TStatusMessages;
+
+  Strings:    TStrings;
+  i, j:       Integer;
 const
-  steps: Byte = 3;
-
-
-
-
-  procedure DoStep(stepname: String);
-  begin
-    Inc(step);
-    if stepname <> 'FIN' then
+  Steps: Byte = 3;
+
+
+  procedure DoStep(StepName: String);
+  begin
+    Inc(Step);
+    if StepName <> 'FIN' then
       group_progress.Caption :=
-        'Creating Dat (Step ' + IntToStr(step) + '/' + IntToStr(steps) + ': ' + stepname + ')'
+        'Creating Dat (Step ' + IntToStr(Step) + '/' + IntToStr(Steps) + ': ' + StepName + ')'
     else
       group_progress.Caption := 'Creating Dat (FINISHED)';
@@ -104,49 +109,79 @@
   //
 
-  timeformat.ShortTimeFormat := 'hh:nn:ss';
-  timeformat.LongTimeFormat := 'hh:nn:ss';
-  timeformat.TimeSeparator := ':';
-
-  connection := ConnectionExists(target);
-  if connection <> nil then
-  begin
-    ShowMessage('Destination-file is opened, close it in order to proceed conversion?');
+  TimeFormat.ShortTimeFormat := 'hh:nn:ss';
+  TimeFormat.LongTimeFormat  := 'hh:nn:ss';
+  TimeFormat.TimeSeparator   := ':';
+
+  ConID := ConManager.OpenConnection(Source, ConRepMsg);
+  if not (ConRepMsg in [SM_OK, SM_AlreadyOpened]) then
+  begin
+    ShowMessage('Source-file couldn''t be opened! Aborting' + CrLf + GetOpenMsg(ConRepMsg));
     Exit;
-  end;
-
-  connection := ConnectionExists(source);
-  if connection <> nil then
-  begin
-    ShowMessage('Source-file is opened, close it in order to proceed conversion?');
-    Exit;
-  end;
-
-
-  if CreateDataConnection(Source, ODB_ADB) = nil then
-  begin
-    ShowMessage('Could not connect to .oldb-file');
-    Exit;
-  end;
-  levelid  := OniDataConnection.LevelInfo.LevelNumber;
-  levelid  := (levelid * 2) * 256 * 256 * 256 + $01;
+  end else
+    Connection := ConManager.Connection[ConID];
+
+  ConID := ConManager.FileOpened(Target);
+  if ConID >= 0 then
+  begin
+    if MessageBox(Self.Handle, PChar('Destination-file is opened, close it in ' +
+          'order to proceed conversion?'), PChar('Destination-file opened'),
+          MB_YESNO + MB_ICONQUESTION) = ID_YES then
+    begin
+      if Form_Main.CheckConnectionCloseable(ConID) then
+        if not ConManager.CloseConnection(ConID, ConRepMsg) then
+        begin
+          ShowMessage('Couldn''t close destination-file. Aborting');
+          Exit;
+        end;
+    end else begin
+      ShowMessage('Aborting');
+      Exit;
+    end;
+  end;
+
+  if FileExists(Target) then
+  begin
+    if MessageBox(Self.Handle, PChar('Destination-file exists. ' +
+          'Overwrite it?'), PChar('Destination-file exists'),
+          MB_YESNO + MB_ICONWARNING) = ID_YES then
+    begin
+      if not DeleteFile(Target) then
+      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;
+    end else begin
+      ShowMessage('Aborting');
+      Exit;
+    end;
+  end;
+
+  LevelID  := Connection.LevelNumber;
+  LevelID  := (LevelID * 2) * 256 * 256 * 256 + $01;
   OniImage := TOniImage.Create;
-
-  absolutebegintime := Time;
 
   Self.Visible := True;
   Form_Main.Visible := False;
-  step  := 0;
-  converting := True;
-  abort := False;
+  Step := 0;
+  Converting := True;
+  Abort := False;
   btn_abortok.Caption := '&Abort...';
   btn_abortok.Default := False;
-  absolutebegintime := Time;
+  BeginTime := Time;
 
   Stream_Body  := TMemoryStream.Create;
   Stream_Names := TMemoryStream.Create;
-  Stream_Dat   := TFileStream.Create(target, fmCreate);
-  Stream_Raw   := TFileStream.Create(AnsiReplaceStr(target, '.dat', '.raw'), fmCreate);
-  if OniDataConnection.OSisMac then
-    Stream_Sep := TFileStream.Create(AnsiReplaceStr(target, '.dat', '.sep'), fmCreate);
+  Stream_Dat   := TFileStream.Create(Target, fmCreate);
+  Stream_Raw   := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate);
+  if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
+    Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate);
 
   DoStep('Creating header');
@@ -156,5 +191,23 @@
   Application.ProcessMessages;
 
-  NamedFilesHeader := TOniDataADB(OniDataConnection).GetNamedFilesMap;
+  SetLength(NamedFilesHeader, 0);
+  Strings := TStringList.Create;
+  Strings := Connection.GetFilesList('', '', False, ST_ExtNameAsc);
+  for i := 0 to Strings.Count - 1 do
+  begin
+    if MidStr(Strings.Strings[i],
+          Pos('-', Strings.Strings[i]) + 1,
+          Length(Strings.Strings[i]) -
+            Pos('.', ReverseString(Strings.Strings[i])) -
+            Pos('-', Strings.Strings[i])
+        ) <> '' then
+    begin
+      SetLength(NamedFilesHeader, Length(NamedFilesHeader) + 1);
+      NamedFilesHeader[High(NamedFilesHeader)].FileNumber := StrToInt(MidStr(Strings.Strings[i], 1, 5));
+      NamedFilesHeader[High(NamedFilesHeader)].blubb := 0;
+    end;
+  end;
+
+  
   extlist := OniDataConnection.GetExtendedExtensionsList;
   for i := 0 to High(DatHeader.Ident) do
@@ -172,4 +225,5 @@
   SetLength(ExtensionsHeader, DatHeader.Extensions);
 
+
   DoStep('Writing extensions-header');
   progress.Max := Length(OniDataConnection.GetExtensionsList);
@@ -190,4 +244,5 @@
     Application.ProcessMessages;
   end;
+
 
   DoStep('Storing files-data');
@@ -354,4 +409,8 @@
 procedure TForm_LevelDB.CreateDatabase(Source, target: String);
 var
+  DataBase:    TABSDatabase;
+  Query:       TABSQuery;
+  MimeCoder:   TStringFormat_MIME64;
+
   i, j:     LongWord;
   temps, temps2: String;
