Пример #1
0
        private void GotData(XmlParserResult data)
        {
            bool lStopReading = false;

            switch (data.Type)
            {
            case XmlParserResultType.Error:
                SendStreamError(new StreamError {
                    Error = ((XmlErrorResult)data).Error
                });
                return;

            case XmlParserResultType.Node:
                XmlNodeResult nd = (XmlNodeResult)data;
                switch (nd.NodeType)
                {
                case XmlNodeType.XmlInfo: break;         // who cares about that?

                case XmlNodeType.Single:
                    if (fServerElementStack.Count == 0)
                    {
                        SendStreamError(new StreamError {
                            Error = StreamErrorKind.InvalidXml
                        });
                        return;
                    }
                    Element el = CreateNode(nd, fServerElementStack[fServerElementStack.Count - 1]);
                    if (this.fServerElementStack.Count <= 1)
                    {
                        lStopReading = GotFirstLevelElement(el);
                    }
                    break;

                case XmlNodeType.Open:
                    el = CreateNode(nd, fServerElementStack.Count == 0 ? null : fServerElementStack[fServerElementStack.Count - 1]);
                    this.fServerElementStack.Add(el);
                    if (this.fServerElementStack.Count == 1)
                    {
                        GotRootLevelElement(el);
                    }

                    break;

                case XmlNodeType.Close:
                    if (fServerElementStack.Count == 0 || !fServerElementStack[fServerElementStack.Count - 1].Matches(nd.Prefix, nd.Name))
                    {
                        SendStreamError(new StreamError {
                            Error = StreamErrorKind.InvalidXml
                        });
                        return;
                    }
                    el = fServerElementStack[fServerElementStack.Count - 1];
                    fServerElementStack.RemoveAt(fServerElementStack.Count - 1);
                    if (fServerElementStack.Count == 0)
                    {
                        Close();
                        break;
                    }
                    if (fServerElementStack.Count == 1)
                    {
                        lStopReading = GotFirstLevelElement(el);
                    }
                    break;
                }
                break;

            case XmlParserResultType.Text:
                if (fServerElementStack.Count == 0)
                {
                    // discard
                }
                else
                {
                    fServerElementStack[fServerElementStack.Count - 1].Text += ((XmlTextResult)data).Text;
                }
                break;
            }
            if (!lStopReading)
            {
                parser.ReadXmlElementAsync(new Action <XmlParserResult>(GotData), fServerElementStack.Count > 0);
            }
        }
Пример #2
0
        private Element CreateNode(XmlNodeResult nd, Element parent)
        {
            string ens;

            if (nd.Prefix != null)
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == "xmlns" && a.Name == nd.Prefix);
                if (at == null)
                {
                    Element el = parent;
                    ens = string.Empty;
                    while (el != null)
                    {
                        RemObjects.InternetPack.XMPP.Elements.Attribute els = el.Attributes.Where(a => a.Prefix == "xmlns" && a.Name == nd.Prefix).FirstOrDefault();
                        if (els != null)
                        {
                            ens = els.Value;
                            break;
                        }
                        el = el.Parent;
                    }
                }
                else
                {
                    ens = at.Value;
                }
            }
            else
            {
                RemObjects.InternetPack.XMPP.Elements.Attribute at = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                if (at == null)
                {
                    ens = string.Empty;
                }
                else
                {
                    ens = at.Value;
                }
            }
            Element res = null;

            switch (ens)
            {
            case Namespaces.ClientStreamNamespace:
            case Namespaces.ServerStreamNamespace:
            case "":
                if (ens == null && parent != null && parent.Type == ElementType.IQ && nd.Name == "error")
                {
                    res = new IQError();
                }
                else
                {
                    switch (nd.Name)
                    {
                    case "iq":
                        res = new IQ();
                        break;

                    case "presence":
                        res = new Presence();
                        break;

                    case "message":
                        res = new Message();
                        break;
                    }
                }
                break;

            case Namespaces.StreamNamespace:
                switch (nd.Name)
                {
                case "stream":

                    RemObjects.InternetPack.XMPP.Elements.Attribute att = nd.Attribute.FirstOrDefault(a => a.Prefix == null && a.Name == "xmlns");
                    if (att == null || att.Value == Namespaces.ClientStreamNamespace)
                    {
                        res = new ClientStream();
                    }
                    else
                    {
                        res = new ServerStream();
                    }
                    break;

                case "features":
                    res = new StreamFeatures();
                    break;

                case "error":
                    res = new StreamError();
                    break;
                }
                break;

            case Namespaces.StartTLSNamespace:
                switch (nd.Name)
                {
                case "starttls":
                    res = new StartTLS();
                    break;

                case "failure":
                    res = new StartTLSFailure();
                    break;

                case "proceed":
                    res = new StartTLSProceed();
                    break;
                }

                break;

            case Namespaces.SaslNamespace:
                switch (nd.Name)
                {
                case "mechanisms":
                    res = new Mechanisms();
                    break;

                case "auth":
                    res = new SaslAuth();
                    break;

                case "challenge":
                    res = new SaslChallenge();
                    break;

                case "response":
                    res = new SaslResponse();
                    break;

                case "abort":
                    res = new SaslAbort();
                    break;

                case "success":
                    res = new SaslSuccess();
                    break;

                case "failure":
                    res = new SaslFailure();
                    break;
                }
                break;
            }
            if (res == null)
            {
                res = new UnknownElement();
            }
            else
            {
                res.Attributes.Clear(); // default ones shouldn't be here during the reading process
            }
            if (parent != null)
            {
                res.Parent = parent;
                if (parent != fServerRoot)
                {
                    parent.Elements.Add(res);
                }
            }
            res.Prefix = nd.Prefix;
            res.Name   = nd.Name;
            foreach (var el in nd.Attribute)
            {
                res.Attributes.Add(el);
            }
            return(res);
        }