diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index cf4ba91eef..9b98de3b67 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -77,18 +77,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
private Stream m_loadStream;
- ///
- /// Record the creator id that should be associated with an asset. This is used to adjust asset creator ids
- /// after OSP resolution (since OSP creators are only stored in the item
- ///
- protected Dictionary m_creatorIdForAssetId = new Dictionary();
-
protected bool m_controlFileLoaded;
protected bool m_assetsLoaded;
protected bool m_inventoryNodesLoaded;
protected int m_successfulAssetRestores;
protected int m_failedAssetRestores;
+ protected int m_successfulItemRestores;
+
+ ///
+ /// Root destination folder for the IAR load.
+ ///
+ protected InventoryFolderBase m_rootDestinationFolder;
+
+ ///
+ /// Inventory nodes loaded from the iar.
+ ///
+ protected HashSet m_loadedNodes = new HashSet();
+
+ ///
+ /// In order to load identically named folders, we need to keep track of the folders that we have already
+ /// resolved.
+ ///
+ Dictionary m_resolvedFolders = new Dictionary();
+
+ ///
+ /// Record the creator id that should be associated with an asset. This is used to adjust asset creator ids
+ /// after OSP resolution (since OSP creators are only stored in the item
+ ///
+ protected Dictionary m_creatorIdForAssetId = new Dictionary();
public InventoryArchiveReadRequest(
Scene scene, UserAccount userInfo, string invPath, string loadPath, bool merge)
@@ -114,6 +131,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
///
/// Execute the request
///
+ ///
+ /// Only call this once. To load another IAR, construct another request object.
+ ///
///
/// A list of the inventory nodes loaded. If folders were loaded then only the root folders are
/// returned
@@ -124,9 +144,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
try
{
string filePath = "ERROR";
- int successfulItemRestores = 0;
-
- HashSet loadedNodes = new HashSet();
List folderCandidates
= InventoryArchiveUtils.FindFolderByPath(
@@ -137,16 +154,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
// Possibly provide an option later on to automatically create this folder if it does not exist
m_log.ErrorFormat("[INVENTORY ARCHIVER]: Inventory path {0} does not exist", m_invPath);
- return loadedNodes;
+ return m_loadedNodes;
}
- InventoryFolderBase rootDestinationFolder = folderCandidates[0];
+ m_rootDestinationFolder = folderCandidates[0];
archive = new TarArchiveReader(m_loadStream);
-
- // In order to load identically named folders, we need to keep track of the folders that we have already
- // resolved
- Dictionary resolvedFolders = new Dictionary();
-
byte[] data;
TarArchiveReader.TarEntryType entryType;
@@ -162,44 +174,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
}
else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH))
{
- if (!m_controlFileLoaded)
- throw new Exception(
- string.Format(
- "The IAR you are trying to load does not list {0} before {1}. Aborting load",
- ArchiveConstants.CONTROL_FILE_PATH, ArchiveConstants.INVENTORY_PATH));
-
- if (m_assetsLoaded)
- throw new Exception(
- string.Format(
- "The IAR you are trying to load does not list all {0} before {1}. Aborting load",
- ArchiveConstants.INVENTORY_PATH, ArchiveConstants.ASSETS_PATH));
-
- filePath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length);
-
- // Trim off the file portion if we aren't already dealing with a directory path
- if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
- filePath = filePath.Remove(filePath.LastIndexOf("/") + 1);
-
- InventoryFolderBase foundFolder
- = ReplicateArchivePathToUserInventory(
- filePath, rootDestinationFolder, resolvedFolders, loadedNodes);
-
- if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
- {
- InventoryItemBase item = LoadItem(data, foundFolder);
-
- if (item != null)
- {
- successfulItemRestores++;
-
- // If we aren't loading the folder containing the item then well need to update the
- // viewer separately for that item.
- if (!loadedNodes.Contains(foundFolder))
- loadedNodes.Add(item);
- }
- }
-
- m_inventoryNodesLoaded = true;
+ LoadInventoryFile(filePath, entryType, data);
}
}
@@ -208,9 +183,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
m_log.DebugFormat(
"[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures",
m_successfulAssetRestores, m_failedAssetRestores);
- m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores);
+ m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", m_successfulItemRestores);
- return loadedNodes;
+ return m_loadedNodes;
}
finally
{
@@ -548,6 +523,54 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
m_log.InfoFormat("[INVENTORY ARCHIVER]: Loading IAR with version {0}", version);
}
+ ///
+ /// Load inventory file
+ ///
+ ///
+ ///
+ ///
+ protected void LoadInventoryFile(string path, TarArchiveReader.TarEntryType entryType, byte[] data)
+ {
+ if (!m_controlFileLoaded)
+ throw new Exception(
+ string.Format(
+ "The IAR you are trying to load does not list {0} before {1}. Aborting load",
+ ArchiveConstants.CONTROL_FILE_PATH, ArchiveConstants.INVENTORY_PATH));
+
+ if (m_assetsLoaded)
+ throw new Exception(
+ string.Format(
+ "The IAR you are trying to load does not list all {0} before {1}. Aborting load",
+ ArchiveConstants.INVENTORY_PATH, ArchiveConstants.ASSETS_PATH));
+
+ path = path.Substring(ArchiveConstants.INVENTORY_PATH.Length);
+
+ // Trim off the file portion if we aren't already dealing with a directory path
+ if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
+ path = path.Remove(path.LastIndexOf("/") + 1);
+
+ InventoryFolderBase foundFolder
+ = ReplicateArchivePathToUserInventory(
+ path, m_rootDestinationFolder, m_resolvedFolders, m_loadedNodes);
+
+ if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType)
+ {
+ InventoryItemBase item = LoadItem(data, foundFolder);
+
+ if (item != null)
+ {
+ m_successfulItemRestores++;
+
+ // If we aren't loading the folder containing the item then well need to update the
+ // viewer separately for that item.
+ if (!m_loadedNodes.Contains(foundFolder))
+ m_loadedNodes.Add(item);
+ }
+ }
+
+ m_inventoryNodesLoaded = true;
+ }
+
///
/// Load asset file
///
@@ -578,6 +601,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
m_successfulAssetRestores);
m_assetsLoaded = true;
- }
+ }
}
}
\ No newline at end of file