2007-10-15 07:10:21 +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-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 ;
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 ;
2007-07-16 15:40:11 +00:00
using libsecondlife ;
using Nwc.XmlRpc ;
using OpenSim.Framework ;
using OpenSim.Framework.Communications ;
using OpenSim.Framework.Console ;
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
{
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 > ( ) ;
2007-11-27 13:46:52 +00:00
private List < SimpleRegionInfo > m_knownRegions = new List < SimpleRegionInfo > ( ) ;
2007-12-20 06:31:03 +00:00
private Dictionary < string , string > m_queuedGridSettings = new Dictionary < string , string > ( ) ;
2007-07-16 15:40:11 +00:00
public BaseHttpServer httpListener ;
public NetworkServersInfo serversInfo ;
public BaseHttpServer httpServer ;
2007-11-27 13:46:52 +00:00
public string _gdebugRegionName = "" ;
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
2007-11-27 13:46:52 +00:00
public string _rdebugRegionName = "" ;
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>
///
/// </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 ) ;
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
}
/// <summary>
///
/// </summary>
/// <param name="regionInfo"></param>
/// <returns></returns>
public RegionCommsListener RegisterRegion ( RegionInfo regionInfo )
{
Hashtable GridParams = new Hashtable ( ) ;
// Login / Authentication
GridParams [ "authkey" ] = serversInfo . GridSendKey ;
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 ( ) ;
2007-12-20 05:43:02 +00:00
GridParams [ "map-image-id" ] = regionInfo . EstateSettings . terrainImageID . ToString ( ) ;
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
XmlRpcRequest GridReq ;
XmlRpcResponse GridResp ;
try
{
GridReq = new XmlRpcRequest ( "simulator_login" , SendParams ) ;
GridResp = GridReq . Send ( serversInfo . GridURL , 10000 ) ;
} catch ( Exception ex )
{
2008-01-05 15:48:02 +00:00
MainLog . Instance . Error ( "Unable to connect to grid. Grid server not running?" ) ;
throw ( ex ) ;
2008-01-05 15:10:22 +00:00
}
Hashtable GridRespData = ( Hashtable ) GridResp . Value ;
2007-07-16 15:40:11 +00:00
Hashtable griddatahash = GridRespData ;
// Process Response
if ( GridRespData . ContainsKey ( "error" ) )
{
2007-12-27 21:41:48 +00:00
string errorstring = ( string ) GridRespData [ "error" ] ;
2007-07-16 15:40:11 +00:00
MainLog . Instance . Error ( "Unable to connect to grid: " + errorstring ) ;
return null ;
}
2007-11-27 13:46:52 +00:00
else
{
2007-11-28 06:18:07 +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" ) ;
}
}
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 )
{
return false ;
}
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 ] ) ;
}
2007-12-27 21:41:48 +00:00
2007-12-20 06:31:03 +00:00
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
2007-07-16 15:40:11 +00:00
/// <summary>
///
/// </summary>
/// <param name="regionInfo"></param>
/// <returns></returns>
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" ] ) ;
2007-10-30 09:05:31 +00:00
string externalUri = ( string ) neighbourData [ "sim_uri" ] ;
2007-09-24 23:58:43 +00:00
2007-10-30 09:05:31 +00:00
string externalIpStr = Util . GetHostFromDNS ( simIp ) . ToString ( ) ;
2007-10-18 15:10:43 +00:00
SimpleRegionInfo sri = new SimpleRegionInfo ( regX , regY , simIp , port ) ;
sri . RemotingPort = Convert . ToUInt32 ( neighbourData [ "remoting_port" ] ) ;
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>
///
/// </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" ) )
{
Console . WriteLine ( "error received from grid server" + responseData [ "error" ] ) ;
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" ] ) ;
2007-12-27 21:41:48 +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 ) ;
2007-11-27 13:46:52 +00:00
string neighbourExternalUri = externalUri ;
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 ;
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>
///
/// </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
}
2007-10-22 17:55:49 +00:00
if ( m_remoteRegionInfoCache . TryGetValue ( regionHandle , out regionInfo ) )
2007-07-16 15:40:11 +00:00
{
}
2007-10-22 17:55:49 +00:00
else
{
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" ) )
{
Console . WriteLine ( "error received from grid server" + responseData [ "error" ] ) ;
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" ] ) ;
2007-12-27 21:41:48 +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 ) ;
2007-11-29 02:07:19 +00:00
string neighbourExternalUri = externalUri ;
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 ;
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
2007-11-29 02:07:19 +00:00
m_remoteRegionInfoCache . Add ( regionHandle , regionInfo ) ;
}
2007-12-27 21:41:48 +00:00
catch ( WebException )
2007-11-29 02:07:19 +00:00
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Error ( "GRID" ,
"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 ;
}
/// <summary>
///
/// </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 )
{
MainLog . Instance . Error ( "MapBlockQuery XMLRPC failure: " + e . ToString ( ) ) ;
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>
///
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse ExpectUser ( XmlRpcRequest request )
{
Console . WriteLine ( "Expecting User..." ) ;
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" ] ;
2008-02-22 18:11:10 +00:00
agentData . ClientVersion = ( string ) requestData [ "version" ] ; //rex
if ( requestData . ContainsKey ( "auth_addr" ) ) {
agentData . authenticationAddr = ( string ) requestData [ "auth_addr" ] ;
}
if ( requestData . ContainsKey ( "as_addr" ) ) {
agentData . asAddress = ( string ) requestData [ "as_addr" ] ;
}
2007-07-16 15:40:11 +00:00
if ( requestData . ContainsKey ( "child_agent" ) & & requestData [ "child_agent" ] . Equals ( "1" ) )
{
agentData . child = true ;
}
else
{
2007-10-30 09:05:31 +00:00
agentData . startpos =
new LLVector3 ( Convert . ToUInt32 ( requestData [ "startpos_x" ] ) ,
Convert . ToUInt32 ( requestData [ "startpos_y" ] ) ,
Convert . ToUInt32 ( 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
m_localBackend . TriggerExpectUser ( regionHandle , agentData ) ;
2007-07-16 15:40:11 +00:00
2007-12-04 10:13:13 +00:00
MainLog . Instance . Verbose ( "GRID" , "Welcoming new user..." ) ;
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>
///
/// </summary>
private void StartRemoting ( )
{
2007-12-06 01:41:41 +00:00
TcpChannel ch = new TcpChannel ( ( int ) NetworkServersInfo . RemotingListenerPort ) ;
2007-10-21 22:15:41 +00:00
ChannelServices . RegisterChannel ( ch , false ) ; // Disabled security as Mono doesnt support this.
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 ;
2007-11-28 06:18:07 +00:00
//InterRegionSingleton.Instance.OnRegionUp += RegionUp;
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 )
{
RegionInfo regInfo = null ;
try
{
if ( m_localBackend . ChildAgentUpdate ( regionHandle , cAgentData ) )
{
return true ;
}
regInfo = RequestNeighbourInfo ( regionHandle ) ;
if ( regInfo ! = null )
{
//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 (
typeof ( OGS1InterRegionRemoting ) ,
2007-12-09 05:59:49 +00:00
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
if ( remObject ! = null )
{
retValue = remObject . ChildAgentUpdate ( regionHandle , cAgentData ) ;
}
else
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
2007-12-27 21:41:48 +00:00
MainLog . Instance . Verbose ( "INTER" ,
gdebugRegionName +
": OGS1 tried to Update Child Agent data on outside region and got " +
retValue . ToString ( ) ) ;
2007-12-09 05:59:49 +00:00
return retValue ;
}
return false ;
}
catch ( RemotingException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-12-09 05:59:49 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( SocketException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Socket Error: Unable to connect to adjacent region: " + regInfo . RegionName + " " +
regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-12-09 05:59:49 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( InvalidCredentialException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Invalid Credentials: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-12-09 05:59:49 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( AuthenticationException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Authentication exception: Unable to connect to adjacent region: " +
regInfo . RegionName + " " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-12-09 05:59:49 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( Exception e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Unknown exception: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-12-09 05:59:49 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
}
2007-11-21 02:17:24 +00:00
2007-07-16 15:40:11 +00:00
/// <summary>
///
/// </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 ;
2007-07-16 15:40:11 +00:00
2007-10-30 09:05:31 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
2007-07-18 00:27:11 +00:00
if ( remObject ! = null )
{
2007-12-07 18:20:34 +00:00
retValue = remObject . InformRegionOfChildAgent ( regionHandle , new sAgentCircuitData ( agentData ) ) ;
2007-07-18 00:27:11 +00:00
}
else
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
2007-12-27 21:41:48 +00:00
MainLog . Instance . Verbose ( "INTER" ,
gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " +
agentData . firstname + " " + agentData . lastname + " and got " +
retValue . ToString ( ) ) ;
2007-07-18 00:27:11 +00:00
return retValue ;
}
return false ;
}
2007-10-30 09:05:31 +00:00
catch ( RemotingException e )
2007-07-18 00:27:11 +00:00
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
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 )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Socket Error: Unable to connect to adjacent region: " + regInfo . RegionName + " " +
regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Invalid Credentials: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( AuthenticationException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Authentication exception: Unable to connect to adjacent region: " +
regInfo . RegionName + " " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-10-18 15:10:43 +00:00
return false ;
}
catch ( Exception e )
2007-08-08 04:59:03 +00:00
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Unknown exception: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
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!
2007-11-29 02:07:19 +00:00
public bool RegionUp ( SearializableRegionInfo region , ulong regionhandle )
2007-11-26 05:02:18 +00:00
{
2007-11-29 02:07:19 +00:00
SearializableRegionInfo regInfo = null ;
try
2007-11-26 05:02:18 +00:00
{
2007-11-29 02:07:19 +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
// it's own remoting port! How special.
region = new SearializableRegionInfo ( RequestNeighbourInfo ( region . RegionHandle ) ) ;
region . RemotingAddress = region . ExternalHostName ;
2007-12-06 01:41:41 +00:00
region . RemotingPort = NetworkServersInfo . RemotingListenerPort ;
2007-12-27 21:41:48 +00:00
if ( m_localBackend . RegionUp ( region , regionhandle ) )
2007-11-29 02:07:19 +00:00
{
return true ;
}
regInfo = new SearializableRegionInfo ( RequestNeighbourInfo ( regionhandle ) ) ;
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-11-29 02:07:19 +00:00
2007-12-27 21:41:48 +00:00
OGS1InterRegionRemoting remObject = ( OGS1InterRegionRemoting ) Activator . GetObject (
typeof (
OGS1InterRegionRemoting ) ,
"tcp://" +
regInfo . RemotingAddress +
2007-11-26 05:02:18 +00:00
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
if ( remObject ! = null )
{
2007-11-29 02:07:19 +00:00
retValue = remObject . RegionUp ( region , regionhandle ) ;
2007-11-26 05:02:18 +00:00
}
else
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
2007-11-29 02:07:19 +00:00
MainLog . Instance . Verbose ( "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
{
// We're trying to inform ourselves via remoting.
// 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 )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region using tcp://" +
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY +
" - Is this neighbor up?" ) ;
2007-11-29 02:07:19 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( SocketException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Socket Error: Unable to connect to adjacent region using tcp://" +
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY +
" - Is this neighbor up?" ) ;
2007-11-29 02:07:19 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
2007-11-26 05:02:18 +00:00
}
2007-11-29 02:07:19 +00:00
catch ( InvalidCredentialException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Invalid Credentials: Unable to connect to adjacent region using tcp://" +
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-29 02:07:19 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( AuthenticationException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Authentication exception: Unable to connect to adjacent region using tcp://" +
regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions - @ " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-29 02:07:19 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
return false ;
}
catch ( Exception e )
{
2007-12-10 00:46:56 +00:00
// This line errors with a Null Reference Exception.. Why? @.@
//MainLog.Instance.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");
2007-11-29 02:07:19 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
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>
///
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
public bool InformRegionOfPrimCrossing ( ulong regionHandle , LLUUID primID , string objData )
{
2007-11-24 02:22:05 +00:00
RegionInfo regInfo = null ;
2007-11-21 02:17:24 +00:00
try
{
2007-12-27 21:41:48 +00:00
if ( m_localBackend . InformRegionOfPrimCrossing ( regionHandle , primID , objData ) )
2007-11-21 02:17:24 +00:00
{
return true ;
}
2007-07-16 15:40:11 +00:00
2007-11-24 02:22:05 +00:00
regInfo = RequestNeighbourInfo ( regionHandle ) ;
2007-11-21 02:17:24 +00:00
if ( regInfo ! = null )
{
//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 (
typeof ( OGS1InterRegionRemoting ) ,
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
if ( remObject ! = null )
{
2007-12-27 21:41:48 +00:00
retValue = remObject . InformRegionOfPrimCrossing ( regionHandle , primID . UUID , objData ) ;
2007-11-21 02:17:24 +00:00
}
else
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
return retValue ;
}
return false ;
}
catch ( RemotingException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch ( SocketException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Socket Error: Unable to connect to adjacent region: " + regInfo . RegionName + " " +
regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch ( InvalidCredentialException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Invalid Credentials: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch ( AuthenticationException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Authentication exception: Unable to connect to adjacent region: " +
regInfo . RegionName + " " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch ( Exception e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Unknown exception: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( 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>
///
/// </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
{
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 (
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
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
2007-07-16 15:40:11 +00:00
2007-07-18 00:27:11 +00:00
return retValue ;
}
//TODO need to see if we know about where this region is and use .net remoting
// to inform it.
return false ;
}
2007-10-30 09:05:31 +00:00
catch ( RemotingException e )
2007-07-18 00:27:11 +00:00
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
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
{
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 (
typeof ( OGS1InterRegionRemoting ) ,
2007-11-21 02:17:24 +00:00
"tcp://" + regInfo . RemotingAddress +
":" + regInfo . RemotingPort +
"/InterRegions" ) ;
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
{
Console . WriteLine ( "remoting object not found" ) ;
}
remObject = null ;
return retValue ;
}
//TODO need to see if we know about where this region is and use .net remoting
// to inform it.
return false ;
}
catch ( RemotingException e )
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Warn ( "Remoting Error: Unable to connect to adjacent region: " + regInfo . RegionName +
" " + regInfo . RegionLocX + "," + regInfo . RegionLocY ) ;
2007-11-24 02:22:05 +00:00
MainLog . Instance . Debug ( e . ToString ( ) ) ;
2007-11-21 02:17:24 +00:00
return false ;
}
catch
{
return false ;
}
}
2007-07-22 11:44:36 +00:00
2007-11-04 22:22:53 +00:00
public void TellRegionToCloseChildConnection ( ulong regionHandle , LLUUID agentID )
{
}
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>
///
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
public bool IncomingChildAgent ( ulong regionHandle , AgentCircuitData agentData )
{
2007-11-27 13:46:52 +00:00
//MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 Agent " + agentData.firstname + " " + agentData.lastname);
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
{
2007-11-27 13:46:52 +00:00
//MainLog.Instance.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
}
}
2007-11-29 02:07:19 +00:00
public bool TriggerRegionUp ( SearializableRegionInfo regionData , ulong regionhandle )
2007-11-26 05:02:18 +00:00
{
2007-12-27 21:41:48 +00:00
MainLog . Instance . Verbose ( "INTER" ,
gdebugRegionName + "Incoming OGS1 RegionUpReport: " + "(" + regionData . RegionLocX +
"," + regionData . RegionLocY + ")" ) ;
2007-11-27 13:46:52 +00:00
2007-11-26 05:02:18 +00:00
try
{
2007-11-29 02:07:19 +00:00
return m_localBackend . TriggerRegionUp ( new RegionInfo ( regionData ) , regionhandle ) ;
2007-11-26 05:02:18 +00:00
}
catch ( RemotingException e )
{
MainLog . Instance . Error ( "Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
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 )
{
MainLog . Instance . Verbose ( "INTER" , "Incoming OGS1 Child Agent Data Update" ) ;
try
{
return m_localBackend . TriggerChildAgentUpdate ( regionHandle , cAgentData ) ;
}
catch ( RemotingException e )
{
MainLog . Instance . Error ( "Remoting Error: Unable to connect to adjacent region.\n" + e . ToString ( ) ) ;
return false ;
}
}
2007-07-16 15:40:11 +00:00
2007-11-21 02:17:24 +00:00
/// <summary>
///
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="agentData"></param>
/// <returns></returns>
public bool IncomingPrim ( ulong regionHandle , LLUUID primID , string objData )
{
// Is this necessary?
try
{
//return m_localBackend.TriggerExpectPrim(regionHandle,primID, objData);
//m_localBackend.
return false ;
}
catch ( RemotingException e )
{
2007-11-24 02:22:05 +00:00
MainLog . Instance . Error ( "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>
///
/// </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
{
2007-11-24 02:22:05 +00:00
MainLog . Instance . Error ( "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 )
{
2007-11-24 02:22:05 +00:00
MainLog . Instance . Error ( "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
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
}
2007-12-27 21:41:48 +00:00
}