From 72bd68a21f916db918aeb3dd60a1f391e41ed7c2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 Jun 2010 22:17:23 +0100 Subject: [PATCH 1/6] add ability for load iar/save iar to take in arbitrary options not used for anything yet --- .../Archiver/InventoryArchiverModule.cs | 65 +++++++++++++------ .../Interfaces/IInventoryArchiverModule.cs | 29 +++++++++ 2 files changed, 75 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index ab5f485660..cfefbe9d3b 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs @@ -30,11 +30,11 @@ using System.Collections.Generic; using System.IO; using System.Reflection; using log4net; +using NDesk.Options; using Nini.Config; using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; - using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; @@ -91,9 +91,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver scene.AddCommand( this, "load iar", - "load iar []", + "load iar []", + //"load iar [--merge] []", "Load user inventory archive (IAR).", - " is user's first name." + Environment.NewLine + //"--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones" + //+ " is user's first name." + Environment.NewLine + " is user's first name." + Environment.NewLine + " is user's last name." + Environment.NewLine + " is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine + " is the user's password." + Environment.NewLine @@ -133,8 +136,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver if (handlerInventoryArchiveSaved != null) handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); } + + public bool ArchiveInventory( + Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) + { + return ArchiveInventory(id, firstName, lastName, invPath, pass, saveStream, new Dictionary()); + } - public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) + public bool ArchiveInventory( + Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, + Dictionary options) { if (m_scenes.Count > 0) { @@ -172,7 +183,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, string savePath) + public bool ArchiveInventory( + Guid id, string firstName, string lastName, string invPath, string pass, string savePath, + Dictionary options) { if (m_scenes.Count > 0) { @@ -209,8 +222,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - + public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream) + { + return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary()); + } + + public bool DearchiveInventory( + string firstName, string lastName, string invPath, string pass, Stream loadStream, + Dictionary options) { if (m_scenes.Count > 0) { @@ -252,7 +272,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver return false; } - public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, string loadPath) + public bool DearchiveInventory( + string firstName, string lastName, string invPath, string pass, string loadPath, + Dictionary options) { if (m_scenes.Count > 0) { @@ -300,29 +322,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// protected void HandleLoadInvConsoleCommand(string module, string[] cmdparams) { - if (cmdparams.Length < 6) + m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); + + Dictionary options = new Dictionary(); + OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); + + List mainParams = optionSet.Parse(cmdparams); + + if (mainParams.Count < 6) { m_log.Error( "[INVENTORY ARCHIVER]: usage is load iar []"); return; - } + } - m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); - - string firstName = cmdparams[2]; - string lastName = cmdparams[3]; - string invPath = cmdparams[4]; - string pass = cmdparams[5]; - string loadPath = (cmdparams.Length > 6 ? cmdparams[6] : DEFAULT_INV_BACKUP_FILENAME); + string firstName = mainParams[2]; + string lastName = mainParams[3]; + string invPath = mainParams[4]; + string pass = mainParams[5]; + string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); m_log.InfoFormat( "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", loadPath, invPath, firstName, lastName); - if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath)) + if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) m_log.InfoFormat( "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", - loadPath, firstName, lastName); + loadPath, firstName, lastName); } /// @@ -351,7 +378,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver savePath, invPath, firstName, lastName); Guid id = Guid.NewGuid(); - ArchiveInventory(id, firstName, lastName, invPath, pass, savePath); + ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary()); lock (m_pendingConsoleSaves) m_pendingConsoleSaves.Add(id); diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index fbadd91b20..01066e6ab1 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs @@ -26,6 +26,7 @@ */ using System; +using System.Collections.Generic; using System.IO; using OpenSim.Services.Interfaces; @@ -59,6 +60,20 @@ namespace OpenSim.Region.Framework.Interfaces /// The stream from which the inventory archive will be loaded /// true if the first stage of the operation succeeded, false otherwise bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream); + + /// + /// Dearchive a user's inventory folder from the given stream + /// + /// + /// + /// The inventory path in which to place the loaded folders and items + /// The stream from which the inventory archive will be loaded + /// Dearchiving options. At the moment, the only option is ("merge", true). This merges + /// the loaded IAR with existing folders where possible. + /// true if the first stage of the operation succeeded, false otherwise + bool DearchiveInventory( + string firstName, string lastName, string invPath, string pass, Stream loadStream, + Dictionary options); /// /// Archive a user's inventory folder to the given stream @@ -70,5 +85,19 @@ namespace OpenSim.Region.Framework.Interfaces /// The stream to which the inventory archive will be saved /// true if the first stage of the operation succeeded, false otherwise bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream); + + /// + /// Archive a user's inventory folder to the given stream + /// + /// ID representing this request. This will later be returned in the save event + /// + /// + /// The inventory path from which the inventory should be saved. + /// The stream to which the inventory archive will be saved + /// Archiving options. Currently, there are none. + /// true if the first stage of the operation succeeded, false otherwise + bool ArchiveInventory( + Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, + Dictionary options); } } From 3c3df9f3e9fbf9955c0939116e9bfeed1d429fa6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 4 Jun 2010 23:34:42 +0100 Subject: [PATCH 2/6] refactor: do pathname trimming outside of ReplicateArchivePathToUserInventory() --- .../Archiver/InventoryArchiveReadRequest.cs | 17 +++++++---------- .../Archiver/Tests/InventoryArchiverTests.cs | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index 806aa4f155..256a886877 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -139,10 +139,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver } else if (filePath.StartsWith(ArchiveConstants.INVENTORY_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, TarArchiveReader.TarEntryType.TYPE_DIRECTORY == entryType, - rootDestinationFolder, foldersCreated, nodesLoaded); + filePath, rootDestinationFolder, foldersCreated, nodesLoaded); if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) { @@ -184,7 +189,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// Replicate the inventory paths in the archive to the user's inventory as necessary. /// /// The item archive path to replicate - /// Is the path we're dealing with a directory? /// The root folder for the inventory load /// /// The folders created so far. This method will add more folders if necessary @@ -196,17 +200,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// The last user inventory folder created or found for the archive path public InventoryFolderBase ReplicateArchivePathToUserInventory( string archivePath, - bool isDir, InventoryFolderBase rootDestFolder, Dictionary foldersCreated, List nodesLoaded) { - archivePath = archivePath.Substring(ArchiveConstants.INVENTORY_PATH.Length); - - // Remove the file portion if we aren't already dealing with a directory path - if (!isDir) - archivePath = archivePath.Remove(archivePath.LastIndexOf("/") + 1); - string originalArchivePath = archivePath; // m_log.DebugFormat( diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index 507662fd73..cb6bf76b87 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs @@ -531,7 +531,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null) .ReplicateArchivePathToUserInventory( - itemArchivePath, false, scene.InventoryService.GetRootFolder(ua1.PrincipalID), + itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID), foldersCreated, nodesLoaded); InventoryFolderBase folder1 From 63797445be561730e7d117573813ca12c02bc6f1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 5 Jun 2010 00:48:33 +0100 Subject: [PATCH 3/6] various refactorings on methods to replicate IAR paths to user inventory in order to improve readability --- .../Archiver/InventoryArchiveReadRequest.cs | 262 ++++++++++-------- .../Archiver/Tests/InventoryArchiverTests.cs | 2 +- 2 files changed, 155 insertions(+), 109 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index 256a886877..60d1720ba7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs @@ -97,9 +97,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver int successfulAssetRestores = 0; int failedAssetRestores = 0; int successfulItemRestores = 0; - List nodesLoaded = new List(); + + List loadedNodes = new List(); - //InventoryFolderImpl rootDestinationFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath); InventoryFolderBase rootDestinationFolder = InventoryArchiveUtils.FindFolderByPath( m_scene.InventoryService, m_userInfo.PrincipalID, m_invPath); @@ -109,14 +109,14 @@ 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 nodesLoaded; + return loadedNodes; } archive = new TarArchiveReader(m_loadStream); // In order to load identically named folders, we need to keep track of the folders that we have already - // created - Dictionary foldersCreated = new Dictionary(); + // resolved + Dictionary resolvedFolders = new Dictionary(); byte[] data; TarArchiveReader.TarEntryType entryType; @@ -147,7 +147,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver InventoryFolderBase foundFolder = ReplicateArchivePathToUserInventory( - filePath, rootDestinationFolder, foldersCreated, nodesLoaded); + filePath, rootDestinationFolder, resolvedFolders, loadedNodes); if (TarArchiveReader.TarEntryType.TYPE_DIRECTORY != entryType) { @@ -160,7 +160,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver // If we're loading an item directly into the given destination folder then we need to record // it separately from any loaded root folders if (rootDestinationFolder == foundFolder) - nodesLoaded.Add(item); + loadedNodes.Add(item); } } } @@ -176,7 +176,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver successfulAssetRestores, failedAssetRestores); m_log.InfoFormat("[INVENTORY ARCHIVER]: Successfully loaded {0} items", successfulItemRestores); - return nodesLoaded; + return loadedNodes; } public void Close() @@ -190,117 +190,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver /// /// The item archive path to replicate /// The root folder for the inventory load - /// - /// The folders created so far. This method will add more folders if necessary + /// + /// The folders that we have resolved so far for a given archive path. + /// This method will add more folders if necessary /// - /// - /// Track the inventory nodes created. This is distinct from the folders created since for a particular folder - /// chain, only the root node needs to be recorded + /// + /// Track the inventory nodes created. /// /// The last user inventory folder created or found for the archive path public InventoryFolderBase ReplicateArchivePathToUserInventory( string archivePath, InventoryFolderBase rootDestFolder, - Dictionary foldersCreated, - List nodesLoaded) + Dictionary resolvedFolders, + List loadedNodes) { string originalArchivePath = archivePath; // m_log.DebugFormat( // "[INVENTORY ARCHIVER]: Loading folder {0} {1}", rootDestFolder.Name, rootDestFolder.ID); - - InventoryFolderBase destFolder = null; - - // XXX: Nasty way of dealing with a path that has no directory component - if (archivePath.Length > 0) - { - while (null == destFolder && archivePath.Length > 0) - { - if (foldersCreated.ContainsKey(archivePath)) - { -// m_log.DebugFormat( -// "[INVENTORY ARCHIVER]: Found previously created folder from archive path {0}", archivePath); - destFolder = foldersCreated[archivePath]; - } - else - { - // Don't include the last slash - int penultimateSlashIndex = archivePath.LastIndexOf("/", archivePath.Length - 2); - - if (penultimateSlashIndex >= 0) - { - archivePath = archivePath.Remove(penultimateSlashIndex + 1); - } - else - { - m_log.DebugFormat( - "[INVENTORY ARCHIVER]: Found no previously created folder for archive path {0}", - originalArchivePath); - archivePath = string.Empty; - destFolder = rootDestFolder; - } - } - } - } - else - { - destFolder = rootDestFolder; - } - + + InventoryFolderBase destFolder = ResolveDestinationFolder(rootDestFolder, ref archivePath, resolvedFolders); + +// m_log.DebugFormat( +// "[INVENTORY ARCHIVER]: originalArchivePath [{0}], section already loaded [{1}]", +// originalArchivePath, archivePath); + string archivePathSectionToCreate = originalArchivePath.Substring(archivePath.Length); - string[] rawDirsToCreate - = archivePathSectionToCreate.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - int i = 0; - - while (i < rawDirsToCreate.Length) - { - m_log.DebugFormat("[INVENTORY ARCHIVER]: Loading archived folder {0}", rawDirsToCreate[i]); - - int identicalNameIdentifierIndex - = rawDirsToCreate[i].LastIndexOf( - ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); - - if (identicalNameIdentifierIndex < 0) - { - i++; - continue; - } - string newFolderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); - - newFolderName = InventoryArchiveUtils.UnescapeArchivePath(newFolderName); - UUID newFolderId = UUID.Random(); - - // Asset type has to be Unknown here rather than Folder, otherwise the created folder can't be - // deleted once the client has relogged. - // The root folder appears to be labelled AssetType.Folder (shows up as "Category" in the client) - // even though there is a AssetType.RootCategory - destFolder - = new InventoryFolderBase( - newFolderId, newFolderName, m_userInfo.PrincipalID, - (short)AssetType.Unknown, destFolder.ID, 1); - m_scene.InventoryService.AddFolder(destFolder); - -// UUID newFolderId = UUID.Random(); -// m_scene.InventoryService.AddFolder( -// m_userInfo.CreateFolder( -// folderName, newFolderId, (ushort)AssetType.Folder, foundFolder.ID); - -// m_log.DebugFormat("[INVENTORY ARCHIVER]: Retrieving newly created folder {0}", folderName); -// foundFolder = foundFolder.GetChildFolder(newFolderId); -// m_log.DebugFormat( -// "[INVENTORY ARCHIVER]: Retrieved newly created folder {0} with ID {1}", -// foundFolder.Name, foundFolder.ID); - - // Record that we have now created this folder - archivePath += rawDirsToCreate[i] + "/"; - m_log.DebugFormat("[INVENTORY ARCHIVER]: Loaded archive path {0}", archivePath); - foldersCreated[archivePath] = destFolder; - - if (0 == i) - nodesLoaded.Add(destFolder); - - i++; - } + CreateFoldersForPath(destFolder, archivePathSectionToCreate, resolvedFolders, loadedNodes); return destFolder; @@ -339,6 +255,136 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver */ } + /// + /// Resolve a destination folder + /// + /// + /// We require here a root destination folder (usually the root of the user's inventory) and the archive + /// path. We also pass in a list of previously resolved folders in case we've found this one previously. + /// + /// + /// The item archive path to resolve. The portion of the path passed back is that + /// which corresponds to the resolved desintation folder. + /// + /// The root folder for the inventory load + /// + /// + /// The folders that we have resolved so far for a given archive path. + /// + /// + /// The folder in the user's inventory that matches best the archive path given. If no such folder was found + /// then the passed in root destination folder is returned. + /// + protected InventoryFolderBase ResolveDestinationFolder( + InventoryFolderBase rootDestFolder, + ref string archivePath, + Dictionary resolvedFolders) + { + string originalArchivePath = archivePath; + + InventoryFolderBase destFolder = null; + + if (archivePath.Length > 0) + { + while (null == destFolder && archivePath.Length > 0) + { + if (resolvedFolders.ContainsKey(archivePath)) + { +// m_log.DebugFormat( +// "[INVENTORY ARCHIVER]: Found previously created folder from archive path {0}", archivePath); + destFolder = resolvedFolders[archivePath]; + } + else + { + // Don't include the last slash so find the penultimate one + int penultimateSlashIndex = archivePath.LastIndexOf("/", archivePath.Length - 2); + + if (penultimateSlashIndex >= 0) + { + // Remove the last section of path so that we can see if we've already resolved the parent + archivePath = archivePath.Remove(penultimateSlashIndex + 1); + } + else + { + m_log.DebugFormat( + "[INVENTORY ARCHIVER]: Found no previously created folder for archive path {0}", + originalArchivePath); + archivePath = string.Empty; + destFolder = rootDestFolder; + } + } + } + } + + if (null == destFolder) + destFolder = rootDestFolder; + + return destFolder; + } + + /// + /// Create a set of folders for the given path. + /// + /// + /// The root folder from which the creation will take place. + /// + /// + /// The path to create + /// + /// + /// The folders that we have resolved so far for a given archive path. + /// + /// + /// Track the inventory nodes created. + /// + protected void CreateFoldersForPath( + InventoryFolderBase destFolder, string path, Dictionary resolvedFolders, + List loadedNodes) + { + string pathCreated = ""; + string[] rawDirsToCreate = path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); + int i = 0; + + while (i < rawDirsToCreate.Length) + { +// m_log.DebugFormat("[INVENTORY ARCHIVER]: Creating folder {0} from IAR", rawDirsToCreate[i]); + + int identicalNameIdentifierIndex + = rawDirsToCreate[i].LastIndexOf( + ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR); + + if (identicalNameIdentifierIndex < 0) + { + i++; + continue; + } + string newFolderName = rawDirsToCreate[i].Remove(identicalNameIdentifierIndex); + + newFolderName = InventoryArchiveUtils.UnescapeArchivePath(newFolderName); + UUID newFolderId = UUID.Random(); + + // Asset type has to be Unknown here rather than Folder, otherwise the created folder can't be + // deleted once the client has relogged. + // The root folder appears to be labelled AssetType.Folder (shows up as "Category" in the client) + // even though there is a AssetType.RootCategory + destFolder + = new InventoryFolderBase( + newFolderId, newFolderName, m_userInfo.PrincipalID, + (short)AssetType.Unknown, destFolder.ID, 1); + m_scene.InventoryService.AddFolder(destFolder); + + // Record that we have now created this folder + pathCreated += rawDirsToCreate[i] + "/"; + m_log.DebugFormat("[INVENTORY ARCHIVER]: Created folder {0} from IAR", pathCreated); + resolvedFolders[pathCreated] = destFolder; + + if (0 == i) + loadedNodes.Add(destFolder); + + i++; + } + } + /// /// Load an item from the archive /// @@ -429,4 +475,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver } } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index cb6bf76b87..59cd386c0c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs @@ -279,7 +279,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests public void TestIarV0_1WithEscapedChars() { TestHelper.InMethod(); -// log4net.Config.XmlConfigurator.Configure(); + log4net.Config.XmlConfigurator.Configure(); string itemName = "You & you are a mean/man/"; string humanEscapedItemName = @"You & you are a mean\/man\/"; From fe3e1c67aeb00097b2fcfb2c0c6828e9c49d7a9c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 5 Jun 2010 06:56:36 -0700 Subject: [PATCH 4/6] Bug fix: update the list of friends upon MakeRoot, because child agents don't get notified of new friendships. --- OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 0050653668..3590f27fe7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -267,7 +267,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (m_Friends.ContainsKey(agentID)) { - if (m_Friends[agentID].RegionID == UUID.Zero && m_Friends[agentID].Friends == null) + if (m_Friends[agentID].RegionID == UUID.Zero) { m_Friends[agentID].Friends = m_FriendsService.GetFriends(agentID); From ab3afd5f42593cb6f5475af36accdd1f01962fd1 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 5 Jun 2010 09:39:09 -0700 Subject: [PATCH 5/6] * Bug fix in TP home: typo in unpacking of GridUserInfo. * Bug fix in TPs across neighboring regions: bug was introduced when getting rid of crashed sessions. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 11 +++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++ .../Connectors/GridUser/GridUserServiceConnector.cs | 2 -- OpenSim/Services/Interfaces/IGridUserService.cs | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index ef37f63622..1e3e0c9423 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -410,6 +410,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer teleportFlags, capsPath); } + // Let's set this to true tentatively. This does not trigger OnChildAgent + sp.IsChildAgent = true; + // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation // that the client contacted the destination before we send the attachments and close things here. @@ -418,6 +421,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Client never contacted destination. Let's restore everything back sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); + // Fail. Reset it back + sp.IsChildAgent = false; + ResetFromTransit(sp.UUID); // Yikes! We should just have a ref to scene here. @@ -436,7 +442,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer KillEntity(sp.Scene, sp.LocalId); + // Now let's make it officially a child agent sp.MakeChildAgent(); + // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) @@ -538,6 +546,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer client.SendTeleportFailed("Your home region could not be found."); return; } + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: User's home region is {0} {1} ({2}-{3})", + regionInfo.RegionName, regionInfo.RegionID, regionInfo.RegionLocX / Constants.RegionSize, regionInfo.RegionLocY / Constants.RegionSize); + // a little eekie that this goes back to Scene and with a forced cast, will fix that at some point... ((Scene)(client.Scene)).RequestTeleportLocation( client, regionInfo.RegionHandle, uinfo.HomePosition, uinfo.HomeLookAt, diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6300665b29..3948f146e8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3990,7 +3990,9 @@ namespace OpenSim.Region.Framework.Scenes // bordercross if position is outside of region if (!result) + { regionHandle = m_regInfo.RegionHandle; + } else { // not in this region, undo the shift! diff --git a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs index 600ddfdaf0..935ebb1be5 100644 --- a/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs +++ b/OpenSim/Services/Connectors/GridUser/GridUserServiceConnector.cs @@ -206,9 +206,7 @@ namespace OpenSim.Services.Connectors if ((replyData != null) && replyData.ContainsKey("result") && (replyData["result"] != null)) { if (replyData["result"] is Dictionary) - { guinfo = new GridUserInfo((Dictionary)replyData["result"]); - } } return guinfo; diff --git a/OpenSim/Services/Interfaces/IGridUserService.cs b/OpenSim/Services/Interfaces/IGridUserService.cs index e629dffda4..95ce5e8fe7 100644 --- a/OpenSim/Services/Interfaces/IGridUserService.cs +++ b/OpenSim/Services/Interfaces/IGridUserService.cs @@ -65,7 +65,7 @@ namespace OpenSim.Services.Interfaces Vector3.TryParse(kvp["HomeLookAt"].ToString(), out HomeLookAt); if (kvp.ContainsKey("LastRegionID")) - UUID.TryParse(kvp["LastRegionID"].ToString(), out HomeRegionID); + UUID.TryParse(kvp["LastRegionID"].ToString(), out LastRegionID); if (kvp.ContainsKey("LastPosition")) Vector3.TryParse(kvp["LastPosition"].ToString(), out LastPosition); if (kvp.ContainsKey("LastLookAt")) From d91bd7646dc25e5e2ec20aaad596a168e0804436 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 7 Jun 2010 00:09:22 +0200 Subject: [PATCH 6/6] Add a call to SOG.ResumeScripts() after region crossing / teleport --- OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3948f146e8..2544359570 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2467,6 +2467,8 @@ namespace OpenSim.Region.Framework.Scenes newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1); + newObject.ResumeScripts(); + // Do this as late as possible so that listeners have full access to the incoming object EventManager.TriggerOnIncomingSceneObject(newObject);