From 138bcf6fffdb16e3962c03f995aff7cda15a7800 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 17 Oct 2008 16:44:05 +0000 Subject: * Apply a modified version of http://opensimulator.org/mantis/view.php?id=2290 * This allows multiple user profile providers to be specified in OpenSim.ini separated by commas * If multiple providers are specified then a request for a user profile will query each in turn until the profile is either found or all have been queried * Unfortunately I don't believe this order can currently be specified, which if true is something that will need to be fixed. * Thanks to smeans for the original patch. --- .../Framework/Communications/UserManagerBase.cs | 20 +++++++++--- OpenSim/Framework/PluginLoader.cs | 37 ++++++++++++++++++---- .../Region/ClientStack/LindenUDP/LLUDPServer.cs | 3 +- .../Modules/AvatarFactory/AvatarFactoryModule.cs | 1 - bin/OpenSim.ini.example | 9 ++++++ 5 files changed, 56 insertions(+), 14 deletions(-) diff --git a/OpenSim/Framework/Communications/UserManagerBase.cs b/OpenSim/Framework/Communications/UserManagerBase.cs index aa68367..32bfed7 100644 --- a/OpenSim/Framework/Communications/UserManagerBase.cs +++ b/OpenSim/Framework/Communications/UserManagerBase.cs @@ -56,11 +56,11 @@ namespace OpenSim.Framework.Communications public void AddPlugin(string provider, string connect) { PluginLoader loader = - new PluginLoader (new UserDataInitialiser (connect)); + new PluginLoader(new UserDataInitialiser(connect)); // loader will try to load all providers (MySQL, MSSQL, etc) // unless it is constrainted to the correct "Provider" entry in the addin.xml - loader.Add ("/OpenSim/UserData", new PluginProviderFilter (provider)); + loader.Add("/OpenSim/UserData", new PluginProviderFilter(provider)); loader.Load(); _plugins = loader.Plugins; @@ -178,7 +178,12 @@ namespace OpenSim.Framework.Communications { try { - return plugin.GetAgentByUUID(uuid); + UserAgentData result = plugin.GetAgentByUUID(uuid); + + if (result != null) + { + return result; + } } catch (Exception e) { @@ -260,7 +265,12 @@ namespace OpenSim.Framework.Communications { try { - return plugin.GetUserFriendList(ownerID); + List result = plugin.GetUserFriendList(ownerID); + + if (result != null) + { + return result; + } } catch (Exception e) { @@ -331,7 +341,6 @@ namespace OpenSim.Framework.Communications } } - /// /// Resets the currentAgent in the user profile /// @@ -344,6 +353,7 @@ namespace OpenSim.Framework.Communications { return; } + profile.CurrentAgent = null; UpdateUserProfile(profile); diff --git a/OpenSim/Framework/PluginLoader.cs b/OpenSim/Framework/PluginLoader.cs index ab4e217..a39f787 100644 --- a/OpenSim/Framework/PluginLoader.cs +++ b/OpenSim/Framework/PluginLoader.cs @@ -342,20 +342,45 @@ namespace OpenSim.Framework } /// - /// Filters out which plugin to load based on its "Provider", which is name given by in the addin.xml + /// Filters out which plugin to load based on its the plugin name or names given. Plugin names are contained in + /// their addin.xml /// public class PluginProviderFilter : IPluginFilter { - private string provider; - - public PluginProviderFilter (string p) + private string[] m_filters; + + /// + /// Constructor. + /// + /// + /// Plugin name or names on which to filter. Multiple names should be separated by commas. + /// + public PluginProviderFilter(string p) { - provider = p; + m_filters = p.Split(','); + + for (int i = 0; i < m_filters.Length; i++) + { + m_filters[i] = m_filters[i].Trim(); + } } + /// + /// Apply this filter to the given plugin. + /// + /// + /// true if the plugin's name matched one of the filters, false otherwise. public bool Apply (PluginExtensionNode plugin) { - return (plugin.Provider == provider); + for (int i = 0; i < m_filters.Length; i++) + { + if (m_filters[i] == plugin.Provider) + { + return true; + } + } + + return false; } } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 20452e0..1f1f88b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -60,7 +60,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// /// The endpoint of a sender of a particular packet. The port is changed by the various socket receive methods /// - protected EndPoint epSender; + protected EndPoint epSender = new IPEndPoint(IPAddress.Any, 0); protected EndPoint epProxy; protected int proxyPortOffset; @@ -175,7 +175,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// protected virtual void OnReceivedData(IAsyncResult result) { - epSender = new IPEndPoint(listenIP, 0); Packet packet = null; int numBytes = 1; diff --git a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs index ab86d10..cec2ec1 100644 --- a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs @@ -34,7 +34,6 @@ using OpenMetaverse; using log4net; using Nini.Config; using OpenSim.Data.Base; -using OpenSim.Data.MapperFactory; using OpenSim.Framework; using OpenSim.Framework.Communications.Cache; using OpenSim.Region.Environment.Interfaces; diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index c9d97a5..5457af2 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -144,6 +144,7 @@ asset_plugin = "OpenSim.Data.SQLite.dll" inventory_plugin = "OpenSim.Data.SQLite.dll" ; inventory_plugin = "OpenSim.Data.MySQL.dll" ; inventory_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate + ; Inventory Source NHibernate example (DIALECT;DRIVER;CONNECTSTRING) ; inventory_source = "SQLiteDialect;SqliteClientDriver;URI=file:Inventory.db,version=3" ; Inventory Source MySQL example @@ -151,9 +152,17 @@ inventory_plugin = "OpenSim.Data.SQLite.dll" ; User Data Database provider +; +; Multiple providers can be specified by separating them with commas (whitespace is unimportant) +; If multiple providers are specified then if a profile is requested, each is queried until one +; provides a valid profile, or until all providers have been queried. +; Unfortunately the order of querying is currently undefined (it may not be the order in which +; providers are specified here). This needs to be fixed +; userDatabase_plugin = "OpenSim.Data.SQLite.dll" ; userDatabase_plugin = "OpenSim.Data.MySQL.dll" ; userDatabase_plugin = "OpenSim.Data.NHibernate.dll" ; for nhibernate + ; User Source NHibernate Example (DIALECT;DRIVER;CONNECTSTRING) ; user_source = "SQLiteDialect;SqliteClientDriver;URI=file:User.db,version=3" ; User Source MySQL example -- cgit v1.1