2007-10-31 01:21:04 +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 .
*
* /
using System ;
2007-11-03 15:09:21 +00:00
using System.Globalization ;
2007-10-31 01:21:04 +00:00
using System.Net ;
2007-11-03 15:09:21 +00:00
using System.Xml ;
2007-10-31 01:21:04 +00:00
using System.Net.Sockets ;
using Nini.Config ;
2007-11-03 15:09:21 +00:00
using libsecondlife ;
using OpenSim.Framework.Console ;
using OpenSim.Framework ;
2007-10-31 01:21:04 +00:00
namespace OpenSim.Framework
{
public class SimpleRegionInfo
{
public SimpleRegionInfo ( )
{
}
public SimpleRegionInfo ( uint regionLocX , uint regionLocY , IPEndPoint internalEndPoint , string externalUri )
{
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
m_regionLocX = regionLocX ;
m_regionLocY = regionLocY ;
m_internalEndPoint = internalEndPoint ;
m_externalHostName = externalUri ;
}
public SimpleRegionInfo ( uint regionLocX , uint regionLocY , string externalUri , int port )
{
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
m_regionLocX = regionLocX ;
m_regionLocY = regionLocY ;
m_externalHostName = externalUri ;
m_internalEndPoint = new IPEndPoint ( IPAddress . Parse ( "0.0.0.0" ) , port ) ;
}
2007-11-24 10:36:54 +00:00
public LLUUID RegionID = LLUUID . Zero ;
2007-10-31 01:21:04 +00:00
private uint m_remotingPort ;
public uint RemotingPort
{
2007-11-03 15:09:21 +00:00
get
{
return m_remotingPort ;
}
set
{
m_remotingPort = value ;
}
2007-10-31 01:21:04 +00:00
}
public string RemotingAddress ;
public IPEndPoint ExternalEndPoint
{
get
{
// Old one defaults to IPv6
//return new IPEndPoint( Dns.GetHostAddresses( m_externalHostName )[0], m_internalEndPoint.Port );
IPAddress ia = null ;
// If it is already an IP, don't resolve it - just return directly
if ( IPAddress . TryParse ( m_externalHostName , out ia ) )
return new IPEndPoint ( ia , m_internalEndPoint . Port ) ;
// Reset for next check
ia = null ;
// New method favors IPv4
foreach ( IPAddress Adr in Dns . GetHostAddresses ( m_externalHostName ) )
{
if ( ia = = null )
ia = Adr ;
if ( Adr . AddressFamily = = AddressFamily . InterNetwork )
{
ia = Adr ;
break ;
}
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
}
return new IPEndPoint ( ia , m_internalEndPoint . Port ) ;
}
2007-11-03 15:09:21 +00:00
set
{
m_externalHostName = value . ToString ( ) ;
}
2007-10-31 01:21:04 +00:00
}
protected string m_externalHostName ;
public string ExternalHostName
{
2007-11-03 15:09:21 +00:00
get
{
return m_externalHostName ;
}
set
{
m_externalHostName = value ;
}
2007-10-31 01:21:04 +00:00
}
protected IPEndPoint m_internalEndPoint ;
public IPEndPoint InternalEndPoint
{
2007-11-03 15:09:21 +00:00
get
{
return m_internalEndPoint ;
}
set
{
m_internalEndPoint = value ;
}
2007-10-31 01:21:04 +00:00
}
protected uint? m_regionLocX ;
public uint RegionLocX
{
2007-11-03 15:09:21 +00:00
get
{
return m_regionLocX . Value ;
}
set
{
m_regionLocX = value ;
}
2007-10-31 01:21:04 +00:00
}
protected uint? m_regionLocY ;
public uint RegionLocY
{
2007-11-03 15:09:21 +00:00
get
{
return m_regionLocY . Value ;
}
set
{
m_regionLocY = value ;
}
2007-10-31 01:21:04 +00:00
}
public ulong RegionHandle
{
2007-11-03 15:09:21 +00:00
get
{
return Util . UIntsToLong ( ( RegionLocX * 256 ) , ( RegionLocY * 256 ) ) ;
}
2007-10-31 01:21:04 +00:00
}
}
public class RegionInfo : SimpleRegionInfo
{
public string RegionName = "" ;
public string DataStore = "" ;
public bool isSandbox = false ;
2007-11-24 10:36:54 +00:00
public LLUUID MasterAvatarAssignedUUID = LLUUID . Zero ;
2007-10-31 01:21:04 +00:00
public string MasterAvatarFirstName = "" ;
public string MasterAvatarLastName = "" ;
public string MasterAvatarSandboxPassword = "" ;
// Apparently, we're applying the same estatesettings regardless of whether it's local or remote.
private static EstateSettings m_estateSettings ;
public EstateSettings EstateSettings
{
get
{
2007-11-03 15:09:21 +00:00
if ( m_estateSettings = = null )
2007-10-31 01:21:04 +00:00
{
m_estateSettings = new EstateSettings ( ) ;
}
return m_estateSettings ;
}
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
}
public ConfigurationMember configMember ;
public RegionInfo ( string description , string filename )
{
2007-11-03 15:09:21 +00:00
configMember = new ConfigurationMember ( filename , description , loadConfigurationOptions , handleIncomingConfiguration ) ;
configMember . performConfigurationRetrieve ( ) ;
}
public RegionInfo ( string description , XmlNode xmlNode )
{
configMember = new ConfigurationMember ( xmlNode , description , loadConfigurationOptions , handleIncomingConfiguration ) ;
2007-10-31 01:21:04 +00:00
configMember . performConfigurationRetrieve ( ) ;
}
public RegionInfo ( uint regionLocX , uint regionLocY , IPEndPoint internalEndPoint , string externalUri ) :
base ( regionLocX , regionLocY , internalEndPoint , externalUri )
{
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
}
public RegionInfo ( )
{
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
}
//not in use, should swap to nini though.
public void LoadFromNiniSource ( IConfigSource source )
{
2007-11-03 15:09:21 +00:00
this . LoadFromNiniSource ( source , "RegionInfo" ) ;
2007-10-31 01:21:04 +00:00
}
//not in use, should swap to nini though.
public void LoadFromNiniSource ( IConfigSource source , string sectionName )
{
string errorMessage = "" ;
2007-11-03 15:09:21 +00:00
this . RegionID = new LLUUID ( source . Configs [ sectionName ] . GetString ( "Region_ID" , LLUUID . Random ( ) . ToStringHyphenated ( ) ) ) ;
this . RegionName = source . Configs [ sectionName ] . GetString ( "sim_name" , "OpenSim Test" ) ;
this . m_regionLocX = Convert . ToUInt32 ( source . Configs [ sectionName ] . GetString ( "sim_location_x" , "1000" ) ) ;
this . m_regionLocY = Convert . ToUInt32 ( source . Configs [ sectionName ] . GetString ( "sim_location_y" , "1000" ) ) ;
2007-11-15 19:53:10 +00:00
// this.DataStore = source.Configs[sectionName].GetString("datastore", "OpenSim.db");
2007-10-31 01:21:04 +00:00
string ipAddress = source . Configs [ sectionName ] . GetString ( "internal_ip_address" , "0.0.0.0" ) ;
IPAddress ipAddressResult ;
if ( IPAddress . TryParse ( ipAddress , out ipAddressResult ) )
{
2007-11-03 15:09:21 +00:00
this . m_internalEndPoint = new IPEndPoint ( ipAddressResult , 0 ) ;
2007-10-31 01:21:04 +00:00
}
else
{
errorMessage = "needs an IP Address (IPAddress)" ;
}
2007-11-03 15:09:21 +00:00
this . m_internalEndPoint . Port = source . Configs [ sectionName ] . GetInt ( "internal_ip_port" , NetworkServersInfo . DefaultHttpListenerPort ) ;
2007-10-31 01:21:04 +00:00
string externalHost = source . Configs [ sectionName ] . GetString ( "external_host_name" , "127.0.0.1" ) ;
if ( externalHost ! = "SYSTEMIP" )
{
2007-11-03 15:09:21 +00:00
this . m_externalHostName = externalHost ;
2007-10-31 01:21:04 +00:00
}
else
{
2007-11-03 15:09:21 +00:00
this . m_externalHostName = Util . GetLocalHost ( ) . ToString ( ) ;
2007-10-31 01:21:04 +00:00
}
2007-11-03 15:09:21 +00:00
this . MasterAvatarFirstName = source . Configs [ sectionName ] . GetString ( "master_avatar_first" , "Test" ) ;
this . MasterAvatarLastName = source . Configs [ sectionName ] . GetString ( "master_avatar_last" , "User" ) ;
this . MasterAvatarSandboxPassword = source . Configs [ sectionName ] . GetString ( "master_avatar_pass" , "test" ) ;
2007-10-31 01:21:04 +00:00
if ( errorMessage ! = "" )
{
// a error
}
}
public void loadConfigurationOptions ( )
{
2007-11-03 15:09:21 +00:00
configMember . addConfigurationOption ( "sim_UUID" , ConfigurationOption . ConfigurationTypes . TYPE_LLUUID , "UUID of Region (Default is recommended, random UUID)" , LLUUID . Random ( ) . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "sim_name" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY , "Region Name" , "OpenSim Test" , false ) ;
configMember . addConfigurationOption ( "sim_location_x" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 , "Grid Location (X Axis)" , "1000" , false ) ;
configMember . addConfigurationOption ( "sim_location_y" , ConfigurationOption . ConfigurationTypes . TYPE_UINT32 , "Grid Location (Y Axis)" , "1000" , false ) ;
2007-11-15 19:53:10 +00:00
//configMember.addConfigurationOption("datastore", ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY, "Filename for local storage", "OpenSim.db", false);
2007-11-03 15:09:21 +00:00
configMember . addConfigurationOption ( "internal_ip_address" , ConfigurationOption . ConfigurationTypes . TYPE_IP_ADDRESS , "Internal IP Address for incoming UDP client connections" , "0.0.0.0" , false ) ;
configMember . addConfigurationOption ( "internal_ip_port" , ConfigurationOption . ConfigurationTypes . TYPE_INT32 , "Internal IP Port for incoming UDP client connections" , NetworkServersInfo . DefaultHttpListenerPort . ToString ( ) , false ) ;
configMember . addConfigurationOption ( "external_host_name" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY , "External Host Name" , "127.0.0.1" , false ) ;
2007-11-03 17:49:45 +00:00
configMember . addConfigurationOption ( "master_avatar_uuid" , ConfigurationOption . ConfigurationTypes . TYPE_LLUUID , "Master Avatar UUID" , LLUUID . Zero . ToString ( ) , true ) ;
configMember . addConfigurationOption ( "master_avatar_first" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY , "First Name of Master Avatar" , "Test" , false , ( ConfigurationOption . ConfigurationOptionShouldBeAsked ) shouldMasterAvatarDetailsBeAsked ) ;
configMember . addConfigurationOption ( "master_avatar_last" , ConfigurationOption . ConfigurationTypes . TYPE_STRING_NOT_EMPTY , "Last Name of Master Avatar" , "User" , false , ( ConfigurationOption . ConfigurationOptionShouldBeAsked ) shouldMasterAvatarDetailsBeAsked ) ;
configMember . addConfigurationOption ( "master_avatar_pass" , ConfigurationOption . ConfigurationTypes . TYPE_STRING , "(Sandbox Mode Only)Password for Master Avatar account" , "test" , false , ( ConfigurationOption . ConfigurationOptionShouldBeAsked ) shouldMasterAvatarDetailsBeAsked ) ;
}
public bool shouldMasterAvatarDetailsBeAsked ( string configuration_key )
{
2007-11-18 15:14:37 +00:00
if ( MasterAvatarAssignedUUID . Equals ( null ) | | MasterAvatarAssignedUUID . ToStringHyphenated ( ) = = LLUUID . Zero . ToStringHyphenated ( ) )
2007-11-03 17:49:45 +00:00
{
return true ;
}
return false ;
2007-10-31 01:21:04 +00:00
}
public bool handleIncomingConfiguration ( string configuration_key , object configuration_result )
{
switch ( configuration_key )
{
case "sim_UUID" :
2007-11-03 15:09:21 +00:00
this . RegionID = ( LLUUID ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_name" :
2007-11-03 15:09:21 +00:00
this . RegionName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_location_x" :
2007-11-03 15:09:21 +00:00
this . m_regionLocX = ( uint ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "sim_location_y" :
2007-11-03 15:09:21 +00:00
this . m_regionLocY = ( uint ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "datastore" :
2007-11-03 15:09:21 +00:00
this . DataStore = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "internal_ip_address" :
2007-11-03 15:09:21 +00:00
IPAddress address = ( IPAddress ) configuration_result ;
this . m_internalEndPoint = new IPEndPoint ( address , 0 ) ;
2007-10-31 01:21:04 +00:00
break ;
case "internal_ip_port" :
2007-11-03 15:09:21 +00:00
this . m_internalEndPoint . Port = ( int ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "external_host_name" :
2007-11-03 15:09:21 +00:00
if ( ( string ) configuration_result ! = "SYSTEMIP" )
2007-10-31 01:21:04 +00:00
{
2007-11-03 15:09:21 +00:00
this . m_externalHostName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
}
else
{
2007-11-03 15:09:21 +00:00
this . m_externalHostName = Util . GetLocalHost ( ) . ToString ( ) ;
2007-10-31 01:21:04 +00:00
}
break ;
2007-11-03 17:49:45 +00:00
case "master_avatar_uuid" :
this . MasterAvatarAssignedUUID = ( LLUUID ) configuration_result ;
break ;
2007-10-31 01:21:04 +00:00
case "master_avatar_first" :
2007-11-03 15:09:21 +00:00
this . MasterAvatarFirstName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "master_avatar_last" :
2007-11-03 15:09:21 +00:00
this . MasterAvatarLastName = ( string ) configuration_result ;
2007-10-31 01:21:04 +00:00
break ;
case "master_avatar_pass" :
2007-11-03 15:09:21 +00:00
string tempMD5Passwd = ( string ) configuration_result ;
this . MasterAvatarSandboxPassword = Util . Md5Hash ( Util . Md5Hash ( tempMD5Passwd ) + ":" + "" ) ;
2007-10-31 01:21:04 +00:00
break ;
}
return true ;
}
2007-11-03 15:09:21 +00:00
2007-10-31 01:21:04 +00:00
}
2007-11-03 15:09:21 +00:00
}