From 3f9d38538e4d7f238eb901aced60de7e6673a92e Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 27 Apr 2010 11:01:56 -0700
Subject: XInventory connector/handler showing signs of life. Tested, but needs
more testing.
---
OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml | 1 +
.../ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs | 2 ++
2 files changed, 3 insertions(+)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index aaa318c..0a5ff3f 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -45,6 +45,7 @@
+
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index fb353c2..8504b67 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -183,6 +183,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
{
+ m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolderContent {0}", folderID);
try
{
return m_RemoteConnector.GetFolderContent(userID, folderID);
@@ -295,6 +296,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
{
+ m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolder {0}", folder.ID);
if (folder == null)
return null;
--
cgit v1.1
From 806a2555f557e7a05002f67731b1e3105c9aab8b Mon Sep 17 00:00:00 2001
From: unknown
Date: Sun, 25 Apr 2010 17:21:05 +0300
Subject: Spelling in FriendsModule.cs: "filed to load" -> "failed to load"
---
OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index 312db38..23d5b3c 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
if (m_FriendsService == null)
{
- m_log.Error("[FRIENDS]: No Connector defined in section Friends, or filed to load, cannot continue");
+ m_log.Error("[FRIENDS]: No Connector defined in section Friends, or failed to load, cannot continue");
throw new Exception("Connector load error");
}
--
cgit v1.1
From 6a4fae123ade98d53e7342309dfb52e254d4b5f2 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 29 Apr 2010 11:39:13 -0700
Subject: Started redoing HGInventoryBroker for XInventory and with
multi-protocol in mind. Unfinished.
---
.../Inventory/HGInventoryBroker2.cs | 589 +++++++++++++++++++++
.../Inventory/InventoryCache.cs | 51 ++
.../Inventory/RemoteXInventoryServiceConnector.cs | 5 +
3 files changed, 645 insertions(+)
create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs
(limited to 'OpenSim/Region/CoreModules')
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs
new file mode 100644
index 0000000..22aac02
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs
@@ -0,0 +1,589 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using log4net;
+using Nini.Config;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using OpenSim.Framework;
+
+using OpenSim.Server.Base;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using OpenSim.Services.Connectors;
+using OpenMetaverse;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
+{
+ public class HGInventoryBroker2 : BaseInventoryConnector, INonSharedRegionModule, IInventoryService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ private static bool m_Initialized = false;
+ private static bool m_Enabled = false;
+
+ private static IInventoryService m_LocalGridInventoryService;
+ private static ISessionAuthInventoryService m_HGService; // obsolete
+ private Dictionary m_connectors = new Dictionary();
+
+
+ private Scene m_Scene;
+ private IUserAccountService m_UserAccountService;
+
+ public Type ReplaceableInterface
+ {
+ get { return null; }
+ }
+
+ public string Name
+ {
+ get { return "HGInventoryBroker2"; }
+ }
+
+ public void Initialise(IConfigSource source)
+ {
+ if (!m_Initialized)
+ {
+ IConfig moduleConfig = source.Configs["Modules"];
+ if (moduleConfig != null)
+ {
+ string name = moduleConfig.GetString("InventoryServices", "");
+ if (name == Name)
+ {
+ IConfig inventoryConfig = source.Configs["InventoryService"];
+ if (inventoryConfig == null)
+ {
+ m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
+ return;
+ }
+
+ string localDll = inventoryConfig.GetString("LocalGridInventoryService",
+ String.Empty);
+ string HGDll = inventoryConfig.GetString("HypergridInventoryService",
+ String.Empty);
+
+ if (localDll == String.Empty)
+ {
+ m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService");
+ //return;
+ throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
+ }
+
+ if (HGDll == String.Empty)
+ {
+ m_log.Error("[HG INVENTORY CONNECTOR]: No HypergridInventoryService named in section InventoryService");
+ //return;
+ throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
+ }
+
+ Object[] args = new Object[] { source };
+ m_LocalGridInventoryService =
+ ServerUtils.LoadPlugin(localDll,
+ args);
+
+ m_HGService =
+ ServerUtils.LoadPlugin(HGDll,
+ args);
+
+ if (m_LocalGridInventoryService == null)
+ {
+ m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service");
+ return;
+ }
+ if (m_HGService == null)
+ {
+ m_log.Error("[HG INVENTORY CONNECTOR]: Can't load hypergrid inventory service");
+ return;
+ }
+
+ Init(source);
+
+ m_Enabled = true;
+ m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled");
+ }
+ }
+ m_Initialized = true;
+ }
+ }
+
+ public void PostInitialise()
+ {
+ }
+
+ public void Close()
+ {
+ }
+
+ public void AddRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_Scene = scene;
+ m_UserAccountService = m_Scene.UserAccountService;
+
+ scene.RegisterModuleInterface(this);
+ m_cache.AddRegion(scene);
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_cache.RemoveRegion(scene);
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName);
+
+ }
+
+
+ #region IInventoryService
+
+ public override bool CreateUserInventory(UUID userID)
+ {
+ return m_LocalGridInventoryService.CreateUserInventory(userID);
+ }
+
+ public override List GetInventorySkeleton(UUID userId)
+ {
+ return m_LocalGridInventoryService.GetInventorySkeleton(userId);
+ }
+
+ public override InventoryCollection GetUserInventory(UUID userID)
+ {
+ return null;
+ }
+
+ public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback)
+ {
+ }
+
+ // Inherited. See base
+ //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
+ //{
+ // if (IsLocalGridUser(userID))
+ // return m_GridService.GetFolderForType(userID, type);
+ // else
+ // {
+ // UUID sessionID = GetSessionID(userID);
+ // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
+ // // !!!!!!
+ // return null;
+ // //return m_HGService.GetFolderForType(uri, sessionID, type);
+ // }
+ //}
+
+ public override InventoryCollection GetFolderContent(UUID userID, UUID folderID)
+ {
+ m_log.Debug("[HGInventory]: GetFolderContent " + folderID);
+ string url = string.Empty;
+
+ string invURL = m_cache.GetInventoryServiceURL(userID);
+
+ if (invURL == null) // not there, forward to local inventory connector to resolve
+ return m_LocalGridInventoryService.GetFolderContent(userID, folderID);
+
+ IInventoryService connector = GetConnector(url);
+ return connector.GetFolderContent(userID, folderID);
+
+ //if (StringToUrlAndUserID(id, out url, out userID))
+ //{
+ // ISessionAuthInventoryService connector = GetConnector(url);
+ // return connector.GetFolderContent(userID, folderID, sessionID);
+ //}
+
+ //return null;
+
+ //////////
+
+ //string uri = string.Empty;
+ //if (!IsForeignUser(userID, out uri))
+ // return m_GridService.GetFolderContent(userID, folderID);
+ //else
+ //{
+ // UUID sessionID = GetSessionID(userID);
+ // uri = uri + "/" + userID.ToString();
+ // return m_HGService.GetFolderContent(uri, folderID, sessionID);
+ //}
+ }
+
+ public override Dictionary GetSystemFolders(UUID userID)
+ {
+ string uri = string.Empty;
+ if (!IsForeignUser(userID, out uri))
+ {
+ // This is not pretty, but it will have to do for now
+ if (m_LocalGridInventoryService is BaseInventoryConnector)
+ {
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module");
+ return ((BaseInventoryConnector)m_LocalGridInventoryService).GetSystemFolders(userID);
+ }
+ else
+ {
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal");
+ return GetSystemFoldersLocal(userID);
+ }
+ }
+ else
+ {
+ UUID sessionID = GetSessionID(userID);
+ uri = uri + "/" + userID.ToString();
+ return m_HGService.GetSystemFolders(uri, sessionID);
+ }
+ }
+
+ private Dictionary GetSystemFoldersLocal(UUID userID)
+ {
+ InventoryFolderBase root = m_LocalGridInventoryService.GetRootFolder(userID);
+ if (root != null)
+ {
+ InventoryCollection content = m_LocalGridInventoryService.GetFolderContent(userID, root.ID);
+ if (content != null)
+ {
+ Dictionary folders = new Dictionary();
+ foreach (InventoryFolderBase folder in content.Folders)
+ {
+ //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type);
+ if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
+ folders[(AssetType)folder.Type] = folder;
+ }
+ // Put the root folder there, as type Folder
+ folders[AssetType.Folder] = root;
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count);
+ return folders;
+ }
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID);
+
+ }
+
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID);
+
+ return new Dictionary();
+ }
+
+ public override List GetFolderItems(UUID userID, UUID folderID)
+ {
+ string uri = string.Empty;
+ if (!IsForeignUser(userID, out uri))
+ return m_LocalGridInventoryService.GetFolderItems(userID, folderID);
+ else
+ {
+ UUID sessionID = GetSessionID(userID);
+ uri = uri + "/" + userID.ToString();
+ return m_HGService.GetFolderItems(uri, folderID, sessionID);
+ }
+ }
+
+ public override bool AddFolder(InventoryFolderBase folder)
+ {
+ if (folder == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(folder.Owner, out uri))
+ return m_LocalGridInventoryService.AddFolder(folder);
+ else
+ {
+ UUID sessionID = GetSessionID(folder.Owner);
+ uri = uri + "/" + folder.Owner.ToString();
+ return m_HGService.AddFolder(uri, folder, sessionID);
+ }
+ }
+
+ public override bool UpdateFolder(InventoryFolderBase folder)
+ {
+ if (folder == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(folder.Owner, out uri))
+ return m_LocalGridInventoryService.UpdateFolder(folder);
+ else
+ {
+ UUID sessionID = GetSessionID(folder.Owner);
+ uri = uri + "/" + folder.Owner.ToString();
+ return m_HGService.UpdateFolder(uri, folder, sessionID);
+ }
+ }
+
+ public override bool DeleteFolders(UUID ownerID, List folderIDs)
+ {
+ if (folderIDs == null)
+ return false;
+ if (folderIDs.Count == 0)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(ownerID, out uri))
+ return m_LocalGridInventoryService.DeleteFolders(ownerID, folderIDs);
+ else
+ {
+ UUID sessionID = GetSessionID(ownerID);
+ uri = uri + "/" + ownerID.ToString();
+ return m_HGService.DeleteFolders(uri, folderIDs, sessionID);
+ }
+ }
+
+ public override bool MoveFolder(InventoryFolderBase folder)
+ {
+ if (folder == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(folder.Owner, out uri))
+ return m_LocalGridInventoryService.MoveFolder(folder);
+ else
+ {
+ UUID sessionID = GetSessionID(folder.Owner);
+ uri = uri + "/" + folder.Owner.ToString();
+ return m_HGService.MoveFolder(uri, folder, sessionID);
+ }
+ }
+
+ public override bool PurgeFolder(InventoryFolderBase folder)
+ {
+ if (folder == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(folder.Owner, out uri))
+ return m_LocalGridInventoryService.PurgeFolder(folder);
+ else
+ {
+ UUID sessionID = GetSessionID(folder.Owner);
+ uri = uri + "/" + folder.Owner.ToString();
+ return m_HGService.PurgeFolder(uri, folder, sessionID);
+ }
+ }
+
+ // public bool AddItem(InventoryItemBase item) inherited
+ // Uses AddItemPlain
+
+ protected override bool AddItemPlain(InventoryItemBase item)
+ {
+ if (item == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(item.Owner, out uri))
+ {
+ return m_LocalGridInventoryService.AddItem(item);
+ }
+ else
+ {
+ UUID sessionID = GetSessionID(item.Owner);
+ uri = uri + "/" + item.Owner.ToString();
+ return m_HGService.AddItem(uri, item, sessionID);
+ }
+ }
+
+ public override bool UpdateItem(InventoryItemBase item)
+ {
+ if (item == null)
+ return false;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(item.Owner, out uri))
+ return m_LocalGridInventoryService.UpdateItem(item);
+ else
+ {
+ UUID sessionID = GetSessionID(item.Owner);
+ uri = uri + "/" + item.Owner.ToString();
+ return m_HGService.UpdateItem(uri, item, sessionID);
+ }
+ }
+
+ public override bool MoveItems(UUID ownerID, List items)
+ {
+ if (items == null)
+ return false;
+ if (items.Count == 0)
+ return true;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(ownerID, out uri))
+ return m_LocalGridInventoryService.MoveItems(ownerID, items);
+ else
+ {
+ UUID sessionID = GetSessionID(ownerID);
+ uri = uri + "/" + ownerID.ToString();
+ return m_HGService.MoveItems(uri, items, sessionID);
+ }
+ }
+
+ public override bool DeleteItems(UUID ownerID, List itemIDs)
+ {
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID);
+
+ if (itemIDs == null)
+ return false;
+ if (itemIDs.Count == 0)
+ return true;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(ownerID, out uri))
+ return m_LocalGridInventoryService.DeleteItems(ownerID, itemIDs);
+ else
+ {
+ UUID sessionID = GetSessionID(ownerID);
+ uri = uri + "/" + ownerID.ToString();
+ return m_HGService.DeleteItems(uri, itemIDs, sessionID);
+ }
+ }
+
+ public override InventoryItemBase GetItem(InventoryItemBase item)
+ {
+ if (item == null)
+ return null;
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner);
+ string uri = string.Empty;
+ if (!IsForeignUser(item.Owner, out uri))
+ return m_LocalGridInventoryService.GetItem(item);
+ else
+ {
+ UUID sessionID = GetSessionID(item.Owner);
+ uri = uri + "/" + item.Owner.ToString();
+ return m_HGService.QueryItem(uri, item, sessionID);
+ }
+ }
+
+ public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
+ {
+ if (folder == null)
+ return null;
+
+ string uri = string.Empty;
+ if (!IsForeignUser(folder.Owner, out uri))
+ return m_LocalGridInventoryService.GetFolder(folder);
+ else
+ {
+ UUID sessionID = GetSessionID(folder.Owner);
+ uri = uri + "/" + folder.Owner.ToString();
+ return m_HGService.QueryFolder(uri, folder, sessionID);
+ }
+ }
+
+ public override bool HasInventoryForUser(UUID userID)
+ {
+ return false;
+ }
+
+ public override List GetActiveGestures(UUID userId)
+ {
+ return new List();
+ }
+
+ public override int GetAssetPermissions(UUID userID, UUID assetID)
+ {
+ string uri = string.Empty;
+ if (!IsForeignUser(userID, out uri))
+ return m_LocalGridInventoryService.GetAssetPermissions(userID, assetID);
+ else
+ {
+ UUID sessionID = GetSessionID(userID);
+ uri = uri + "/" + userID.ToString();
+ return m_HGService.GetAssetPermissions(uri, assetID, sessionID);
+ }
+ }
+
+ #endregion
+
+ private IInventoryService GetConnector(string url)
+ {
+ IInventoryService connector = null;
+ lock (m_connectors)
+ {
+ if (m_connectors.ContainsKey(url))
+ {
+ connector = m_connectors[url];
+ }
+ else
+ {
+ // We're instantiating this class explicitly, but this won't
+ // work in general, because the remote grid may be running
+ // an inventory server that has a different protocol.
+ // Eventually we will want a piece of protocol asking
+ // the remote server about its kind. Definitely cool thing to do!
+ connector = new RemoteXInventoryServicesConnector(url);
+ m_connectors.Add(url, connector);
+ }
+ }
+ return connector;
+ }
+
+
+ private UUID GetSessionID(UUID userID)
+ {
+ ScenePresence sp = null;
+ if (m_Scene.TryGetScenePresence(userID, out sp))
+ {
+ return sp.ControllingClient.SessionId;
+ }
+
+ m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scene presence for {0} not found", userID);
+ return UUID.Zero;
+ }
+
+ private bool IsForeignUser(UUID userID, out string inventoryURL)
+ {
+ inventoryURL = string.Empty;
+ UserAccount account = null;
+ if (m_Scene.UserAccountService != null)
+ account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID);
+
+ if (account == null) // foreign user
+ {
+ ScenePresence sp = null;
+ m_Scene.TryGetScenePresence(userID, out sp);
+ if (sp != null)
+ {
+ AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
+ if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
+ {
+ inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
+ inventoryURL = inventoryURL.Trim(new char[] { '/' });
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
index 5e06580..9c6e1cd 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs
@@ -51,6 +51,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
// The cache proper
protected Dictionary> m_InventoryCache;
+ // A cache of userIDs --> ServiceURLs, for HGBroker only
+ protected Dictionary m_InventoryURLs;
+
public virtual void Init(IConfigSource source, BaseInventoryConnector connector)
{
m_Scenes = new List();
@@ -89,8 +92,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
// If not, go get them and place them in the cache
Dictionary folders = CacheSystemFolders(presence.UUID);
+ CacheInventoryServiceURL(presence.Scene, presence.UUID);
+
m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}",
presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count);
+
}
void OnClientClosed(UUID clientID, Scene scene)
@@ -113,6 +119,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
"[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders",
scene.RegionInfo.RegionName, clientID);
DropCachedSystemFolders(clientID);
+ DropInventoryServiceURL(clientID);
}
}
@@ -174,5 +181,49 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
return null;
}
+
+ ///
+ /// Gets the user's inventory URL from its serviceURLs, if the user is foreign,
+ /// and sticks it in the cache
+ ///
+ ///
+ private void CacheInventoryServiceURL(Scene scene, UUID userID)
+ {
+ if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null)
+ {
+ // The user does not have a local account; let's cache its service URL
+ string inventoryURL = string.Empty;
+ ScenePresence sp = null;
+ scene.TryGetScenePresence(userID, out sp);
+ if (sp != null)
+ {
+ AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
+ if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI"))
+ {
+ inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString();
+ if (inventoryURL != null && inventoryURL != string.Empty)
+ {
+ inventoryURL = inventoryURL.Trim(new char[] { '/' });
+ m_InventoryURLs.Add(userID, inventoryURL);
+ }
+ }
+ }
+ }
+ }
+
+ private void DropInventoryServiceURL(UUID userID)
+ {
+ lock (m_InventoryURLs)
+ if (m_InventoryURLs.ContainsKey(userID))
+ m_InventoryURLs.Remove(userID);
+ }
+
+ public string GetInventoryServiceURL(UUID userID)
+ {
+ if (m_InventoryURLs.ContainsKey(userID))
+ return m_InventoryURLs[userID];
+
+ return null;
+ }
}
}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
index 8504b67..96d0c1c 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs
@@ -65,6 +65,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
{
}
+ public RemoteXInventoryServicesConnector(string url)
+ {
+ m_RemoteConnector = new XInventoryServicesConnector(url);
+ }
+
public RemoteXInventoryServicesConnector(IConfigSource source)
{
Init(source);
--
cgit v1.1