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/Services/Interfaces/IGridService.cs | 249 +++++++++++++++++++++++++++-
1 file changed, 240 insertions(+), 9 deletions(-)
(limited to 'OpenSim/Services/Interfaces')
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
///
///
/// Thrown if region registration failed
- bool RegisterRegion(UUID scopeID, SimpleRegionInfo regionInfos);
+ bool RegisterRegion(UUID scopeID, GridRegion regionInfos);
///
/// Deregister a region with the grid service.
@@ -55,9 +58,9 @@ namespace OpenSim.Services.Interfaces
///
///
///
- List GetNeighbours(UUID scopeID, UUID regionID);
+ List GetNeighbours(UUID scopeID, UUID regionID);
- SimpleRegionInfo GetRegionByUUID(UUID scopeID, UUID regionID);
+ GridRegion GetRegionByUUID(UUID scopeID, UUID regionID);
///
/// Get the region at the given position (in meters)
@@ -66,9 +69,9 @@ namespace OpenSim.Services.Interfaces
///
///
///
- 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);
///
/// Get information about regions starting with the provided name.
@@ -83,9 +86,237 @@ namespace OpenSim.Services.Interfaces
/// A list of s of regions with matching name. If the
/// grid-server couldn't be contacted or returned an error, return null.
///
- List GetRegionsByName(UUID scopeID, string name, int maxNumber);
+ List GetRegionsByName(UUID scopeID, string name, int maxNumber);
- List GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
+ List GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax);
}
+
+ public class GridRegion
+ {
+
+ ///
+ /// The port by which http communication occurs with the region
+ ///
+ public uint HttpPort
+ {
+ get { return m_httpPort; }
+ set { m_httpPort = value; }
+ }
+ protected uint m_httpPort;
+
+ ///
+ /// A well-formed URI for the host region server (namely "http://" + ExternalHostName)
+ ///
+ 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;
+ }
+
+
+ ///
+ /// 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?
+ ///
+ 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 ToKeyValuePairs()
+ {
+ Dictionary kvp = new Dictionary();
+ 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 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"];
+ }
+ }
+
}
--
cgit v1.1