diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs | 168 |
1 files changed, 90 insertions, 78 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index d794f00..4ad9974 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs | |||
@@ -200,11 +200,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
200 | TarArchiveReader.TarEntryType entryType; | 200 | TarArchiveReader.TarEntryType entryType; |
201 | while ((data = archive.ReadEntry(out filePath, out entryType)) != null) | 201 | while ((data = archive.ReadEntry(out filePath, out entryType)) != null) |
202 | { | 202 | { |
203 | if (entryType == TarArchiveReader.TarEntryType.TYPE_DIRECTORY) | 203 | if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) |
204 | { | ||
205 | m_log.WarnFormat("[INVENTORY ARCHIVER]: Ignoring directory entry {0}", filePath); | ||
206 | } | ||
207 | else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) | ||
208 | { | 204 | { |
209 | if (LoadAsset(filePath, data)) | 205 | if (LoadAsset(filePath, data)) |
210 | successfulAssetRestores++; | 206 | successfulAssetRestores++; |
@@ -212,24 +208,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
212 | failedAssetRestores++; | 208 | failedAssetRestores++; |
213 | } | 209 | } |
214 | else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH)) | 210 | else if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH)) |
215 | { | 211 | { |
216 | InventoryItemBase item = LoadInvItem(m_asciiEncoding.GetString(data)); | 212 | string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); |
217 | |||
218 | if (item != null) | ||
219 | { | ||
220 | // Don't use the item ID that's in the file | ||
221 | item.ID = UUID.Random(); | ||
222 | |||
223 | item.Creator = m_userInfo.UserProfile.ID; | ||
224 | item.Owner = m_userInfo.UserProfile.ID; | ||
225 | 213 | ||
226 | string fsPath = filePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); | 214 | // Remove the file portion if we aren't already dealing with a directory path |
215 | if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) | ||
227 | fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); | 216 | fsPath = fsPath.Remove(fsPath.LastIndexOf("/") + 1); |
228 | string originalFsPath = fsPath; | 217 | |
218 | string originalFsPath = fsPath; | ||
229 | 219 | ||
230 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); | 220 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading to folder {0}", fsPath); |
231 | 221 | ||
232 | InventoryFolderImpl foundFolder = null; | 222 | InventoryFolderImpl foundFolder = null; |
223 | |||
224 | // XXX: Nasty way of dealing with a path that has no directory component | ||
225 | if (fsPath.Length > 0) | ||
226 | { | ||
233 | while (null == foundFolder && fsPath.Length > 0) | 227 | while (null == foundFolder && fsPath.Length > 0) |
234 | { | 228 | { |
235 | if (foldersCreated.ContainsKey(fsPath)) | 229 | if (foldersCreated.ContainsKey(fsPath)) |
@@ -256,81 +250,99 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
256 | } | 250 | } |
257 | } | 251 | } |
258 | } | 252 | } |
253 | } | ||
254 | else | ||
255 | { | ||
256 | foundFolder = rootDestinationFolder; | ||
257 | } | ||
259 | 258 | ||
260 | string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); | 259 | string fsPathSectionToCreate = originalFsPath.Substring(fsPath.Length); |
261 | string[] rawDirsToCreate | 260 | string[] rawDirsToCreate |
262 | = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); | 261 | = fsPathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); |
263 | int i = 0; | 262 | int i = 0; |
264 | 263 | ||
265 | while (i < rawDirsToCreate.Length) | 264 | while (i < rawDirsToCreate.Length) |
266 | { | 265 | { |
267 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); | 266 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawDirsToCreate[i]); |
268 | 267 | ||
269 | int identicalNameIdentifierIndex | 268 | int identicalNameIdentifierIndex |
270 | = rawDirsToCreate[i].LastIndexOf( | 269 | = rawDirsToCreate[i].LastIndexOf( |
271 | ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); | 270 | ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); |
272 | string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); | 271 | string folderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); |
273 | 272 | ||
274 | UUID newFolderId = UUID.Random(); | 273 | UUID newFolderId = UUID.Random(); |
275 | m_userInfo.CreateFolder( | 274 | m_userInfo.CreateFolder( |
276 | folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); | 275 | folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); |
277 | foundFolder = foundFolder.GetChildFolder(newFolderId); | 276 | foundFolder = foundFolder.GetChildFolder(newFolderId); |
278 | 277 | ||
279 | // Record that we have now created this folder | 278 | // Record that we have now created this folder |
280 | fsPath += rawDirsToCreate[i] + "/"; | 279 | fsPath += rawDirsToCreate[i] + "/"; |
281 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); | 280 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Recording creation of fs path {0}", fsPath); |
282 | foldersCreated[fsPath] = foundFolder; | 281 | foldersCreated[fsPath] = foundFolder; |
283 | 282 | ||
284 | if (0 == i) | 283 | if (0 == i) |
285 | nodesLoaded.Add(foundFolder); | 284 | nodesLoaded.Add(foundFolder); |
286 | 285 | ||
287 | i++; | 286 | i++; |
288 | } | 287 | } |
289 | 288 | ||
290 | /* | 289 | /* |
291 | string[] rawFolders = filePath.Split(new char[] { '/' }); | 290 | string[] rawFolders = filePath.Split(new char[] { '/' }); |
292 | 291 | ||
293 | // Find the folders that do exist along the path given | 292 | // Find the folders that do exist along the path given |
294 | int i = 0; | 293 | int i = 0; |
295 | bool noFolder = false; | 294 | bool noFolder = false; |
296 | InventoryFolderImpl foundFolder = rootDestinationFolder; | 295 | InventoryFolderImpl foundFolder = rootDestinationFolder; |
297 | while (!noFolder && i < rawFolders.Length) | 296 | while (!noFolder && i < rawFolders.Length) |
297 | { | ||
298 | InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]); | ||
299 | if (null != folder) | ||
298 | { | 300 | { |
299 | InventoryFolderImpl folder = foundFolder.FindFolderByPath(rawFolders[i]); | 301 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name); |
300 | if (null != folder) | 302 | foundFolder = folder; |
301 | { | 303 | i++; |
302 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Found folder {0}", folder.Name); | ||
303 | foundFolder = folder; | ||
304 | i++; | ||
305 | } | ||
306 | else | ||
307 | { | ||
308 | noFolder = true; | ||
309 | } | ||
310 | } | 304 | } |
311 | 305 | else | |
312 | // Create any folders that did not previously exist | ||
313 | while (i < rawFolders.Length) | ||
314 | { | 306 | { |
315 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]); | 307 | noFolder = true; |
316 | |||
317 | UUID newFolderId = UUID.Random(); | ||
318 | m_userInfo.CreateFolder( | ||
319 | rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); | ||
320 | foundFolder = foundFolder.GetChildFolder(newFolderId); | ||
321 | } | 308 | } |
322 | */ | 309 | } |
323 | 310 | ||
324 | // Reset folder ID to the one in which we want to load it | 311 | // Create any folders that did not previously exist |
325 | item.Folder = foundFolder.ID; | 312 | while (i < rawFolders.Length) |
313 | { | ||
314 | m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0}", rawFolders[i]); | ||
326 | 315 | ||
327 | m_userInfo.AddItem(item); | 316 | UUID newFolderId = UUID.Random(); |
328 | successfulItemRestores++; | 317 | m_userInfo.CreateFolder( |
318 | rawFolders[i++], newFolderId, (ushort)AssetType.Folder, foundFolder.ID); | ||
319 | foundFolder = foundFolder.GetChildFolder(newFolderId); | ||
320 | } | ||
321 | */ | ||
329 | 322 | ||
330 | // If we're loading an item directly into the given destination folder then we need to record | 323 | if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) |
331 | // it separately from any loaded root folders | 324 | { |
332 | if (rootDestinationFolder == foundFolder) | 325 | InventoryItemBase item = LoadInvItem(m_asciiEncoding.GetString(data)); |
333 | nodesLoaded.Add(item); | 326 | |
327 | if (item != null) | ||
328 | { | ||
329 | // Don't use the item ID that's in the file | ||
330 | item.ID = UUID.Random(); | ||
331 | |||
332 | item.Creator = m_userInfo.UserProfile.ID; | ||
333 | item.Owner = m_userInfo.UserProfile.ID; | ||
334 | |||
335 | // Reset folder ID to the one in which we want to load it | ||
336 | item.Folder = foundFolder.ID; | ||
337 | |||
338 | m_userInfo.AddItem(item); | ||
339 | successfulItemRestores++; | ||
340 | |||
341 | // If we're loading an item directly into the given destination folder then we need to record | ||
342 | // it separately from any loaded root folders | ||
343 | if (rootDestinationFolder == foundFolder) | ||
344 | nodesLoaded.Add(item); | ||
345 | } | ||
334 | } | 346 | } |
335 | } | 347 | } |
336 | } | 348 | } |