diff --git a/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs b/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs index fa5f11707b..aeb91a9682 100644 --- a/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs +++ b/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs @@ -57,6 +57,12 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions public partial class RestRegionPlugin : RestPlugin { private static XmlSerializerNamespaces _xmlNs; + + static RestRegionPlugin() + { + _xmlNs = new XmlSerializerNamespaces(); + _xmlNs.Add(String.Empty, String.Empty); + } #region overriding properties public override string Name @@ -91,9 +97,6 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions } m_log.InfoFormat("{0} REST region plugin enabled", MsgID); - _xmlNs = new XmlSerializerNamespaces(); - _xmlNs.Add(String.Empty, String.Empty); - // add REST method handlers AddRestStreamHandler("GET", "/regions/", GetHandler); AddRestStreamHandler("POST", "/regions/", PostHandler); diff --git a/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs b/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs index 8373ea2708..ffabb2a5ec 100644 --- a/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs +++ b/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs @@ -135,6 +135,14 @@ namespace OpenSim.ApplicationPlugins.Rest get { return _prefix; } } + /// + /// Access to GOD password string + /// + protected string GodKey + { + get { return _godkey; } + } + /// /// Configuration of the plugin /// diff --git a/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCBridgeModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCBridgeModule.cs index 85262f5790..befa89f875 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCBridgeModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/Chat/IRCBridgeModule.cs @@ -151,6 +151,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat public void Close() { m_irc.Close(); + m_log.Info("[IRC] closed connection to IRC server"); } public string Name @@ -324,9 +325,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat // if IRC is enabled then just keep trying using a monitor thread public void IRCConnectRun() { - while (true) + while (m_irc.Enabled) { - if ((m_irc.Enabled) && (!m_irc.Connected)) + if (!m_irc.Connected) { m_irc.Connect(m_scenes); } @@ -538,7 +539,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat m_log.Info("[IRC]: ExtractMsg: " + input); Dictionary result = null; //string regex = @":(?\w*)!~(?\S*) PRIVMSG (?\S+) :(?.*)"; - string regex = @":(?\w*)!(?\S*) PRIVMSG (?\S+) :(?.*)"; + string regex = @":(?[\w-]*)!(?\S*) PRIVMSG (?\S+) :(?.*)"; Regex RE = new Regex(regex, RegexOptions.Multiline); MatchCollection matches = RE.Matches(input); @@ -566,7 +567,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat { // IRC keep alive thread // send PING ever 15 seconds - while (true) + while (m_enabled) { try { @@ -579,8 +580,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat } catch (IOException) { - m_log.Error("[IRC]: Disconnected from IRC server.(PingRun)"); - Reconnect(); + if (m_enabled) + { + m_log.Error("[IRC]: Disconnected from IRC server.(PingRun)"); + Reconnect(); + } } catch (Exception ex) { @@ -593,7 +597,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat { string inputLine; LLVector3 pos = new LLVector3(128, 128, 20); - while (true) + while (m_enabled) { try { @@ -637,8 +641,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat } catch (IOException) { - m_log.Error("[IRC]: ListenerRun IOException. Disconnected from IRC server ??? (ListenerRun)"); - Reconnect(); + if (m_enabled) + { + m_log.Error("[IRC]: ListenerRun IOException. Disconnected from IRC server ??? (ListenerRun)"); + Reconnect(); + } } catch (Exception ex) { @@ -838,13 +845,19 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Chat public void Close() { - m_connected = false; - m_writer.WriteLine(String.Format("QUIT :{0} to {1} wormhole with {2} closing", m_nick, m_channel, m_server)); + m_writer.WriteLine(String.Format("QUIT :{0} to {1} wormhole to {2} closing", + m_nick, m_channel, m_server)); m_writer.Flush(); - listener.Abort(); - pingSender.Abort(); + + m_connected = false; + m_enabled = false; + + // listener.Abort(); + // pingSender.Abort(); + m_writer.Close(); m_reader.Close(); + m_tcp.Close(); } } diff --git a/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs b/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs index 89ee61aa4d..40d07de419 100644 --- a/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs +++ b/OpenSim/Region/Environment/Modules/Grid/Interregion/InterregionModule.cs @@ -169,7 +169,8 @@ namespace OpenSim.Region.Environment.Modules.Grid.Interregion public void Close() { - ChannelServices.UnregisterChannel(m_tcpChannel); + if (null != m_tcpChannel) + ChannelServices.UnregisterChannel(m_tcpChannel); } public string Name diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 2b667c9de5..c1e8602298 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -103,7 +103,11 @@ namespace OpenSim.Region.Environment.Scenes protected BaseHttpServer m_httpListener; - protected Dictionary Modules = new Dictionary(); + protected Dictionary m_modules = new Dictionary(); + public Dictionary Modules + { + get { return m_modules; } + } protected Dictionary ModuleInterfaces = new Dictionary(); protected Dictionary ModuleAPIMethods = new Dictionary(); protected Dictionary m_moduleCommanders = new Dictionary(); diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index c596f6e855..dc9ac3799b 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -32,6 +32,7 @@ using System.Reflection; using libsecondlife; using log4net; using OpenSim.Framework; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.Scenes { @@ -78,10 +79,27 @@ namespace OpenSim.Region.Environment.Scenes public void Close() { + // collect known shared modules in sharedModules + Dictionary sharedModules = new Dictionary(); for (int i = 0; i < m_localScenes.Count; i++) { + // extract known shared modules from scene + foreach(string k in m_localScenes[i].Modules.Keys) + { + if (m_localScenes[i].Modules[k].IsSharedModule && + !sharedModules.ContainsKey(k)) + sharedModules[k] = m_localScenes[i].Modules[k]; + } + // close scene/region m_localScenes[i].Close(); } + + // all regions/scenes are now closed, we can now safely + // close all shared modules + foreach(IRegionModule mod in sharedModules.Values) + { + mod.Close(); + } } public void Close(Scene cscene)