using System;
using System.IO;
using System.Text;
using System.Configuration;
using Ion.Core;
using Ion.Storage;
using Ion.Configuration;
using Ion.Net.Connections;
namespace Ion
{
///
/// A static class that holds references to all managers and registered instances.
///
public static class IonEnvironment
{
#region Fields
private static Logging mLog = new Logging();
private static ConfigurationModule mConfig;
private static Encoding mTextEncoding = Encoding.GetEncoding(28591); // Latin1
private static DatabaseManager mDatabaseManager;
private static IonTcpConnectionManager mTcconnectionManager;
private static HabboHotel.HabboHotel mHabboHotel;
#endregion
#region Properties
public static ConfigurationModule Configuration
{
get { return mConfig; }
}
#endregion
#region Methods
public static Logging GetLog()
{
return mLog;
}
///
/// Initializes the Ion server environment.
///
public static void Initialize()
{
mLog.MinimumLogImportancy = LogType.Debug;
mLog.WriteLine("Initializing Ion environment.");
try
{
// Try to initialize configuration
try
{
mConfig = ConfigurationModule.LoadFromFile("settings.ini");
}
catch (FileNotFoundException ex)
{
mLog.WriteError("Failed to load configuration file, exception message was: " + ex.Message);
IonEnvironment.Destroy();
return;
}
// Initialize database and test a connection by getting & releasing it
DatabaseServer pDatabaseServer = new DatabaseServer(
IonEnvironment.Configuration["db1.server.host"],
IonEnvironment.Configuration.TryParseUInt32("db1.server.port"),
IonEnvironment.Configuration["db1.server.uid"],
IonEnvironment.Configuration["db1.server.pwd"]);
Database pDatabase = new Database(
IonEnvironment.Configuration["db1.name"],
IonEnvironment.Configuration.TryParseUInt32("db1.minpoolsize"),
IonEnvironment.Configuration.TryParseUInt32("db1.maxpoolsize"));
mDatabaseManager = new DatabaseManager(pDatabaseServer, pDatabase);
mDatabaseManager.SetClientAmount(2);
mDatabaseManager.ReleaseClient(mDatabaseManager.GetClient().Handle);
mDatabaseManager.StartMonitor();
// Initialize TCP listener
mTcconnectionManager = new IonTcpConnectionManager(
IonEnvironment.Configuration["net.tcp.localip"],
IonEnvironment.Configuration.TryParseInt32("net.tcp.port"),
IonEnvironment.Configuration.TryParseInt32("net.tcp.maxcon"));
mTcconnectionManager.GetListener().Start();
// Try to initialize Habbo Hotel
mHabboHotel = new Ion.HabboHotel.HabboHotel();
IonEnvironment.GetLog().WriteLine("Initialized Ion environment.");
}
catch (Exception ex) // Catch all other exceptions
{
mLog.WriteError("Unhandled exception occurred during initialization of Ion environment. Exception message: " + ex.Message);
}
}
///
/// Destroys the Ion server environment and exits the application.
///
public static void Destroy()
{
IonEnvironment.GetLog().WriteLine("Destroying Ion environment.");
// Destroy Habbo Hotel 8-) (and all inner modules etc)
if (GetHabboHotel() != null)
{
GetHabboHotel().Destroy();
}
// Clear connections
if (GetTcpConnections() != null)
{
IonEnvironment.GetLog().WriteLine("Destroying TCP connection manager.");
GetTcpConnections().GetListener().Stop();
GetTcpConnections().GetListener().Destroy();
GetTcpConnections().DestroyManager();
}
// Stop database
if (GetDatabase() != null)
{
IonEnvironment.GetLog().WriteLine("Destroying database " + GetDatabase().ToString());
GetDatabase().StopMonitor();
GetDatabase().DestroyClients();
GetDatabase().DestroyManager();
}
IonEnvironment.GetLog().WriteLine("Press a key to exit.");
Console.ReadKey();
System.Environment.Exit(0);
}
///
/// Returns the configuration module.
///
/// ConfigurationModule holding configuration values for Ion.
public static ConfigurationModule GetConfiguration()
{
return mConfig;
}
///
/// Returns the default System.Text.Encoding for encoding and decoding text.
///
/// System.Text.Encoding
public static Encoding GetDefaultTextEncoding()
{
return mTextEncoding;
}
public static DatabaseManager GetDatabase()
{
return mDatabaseManager;
}
public static IonTcpConnectionManager GetTcpConnections()
{
return mTcconnectionManager;
}
public static HabboHotel.HabboHotel GetHabboHotel()
{
return mHabboHotel;
}
#endregion
}
}