From 33e7c09b7b894551b35fb8ab29133c96a5d7b037 Mon Sep 17 00:00:00 2001 From: MW Date: Thu, 26 Feb 2009 20:01:20 +0000 Subject: Added IRegistryCore and RegistryCore to OpenSim.Framework. Added a ApplicationRegistry to OpenSimBase. Changed LoadRegionsPlugin so it registers itself to that application registry. Added a event to LoadRegionsPlugin, that is triggered when it creates a new scene ,although maybe this event should actually be in opensimBase incase other plugins are creating regions (like the RemoteAdminPlugin). --- .../LoadRegions/LoadRegionsPlugin.cs | 22 ++++++- .../RemoteController/RemoteAdminPlugin.cs | 4 +- OpenSim/Framework/IRegistryCore.cs | 13 +++++ OpenSim/Framework/RegistryCore.cs | 44 ++++++++++++++ OpenSim/Region/Application/HGOpenSimNode.cs | 2 +- OpenSim/Region/Application/OpenSim.cs | 67 ++++++++++++---------- OpenSim/Region/Application/OpenSimBase.cs | 34 +++++++---- .../Region/ClientStack/RegionApplicationBase.cs | 15 ++++- 8 files changed, 153 insertions(+), 48 deletions(-) create mode 100644 OpenSim/Framework/IRegistryCore.cs create mode 100644 OpenSim/Framework/RegistryCore.cs diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index 24372fe..962f7b3 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -38,13 +38,19 @@ using OpenSim.Region.CoreModules.Avatar.InstantMessage; using OpenSim.Region.CoreModules.Scripting.DynamicTexture; using OpenSim.Region.CoreModules.Scripting.LoadImageURL; using OpenSim.Region.CoreModules.Scripting.XMLRPC; +using OpenSim.Framework.Servers; namespace OpenSim.ApplicationPlugins.LoadRegions { + public delegate void NewRegionCreated(IScene scene); + public class LoadRegionsPlugin : IApplicationPlugin { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public event NewRegionCreated OnNewRegionCreated; + private NewRegionCreated m_newRegionCreatedHandler; + #region IApplicationPlugin Members // TODO: required by IPlugin, but likely not at all right @@ -56,6 +62,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions protected OpenSimBase m_openSim; + public void Initialise() { m_log.Info("[LOADREGIONS]: " + Name + " cannot be default-initialized!"); @@ -65,6 +72,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions public void Initialise(OpenSimBase openSim) { m_openSim = openSim; + m_openSim.ApplicationRegistry.RegisterInterface(this); } public void PostInitialise() @@ -99,9 +107,18 @@ namespace OpenSim.ApplicationPlugins.LoadRegions for (int i = 0; i < regionsToLoad.Length; i++) { + IScene scene; m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " + Thread.CurrentThread.ManagedThreadId.ToString() + ")"); - m_openSim.CreateRegion(regionsToLoad[i], true); + m_openSim.CreateRegion(regionsToLoad[i], true, out scene); + if (scene != null) + { + m_newRegionCreatedHandler = OnNewRegionCreated; + if (m_newRegionCreatedHandler != null) + { + m_newRegionCreatedHandler(scene); + } + } } m_openSim.ModuleLoader.PostInitialise(); @@ -182,9 +199,10 @@ namespace OpenSim.ApplicationPlugins.LoadRegions { if (regionhandle == regionsToLoad[i].RegionHandle) { + IScene scene; m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " + Thread.CurrentThread.ManagedThreadId.ToString() + ")"); - openSim.CreateRegion(regionsToLoad[i], true); + openSim.CreateRegion(regionsToLoad[i], true, out scene); } } } diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 7f6ca9a..fcc02d8 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -563,8 +563,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController region.RegionID, regionXmlPath); region.SaveRegionToFile("dynamic region", regionXmlPath); } - - m_app.CreateRegion(region); + IScene newscene; + m_app.CreateRegion(region, out newscene); responseData["success"] = "true"; responseData["region_name"] = region.RegionName; diff --git a/OpenSim/Framework/IRegistryCore.cs b/OpenSim/Framework/IRegistryCore.cs new file mode 100644 index 0000000..486dee6 --- /dev/null +++ b/OpenSim/Framework/IRegistryCore.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework +{ + public interface IRegistryCore + { + T Get(); + void RegisterInterface(T iface); + bool TryGet(out T iface); + } +} diff --git a/OpenSim/Framework/RegistryCore.cs b/OpenSim/Framework/RegistryCore.cs new file mode 100644 index 0000000..06732f5 --- /dev/null +++ b/OpenSim/Framework/RegistryCore.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework +{ + public class RegistryCore + { + protected Dictionary m_moduleInterfaces = new Dictionary(); + + /// + /// Register an Module interface. + /// + /// + /// + public void RegisterInterface(T iface) + { + lock (m_moduleInterfaces) + { + if (!m_moduleInterfaces.ContainsKey(typeof(T))) + { + m_moduleInterfaces.Add(typeof(T), iface); + } + } + } + + public bool TryGet(out T iface) + { + if (m_moduleInterfaces.ContainsKey(typeof(T))) + { + iface = (T)m_moduleInterfaces[typeof(T)]; + return true; + } + iface = default(T); + return false; + } + + public T Get() + { + return (T)m_moduleInterfaces[typeof(T)]; + } + + } +} diff --git a/OpenSim/Region/Application/HGOpenSimNode.cs b/OpenSim/Region/Application/HGOpenSimNode.cs index ded6443..1130c70 100644 --- a/OpenSim/Region/Application/HGOpenSimNode.cs +++ b/OpenSim/Region/Application/HGOpenSimNode.cs @@ -47,7 +47,7 @@ namespace OpenSim public class HGOpenSimNode : OpenSim { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private IHyperlink HGServices = null; + public IHyperlink HGServices = null; private uint m_autoMappingX = 0; private uint m_autoMappingY = 0; diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index a17d92f..a8adf58 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -95,6 +95,40 @@ namespace OpenSim m_console.SetGuiMode(m_gui); MainConsole.Instance = m_console; + RegisterConsoleCommands(); + + base.StartupSpecific(); + + //Run Startup Commands + if (String.IsNullOrEmpty( m_startupCommandsFile )) + { + m_log.Info("[STARTUP]: No startup command script specified. Moving on..."); + } + else + { + RunCommandScript(m_startupCommandsFile); + } + + // Start timer script (run a script every xx seconds) + if (m_timedScript != "disabled") + { + m_scriptTimer = new Timer(); + m_scriptTimer.Enabled = true; + m_scriptTimer.Interval = 1200 * 1000; + m_scriptTimer.Elapsed += RunAutoTimerScript; + } + + PrintFileToConsole("startuplogo.txt"); + + // For now, start at the 'root' level by default + if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it + ChangeSelectedRegion("region", new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName}); + else + ChangeSelectedRegion("region", new string[] {"change", "region", "root"}); + } + + private void RegisterConsoleCommands() + { m_console.Commands.AddCommand("region", false, "clear assets", "clear assets", "Clear the asset cache", HandleClearAssets); @@ -255,35 +289,6 @@ namespace OpenSim "reset user password [ [ []]]", "Reset a user password", HandleResetUserPassword); } - - base.StartupSpecific(); - - //Run Startup Commands - if (String.IsNullOrEmpty( m_startupCommandsFile )) - { - m_log.Info("[STARTUP]: No startup command script specified. Moving on..."); - } - else - { - RunCommandScript(m_startupCommandsFile); - } - - // Start timer script (run a script every xx seconds) - if (m_timedScript != "disabled") - { - m_scriptTimer = new Timer(); - m_scriptTimer.Enabled = true; - m_scriptTimer.Interval = 1200 * 1000; - m_scriptTimer.Elapsed += RunAutoTimerScript; - } - - PrintFileToConsole("startuplogo.txt"); - - // For now, start at the 'root' level by default - if (m_sceneManager.Scenes.Count == 1) // If there is only one region, select it - ChangeSelectedRegion("region", new string[] {"change", "region", m_sceneManager.Scenes[0].RegionInfo.RegionName}); - else - ChangeSelectedRegion("region", new string[] {"change", "region", "root"}); } public override void ShutdownSpecific() @@ -410,9 +415,9 @@ namespace OpenSim { m_console.Error("Usage: create region "); } - - CreateRegion(new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source), true); + IScene scene; + CreateRegion(new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source), true, out scene); } private void HandleLoginEnable(string module, string[] cmd) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 4d809b0..2b74aa3 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -120,7 +120,14 @@ namespace OpenSim get { return m_moduleLoader; } set { m_moduleLoader = value; } } - protected ModuleLoader m_moduleLoader; + protected ModuleLoader m_moduleLoader; + + protected RegistryCore m_applicationRegistry = new RegistryCore(); + + public RegistryCore ApplicationRegistry + { + get { return m_applicationRegistry; } + } /// /// Constructor. @@ -176,7 +183,7 @@ namespace OpenSim base.StartupSpecific(); m_stats = StatsManager.StartCollectingSimExtraStats(); - + LibraryRootFolder libraryRootFolder = new LibraryRootFolder(m_configSettings.LibrariesXMLFile); // Standalone mode is determined by !startupConfig.GetBoolean("gridmode", false) @@ -194,6 +201,7 @@ namespace OpenSim m_moduleLoader = new ModuleLoader(m_config.Source); LoadPlugins(); + foreach (IApplicationPlugin plugin in m_plugins) { @@ -202,7 +210,10 @@ namespace OpenSim // Only enable logins to the regions once we have completely finished starting up (apart from scripts) - m_commsManager.GridService.RegionLoginsEnabled = true; + if ((m_commsManager != null) && (m_commsManager.GridService != null)) + { + m_commsManager.GridService.RegionLoginsEnabled = true; + } // If console exists add plugin commands. if (m_console != null) @@ -541,9 +552,9 @@ namespace OpenSim /// /// /// - public IClientNetworkServer CreateRegion(RegionInfo regionInfo, bool portadd_flag) + public IClientNetworkServer CreateRegion(RegionInfo regionInfo, bool portadd_flag, out IScene scene) { - return CreateRegion(regionInfo, portadd_flag, false); + return CreateRegion(regionInfo, portadd_flag, false, out scene); } /// @@ -551,9 +562,9 @@ namespace OpenSim /// /// /// - public IClientNetworkServer CreateRegion(RegionInfo regionInfo) + public IClientNetworkServer CreateRegion(RegionInfo regionInfo, out IScene scene) { - return CreateRegion(regionInfo, false, true); + return CreateRegion(regionInfo, false, true, out scene); } /// @@ -563,7 +574,7 @@ namespace OpenSim /// /// /// - public IClientNetworkServer CreateRegion(RegionInfo regionInfo, bool portadd_flag, bool do_post_init) + public IClientNetworkServer CreateRegion(RegionInfo regionInfo, bool portadd_flag, bool do_post_init, out IScene mscene) { int port = regionInfo.InternalEndPoint.Port; @@ -640,6 +651,7 @@ namespace OpenSim } } + mscene = scene; return clientServer; } @@ -722,8 +734,8 @@ namespace OpenSim m_clientServers[clientServerElement].Server.Close(); m_clientServers.RemoveAt(clientServerElement); } - - CreateRegion(whichRegion, true); + IScene scene; + CreateRegion(whichRegion, true, out scene); } # region Setup methods @@ -738,7 +750,7 @@ namespace OpenSim /// Handler to supply the current status of this sim /// /// Currently this is always OK if the simulator is still listening for connections on its HTTP service - protected class SimStatusHandler : IStreamedRequestHandler + public class SimStatusHandler : IStreamedRequestHandler { public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index 55cf1ae..731e0e5 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -45,16 +45,21 @@ namespace OpenSim.Region.ClientStack private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected IAssetCache m_assetCache; protected Dictionary m_clientCircuits = new Dictionary(); protected NetworkServersInfo m_networkServersInfo; + public NetworkServersInfo NetServersInfo + { + get { return m_networkServersInfo; } + } + protected BaseHttpServer m_httpServer; protected uint m_httpServerPort; public CommunicationsManager CommunicationsManager { get { return m_commsManager; } + set { m_commsManager = value; } } protected CommunicationsManager m_commsManager; @@ -67,6 +72,14 @@ namespace OpenSim.Region.ClientStack get { return m_sceneManager; } } protected SceneManager m_sceneManager = new SceneManager(); + + protected IAssetCache m_assetCache; + + public IAssetCache AssetCache + { + get { return m_assetCache; } + set { m_assetCache = value; } + } protected abstract void Initialize(); -- cgit v1.1