using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Timers;
namespace AutobotServer
{
public class ServerManager
{
#region Data
private BindingList<ServerInstance> m_ServerList;
private int m_iTotalNewInstanceCounter;
private Form1 m_pParentForm;
private ServerListenerCaller m_ServerListener;
private System.Net.Sockets.TcpListener m_TcpListener;
private BindingList<StatusPair> m_lGlobalStats;
#endregion // Data
public ServerManager(Form1 a_pParentForm)
{
m_ServerList = new BindingList<ServerInstance>();
m_iTotalNewInstanceCounter = 0;
m_pParentForm = a_pParentForm;
m_lGlobalStats = new BindingList<StatusPair>();
int iPort = Properties.Settings.Default.ListenPort;
m_TcpListener = new System.Net.Sockets.TcpListener(iPort);
m_ServerListener = new ServerListenerCaller(a_pParentForm);
m_ServerListener.ServerTcpListener = m_TcpListener;
m_ServerListener.SocketOpenedReceiver += new SocketOpenedHandler(this.NewServerConnected);
m_ServerListener.Start();
}
#region Server management
public void ServerInstanceDied(ServerInstance aInstance)
{
m_ServerList.Remove(aInstance);
}
public void NewServerConnected(object sender, SocketReceivedEventArgs e)
{
ServerInstance oNew = new ServerInstance(m_iTotalNewInstanceCounter++, e.m_Socket, m_pParentForm, this);
m_ServerList.Add(oNew);
}
public void KillAll()
{
m_ServerListener.Cancel();
foreach(var oServer in m_ServerList)
{
oServer.Cancel();
}
}
private void AddStat(StatusPair aPair)
{
if(0==aPair.CurrentCount)
{
return;
}
int iInsertIndex = m_lGlobalStats.Count;
int iIndex = 0;
foreach (var oPair in m_lGlobalStats)
{
if (oPair.Status.Equals(aPair.Status))
{
oPair.CurrentCount = oPair.CurrentCount + aPair.CurrentCount;
return;
}
if (aPair.Status.CompareTo(oPair.Status) < 0 && iInsertIndex > iIndex)
{
iInsertIndex = iIndex;
}
++iIndex;
}
m_lGlobalStats.Insert(iInsertIndex, new StatusPair(aPair.Status, aPair.CurrentCount));
}
public void RefreshStats()
{
m_lGlobalStats.Clear();
//foreach (var oPair in m_lGlobalStats)
//{
// oPair.CurrentCount = 0;
//}
foreach (var oServer in m_ServerList)
{
foreach (var oPair in oServer.m_lStats)
{
AddStat(oPair);
}
}
}
#endregion // Server management
#region Ui Interface Helper
public void BindingServerList(DataGridView a_dgManagers, DataGridView a_dgTotalStats)
{
a_dgManagers.DataSource = null;
a_dgManagers.DataSource = m_ServerList;
a_dgTotalStats.DataSource = null;
a_dgTotalStats.DataSource = m_lGlobalStats;
}
#endregion Ui Interface Helper
}
}