aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs23
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs64
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs4
3 files changed, 58 insertions, 33 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index d8234bc..7189e36 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -170,14 +170,27 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
170 int failedAssetRestores = 0; 170 int failedAssetRestores = 0;
171 int successfulItemRestores = 0; 171 int successfulItemRestores = 0;
172 List<InventoryNodeBase> nodesLoaded = new List<InventoryNodeBase>(); 172 List<InventoryNodeBase> nodesLoaded = new List<InventoryNodeBase>();
173 173
174 if (!m_userInfo.HasReceivedInventory) 174 if (!m_userInfo.HasReceivedInventory)
175 { 175 {
176 m_log.ErrorFormat( 176 // If the region server has access to the user admin service (by which users are created),
177 "[INVENTORY ARCHIVER]: Have not yet received inventory info for user {0} {1}", 177 // then we'll assume that it's okay to fiddle with the user's inventory even if they are not on the
178 m_userInfo.UserProfile.Name, m_userInfo.UserProfile.ID); 178 // server.
179 //
180 // FIXME: FetchInventory should probably be assumed to by async anyway, since even standalones might
181 // use a remote inventory service, though this is vanishingly rare at the moment.
182 if (null == commsManager.UserAdminService)
183 {
184 m_log.ErrorFormat(
185 "[INVENTORY ARCHIVER]: Have not yet received inventory info for user {0} {1}",
186 m_userInfo.UserProfile.Name, m_userInfo.UserProfile.ID);
179 187
180 return nodesLoaded; 188 return nodesLoaded;
189 }
190 else
191 {
192 m_userInfo.FetchInventory();
193 }
181 } 194 }
182 195
183 InventoryFolderImpl inventoryFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath); 196 InventoryFolderImpl inventoryFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath);
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index c00c80f..d916eba 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -183,42 +183,54 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
183 InventoryFolderImpl inventoryFolder = null; 183 InventoryFolderImpl inventoryFolder = null;
184 InventoryItemBase inventoryItem = null; 184 InventoryItemBase inventoryItem = null;
185 185
186 if (m_userInfo.HasReceivedInventory) 186 if (!m_userInfo.HasReceivedInventory)
187 { 187 {
188 // Eliminate double slashes and any leading / on the path. This might be better done within InventoryFolderImpl 188 // If the region server has access to the user admin service (by which users are created),
189 // itself (possibly at a small loss in efficiency). 189 // then we'll assume that it's okay to fiddle with the user's inventory even if they are not on the
190 string[] components 190 // server.
191 = m_invPath.Split(new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries); 191 //
192 m_invPath = String.Empty; 192 // FIXME: FetchInventory should probably be assumed to by async anyway, since even standalones might
193 foreach (string c in components) 193 // use a remote inventory service, though this is vanishingly rare at the moment.
194 if (null == commsManager.UserAdminService)
194 { 195 {
195 m_invPath += c + InventoryFolderImpl.PATH_DELIMITER; 196 m_log.ErrorFormat(
196 } 197 "[INVENTORY ARCHIVER]: Have not yet received inventory info for user {0} {1}",
198 m_userInfo.UserProfile.Name, m_userInfo.UserProfile.ID);
197 199
198 // Annoyingly Split actually returns the original string if the input string consists only of delimiters 200 return;
199 // Therefore if we still start with a / after the split, then we need the root folder
200 if (m_invPath.Length == 0)
201 {
202 inventoryFolder = m_userInfo.RootFolder;
203 } 201 }
204 else 202 else
205 { 203 {
206 m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER)); 204 m_userInfo.FetchInventory();
207 inventoryFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath);
208 } 205 }
206 }
207
208 // Eliminate double slashes and any leading / on the path. This might be better done within InventoryFolderImpl
209 // itself (possibly at a small loss in efficiency).
210 string[] components
211 = m_invPath.Split(new string[] { InventoryFolderImpl.PATH_DELIMITER }, StringSplitOptions.RemoveEmptyEntries);
212 m_invPath = String.Empty;
213 foreach (string c in components)
214 {
215 m_invPath += c + InventoryFolderImpl.PATH_DELIMITER;
216 }
209 217
210 // The path may point to an item instead 218 // Annoyingly Split actually returns the original string if the input string consists only of delimiters
211 if (inventoryFolder == null) 219 // Therefore if we still start with a / after the split, then we need the root folder
212 { 220 if (m_invPath.Length == 0)
213 inventoryItem = m_userInfo.RootFolder.FindItemByPath(m_invPath); 221 {
214 } 222 inventoryFolder = m_userInfo.RootFolder;
215 } 223 }
216 else 224 else
217 { 225 {
218 m_log.ErrorFormat( 226 m_invPath = m_invPath.Remove(m_invPath.LastIndexOf(InventoryFolderImpl.PATH_DELIMITER));
219 "[INVENTORY ARCHIVER]: Have not yet received inventory info for user {0} {1}", 227 inventoryFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath);
220 m_userInfo.UserProfile.Name, m_userInfo.UserProfile.ID); 228 }
221 return; 229
230 // The path may point to an item instead
231 if (inventoryFolder == null)
232 {
233 inventoryItem = m_userInfo.RootFolder.FindItemByPath(m_invPath);
222 } 234 }
223 235
224 if (null == inventoryFolder) 236 if (null == inventoryFolder)
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index 82ea6cf..7660546 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -66,11 +66,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
66 private CommunicationsManager m_commsManager; 66 private CommunicationsManager m_commsManager;
67 67
68 public void Initialise(Scene scene, IConfigSource source) 68 public void Initialise(Scene scene, IConfigSource source)
69 { 69 {
70 if (m_scenes.Count == 0) 70 if (m_scenes.Count == 0)
71 { 71 {
72 scene.RegisterModuleInterface<IInventoryArchiverModule>(this); 72 scene.RegisterModuleInterface<IInventoryArchiverModule>(this);
73 m_commsManager = scene.CommsManager; 73 m_commsManager = scene.CommsManager;
74 74
75 scene.AddCommand( 75 scene.AddCommand(
76 this, "load iar", 76 this, "load iar",