2007-10-15 07:10:21 +00:00
/ *
2008-03-18 05:16:43 +00:00
* 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 OpenSim 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 .
* /
2007-10-15 07:10:21 +00:00
2007-07-16 15:40:11 +00:00
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.Net ;
2007-10-18 15:10:43 +00:00
using System.Net.Sockets ;
2008-04-21 07:09:17 +00:00
using System.Reflection ;
2007-07-16 15:40:11 +00:00
using System.Runtime.Remoting ;
using System.Runtime.Remoting.Channels ;
using System.Runtime.Remoting.Channels.Tcp ;
2007-10-18 15:10:43 +00:00
using System.Security.Authentication ;
2008-04-21 07:09:17 +00:00
using System.Threading ;
2007-07-16 15:40:11 +00:00
using libsecondlife ;
2008-04-21 07:09:17 +00:00
using log4net ;
2007-07-16 15:40:11 +00:00
using Nwc.XmlRpc ;
using OpenSim.Framework ;
using OpenSim.Framework.Communications ;
using OpenSim.Framework.Servers ;
2007-09-25 06:33:18 +00:00
using OpenSim.Region.Communications.Local ;
2007-07-16 15:40:11 +00:00
namespace OpenSim.Region.Communications.OGS1
{
public class OGS1GridServices : IGridServices , IInterRegionCommunications
{
2008-04-21 07:09:17 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2008-02-05 19:44:27 +00:00
2007-09-25 06:33:18 +00:00
private LocalBackEndServices m_localBackend = new LocalBackEndServices ( ) ;
2007-10-22 17:55:49 +00:00
private Dictionary < ulong , RegionInfo > m_remoteRegionInfoCache = new Dictionary < ulong , RegionInfo > ( ) ;
2008-06-27 18:32:32 +00:00
// private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>();
2008-01-22 08:52:51 +00:00
private Dictionary < ulong , int > m_deadRegionCache = new Dictionary < ulong , int > ( ) ;
2007-12-20 06:31:03 +00:00
private Dictionary < string , string > m_queuedGridSettings = new Dictionary < string , string > ( ) ;
2008-06-21 03:29:08 +00:00
private List < RegionInfo > m_regionsOnInstance = new List < RegionInfo > ( ) ;
2007-07-16 15:40:11 +00:00
public BaseHttpServer httpListener ;
public NetworkServersInfo serversInfo ;
public BaseHttpServer httpServer ;
2008-06-21 03:29:08 +00:00
2008-01-15 02:09:55 +00:00
public string _gdebugRegionName = String . Empty ;
2007-07-16 15:40:11 +00:00
2007-11-27 13:46:52 +00:00
public string gdebugRegionName
{
get { return _gdebugRegionName ; }
2007-12-27 21:41:48 +00:00
set { _gdebugRegionName = value ; }
2007-11-27 13:46:52 +00:00
}
2007-12-27 21:41:48 +00:00
2008-01-15 02:09:55 +00:00
public string _rdebugRegionName = String . Empty ;
2007-11-27 13:46:52 +00:00
public string rdebugRegionName
{
get { return _rdebugRegionName ; }
2007-12-27 21:41:48 +00:00
set { _rdebugRegionName = value ; }
2007-11-27 13:46:52 +00:00
}
2007-12-27 21:41:48 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-02-18 17:31:05 +00:00
/// Contructor. Adds "expect_user" and "check" xmlrpc method handlers
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="servers_info"></param>
/// <param name="httpServe"></param>
public OGS1GridServices ( NetworkServersInfo servers_info , BaseHttpServer httpServe )
{
serversInfo = servers_info ;
httpServer = httpServe ;
2007-11-21 02:17:24 +00:00
//Respond to Grid Services requests
2007-10-30 09:05:31 +00:00
httpServer . AddXmlRPCHandler ( "expect_user" , ExpectUser ) ;
2008-05-31 12:18:29 +00:00
httpServer . AddXmlRPCHandler ( "logoff_user" , LogOffUser ) ;
2007-10-30 09:05:31 +00:00
httpServer . AddXmlRPCHandler ( "check" , PingCheckReply ) ;
2007-09-25 06:33:18 +00:00
2007-10-30 09:05:31 +00:00
StartRemoting ( ) ;
2007-07-16 15:40:11 +00:00
}
2008-03-21 19:16:29 +00:00
// see IGridServices
2007-07-16 15:40:11 +00:00
public RegionCommsListener RegisterRegion ( RegionInfo regionInfo )
{
2008-06-21 03:29:08 +00:00
m_regionsOnInstance . Add ( regionInfo ) ;
2008-05-12 16:57:56 +00:00
m_log . InfoFormat (
2008-05-16 01:22:11 +00:00
"[OGS1 GRID SERVICES]: Attempting to register region {0} with grid at {1}" ,
2008-03-26 12:44:43 +00:00
regionInfo . RegionName , serversInfo . GridURL ) ;
2008-05-16 01:22:11 +00:00
2007-07-16 15:40:11 +00:00
Hashtable GridParams = new Hashtable ( ) ;
// Login / Authentication
GridParams [ "authkey" ] = serversInfo . GridSendKey ;
2008-01-12 19:23:56 +00:00
GridParams [ "recvkey" ] = serversInfo . GridRecvKey ;
2007-12-20 05:43:02 +00:00
GridParams [ "UUID" ] = regionInfo . RegionID . ToString ( ) ;
2007-07-16 15:40:11 +00:00
GridParams [ "sim_ip" ] = regionInfo . ExternalHostName ;
GridParams [ "sim_port" ] = regionInfo . InternalEndPoint . Port . ToString ( ) ;
GridParams [ "region_locx" ] = regionInfo . RegionLocX . ToString ( ) ;
GridParams [ "region_locy" ] = regionInfo . RegionLocY . ToString ( ) ;
GridParams [ "sim_name" ] = regionInfo . RegionName ;
GridParams [ "http_port" ] = serversInfo . HttpListenerPort . ToString ( ) ;
2007-10-26 15:35:17 +00:00
GridParams [ "remoting_port" ] = NetworkServersInfo . RemotingListenerPort . ToString ( ) ;
2008-07-14 01:39:36 +00:00
GridParams [ "map-image-id" ] = regionInfo . RegionSettings . TerrainImageID . ToString ( ) ;
2008-03-04 05:31:54 +00:00
GridParams [ "originUUID" ] = regionInfo . originRegionID . ToString ( ) ;
2008-03-18 15:30:38 +00:00
GridParams [ "server_uri" ] = regionInfo . ServerURI ;
2008-04-13 22:47:12 +00:00
GridParams [ "region_secret" ] = regionInfo . regionSecret ;
2007-07-16 15:40:11 +00:00
2008-08-16 17:26:25 +00:00
if ( regionInfo . MasterAvatarAssignedUUID ! = LLUUID . Zero )
2008-08-15 13:13:39 +00:00
GridParams [ "master_avatar_uuid" ] = regionInfo . MasterAvatarAssignedUUID . ToString ( ) ;
else
GridParams [ "master_avatar_uuid" ] = regionInfo . EstateSettings . EstateOwner . ToString ( ) ;
2008-02-02 16:43:57 +00:00
2007-07-16 15:40:11 +00:00
// Package into an XMLRPC Request
ArrayList SendParams = new ArrayList ( ) ;
SendParams . Add ( GridParams ) ;
// Send Request
2008-01-05 15:10:22 +00:00
XmlRpcResponse GridResp ;
try
{
2008-03-26 12:34:02 +00:00
XmlRpcRequest GridReq = new XmlRpcRequest ( "simulator_login" , SendParams ) ;
2008-06-13 16:32:32 +00:00
// The timeout should always be significantly larger than the timeout for the grid server to request
// the initial status of the region before confirming registration.
2008-08-10 12:51:31 +00:00
GridResp = GridReq . Send ( serversInfo . GridURL , 90000 ) ;
2008-03-18 14:51:42 +00:00
}
2008-05-12 16:57:56 +00:00
catch ( Exception e )
2008-01-05 15:10:22 +00:00
{
2008-05-16 01:22:11 +00:00
Exception e2
2008-05-12 16:57:56 +00:00
= new Exception (
String . Format ( "Unable to connect to grid at {0}. Grid service not running?" , serversInfo . GridURL ) ,
e ) ;
2008-05-16 01:22:11 +00:00
2008-05-12 16:57:56 +00:00
throw ( e2 ) ;
2008-01-05 15:10:22 +00:00
}
2008-05-16 01:22:11 +00:00
2008-01-05 15:10:22 +00:00
Hashtable GridRespData = ( Hashtable ) GridResp . Value ;
2008-06-27 18:32:32 +00:00
// Hashtable griddatahash = GridRespData;
2007-07-16 15:40:11 +00:00
// Process Response
if ( GridRespData . ContainsKey ( "error" ) )
{
2007-12-27 21:41:48 +00:00
string errorstring = ( string ) GridRespData [ "error" ] ;
2008-05-16 01:22:11 +00:00
2008-05-12 16:57:56 +00:00
Exception e = new Exception ( String . Format ( "Unable to connect to grid at {0}: {1}" , serversInfo . GridURL , errorstring ) ) ;
2008-05-16 01:22:11 +00:00
2008-05-12 16:57:56 +00:00
throw e ;
2007-07-16 15:40:11 +00:00
}
2007-11-27 13:46:52 +00:00
else
{
2008-06-27 18:32:32 +00:00
// m_knownRegions = RequestNeighbours(regionInfo.RegionLocX, regionInfo.RegionLocY);
2007-12-20 06:31:03 +00:00
if ( GridRespData . ContainsKey ( "allow_forceful_banlines" ) )
{
2007-12-27 21:41:48 +00:00
if ( ( string ) GridRespData [ "allow_forceful_banlines" ] ! = "TRUE" )
2007-12-20 06:31:03 +00:00
{
//m_localBackend.SetForcefulBanlistsDisallowed(regionInfo.RegionHandle);
m_queuedGridSettings . Add ( "allow_forceful_banlines" , "FALSE" ) ;
}
}
2008-05-16 01:22:11 +00:00
2008-03-26 12:44:43 +00:00
m_log . InfoFormat (
2008-05-16 01:22:11 +00:00
"[OGS1 GRID SERVICES]: Region {0} successfully registered with grid at {1}" ,
2008-03-26 12:44:43 +00:00
regionInfo . RegionName , serversInfo . GridURL ) ;
2007-11-27 13:46:52 +00:00
}
2007-09-25 06:33:18 +00:00
return m_localBackend . RegisterRegion ( regionInfo ) ;
2007-07-16 15:40:11 +00:00
}
2007-11-16 13:39:11 +00:00
public bool DeregisterRegion ( RegionInfo regionInfo )
{
2008-03-04 05:31:54 +00:00
Hashtable GridParams = new Hashtable ( ) ;
GridParams [ "UUID" ] = regionInfo . RegionID . ToString ( ) ;
// Package into an XMLRPC Request
ArrayList SendParams = new ArrayList ( ) ;
SendParams . Add ( GridParams ) ;
// Send Request
XmlRpcRequest GridReq = new XmlRpcRequest ( "simulator_after_region_moved" , SendParams ) ;
XmlRpcResponse GridResp = GridReq . Send ( serversInfo . GridURL , 10000 ) ;
Hashtable GridRespData = ( Hashtable ) GridResp . Value ;
2008-06-27 18:32:32 +00:00
// Hashtable griddatahash = GridRespData;
2008-03-04 05:31:54 +00:00
// Process Response
2008-07-20 22:19:39 +00:00
if ( GridRespData ! = null & & GridRespData . ContainsKey ( "error" ) )
2008-03-18 14:51:42 +00:00
{
2008-03-04 05:31:54 +00:00
string errorstring = ( string ) GridRespData [ "error" ] ;
m_log . Error ( "Unable to connect to grid: " + errorstring ) ;
return false ;
}
2008-03-18 15:30:38 +00:00
// What does DeregisterRegion() do?
2008-03-04 05:31:54 +00:00
return m_localBackend . DeregisterRegion ( regionInfo ) ;
2007-11-16 13:39:11 +00:00
}
2007-12-27 21:41:48 +00:00
2007-12-20 06:31:03 +00:00
public virtual Dictionary < string , string > GetGridSettings ( )
{
Dictionary < string , string > returnGridSettings = new Dictionary < string , string > ( ) ;
lock ( m_queuedGridSettings )
{
foreach ( string Dictkey in m_queuedGridSettings . Keys )
{
returnGridSettings . Add ( Dictkey , m_queuedGridSettings [ Dictkey ] ) ;
}
m_queuedGridSettings . Clear ( ) ;
}
2007-11-16 13:39:11 +00:00
2007-12-20 06:31:03 +00:00
return returnGridSettings ;
}
2007-12-27 21:41:48 +00:00
2008-03-22 20:44:15 +00:00
// see IGridServices
2007-10-18 15:10:43 +00:00
public List < SimpleRegionInfo > RequestNeighbours ( uint x , uint y )
2007-07-16 15:40:11 +00:00
{
2007-10-30 09:05:31 +00:00
Hashtable respData = MapBlockQuery ( ( int ) x - 1 , ( int ) y - 1 , ( int ) x + 1 , ( int ) y + 1 ) ;
2007-07-16 15:40:11 +00:00
2007-10-18 15:10:43 +00:00
List < SimpleRegionInfo > neighbours = new List < SimpleRegionInfo > ( ) ;
2007-07-16 15:40:11 +00:00
2007-09-24 23:58:43 +00:00
foreach ( ArrayList neighboursList in respData . Values )
2007-07-16 15:40:11 +00:00
{
2007-09-24 23:58:43 +00:00
foreach ( Hashtable neighbourData in neighboursList )
2007-07-16 15:40:11 +00:00
{
2007-09-24 23:58:43 +00:00
uint regX = Convert . ToUInt32 ( neighbourData [ "x" ] ) ;
uint regY = Convert . ToUInt32 ( neighbourData [ "y" ] ) ;
2007-10-18 15:10:43 +00:00
if ( ( x ! = regX ) | | ( y ! = regY ) )
2007-07-16 15:40:11 +00:00
{
2007-10-30 09:05:31 +00:00
string simIp = ( string ) neighbourData [ "sim_ip" ] ;
2007-07-16 15:40:11 +00:00
2007-12-06 01:41:41 +00:00
uint port = Convert . ToUInt32 ( neighbourData [ "sim_port" ] ) ;
2008-06-27 18:32:32 +00:00
// string externalUri = (string) neighbourData["sim_uri"];
2007-09-24 23:58:43 +00:00
2008-06-27 18:32:32 +00:00
// string externalIpStr = String.Empty;
2008-03-25 19:39:41 +00:00
try
2008-05-16 01:22:11 +00:00
{
2008-06-27 18:32:32 +00:00
// externalIpStr = Util.GetHostFromDNS(simIp).ToString();
Util . GetHostFromDNS ( simIp ) . ToString ( ) ;
2008-03-25 19:39:41 +00:00
}
catch ( SocketException e )
{
2008-03-25 20:05:02 +00:00
m_log . WarnFormat ( "RequestNeighbours(): Lookup of neighbour {0} failed! Not including in neighbours list. {1}" , simIp , e ) ;
2008-03-25 19:39:41 +00:00
continue ;
}
2008-05-16 01:22:11 +00:00
2007-10-18 15:10:43 +00:00
SimpleRegionInfo sri = new SimpleRegionInfo ( regX , regY , simIp , port ) ;
2008-05-16 01:22:11 +00:00
2007-10-18 15:10:43 +00:00
sri . RemotingPort = Convert . ToUInt32 ( neighbourData [ "remoting_port" ] ) ;
2008-05-16 01:22:11 +00:00
2008-03-23 21:21:39 +00:00
if ( neighbourData . ContainsKey ( "http_port" ) )
{
sri . HttpPort = Convert . ToUInt32 ( neighbourData [ "http_port" ] ) ;
}
2008-05-16 01:22:11 +00:00
2007-10-30 09:05:31 +00:00
sri . RegionID = new LLUUID ( ( string ) neighbourData [ "uuid" ] ) ;
2007-07-16 15:40:11 +00:00
2007-10-18 15:10:43 +00:00
neighbours . Add ( sri ) ;
2007-07-16 15:40:11 +00:00
}
}
}
return neighbours ;
}
2007-11-27 13:46:52 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-11-27 13:46:52 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <returns></returns>
public RegionInfo RequestNeighbourInfo ( LLUUID Region_UUID )
{
RegionInfo regionInfo ;
Hashtable requestData = new Hashtable ( ) ;
2007-12-20 05:43:02 +00:00
requestData [ "region_UUID" ] = Region_UUID . ToString ( ) ;
2007-11-27 13:46:52 +00:00
requestData [ "authkey" ] = serversInfo . GridSendKey ;
ArrayList SendParams = new ArrayList ( ) ;
SendParams . Add ( requestData ) ;
XmlRpcRequest GridReq = new XmlRpcRequest ( "simulator_data_request" , SendParams ) ;
XmlRpcResponse GridResp = GridReq . Send ( serversInfo . GridURL , 3000 ) ;
2007-12-27 21:41:48 +00:00
Hashtable responseData = ( Hashtable ) GridResp . Value ;
2007-10-22 17:55:49 +00:00
2007-11-27 13:46:52 +00:00
if ( responseData . ContainsKey ( "error" ) )
{
2008-05-12 16:57:56 +00:00
m_log . WarnFormat ( "[OGS1 GRID SERVICES]: Error received from grid server: {0}" , responseData [ "error" ] ) ;
2007-11-27 13:46:52 +00:00
return null ;
}
2007-12-27 21:41:48 +00:00
uint regX = Convert . ToUInt32 ( ( string ) responseData [ "region_locx" ] ) ;
uint regY = Convert . ToUInt32 ( ( string ) responseData [ "region_locy" ] ) ;
string internalIpStr = ( string ) responseData [ "sim_ip" ] ;
2007-11-27 13:46:52 +00:00
uint port = Convert . ToUInt32 ( responseData [ "sim_port" ] ) ;
2008-06-27 18:32:32 +00:00
// string externalUri = (string) responseData["sim_uri"];
2007-11-27 13:46:52 +00:00
2007-12-27 21:41:48 +00:00
IPEndPoint neighbourInternalEndPoint = new IPEndPoint ( IPAddress . Parse ( internalIpStr ) , ( int ) port ) ;
2008-06-27 18:32:32 +00:00
// string neighbourExternalUri = externalUri;
2007-11-27 13:46:52 +00:00
regionInfo = new RegionInfo ( regX , regY , neighbourInternalEndPoint , internalIpStr ) ;
2007-12-27 21:41:48 +00:00
regionInfo . RemotingPort = Convert . ToUInt32 ( ( string ) responseData [ "remoting_port" ] ) ;
2007-11-27 13:46:52 +00:00
regionInfo . RemotingAddress = internalIpStr ;
2008-05-16 01:22:11 +00:00
2008-03-23 21:21:39 +00:00
if ( responseData . ContainsKey ( "http_port" ) )
{
regionInfo . HttpPort = Convert . ToUInt32 ( ( string ) responseData [ "http_port" ] ) ;
}
2007-11-27 13:46:52 +00:00
2007-12-27 21:41:48 +00:00
regionInfo . RegionID = new LLUUID ( ( string ) responseData [ "region_UUID" ] ) ;
regionInfo . RegionName = ( string ) responseData [ "region_name" ] ;
2007-11-27 13:46:52 +00:00
if ( requestData . ContainsKey ( "regionHandle" ) )
{
2007-12-27 21:41:48 +00:00
m_remoteRegionInfoCache . Add ( Convert . ToUInt64 ( ( string ) requestData [ "regionHandle" ] ) , regionInfo ) ;
2007-11-27 13:46:52 +00:00
}
return regionInfo ;
}
2007-12-27 21:41:48 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <returns></returns>
public RegionInfo RequestNeighbourInfo ( ulong regionHandle )
{
2007-09-25 06:33:18 +00:00
RegionInfo regionInfo = m_localBackend . RequestNeighbourInfo ( regionHandle ) ;
if ( regionInfo ! = null )
2007-07-16 15:40:11 +00:00
{
2007-09-25 06:33:18 +00:00
return regionInfo ;
2007-07-16 15:40:11 +00:00
}
2008-03-18 14:51:42 +00:00
if ( ! m_remoteRegionInfoCache . TryGetValue ( regionHandle , out regionInfo ) )
2007-10-22 17:55:49 +00:00
{
2007-11-29 02:07:19 +00:00
try
{
Hashtable requestData = new Hashtable ( ) ;
requestData [ "region_handle" ] = regionHandle . ToString ( ) ;
requestData [ "authkey" ] = serversInfo . GridSendKey ;
ArrayList SendParams = new ArrayList ( ) ;
SendParams . Add ( requestData ) ;
XmlRpcRequest GridReq = new XmlRpcRequest ( "simulator_data_request" , SendParams ) ;
XmlRpcResponse GridResp = GridReq . Send ( serversInfo . GridURL , 3000 ) ;
2007-07-16 15:40:11 +00:00
2007-12-27 21:41:48 +00:00
Hashtable responseData = ( Hashtable ) GridResp . Value ;
2007-07-16 15:40:11 +00:00
2007-11-29 02:07:19 +00:00
if ( responseData . ContainsKey ( "error" ) )
{
2008-05-12 16:57:56 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Error received from grid server: " + responseData [ "error" ] ) ;
2007-11-29 02:07:19 +00:00
return null ;
}
2007-10-22 17:55:49 +00:00
2007-12-27 21:41:48 +00:00
uint regX = Convert . ToUInt32 ( ( string ) responseData [ "region_locx" ] ) ;
uint regY = Convert . ToUInt32 ( ( string ) responseData [ "region_locy" ] ) ;
string internalIpStr = ( string ) responseData [ "sim_ip" ] ;
2007-11-29 02:07:19 +00:00
uint port = Convert . ToUInt32 ( responseData [ "sim_port" ] ) ;
2008-06-27 18:32:32 +00:00
// string externalUri = (string) responseData["sim_uri"];
2007-07-16 15:40:11 +00:00
2007-12-27 21:41:48 +00:00
IPEndPoint neighbourInternalEndPoint = new IPEndPoint ( IPAddress . Parse ( internalIpStr ) , ( int ) port ) ;
2008-06-27 18:32:32 +00:00
// string neighbourExternalUri = externalUri;
2007-11-29 02:07:19 +00:00
regionInfo = new RegionInfo ( regX , regY , neighbourInternalEndPoint , internalIpStr ) ;
2007-07-16 15:40:11 +00:00
2007-12-27 21:41:48 +00:00
regionInfo . RemotingPort = Convert . ToUInt32 ( ( string ) responseData [ "remoting_port" ] ) ;
2007-11-29 02:07:19 +00:00
regionInfo . RemotingAddress = internalIpStr ;
2008-05-16 01:22:11 +00:00
2008-03-23 21:21:39 +00:00
if ( responseData . ContainsKey ( "http_port" ) )
{
regionInfo . HttpPort = Convert . ToUInt32 ( ( string ) responseData [ "http_port" ] ) ;
}
2007-10-22 17:55:49 +00:00
2007-12-27 21:41:48 +00:00
regionInfo . RegionID = new LLUUID ( ( string ) responseData [ "region_UUID" ] ) ;
regionInfo . RegionName = ( string ) responseData [ "region_name" ] ;
2007-10-22 17:55:49 +00:00
2008-06-02 16:16:07 +00:00
lock ( m_remoteRegionInfoCache )
{
if ( ! m_remoteRegionInfoCache . ContainsKey ( regionHandle ) )
{
m_remoteRegionInfoCache . Add ( regionHandle , regionInfo ) ;
}
}
2007-11-29 02:07:19 +00:00
}
2007-12-27 21:41:48 +00:00
catch ( WebException )
2007-11-29 02:07:19 +00:00
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: " +
2008-02-05 19:44:27 +00:00
"Region lookup failed for: " + regionHandle . ToString ( ) +
" - Is the GridServer down?" ) ;
2007-11-29 02:07:19 +00:00
return null ;
}
2007-10-22 17:55:49 +00:00
}
2007-07-16 15:40:11 +00:00
return regionInfo ;
}
2008-03-18 05:44:25 +00:00
public RegionInfo RequestClosestRegion ( string regionName )
{
2008-05-29 13:55:02 +00:00
foreach ( RegionInfo ri in m_remoteRegionInfoCache . Values )
2008-05-30 08:35:57 +00:00
{
if ( ri . RegionName = = regionName )
2008-05-29 13:55:02 +00:00
return ri ;
2008-05-30 08:35:57 +00:00
}
2008-05-29 13:55:02 +00:00
2008-03-18 05:44:25 +00:00
RegionInfo regionInfo = null ;
try
2008-03-18 14:51:42 +00:00
{
Hashtable requestData = new Hashtable ( ) ;
requestData [ "region_name_search" ] = regionName ;
requestData [ "authkey" ] = serversInfo . GridSendKey ;
ArrayList SendParams = new ArrayList ( ) ;
SendParams . Add ( requestData ) ;
XmlRpcRequest GridReq = new XmlRpcRequest ( "simulator_data_request" , SendParams ) ;
XmlRpcResponse GridResp = GridReq . Send ( serversInfo . GridURL , 3000 ) ;
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
Hashtable responseData = ( Hashtable ) GridResp . Value ;
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
if ( responseData . ContainsKey ( "error" ) )
{
m_log . Error ( "[OGS1 GRID SERVICES]: Error received from grid server" + responseData [ "error" ] ) ;
return null ;
}
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
uint regX = Convert . ToUInt32 ( ( string ) responseData [ "region_locx" ] ) ;
uint regY = Convert . ToUInt32 ( ( string ) responseData [ "region_locy" ] ) ;
string internalIpStr = ( string ) responseData [ "sim_ip" ] ;
uint port = Convert . ToUInt32 ( responseData [ "sim_port" ] ) ;
2008-06-27 18:32:32 +00:00
// string externalUri = (string) responseData["sim_uri"];
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
IPEndPoint neighbourInternalEndPoint = new IPEndPoint ( IPAddress . Parse ( internalIpStr ) , ( int ) port ) ;
2008-06-27 18:32:32 +00:00
// string neighbourExternalUri = externalUri;
2008-03-18 14:51:42 +00:00
regionInfo = new RegionInfo ( regX , regY , neighbourInternalEndPoint , internalIpStr ) ;
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
regionInfo . RemotingPort = Convert . ToUInt32 ( ( string ) responseData [ "remoting_port" ] ) ;
regionInfo . RemotingAddress = internalIpStr ;
2008-05-16 01:22:11 +00:00
2008-03-23 21:21:39 +00:00
if ( responseData . ContainsKey ( "http_port" ) )
{
regionInfo . HttpPort = Convert . ToUInt32 ( ( string ) responseData [ "http_port" ] ) ;
}
2008-03-18 05:44:25 +00:00
2008-03-18 14:51:42 +00:00
regionInfo . RegionID = new LLUUID ( ( string ) responseData [ "region_UUID" ] ) ;
regionInfo . RegionName = ( string ) responseData [ "region_name" ] ;
2008-03-18 05:44:25 +00:00
2008-05-30 08:35:57 +00:00
if ( ! m_remoteRegionInfoCache . ContainsKey ( regionInfo . RegionHandle ) )
2008-05-29 13:55:02 +00:00
m_remoteRegionInfoCache . Add ( regionInfo . RegionHandle , regionInfo ) ;
2008-03-18 14:51:42 +00:00
}
catch ( WebException )
{
m_log . Error ( "[OGS1 GRID SERVICES]: " +
"Region lookup failed for: " + regionName +
" - Is the GridServer down?" ) ;
}
2008-03-18 05:44:25 +00:00
return regionInfo ;
}
2007-07-16 15:40:11 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="minX"></param>
/// <param name="minY"></param>
/// <param name="maxX"></param>
/// <param name="maxY"></param>
/// <returns></returns>
public List < MapBlockData > RequestNeighbourMapBlocks ( int minX , int minY , int maxX , int maxY )
{
2007-11-25 03:14:43 +00:00
int temp = 0 ;
if ( minX > maxX )
{
temp = minX ;
minX = maxX ;
maxX = temp ;
}
if ( minY > maxY )
{
temp = minY ;
minY = maxY ;
maxY = temp ;
}
2007-07-16 15:40:11 +00:00
Hashtable respData = MapBlockQuery ( minX , minY , maxX , maxY ) ;
List < MapBlockData > neighbours = new List < MapBlockData > ( ) ;
foreach ( ArrayList a in respData . Values )
{
foreach ( Hashtable n in a )
{
MapBlockData neighbour = new MapBlockData ( ) ;
neighbour . X = Convert . ToUInt16 ( n [ "x" ] ) ;
neighbour . Y = Convert . ToUInt16 ( n [ "y" ] ) ;
2007-10-30 09:05:31 +00:00
neighbour . Name = ( string ) n [ "name" ] ;
2007-07-16 15:40:11 +00:00
neighbour . Access = Convert . ToByte ( n [ "access" ] ) ;
neighbour . RegionFlags = Convert . ToUInt32 ( n [ "region-flags" ] ) ;
neighbour . WaterHeight = Convert . ToByte ( n [ "water-height" ] ) ;
2007-10-30 09:05:31 +00:00
neighbour . MapImageId = new LLUUID ( ( string ) n [ "map-image-id" ] ) ;
2007-07-16 15:40:11 +00:00
neighbours . Add ( neighbour ) ;
}
}
return neighbours ;
}
/// <summary>
/// Performs a XML-RPC query against the grid server returning mapblock information in the specified coordinates
/// </summary>
/// <remarks>REDUNDANT - OGS1 is to be phased out in favour of OGS2</remarks>
/// <param name="minX">Minimum X value</param>
/// <param name="minY">Minimum Y value</param>
/// <param name="maxX">Maximum X value</param>
/// <param name="maxY">Maximum Y value</param>
/// <returns>Hashtable of hashtables containing map data elements</returns>
private Hashtable MapBlockQuery ( int minX , int minY , int maxX , int maxY )
{
Hashtable param = new Hashtable ( ) ;
param [ "xmin" ] = minX ;
param [ "ymin" ] = minY ;
param [ "xmax" ] = maxX ;
param [ "ymax" ] = maxY ;
IList parameters = new ArrayList ( ) ;
parameters . Add ( param ) ;
2007-11-18 05:28:28 +00:00
try
{
XmlRpcRequest req = new XmlRpcRequest ( "map_block" , parameters ) ;
XmlRpcResponse resp = req . Send ( serversInfo . GridURL , 10000 ) ;
Hashtable respData = ( Hashtable ) resp . Value ;
return respData ;
}
catch ( Exception e )
{
2008-02-05 19:44:27 +00:00
m_log . Error ( "MapBlockQuery XMLRPC failure: " + e . ToString ( ) ) ;
2007-11-18 05:28:28 +00:00
return new Hashtable ( ) ;
}
2007-07-16 15:40:11 +00:00
}
2007-07-17 18:53:19 +00:00
/// <summary>
/// A ping / version check
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse PingCheckReply ( XmlRpcRequest request )
{
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable respData = new Hashtable ( ) ;
respData [ "online" ] = "true" ;
2007-09-25 06:33:18 +00:00
m_localBackend . PingCheckReply ( respData ) ;
2007-08-15 14:10:26 +00:00
2007-07-17 18:53:19 +00:00
response . Value = respData ;
return response ;
}
2007-07-16 15:40:11 +00:00
// Grid Request Processing
/// <summary>
2008-02-18 18:48:55 +00:00
/// Received from the user server when a user starts logging in. This call allows
/// the region to prepare for direct communication from the client. Sends back an empty
/// xmlrpc response on completion.
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse ExpectUser ( XmlRpcRequest request )
{
2008-02-08 17:49:53 +00:00
m_log . Debug ( "[CONNECTION DEBUGGING]: Expect User called, starting agent setup ... " ) ;
2007-10-30 09:05:31 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2007-07-16 15:40:11 +00:00
AgentCircuitData agentData = new AgentCircuitData ( ) ;
2007-10-30 09:05:31 +00:00
agentData . SessionID = new LLUUID ( ( string ) requestData [ "session_id" ] ) ;
agentData . SecureSessionID = new LLUUID ( ( string ) requestData [ "secure_session_id" ] ) ;
agentData . firstname = ( string ) requestData [ "firstname" ] ;
agentData . lastname = ( string ) requestData [ "lastname" ] ;
agentData . AgentID = new LLUUID ( ( string ) requestData [ "agent_id" ] ) ;
2007-07-16 15:40:11 +00:00
agentData . circuitcode = Convert . ToUInt32 ( requestData [ "circuit_code" ] ) ;
2007-10-30 09:05:31 +00:00
agentData . CapsPath = ( string ) requestData [ "caps_path" ] ;
2007-07-16 15:40:11 +00:00
if ( requestData . ContainsKey ( "child_agent" ) & & requestData [ "child_agent" ] . Equals ( "1" ) )
{
2008-02-08 17:49:53 +00:00
m_log . Debug ( "[CONNECTION DEBUGGING]: Child agent detected" ) ;
2007-07-16 15:40:11 +00:00
agentData . child = true ;
}
else
{
2008-02-08 17:49:53 +00:00
m_log . Debug ( "[CONNECTION DEBUGGING]: Main agent detected" ) ;
2007-10-30 09:05:31 +00:00
agentData . startpos =
2008-04-17 05:07:14 +00:00
new LLVector3 ( ( float ) Convert . ToDecimal ( ( string ) requestData [ "startpos_x" ] ) ,
( float ) Convert . ToDecimal ( ( string ) requestData [ "startpos_y" ] ) ,
( float ) Convert . ToDecimal ( ( string ) requestData [ "startpos_z" ] ) ) ;
2007-07-16 15:40:11 +00:00
agentData . child = false ;
}
2007-10-30 09:05:31 +00:00
ulong regionHandle = Convert . ToUInt64 ( ( string ) requestData [ "regionhandle" ] ) ;
2007-09-25 06:33:18 +00:00
2007-07-16 15:40:11 +00:00
2008-06-21 03:29:08 +00:00
RegionInfo [ ] regions = m_regionsOnInstance . ToArray ( ) ;
bool banned = false ;
2007-07-16 15:40:11 +00:00
2008-06-21 03:29:08 +00:00
for ( int i = 0 ; i < regions . Length ; i + + )
{
if ( regions [ i ] ! = null )
{
if ( regions [ i ] . RegionHandle = = regionHandle )
{
2008-07-18 02:40:47 +00:00
if ( regions [ i ] . EstateSettings . IsBanned ( agentData . AgentID ) )
2008-06-21 03:29:08 +00:00
{
banned = true ;
break ;
}
}
}
}
XmlRpcResponse resp = new XmlRpcResponse ( ) ;
if ( banned )
{
m_log . InfoFormat ( "[OGS1 GRID SERVICES]: Denying access for user {0} {1} because user is banned" , agentData . firstname , agentData . lastname ) ;
Hashtable respdata = new Hashtable ( ) ;
respdata [ "success" ] = "FALSE" ;
respdata [ "reason" ] = "banned" ;
resp . Value = respdata ;
}
else
{
m_log . Debug ( "[CONNECTION DEBUGGING]: Triggering welcome for " + agentData . AgentID . ToString ( ) + " into " + regionHandle . ToString ( ) ) ;
m_localBackend . TriggerExpectUser ( regionHandle , agentData ) ;
m_log . Info ( "[OGS1 GRID SERVICES]: Welcoming new user..." ) ;
Hashtable respdata = new Hashtable ( ) ;
respdata [ "success" ] = "TRUE" ;
resp . Value = respdata ;
}
return resp ;
2008-05-31 12:18:29 +00:00
}
// Grid Request Processing
/// <summary>
/// Ooops, our Agent must be dead if we're getting this request!
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse LogOffUser ( XmlRpcRequest request )
{
m_log . Debug ( "[CONNECTION DEBUGGING]: LogOff User Called " ) ;
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
string message = ( string ) requestData [ "message" ] ;
LLUUID agentID = LLUUID . Zero ;
LLUUID RegionSecret = LLUUID . Zero ;
Helpers . TryParse ( ( string ) requestData [ "agent_id" ] , out agentID ) ;
2008-06-04 09:59:27 +00:00
Helpers . TryParse ( ( string ) requestData [ "region_secret" ] , out RegionSecret ) ;
2008-05-31 12:18:29 +00:00
ulong regionHandle = Convert . ToUInt64 ( ( string ) requestData [ "regionhandle" ] ) ;
2008-06-04 09:59:27 +00:00
2008-05-31 12:18:29 +00:00
m_localBackend . TriggerLogOffUser ( regionHandle , agentID , RegionSecret , message ) ;
2008-06-04 09:59:27 +00:00
2008-05-31 12:18:29 +00:00
2007-07-16 15:40:11 +00:00
return new XmlRpcResponse ( ) ;
}
2007-09-24 05:15:13 +00:00
#region m_interRegion Comms
2007-10-30 09:05:31 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-06-14 20:52:42 +00:00
/// Start listening for .net remoting calls from other regions.
2007-07-16 15:40:11 +00:00
/// </summary>
private void StartRemoting ( )
{
2008-02-16 07:53:02 +00:00
TcpChannel ch ;
try
{
ch = new TcpChannel ( ( int ) NetworkServersInfo . RemotingListenerPort ) ;
2008-06-04 09:59:27 +00:00
ChannelServices . RegisterChannel ( ch , false ) ; // Disabled security as Mono doesn't support this.
2008-02-16 07:53:02 +00:00
}
catch ( Exception ex )
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Exception while attempting to listen on TCP port " + ( int ) NetworkServersInfo . RemotingListenerPort + "." ) ;
2008-02-16 07:53:02 +00:00
throw ( ex ) ;
}
2007-07-16 15:40:11 +00:00
2007-10-30 09:05:31 +00:00
WellKnownServiceTypeEntry wellType =
new WellKnownServiceTypeEntry ( typeof ( OGS1InterRegionRemoting ) , "InterRegions" ,
WellKnownObjectMode . Singleton ) ;
2007-07-16 15:40:11 +00:00
RemotingConfiguration . RegisterWellKnownServiceType ( wellType ) ;
2007-10-30 09:05:31 +00:00
InterRegionSingleton . Instance . OnArrival + = TriggerExpectAvatarCrossing ;
InterRegionSingleton . Instance . OnChildAgent + = IncomingChildAgent ;
2007-11-21 02:17:24 +00:00
InterRegionSingleton . Instance . OnPrimGroupArrival + = IncomingPrim ;
InterRegionSingleton . Instance . OnPrimGroupNear + = TriggerExpectPrimCrossing ;
2007-11-26 05:02:18 +00:00
InterRegionSingleton . Instance . OnRegionUp + = TriggerRegionUp ;
2007-12-09 05:59:49 +00:00
InterRegionSingleton . Instance . OnChildAgentUpdate + = TriggerChildAgentUpdate ;
2008-01-21 23:04:42 +00:00
InterRegionSingleton . Instance . OnTellRegionToCloseChildConnection + = TriggerTellRegionToCloseChildConnection ;
2007-07-16 15:40:11 +00:00
}
#region Methods called by regions in this instance
2007-10-30 09:05:31 +00:00
2007-12-09 05:59:49 +00:00
public bool ChildAgentUpdate ( ulong regionHandle , ChildAgentDataUpdate cAgentData )
{
2008-01-22 08:52:51 +00:00
int failures = 0 ;
lock ( m_deadRegionCache )
2007-12-09 05:59:49 +00:00
{
2008-01-22 08:52:51 +00:00
if ( m_deadRegionCache . ContainsKey ( regionHandle ) )
2007-12-09 05:59:49 +00:00
{
2008-01-22 08:52:51 +00:00
failures = m_deadRegionCache [ regionHandle ] ;
2007-12-09 05:59:49 +00:00
}
2008-01-22 08:52:51 +00:00
}
if ( failures < = 3 )
{
RegionInfo regInfo = null ;
try
2007-12-09 05:59:49 +00:00
{
2008-01-22 08:52:51 +00:00
if ( m_localBackend . ChildAgentUpdate ( regionHandle , cAgentData ) )
2007-12-09 05:59:49 +00:00
{
2008-01-22 08:52:51 +00:00
return true ;
2007-12-09 05:59:49 +00:00
}
2008-01-22 08:52:51 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
if ( regInfo ! = null )
2007-12-09 05:59:49 +00:00
{
2008-01-22 08:52:51 +00:00
//don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false ;
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2008-01-22 08:52:51 +00:00
if ( remObject ! = null )
{
retValue = remObject . ChildAgentUpdate ( regionHandle , cAgentData ) ;
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: remoting object not found" ) ;
2008-01-22 08:52:51 +00:00
}
remObject = null ;
2008-03-18 15:30:38 +00:00
// m_log.Info("[INTER]: " +
// gdebugRegionName +
// ": OGS1 tried to Update Child Agent data on outside region and got " +
// retValue.ToString());
2008-01-22 08:52:51 +00:00
return retValue ;
2007-12-09 05:59:49 +00:00
}
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2007-12-09 05:59:49 +00:00
2008-01-22 08:52:51 +00:00
return false ;
}
catch ( RemotingException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2008-01-22 08:52:51 +00:00
return false ;
}
catch ( SocketException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2008-01-22 08:52:51 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2008-01-22 08:52:51 +00:00
return false ;
}
catch ( AuthenticationException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2008-01-22 08:52:51 +00:00
return false ;
}
catch ( Exception e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-17 16:55:12 +00:00
m_log . WarnFormat ( "[OGS1 GRID SERVICES]: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-18 15:30:38 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2008-01-22 08:52:51 +00:00
return false ;
2007-12-09 05:59:49 +00:00
}
}
2008-01-22 08:52:51 +00:00
else
2007-12-09 05:59:49 +00:00
{
2008-02-05 19:44:27 +00:00
//m_log.Info("[INTERREGION]: Skipped Sending Child Update to a region because it failed too many times:" + regionHandle.ToString());
2007-12-09 05:59:49 +00:00
return false ;
}
}
2007-11-21 02:17:24 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-06-14 20:52:42 +00:00
/// Inform a region that a child agent will be on the way from a client.
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
public bool InformRegionOfChildAgent ( ulong regionHandle , AgentCircuitData agentData )
{
2007-11-24 02:22:05 +00:00
RegionInfo regInfo = null ;
2007-07-18 00:27:11 +00:00
try
2007-07-16 15:40:11 +00:00
{
2007-09-25 06:33:18 +00:00
if ( m_localBackend . InformRegionOfChildAgent ( regionHandle , agentData ) )
2007-07-16 15:40:11 +00:00
{
2007-07-18 00:27:11 +00:00
return true ;
2007-07-16 15:40:11 +00:00
}
2007-09-25 06:33:18 +00:00
2007-11-24 02:22:05 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
2007-07-18 00:27:11 +00:00
if ( regInfo ! = null )
2007-07-16 15:40:11 +00:00
{
2007-07-18 00:27:11 +00:00
//don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false ;
2008-03-18 14:51:42 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2008-01-20 21:11:55 +00:00
2008-03-18 14:51:42 +00:00
if ( remObject ! = null )
{
retValue = remObject . InformRegionOfChildAgent ( regionHandle , new sAgentCircuitData ( agentData ) ) ;
}
else
{
m_log . Warn ( "[OGS1 GRID SERVICES]: remoting object not found" ) ;
}
remObject = null ;
m_log . Info ( "[OGS1 GRID SERVICES]: " +
gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " +
agentData . firstname + " " + agentData . lastname + " and got " +
retValue . ToString ( ) ) ;
2008-01-20 21:11:55 +00:00
2008-03-18 14:51:42 +00:00
return retValue ;
2007-07-18 00:27:11 +00:00
}
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2007-07-18 00:27:11 +00:00
return false ;
}
2007-10-30 09:05:31 +00:00
catch ( RemotingException e )
2007-07-18 00:27:11 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-07-18 00:27:11 +00:00
return false ;
2007-07-16 15:40:11 +00:00
}
2007-10-18 15:10:43 +00:00
catch ( SocketException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( AuthenticationException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( Exception e )
2007-08-08 04:59:03 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-08-15 10:29:17 +00:00
if ( regInfo ! = null )
{
m_log . WarnFormat (
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
}
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-08-08 04:59:03 +00:00
return false ;
}
2007-07-16 15:40:11 +00:00
}
2007-11-26 05:02:18 +00:00
// UGLY!
2008-05-14 17:03:25 +00:00
public bool RegionUp ( SerializableRegionInfo region , ulong regionhandle )
2007-11-26 05:02:18 +00:00
{
2008-05-14 17:03:25 +00:00
SerializableRegionInfo regInfo = null ;
2007-11-29 02:07:19 +00:00
try
2007-11-26 05:02:18 +00:00
{
2008-05-16 01:22:11 +00:00
// You may ask why this is in here...
// The region asking the grid services about itself..
// And, surprisingly, the reason is.. it doesn't know
2007-11-29 02:07:19 +00:00
// it's own remoting port! How special.
2008-03-30 08:01:47 +00:00
RegionUpData regiondata = new RegionUpData ( region . RegionLocX , region . RegionLocY , region . ExternalHostName , region . InternalEndPoint . Port ) ;
2008-05-14 17:03:25 +00:00
region = new SerializableRegionInfo ( RequestNeighbourInfo ( region . RegionHandle ) ) ;
2008-05-16 01:22:11 +00:00
region . RemotingAddress = region . ExternalHostName ;
region . RemotingPort = NetworkServersInfo . RemotingListenerPort ;
2008-03-23 21:21:39 +00:00
region . HttpPort = serversInfo . HttpListenerPort ;
2008-05-16 01:22:11 +00:00
2007-12-27 21:41:48 +00:00
if ( m_localBackend . RegionUp ( region , regionhandle ) )
2007-11-29 02:07:19 +00:00
{
return true ;
}
2008-05-14 17:03:25 +00:00
regInfo = new SerializableRegionInfo ( RequestNeighbourInfo ( regionhandle ) ) ;
2007-11-29 02:07:19 +00:00
if ( regInfo ! = null )
{
// If we're not trying to remote to ourselves.
if ( regInfo . RemotingAddress ! = region . RemotingAddress & & region . RemotingAddress ! = null )
2007-11-26 05:02:18 +00:00
{
//don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false ;
2007-12-27 21:41:48 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" +
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2007-11-26 05:02:18 +00:00
if ( remObject ! = null )
{
2008-03-30 08:01:47 +00:00
retValue = remObject . RegionUp ( regiondata , regionhandle ) ;
2007-11-26 05:02:18 +00:00
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: remoting object not found" ) ;
2007-11-26 05:02:18 +00:00
}
remObject = null ;
2008-02-05 19:44:27 +00:00
m_log . Info ( "[INTER]: " + gdebugRegionName + ": OGS1 tried to inform region I'm up" ) ;
2007-11-26 05:02:18 +00:00
2007-11-29 02:07:19 +00:00
return retValue ;
}
else
{
2008-05-16 01:22:11 +00:00
// We're trying to inform ourselves via remoting.
2007-11-29 02:07:19 +00:00
// This is here because we're looping over the listeners before we get here.
// Odd but it should work.
return true ;
2007-11-26 05:02:18 +00:00
}
2007-11-27 13:46:52 +00:00
}
2007-11-29 02:07:19 +00:00
return false ;
}
catch ( RemotingException e )
{
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region using tcp://" +
2008-02-05 19:44:27 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY +
" - Is this neighbor up?" ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2007-11-29 02:07:19 +00:00
return false ;
}
catch ( SocketException e )
{
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Socket Error: Unable to connect to adjacent region using tcp://" +
2008-02-05 19:44:27 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY +
" - Is this neighbor up?" ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2007-11-29 02:07:19 +00:00
return false ;
2007-11-26 05:02:18 +00:00
}
2007-11-29 02:07:19 +00:00
catch ( InvalidCredentialException e )
{
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Invalid Credentials: Unable to connect to adjacent region using tcp://" +
2008-02-05 19:44:27 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2007-11-29 02:07:19 +00:00
return false ;
}
catch ( AuthenticationException e )
{
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Authentication exception: Unable to connect to adjacent region using tcp://" +
2008-02-05 19:44:27 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2007-11-29 02:07:19 +00:00
return false ;
}
catch ( Exception e )
{
2007-12-10 00:46:56 +00:00
// This line errors with a Null Reference Exception.. Why? @.@
2008-02-05 19:44:27 +00:00
//m_log.Warn("Unknown exception: Unable to connect to adjacent region using tcp://" + regInfo.RemotingAddress +
2007-12-27 21:41:48 +00:00
// ":" + regInfo.RemotingPort +
//"/InterRegions - @ " + regInfo.RegionLocX + "," + regInfo.RegionLocY + " - This is likely caused by an incompatibility in the protocol between this sim and that one");
2008-02-05 19:44:27 +00:00
m_log . Debug ( e . ToString ( ) ) ;
2007-11-29 02:07:19 +00:00
return false ;
}
2007-11-26 05:02:18 +00:00
}
2007-12-27 21:41:48 +00:00
2007-11-21 02:17:24 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-11-21 02:17:24 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
2008-03-30 08:01:47 +00:00
public bool InformRegionOfPrimCrossing ( ulong regionHandle , LLUUID primID , string objData , int XMLMethod )
2007-11-21 02:17:24 +00:00
{
2008-03-18 14:51:42 +00:00
int failures = 0 ;
2008-02-13 23:14:41 +00:00
lock ( m_deadRegionCache )
2007-11-21 02:17:24 +00:00
{
2008-02-13 23:14:41 +00:00
if ( m_deadRegionCache . ContainsKey ( regionHandle ) )
2007-11-21 02:17:24 +00:00
{
2008-02-13 23:14:41 +00:00
failures = m_deadRegionCache [ regionHandle ] ;
2007-11-21 02:17:24 +00:00
}
2008-02-13 23:14:41 +00:00
}
2008-02-14 00:39:08 +00:00
if ( failures < = 1 )
2008-02-13 23:14:41 +00:00
{
RegionInfo regInfo = null ;
try
2007-11-21 02:17:24 +00:00
{
2008-03-30 08:01:47 +00:00
if ( m_localBackend . InformRegionOfPrimCrossing ( regionHandle , primID , objData , XMLMethod ) )
2007-11-21 02:17:24 +00:00
{
2008-02-13 23:14:41 +00:00
return true ;
2007-11-21 02:17:24 +00:00
}
2008-02-13 23:14:41 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
if ( regInfo ! = null )
2007-11-21 02:17:24 +00:00
{
2008-02-13 23:14:41 +00:00
//don't want to be creating a new link to the remote instance every time like we are here
bool retValue = false ;
2007-11-21 02:17:24 +00:00
2008-02-13 23:14:41 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2008-02-13 23:14:41 +00:00
if ( remObject ! = null )
{
2008-03-30 08:01:47 +00:00
retValue = remObject . InformRegionOfPrimCrossing ( regionHandle , primID . UUID , objData , XMLMethod ) ;
2008-02-13 23:14:41 +00:00
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting object not found" ) ;
2008-02-13 23:14:41 +00:00
}
remObject = null ;
return retValue ;
}
NoteDeadRegion ( regionHandle ) ;
return false ;
2007-11-21 02:17:24 +00:00
}
2008-02-13 23:14:41 +00:00
catch ( RemotingException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-13 23:14:41 +00:00
return false ;
}
catch ( SocketException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-13 23:14:41 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Invalid Credential Exception: Invalid Credentials : " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-13 23:14:41 +00:00
return false ;
}
catch ( AuthenticationException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Authentication exception: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-13 23:14:41 +00:00
return false ;
}
catch ( Exception e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Unknown exception: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0}" , e ) ;
2008-02-13 23:14:41 +00:00
return false ;
}
2007-11-21 02:17:24 +00:00
}
2008-02-13 23:14:41 +00:00
else
2007-11-21 02:17:24 +00:00
{
return false ;
}
}
2007-12-27 21:41:48 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentID"></param>
/// <param name="position"></param>
/// <returns></returns>
2007-07-22 11:44:36 +00:00
public bool ExpectAvatarCrossing ( ulong regionHandle , LLUUID agentID , LLVector3 position , bool isFlying )
2007-07-16 15:40:11 +00:00
{
2008-06-21 03:29:08 +00:00
RegionInfo [ ] regions = m_regionsOnInstance . ToArray ( ) ;
bool banned = false ;
for ( int i = 0 ; i < regions . Length ; i + + )
{
if ( regions [ i ] ! = null )
{
if ( regions [ i ] . RegionHandle = = regionHandle )
{
2008-07-18 02:40:47 +00:00
if ( regions [ i ] . EstateSettings . IsBanned ( agentID ) )
2008-06-21 03:29:08 +00:00
{
banned = true ;
break ;
}
}
}
}
if ( banned )
return false ;
2007-11-24 02:22:05 +00:00
RegionInfo regInfo = null ;
2007-07-18 00:27:11 +00:00
try
2007-07-16 15:40:11 +00:00
{
2007-09-25 06:33:18 +00:00
if ( m_localBackend . TriggerExpectAvatarCrossing ( regionHandle , agentID , position , isFlying ) )
2007-07-16 15:40:11 +00:00
{
2007-07-18 00:27:11 +00:00
return true ;
2007-07-16 15:40:11 +00:00
}
2007-09-25 06:33:18 +00:00
2007-11-24 02:22:05 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
2007-07-18 00:27:11 +00:00
if ( regInfo ! = null )
2007-07-16 15:40:11 +00:00
{
2007-07-18 00:27:11 +00:00
bool retValue = false ;
2007-10-30 09:05:31 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2007-07-18 00:27:11 +00:00
if ( remObject ! = null )
{
2007-12-27 21:41:48 +00:00
retValue =
remObject . ExpectAvatarCrossing ( regionHandle , agentID . UUID , new sLLVector3 ( position ) ,
isFlying ) ;
2007-07-18 00:27:11 +00:00
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting object not found" ) ;
2007-07-18 00:27:11 +00:00
}
remObject = null ;
2007-07-16 15:40:11 +00:00
2007-07-18 00:27:11 +00:00
return retValue ;
}
2008-05-16 01:22:11 +00:00
//TODO need to see if we know about where this region is and use .net remoting
// to inform it.
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2007-07-18 00:27:11 +00:00
return false ;
}
2007-10-30 09:05:31 +00:00
catch ( RemotingException e )
2007-07-18 00:27:11 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
2008-03-12 17:37:00 +00:00
m_log . WarnFormat (
2008-03-17 16:55:12 +00:00
"[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: {0} {1},{2}" ,
2008-03-12 17:37:00 +00:00
regInfo . RegionName , regInfo . RegionLocX , regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-05-16 01:22:11 +00:00
2007-07-18 00:27:11 +00:00
return false ;
2007-07-16 15:40:11 +00:00
}
2007-08-08 04:59:03 +00:00
catch
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2007-08-08 04:59:03 +00:00
return false ;
}
2007-07-16 15:40:11 +00:00
}
2007-12-27 21:41:48 +00:00
2007-11-21 02:17:24 +00:00
public bool ExpectPrimCrossing ( ulong regionHandle , LLUUID agentID , LLVector3 position , bool isPhysical )
{
2007-11-24 02:22:05 +00:00
RegionInfo regInfo = null ;
2007-11-21 02:17:24 +00:00
try
{
if ( m_localBackend . TriggerExpectPrimCrossing ( regionHandle , agentID , position , isPhysical ) )
{
return true ;
}
2007-11-24 02:22:05 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
2007-11-21 02:17:24 +00:00
if ( regInfo ! = null )
{
bool retValue = false ;
2007-12-27 21:41:48 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2007-11-21 02:17:24 +00:00
if ( remObject ! = null )
{
2007-12-27 21:41:48 +00:00
retValue =
remObject . ExpectAvatarCrossing ( regionHandle , agentID . UUID , new sLLVector3 ( position ) ,
isPhysical ) ;
2007-11-21 02:17:24 +00:00
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting object not found" ) ;
2007-11-21 02:17:24 +00:00
}
remObject = null ;
return retValue ;
}
2008-05-16 01:22:11 +00:00
//TODO need to see if we know about where this region is and use .net remoting
// to inform it.
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch ( RemotingException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
2008-02-11 01:43:54 +00:00
catch ( SocketException e )
2007-11-21 02:17:24 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-11 01:43:54 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Invalid Credential Exception: Invalid Credentials : " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-11 01:43:54 +00:00
return false ;
}
catch ( AuthenticationException e )
{
NoteDeadRegion ( regionHandle ) ;
2008-05-16 01:22:11 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Authentication exception: Unable to connect to adjacent region: " + regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-02-11 01:43:54 +00:00
return false ;
}
catch ( Exception e )
{
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Unknown exception: Unable to connect to adjacent region: " + regionHandle ) ;
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0}" , e ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
}
2007-07-22 11:44:36 +00:00
2008-01-21 23:04:42 +00:00
public bool TellRegionToCloseChildConnection ( ulong regionHandle , LLUUID agentID )
2007-11-04 22:22:53 +00:00
{
2008-01-21 23:04:42 +00:00
RegionInfo regInfo = null ;
try
{
if ( m_localBackend . TriggerTellRegionToCloseChildConnection ( regionHandle , agentID ) )
{
return true ;
}
regInfo = RequestNeighbourInfo ( regionHandle ) ;
if ( regInfo ! = null )
{
2008-06-27 18:32:32 +00:00
// bool retValue = false;
2008-01-21 23:04:42 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
2008-03-18 14:51:42 +00:00
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2008-01-21 23:04:42 +00:00
if ( remObject ! = null )
{
2008-06-27 18:32:32 +00:00
// retValue =
remObject . TellRegionToCloseChildConnection ( regionHandle , agentID . UUID ) ;
2008-01-21 23:04:42 +00:00
}
else
{
2008-03-17 17:10:53 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting object not found" ) ;
2008-01-21 23:04:42 +00:00
}
remObject = null ;
return true ;
}
2008-05-16 01:22:11 +00:00
//TODO need to see if we know about where this region is and use .net remoting
// to inform it.
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-01-21 23:04:42 +00:00
return false ;
}
2008-02-06 08:03:22 +00:00
catch ( RemotingException )
2008-01-21 23:04:42 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region to tell it to close child agents: " + regInfo . RegionName +
2008-03-18 15:30:38 +00:00
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-02-05 19:44:27 +00:00
//m_log.Debug(e.ToString());
2008-01-21 23:04:42 +00:00
return false ;
}
2008-01-21 23:28:38 +00:00
catch ( SocketException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Socket Error: Unable to connect to adjacent region using tcp://" +
2008-03-18 15:30:38 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY +
" - Is this neighbor up?" ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-01-21 23:28:38 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Invalid Credentials: Unable to connect to adjacent region using tcp://" +
2008-03-18 15:30:38 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-01-21 23:28:38 +00:00
return false ;
}
catch ( AuthenticationException e )
2008-01-21 23:04:42 +00:00
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: Authentication exception: Unable to connect to adjacent region using tcp://" +
2008-03-18 15:30:38 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-01-21 23:28:38 +00:00
return false ;
}
catch ( WebException e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-03-17 16:55:12 +00:00
m_log . Warn ( "[OGS1 GRID SERVICES]: WebException exception: Unable to connect to adjacent region using tcp://" +
2008-03-18 15:30:38 +00:00
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0} {1}" , e . Source , e . Message ) ;
2008-01-21 23:28:38 +00:00
return false ;
}
catch ( Exception e )
{
2008-01-22 08:52:51 +00:00
NoteDeadRegion ( regionHandle ) ;
2008-01-21 23:28:38 +00:00
// This line errors with a Null Reference Exception.. Why? @.@
2008-02-05 19:44:27 +00:00
//m_log.Warn("Unknown exception: Unable to connect to adjacent region using tcp://" + regInfo.RemotingAddress +
2008-01-21 23:28:38 +00:00
// ":" + regInfo.RemotingPort +
//"/InterRegions - @ " + regInfo.RegionLocX + "," + regInfo.RegionLocY + " - This is likely caused by an incompatibility in the protocol between this sim and that one");
2008-03-17 16:55:12 +00:00
m_log . DebugFormat ( "[OGS1 GRID SERVICES]: {0}" , e ) ;
2008-01-21 23:04:42 +00:00
return false ;
}
2007-11-04 22:22:53 +00:00
}
2007-09-25 06:33:18 +00:00
public bool AcknowledgeAgentCrossed ( ulong regionHandle , LLUUID agentId )
2007-07-22 11:44:36 +00:00
{
2007-09-25 06:33:18 +00:00
return m_localBackend . AcknowledgeAgentCrossed ( regionHandle , agentId ) ;
2007-07-22 11:44:36 +00:00
}
2007-09-25 06:33:18 +00:00
2007-11-21 02:17:24 +00:00
public bool AcknowledgePrimCrossed ( ulong regionHandle , LLUUID primId )
{
return m_localBackend . AcknowledgePrimCrossed ( regionHandle , primId ) ;
}
2007-12-27 21:41:48 +00:00
2007-07-16 15:40:11 +00:00
# endregion
#region Methods triggered by calls from external instances
2007-10-30 09:05:31 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
public bool IncomingChildAgent ( ulong regionHandle , AgentCircuitData agentData )
{
2008-02-05 19:44:27 +00:00
//m_log.Info("[INTER]: " + gdebugRegionName + ": Incoming OGS1 Agent " + agentData.firstname + " " + agentData.lastname);
2007-11-27 13:46:52 +00:00
2007-07-17 20:40:01 +00:00
try
2007-07-16 15:40:11 +00:00
{
2007-09-25 06:33:18 +00:00
return m_localBackend . IncomingChildAgent ( regionHandle , agentData ) ;
2007-07-17 20:40:01 +00:00
}
2007-12-04 08:18:09 +00:00
catch ( RemotingException )
2007-07-17 20:40:01 +00:00
{
2008-02-05 19:44:27 +00:00
//m_log.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString());
2007-09-25 06:33:18 +00:00
return false ;
2007-11-26 05:02:18 +00:00
}
}
2008-03-30 08:01:47 +00:00
public bool TriggerRegionUp ( RegionUpData regionData , ulong regionhandle )
2007-11-26 05:02:18 +00:00
{
2008-03-17 16:55:12 +00:00
m_log . Info ( "[OGS1 GRID SERVICES]: " +
2008-03-30 08:01:47 +00:00
gdebugRegionName + "Incoming OGS1 RegionUpReport: " + "(" + regionData . X +
"," + regionData . Y + "). Giving this region a fresh set of 'dead' tries" ) ;
RegionInfo nRegionInfo = new RegionInfo ( ) ;
nRegionInfo . SetEndPoint ( "127.0.0.1" , regionData . PORT ) ;
nRegionInfo . ExternalHostName = regionData . IPADDR ;
nRegionInfo . RegionLocX = regionData . X ;
nRegionInfo . RegionLocY = regionData . Y ;
2007-11-27 13:46:52 +00:00
2008-05-16 01:22:11 +00:00
2007-11-26 05:02:18 +00:00
try
{
2008-01-22 08:52:51 +00:00
lock ( m_deadRegionCache )
{
2008-03-30 08:01:47 +00:00
if ( m_deadRegionCache . ContainsKey ( nRegionInfo . RegionHandle ) )
2008-01-22 08:52:51 +00:00
{
2008-03-30 08:01:47 +00:00
m_deadRegionCache . Remove ( nRegionInfo . RegionHandle ) ;
2008-01-22 08:52:51 +00:00
}
}
2008-03-30 08:01:47 +00:00
return m_localBackend . TriggerRegionUp ( nRegionInfo , regionhandle ) ;
2007-11-26 05:02:18 +00:00
}
catch ( RemotingException e )
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
2007-11-26 05:02:18 +00:00
return false ;
2007-07-16 15:40:11 +00:00
}
}
2007-12-27 21:41:48 +00:00
2007-12-09 05:59:49 +00:00
public bool TriggerChildAgentUpdate ( ulong regionHandle , ChildAgentDataUpdate cAgentData )
{
2008-02-05 19:44:27 +00:00
//m_log.Info("[INTER]: Incoming OGS1 Child Agent Data Update");
2007-12-09 05:59:49 +00:00
try
{
return m_localBackend . TriggerChildAgentUpdate ( regionHandle , cAgentData ) ;
}
catch ( RemotingException e )
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
2007-12-09 05:59:49 +00:00
return false ;
}
}
2007-07-16 15:40:11 +00:00
2007-11-21 02:17:24 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-11-21 02:17:24 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
2008-03-30 08:01:47 +00:00
public bool IncomingPrim ( ulong regionHandle , LLUUID primID , string objData , int XMLMethod )
2007-11-21 02:17:24 +00:00
{
2008-05-16 01:22:11 +00:00
// Is this necessary?
2007-11-21 02:17:24 +00:00
try
{
2008-03-30 08:01:47 +00:00
m_localBackend . TriggerExpectPrim ( regionHandle , primID , objData , XMLMethod ) ;
2008-02-11 01:43:54 +00:00
return true ;
2007-11-21 02:17:24 +00:00
//m_localBackend.
}
catch ( RemotingException e )
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
}
2007-12-27 21:41:48 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
2008-05-16 01:22:11 +00:00
///
2007-07-16 15:40:11 +00:00
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentID"></param>
/// <param name="position"></param>
/// <returns></returns>
2007-09-25 06:33:18 +00:00
public bool TriggerExpectAvatarCrossing ( ulong regionHandle , LLUUID agentID , LLVector3 position , bool isFlying )
2007-07-16 15:40:11 +00:00
{
2007-07-17 23:47:45 +00:00
try
2007-07-16 15:40:11 +00:00
{
2007-09-25 06:33:18 +00:00
return m_localBackend . TriggerExpectAvatarCrossing ( regionHandle , agentID , position , isFlying ) ;
2007-07-17 23:47:45 +00:00
}
2007-10-30 09:05:31 +00:00
catch ( RemotingException e )
2007-07-17 23:47:45 +00:00
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
2007-09-25 06:33:18 +00:00
return false ;
2007-07-16 15:40:11 +00:00
}
}
2007-12-27 21:41:48 +00:00
2007-11-21 02:17:24 +00:00
public bool TriggerExpectPrimCrossing ( ulong regionHandle , LLUUID agentID , LLVector3 position , bool isPhysical )
{
try
{
return m_localBackend . TriggerExpectPrimCrossing ( regionHandle , agentID , position , isPhysical ) ;
}
catch ( RemotingException e )
{
2008-03-17 16:55:12 +00:00
m_log . Error ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
}
2007-10-30 09:05:31 +00:00
2008-01-21 23:04:42 +00:00
public bool TriggerTellRegionToCloseChildConnection ( ulong regionHandle , LLUUID agentID )
{
try
{
return m_localBackend . TriggerTellRegionToCloseChildConnection ( regionHandle , agentID ) ;
}
catch ( RemotingException )
{
2008-03-17 16:55:12 +00:00
m_log . Info ( "[OGS1 GRID SERVICES]: Remoting Error: Unable to connect to neighbour to tell it to close a child connection" ) ;
2008-01-21 23:04:42 +00:00
return false ;
}
}
2007-07-16 15:40:11 +00:00
# endregion
2007-10-30 09:05:31 +00:00
2007-07-16 15:40:11 +00:00
# endregion
2008-01-20 19:12:00 +00:00
2008-01-20 21:11:55 +00:00
int timeOut = 10 ; //10 seconds
2008-01-20 19:12:00 +00:00
2008-08-08 10:59:32 +00:00
public bool CheckRegion ( string address , uint port , bool retry )
2008-01-20 19:12:00 +00:00
{
2008-08-08 10:59:32 +00:00
bool available = false ;
bool timed_out = true ;
IPAddress ia ;
2008-01-20 19:12:00 +00:00
IPAddress . TryParse ( address , out ia ) ;
IPEndPoint m_EndPoint = new IPEndPoint ( ia , ( int ) port ) ;
2008-08-08 10:59:32 +00:00
AsyncCallback callback = delegate ( IAsyncResult iar )
{
Socket s = ( Socket ) iar . AsyncState ;
try
{
s . EndConnect ( iar ) ;
available = true ;
timed_out = false ;
}
catch ( Exception e )
{
m_log . DebugFormat ( "Callback EndConnect exception: {0}:{1}" , e . Message , e . StackTrace ) ;
}
s . Close ( ) ;
} ;
2008-01-20 19:12:00 +00:00
try
{
2008-08-08 10:59:32 +00:00
Socket socket = new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ;
IAsyncResult ar = socket . BeginConnect ( m_EndPoint , callback , socket ) ;
ar . AsyncWaitHandle . WaitOne ( timeOut * 1000 , false ) ;
2008-01-20 19:12:00 +00:00
}
2008-08-08 10:59:32 +00:00
catch ( Exception e )
{
m_log . DebugFormat ( "CheckRegion Socket Setup exception: {0}:{1}" , e . Message , e . StackTrace ) ;
return false ;
}
if ( timed_out )
2008-01-20 19:12:00 +00:00
{
2008-08-08 10:59:32 +00:00
m_log . DebugFormat ( "socket [{0}] timed out ({1}) waiting to obtain a connection." , m_EndPoint , timeOut * 1000 ) ;
if ( retry )
{
return CheckRegion ( address , port , false ) ;
}
2008-01-20 19:12:00 +00:00
}
2008-08-08 10:59:32 +00:00
return available ;
}
public bool CheckRegion ( string address , uint port )
{
return CheckRegion ( address , port , true ) ;
2008-01-20 19:12:00 +00:00
}
2008-03-18 05:16:43 +00:00
2008-01-22 08:52:51 +00:00
public void NoteDeadRegion ( ulong regionhandle )
{
lock ( m_deadRegionCache )
{
if ( m_deadRegionCache . ContainsKey ( regionhandle ) )
{
m_deadRegionCache [ regionhandle ] = m_deadRegionCache [ regionhandle ] + 1 ;
}
else
{
m_deadRegionCache . Add ( regionhandle , 1 ) ;
}
}
}
2007-07-16 15:40:11 +00:00
}
2008-02-02 16:43:57 +00:00
}