Index: oup/current/Code/Exporters.pas
===================================================================
--- oup/current/Code/Exporters.pas	(revision 75)
+++ oup/current/Code/Exporters.pas	(revision 86)
@@ -3,15 +3,22 @@
 interface
 
-uses Classes, Dialogs, StrUtils, SysUtils, Math, Data, OniImgClass;
-
-procedure ExportDatFile(fileid: LongWord; filename: String);
-procedure ExportRawFiles(fileid: LongWord; filename: String);
-procedure ExportRawFile(fileid: LongWord; dat_offset: LongWord; filename: String);
-function ExportConverted(fileid: LongWord; filename: String): Integer;
-
-function ExportSNDD(fileid: LongWord; filename: String): Integer;
-function ExportTRAC(fileid: LongWord; filename: String): Integer;
-function ExportTXAN(fileid: LongWord; filename: String): Integer;
-function ExportImage(fileid: LongWord; filename: String): Integer;
+uses Classes, Dialogs, StrUtils, SysUtils, Math, Data, OniImgClass, OniDataClass;
+
+type
+  TExportHandlers = record
+    Ext:     String[4];
+    needed:  Boolean;
+    Handler: function(connection: TOniData; fileid: LongWord; filename: String): Integer;
+  end;
+
+procedure ExportDatFile(connection: TOniData; fileid: LongWord; filename: String);
+procedure ExportRawFiles(connection: TOniData; fileid: LongWord; filename: String);
+procedure ExportRawFile(connection: TOniData; fileid: LongWord; dat_offset: LongWord; filename: String);
+function ExportConverted(connection: TOniData; fileid: LongWord; filename: String): Integer;
+
+function ExportSNDD(connection: TOniData; fileid: LongWord; filename: String): Integer;
+function ExportTRAC(connection: TOniData; fileid: LongWord; filename: String): Integer;
+function ExportTXAN(connection: TOniData; fileid: LongWord; filename: String): Integer;
+function ExportImage(connection: TOniData; fileid: LongWord; filename: String): Integer;
 
 var
@@ -30,14 +37,14 @@
 implementation
 
-uses Functions, DataStructures, OniDataClass;
-
-
-
-procedure ExportDatFile(fileid: LongWord; filename: String);
+uses Functions, DataStructures;
+
+
+
+procedure ExportDatFile(connection: TOniData; fileid: LongWord; filename: String);
 var
   filestream: TFileStream;
   Data: Tdata;
 begin
-  Data := OniDataConnection.LoadDatFile(fileid);
+  Data := connection.LoadDatFile(fileid);
   if FileExists(filename) then
   begin
@@ -54,22 +61,22 @@
 
 
-procedure ExportRawFiles(fileid: LongWord; filename: String);
+procedure ExportRawFiles(connection: TOniData; fileid: LongWord; filename: String);
 var
   i: Integer;
   rawlist: TRawList;
 begin
-  rawlist := OniDataConnection.GetRawList(fileid);
+  rawlist := connection.GetRawList(fileid);
   if Length(rawlist) > 0 then
     for i := 0 to High(rawlist) do
-      ExportRawFile(fileid, rawlist[i].src_offset, filename);
-end;
-
-procedure ExportRawFile(fileid: LongWord; dat_offset: LongWord; filename: String);
+      ExportRawFile(connection, fileid, rawlist[i].src_offset, filename);
+end;
+
+procedure ExportRawFile(connection: TOniData; fileid: LongWord; dat_offset: LongWord; filename: String);
 var
   filestream: TFileStream;
   Data: Tdata;
 begin
-  SetLength(Data, OniDataConnection.GetRawInfo(fileid, dat_offset).raw_size);
-  OniDataConnection.LoadRawFile(fileid, dat_offset, @Data[0]);
+  SetLength(Data, connection.GetRawInfo(fileid, dat_offset).raw_size);
+  connection.LoadRawFile(fileid, dat_offset, @Data[0]);
   if FileExists(filename + '.raw0x' + IntToHex(dat_offset, 8)) then
   begin
@@ -86,14 +93,14 @@
 end;
 
-function ExportConverted(fileid: LongWord; filename: String): Integer;
+function ExportConverted(connection: TOniData; fileid: LongWord; filename: String): Integer;
 var
   i: Integer;
   fileinfo: TFileInfo;
 begin
-  fileinfo := OniDataConnection.GetFileInfo(fileid);
+  fileinfo := connection.GetFileInfo(fileid);
   if Length(ExportHandlers) > 0 then
     for i := 0 to High(ExportHandlers) do
       if ExportHandlers[i].Ext = fileinfo.Extension then
-        ExportHandlers[i].Handler(fileid, filename);
+        ExportHandlers[i].Handler(connection, fileid, filename);
 end;
 
@@ -142,5 +149,5 @@
 begin
   Result := export_noerror;
-  OniDataConnection.LoadDatFilePart(fileid, 0, SizeOf(DatData), @DatData);
+  connection.LoadDatFilePart(fileid, 0, SizeOf(DatData), @DatData);
   with DatData do
   begin
@@ -154,5 +161,5 @@
     WAVE_DataLen := RAWSize;
     SetLength(Data, RAWSize);
-    OniDataConnection.LoadRawFile(fileid, $44, Data);
+    connection.LoadRawFile(fileid, $44, Data);
 
     //Now start packing this into a neat wave...
@@ -192,11 +199,11 @@
   Result := export_noerror;
 
-  OniDataConnection.LoadDatFilePart(fileid, $18, SizeOf(link), @link);
+  connection.LoadDatFilePart(fileid, $18, SizeOf(link), @link);
   link := link div 256;
 
-  OniDataConnection.LoadDatFilePart(fileid, $1E, SizeOf(linkcount), @linkcount);
+  connection.LoadDatFilePart(fileid, $1E, SizeOf(linkcount), @linkcount);
   for i := 1 to linkcount do
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $20 + (i - 1) * 12 + 8, SizeOf(link), @link);
+    connection.LoadDatFilePart(fileid, $20 + (i - 1) * 12 + 8, SizeOf(link), @link);
     link := link div 256;
   end;
@@ -215,11 +222,11 @@
   Result := export_noerror;
 
-  OniDataConnection.LoadDatFilePart(fileid, $14, SizeOf(loop_speed), @loop_speed);
-  OniDataConnection.LoadDatFilePart(fileid, $16, SizeOf(unknown), @unknown);
-
-  OniDataConnection.LoadDatFilePart(fileid, $1C, SizeOf(linkcount), @linkcount);
+  connection.LoadDatFilePart(fileid, $14, SizeOf(loop_speed), @loop_speed);
+  connection.LoadDatFilePart(fileid, $16, SizeOf(unknown), @unknown);
+
+  connection.LoadDatFilePart(fileid, $1C, SizeOf(linkcount), @linkcount);
   for i := 0 to linkcount - 1 do
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $20 + i * 4, SizeOf(link), @link);
+    connection.LoadDatFilePart(fileid, $20 + i * 4, SizeOf(link), @link);
     link := link div 256;
     if link = 0 then
@@ -240,5 +247,5 @@
 
   img := TOniImage.Create;
-  img.Load(fileid);
+  img.Load(connection, fileid);
   data := img.GetAsBMP;
   img.Free;
Index: oup/current/Code/Functions.pas
===================================================================
--- oup/current/Code/Functions.pas	(revision 75)
+++ oup/current/Code/Functions.pas	(revision 86)
@@ -21,5 +21,5 @@
 function DecodeHexString(hex: String): Tdata;
 function GetWinFileName(Name: String): String;
-function GetExtractPath: String;
+//function GetExtractPath: String;
 
 function Explode(_string: String; delimiter: Char): TStringArray;
@@ -352,11 +352,11 @@
 
 
-
+{
 function GetExtractPath: String;
 begin
-  Result := ExtractFilePath(OniDataConnection.FileName) + '\extracted_' +
-    ExtractFileName(OniDataConnection.Filename);
-end;
-
+  Result := ExtractFilePath(DataConnections[i].FileName) + '\extracted_' +
+    ExtractFileName(DataConnections[i].Filename);
+end;
+}
 
 end.
Index: oup/current/Code/OniDataClass.pas
===================================================================
--- oup/current/Code/OniDataClass.pas	(revision 75)
+++ oup/current/Code/OniDataClass.pas	(revision 86)
@@ -136,4 +136,36 @@
   end;
 
+  TOniDataEmpty = class(TOniData)
+  private
+  protected
+  public
+    constructor Create(OLDBFilename: String; var Result: Boolean); override;
+    procedure Close; override;
+{
+    procedure UpdateListCache;
+    //      function GetDatLinks(srcid:LongWord):TDatLinks;
+    function GetFileInfo(fileid: LongWord): TFileInfo; override;
+    function GetFilesList(ext: String; pattern: String;
+      NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
+    function GetFilesCount: LongWord; override;
+    function GetExtensionsList: TStringArray; override;
+    function GetExtendedExtensionsList: TExtensionsMap; override;
+    function GetNamedFilesMap: TNamedFilesMap;
+
+    function LoadDatFile(fileid: LongWord): Tdata; override;
+    procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override;
+    procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
+    procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
+
+    function GetRawList(fileid: LongWord): TRawList; override;
+    procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override;
+    procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord;
+      target: Pointer); override;
+    procedure LoadRawFilePart(fileid, dat_offset: LongWord;
+      offset, size: LongWord; target: Pointer); override;
+    procedure UpdateRawFilePart(fileid, dat_offset: LongWord;
+      offset, size: LongWord; target: Pointer); override;
+}  published
+  end;
 
 const
@@ -143,8 +175,11 @@
 
 var
+//  OniDataConnection: TOniData;
+  DataConnections: array of TOniData;
   OniDataConnection: TOniData;
 
-function CreateDataConnection(filename: String; backend: Integer): Boolean;
-procedure CloseDataConnection;
+function CreateDataConnection(filename: String; backend: Integer): TOniData;
+procedure CloseDataConnection(connection: TOniData);
+
 
 
@@ -1372,22 +1407,44 @@
 
 
-function CreateDataConnection(filename: String; backend: Integer): Boolean;
+function CreateDataConnection(filename: String; backend: Integer): TOniData;
 var
   answer: Boolean;
-begin
-  if Assigned(OniDataConnection) then
-  begin
-    OniDataConnection.Close;
-    OniDataConnection.Free;
-    OniDataConnection := nil;
-  end;
+  i: Integer;
+begin
+  if Length(DataConnections) > 0 then
+  begin
+    for i := 0 to High(DataConnections) do
+    begin
+      if ExtractFileName(DataConnections[i].FFileName) = ExtractFileName(filename) then
+      begin
+        if DataConnections[i].FFileName <> filename then
+        begin
+          Result := nil;
+          ShowMessage('You can not open two files with the same name at a time.');
+        end
+        else
+          Result := DataConnections[i];
+        Exit;
+      end;
+    end;
+  end;
+
+  if not FileExists(filename) then
+  begin
+    ShowMessage('File "' + filename + '" does not exist!');
+    Result := nil;
+    Exit;
+  end;
+
+  SetLength(DataConnections, Length(DataConnections) + 1);
+  i := High(DataConnections);
   case backend of
     ODB_Dat:
-      OniDataConnection := TOniDataDat.Create(filename, answer);
+      DataConnections[i] := TOniDataDat.Create(filename, answer);
     ODB_ADB:
-      OniDataConnection := TOniDataADB.Create(filename, answer);
+      DataConnections[i] := TOniDataADB.Create(filename, answer);
     else
       ShowMessage('Unknown Backend');
-      Result := False;
+      Result := nil;
       Exit;
   end;
@@ -1395,27 +1452,65 @@
   if answer then
   begin
-    //      ShowMessage('file loaded');
-    //      ShowMessage('Files: '+IntToStr(OniDataConnection.GetFilesCount));
-    Result := True;
+    Result := DataConnections[i];
+//    Result := True;
   end
   else
   begin
     ShowMessage('File not loaded');
-    OniDataConnection.Close;
-    OniDataConnection.Free;
-    Result := False;
-  end;
-end;
-
-
-
-
-procedure CloseDataConnection;
-begin
-  if Assigned(OniDataConnection) then
-  begin
-    OniDataConnection.Close;
-    OniDataConnection := nil;
-  end;
+    DataConnections[i].Close;
+    DataConnections[i].Free;
+    DataConnections[i] := nil;
+    SetLength(DataConnections, Length(DataConnections) - 1);
+    Result := nil;
+  end;
+end;
+
+
+
+
+procedure CloseDataConnection(connection: TOniData);
+var
+  i: Integer;
+  found: Boolean;
+begin
+  if Assigned(connection) then
+  begin
+    found := False;
+    for i := 0 to High(DataConnections) do
+    begin
+      if not found then
+      begin
+        if DataConnections[i] = connection then
+        begin
+          DataConnections[i].Close;
+          DataConnections[i].Free;
+          DataConnections[i] := nil;
+          found := True;
+        end;
+      end
+      else
+      begin
+        DataConnections[i - 1] := DataConnections[i];
+      end;
+    end;
+    if found then
+      SetLength(DataConnections, Length(DataConnections) - 1);
+  end;
+end;
+
+
+
+
+constructor TOniDataEmpty.Create(OLDBFilename: String; var Result: Boolean);
+var
+  i, j:  Byte;
+  temps: String;
+begin
+  ShowMessage('OLD');
+end;
+
+procedure TOniDataEmpty.Close;
+begin
+  ShowMessage('OLD');
 end;
 
Index: oup/current/Code/OniImgClass.pas
===================================================================
--- oup/current/Code/OniImgClass.pas	(revision 75)
+++ oup/current/Code/OniImgClass.pas	(revision 86)
@@ -33,8 +33,8 @@
 
     constructor Create;
-    function Load(fileid: LongWord): Boolean;
-    function LoadFromPSpc(fileid: LongWord): Boolean;
-    function LoadFromTXMP(fileid: LongWord): Boolean;
-    function LoadFromTXMB(fileid: LongWord): Boolean;
+    function Load(connection: TOniData; fileid: Cardinal): Boolean;
+    function LoadFromPSpc(connection: TOniData; fileid: LongWord): Boolean;
+    function LoadFromTXMP(connection: TOniData; fileid: LongWord): Boolean;
+    function LoadFromTXMB(connection: TOniData; fileid: LongWord): Boolean;
     function GetImageDataSize(fading: Boolean): LongWord;
 
@@ -303,16 +303,16 @@
 
 
-function TOniImage.Load(fileid: LongWord): Boolean;
+function TOniImage.Load(connection: TOniData; fileid: Cardinal): Boolean;
 var
   FileInfo: TFileInfo;
   ext:      String;
 begin
-  FileInfo := OniDataConnection.GetFileInfo(fileid);
+  FileInfo := connection.GetFileInfo(fileid);
   if FileInfo.Extension = 'PSpc' then
-    Result := LoadFromPSpc(fileid)
+    Result := LoadFromPSpc(connection, fileid)
   else if FileInfo.Extension = 'TXMB' then
-    Result := LoadFromTXMB(fileid)
+    Result := LoadFromTXMB(connection, fileid)
   else if FileInfo.Extension = 'TXMP' then
-    Result := LoadFromTXMP(fileid)
+    Result := LoadFromTXMP(connection, fileid)
   else
     Result := False;
@@ -322,5 +322,5 @@
 
 
-function TOniImage.LoadFromPSpc(fileid: LongWord): Boolean;
+function TOniImage.LoadFromPSpc(connection: TOniData; fileid: LongWord): Boolean;
 type
   TPoint = packed record
@@ -357,5 +357,5 @@
   col, row: Byte;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $08, SizeOf(PSpc), @PSpc);
+  connection.LoadDatFilePart(fileid, $08, SizeOf(PSpc), @PSpc);
   PSpc.TXMP := PSpc.TXMP div 256;
   if PSpc.TXMP = 0 then
@@ -365,5 +365,5 @@
   end;
   txmpimg := TOniImage.Create;
-  txmpimg.LoadFromTXMP(PSpc.TXMP);
+  txmpimg.LoadFromTXMP(connection, PSpc.TXMP);
   txmpimg.DecodeImage;
   txmpimg.WriteToBMP('C:\file.bmp');
@@ -464,17 +464,17 @@
 
 
-function TOniImage.LoadFromTXMP(fileid: LongWord): Boolean;
+function TOniImage.LoadFromTXMP(connection: TOniData; fileid: LongWord): Boolean;
 var
   img_addr: LongWord;
 begin
   Result := True;
-  OniDataConnection.LoadDatFilePart(fileid, $8C, SizeOf(Self.FWidth), @Self.FWidth);
-  OniDataConnection.LoadDatFilePart(fileid, $8E, SizeOf(Self.FHeight), @Self.FHeight);
-  OniDataConnection.LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType),
+  connection.LoadDatFilePart(fileid, $8C, SizeOf(Self.FWidth), @Self.FWidth);
+  connection.LoadDatFilePart(fileid, $8E, SizeOf(Self.FHeight), @Self.FHeight);
+  connection.LoadDatFilePart(fileid, $90, SizeOf(Self.FStoreType),
     @Self.FStoreType);
-  if not OniDataConnection.OSisMac then
-    OniDataConnection.LoadDatFilePart(fileid, $9C, SizeOf(img_addr), @img_addr)
+  if not connection.OSisMac then
+    connection.LoadDatFilePart(fileid, $9C, SizeOf(img_addr), @img_addr)
   else
-    OniDataConnection.LoadDatFilePart(fileid, $A0, SizeOf(img_addr), @img_addr);
+    connection.LoadDatFilePart(fileid, $A0, SizeOf(img_addr), @img_addr);
 
   case Self.FStoreType of
@@ -499,8 +499,8 @@
   end;
 
-  if not OniDataConnection.OSisMac then
-    OniDataConnection.LoadRawFile(fileid, $9C, @Self.FData[0])
+  if not connection.OSisMac then
+    connection.LoadRawFile(fileid, $9C, @Self.FData[0])
   else
-    OniDataConnection.LoadRawFile(fileid, $A0, @Self.FData[0]);
+    connection.LoadRawFile(fileid, $A0, @Self.FData[0]);
 
   Self.FDataType := [DT_OniReverted, DT_Oni];
@@ -510,5 +510,5 @@
 
 
-function TOniImage.LoadFromTXMB(fileid: LongWord): Boolean;
+function TOniImage.LoadFromTXMB(connection: TOniData; fileid: LongWord): Boolean;
 var
   i, x, y, x2, y2, pixelid, imgid: LongWord;
@@ -519,16 +519,16 @@
   x_start, y_start: LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $10, SizeOf(Self.FWidth), @Self.FWidth);
-  OniDataConnection.LoadDatFilePart(fileid, $12, SizeOf(Self.FHeight), @Self.FHeight);
-  OniDataConnection.LoadDatFilePart(fileid, $18, SizeOf(cols), @cols);
-  OniDataConnection.LoadDatFilePart(fileid, $1A, SizeOf(rows), @rows);
-  OniDataConnection.LoadDatFilePart(fileid, $1C, SizeOf(linkcount), @linkcount);
+  connection.LoadDatFilePart(fileid, $10, SizeOf(Self.FWidth), @Self.FWidth);
+  connection.LoadDatFilePart(fileid, $12, SizeOf(Self.FHeight), @Self.FHeight);
+  connection.LoadDatFilePart(fileid, $18, SizeOf(cols), @cols);
+  connection.LoadDatFilePart(fileid, $1A, SizeOf(rows), @rows);
+  connection.LoadDatFilePart(fileid, $1C, SizeOf(linkcount), @linkcount);
   SetLength(images_decoded, linkcount);
   for i := 0 to linkcount - 1 do
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $20 + i * 4, SizeOf(link), @link);
+    connection.LoadDatFilePart(fileid, $20 + i * 4, SizeOf(link), @link);
     link := link div 256;
     images_decoded[i] := TOniImage.Create;
-    images_decoded[i].LoadFromTXMP(link);
+    images_decoded[i].LoadFromTXMP(connection, link);
     images_decoded[i].DecodeImage;
     images_decoded[i].RevertImage;
