/// <summary>
/// Processes a connection request and creates marshals and tabs were needed.
/// </summary>
/// <param name="input">The raw connection command.</param>
/// <param name="server">The associated server, null if not applicable.</param>
private void ProcessConnectionRequest(string input, Server server)
{
Connection connection = new Connection();
ParseResult result = connection.Parse(input);
Action<IRCTabPage> connectAction = (t) =>
{
IRCTabPage serverTab;
if (t == null)
{
serverTab = new IRCTabPage(this, connection.ToString(), server == null ? connection.Server : server.Alias, IRCTabType.Server);
serverTab.Connection = connection;
serverTab.Connection.UserName = server == null ? GlobalSettings.Instance.UserName : server.UserName;
serverTab.Connection.RealName = server == null ? GlobalSettings.Instance.RealName : server.RealName;
serverTab.Connection.Nickname = server == null ? GlobalSettings.Instance.NickName : server.NickName;
serverTab.Connection.Mode = server == null ? GlobalSettings.Instance.Mode : server.Mode;
List<string> commands = null;
if (server != null)
{
commands = server.Commands;
}
IRCMarshal marshal = new IRCMarshal(connection, this.channelsTabControl, commands, this);
marshal.ChannelCreated += new IRCMarshal.ChannelCreatedHandler(this.ChannelCreated);
marshal.NetworkRegistered += (s, e) => this.InvokeAction(() => this.UpdateStatusBarText());
serverTab.Marshal = marshal;
marshal.ServerTab = serverTab;
channelsTabControl.TabPages.Add(serverTab);
this.ConfigureNewIRCMarshal(this, marshal);
}
else
{
serverTab = t;
}
channelsTabControl.SelectedTab = serverTab;
serverTab.Connection.Connect();
};
if (result.Success)
{
if (this.channelsTabControl.TabPages.ContainsKey(connection.ToString()))
{
IRCTabPage tabPage = this.channelsTabControl.TabPages[connection.ToString()] as IRCTabPage;
if (tabPage.Marshal.IsConnected)
{
this.channelsTabControl.SelectedTab = tabPage;
}
else
{
connectAction.Invoke(tabPage);
}
}
else
{
connectAction.Invoke(null);
}
}
}