From 7a9c85526cb99495bdd436150679941ef021b782 Mon Sep 17 00:00:00 2001
From: diva
Date: Sun, 14 Jun 2009 15:35:09 +0000
Subject: 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.

---
 .../Resources/CoreModulePlugin.addin.xml           |   2 +
 .../Interregion/LocalInterregionComms.cs           |  17 --
 .../Interregion/RESTInterregionComms.cs            | 119 ------------
 .../Neighbour/LocalNeighbourServiceConnector.cs    | 136 ++++++++++++++
 .../Neighbour/RemoteNeighourServiceConnector.cs    | 146 +++++++++++++++
 .../Framework/Interfaces/IInterregionComms.cs      |   5 -
 OpenSim/Region/Framework/Scenes/Scene.cs           |   2 +-
 .../Framework/Scenes/SceneCommunicationService.cs  |  16 +-
 OpenSim/Server/Handlers/Base/Utils.cs              |  97 ++++++++++
 .../Server/Handlers/Neighbour/NeighbourHandlers.cs | 203 +++++++++++++++++++++
 .../Neighbour/NeighbourServiceInConnector.cs       |  68 +++++++
 .../Server/Handlers/Simulation/AgentHandlers.cs    |   5 +-
 OpenSim/Server/Handlers/Simulation/Utils.cs        |  97 ----------
 .../NeighbourServiceInConnectorModule.cs           | 137 ++++++++++++++
 .../Resources/SimulatorServices.addin.xml          |   3 +-
 15 files changed, 806 insertions(+), 247 deletions(-)
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/LocalNeighbourServiceConnector.cs
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectors/Neighbour/RemoteNeighourServiceConnector.cs
 create mode 100644 OpenSim/Server/Handlers/Base/Utils.cs
 create mode 100644 OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
 create mode 100644 OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
 delete mode 100644 OpenSim/Server/Handlers/Simulation/Utils.cs
 create mode 100644 OpenSim/SimulatorServices/NeighbourServiceInConnectorModule.cs

(limited to 'OpenSim')

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 @@
         <RegionModule id="LocalInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.LocalInventoryServicesConnector" />
         <RegionModule id="RemoteInventoryServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.RemoteInventoryServicesConnector" />
         <RegionModule id="HGInventoryBroker" type="OpenSim.Region.CoreModules.ServiceConnectors.Inventory.HGInventoryBroker" />
+        <RegionModule id="LocalNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Neighbour.LocalNeighbourServicesConnector" />
+        <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectors.Neighbour.RemoteNeighbourServicesConnector" />
         <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" />
         <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" />
     </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
         }
 
 
-        /**
-         * Region-related communications 
-         */
-
-        public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
-        {
-            foreach (Scene s in m_sceneList)
-            {
-                if (s.RegionInfo.RegionHandle == regionHandle)
-                {
-                    //m_log.Debug("[LOCAL COMMS]: Found region to SendHelloNeighbour");
-                    return s.IncomingHelloNeighbour(thisRegion);
-                }
-            }
-            return false;
-        }
-
         #endregion /* IInterregionComms */
 
         #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
         {
             m_aScene.CommsManager.HttpServer.AddHTTPHandler("/agent/",  AgentHandler);
             m_aScene.CommsManager.HttpServer.AddHTTPHandler("/object/", ObjectHandler);
-            m_aScene.CommsManager.HttpServer.AddHTTPHandler("/region/", RegionHandler);
         }
 
         #endregion /* IRegionModule */
@@ -291,32 +290,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
             return false;
         }
 
-        /**
-         * Region-related communications 
-        */
-
-        public bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
-        {
-            // Try local first
-            if (m_localBackend.SendHelloNeighbour(regionHandle, thisRegion))
-            {
-                //m_log.Debug("[REST COMMS]: LocalBackEnd SendHelloNeighbour succeeded");
-                return true;
-            }
-
-            // else do the remote thing
-            RegionInfo regInfo = m_commsManager.GridService.RequestNeighbourInfo(regionHandle);
-            if ((regInfo != null) && 
-                // Don't remote-call this instance; that's a startup hickup
-                !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort)))
-            {
-                return m_regionClient.DoHelloNeighbourCall(regInfo, thisRegion);
-            }
-            //else
-            //    m_log.Warn("[REST COMMS]: Region not found " + regionHandle);
-            return false;
-        }
-
         #endregion /* IInterregionComms */
 
         #region Incoming calls from remote instances
@@ -702,98 +675,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Interregion
             responsedata["str_response_string"] = result.ToString();
         }
 
-        /*
-         * Region-related incoming calls
-         * 
-         */
-
-        public Hashtable RegionHandler(Hashtable request)
-        {
-            //m_log.Debug("[CONNECTION DEBUGGING]: RegionHandler Called");
-
-            //m_log.Debug("---------------------------");
-            //m_log.Debug(" >> uri=" + request["uri"]);
-            //m_log.Debug(" >> content-type=" + request["content-type"]);
-            //m_log.Debug(" >> http-method=" + request["http-method"]);
-            //m_log.Debug("---------------------------\n");
-
-            Hashtable responsedata = new Hashtable();
-            responsedata["content_type"] = "text/html";
-
-            UUID regionID;
-            string action;
-            ulong regionHandle;
-            if (!GetParams((string)request["uri"], out regionID, out regionHandle, out action))
-            {
-                m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]);
-                responsedata["int_response_code"] = 404;
-                responsedata["str_response_string"] = "false";
-
-                return responsedata;
-            }
-
-            // Next, let's parse the verb
-            string method = (string)request["http-method"];
-            if (method.Equals("POST"))
-            {
-                DoRegionPost(request, responsedata, regionID);
-                return responsedata;
-            }
-            //else if (method.Equals("PUT"))
-            //{
-            //    DoRegionPut(request, responsedata, regionID);
-            //    return responsedata;
-            //}
-            //else if (method.Equals("DELETE"))
-            //{
-            //    DoRegionDelete(request, responsedata, regiontID);
-            //    return responsedata;
-            //}
-            else
-            {
-                m_log.InfoFormat("[REST COMMS]: method {0} not supported in region message", method);
-                responsedata["int_response_code"] = 404;
-                responsedata["str_response_string"] = "false";
-
-                return responsedata;
-            }
-
-        }
-
-        protected virtual void DoRegionPost(Hashtable request, Hashtable responsedata, UUID id)
-        {
-            OSDMap args = RegionClient.GetOSDMap((string)request["body"]);
-            if (args == null)
-            {
-                responsedata["int_response_code"] = 400;
-                responsedata["str_response_string"] = "false";
-                return;
-            }
-
-            // retrieve the regionhandle
-            ulong regionhandle = 0;
-            if (args["destination_handle"] != null)
-                UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
-
-            RegionInfo aRegion = new RegionInfo();
-            try
-            {
-                aRegion.UnpackRegionInfoData(args);
-            }
-            catch (Exception ex)
-            {
-                m_log.InfoFormat("[REST COMMS]: exception on unpacking HelloNeighbour message {0}", ex.Message);
-                return;
-            }
-
-            // This is the meaning of POST region
-            bool result = m_localBackend.SendHelloNeighbour(regionhandle, aRegion);
-
-            responsedata["int_response_code"] = 200;
-            responsedata["str_response_string"] = result.ToString();
-        }
-
-
         #endregion 
 
         #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 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using log4net;
+using Nini.Config;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using OpenSim.Framework;
+using OpenSim.Server.Base;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
+{
+    public class LocalNeighbourServicesConnector :
+            ISharedRegionModule, INeighbourService
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private List<Scene> m_Scenes = new List<Scene>();
+
+        private bool m_Enabled = false;
+
+        public LocalNeighbourServicesConnector()
+        {
+        }
+
+        public LocalNeighbourServicesConnector(List<Scene> scenes)
+        {
+            m_Scenes = scenes;
+        }
+
+        #region ISharedRegionModule
+
+        public string Name
+        {
+            get { return "LocalNeighbourServicesConnector"; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                string name = moduleConfig.GetString("NeighbourServices", this.Name);
+                if (name == Name)
+                {
+                    // m_Enabled rules whether this module registers as INeighbourService or not
+                    m_Enabled = true;
+                    m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled");
+                }
+            }
+        }
+
+        public void Close()
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            // Always add
+            m_Scenes.Add(scene);
+
+            if (!m_Enabled)
+                return;
+
+            scene.RegisterModuleInterface<INeighbourService>(this);
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            m_log.Info("[NEIGHBOUR CONNECTOR]: Local neighbour connector enabled for region " + scene.RegionInfo.RegionName);
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            // Always remove 
+            if (m_Scenes.Contains(scene))
+                m_Scenes.Remove(scene);
+        }
+
+        #endregion ISharedRegionModule
+
+        #region INeighbourService
+
+        public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
+        {
+            m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}",
+                thisRegion.RegionName, regionHandle, m_Scenes.Count);
+            foreach (Scene s in m_Scenes)
+            {
+                if (s.RegionInfo.RegionHandle == regionHandle)
+                {
+                    m_log.Debug("[NEIGHBOUR CONNECTOR]: Found region to SendHelloNeighbour");
+                    return s.IncomingHelloNeighbour(thisRegion);
+                }
+            }
+            m_log.DebugFormat("[NEIGHBOUR CONNECTOR]: region handle {0} not found", regionHandle);
+            return false;
+        }
+
+        #endregion INeighbourService
+    }
+}
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 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using log4net;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Services.Connectors;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using OpenSim.Server.Base;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectors.Neighbour
+{
+    public class RemoteNeighbourServicesConnector :
+            NeighbourServicesConnector, ISharedRegionModule, INeighbourService
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private bool m_Enabled = false;
+        private LocalNeighbourServicesConnector m_LocalService;
+        private string serviceDll;
+        private List<Scene> m_Scenes = new List<Scene>();
+
+        public string Name
+        {
+            get { return "RemoteNeighbourServicesConnector"; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                string name = moduleConfig.GetString("NeighbourServices");
+                if (name == Name)
+                {
+                    m_LocalService = new LocalNeighbourServicesConnector();
+
+                    //IConfig neighbourConfig = source.Configs["NeighbourService"];
+                    //if (neighbourConfig == null)
+                    //{
+                    //    m_log.Error("[NEIGHBOUR CONNECTOR]: NeighbourService missing from OpenSim.ini");
+                    //    return;
+                    //}
+                    //serviceDll = neighbourConfig.GetString("LocalServiceModule", String.Empty);
+                    //if (serviceDll == String.Empty)
+                    //{
+                    //    m_log.Error("[NEIGHBOUR CONNECTOR]: No LocalServiceModule named in section NeighbourService");
+                    //    return;
+                    //}
+
+                    m_Enabled = true;
+
+                    m_log.Info("[NEIGHBOUR CONNECTOR]: Remote Neighbour connector enabled");
+                }
+            }
+        }
+
+        public void PostInitialise()
+        {
+            //if (m_Enabled)
+            //{
+            //    Object[] args = new Object[] { m_Scenes };
+            //    m_LocalService =
+            //            ServerUtils.LoadPlugin<INeighbourService>(serviceDll,
+            //            args);
+
+            //    if (m_LocalService == null)
+            //    {
+            //        m_log.Error("[NEIGHBOUR CONNECTOR]: Can't load neighbour service");
+            //        Unregister();
+            //        return;
+            //    }
+            //}
+        }
+
+        public void Close()
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            scene.RegisterModuleInterface<INeighbourService>(this);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (m_Enabled && m_Scenes.Contains(scene))
+                m_Scenes.Remove(scene);
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            m_log.InfoFormat("[NEIGHBOUR CONNECTOR]: Enabled remote neighbours for region {0}", scene.RegionInfo.RegionName);
+
+        }
+
+        #region INeighbourService
+
+        public override bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
+        {
+            if (m_LocalService.HelloNeighbour(regionHandle, thisRegion))
+                return true;
+
+            return base.HelloNeighbour(regionHandle, thisRegion);
+        }
+
+        #endregion INeighbourService
+    }
+}
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
 
         #endregion Objects
 
-        #region Regions
-
-        bool SendHelloNeighbour(ulong regionHandle, RegionInfo thisRegion);
-
-        #endregion Regions
     }
 
     // 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
 
             // These two 'commands' *must be* next to each other or sim rebooting fails.
             m_sceneGridService.RegisterRegion(m_interregionCommsOut, RegionInfo);
-            m_sceneGridService.InformNeighborsThatRegionisUp(RegionInfo);
+            m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo);
 
             Dictionary<string, string> dGridSettings = m_sceneGridService.GetGridSettings();
 
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;
 using OpenSim.Framework.Communications.Cache;
 using OpenSim.Framework.Communications.Capabilities;
 using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Services.Interfaces;
 using OSD = OpenMetaverse.StructuredData.OSD;
 
 namespace OpenSim.Region.Framework.Scenes
@@ -485,7 +486,7 @@ namespace OpenSim.Region.Framework.Scenes
 
         #endregion
 
-        public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle);
+        public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle);
 
         private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
         {
@@ -498,7 +499,7 @@ namespace OpenSim.Region.Framework.Scenes
         /// </summary>
         /// <param name="region"></param>
         /// <param name="regionhandle"></param>
-        private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle)
+        private void InformNeighboursThatRegionIsUpAsync(INeighbourService neighbourService, RegionInfo region, ulong regionhandle)
         {
             m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here");
             //RegionUpData regiondata = new RegionUpData(region.RegionLocX, region.RegionLocY, region.ExternalHostName, region.InternalEndPoint.Port);
@@ -506,7 +507,12 @@ namespace OpenSim.Region.Framework.Scenes
             //bool regionAccepted =
             //    m_commsProvider.InterRegion.RegionUp(new SerializableRegionInfo(region), regionhandle);
 
-            bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
+            //bool regionAccepted = m_interregionCommsOut.SendHelloNeighbour(regionhandle, region);
+            bool regionAccepted = false;
+            if (neighbourService != null)
+                regionAccepted = neighbourService.HelloNeighbour(regionhandle, region);
+            else
+                m_log.DebugFormat("[SCS]: No neighbour service provided for informing neigbhours of this region");
 
             if (regionAccepted)
             {
@@ -527,7 +533,7 @@ namespace OpenSim.Region.Framework.Scenes
         /// Called by scene when region is initialized (not always when it's listening for agents)
         /// This is an inter-region message that informs the surrounding neighbors that the sim is up.
         /// </summary>
-        public void InformNeighborsThatRegionisUp(RegionInfo region)
+        public void InformNeighborsThatRegionisUp(INeighbourService neighbourService, RegionInfo region)
         {
             //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
 
@@ -541,7 +547,7 @@ namespace OpenSim.Region.Framework.Scenes
                 {
                     InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync;
 
-                    d.BeginInvoke(region, neighbours[i].RegionHandle,
+                    d.BeginInvoke(neighbourService, region, neighbours[i].RegionHandle,
                                   InformNeighborsThatRegionisUpCompleted,
                                   d);
                 }
diff --git a/OpenSim/Server/Handlers/Base/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs
new file mode 100644
index 0000000..f1610ff
--- /dev/null
+++ b/OpenSim/Server/Handlers/Base/Utils.cs
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Net;
+
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Services.Interfaces;
+using OpenMetaverse;
+
+namespace OpenSim.Server.Handlers.Base
+{
+    public class RestHandlerUtils
+    {
+        /// <summary>
+        /// Extract the param from an uri.
+        /// </summary>
+        /// <param name="uri">Something like this: /uuid/ or /uuid/handle/release</param>
+        /// <param name="uri">uuid on uuid field</param>
+        /// <param name="action">optional action</param>
+        public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action)
+        {
+            uuid = UUID.Zero;
+            action = "";
+            regionHandle = 0;
+
+            path = path.Trim(new char[] { '/' });
+            string[] parts = path.Split('/');
+            if (parts.Length <= 1)
+            {
+                return false;
+            }
+            else
+            {
+                if (!UUID.TryParse(parts[0], out uuid))
+                    return false;
+
+                if (parts.Length >= 2)
+                    UInt64.TryParse(parts[1], out regionHandle);
+                if (parts.Length >= 3)
+                    action = parts[2];
+
+                return true;
+            }
+        }
+
+        public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey)
+        {
+            authority = string.Empty;
+            authKey = string.Empty;
+
+            Uri authUri;
+
+            string auth = httpRequest.Headers["authentication"];
+            // Authentication keys look like this:
+            // http://orgrid.org:8002/<uuid>
+            if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None")
+            {
+                if (Uri.TryCreate(auth, UriKind.Absolute, out authUri))
+                {
+                    authority = authUri.Authority;
+                    authKey = authUri.PathAndQuery.Trim('/');
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+    }
+}
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 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Net;
+using System.Text;
+
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using Nini.Config;
+using log4net;
+
+
+namespace OpenSim.Server.Handlers.Neighbour
+{
+    public class NeighbourGetHandler : BaseStreamHandler
+    {
+        // TODO: unused: private ISimulationService m_SimulationService;
+        // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+        public NeighbourGetHandler(INeighbourService service, IAuthenticationService authentication) :
+                base("GET", "/region")
+        {
+            // TODO: unused: m_SimulationService = service;
+            // TODO: unused: m_AuthenticationService = authentication;
+        }
+
+        public override byte[] Handle(string path, Stream request,
+                OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            // Not implemented yet
+            Console.WriteLine("--- Get region --- " + path);
+            httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+            return new byte[] { };
+        }
+    }
+
+    public class NeighbourPostHandler : BaseStreamHandler
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private INeighbourService m_NeighbourService;
+        private IAuthenticationService m_AuthenticationService;
+        // TODO: unused: private bool m_AllowForeignGuests;
+
+        public NeighbourPostHandler(INeighbourService service, IAuthenticationService authentication) :
+            base("POST", "/region")
+        {
+            m_NeighbourService = service;
+            m_AuthenticationService = authentication;
+            // TODO: unused: m_AllowForeignGuests = foreignGuests;
+        }
+
+        public override byte[] Handle(string path, Stream request,
+                OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            byte[] result = new byte[0];
+
+            UUID regionID;
+            string action;
+            ulong regionHandle;
+            if (RestHandlerUtils.GetParams(path, out regionID, out regionHandle, out action))
+            {
+                m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", path);
+                httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+                httpResponse.StatusDescription = "Invalid parameters for neighbour message " + path;
+
+                return result;
+            }
+
+            if (m_AuthenticationService != null)
+            {
+                // Authentication
+                string authority = string.Empty;
+                string authToken = string.Empty;
+                if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
+                {
+                    m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
+                    httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
+                    return result;
+                }
+                if (!m_AuthenticationService.VerifyUserKey(regionID, authToken))
+                {
+                    m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
+                    httpResponse.StatusCode = (int)HttpStatusCode.Forbidden;
+                    return result;
+                }
+                m_log.DebugFormat("[RegionPostHandler]: Authentication succeeded for {0}", regionID);
+            }
+
+            OSDMap args = Util.GetOSDMap(request, (int)httpRequest.ContentLength);
+            if (args == null)
+            {
+                httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+                httpResponse.StatusDescription = "Unable to retrieve data";
+                m_log.DebugFormat("[RegionPostHandler]: Unable to retrieve data for post {0}", path);
+                return result;
+            }
+
+            // retrieve the regionhandle
+            ulong regionhandle = 0;
+            if (args["destination_handle"] != null)
+                UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
+
+            RegionInfo aRegion = new RegionInfo();
+            try
+            {
+                aRegion.UnpackRegionInfoData(args);
+            }
+            catch (Exception ex)
+            {
+                m_log.InfoFormat("[RegionPostHandler]: exception on unpacking region info {0}", ex.Message);
+                httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+                httpResponse.StatusDescription = "Problems with data deserialization";
+                return result;
+            }
+
+            // Finally!
+            bool success = m_NeighbourService.HelloNeighbour(regionhandle, aRegion);
+
+            OSDMap resp = new OSDMap(1);
+
+            resp["success"] = OSD.FromBoolean(success);
+
+            httpResponse.StatusCode = (int)HttpStatusCode.OK;
+
+            return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp));
+        }
+    }
+
+    public class NeighbourPutHandler : BaseStreamHandler
+    {
+        // TODO: unused: private ISimulationService m_SimulationService;
+        // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+        public NeighbourPutHandler(INeighbourService service, IAuthenticationService authentication) :
+            base("PUT", "/region")
+        {
+            // TODO: unused: m_SimulationService = service;
+            // TODO: unused: m_AuthenticationService = authentication;
+        }
+
+        public override byte[] Handle(string path, Stream request,
+                OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            // Not implemented yet
+            httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+            return new byte[] { };
+        }
+    }
+
+    public class NeighbourDeleteHandler : BaseStreamHandler
+    {
+        // TODO: unused: private ISimulationService m_SimulationService;
+        // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+        public NeighbourDeleteHandler(INeighbourService service, IAuthenticationService authentication) :
+            base("DELETE", "/region")
+        {
+            // TODO: unused: m_SimulationService = service;
+            // TODO: unused: m_AuthenticationService = authentication;
+        }
+
+        public override byte[] Handle(string path, Stream request,
+                OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+        {
+            // Not implemented yet
+            httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+            return new byte[] { };
+        }
+    }
+}
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 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenSim.Server.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Base;
+
+namespace OpenSim.Server.Handlers.Neighbour
+{
+    public class NeighbourServiceInConnector : ServiceConnector
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        private INeighbourService m_NeighbourService;
+        private IAuthenticationService m_AuthenticationService = null;
+
+        public NeighbourServiceInConnector(IConfigSource source, IHttpServer server, INeighbourService nService, IScene scene) :
+                base(source, server)
+        {
+
+            m_NeighbourService = nService;
+            if (m_NeighbourService == null)
+            {
+                m_log.Error("[NEIGHBOUR IN CONNECTOR]: neighbour service was not provided");
+                return;
+            }
+            
+            //bool authentication = neighbourConfig.GetBoolean("RequireAuthentication", false);
+            //if (authentication)
+            //    m_AuthenticationService = scene.RequestModuleInterface<IAuthenticationService>();
+
+
+            server.AddStreamHandler(new NeighbourPostHandler(m_NeighbourService, m_AuthenticationService));
+            server.AddStreamHandler(new NeighbourGetHandler(m_NeighbourService, m_AuthenticationService));
+        }
+    }
+}
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;
 using System.Text;
 
 using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
 using OpenSim.Services.Interfaces;
 using OpenSim.Framework;
 using OpenSim.Framework.Servers.HttpServer;
@@ -88,7 +89,7 @@ namespace OpenSim.Server.Handlers.Simulation
             UUID agentID;
             string action;
             ulong regionHandle;
-            if (!Utils.GetParams(path, out agentID, out regionHandle, out action))
+            if (!RestHandlerUtils.GetParams(path, out agentID, out regionHandle, out action))
             {
                 m_log.InfoFormat("[AgentPostHandler]: Invalid parameters for agent message {0}", path);
                 httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
@@ -102,7 +103,7 @@ namespace OpenSim.Server.Handlers.Simulation
                 // Authentication
                 string authority = string.Empty;
                 string authToken = string.Empty;
-                if (!Utils.GetAuthentication(httpRequest, out authority, out authToken))
+                if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
                 {
                     m_log.InfoFormat("[AgentPostHandler]: Authentication failed for agent message {0}", path);
                     httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
diff --git a/OpenSim/Server/Handlers/Simulation/Utils.cs b/OpenSim/Server/Handlers/Simulation/Utils.cs
deleted file mode 100644
index e21d1b8..0000000
--- a/OpenSim/Server/Handlers/Simulation/Utils.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     * Neither the name of the OpenSimulator Project nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Net;
-
-using OpenSim.Framework;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Services.Interfaces;
-using OpenMetaverse;
-
-namespace OpenSim.Server.Handlers.Simulation
-{
-    public class Utils
-    {
-        /// <summary>
-        /// Extract the param from an uri.
-        /// </summary>
-        /// <param name="uri">Something like this: /uuid/ or /uuid/handle/release</param>
-        /// <param name="uri">uuid on uuid field</param>
-        /// <param name="action">optional action</param>
-        public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action)
-        {
-            uuid = UUID.Zero;
-            action = "";
-            regionHandle = 0;
-
-            path = path.Trim(new char[] { '/' });
-            string[] parts = path.Split('/');
-            if (parts.Length <= 1)
-            {
-                return false;
-            }
-            else
-            {
-                if (!UUID.TryParse(parts[0], out uuid))
-                    return false;
-
-                if (parts.Length >= 2)
-                    UInt64.TryParse(parts[1], out regionHandle);
-                if (parts.Length >= 3)
-                    action = parts[2];
-
-                return true;
-            }
-        }
-
-        public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey)
-        {
-            authority = string.Empty;
-            authKey = string.Empty;
-
-            Uri authUri;
-
-            string auth = httpRequest.Headers["authentication"];
-            // Authentication keys look like this:
-            // http://orgrid.org:8002/<uuid>
-            if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None")
-            {
-                if (Uri.TryCreate(auth, UriKind.Absolute, out authUri))
-                {
-                    authority = authUri.Authority;
-                    authKey = authUri.PathAndQuery.Trim('/');
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-    }
-}
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 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+using log4net;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+
+
+namespace OpenSim.SimulatorServices
+{
+    public class NeighbourServiceInConnectorModule : ISharedRegionModule, INeighbourService
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private static bool m_Enabled = false;
+        private static bool m_Registered = false;
+
+        private IConfigSource m_Config;
+        private List<Scene> m_Scenes = new List<Scene>();
+
+        #region IRegionModule interface
+
+        public void Initialise(IConfigSource config)
+        {
+            m_Config = config;
+
+            IConfig moduleConfig = config.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                m_Enabled = moduleConfig.GetBoolean("NeighbourServiceInConnector", false);
+                if (m_Enabled)
+                {
+                    m_log.Info("[NEIGHBOUR IN CONNECTOR]: NeighbourServiceInConnector enabled");
+                }
+
+            }
+
+        }
+
+        public void PostInitialise()
+        {
+            if (!m_Enabled)
+                return;
+
+            m_log.Info("[NEIGHBOUR IN CONNECTOR]: Starting...");
+        }
+
+        public void Close()
+        {
+        }
+
+        public string Name
+        {
+            get { return "NeighbourServiceInConnectorModule"; }
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            if (!m_Registered)
+            {
+                m_Registered = true;
+                Object[] args = new Object[] { m_Config, scene.CommsManager.HttpServer, this, scene };
+                ServerUtils.LoadPlugin<IServiceConnector>("OpenSim.Server.Handlers.dll:NeighbourServiceInConnector", args);
+            }
+
+            m_Scenes.Add(scene);
+
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (m_Enabled && m_Scenes.Contains(scene))
+                m_Scenes.Remove(scene);
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+        }
+
+        #endregion
+
+        #region INeighbourService
+
+        public bool HelloNeighbour(ulong regionHandle, RegionInfo thisRegion)
+        {
+            m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: HelloNeighbour from {0}, to {1}. Count = {2}",
+                thisRegion.RegionName, regionHandle, m_Scenes.Count);
+            foreach (Scene s in m_Scenes)
+            {
+                if (s.RegionInfo.RegionHandle == regionHandle)
+                {
+                    m_log.Debug("[NEIGHBOUR IN CONNECTOR]: Found region to SendHelloNeighbour");
+                    return s.IncomingHelloNeighbour(thisRegion);
+                }
+            }
+            m_log.DebugFormat("[NEIGHBOUR IN CONNECTOR]: region handle {0} not found", regionHandle);
+            return false;
+        }
+
+        #endregion INeighbourService
+    }
+}
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 @@
 
     <Extension path = "/OpenSim/RegionModules">
         <RegionModule id="RegionAssetService" type="OpenSim.SimulatorServices.RegionAssetService" />
-      <RegionModule id="RegionInventoryService" type="OpenSim.SimulatorServices.RegionInventoryService" />
+        <RegionModule id="RegionInventoryService" type="OpenSim.SimulatorServices.RegionInventoryService" />
+        <RegionModule id="NeighbourServiceInConnectorModule" type="OpenSim.SimulatorServices.NeighbourServiceInConnectorModule" />
     </Extension>
 
 </Addin>
-- 
cgit v1.1