From 5b103aab896eef4ca8d538d12728fdc1929e34d1 Mon Sep 17 00:00:00 2001 From: diva Date: Sun, 5 Apr 2009 22:39:19 +0000 Subject: Changed the asynchronous call to get inventory in HG, so that it properly reports problems. OGS1 should also be changed, but I'm leaving it as is for now. RestSessionObjectPosterResponse is fairly broken and should not be used. Minor changes in Get inventory item in HGAssetMapper. --- .../Communications/Hypergrid/HGInventoryService.cs | 68 ++++++++++++++++------ .../Framework/Interfaces/IInterregionComms.cs | 6 +- .../Framework/Scenes/Hypergrid/HGAssetMapper.cs | 35 +++++------ 3 files changed, 68 insertions(+), 41 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs b/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs index a2b2c84..5e3f229 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs +++ b/OpenSim/Region/Communications/Hypergrid/HGInventoryService.cs @@ -81,30 +81,22 @@ namespace OpenSim.Region.Communications.Hypergrid { m_RequestingInventory.Add(userID, callback); + string invServer = GetUserInventoryURI(userID); + m_log.InfoFormat( + "[HGrid INVENTORY SERVICE]: Requesting inventory from {0}/GetInventory/ for user {1} ({2})", + /*_inventoryServerUrl*/ invServer, userID, userID.Guid); + try { - string invServer = GetUserInventoryURI(userID); - m_log.InfoFormat( - "[HGrid INVENTORY SERVICE]: Requesting inventory from {0}/GetInventory/ for user {1} ({2})", - /*_inventoryServerUrl*/ invServer, userID, userID.Guid); - - - RestSessionObjectPosterResponse requester - = new RestSessionObjectPosterResponse(); - requester.ResponseCallback = InventoryResponse; - requester.BeginPostObject(invServer + "/GetInventory/", userID.Guid, session_id.ToString(), userID.ToString()); - - //Test(userID.Guid); - - //RestObjectPosterResponse requester - // = new RestObjectPosterResponse(); + //RestSessionObjectPosterResponse requester + // = new RestSessionObjectPosterResponse(); //requester.ResponseCallback = InventoryResponse; - //requester.BeginPostObject(/*_inventoryServerUrl*/ invServer + "/GetInventory/", userID.Guid); + //requester.BeginPostObject(invServer + "/GetInventory/", userID.Guid, session_id.ToString(), userID.ToString()); + GetInventoryDelegate d = GetInventoryAsync; + d.BeginInvoke(invServer, userID, session_id, GetInventoryCompleted, d); - //RestClient cli = new RestClient(invServer + "/GetInventory/" + userID.Guid); - //Stream reply = cli.Request(); } catch (WebException e) { @@ -133,6 +125,44 @@ namespace OpenSim.Region.Communications.Hypergrid } + private delegate InventoryCollection GetInventoryDelegate(string url, UUID userID, UUID sessionID); + + protected InventoryCollection GetInventoryAsync(string url, UUID userID, UUID sessionID) + { + InventoryCollection icol = null; + try + { + icol = SynchronousRestSessionObjectPoster.BeginPostObject("POST", url + "/GetInventory/", + userID.Guid, sessionID.ToString(), userID.ToString()); + + } + catch (Exception e) + { + m_log.Debug("[HGrid]: Exception getting users inventory: " + e.Message); + } + if (icol == null) + { + // Well, let's synthesize one + icol = new InventoryCollection(); + icol.UserID = userID; + icol.Items = new List(); + icol.Folders = new List(); + InventoryFolderBase rootFolder = new InventoryFolderBase(); + rootFolder.ID = UUID.Random(); + rootFolder.Owner = userID; + icol.Folders.Add(rootFolder); + } + + return icol; + } + + private void GetInventoryCompleted(IAsyncResult iar) + { + GetInventoryDelegate icon = (GetInventoryDelegate)iar.AsyncState; + InventoryCollection icol = icon.EndInvoke(iar); + InventoryResponse(icol); + } + /// /// Add a new folder to the user's inventory /// @@ -460,9 +490,9 @@ namespace OpenSim.Region.Communications.Hypergrid m_log.ErrorFormat("[HGrid INVENTORY SERVICE]: Did not get back an inventory containing a root folder for user {0}", userID); } + m_RequestingInventory.Remove(userID); callback(folders, items); - m_RequestingInventory.Remove(userID); } else { diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs index b57b5ed..b5a9395 100644 --- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs @@ -91,11 +91,11 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Create an object from the user's inventory in the destination region. - /// This message is used primarily for prim crossing. + /// This message is used primarily by clients. /// /// - /// - /// + /// + /// /// bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID); diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs index b192101..48ea519 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs +++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs @@ -333,29 +333,26 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo) { - if (!IsLocalUser(item.Owner)) + InventoryClient invCli = null; + string inventoryURL = UserInventoryURL(item.Owner); + if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli)) { - InventoryClient invCli = null; - string inventoryURL = UserInventoryURL(item.Owner); - if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli)) - { - m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL); - invCli = new InventoryClient(inventoryURL); - m_inventoryServers.Add(inventoryURL, invCli); - } + m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL); + invCli = new InventoryClient(inventoryURL); + m_inventoryServers.Add(inventoryURL, invCli); + } - item = invCli.GetInventoryItem(item); - if (item != null) + item = invCli.GetInventoryItem(item); + if (item != null) + { + // Change the folder, stick it in root folder, all items flattened out here in this region cache + item.Folder = rootFolder; + //userInfo.AddItem(item); don't use this, it calls back to the inventory server + lock (userInfo.RootFolder.Items) { - // Change the folder, stick it in root folder, all items flattened out here in this region cache - item.Folder = rootFolder; - //userInfo.AddItem(item); don't use this, it calls back to the inventory server - lock (userInfo.RootFolder.Items) - { - userInfo.RootFolder.Items[item.ID] = item; - } - + userInfo.RootFolder.Items[item.ID] = item; } + } return item; } -- cgit v1.1