aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authordiva2009-06-14 15:35:09 +0000
committerdiva2009-06-14 15:35:09 +0000
commit7a9c85526cb99495bdd436150679941ef021b782 (patch)
tree888b5bdf86f8327d2df0c1ca8f1cd3dd999d125d /OpenSim
parent* Temporarily resolve another problem in http://opensimulator.org/mantis/view... (diff)
downloadopensim-SC-7a9c85526cb99495bdd436150679941ef021b782.zip
opensim-SC-7a9c85526cb99495bdd436150679941ef021b782.tar.gz
opensim-SC-7a9c85526cb99495bdd436150679941ef021b782.tar.bz2
opensim-SC-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')
-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
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInterregionComms.cs5
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs16
-rw-r--r--OpenSim/Server/Handlers/Base/Utils.cs (renamed from OpenSim/Server/Handlers/Simulation/Utils.cs)194
-rw-r--r--OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs203
-rw-r--r--OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs68
-rw-r--r--OpenSim/Server/Handlers/Simulation/AgentHandlers.cs5
-rw-r--r--OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs137
-rw-r--r--OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml3
14 files changed, 806 insertions, 247 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}
diff --git a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
index d239ef4..8f4d3d5 100644
--- a/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInterregionComms.cs
@@ -100,11 +100,6 @@ namespace OpenSim.Region.Framework.Interfaces
100 100
101 #endregion Objects 101 #endregion Objects
102 102
103 #region Regions
104
105 bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion);
106
107 #endregion Regions
108 } 103 }
109 104
110 // This may not be needed, but having it here for now. 105 // This may not be needed, but having it here for now.
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5349d87..d3437b9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1198,7 +1198,7 @@ namespace OpenSim.Region.Framework.Scenes
1198 1198
1199 // These two 'commands' *must be* next to each other or sim rebooting fails. 1199 // These two 'commands' *must be* next to each other or sim rebooting fails.
1200 m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo); 1200 m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo);
1201 m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo); 1201 m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo);
1202 1202
1203 Dictionary<string, string> dGridSettings = m_sceneGridService.GetGridSettings(); 1203 Dictionary<string, string> dGridSettings = m_sceneGridService.GetGridSettings();
1204 1204
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 8cc5cd8..833f804 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Cache; 39using OpenSim.Framework.Communications.Cache;
40using OpenSim.Framework.Communications.Capabilities; 40using OpenSim.Framework.Communications.Capabilities;
41using OpenSim.Region.Framework.Interfaces; 41using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Services.Interfaces;
42using OSD = OpenMetaverse.StructuredData.OSD; 43using OSD = OpenMetaverse.StructuredData.OSD;
43 44
44namespace OpenSim.Region.Framework.Scenes 45namespace OpenSim.Region.Framework.Scenes
@@ -485,7 +486,7 @@ namespace OpenSim.Region.Framework.Scenes
485 486
486 #endregion 487 #endregion
487 488
488 public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle); 489 public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle);
489 490
490 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) 491 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
491 { 492 {
@@ -498,7 +499,7 @@ namespace OpenSim.Region.Framework.Scenes
498 /// </summary> 499 /// </summary>
499 /// <param name="region"></param> 500 /// <param name="region"></param>
500 /// <param name="regionhandle"></param> 501 /// <param name="regionhandle"></param>
501 private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle) 502 private void InformNeighboursThatRegionIsUpAsync(INeighbourService neighbourService, RegionInfo region, ulong regionhandle)
502 { 503 {
503 m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here"); 504 m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here");
504 //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port); 505 //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port);
@@ -506,7 +507,12 @@ namespace OpenSim.Region.Framework.Scenes
506 //bool regionAccepted = 507 //bool regionAccepted =
507 // m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle); 508 // m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle);
508 509
509 bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region); 510 //bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
511 bool regionAccepted = false;
512 if (neighbourService != null)
513 regionAccepted = neighbourService.HelloNeighbour(regionhandle, region);
514 else
515 m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region");
510 516
511 if (regionAccepted) 517 if (regionAccepted)
512 { 518 {
@@ -527,7 +533,7 @@ namespace OpenSim.Region.Framework.Scenes
527 /// Called by scene when region is initialized (not always when it's listening for agents) 533 /// Called by scene when region is initialized (not always when it's listening for agents)
528 /// This is an inter-region message that informs the surrounding neighbors that the sim is up. 534 /// This is an inter-region message that informs the surrounding neighbors that the sim is up.
529 /// </summary> 535 /// </summary>
530 public void InformNeighborsThatRegionisUp(RegionInfo region) 536 public void InformNeighborsThatRegionisUp(INeighbourService neighbourService, RegionInfo region)
531 { 537 {
532 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); 538 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
533 539
@@ -541,7 +547,7 @@ namespace OpenSim.Region.Framework.Scenes
541 { 547 {
542 InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync; 548 InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync;
543 549
544 d.BeginInvoke(region, neighbours[i].RegionHandle, 550 d.BeginInvoke(neighbourService, region, neighbours[i].RegionHandle,
545 InformNeighborsThatRegionisUpCompleted, 551 InformNeighborsThatRegionisUpCompleted,
546 d); 552 d);
547 } 553 }
diff --git a/OpenSim/Server/Handlers/Simulation/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs
index e21d1b8..f1610ff 100644
--- a/OpenSim/Server/Handlers/Simulation/Utils.cs
+++ b/OpenSim/Server/Handlers/Base/Utils.cs
@@ -1,97 +1,97 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the 12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products 13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14 * derived from this software without specific prior written permission.
15 * 15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 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 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 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 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. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Net; 30using System.Net;
31 31
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Framework.Servers.HttpServer; 33using OpenSim.Framework.Servers.HttpServer;
34using OpenSim.Services.Interfaces; 34using OpenSim.Services.Interfaces;
35using OpenMetaverse; 35using OpenMetaverse;
36 36
37namespace OpenSim.Server.Handlers.Simulation 37namespace OpenSim.Server.Handlers.Base
38{ 38{
39 public class Utils 39 public class RestHandlerUtils
40 { 40 {
41 /// <summary> 41 /// <summary>
42 /// Extract the param from an uri. 42 /// Extract the param from an uri.
43 /// </summary> 43 /// </summary>
44 /// <param name="uri">Something like this: /uuid/ or /uuid/handle/release</param> 44 /// <param name="uri">Something like this: /uuid/ or /uuid/handle/release</param>
45 /// <param name="uri">uuid on uuid field</param> 45 /// <param name="uri">uuid on uuid field</param>
46 /// <param name="action">optional action</param> 46 /// <param name="action">optional action</param>
47 public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action) 47 public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action)
48 { 48 {
49 uuid = UUID.Zero; 49 uuid = UUID.Zero;
50 action = ""; 50 action = "";
51 regionHandle = 0; 51 regionHandle = 0;
52 52
53 path = path.Trim(new char[] { '/' }); 53 path = path.Trim(new char[] { '/' });
54 string[] parts = path.Split('/'); 54 string[] parts = path.Split('/');
55 if (parts.Length <= 1) 55 if (parts.Length <= 1)
56 { 56 {
57 return false; 57 return false;
58 } 58 }
59 else 59 else
60 { 60 {
61 if (!UUID.TryParse(parts[0], out uuid)) 61 if (!UUID.TryParse(parts[0], out uuid))
62 return false; 62 return false;
63 63
64 if (parts.Length >= 2) 64 if (parts.Length >= 2)
65 UInt64.TryParse(parts[1], out regionHandle); 65 UInt64.TryParse(parts[1], out regionHandle);
66 if (parts.Length >= 3) 66 if (parts.Length >= 3)
67 action = parts[2]; 67 action = parts[2];
68 68
69 return true; 69 return true;
70 } 70 }
71 } 71 }
72 72
73 public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey) 73 public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey)
74 { 74 {
75 authority = string.Empty; 75 authority = string.Empty;
76 authKey = string.Empty; 76 authKey = string.Empty;
77 77
78 Uri authUri; 78 Uri authUri;
79 79
80 string auth = httpRequest.Headers["authentication"]; 80 string auth = httpRequest.Headers["authentication"];
81 // Authentication keys look like this: 81 // Authentication keys look like this:
82 // http://orgrid.org:8002/<uuid> 82 // http://orgrid.org:8002/<uuid>
83 if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None") 83 if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None")
84 { 84 {
85 if (Uri.TryCreate(auth, UriKind.Absolute, out authUri)) 85 if (Uri.TryCreate(auth, UriKind.Absolute, out authUri))
86 { 86 {
87 authority = authUri.Authority; 87 authority = authUri.Authority;
88 authKey = authUri.PathAndQuery.Trim('/'); 88 authKey = authUri.PathAndQuery.Trim('/');
89 return true; 89 return true;
90 } 90 }
91 } 91 }
92 92
93 return false; 93 return false;
94 } 94 }
95 95
96 } 96 }
97} 97}
diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
new file mode 100644
index 0000000..6336f4f
--- /dev/null
+++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
@@ -0,0 +1,203 @@
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 System;
29using System.IO;
30using System.Reflection;
31using System.Net;
32using System.Text;
33
34using OpenSim.Server.Base;
35using OpenSim.Server.Handlers.Base;
36using OpenSim.Services.Interfaces;
37using OpenSim.Framework;
38using OpenSim.Framework.Servers.HttpServer;
39
40using OpenMetaverse;
41using OpenMetaverse.StructuredData;
42using Nini.Config;
43using log4net;
44
45
46namespace OpenSim.Server.Handlers.Neighbour
47{
48 public class NeighbourGetHandler : BaseStreamHandler
49 {
50 // TODO: unused: private ISimulationService m_SimulationService;
51 // TODO: unused: private IAuthenticationService m_AuthenticationService;
52
53 public NeighbourGetHandler(INeighbourService service, IAuthenticationService authentication) :
54 base("GET", "/region")
55 {
56 // TODO: unused: m_SimulationService = service;
57 // TODO: unused: m_AuthenticationService = authentication;
58 }
59
60 public override byte[] Handle(string path, Stream request,
61 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
62 {
63 // Not implemented yet
64 Console.WriteLine("--- Get region --- " + path);
65 httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
66 return new byte[] { };
67 }
68 }
69
70 public class NeighbourPostHandler : BaseStreamHandler
71 {
72 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
73 private INeighbourService m_NeighbourService;
74 private IAuthenticationService m_AuthenticationService;
75 // TODO: unused: private bool m_AllowForeignGuests;
76
77 public NeighbourPostHandler(INeighbourService service, IAuthenticationService authentication) :
78 base("POST", "/region")
79 {
80 m_NeighbourService = service;
81 m_AuthenticationService = authentication;
82 // TODO: unused: m_AllowForeignGuests = foreignGuests;
83 }
84
85 public override byte[] Handle(string path, Stream request,
86 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
87 {
88 byte[] result = new byte[0];
89
90 UUID regionID;
91 string action;
92 ulong regionHandle;
93 if (RestHandlerUtils.GetParams(path, out regionID, out regionHandle, out action))
94 {
95 m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", path);
96 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
97 httpResponse.StatusDescription = "Invalid parameters for neighbour message " + path;
98
99 return result;
100 }
101
102 if (m_AuthenticationService != null)
103 {
104 // Authentication
105 string authority = string.Empty;
106 string authToken = string.Empty;
107 if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
108 {
109 m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
110 httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
111 return result;
112 }
113 if (!m_AuthenticationService.VerifyUserKey(regionID, authToken))
114 {
115 m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
116 httpResponse.StatusCode = (int)HttpStatusCode.Forbidden;
117 return result;
118 }
119 m_log.DebugFormat("[RegionPostHandler]: Authentication succeeded for {0}", regionID);
120 }
121
122 OSDMap args = Util.GetOSDMap(request, (int)httpRequest.ContentLength);
123 if (args == null)
124 {
125 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
126 httpResponse.StatusDescription = "Unable to retrieve data";
127 m_log.DebugFormat("[RegionPostHandler]: Unable to retrieve data for post {0}", path);
128 return result;
129 }
130
131 // retrieve the regionhandle
132 ulong regionhandle = 0;
133 if (args["destination_handle"] != null)
134 UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
135
136 RegionInfo aRegion = new RegionInfo();
137 try
138 {
139 aRegion.UnpackRegionInfoData(args);
140 }
141 catch (Exception ex)
142 {
143 m_log.InfoFormat("[RegionPostHandler]: exception on unpacking region info {0}", ex.Message);
144 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
145 httpResponse.StatusDescription = "Problems with data deserialization";
146 return result;
147 }
148
149 // Finally!
150 bool success = m_NeighbourService.HelloNeighbour(regionhandle, aRegion);
151
152 OSDMap resp = new OSDMap(1);
153
154 resp["success"] = OSD.FromBoolean(success);
155
156 httpResponse.StatusCode = (int)HttpStatusCode.OK;
157
158 return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp));
159 }
160 }
161
162 public class NeighbourPutHandler : BaseStreamHandler
163 {
164 // TODO: unused: private ISimulationService m_SimulationService;
165 // TODO: unused: private IAuthenticationService m_AuthenticationService;
166
167 public NeighbourPutHandler(INeighbourService service, IAuthenticationService authentication) :
168 base("PUT", "/region")
169 {
170 // TODO: unused: m_SimulationService = service;
171 // TODO: unused: m_AuthenticationService = authentication;
172 }
173
174 public override byte[] Handle(string path, Stream request,
175 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
176 {
177 // Not implemented yet
178 httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
179 return new byte[] { };
180 }
181 }
182
183 public class NeighbourDeleteHandler : BaseStreamHandler
184 {
185 // TODO: unused: private ISimulationService m_SimulationService;
186 // TODO: unused: private IAuthenticationService m_AuthenticationService;
187
188 public NeighbourDeleteHandler(INeighbourService service, IAuthenticationService authentication) :
189 base("DELETE", "/region")
190 {
191 // TODO: unused: m_SimulationService = service;
192 // TODO: unused: m_AuthenticationService = authentication;
193 }
194
195 public override byte[] Handle(string path, Stream request,
196 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
197 {
198 // Not implemented yet
199 httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
200 return new byte[] { };
201 }
202 }
203}
diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
new file mode 100644
index 0000000..a708b37
--- /dev/null
+++ b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
@@ -0,0 +1,68 @@
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 System;
29using System.Collections.Generic;
30using System.Reflection;
31using log4net;
32using Nini.Config;
33using OpenSim.Server.Base;
34using OpenSim.Services.Interfaces;
35using OpenSim.Framework;
36using OpenSim.Framework.Servers.HttpServer;
37using OpenSim.Server.Handlers.Base;
38
39namespace OpenSim.Server.Handlers.Neighbour
40{
41 public class NeighbourServiceInConnector : ServiceConnector
42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45 private INeighbourService m_NeighbourService;
46 private IAuthenticationService m_AuthenticationService = null;
47
48 public NeighbourServiceInConnector(IConfigSource source, IHttpServer server, INeighbourService nService, IScene scene) :
49 base(source, server)
50 {
51
52 m_NeighbourService = nService;
53 if (m_NeighbourService == null)
54 {
55 m_log.Error("[NEIGHBOUR IN CONNECTOR]: neighbour service was not provided");
56 return;
57 }
58
59 //bool authentication = neighbourConfig.GetBoolean("RequireAuthentication", false);
60 //if (authentication)
61 // m_AuthenticationService = scene.RequestModuleInterface<IAuthenticationService>();
62
63
64 server.AddStreamHandler(new NeighbourPostHandler(m_NeighbourService, m_AuthenticationService));
65 server.AddStreamHandler(new NeighbourGetHandler(m_NeighbourService, m_AuthenticationService));
66 }
67 }
68}
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index c14ad99..8e4d7d0 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -32,6 +32,7 @@ using System.Net;
32using System.Text; 32using System.Text;
33 33
34using OpenSim.Server.Base; 34using OpenSim.Server.Base;
35using OpenSim.Server.Handlers.Base;
35using OpenSim.Services.Interfaces; 36using OpenSim.Services.Interfaces;
36using OpenSim.Framework; 37using OpenSim.Framework;
37using OpenSim.Framework.Servers.HttpServer; 38using OpenSim.Framework.Servers.HttpServer;
@@ -88,7 +89,7 @@ namespace OpenSim.Server.Handlers.Simulation
88 UUID agentID; 89 UUID agentID;
89 string action; 90 string action;
90 ulong regionHandle; 91 ulong regionHandle;
91 if (!Utils.GetParams(path, out agentID, out regionHandle, out action)) 92 if (!RestHandlerUtils.GetParams(path, out agentID, out regionHandle, out action))
92 { 93 {
93 m_log.InfoFormat("[AgentPostHandler]: Invalid parameters for agent message {0}", path); 94 m_log.InfoFormat("[AgentPostHandler]: Invalid parameters for agent message {0}", path);
94 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; 95 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
@@ -102,7 +103,7 @@ namespace OpenSim.Server.Handlers.Simulation
102 // Authentication 103 // Authentication
103 string authority = string.Empty; 104 string authority = string.Empty;
104 string authToken = string.Empty; 105 string authToken = string.Empty;
105 if (!Utils.GetAuthentication(httpRequest, out authority, out authToken)) 106 if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
106 { 107 {
107 m_log.InfoFormat("[AgentPostHandler]: Authentication failed for agent message {0}", path); 108 m_log.InfoFormat("[AgentPostHandler]: Authentication failed for agent message {0}", path);
108 httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized; 109 httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
diff --git a/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs b/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs
new file mode 100644
index 0000000..e281ebb
--- /dev/null
+++ b/OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs
@@ -0,0 +1,137 @@
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 System;
29using System.Reflection;
30using System.Collections.Generic;
31using log4net;
32using Nini.Config;
33using OpenSim.Framework;
34using OpenSim.Framework.Servers.HttpServer;
35using OpenSim.Region.Framework.Scenes;
36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Server.Base;
38using OpenSim.Server.Handlers.Base;
39using OpenSim.Services.Interfaces;
40
41
42namespace OpenSim.SimulatorServices
43{
44 public class NeighbourServiceInConnectorModule : ISharedRegionModule, INeighbourService
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 private static bool m_Enabled = false;
48 private static bool m_Registered = false;
49
50 private IConfigSource m_Config;
51 private List<Scene> m_Scenes = new List<Scene>();
52
53 #region IRegionModule interface
54
55 public void Initialise(IConfigSource config)
56 {
57 m_Config = config;
58
59 IConfig moduleConfig = config.Configs["Modules"];
60 if (moduleConfig != null)
61 {
62 m_Enabled = moduleConfig.GetBoolean("NeighbourServiceInConnector", false);
63 if (m_Enabled)
64 {
65 m_log.Info("[NEIGHBOUR IN CONNECTOR]: NeighbourServiceInConnector enabled");
66 }
67
68 }
69
70 }
71
72 public void PostInitialise()
73 {
74 if (!m_Enabled)
75 return;
76
77 m_log.Info("[NEIGHBOUR IN CONNECTOR]: Starting...");
78 }
79
80 public void Close()
81 {
82 }
83
84 public string Name
85 {
86 get { return "NeighbourServiceInConnectorModule"; }
87 }
88
89 public void AddRegion(Scene scene)
90 {
91 if (!m_Enabled)
92 return;
93
94 if (!m_Registered)
95 {
96 m_Registered = true;
97 Object[] args = new Object[] { m_Config, scene.CommsManager.HttpServer, this, scene };
98 ServerUtils.LoadPlugin<IServiceConnector>("OpenSim.Server.Handlers.dll:NeighbourServiceInConnector", args);
99 }
100
101 m_Scenes.Add(scene);
102
103 }
104
105 public void RemoveRegion(Scene scene)
106 {
107 if (m_Enabled && m_Scenes.Contains(scene))
108 m_Scenes.Remove(scene);
109 }
110
111 public void RegionLoaded(Scene scene)
112 {
113 }
114
115 #endregion
116
117 #region INeighbourService
118
119 public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
120 {
121 m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}",
122 thisRegion.RegionName, regionHandle, m_Scenes.Count);
123 foreach (Scene s in m_Scenes)
124 {
125 if (s.RegionInfo.RegionHandle == regionHandle)
126 {
127 m_log.Debug("[NEIGHBOUR IN CONNECTOR]: Found region to SendHelloNeighbour");
128 return s.IncomingHelloNeighbour(thisRegion);
129 }
130 }
131 m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: region handle {0} not found", regionHandle);
132 return false;
133 }
134
135 #endregion INeighbourService
136 }
137}
diff --git a/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml b/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml
index 77d7d70..c83af7b 100644
--- a/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml
+++ b/OpenSim/SimulatorServices/Resources/SimulatorServices.addin.xml
@@ -9,7 +9,8 @@
9 9
10 <Extension path = "/OpenSim/RegionModules"> 10 <Extension path = "/OpenSim/RegionModules">
11 <RegionModule id="RegionAssetService" type="OpenSim.SimulatorServices.RegionAssetService" /> 11 <RegionModule id="RegionAssetService" type="OpenSim.SimulatorServices.RegionAssetService" />
12 <RegionModule id="RegionInventoryService" type="OpenSim.SimulatorServices.RegionInventoryService" /> 12 <RegionModule id="RegionInventoryService" type="OpenSim.SimulatorServices.RegionInventoryService" />
13 <RegionModule id="NeighbourServiceInConnectorModule" type="OpenSim.SimulatorServices.NeighbourServiceInConnectorModule" />
13 </Extension> 14 </Extension>
14 15
15</Addin> 16</Addin>