aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs32
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs24
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs86
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs22
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadTests.cs8
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs2
-rw-r--r--OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs4
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs27
9 files changed, 159 insertions, 50 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 9963521..2730b3f 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -61,6 +61,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
61 61
62 private UserAccount m_userInfo; 62 private UserAccount m_userInfo;
63 private string m_invPath; 63 private string m_invPath;
64
65 /// <value>
66 /// ID of this request
67 /// </value>
68 protected UUID m_id;
64 69
65 /// <summary> 70 /// <summary>
66 /// Do we want to merge this load with existing inventory? 71 /// Do we want to merge this load with existing inventory?
@@ -71,6 +76,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
71 protected IAssetService m_AssetService; 76 protected IAssetService m_AssetService;
72 protected IUserAccountService m_UserAccountService; 77 protected IUserAccountService m_UserAccountService;
73 78
79 private InventoryArchiverModule m_module;
80
74 /// <value> 81 /// <value>
75 /// The stream from which the inventory archive will be loaded. 82 /// The stream from which the inventory archive will be loaded.
76 /// </value> 83 /// </value>
@@ -117,9 +124,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
117 protected Dictionary<UUID, UUID> m_creatorIdForAssetId = new Dictionary<UUID, UUID>(); 124 protected Dictionary<UUID, UUID> m_creatorIdForAssetId = new Dictionary<UUID, UUID>();
118 125
119 public InventoryArchiveReadRequest( 126 public InventoryArchiveReadRequest(
120 IInventoryService inv, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, string loadPath, bool merge) 127 UUID id, IInventoryService inv, InventoryArchiverModule module, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, string loadPath, bool merge)
121 : this( 128 : this(
129 id,
122 inv, 130 inv,
131 module,
123 assets, 132 assets,
124 uacc, 133 uacc,
125 userInfo, 134 userInfo,
@@ -130,8 +139,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
130 } 139 }
131 140
132 public InventoryArchiveReadRequest( 141 public InventoryArchiveReadRequest(
133 IInventoryService inv, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, Stream loadStream, bool merge) 142 UUID id, IInventoryService inv, InventoryArchiverModule module, IAssetService assets, IUserAccountService uacc, UserAccount userInfo, string invPath, Stream loadStream, bool merge)
134 { 143 {
144 m_id = id;
135 m_InventoryService = inv; 145 m_InventoryService = inv;
136 m_AssetService = assets; 146 m_AssetService = assets;
137 m_UserAccountService = uacc; 147 m_UserAccountService = uacc;
@@ -139,6 +149,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
139 m_userInfo = userInfo; 149 m_userInfo = userInfo;
140 m_invPath = invPath; 150 m_invPath = invPath;
141 m_loadStream = loadStream; 151 m_loadStream = loadStream;
152 m_module = module;
142 153
143 // FIXME: Do not perform this check since older versions of OpenSim do save the control file after other things 154 // FIXME: Do not perform this check since older versions of OpenSim do save the control file after other things
144 // (I thought they weren't). We will need to bump the version number and perform this check on all 155 // (I thought they weren't). We will need to bump the version number and perform this check on all
@@ -161,6 +172,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
161 { 172 {
162 try 173 try
163 { 174 {
175 Exception reportedException = null;
176
164 string filePath = "ERROR"; 177 string filePath = "ERROR";
165 178
166 List<InventoryFolderBase> folderCandidates 179 List<InventoryFolderBase> folderCandidates
@@ -197,14 +210,25 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
197 } 210 }
198 211
199 archive.Close(); 212 archive.Close();
200 213
201 m_log.DebugFormat( 214 m_log.DebugFormat(
202 "[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures", 215 "[INVENTORY ARCHIVER]: Successfully loaded {0} assets with {1} failures",
203 m_successfulAssetRestores, m_failedAssetRestores); 216 m_successfulAssetRestores, m_failedAssetRestores);
204 m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", m_successfulItemRestores); 217
218 //Alicia: When this is called by LibraryModule or Tests, m_module will be null as event is not required
219 if(m_module != null)
220 m_module.TriggerInventoryArchiveLoaded(m_id, true, m_userInfo, m_invPath, m_loadStream, reportedException, m_successfulItemRestores);
205 221
206 return m_loadedNodes; 222 return m_loadedNodes;
207 } 223 }
224 catch(Exception Ex)
225 {
226 // Trigger saved event with failed result and exception data
227 if (m_module != null)
228 m_module.TriggerInventoryArchiveLoaded(m_id, false, m_userInfo, m_invPath, m_loadStream, Ex, 0);
229
230 return m_loadedNodes;
231 }
208 finally 232 finally
209 { 233 {
210 m_loadStream.Close(); 234 m_loadStream.Close();
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index 0605db5..401a238 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -61,6 +61,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
61 /// </summary> 61 /// </summary>
62 public string FilterContent { get; set; } 62 public string FilterContent { get; set; }
63 63
64 /// <summary>
65 /// Counter for inventory items saved to archive for passing to compltion event
66 /// </summary>
67 public int CountItems { get; set; }
68
69 /// <summary>
70 /// Counter for inventory items skipped due to permission filter option for passing to compltion event
71 /// </summary>
72 public int CountFiltered { get; set; }
73
64 /// <value> 74 /// <value>
65 /// Used to select all inventory nodes in a folder but not the folder itself 75 /// Used to select all inventory nodes in a folder but not the folder itself
66 /// </value> 76 /// </value>
@@ -158,7 +168,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
158 } 168 }
159 169
160 m_module.TriggerInventoryArchiveSaved( 170 m_module.TriggerInventoryArchiveSaved(
161 m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException); 171 m_id, succeeded, m_userInfo, m_invPath, m_saveStream, reportedException, CountItems, CountFiltered);
162 } 172 }
163 173
164 protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary<string, object> options, IUserAccountService userAccountService) 174 protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary<string, object> options, IUserAccountService userAccountService)
@@ -174,6 +184,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
174 "[INVENTORY ARCHIVER]: Skipping inventory item {0} {1} at {2}", 184 "[INVENTORY ARCHIVER]: Skipping inventory item {0} {1} at {2}",
175 inventoryItem.Name, inventoryItem.ID, path); 185 inventoryItem.Name, inventoryItem.ID, path);
176 } 186 }
187
188 CountFiltered++;
189
177 return; 190 return;
178 } 191 }
179 } 192 }
@@ -184,6 +197,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
184 m_log.InfoFormat( 197 m_log.InfoFormat(
185 "[INVENTORY ARCHIVER]: Insufficient permissions, skipping inventory item {0} {1} at {2}", 198 "[INVENTORY ARCHIVER]: Insufficient permissions, skipping inventory item {0} {1} at {2}",
186 inventoryItem.Name, inventoryItem.ID, path); 199 inventoryItem.Name, inventoryItem.ID, path);
200
201 // Count Items Excluded
202 CountFiltered++;
203
187 return; 204 return;
188 } 205 }
189 206
@@ -202,6 +219,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
202 219
203 AssetType itemAssetType = (AssetType)inventoryItem.AssetType; 220 AssetType itemAssetType = (AssetType)inventoryItem.AssetType;
204 221
222 // Count inventory items (different to asset count)
223 CountItems++;
224
205 // Don't chase down link asset items as they actually point to their target item IDs rather than an asset 225 // Don't chase down link asset items as they actually point to their target item IDs rather than an asset
206 if (SaveAssets && itemAssetType != AssetType.Link && itemAssetType != AssetType.LinkFolder) 226 if (SaveAssets && itemAssetType != AssetType.Link && itemAssetType != AssetType.LinkFolder)
207 m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (sbyte)inventoryItem.AssetType, m_assetUuids); 227 m_assetGatherer.GatherAssetUuids(inventoryItem.AssetID, (sbyte)inventoryItem.AssetType, m_assetUuids);
@@ -363,7 +383,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
363 // We couldn't find the path indicated 383 // We couldn't find the path indicated
364 string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath); 384 string errorMessage = string.Format("Aborted save. Could not find inventory path {0}", m_invPath);
365 Exception e = new InventoryArchiverException(errorMessage); 385 Exception e = new InventoryArchiverException(errorMessage);
366 m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e); 386 m_module.TriggerInventoryArchiveSaved(m_id, false, m_userInfo, m_invPath, m_saveStream, e, 0, 0);
367 throw e; 387 throw e;
368 } 388 }
369 389
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index 0e4d79c..b85bbea 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -57,6 +57,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
57// public bool DisablePresenceChecks { get; set; } 57// public bool DisablePresenceChecks { get; set; }
58 58
59 public event InventoryArchiveSaved OnInventoryArchiveSaved; 59 public event InventoryArchiveSaved OnInventoryArchiveSaved;
60 public event InventoryArchiveLoaded OnInventoryArchiveLoaded;
60 61
61 /// <summary> 62 /// <summary>
62 /// The file to load and save inventory if no filename has been specified 63 /// The file to load and save inventory if no filename has been specified
@@ -64,9 +65,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
64 protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory.iar"; 65 protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory.iar";
65 66
66 /// <value> 67 /// <value>
67 /// Pending save completions initiated from the console 68 /// Pending save and load completions initiated from the console
68 /// </value> 69 /// </value>
69 protected List<UUID> m_pendingConsoleSaves = new List<UUID>(); 70 protected List<UUID> m_pendingConsoleTasks = new List<UUID>();
70 71
71 /// <value> 72 /// <value>
72 /// All scenes that this module knows about 73 /// All scenes that this module knows about
@@ -111,6 +112,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
111 { 112 {
112 scene.RegisterModuleInterface<IInventoryArchiverModule>(this); 113 scene.RegisterModuleInterface<IInventoryArchiverModule>(this);
113 OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted; 114 OnInventoryArchiveSaved += SaveInvConsoleCommandCompleted;
115 OnInventoryArchiveLoaded += LoadInvConsoleCommandCompleted;
114 116
115 scene.AddCommand( 117 scene.AddCommand(
116 "Archiving", this, "load iar", 118 "Archiving", this, "load iar",
@@ -176,11 +178,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
176 /// </summary> 178 /// </summary>
177 protected internal void TriggerInventoryArchiveSaved( 179 protected internal void TriggerInventoryArchiveSaved(
178 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, 180 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream,
179 Exception reportedException) 181 Exception reportedException, int SaveCount, int FilterCount)
180 { 182 {
181 InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; 183 InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved;
182 if (handlerInventoryArchiveSaved != null) 184 if (handlerInventoryArchiveSaved != null)
183 handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); 185 handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException, SaveCount , FilterCount);
186 }
187
188 /// <summary>
189 /// Trigger the inventory archive loaded event.
190 /// </summary>
191 protected internal void TriggerInventoryArchiveLoaded(
192 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream loadStream,
193 Exception reportedException, int LoadCount)
194 {
195 InventoryArchiveLoaded handlerInventoryArchiveLoaded = OnInventoryArchiveLoaded;
196 if (handlerInventoryArchiveLoaded != null)
197 handlerInventoryArchiveLoaded(id, succeeded, userInfo, invPath, loadStream, reportedException, LoadCount);
184 } 198 }
185 199
186 public bool ArchiveInventory( 200 public bool ArchiveInventory(
@@ -272,13 +286,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
272 return false; 286 return false;
273 } 287 }
274 288
275 public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream) 289 public bool DearchiveInventory(UUID id, string firstName, string lastName, string invPath, string pass, Stream loadStream)
276 { 290 {
277 return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary<string, object>()); 291 return DearchiveInventory(id, firstName, lastName, invPath, pass, loadStream, new Dictionary<string, object>());
278 } 292 }
279 293
280 public bool DearchiveInventory( 294 public bool DearchiveInventory(
281 string firstName, string lastName, string invPath, string pass, Stream loadStream, 295 UUID id, string firstName, string lastName, string invPath, string pass, Stream loadStream,
282 Dictionary<string, object> options) 296 Dictionary<string, object> options)
283 { 297 {
284 if (m_scenes.Count > 0) 298 if (m_scenes.Count > 0)
@@ -294,7 +308,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
294 308
295 try 309 try
296 { 310 {
297 request = new InventoryArchiveReadRequest(m_aScene.InventoryService, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadStream, merge); 311 request = new InventoryArchiveReadRequest(id, m_aScene.InventoryService, this, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadStream, merge);
298 } 312 }
299 catch (EntryPointNotFoundException e) 313 catch (EntryPointNotFoundException e)
300 { 314 {
@@ -326,7 +340,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
326 } 340 }
327 341
328 public bool DearchiveInventory( 342 public bool DearchiveInventory(
329 string firstName, string lastName, string invPath, string pass, string loadPath, 343 UUID id, string firstName, string lastName, string invPath, string pass, string loadPath,
330 Dictionary<string, object> options) 344 Dictionary<string, object> options)
331 { 345 {
332 if (m_scenes.Count > 0) 346 if (m_scenes.Count > 0)
@@ -342,7 +356,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
342 356
343 try 357 try
344 { 358 {
345 request = new InventoryArchiveReadRequest(m_aScene.InventoryService, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadPath, merge); 359 request = new InventoryArchiveReadRequest(id, m_aScene.InventoryService, this, m_aScene.AssetService, m_aScene.UserAccountService, userInfo, invPath, loadPath, merge);
346 } 360 }
347 catch (EntryPointNotFoundException e) 361 catch (EntryPointNotFoundException e)
348 { 362 {
@@ -378,6 +392,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
378 { 392 {
379 try 393 try
380 { 394 {
395 UUID id = UUID.Random();
396
381 Dictionary<string, object> options = new Dictionary<string, object>(); 397 Dictionary<string, object> options = new Dictionary<string, object>();
382 OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); 398 OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; });
383 399
@@ -400,10 +416,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
400 "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", 416 "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}",
401 loadPath, invPath, firstName, lastName); 417 loadPath, invPath, firstName, lastName);
402 418
403 if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) 419 lock (m_pendingConsoleTasks)
404 m_log.InfoFormat( 420 m_pendingConsoleTasks.Add(id);
405 "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", 421
406 loadPath, firstName, lastName); 422 DearchiveInventory(id, firstName, lastName, invPath, pass, loadPath, options);
407 } 423 }
408 catch (InventoryArchiverException e) 424 catch (InventoryArchiverException e)
409 { 425 {
@@ -465,8 +481,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
465 "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}", 481 "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}",
466 savePath, invPath, firstName, lastName); 482 savePath, invPath, firstName, lastName);
467 483
468 lock (m_pendingConsoleSaves) 484 lock (m_pendingConsoleTasks)
469 m_pendingConsoleSaves.Add(id); 485 m_pendingConsoleTasks.Add(id);
470 486
471 ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, options); 487 ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, options);
472 } 488 }
@@ -478,19 +494,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
478 494
479 private void SaveInvConsoleCommandCompleted( 495 private void SaveInvConsoleCommandCompleted(
480 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, 496 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream,
481 Exception reportedException) 497 Exception reportedException, int SaveCount, int FilterCount)
482 { 498 {
483 lock (m_pendingConsoleSaves) 499 lock (m_pendingConsoleTasks)
484 { 500 {
485 if (m_pendingConsoleSaves.Contains(id)) 501 if (m_pendingConsoleTasks.Contains(id))
486 m_pendingConsoleSaves.Remove(id); 502 m_pendingConsoleTasks.Remove(id);
487 else 503 else
488 return; 504 return;
489 } 505 }
490 506
491 if (succeeded) 507 if (succeeded)
492 { 508 {
493 m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0} {1}", userInfo.FirstName, userInfo.LastName); 509 // Report success and include item count and filter count (Skipped items due to --perm or --exclude switches)
510 if(FilterCount == 0)
511 m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive with {0} items for {1} {2}", SaveCount, userInfo.FirstName, userInfo.LastName);
512 else
513 m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive with {0} items for {1} {2}. Skipped {3} items due to exclude and/or perm switches", SaveCount, userInfo.FirstName, userInfo.LastName, FilterCount);
494 } 514 }
495 else 515 else
496 { 516 {
@@ -500,6 +520,30 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
500 } 520 }
501 } 521 }
502 522
523 private void LoadInvConsoleCommandCompleted(
524 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream loadStream,
525 Exception reportedException, int LoadCount)
526 {
527 lock (m_pendingConsoleTasks)
528 {
529 if (m_pendingConsoleTasks.Contains(id))
530 m_pendingConsoleTasks.Remove(id);
531 else
532 return;
533 }
534
535 if (succeeded)
536 {
537 m_log.InfoFormat("[INVENTORY ARCHIVER]: Loaded {0} items from archive {1} for {2} {3}", LoadCount, invPath, userInfo.FirstName, userInfo.LastName);
538 }
539 else
540 {
541 m_log.ErrorFormat(
542 "[INVENTORY ARCHIVER]: Archive load for {0} {1} failed - {2}",
543 userInfo.FirstName, userInfo.LastName, reportedException.Message);
544 }
545 }
546
503 /// <summary> 547 /// <summary>
504 /// Get user information for the given name. 548 /// Get user information for the given name.
505 /// </summary> 549 /// </summary>
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
index dabece3..eb2515e 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadPathTests.cs
@@ -69,8 +69,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
69 69
70 UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "meowfood"); 70 UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "meowfood");
71 UserAccountHelpers.CreateUserWithInventory(scene, m_uaLL1, "hampshire"); 71 UserAccountHelpers.CreateUserWithInventory(scene, m_uaLL1, "hampshire");
72 72
73 archiverModule.DearchiveInventory(m_uaMT.FirstName, m_uaMT.LastName, "/", "meowfood", m_iarStream); 73 archiverModule.DearchiveInventory(UUID.Random(), m_uaMT.FirstName, m_uaMT.LastName, "/", "meowfood", m_iarStream);
74 InventoryItemBase foundItem1 74 InventoryItemBase foundItem1
75 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, m_item1Name); 75 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, m_item1Name);
76 76
@@ -79,7 +79,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
79 // Now try loading to a root child folder 79 // Now try loading to a root child folder
80 UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, m_uaMT.PrincipalID, "xA", false); 80 UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, m_uaMT.PrincipalID, "xA", false);
81 MemoryStream archiveReadStream = new MemoryStream(m_iarStream.ToArray()); 81 MemoryStream archiveReadStream = new MemoryStream(m_iarStream.ToArray());
82 archiverModule.DearchiveInventory(m_uaMT.FirstName, m_uaMT.LastName, "xA", "meowfood", archiveReadStream); 82 archiverModule.DearchiveInventory(UUID.Random(), m_uaMT.FirstName, m_uaMT.LastName, "xA", "meowfood", archiveReadStream);
83 83
84 InventoryItemBase foundItem2 84 InventoryItemBase foundItem2
85 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, "xA/" + m_item1Name); 85 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, "xA/" + m_item1Name);
@@ -88,7 +88,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
88 // Now try loading to a more deeply nested folder 88 // Now try loading to a more deeply nested folder
89 UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, m_uaMT.PrincipalID, "xB/xC", false); 89 UserInventoryHelpers.CreateInventoryFolder(scene.InventoryService, m_uaMT.PrincipalID, "xB/xC", false);
90 archiveReadStream = new MemoryStream(archiveReadStream.ToArray()); 90 archiveReadStream = new MemoryStream(archiveReadStream.ToArray());
91 archiverModule.DearchiveInventory(m_uaMT.FirstName, m_uaMT.LastName, "xB/xC", "meowfood", archiveReadStream); 91 archiverModule.DearchiveInventory(UUID.Random(), m_uaMT.FirstName, m_uaMT.LastName, "xB/xC", "meowfood", archiveReadStream);
92 92
93 InventoryItemBase foundItem3 93 InventoryItemBase foundItem3
94 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, "xB/xC/" + m_item1Name); 94 = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_uaMT.PrincipalID, "xB/xC/" + m_item1Name);
@@ -110,7 +110,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
110 SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); 110 SceneHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
111 111
112 UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "password"); 112 UserAccountHelpers.CreateUserWithInventory(scene, m_uaMT, "password");
113 archiverModule.DearchiveInventory(m_uaMT.FirstName, m_uaMT.LastName, "/Objects", "password", m_iarStream); 113 archiverModule.DearchiveInventory(UUID.Random(), m_uaMT.FirstName, m_uaMT.LastName, "/Objects", "password", m_iarStream);
114 114
115 InventoryItemBase foundItem1 115 InventoryItemBase foundItem1
116 = InventoryArchiveUtils.FindItemByPath( 116 = InventoryArchiveUtils.FindItemByPath(
@@ -185,8 +185,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
185 185
186 // LOAD ITEM 186 // LOAD ITEM
187 MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); 187 MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
188 188
189 archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream); 189 archiverModule.DearchiveInventory(UUID.Random(), userFirstName, userLastName, "Scripts", userPassword, archiveReadStream);
190 190
191 InventoryItemBase foundItem1 191 InventoryItemBase foundItem1
192 = InventoryArchiveUtils.FindItemByPath( 192 = InventoryArchiveUtils.FindItemByPath(
@@ -229,7 +229,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
229 229
230 { 230 {
231 // Test replication of path1 231 // Test replication of path1
232 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false) 232 new InventoryArchiveReadRequest(UUID.Random(), scene.InventoryService, null, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
233 .ReplicateArchivePathToUserInventory( 233 .ReplicateArchivePathToUserInventory(
234 iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 234 iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
235 foldersCreated, nodesLoaded); 235 foldersCreated, nodesLoaded);
@@ -246,7 +246,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
246 246
247 { 247 {
248 // Test replication of path2 248 // Test replication of path2
249 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false) 249 new InventoryArchiveReadRequest(UUID.Random(), scene.InventoryService, null, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
250 .ReplicateArchivePathToUserInventory( 250 .ReplicateArchivePathToUserInventory(
251 iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 251 iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
252 foldersCreated, nodesLoaded); 252 foldersCreated, nodesLoaded);
@@ -292,7 +292,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
292 292
293 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName }); 293 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
294 294
295 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false) 295 new InventoryArchiveReadRequest(UUID.Random(), scene.InventoryService, null, scene.AssetService, scene.UserAccountService, ua1, null, (Stream)null, false)
296 .ReplicateArchivePathToUserInventory( 296 .ReplicateArchivePathToUserInventory(
297 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 297 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
298 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>()); 298 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
@@ -343,7 +343,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
343 343
344 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName }); 344 string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
345 345
346 new InventoryArchiveReadRequest(scene.InventoryService, scene.AssetService, scene.UserAccountService, ua1, folder1ExistingName, (Stream)null, true) 346 new InventoryArchiveReadRequest(UUID.Random(), scene.InventoryService, null, scene.AssetService, scene.UserAccountService, ua1, folder1ExistingName, (Stream)null, true)
347 .ReplicateArchivePathToUserInventory( 347 .ReplicateArchivePathToUserInventory(
348 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID), 348 itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
349 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>()); 349 new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadTests.cs
index 1b521fc..3f16a16 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveLoadTests.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
72// TestHelpers.EnableLogging(); 72// TestHelpers.EnableLogging();
73 73
74 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaLL1, "password"); 74 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaLL1, "password");
75 m_archiverModule.DearchiveInventory(m_uaLL1.FirstName, m_uaLL1.LastName, "/", "password", m_iarStream); 75 m_archiverModule.DearchiveInventory(UUID.Random(), m_uaLL1.FirstName, m_uaLL1.LastName, "/", "password", m_iarStream);
76 76
77 InventoryItemBase coaItem 77 InventoryItemBase coaItem
78 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaLL1.PrincipalID, m_coaItemName); 78 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaLL1.PrincipalID, m_coaItemName);
@@ -106,8 +106,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
106// log4net.Config.XmlConfigurator.Configure(); 106// log4net.Config.XmlConfigurator.Configure();
107 107
108 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaLL1, "meowfood"); 108 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaLL1, "meowfood");
109 109
110 m_archiverModule.DearchiveInventory(m_uaLL1.FirstName, m_uaLL1.LastName, "/", "meowfood", m_iarStream); 110 m_archiverModule.DearchiveInventory(UUID.Random(), m_uaLL1.FirstName, m_uaLL1.LastName, "/", "meowfood", m_iarStream);
111 InventoryItemBase foundItem1 111 InventoryItemBase foundItem1
112 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaLL1.PrincipalID, m_item1Name); 112 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaLL1.PrincipalID, m_item1Name);
113 113
@@ -171,7 +171,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
171// log4net.Config.XmlConfigurator.Configure(); 171// log4net.Config.XmlConfigurator.Configure();
172 172
173 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaMT, "password"); 173 UserAccountHelpers.CreateUserWithInventory(m_scene, m_uaMT, "password");
174 m_archiverModule.DearchiveInventory(m_uaMT.FirstName, m_uaMT.LastName, "/", "password", m_iarStream); 174 m_archiverModule.DearchiveInventory(UUID.Random(), m_uaMT.FirstName, m_uaMT.LastName, "/", "password", m_iarStream);
175 175
176 InventoryItemBase foundItem1 176 InventoryItemBase foundItem1
177 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaMT.PrincipalID, m_item1Name); 177 = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, m_uaMT.PrincipalID, m_item1Name);
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
index 254aa11..4791a79 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveSaveTests.cs
@@ -85,8 +85,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
85 byte[] data = tar.ReadEntry(out filePath, out tarEntryType); 85 byte[] data = tar.ReadEntry(out filePath, out tarEntryType);
86 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH)); 86 Assert.That(filePath, Is.EqualTo(ArchiveConstants.CONTROL_FILE_PATH));
87 87
88 InventoryArchiveReadRequest iarr 88 InventoryArchiveReadRequest iarr
89 = new InventoryArchiveReadRequest(null, null, null, null, null, (Stream)null, false); 89 = new InventoryArchiveReadRequest(UUID.Random(), null, null, null, null, null, null, (Stream)null, false);
90 iarr.LoadControlFile(filePath, data); 90 iarr.LoadControlFile(filePath, data);
91 91
92 Assert.That(iarr.ControlFileLoaded, Is.True); 92 Assert.That(iarr.ControlFileLoaded, Is.True);
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs
index cc746d5..e2d95da 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiveTestCase.cs
@@ -170,7 +170,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
170 170
171 protected void SaveCompleted( 171 protected void SaveCompleted(
172 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, 172 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream,
173 Exception reportedException) 173 Exception reportedException, int SaveCount, int FilterCount)
174 { 174 {
175 mre.Set(); 175 mre.Set();
176 } 176 }
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
index d10c9b4..4d4720d 100644
--- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
@@ -176,7 +176,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
176 m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName); 176 m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
177 simpleName = GetInventoryPathFromName(simpleName); 177 simpleName = GetInventoryPathFromName(simpleName);
178 178
179 InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, simpleName, iarFileName, false); 179 InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(UUID.Random(), m_MockScene.InventoryService, null, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, simpleName, iarFileName, false);
180 try 180 try
181 { 181 {
182 HashSet<InventoryNodeBase> nodes = archread.Execute(); 182 HashSet<InventoryNodeBase> nodes = archread.Execute();
@@ -185,7 +185,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library
185 // didn't find the subfolder with the given name; place it on the top 185 // didn't find the subfolder with the given name; place it on the top
186 m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName); 186 m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
187 archread.Close(); 187 archread.Close();
188 archread = new InventoryArchiveReadRequest(m_MockScene.InventoryService, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, "/", iarFileName, false); 188 archread = new InventoryArchiveReadRequest(UUID.Random(), m_MockScene.InventoryService, null, m_MockScene.AssetService, m_MockScene.UserAccountService, uinfo, "/", iarFileName, false);
189 archread.Execute(); 189 archread.Execute();
190 } 190 }
191 191
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
index 54251a4..0795589 100644
--- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
@@ -42,8 +42,24 @@ namespace OpenSim.Region.Framework.Interfaces
42 /// <param name="invPath">The inventory path saved</param> 42 /// <param name="invPath">The inventory path saved</param>
43 /// <param name="savePath">The stream to which the archive was saved</param> 43 /// <param name="savePath">The stream to which the archive was saved</param>
44 /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> 44 /// <param name="reportedException">Contains the exception generated if the save did not succeed</param>
45 /// <param name="SaveCount">Number of inventory items saved to archive</param>
46 /// <param name="FilterCount">Number of inventory items skipped due to perm filter option</param>
45 public delegate void InventoryArchiveSaved( 47 public delegate void InventoryArchiveSaved(
46 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException); 48 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException, int SaveCount, int FilterCount);
49
50 /// <summary>
51 /// Used for the OnInventoryArchiveLoaded event.
52 /// </summary>
53 /// <param name="id">Request id</param>
54 /// <param name="succeeded">true if the load succeeded, false otherwise</param>
55 /// <param name="userInfo">The user for whom the load was conducted</param>
56 /// <param name="invPath">The inventory path loaded</param>
57 /// <param name="savePath">The stream from which the archive was loaded</param>
58 /// <param name="reportedException">Contains the exception generated if the load did not succeed</param>
59 /// <param name="LoadCount">Number of inventory items loaded from archive</param>
60 public delegate void InventoryArchiveLoaded(
61 UUID id, bool succeeded, UserAccount userInfo, string invPath, Stream loadStream, Exception reportedException, int LoadCount);
62
47 63
48 public interface IInventoryArchiverModule 64 public interface IInventoryArchiverModule
49 { 65 {
@@ -53,6 +69,11 @@ namespace OpenSim.Region.Framework.Interfaces
53 event InventoryArchiveSaved OnInventoryArchiveSaved; 69 event InventoryArchiveSaved OnInventoryArchiveSaved;
54 70
55 /// <summary> 71 /// <summary>
72 /// Fired when an archive inventory load has been completed.
73 /// </summary>
74 event InventoryArchiveLoaded OnInventoryArchiveLoaded;
75
76 /// <summary>
56 /// Dearchive a user's inventory folder from the given stream 77 /// Dearchive a user's inventory folder from the given stream
57 /// </summary> 78 /// </summary>
58 /// <param name="firstName"></param> 79 /// <param name="firstName"></param>
@@ -60,7 +81,7 @@ namespace OpenSim.Region.Framework.Interfaces
60 /// <param name="invPath">The inventory path in which to place the loaded folders and items</param> 81 /// <param name="invPath">The inventory path in which to place the loaded folders and items</param>
61 /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> 82 /// <param name="loadStream">The stream from which the inventory archive will be loaded</param>
62 /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> 83 /// <returns>true if the first stage of the operation succeeded, false otherwise</returns>
63 bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream); 84 bool DearchiveInventory(UUID id, string firstName, string lastName, string invPath, string pass, Stream loadStream);
64 85
65 /// <summary> 86 /// <summary>
66 /// Dearchive a user's inventory folder from the given stream 87 /// Dearchive a user's inventory folder from the given stream
@@ -73,7 +94,7 @@ namespace OpenSim.Region.Framework.Interfaces
73 /// the loaded IAR with existing folders where possible.</param> 94 /// the loaded IAR with existing folders where possible.</param>
74 /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> 95 /// <returns>true if the first stage of the operation succeeded, false otherwise</returns>
75 bool DearchiveInventory( 96 bool DearchiveInventory(
76 string firstName, string lastName, string invPath, string pass, Stream loadStream, 97 UUID id, string firstName, string lastName, string invPath, string pass, Stream loadStream,
77 Dictionary<string, object> options); 98 Dictionary<string, object> options);
78 99
79 /// <summary> 100 /// <summary>