private void Ready(int StatusCode, string StatusLine) { SocketStatus = NNTPStatus.Singleline; if (Connected != null) { Connected(StatusCode, StatusLine, this); } }
public bool Connect() { try { if (iConnection.Cancelled) { return(false); } if (SocketStatus == NNTPStatus.Multiline) { SocketStatus = NNTPStatus.Singleline; } if (SocketStatus == NNTPStatus.Singleline) { Ready(0, ""); return(true); } SocketStatus = NNTPStatus.Connecting; if (iSocket == null) { if (!iServer.SSL) { iSocket = new Socket(); } else { iSocket = new SSLSocket(); } iSocket.Received += new EventHandler <WorkArgs>(iReceived); iSocket.Connected += new EventHandler <WorkArgs>(iConnected); iSocket.Disconnected += new EventHandler <WorkArgs>(iDisconnected); } return(iSocket.Connect(iServer)); } catch (Exception ex) { Disconnect(996, ex.Message, false); return(false); } }
private void iDisconnected(object sender, WorkArgs e) { iSocket = null; SocketStatus = NNTPStatus.Closed; //Debug.WriteLine("iDisconnected: " + e.Message); try { if ((e != null) && (Failed != null)) { Failed(e.Code, e.Message, iServer.Log, this); } } catch { } if (Closed != null) { Closed(this); } }
private void Process(int NNTPCode, Stream bData) { string sHeader = "Binary (" + bData.Length + " bytes)"; if (SocketStatus != NNTPStatus.Multiline) { sHeader = Common.GetReader(bData).ReadLine(); } //iServer.WriteDebug(Module.VbLeft((Convert.ToString(NNTPCode) + "000"), 3), sHeader); if ((NNTPCode == (int)NNTPCodes.GoodBye) || (iConnection.Cancelled) || (NNTPCode == 512)) { if (NNTPCode <= 0) { NNTPCode = 991; } Disconnect(NNTPCode, sHeader, iConnection.Cancelled); return; } switch (SocketStatus) { case NNTPStatus.Connecting: switch (NNTPCode) { case (int)NNTPCodes.PostingAllowed: case (int)NNTPCodes.PostingDisallowed: StatusLine = sHeader; SocketStatus = NNTPStatus.Authenticating; SendLines("MODE READER"); return; default: if (NNTPCode <= 0) { NNTPCode = 991; } Disconnect(NNTPCode, sHeader, true); break; } break; case NNTPStatus.Authenticating: switch (NNTPCode) { case (int)NNTPCodes.Authenticated1: case (int)NNTPCodes.Authenticated2: Ready(NNTPCode, StatusLine); break; case (int)NNTPCodes.MoreAuthentication: SendLines("AUTHINFO PASS " + iServer.Password); break; case (int)NNTPCodes.PostingAllowed: case (int)NNTPCodes.PostingDisallowed: if (iServer.Username.Trim().Length == 0) { Ready(NNTPCode, StatusLine); } else { SendLines("AUTHINFO USER " + iServer.Username); } break; case (int)NNTPCodes.AuthRequired: case (int)NNTPCodes.TransferDenied: SendLines("AUTHINFO USER " + iServer.Username); break; case (int)NNTPCodes.AuthRejected: case (int)NNTPCodes.AuthFailed1: case (int)NNTPCodes.AuthFailed2: default: if (NNTPCode <= 0) { NNTPCode = 991; } Disconnect(NNTPCode, sHeader, true); break; } break; case NNTPStatus.Singleline: if (Response != null) { Response(NNTPCode, sHeader, this); } break; case NNTPStatus.Multiline: if (Received != null) { Received(bData, this); } break; default: Disconnect(993, "Status", true); break; } }
private void iReceived(object sender, WorkArgs e) { string sBOF = ""; string sEOF = ""; byte lBOFLength = 3; byte lEOFLength = 5; bool bFinished = false; try { if (SocketStatus != NNTPStatus.Multiline) { if (e.Data.Length >= lBOFLength) { sBOF = Common.GetBOF(e.Data, lBOFLength); StatusCode = Common.GetCode(sBOF); switch (StatusCode) { case (int)NNTPCodes.GroupsFollow: case (int)NNTPCodes.XINDEXFollows: case (int)NNTPCodes.ArticleFollows: case (int)NNTPCodes.HeadFollows: case (int)NNTPCodes.BodyFollows: case (int)NNTPCodes.StatFollows: case (int)NNTPCodes.XOVERFollows: case (int)NNTPCodes.NewNewsFollows: case (int)NNTPCodes.XGTITLEFollows: case (int)NNTPCodes.XTHREADFollows: SocketStatus = NNTPStatus.Multiline; break; } } } int lPos = Convert.ToInt32(e.Data.Length - lEOFLength); if (lPos >= 0) { sEOF = Common.GetEOF(e.Data, lEOFLength); switch (SocketStatus) { case NNTPStatus.Multiline: bFinished = (sEOF == (Environment.NewLine + "." + Environment.NewLine)); break; default: bFinished = (Common.VbRight(sEOF, 2) == Environment.NewLine); break; } } if (!bFinished) { Receive(); return; } e.Data.Seek(0, SeekOrigin.Begin); Process(StatusCode, e.Data); } catch (Exception ex) { Disconnect(992, "Received: " + ex.Message, false); } }