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')
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 fb7458be3185802c4511306c0cda7648d702de59 Mon Sep 17 00:00:00 2001
From: unknown
Date: Sun, 25 Apr 2010 10:13:13 +0300
Subject: Minor spelling corrections in MiniModule: "RetreiveAsset" changed to
"RetrieveAsset" and 'm_rootSceene' to m_rootScene'.
---
.../Scripting/Minimodule/Interfaces/IInventoryItem.cs | 2 +-
.../Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
index 5fac189..16cd7e4 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
@@ -39,6 +39,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
{
int Type { get; }
UUID AssetID { get; }
- T RetreiveAsset() where T : Asset, new();
+ T RetrieveAsset() where T : Asset, new();
}
}
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs
index 5bf29d7..bf85cbc 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs
@@ -39,11 +39,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
public class InventoryItem : IInventoryItem
{
TaskInventoryItem m_privateItem;
- Scene m_rootSceene;
+ Scene m_rootScene;
public InventoryItem(Scene rootScene, TaskInventoryItem internalItem)
{
- m_rootSceene = rootScene;
+ m_rootScene = rootScene;
m_privateItem = internalItem;
}
@@ -82,9 +82,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
public UUID AssetID { get { return m_privateItem.AssetID; } }
// This method exposes OpenSim/OpenMetaverse internals and needs to be replaced with a IAsset specific to MRM.
- public T RetreiveAsset() where T : OpenMetaverse.Assets.Asset, new()
+ public T RetrieveAsset() where T : OpenMetaverse.Assets.Asset, new()
{
- AssetBase a = m_rootSceene.AssetService.Get(AssetID.ToString());
+ AssetBase a = m_rootScene.AssetService.Get(AssetID.ToString());
T result = new T();
if ((sbyte)result.AssetType != a.Type)
--
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')
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 aa56953411e04c260fe1938f5f184c775fea72b6 Mon Sep 17 00:00:00 2001
From: unknown
Date: Sat, 24 Apr 2010 18:52:23 +0300
Subject: Compiler.cs contained method GetCompilerOutput which, apparently, was
not used, but exactly the same path was calculated inline. This patch does
some minor refactoring by replacing inline path calculation with
GetCompilerOutput. This doesn't actually affect anything, just minor
prettifying of the code
---
OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index d8c0ba5..f719683 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -261,13 +261,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
// }
//}
- public object GetCompilerOutput(UUID assetID)
+ public string GetCompilerOutput(string assetID)
{
return Path.Combine(ScriptEnginesPath, Path.Combine(
m_scriptEngine.World.RegionInfo.RegionID.ToString(),
FilePrefix + "_compiled_" + assetID + ".dll"));
}
+ public string GetCompilerOutput(UUID assetID)
+ {
+ return GetCompilerOutput(assetID.ToString());
+ }
+
///
/// Converts script from LSL to CS and calls CompileFromCSText
///
@@ -279,9 +284,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
linemap = null;
m_warnings.Clear();
- assembly = Path.Combine(ScriptEnginesPath, Path.Combine(
- m_scriptEngine.World.RegionInfo.RegionID.ToString(),
- FilePrefix + "_compiled_" + asset + ".dll"));
+ assembly = GetCompilerOutput(asset);
if (!Directory.Exists(ScriptEnginesPath))
{
--
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')
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