예제 #1
0
        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);
        }