private void Start() { try { Messages.protocol = this; Core.SystemForm.Chat.scrollback.InsertText(messages.get("loading-server", Core.SelectedLanguage, new List<string> { this.Server }), Client.ContentLine.MessageStyle.System); if (!SSL) { _networkStream = new System.Net.Sockets.TcpClient(Server, Port).GetStream(); _StreamWriter = new System.IO.StreamWriter(_networkStream); _StreamReader = new System.IO.StreamReader(_networkStream, NetworkEncoding); } if (SSL) { System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(Server, Port); _networkSsl = new System.Net.Security.SslStream(client.GetStream(), true, new System.Net.Security.RemoteCertificateValidationCallback(Protocol.ValidateServerCertificate), null); _networkSsl.AuthenticateAsClient(Server); _StreamWriter = new System.IO.StreamWriter(_networkSsl); _StreamReader = new System.IO.StreamReader(_networkSsl, NetworkEncoding); } Hooks._Protocol.BeforeConnect(this); Connected = true; if (!string.IsNullOrEmpty(Password)) { Send("PASS " + Password); } Send("USER " + _IRCNetwork.Ident + " 8 * :" + _IRCNetwork.UserName); Send("NICK " + _IRCNetwork.Nickname); Core.SystemForm.Status(""); keep = new Thread(_Ping); keep.Name = "pinger thread"; keep.Start(); Core.SystemThreads.Add(keep); } catch (Exception b) { Core.SystemForm.Chat.scrollback.InsertText(b.Message, Client.ContentLine.MessageStyle.System); return; } string text = ""; try { deliveryqueue = new System.Threading.Thread(Messages.Run); deliveryqueue.Start(); while (!_StreamReader.EndOfStream && IsConnected) { if (!_IRCNetwork.IsConnected) { _IRCNetwork.flagConnection(); } while (Core.IsBlocked) { System.Threading.Thread.Sleep(100); } text = _StreamReader.ReadLine(); Core.trafficscanner.Insert(Server, " >> " + text); ProcessorIRC processor = new ProcessorIRC(_IRCNetwork, text, ref pong); processor.ProfiledResult(); pong = processor.pong; } } catch (ThreadAbortException) { return; } catch (System.Net.Sockets.SocketException) { SafeDc(); } catch (System.IO.IOException) { SafeDc(); } catch (Exception ex) { Core.handleException(ex); } Core.KillThread(System.Threading.Thread.CurrentThread); return; }
/// <summary> /// Data /// </summary> /// <param name="curr">XmlNode</param> /// <param name="protocol">Protocol which owns this request</param> public static void sData(XmlNode curr, ProtocolSv protocol) { long date = 0; bool backlog = false; bool IsBacklog = false; string MQID = null; bool range = false; string id = ""; foreach (XmlAttribute xx in curr.Attributes) { switch (xx.Name) { case "time": if (!long.TryParse(xx.Value, out date)) { Core.DebugLog("Warning: " + xx.Value + " is not a correct time"); } break; case "MQID": MQID = xx.Value; break; case "buffer": if (xx.Name == "buffer") { id = xx.Value; backlog = true; } break; case "range": range = true; break; } } string name = curr.Attributes[0].Value; Network server = null; server = protocol.retrieveNetwork(name); if (server == null) { server = new Network(name, protocol); protocol.NetworkList.Add(server); protocol.cache.Add(new Cache()); server.Nickname = protocol.nick; server.flagConnection(); } if (Configuration.Services.UsingCache) { if (MQID != null) { string UID = protocol.sBuffer.getUID(name); if (UID != null) { protocol.sBuffer.networkInfo[UID].MQID(MQID); } } } ProcessorIRC processor = null; if (backlog || range) { if (Core.SystemForm.DisplayingProgress == false) { Core.SystemForm.progress = double.Parse(id); Core.SystemForm.DisplayingProgress = true; protocol.FinishedLoading = false; protocol.SuppressChanges = true; Core.SystemForm.ProgressMax = protocol.cache[protocol.NetworkList.IndexOf(server)].size; } IsBacklog = true; Core.SystemForm.progress = double.Parse(id); Core.SystemForm.Status("Retrieving backlog from " + name + ", got " + id + "/" + protocol.cache[protocol.NetworkList.IndexOf(server)].size.ToString() + " datagrams"); if ((protocol.cache[protocol.NetworkList.IndexOf(server)].size - 2) < double.Parse(id)) { IsBacklog = false; Core.SystemForm.Status(protocol.getInfo()); Core.SystemForm.DisplayingProgress = false; Core.SystemForm.progress = 0; protocol.SuppressChanges = false; if (Configuration.Services.UsingCache && Configuration.Services.MissingFix) { // get all holes we are missing from backlog protocol.sBuffer.retrieveData(name); } foreach (Channel i in server.Channels) { i.TemporarilyHidden = false; i.IsParsingExceptionData = false; i.IsParsingBanData = false; i.IsParsingWhoData = false; } } processor = new ProcessorIRC(server, curr.InnerText, ref protocol.pong, date, false); processor.IsBacklog = IsBacklog; processor.ProfiledResult(); return; } processor = new ProcessorIRC(server, curr.InnerText, ref protocol.pong, date); processor.IsBacklog = IsBacklog; processor.ProfiledResult(); }