aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
authordiva2009-06-14 15:35:09 +0000
committerdiva2009-06-14 15:35:09 +0000
commit7a9c85526cb99495bdd436150679941ef021b782 (patch)
tree888b5bdf86f8327d2df0c1ca8f1cd3dd999d125d /OpenSim/Region/CoreModules
parent* Temporarily resolve another problem in http://opensimulator.org/mantis/view... (diff)
downloadopensim-SC_OLD-7a9c85526cb99495bdd436150679941ef021b782.zip
opensim-SC_OLD-7a9c85526cb99495bdd436150679941ef021b782.tar.gz
opensim-SC_OLD-7a9c85526cb99495bdd436150679941ef021b782.tar.bz2
opensim-SC_OLD-7a9c85526cb99495bdd436150679941ef021b782.tar.xz
Pulled out HelloNeighbour into its own service, INeighbourService, which may get more functions as we go along. It's a very simple service and service connectors, and it served primarily to establish the design of services that dependent on Scenes and that must always have a local connector. More refactoring coming, as this showed how to do it right.
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs17
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs119
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs136
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs146
5 files changed, 284 insertions, 136 deletions
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index 10e2ec2..bb67794 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -23,6 +23,8 @@
23 <RegionModule id="LocalInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.LocalInventoryServicesConnector" /> 23 <RegionModule id="LocalInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.LocalInventoryServicesConnector" />
24 <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.RemoteInventoryServicesConnector" /> 24 <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.RemoteInventoryServicesConnector" />
25 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.HGInventoryBroker" /> 25 <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.HGInventoryBroker" />
26 <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Neighbour.LocalNeighbourServicesConnector" />
27 <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Neighbour.RemoteNeighbourServicesConnector" />
26 <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" /> 28 <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" />
27 <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" /> 29 <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" />
28 </Extension> 30 </Extension>
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
index 5d2fc37..d2af2db 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/LocalInterregionComms.cs
@@ -258,23 +258,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
258 } 258 }
259 259
260 260
261 /**
262 * Region-related communications
263 */
264
265 public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
266 {
267 foreach (Scene s in m_sceneList)
268 {
269 if (s.RegionInfo.RegionHandle == regionHandle)
270 {
271 //m_log.Debug("[LOCAL COMMS]: Found region to SendHelloNeighbour");
272 return s.IncomingHelloNeighbour(thisRegion);
273 }
274 }
275 return false;
276 }
277
278 #endregion /* IInterregionComms */ 261 #endregion /* IInterregionComms */
279 262
280 #region Misc 263 #region Misc
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
index dd37d47..37305d5 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Interregion/RESTInterregionComms.cs
@@ -130,7 +130,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
130 { 130 {
131 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler); 131 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/", AgentHandler);
132 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler); 132 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler);
133 m_aScene.CommsManager.HttpServer.AddHTTPHandler("/region/", RegionHandler);
134 } 133 }
135 134
136 #endregion /* IRegionModule */ 135 #endregion /* IRegionModule */
@@ -291,32 +290,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
291 return false; 290 return false;
292 } 291 }
293 292
294 /**
295 * Region-related communications
296 */
297
298 public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
299 {
300 // Try local first
301 if (m_localBackend.SendHelloNeighbour(regionHandle, thisRegion))
302 {
303 //m_log.Debug("[REST COMMS]: LocalBackEnd SendHelloNeighbour succeeded");
304 return true;
305 }
306
307 // else do the remote thing
308 RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
309 if ((regInfo != null) &&
310 // Don't remote-call this instance; that's a startup hickup
311 !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort)))
312 {
313 return m_regionClient.DoHelloNeighbourCall(regInfo, thisRegion);
314 }
315 //else
316 // m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
317 return false;
318 }
319
320 #endregion /* IInterregionComms */ 293 #endregion /* IInterregionComms */
321 294
322 #region Incoming calls from remote instances 295 #region Incoming calls from remote instances
@@ -702,98 +675,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
702 responsedata["str_response_string"] = result.ToString(); 675 responsedata["str_response_string"] = result.ToString();
703 } 676 }
704 677
705 /*
706 * Region-related incoming calls
707 *
708 */
709
710 public Hashtable RegionHandler(Hashtable request)
711 {
712 //m_log.Debug("[CONNECTION DEBUGGING]: RegionHandler Called");
713
714 //m_log.Debug("---------------------------");
715 //m_log.Debug(" >> uri=" + request["uri"]);
716 //m_log.Debug(" >> content-type=" + request["content-type"]);
717 //m_log.Debug(" >> http-method=" + request["http-method"]);
718 //m_log.Debug("---------------------------\n");
719
720 Hashtable responsedata = new Hashtable();
721 responsedata["content_type"] = "text/html";
722
723 UUID regionID;
724 string action;
725 ulong regionHandle;
726 if (!GetParams((string)request["uri"], out regionID, out regionHandle, out action))
727 {
728 m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]);
729 responsedata["int_response_code"] = 404;
730 responsedata["str_response_string"] = "false";
731
732 return responsedata;
733 }
734
735 // Next, let's parse the verb
736 string method = (string)request["http-method"];
737 if (method.Equals("POST"))
738 {
739 DoRegionPost(request, responsedata, regionID);
740 return responsedata;
741 }
742 //else if (method.Equals("PUT"))
743 //{
744 // DoRegionPut(request, responsedata, regionID);
745 // return responsedata;
746 //}
747 //else if (method.Equals("DELETE"))
748 //{
749 // DoRegionDelete(request, responsedata, regiontID);
750 // return responsedata;
751 //}
752 else
753 {
754 m_log.InfoFormat("[REST COMMS]: method {0} not supported in region message", method);
755 responsedata["int_response_code"] = 404;
756 responsedata["str_response_string"] = "false";
757
758 return responsedata;
759 }
760
761 }
762
763 protected virtual void DoRegionPost(Hashtable request, Hashtable responsedata, UUID id)
764 {
765 OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
766 if (args == null)
767 {
768 responsedata["int_response_code"] = 400;
769 responsedata["str_response_string"] = "false";
770 return;
771 }
772
773 // retrieve the regionhandle
774 ulong regionhandle = 0;
775 if (args["destination_handle"] != null)
776 UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
777
778 RegionInfo aRegion = new RegionInfo();
779 try
780 {
781 aRegion.UnpackRegionInfoData(args);
782 }
783 catch (Exception ex)
784 {
785 m_log.InfoFormat("[REST COMMS]: exception on unpacking HelloNeighbour message {0}", ex.Message);
786 return;
787 }
788
789 // This is the meaning of POST region
790 bool result = m_localBackend.SendHelloNeighbour(regionhandle, aRegion);
791
792 responsedata["int_response_code"] = 200;
793 responsedata["str_response_string"] = result.ToString();
794 }
795
796
797 #endregion 678 #endregion
798 679
799 #region Misc 680 #region Misc
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
new file mode 100644
index 0000000..7f6186c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
@@ -0,0 +1,136 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using log4net;
29using Nini.Config;
30using System;
31using System.Collections.Generic;
32using System.Reflection;
33using OpenSim.Framework;
34using OpenSim.Server.Base;
35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes;
37using OpenSim.Services.Interfaces;
38
39namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
40{
41 public class LocalNeighbourServicesConnector :
42 ISharedRegionModule, INeighbourService
43 {
44 private static readonly ILog m_log =
45 LogManager.GetLogger(
46 MethodBase.GetCurrentMethod().DeclaringType);
47
48 private List<Scene> m_Scenes = new List<Scene>();
49
50 private bool m_Enabled = false;
51
52 public LocalNeighbourServicesConnector()
53 {
54 }
55
56 public LocalNeighbourServicesConnector(List<Scene> scenes)
57 {
58 m_Scenes = scenes;
59 }
60
61 #region ISharedRegionModule
62
63 public string Name
64 {
65 get { return "LocalNeighbourServicesConnector"; }
66 }
67
68 public void Initialise(IConfigSource source)
69 {
70 IConfig moduleConfig = source.Configs["Modules"];
71 if (moduleConfig != null)
72 {
73 string name = moduleConfig.GetString("NeighbourServices", this.Name);
74 if (name == Name)
75 {
76 // m_Enabled rules whether this module registers as INeighbourService or not
77 m_Enabled = true;
78 m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled");
79 }
80 }
81 }
82
83 public void Close()
84 {
85 }
86
87 public void AddRegion(Scene scene)
88 {
89 // Always add
90 m_Scenes.Add(scene);
91
92 if (!m_Enabled)
93 return;
94
95 scene.RegisterModuleInterface<INeighbourService>(this);
96 }
97
98 public void RegionLoaded(Scene scene)
99 {
100 m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled for region " + scene.RegionInfo.RegionName);
101 }
102
103 public void PostInitialise()
104 {
105 }
106
107 public void RemoveRegion(Scene scene)
108 {
109 // Always remove
110 if (m_Scenes.Contains(scene))
111 m_Scenes.Remove(scene);
112 }
113
114 #endregion ISharedRegionModule
115
116 #region INeighbourService
117
118 public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
119 {
120 m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}",
121 thisRegion.RegionName, regionHandle, m_Scenes.Count);
122 foreach (Scene s in m_Scenes)
123 {
124 if (s.RegionInfo.RegionHandle == regionHandle)
125 {
126 m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour");
127 return s.IncomingHelloNeighbour(thisRegion);
128 }
129 }
130 m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle);
131 return false;
132 }
133
134 #endregion INeighbourService
135 }
136}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
new file mode 100644
index 0000000..b0bd428
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
@@ -0,0 +1,146 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using log4net;
29using System;
30using System.Collections.Generic;
31using System.Reflection;
32using Nini.Config;
33using OpenSim.Framework;
34using OpenSim.Services.Connectors;
35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes;
37using OpenSim.Services.Interfaces;
38using OpenSim.Server.Base;
39
40namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
41{
42 public class RemoteNeighbourServicesConnector :
43 NeighbourServicesConnector, ISharedRegionModule, INeighbourService
44 {
45 private static readonly ILog m_log =
46 LogManager.GetLogger(
47 MethodBase.GetCurrentMethod().DeclaringType);
48
49 private bool m_Enabled = false;
50 private LocalNeighbourServicesConnector m_LocalService;
51 private string serviceDll;
52 private List<Scene> m_Scenes = new List<Scene>();
53
54 public string Name
55 {
56 get { return "RemoteNeighbourServicesConnector"; }
57 }
58
59 public void Initialise(IConfigSource source)
60 {
61 IConfig moduleConfig = source.Configs["Modules"];
62 if (moduleConfig != null)
63 {
64 string name = moduleConfig.GetString("NeighbourServices");
65 if (name == Name)
66 {
67 m_LocalService = new LocalNeighbourServicesConnector();
68
69 //IConfig neighbourConfig = source.Configs["NeighbourService"];
70 //if (neighbourConfig == null)
71 //{
72 // m_log.Error("[NEIGHBOUR CONNECTOR]: NeighbourService missing from OpenSim.ini");
73 // return;
74 //}
75 //serviceDll = neighbourConfig.GetString("LocalServiceModule", String.Empty);
76 //if (serviceDll == String.Empty)
77 //{
78 // m_log.Error("[NEIGHBOUR CONNECTOR]: No LocalServiceModule named in section NeighbourService");
79 // return;
80 //}
81
82 m_Enabled = true;
83
84 m_log.Info("[NEIGHBOUR CONNECTOR]: Remote Neighbour connector enabled");
85 }
86 }
87 }
88
89 public void PostInitialise()
90 {
91 //if (m_Enabled)
92 //{
93 // Object[] args = new Object[] { m_Scenes };
94 // m_LocalService =
95 // ServerUtils.LoadPlugin<INeighbourService>(serviceDll,
96 // args);
97
98 // if (m_LocalService == null)
99 // {
100 // m_log.Error("[NEIGHBOUR CONNECTOR]: Can't load neighbour service");
101 // Unregister();
102 // return;
103 // }
104 //}
105 }
106
107 public void Close()
108 {
109 }
110
111 public void AddRegion(Scene scene)
112 {
113 if (!m_Enabled)
114 return;
115
116 scene.RegisterModuleInterface<INeighbourService>(this);
117 }
118
119 public void RemoveRegion(Scene scene)
120 {
121 if (m_Enabled && m_Scenes.Contains(scene))
122 m_Scenes.Remove(scene);
123 }
124
125 public void RegionLoaded(Scene scene)
126 {
127 if (!m_Enabled)
128 return;
129
130 m_log.InfoFormat("[NEIGHBOUR CONNECTOR]: Enabled remote neighbours for region {0}", scene.RegionInfo.RegionName);
131
132 }
133
134 #region INeighbourService
135
136 public override bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
137 {
138 if (m_LocalService.HelloNeighbour(regionHandle, thisRegion))
139 return true;
140
141 return base.HelloNeighbour(regionHandle, thisRegion);
142 }
143
144 #endregion INeighbourService
145 }
146}