From ae07b220c61cc92453c67e602907f0b3c8fcc707 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Mon, 21 Sep 2009 17:16:30 -0700
Subject: Changed position methods so that they assume the input params are in
 meters.

---
 OpenSim/Services/GridService/GridService.cs | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 2229421..dd529f5 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -95,7 +95,9 @@ namespace OpenSim.Services.GridService
             if (region != null)
             {
                 // Not really? Maybe?
-                List<RegionData> rdatas = m_Database.Get(region.posX - 1, region.posY - 1, region.posX + 1, region.posY + 1, scopeID);
+                List<RegionData> rdatas = m_Database.Get(region.posX - (int)Constants.RegionSize, region.posY - (int)Constants.RegionSize, 
+                    region.posX + (int)Constants.RegionSize, region.posY + (int)Constants.RegionSize, scopeID);
+
                 foreach (RegionData rdata in rdatas)
                     rinfos.Add(RegionData2RegionInfo(rdata));
 
@@ -114,7 +116,9 @@ namespace OpenSim.Services.GridService
 
         public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
         {
-            RegionData rdata = m_Database.Get(x, y, scopeID);
+            int snapX = (int)(x / Constants.RegionSize) * (int)Constants.RegionSize;
+            int snapY = (int)(y / Constants.RegionSize) * (int)Constants.RegionSize;
+            RegionData rdata = m_Database.Get(snapX, snapY, scopeID);
             if (rdata != null)
                 return RegionData2RegionInfo(rdata);
 
@@ -151,7 +155,12 @@ namespace OpenSim.Services.GridService
 
         public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
-            List<RegionData> rdatas = m_Database.Get(xmin, ymin, xmax, ymax, scopeID);
+            int xminSnap = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize;
+            int xmaxSnap = (int)(xmax / Constants.RegionSize) * (int)Constants.RegionSize;
+            int yminSnap = (int)(ymin / Constants.RegionSize) * (int)Constants.RegionSize;
+            int ymaxSnap = (int)(ymax / Constants.RegionSize) * (int)Constants.RegionSize;
+
+            List<RegionData> rdatas = m_Database.Get(xminSnap, yminSnap, xmaxSnap, ymaxSnap, scopeID);
             List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
             foreach (RegionData rdata in rdatas)
                 rinfos.Add(RegionData2RegionInfo(rdata));
-- 
cgit v1.1


From a9ced0fe7962654be7bf7282babd475761f8bb50 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Mon, 21 Sep 2009 19:33:56 -0700
Subject: Added Remote grid connector module.

---
 .../Grid/RemoteGridServiceConnector.cs             | 108 +++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs

diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
new file mode 100644
index 0000000..b0cfc9c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -0,0 +1,108 @@
+/*
+ * 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;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
+{
+    public class RemoteGridServicesConnector :
+            GridServicesConnector, ISharedRegionModule, IGridService
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private bool m_Enabled = false;
+
+        public Type ReplaceableInterface 
+        {
+            get { return null; }
+        }
+
+        public string Name
+        {
+            get { return "RemoteGridServicesConnector"; }
+        }
+
+        public override void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                string name = moduleConfig.GetString("GridServices", "");
+                if (name == Name)
+                {
+                    IConfig gridConfig = source.Configs["GridService"];
+                    if (gridConfig == null)
+                    {
+                        m_log.Error("[GRID CONNECTOR]: GridService missing from OpenSim.ini");
+                        return;
+                    }
+
+                    m_Enabled = true;
+
+                    base.Initialise(source);
+
+                    m_log.Info("[GRID CONNECTOR]: Remote grid enabled");
+                }
+            }
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void Close()
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            scene.RegisterModuleInterface<IGridService>(this);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+        }
+    }
+}
-- 
cgit v1.1


From 34f4738159300ab6370e3db47df5187b6cea8771 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 22 Sep 2009 11:58:40 -0700
Subject: Added HGGridConnector and related code.

---
 .../ServiceConnectorsOut/Grid/HGGridConnector.cs   | 304 +++++++++++++++++++++
 .../Grid/LocalGridServiceConnector.cs              |  64 +++--
 .../Grid/RemoteGridServiceConnector.cs             |  34 ++-
 .../Server/Handlers/Grid/GridServerConnector.cs    |   2 +-
 .../Connectors/Grid/HypergridServiceConnector.cs   | 155 +++++++++++
 prebuild.xml                                       |   1 +
 6 files changed, 521 insertions(+), 39 deletions(-)
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
 create mode 100644 OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs

diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
new file mode 100644
index 0000000..b7e3213
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -0,0 +1,304 @@
+/*
+ * 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 OpenSim.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Services.Interfaces;
+using OpenSim.Server.Base;
+using OpenSim.Services.Connectors.Grid;
+
+using OpenMetaverse;
+using log4net;
+using Nini.Config;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
+{
+    public class HGGridConnector : ISharedRegionModule, IGridService
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private bool m_Enabled = false;
+        private bool m_Initialized = false;
+
+        private IGridService m_GridServiceConnector;
+        private HypergridServiceConnector m_HypergridServiceConnector;
+
+        // Hyperlink regions are hyperlinks on the map
+        protected Dictionary<UUID, SimpleRegionInfo> m_HyperlinkRegions = new Dictionary<UUID, SimpleRegionInfo>();
+
+        // Known regions are home regions of visiting foreign users.
+        // They are not on the map as static hyperlinks. They are dynamic hyperlinks, they go away when
+        // the visitor goes away. They are mapped to X=0 on the map.
+        // This is key-ed on agent ID
+        protected Dictionary<UUID, SimpleRegionInfo> m_knownRegions = new Dictionary<UUID, SimpleRegionInfo>();
+
+        #region ISharedRegionModule
+
+        public Type ReplaceableInterface
+        {
+            get { return null; }
+        }
+
+        public string Name
+        {
+            get { return "HGGridServicesConnector"; }
+        }
+
+        public void Initialise(IConfigSource source)
+        {
+            IConfig moduleConfig = source.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                string name = moduleConfig.GetString("GridServices", "");
+                if (name == Name)
+                {
+                    IConfig gridConfig = source.Configs["GridService"];
+                    if (gridConfig == null)
+                    {
+                        m_log.Error("[HGGRID CONNECTOR]: GridService missing from OpenSim.ini");
+                        return;
+                    }
+
+
+                    InitialiseConnectorModule(source);
+
+                    m_Enabled = true;
+                    m_log.Info("[HGGRID CONNECTOR]: HG grid enabled");
+                }
+            }
+        }
+
+        private void InitialiseConnectorModule(IConfigSource source)
+        {
+            IConfig gridConfig = source.Configs["GridService"];
+            if (gridConfig == null)
+            {
+                m_log.Error("[HGGRID CONNECTOR]: GridService missing from OpenSim.ini");
+                throw new Exception("Grid connector init error");
+            }
+
+            string module = gridConfig.GetString("GridServiceConnectorModule", String.Empty);
+            if (module == String.Empty)
+            {
+                m_log.Error("[HGGRID CONNECTOR]: No GridServiceConnectorModule named in section GridService");
+                //return;
+                throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's");
+            }
+
+            Object[] args = new Object[] { source };
+            m_GridServiceConnector = ServerUtils.LoadPlugin<IGridService>(module, args);
+
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void Close()
+        {
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            scene.RegisterModuleInterface<IGridService>(this);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+            if (m_Enabled && !m_Initialized)
+            {
+                m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService);
+                m_Initialized = true;
+            }
+        }
+
+        #endregion
+
+        #region IGridService
+
+        public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        {
+            // Region doesn't exist here. Trying to link remote region
+            if (regionInfo.RegionID.Equals(UUID.Zero))
+            {
+                m_log.Info("[HGrid]: Linking remote region " + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort);
+                regionInfo.RegionID = m_HypergridServiceConnector.LinkRegion(regionInfo); 
+                if (!regionInfo.RegionID.Equals(UUID.Zero))
+                {
+                    m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo);
+                    m_log.Info("[HGrid]: Successfully linked to region_uuid " + regionInfo.RegionID);
+
+                    // Try get the map image
+                    m_HypergridServiceConnector.GetMapImage(regionInfo);
+                    return true;
+                }
+                else
+                {
+                    m_log.Info("[HGrid]: No such region " + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort + "(" + regionInfo.InternalEndPoint.Port + ")");
+                    return false;
+                }
+                // Note that these remote regions aren't registered in localBackend, so return null, no local listeners
+            }
+            else // normal grid
+                return m_GridServiceConnector.RegisterRegion(scopeID, regionInfo);
+        }
+
+        public bool DeregisterRegion(UUID regionID)
+        {
+            // Try the hyperlink collection
+            if (m_HyperlinkRegions.ContainsKey(regionID))
+            {
+                m_HyperlinkRegions.Remove(regionID);
+                return true;
+            }
+            // Try the foreign users home collection
+            if (m_knownRegions.ContainsKey(regionID))
+            {
+                m_knownRegions.Remove(regionID);
+                return true;
+            }
+            // Finally, try the normal route
+            return m_GridServiceConnector.DeregisterRegion(regionID);
+        }
+
+        public List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        {
+            // No serving neighbours on hyperliked regions.
+            // Just the regular regions.
+            return m_GridServiceConnector.GetNeighbours(scopeID, regionID);
+        }
+
+        public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        {
+            // Try the hyperlink collection
+            if (m_HyperlinkRegions.ContainsKey(regionID))
+                return m_HyperlinkRegions[regionID];
+            
+            // Try the foreign users home collection
+            if (m_knownRegions.ContainsKey(regionID))
+                return m_knownRegions[regionID];
+
+            // Finally, try the normal route
+            return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID);
+        }
+
+        public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        {
+            int snapX = (int) (x / Constants.RegionSize) * (int)Constants.RegionSize;
+            int snapY = (int) (y / Constants.RegionSize) * (int)Constants.RegionSize;
+            // Try the hyperlink collection
+            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            {
+                if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY))
+                    return r;
+            }
+
+            // Try the foreign users home collection
+            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            {
+                if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY))
+                    return r;
+            }
+
+            // Finally, try the normal route
+            return m_GridServiceConnector.GetRegionByPosition(scopeID, x, y);
+        }
+
+        public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        {
+            // Try normal grid first
+            SimpleRegionInfo region = m_GridServiceConnector.GetRegionByName(scopeID, regionName);
+            if (region != null)
+                return region;
+
+            // !!! Commenting until region name exists
+            //// Try the hyperlink collection
+            //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            //{
+            //    if (r.RegionName == regionName)
+            //        return r;
+            //}
+
+            //// Try the foreign users home collection
+            //foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            //{
+            //    if (r.RegionName == regionName) 
+            //        return r;
+            //}
+            return null;
+        }
+
+        public List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        {
+            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+
+            // Commenting until regionname exists
+            //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            //    if ((r.RegionName != null) && r.RegionName.StartsWith(name))
+            //        rinfos.Add(r);
+
+            rinfos.AddRange(m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber));
+            return rinfos;
+        }
+
+        public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        {
+            int snapXmin = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize;
+            int snapXmax = (int)(xmax / Constants.RegionSize) * (int)Constants.RegionSize;
+            int snapYmin = (int)(ymin / Constants.RegionSize) * (int)Constants.RegionSize;
+            int snapYmax = (int)(ymax / Constants.RegionSize) * (int)Constants.RegionSize;
+
+            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+                if ((r.RegionLocX > snapXmin) && (r.RegionLocX < snapYmax) &&
+                    (r.RegionLocY > snapYmin) && (r.RegionLocY < snapYmax))
+                    rinfos.Add(r);
+
+            rinfos.AddRange(m_GridServiceConnector.GetRegionRange(scopeID, xmin, xmax, ymin, ymax));
+
+            return rinfos;
+        }
+
+        #endregion
+
+
+    }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index 74ece2e..3f29401 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -50,6 +50,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private bool m_Enabled = false;
 
+        public LocalGridServicesConnector(IConfigSource source)
+        {
+            InitialiseService(source);
+        }
+
         #region ISharedRegionModule
 
         public Type ReplaceableInterface 
@@ -70,38 +75,43 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 string name = moduleConfig.GetString("GridServices", "");
                 if (name == Name)
                 {
-                    IConfig assetConfig = source.Configs["GridService"];
-                    if (assetConfig == null)
-                    {
-                        m_log.Error("[GRID CONNECTOR]: GridService missing from OpenSim.ini");
-                        return;
-                    }
-
-                    string serviceDll = assetConfig.GetString("LocalServiceModule",
-                            String.Empty);
-
-                    if (serviceDll == String.Empty)
-                    {
-                        m_log.Error("[GRID CONNECTOR]: No LocalServiceModule named in section GridService");
-                        return;
-                    }
-
-                    Object[] args = new Object[] { source };
-                    m_GridService =
-                            ServerUtils.LoadPlugin<IGridService>(serviceDll,
-                            args);
-
-                    if (m_GridService == null)
-                    {
-                        m_log.Error("[GRID CONNECTOR]: Can't load asset service");
-                        return;
-                    }
+                    InitialiseService(source);
                     m_Enabled = true;
-                    m_log.Info("[GRID CONNECTOR]: Local grid connector enabled");
+                    m_log.Info("[LOCAL GRID CONNECTOR]: Local grid connector enabled");
                 }
             }
         }
 
+        private void InitialiseService(IConfigSource source)
+        {
+            IConfig assetConfig = source.Configs["GridService"];
+            if (assetConfig == null)
+            {
+                m_log.Error("[LOCAL GRID CONNECTOR]: GridService missing from OpenSim.ini");
+                return;
+            }
+
+            string serviceDll = assetConfig.GetString("LocalServiceModule",
+                    String.Empty);
+
+            if (serviceDll == String.Empty)
+            {
+                m_log.Error("[LOCAL GRID CONNECTOR]: No LocalServiceModule named in section GridService");
+                return;
+            }
+
+            Object[] args = new Object[] { source };
+            m_GridService =
+                    ServerUtils.LoadPlugin<IGridService>(serviceDll,
+                    args);
+
+            if (m_GridService == null)
+            {
+                m_log.Error("[LOCAL GRID CONNECTOR]: Can't load asset service");
+                return;
+            }
+        }
+
         public void PostInitialise()
         {
         }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index b0cfc9c..22b1015 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -47,6 +47,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private bool m_Enabled = false;
 
+        public RemoteGridServicesConnector(IConfigSource source)
+        {
+            InitialiseService(source);
+        }
+
+        #region ISharedRegionmodule
+
         public Type ReplaceableInterface 
         {
             get { return null; }
@@ -65,22 +72,25 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 string name = moduleConfig.GetString("GridServices", "");
                 if (name == Name)
                 {
-                    IConfig gridConfig = source.Configs["GridService"];
-                    if (gridConfig == null)
-                    {
-                        m_log.Error("[GRID CONNECTOR]: GridService missing from OpenSim.ini");
-                        return;
-                    }
-
+                    InitialiseService(source);
                     m_Enabled = true;
-
-                    base.Initialise(source);
-
-                    m_log.Info("[GRID CONNECTOR]: Remote grid enabled");
+                    m_log.Info("[REMOTE GRID CONNECTOR]: Remote grid enabled");
                 }
             }
         }
 
+        private void InitialiseService(IConfigSource source)
+        {
+            IConfig gridConfig = source.Configs["GridService"];
+            if (gridConfig == null)
+            {
+                m_log.Error("[REMOTE GRID CONNECTOR]: GridService missing from OpenSim.ini");
+                return;
+            }
+
+            base.Initialise(source);
+        }
+
         public void PostInitialise()
         {
         }
@@ -104,5 +114,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         public void RegionLoaded(Scene scene)
         {
         }
+
+        #endregion
     }
 }
diff --git a/OpenSim/Server/Handlers/Grid/GridServerConnector.cs b/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
index b80c479..7bf2e66 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
@@ -49,7 +49,7 @@ namespace OpenSim.Server.Handlers.Grid
                     String.Empty);
 
             if (gridService == String.Empty)
-                throw new Exception("No AuthenticationService in config file");
+                throw new Exception("No GridService in config file");
 
             Object[] args = new Object[] { config };
             m_GridService = ServerUtils.LoadPlugin<IGridService>(gridService, args);
diff --git a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
new file mode 100644
index 0000000..f68c10a
--- /dev/null
+++ b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
@@ -0,0 +1,155 @@
+/*
+ * 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.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Net;
+using System.Reflection;
+using OpenSim.Services.Interfaces;
+
+using OpenSim.Framework;
+
+using OpenMetaverse;
+using OpenMetaverse.Imaging;
+using log4net;
+using Nwc.XmlRpc;
+
+namespace OpenSim.Services.Connectors.Grid
+{
+    public class HypergridServiceConnector
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        private IAssetService m_AssetService;
+
+        public HypergridServiceConnector(IAssetService assService)
+        {
+            m_AssetService = assService;
+        }
+
+        public UUID LinkRegion(SimpleRegionInfo info)
+        {
+            UUID uuid = UUID.Zero;
+
+            //Hashtable hash = new Hashtable();
+            //hash["region_name"] = info.RegionName;
+
+            //IList paramList = new ArrayList();
+            //paramList.Add(hash);
+
+            //XmlRpcRequest request = new XmlRpcRequest("link_region", paramList);
+            //string uri = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/";
+            //m_log.Debug("[HGrid]: Linking to " + uri);
+            //XmlRpcResponse response = request.Send(uri, 10000);
+            //if (response.IsFault)
+            //{
+            //    m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString);
+            //}
+            //else
+            //{
+            //    hash = (Hashtable)response.Value;
+            //    //foreach (Object o in hash)
+            //    //    m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value);
+            //    try
+            //    {
+            //        UUID.TryParse((string)hash["uuid"], out uuid);
+            //        info.RegionID = uuid;
+            //        if ((string)hash["handle"] != null)
+            //        {
+            //            info.regionSecret = (string)hash["handle"];
+            //            //m_log.Debug(">> HERE: " + info.regionSecret);
+            //        }
+            //        if (hash["region_image"] != null)
+            //        {
+            //            UUID img = UUID.Zero;
+            //            UUID.TryParse((string)hash["region_image"], out img);
+            //            info.RegionSettings.TerrainImageID = img;
+            //        }
+            //        if (hash["region_name"] != null)
+            //        {
+            //            info.RegionName = (string)hash["region_name"];
+            //            //m_log.Debug(">> " + info.RegionName);
+            //        }
+            //        if (hash["internal_port"] != null)
+            //        {
+            //            int port = Convert.ToInt32((string)hash["internal_port"]);
+            //            info.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port);
+            //            //m_log.Debug(">> " + info.InternalEndPoint.ToString());
+            //        }
+            //        if (hash["remoting_port"] != null)
+            //        {
+            //            info.RemotingPort = Convert.ToUInt32(hash["remoting_port"]);
+            //            //m_log.Debug(">> " + info.RemotingPort);
+            //        }
+
+            //    }
+            //    catch (Exception e)
+            //    {
+            //        m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace);
+            //    }
+            //}
+            return uuid;
+        }
+
+        public void GetMapImage(SimpleRegionInfo info)
+        {
+            try
+            {
+                string regionimage = "regionImage" + info.RegionID.ToString();
+                regionimage = regionimage.Replace("-", "");
+
+                WebClient c = new WebClient();
+                string uri = "http://" + info.ExternalHostName + ":" + info.HttpPort + "/index.php?method=" + regionimage;
+                //m_log.Debug("JPEG: " + uri);
+                c.DownloadFile(uri, info.RegionID.ToString() + ".jpg");
+                Bitmap m = new Bitmap(info.RegionID.ToString() + ".jpg");
+                //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width);
+                byte[] imageData = OpenJPEG.EncodeFromImage(m, true);
+                AssetBase ass = new AssetBase(UUID.Random(), "region " + info.RegionID.ToString());
+                
+                // !!! for now
+                //info.RegionSettings.TerrainImageID = ass.FullID;
+
+                ass.Type = (int)AssetType.Texture;
+                ass.Temporary = true;
+                ass.Local = true;
+                ass.Data = imageData;
+
+                m_AssetService.Store(ass);
+
+            }
+            catch // LEGIT: Catching problems caused by OpenJPEG p/invoke
+            {
+                m_log.Warn("[HGrid]: Failed getting/storing map image, because it is probably already in the cache");
+            }
+        }
+
+    }
+}
diff --git a/prebuild.xml b/prebuild.xml
index 2265b09..b131019 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1205,6 +1205,7 @@
       <ReferencePath>../../../bin/</ReferencePath>
       <Reference name="System"/>
       <Reference name="System.Xml"/>
+      <Reference name="System.Drawing"/>
       <Reference name="OpenMetaverseTypes.dll"/>
       <Reference name="OpenMetaverse.dll"/>
       <Reference name="OpenMetaverse.StructuredData.dll"/>
-- 
cgit v1.1


From ffd30b8ac31bc408316079ba86076bf9e984a8be Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 22 Sep 2009 14:46:05 -0700
Subject: Moved RegionName from RegionInfo to SimpleRegionInfo.

---
 OpenSim/Framework/RegionInfo.cs                    |   8 +-
 .../CoreModules/Scripting/LSLHttp/UrlModule.cs     | 484 ++++++++++-----------
 .../ServiceConnectorsOut/Grid/HGGridConnector.cs   |  83 +++-
 .../Shared/Api/Implementation/LSL_Api.cs           |  10 +-
 .../Connectors/Grid/HypergridServiceConnector.cs   | 112 +++--
 OpenSim/Services/GridService/GridService.cs        |   4 +-
 6 files changed, 369 insertions(+), 332 deletions(-)

diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index afd50a9..0dc35a5 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -64,6 +64,13 @@ namespace OpenSim.Framework
         }
         protected string m_serverURI;
 
+        public string RegionName
+        {
+            get { return m_regionName; }
+            set { m_regionName = value; }
+        }
+        protected string m_regionName = String.Empty;
+
         protected bool Allow_Alternate_Ports;
         public bool m_allow_alternate_ports;
         protected string m_externalHostName;
@@ -284,7 +291,6 @@ namespace OpenSim.Framework
         public UUID originRegionID = UUID.Zero;
         public string proxyUrl = "";
         public int ProxyOffset = 0;
-        public string RegionName = String.Empty;
         public string regionSecret = UUID.Random().ToString();
         
         public string osSecret;
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 2d81e4c..8b7a878 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -54,12 +54,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
     {
         public UUID requestID;
         public Dictionary<string, string> headers;
-        public string body;
-        public int responseCode;
+        public string body;
+        public int responseCode;
         public string responseBody;
-        public ManualResetEvent ev;
+        public ManualResetEvent ev;
         public bool requestDone;
-        public int startTime;
+        public int startTime;
         public string uri;
     }
 
@@ -73,23 +73,23 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 new Dictionary<UUID, UrlData>();
 
         private Dictionary<string, UrlData> m_UrlMap =
-                new Dictionary<string, UrlData>();
-
+                new Dictionary<string, UrlData>();
+
 
         private int m_TotalUrls = 100;
 
-        private IHttpServer m_HttpServer = null;
-
-        private string m_ExternalHostNameForLSL = "";
+        private IHttpServer m_HttpServer = null;
+
+        private string m_ExternalHostNameForLSL = "";
 
         public Type ReplaceableInterface 
         {
             get { return null; }
-        }
-
-        private Hashtable HandleHttpPoll(Hashtable request)
-        {
-            return new Hashtable();
+        }
+
+        private Hashtable HandleHttpPoll(Hashtable request)
+        {
+            return new Hashtable();
         }
 
         public string Name
@@ -98,7 +98,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         }
 
         public void Initialise(IConfigSource config)
-        {
+        {
             m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName);
         }
 
@@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
 
         public void Close()
         {
-        }
+        }
         public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID)
         {
             UUID urlcode = UUID.Random();
@@ -141,8 +141,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 {
                     engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
                     return urlcode;
-                }
-                string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
+                }
+                string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
 
                 UrlData urlData = new UrlData();
                 urlData.hostID = host.UUID;
@@ -152,14 +152,14 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 urlData.urlcode = urlcode;
                 urlData.requests = new Dictionary<UUID, RequestData>();
 
-                
-                m_UrlMap[url] = urlData;
-                
-                string uri = "/lslhttp/" + urlcode.ToString() + "/";
-               
-                m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
-                        new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
-                            urlcode));
+                
+                m_UrlMap[url] = urlData;
+                
+                string uri = "/lslhttp/" + urlcode.ToString() + "/";
+               
+                m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
+                        new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
+                            urlcode));
 
                 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
             }
@@ -180,11 +180,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         {
             lock (m_UrlMap)
             {
-                UrlData data;
-
-                if (!m_UrlMap.TryGetValue(url, out data))
-                {
-                    return;
+                UrlData data;
+
+                if (!m_UrlMap.TryGetValue(url, out data))
+                {
+                    return;
                 }
 
                 foreach (UUID req in data.requests.Keys)
@@ -196,36 +196,36 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         }
         
         public void HttpResponse(UUID request, int status, string body)
-        {
-            if (m_RequestMap.ContainsKey(request))
-            {
-                UrlData urlData = m_RequestMap[request];
-                RequestData requestData=urlData.requests[request];
-                urlData.requests[request].responseCode = status;
-                urlData.requests[request].responseBody = body;
-                //urlData.requests[request].ev.Set();
-                urlData.requests[request].requestDone=true;
-            }
-            else
-            {
-                m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
+        {
+            if (m_RequestMap.ContainsKey(request))
+            {
+                UrlData urlData = m_RequestMap[request];
+                RequestData requestData=urlData.requests[request];
+                urlData.requests[request].responseCode = status;
+                urlData.requests[request].responseBody = body;
+                //urlData.requests[request].ev.Set();
+                urlData.requests[request].requestDone=true;
+            }
+            else
+            {
+                m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
             }
         }
 
         public string GetHttpHeader(UUID requestId, string header)
-        {
-            if (m_RequestMap.ContainsKey(requestId))
-            {
-                UrlData urlData=m_RequestMap[requestId];
-                string value;
-                if (urlData.requests[requestId].headers.TryGetValue(header,out value))
-                    return value;
-            }
-            else
-            {
+        {
+            if (m_RequestMap.ContainsKey(requestId))
+            {
+                UrlData urlData=m_RequestMap[requestId];
+                string value;
+                if (urlData.requests[requestId].headers.TryGetValue(header,out value))
+                    return value;
+            }
+            else
+            {
                 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId);
-            }
-            return String.Empty;
+            }
+            return String.Empty;
         }
 
         public int GetFreeUrls()
@@ -275,63 +275,63 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 foreach (string urlname in removeURLs)
                     m_UrlMap.Remove(urlname);
             }
-        }
-
+        }
+
 
         private void RemoveUrl(UrlData data)
         {
-            m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/");
-        }
-
-        private Hashtable NoEvents(UUID requestID, UUID sessionID)
-        {
-            Hashtable response = new Hashtable();
-            UrlData url;
-            lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                    return response;
-                url = m_RequestMap[requestID];
-            }
-
-            if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
-            {
-                response["int_response_code"] = 500;
-                response["str_response_string"] = "Script timeout";
-                response["content_type"] = "text/plain";
-                response["keepalive"] = false;
-                response["reusecontext"] = false;
-
-                //remove from map
-                lock (url)
-                {
-                    url.requests.Remove(requestID);
-                    m_RequestMap.Remove(requestID);
-                }
-
-                return response;
+            m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/");
+        }
+
+        private Hashtable NoEvents(UUID requestID, UUID sessionID)
+        {
+            Hashtable response = new Hashtable();
+            UrlData url;
+            lock (m_RequestMap)
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                    return response;
+                url = m_RequestMap[requestID];
+            }
+
+            if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
+            {
+                response["int_response_code"] = 500;
+                response["str_response_string"] = "Script timeout";
+                response["content_type"] = "text/plain";
+                response["keepalive"] = false;
+                response["reusecontext"] = false;
+
+                //remove from map
+                lock (url)
+                {
+                    url.requests.Remove(requestID);
+                    m_RequestMap.Remove(requestID);
+                }
+
+                return response;
             }
 
-            
-            return response;
-        }
-
+            
+            return response;
+        }
+
         private bool HasEvents(UUID requestID, UUID sessionID)
         {
-            UrlData url=null;
+            UrlData url=null;
             
             lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                {
-                    return false;
-                }
-                url = m_RequestMap[requestID];
-                if (!url.requests.ContainsKey(requestID))
-                {
-                    return false;
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                {
+                    return false;
                 }
-            }
+                url = m_RequestMap[requestID];
+                if (!url.requests.ContainsKey(requestID))
+                {
+                    return false;
+                }
+            }
 
             if (System.Environment.TickCount-url.requests[requestID].startTime>25000)
             {
@@ -343,146 +343,146 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
             else
                 return false;
 
-        }
-        private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
-        {
-            UrlData url = null;
-            RequestData requestData = null;
-
-            lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                    return NoEvents(requestID,sessionID);
-                url = m_RequestMap[requestID];
-                requestData = url.requests[requestID];
-            }
-
-            if (!requestData.requestDone)
-                return NoEvents(requestID,sessionID);
-            
-            Hashtable response = new Hashtable();
-
-            if (System.Environment.TickCount - requestData.startTime > 25000)
-            {
-                response["int_response_code"] = 500;
-                response["str_response_string"] = "Script timeout";
-                response["content_type"] = "text/plain";
-                response["keepalive"] = false;
-                response["reusecontext"] = false;
-                return response;
-            }
-            //put response
-            response["int_response_code"] = requestData.responseCode;
-            response["str_response_string"] = requestData.responseBody;
-            response["content_type"] = "text/plain";
-            response["keepalive"] = false;
-            response["reusecontext"] = false;
-            
-            //remove from map
-            lock (url)
-            {
-                url.requests.Remove(requestID);
-                m_RequestMap.Remove(requestID);
-            }
-
-            return response;
-        }
+        }
+        private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
+        {
+            UrlData url = null;
+            RequestData requestData = null;
+
+            lock (m_RequestMap)
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                    return NoEvents(requestID,sessionID);
+                url = m_RequestMap[requestID];
+                requestData = url.requests[requestID];
+            }
+
+            if (!requestData.requestDone)
+                return NoEvents(requestID,sessionID);
+            
+            Hashtable response = new Hashtable();
+
+            if (System.Environment.TickCount - requestData.startTime > 25000)
+            {
+                response["int_response_code"] = 500;
+                response["str_response_string"] = "Script timeout";
+                response["content_type"] = "text/plain";
+                response["keepalive"] = false;
+                response["reusecontext"] = false;
+                return response;
+            }
+            //put response
+            response["int_response_code"] = requestData.responseCode;
+            response["str_response_string"] = requestData.responseBody;
+            response["content_type"] = "text/plain";
+            response["keepalive"] = false;
+            response["reusecontext"] = false;
+            
+            //remove from map
+            lock (url)
+            {
+                url.requests.Remove(requestID);
+                m_RequestMap.Remove(requestID);
+            }
+
+            return response;
+        }
         public void HttpRequestHandler(UUID requestID, Hashtable request)
-        {
-            lock (request)
-            {
-                string uri = request["uri"].ToString();
-                
-                try
-                {
-                    Hashtable headers = (Hashtable)request["headers"];
-                    
-                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
-
-                    int pos1 = uri.IndexOf("/");// /lslhttp
-                    int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
-                    int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/
-                    string uri_tmp = uri.Substring(0, pos3 + 1);
-                    //HTTP server code doesn't provide us with QueryStrings
-                    string pathInfo;
-                    string queryString;
-                    queryString = "";
-
-                    pathInfo = uri.Substring(pos3);
-
-                    UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
-
-                    //for llGetHttpHeader support we need to store original URI here
-                    //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 
-                    //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader
-
-                    RequestData requestData = new RequestData();
-                    requestData.requestID = requestID;
-                    requestData.requestDone = false;
-                    requestData.startTime = System.Environment.TickCount;
-                    requestData.uri = uri;
-                    if (requestData.headers == null)
-                        requestData.headers = new Dictionary<string, string>();
-
-                    foreach (DictionaryEntry header in headers)
-                    {
-                        string key = (string)header.Key;
-                        string value = (string)header.Value;
-                        requestData.headers.Add(key, value);
-                    }
-                    foreach (DictionaryEntry de in request)
-                    {
-                        if (de.Key.ToString() == "querystringkeys")
-                        {
-                            System.String[] keys = (System.String[])de.Value;
-                            foreach (String key in keys)
-                            {
-                                if (request.ContainsKey(key))
-                                {
-                                    string val = (String)request[key];
-                                    queryString = queryString + key + "=" + val + "&";
-                                }
-                            }
-                            if (queryString.Length > 1)
-                                queryString = queryString.Substring(0, queryString.Length - 1);
-
-                        }
-
-                    }
-
-                    //if this machine is behind DNAT/port forwarding, currently this is being
-                    //set to address of port forwarding router
-                    requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"];
-                    requestData.headers["x-path-info"] = pathInfo;
-                    requestData.headers["x-query-string"] = queryString;
-                    requestData.headers["x-script-url"] = url.url;
-
-                    requestData.ev = new ManualResetEvent(false);
-                    lock (url.requests)
-                    {
-                        url.requests.Add(requestID, requestData);
-                    }
-                    lock (m_RequestMap)
-                    {
-                        //add to request map
-                        m_RequestMap.Add(requestID, url);
-                    }
-
-                    url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
-
-                    //send initial response?
-                    Hashtable response = new Hashtable();
-
-                    return;
-
-                }
-                catch (Exception we)
-                {
-                    //Hashtable response = new Hashtable();
-                    m_log.Warn("[HttpRequestHandler]: http-in request failed");
-                    m_log.Warn(we.Message);
-                    m_log.Warn(we.StackTrace);
-                }
+        {
+            lock (request)
+            {
+                string uri = request["uri"].ToString();
+                
+                try
+                {
+                    Hashtable headers = (Hashtable)request["headers"];
+                    
+                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
+
+                    int pos1 = uri.IndexOf("/");// /lslhttp
+                    int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
+                    int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/
+                    string uri_tmp = uri.Substring(0, pos3 + 1);
+                    //HTTP server code doesn't provide us with QueryStrings
+                    string pathInfo;
+                    string queryString;
+                    queryString = "";
+
+                    pathInfo = uri.Substring(pos3);
+
+                    UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
+
+                    //for llGetHttpHeader support we need to store original URI here
+                    //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 
+                    //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader
+
+                    RequestData requestData = new RequestData();
+                    requestData.requestID = requestID;
+                    requestData.requestDone = false;
+                    requestData.startTime = System.Environment.TickCount;
+                    requestData.uri = uri;
+                    if (requestData.headers == null)
+                        requestData.headers = new Dictionary<string, string>();
+
+                    foreach (DictionaryEntry header in headers)
+                    {
+                        string key = (string)header.Key;
+                        string value = (string)header.Value;
+                        requestData.headers.Add(key, value);
+                    }
+                    foreach (DictionaryEntry de in request)
+                    {
+                        if (de.Key.ToString() == "querystringkeys")
+                        {
+                            System.String[] keys = (System.String[])de.Value;
+                            foreach (String key in keys)
+                            {
+                                if (request.ContainsKey(key))
+                                {
+                                    string val = (String)request[key];
+                                    queryString = queryString + key + "=" + val + "&";
+                                }
+                            }
+                            if (queryString.Length > 1)
+                                queryString = queryString.Substring(0, queryString.Length - 1);
+
+                        }
+
+                    }
+
+                    //if this machine is behind DNAT/port forwarding, currently this is being
+                    //set to address of port forwarding router
+                    requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"];
+                    requestData.headers["x-path-info"] = pathInfo;
+                    requestData.headers["x-query-string"] = queryString;
+                    requestData.headers["x-script-url"] = url.url;
+
+                    requestData.ev = new ManualResetEvent(false);
+                    lock (url.requests)
+                    {
+                        url.requests.Add(requestID, requestData);
+                    }
+                    lock (m_RequestMap)
+                    {
+                        //add to request map
+                        m_RequestMap.Add(requestID, url);
+                    }
+
+                    url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
+
+                    //send initial response?
+                    Hashtable response = new Hashtable();
+
+                    return;
+
+                }
+                catch (Exception we)
+                {
+                    //Hashtable response = new Hashtable();
+                    m_log.Warn("[HttpRequestHandler]: http-in request failed");
+                    m_log.Warn(we.Message);
+                    m_log.Warn(we.StackTrace);
+                }
             }
         }
 
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index b7e3213..e3cb05c 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -63,6 +63,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         // This is key-ed on agent ID
         protected Dictionary<UUID, SimpleRegionInfo> m_knownRegions = new Dictionary<UUID, SimpleRegionInfo>();
 
+        protected Dictionary<UUID, ulong> m_HyperlinkHandles = new Dictionary<UUID, ulong>();
+
         #region ISharedRegionModule
 
         public Type ReplaceableInterface
@@ -160,10 +162,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             if (regionInfo.RegionID.Equals(UUID.Zero))
             {
                 m_log.Info("[HGrid]: Linking remote region " + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort);
-                regionInfo.RegionID = m_HypergridServiceConnector.LinkRegion(regionInfo); 
+                ulong regionHandle = 0;
+                regionInfo.RegionID = m_HypergridServiceConnector.LinkRegion(regionInfo, out regionHandle); 
                 if (!regionInfo.RegionID.Equals(UUID.Zero))
                 {
-                    m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo);
+                    AddHyperlinkRegion(regionInfo, regionHandle);
                     m_log.Info("[HGrid]: Successfully linked to region_uuid " + regionInfo.RegionID);
 
                     // Try get the map image
@@ -186,15 +189,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             // Try the hyperlink collection
             if (m_HyperlinkRegions.ContainsKey(regionID))
             {
-                m_HyperlinkRegions.Remove(regionID);
+                RemoveHyperlinkRegion(regionID);
                 return true;
             }
             // Try the foreign users home collection
-            if (m_knownRegions.ContainsKey(regionID))
-            {
-                m_knownRegions.Remove(regionID);
-                return true;
-            }
+
+            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+                if (r.RegionID == regionID)
+                {
+                    RemoveHyperlinkHomeRegion(regionID);
+                    return true;
+                }
+
             // Finally, try the normal route
             return m_GridServiceConnector.DeregisterRegion(regionID);
         }
@@ -213,8 +219,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 return m_HyperlinkRegions[regionID];
             
             // Try the foreign users home collection
-            if (m_knownRegions.ContainsKey(regionID))
-                return m_knownRegions[regionID];
+            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+                if (r.RegionID == regionID)
+                    return m_knownRegions[regionID];
 
             // Finally, try the normal route
             return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID);
@@ -249,20 +256,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             if (region != null)
                 return region;
 
-            // !!! Commenting until region name exists
-            //// Try the hyperlink collection
-            //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
-            //{
-            //    if (r.RegionName == regionName)
-            //        return r;
-            //}
-
-            //// Try the foreign users home collection
-            //foreach (SimpleRegionInfo r in m_knownRegions.Values)
-            //{
-            //    if (r.RegionName == regionName) 
-            //        return r;
-            //}
+            // Try the hyperlink collection
+            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            {
+                if (r.RegionName == regionName)
+                    return r;
+            }
+
+            // Try the foreign users home collection
+            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            {
+                if (r.RegionName == regionName)
+                    return r;
+            }
             return null;
         }
 
@@ -299,6 +305,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #endregion
 
+        private void AddHyperlinkRegion(SimpleRegionInfo regionInfo, ulong regionHandle)
+        {
+            m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo);
+            m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle);
+        }
+
+        private void RemoveHyperlinkRegion(UUID regionID)
+        {
+            m_HyperlinkRegions.Remove(regionID);
+            m_HyperlinkHandles.Remove(regionID);
+        }
+
+        private void AddHyperlinkHomeRegion(UUID userID, SimpleRegionInfo regionInfo, ulong regionHandle)
+        {
+            m_knownRegions.Add(userID, regionInfo);
+            m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle);
+        }
+
+        private void RemoveHyperlinkHomeRegion(UUID regionID)
+        {
+            foreach (KeyValuePair<UUID, SimpleRegionInfo> kvp in m_knownRegions)
+            {
+                if (kvp.Value.RegionID == regionID)
+                {
+                    m_knownRegions.Remove(kvp.Key);
+                }
+            }
+            m_HyperlinkHandles.Remove(regionID);
+        }
 
     }
 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index b631478..d4d5ccc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7838,8 +7838,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
         public LSL_String llGetHTTPHeader(LSL_Key request_id, string header)
         {
             m_host.AddScriptLPS(1);
-             
-           if (m_UrlModule != null)
+             
+           if (m_UrlModule != null)
                return m_UrlModule.GetHttpHeader(new UUID(request_id), header);
            return String.Empty;
         }
@@ -9124,9 +9124,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             // Partial implementation: support for parameter flags needed
             //   see http://wiki.secondlife.com/wiki/llHTTPResponse
 
-            m_host.AddScriptLPS(1);
-
-            if (m_UrlModule != null)
+            m_host.AddScriptLPS(1);
+
+            if (m_UrlModule != null)
                 m_UrlModule.HttpResponse(new UUID(id), status,body);
         }
 
diff --git a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
index f68c10a..6b0518c 100644
--- a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
@@ -54,67 +54,63 @@ namespace OpenSim.Services.Connectors.Grid
             m_AssetService = assService;
         }
 
-        public UUID LinkRegion(SimpleRegionInfo info)
+        public UUID LinkRegion(SimpleRegionInfo info, out ulong realHandle)
         {
             UUID uuid = UUID.Zero;
+            realHandle = 0;
 
-            //Hashtable hash = new Hashtable();
-            //hash["region_name"] = info.RegionName;
-
-            //IList paramList = new ArrayList();
-            //paramList.Add(hash);
-
-            //XmlRpcRequest request = new XmlRpcRequest("link_region", paramList);
-            //string uri = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/";
-            //m_log.Debug("[HGrid]: Linking to " + uri);
-            //XmlRpcResponse response = request.Send(uri, 10000);
-            //if (response.IsFault)
-            //{
-            //    m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString);
-            //}
-            //else
-            //{
-            //    hash = (Hashtable)response.Value;
-            //    //foreach (Object o in hash)
-            //    //    m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value);
-            //    try
-            //    {
-            //        UUID.TryParse((string)hash["uuid"], out uuid);
-            //        info.RegionID = uuid;
-            //        if ((string)hash["handle"] != null)
-            //        {
-            //            info.regionSecret = (string)hash["handle"];
-            //            //m_log.Debug(">> HERE: " + info.regionSecret);
-            //        }
-            //        if (hash["region_image"] != null)
-            //        {
-            //            UUID img = UUID.Zero;
-            //            UUID.TryParse((string)hash["region_image"], out img);
-            //            info.RegionSettings.TerrainImageID = img;
-            //        }
-            //        if (hash["region_name"] != null)
-            //        {
-            //            info.RegionName = (string)hash["region_name"];
-            //            //m_log.Debug(">> " + info.RegionName);
-            //        }
-            //        if (hash["internal_port"] != null)
-            //        {
-            //            int port = Convert.ToInt32((string)hash["internal_port"]);
-            //            info.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port);
-            //            //m_log.Debug(">> " + info.InternalEndPoint.ToString());
-            //        }
-            //        if (hash["remoting_port"] != null)
-            //        {
-            //            info.RemotingPort = Convert.ToUInt32(hash["remoting_port"]);
-            //            //m_log.Debug(">> " + info.RemotingPort);
-            //        }
-
-            //    }
-            //    catch (Exception e)
-            //    {
-            //        m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace);
-            //    }
-            //}
+            Hashtable hash = new Hashtable();
+            hash["region_name"] = info.RegionName;
+
+            IList paramList = new ArrayList();
+            paramList.Add(hash);
+
+            XmlRpcRequest request = new XmlRpcRequest("link_region", paramList);
+            string uri = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/";
+            m_log.Debug("[HGrid]: Linking to " + uri);
+            XmlRpcResponse response = request.Send(uri, 10000);
+            if (response.IsFault)
+            {
+                m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString);
+            }
+            else
+            {
+                hash = (Hashtable)response.Value;
+                //foreach (Object o in hash)
+                //    m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value);
+                try
+                {
+                    UUID.TryParse((string)hash["uuid"], out uuid);
+                    info.RegionID = uuid;
+                    if ((string)hash["handle"] != null)
+                    {
+                        realHandle = Convert.ToUInt64((string)hash["handle"]);
+                        m_log.Debug(">> HERE, realHandle: " + realHandle);
+                    }
+                    //if (hash["region_image"] != null)
+                    //{
+                    //    UUID img = UUID.Zero;
+                    //    UUID.TryParse((string)hash["region_image"], out img);
+                    //    info.RegionSettings.TerrainImageID = img;
+                    //}
+                    if (hash["region_name"] != null)
+                    {
+                        info.RegionName = (string)hash["region_name"];
+                        //m_log.Debug(">> " + info.RegionName);
+                    }
+                    if (hash["internal_port"] != null)
+                    {
+                        int port = Convert.ToInt32((string)hash["internal_port"]);
+                        info.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port);
+                        //m_log.Debug(">> " + info.InternalEndPoint.ToString());
+                    }
+
+                }
+                catch (Exception e)
+                {
+                    m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace);
+                }
+            }
             return uuid;
         }
 
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index dd529f5..b37a51b 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -179,7 +179,7 @@ namespace OpenSim.Services.GridService
             rdata.posY = (int)rinfo.RegionLocY;
             rdata.RegionID = rinfo.RegionID;
             rdata.Data = rinfo.ToKeyValuePairs();
-            //rdata.RegionName = rinfo.RegionName;
+            rdata.RegionName = rinfo.RegionName;
 
             return rdata;
         }
@@ -190,7 +190,7 @@ namespace OpenSim.Services.GridService
             rinfo.RegionLocX = (uint)rdata.posX;
             rinfo.RegionLocY = (uint)rdata.posY;
             rinfo.RegionID = rdata.RegionID;
-            //rinfo.RegionName = rdata.RegionName;
+            rinfo.RegionName = rdata.RegionName;
 
             return rinfo;
         }
-- 
cgit v1.1


From 882d2c9cc399c4c7d1809702104ce94c9c2c7b17 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 22 Sep 2009 20:25:00 -0700
Subject: Added hg console commands to the module. Added the IN connector
 module for link-region and corresponding handler to be used in the regions
 only. No service as such is needed. This will replace the current link-region
 machinery. Compiles but not tested.

---
 OpenSim/Framework/RegionInfo.cs                    |   1 +
 .../Grid/HypergridServiceInConnectorModule.cs      | 129 +++++++++
 .../ServiceConnectorsOut/Grid/HGCommands.cs        | 295 +++++++++++++++++++++
 .../ServiceConnectorsOut/Grid/HGGridConnector.cs   | 213 ++++++++++++++-
 .../Grid/RemoteGridServiceConnector.cs             |  64 ++++-
 .../Handlers/Grid/HypergridServerConnector.cs      | 112 ++++++++
 .../Connectors/Grid/GridServiceConnector.cs        |  16 +-
 7 files changed, 817 insertions(+), 13 deletions(-)
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
 create mode 100644 OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs

diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index 0dc35a5..cee1d4b 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -108,6 +108,7 @@ namespace OpenSim.Framework
 
         public SimpleRegionInfo(RegionInfo ConvertFrom)
         {
+            m_regionName = ConvertFrom.RegionName;
             m_regionLocX = ConvertFrom.RegionLocX;
             m_regionLocY = ConvertFrom.RegionLocY;
             m_internalEndPoint = ConvertFrom.InternalEndPoint;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
new file mode 100644
index 0000000..8d113d3
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
@@ -0,0 +1,129 @@
+/*
+ * 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.Server.Handlers.Grid;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid
+{
+    public class HypergridServiceInConnectorModule : ISharedRegionModule
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private static bool m_Enabled = false;
+        
+        private IConfigSource m_Config;
+        bool m_Registered = false;
+        HypergridServiceInConnector m_HypergridHandler;
+
+        #region IRegionModule interface
+
+        public void Initialise(IConfigSource config)
+        {
+            //// This module is only on for standalones in hypergrid mode
+            //enabled = (!config.Configs["Startup"].GetBoolean("gridmode", true)) &&
+            //    config.Configs["Startup"].GetBoolean("hypergrid", true);
+            //m_log.DebugFormat("[RegionInventoryService]: enabled? {0}", enabled);
+            m_Config = config;
+            IConfig moduleConfig = config.Configs["Modules"];
+            if (moduleConfig != null)
+            {
+                m_Enabled = moduleConfig.GetBoolean("HypergridServiceInConnector", false);
+                if (m_Enabled)
+                {
+                    m_log.Info("[INVENTORY IN CONNECTOR]: Hypergrid Service In Connector enabled");
+                }
+
+            }
+
+        }
+
+        public void PostInitialise()
+        {
+        }
+
+        public void Close()
+        {
+        }
+
+        public Type ReplaceableInterface 
+        {
+            get { return null; }
+        }
+
+        public string Name
+        {
+            get { return "HypergridService"; }
+        }
+
+        public void AddRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            if (!m_Registered)
+            {
+                m_Registered = true;
+
+                m_log.Info("[HypergridService]: Starting...");
+
+                Object[] args = new Object[] { m_Config, MainServer.Instance };
+
+                m_HypergridHandler = new HypergridServiceInConnector(m_Config, MainServer.Instance);
+                    //ServerUtils.LoadPlugin<HypergridServiceInConnector>("OpenSim.Server.Handlers.dll:HypergridServiceInConnector", args);
+            }
+
+            SimpleRegionInfo rinfo = new SimpleRegionInfo(scene.RegionInfo);
+            m_HypergridHandler.AddRegion(rinfo);
+        }
+
+        public void RemoveRegion(Scene scene)
+        {
+            if (!m_Enabled)
+                return;
+
+            SimpleRegionInfo rinfo = new SimpleRegionInfo(scene.RegionInfo);
+            m_HypergridHandler.RemoveRegion(rinfo);
+        }
+
+        public void RegionLoaded(Scene scene)
+        {
+        }
+
+        #endregion
+
+    }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
new file mode 100644
index 0000000..eee3a6c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
@@ -0,0 +1,295 @@
+/*
+ * 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 System.Xml;
+using log4net;
+using Nini.Config;
+using OpenSim.Framework;
+//using OpenSim.Framework.Communications;
+using OpenSim.Framework.Console;
+using OpenSim.Region.Framework;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Scenes.Hypergrid;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
+{
+    public class HGCommands
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private HGGridConnector m_HGGridConnector;
+        private Scene m_scene;
+
+        private static uint m_autoMappingX = 0;
+        private static uint m_autoMappingY = 0;
+        private static bool m_enableAutoMapping = false;
+
+        public HGCommands(HGGridConnector hgConnector, Scene scene)
+        {
+            m_HGGridConnector = hgConnector;
+            m_scene = scene;
+        }
+
+        //public static Scene CreateScene(RegionInfo regionInfo, AgentCircuitManager circuitManager, CommunicationsManager m_commsManager,
+        //    StorageManager storageManager, ModuleLoader m_moduleLoader, ConfigSettings m_configSettings, OpenSimConfigSource m_config, string m_version)
+        //{
+        //    HGSceneCommunicationService sceneGridService = new HGSceneCommunicationService(m_commsManager, HGServices);
+
+        //    return
+        //        new HGScene(
+        //            regionInfo, circuitManager, m_commsManager, sceneGridService, storageManager,
+        //            m_moduleLoader, false, m_configSettings.PhysicalPrim,
+        //            m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version);
+        //}
+
+        public void RunCommand(string module, string[] cmdparams)
+        {
+            List<string> args = new List<string>(cmdparams);
+            if (args.Count < 1)
+                return;
+
+            string command = args[0];
+            args.RemoveAt(0);
+
+            cmdparams = args.ToArray();
+
+            RunHGCommand(command, cmdparams);
+            
+        }
+
+        private void RunHGCommand(string command, string[] cmdparams)
+        {
+            if (command.Equals("link-mapping"))
+            {
+                if (cmdparams.Length == 2)
+                {
+                    try
+                    {
+                        m_autoMappingX = Convert.ToUInt32(cmdparams[0]);
+                        m_autoMappingY = Convert.ToUInt32(cmdparams[1]);
+                        m_enableAutoMapping = true;
+                    }
+                    catch (Exception)
+                    {
+                        m_autoMappingX = 0;
+                        m_autoMappingY = 0;
+                        m_enableAutoMapping = false;
+                    }
+                }
+            }
+            else if (command.Equals("link-region"))
+            {
+                if (cmdparams.Length < 3)
+                {
+                    if ((cmdparams.Length == 1) || (cmdparams.Length == 2))
+                    {
+                        LoadXmlLinkFile(cmdparams);
+                    }
+                    else
+                    {
+                        LinkRegionCmdUsage();
+                    }
+                    return;
+                }
+
+                if (cmdparams[2].Contains(":"))
+                {
+                    // New format
+                    uint xloc, yloc;
+                    string mapName;
+                    try
+                    {
+                        xloc = Convert.ToUInt32(cmdparams[0]);
+                        yloc = Convert.ToUInt32(cmdparams[1]);
+                        mapName = cmdparams[2];
+                        if (cmdparams.Length > 3)
+                            for (int i = 3; i < cmdparams.Length; i++)
+                                mapName += " " + cmdparams[i];
+
+                        m_log.Info(">> MapName: " + mapName);
+                        //internalPort = Convert.ToUInt32(cmdparams[4]);
+                        //remotingPort = Convert.ToUInt32(cmdparams[5]);
+                    }
+                    catch (Exception e)
+                    {
+                        m_log.Warn("[HGrid] Wrong format for link-region command: " + e.Message);
+                        LinkRegionCmdUsage();
+                        return;
+                    }
+
+                    m_HGGridConnector.TryLinkRegionToCoords(m_scene, null, mapName, xloc, yloc);
+                }
+                else
+                {
+                    // old format
+                    SimpleRegionInfo regInfo;
+                    uint xloc, yloc;
+                    uint externalPort;
+                    string externalHostName;
+                    try
+                    {
+                        xloc = Convert.ToUInt32(cmdparams[0]);
+                        yloc = Convert.ToUInt32(cmdparams[1]);
+                        externalPort = Convert.ToUInt32(cmdparams[3]);
+                        externalHostName = cmdparams[2];
+                        //internalPort = Convert.ToUInt32(cmdparams[4]);
+                        //remotingPort = Convert.ToUInt32(cmdparams[5]);
+                    }
+                    catch (Exception e)
+                    {
+                        m_log.Warn("[HGrid] Wrong format for link-region command: " + e.Message);
+                        LinkRegionCmdUsage();
+                        return;
+                    }
+
+                    //if (TryCreateLink(xloc, yloc, externalPort, externalHostName, out regInfo))
+                    if (m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort, externalHostName, out regInfo))
+                    {
+                        if (cmdparams.Length >= 5)
+                        {
+                            regInfo.RegionName = "";
+                            for (int i = 4; i < cmdparams.Length; i++)
+                                regInfo.RegionName += cmdparams[i] + " ";
+                        }
+                    }
+                }
+                return;
+            }
+            else if (command.Equals("unlink-region"))
+            {
+                if (cmdparams.Length < 1)
+                {
+                    UnlinkRegionCmdUsage();
+                    return;
+                }
+                if (m_HGGridConnector.TryUnlinkRegion(m_scene, cmdparams[0]))
+                    m_log.InfoFormat("[HGrid]: Successfully unlinked {0}", cmdparams[0]);
+                else
+                    m_log.InfoFormat("[HGrid]: Unable to unlink {0}, region not found", cmdparams[0]);
+            }
+        }
+
+        private void LoadXmlLinkFile(string[] cmdparams)
+        {
+            //use http://www.hgurl.com/hypergrid.xml for test
+            try
+            {
+                XmlReader r = XmlReader.Create(cmdparams[0]);
+                XmlConfigSource cs = new XmlConfigSource(r);
+                string[] excludeSections = null;
+
+                if (cmdparams.Length == 2)
+                {
+                    if (cmdparams[1].ToLower().StartsWith("excludelist:"))
+                    {
+                        string excludeString = cmdparams[1].ToLower();
+                        excludeString = excludeString.Remove(0, 12);
+                        char[] splitter = { ';' };
+
+                        excludeSections = excludeString.Split(splitter);
+                    }
+                }
+
+                for (int i = 0; i < cs.Configs.Count; i++)
+                {
+                    bool skip = false;
+                    if ((excludeSections != null) && (excludeSections.Length > 0))
+                    {
+                        for (int n = 0; n < excludeSections.Length; n++)
+                        {
+                            if (excludeSections[n] == cs.Configs[i].Name.ToLower())
+                            {
+                                skip = true;
+                                break;
+                            }
+                        }
+                    }
+                    if (!skip)
+                    {
+                        ReadLinkFromConfig(cs.Configs[i]);
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                m_log.Error(e.ToString());
+            }
+        }
+
+
+        private void ReadLinkFromConfig(IConfig config)
+        {
+            SimpleRegionInfo regInfo;
+            uint xloc, yloc;
+            uint externalPort;
+            string externalHostName;
+            uint realXLoc, realYLoc;
+
+            xloc = Convert.ToUInt32(config.GetString("xloc", "0"));
+            yloc = Convert.ToUInt32(config.GetString("yloc", "0"));
+            externalPort = Convert.ToUInt32(config.GetString("externalPort", "0"));
+            externalHostName = config.GetString("externalHostName", "");
+            realXLoc = Convert.ToUInt32(config.GetString("real-xloc", "0"));
+            realYLoc = Convert.ToUInt32(config.GetString("real-yloc", "0"));
+
+            if (m_enableAutoMapping)
+            {
+                xloc = (uint)((xloc % 100) + m_autoMappingX);
+                yloc = (uint)((yloc % 100) + m_autoMappingY);
+            }
+
+            if (((realXLoc == 0) && (realYLoc == 0)) ||
+                (((realXLoc - xloc < 3896) || (xloc - realXLoc < 3896)) &&
+                 ((realYLoc - yloc < 3896) || (yloc - realYLoc < 3896))))
+            {
+                if (
+                    m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort,
+                                              externalHostName, out regInfo))
+                {
+                    regInfo.RegionName = config.GetString("localName", "");
+                }
+            }
+        }
+
+
+        private void LinkRegionCmdUsage()
+        {
+            m_log.Info("Usage: link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>]");
+            m_log.Info("Usage: link-region <Xloc> <Yloc> <HostName> <HttpPort> [<LocalName>]");
+            m_log.Info("Usage: link-region <URI_of_xml> [<exclude>]");
+        }
+
+        private void UnlinkRegionCmdUsage()
+        {
+            m_log.Info("Usage: unlink-region <HostName>:<HttpPort>");
+            m_log.Info("Usage: unlink-region <LocalName>");
+        }
+
+    }
+}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index e3cb05c..7aeb761 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -27,14 +27,18 @@
 
 using System;
 using System.Collections.Generic;
+using System.Net;
 using System.Reflection;
+using System.Xml;
 
 using OpenSim.Framework;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Framework.Scenes.Hypergrid;
 using OpenSim.Services.Interfaces;
 using OpenSim.Server.Base;
 using OpenSim.Services.Connectors.Grid;
+using OpenSim.Framework.Console;
 
 using OpenMetaverse;
 using log4net;
@@ -94,7 +98,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
 
                     InitialiseConnectorModule(source);
-
+                    
                     m_Enabled = true;
                     m_log.Info("[HGGRID CONNECTOR]: HG grid enabled");
                 }
@@ -137,6 +141,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 return;
 
             scene.RegisterModuleInterface<IGridService>(this);
+
         }
 
         public void RemoveRegion(Scene scene)
@@ -145,11 +150,25 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         public void RegionLoaded(Scene scene)
         {
-            if (m_Enabled && !m_Initialized)
+            if (!m_Enabled)
+                return;
+
+            if (!m_Initialized)
             {
                 m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService);
                 m_Initialized = true;
             }
+
+            HGCommands hgCommands = new HGCommands(this, scene);
+            scene.AddCommand("HG", "link-region",
+                "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>",
+                "Link a hypergrid region", hgCommands.RunCommand);
+            scene.AddCommand("HG", "unlink-region",
+                "unlink-region <local name> or <HostName>:<HttpPort> <cr>",
+                "Unlink a hypergrid region", hgCommands.RunCommand);
+            scene.AddCommand("HG", "link-mapping", "link-mapping [<x> <y>] <cr>",
+                "Set local coordinate to map HG regions to", hgCommands.RunCommand);
+
         }
 
         #endregion
@@ -305,6 +324,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #endregion
 
+        #region Auxiliary
+
         private void AddHyperlinkRegion(SimpleRegionInfo regionInfo, ulong regionHandle)
         {
             m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo);
@@ -334,6 +355,194 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             }
             m_HyperlinkHandles.Remove(regionID);
         }
+        #endregion
+
+        #region Hyperlinks
+
+        private static Random random = new Random();
+
+        public SimpleRegionInfo TryLinkRegionToCoords(Scene m_scene, IClientAPI client, string mapName, uint xloc, uint yloc)
+        {
+            string host = "127.0.0.1";
+            string portstr;
+            string regionName = "";
+            uint port = 9000;
+            string[] parts = mapName.Split(new char[] { ':' });
+            if (parts.Length >= 1)
+            {
+                host = parts[0];
+            }
+            if (parts.Length >= 2)
+            {
+                portstr = parts[1];
+                if (!UInt32.TryParse(portstr, out port))
+                    regionName = parts[1];
+            }
+            // always take the last one
+            if (parts.Length >= 3)
+            {
+                regionName = parts[2];
+            }
+
+            // Sanity check. Don't ever link to this sim.
+            IPAddress ipaddr = null;
+            try
+            {
+                ipaddr = Util.GetHostFromDNS(host);
+            }
+            catch { }
+
+            if ((ipaddr != null) &&
+                !((m_scene.RegionInfo.ExternalEndPoint.Address.Equals(ipaddr)) && (m_scene.RegionInfo.HttpPort == port)))
+            {
+                SimpleRegionInfo regInfo;
+                bool success = TryCreateLink(m_scene, client, xloc, yloc, regionName, port, host, out regInfo);
+                if (success)
+                {
+                    regInfo.RegionName = mapName;
+                    return regInfo;
+                }
+            }
+
+            return null;
+        }
+
+        public SimpleRegionInfo TryLinkRegion(Scene m_scene, IClientAPI client, string mapName)
+        {
+            uint xloc = (uint)(random.Next(0, Int16.MaxValue));
+            return TryLinkRegionToCoords(m_scene, client, mapName, xloc, 0);
+        }
+
+        public bool TryCreateLink(Scene m_scene, IClientAPI client, uint xloc, uint yloc,
+            string externalRegionName, uint externalPort, string externalHostName, out SimpleRegionInfo regInfo)
+        {
+            m_log.DebugFormat("[HGrid]: Link to {0}:{1}, in {2}-{3}", externalHostName, externalPort, xloc, yloc);
+
+            regInfo = new SimpleRegionInfo();
+            regInfo.RegionName = externalRegionName;
+            regInfo.HttpPort = externalPort;
+            regInfo.ExternalHostName = externalHostName;
+            regInfo.RegionLocX = xloc;
+            regInfo.RegionLocY = yloc;
+
+            try
+            {
+                regInfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)0);
+            }
+            catch (Exception e)
+            {
+                m_log.Warn("[HGrid]: Wrong format for link-region: " + e.Message);
+                return false;
+            }
+
+            // Finally, link it
+            try
+            {
+                RegisterRegion(UUID.Zero, regInfo);
+            }
+            catch (Exception e)
+            {
+                m_log.Warn("[HGrid]: Unable to link region: " + e.Message);
+                return false;
+            }
+
+            uint x, y;
+            if (!Check4096(m_scene, regInfo, out x, out y))
+            {
+                DeregisterRegion(regInfo.RegionID);
+                if (client != null)
+                    client.SendAlertMessage("Region is too far (" + x + ", " + y + ")");
+                m_log.Info("[HGrid]: Unable to link, region is too far (" + x + ", " + y + ")");
+                return false;
+            }
+
+            if (!CheckCoords(m_scene.RegionInfo.RegionLocX, m_scene.RegionInfo.RegionLocY, x, y))
+            {
+                DeregisterRegion(regInfo.RegionID);
+                if (client != null)
+                    client.SendAlertMessage("Region has incompatible coordinates (" + x + ", " + y + ")");
+                m_log.Info("[HGrid]: Unable to link, region has incompatible coordinates (" + x + ", " + y + ")");
+                return false;
+            }
+
+            m_log.Debug("[HGrid]: link region succeeded");
+            return true;
+        }
+
+        public bool TryUnlinkRegion(Scene m_scene, string mapName)
+        {
+            SimpleRegionInfo regInfo = null;
+            if (mapName.Contains(":"))
+            {
+                string host = "127.0.0.1";
+                //string portstr;
+                //string regionName = "";
+                uint port = 9000;
+                string[] parts = mapName.Split(new char[] { ':' });
+                if (parts.Length >= 1)
+                {
+                    host = parts[0];
+                }
+                //                if (parts.Length >= 2)
+                //                {
+                //                    portstr = parts[1];
+                //                    if (!UInt32.TryParse(portstr, out port))
+                //                        regionName = parts[1];
+                //                }
+                // always take the last one
+                //                if (parts.Length >= 3)
+                //                {
+                //                    regionName = parts[2];
+                //                }
+                foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+                    if (host.Equals(r.ExternalHostName) && (port == r.HttpPort))
+                        regInfo = r;
+            }
+            else
+            {
+                foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+                    if (r.RegionName.Equals(mapName))
+                        regInfo = r;
+            }
+            if (regInfo != null)
+            {
+                return DeregisterRegion(regInfo.RegionID);
+            }
+            else
+            {
+                m_log.InfoFormat("[HGrid]: Region {0} not found", mapName);
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Cope with this viewer limitation.
+        /// </summary>
+        /// <param name="regInfo"></param>
+        /// <returns></returns>
+        public bool Check4096(Scene m_scene, SimpleRegionInfo regInfo, out uint x, out uint y)
+        {
+            ulong realHandle = m_HyperlinkHandles[regInfo.RegionID];
+            Utils.LongToUInts(realHandle, out x, out y);
+            x = x / Constants.RegionSize;
+            y = y / Constants.RegionSize;
+
+            if ((Math.Abs((int)m_scene.RegionInfo.RegionLocX - (int)x) >= 4096) ||
+                (Math.Abs((int)m_scene.RegionInfo.RegionLocY - (int)y) >= 4096))
+            {
+                return false;
+            }
+            return true;
+        }
+
+        public bool CheckCoords(uint thisx, uint thisy, uint x, uint y)
+        {
+            if ((thisx == x) && (thisy == y))
+                return false;
+            return true;
+        }
+
+        #endregion
 
     }
 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index 22b1015..8526653 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -30,6 +30,8 @@ using System;
 using System.Collections.Generic;
 using System.Reflection;
 using Nini.Config;
+using OpenMetaverse;
+
 using OpenSim.Framework;
 using OpenSim.Services.Connectors;
 using OpenSim.Region.Framework.Interfaces;
@@ -47,9 +49,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private bool m_Enabled = false;
 
+        private IGridService m_LocalGridService;
+
         public RemoteGridServicesConnector(IConfigSource source)
         {
-            InitialiseService(source);
+            InitialiseServices(source);
         }
 
         #region ISharedRegionmodule
@@ -72,14 +76,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 string name = moduleConfig.GetString("GridServices", "");
                 if (name == Name)
                 {
-                    InitialiseService(source);
+                    InitialiseServices(source);
                     m_Enabled = true;
                     m_log.Info("[REMOTE GRID CONNECTOR]: Remote grid enabled");
                 }
             }
         }
 
-        private void InitialiseService(IConfigSource source)
+        private void InitialiseServices(IConfigSource source)
         {
             IConfig gridConfig = source.Configs["GridService"];
             if (gridConfig == null)
@@ -89,6 +93,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             }
 
             base.Initialise(source);
+
+            m_LocalGridService = new LocalGridServicesConnector(source);
         }
 
         public void PostInitialise()
@@ -116,5 +122,57 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         }
 
         #endregion
+
+        #region IGridService
+
+        public override bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        {
+            if (m_LocalGridService.RegisterRegion(scopeID, regionInfo))
+                return base.RegisterRegion(scopeID, regionInfo);
+
+            return false;
+        }
+
+        public override bool DeregisterRegion(UUID regionID)
+        {
+            if (m_LocalGridService.DeregisterRegion(regionID))
+                return base.DeregisterRegion(regionID);
+
+            return false;
+        }
+
+        // Let's not override GetNeighbours -- let's get them all from the grid server
+
+        public override SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        {
+            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByUUID(scopeID, regionID);
+            if (rinfo == null)
+                rinfo = base.GetRegionByUUID(scopeID, regionID);
+
+            return rinfo;
+        }
+
+        public override SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        {
+            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
+            if (rinfo == null)
+                rinfo = base.GetRegionByPosition(scopeID, x, y);
+
+            return rinfo;
+        }
+
+        public override SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        {
+            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByName(scopeID, regionName);
+            if (rinfo == null)
+                rinfo = base.GetRegionByName(scopeID, regionName);
+
+            return rinfo;
+        }
+
+        // Let's not override GetRegionsByName -- let's get them all from the grid server
+        // Let's not override GetRegionRange -- let's get them all from the grid server
+
+        #endregion
     }
 }
diff --git a/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs b/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs
new file mode 100644
index 0000000..b8d9c7d
--- /dev/null
+++ b/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs
@@ -0,0 +1,112 @@
+/*
+ * 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.Collections.Generic;
+using System.Reflection;
+using System.Net;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Server.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Base;
+
+using log4net;
+using Nwc.XmlRpc;
+
+namespace OpenSim.Server.Handlers.Grid
+{
+    public class HypergridServiceInConnector : ServiceConnector
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+
+        private List<SimpleRegionInfo> m_RegionsOnSim = new List<SimpleRegionInfo>();
+
+        public HypergridServiceInConnector(IConfigSource config, IHttpServer server) :
+                base(config, server)
+        {
+            server.AddXmlRPCHandler("link_region", LinkRegionRequest, false);
+        }
+
+        /// <summary>
+        /// Someone wants to link to us
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        public XmlRpcResponse LinkRegionRequest(XmlRpcRequest request, IPEndPoint remoteClient)
+        {
+            Hashtable requestData = (Hashtable)request.Params[0];
+            //string host = (string)requestData["host"];
+            //string portstr = (string)requestData["port"];
+            string name = (string)requestData["region_name"];
+
+            m_log.DebugFormat("[HGrid]: Hyperlink request");
+
+            SimpleRegionInfo regInfo = null;
+            foreach (SimpleRegionInfo r in m_RegionsOnSim)
+            {
+                if ((r.RegionName != null) && (name != null) && (r.RegionName.ToLower() == name.ToLower()))
+                {
+                    regInfo = r;
+                    break;
+                }
+            }
+
+            if (regInfo == null)
+                regInfo = m_RegionsOnSim[0]; // Send out the first region
+
+            Hashtable hash = new Hashtable();
+            hash["uuid"] = regInfo.RegionID.ToString();
+            hash["handle"] = regInfo.RegionHandle.ToString();
+            //m_log.Debug(">> Here " + regInfo.RegionHandle);
+            //hash["region_image"] = regInfo.RegionSettings.TerrainImageID.ToString();
+            hash["region_name"] = regInfo.RegionName;
+            hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
+            //m_log.Debug(">> Here: " + regInfo.InternalEndPoint.Port);
+
+
+            XmlRpcResponse response = new XmlRpcResponse();
+            response.Value = hash;
+            return response;
+        }
+
+        public void AddRegion(SimpleRegionInfo rinfo)
+        {
+            m_RegionsOnSim.Add(rinfo);
+        }
+
+        public void RemoveRegion(SimpleRegionInfo rinfo)
+        {
+            if (m_RegionsOnSim.Contains(rinfo))
+                m_RegionsOnSim.Remove(rinfo);
+        }
+    }
+}
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index ae7db7e..1962bcf 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -85,7 +85,7 @@ namespace OpenSim.Services.Connectors
 
         #region IGridService
 
-        public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        public virtual bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
         {
             Dictionary<string, object> rinfo = regionInfo.ToKeyValuePairs();
             Dictionary<string, string> sendData = new Dictionary<string,string>();
@@ -108,7 +108,7 @@ namespace OpenSim.Services.Connectors
             return false;
         }
 
-        public bool DeregisterRegion(UUID regionID)
+        public virtual bool DeregisterRegion(UUID regionID)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -128,7 +128,7 @@ namespace OpenSim.Services.Connectors
             return false;
         }
 
-        public List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        public virtual List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -166,7 +166,7 @@ namespace OpenSim.Services.Connectors
             return rinfos;
         }
 
-        public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public virtual SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -197,7 +197,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public virtual SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -229,7 +229,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public virtual SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -260,7 +260,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        public virtual List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -299,7 +299,7 @@ namespace OpenSim.Services.Connectors
             return rinfos;
         }
 
-        public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        public virtual List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
-- 
cgit v1.1


From 35deff7ec4df6156abccdbeed83b14a6083e28f9 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 23 Sep 2009 09:27:01 -0700
Subject: Modules active. Tested HGGridConnector in standalone only for now.
 Modules commands work.

---
 .../Resources/CoreModulePlugin.addin.xml           |  4 ++++
 .../Grid/HypergridServiceInConnectorModule.cs      |  2 +-
 .../ServiceConnectorsOut/Grid/HGCommands.cs        |  6 ++---
 .../ServiceConnectorsOut/Grid/HGGridConnector.cs   | 28 +++++++++++++++-------
 .../Grid/LocalGridServiceConnector.cs              |  4 ++++
 .../Grid/RemoteGridServiceConnector.cs             |  4 ++++
 bin/config-include/Standalone.ini                  |  5 ++++
 bin/config-include/StandaloneHypergrid.ini         |  7 +++++-
 8 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
index f9e61aa..8f82718 100644
--- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
+++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml
@@ -38,11 +38,15 @@
         <RegionModule id="RemoteLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.RemoteLandServicesConnector" />
         <RegionModule id="LocalInterregionComms" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion.LocalInterregionComms" />
         <RegionModule id="RESTInterregionComms" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion.RESTInterregionComms" />
+        <RegionModule id="LocalGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.LocalGridServicesConnector" />
+        <RegionModule id="RemoteGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.RemoteGridServicesConnector" />
+        <RegionModule id="HGGridConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.HGGridConnector" />
       <!-- Service connectors IN modules -->
         <RegionModule id="AssetServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Asset.AssetServiceInConnectorModule" />
         <RegionModule id="InventoryServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory.InventoryServiceInConnectorModule" />
         <RegionModule id="LandServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Land.LandServiceInConnectorModule" />
         <RegionModule id="NeighbourServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Neighbour.NeighbourServiceInConnectorModule" />    \
+        <RegionModule id="HypergridServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid.HypergridServiceInConnectorModule" />    \
 
     </Extension>
 
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
index 8d113d3..4fbee7f 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs
@@ -64,7 +64,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid
                 m_Enabled = moduleConfig.GetBoolean("HypergridServiceInConnector", false);
                 if (m_Enabled)
                 {
-                    m_log.Info("[INVENTORY IN CONNECTOR]: Hypergrid Service In Connector enabled");
+                    m_log.Info("[HGGRID IN CONNECTOR]: Hypergrid Service In Connector enabled");
                 }
 
             }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
index eee3a6c..2a862d4 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
@@ -85,7 +85,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private void RunHGCommand(string command, string[] cmdparams)
         {
-            if (command.Equals("link-mapping"))
+            if (command.Equals("linkk-mapping"))
             {
                 if (cmdparams.Length == 2)
                 {
@@ -103,7 +103,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                     }
                 }
             }
-            else if (command.Equals("link-region"))
+            else if (command.Equals("linkk-region"))
             {
                 if (cmdparams.Length < 3)
                 {
@@ -181,7 +181,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 }
                 return;
             }
-            else if (command.Equals("unlink-region"))
+            else if (command.Equals("unlinkk-region"))
             {
                 if (cmdparams.Length < 1)
                 {
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index 7aeb761..c6ade15 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -156,18 +156,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             if (!m_Initialized)
             {
                 m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService);
+                HGCommands hgCommands = new HGCommands(this, scene);
+                MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "linkk-region",
+                    "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>",
+                    "Link a hypergrid region", hgCommands.RunCommand);
+                MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "unlinkk-region",
+                    "unlink-region <local name> or <HostName>:<HttpPort> <cr>",
+                    "Unlink a hypergrid region", hgCommands.RunCommand);
+                MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "linkk-mapping", "link-mapping [<x> <y>] <cr>",
+                    "Set local coordinate to map HG regions to", hgCommands.RunCommand);
                 m_Initialized = true;
             }
 
-            HGCommands hgCommands = new HGCommands(this, scene);
-            scene.AddCommand("HG", "link-region",
-                "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>",
-                "Link a hypergrid region", hgCommands.RunCommand);
-            scene.AddCommand("HG", "unlink-region",
-                "unlink-region <local name> or <HostName>:<HttpPort> <cr>",
-                "Unlink a hypergrid region", hgCommands.RunCommand);
-            scene.AddCommand("HG", "link-mapping", "link-mapping [<x> <y>] <cr>",
-                "Set local coordinate to map HG regions to", hgCommands.RunCommand);
+
+            //scene.AddCommand("HGGridServicesConnector", "linkk-region",
+            //    "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>",
+            //    "Link a hypergrid region", hgCommands.RunCommand);
+            //scene.AddCommand("HGGridServicesConnector", "unlinkk-region",
+            //    "unlink-region <local name> or <HostName>:<HttpPort> <cr>",
+            //    "Unlink a hypergrid region", hgCommands.RunCommand);
+            //scene.AddCommand("HGGridServicesConnector", "linkk-mapping", "link-mapping [<x> <y>] <cr>",
+            //    "Set local coordinate to map HG regions to", hgCommands.RunCommand);
 
         }
 
@@ -407,6 +416,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return null;
         }
 
+        // From the map search and secondlife://blah
         public SimpleRegionInfo TryLinkRegion(Scene m_scene, IClientAPI client, string mapName)
         {
             uint xloc = (uint)(random.Next(0, Int16.MaxValue));
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index 3f29401..c1b7235 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -50,6 +50,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private bool m_Enabled = false;
 
+        public LocalGridServicesConnector()
+        {
+        }
+
         public LocalGridServicesConnector(IConfigSource source)
         {
             InitialiseService(source);
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index 8526653..4303fa8 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -51,6 +51,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private IGridService m_LocalGridService;
 
+        public RemoteGridServicesConnector()
+        {
+        }
+
         public RemoteGridServicesConnector(IConfigSource source)
         {
             InitialiseServices(source);
diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini
index 24020b6..69c60ee 100644
--- a/bin/config-include/Standalone.ini
+++ b/bin/config-include/Standalone.ini
@@ -12,6 +12,7 @@
     InventoryServices = "LocalInventoryServicesConnector"
     NeighbourServices = "LocalNeighbourServicesConnector"
     AuthorizationServices = "LocalAuthorizationServicesConnector"
+    GridServices = "LocalGridServicesConnector"
 
 [AssetService]
     LocalServiceModule = "OpenSim.Services.AssetService.dll:AssetService"
@@ -21,3 +22,7 @@
     
 [AuthorizationService]
     LocalServiceModule = "OpenSim.Services.AuthorizationService.dll:AuthorizationService"
+
+[GridService]
+	LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
+	
\ No newline at end of file
diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini
index aa122be..24b0f26 100644
--- a/bin/config-include/StandaloneHypergrid.ini
+++ b/bin/config-include/StandaloneHypergrid.ini
@@ -12,9 +12,11 @@
     InventoryServices = "HGInventoryBroker"
     NeighbourServices = "LocalNeighbourServicesConnector"
     AuthorizationServices = "LocalAuthorizationServicesConnector"
+    GridServices = "HGGridServicesConnector"
     InventoryServiceInConnector = true
     AssetServiceInConnector = true
     HGAuthServiceInConnector = true
+    HypergridServiceInConnector = true
 
 [AssetService]
     ; For the AssetServiceInConnector
@@ -39,4 +41,7 @@
     ; For the HGAuthServiceInConnector
     LocalServiceModule = "OpenSim.Services.AuthenticationService.dll:HGAuthenticationService"
     
-    
\ No newline at end of file
+[GridService]
+	LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
+	GridServiceConnectorModule = "OpenSim.Region.CoreModules.dll:LocalGridServiceConnector"
+	StorageProvider = "OpenSim.Data.Null.dll"
\ No newline at end of file
-- 
cgit v1.1


From 9c2ffa8f2e49aa70e0b2c6afff875bbdb84ba0dc Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Wed, 23 Sep 2009 14:55:22 -0400
Subject: * fix endlines in LSL_api.cs

---
 .../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index b631478..4c52b11 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -24,7 +24,7 @@
  * (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.Collections.Generic;
@@ -7838,8 +7838,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
         public LSL_String llGetHTTPHeader(LSL_Key request_id, string header)
         {
             m_host.AddScriptLPS(1);
-             
-           if (m_UrlModule != null)
+             
+           if (m_UrlModule != null)
                return m_UrlModule.GetHttpHeader(new UUID(request_id), header);
            return String.Empty;
         }
@@ -9124,9 +9124,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             // Partial implementation: support for parameter flags needed
             //   see http://wiki.secondlife.com/wiki/llHTTPResponse
 
-            m_host.AddScriptLPS(1);
-
-            if (m_UrlModule != null)
+            m_host.AddScriptLPS(1);
+
+            if (m_UrlModule != null)
                 m_UrlModule.HttpResponse(new UUID(id), status,body);
         }
 
-- 
cgit v1.1


From c592a60f4613587fd6c297de57f9958bcc60deaa Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Wed, 23 Sep 2009 15:00:18 -0400
Subject: Fix endlines on UrlModule.cs

---
 .../CoreModules/Scripting/LSLHttp/UrlModule.cs     | 484 ++++++++++-----------
 1 file changed, 242 insertions(+), 242 deletions(-)

diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 2d81e4c..8b7a878 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -54,12 +54,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
     {
         public UUID requestID;
         public Dictionary<string, string> headers;
-        public string body;
-        public int responseCode;
+        public string body;
+        public int responseCode;
         public string responseBody;
-        public ManualResetEvent ev;
+        public ManualResetEvent ev;
         public bool requestDone;
-        public int startTime;
+        public int startTime;
         public string uri;
     }
 
@@ -73,23 +73,23 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 new Dictionary<UUID, UrlData>();
 
         private Dictionary<string, UrlData> m_UrlMap =
-                new Dictionary<string, UrlData>();
-
+                new Dictionary<string, UrlData>();
+
 
         private int m_TotalUrls = 100;
 
-        private IHttpServer m_HttpServer = null;
-
-        private string m_ExternalHostNameForLSL = "";
+        private IHttpServer m_HttpServer = null;
+
+        private string m_ExternalHostNameForLSL = "";
 
         public Type ReplaceableInterface 
         {
             get { return null; }
-        }
-
-        private Hashtable HandleHttpPoll(Hashtable request)
-        {
-            return new Hashtable();
+        }
+
+        private Hashtable HandleHttpPoll(Hashtable request)
+        {
+            return new Hashtable();
         }
 
         public string Name
@@ -98,7 +98,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         }
 
         public void Initialise(IConfigSource config)
-        {
+        {
             m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName);
         }
 
@@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
 
         public void Close()
         {
-        }
+        }
         public UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID)
         {
             UUID urlcode = UUID.Random();
@@ -141,8 +141,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 {
                     engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
                     return urlcode;
-                }
-                string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
+                }
+                string url = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
 
                 UrlData urlData = new UrlData();
                 urlData.hostID = host.UUID;
@@ -152,14 +152,14 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 urlData.urlcode = urlcode;
                 urlData.requests = new Dictionary<UUID, RequestData>();
 
-                
-                m_UrlMap[url] = urlData;
-                
-                string uri = "/lslhttp/" + urlcode.ToString() + "/";
-               
-                m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
-                        new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
-                            urlcode));
+                
+                m_UrlMap[url] = urlData;
+                
+                string uri = "/lslhttp/" + urlcode.ToString() + "/";
+               
+                m_HttpServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
+                        new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
+                            urlcode));
 
                 engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
             }
@@ -180,11 +180,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         {
             lock (m_UrlMap)
             {
-                UrlData data;
-
-                if (!m_UrlMap.TryGetValue(url, out data))
-                {
-                    return;
+                UrlData data;
+
+                if (!m_UrlMap.TryGetValue(url, out data))
+                {
+                    return;
                 }
 
                 foreach (UUID req in data.requests.Keys)
@@ -196,36 +196,36 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
         }
         
         public void HttpResponse(UUID request, int status, string body)
-        {
-            if (m_RequestMap.ContainsKey(request))
-            {
-                UrlData urlData = m_RequestMap[request];
-                RequestData requestData=urlData.requests[request];
-                urlData.requests[request].responseCode = status;
-                urlData.requests[request].responseBody = body;
-                //urlData.requests[request].ev.Set();
-                urlData.requests[request].requestDone=true;
-            }
-            else
-            {
-                m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
+        {
+            if (m_RequestMap.ContainsKey(request))
+            {
+                UrlData urlData = m_RequestMap[request];
+                RequestData requestData=urlData.requests[request];
+                urlData.requests[request].responseCode = status;
+                urlData.requests[request].responseBody = body;
+                //urlData.requests[request].ev.Set();
+                urlData.requests[request].requestDone=true;
+            }
+            else
+            {
+                m_log.Info("[HttpRequestHandler] There is no http-in request with id " + request.ToString());
             }
         }
 
         public string GetHttpHeader(UUID requestId, string header)
-        {
-            if (m_RequestMap.ContainsKey(requestId))
-            {
-                UrlData urlData=m_RequestMap[requestId];
-                string value;
-                if (urlData.requests[requestId].headers.TryGetValue(header,out value))
-                    return value;
-            }
-            else
-            {
+        {
+            if (m_RequestMap.ContainsKey(requestId))
+            {
+                UrlData urlData=m_RequestMap[requestId];
+                string value;
+                if (urlData.requests[requestId].headers.TryGetValue(header,out value))
+                    return value;
+            }
+            else
+            {
                 m_log.Warn("[HttpRequestHandler] There was no http-in request with id " + requestId);
-            }
-            return String.Empty;
+            }
+            return String.Empty;
         }
 
         public int GetFreeUrls()
@@ -275,63 +275,63 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 foreach (string urlname in removeURLs)
                     m_UrlMap.Remove(urlname);
             }
-        }
-
+        }
+
 
         private void RemoveUrl(UrlData data)
         {
-            m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/");
-        }
-
-        private Hashtable NoEvents(UUID requestID, UUID sessionID)
-        {
-            Hashtable response = new Hashtable();
-            UrlData url;
-            lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                    return response;
-                url = m_RequestMap[requestID];
-            }
-
-            if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
-            {
-                response["int_response_code"] = 500;
-                response["str_response_string"] = "Script timeout";
-                response["content_type"] = "text/plain";
-                response["keepalive"] = false;
-                response["reusecontext"] = false;
-
-                //remove from map
-                lock (url)
-                {
-                    url.requests.Remove(requestID);
-                    m_RequestMap.Remove(requestID);
-                }
-
-                return response;
+            m_HttpServer.RemoveHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/");
+        }
+
+        private Hashtable NoEvents(UUID requestID, UUID sessionID)
+        {
+            Hashtable response = new Hashtable();
+            UrlData url;
+            lock (m_RequestMap)
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                    return response;
+                url = m_RequestMap[requestID];
+            }
+
+            if (System.Environment.TickCount - url.requests[requestID].startTime > 25000)
+            {
+                response["int_response_code"] = 500;
+                response["str_response_string"] = "Script timeout";
+                response["content_type"] = "text/plain";
+                response["keepalive"] = false;
+                response["reusecontext"] = false;
+
+                //remove from map
+                lock (url)
+                {
+                    url.requests.Remove(requestID);
+                    m_RequestMap.Remove(requestID);
+                }
+
+                return response;
             }
 
-            
-            return response;
-        }
-
+            
+            return response;
+        }
+
         private bool HasEvents(UUID requestID, UUID sessionID)
         {
-            UrlData url=null;
+            UrlData url=null;
             
             lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                {
-                    return false;
-                }
-                url = m_RequestMap[requestID];
-                if (!url.requests.ContainsKey(requestID))
-                {
-                    return false;
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                {
+                    return false;
                 }
-            }
+                url = m_RequestMap[requestID];
+                if (!url.requests.ContainsKey(requestID))
+                {
+                    return false;
+                }
+            }
 
             if (System.Environment.TickCount-url.requests[requestID].startTime>25000)
             {
@@ -343,146 +343,146 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
             else
                 return false;
 
-        }
-        private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
-        {
-            UrlData url = null;
-            RequestData requestData = null;
-
-            lock (m_RequestMap)
-            {
-                if (!m_RequestMap.ContainsKey(requestID))
-                    return NoEvents(requestID,sessionID);
-                url = m_RequestMap[requestID];
-                requestData = url.requests[requestID];
-            }
-
-            if (!requestData.requestDone)
-                return NoEvents(requestID,sessionID);
-            
-            Hashtable response = new Hashtable();
-
-            if (System.Environment.TickCount - requestData.startTime > 25000)
-            {
-                response["int_response_code"] = 500;
-                response["str_response_string"] = "Script timeout";
-                response["content_type"] = "text/plain";
-                response["keepalive"] = false;
-                response["reusecontext"] = false;
-                return response;
-            }
-            //put response
-            response["int_response_code"] = requestData.responseCode;
-            response["str_response_string"] = requestData.responseBody;
-            response["content_type"] = "text/plain";
-            response["keepalive"] = false;
-            response["reusecontext"] = false;
-            
-            //remove from map
-            lock (url)
-            {
-                url.requests.Remove(requestID);
-                m_RequestMap.Remove(requestID);
-            }
-
-            return response;
-        }
+        }
+        private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
+        {
+            UrlData url = null;
+            RequestData requestData = null;
+
+            lock (m_RequestMap)
+            {
+                if (!m_RequestMap.ContainsKey(requestID))
+                    return NoEvents(requestID,sessionID);
+                url = m_RequestMap[requestID];
+                requestData = url.requests[requestID];
+            }
+
+            if (!requestData.requestDone)
+                return NoEvents(requestID,sessionID);
+            
+            Hashtable response = new Hashtable();
+
+            if (System.Environment.TickCount - requestData.startTime > 25000)
+            {
+                response["int_response_code"] = 500;
+                response["str_response_string"] = "Script timeout";
+                response["content_type"] = "text/plain";
+                response["keepalive"] = false;
+                response["reusecontext"] = false;
+                return response;
+            }
+            //put response
+            response["int_response_code"] = requestData.responseCode;
+            response["str_response_string"] = requestData.responseBody;
+            response["content_type"] = "text/plain";
+            response["keepalive"] = false;
+            response["reusecontext"] = false;
+            
+            //remove from map
+            lock (url)
+            {
+                url.requests.Remove(requestID);
+                m_RequestMap.Remove(requestID);
+            }
+
+            return response;
+        }
         public void HttpRequestHandler(UUID requestID, Hashtable request)
-        {
-            lock (request)
-            {
-                string uri = request["uri"].ToString();
-                
-                try
-                {
-                    Hashtable headers = (Hashtable)request["headers"];
-                    
-                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
-
-                    int pos1 = uri.IndexOf("/");// /lslhttp
-                    int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
-                    int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/
-                    string uri_tmp = uri.Substring(0, pos3 + 1);
-                    //HTTP server code doesn't provide us with QueryStrings
-                    string pathInfo;
-                    string queryString;
-                    queryString = "";
-
-                    pathInfo = uri.Substring(pos3);
-
-                    UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
-
-                    //for llGetHttpHeader support we need to store original URI here
-                    //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 
-                    //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader
-
-                    RequestData requestData = new RequestData();
-                    requestData.requestID = requestID;
-                    requestData.requestDone = false;
-                    requestData.startTime = System.Environment.TickCount;
-                    requestData.uri = uri;
-                    if (requestData.headers == null)
-                        requestData.headers = new Dictionary<string, string>();
-
-                    foreach (DictionaryEntry header in headers)
-                    {
-                        string key = (string)header.Key;
-                        string value = (string)header.Value;
-                        requestData.headers.Add(key, value);
-                    }
-                    foreach (DictionaryEntry de in request)
-                    {
-                        if (de.Key.ToString() == "querystringkeys")
-                        {
-                            System.String[] keys = (System.String[])de.Value;
-                            foreach (String key in keys)
-                            {
-                                if (request.ContainsKey(key))
-                                {
-                                    string val = (String)request[key];
-                                    queryString = queryString + key + "=" + val + "&";
-                                }
-                            }
-                            if (queryString.Length > 1)
-                                queryString = queryString.Substring(0, queryString.Length - 1);
-
-                        }
-
-                    }
-
-                    //if this machine is behind DNAT/port forwarding, currently this is being
-                    //set to address of port forwarding router
-                    requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"];
-                    requestData.headers["x-path-info"] = pathInfo;
-                    requestData.headers["x-query-string"] = queryString;
-                    requestData.headers["x-script-url"] = url.url;
-
-                    requestData.ev = new ManualResetEvent(false);
-                    lock (url.requests)
-                    {
-                        url.requests.Add(requestID, requestData);
-                    }
-                    lock (m_RequestMap)
-                    {
-                        //add to request map
-                        m_RequestMap.Add(requestID, url);
-                    }
-
-                    url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
-
-                    //send initial response?
-                    Hashtable response = new Hashtable();
-
-                    return;
-
-                }
-                catch (Exception we)
-                {
-                    //Hashtable response = new Hashtable();
-                    m_log.Warn("[HttpRequestHandler]: http-in request failed");
-                    m_log.Warn(we.Message);
-                    m_log.Warn(we.StackTrace);
-                }
+        {
+            lock (request)
+            {
+                string uri = request["uri"].ToString();
+                
+                try
+                {
+                    Hashtable headers = (Hashtable)request["headers"];
+                    
+                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
+
+                    int pos1 = uri.IndexOf("/");// /lslhttp
+                    int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
+                    int pos3 = uri.IndexOf("/", pos2 + 1);// /lslhttp/<UUID>/
+                    string uri_tmp = uri.Substring(0, pos3 + 1);
+                    //HTTP server code doesn't provide us with QueryStrings
+                    string pathInfo;
+                    string queryString;
+                    queryString = "";
+
+                    pathInfo = uri.Substring(pos3);
+
+                    UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
+
+                    //for llGetHttpHeader support we need to store original URI here
+                    //to make x-path-info / x-query-string / x-script-url / x-remote-ip headers 
+                    //as per http://wiki.secondlife.com/wiki/LlGetHTTPHeader
+
+                    RequestData requestData = new RequestData();
+                    requestData.requestID = requestID;
+                    requestData.requestDone = false;
+                    requestData.startTime = System.Environment.TickCount;
+                    requestData.uri = uri;
+                    if (requestData.headers == null)
+                        requestData.headers = new Dictionary<string, string>();
+
+                    foreach (DictionaryEntry header in headers)
+                    {
+                        string key = (string)header.Key;
+                        string value = (string)header.Value;
+                        requestData.headers.Add(key, value);
+                    }
+                    foreach (DictionaryEntry de in request)
+                    {
+                        if (de.Key.ToString() == "querystringkeys")
+                        {
+                            System.String[] keys = (System.String[])de.Value;
+                            foreach (String key in keys)
+                            {
+                                if (request.ContainsKey(key))
+                                {
+                                    string val = (String)request[key];
+                                    queryString = queryString + key + "=" + val + "&";
+                                }
+                            }
+                            if (queryString.Length > 1)
+                                queryString = queryString.Substring(0, queryString.Length - 1);
+
+                        }
+
+                    }
+
+                    //if this machine is behind DNAT/port forwarding, currently this is being
+                    //set to address of port forwarding router
+                    requestData.headers["x-remote-ip"] = requestData.headers["remote_addr"];
+                    requestData.headers["x-path-info"] = pathInfo;
+                    requestData.headers["x-query-string"] = queryString;
+                    requestData.headers["x-script-url"] = url.url;
+
+                    requestData.ev = new ManualResetEvent(false);
+                    lock (url.requests)
+                    {
+                        url.requests.Add(requestID, requestData);
+                    }
+                    lock (m_RequestMap)
+                    {
+                        //add to request map
+                        m_RequestMap.Add(requestID, url);
+                    }
+
+                    url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
+
+                    //send initial response?
+                    Hashtable response = new Hashtable();
+
+                    return;
+
+                }
+                catch (Exception we)
+                {
+                    //Hashtable response = new Hashtable();
+                    m_log.Warn("[HttpRequestHandler]: http-in request failed");
+                    m_log.Warn(we.Message);
+                    m_log.Warn(we.StackTrace);
+                }
             }
         }
 
-- 
cgit v1.1


From 67276589c883fe1a74d8d52057db1431d637dade Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 23 Sep 2009 17:20:07 -0700
Subject: Changed IGridService to use the new GridRegion data structure instead
 of old SimpleRegionInfo. Added grid configs to standalones.

---
 OpenSim/Data/Null/NullRegionData.cs                |   1 +
 .../ServiceConnectorsOut/Grid/HGCommands.cs        |  36 +--
 .../ServiceConnectorsOut/Grid/HGGridConnector.cs   |  82 +++----
 .../Grid/LocalGridServiceConnector.cs              |  18 +-
 .../Grid/RemoteGridServiceConnector.cs             |  15 +-
 .../Server/Handlers/Grid/GridServerPostHandler.cs  |   7 +-
 .../Connectors/Grid/GridServiceConnector.cs        |  39 ++--
 .../Connectors/Grid/HypergridServiceConnector.cs   |   5 +-
 OpenSim/Services/GridService/GridService.cs        |  32 +--
 OpenSim/Services/GridService/GridServiceBase.cs    |   2 +-
 OpenSim/Services/Interfaces/IGridService.cs        | 249 ++++++++++++++++++++-
 bin/config-include/Standalone.ini                  |   1 +
 bin/config-include/StandaloneHypergrid.ini         |   4 +-
 13 files changed, 371 insertions(+), 120 deletions(-)

diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index 588b8ac..03489f9 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -40,6 +40,7 @@ namespace OpenSim.Data.Null
 
         public NullRegionData(string connectionString, string realm)
         {
+            Console.WriteLine("[XXX] NullRegionData constructor");
         }
 
         public List<RegionData> Get(string regionName, UUID scopeID)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
index 2a862d4..36915ef 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs
@@ -37,6 +37,7 @@ using OpenSim.Framework.Console;
 using OpenSim.Region.Framework;
 using OpenSim.Region.Framework.Scenes;
 using OpenSim.Region.Framework.Scenes.Hypergrid;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 
 namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 {
@@ -121,12 +122,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 if (cmdparams[2].Contains(":"))
                 {
                     // New format
-                    uint xloc, yloc;
+                    int xloc, yloc;
                     string mapName;
                     try
                     {
-                        xloc = Convert.ToUInt32(cmdparams[0]);
-                        yloc = Convert.ToUInt32(cmdparams[1]);
+                        xloc = Convert.ToInt32(cmdparams[0]);
+                        yloc = Convert.ToInt32(cmdparams[1]);
                         mapName = cmdparams[2];
                         if (cmdparams.Length > 3)
                             for (int i = 3; i < cmdparams.Length; i++)
@@ -143,19 +144,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                         return;
                     }
 
+                    // Convert cell coordinates given by the user to meters
+                    xloc = xloc * (int)Constants.RegionSize;
+                    yloc = yloc * (int)Constants.RegionSize;
                     m_HGGridConnector.TryLinkRegionToCoords(m_scene, null, mapName, xloc, yloc);
                 }
                 else
                 {
                     // old format
-                    SimpleRegionInfo regInfo;
-                    uint xloc, yloc;
+                    GridRegion regInfo;
+                    int xloc, yloc;
                     uint externalPort;
                     string externalHostName;
                     try
                     {
-                        xloc = Convert.ToUInt32(cmdparams[0]);
-                        yloc = Convert.ToUInt32(cmdparams[1]);
+                        xloc = Convert.ToInt32(cmdparams[0]);
+                        yloc = Convert.ToInt32(cmdparams[1]);
                         externalPort = Convert.ToUInt32(cmdparams[3]);
                         externalHostName = cmdparams[2];
                         //internalPort = Convert.ToUInt32(cmdparams[4]);
@@ -168,7 +172,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                         return;
                     }
 
-                    //if (TryCreateLink(xloc, yloc, externalPort, externalHostName, out regInfo))
+                    // Convert cell coordinates given by the user to meters
+                    xloc = xloc * (int)Constants.RegionSize;
+                    yloc = yloc * (int)Constants.RegionSize;
                     if (m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort, externalHostName, out regInfo))
                     {
                         if (cmdparams.Length >= 5)
@@ -245,14 +251,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private void ReadLinkFromConfig(IConfig config)
         {
-            SimpleRegionInfo regInfo;
-            uint xloc, yloc;
+            GridRegion regInfo;
+            int xloc, yloc;
             uint externalPort;
             string externalHostName;
             uint realXLoc, realYLoc;
 
-            xloc = Convert.ToUInt32(config.GetString("xloc", "0"));
-            yloc = Convert.ToUInt32(config.GetString("yloc", "0"));
+            xloc = Convert.ToInt32(config.GetString("xloc", "0"));
+            yloc = Convert.ToInt32(config.GetString("yloc", "0"));
             externalPort = Convert.ToUInt32(config.GetString("externalPort", "0"));
             externalHostName = config.GetString("externalHostName", "");
             realXLoc = Convert.ToUInt32(config.GetString("real-xloc", "0"));
@@ -260,14 +266,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
             if (m_enableAutoMapping)
             {
-                xloc = (uint)((xloc % 100) + m_autoMappingX);
-                yloc = (uint)((yloc % 100) + m_autoMappingY);
+                xloc = (int)((xloc % 100) + m_autoMappingX);
+                yloc = (int)((yloc % 100) + m_autoMappingY);
             }
 
             if (((realXLoc == 0) && (realYLoc == 0)) ||
                 (((realXLoc - xloc < 3896) || (xloc - realXLoc < 3896)) &&
                  ((realYLoc - yloc < 3896) || (yloc - realYLoc < 3896))))
             {
+                xloc = xloc * (int)Constants.RegionSize;
+                yloc = yloc * (int)Constants.RegionSize;
                 if (
                     m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort,
                                               externalHostName, out regInfo))
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index c6ade15..0c2a835 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -36,6 +36,7 @@ using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 using OpenSim.Region.Framework.Scenes.Hypergrid;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 using OpenSim.Server.Base;
 using OpenSim.Services.Connectors.Grid;
 using OpenSim.Framework.Console;
@@ -59,13 +60,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         private HypergridServiceConnector m_HypergridServiceConnector;
 
         // Hyperlink regions are hyperlinks on the map
-        protected Dictionary<UUID, SimpleRegionInfo> m_HyperlinkRegions = new Dictionary<UUID, SimpleRegionInfo>();
+        protected Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>();
 
         // Known regions are home regions of visiting foreign users.
         // They are not on the map as static hyperlinks. They are dynamic hyperlinks, they go away when
         // the visitor goes away. They are mapped to X=0 on the map.
         // This is key-ed on agent ID
-        protected Dictionary<UUID, SimpleRegionInfo> m_knownRegions = new Dictionary<UUID, SimpleRegionInfo>();
+        protected Dictionary<UUID, GridRegion> m_knownRegions = new Dictionary<UUID, GridRegion>();
 
         protected Dictionary<UUID, ulong> m_HyperlinkHandles = new Dictionary<UUID, ulong>();
 
@@ -184,7 +185,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #region IGridService
 
-        public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        public bool RegisterRegion(UUID scopeID, GridRegion regionInfo)
         {
             // Region doesn't exist here. Trying to link remote region
             if (regionInfo.RegionID.Equals(UUID.Zero))
@@ -222,7 +223,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             }
             // Try the foreign users home collection
 
-            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            foreach (GridRegion r in m_knownRegions.Values)
                 if (r.RegionID == regionID)
                 {
                     RemoveHyperlinkHomeRegion(regionID);
@@ -233,21 +234,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return m_GridServiceConnector.DeregisterRegion(regionID);
         }
 
-        public List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        public List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID)
         {
             // No serving neighbours on hyperliked regions.
             // Just the regular regions.
             return m_GridServiceConnector.GetNeighbours(scopeID, regionID);
         }
 
-        public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
         {
             // Try the hyperlink collection
             if (m_HyperlinkRegions.ContainsKey(regionID))
                 return m_HyperlinkRegions[regionID];
             
             // Try the foreign users home collection
-            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            foreach (GridRegion r in m_knownRegions.Values)
                 if (r.RegionID == regionID)
                     return m_knownRegions[regionID];
 
@@ -255,19 +256,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID);
         }
 
-        public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
         {
             int snapX = (int) (x / Constants.RegionSize) * (int)Constants.RegionSize;
             int snapY = (int) (y / Constants.RegionSize) * (int)Constants.RegionSize;
             // Try the hyperlink collection
-            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            foreach (GridRegion r in m_HyperlinkRegions.Values)
             {
                 if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY))
                     return r;
             }
 
             // Try the foreign users home collection
-            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            foreach (GridRegion r in m_knownRegions.Values)
             {
                 if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY))
                     return r;
@@ -277,22 +278,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return m_GridServiceConnector.GetRegionByPosition(scopeID, x, y);
         }
 
-        public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public GridRegion GetRegionByName(UUID scopeID, string regionName)
         {
             // Try normal grid first
-            SimpleRegionInfo region = m_GridServiceConnector.GetRegionByName(scopeID, regionName);
+            GridRegion region = m_GridServiceConnector.GetRegionByName(scopeID, regionName);
             if (region != null)
                 return region;
 
             // Try the hyperlink collection
-            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            foreach (GridRegion r in m_HyperlinkRegions.Values)
             {
                 if (r.RegionName == regionName)
                     return r;
             }
 
             // Try the foreign users home collection
-            foreach (SimpleRegionInfo r in m_knownRegions.Values)
+            foreach (GridRegion r in m_knownRegions.Values)
             {
                 if (r.RegionName == regionName)
                     return r;
@@ -300,9 +301,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return null;
         }
 
-        public List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        public List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber)
         {
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
 
             // Commenting until regionname exists
             //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
@@ -313,15 +314,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return rinfos;
         }
 
-        public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        public List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
             int snapXmin = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize;
             int snapXmax = (int)(xmax / Constants.RegionSize) * (int)Constants.RegionSize;
             int snapYmin = (int)(ymin / Constants.RegionSize) * (int)Constants.RegionSize;
             int snapYmax = (int)(ymax / Constants.RegionSize) * (int)Constants.RegionSize;
 
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
-            foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+            List<GridRegion> rinfos = new List<GridRegion>();
+            foreach (GridRegion r in m_HyperlinkRegions.Values)
                 if ((r.RegionLocX > snapXmin) && (r.RegionLocX < snapYmax) &&
                     (r.RegionLocY > snapYmin) && (r.RegionLocY < snapYmax))
                     rinfos.Add(r);
@@ -335,7 +336,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #region Auxiliary
 
-        private void AddHyperlinkRegion(SimpleRegionInfo regionInfo, ulong regionHandle)
+        private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle)
         {
             m_HyperlinkRegions.Add(regionInfo.RegionID, regionInfo);
             m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle);
@@ -347,7 +348,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             m_HyperlinkHandles.Remove(regionID);
         }
 
-        private void AddHyperlinkHomeRegion(UUID userID, SimpleRegionInfo regionInfo, ulong regionHandle)
+        private void AddHyperlinkHomeRegion(UUID userID, GridRegion regionInfo, ulong regionHandle)
         {
             m_knownRegions.Add(userID, regionInfo);
             m_HyperlinkHandles.Add(regionInfo.RegionID, regionHandle);
@@ -355,7 +356,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private void RemoveHyperlinkHomeRegion(UUID regionID)
         {
-            foreach (KeyValuePair<UUID, SimpleRegionInfo> kvp in m_knownRegions)
+            foreach (KeyValuePair<UUID, GridRegion> kvp in m_knownRegions)
             {
                 if (kvp.Value.RegionID == regionID)
                 {
@@ -370,7 +371,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         private static Random random = new Random();
 
-        public SimpleRegionInfo TryLinkRegionToCoords(Scene m_scene, IClientAPI client, string mapName, uint xloc, uint yloc)
+        public GridRegion TryLinkRegionToCoords(Scene m_scene, IClientAPI client, string mapName, int xloc, int yloc)
         {
             string host = "127.0.0.1";
             string portstr;
@@ -404,7 +405,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             if ((ipaddr != null) &&
                 !((m_scene.RegionInfo.ExternalEndPoint.Address.Equals(ipaddr)) && (m_scene.RegionInfo.HttpPort == port)))
             {
-                SimpleRegionInfo regInfo;
+                GridRegion regInfo;
                 bool success = TryCreateLink(m_scene, client, xloc, yloc, regionName, port, host, out regInfo);
                 if (success)
                 {
@@ -417,18 +418,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         }
 
         // From the map search and secondlife://blah
-        public SimpleRegionInfo TryLinkRegion(Scene m_scene, IClientAPI client, string mapName)
+        public GridRegion TryLinkRegion(Scene m_scene, IClientAPI client, string mapName)
         {
-            uint xloc = (uint)(random.Next(0, Int16.MaxValue));
+            int xloc = random.Next(0, Int16.MaxValue);
             return TryLinkRegionToCoords(m_scene, client, mapName, xloc, 0);
         }
 
-        public bool TryCreateLink(Scene m_scene, IClientAPI client, uint xloc, uint yloc,
-            string externalRegionName, uint externalPort, string externalHostName, out SimpleRegionInfo regInfo)
+        public bool TryCreateLink(Scene m_scene, IClientAPI client, int xloc, int yloc,
+            string externalRegionName, uint externalPort, string externalHostName, out GridRegion regInfo)
         {
             m_log.DebugFormat("[HGrid]: Link to {0}:{1}, in {2}-{3}", externalHostName, externalPort, xloc, yloc);
 
-            regInfo = new SimpleRegionInfo();
+            regInfo = new GridRegion();
             regInfo.RegionName = externalRegionName;
             regInfo.HttpPort = externalPort;
             regInfo.ExternalHostName = externalHostName;
@@ -456,7 +457,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 return false;
             }
 
-            uint x, y;
+            int x, y;
             if (!Check4096(m_scene, regInfo, out x, out y))
             {
                 DeregisterRegion(regInfo.RegionID);
@@ -481,7 +482,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         public bool TryUnlinkRegion(Scene m_scene, string mapName)
         {
-            SimpleRegionInfo regInfo = null;
+            GridRegion regInfo = null;
             if (mapName.Contains(":"))
             {
                 string host = "127.0.0.1";
@@ -504,13 +505,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
                 //                {
                 //                    regionName = parts[2];
                 //                }
-                foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+                foreach (GridRegion r in m_HyperlinkRegions.Values)
                     if (host.Equals(r.ExternalHostName) && (port == r.HttpPort))
                         regInfo = r;
             }
             else
             {
-                foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
+                foreach (GridRegion r in m_HyperlinkRegions.Values)
                     if (r.RegionName.Equals(mapName))
                         regInfo = r;
             }
@@ -530,22 +531,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
         /// </summary>
         /// <param name="regInfo"></param>
         /// <returns></returns>
-        public bool Check4096(Scene m_scene, SimpleRegionInfo regInfo, out uint x, out uint y)
+        public bool Check4096(Scene m_scene, GridRegion regInfo, out int x, out int y)
         {
             ulong realHandle = m_HyperlinkHandles[regInfo.RegionID];
-            Utils.LongToUInts(realHandle, out x, out y);
-            x = x / Constants.RegionSize;
-            y = y / Constants.RegionSize;
+            uint ux = 0, uy = 0;
+            Utils.LongToUInts(realHandle, out ux, out uy);
+            x = (int)(ux / Constants.RegionSize);
+            y = (int)(uy / Constants.RegionSize);
 
-            if ((Math.Abs((int)m_scene.RegionInfo.RegionLocX - (int)x) >= 4096) ||
-                (Math.Abs((int)m_scene.RegionInfo.RegionLocY - (int)y) >= 4096))
+            if ((Math.Abs((int)(m_scene.RegionInfo.RegionLocX / Constants.RegionSize) - x) >= 4096) ||
+                (Math.Abs((int)(m_scene.RegionInfo.RegionLocY / Constants.RegionSize) - y) >= 4096))
             {
                 return false;
             }
             return true;
         }
 
-        public bool CheckCoords(uint thisx, uint thisy, uint x, uint y)
+        public bool CheckCoords(uint thisx, uint thisy, int x, int y)
         {
             if ((thisx == x) && (thisy == y))
                 return false;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
index c1b7235..743d3b9 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs
@@ -35,6 +35,7 @@ using OpenSim.Server.Base;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 using OpenMetaverse;
 
 namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
@@ -56,6 +57,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         public LocalGridServicesConnector(IConfigSource source)
         {
+            m_log.Debug("[LOCAL GRID CONNECTOR]: LocalGridServicesConnector instantiated");
             InitialiseService(source);
         }
 
@@ -111,7 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
             if (m_GridService == null)
             {
-                m_log.Error("[LOCAL GRID CONNECTOR]: Can't load asset service");
+                m_log.Error("[LOCAL GRID CONNECTOR]: Can't load grid service");
                 return;
             }
         }
@@ -144,7 +146,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #region IGridService
 
-        public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        public bool RegisterRegion(UUID scopeID, GridRegion regionInfo)
         {
             return m_GridService.RegisterRegion(scopeID, regionInfo);
         }
@@ -154,32 +156,32 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
             return m_GridService.DeregisterRegion(regionID);
         }
 
-        public List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        public List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID)
         {
             return m_GridService.GetNeighbours(scopeID, regionID);
         }
 
-        public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
         {
             return m_GridService.GetRegionByUUID(scopeID, regionID);
         }
 
-        public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
         {
             return m_GridService.GetRegionByPosition(scopeID, x, y);
         }
 
-        public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public GridRegion GetRegionByName(UUID scopeID, string regionName)
         {
             return m_GridService.GetRegionByName(scopeID, regionName);
         }
 
-        public List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        public List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber)
         {
             return m_GridService.GetRegionsByName(scopeID, name, maxNumber);
         }
 
-        public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        public List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
             return m_GridService.GetRegionRange(scopeID, xmin, xmax, ymin, ymax);
         }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index 4303fa8..91a808b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -37,6 +37,7 @@ using OpenSim.Services.Connectors;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 
 namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 {
@@ -129,7 +130,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         #region IGridService
 
-        public override bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        public override bool RegisterRegion(UUID scopeID, GridRegion regionInfo)
         {
             if (m_LocalGridService.RegisterRegion(scopeID, regionInfo))
                 return base.RegisterRegion(scopeID, regionInfo);
@@ -147,27 +148,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
 
         // Let's not override GetNeighbours -- let's get them all from the grid server
 
-        public override SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public override GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
         {
-            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByUUID(scopeID, regionID);
+            GridRegion rinfo = m_LocalGridService.GetRegionByUUID(scopeID, regionID);
             if (rinfo == null)
                 rinfo = base.GetRegionByUUID(scopeID, regionID);
 
             return rinfo;
         }
 
-        public override SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public override GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
         {
-            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
+            GridRegion rinfo = m_LocalGridService.GetRegionByPosition(scopeID, x, y);
             if (rinfo == null)
                 rinfo = base.GetRegionByPosition(scopeID, x, y);
 
             return rinfo;
         }
 
-        public override SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public override GridRegion GetRegionByName(UUID scopeID, string regionName)
         {
-            SimpleRegionInfo rinfo = m_LocalGridService.GetRegionByName(scopeID, regionName);
+            GridRegion rinfo = m_LocalGridService.GetRegionByName(scopeID, regionName);
             if (rinfo == null)
                 rinfo = base.GetRegionByName(scopeID, regionName);
 
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index 39c0584..e72c2eb 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -38,6 +38,7 @@ using System.Xml.Serialization;
 using System.Collections.Generic;
 using OpenSim.Server.Base;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 using OpenSim.Framework;
 using OpenSim.Framework.Servers.HttpServer;
 using OpenMetaverse;
@@ -117,7 +118,7 @@ namespace OpenSim.Server.Handlers.Grid
             Dictionary<string, object> rinfoData = new Dictionary<string, object>();
             foreach (KeyValuePair<string, string> kvp in request)
                 rinfoData[kvp.Key] = kvp.Value;
-            SimpleRegionInfo rinfo = new SimpleRegionInfo(rinfoData);
+            GridRegion rinfo = new GridRegion(rinfoData);
 
             bool result = m_GridService.RegisterRegion(scopeID, rinfo);
 
@@ -158,11 +159,11 @@ namespace OpenSim.Server.Handlers.Grid
             else
                 m_log.WarnFormat("[GRID HANDLER]: no regionID in request to get neighbours");
 
-            List<SimpleRegionInfo> rinfos = m_GridService.GetNeighbours(scopeID, regionID);
+            List<GridRegion> rinfos = m_GridService.GetNeighbours(scopeID, regionID);
 
             Dictionary<string, object> result = new Dictionary<string, object>();
             int i = 0;
-            foreach (SimpleRegionInfo rinfo in rinfos)
+            foreach (GridRegion rinfo in rinfos)
             {
                 Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
                 result["region" + i] = rinfoDict;
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index 1962bcf..0a867db 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -35,6 +35,7 @@ using OpenSim.Framework;
 using OpenSim.Framework.Communications;
 using OpenSim.Framework.Servers.HttpServer;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 using OpenSim.Server.Base;
 using OpenMetaverse;
 
@@ -85,7 +86,7 @@ namespace OpenSim.Services.Connectors
 
         #region IGridService
 
-        public virtual bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfo)
+        public virtual bool RegisterRegion(UUID scopeID, GridRegion regionInfo)
         {
             Dictionary<string, object> rinfo = regionInfo.ToKeyValuePairs();
             Dictionary<string, string> sendData = new Dictionary<string,string>();
@@ -128,7 +129,7 @@ namespace OpenSim.Services.Connectors
             return false;
         }
 
-        public virtual List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        public virtual List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -143,7 +144,7 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
@@ -151,7 +152,7 @@ namespace OpenSim.Services.Connectors
                 {
                     if (r is Dictionary<string, object>)
                     {
-                        SimpleRegionInfo rinfo = new SimpleRegionInfo((Dictionary<string, object>)r);
+                        GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
                         rinfos.Add(rinfo);
                     }
                     else
@@ -166,7 +167,7 @@ namespace OpenSim.Services.Connectors
             return rinfos;
         }
 
-        public virtual SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public virtual GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -181,11 +182,11 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            SimpleRegionInfo rinfo = null;
+            GridRegion rinfo = null;
             if ((replyData != null) && (replyData["result"] != null))
             {
                 if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new SimpleRegionInfo((Dictionary<string, object>)replyData["result"]);
+                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
                 else
                     m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID {0}, {1} received invalid response",
                         scopeID, regionID);
@@ -197,7 +198,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public virtual SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public virtual GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -213,11 +214,11 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            SimpleRegionInfo rinfo = null;
+            GridRegion rinfo = null;
             if ((replyData != null) && (replyData["result"] != null))
             {
                 if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new SimpleRegionInfo((Dictionary<string, object>)replyData["result"]);
+                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
                 else
                     m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received invalid response",
                         scopeID, x, y);
@@ -229,7 +230,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public virtual SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public virtual GridRegion GetRegionByName(UUID scopeID, string regionName)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -244,11 +245,11 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            SimpleRegionInfo rinfo = null;
+            GridRegion rinfo = null;
             if ((replyData != null) && (replyData["result"] != null))
             {
                 if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new SimpleRegionInfo((Dictionary<string, object>)replyData["result"]);
+                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
                 else
                     m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1} received invalid response",
                         scopeID, regionName);
@@ -260,7 +261,7 @@ namespace OpenSim.Services.Connectors
             return rinfo;
         }
 
-        public virtual List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        public virtual List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -276,7 +277,7 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
@@ -284,7 +285,7 @@ namespace OpenSim.Services.Connectors
                 {
                     if (r is Dictionary<string, object>)
                     {
-                        SimpleRegionInfo rinfo = new SimpleRegionInfo((Dictionary<string, object>)r);
+                        GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
                         rinfos.Add(rinfo);
                     }
                     else
@@ -299,7 +300,7 @@ namespace OpenSim.Services.Connectors
             return rinfos;
         }
 
-        public virtual List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        public virtual List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
             Dictionary<string, string> sendData = new Dictionary<string, string>();
 
@@ -317,7 +318,7 @@ namespace OpenSim.Services.Connectors
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
@@ -325,7 +326,7 @@ namespace OpenSim.Services.Connectors
                 {
                     if (r is Dictionary<string, object>)
                     {
-                        SimpleRegionInfo rinfo = new SimpleRegionInfo((Dictionary<string, object>)r);
+                        GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
                         rinfos.Add(rinfo);
                     }
                     else
diff --git a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
index 6b0518c..616c2c1 100644
--- a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
@@ -33,6 +33,7 @@ using System.Drawing;
 using System.Net;
 using System.Reflection;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 
 using OpenSim.Framework;
 
@@ -54,7 +55,7 @@ namespace OpenSim.Services.Connectors.Grid
             m_AssetService = assService;
         }
 
-        public UUID LinkRegion(SimpleRegionInfo info, out ulong realHandle)
+        public UUID LinkRegion(GridRegion info, out ulong realHandle)
         {
             UUID uuid = UUID.Zero;
             realHandle = 0;
@@ -114,7 +115,7 @@ namespace OpenSim.Services.Connectors.Grid
             return uuid;
         }
 
-        public void GetMapImage(SimpleRegionInfo info)
+        public void GetMapImage(GridRegion info)
         {
             try
             {
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index b37a51b..cd462ab 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -35,6 +35,7 @@ using OpenSim.Framework;
 using OpenSim.Framework.Console;
 using OpenSim.Data;
 using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 using OpenMetaverse;
 
 namespace OpenSim.Services.GridService
@@ -48,6 +49,7 @@ namespace OpenSim.Services.GridService
         public GridService(IConfigSource config)
             : base(config)
         {
+            m_log.DebugFormat("[GRID SERVICE]: Starting...");
             MainConsole.Instance.Commands.AddCommand("kfs", false,
                     "show digest",
                     "show digest <ID>",
@@ -62,7 +64,7 @@ namespace OpenSim.Services.GridService
 
         #region IGridService
 
-        public bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfos)
+        public bool RegisterRegion(UUID scopeID, GridRegion regionInfos)
         {
             if (m_Database.Get(regionInfos.RegionID, scopeID) != null)
             {
@@ -88,9 +90,9 @@ namespace OpenSim.Services.GridService
             return m_Database.Delete(regionID);
         }
 
-        public List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID)
+        public List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID)
         {
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
             RegionData region = m_Database.Get(regionID, scopeID);
             if (region != null)
             {
@@ -105,7 +107,7 @@ namespace OpenSim.Services.GridService
             return rinfos;
         }
 
-        public SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID)
+        public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
         {
             RegionData rdata = m_Database.Get(regionID, scopeID);
             if (rdata != null)
@@ -114,7 +116,7 @@ namespace OpenSim.Services.GridService
             return null;
         }
 
-        public SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y)
+        public GridRegion GetRegionByPosition(UUID scopeID, int x, int y)
         {
             int snapX = (int)(x / Constants.RegionSize) * (int)Constants.RegionSize;
             int snapY = (int)(y / Constants.RegionSize) * (int)Constants.RegionSize;
@@ -125,7 +127,7 @@ namespace OpenSim.Services.GridService
             return null;
         }
 
-        public SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName)
+        public GridRegion GetRegionByName(UUID scopeID, string regionName)
         {
             List<RegionData> rdatas = m_Database.Get(regionName + "%", scopeID);
             if ((rdatas != null) && (rdatas.Count > 0))
@@ -134,12 +136,12 @@ namespace OpenSim.Services.GridService
             return null;
         }
 
-        public List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber)
+        public List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber)
         {
             List<RegionData> rdatas = m_Database.Get("%" + name + "%", scopeID);
 
             int count = 0;
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
 
             if (rdatas != null)
             {
@@ -153,7 +155,7 @@ namespace OpenSim.Services.GridService
             return rinfos;
         }
 
-        public List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
+        public List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax)
         {
             int xminSnap = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize;
             int xmaxSnap = (int)(xmax / Constants.RegionSize) * (int)Constants.RegionSize;
@@ -161,7 +163,7 @@ namespace OpenSim.Services.GridService
             int ymaxSnap = (int)(ymax / Constants.RegionSize) * (int)Constants.RegionSize;
 
             List<RegionData> rdatas = m_Database.Get(xminSnap, yminSnap, xmaxSnap, ymaxSnap, scopeID);
-            List<SimpleRegionInfo> rinfos = new List<SimpleRegionInfo>();
+            List<GridRegion> rinfos = new List<GridRegion>();
             foreach (RegionData rdata in rdatas)
                 rinfos.Add(RegionData2RegionInfo(rdata));
 
@@ -172,7 +174,7 @@ namespace OpenSim.Services.GridService
 
         #region Data structure conversions
 
-        protected RegionData RegionInfo2RegionData(SimpleRegionInfo rinfo)
+        protected RegionData RegionInfo2RegionData(GridRegion rinfo)
         {
             RegionData rdata = new RegionData();
             rdata.posX = (int)rinfo.RegionLocX;
@@ -184,11 +186,11 @@ namespace OpenSim.Services.GridService
             return rdata;
         }
 
-        protected SimpleRegionInfo RegionData2RegionInfo(RegionData rdata)
+        protected GridRegion RegionData2RegionInfo(RegionData rdata)
         {
-            SimpleRegionInfo rinfo = new SimpleRegionInfo(rdata.Data);
-            rinfo.RegionLocX = (uint)rdata.posX;
-            rinfo.RegionLocY = (uint)rdata.posY;
+            GridRegion rinfo = new GridRegion(rdata.Data);
+            rinfo.RegionLocX = rdata.posX;
+            rinfo.RegionLocY = rdata.posY;
             rinfo.RegionID = rdata.RegionID;
             rinfo.RegionName = rdata.RegionName;
 
diff --git a/OpenSim/Services/GridService/GridServiceBase.cs b/OpenSim/Services/GridService/GridServiceBase.cs
index 7522e64..444f79b 100644
--- a/OpenSim/Services/GridService/GridServiceBase.cs
+++ b/OpenSim/Services/GridService/GridServiceBase.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Services.GridService
                 connString = gridConfig.GetString("ConnectionString", connString);
                 realm = gridConfig.GetString("Realm", realm);
             }
-
+            
             //
             // We tried, but this doesn't exist. We can't proceed.
             //
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 8f6c524..a188f7e 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -25,8 +25,11 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-using OpenSim.Framework;
+using System;
 using System.Collections.Generic;
+using System.Net;
+using System.Net.Sockets;
+using OpenSim.Framework;
 using OpenMetaverse;
 
 namespace OpenSim.Services.Interfaces
@@ -39,7 +42,7 @@ namespace OpenSim.Services.Interfaces
         /// <param name="regionInfos"> </param>
         /// <returns></returns>
         /// <exception cref="System.Exception">Thrown if region registration failed</exception>
-        bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfos);
+        bool RegisterRegion(UUID scopeID, GridRegion regionInfos);
 
         /// <summary>
         /// Deregister a region with the grid service.
@@ -55,9 +58,9 @@ namespace OpenSim.Services.Interfaces
         /// <param name="x"></param>
         /// <param name="y"></param>
         /// <returns></returns>
-        List<SimpleRegionInfo> GetNeighbours(UUID scopeID, UUID regionID);
+        List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID);
 
-        SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID);
+        GridRegion GetRegionByUUID(UUID scopeID, UUID regionID);
 
         /// <summary>
         /// Get the region at the given position (in meters)
@@ -66,9 +69,9 @@ namespace OpenSim.Services.Interfaces
         /// <param name="x"></param>
         /// <param name="y"></param>
         /// <returns></returns>
-        SimpleRegionInfo GetRegionByPosition(UUID scopeID, int x, int y);
-        
-        SimpleRegionInfo GetRegionByName(UUID scopeID, string regionName);
+        GridRegion GetRegionByPosition(UUID scopeID, int x, int y);
+
+        GridRegion GetRegionByName(UUID scopeID, string regionName);
 
         /// <summary>
         /// Get information about regions starting with the provided name. 
@@ -83,9 +86,237 @@ namespace OpenSim.Services.Interfaces
         /// A list of <see cref="RegionInfo"/>s of regions with matching name. If the
         /// grid-server couldn't be contacted or returned an error, return null. 
         /// </returns>
-        List<SimpleRegionInfo> GetRegionsByName(UUID scopeID, string name, int maxNumber);
+        List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber);
 
-        List<SimpleRegionInfo> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
+        List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
 
     }
+
+    public class GridRegion
+    {
+
+        /// <summary>
+        /// The port by which http communication occurs with the region 
+        /// </summary>
+        public uint HttpPort
+        {
+            get { return m_httpPort; }
+            set { m_httpPort = value; }
+        }
+        protected uint m_httpPort;
+
+        /// <summary>
+        /// A well-formed URI for the host region server (namely "http://" + ExternalHostName)
+        /// </summary>
+        public string ServerURI
+        {
+            get { return m_serverURI; }
+            set { m_serverURI = value; }
+        }
+        protected string m_serverURI;
+
+        public string RegionName
+        {
+            get { return m_regionName; }
+            set { m_regionName = value; }
+        }
+        protected string m_regionName = String.Empty;
+
+        protected bool Allow_Alternate_Ports;
+        public bool m_allow_alternate_ports;
+
+        protected string m_externalHostName;
+
+        protected IPEndPoint m_internalEndPoint;
+
+        public int RegionLocX
+        {
+            get { return m_regionLocX; }
+            set { m_regionLocX = value; }
+        }
+        protected int m_regionLocX;
+
+        public int RegionLocY
+        {
+            get { return m_regionLocY; }
+            set { m_regionLocY = value; }
+        }
+        protected int m_regionLocY;
+
+        public UUID RegionID = UUID.Zero;
+        public UUID ScopeID = UUID.Zero;
+
+        public GridRegion()
+        {
+        }
+
+        public GridRegion(int regionLocX, int regionLocY, IPEndPoint internalEndPoint, string externalUri)
+        {
+            m_regionLocX = regionLocX;
+            m_regionLocY = regionLocY;
+
+            m_internalEndPoint = internalEndPoint;
+            m_externalHostName = externalUri;
+        }
+
+        public GridRegion(int regionLocX, int regionLocY, string externalUri, uint port)
+        {
+            m_regionLocX = regionLocX;
+            m_regionLocY = regionLocY;
+
+            m_externalHostName = externalUri;
+
+            m_internalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)port);
+        }
+
+        public GridRegion(uint xcell, uint ycell)
+        {
+            m_regionLocX = (int)(xcell * Constants.RegionSize);
+            m_regionLocY = (int)(ycell * Constants.RegionSize);
+        }
+
+        public GridRegion(RegionInfo ConvertFrom)
+        {
+            m_regionName = ConvertFrom.RegionName;
+            m_regionLocX = (int)(ConvertFrom.RegionLocX * Constants.RegionSize);
+            m_regionLocY = (int)(ConvertFrom.RegionLocY * Constants.RegionSize);
+            m_internalEndPoint = ConvertFrom.InternalEndPoint;
+            m_externalHostName = ConvertFrom.ExternalHostName;
+            m_httpPort = ConvertFrom.HttpPort;
+            m_allow_alternate_ports = ConvertFrom.m_allow_alternate_ports;
+            RegionID = UUID.Zero;
+            ServerURI = ConvertFrom.ServerURI;
+        }
+
+
+        /// <value>
+        /// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw.
+        ///
+        /// XXX Isn't this really doing too much to be a simple getter, rather than an explict method?
+        /// </value>
+        public IPEndPoint ExternalEndPoint
+        {
+            get
+            {
+                // Old one defaults to IPv6
+                //return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
+
+                IPAddress ia = null;
+                // If it is already an IP, don't resolve it - just return directly
+                if (IPAddress.TryParse(m_externalHostName, out ia))
+                    return new IPEndPoint(ia, m_internalEndPoint.Port);
+
+                // Reset for next check
+                ia = null;
+                try
+                {
+                    foreach (IPAddress Adr in Dns.GetHostAddresses(m_externalHostName))
+                    {
+                        if (ia == null)
+                            ia = Adr;
+
+                        if (Adr.AddressFamily == AddressFamily.InterNetwork)
+                        {
+                            ia = Adr;
+                            break;
+                        }
+                    }
+                }
+                catch (SocketException e)
+                {
+                    throw new Exception(
+                        "Unable to resolve local hostname " + m_externalHostName + " innerException of type '" +
+                        e + "' attached to this exception", e);
+                }
+
+                return new IPEndPoint(ia, m_internalEndPoint.Port);
+            }
+
+            set { m_externalHostName = value.ToString(); }
+        }
+
+        public string ExternalHostName
+        {
+            get { return m_externalHostName; }
+            set { m_externalHostName = value; }
+        }
+
+        public IPEndPoint InternalEndPoint
+        {
+            get { return m_internalEndPoint; }
+            set { m_internalEndPoint = value; }
+        }
+
+        public ulong RegionHandle
+        {
+            get { return Util.UIntsToLong((uint)RegionLocX, (uint)RegionLocY); }
+        }
+
+        public int getInternalEndPointPort()
+        {
+            return m_internalEndPoint.Port;
+        }
+
+        public Dictionary<string, object> ToKeyValuePairs()
+        {
+            Dictionary<string, object> kvp = new Dictionary<string, object>();
+            kvp["uuid"] = RegionID.ToString();
+            kvp["locX"] = RegionLocX.ToString();
+            kvp["locY"] = RegionLocY.ToString();
+            kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
+            kvp["external_port"] = ExternalEndPoint.Port.ToString();
+            kvp["external_host_name"] = ExternalHostName;
+            kvp["http_port"] = HttpPort.ToString();
+            kvp["internal_ip_address"] = InternalEndPoint.Address.ToString();
+            kvp["internal_port"] = InternalEndPoint.Port.ToString();
+            kvp["alternate_ports"] = m_allow_alternate_ports.ToString();
+            kvp["server_uri"] = ServerURI;
+
+            return kvp;
+        }
+
+        public GridRegion(Dictionary<string, object> kvp)
+        {
+            if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
+            {
+                int port = 0;
+                Int32.TryParse((string)kvp["external_port"], out port);
+                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["external_ip_address"]), port);
+                ExternalEndPoint = ep;
+            }
+            else
+                ExternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+
+            if (kvp["external_host_name"] != null)
+                ExternalHostName = (string)kvp["external_host_name"];
+
+            if (kvp["http_port"] != null)
+            {
+                UInt32 port = 0;
+                UInt32.TryParse((string)kvp["http_port"], out port);
+                HttpPort = port;
+            }
+
+            if ((kvp["internal_ip_address"] != null) && (kvp["internal_port"] != null))
+            {
+                int port = 0;
+                Int32.TryParse((string)kvp["internal_port"], out port);
+                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["internal_ip_address"]), port);
+                InternalEndPoint = ep;
+            }
+            else
+                InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+
+            if (kvp["alternate_ports"] != null)
+            {
+                bool alts = false;
+                Boolean.TryParse((string)kvp["alternate_ports"], out alts);
+                m_allow_alternate_ports = alts;
+            }
+
+            if (kvp["server_uri"] != null)
+                ServerURI = (string)kvp["server_uri"];
+        }
+    }
+
 }
diff --git a/bin/config-include/Standalone.ini b/bin/config-include/Standalone.ini
index 69c60ee..5a5cbff 100644
--- a/bin/config-include/Standalone.ini
+++ b/bin/config-include/Standalone.ini
@@ -25,4 +25,5 @@
 
 [GridService]
 	LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
+	StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
 	
\ No newline at end of file
diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini
index 24b0f26..b14517d 100644
--- a/bin/config-include/StandaloneHypergrid.ini
+++ b/bin/config-include/StandaloneHypergrid.ini
@@ -43,5 +43,5 @@
     
 [GridService]
 	LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
-	GridServiceConnectorModule = "OpenSim.Region.CoreModules.dll:LocalGridServiceConnector"
-	StorageProvider = "OpenSim.Data.Null.dll"
\ No newline at end of file
+	GridServiceConnectorModule = "OpenSim.Region.CoreModules.dll:LocalGridServicesConnector"
+	StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
\ No newline at end of file
-- 
cgit v1.1


From 3c19bd5142479e468aa9841a2177ddd33b46f8f6 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 23 Sep 2009 20:35:16 -0700
Subject: Unit tests for the grid service. Yey!

---
 .../Grid/Tests/GridConnectorsTests.cs              | 122 +++++++++++++++++++++
 prebuild.xml                                       |   1 +
 2 files changed, 123 insertions(+)
 create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs

diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
new file mode 100644
index 0000000..8d44249
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
@@ -0,0 +1,122 @@
+/*
+ * 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.IO;
+using System.Reflection;
+using System.Threading;
+using log4net.Config;
+using NUnit.Framework;
+using NUnit.Framework.SyntaxHelpers;
+using OpenMetaverse;
+using OpenSim.Framework;
+using Nini.Config;
+
+using OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid;
+using OpenSim.Region.Framework.Scenes;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Tests.Common;
+using OpenSim.Tests.Common.Setup;
+
+namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
+{
+    [TestFixture]
+    public class GridConnectorsTests
+    {
+        LocalGridServicesConnector m_LocalConnector;
+        private void SetUp()
+        {
+            IConfigSource config = new IniConfigSource();
+            config.AddConfig("Modules");
+            config.AddConfig("GridService");
+            config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector");
+            config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService");
+            config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullRegionData");
+
+            m_LocalConnector = new LocalGridServicesConnector(config);
+        }
+
+        /// <summary>
+        /// Test saving a V0.2 OpenSim Region Archive.
+        /// </summary>
+        [Test]
+        public void TestRegisterRegionV0_2()
+        {
+            SetUp();
+
+            // Create 3 regions
+            GridRegion r1 = new GridRegion();
+            r1.RegionName = "Test Region 1";
+            r1.RegionID = new UUID(1);
+            r1.RegionLocX = 1000 * (int)Constants.RegionSize;
+            r1.RegionLocY = 1000 * (int)Constants.RegionSize;
+            r1.ExternalHostName = "127.0.0.1";
+            r1.HttpPort = 9001;
+            r1.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0);
+
+            GridRegion r2 = new GridRegion();
+            r2.RegionName = "Test Region 2";
+            r2.RegionID = new UUID(2);
+            r2.RegionLocX = 1000 * (int)Constants.RegionSize + 1;
+            r2.RegionLocY = 1000 * (int)Constants.RegionSize;
+            r2.ExternalHostName = "127.0.0.1";
+            r2.HttpPort = 9002;
+            r2.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0);
+
+            GridRegion r3 = new GridRegion();
+            r3.RegionName = "Test Region 3";
+            r3.RegionID = new UUID(3);
+            r3.RegionLocX = 1000 * (int)Constants.RegionSize + 5;
+            r3.RegionLocY = 1000 * (int)Constants.RegionSize;
+            r3.ExternalHostName = "127.0.0.1";
+            r3.HttpPort = 9003;
+            r3.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0);
+
+            m_LocalConnector.RegisterRegion(UUID.Zero, r1);
+            GridRegion result = m_LocalConnector.GetRegionByName(UUID.Zero, "Test");
+            Assert.IsNotNull(result, "Retrieved GetRegionByName is null");
+            Assert.That(result.RegionName, Is.EqualTo("Test Region 1"), "Retrieved region's name does not match");
+
+            result = m_LocalConnector.GetRegionByUUID(UUID.Zero, new UUID(1));
+            Assert.IsNotNull(result, "Retrieved GetRegionByUUID is null");
+            Assert.That(result.RegionID, Is.EqualTo(new UUID(1)), "Retrieved region's UUID does not match");
+
+            result = m_LocalConnector.GetRegionByPosition(UUID.Zero, 1000 * (int)Constants.RegionSize, 1000 * (int)Constants.RegionSize);
+            Assert.IsNotNull(result, "Retrieved GetRegionByPosition is null");
+            Assert.That(result.RegionLocX, Is.EqualTo(1000 * (int)Constants.RegionSize), "Retrieved region's position does not match");
+
+            m_LocalConnector.RegisterRegion(UUID.Zero, r2);
+            m_LocalConnector.RegisterRegion(UUID.Zero, r3);
+
+            List<GridRegion> results = m_LocalConnector.GetNeighbours(UUID.Zero, new UUID(1));
+            Assert.IsNotNull(results, "Retrieved neighbours list is null");
+            Assert.That(results.Count, Is.EqualTo(1), "Retrieved neighbour collection is greater than expected");
+            Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)));
+        }
+    }
+}
diff --git a/prebuild.xml b/prebuild.xml
index b131019..cb20319 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -3592,6 +3592,7 @@
         <Match path="World/Archiver/Tests" pattern="*.cs" recurse="true" />
         <Match path="World/Serialiser/Tests" pattern="*.cs" recurse="true" />
         <Match path="World/Terrain/Tests" pattern="*.cs" recurse="true" />
+        <Match path="ServiceConnectorsOut/Grid/Tests" pattern="*.cs" recurse="true" />
       </Files>
     </Project>
 
-- 
cgit v1.1


From fd8fb7735b0eb6150679ccad84b2a32fd5315a38 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 23 Sep 2009 20:39:25 -0700
Subject: First test passes -- regions being registered and retrieved correctly
 in Data.Null.

---
 .../ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs            | 4 ++--
 OpenSim/Services/GridService/GridService.cs                           | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
index 8d44249..bd3293d 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
             GridRegion r2 = new GridRegion();
             r2.RegionName = "Test Region 2";
             r2.RegionID = new UUID(2);
-            r2.RegionLocX = 1000 * (int)Constants.RegionSize + 1;
+            r2.RegionLocX = 1001 * (int)Constants.RegionSize;
             r2.RegionLocY = 1000 * (int)Constants.RegionSize;
             r2.ExternalHostName = "127.0.0.1";
             r2.HttpPort = 9002;
@@ -91,7 +91,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
             GridRegion r3 = new GridRegion();
             r3.RegionName = "Test Region 3";
             r3.RegionID = new UUID(3);
-            r3.RegionLocX = 1000 * (int)Constants.RegionSize + 5;
+            r3.RegionLocX = 1005 * (int)Constants.RegionSize;
             r3.RegionLocY = 1000 * (int)Constants.RegionSize;
             r3.ExternalHostName = "127.0.0.1";
             r3.HttpPort = 9003;
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index cd462ab..1b297dc 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -101,7 +101,8 @@ namespace OpenSim.Services.GridService
                     region.posX + (int)Constants.RegionSize, region.posY + (int)Constants.RegionSize, scopeID);
 
                 foreach (RegionData rdata in rdatas)
-                    rinfos.Add(RegionData2RegionInfo(rdata));
+                    if (rdata.RegionID != regionID)
+                        rinfos.Add(RegionData2RegionInfo(rdata));
 
             }
             return rinfos;
-- 
cgit v1.1


From 1260c81a9cfc19306e2053a8b066e50c78dbc7c1 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 23 Sep 2009 20:51:04 -0700
Subject: More tests. Seems to be working. Grid connector modules are enabled
 for standalones only, but nothing in the simulator uses them yet, so it's
 safe to go in.

---
 OpenSim/Data/Null/NullRegionData.cs                           |  2 +-
 .../ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs    | 11 ++++++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index 03489f9..e976c40 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -40,7 +40,7 @@ namespace OpenSim.Data.Null
 
         public NullRegionData(string connectionString, string realm)
         {
-            Console.WriteLine("[XXX] NullRegionData constructor");
+            //Console.WriteLine("[XXX] NullRegionData constructor");
         }
 
         public List<RegionData> Get(string regionName, UUID scopeID)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
index bd3293d..be32d6b 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs
@@ -116,7 +116,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests
             List<GridRegion> results = m_LocalConnector.GetNeighbours(UUID.Zero, new UUID(1));
             Assert.IsNotNull(results, "Retrieved neighbours list is null");
             Assert.That(results.Count, Is.EqualTo(1), "Retrieved neighbour collection is greater than expected");
-            Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)));
+            Assert.That(results[0].RegionID, Is.EqualTo(new UUID(2)), "Retrieved region's UUID does not match");
+
+            results = m_LocalConnector.GetRegionsByName(UUID.Zero, "Test", 10);
+            Assert.IsNotNull(results, "Retrieved GetRegionsByName list is null");
+            Assert.That(results.Count, Is.EqualTo(3), "Retrieved neighbour collection is less than expected");
+
+            results = m_LocalConnector.GetRegionRange(UUID.Zero, 900 * (int)Constants.RegionSize, 1002 * (int)Constants.RegionSize,
+                900 * (int)Constants.RegionSize, 1100 * (int)Constants.RegionSize);
+            Assert.IsNotNull(results, "Retrieved GetRegionRange list is null");
+            Assert.That(results.Count, Is.EqualTo(2), "Retrieved neighbour collection is not the number expected");
         }
     }
 }
-- 
cgit v1.1


From aca9fd182ee6dec5ac778f7aafd9a8fa6a5fd4e2 Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Thu, 24 Sep 2009 20:27:11 +1000
Subject: * Added two new commands to EstateManagementModule * Also, I hate
 git.

---
 .../World/Estate/EstateManagementModule.cs         | 61 +++++++++++++++++++---
 1 file changed, 55 insertions(+), 6 deletions(-)

diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 75b3fe6..f52a287 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -33,7 +33,6 @@ using log4net;
 using Nini.Config;
 using OpenMetaverse;
 using OpenSim.Framework;
-using OpenSim.Region.CoreModules.World.Terrain;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 
@@ -47,7 +46,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
 
         private Scene m_scene;
 
-        private EstateTerrainXferHandler TerrainUploader = null;
+        private EstateTerrainXferHandler TerrainUploader;
 
         #region Packet Data Responders
 
@@ -668,7 +667,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
                 LookupUUID(uuidNameLookupList);
         }
 
-        private void LookupUUIDSCompleted(IAsyncResult iar)
+        private static void LookupUUIDSCompleted(IAsyncResult iar)
         {
             LookupUUIDS icon = (LookupUUIDS)iar.AsyncState;
             icon.EndInvoke(iar);
@@ -683,7 +682,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
         }
         private void LookupUUIDsAsync(List<UUID> uuidLst)
         {
-            UUID[] uuidarr = new UUID[0];
+            UUID[] uuidarr;
 
             lock (uuidLst)
             {
@@ -707,7 +706,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
 
             for (int i = 0; i < avatars.Count; i++)
             {
-                HandleRegionInfoRequest(avatars[i].ControllingClient); ;
+                HandleRegionInfoRequest(avatars[i].ControllingClient);
             }
         }
 
@@ -768,7 +767,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
             else
             {
                 m_scene.RegionInfo.EstateSettings.UseGlobalTime = false;
-                m_scene.RegionInfo.EstateSettings.SunPosition = (double)(parms2 - 0x1800)/1024.0;
+                m_scene.RegionInfo.EstateSettings.SunPosition = (parms2 - 0x1800)/1024.0;
             }
 
             if ((parms1 & 0x00000010) != 0)
@@ -828,8 +827,58 @@ namespace OpenSim.Region.CoreModules.World.Estate
             m_scene.RegisterModuleInterface<IEstateModule>(this);
             m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
             m_scene.EventManager.OnRequestChangeWaterHeight += changeWaterHeight;
+
+            m_scene.AddCommand(this, "set terrain texture",
+                               "set terrain texture <number> <uuid> [<x>] [<y>]",
+                               "Sets the terrain <number> to <uuid>, if <x> or <y> are specified, it will only " +
+                               "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
+                               " that coordinate.",
+                               consoleSetTerrainTexture);
+
+            m_scene.AddCommand(this, "set terrain heights",
+                               "set terrain heights <corner> <min> <max> [<x>] [<y>]",
+                               "Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
+                               "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
+                               " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
+                               consoleSetTerrainTexture);
         }
 
+        #region Console Commands
+
+        public void consoleSetTerrainTexture(string module, string[] args)
+        {
+            string num = args[3];
+            string uuid = args[4];
+            int x = (args.Length > 5 ? int.Parse(args[5]) : -1);
+            int y = (args.Length > 6 ? int.Parse(args[6]) : -1);
+
+            if (x != -1 && m_scene.RegionInfo.RegionLocX != x)
+            {
+                if (y != -1 && m_scene.RegionInfo.RegionLocY != y)
+                {
+                    setEstateTerrainBaseTexture(null, int.Parse(num), UUID.Parse(uuid));
+                }
+            }
+         }
+ 
+        public void consoleSetTerrainHeights(string module, string[] args)
+        {
+            string num = args[3];
+            string min = args[4];
+            string max = args[5];
+            int x = (args.Length > 6 ? int.Parse(args[6]) : -1);
+            int y = (args.Length > 7 ? int.Parse(args[7]) : -1);
+
+            if (x != -1 && m_scene.RegionInfo.RegionLocX != x)
+            {
+                if (y != -1 && m_scene.RegionInfo.RegionLocY != y)
+                {
+                    setEstateTerrainTextureHeights(null, int.Parse(num), float.Parse(min), float.Parse(max));
+                }
+            }
+        }
+
+        #endregion
 
         public void PostInitialise()
         {
-- 
cgit v1.1


From 71a4b02c7e9a2587759fd40092d1bdcfef648eff Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Thu, 24 Sep 2009 20:56:01 +1000
Subject: * Minor commit, added two new math utility functions.

---
 OpenSim/Framework/Util.cs | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 58344f3..45b5a10 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -70,6 +70,39 @@ namespace OpenSim.Framework
         public static readonly Regex UUIDPattern 
             = new Regex("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
         
+        /// <summary>
+        /// Linear interpolates B<->C using percent A
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="c"></param>
+        /// <returns></returns>
+        public static double lerp(double a, double b, double c)
+        {
+            return (b*a) + (c*(1 - a));
+        }
+
+        /// <summary>
+        /// Bilinear Interpolate, see Lerp but for 2D using 'percents' X & Y.
+        /// Layout:
+        ///     A B
+        ///     C D
+        /// A<->C = Y
+        /// C<->D = X
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="c"></param>
+        /// <param name="d"></param>
+        /// <returns></returns>
+        public static double lerp2D(double x, double y, double a, double b, double c, double d)
+        {
+            return lerp(y, lerp(x, a, b), lerp(x, c, d));
+        }
+
+
         /// <value>
         /// Well known UUID for the blank texture used in the Linden SL viewer version 1.20 (and hopefully onwards) 
         /// </value>
-- 
cgit v1.1


From 57429423bbb080d5381dd91ffe4d927537fbf62f Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Thu, 24 Sep 2009 21:29:57 +1000
Subject: * Fixing typo.

---
 OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index f52a287..fa52334 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -840,7 +840,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
                                "Sets the terrain texture heights on corner #<corner> to <min>/<max>, if <x> or <y> are specified, it will only " +
                                "set it on regions with a matching coordinate. Specify -1 in <x> or <y> to wildcard" +
                                " that coordinate. Corner # SW = 0, NW = 1, SE = 2, NE = 3.",
-                               consoleSetTerrainTexture);
+                               consoleSetTerrainHeights);
         }
 
         #region Console Commands
-- 
cgit v1.1


From 8605c5d2eb0d514c1475b94120fd6db9644874cf Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Thu, 24 Sep 2009 21:46:41 +1000
Subject: * Establishing why new console commands fail to work. >_>

---
 .../Region/CoreModules/World/Estate/EstateManagementModule.cs  | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index fa52334..bb77bd5 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -852,10 +852,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
             int x = (args.Length > 5 ? int.Parse(args[5]) : -1);
             int y = (args.Length > 6 ? int.Parse(args[6]) : -1);
 
-            if (x != -1 && m_scene.RegionInfo.RegionLocX != x)
+            if (x == -1 || m_scene.RegionInfo.RegionLocX == x)
             {
-                if (y != -1 && m_scene.RegionInfo.RegionLocY != y)
+                if (y == -1 || m_scene.RegionInfo.RegionLocY == y)
                 {
+                    m_log.Debug("[ESTATEMODULE] Setting terrain textures for " + m_scene.RegionInfo.RegionName);
                     setEstateTerrainBaseTexture(null, int.Parse(num), UUID.Parse(uuid));
                 }
             }
@@ -869,10 +870,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
             int x = (args.Length > 6 ? int.Parse(args[6]) : -1);
             int y = (args.Length > 7 ? int.Parse(args[7]) : -1);
 
-            if (x != -1 && m_scene.RegionInfo.RegionLocX != x)
+            if (x == -1 || m_scene.RegionInfo.RegionLocX == x)
             {
-                if (y != -1 && m_scene.RegionInfo.RegionLocY != y)
+                if (y == -1 || m_scene.RegionInfo.RegionLocY == y)
                 {
+                    m_log.Debug("[ESTATEMODULE] Setting terrain heights " + m_scene.RegionInfo.RegionName);
                     setEstateTerrainTextureHeights(null, int.Parse(num), float.Parse(min), float.Parse(max));
                 }
             }
-- 
cgit v1.1


From ca69fac13e2a0b648b02bf32a368f77d2fbec1fb Mon Sep 17 00:00:00 2001
From: Adam Frisby
Date: Thu, 24 Sep 2009 22:02:29 +1000
Subject: * Send Updated Information Packet to Clients after updating estate
 settings.

---
 OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index bb77bd5..0d51cf4 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -154,6 +154,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
                     break;
             }
             m_scene.RegionInfo.RegionSettings.Save();
+            sendRegionInfoPacketToAll();
         }
 
         public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue)
@@ -178,6 +179,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
                     break;
             }
             m_scene.RegionInfo.RegionSettings.Save();
+            sendRegionInfoPacketToAll();
         }
 
         private void handleCommitEstateTerrainTextureRequest(IClientAPI remoteClient)
-- 
cgit v1.1


From 2824bbc47b30ab6fb9a12bce3201bb5b79b20bd5 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 05:48:35 -0700
Subject: Changed name of the hyperlink XMLRPC method to linkk-region, so that
 it doesn't conflict with the existing one.

---
 OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs      | 2 +-
 OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs | 2 +-
 OpenSim/Services/GridService/GridService.cs                   | 4 +++-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs b/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs
index b8d9c7d..ad63485 100644
--- a/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs
+++ b/OpenSim/Server/Handlers/Grid/HypergridServerConnector.cs
@@ -53,7 +53,7 @@ namespace OpenSim.Server.Handlers.Grid
         public HypergridServiceInConnector(IConfigSource config, IHttpServer server) :
                 base(config, server)
         {
-            server.AddXmlRPCHandler("link_region", LinkRegionRequest, false);
+            server.AddXmlRPCHandler("linkk_region", LinkRegionRequest, false);
         }
 
         /// <summary>
diff --git a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
index 616c2c1..b5e8743 100644
--- a/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/HypergridServiceConnector.cs
@@ -66,7 +66,7 @@ namespace OpenSim.Services.Connectors.Grid
             IList paramList = new ArrayList();
             paramList.Add(hash);
 
-            XmlRpcRequest request = new XmlRpcRequest("link_region", paramList);
+            XmlRpcRequest request = new XmlRpcRequest("linkk_region", paramList);
             string uri = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/";
             m_log.Debug("[HGrid]: Linking to " + uri);
             XmlRpcResponse response = request.Send(uri, 10000);
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 1b297dc..01ffa1d 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -71,7 +71,9 @@ namespace OpenSim.Services.GridService
                 m_log.WarnFormat("[GRID SERVICE]: Region {0} already registered in scope {1}.", regionInfos.RegionID, scopeID);
                 return false;
             }
-            if (m_Database.Get((int)regionInfos.RegionLocX, (int)regionInfos.RegionLocY, scopeID) != null)
+            // This needs better sanity testing. What if regionInfo is registering in
+            // overlapping coords?
+            if (m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID) != null)
             {
                 m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", 
                     regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID);
-- 
cgit v1.1


From 7870152d23db4cb6f5834d4921fac17feb717220 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 24 Sep 2009 14:54:12 +0100
Subject: Allow load/save iar password checks to be done in grid mode This
 should allow load/save iar to work for grid mode as long as the grid user
 service is later than this revision Grid services of earlier revisions will
 always erroneously report incorrect password.  This will be addressed
 shortly.

---
 OpenSim/Framework/Communications/IUserService.cs   | 16 ++++++-
 .../Communications/Tests/Cache/AssetCacheTests.cs  |  5 ++
 .../Framework/Communications/UserManagerBase.cs    | 32 +++++++++++--
 OpenSim/Grid/UserServer.Modules/UserManager.cs     | 56 +++++++++++++++++++++-
 .../Communications/Local/LocalUserServices.cs      | 19 +++++++-
 .../Region/Communications/OGS1/OGS1UserServices.cs | 43 ++++++++++++++++-
 .../Inventory/Archiver/InventoryArchiverModule.cs  | 21 ++------
 7 files changed, 166 insertions(+), 26 deletions(-)

diff --git a/OpenSim/Framework/Communications/IUserService.cs b/OpenSim/Framework/Communications/IUserService.cs
index 725225d..15c5a96 100644
--- a/OpenSim/Framework/Communications/IUserService.cs
+++ b/OpenSim/Framework/Communications/IUserService.cs
@@ -98,7 +98,7 @@ namespace OpenSim.Framework.Communications
         /// <param name="friendlistowner">The agent that who's friends list is being updated</param>
         /// <param name="friend">The agent that is getting or loosing permissions</param>
         /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param>
-        void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms);
+        void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms);   
 
         /// <summary>
         /// Logs off a user on the user server
@@ -137,9 +137,21 @@ namespace OpenSim.Framework.Communications
         // But since Scenes only have IUserService references, I'm placing it here for now.
         bool VerifySession(UUID userID, UUID sessionID);
 
+        /// <summary>
+        /// Authenticate a user by their password.
+        /// </summary>
+        /// 
+        /// This is used by callers outside the login process that want to
+        /// verify a user who has given their password.
+        ///
+        /// This should probably also be in IAuthentication but is here for the same reasons as VerifySession() is
+        ///
+        /// <param name="userID"></param>
+        /// <param name="password"></param>
+        /// <returns></returns>
+        bool AuthenticateUserByPassword(UUID userID, string password);        
 
         // Temporary Hack until we move everything to the new service model
         void SetInventoryService(IInventoryService invService);
-
     }
 }
diff --git a/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs b/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
index ac0dc6d..a757282 100644
--- a/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
+++ b/OpenSim/Framework/Communications/Tests/Cache/AssetCacheTests.cs
@@ -149,6 +149,11 @@ namespace OpenSim.Framework.Communications.Tests
             {
                 throw new NotImplementedException();
             }
+
+            public virtual bool AuthenticateUserByPassword(UUID userID, string password)
+            {
+                throw new NotImplementedException();        
+            }             
         }
     }
 }
diff --git a/OpenSim/Framework/Communications/UserManagerBase.cs b/OpenSim/Framework/Communications/UserManagerBase.cs
index 58174a0..1abd733 100644
--- a/OpenSim/Framework/Communications/UserManagerBase.cs
+++ b/OpenSim/Framework/Communications/UserManagerBase.cs
@@ -44,7 +44,8 @@ namespace OpenSim.Framework.Communications
     /// <summary>
     /// Base class for user management (create, read, etc)
     /// </summary>
-    public abstract class UserManagerBase : IUserService, IUserAdminService, IAvatarService, IMessagingService, IAuthentication
+    public abstract class UserManagerBase 
+        : IUserService, IUserAdminService, IAvatarService, IMessagingService, IAuthentication
     {
         private static readonly ILog m_log
             = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -93,9 +94,9 @@ namespace OpenSim.Framework.Communications
         public void AddPlugin(string provider, string connect)
         {
             m_plugins.AddRange(DataPluginFactory.LoadDataPlugins<IUserDataPlugin>(provider, connect));
-        }
+        }       
 
-        #region UserProfile
+        #region UserProfile        
         
         public virtual void AddTemporaryUserProfile(UserProfileData userProfile)
         {
@@ -891,7 +892,10 @@ namespace OpenSim.Framework.Communications
 
             if (userProfile != null && userProfile.CurrentAgent != null)
             {
-                m_log.DebugFormat("[USER AUTH]: Verifying session {0} for {1}; current  session {2}", sessionID, userID, userProfile.CurrentAgent.SessionID);
+                m_log.DebugFormat(
+                    "[USER AUTH]: Verifying session {0} for {1}; current  session {2}", 
+                    sessionID, userID, userProfile.CurrentAgent.SessionID);
+                
                 if (userProfile.CurrentAgent.SessionID == sessionID)
                 {
                     return true;
@@ -901,6 +905,26 @@ namespace OpenSim.Framework.Communications
             return false;
         }
 
+        public virtual bool AuthenticateUserByPassword(UUID userID, string password)
+        {
+//            m_log.DebugFormat("[USER AUTH]: Authenticating user {0} given password {1}", userID, password);
+            
+            UserProfileData userProfile = GetUserProfile(userID);
+
+            if (null == userProfile)
+                return false;
+      
+            string md5PasswordHash = Util.Md5Hash(Util.Md5Hash(password) + ":" + userProfile.PasswordSalt);
+
+//            m_log.DebugFormat(
+//                "[USER AUTH]: Submitted hash {0}, stored hash {1}", md5PasswordHash, userProfile.PasswordHash);
+    
+            if (md5PasswordHash == userProfile.PasswordHash)
+                return true;
+            else
+                return false;         
+        }          
+
         #endregion
     }
 }
diff --git a/OpenSim/Grid/UserServer.Modules/UserManager.cs b/OpenSim/Grid/UserServer.Modules/UserManager.cs
index 002f232..bc19ac8 100644
--- a/OpenSim/Grid/UserServer.Modules/UserManager.cs
+++ b/OpenSim/Grid/UserServer.Modules/UserManager.cs
@@ -108,6 +108,9 @@ namespace OpenSim.Grid.UserServer.Modules
             m_httpServer.AddXmlRPCHandler("get_user_by_uuid", XmlRPCGetUserMethodUUID);
             m_httpServer.AddXmlRPCHandler("get_avatar_picker_avatar", XmlRPCGetAvatarPickerAvatar);
 
+            // Used by IAR module to do password checks
+            //m_httpServer.AddXmlRPCHandler("authenticate_user_by_password", XmlRPCAuthenticateUserMethodPassword);
+
             m_httpServer.AddXmlRPCHandler("update_user_current_region", XmlRPCAtRegion);
             m_httpServer.AddXmlRPCHandler("logout_of_simulator", XmlRPCLogOffUserMethodUUID);
             m_httpServer.AddXmlRPCHandler("get_agent_by_uuid", XmlRPCGetAgentMethodUUID);
@@ -203,6 +206,57 @@ namespace OpenSim.Grid.UserServer.Modules
 
         #region XMLRPC User Methods
 
+        /// <summary>
+        /// Authenticate a user using their password
+        /// </summary>
+        /// <param name="request">Must contain values for "user_uuid" and "password" keys</param>
+        /// <param name="remoteClient"></param>
+        /// <returns></returns>
+        public XmlRpcResponse XmlRPCAuthenticateUserMethodPassword(XmlRpcRequest request, IPEndPoint remoteClient)
+        {
+//            m_log.DebugFormat("[USER MANAGER]: Received authenticated user by password request from {0}", remoteClient);
+            
+            Hashtable requestData = (Hashtable)request.Params[0];
+            string userUuidRaw = (string)requestData["user_uuid"];
+            string password = (string)requestData["password"];
+
+            if (null == userUuidRaw)
+                return Util.CreateUnknownUserErrorResponse();
+
+            UUID userUuid;
+            if (!UUID.TryParse(userUuidRaw, out userUuid))
+                return Util.CreateUnknownUserErrorResponse();
+
+            UserProfileData userProfile = m_userDataBaseService.GetUserProfile(userUuid);
+            if (null == userProfile)
+                return Util.CreateUnknownUserErrorResponse();            
+
+            string authed;
+            
+            if (null == password)
+            {
+                authed = "FALSE";
+            }
+            else
+            {
+                if (m_userDataBaseService.AuthenticateUserByPassword(userUuid, password))
+                    authed = "TRUE";
+                else
+                    authed = "FALSE";
+            }
+
+//            m_log.DebugFormat(
+//                "[USER MANAGER]: Authentication by password result from {0} for {1} is {2}",
+//                remoteClient, userUuid, authed);
+
+            XmlRpcResponse response = new XmlRpcResponse();            
+            Hashtable responseData = new Hashtable();            
+            responseData["auth_user"] = authed;
+            response.Value = responseData;
+            
+            return response;            
+        }
+
         public XmlRpcResponse XmlRPCGetAvatarPickerAvatar(XmlRpcRequest request, IPEndPoint remoteClient)
         {
             // XmlRpcResponse response = new XmlRpcResponse();
@@ -246,10 +300,10 @@ namespace OpenSim.Grid.UserServer.Modules
                     m_userDataBaseService.CommitAgent(ref userProfile);
                     //setUserProfile(userProfile);
 
-
                     returnstring = "TRUE";
                 }
             }
+                
             responseData.Add("returnString", returnstring);
             response.Value = responseData;
             return response;
diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs
index af4fb37..d18937e 100644
--- a/OpenSim/Region/Communications/Local/LocalUserServices.cs
+++ b/OpenSim/Region/Communications/Local/LocalUserServices.cs
@@ -80,6 +80,21 @@ namespace OpenSim.Region.Communications.Local
                 throw new Exception("[LOCAL USER SERVICES]: Unknown master user UUID. Possible reason: UserServer is not running.");
             }
             return data;
-        }       
+        }
+
+        public override bool AuthenticateUserByPassword(UUID userID, string password)
+        {
+            UserProfileData userProfile = GetUserProfile(userID);
+
+            if (null == userProfile)
+                return false;
+      
+            string md5PasswordHash = Util.Md5Hash(Util.Md5Hash(password) + ":" + userProfile.PasswordSalt);
+    
+            if (md5PasswordHash == userProfile.PasswordHash)
+                return true;
+            else
+                return false;         
+        }        
     }
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
index dff8305..89b3e42 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
@@ -140,6 +140,47 @@ namespace OpenSim.Region.Communications.OGS1
         {
             m_log.DebugFormat("[OGS1 USER SERVICES]: Verifying user session for " + userID);
             return AuthClient.VerifySession(GetUserServerURL(userID), userID, sessionID);
-        }  
+        }
+
+        public override bool AuthenticateUserByPassword(UUID userID, string password)
+        {
+            try
+            {
+                Hashtable param = new Hashtable();
+                param["user_uuid"] = userID.ToString();
+                param["password"] = password;
+                IList parameters = new ArrayList();
+                parameters.Add(param);
+                XmlRpcRequest req = new XmlRpcRequest("authenticate_user_by_password", parameters);
+                XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000);
+                Hashtable respData = (Hashtable)resp.Value;
+
+//                foreach (object key in respData.Keys)
+//                {                   
+//                    Console.WriteLine("respData {0}, {1}", key, respData[key]);
+//                }
+
+//                m_log.DebugFormat(
+//                    "[OGS1 USER SERVICES]: AuthenticatedUserByPassword response for {0} is [{1}]", 
+//                    userID, respData["auth_user"]);
+
+                if ((string)respData["auth_user"] == "TRUE")
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            catch (Exception e)
+            {
+                m_log.ErrorFormat(
+                    "[OGS1 USER SERVICES]: Error when trying to authenticate user by password from remote user server: {0}",
+                    e);
+
+                return false;
+            }            
+        }
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index 196205c..b82b940 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -322,7 +322,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
         /// <param name="pass">User password</param>
         /// <returns></returns>
         protected CachedUserInfo GetUserInfo(string firstName, string lastName, string pass)
-        {
+        {            
             CachedUserInfo userInfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(firstName, lastName);
             //m_aScene.CommsManager.UserService.GetUserProfile(firstName, lastName);
             if (null == userInfo)
@@ -333,29 +333,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
                 return null;
             }
 
-            string md5PasswdHash = Util.Md5Hash(Util.Md5Hash(pass) + ":" + userInfo.UserProfile.PasswordSalt);
-
-            if (userInfo.UserProfile.PasswordHash == null || userInfo.UserProfile.PasswordHash == String.Empty)
+            if (m_aScene.CommsManager.UserService.AuthenticateUserByPassword(userInfo.UserProfile.ID, pass))
             {
-                m_log.ErrorFormat(
-                    "[INVENTORY ARCHIVER]: Sorry, the grid mode service is not providing password hash details for the check.  This will be fixed in an OpenSim git revision soon");
-
-                return null;
+                return userInfo;
             }
-
-//            m_log.DebugFormat(
-//                "[INVENTORY ARCHIVER]: received salt {0}, hash {1}, supplied hash {2}", 
-//                userInfo.UserProfile.PasswordSalt, userInfo.UserProfile.PasswordHash, md5PasswdHash);
-            
-            if (userInfo.UserProfile.PasswordHash != md5PasswdHash)
+            else
             {
                 m_log.ErrorFormat(
                     "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect.  Please try again.", 
                     firstName, lastName);
+                
                 return null;
             }
-            
-            return userInfo;
         }
         
         /// <summary>
-- 
cgit v1.1


From e67341f24c3706be09d2c0c5d2d4ddeba1ddd089 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 24 Sep 2009 15:02:55 +0100
Subject: minor: replace xmlprc 'no method found' magic number with constant
 from xmlrpc library

---
 OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index db87958..01990fa 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -736,8 +736,11 @@ namespace OpenSim.Framework.Servers.HttpServer
                     else
                     {
                         xmlRpcResponse = new XmlRpcResponse();
+                        
                         // Code set in accordance with http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php
-                        xmlRpcResponse.SetFault(-32601, String.Format("Requested method [{0}] not found", methodName));
+                        xmlRpcResponse.SetFault(
+                            XmlRpcErrorCodes.SERVER_ERROR_METHOD, 
+                            String.Format("Requested method [{0}] not found", methodName));
                     }
 
                     responseString = XmlRpcResponseSerializer.Singleton.Serialize(xmlRpcResponse);
@@ -757,6 +760,7 @@ namespace OpenSim.Framework.Servers.HttpServer
                     response.SendChunked = false;
                     response.ContentLength64 = buf.Length;
                     response.ContentEncoding = Encoding.UTF8;
+                    
                     try
                     {
                         response.OutputStream.Write(buf, 0, buf.Length);
-- 
cgit v1.1


From f62b5e6cec31fe496ec4b9f7dcd6ae1f4063bead Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 24 Sep 2009 15:19:47 +0100
Subject: Produce a different error message if the user service does not have
 the authenticate method available

---
 .../Region/Communications/OGS1/OGS1UserServices.cs | 46 +++++++++++-----------
 .../Inventory/Archiver/InventoryArchiverModule.cs  | 29 ++++++++------
 2 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
index 89b3e42..a55b62e 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
@@ -144,16 +144,25 @@ namespace OpenSim.Region.Communications.OGS1
 
         public override bool AuthenticateUserByPassword(UUID userID, string password)
         {
-            try
+            Hashtable param = new Hashtable();
+            param["user_uuid"] = userID.ToString();
+            param["password"] = password;
+            IList parameters = new ArrayList();
+            parameters.Add(param);
+            XmlRpcRequest req = new XmlRpcRequest("authenticate_user_by_password", parameters);
+            XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000);                
+
+            // Temporary measure to deal with older services
+            if (resp.IsFault && resp.FaultCode == XmlRpcErrorCodes.SERVER_ERROR_METHOD)                
+            //if ((string)respData["fault_code"] != null && (string)respData["fault_code"] == 
             {
-                Hashtable param = new Hashtable();
-                param["user_uuid"] = userID.ToString();
-                param["password"] = password;
-                IList parameters = new ArrayList();
-                parameters.Add(param);
-                XmlRpcRequest req = new XmlRpcRequest("authenticate_user_by_password", parameters);
-                XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000);
-                Hashtable respData = (Hashtable)resp.Value;
+                throw new Exception(
+                    String.Format(
+                        "XMLRPC method 'authenticate_user_by_password' not yet implemented by user service at {0}",
+                        m_commsManager.NetworkServersInfo.UserURL));
+            }
+
+            Hashtable respData = (Hashtable)resp.Value;
 
 //                foreach (object key in respData.Keys)
 //                {                   
@@ -164,23 +173,14 @@ namespace OpenSim.Region.Communications.OGS1
 //                    "[OGS1 USER SERVICES]: AuthenticatedUserByPassword response for {0} is [{1}]", 
 //                    userID, respData["auth_user"]);
 
-                if ((string)respData["auth_user"] == "TRUE")
-                {
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
+            if ((string)respData["auth_user"] == "TRUE")
+            {
+                return true;
             }
-            catch (Exception e)
+            else
             {
-                m_log.ErrorFormat(
-                    "[OGS1 USER SERVICES]: Error when trying to authenticate user by password from remote user server: {0}",
-                    e);
-
                 return false;
-            }            
+            }           
         }
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index b82b940..55dce05 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -333,16 +333,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
                 return null;
             }
 
-            if (m_aScene.CommsManager.UserService.AuthenticateUserByPassword(userInfo.UserProfile.ID, pass))
-            {
-                return userInfo;
+            try
+            {    
+                if (m_aScene.CommsManager.UserService.AuthenticateUserByPassword(userInfo.UserProfile.ID, pass))
+                {
+                    return userInfo;
+                }
+                else
+                {
+                    m_log.ErrorFormat(
+                        "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect.  Please try again.", 
+                        firstName, lastName);                    
+                    return null;
+                }
             }
-            else
+            catch (Exception e)
             {
-                m_log.ErrorFormat(
-                    "[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect.  Please try again.", 
-                    firstName, lastName);
-                
+                m_log.ErrorFormat("[INVENTORY ARCHIVER]: Could not authenticate password, {0}", e.Message);
                 return null;
             }
         }
@@ -364,9 +371,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
                 {        
                     foreach (InventoryNodeBase node in loadedNodes)
                     {
-                        m_log.DebugFormat(
-                            "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", 
-                            user.Name, node.Name);
+//                        m_log.DebugFormat(
+//                            "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}", 
+//                            user.Name, node.Name);
                         
                         user.ControllingClient.SendBulkUpdateInventory(node);
                     }
-- 
cgit v1.1


From e1abc3d4c49ae4068faf7b8d1dcb220829429757 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 24 Sep 2009 15:22:47 +0100
Subject: re-enable registration of user service authentication method I
 accidentally disabled a few commits ago load/save iar on a grid should now
 work, provided that the user service is this revision or newer

---
 OpenSim/Grid/UserServer.Modules/UserManager.cs         |  2 +-
 OpenSim/Region/Communications/OGS1/OGS1UserServices.cs | 12 +-----------
 2 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/OpenSim/Grid/UserServer.Modules/UserManager.cs b/OpenSim/Grid/UserServer.Modules/UserManager.cs
index bc19ac8..efbf45e 100644
--- a/OpenSim/Grid/UserServer.Modules/UserManager.cs
+++ b/OpenSim/Grid/UserServer.Modules/UserManager.cs
@@ -109,7 +109,7 @@ namespace OpenSim.Grid.UserServer.Modules
             m_httpServer.AddXmlRPCHandler("get_avatar_picker_avatar", XmlRPCGetAvatarPickerAvatar);
 
             // Used by IAR module to do password checks
-            //m_httpServer.AddXmlRPCHandler("authenticate_user_by_password", XmlRPCAuthenticateUserMethodPassword);
+            m_httpServer.AddXmlRPCHandler("authenticate_user_by_password", XmlRPCAuthenticateUserMethodPassword);
 
             m_httpServer.AddXmlRPCHandler("update_user_current_region", XmlRPCAtRegion);
             m_httpServer.AddXmlRPCHandler("logout_of_simulator", XmlRPCLogOffUserMethodUUID);
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
index a55b62e..51ba2e9 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs
@@ -153,8 +153,7 @@ namespace OpenSim.Region.Communications.OGS1
             XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000);                
 
             // Temporary measure to deal with older services
-            if (resp.IsFault && resp.FaultCode == XmlRpcErrorCodes.SERVER_ERROR_METHOD)                
-            //if ((string)respData["fault_code"] != null && (string)respData["fault_code"] == 
+            if (resp.IsFault && resp.FaultCode == XmlRpcErrorCodes.SERVER_ERROR_METHOD)       
             {
                 throw new Exception(
                     String.Format(
@@ -164,15 +163,6 @@ namespace OpenSim.Region.Communications.OGS1
 
             Hashtable respData = (Hashtable)resp.Value;
 
-//                foreach (object key in respData.Keys)
-//                {                   
-//                    Console.WriteLine("respData {0}, {1}", key, respData[key]);
-//                }
-
-//                m_log.DebugFormat(
-//                    "[OGS1 USER SERVICES]: AuthenticatedUserByPassword response for {0} is [{1}]", 
-//                    userID, respData["auth_user"]);
-
             if ((string)respData["auth_user"] == "TRUE")
             {
                 return true;
-- 
cgit v1.1


From 784e78a9e829172ce520198c261bc9b4106761d4 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 24 Sep 2009 17:21:47 +0100
Subject: minor: make rest (not comm) modules less noisy if they are disabled

---
 OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs    | 4 ++--
 OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs | 3 ++-
 OpenSim/ApplicationPlugins/Rest/RestPlugin.cs               | 2 +-
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs
index 13f6426..db62d52 100644
--- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs
+++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestHandler.cs
@@ -207,7 +207,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
                 // This plugin will only be enabled if the broader
                 // REST plugin mechanism is enabled.
 
-                Rest.Log.InfoFormat("{0}  Plugin is initializing", MsgId);
+                //Rest.Log.InfoFormat("{0}  Plugin is initializing", MsgId);
 
                 base.Initialise(openSim);
 
@@ -216,7 +216,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory
 
                 if (!IsEnabled)
                 {
-                    Rest.Log.WarnFormat("{0} Plugins are disabled", MsgId);
+                    //Rest.Log.WarnFormat("{0} Plugins are disabled", MsgId);
                     return;
                 }
 
diff --git a/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs b/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs
index f790c5e..02ef588 100644
--- a/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs
+++ b/OpenSim/ApplicationPlugins/Rest/Regions/RestRegionPlugin.cs
@@ -68,9 +68,10 @@ namespace OpenSim.ApplicationPlugins.Rest.Regions
                 base.Initialise(openSim);
                 if (!IsEnabled)
                 {
-                    m_log.WarnFormat("{0} Rest Plugins are disabled", MsgID);
+                    //m_log.WarnFormat("{0} Rest Plugins are disabled", MsgID);
                     return;
                 }
+                
                 m_log.InfoFormat("{0} REST region plugin enabled", MsgID);
 
                 // add REST method handlers
diff --git a/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs b/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs
index fd23384..ff1502a 100644
--- a/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs
+++ b/OpenSim/ApplicationPlugins/Rest/RestPlugin.cs
@@ -216,7 +216,7 @@ namespace OpenSim.ApplicationPlugins.Rest
 
                 if (!_config.GetBoolean("enabled", false))
                 {
-                    m_log.WarnFormat("{0} Rest Plugins are disabled", MsgID);
+                    //m_log.WarnFormat("{0} Rest Plugins are disabled", MsgID);
                     return;
                 }
 
-- 
cgit v1.1


From dd3d52ae1faefbca85e2fe8d8cea67f7db4005ac Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 13:33:58 -0700
Subject: Added test GridClient, which allowed me to remove a few bugs out of
 the new code.

---
 .../HttpServer/SynchronousRestFormsRequester.cs    |   4 +-
 OpenSim/Server/Base/ServerUtils.cs                 |   4 +-
 .../Server/Handlers/Grid/GridServerConnector.cs    |   2 +-
 .../Server/Handlers/Grid/GridServerPostHandler.cs  |  11 ++-
 .../Connectors/Grid/GridServiceConnector.cs        |  12 ++-
 OpenSim/Services/Interfaces/IGridService.cs        |   9 ++
 OpenSim/Tests/Clients/Grid/GridClient.cs           | 102 +++++++++++++++++++++
 prebuild.xml                                       |  29 ++++++
 8 files changed, 161 insertions(+), 12 deletions(-)
 create mode 100644 OpenSim/Tests/Clients/Grid/GridClient.cs

diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
index 0f0c790..ebb2691 100644
--- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
+++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestFormsRequester.cs
@@ -56,14 +56,14 @@ namespace OpenSim.Framework.Servers.HttpServer
                 request.ContentType = "text/www-form-urlencoded";
 
                 MemoryStream buffer = new MemoryStream();
-
+                int length = 0;
                 using (StreamWriter writer = new StreamWriter(buffer))
                 {
                     writer.WriteLine(obj);
                     writer.Flush();
+                    length = (int)buffer.Length;
                 }
 
-                int length = (int) buffer.Length;
                 request.ContentLength = length;
 
                 Stream requestStream = request.GetRequestStream();
diff --git a/OpenSim/Server/Base/ServerUtils.cs b/OpenSim/Server/Base/ServerUtils.cs
index 6c2b3ed..656fcf5 100644
--- a/OpenSim/Server/Base/ServerUtils.cs
+++ b/OpenSim/Server/Base/ServerUtils.cs
@@ -258,6 +258,8 @@ namespace OpenSim.Server.Base
 
         public static Dictionary<string, object> ParseXmlResponse(string data)
         {
+            //m_log.DebugFormat("[XXX]: received xml string: {0}", data);
+
             Dictionary<string, object> ret = new Dictionary<string, object>();
 
             XmlDocument doc = new XmlDocument();
@@ -284,7 +286,7 @@ namespace OpenSim.Server.Base
 
             foreach (XmlNode part in partL)
             {
-                XmlNode type = part.Attributes.GetNamedItem("Type");
+                XmlNode type = part.Attributes.GetNamedItem("type");
                 if (type == null || type.Value != "List")
                 {
                     ret[part.Name] = part.InnerText;
diff --git a/OpenSim/Server/Handlers/Grid/GridServerConnector.cs b/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
index 7bf2e66..ebdf489 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerConnector.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Server.Handlers.Grid
             if (serverConfig == null)
                 throw new Exception("No section 'Server' in config file");
 
-            string gridService = serverConfig.GetString("GridServiceModule",
+            string gridService = serverConfig.GetString("LocalServiceModule",
                     String.Empty);
 
             if (gridService == String.Empty)
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index e72c2eb..eaeed6f 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -63,6 +63,7 @@ namespace OpenSim.Server.Handlers.Grid
             StreamReader sr = new StreamReader(requestData);
             string body = sr.ReadToEnd();
             sr.Close();
+            body = body.Trim();
             
             Dictionary<string, string> request =
                     ServerUtils.ParseQueryString(body);
@@ -98,11 +99,11 @@ namespace OpenSim.Server.Handlers.Grid
                 case "get_region_range":
                     return GetRegionRange(request);
 
-                default:
-                    m_log.DebugFormat("[GRID HANDLER]: unknown method request {0}", method);
-                    return FailureResult();
             }
 
+            m_log.DebugFormat("[GRID HANDLER XXX]: unknown method {0} request {1}", method.Length, method);
+            return FailureResult();
+
         }
 
         #region Method-specific handlers
@@ -155,11 +156,12 @@ namespace OpenSim.Server.Handlers.Grid
 
             UUID regionID = UUID.Zero;
             if (request["REGIONID"] != null)
-                UUID.TryParse(request["REGIONID"], out scopeID);
+                UUID.TryParse(request["REGIONID"], out regionID);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no regionID in request to get neighbours");
 
             List<GridRegion> rinfos = m_GridService.GetNeighbours(scopeID, regionID);
+            //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
 
             Dictionary<string, object> result = new Dictionary<string, object>();
             int i = 0;
@@ -171,6 +173,7 @@ namespace OpenSim.Server.Handlers.Grid
             }
 
             string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
             UTF8Encoding encoding = new UTF8Encoding();
             return encoding.GetBytes(xmlString);
 
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index 0a867db..fa197c8 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -97,9 +97,11 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "register";
 
+            string reqString = ServerUtils.BuildQueryString(sendData);
+            m_log.DebugFormat("[GRID CONNECTOR]: queryString = {0}", reqString);
             string reply = SynchronousRestFormsRequester.MakeRequest("POST",
                     m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
+                    reqString);
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
@@ -138,9 +140,10 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "get_neighbours";
 
+            string reqString = ServerUtils.BuildQueryString(sendData);
             string reply = SynchronousRestFormsRequester.MakeRequest("POST",
                     m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
+                    reqString);
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
@@ -148,6 +151,7 @@ namespace OpenSim.Services.Connectors
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
+                m_log.DebugFormat("[GRID CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count);
                 foreach (object r in rinfosList)
                 {
                     if (r is Dictionary<string, object>)
@@ -156,8 +160,8 @@ namespace OpenSim.Services.Connectors
                         rinfos.Add(rinfo);
                     }
                     else
-                        m_log.DebugFormat("[GRID CONNECTOR]: GetNeighbours {0}, {1} received invalid response",
-                            scopeID, regionID);
+                        m_log.DebugFormat("[GRID CONNECTOR]: GetNeighbours {0}, {1} received invalid response type {2}",
+                            scopeID, regionID, r.GetType());
                 }
             }
             else
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index a188f7e..d12276f 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -277,6 +277,15 @@ namespace OpenSim.Services.Interfaces
 
         public GridRegion(Dictionary<string, object> kvp)
         {
+            if (kvp["uuid"] != null)
+                RegionID = new UUID((string)kvp["uuid"]);
+
+            if (kvp["locX"] != null)
+                RegionLocX = Convert.ToInt32((string)kvp["locX"]);
+
+            if (kvp["locY"] != null)
+                RegionLocY = Convert.ToInt32((string)kvp["locY"]);
+
             if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
             {
                 int port = 0;
diff --git a/OpenSim/Tests/Clients/Grid/GridClient.cs b/OpenSim/Tests/Clients/Grid/GridClient.cs
new file mode 100644
index 0000000..0b84f9b
--- /dev/null
+++ b/OpenSim/Tests/Clients/Grid/GridClient.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Reflection;
+
+using OpenMetaverse;
+using log4net;
+using log4net.Appender;
+using log4net.Layout;
+
+using OpenSim.Framework;
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Services.Connectors;
+
+namespace OpenSim.Tests.Clients.GridClient
+{
+    public class GridClient
+    {
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+        
+        public static void Main(string[] args)
+        {
+            ConsoleAppender consoleAppender = new ConsoleAppender();
+            consoleAppender.Layout =
+                new PatternLayout("%date [%thread] %-5level %logger [%property{NDC}] - %message%newline");
+            log4net.Config.BasicConfigurator.Configure(consoleAppender);
+
+            string serverURI = "http://127.0.0.1:8002";
+            GridServicesConnector m_Connector = new GridServicesConnector(serverURI);
+
+            GridRegion r1 = CreateRegion("Test Region 1", 1000, 1000);
+            GridRegion r2 = CreateRegion("Test Region 2", 1001, 1000);
+            GridRegion r3 = CreateRegion("Test Region 3", 1005, 1000);
+
+            Console.WriteLine("[GRID CLIENT]: Registering region 1"); 
+            bool success = m_Connector.RegisterRegion(UUID.Zero, r1);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully registered region 1");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 1 failed to register");
+
+            Console.WriteLine("[GRID CLIENT]: Registering region 2");
+            success = m_Connector.RegisterRegion(UUID.Zero, r2);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully registered region 2");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 2 failed to register");
+
+            Console.WriteLine("[GRID CLIENT]: Registering region 3");
+            success = m_Connector.RegisterRegion(UUID.Zero, r3);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully registered region 3");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 3 failed to register");
+
+
+            Console.WriteLine("[GRID CLIENT]: Deregistering region 3");
+            success = m_Connector.DeregisterRegion(r3.RegionID);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully deregistered region 3");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 3 failed to deregister");
+            Console.WriteLine("[GRID CLIENT]: Registering region 3 again");
+            success = m_Connector.RegisterRegion(UUID.Zero, r3);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully registered region 3");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 3 failed to register");
+
+            Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1");
+            List<GridRegion> regions = m_Connector.GetNeighbours(UUID.Zero, r1.RegionID);
+            if (regions == null)
+                Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 failed");
+            else if (regions.Count > 0)
+            {
+                if (regions.Count != 1)
+                    Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 returned more neighbours than expected: " + regions.Count);
+                else
+                    Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 returned the right neighbour " + regions[0].RegionName);
+            }
+            else
+                Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 returned 0 neighbours");
+
+
+        }
+
+        private static GridRegion CreateRegion(string name, uint xcell, uint ycell)
+        {
+            GridRegion region = new GridRegion(xcell, ycell);
+            region.RegionName = name;
+            region.RegionID = UUID.Random();
+            region.ExternalHostName = "127.0.0.1";
+            region.HttpPort = 9000;
+            region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0);
+          
+            return region;
+        }
+    }
+}
diff --git a/prebuild.xml b/prebuild.xml
index cb20319..6ac7b68 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -3221,6 +3221,35 @@
       </Files>
     </Project>
 
+    <!-- Test Clients -->
+    <Project frameworkVersion="v3_5" name="OpenSim.Tests.Clients.GridClient" path="OpenSim/Tests/Clients/Grid" type="Exe">
+      <Configuration name="Debug">
+        <Options>
+          <OutputPath>../../../../bin/</OutputPath>
+        </Options>
+      </Configuration>
+      <Configuration name="Release">
+        <Options>
+          <OutputPath>../../../../bin/</OutputPath>
+        </Options>
+      </Configuration>
+
+      <ReferencePath>../../../../bin/</ReferencePath>
+      <Reference name="System"/>
+      <Reference name="OpenMetaverseTypes.dll"/>
+      <Reference name="OpenMetaverse.dll"/>
+      <Reference name="OpenSim.Framework"/>
+      <Reference name="OpenSim.Services.Interfaces" />
+      <Reference name="OpenSim.Services.Connectors" />
+      <Reference name="Nini.dll" />
+      <Reference name="log4net.dll"/>
+
+      <Files>
+        <Match pattern="*.cs" recurse="true"/>
+      </Files>
+    </Project>
+
+
     <!-- Test assemblies -->
     <Project frameworkVersion="v3_5" name="OpenSim.Tests.Common" path="OpenSim/Tests/Common" type="Library">
       <Configuration name="Debug">
-- 
cgit v1.1


From 1faaa0a43a851c44af40336336ddbe3a7dbe83af Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 15:30:00 -0700
Subject: GridServerPostHandler finished. GridClient tests all work. More
 guards on getting parameters and replies over the wire.

---
 OpenSim/Data/Null/NullRegionData.cs                |   5 +-
 .../Server/Handlers/Grid/GridServerPostHandler.cs  | 187 +++++++++++++++++++--
 .../Connectors/Grid/GridServiceConnector.cs        | 151 ++++++++++-------
 OpenSim/Services/Interfaces/IGridService.cs        |   4 +
 OpenSim/Tests/Clients/Grid/GridClient.cs           |  64 ++++++-
 5 files changed, 327 insertions(+), 84 deletions(-)

diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs
index e976c40..218fcd0 100644
--- a/OpenSim/Data/Null/NullRegionData.cs
+++ b/OpenSim/Data/Null/NullRegionData.cs
@@ -101,10 +101,7 @@ namespace OpenSim.Data.Null
                     ret.Add(r);
             }
 
-            if (ret.Count > 0)
-                return ret;
-
-            return null;
+            return ret;
         }
 
         public bool Store(RegionData data)
diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index eaeed6f..f50e6a2 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -164,12 +164,17 @@ namespace OpenSim.Server.Handlers.Grid
             //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
 
             Dictionary<string, object> result = new Dictionary<string, object>();
-            int i = 0;
-            foreach (GridRegion rinfo in rinfos)
+            if ((rinfos == null) || ((rinfos != null) && (rinfos.Count == 0)))
+                result["result"] = "null";
+            else
             {
-                Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
-                result["region" + i] = rinfoDict;
-                i++;
+                int i = 0;
+                foreach (GridRegion rinfo in rinfos)
+                {
+                    Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
+                    result["region" + i] = rinfoDict;
+                    i++;
+                }
             }
 
             string xmlString = ServerUtils.BuildXmlResponse(result);
@@ -181,32 +186,184 @@ namespace OpenSim.Server.Handlers.Grid
 
         byte[] GetRegionByUUID(Dictionary<string, string> request)
         {
-            // TODO
-            return new byte[0];
+            UUID scopeID = UUID.Zero;
+            if (request["SCOPEID"] != null)
+                UUID.TryParse(request["SCOPEID"], out scopeID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get neighbours");
+
+            UUID regionID = UUID.Zero;
+            if (request["REGIONID"] != null)
+                UUID.TryParse(request["REGIONID"], out regionID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no regionID in request to get neighbours");
+
+            GridRegion rinfo = m_GridService.GetRegionByUUID(scopeID, regionID);
+            //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
+
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            if (rinfo == null)
+                result["result"] = "null";
+            else
+                result["result"] = rinfo.ToKeyValuePairs();
+
+            string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
+            UTF8Encoding encoding = new UTF8Encoding();
+            return encoding.GetBytes(xmlString);
         }
 
         byte[] GetRegionByPosition(Dictionary<string, string> request)
         {
-            // TODO
-            return new byte[0];
+            UUID scopeID = UUID.Zero;
+            if (request["SCOPEID"] != null)
+                UUID.TryParse(request["SCOPEID"], out scopeID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get region by position");
+
+            int x = 0, y = 0;
+            if (request["X"] != null)
+                Int32.TryParse(request["X"], out x);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no X in request to get region by position");
+            if (request["Y"] != null)
+                Int32.TryParse(request["Y"], out y);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no Y in request to get region by position");
+
+            GridRegion rinfo = m_GridService.GetRegionByPosition(scopeID, x, y);
+            //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
+
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            if (rinfo == null)
+                result["result"] = "null";
+            else
+                result["result"] = rinfo.ToKeyValuePairs();
+
+            string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
+            UTF8Encoding encoding = new UTF8Encoding();
+            return encoding.GetBytes(xmlString);
         }
 
         byte[] GetRegionByName(Dictionary<string, string> request)
         {
-            // TODO
-            return new byte[0];
+            UUID scopeID = UUID.Zero;
+            if (request["SCOPEID"] != null)
+                UUID.TryParse(request["SCOPEID"], out scopeID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get region by name");
+
+            string regionName = string.Empty;
+            if (request["NAME"] != null)
+                regionName = request["NAME"];
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no name in request to get region by name");
+
+            GridRegion rinfo = m_GridService.GetRegionByName(scopeID, regionName);
+            //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
+
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            if (rinfo == null)
+                result["result"] = "null";
+            else
+                result["result"] = rinfo.ToKeyValuePairs();
+
+            string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
+            UTF8Encoding encoding = new UTF8Encoding();
+            return encoding.GetBytes(xmlString);
         }
 
         byte[] GetRegionsByName(Dictionary<string, string> request)
         {
-            // TODO
-            return new byte[0];
+            UUID scopeID = UUID.Zero;
+            if (request["SCOPEID"] != null)
+                UUID.TryParse(request["SCOPEID"], out scopeID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get regions by name");
+
+            string regionName = string.Empty;
+            if (request["NAME"] != null)
+                regionName = request["NAME"];
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no NAME in request to get regions by name");
+
+            int max = 0;
+            if (request["MAX"] != null)
+                Int32.TryParse(request["MAX"], out max);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no MAX in request to get regions by name");
+
+            List<GridRegion> rinfos = m_GridService.GetRegionsByName(scopeID, regionName, max);
+            //m_log.DebugFormat("[GRID HANDLER]: neighbours for region {0}: {1}", regionID, rinfos.Count);
+
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            if ((rinfos == null) || ((rinfos != null) && (rinfos.Count == 0)))
+                result["result"] = "null";
+            else
+            {
+                int i = 0;
+                foreach (GridRegion rinfo in rinfos)
+                {
+                    Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
+                    result["region" + i] = rinfoDict;
+                    i++;
+                }
+            }
+
+            string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
+            UTF8Encoding encoding = new UTF8Encoding();
+            return encoding.GetBytes(xmlString);
         }
 
         byte[] GetRegionRange(Dictionary<string, string> request)
         {
-            // TODO
-            return new byte[0];
+            UUID scopeID = UUID.Zero;
+            if (request["SCOPEID"] != null)
+                UUID.TryParse(request["SCOPEID"], out scopeID);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get region range");
+
+            int xmin = 0, xmax = 0, ymin = 0, ymax = 0;
+            if (request["XMIN"] != null)
+                Int32.TryParse(request["XMIN"], out xmin);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no XMIN in request to get region range");
+            if (request["XMAX"] != null)
+                Int32.TryParse(request["XMAX"], out xmax);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no XMAX in request to get region range");
+            if (request["YMIN"] != null)
+                Int32.TryParse(request["YMIN"], out ymin);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no YMIN in request to get region range");
+            if (request["YMAX"] != null)
+                Int32.TryParse(request["YMAX"], out ymax);
+            else
+                m_log.WarnFormat("[GRID HANDLER]: no YMAX in request to get region range");
+
+
+            List<GridRegion> rinfos = m_GridService.GetRegionRange(scopeID, xmin, xmax, ymin, ymax);
+
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            if ((rinfos == null) || ((rinfos != null) && (rinfos.Count == 0)))
+                result["result"] = "null";
+            else
+            {
+                int i = 0;
+                foreach (GridRegion rinfo in rinfos)
+                {
+                    Dictionary<string, object> rinfoDict = rinfo.ToKeyValuePairs();
+                    result["region" + i] = rinfoDict;
+                    i++;
+                }
+            }
+            string xmlString = ServerUtils.BuildXmlResponse(result);
+            //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
+            UTF8Encoding encoding = new UTF8Encoding();
+            return encoding.GetBytes(xmlString);
         }
 
         #endregion
diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index fa197c8..ebb66a7 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -98,15 +98,19 @@ namespace OpenSim.Services.Connectors
             sendData["METHOD"] = "register";
 
             string reqString = ServerUtils.BuildQueryString(sendData);
-            m_log.DebugFormat("[GRID CONNECTOR]: queryString = {0}", reqString);
+            //m_log.DebugFormat("[GRID CONNECTOR]: queryString = {0}", reqString);
             string reply = SynchronousRestFormsRequester.MakeRequest("POST",
                     m_ServerURI + "/grid",
                     reqString);
+            if (reply != string.Empty)
+            {
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
-
-            if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
-                return true;
+                if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
+                    return true;
+            }
+            else
+                m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply");
 
             return false;
         }
@@ -123,10 +127,15 @@ namespace OpenSim.Services.Connectors
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+            if (reply != string.Empty)
+            {
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
-                return true;
+                if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
+                    return true;
+            }
+            else
+                m_log.DebugFormat("[GRID CONNECTOR]: DeregisterRegion received null reply");
 
             return false;
         }
@@ -151,7 +160,7 @@ namespace OpenSim.Services.Connectors
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
-                m_log.DebugFormat("[GRID CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count);
+                //m_log.DebugFormat("[GRID CONNECTOR]: get neighbours returned {0} elements", rinfosList.Count);
                 foreach (object r in rinfosList)
                 {
                     if (r is Dictionary<string, object>)
@@ -184,20 +193,26 @@ namespace OpenSim.Services.Connectors
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
-
             GridRegion rinfo = null;
-            if ((replyData != null) && (replyData["result"] != null))
+
+            if (reply != string.Empty)
             {
-                if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                if ((replyData != null) && (replyData["result"] != null))
+                {
+                    if (replyData["result"] is Dictionary<string, object>)
+                        rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                    //else
+                    //    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID {0}, {1} received null response",
+                    //        scopeID, regionID);
+                }
                 else
-                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID {0}, {1} received invalid response",
+                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID {0}, {1} received null response",
                         scopeID, regionID);
             }
             else
-                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID {0}, {1} received null response",
-                    scopeID, regionID);
+                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByUUID received null reply");
 
             return rinfo;
         }
@@ -216,20 +231,25 @@ namespace OpenSim.Services.Connectors
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
-
             GridRegion rinfo = null;
-            if ((replyData != null) && (replyData["result"] != null))
+            if (reply != string.Empty)
             {
-                if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                if ((replyData != null) && (replyData["result"] != null))
+                {
+                    if (replyData["result"] is Dictionary<string, object>)
+                        rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                    else
+                        m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received invalid response",
+                            scopeID, x, y);
+                }
                 else
-                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received invalid response",
+                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received null response",
                         scopeID, x, y);
             }
             else
-                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1}-{2} received null response",
-                    scopeID, x, y);
+                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition received null reply");
 
             return rinfo;
         }
@@ -247,20 +267,22 @@ namespace OpenSim.Services.Connectors
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
-
             GridRegion rinfo = null;
-            if ((replyData != null) && (replyData["result"] != null))
+            if (reply != string.Empty)
             {
-                if (replyData["result"] is Dictionary<string, object>)
-                    rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                if ((replyData != null) && (replyData["result"] != null))
+                {
+                    if (replyData["result"] is Dictionary<string, object>)
+                        rinfo = new GridRegion((Dictionary<string, object>)replyData["result"]);
+                }
                 else
-                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1} received invalid response",
+                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1} received null response",
                         scopeID, regionName);
             }
             else
-                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByPosition {0}, {1} received null response",
-                    scopeID, regionName);
+                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionByName received null reply");
 
             return rinfo;
         }
@@ -279,27 +301,33 @@ namespace OpenSim.Services.Connectors
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
-
             List<GridRegion> rinfos = new List<GridRegion>();
-            if (replyData != null)
+
+            if (reply != string.Empty)
             {
-                Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
-                foreach (object r in rinfosList)
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                if (replyData != null)
                 {
-                    if (r is Dictionary<string, object>)
+                    Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
+                    foreach (object r in rinfosList)
                     {
-                        GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
-                        rinfos.Add(rinfo);
+                        if (r is Dictionary<string, object>)
+                        {
+                            GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
+                            rinfos.Add(rinfo);
+                        }
+                        else
+                            m_log.DebugFormat("[GRID CONNECTOR]: GetRegionsByName {0}, {1}, {2} received invalid response",
+                                scopeID, name, maxNumber);
                     }
-                    else
-                        m_log.DebugFormat("[GRID CONNECTOR]: GetRegionsByName {0}, {1}, {2} received invalid response",
-                            scopeID, name, maxNumber);
                 }
+                else
+                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionsByName {0}, {1}, {2} received null response",
+                        scopeID, name, maxNumber);
             }
             else
-                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionsByName {0}, {1}, {2} received null response",
-                    scopeID, name, maxNumber);
+                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionsByName received null reply");
 
             return rinfos;
         }
@@ -316,31 +344,36 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "get_region_range";
 
+            List<GridRegion> rinfos = new List<GridRegion>();
+
             string reply = SynchronousRestFormsRequester.MakeRequest("POST",
                     m_ServerURI + "/grid",
                     ServerUtils.BuildQueryString(sendData));
 
-            Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+            //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply);
 
-            List<GridRegion> rinfos = new List<GridRegion>();
-            if (replyData != null)
+            if (reply != string.Empty)
             {
-                Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
-                foreach (object r in rinfosList)
+                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+
+                if (replyData != null)
                 {
-                    if (r is Dictionary<string, object>)
+                    Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
+                    foreach (object r in rinfosList)
                     {
-                        GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
-                        rinfos.Add(rinfo);
+                        if (r is Dictionary<string, object>)
+                        {
+                            GridRegion rinfo = new GridRegion((Dictionary<string, object>)r);
+                            rinfos.Add(rinfo);
+                        }
                     }
-                    else
-                        m_log.DebugFormat("[GRID CONNECTOR]: GetRegionRange {0}, {1}-{2} {3}-{4} received invalid response",
-                            scopeID, xmin, xmax, ymin, ymax);
                 }
+                else
+                    m_log.DebugFormat("[GRID CONNECTOR]: GetRegionRange {0}, {1}-{2} {3}-{4} received null response",
+                        scopeID, xmin, xmax, ymin, ymax);
             }
             else
-                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionRange {0}, {1}-{2} {3}-{4} received null response",
-                    scopeID, xmin, xmax, ymin, ymax);
+                m_log.DebugFormat("[GRID CONNECTOR]: GetRegionRange received null reply");
 
             return rinfos;
         }
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index d12276f..4bdcde2 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -263,6 +263,7 @@ namespace OpenSim.Services.Interfaces
             kvp["uuid"] = RegionID.ToString();
             kvp["locX"] = RegionLocX.ToString();
             kvp["locY"] = RegionLocY.ToString();
+            kvp["name"] = RegionName;
             kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
             kvp["external_port"] = ExternalEndPoint.Port.ToString();
             kvp["external_host_name"] = ExternalHostName;
@@ -286,6 +287,9 @@ namespace OpenSim.Services.Interfaces
             if (kvp["locY"] != null)
                 RegionLocY = Convert.ToInt32((string)kvp["locY"]);
 
+            if (kvp["name"] != null)
+                RegionName = (string)kvp["name"];
+
             if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
             {
                 int port = 0;
diff --git a/OpenSim/Tests/Clients/Grid/GridClient.cs b/OpenSim/Tests/Clients/Grid/GridClient.cs
index 0b84f9b..155f38e 100644
--- a/OpenSim/Tests/Clients/Grid/GridClient.cs
+++ b/OpenSim/Tests/Clients/Grid/GridClient.cs
@@ -35,21 +35,21 @@ namespace OpenSim.Tests.Clients.GridClient
             GridRegion r2 = CreateRegion("Test Region 2", 1001, 1000);
             GridRegion r3 = CreateRegion("Test Region 3", 1005, 1000);
 
-            Console.WriteLine("[GRID CLIENT]: Registering region 1"); 
+            Console.WriteLine("[GRID CLIENT]: *** Registering region 1"); 
             bool success = m_Connector.RegisterRegion(UUID.Zero, r1);
             if (success)
                 Console.WriteLine("[GRID CLIENT]: Successfully registered region 1");
             else
                 Console.WriteLine("[GRID CLIENT]: region 1 failed to register");
 
-            Console.WriteLine("[GRID CLIENT]: Registering region 2");
+            Console.WriteLine("[GRID CLIENT]: *** Registering region 2");
             success = m_Connector.RegisterRegion(UUID.Zero, r2);
             if (success)
                 Console.WriteLine("[GRID CLIENT]: Successfully registered region 2");
             else
                 Console.WriteLine("[GRID CLIENT]: region 2 failed to register");
 
-            Console.WriteLine("[GRID CLIENT]: Registering region 3");
+            Console.WriteLine("[GRID CLIENT]: *** Registering region 3");
             success = m_Connector.RegisterRegion(UUID.Zero, r3);
             if (success)
                 Console.WriteLine("[GRID CLIENT]: Successfully registered region 3");
@@ -57,20 +57,20 @@ namespace OpenSim.Tests.Clients.GridClient
                 Console.WriteLine("[GRID CLIENT]: region 3 failed to register");
 
 
-            Console.WriteLine("[GRID CLIENT]: Deregistering region 3");
+            Console.WriteLine("[GRID CLIENT]: *** Deregistering region 3");
             success = m_Connector.DeregisterRegion(r3.RegionID);
             if (success)
                 Console.WriteLine("[GRID CLIENT]: Successfully deregistered region 3");
             else
                 Console.WriteLine("[GRID CLIENT]: region 3 failed to deregister");
-            Console.WriteLine("[GRID CLIENT]: Registering region 3 again");
+            Console.WriteLine("[GRID CLIENT]: *** Registering region 3 again");
             success = m_Connector.RegisterRegion(UUID.Zero, r3);
             if (success)
                 Console.WriteLine("[GRID CLIENT]: Successfully registered region 3");
             else
                 Console.WriteLine("[GRID CLIENT]: region 3 failed to register");
 
-            Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1");
+            Console.WriteLine("[GRID CLIENT]: *** GetNeighbours of region 1");
             List<GridRegion> regions = m_Connector.GetNeighbours(UUID.Zero, r1.RegionID);
             if (regions == null)
                 Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 failed");
@@ -85,6 +85,58 @@ namespace OpenSim.Tests.Clients.GridClient
                 Console.WriteLine("[GRID CLIENT]: GetNeighbours of region 1 returned 0 neighbours");
 
 
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionByUUID of region 2 (this should succeed)");
+            GridRegion region = m_Connector.GetRegionByUUID(UUID.Zero, r2.RegionID);
+            if (region == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionByUUID returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionByUUID returned region " + region.RegionName);
+
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionByUUID of non-existent region (this should fail)");
+            region = m_Connector.GetRegionByUUID(UUID.Zero, UUID.Random());
+            if (region == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionByUUID returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionByUUID returned region " + region.RegionName);
+
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionByName of region 3 (this should succeed)");
+            region = m_Connector.GetRegionByName(UUID.Zero, r3.RegionName);
+            if (region == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionByName returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionByName returned region " + region.RegionName);
+
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionByName of non-existent region (this should fail)");
+            region = m_Connector.GetRegionByName(UUID.Zero, "Foo");
+            if (region == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionByName returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionByName returned region " + region.RegionName);
+
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionsByName (this should return 3 regions)");
+            regions = m_Connector.GetRegionsByName(UUID.Zero, "Test", 10);
+            if (regions == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionsByName returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionsByName returned " + regions.Count + " regions");
+
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionRange (this should return 2 regions)");
+            regions = m_Connector.GetRegionRange(UUID.Zero, 
+                900 * (int)Constants.RegionSize, 1002 * (int) Constants.RegionSize,
+                900 * (int)Constants.RegionSize, 1002 * (int) Constants.RegionSize);
+            if (regions == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionRange returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionRange returned " + regions.Count + " regions");
+            Console.WriteLine("[GRID CLIENT]: *** GetRegionRange (this should return 0 regions)");
+            regions = m_Connector.GetRegionRange(UUID.Zero,
+                900 * (int)Constants.RegionSize, 950 * (int)Constants.RegionSize,
+                900 * (int)Constants.RegionSize, 950 * (int)Constants.RegionSize);
+            if (regions == null)
+                Console.WriteLine("[GRID CLIENT]: GetRegionRange returned null");
+            else
+                Console.WriteLine("[GRID CLIENT]: GetRegionRange returned " + regions.Count + " regions");
+
         }
 
         private static GridRegion CreateRegion(string name, uint xcell, uint ycell)
-- 
cgit v1.1


From daffb691741250dae9e3f767580f0349bd2c5c4f Mon Sep 17 00:00:00 2001
From: dahlia
Date: Thu, 24 Sep 2009 18:16:29 -0700
Subject: modify BulletDotNETPrim.cs in preparation for Mantis #4181

---
 .../Physics/BulletDotNETPlugin/BulletDotNETPrim.cs | 234 +++++++++++----------
 1 file changed, 122 insertions(+), 112 deletions(-)

diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
index 7ab8b98..f22ea71 100644
--- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
+++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs
@@ -204,7 +204,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             tempAngularVelocity2 = new btVector3(0, 0, 0);
             tempInertia1 = new btVector3(0, 0, 0);
             tempInertia2 = new btVector3(0, 0, 0);
-            tempOrientation1 = new btQuaternion(0,0,0,1);
+            tempOrientation1 = new btQuaternion(0, 0, 0, 1);
             tempOrientation2 = new btQuaternion(0, 0, 0, 1);
             _parent_scene = parent_scene;
             tempTransform1 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero);
@@ -216,10 +216,10 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             tempMotionState2 = new btDefaultMotionState(_parent_scene.TransZero);
             tempMotionState3 = new btDefaultMotionState(_parent_scene.TransZero);
 
-            
+
             AxisLockLinearLow = new btVector3(-1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize);
-            int regionsize = (int) Constants.RegionSize;
-            
+            int regionsize = (int)Constants.RegionSize;
+
             if (regionsize == 256)
                 regionsize = 512;
 
@@ -611,7 +611,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             DisableAxisMotor();
             DisposeOfBody();
             SetCollisionShape(null);
-           
+
             if (tempMotionState3 != null && tempMotionState3.Handle != IntPtr.Zero)
             {
                 tempMotionState3.Dispose();
@@ -677,8 +677,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 tempInertia2.Dispose();
                 tempInertia1 = null;
             }
-            
-            
+
+
             if (tempAngularVelocity2 != null && tempAngularVelocity2.Handle != IntPtr.Zero)
             {
                 tempAngularVelocity2.Dispose();
@@ -802,7 +802,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 changesize(timestep);
             }
 
-        //
+            //
 
             if (m_taintshape)
             {
@@ -1001,7 +1001,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             else
                 SetBody(0);
             changeSelectedStatus(timestep);
-            
+
             resetCollisionAccounting();
             m_taintPhysics = m_isphysical;
         }
@@ -1012,7 +1012,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
         {
             if (_parent_scene.needsMeshing(_pbs))
             {
-                ProcessGeomCreationAsTriMesh(PhysicsVector.Zero,Quaternion.Identity);
+                ProcessGeomCreationAsTriMesh(PhysicsVector.Zero, Quaternion.Identity);
                 // createmesh returns null when it doesn't mesh.
                 CreateGeom(IntPtr.Zero, _mesh);
             }
@@ -1038,32 +1038,32 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 meshlod = _parent_scene.MeshSculptphysicalLOD;
 
             IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical);
-            if (!positionOffset.IsIdentical(PhysicsVector.Zero,0.001f) || orientation != Quaternion.Identity)
+            if (!positionOffset.IsIdentical(PhysicsVector.Zero, 0.001f) || orientation != Quaternion.Identity)
             {
-                
-                    float[] xyz = new float[3];
-                    xyz[0] = positionOffset.X;
-                    xyz[1] = positionOffset.Y;
-                    xyz[2] = positionOffset.Z;
-
-                    Matrix4 m4 = Matrix4.CreateFromQuaternion(orientation);
-
-                    float[,] matrix = new float[3,3];
-
-                    matrix[0, 0] = m4.M11;
-                    matrix[0, 1] = m4.M12;
-                    matrix[0, 2] = m4.M13;
-                    matrix[1, 0] = m4.M21;
-                    matrix[1, 1] = m4.M22;
-                    matrix[1, 2] = m4.M23;
-                    matrix[2, 0] = m4.M31;
-                    matrix[2, 1] = m4.M32;
-                    matrix[2, 2] = m4.M33;
-
-                    
-                    mesh.TransformLinear(matrix, xyz);
-                    
-                
+
+                float[] xyz = new float[3];
+                xyz[0] = positionOffset.X;
+                xyz[1] = positionOffset.Y;
+                xyz[2] = positionOffset.Z;
+
+                Matrix4 m4 = Matrix4.CreateFromQuaternion(orientation);
+
+                float[,] matrix = new float[3, 3];
+
+                matrix[0, 0] = m4.M11;
+                matrix[0, 1] = m4.M12;
+                matrix[0, 2] = m4.M13;
+                matrix[1, 0] = m4.M21;
+                matrix[1, 1] = m4.M22;
+                matrix[1, 2] = m4.M23;
+                matrix[2, 0] = m4.M31;
+                matrix[2, 1] = m4.M32;
+                matrix[2, 2] = m4.M33;
+
+
+                mesh.TransformLinear(matrix, xyz);
+
+
 
             }
 
@@ -1088,12 +1088,12 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             SetCollisionShape(null);
             // Construction of new prim
             ProcessGeomCreation();
-            
+
             if (IsPhysical)
                 SetBody(Mass);
             else
                 SetBody(0);
-            
+
             m_taintsize = _size;
 
         }
@@ -1136,7 +1136,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 //prim_geom = IntPtr.Zero;
                 m_log.Error("[PHYSICS]: PrimGeom dead");
             }
-            
+
             // we don't need to do space calculation because the client sends a position update also.
             if (_size.X <= 0) _size.X = 0.01f;
             if (_size.Y <= 0) _size.Y = 0.01f;
@@ -1153,8 +1153,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 tempTransform1.Dispose();
             tempTransform1 = new btTransform(tempOrientation1, tempPosition1);
 
-            
-            
+
+
 
             //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z);
             if (IsPhysical)
@@ -1162,7 +1162,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 SetBody(Mass);
                 // Re creates body on size.
                 // EnableBody also does setMass()
-               
+
             }
             else
             {
@@ -1179,7 +1179,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 }
             }
             resetCollisionAccounting();
-            
+
             m_taintshape = false;
         }
 
@@ -1291,7 +1291,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             {
                 Body.setCollisionFlags((int)ContactFlags.CF_NO_CONTACT_RESPONSE);
                 disableBodySoft();
-                
+
             }
             else
             {
@@ -1299,7 +1299,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 enableBodySoft();
             }
             m_isSelected = m_taintselected;
-            
+
         }
 
         private void changevelocity(float timestep)
@@ -1368,7 +1368,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             _parent = m_taintparent;
 
             m_taintPhysics = m_isphysical;
-            
+
         }
 
         private void changefloatonwater(float timestep)
@@ -1627,7 +1627,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             {
                 if (m_zeroPosition == null)
                     m_zeroPosition = new PhysicsVector(0, 0, 0);
-                 m_zeroPosition.setValues(_position.X,_position.Y,_position.Z);
+                m_zeroPosition.setValues(_position.X, _position.Y, _position.Z);
                 return;
             }
         }
@@ -1981,7 +1981,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 //_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical);
                 _mesh = p_mesh;
                 setMesh(_parent_scene, _mesh);
-                
+
             }
             else
             {
@@ -1994,15 +1994,15 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                             //SetGeom to a Regular Sphere
                             if (tempSize1 == null)
                                 tempSize1 = new btVector3(0, 0, 0);
-                            tempSize1.setValue(_size.X * 0.5f,_size.Y * 0.5f, _size.Z * 0.5f);
-                            SetCollisionShape(new btSphereShape(_size.X*0.5f));
+                            tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f);
+                            SetCollisionShape(new btSphereShape(_size.X * 0.5f));
                         }
                         else
                         {
                             // uses halfextents
                             if (tempSize1 == null)
                                 tempSize1 = new btVector3(0, 0, 0);
-                            tempSize1.setValue(_size.X*0.5f, _size.Y*0.5f, _size.Z*0.5f);
+                            tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f);
                             SetCollisionShape(new btBoxShape(tempSize1));
                         }
                     }
@@ -2052,14 +2052,24 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 }
             }
 
+            //IMesh oldMesh = primMesh;
+
+            //primMesh = mesh;
+
+            //float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
+            //int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage
+            ////Array.Reverse(indexList);
+            //primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory
+
             IMesh oldMesh = primMesh;
 
             primMesh = mesh;
-            
-            float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
-            int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage
+
+            float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
+            int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage
             //Array.Reverse(indexList);
-            primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory
+            mesh.releaseSourceMeshData(); // free up the original mesh data to save memory
+
 
             int VertexCount = vertexList.GetLength(0) / 3;
             int IndexCount = indexList.GetLength(0);
@@ -2068,17 +2078,17 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 btshapeArray.Dispose();
             //Array.Reverse(indexList);
             btshapeArray = new btTriangleIndexVertexArray(IndexCount / 3, indexList, (3 * sizeof(int)),
-                                                                                     VertexCount, vertexList, 3*sizeof (float));
+                                                                                     VertexCount, vertexList, 3 * sizeof(float));
             SetCollisionShape(new btGImpactMeshShape(btshapeArray));
             //((btGImpactMeshShape) prim_geom).updateBound();
-            ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1,1, 1));
+            ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1));
             ((btGImpactMeshShape)prim_geom).updateBound();
             _parent_scene.SetUsingGImpact();
-            if (oldMesh != null)
-            {
-                oldMesh.releasePinned();
-                oldMesh = null;
-            }
+            //if (oldMesh != null)
+            //{
+            //    oldMesh.releasePinned();
+            //    oldMesh = null;
+            //}
 
         }
 
@@ -2102,7 +2112,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             }
              */
             prim_geom = shape;
-           
+
             //Body.set
         }
 
@@ -2143,8 +2153,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
 
                 if (prim_geom is btGImpactMeshShape)
                 {
-                    ((btGImpactMeshShape) prim_geom).setLocalScaling(new btVector3(1, 1, 1));
-                    ((btGImpactMeshShape) prim_geom).updateBound();
+                    ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1));
+                    ((btGImpactMeshShape)prim_geom).updateBound();
                 }
                 //Body.setCollisionFlags(Body.getCollisionFlags() | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK);
                 //Body.setUserPointer((IntPtr) (int)m_localID);
@@ -2159,7 +2169,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                     {
                         if (chld == null)
                             continue;
-                        
+
                         // if (chld.NeedsMeshing())
                         //     hasTrimesh = true;
                     }
@@ -2167,40 +2177,40 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
 
                 //if (hasTrimesh)
                 //{
-                    ProcessGeomCreationAsTriMesh(PhysicsVector.Zero, Quaternion.Identity);
-                    // createmesh returns null when it doesn't mesh.
-                    
-                    /*
-                    if (_mesh is Mesh)
-                    {
-                    }
-                    else
-                    {
-                        m_log.Warn("[PHYSICS]: Can't link a OpenSim.Region.Physics.Meshing.Mesh object");
-                        return;
-                    }
-                    */
+                ProcessGeomCreationAsTriMesh(PhysicsVector.Zero, Quaternion.Identity);
+                // createmesh returns null when it doesn't mesh.
 
-                    
-                    
-                    foreach (BulletDotNETPrim chld in childrenPrim)
-                    {
-                        if (chld == null)
-                            continue;
-                        PhysicsVector offset = chld.Position - Position;
-                        Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z);
-                        pos *= Quaternion.Inverse(Orientation);
-                        //pos *= Orientation;
-                        offset.setValues(pos.X, pos.Y, pos.Z);
-                        chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation);
-                        
-                            _mesh.Append(chld._mesh);
-                        
+                /*
+                if (_mesh is Mesh)
+                {
+                }
+                else
+                {
+                    m_log.Warn("[PHYSICS]: Can't link a OpenSim.Region.Physics.Meshing.Mesh object");
+                    return;
+                }
+                */
 
-                    }
-                    setMesh(_parent_scene, _mesh);
-                
-            //}
+
+
+                foreach (BulletDotNETPrim chld in childrenPrim)
+                {
+                    if (chld == null)
+                        continue;
+                    PhysicsVector offset = chld.Position - Position;
+                    Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z);
+                    pos *= Quaternion.Inverse(Orientation);
+                    //pos *= Orientation;
+                    offset.setValues(pos.X, pos.Y, pos.Z);
+                    chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation);
+
+                    _mesh.Append(chld._mesh);
+
+
+                }
+                setMesh(_parent_scene, _mesh);
+
+                //}
 
                 if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero)
                     tempMotionState1.Dispose();
@@ -2238,7 +2248,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                     ((btGImpactMeshShape)prim_geom).updateBound();
                 }
                 _parent_scene.AddPrimToScene(this);
-                
+
             }
 
             if (IsPhysical)
@@ -2252,7 +2262,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 if (Body.Handle != IntPtr.Zero)
                 {
                     DisableAxisMotor();
-                    _parent_scene.removeFromWorld(this,Body);
+                    _parent_scene.removeFromWorld(this, Body);
                     Body.Dispose();
                 }
                 Body = null;
@@ -2305,7 +2315,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                 return;
 
 
-            
+
             lock (childrenPrim)
             {
                 if (!childrenPrim.Contains(prm))
@@ -2313,8 +2323,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                     childrenPrim.Add(prm);
                 }
             }
-           
-            
+
+
         }
 
         public void disableBody()
@@ -2386,7 +2396,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             {
                 Body.clearForces();
                 Body.forceActivationState(0);
-                
+
             }
 
         }
@@ -2400,7 +2410,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                     Body.clearForces();
                     Body.forceActivationState(4);
                     forceenable = true;
-                    
+
                 }
                 m_disabled = false;
             }
@@ -2415,7 +2425,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                     SetBody(Mass);
                 else
                     SetBody(0);
-                
+
                 // TODO: Set Collision Category Bits and Flags
                 // TODO: Set Auto Disable data
 
@@ -2587,10 +2597,10 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
                         _velocity.Y = tempLinearVelocity1.getY();
                         _velocity.Z = tempLinearVelocity1.getZ();
 
-                        _acceleration = ((_velocity - m_lastVelocity)/0.1f);
-                        _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X/0.1f,
-                                                          _velocity.Y - m_lastVelocity.Y/0.1f,
-                                                          _velocity.Z - m_lastVelocity.Z/0.1f);
+                        _acceleration = ((_velocity - m_lastVelocity) / 0.1f);
+                        _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f,
+                                                          _velocity.Y - m_lastVelocity.Y / 0.1f,
+                                                          _velocity.Z - m_lastVelocity.Z / 0.1f);
                         //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString());
 
                         if (_velocity.IsIdentical(pv, 0.5f))
@@ -2669,7 +2679,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             if (AxisLockAngleHigh != null && AxisLockAngleHigh.Handle != IntPtr.Zero)
                 AxisLockAngleHigh.Dispose();
 
-           
+
 
             m_aMotor = new btGeneric6DofConstraint(Body, _parent_scene.TerrainBody, _parent_scene.TransZero,
                                                    _parent_scene.TransZero, false);
@@ -2683,7 +2693,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
             m_aMotor.setLinearUpperLimit(AxisLockLinearHigh);
             _parent_scene.getBulletWorld().addConstraint((btTypedConstraint)m_aMotor);
             //m_aMotor.
-            
+
 
         }
         internal void DisableAxisMotor()
@@ -2698,4 +2708,4 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin
 
     }
 }
-                    
+
-- 
cgit v1.1


From 1b2828f5d859d2941167b0457158142e683efe39 Mon Sep 17 00:00:00 2001
From: Dan Lake
Date: Thu, 24 Sep 2009 10:00:31 -0700
Subject: Meshmerizer stores dictionary of unique Meshes keyed on construction
 parameters. CreateMesh() returns a Mesh from the dictionary or creates a new
 Mesh if it has not been created before. Meshes are never purged from the
 dictionary. The raw Mesh data is discarded once the memory is pinned for ODE
 use. All copies of the same prim/mesh use the same pinned memory. ONLY
 IMPLEMENTED AND TESTED WITH MESHMERIZER AND ODE

Signed-off-by: dahlia <dahliaTrimble@gmailDotCom>
---
 OpenSim/Region/Physics/Meshing/Mesh.cs        | 87 +++++++++------------------
 OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 69 +++++++++++++++++++--
 OpenSim/Region/Physics/OdePlugin/ODEPrim.cs   | 17 +-----
 3 files changed, 95 insertions(+), 78 deletions(-)

diff --git a/OpenSim/Region/Physics/Meshing/Mesh.cs b/OpenSim/Region/Physics/Meshing/Mesh.cs
index ceafaad..7567556 100644
--- a/OpenSim/Region/Physics/Meshing/Mesh.cs
+++ b/OpenSim/Region/Physics/Meshing/Mesh.cs
@@ -40,7 +40,6 @@ namespace OpenSim.Region.Physics.Meshing
         private List<Triangle> triangles;
         GCHandle pinnedVirtexes;
         GCHandle pinnedIndex;
-        public PrimMesh primMesh = null;
         public float[] normals;
 
         public Mesh()
@@ -63,6 +62,8 @@ namespace OpenSim.Region.Physics.Meshing
 
         public void Add(Triangle triangle)
         {
+            if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated)
+                throw new NotSupportedException("Attempt to Add to a pinned Mesh");
             // If a vertex of the triangle is not yet in the vertices list,
             // add it and set its index to the current index count
             if (!vertices.ContainsKey(triangle.v1))
@@ -148,40 +149,22 @@ namespace OpenSim.Region.Physics.Meshing
 
         public float[] getVertexListAsFloatLocked()
         {
+            if( pinnedVirtexes.IsAllocated )
+                return (float[])(pinnedVirtexes.Target);
             float[] result;
 
-            if (primMesh == null)
+            //m_log.WarnFormat("vertices.Count = {0}", vertices.Count);
+            result = new float[vertices.Count * 3];
+            foreach (KeyValuePair<Vertex, int> kvp in vertices)
             {
-                //m_log.WarnFormat("vertices.Count = {0}", vertices.Count);
-                result = new float[vertices.Count * 3];
-                foreach (KeyValuePair<Vertex, int> kvp in vertices)
-                {
-                    Vertex v = kvp.Key;
-                    int i = kvp.Value;
-                    //m_log.WarnFormat("kvp.Value = {0}", i);
-                    result[3 * i + 0] = v.X;
-                    result[3 * i + 1] = v.Y;
-                    result[3 * i + 2] = v.Z;
-                }
-                pinnedVirtexes = GCHandle.Alloc(result, GCHandleType.Pinned);
-            }
-            else
-            {
-                int count = primMesh.coords.Count;
-                result = new float[count * 3];
-                for (int i = 0; i < count; i++)
-                {
-                    Coord c = primMesh.coords[i];
-                    {
-                        int resultIndex = 3 * i;
-                        result[resultIndex] = c.X;
-                        result[resultIndex + 1] = c.Y;
-                        result[resultIndex + 2] = c.Z;
-                    }
-
-                }
-                pinnedVirtexes = GCHandle.Alloc(result, GCHandleType.Pinned);
+                Vertex v = kvp.Key;
+                int i = kvp.Value;
+                //m_log.WarnFormat("kvp.Value = {0}", i);
+                result[3 * i + 0] = v.X;
+                result[3 * i + 1] = v.Y;
+                result[3 * i + 2] = v.Z;
             }
+            pinnedVirtexes = GCHandle.Alloc(result, GCHandleType.Pinned);
             return result;
         }
 
@@ -189,33 +172,13 @@ namespace OpenSim.Region.Physics.Meshing
         {
             int[] result;
 
-            if (primMesh == null)
-            {
-                result = new int[triangles.Count * 3];
-                for (int i = 0; i < triangles.Count; i++)
-                {
-                    Triangle t = triangles[i];
-                    result[3 * i + 0] = vertices[t.v1];
-                    result[3 * i + 1] = vertices[t.v2];
-                    result[3 * i + 2] = vertices[t.v3];
-                }
-            }
-            else
+            result = new int[triangles.Count * 3];
+            for (int i = 0; i < triangles.Count; i++)
             {
-                int numFaces = primMesh.faces.Count;
-                result = new int[numFaces * 3];
-                for (int i = 0; i < numFaces; i++)
-                {
-                    Face f = primMesh.faces[i];
-//                    Coord c1 = primMesh.coords[f.v1];
-//                    Coord c2 = primMesh.coords[f.v2];
-//                    Coord c3 = primMesh.coords[f.v3];
-
-                    int resultIndex = i * 3;
-                    result[resultIndex] = f.v1;
-                    result[resultIndex + 1] = f.v2;
-                    result[resultIndex + 2] = f.v3;
-                }
+                Triangle t = triangles[i];
+                result[3 * i + 0] = vertices[t.v1];
+                result[3 * i + 1] = vertices[t.v2];
+                result[3 * i + 2] = vertices[t.v3];
             }
             return result;
         }
@@ -226,6 +189,9 @@ namespace OpenSim.Region.Physics.Meshing
         /// <returns></returns>
         public int[] getIndexListAsIntLocked()
         {
+            if (pinnedIndex.IsAllocated)
+                return (int[])(pinnedIndex.Target);
+        
             int[] result = getIndexListAsInt();
             pinnedIndex = GCHandle.Alloc(result, GCHandleType.Pinned);
 
@@ -245,11 +211,13 @@ namespace OpenSim.Region.Physics.Meshing
         {
             triangles = null;
             vertices = null;
-            primMesh = null;
         }
 
         public void Append(IMesh newMesh)
         {
+            if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated)
+                throw new NotSupportedException("Attempt to Append to a pinned Mesh");
+        
             if (!(newMesh is Mesh))
                 return;
 
@@ -260,6 +228,9 @@ namespace OpenSim.Region.Physics.Meshing
         // Do a linear transformation of  mesh.
         public void TransformLinear(float[,] matrix, float[] offset)
         {
+            if (pinnedIndex.IsAllocated || pinnedVirtexes.IsAllocated)
+                throw new NotSupportedException("Attempt to TransformLinear a pinned Mesh");
+        
             foreach (Vertex v in vertices.Keys)
             {
                 if (v == null)
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index f469ad6..0873035 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -76,6 +76,7 @@ namespace OpenSim.Region.Physics.Meshing
 
         private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh
 
+        private Dictionary<ulong, Mesh> m_uniqueMeshes = new Dictionary<ulong, Mesh>();
 
         /// <summary>
         /// creates a simple box mesh of the specified size. This mesh is of very low vertex count and may
@@ -170,9 +171,62 @@ namespace OpenSim.Region.Physics.Meshing
 
         }
 
-        public Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
+        private ulong GetMeshKey( PrimitiveBaseShape pbs, PhysicsVector size, float lod )
+        {
+            ulong hash = 5381;
+
+            hash = djb2(hash, pbs.PathCurve);
+            hash = djb2(hash, (byte)((byte)pbs.HollowShape | (byte)pbs.ProfileShape));
+            hash = djb2(hash, pbs.PathBegin);
+            hash = djb2(hash, pbs.PathEnd);
+            hash = djb2(hash, pbs.PathScaleX);
+            hash = djb2(hash, pbs.PathScaleY);
+            hash = djb2(hash, pbs.PathShearX);
+            hash = djb2(hash, pbs.PathShearY);
+            hash = djb2(hash, (byte)pbs.PathTwist);
+            hash = djb2(hash, (byte)pbs.PathTwistBegin);
+            hash = djb2(hash, (byte)pbs.PathRadiusOffset);
+            hash = djb2(hash, (byte)pbs.PathTaperX);
+            hash = djb2(hash, (byte)pbs.PathTaperY);
+            hash = djb2(hash, pbs.PathRevolutions);
+            hash = djb2(hash, (byte)pbs.PathSkew);
+            hash = djb2(hash, pbs.ProfileBegin);
+            hash = djb2(hash, pbs.ProfileEnd);
+            hash = djb2(hash, pbs.ProfileHollow);
+
+            // TODO: Separate scale out from the primitive shape data (after
+            // scaling is supported at the physics engine level)
+            byte[] scaleBytes = size.GetBytes();
+            for (int i = 0; i < scaleBytes.Length; i++)
+                hash = djb2(hash, scaleBytes[i]);
+
+            // Include LOD in hash, accounting for endianness
+            byte[] lodBytes = new byte[4];
+            Buffer.BlockCopy(BitConverter.GetBytes(lod), 0, lodBytes, 0, 4);
+            if (!BitConverter.IsLittleEndian)
+            {
+                Array.Reverse(lodBytes, 0, 4);
+            }
+            for (int i = 0; i < lodBytes.Length; i++)
+                hash = djb2(hash, lodBytes[i]);
+
+            return hash;
+        }
+
+        private ulong djb2(ulong hash, byte c)
+        {
+            return ((hash << 5) + hash) + (ulong)c;
+        }
+
+        private ulong djb2(ulong hash, ushort c)
+        {
+            hash = ((hash << 5) + hash) + (ulong)((byte)c);
+            return ((hash << 5) + hash) + (ulong)(c >> 8);
+        }
+        
+
+        private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod)
         {
-            Mesh mesh = new Mesh();
             PrimMesh primMesh;
             PrimMesher.SculptMesh sculptMesh;
 
@@ -385,8 +439,6 @@ namespace OpenSim.Region.Physics.Meshing
 
                 coords = primMesh.coords;
                 faces = primMesh.faces;
-
-
             }
 
 
@@ -401,13 +453,13 @@ namespace OpenSim.Region.Physics.Meshing
                 vertices.Add(new Vertex(c.X, c.Y, c.Z));
             }
 
+            Mesh mesh = new Mesh();
             // Add the corresponding triangles to the mesh
             for (int i = 0; i < numFaces; i++)
             {
                 Face f = faces[i];
                 mesh.Add(new Triangle(vertices[f.v1], vertices[f.v2], vertices[f.v3]));
             }
-
             return mesh;
         }
 
@@ -418,7 +470,12 @@ namespace OpenSim.Region.Physics.Meshing
 
         public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical)
         {
+            // If this mesh has been created already, return it instead of creating another copy
+            // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory
+            ulong key = GetMeshKey(primShape, size, lod);
             Mesh mesh = null;
+            if (m_uniqueMeshes.TryGetValue(key, out mesh))
+                return mesh;
 
             if (size.X < 0.01f) size.X = 0.01f;
             if (size.Y < 0.01f) size.Y = 0.01f;
@@ -441,7 +498,7 @@ namespace OpenSim.Region.Physics.Meshing
                 // trim the vertex and triangle lists to free up memory
                 mesh.TrimExcess();
             }
-
+            m_uniqueMeshes.Add(key, mesh);
             return mesh;
         }
     }
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 673ae39..032b5df 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -82,7 +82,6 @@ namespace OpenSim.Region.Physics.OdePlugin
 
         // private float m_tensor = 5f;
         private int body_autodisable_frames = 20;
-        private IMesh primMesh = null;
 
 
         private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom
@@ -814,14 +813,10 @@ namespace OpenSim.Region.Physics.OdePlugin
                 }
             }
 
-            IMesh oldMesh = primMesh;
+            float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
+            int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage
 
-            primMesh = mesh;
-
-            float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory
-            int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage
-
-            primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory
+            mesh.releaseSourceMeshData(); // free up the original mesh data to save memory
 
             int VertexCount = vertexList.GetLength(0)/3;
             int IndexCount = indexList.GetLength(0);
@@ -847,12 +842,6 @@ namespace OpenSim.Region.Physics.OdePlugin
                 return;
             }
 
-            if (oldMesh != null)
-            {
-                oldMesh.releasePinned();
-                oldMesh = null;
-            }
-
            // if (IsPhysical && Body == (IntPtr) 0)
            // {
                 // Recreate the body
-- 
cgit v1.1


From 6a5d7650d02979c74abcbbb3595729a4a6b55411 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 18:23:55 -0700
Subject: All tests pass for MySQL/MySQLRegionData. Added
 OpenSim.GridServer.ini.example that I have been using for testing the ROBUST
 grid service with the GridClient.

---
 OpenSim/Data/MySQL/MySQLRegionData.cs       | 15 ++-----
 OpenSim/Services/GridService/GridService.cs |  5 ++-
 OpenSim/Services/Interfaces/IGridService.cs | 61 +++++++++--------------------
 bin/OpenSim.GridServer.ini.example          | 35 +++++++++++++++++
 4 files changed, 59 insertions(+), 57 deletions(-)
 create mode 100644 bin/OpenSim.GridServer.ini.example

diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index ced26a4..e13e12c 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -77,7 +77,7 @@ namespace OpenSim.Data.MySQL
             cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
 
             List<RegionData> ret = RunCommand(cmd);
-            if (ret == null)
+            if (ret.Count == 0)
                 return null;
 
             return ret[0];
@@ -95,7 +95,7 @@ namespace OpenSim.Data.MySQL
             cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
 
             List<RegionData> ret = RunCommand(cmd);
-            if (ret == null)
+            if (ret.Count == 0)
                 return null;
 
             return ret[0];
@@ -170,10 +170,7 @@ namespace OpenSim.Data.MySQL
             result.Close();
             CloseReaderCommand(cmd);
 
-            if (retList.Count > 0)
-                return retList;
-
-            return null;
+            return retList;
         }
 
         public bool Store(RegionData data)
@@ -182,12 +179,6 @@ namespace OpenSim.Data.MySQL
                 data.Data.Remove("uuid");
             if (data.Data.ContainsKey("ScopeID"))
                 data.Data.Remove("ScopeID");
-            if (data.Data.ContainsKey("regionName"))
-                data.Data.Remove("regionName");
-            if (data.Data.ContainsKey("posX"))
-                data.Data.Remove("posX");
-            if (data.Data.ContainsKey("posY"))
-                data.Data.Remove("posY");
 
             string[] fields = new List<string>(data.Data.Keys).ToArray();
 
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 01ffa1d..41344ad 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -183,9 +183,9 @@ namespace OpenSim.Services.GridService
             rdata.posX = (int)rinfo.RegionLocX;
             rdata.posY = (int)rinfo.RegionLocY;
             rdata.RegionID = rinfo.RegionID;
-            rdata.Data = rinfo.ToKeyValuePairs();
             rdata.RegionName = rinfo.RegionName;
-
+            rdata.Data = rinfo.ToKeyValuePairs();
+            rdata.Data["regionHandle"] = Utils.UIntsToLong((uint)rdata.posX, (uint)rdata.posY);
             return rdata;
         }
 
@@ -196,6 +196,7 @@ namespace OpenSim.Services.GridService
             rinfo.RegionLocY = rdata.posY;
             rinfo.RegionID = rdata.RegionID;
             rinfo.RegionName = rdata.RegionName;
+            rinfo.ScopeID = rdata.ScopeID;
 
             return rinfo;
         }
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 4bdcde2..513b1b0 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -263,72 +263,47 @@ namespace OpenSim.Services.Interfaces
             kvp["uuid"] = RegionID.ToString();
             kvp["locX"] = RegionLocX.ToString();
             kvp["locY"] = RegionLocY.ToString();
-            kvp["name"] = RegionName;
-            kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
-            kvp["external_port"] = ExternalEndPoint.Port.ToString();
-            kvp["external_host_name"] = ExternalHostName;
-            kvp["http_port"] = HttpPort.ToString();
-            kvp["internal_ip_address"] = InternalEndPoint.Address.ToString();
-            kvp["internal_port"] = InternalEndPoint.Port.ToString();
-            kvp["alternate_ports"] = m_allow_alternate_ports.ToString();
-            kvp["server_uri"] = ServerURI;
+            kvp["regionName"] = RegionName;
+            kvp["serverIP"] = ExternalHostName; //ExternalEndPoint.Address.ToString();
+            kvp["serverHttpPort"] = HttpPort.ToString();
+            kvp["serverURI"] = ServerURI;
 
             return kvp;
         }
 
         public GridRegion(Dictionary<string, object> kvp)
         {
-            if (kvp["uuid"] != null)
+            if (kvp.ContainsKey("uuid"))
                 RegionID = new UUID((string)kvp["uuid"]);
 
-            if (kvp["locX"] != null)
+            if (kvp.ContainsKey("locX"))
                 RegionLocX = Convert.ToInt32((string)kvp["locX"]);
 
-            if (kvp["locY"] != null)
+            if (kvp.ContainsKey("locY"))
                 RegionLocY = Convert.ToInt32((string)kvp["locY"]);
 
-            if (kvp["name"] != null)
-                RegionName = (string)kvp["name"];
+            if (kvp.ContainsKey("regionName"))
+                RegionName = (string)kvp["regionName"];
 
-            if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
+            if (kvp.ContainsKey("serverIP"))
             {
                 int port = 0;
-                Int32.TryParse((string)kvp["external_port"], out port);
-                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["external_ip_address"]), port);
-                ExternalEndPoint = ep;
+                //Int32.TryParse((string)kvp["serverPort"], out port);
+                //IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["serverIP"]), port);
+                ExternalHostName = (string)kvp["serverIP"];
             }
             else
-                ExternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+                ExternalHostName = "127.0.0.1";
 
-            if (kvp["external_host_name"] != null)
-                ExternalHostName = (string)kvp["external_host_name"];
-
-            if (kvp["http_port"] != null)
+            if (kvp.ContainsKey("serverHttpPort"))
             {
                 UInt32 port = 0;
-                UInt32.TryParse((string)kvp["http_port"], out port);
+                UInt32.TryParse((string)kvp["serverHttpPort"], out port);
                 HttpPort = port;
             }
 
-            if ((kvp["internal_ip_address"] != null) && (kvp["internal_port"] != null))
-            {
-                int port = 0;
-                Int32.TryParse((string)kvp["internal_port"], out port);
-                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["internal_ip_address"]), port);
-                InternalEndPoint = ep;
-            }
-            else
-                InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
-
-            if (kvp["alternate_ports"] != null)
-            {
-                bool alts = false;
-                Boolean.TryParse((string)kvp["alternate_ports"], out alts);
-                m_allow_alternate_ports = alts;
-            }
-
-            if (kvp["server_uri"] != null)
-                ServerURI = (string)kvp["server_uri"];
+            if (kvp.ContainsKey("serverURI"))
+                ServerURI = (string)kvp["serverURI"];
         }
     }
 
diff --git a/bin/OpenSim.GridServer.ini.example b/bin/OpenSim.GridServer.ini.example
new file mode 100644
index 0000000..695bf9e
--- /dev/null
+++ b/bin/OpenSim.GridServer.ini.example
@@ -0,0 +1,35 @@
+; * The startup section lists all the connectors to start up in this server
+; * instance. This may be only one, or it may be the entire server suite.
+; * Multiple connectors should be seaprated by commas.
+; *
+; * These are the IN connectors the server uses, the in connectors
+; * read this config file and load the needed OUT and database connectors
+; *
+; *
+[Startup]
+	ServiceConnectors = "OpenSim.Server.Handlers.dll:GridServiceConnector"
+
+; * This is common for all services, it's the network setup for the entire
+; * server instance
+; *
+[Network]
+	port = 8002
+
+; * The following are for the remote console
+; * They have no effect for the local or basic console types
+; * Leave commented to diable logins to the console
+;ConsoleUser = Test
+;ConsolePass = secret
+
+; * As an example, the below configuration precisely mimicks the legacy
+; * asset server. It is read by the asset IN connector (defined above)
+; * and it then loads the OUT connector (a local database module). That,
+; * in turn, reads the asset loader and database connection information
+; *
+[GridService]
+	LocalServiceModule = "OpenSim.Services.GridService.dll:GridService"
+	StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
+	;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
+	;ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=***;"
+	Realm = "regions"
+
-- 
cgit v1.1


From b6824c495cb04ca79c681143be2d1b8f9b5b228d Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 18:28:38 -0700
Subject: Deleted the meaningless console commands on the GridService. Will
 need to add meaningful ones.

---
 OpenSim/Services/GridService/GridService.cs | 72 -----------------------------
 1 file changed, 72 deletions(-)

diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 41344ad..68b7cdf 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -50,16 +50,6 @@ namespace OpenSim.Services.GridService
             : base(config)
         {
             m_log.DebugFormat("[GRID SERVICE]: Starting...");
-            MainConsole.Instance.Commands.AddCommand("kfs", false,
-                    "show digest",
-                    "show digest <ID>",
-                    "Show asset digest", HandleShowDigest);
-
-            MainConsole.Instance.Commands.AddCommand("kfs", false,
-                    "delete asset",
-                    "delete asset <ID>",
-                    "Delete asset from database", HandleDeleteAsset);
-
         }
 
         #region IGridService
@@ -203,67 +193,5 @@ namespace OpenSim.Services.GridService
 
         #endregion 
 
-        void HandleShowDigest(string module, string[] args)
-        {
-            //if (args.Length < 3)
-            //{
-            //    MainConsole.Instance.Output("Syntax: show digest <ID>");
-            //    return;
-            //}
-
-            //AssetBase asset = Get(args[2]);
-
-            //if (asset == null || asset.Data.Length == 0)
-            //{   
-            //    MainConsole.Instance.Output("Asset not found");
-            //    return;
-            //}
-
-            //int i;
-
-            //MainConsole.Instance.Output(String.Format("Name: {0}", asset.Name));
-            //MainConsole.Instance.Output(String.Format("Description: {0}", asset.Description));
-            //MainConsole.Instance.Output(String.Format("Type: {0}", asset.Type));
-            //MainConsole.Instance.Output(String.Format("Content-type: {0}", asset.Metadata.ContentType));
-
-            //for (i = 0 ; i < 5 ; i++)
-            //{
-            //    int off = i * 16;
-            //    if (asset.Data.Length <= off)
-            //        break;
-            //    int len = 16;
-            //    if (asset.Data.Length < off + len)
-            //        len = asset.Data.Length - off;
-
-            //    byte[] line = new byte[len];
-            //    Array.Copy(asset.Data, off, line, 0, len);
-
-            //    string text = BitConverter.ToString(line);
-            //    MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
-            //}
-        }
-
-        void HandleDeleteAsset(string module, string[] args)
-        {
-            //if (args.Length < 3)
-            //{
-            //    MainConsole.Instance.Output("Syntax: delete asset <ID>");
-            //    return;
-            //}
-
-            //AssetBase asset = Get(args[2]);
-
-            //if (asset == null || asset.Data.Length == 0)
-            //    MainConsole.Instance.Output("Asset not found");
-            //    return;
-            //}
-
-            //Delete(args[2]);
-
-            ////MainConsole.Instance.Output("Asset deleted");
-            //// TODO: Implement this
-
-            //MainConsole.Instance.Output("Asset deletion not supported by database");
-        }
     }
 }
-- 
cgit v1.1


From eb0aa6a7f4d170a7f773686fb3993ca9d50c9294 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 24 Sep 2009 18:48:38 -0700
Subject: Make the grid client deregister the test regions at the end, so that
 they don't stay in the DB.

---
 OpenSim/Tests/Clients/Grid/GridClient.cs | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/OpenSim/Tests/Clients/Grid/GridClient.cs b/OpenSim/Tests/Clients/Grid/GridClient.cs
index 155f38e..c56ebc3 100644
--- a/OpenSim/Tests/Clients/Grid/GridClient.cs
+++ b/OpenSim/Tests/Clients/Grid/GridClient.cs
@@ -137,6 +137,26 @@ namespace OpenSim.Tests.Clients.GridClient
             else
                 Console.WriteLine("[GRID CLIENT]: GetRegionRange returned " + regions.Count + " regions");
 
+            // Deregister them all
+            Console.WriteLine("[GRID CLIENT]: *** Deregistering region 1");
+            success = m_Connector.DeregisterRegion(r1.RegionID);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully deregistered region 1");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 1 failed to deregister");
+            Console.WriteLine("[GRID CLIENT]: *** Deregistering region 2");
+            success = m_Connector.DeregisterRegion(r2.RegionID);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully deregistered region 2");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 2 failed to deregister");
+            Console.WriteLine("[GRID CLIENT]: *** Deregistering region 3");
+            success = m_Connector.DeregisterRegion(r3.RegionID);
+            if (success)
+                Console.WriteLine("[GRID CLIENT]: Successfully deregistered region 3");
+            else
+                Console.WriteLine("[GRID CLIENT]: region 3 failed to deregister");
+
         }
 
         private static GridRegion CreateRegion(string name, uint xcell, uint ycell)
-- 
cgit v1.1


From 52e477b41f137ff2a0775722dcbaaa64fa5f3bc3 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 06:02:41 -0700
Subject: Better guards on RegisterRegion in GridService. Added serverPort to
 the fields that get stored (I think this is the UDP port).

---
 OpenSim/Services/GridService/GridService.cs | 14 ++++++++------
 OpenSim/Services/Interfaces/IGridService.cs | 10 +++++++++-
 OpenSim/Tests/Clients/Grid/GridClient.cs    |  5 ++++-
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index 68b7cdf..991acf2 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -56,19 +56,21 @@ namespace OpenSim.Services.GridService
 
         public bool RegisterRegion(UUID scopeID, GridRegion regionInfos)
         {
-            if (m_Database.Get(regionInfos.RegionID, scopeID) != null)
-            {
-                m_log.WarnFormat("[GRID SERVICE]: Region {0} already registered in scope {1}.", regionInfos.RegionID, scopeID);
-                return false;
-            }
             // This needs better sanity testing. What if regionInfo is registering in
             // overlapping coords?
-            if (m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID) != null)
+            RegionData region = m_Database.Get(regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID);
+            if ((region != null) && (region.RegionID != regionInfos.RegionID))
             {
                 m_log.WarnFormat("[GRID SERVICE]: Region {0} tried to register in coordinates {1}, {2} which are already in use in scope {3}.", 
                     regionInfos.RegionID, regionInfos.RegionLocX, regionInfos.RegionLocY, scopeID);
                 return false;
             }
+            if ((region != null) && (region.RegionID == regionInfos.RegionID) && 
+                ((region.posX != regionInfos.RegionLocX) || (region.posY != regionInfos.RegionLocY)))
+            {
+                // Region reregistering in other coordinates. Delete the old entry
+                m_Database.Delete(regionInfos.RegionID);
+            }
 
             // Everything is ok, let's register
             RegionData rdata = RegionInfo2RegionData(regionInfos);
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 513b1b0..ce432ab 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -267,6 +267,7 @@ namespace OpenSim.Services.Interfaces
             kvp["serverIP"] = ExternalHostName; //ExternalEndPoint.Address.ToString();
             kvp["serverHttpPort"] = HttpPort.ToString();
             kvp["serverURI"] = ServerURI;
+            kvp["serverPort"] = InternalEndPoint.Port.ToString();
 
             return kvp;
         }
@@ -287,7 +288,7 @@ namespace OpenSim.Services.Interfaces
 
             if (kvp.ContainsKey("serverIP"))
             {
-                int port = 0;
+                //int port = 0;
                 //Int32.TryParse((string)kvp["serverPort"], out port);
                 //IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["serverIP"]), port);
                 ExternalHostName = (string)kvp["serverIP"];
@@ -295,6 +296,13 @@ namespace OpenSim.Services.Interfaces
             else
                 ExternalHostName = "127.0.0.1";
 
+            if (kvp.ContainsKey("serverPort"))
+            {
+                Int32 port = 0;
+                Int32.TryParse((string)kvp["serverPort"], out port);
+                InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port);
+            }
+
             if (kvp.ContainsKey("serverHttpPort"))
             {
                 UInt32 port = 0;
diff --git a/OpenSim/Tests/Clients/Grid/GridClient.cs b/OpenSim/Tests/Clients/Grid/GridClient.cs
index c56ebc3..941406e 100644
--- a/OpenSim/Tests/Clients/Grid/GridClient.cs
+++ b/OpenSim/Tests/Clients/Grid/GridClient.cs
@@ -137,6 +137,9 @@ namespace OpenSim.Tests.Clients.GridClient
             else
                 Console.WriteLine("[GRID CLIENT]: GetRegionRange returned " + regions.Count + " regions");
 
+            Console.Write("Proceed to deregister? Press enter...");
+            Console.ReadLine();
+
             // Deregister them all
             Console.WriteLine("[GRID CLIENT]: *** Deregistering region 1");
             success = m_Connector.DeregisterRegion(r1.RegionID);
@@ -166,7 +169,7 @@ namespace OpenSim.Tests.Clients.GridClient
             region.RegionID = UUID.Random();
             region.ExternalHostName = "127.0.0.1";
             region.HttpPort = 9000;
-            region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0);
+            region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 9000);
           
             return region;
         }
-- 
cgit v1.1


From 730458be1f8c74da1c112df36ec54233b30caed0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 25 Sep 2009 14:31:29 +0100
Subject: minor: remove some mono compiler warnings

---
 .../Region/CoreModules/Scripting/LSLHttp/UrlModule.cs   |  7 +++----
 .../Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs  | 17 ++++++++---------
 .../Authorization/AuthorizationServerPostHandler.cs     |  2 +-
 .../AuthenticationService/AuthenticationServiceBase.cs  |  6 +++---
 .../PasswordAuthenticationService.cs                    |  6 +++---
 .../WebkeyAuthenticationService.cs                      |  6 +++---
 6 files changed, 21 insertions(+), 23 deletions(-)

diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 8b7a878..b885420 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -200,11 +200,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
             if (m_RequestMap.ContainsKey(request))
             {
                 UrlData urlData = m_RequestMap[request];
-                RequestData requestData=urlData.requests[request];
                 urlData.requests[request].responseCode = status;
                 urlData.requests[request].responseBody = body;
                 //urlData.requests[request].ev.Set();
-                urlData.requests[request].requestDone=true;
+                urlData.requests[request].requestDone =true;
             }
             else
             {
@@ -397,7 +396,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                 {
                     Hashtable headers = (Hashtable)request["headers"];
                     
-                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
+//                    string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
 
                     int pos1 = uri.IndexOf("/");// /lslhttp
                     int pos2 = uri.IndexOf("/", pos1 + 1);// /lslhttp/
@@ -471,7 +470,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
                     url.engine.PostScriptEvent(url.itemID, "http_request", new Object[] { requestID.ToString(), request["http-method"].ToString(), request["body"].ToString() });
 
                     //send initial response?
-                    Hashtable response = new Hashtable();
+//                    Hashtable response = new Hashtable();
 
                     return;
 
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
index 5d65f98..62efd60 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
@@ -47,8 +47,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
         // This maps between inventory server urls and inventory server clients
-        private Dictionary<string, InventoryClient> m_inventoryServers = new Dictionary<string, InventoryClient>();
-
+//        private Dictionary<string, InventoryClient> m_inventoryServers = new Dictionary<string, InventoryClient>();
 
         private Scene m_scene;
         #endregion
@@ -72,13 +71,13 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
             return null;
         }
 
-        private string UserInventoryURL(UUID userID)
-        {
-            CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
-            if (uinfo != null)
-                return (uinfo.UserProfile.UserInventoryURI == "") ? null : uinfo.UserProfile.UserInventoryURI;
-            return null;
-        }
+//        private string UserInventoryURL(UUID userID)
+//        {
+//            CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
+//            if (uinfo != null)
+//                return (uinfo.UserProfile.UserInventoryURI == "") ? null : uinfo.UserProfile.UserInventoryURI;
+//            return null;
+//        }
 
         private bool IsLocalUser(UUID userID)
         {
diff --git a/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs b/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
index 69acd25..f987de4 100644
--- a/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Authorization/AuthorizationServerPostHandler.cs
@@ -44,7 +44,7 @@ namespace OpenSim.Server.Handlers.Authorization
 {
     public class AuthorizationServerPostHandler : BaseStreamHandler
     {
-        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+//        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
         private IAuthorizationService m_AuthorizationService;
 
diff --git a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs
index 8904461..dcf090e 100644
--- a/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs
+++ b/OpenSim/Services/AuthenticationService/AuthenticationServiceBase.cs
@@ -43,9 +43,9 @@ namespace OpenSim.Services.AuthenticationService
     //
     public class AuthenticationServiceBase : ServiceBase
     {
-        private static readonly ILog m_log =
-                LogManager.GetLogger(
-                MethodBase.GetCurrentMethod().DeclaringType);
+//        private static readonly ILog m_log =
+//                LogManager.GetLogger(
+//                MethodBase.GetCurrentMethod().DeclaringType);
  
         protected IAuthenticationData m_Database;
 
diff --git a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
index 6c99b66..d65665a 100644
--- a/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
+++ b/OpenSim/Services/AuthenticationService/PasswordAuthenticationService.cs
@@ -47,9 +47,9 @@ namespace OpenSim.Services.AuthenticationService
     public class PasswordAuthenticationService :
             AuthenticationServiceBase, IAuthenticationService
     {
-        private static readonly ILog m_log =
-                LogManager.GetLogger(
-                MethodBase.GetCurrentMethod().DeclaringType);
+//        private static readonly ILog m_log =
+//                LogManager.GetLogger(
+//                MethodBase.GetCurrentMethod().DeclaringType);
  
         public PasswordAuthenticationService(IConfigSource config) :
                 base(config)
diff --git a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs
index 8831c8a..d1a5b0f 100644
--- a/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs
+++ b/OpenSim/Services/AuthenticationService/WebkeyAuthenticationService.cs
@@ -43,9 +43,9 @@ namespace OpenSim.Services.AuthenticationService
     public class WebkeyAuthenticationService :
             AuthenticationServiceBase, IAuthenticationService
     {
-        private static readonly ILog m_log =
-                LogManager.GetLogger(
-                MethodBase.GetCurrentMethod().DeclaringType);
+//        private static readonly ILog m_log =
+//                LogManager.GetLogger(
+//                MethodBase.GetCurrentMethod().DeclaringType);
  
         public WebkeyAuthenticationService(IConfigSource config) :
                 base(config)
-- 
cgit v1.1


From 613cb417c01fbca0cc28c3ef0313bf46e8d7c586 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 25 Sep 2009 14:52:53 +0100
Subject: add control files containing version info to iars

---
 .../Archiver/InventoryArchiveWriteRequest.cs       | 28 ++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index 7b4a9eb..fd42586 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -118,6 +118,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
 
         protected void ReceivedAllAssets(ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids)
         {
+            // We're almost done.  Just need to write out the control file now
+            m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, Create0p1ControlFile());
+            m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
+            
             Exception reportedException = null;
             bool succeeded = true;
 
@@ -409,5 +413,29 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
                 ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR,
                 id);            
         }
+
+        /// <summary>
+        /// Create the control file for a 0.1 version archive
+        /// </summary>
+        /// <returns></returns>
+        public static string Create0p1ControlFile()
+        {
+            StringWriter sw = new StringWriter();
+            XmlTextWriter xtw = new XmlTextWriter(sw);
+            xtw.Formatting = Formatting.Indented;
+            xtw.WriteStartDocument();
+            xtw.WriteStartElement("archive");
+            xtw.WriteAttributeString("major_version", "0");
+            xtw.WriteAttributeString("minor_version", "1");
+            xtw.WriteEndElement();
+
+            xtw.Flush();
+            xtw.Close();
+
+            String s = sw.ToString();
+            sw.Close();
+
+            return s;
+        }        
     }
 }
\ No newline at end of file
-- 
cgit v1.1


From b2772b3a2ded5149db6cd31dab745c2369d74075 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 07:38:05 -0700
Subject: Added GridForm.html in Tests/Clients/Grid that shows how to interact
 with a grid server via regular Web forms. May be good for developing
 administrative tools.

---
 OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs | 17 ++++++++++-------
 OpenSim/Tests/Clients/Grid/GridForm.html              | 11 +++++++++++
 2 files changed, 21 insertions(+), 7 deletions(-)
 create mode 100644 OpenSim/Tests/Clients/Grid/GridForm.html

diff --git a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
index f50e6a2..711639f 100644
--- a/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Grid/GridServerPostHandler.cs
@@ -64,7 +64,9 @@ namespace OpenSim.Server.Handlers.Grid
             string body = sr.ReadToEnd();
             sr.Close();
             body = body.Trim();
-            
+
+            //m_log.DebugFormat("[XXX]: query String: {0}", body);
+
             Dictionary<string, string> request =
                     ServerUtils.ParseQueryString(body);
 
@@ -101,7 +103,7 @@ namespace OpenSim.Server.Handlers.Grid
 
             }
 
-            m_log.DebugFormat("[GRID HANDLER XXX]: unknown method {0} request {1}", method.Length, method);
+            m_log.DebugFormat("[GRID HANDLER]: unknown method {0} request {1}", method.Length, method);
             return FailureResult();
 
         }
@@ -320,26 +322,27 @@ namespace OpenSim.Server.Handlers.Grid
 
         byte[] GetRegionRange(Dictionary<string, string> request)
         {
+            //m_log.DebugFormat("[GRID HANDLER]: GetRegionRange");
             UUID scopeID = UUID.Zero;
-            if (request["SCOPEID"] != null)
+            if (request.ContainsKey("SCOPEID"))
                 UUID.TryParse(request["SCOPEID"], out scopeID);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no scopeID in request to get region range");
 
             int xmin = 0, xmax = 0, ymin = 0, ymax = 0;
-            if (request["XMIN"] != null)
+            if (request.ContainsKey("XMIN"))
                 Int32.TryParse(request["XMIN"], out xmin);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no XMIN in request to get region range");
-            if (request["XMAX"] != null)
+            if (request.ContainsKey("XMAX"))
                 Int32.TryParse(request["XMAX"], out xmax);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no XMAX in request to get region range");
-            if (request["YMIN"] != null)
+            if (request.ContainsKey("YMIN"))
                 Int32.TryParse(request["YMIN"], out ymin);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no YMIN in request to get region range");
-            if (request["YMAX"] != null)
+            if (request.ContainsKey("YMAX"))
                 Int32.TryParse(request["YMAX"], out ymax);
             else
                 m_log.WarnFormat("[GRID HANDLER]: no YMAX in request to get region range");
diff --git a/OpenSim/Tests/Clients/Grid/GridForm.html b/OpenSim/Tests/Clients/Grid/GridForm.html
new file mode 100644
index 0000000..252920f
--- /dev/null
+++ b/OpenSim/Tests/Clients/Grid/GridForm.html
@@ -0,0 +1,11 @@
+<html>
+
+<form name="input" action="http://127.0.0.1:8002/grid" method="post">
+xmin:<input type="text" name="XMIN" value="0">
+xmax:<input type="text" name="XMAX" value="0">
+ymin:<input type="text" name="YMIN" value="0">
+ymax:<input type="text" name="YMAX" value="0">
+<input type="hidden" name="METHOD" value="get_region_range">
+<input type="submit" value="Submit" />
+</form>
+</html>
-- 
cgit v1.1


From 295868033f44edeb25230c2d4cf336c454693075 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 07:47:58 -0700
Subject: Better error handling on the client-side grid connector.

---
 .../Connectors/Grid/GridServiceConnector.cs        | 152 +++++++++++++++------
 1 file changed, 108 insertions(+), 44 deletions(-)

diff --git a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
index ebb66a7..748892a 100644
--- a/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Grid/GridServiceConnector.cs
@@ -99,18 +99,25 @@ namespace OpenSim.Services.Connectors
 
             string reqString = ServerUtils.BuildQueryString(sendData);
             //m_log.DebugFormat("[GRID CONNECTOR]: queryString = {0}", reqString);
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    reqString);
-            if (reply != string.Empty)
+            try
             {
-                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+                string reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        reqString);
+                if (reply != string.Empty)
+                {
+                    Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-                if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
-                    return true;
+                    if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
+                        return true;
+                }
+                else
+                    m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply");
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
             }
-            else
-                m_log.DebugFormat("[GRID CONNECTOR]: RegisterRegion received null reply");
 
             return false;
         }
@@ -123,19 +130,26 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "deregister";
 
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
-
-            if (reply != string.Empty)
+            try
             {
-                Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
+                string reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
+
+                if (reply != string.Empty)
+                {
+                    Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-                if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
-                    return true;
+                    if ((replyData["Result"] != null) && (replyData["Result"].ToString().ToLower() == "success"))
+                        return true;
+                }
+                else
+                    m_log.DebugFormat("[GRID CONNECTOR]: DeregisterRegion received null reply");
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
             }
-            else
-                m_log.DebugFormat("[GRID CONNECTOR]: DeregisterRegion received null reply");
 
             return false;
         }
@@ -149,14 +163,24 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "get_neighbours";
 
+            List<GridRegion> rinfos = new List<GridRegion>();
+
             string reqString = ServerUtils.BuildQueryString(sendData);
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    reqString);
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        reqString);
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return rinfos;
+            }
 
             Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
 
-            List<GridRegion> rinfos = new List<GridRegion>();
             if (replyData != null)
             {
                 Dictionary<string, object>.ValueCollection rinfosList = replyData.Values;
@@ -189,9 +213,18 @@ namespace OpenSim.Services.Connectors
 
             sendData["METHOD"] = "get_region_by_uuid";
 
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return null;
+            }
 
             GridRegion rinfo = null;
 
@@ -226,10 +259,18 @@ namespace OpenSim.Services.Connectors
             sendData["Y"] = y.ToString();
 
             sendData["METHOD"] = "get_region_by_position";
-
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return null;
+            }
 
             GridRegion rinfo = null;
             if (reply != string.Empty)
@@ -262,10 +303,18 @@ namespace OpenSim.Services.Connectors
             sendData["NAME"] = regionName;
 
             sendData["METHOD"] = "get_region_by_name";
-
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return null;
+            }
 
             GridRegion rinfo = null;
             if (reply != string.Empty)
@@ -296,12 +345,19 @@ namespace OpenSim.Services.Connectors
             sendData["MAX"] = maxNumber.ToString();
 
             sendData["METHOD"] = "get_regions_by_name";
-
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
-
             List<GridRegion> rinfos = new List<GridRegion>();
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return rinfos;
+            }
 
             if (reply != string.Empty)
             {
@@ -345,12 +401,20 @@ namespace OpenSim.Services.Connectors
             sendData["METHOD"] = "get_region_range";
 
             List<GridRegion> rinfos = new List<GridRegion>();
+            string reply = string.Empty;
+            try
+            {
+                reply = SynchronousRestFormsRequester.MakeRequest("POST",
+                        m_ServerURI + "/grid",
+                        ServerUtils.BuildQueryString(sendData));
 
-            string reply = SynchronousRestFormsRequester.MakeRequest("POST",
-                    m_ServerURI + "/grid",
-                    ServerUtils.BuildQueryString(sendData));
-
-            //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply);
+                //m_log.DebugFormat("[GRID CONNECTOR]: reply was {0}", reply);
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[GRID CONNECTOR]: Exception when contacting grid server: {0}", e.Message);
+                return rinfos;
+            }
 
             if (reply != string.Empty)
             {
-- 
cgit v1.1


From 9249c026f25a0a24c62ca76fca37b1d23bcc3494 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 25 Sep 2009 16:22:43 +0100
Subject: Don't preserve full user profile details within iars for now This
 information was not being used in the load process

---
 .../Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs         | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
index fd42586..c6ebb24 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs
@@ -324,7 +324,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
                 SaveInvFolder(inventoryFolder, ArchiveConstants.INVENTORY_PATH, !foundStar);
             }
 
-            SaveUsers();
+            // Don't put all this profile information into the archive right now.
+            //SaveUsers();
+            
             new AssetsRequest(
                 new AssetsArchiver(m_archiveWriter), m_assetUuids.Keys, 
                 m_scene.AssetService, ReceivedAllAssets).Execute();
-- 
cgit v1.1


From 902279f0fda655c8542b3e7ff7a8769bb3aff1a2 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 08:39:09 -0700
Subject: Moved the property RegionLoginsEnabled from GridComms to the Scene --
 not the scene itself but SceneCommunicationService, for now. Beginning to
 clear the code from using Region.Communications. grid stuff.

---
 OpenSim/Client/Linden/LLProxyLoginModule.cs                     | 2 +-
 OpenSim/Client/Linden/LLStandaloneLoginModule.cs                | 2 +-
 OpenSim/Region/Application/OpenSim.cs                           | 2 +-
 OpenSim/Region/Application/OpenSimBase.cs                       | 8 ++++----
 OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs | 2 +-
 OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs    | 7 +++++++
 6 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/OpenSim/Client/Linden/LLProxyLoginModule.cs b/OpenSim/Client/Linden/LLProxyLoginModule.cs
index f55d9fc..ccd38d4 100644
--- a/OpenSim/Client/Linden/LLProxyLoginModule.cs
+++ b/OpenSim/Client/Linden/LLProxyLoginModule.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Client.Linden
             {
                 if (m_firstScene != null)
                 {
-                    return m_firstScene.CommsManager.GridService.RegionLoginsEnabled;
+                    return m_firstScene.SceneGridService.RegionLoginsEnabled;
                 }
                 else
                 {
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
index 4a31e95..fb0aaa5 100644
--- a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
+++ b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
@@ -62,7 +62,7 @@ namespace OpenSim.Client.Linden
             {
                 if (m_firstScene != null)
                 {
-                    return m_firstScene.CommsManager.GridService.RegionLoginsEnabled;
+                    return m_firstScene.SceneGridService.RegionLoginsEnabled;
                 }
                 else
                 {
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 10071a0..e9c9dc1 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -557,7 +557,7 @@ namespace OpenSim
         /// <param name="cmd"></param>
         private void HandleLoginStatus(string module, string[] cmd)
         {
-            if (m_commsManager.GridService.RegionLoginsEnabled == false)
+            if (m_sceneManager.CurrentOrFirstScene.SceneGridService.RegionLoginsEnabled == false)
 
                 m_log.Info("[ Login ]  Login are disabled ");
             else
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index 7bc0b77..4d13e83 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -209,9 +209,9 @@ namespace OpenSim
             }
 
             // Only enable logins to the regions once we have completely finished starting up (apart from scripts)
-            if ((m_commsManager != null) && (m_commsManager.GridService != null))
+            if ((SceneManager.CurrentOrFirstScene != null) && (SceneManager.CurrentOrFirstScene.SceneGridService != null))
             {
-                m_commsManager.GridService.RegionLoginsEnabled = true;
+                SceneManager.CurrentOrFirstScene.SceneGridService.RegionLoginsEnabled = true;
             }
 
             AddPluginCommands();
@@ -299,12 +299,12 @@ namespace OpenSim
             if (LoginEnabled)
             {
                 m_log.Info("[LOGIN]: Login is now enabled.");
-                m_commsManager.GridService.RegionLoginsEnabled = true;
+                SceneManager.CurrentOrFirstScene.SceneGridService.RegionLoginsEnabled = true;
             }
             else
             {
                 m_log.Info("[LOGIN]: Login is now disabled.");
-                m_commsManager.GridService.RegionLoginsEnabled = false;
+                SceneManager.CurrentOrFirstScene.SceneGridService.RegionLoginsEnabled = false;
             }
         }
 
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
index 613dbe9..4199c98 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
@@ -61,7 +61,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
             {
                 if (m_firstScene != null)
                 {
-                    return m_firstScene.CommsManager.GridService.RegionLoginsEnabled;
+                    return m_firstScene.SceneGridService.RegionLoginsEnabled;
                 }
                 else
                 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 204c319..56cd87d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -63,6 +63,13 @@ namespace OpenSim.Region.Framework.Scenes
 
         protected List<UUID> m_agentsInTransit;
 
+        public bool RegionLoginsEnabled
+        {
+            get { return m_regionLoginsEnabled; }
+            set { m_regionLoginsEnabled = value; }
+        }
+        private bool m_regionLoginsEnabled = false;
+
         /// <summary>
         /// An agent is crossing into this region
         /// </summary>
-- 
cgit v1.1


From be7afa0b1f2b4947f62d5a541663d665c78482d3 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 08:44:26 -0700
Subject: Changed a [Groups] config as per mcortez' request.

---
 bin/OpenSim.ini.example | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index e34378c..7a65efe 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -1311,7 +1311,7 @@
     ;NoticesEnabled   = true
 
     ; This makes the Groups modules very chatty on the console.
-    ;DebugEnabled     = true
+    DebugEnabled     = false
 
     ; Specify which messaging module to use for groups messaging and if it's enabled
     ;MessagingModule = GroupsMessagingModule
-- 
cgit v1.1


From eed8a615598e39d9aec2a5591fd2adbf7c2df7eb Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 25 Sep 2009 08:47:45 -0700
Subject: More small changes to FlotsamAssetCache as per mcortez' request.

---
 OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
index d85d3df..37cccc8 100644
--- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
+++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs
@@ -142,7 +142,7 @@ namespace Flotsam.RegionModules.AssetCache
                     m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory);
                     m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory", m_DefaultCacheDirectory);
 
-                    m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", true);
+                    m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", false);
                     m_MemoryExpiration = TimeSpan.FromHours(assetConfig.GetDouble("MemoryCacheTimeout", m_DefaultMemoryExpiration));
 
 #if WAIT_ON_INPROGRESS_REQUESTS
@@ -150,7 +150,7 @@ namespace Flotsam.RegionModules.AssetCache
 #endif
 
                     m_LogLevel = assetConfig.GetInt("LogLevel", 1);
-                    m_HitRateDisplay = (ulong)assetConfig.GetInt("HitRateDisplay", 1);
+                    m_HitRateDisplay = (ulong)assetConfig.GetInt("HitRateDisplay", 1000);
 
                     m_FileExpiration = TimeSpan.FromHours(assetConfig.GetDouble("FileCacheTimeout", m_DefaultFileExpiration));
                     m_FileExpirationCleanupTimer = TimeSpan.FromHours(assetConfig.GetDouble("FileCleanupTimer", m_DefaultFileExpiration));
-- 
cgit v1.1


From 2995d87d75e3f65b9872aa02edbff0dda70bc03c Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 25 Sep 2009 19:29:40 +0100
Subject: minor: remove some mono compiler warnings

---
 OpenSim/Data/MySQL/MySQLRegionData.cs      | 2 +-
 OpenSim/Data/MySQL/MySQLUserAccountData.cs | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index e13e12c..e8cab4d 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Data.MySQL
     {
         private string m_Realm;
         private List<string> m_ColumnNames = null;
-        private int m_LastExpire = 0;
+//        private int m_LastExpire = 0;
 
         public MySqlRegionData(string connectionString, string realm)
                 : base(connectionString)
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
index 39d60ca..5352727 100644
--- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Data.MySQL
     {
         private string m_Realm;
         private List<string> m_ColumnNames = null;
-        private int m_LastExpire = 0;
+//        private int m_LastExpire = 0;
 
         public MySqlUserAccountData(string connectionString, string realm)
                 : base(connectionString)
-- 
cgit v1.1


From 0a0b532270d7cc952648b99ed7ab7ec3b0f99676 Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Fri, 25 Sep 2009 15:31:19 -0400
Subject: * Fixes teleporting within megaregions on HG enabled regions.    You
 can teleport around now.  (but it still doesn't fix the inconsistent
 attachment state when teleporting into region slots that are not the south
 west region on megaregions)

---
 .../Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs  | 10 ++++++++--
 OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs   |  2 +-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
index 5c99d73..efc644d 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
@@ -77,7 +77,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
             if (regionHandle == m_regionInfo.RegionHandle)
             {
                 // Teleport within the same region
-                if (position.X < 0 || position.X > Constants.RegionSize || position.Y < 0 || position.Y > Constants.RegionSize || position.Z < 0)
+                if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
                 {
                     Vector3 emergencyPos = new Vector3(128, 128, 128);
 
@@ -89,7 +89,13 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
                 // TODO: Get proper AVG Height
                 float localAVHeight = 1.56f;
                 
-                float posZLimit = (float)avatar.Scene.Heightmap[(int)position.X, (int)position.Y];
+                float posZLimit = 22;
+
+                if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize)
+                {
+                    posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y];
+                }
+
                 float newPosZ = posZLimit + localAVHeight;
                 if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
                 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 56cd87d..5f2333e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1170,7 +1170,7 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        private bool IsOutsideRegion(Scene s, Vector3 pos)
+        protected bool IsOutsideRegion(Scene s, Vector3 pos)
         {
             
             if (s.TestBorderCross(pos,Cardinals.N))
-- 
cgit v1.1


From fb2cabd6b35bdbc966598de361044e2ff0164e5c Mon Sep 17 00:00:00 2001
From: dahlia
Date: Fri, 25 Sep 2009 13:00:49 -0700
Subject: corrections to viewerMode AddPos()

---
 OpenSim/Region/Physics/Meshing/PrimMesher.cs | 27 +++++++++++++++++++++++++++
 OpenSim/Region/Physics/Meshing/SculptMesh.cs | 14 +++++++++++++-
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/OpenSim/Region/Physics/Meshing/PrimMesher.cs b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
index 0d19c01..abfd400 100644
--- a/OpenSim/Region/Physics/Meshing/PrimMesher.cs
+++ b/OpenSim/Region/Physics/Meshing/PrimMesher.cs
@@ -345,6 +345,21 @@ namespace PrimMesher
             this.v3.Z *= z;
         }
 
+        public void AddPos(float x, float y, float z)
+        {
+            this.v1.X += x;
+            this.v2.X += x;
+            this.v3.X += x;
+
+            this.v1.Y += y;
+            this.v2.Y += y;
+            this.v3.Y += y;
+
+            this.v1.Z += z;
+            this.v2.Z += z;
+            this.v3.Z += z;
+        }
+
         public void AddRot(Quat q)
         {
             this.v1 *= q;
@@ -2141,6 +2156,18 @@ namespace PrimMesher
                 vert.Z += z;
                 this.coords[i] = vert;
             }
+
+            if (this.viewerFaces != null)
+            {
+                int numViewerFaces = this.viewerFaces.Count;
+
+                for (i = 0; i < numViewerFaces; i++)
+                {
+                    ViewerFace v = this.viewerFaces[i];
+                    v.AddPos(x, y, z);
+                    this.viewerFaces[i] = v;
+                }
+            }
         }
 
         /// <summary>
diff --git a/OpenSim/Region/Physics/Meshing/SculptMesh.cs b/OpenSim/Region/Physics/Meshing/SculptMesh.cs
index bf42fee..bd63aef 100644
--- a/OpenSim/Region/Physics/Meshing/SculptMesh.cs
+++ b/OpenSim/Region/Physics/Meshing/SculptMesh.cs
@@ -494,6 +494,18 @@ namespace PrimMesher
                 vert.Z += z;
                 this.coords[i] = vert;
             }
+
+            if (this.viewerFaces != null)
+            {
+                int numViewerFaces = this.viewerFaces.Count;
+
+                for (i = 0; i < numViewerFaces; i++)
+                {
+                    ViewerFace v = this.viewerFaces[i];
+                    v.AddPos(x, y, z);
+                    this.viewerFaces[i] = v;
+                }
+            }
         }
 
         /// <summary>
@@ -556,7 +568,7 @@ namespace PrimMesher
             if (path == null)
                 return;
             String fileName = name + "_" + title + ".raw";
-            String completePath = Path.Combine(path, fileName);
+            String completePath = System.IO.Path.Combine(path, fileName);
             StreamWriter sw = new StreamWriter(completePath);
 
             for (int i = 0; i < this.faces.Count; i++)
-- 
cgit v1.1


From 2bb513329ac98914ff13a2817aa83b60d85603d9 Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Fri, 25 Sep 2009 16:06:04 -0400
Subject: * Does a full battery of tests to ensure that the object isn't an
 attachment before border crossing * Fixes 'Inconsistent Attachment State'
 when teleporting into another region besides the SW most region slot on a
 MegaRegion. * Fixes a host of other unintended attachment border cross edge
 cases that lead to Inconsistent attachment state.

---
 OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs | 6 +++---
 OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs           | 7 ++++++-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
index 1436912..181c5ae 100644
--- a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
@@ -79,12 +79,12 @@ namespace OpenSim.Region.CoreModules.World.Land
         {
             if (!enabledYN)
                 return;
-
+/* 
             // For testing on a single instance
             if (scene.RegionInfo.RegionLocX == 1004 && scene.RegionInfo.RegionLocY == 1000)
                 return;
-            //
-
+            // 
+*/
             lock (m_startingScenes)
                 m_startingScenes.Add(scene.RegionInfo.originRegionID, scene);
 
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3c17bbe..ad5d56f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -245,6 +245,11 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
+        private bool IsAttachmentCheckFull()
+        {
+            return (IsAttachment || (m_rootPart.Shape.PCode == 9 && m_rootPart.Shape.State != 0));
+        }
+        
         /// <summary>
         /// The absolute position of this scene object in the scene
         /// </summary>
@@ -257,7 +262,7 @@ namespace OpenSim.Region.Framework.Scenes
 
                 if ((m_scene.TestBorderCross(val - Vector3.UnitX, Cardinals.E) || m_scene.TestBorderCross(val + Vector3.UnitX, Cardinals.W)
                     || m_scene.TestBorderCross(val - Vector3.UnitY, Cardinals.N) || m_scene.TestBorderCross(val + Vector3.UnitY, Cardinals.S)) 
-                    && !IsAttachment)
+                    && !IsAttachmentCheckFull())
                 {                                       
                     m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
                 }
-- 
cgit v1.1