diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index d39537dc8a..e237ca28a3 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -48,16 +48,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private IHypergridService m_HypergridService; - private IHypergridService HyperGridService - { - get - { - if (m_HypergridService == null) - m_HypergridService = m_aScene.RequestModuleInterface(); - return m_HypergridService; - } - } + private bool m_Initialized = false; private GatekeeperServiceConnector m_GatekeeperConnector; private IHomeUsersSecurityService m_Security; @@ -78,7 +69,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (name == Name) { m_agentsInTransit = new List(); - m_GatekeeperConnector = new GatekeeperServiceConnector(); IConfig config = source.Configs["HGEntityTransferModule"]; if (config != null) @@ -108,6 +98,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer scene.RegisterModuleInterface(m_Security); } + public override void RegionLoaded(Scene scene) + { + base.RegionLoaded(scene); + if (m_Enabled) + if (!m_Initialized) + { + m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); + m_Initialized = true; + } + + } public override void RemoveRegion(Scene scene) { base.AddRegion(scene); @@ -122,7 +123,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected override GridRegion GetFinalDestination(GridRegion region) { - return HyperGridService.GetHyperlinkRegion(region, region.RegionID); + int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, region.RegionID); + if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) + { + return m_GatekeeperConnector.GetHyperlinkRegion(region, region.RegionID); + } + return region; } protected override bool NeedsClosing(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) @@ -133,13 +139,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) { reason = string.Empty; - if (reg.RegionLocX != finalDestination.RegionLocX || reg.RegionLocY != finalDestination.RegionLocY) + int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); + if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) { // this user is going to another grid - reg.RegionName = finalDestination.RegionName; - reg.RegionID = finalDestination.RegionID; - reg.RegionLocX = finalDestination.RegionLocX; - reg.RegionLocY = finalDestination.RegionLocY; + // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination + GridRegion region = new GridRegion(reg); + region.RegionName = finalDestination.RegionName; + region.RegionID = finalDestination.RegionID; + region.RegionLocX = finalDestination.RegionLocX; + region.RegionLocY = finalDestination.RegionLocY; // Log their session and remote endpoint in the home users security service IHomeUsersSecurityService security = sp.Scene.RequestModuleInterface(); @@ -149,7 +158,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Log them out of this grid sp.Scene.PresenceService.LogoutAgent(agentCircuit.SessionID, sp.AbsolutePosition, sp.Lookat); - return m_GatekeeperConnector.CreateAgent(reg, agentCircuit, teleportFlags, out reason); + return m_GatekeeperConnector.CreateAgent(region, agentCircuit, teleportFlags, out reason); } return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs index 07f3cdc103..67eae87ea4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs @@ -48,7 +48,7 @@ using Nini.Config; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { - public class HGGridConnector : ISharedRegionModule, IGridService, IHypergridService + public class HGGridConnector : ISharedRegionModule, IGridService { private static readonly ILog m_log = LogManager.GetLogger( @@ -61,8 +61,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid private Dictionary m_LocalScenes = new Dictionary(); private IGridService m_GridServiceConnector; - private IHypergridService m_HypergridService; - #region ISharedRegionModule @@ -119,16 +117,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid Object[] args = new Object[] { source }; m_GridServiceConnector = ServerUtils.LoadPlugin(module, args); - string hypergrid = gridConfig.GetString("HypergridService", string.Empty); - if (hypergrid == String.Empty) - { - m_log.Error("[HGGRID CONNECTOR]: No HypergridService named in section GridService"); - throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); - } - m_HypergridService = ServerUtils.LoadPlugin(hypergrid, args); - - if (m_GridServiceConnector == null || m_HypergridService == null) - throw new Exception("Unable to proceed. HGGrid services could not be loaded."); } public void PostInitialise() @@ -148,7 +136,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid m_LocalScenes[scene.RegionInfo.RegionHandle] = scene; scene.RegisterModuleInterface(this); - scene.RegisterModuleInterface(this); ((ISharedRegionModule)m_GridServiceConnector).AddRegion(scene); @@ -160,7 +147,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid { m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); scene.UnregisterModuleInterface(this); - scene.UnregisterModuleInterface(this); ((ISharedRegionModule)m_GridServiceConnector).RemoveRegion(scene); } } @@ -201,13 +187,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) { - GridRegion region = m_GridServiceConnector.GetRegionByUUID(scopeID, regionID); - if (region != null) - return region; + return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID); + //if (region != null) + // return region; - region = m_HypergridService.GetRegionByUUID(regionID); + //region = m_HypergridService.GetRegionByUUID(regionID); - return region; + //return region; } public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) @@ -216,10 +202,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid int snapY = (int) (y / Constants.RegionSize) * (int)Constants.RegionSize; GridRegion region = m_GridServiceConnector.GetRegionByPosition(scopeID, x, y); - if (region != null) - return region; + //if (region != null) + // return region; - region = m_HypergridService.GetRegionByPosition(snapX, snapY); + //region = m_HypergridService.GetRegionByPosition(snapX, snapY); return region; } @@ -231,7 +217,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (region != null) return region; - region = m_HypergridService.GetRegionByName(regionName); + //region = m_HypergridService.GetRegionByName(regionName); return region; } @@ -241,27 +227,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid if (name == string.Empty) return new List(); - List rinfos = m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber); - - rinfos.AddRange(m_HypergridService.GetRegionsByName(name)); - if (rinfos.Count > maxNumber) - rinfos.RemoveRange(maxNumber - 1, rinfos.Count - maxNumber); - - return rinfos; + return m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber); } public List 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 rinfos = m_GridServiceConnector.GetRegionRange(scopeID, xmin, xmax, ymin, ymax); - - rinfos.AddRange(m_HypergridService.GetRegionRange(snapXmin, snapXmax, snapYmin, snapYmax)); - - return rinfos; + return m_GridServiceConnector.GetRegionRange(scopeID, xmin, xmax, ymin, ymax); } public List GetDefaultRegions(UUID scopeID) @@ -281,27 +252,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid #endregion - #region IHypergridService - public bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason) - { - return m_HypergridService.LinkRegion(regionDescriptor, out regionID, out regionHandle, out imageURL, out reason); - } - - public GridRegion GetHyperlinkRegion(GridRegion gateway, UUID regionID) - { - if (m_LocalScenes.ContainsKey(gateway.RegionHandle)) - return gateway; - - return m_HypergridService.GetHyperlinkRegion(gateway, regionID); - } - - public GridRegion GetRegionByUUID(UUID regionID) { return null; } - public GridRegion GetRegionByPosition(int x, int y) { return null; } - public GridRegion GetRegionByName(string name) { return null; } - public List GetRegionsByName(string name) { return null; } - public List GetRegionRange(int xmin, int xmax, int ymin, int ymax) { return null; } - - #endregion } } diff --git a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs index 940ec7a32d..c73b11090a 100644 --- a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs @@ -51,8 +51,6 @@ namespace OpenSim.Server.Handlers.Hypergrid get { return m_GatekeeperService; } } - private IHypergridService m_HypergridService; - public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server, ISimulationService simService) : base(config, server, String.Empty) { @@ -63,16 +61,12 @@ namespace OpenSim.Server.Handlers.Hypergrid Object[] args = new Object[] { config, simService }; m_GatekeeperService = ServerUtils.LoadPlugin(serviceDll, args); - serviceDll = gridConfig.GetString("HypergridService", string.Empty); - m_HypergridService = ServerUtils.LoadPlugin(serviceDll, args); - } - if (m_GatekeeperService == null || m_HypergridService == null) + if (m_GatekeeperService == null) throw new Exception("Gatekeeper server connector cannot proceed because of missing service"); - HypergridHandlers hghandlers = new HypergridHandlers(m_GatekeeperService, m_HypergridService); + HypergridHandlers hghandlers = new HypergridHandlers(m_GatekeeperService); server.AddXmlRPCHandler("link_region", hghandlers.LinkRegionRequest, false); - server.AddXmlRPCHandler("link_region_by_desc", hghandlers.LinkRegionByDescRequest, false); server.AddXmlRPCHandler("get_region", hghandlers.GetRegion, false); server.AddXmlRPCHandler("get_home_region", hghandlers.GetHomeRegion, false); diff --git a/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs index 1d711a867e..846d1c2f18 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs @@ -44,12 +44,10 @@ namespace OpenSim.Server.Handlers.Hypergrid private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IGatekeeperService m_GatekeeperService; - private IHypergridService m_HypergridService; - public HypergridHandlers(IGatekeeperService gatekeeper, IHypergridService hyper) + public HypergridHandlers(IGatekeeperService gatekeeper) { m_GatekeeperService = gatekeeper; - m_HypergridService = hyper; } /// @@ -82,36 +80,6 @@ namespace OpenSim.Server.Handlers.Hypergrid return response; } - /// - /// A local region wants to establish a grid-wide hyperlink to another region - /// - /// - /// - public XmlRpcResponse LinkRegionByDescRequest(XmlRpcRequest request, IPEndPoint remoteClient) - { - Hashtable requestData = (Hashtable)request.Params[0]; - //string host = (string)requestData["host"]; - //string portstr = (string)requestData["port"]; - string descriptor = (string)requestData["region_desc"]; - - UUID regionID = UUID.Zero; - string imageURL = string.Empty; - ulong regionHandle = 0; - string reason = string.Empty; - - bool success = m_HypergridService.LinkRegion(descriptor, out regionID, out regionHandle, out imageURL, out reason); - - Hashtable hash = new Hashtable(); - hash["result"] = success.ToString(); - hash["uuid"] = regionID.ToString(); - hash["handle"] = regionHandle.ToString(); - hash["region_image"] = imageURL; - - XmlRpcResponse response = new XmlRpcResponse(); - response.Value = hash; - return response; - } - public XmlRpcResponse GetRegion(XmlRpcRequest request, IPEndPoint remoteClient) { Hashtable requestData = (Hashtable)request.Params[0]; diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index a8d92920c5..ae0a0b6d19 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -1,13 +1,18 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Drawing; using System.Net; +using System.Reflection; +using OpenSim.Framework; using OpenSim.Services.Interfaces; using GridRegion = OpenSim.Services.Interfaces.GridRegion; using OpenMetaverse; +using OpenMetaverse.Imaging; using Nwc.XmlRpc; +using log4net; using OpenSim.Services.Connectors.Simulation; @@ -15,6 +20,21 @@ namespace OpenSim.Services.Connectors.Hypergrid { public class GatekeeperServiceConnector : SimulationServiceConnector { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private static UUID m_HGMapImage = new UUID("00000000-0000-1111-9999-000000000013"); + + private IAssetService m_AssetService; + + public GatekeeperServiceConnector() : base() + { + } + + public GatekeeperServiceConnector(IAssetService assService) + { + m_AssetService = assService; + } + protected override string AgentPath() { return "/foreignagent/"; @@ -25,6 +45,201 @@ namespace OpenSim.Services.Connectors.Hypergrid return "/foreignobject/"; } + public bool LinkRegion(GridRegion info, out UUID regionID, out ulong realHandle, out string imageURL, out string reason) + { + regionID = UUID.Zero; + imageURL = string.Empty; + realHandle = 0; + reason = string.Empty; + + 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("[GATEKEEPER SERVICE CONNECTOR]: Linking to " + uri); + XmlRpcResponse response = null; + try + { + response = request.Send(uri, 10000); + } + catch (Exception e) + { + m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Exception " + e.Message); + reason = "Error contacting remote server"; + return false; + } + + if (response.IsFault) + { + reason = response.FaultString; + m_log.ErrorFormat("[GATEKEEPER SERVICE CONNECTOR]: remote call returned an error: {0}", response.FaultString); + return false; + } + + hash = (Hashtable)response.Value; + //foreach (Object o in hash) + // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); + try + { + bool success = false; + Boolean.TryParse((string)hash["result"], out success); + if (success) + { + UUID.TryParse((string)hash["uuid"], out regionID); + //m_log.Debug(">> HERE, uuid: " + uuid); + if ((string)hash["handle"] != null) + { + realHandle = Convert.ToUInt64((string)hash["handle"]); + //m_log.Debug(">> HERE, realHandle: " + realHandle); + } + if (hash["region_image"] != null) + { + imageURL = (string)hash["region_image"]; + } + } + + } + catch (Exception e) + { + reason = "Error parsing return arguments"; + m_log.Error("[GATEKEEPER SERVICE CONNECTOR]: Got exception while parsing hyperlink response " + e.StackTrace); + return false; + } + + return true; + } + + UUID m_MissingTexture = new UUID("5748decc-f629-461c-9a36-a35a221fe21f"); + + public UUID GetMapImage(UUID regionID, string imageURL) + { + if (m_AssetService == null) + return m_MissingTexture; + + try + { + + WebClient c = new WebClient(); + //m_log.Debug("JPEG: " + imageURL); + string filename = regionID.ToString(); + c.DownloadFile(imageURL, filename + ".jpg"); + Bitmap m = new Bitmap(filename + ".jpg"); + //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); + byte[] imageData = OpenJPEG.EncodeFromImage(m, true); + AssetBase ass = new AssetBase(UUID.Random(), "region " + filename, (sbyte)AssetType.Texture); + + // !!! for now + //info.RegionSettings.TerrainImageID = ass.FullID; + + ass.Temporary = true; + ass.Local = true; + ass.Data = imageData; + + m_AssetService.Store(ass); + + // finally + return ass.FullID; + + } + catch // LEGIT: Catching problems caused by OpenJPEG p/invoke + { + m_log.Warn("[GATEKEEPER SERVICE CONNECTOR]: Failed getting/storing map image, because it is probably already in the cache"); + } + return UUID.Zero; + } + + public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID) + { + Hashtable hash = new Hashtable(); + hash["region_uuid"] = regionID.ToString(); + + IList paramList = new ArrayList(); + paramList.Add(hash); + + XmlRpcRequest request = new XmlRpcRequest("get_region", paramList); + string uri = "http://" + gatekeeper.ExternalEndPoint.Address + ":" + gatekeeper.HttpPort + "/"; + m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: contacting " + uri); + XmlRpcResponse response = null; + try + { + response = request.Send(uri, 10000); + } + catch (Exception e) + { + m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Exception " + e.Message); + return null; + } + + if (response.IsFault) + { + m_log.ErrorFormat("[GATEKEEPER SERVICE CONNECTOR]: remote call returned an error: {0}", response.FaultString); + return null; + } + + hash = (Hashtable)response.Value; + //foreach (Object o in hash) + // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); + try + { + bool success = false; + Boolean.TryParse((string)hash["result"], out success); + if (success) + { + GridRegion region = new GridRegion(); + + UUID.TryParse((string)hash["uuid"], out region.RegionID); + //m_log.Debug(">> HERE, uuid: " + region.RegionID); + int n = 0; + if (hash["x"] != null) + { + Int32.TryParse((string)hash["x"], out n); + region.RegionLocX = n; + //m_log.Debug(">> HERE, x: " + region.RegionLocX); + } + if (hash["y"] != null) + { + Int32.TryParse((string)hash["y"], out n); + region.RegionLocY = n; + //m_log.Debug(">> HERE, y: " + region.RegionLocY); + } + if (hash["region_name"] != null) + { + region.RegionName = (string)hash["region_name"]; + //m_log.Debug(">> HERE, name: " + region.RegionName); + } + if (hash["hostname"] != null) + region.ExternalHostName = (string)hash["hostname"]; + if (hash["http_port"] != null) + { + uint p = 0; + UInt32.TryParse((string)hash["http_port"], out p); + region.HttpPort = p; + } + if (hash["internal_port"] != null) + { + int p = 0; + Int32.TryParse((string)hash["internal_port"], out p); + region.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), p); + } + + // Successful return + return region; + } + + } + catch (Exception e) + { + m_log.Error("[GATEKEEPER SERVICE CONNECTOR]: Got exception while parsing hyperlink response " + e.StackTrace); + return null; + } + + return null; + } + public GridRegion GetHomeRegion(GridRegion gatekeeper, UUID userID, out Vector3 position, out Vector3 lookAt) { position = Vector3.UnitY; lookAt = Vector3.UnitY; diff --git a/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs deleted file mode 100644 index 1786d38a42..0000000000 --- a/OpenSim/Services/Connectors/Hypergrid/HypergridServiceConnector.cs +++ /dev/null @@ -1,354 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Net; -using System.Reflection; -using OpenSim.Services.Interfaces; -using GridRegion = OpenSim.Services.Interfaces.GridRegion; - -using OpenSim.Framework; - -using OpenMetaverse; -using OpenMetaverse.Imaging; -using log4net; -using Nwc.XmlRpc; -using Nini.Config; - -namespace OpenSim.Services.Connectors.Hypergrid -{ - public class HypergridServiceConnector : IHypergridService - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private IAssetService m_AssetService; - private string m_ServerURL; - - public HypergridServiceConnector() { } - - public HypergridServiceConnector(IAssetService assService) - { - m_AssetService = assService; - } - - public HypergridServiceConnector(IConfigSource source) - { - Initialise(source); - } - - public virtual void Initialise(IConfigSource source) - { - IConfig hgConfig = source.Configs["HypergridService"]; - if (hgConfig == null) - { - m_log.Error("[HYPERGRID CONNECTOR]: HypergridService missing from OpenSim.ini"); - throw new Exception("Hypergrid connector init error"); - } - - string serviceURI = hgConfig.GetString("HypergridServerURI", - String.Empty); - - if (serviceURI == String.Empty) - { - m_log.Error("[HYPERGRID CONNECTOR]: No Server URI named in section HypergridService"); - throw new Exception("Hypergrid connector init error"); - } - m_ServerURL = serviceURI; - } - - public bool LinkRegion(GridRegion info, out UUID regionID, out ulong realHandle, out string imageURL, out string reason) - { - regionID = UUID.Zero; - imageURL = string.Empty; - realHandle = 0; - reason = string.Empty; - - 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 = null; - try - { - response = request.Send(uri, 10000); - } - catch (Exception e) - { - m_log.Debug("[HGrid]: Exception " + e.Message); - reason = "Error contacting remote server"; - return false; - } - - if (response.IsFault) - { - reason = response.FaultString; - m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString); - return false; - } - - hash = (Hashtable)response.Value; - //foreach (Object o in hash) - // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); - try - { - bool success = false; - Boolean.TryParse((string)hash["result"], out success); - if (success) - { - UUID.TryParse((string)hash["uuid"], out regionID); - //m_log.Debug(">> HERE, uuid: " + uuid); - if ((string)hash["handle"] != null) - { - realHandle = Convert.ToUInt64((string)hash["handle"]); - //m_log.Debug(">> HERE, realHandle: " + realHandle); - } - if (hash["region_image"] != null) - { - imageURL = (string)hash["region_image"]; - } - } - - } - catch (Exception e) - { - reason = "Error parsing return arguments"; - m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace); - return false; - } - - return true; - } - - public UUID GetMapImage(UUID regionID, string imageURL) - { - try - { - - WebClient c = new WebClient(); - //m_log.Debug("JPEG: " + uri); - string filename = regionID.ToString(); - c.DownloadFile(imageURL, filename + ".jpg"); - Bitmap m = new Bitmap(filename + ".jpg"); - //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); - byte[] imageData = OpenJPEG.EncodeFromImage(m, true); - AssetBase ass = new AssetBase(UUID.Random(), "region " + filename, (sbyte)AssetType.Texture); - - // !!! for now - //info.RegionSettings.TerrainImageID = ass.FullID; - - ass.Temporary = true; - ass.Local = true; - ass.Data = imageData; - - m_AssetService.Store(ass); - - // finally - return ass.FullID; - - } - 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"); - } - return UUID.Zero; - } - - public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID) - { - Hashtable hash = new Hashtable(); - hash["region_uuid"] = regionID.ToString(); - - IList paramList = new ArrayList(); - paramList.Add(hash); - - XmlRpcRequest request = new XmlRpcRequest("get_region", paramList); - string uri = "http://" + gatekeeper.ExternalEndPoint.Address + ":" + gatekeeper.HttpPort + "/"; - m_log.Debug("[HGrid]: contacting " + uri); - XmlRpcResponse response = null; - try - { - response = request.Send(uri, 10000); - } - catch (Exception e) - { - m_log.Debug("[HGrid]: Exception " + e.Message); - return null; - } - - if (response.IsFault) - { - m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString); - return null; - } - - hash = (Hashtable)response.Value; - //foreach (Object o in hash) - // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); - try - { - bool success = false; - Boolean.TryParse((string)hash["result"], out success); - if (success) - { - GridRegion region = new GridRegion(); - - UUID.TryParse((string)hash["uuid"], out region.RegionID); - //m_log.Debug(">> HERE, uuid: " + region.RegionID); - int n = 0; - if (hash["x"] != null) - { - Int32.TryParse((string)hash["x"], out n); - region.RegionLocX = n; - //m_log.Debug(">> HERE, x: " + region.RegionLocX); - } - if (hash["y"] != null) - { - Int32.TryParse((string)hash["y"], out n); - region.RegionLocY = n; - //m_log.Debug(">> HERE, y: " + region.RegionLocY); - } - if (hash["region_name"] != null) - { - region.RegionName = (string)hash["region_name"]; - //m_log.Debug(">> HERE, name: " + region.RegionName); - } - if (hash["hostname"] != null) - region.ExternalHostName = (string)hash["hostname"]; - if (hash["http_port"] != null) - { - uint p = 0; - UInt32.TryParse((string)hash["http_port"], out p); - region.HttpPort = p; - } - if (hash["internal_port"] != null) - { - int p = 0; - Int32.TryParse((string)hash["internal_port"], out p); - region.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), p); - } - - // Successful return - return region; - } - - } - catch (Exception e) - { - m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace); - return null; - } - - return null; - } - - #region From local regions to grid-wide hypergrid service - - public bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong realHandle, out string imageURL, out string reason) - { - regionID = UUID.Zero; - imageURL = string.Empty; - realHandle = 0; - reason = string.Empty; - - Hashtable hash = new Hashtable(); - hash["region_desc"] = regionDescriptor; - - IList paramList = new ArrayList(); - paramList.Add(hash); - - XmlRpcRequest request = new XmlRpcRequest("link_region_by_desc", paramList); - XmlRpcResponse response = null; - try - { - response = request.Send(m_ServerURL, 10000); - } - catch (Exception e) - { - m_log.Debug("[HGrid]: Exception " + e.Message); - reason = "Error contacting remote server"; - return false; - } - - if (response.IsFault) - { - reason = response.FaultString; - m_log.ErrorFormat("[HGrid]: remote call returned an error: {0}", response.FaultString); - return false; - } - - hash = (Hashtable)response.Value; - //foreach (Object o in hash) - // m_log.Debug(">> " + ((DictionaryEntry)o).Key + ":" + ((DictionaryEntry)o).Value); - try - { - bool success = false; - Boolean.TryParse((string)hash["result"], out success); - if (success) - { - UUID.TryParse((string)hash["uuid"], out regionID); - //m_log.Debug(">> HERE, uuid: " + uuid); - if ((string)hash["handle"] != null) - { - realHandle = Convert.ToUInt64((string)hash["handle"]); - //m_log.Debug(">> HERE, realHandle: " + realHandle); - } - if (hash["region_image"] != null) - { - imageURL = (string)hash["region_image"]; - } - } - - } - catch (Exception e) - { - reason = "Error parsing return arguments"; - m_log.Error("[HGrid]: Got exception while parsing hyperlink response " + e.StackTrace); - return false; - } - - return true; - } - - // TODO !!! - public GridRegion GetRegionByUUID(UUID regionID) { return null; } - public GridRegion GetRegionByPosition(int x, int y) { return null; } - public GridRegion GetRegionByName(string name) { return null; } - public List GetRegionsByName(string name) { return null; } - public List GetRegionRange(int xmin, int xmax, int ymin, int ymax) { return null; } - - #endregion - } -} diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs index 9e0790cf0e..ae29a741bd 100644 --- a/OpenSim/Services/GridService/GridService.cs +++ b/OpenSim/Services/GridService/GridService.cs @@ -50,6 +50,7 @@ namespace OpenSim.Services.GridService private bool m_DeleteOnUnregister = true; private static GridService m_RootInstance = null; protected IConfigSource m_config; + protected HypergridLinker m_HypergridLinker; protected IAuthenticationService m_AuthenticationService = null; protected bool m_AllowDuplicateNames = false; @@ -92,6 +93,8 @@ namespace OpenSim.Services.GridService "Set database flags for region", String.Empty, HandleSetFlags); + + m_HypergridLinker = new HypergridLinker(m_config, this, m_Database); } } @@ -346,7 +349,7 @@ namespace OpenSim.Services.GridService #region Data structure conversions - protected RegionData RegionInfo2RegionData(GridRegion rinfo) + public RegionData RegionInfo2RegionData(GridRegion rinfo) { RegionData rdata = new RegionData(); rdata.posX = (int)rinfo.RegionLocX; @@ -359,7 +362,7 @@ namespace OpenSim.Services.GridService return rdata; } - protected GridRegion RegionData2RegionInfo(RegionData rdata) + public GridRegion RegionData2RegionInfo(RegionData rdata) { GridRegion rinfo = new GridRegion(rdata.Data); rinfo.RegionLocX = rdata.posX; diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs new file mode 100644 index 0000000000..b0cf723e3c --- /dev/null +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -0,0 +1,614 @@ +/* + * 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.Net; +using System.Reflection; +using System.Xml; + +using Nini.Config; +using log4net; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Data; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Connectors.Hypergrid; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using OpenMetaverse; + +namespace OpenSim.Services.GridService +{ + public class HypergridLinker + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private static UUID m_HGMapImage = new UUID("00000000-0000-1111-9999-000000000013"); + + private static uint m_autoMappingX = 0; + private static uint m_autoMappingY = 0; + private static bool m_enableAutoMapping = false; + + protected IRegionData m_Database; + protected GridService m_GridService; + protected IAssetService m_AssetService; + protected GatekeeperServiceConnector m_GatekeeperConnector; + + protected UUID m_ScopeID = UUID.Zero; + + // Hyperlink regions are hyperlinks on the map + public readonly Dictionary m_HyperlinkRegions = new Dictionary(); + protected Dictionary m_HyperlinkHandles = new Dictionary(); + + protected GridRegion m_DefaultRegion; + protected GridRegion DefaultRegion + { + get + { + if (m_DefaultRegion == null) + { + List defs = m_GridService.GetDefaultRegions(m_ScopeID); + if (defs != null && defs.Count > 0) + m_DefaultRegion = defs[0]; + else + { + // Best guess, may be totally off + m_DefaultRegion = new GridRegion(1000, 1000); + m_log.WarnFormat("[HYPERGRID LINKER]: This grid does not have a default region. Assuming default coordinates at 1000, 1000."); + } + } + return m_DefaultRegion; + } + } + + public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db) + { + m_log.DebugFormat("[HYPERGRID LINKER]: Starting..."); + + m_Database = db; + m_GridService = gridService; + + IConfig gridConfig = config.Configs["GridService"]; + if (gridConfig != null) + { + string assetService = gridConfig.GetString("AssetService", string.Empty); + + Object[] args = new Object[] { config }; + + if (assetService != string.Empty) + m_AssetService = ServerUtils.LoadPlugin(assetService, args); + + string scope = gridConfig.GetString("ScopeID", string.Empty); + if (scope != string.Empty) + UUID.TryParse(scope, out m_ScopeID); + + m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); + + m_log.DebugFormat("[HYPERGRID LINKER]: Loaded all services..."); + } + + + MainConsole.Instance.Commands.AddCommand("hypergrid", false, "link-region", + "link-region :[:] ", + "Link a hypergrid region", RunCommand); + MainConsole.Instance.Commands.AddCommand("hypergrid", false, "unlink-region", + "unlink-region or : ", + "Unlink a hypergrid region", RunCommand); + MainConsole.Instance.Commands.AddCommand("hypergrid", false, "link-mapping", "link-mapping [ ] ", + "Set local coordinate to map HG regions to", RunCommand); + MainConsole.Instance.Commands.AddCommand("hypergrid", false, "show hyperlinks", "show hyperlinks ", + "List the HG regions", HandleShow); + } + + + #region Link Region + + public bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason) + { + regionID = UUID.Zero; + imageURL = string.Empty; + regionHandle = 0; + reason = string.Empty; + int xloc = random.Next(0, Int16.MaxValue) * (int)Constants.RegionSize; + GridRegion region = TryLinkRegionToCoords(regionDescriptor, xloc, 0, out reason); + if (region == null) + return false; + + regionID = region.RegionID; + regionHandle = region.RegionHandle; + return true; + } + + private static Random random = new Random(); + + // From the command line link-region + public GridRegion TryLinkRegionToCoords(string mapName, int xloc, int yloc, out string reason) + { + reason = string.Empty; + 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]; + //m_log.Debug("-- port = " + portstr); + 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 { } + + GridRegion regInfo; + bool success = TryCreateLink(xloc, yloc, regionName, port, host, out regInfo, out reason); + if (success) + { + regInfo.RegionName = mapName; + return regInfo; + } + + return null; + } + + + // From the command line and the 2 above + public bool TryCreateLink(int xloc, int yloc, + string externalRegionName, uint externalPort, string externalHostName, out GridRegion regInfo, out string reason) + { + m_log.DebugFormat("[HYPERGRID LINKER]: Link to {0}:{1}, in {2}-{3}", externalHostName, externalPort, xloc, yloc); + + reason = string.Empty; + regInfo = new GridRegion(); + 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("[HYPERGRID LINKER]: Wrong format for link-region: " + e.Message); + reason = "Internal error"; + return false; + } + + // Finally, link it + ulong handle = 0; + UUID regionID = UUID.Zero; + string imageURL = string.Empty; + if (!m_GatekeeperConnector.LinkRegion(regInfo, out regionID, out handle, out imageURL, out reason)) + return false; + + if (regionID != UUID.Zero) + { + regInfo.RegionID = regionID; + // Try get the map image + regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL); + // I need a texture that works for this... the one I tried doesn't seem to be working + //regInfo.TerrainImage = m_HGMapImage; + + AddHyperlinkRegion(regInfo, handle); + m_log.Info("[HYPERGRID LINKER]: Successfully linked to region_uuid " + regInfo.RegionID); + + } + else + { + m_log.Warn("[HYPERGRID LINKER]: Unable to link region"); + reason = "Remote region could not be found"; + return false; + } + + uint x, y; + if (!Check4096(handle, out x, out y)) + { + RemoveHyperlinkRegion(regInfo.RegionID); + reason = "Region is too far (" + x + ", " + y + ")"; + m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")"); + return false; + } + + m_log.Debug("[HYPERGRID LINKER]: link region succeeded"); + return true; + } + + public bool TryUnlinkRegion(string mapName) + { + GridRegion 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]; + } + + foreach (GridRegion r in m_HyperlinkRegions.Values) + if (host.Equals(r.ExternalHostName) && (port == r.HttpPort)) + regInfo = r; + } + else + { + foreach (GridRegion r in m_HyperlinkRegions.Values) + if (r.RegionName.Equals(mapName)) + regInfo = r; + } + if (regInfo != null) + { + RemoveHyperlinkRegion(regInfo.RegionID); + return true; + } + else + { + m_log.InfoFormat("[HYPERGRID LINKER]: Region {0} not found", mapName); + return false; + } + } + + /// + /// Cope with this viewer limitation. + /// + /// + /// + public bool Check4096(ulong realHandle, out uint x, out uint y) + { + GridRegion defRegion = DefaultRegion; + + uint ux = 0, uy = 0; + Utils.LongToUInts(realHandle, out ux, out uy); + x = ux / Constants.RegionSize; + y = uy / Constants.RegionSize; + + if ((Math.Abs((int)defRegion.RegionLocX - ux) >= 4096 * Constants.RegionSize) || + (Math.Abs((int)defRegion.RegionLocY - uy) >= 4096 * Constants.RegionSize)) + { + return false; + } + return true; + } + + private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) + { + //m_HyperlinkRegions[regionInfo.RegionID] = regionInfo; + //m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; + + RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo); + int flags = (int)OpenSim.Data.RegionFlags.Hyperlink + (int)OpenSim.Data.RegionFlags.NoDirectLogin + (int)OpenSim.Data.RegionFlags.RegionOnline; + rdata.Data["flags"] = flags.ToString(); + + m_Database.Store(rdata); + + } + + private void RemoveHyperlinkRegion(UUID regionID) + { + //// Try the hyperlink collection + //if (m_HyperlinkRegions.ContainsKey(regionID)) + //{ + // m_HyperlinkRegions.Remove(regionID); + // m_HyperlinkHandles.Remove(regionID); + //} + m_Database.Delete(regionID); + } + + #endregion + + + #region Console Commands + + public void HandleShow(string module, string[] cmd) + { + MainConsole.Instance.Output("Not Implemented Yet"); + //if (cmd.Length != 2) + //{ + // MainConsole.Instance.Output("Syntax: show hyperlinks"); + // return; + //} + //List regions = new List(m_HypergridService.m_HyperlinkRegions.Values); + //if (regions == null || regions.Count < 1) + //{ + // MainConsole.Instance.Output("No hyperlinks"); + // return; + //} + + //MainConsole.Instance.Output("Region Name Region UUID"); + //MainConsole.Instance.Output("Location URI"); + //MainConsole.Instance.Output("Owner ID "); + //MainConsole.Instance.Output("-------------------------------------------------------------------------------"); + //foreach (GridRegion r in regions) + //{ + // MainConsole.Instance.Output(String.Format("{0,-20} {1}\n{2,-20} {3}\n{4,-39} \n\n", + // r.RegionName, r.RegionID, + // String.Format("{0},{1}", r.RegionLocX, r.RegionLocY), "http://" + r.ExternalHostName + ":" + r.HttpPort.ToString(), + // r.EstateOwner.ToString())); + //} + //return; + } + public void RunCommand(string module, string[] cmdparams) + { + List args = new List(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 + int xloc, yloc; + string mapName; + try + { + 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++) + mapName += " " + cmdparams[i]; + + //m_log.Info(">> MapName: " + mapName); + } + catch (Exception e) + { + MainConsole.Instance.Output("[HGrid] Wrong format for link-region command: " + e.Message); + LinkRegionCmdUsage(); + return; + } + + // Convert cell coordinates given by the user to meters + xloc = xloc * (int)Constants.RegionSize; + yloc = yloc * (int)Constants.RegionSize; + string reason = string.Empty; + if (TryLinkRegionToCoords(mapName, xloc, yloc, out reason) == null) + MainConsole.Instance.Output("Failed to link region: " + reason); + MainConsole.Instance.Output("Hyperlink estalished"); + } + else + { + // old format + GridRegion regInfo; + int xloc, yloc; + uint externalPort; + string externalHostName; + try + { + xloc = Convert.ToInt32(cmdparams[0]); + yloc = Convert.ToInt32(cmdparams[1]); + externalPort = Convert.ToUInt32(cmdparams[3]); + externalHostName = cmdparams[2]; + //internalPort = Convert.ToUInt32(cmdparams[4]); + //remotingPort = Convert.ToUInt32(cmdparams[5]); + } + catch (Exception e) + { + MainConsole.Instance.Output("[HGrid] Wrong format for link-region command: " + e.Message); + LinkRegionCmdUsage(); + return; + } + + // Convert cell coordinates given by the user to meters + xloc = xloc * (int)Constants.RegionSize; + yloc = yloc * (int)Constants.RegionSize; + string reason = string.Empty; + if (TryCreateLink(xloc, yloc, "", externalPort, externalHostName, out regInfo, out reason)) + { + 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 (TryUnlinkRegion(cmdparams[0])) + MainConsole.Instance.Output("Successfully unlinked " + cmdparams[0]); + else + MainConsole.Instance.Output("Unable to unlink " + cmdparams[0] + ", region not found."); + } + } + + 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) + { + GridRegion regInfo; + int xloc, yloc; + uint externalPort; + string externalHostName; + uint realXLoc, realYLoc; + + 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")); + realYLoc = Convert.ToUInt32(config.GetString("real-yloc", "0")); + + if (m_enableAutoMapping) + { + 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; + string reason = string.Empty; + if (TryCreateLink(xloc, yloc, "", externalPort, + externalHostName, out regInfo, out reason)) + { + regInfo.RegionName = config.GetString("localName", ""); + } + else + MainConsole.Instance.Output("Unable to link " + externalHostName + ": " + reason); + } + } + + + private void LinkRegionCmdUsage() + { + MainConsole.Instance.Output("Usage: link-region :[:]"); + MainConsole.Instance.Output("Usage: link-region []"); + MainConsole.Instance.Output("Usage: link-region []"); + } + + private void UnlinkRegionCmdUsage() + { + MainConsole.Instance.Output("Usage: unlink-region :"); + MainConsole.Instance.Output("Usage: unlink-region "); + } + + #endregion + + } +} diff --git a/OpenSim/Services/HypergridService/HGCommands.cs b/OpenSim/Services/HypergridService/HGCommands.cs deleted file mode 100644 index 78ba46d6ab..0000000000 --- a/OpenSim/Services/HypergridService/HGCommands.cs +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.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.Services.Interfaces; -using GridRegion = OpenSim.Services.Interfaces.GridRegion; - -namespace OpenSim.Services.HypergridService -{ - public class HGCommands - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private HypergridService m_HypergridService; - - private static uint m_autoMappingX = 0; - private static uint m_autoMappingY = 0; - private static bool m_enableAutoMapping = false; - - public HGCommands(HypergridService service) - { - m_HypergridService = service; - } - - public void HandleShow(string module, string[] cmd) - { - if (cmd.Length != 2) - { - MainConsole.Instance.Output("Syntax: show hyperlinks"); - return; - } - List regions = new List(m_HypergridService.m_HyperlinkRegions.Values); - if (regions == null || regions.Count < 1) - { - MainConsole.Instance.Output("No hyperlinks"); - return; - } - - MainConsole.Instance.Output("Region Name Region UUID"); - MainConsole.Instance.Output("Location URI"); - MainConsole.Instance.Output("Owner ID "); - MainConsole.Instance.Output("-------------------------------------------------------------------------------"); - foreach (GridRegion r in regions) - { - MainConsole.Instance.Output(String.Format("{0,-20} {1}\n{2,-20} {3}\n{4,-39} \n\n", - r.RegionName, r.RegionID, - String.Format("{0},{1}", r.RegionLocX, r.RegionLocY), "http://" + r.ExternalHostName + ":" + r.HttpPort.ToString(), - r.EstateOwner.ToString())); - } - return; - } - public void RunCommand(string module, string[] cmdparams) - { - List args = new List(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 - int xloc, yloc; - string mapName; - try - { - 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++) - mapName += " " + cmdparams[i]; - - //m_log.Info(">> MapName: " + mapName); - } - catch (Exception e) - { - MainConsole.Instance.Output("[HGrid] Wrong format for link-region command: " + e.Message); - LinkRegionCmdUsage(); - return; - } - - // Convert cell coordinates given by the user to meters - xloc = xloc * (int)Constants.RegionSize; - yloc = yloc * (int)Constants.RegionSize; - string reason = string.Empty; - if (m_HypergridService.TryLinkRegionToCoords(mapName, xloc, yloc, out reason) == null) - MainConsole.Instance.Output("Failed to link region: " + reason); - MainConsole.Instance.Output("Hyperlink estalished"); - } - else - { - // old format - GridRegion regInfo; - int xloc, yloc; - uint externalPort; - string externalHostName; - try - { - xloc = Convert.ToInt32(cmdparams[0]); - yloc = Convert.ToInt32(cmdparams[1]); - externalPort = Convert.ToUInt32(cmdparams[3]); - externalHostName = cmdparams[2]; - //internalPort = Convert.ToUInt32(cmdparams[4]); - //remotingPort = Convert.ToUInt32(cmdparams[5]); - } - catch (Exception e) - { - MainConsole.Instance.Output("[HGrid] Wrong format for link-region command: " + e.Message); - LinkRegionCmdUsage(); - return; - } - - // Convert cell coordinates given by the user to meters - xloc = xloc * (int)Constants.RegionSize; - yloc = yloc * (int)Constants.RegionSize; - string reason = string.Empty; - if (m_HypergridService.TryCreateLink(xloc, yloc, "", externalPort, externalHostName, out regInfo, out reason)) - { - 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_HypergridService.TryUnlinkRegion(cmdparams[0])) - MainConsole.Instance.Output("Successfully unlinked " + cmdparams[0]); - else - MainConsole.Instance.Output("Unable to unlink " + cmdparams[0] + ", region not found."); - } - } - - 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) - { - GridRegion regInfo; - int xloc, yloc; - uint externalPort; - string externalHostName; - uint realXLoc, realYLoc; - - 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")); - realYLoc = Convert.ToUInt32(config.GetString("real-yloc", "0")); - - if (m_enableAutoMapping) - { - 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; - string reason = string.Empty; - if (m_HypergridService.TryCreateLink(xloc, yloc, "", externalPort, - externalHostName, out regInfo, out reason)) - { - regInfo.RegionName = config.GetString("localName", ""); - } - else - MainConsole.Instance.Output("Unable to link " + externalHostName + ": " + reason); - } - } - - - private void LinkRegionCmdUsage() - { - MainConsole.Instance.Output("Usage: link-region :[:]"); - MainConsole.Instance.Output("Usage: link-region []"); - MainConsole.Instance.Output("Usage: link-region []"); - } - - private void UnlinkRegionCmdUsage() - { - MainConsole.Instance.Output("Usage: unlink-region :"); - MainConsole.Instance.Output("Usage: unlink-region "); - } - - } -} diff --git a/OpenSim/Services/HypergridService/HypergridService.cs b/OpenSim/Services/HypergridService/HypergridService.cs deleted file mode 100644 index ac0f5ac1d9..0000000000 --- a/OpenSim/Services/HypergridService/HypergridService.cs +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Net; -using System.Reflection; -using Nini.Config; -using log4net; -using OpenSim.Framework; -using OpenSim.Framework.Console; -using OpenSim.Data; -using OpenSim.Server.Base; -using OpenSim.Services.Interfaces; -using OpenSim.Services.Connectors.Hypergrid; -using GridRegion = OpenSim.Services.Interfaces.GridRegion; -using OpenMetaverse; - -namespace OpenSim.Services.HypergridService -{ - public class HypergridService : HypergridServiceBase, IHypergridService - { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); - - private static HypergridService m_RootInstance = null; - protected IConfigSource m_config; - - protected IPresenceService m_PresenceService = null; - protected IGridService m_GridService; - protected IAssetService m_AssetService; - protected HypergridServiceConnector m_HypergridConnector; - - protected bool m_AllowDuplicateNames = false; - protected UUID m_ScopeID = UUID.Zero; - - // Hyperlink regions are hyperlinks on the map - public readonly Dictionary m_HyperlinkRegions = new Dictionary(); - protected Dictionary m_HyperlinkHandles = new Dictionary(); - - protected GridRegion m_DefaultRegion; - protected GridRegion DefaultRegion - { - get - { - if (m_DefaultRegion == null) - { - List defs = m_GridService.GetDefaultRegions(m_ScopeID); - if (defs != null && defs.Count > 0) - m_DefaultRegion = defs[0]; - else - { - // Best guess, may be totally off - m_DefaultRegion = new GridRegion(1000, 1000); - m_log.WarnFormat("[HYPERGRID SERVICE]: This grid does not have a default region. Assuming default coordinates at 1000, 1000."); - } - } - return m_DefaultRegion; - } - } - - public HypergridService(IConfigSource config) - : base(config) - { - m_log.DebugFormat("[HYPERGRID SERVICE]: Starting..."); - - m_config = config; - IConfig gridConfig = config.Configs["HypergridService"]; - if (gridConfig != null) - { - string gridService = gridConfig.GetString("GridService", string.Empty); - string presenceService = gridConfig.GetString("PresenceService", String.Empty); - string assetService = gridConfig.GetString("AssetService", string.Empty); - - Object[] args = new Object[] { config }; - if (gridService != string.Empty) - m_GridService = ServerUtils.LoadPlugin(gridService, args); - - if (m_GridService == null) - throw new Exception("HypergridService cannot function without a GridService"); - - if (presenceService != String.Empty) - m_PresenceService = ServerUtils.LoadPlugin(presenceService, args); - - if (assetService != string.Empty) - m_AssetService = ServerUtils.LoadPlugin(assetService, args); - - m_AllowDuplicateNames = gridConfig.GetBoolean("AllowDuplicateNames", m_AllowDuplicateNames); - - string scope = gridConfig.GetString("ScopeID", string.Empty); - if (scope != string.Empty) - UUID.TryParse(scope, out m_ScopeID); - - m_HypergridConnector = new HypergridServiceConnector(m_AssetService); - - m_log.DebugFormat("[HYPERGRID SERVICE]: Loaded all services..."); - } - - if (m_RootInstance == null) - { - m_RootInstance = this; - - HGCommands hgCommands = new HGCommands(this); - MainConsole.Instance.Commands.AddCommand("hypergrid", false, "link-region", - "link-region :[:] ", - "Link a hypergrid region", hgCommands.RunCommand); - MainConsole.Instance.Commands.AddCommand("hypergrid", false, "unlink-region", - "unlink-region or : ", - "Unlink a hypergrid region", hgCommands.RunCommand); - MainConsole.Instance.Commands.AddCommand("hypergrid", false, "link-mapping", "link-mapping [ ] ", - "Set local coordinate to map HG regions to", hgCommands.RunCommand); - MainConsole.Instance.Commands.AddCommand("hypergrid", false, "show hyperlinks", "show hyperlinks ", - "List the HG regions", hgCommands.HandleShow); - } - } - - #region Link Region - - public bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason) - { - regionID = UUID.Zero; - imageURL = string.Empty; - regionHandle = 0; - reason = string.Empty; - int xloc = random.Next(0, Int16.MaxValue) * (int)Constants.RegionSize; - GridRegion region = TryLinkRegionToCoords(regionDescriptor, xloc, 0, out reason); - if (region == null) - return false; - - regionID = region.RegionID; - regionHandle = region.RegionHandle; - return true; - } - - private static Random random = new Random(); - - // From the command line link-region - public GridRegion TryLinkRegionToCoords(string mapName, int xloc, int yloc, out string reason) - { - reason = string.Empty; - 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]; - //m_log.Debug("-- port = " + portstr); - 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 { } - - GridRegion regInfo; - bool success = TryCreateLink(xloc, yloc, regionName, port, host, out regInfo, out reason); - if (success) - { - regInfo.RegionName = mapName; - return regInfo; - } - - return null; - } - - - // From the command line and the 2 above - public bool TryCreateLink(int xloc, int yloc, - string externalRegionName, uint externalPort, string externalHostName, out GridRegion regInfo, out string reason) - { - m_log.DebugFormat("[HYPERGRID SERVICE]: Link to {0}:{1}, in {2}-{3}", externalHostName, externalPort, xloc, yloc); - - reason = string.Empty; - regInfo = new GridRegion(); - 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("[HYPERGRID SERVICE]: Wrong format for link-region: " + e.Message); - reason = "Internal error"; - return false; - } - - // Finally, link it - ulong handle = 0; - UUID regionID = UUID.Zero; - string imageURL = string.Empty; - if (!m_HypergridConnector.LinkRegion(regInfo, out regionID, out handle, out imageURL, out reason)) - return false; - - if (regionID != UUID.Zero) - { - regInfo.RegionID = regionID; - - AddHyperlinkRegion(regInfo, handle); - m_log.Info("[HYPERGRID SERVICE]: Successfully linked to region_uuid " + regInfo.RegionID); - - // Try get the map image - regInfo.TerrainImage = m_HypergridConnector.GetMapImage(regionID, imageURL); - } - else - { - m_log.Warn("[HYPERGRID SERVICE]: Unable to link region"); - reason = "Remote region could not be found"; - return false; - } - - uint x, y; - if (!Check4096(regInfo, out x, out y)) - { - RemoveHyperlinkRegion(regInfo.RegionID); - reason = "Region is too far (" + x + ", " + y + ")"; - m_log.Info("[HYPERGRID SERVICE]: Unable to link, region is too far (" + x + ", " + y + ")"); - return false; - } - - m_log.Debug("[HYPERGRID SERVICE]: link region succeeded"); - return true; - } - - public bool TryUnlinkRegion(string mapName) - { - GridRegion 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]; - } - - foreach (GridRegion r in m_HyperlinkRegions.Values) - if (host.Equals(r.ExternalHostName) && (port == r.HttpPort)) - regInfo = r; - } - else - { - foreach (GridRegion r in m_HyperlinkRegions.Values) - if (r.RegionName.Equals(mapName)) - regInfo = r; - } - if (regInfo != null) - { - RemoveHyperlinkRegion(regInfo.RegionID); - return true; - } - else - { - m_log.InfoFormat("[HYPERGRID SERVICE]: Region {0} not found", mapName); - return false; - } - } - - /// - /// Cope with this viewer limitation. - /// - /// - /// - public bool Check4096(GridRegion regInfo, out uint x, out uint y) - { - GridRegion defRegion = DefaultRegion; - - ulong realHandle = m_HyperlinkHandles[regInfo.RegionID]; - uint ux = 0, uy = 0; - Utils.LongToUInts(realHandle, out ux, out uy); - x = ux / Constants.RegionSize; - y = uy / Constants.RegionSize; - - if ((Math.Abs((int)defRegion.RegionLocX - ux) >= 4096 * Constants.RegionSize) || - (Math.Abs((int)defRegion.RegionLocY - uy) >= 4096 * Constants.RegionSize)) - { - return false; - } - return true; - } - - private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) - { - m_HyperlinkRegions[regionInfo.RegionID] = regionInfo; - m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; - } - - private void RemoveHyperlinkRegion(UUID regionID) - { - // Try the hyperlink collection - if (m_HyperlinkRegions.ContainsKey(regionID)) - { - m_HyperlinkRegions.Remove(regionID); - m_HyperlinkHandles.Remove(regionID); - } - } - - #endregion - - #region Get Hyperlinks - - public GridRegion GetHyperlinkRegion(GridRegion gatekeeper, UUID regionID) - { - if (m_HyperlinkRegions.ContainsKey(regionID)) - return m_HypergridConnector.GetHyperlinkRegion(gatekeeper, regionID); - else - return gatekeeper; - } - - #endregion - - #region GetRegionBy X - - public GridRegion GetRegionByUUID(UUID regionID) - { - if (m_HyperlinkRegions.ContainsKey(regionID)) - return m_HyperlinkRegions[regionID]; - - return null; - } - - public GridRegion GetRegionByPosition(int x, int y) - { - foreach (GridRegion r in m_HyperlinkRegions.Values) - if (r.RegionLocX == x && r.RegionLocY == y) - return r; - - return null; - } - - public GridRegion GetRegionByName(string name) - { - foreach (GridRegion r in m_HyperlinkRegions.Values) - if (r.RegionName.ToLower() == name.ToLower()) - return r; - - return null; - } - - public List GetRegionsByName(string name) - { - List regions = new List(); - - foreach (GridRegion r in m_HyperlinkRegions.Values) - if ((r.RegionName != null) && r.RegionName.ToLower().StartsWith(name.ToLower())) - regions.Add(r); - - return regions; - - } - - public List GetRegionRange(int xmin, int xmax, int ymin, int ymax) - { - List regions = new List(); - - foreach (GridRegion r in m_HyperlinkRegions.Values) - if ((r.RegionLocX > xmin) && (r.RegionLocX < xmax) && - (r.RegionLocY > ymin) && (r.RegionLocY < ymax)) - regions.Add(r); - - return regions; - } - - #endregion - - - - } -} diff --git a/OpenSim/Services/HypergridService/HypergridServiceBase.cs b/OpenSim/Services/HypergridService/HypergridServiceBase.cs deleted file mode 100644 index 4f91f646a6..0000000000 --- a/OpenSim/Services/HypergridService/HypergridServiceBase.cs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Reflection; -using Nini.Config; -using OpenSim.Framework; -using OpenSim.Data; -using OpenSim.Services.Interfaces; -using OpenSim.Services.Base; - -namespace OpenSim.Services.HypergridService -{ - public class HypergridServiceBase : ServiceBase - { - protected IRegionData m_Database = null; - - public HypergridServiceBase(IConfigSource config) - : base(config) - { - string dllName = String.Empty; - string connString = String.Empty; - string realm = "TBD"; - - // - // Try reading the [DatabaseService] section, if it exists - // - IConfig dbConfig = config.Configs["DatabaseService"]; - if (dbConfig != null) - { - if (dllName == String.Empty) - dllName = dbConfig.GetString("StorageProvider", String.Empty); - if (connString == String.Empty) - connString = dbConfig.GetString("ConnectionString", String.Empty); - } - - // - // [HypergridService] section overrides [DatabaseService], if it exists - // - IConfig gridConfig = config.Configs["HypergridService"]; - if (gridConfig != null) - { - dllName = gridConfig.GetString("StorageProvider", dllName); - connString = gridConfig.GetString("ConnectionString", connString); - realm = gridConfig.GetString("Realm", realm); - } - - //// - //// We tried, but this doesn't exist. We can't proceed. - //// - //if (dllName.Equals(String.Empty)) - // throw new Exception("No StorageProvider configured"); - - //m_Database = LoadPlugin(dllName, new Object[] { connString, realm }); - //if (m_Database == null) - // throw new Exception("Could not find a storage interface in the given module"); - - } - } -} diff --git a/OpenSim/Services/Interfaces/IHypergridService.cs b/OpenSim/Services/Interfaces/IHypergridService.cs deleted file mode 100644 index 86ef1b4198..0000000000 --- a/OpenSim/Services/Interfaces/IHypergridService.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Collections.Generic; -using OpenSim.Framework; -using GridRegion = OpenSim.Services.Interfaces.GridRegion; - -using OpenMetaverse; - -namespace OpenSim.Services.Interfaces -{ - public interface IHypergridService - { - bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason); - GridRegion GetHyperlinkRegion(GridRegion gateway, UUID regionID); - - GridRegion GetRegionByUUID(UUID regionID); - GridRegion GetRegionByPosition(int x, int y); - GridRegion GetRegionByName(string name); - List GetRegionsByName(string name); - List GetRegionRange(int xmin, int xmax, int ymin, int ymax); - - } - -} diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index 28b9d478d0..af502db188 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini @@ -65,7 +65,7 @@ [GridService] ; for the HGGridServicesConnector to instantiate GridServiceConnectorModule = "OpenSim.Region.CoreModules.dll:LocalGridServicesConnector" - HypergridService = "OpenSim.Services.HypergridService.dll:HypergridService" + AssetService = "OpenSim.Services.AssetService.dll:AssetService" ; LocalGridServicesConnector needs this LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" Realm = "regions" diff --git a/prebuild.xml b/prebuild.xml index a3b4a53de4..3ad1a2f6ee 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1047,6 +1047,7 @@ ../../../bin/ +