private string recvStream() { if (tcpClient == null) { if (Error != null) { Error(this, new XmppErrorEventArgs(XmppErrorType.ClientNotConnected, string.Empty, string.Empty)); } return(string.Empty); } int iteration = 0; StringBuilder buf = new StringBuilder(); while (true) { string internalBuf = tcpClient.ReadStream(); if (string.IsNullOrWhiteSpace(internalBuf)) { break; } if (internalBuf.Contains("<stream:error")) { if (RecvStreamCallback != null) { RecvStreamCallback(this, new XmppEventArgs(buf.Append(internalBuf).ToString())); } if (Error != null) { string tag, message; XmppError.Parse(XmppIQ.Parse(internalBuf), out tag, out message); Error(this, new XmppErrorEventArgs(XmppErrorType.XmppStreamError, tag, message)); } Disconnect(); break; } else if (internalBuf.Contains("</stream:stream>")) { if (RecvStreamCallback != null) { RecvStreamCallback(this, new XmppEventArgs(buf.Append(internalBuf).ToString())); } if (Error != null) { Error(this, new XmppErrorEventArgs(XmppErrorType.ConnectionClosedByServer, string.Empty, string.Empty)); } Disconnect(); break; } buf.Append(internalBuf); if (state == XmppEngineState.Open) { if (XmppStream.IsValid(buf.ToString())) { break; } } else { break; } iteration++; if (iteration > 100) { if (Error != null) { Error(this, new XmppErrorEventArgs(XmppErrorType.RecvTooManyInvalidStream, string.Empty, "")); } Disconnect(); return(string.Empty); } } if (RecvStreamCallback != null) { RecvStreamCallback(this, new XmppEventArgs(buf.ToString())); } // flush string buffer string stringBuffer = buf.ToString(); buf.EnsureCapacity(0); // it's ok, return a valid stream return(stringBuffer); }