Esempio n. 1
0
 private XmlElement CreateSessionRequest()
 {
     return(IqStanza.Set()
            .NewId()
            .Children(new XmlElement("session")
                      .Xmlns(XmppNamespaces.Session)));
 }
Esempio n. 2
0
        private static XmlElement CreateRemoveItemRequest(Jid entityJid, RosterItem item)
        {
            var itemElement = ToXmlElement(item);

            itemElement.SetAttributeValue("subscription", "remove");

            return(AttachQuery(IqStanza.Set().From(entityJid), itemElement));
        }
Esempio n. 3
0
        private static XmlElement CreateRosterStanza(string type, params RosterItem[] rosterItems)
        {
            var result = IqStanza.New().Type(type);
            var items  = rosterItems.Select(i => new XmlElement("item").Attribute("jid", i.Jid).Attribute("name", i.Name));

            result.Children.Add(new XmlElement("query", items.ToArray()).Xmlns(XmppNamespaces.Roster));

            return(result);
        }
Esempio n. 4
0
        public static bool Authentication2Response(string Response)
        {
            cleanErrors();
            bool result = true;

            XmlDocument xml = new XmlDocument();
            IqStanza    iq  = null;

            try
            {
                iq = new IqStanza(Response);
            }
            catch (JabberException je)
            {
                iq       = null;
                MsgError = je.Message + "\nError loading XML received from server.";
                result   = false;
            }
            if (result)
            {
                if (iq != null)
                {
                    if (iq.Id == "auth2")
                    {
                        if (iq.Type != "result")
                        {
                            result = false;
                            // type of error

                            /*XmlNode xmlError = xml.FirstChild.LastChild;
                             * Console.WriteLine(xmlError.Name);
                             * if (xmlError != null && xmlError.Name == "error") {
                             * errorType (xmlError);
                             * } else {
                             * MsgError = "Unknown error in authentication process.";
                             * }*/
                        }
                    }
                    else
                    {
                        MsgError = "Wrong \"id\" attribute received from server.";
                        result   = false;
                    }
                }
                else
                {
                    MsgError = "Incorrect XML response received from server.";
                    result   = false;
                }
            }
            return(result);
        }
Esempio n. 5
0
        private static XmlElement CreateAddOrUpdateItemRequest(Jid entityJid, RosterItem rosterItem)
        {
            var item = ToXmlElement(rosterItem);

            if (!string.IsNullOrEmpty(rosterItem.Name))
            {
                item.SetAttributeValue("name", rosterItem.Name);
            }

            //for (int i = 0; i < groups.Length; i++)
            //{
            //    item.Children.Add(new XmlElement("group").Value(groups[i]));
            //}

            return(AttachQuery(IqStanza.Set().From(entityJid), item));
        }
Esempio n. 6
0
        private XmlElement CreateBindRequest(string resource)
        {
            var bindIq = IqStanza.Set().NewId();
            var bind   = new XmlElement("bind").Xmlns(XmppNamespaces.Bind);

            bindIq.Children(bind);

            if (!string.IsNullOrEmpty(resource))
            {
                bind.Children(new XmlElement("resource")
                {
                    Value = resource
                });
            }

            return(bindIq);
        }
 private void OnIqStanzaTag(IqStanza iqStanza)
 {
 }
Esempio n. 8
0
        public static bool Authentication1Response(string Response, out ArrayList LoginParamaters)
        {
            cleanErrors();
            bool result = true;

            ArrayList loginParamaters = null;

            IqStanza iq = null;

            try
            {
                iq = new IqStanza(Response);
            }
            catch (JabberException je)
            {
                iq       = null;
                MsgError = je.Message + "\nError loading XML received from server.";
                result   = false;
            }
            if (result)
            {
                if (iq != null)
                {
                    if (iq.Type == "result")
                    {
                        if (iq.Id == "auth1")
                        {
                            if (!query(iq.ChildNode, out loginParamaters))
                            {
                                result = false;
                            }
                        }
                        else
                        {
                            MsgError = "Wrong \"id\" attribute received from server.";
                            result   = false;
                        }
                    }
                    else
                    {
                        // type of error

                        /*XmlNode xmlError = xml.FirstChild.LastChild;
                         * if (xmlError != null && xmlError.Name == "error") {
                         * errorType (xmlError);
                         * } else {
                         * MsgError = "Unknown error in authentication process.";
                         * }*/
                        result = false;
                    }
                }
                else
                {
                    MsgError = "Incorrect XML response received from server.";
                    result   = false;
                }
            }

            if (result)
            {
                LoginParamaters = loginParamaters;
            }
            else
            {
                LoginParamaters = null;
            }

            return(result);
        }
Esempio n. 9
0
 private static XmlElement CreateRosterRequest(Jid entityJid) => AttachQuery(IqStanza.Get().From(entityJid)).NewId();
Esempio n. 10
0
        public bool connectMcs(string androidId, string securityToken)
        {
            util.debugWriteLine("connectMcs " + androidId + " " + securityToken);
            try
            {
                var lr = new LoginRequest();
                lr.AdaptiveHeartbeat = false;
                lr.auth_service      = LoginRequest.AuthService.AndroidId;
                lr.AuthToken         = securityToken;
                lr.Id          = "android-11";
                lr.Domain      = "mcs.android.com";
                lr.DeviceId    = "android-" + long.Parse(androidId).ToString("x");
                lr.NetworkType = 1;
                lr.Resource    = androidId;
                lr.User        = androidId;
                lr.UseRmq2     = true;
                lr.AccountId   = long.Parse(androidId);
                lr.ReceivedPersistentIds.Add("");                  //# possible source of error
                var setting = new Setting();
                setting.Name  = "new_vc";
                setting.Value = "1";
                lr.Settings.Add(setting);
                //var x = lr.ToByteArray();

                byte[] x;
                using (var ms = new MemoryStream())
                {
                    Serializer.Serialize(ms, lr);
                    x = ms.ToArray();
                }


                using (var client = new TcpClient("mtalk.google.com", 5228))
                    using (sslStream = new SslStream(client.GetStream(), false, delegate { return(true); }))
                    {
                        sslStream.AuthenticateAsClient("mtalk.google.com");
                        //var _buf = VarintBitConverter.GetVarintBytes((int)x.Length);
                        var _buf = VarintBitConverter.GetVarintBytes((uint)x.Length);

                        /*
                         * var num = x.Length;
                         * var _buf = new List<byte>();
                         * while (true) {
                         *      var towrite = num & 0x7f;
                         *      num >>= 7;
                         *      if (num == 1)
                         *              _buf.Add((byte)(towrite | 0x80));
                         *      else {
                         *              _buf.Add((byte)towrite);
                         *              break;
                         *      }
                         * }
                         */
                        //util.debugWriteLine(_buf.ToArray() + " x len " + x.Length);
                        util.debugWriteLine(_buf + " x len " + x.Length);
                        sslStream.Write(new byte[] { 41, 2 });
                        sslStream.Write(_buf);
                        sslStream.Write(x);
                        sslStream.Flush();

                        var version = sslStream.ReadByte();
                        util.debugWriteLine(version);

                        Task.Factory.StartNew(() =>
                        {
                            while (isRetry)
                            {
                                //Thread.Sleep(15000);

                                Thread.Sleep(60 * 60 * 1000);
                                util.debugWriteLine(DateTime.Now.ToString() + " ping " + sslStream.GetHashCode());
                                try
                                {
                                    sslStream.Write(new byte[] { 0x07, 0x0e, 0x10, 0x01, 0x1a, 0x00, 0x3a, 0x04, 0x08, 0x0d, 0x12, 0x00, 0x50, 0x03, 0x60, 0x00 });
                                    //s.send(b'\x00\x04\x10\x08\x18\x00')
                                }
                                catch (Exception e)
                                {
                                    util.debugWriteLine("ping error " + e.Message + e.Source + e.StackTrace + e.TargetSite);
                                    break;
                                }
                            }
                            util.debugWriteLine("ping end " + sslStream.GetHashCode());
                        });

                        while (isRetry)
                        {
                            var responseTag = sslStream.ReadByte();

                            util.debugWriteLine(DateTime.Now + " resp tag " + responseTag + " " + (char)responseTag);

                            var msg = new List <byte>();
                            if (responseTag == 0x03 || responseTag == 0x07 ||
                                responseTag == 0x08)
                            {
                                //var length = varIntDecodeStream(sslStream);
                                var length  = 0;
                                var _lenBuf = new List <byte>();
                                for (var i = 0; i < 10; i++)
                                {
                                    var _slb = sslStream.ReadByte();
                                    _lenBuf.Add((byte)_slb);
                                    if (_lenBuf[_lenBuf.Count - 1] > 128)
                                    {
                                        _lenBuf.Add((byte)sslStream.ReadByte());
                                    }
                                    try
                                    {
                                        length = VarintBitConverter.ToInt32(_lenBuf.ToArray()) * 1;
                                        var length2 = VarintBitConverter.ToInt16(_lenBuf.ToArray()) * 1;
                                        var length3 = VarintBitConverter.ToInt64(_lenBuf.ToArray()) * 1;
                                        var length4 = VarintBitConverter.ToUInt16(_lenBuf.ToArray()) * 1;
                                        var length5 = VarintBitConverter.ToUInt32(_lenBuf.ToArray()) * 1;
                                        length = (int)length5;
                                        break;
                                    }
                                    catch (Exception e)
                                    {
                                        util.debugWriteLine(e.Message + e.Source + e.StackTrace + e.TargetSite);
                                    }
                                }
                                if (length == 0)
                                {
                                    return(false);
                                }
                                util.debugWriteLine("calc len " + length);


                                while (msg.Count < length)
                                {
                                    if (msg.Count != 0)
                                    {
                                        util.debugWriteLine("recv msg 2shuume");
                                    }

                                    byte[] readbuf = new byte[1000];
                                    var    i       = sslStream.Read(readbuf, 0, length - msg.Count);
                                    for (var j = 0; j < i; j++)
                                    {
                                        msg.Add(readbuf[j]);
                                    }

                                    util.debugWriteLine("recv  allLen " + length + " msg len " + msg.Count + " " + msg);
                                }
                                util.debugWriteLine("calc len " + length + " msg len " + msg.Count + " msg " + msg);
                                //foreach (var bb in msg) Debug.Write((char)bb);
                                //util.debugWriteLine("");
                                //foreach (var bb in msg) Debug.Write(bb.ToString("x") + " ");
                                util.debugWriteLine("");
                            }

                            if (responseTag == 0x03)
                            {
                                var lresp = new LoginResponse();
                                using (var ms = new MemoryStream(msg.ToArray()))
                                {
                                    lresp = Serializer.Deserialize <LoginResponse>(ms);
                                }

                                /*
                                 * using (var ms = new MemoryStream(msg.ToArray()))
                                 * using (var cs = new  CodedInputStream(ms)) {
                                 *      lresp.MergeFrom(cs);
                                 *
                                 * }
                                 */
                                util.debugWriteLine("RECV LOGIN RESP " + lresp);
                            }
                            else if (responseTag == 0x07)
                            {
                                //var lresp = LoginResponse.Parser.ParseFrom(msg.ToArray());
                                var lresp = new IqStanza();

                                using (var ms = new MemoryStream(msg.ToArray()))
                                {
                                    lresp = Serializer.Deserialize <IqStanza>(ms);
                                }

                                /*
                                 * using (var ms = new MemoryStream(msg.ToArray()))
                                 * using (var cs = new CodedInputStream(ms)) {
                                 *      //lresp.MergeFrom(cs);
                                 *      try {
                                 *              var iqstanza = IqStanza.Parser.ParseFrom(msg.ToArray());
                                 *      } catch (Exception e) {
                                 *              util.debugWriteLine(e.Message + e.Source + e.StackTrace + e.TargetSite);
                                 *      }
                                 *
                                 *      //util.debugWriteLine(iqstanza);
                                 *      //LoginResponse.Descriptor.
                                 * }
                                 */
                                //iqs = mcs_pb2.IqStanza();
                                //iqs.ParseFromString(msg);
                                util.debugWriteLine("RECV IQ  id " + lresp);                        // + lresp.Id + " time " + lresp.ServerTimestamp + " streamid " + lresp.StreamId + " ");
                            }
                            else if (responseTag == 0x08)
                            {
                                try
                                {
                                    DataMessageStanza lresp;
                                    using (var ms = new MemoryStream(msg.ToArray()))
                                    {
                                        lresp = Serializer.Deserialize <DataMessageStanza>(ms);
                                    }

                                    //var lresp = DataMessageStanza.Parser.ParseFrom(msg.ToArray());

                                    //dms = mcs_pb2.DataMessageStanza();
                                    //dms.ParseFromString(msg);
                                    util.debugWriteLine("RECV DATA MESSAGE " + lresp);                            //lresp.Id + " time " + lresp.ServerTimestamp + " streamid " + lresp.StreamId + " ");
                                    //var lvid = util.getRegGroup(lresp.AppData.ToString(), "\"lvid\"[\\s\\S]+(lv\\d+)");
                                    //var lvid = util.getRegGroup(lresp.AppData.ToString(), "\"program_id\":\"(lv\\d+)");
                                    var d = "";
                                    foreach (var a in lresp.AppDatas)
                                    {
                                        d += a.Value;
                                    }
                                    //var lvid = util.getRegGroup(d, "program_id\\\\\":\\\\\"(lv\\d+)"); google protobuf
                                    var lvid = util.getRegGroup(d, "program_id\":\"(lv\\d+)");                             //google protobuf
                                    if (lvid != null)
                                    {
                                        util.debugWriteLine("appData lvid " + lvid);
                                        var items = getNicoCasItem(lvid, lresp);
                                        if (items != null)
                                        {
                                            check.foundLive(items);
                                        }
                                        else
                                        {
                                            var gir = new GetItemRetryApr(lvid, lresp, this);
                                            Task.Factory.StartNew(() =>
                                            {
                                                for (var i = 0; i < 10; i++)
                                                {
                                                    Thread.Sleep(5000);
                                                    items = gir.getItem();
                                                    if (items == null)
                                                    {
                                                        continue;
                                                    }
                                                    check.foundLive(items);
                                                    break;
                                                }
                                            });
                                        }
                                    }
                                }
                                catch (Exception ee)
                                {
                                    util.debugWriteLine(ee.Message + ee.Source + ee.StackTrace + ee.TargetSite);
                                }
                            }
                            else if (responseTag == 0x04)
                            {
                                break;
                            }
                            else
                            {
                                if (responseTag == 0x00)
                                {
                                    break;
                                }
                                util.debugWriteLine("unknown response: " + responseTag.ToString());
                            }
                        }
                    }
                util.debugWriteLine("closed");
                return(true);
            }
            catch (Exception e)
            {
                util.debugWriteLine("mcs connect error " + e.Message + e.Source + e.StackTrace + e.TargetSite);
                return(false);
            }
        }
Esempio n. 11
0
        //[Fact]
        //public async Task StartNegotiationAsync_Throws_Exception_If_Invalid_Feature_Provided()
        //{
        //    var feature = new XmlElement("invalid-feature");

        //    await Assert.ThrowsAsync<XmppException>(() => negotiator.NegotiateAsync(messagingContext, feature, tokenSource.Token));
        //}

        //[Fact]
        //public async Task NegotiateAsync_Sends_Empty_Bind_If_No_Resource_Provided()
        //{
        //    var bindRequest = default(XmlElement);
        //    messagingContext.Observable.OnTransmit<XmlElement>(e => bindRequest = e);
        //    await negotiator.NegotiateAsync(messagingContext, bindFeature, tokenSource.Token);

        //    VerifyBindRequest(bindRequest, string.Empty);
        //}

        //[Fact]
        //public async Task NegotiateAsync_Sends_Non_Empty_Bind_If_Resource_Provided()
        //{
        //    var resource = Guid.NewGuid().ToString();
        //    negotiator.Resource = resource;
        //    var actualStanza = default(XmlElement);
        //    messagingContext.Observable.OnTransmit<XmlElement>(e => actualStanza = e);

        //    await negotiator.NegotiateAsync(messagingContext, bindFeature, tokenSource.Token);

        //    VerifyBindRequest(actualStanza, resource);
        //}

        //private void VerifyBindRequest(XmlElement bindRequest, string resource)
        //{
        //    Assert.Equal("iq", bindRequest.Name);
        //    Assert.Equal("set", bindRequest["type"]);
        //    var bind = bindRequest.Children.Single();
        //    Assert.Equal("bind", bind.Name);
        //    Assert.Equal(XmppNamespaces.Bind, bind.Xmlns());

        //    if (!string.IsNullOrEmpty(resource))
        //    {
        //        var resourceElement = bind.Children.Single();
        //        Assert.Equal("resource", resourceElement.Name);
        //    }
        //}

        //[Fact]
        //public async Task Throws_Exception_If_Receives_Invalid_Bind_Response()
        //{
        //    await negotiator.NegotiateAsync(messagingContext, bindFeature, tokenSource.Token);
        //    var response = new XmlElement("invalid-response");

        //    await Assert.ThrowsAsync<XmppException>(() => messagingContext.Sender.ReceivedAsync(response, tokenSource.Token));
        //}

        //[Fact]
        //public async Task Throws_Exception_If_Bind_Error_Received()
        //{
        //    await negotiator.NegotiateAsync(messagingContext, bindFeature, tokenSource.Token);
        //    var response = IqStanza.Error().Children(new XmlElement("error"));

        //    await Assert.ThrowsAsync<XmppException>(() => messagingContext.Sender.ReceivedAsync(response, tokenSource.Token));
        //}

        //[Fact]
        //public async Task Completes_Messaging_Task_If_Corrent_Bind_Response_Received()
        //{
        //    var resource = Guid.NewGuid().ToString();
        //    var task = await negotiator.NegotiateAsync(messagingContext, bindFeature, tokenSource.Token);
        //    var response = CreateBindResponse(resource);

        //    await messagingContext.Sender.ReceivedAsync(response, tokenSource.Token);

        //    Assert.True(task.IsCompleted);
        //}

        //[Fact]
        //public async Task HandleAsync_Rises_JidBound_If_Correct_Response_Received()
        //{
        //    var expectedJid = (Jid)$"*****@*****.**";
        //    var actualJid = default(Jid);
        //    component.JidBound += jid => actualJid = jid;
        //    await component.StartNegotiationAsync(bindFeature, tokenSource.Token);
        //    var response = CreateBindResponse(string.Empty, expectedJid);

        //    await component.HandleAsync(response, tokenSource.Token);

        //    Assert.Equal(expectedJid, actualJid);
        //}

        private XmlElement CreateBindResponse(string resource, string jid = "user@domain")
        {
            return(IqStanza.Result().Children(
                       new XmlElement("bind").Xmlns(XmppNamespaces.Bind).Children(
                           new XmlElement("jid").Value($"{jid}/{resource}"))));
        }
Esempio n. 12
0
        private IExtensible BuildProtobufFromTag(MCSProtoTag _tag, SslStream sslStream)
        {
            var msg = new List <byte>();

            var length  = 0;
            var _lenBuf = new List <byte>();

            for (var i = 0; i < 10; i++)
            {
                var _slb = sslStream.ReadByte();
                _lenBuf.Add((byte)_slb);
                if (_lenBuf[_lenBuf.Count - 1] > 128)
                {
                    _lenBuf.Add((byte)sslStream.ReadByte());
                }
                try {
                    length = VarintBitConverter.ToInt32(_lenBuf.ToArray()) * 1;
                    var length2 = VarintBitConverter.ToInt16(_lenBuf.ToArray()) * 1;
                    var length3 = VarintBitConverter.ToInt64(_lenBuf.ToArray()) * 1;
                    var length4 = VarintBitConverter.ToUInt16(_lenBuf.ToArray()) * 1;
                    var length5 = VarintBitConverter.ToUInt32(_lenBuf.ToArray()) * 1;
                    length = (int)length5;
                    break;
                } catch (Exception e) {
                    util.debugWriteLine("app push varint len " + e.Message + e.Source + e.StackTrace + e.TargetSite);
                }
            }
            if (length == 0)
            {
                return(null);
            }
            util.debugWriteLine("calc len " + length);


            while (msg.Count < length)
            {
                if (msg.Count != 0)
                {
                    util.debugWriteLine("recv msg 2shuume");
                }

                byte[] readbuf = new byte[1000];
                var    i       = sslStream.Read(readbuf, 0, length - msg.Count);
                for (var j = 0; j < i; j++)
                {
                    msg.Add(readbuf[j]);
                }

                util.debugWriteLine("recv  allLen " + length + " msg len " + msg.Count + " " + msg);
            }
            util.debugWriteLine("calc len " + length + " msg len " + msg.Count + " msg " + msg);
            //foreach (var bb in msg) Debug.Write((char)bb);
            //util.debugWriteLine("");
            //foreach (var bb in msg) Debug.Write(bb.ToString("x") + " ");
            util.debugWriteLine("");

            switch (_tag)
            {
            case MCSProtoTag.kLoginResponseTag:
                var loginResp = new LoginResponse();
                using (var ms = new MemoryStream(msg.ToArray())) {
                    loginResp = Serializer.Deserialize <LoginResponse>(ms);
                }

                /*
                 * using (var ms = new MemoryStream(msg.ToArray()))
                 * using (var cs = new  CodedInputStream(ms)) {
                 *      lresp.MergeFrom(cs);
                 *
                 * }
                 */
                util.debugWriteLine("RECV LOGIN RESP " + loginResp);
                return(loginResp);

            case MCSProtoTag.kIqStanzaTag:
                //var lresp = LoginResponse.Parser.ParseFrom(msg.ToArray());
                var iqStanza = new IqStanza();

                using (var ms = new MemoryStream(msg.ToArray())) {
                    iqStanza = Serializer.Deserialize <IqStanza>(ms);
                }

                /*
                 * using (var ms = new MemoryStream(msg.ToArray()))
                 * using (var cs = new CodedInputStream(ms)) {
                 *      //lresp.MergeFrom(cs);
                 *      try {
                 *              var iqstanza = IqStanza.Parser.ParseFrom(msg.ToArray());
                 *      } catch (Exception e) {
                 *              util.debugWriteLine(e.Message + e.Source + e.StackTrace + e.TargetSite);
                 *      }
                 *
                 *      //util.debugWriteLine(iqstanza);
                 *      //LoginResponse.Descriptor.
                 * }
                 */
                //iqs = mcs_pb2.IqStanza();
                //iqs.ParseFromString(msg);
                util.debugWriteLine("RECV IQ  id " + iqStanza);                        // + lresp.Id + " time " + lresp.ServerTimestamp + " streamid " + lresp.StreamId + " ");
                return(iqStanza);

            case MCSProtoTag.kDataMessageStanzaTag:
                DataMessageStanza lresp;
                using (var ms = new MemoryStream(msg.ToArray())) {
                    lresp = Serializer.Deserialize <DataMessageStanza>(ms);
                }
                return(lresp);

            case MCSProtoTag.kHeartbeatPingTag:
                HeartbeatPing p;
                using (var ms = new MemoryStream(msg.ToArray())) {
                    p = Serializer.Deserialize <HeartbeatPing>(ms);
                }
                return(p);

            case MCSProtoTag.kHeartbeatAckTag:
                HeartbeatAck ack;
                using (var ms = new MemoryStream(msg.ToArray())) {
                    ack = Serializer.Deserialize <HeartbeatAck>(ms);
                }
                return(ack);

            default:
                return(null);
            }
        }
Esempio n. 13
0
        public bool Load(string XmlRoster)
        {
            bool     loaded = true;
            IqStanza iq     = null;

            try
            {
                iq = new IqStanza(XmlRoster);
            }
            catch
            {
                // Imprimir mensaje de error
                Console.WriteLine("Wrong XML Roster format.");
                iq     = null;
                loaded = false;
            }
            if (iq != null)
            {
                xmlRoster = XmlRoster;
                if (iq.Name == "iq" && iq.Type == "result" && iq.Id == "roster")
                {
                    XmlNode query = iq.ChildNode;
                    if (query != null && query.Name == "query" && query.Attributes["xmlns"].InnerText == "jabber:iq:roster")
                    {
                        if (query.HasChildNodes)
                        {
                            foreach (XmlNode item in query.ChildNodes)
                            {
                                //if (item.Name == "item" && item.Attributes ["jid"] != null && item.Attributes ["name"] != null && item.Attributes ["subscription"] != null) {
                                if (item.Name == "item" && item.Attributes["jid"] != null && item.Attributes["subscription"] != null)
                                {
                                    JabberContact contact = NewContact(item.Attributes["jid"].InnerText);
                                    if (item.Attributes["name"] != null)
                                    {
                                        contact.Name = item.Attributes["name"].InnerText;
                                    }
                                    string subscription = item.Attributes["subscription"].InnerText;
                                    if (subscription == "none" || subscription == "to" || subscription == "from" || subscription == "both")
                                    {
                                        contact.Subscription = (JabberContactSubscription)Enum.Parse(typeof(JabberContactSubscription), item.Attributes["subscription"].InnerText, true);
                                    }
                                    else
                                    {
                                        throw new IncorrectValue("Contact \"subscription\" = {none, to, from, both}");
                                    }
                                    if (item.Attributes["ask"] != null)
                                    {
                                        contact.Ask = item.Attributes["ask"].InnerText;
                                    }
                                    if (item.HasChildNodes)
                                    {
                                        XmlNode group = item.FirstChild;
                                        while (group != null)
                                        {
                                            if (group.Name == "group")
                                            {
                                                if (!Groups.ContainsGroup(group.InnerText))
                                                {
                                                    Groups.Create(group.InnerText);
                                                }
                                                Groups[group.InnerText].Add(contact.JID);
                                            }
                                            group = group.NextSibling;
                                        }
                                    }
                                    //Console.WriteLine ("Roster: Loaded contact " + contact.JID);
                                }
                            }
                        }
                    }
                }
            }
            return(loaded);
        }