示例#1
0
	    /// <summary>
	    /// Add a contact to the Roster.
	    /// </summary>
	    /// <param name="jid">The BARE jid of the contact that should be added.</param>
	    /// <param name="nickname">Nickname for the contact.</param>
	    /// <param name="group">An Array of groups when you want to add the contact to multiple groups.</param>
	    public void AddRosterItem(Jid jid, string nickname, string[] group)
	    {
	        RosterIq riq = new RosterIq();
	        riq.Type = IqType.set;
				
	        RosterItem ri = new RosterItem();
	        ri.Jid	= jid;
			
	        if (nickname != null)
	            ri.Name	= nickname;
			
	        foreach (string g in group)
	        {
	            ri.AddGroup(g);			
	        }

	        riq.Query.AddRosterItem(ri);
				
	        m_connection.Send(riq);
	    }
示例#2
0
        /// <summary>
        /// Add a contact to the Roster.
        /// </summary>
        /// <param name="jid">The BARE jid of the contact that should be added.</param>
        /// <param name="nickname">Nickname for the contact.</param>
        /// <param name="group">An Array of groups when you want to add the contact to multiple groups.</param>
        public void AddRosterItem(Jid jid, string nickname, string[] group)
        {
            RosterIq riq = new RosterIq();

            riq.Type = IqType.set;

            RosterItem ri = new RosterItem();

            ri.Jid = jid;

            if (nickname != null)
            {
                ri.Name = nickname;
            }

            foreach (string g in group)
            {
                ri.AddGroup(g);
            }

            riq.Query.AddRosterItem(ri);

            m_connection.Send(riq);
        }
示例#3
0
文件: frmMain.cs 项目: don59/agsXmpp
		private void ctxMnuRosterDelete_Click(object sender, System.EventArgs e)
		{
//			<iq from='[email protected]/balcony' type='set' id='roster_4'>
//				<query xmlns='jabber:iq:roster'>
//					<item jid='*****@*****.**' subscription='remove'/>
//				</query>
//			</iq>
			ListViewItem itm = GetSelectedListViewItem();
			if (itm != null)
			{
				RosterIq riq = new RosterIq();
				riq.Type = IqType.set;
				
				XmppCon.RosterManager.RemoveRosterItem( new Jid(itm.Tag as string) );				
			}
		}
示例#4
0
        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            RosterNode node = rosterControl.SelectedItem();
            if (node != null)
            {
                RosterIq riq = new RosterIq();
                riq.Type = IqType.set;

                XmppCon.RosterManager.RemoveRosterItem(node.RosterItem.Jid);
            }
        }
示例#5
0
            private void ProcessRosterIQ(IQ iq)
            {
                bool bSend = false;
                if (iq.Type == IqType.get)
                {
                    // Send the roster
                    // we send a dummy roster here, you should retrieve it from a
                    // database or some kind of directory (LDAP, AD etc...)

                    RosterIq rosterIq = new RosterIq(IqType.result);
                    rosterIq.Namespace = agsXMPP.Uri.CLIENT;
                    rosterIq.Id = iq.Id;
                    rosterIq.From = iq.To;
                    rosterIq.To = this.m_ClientAccount.JID;

                    foreach (Friend friend in this.m_ClientAccount.Friends)
                    {
                        RosterItem ri = new RosterItem();
                        ri.Name = friend.Nick;
                        ri.Subscription = friend.SubscriptionType;

                        ////............
                        //friend.JID.Resource = friend.Resource[0];

                        ri.Jid = friend.JID;
                        foreach (string strGroup in friend.Groups)
                        {
                            ri.AddGroup(strGroup);
                        }

                        rosterIq.Query.AddRosterItem(ri);
                    }

                    Send(rosterIq);

                }
                else if (iq.Type == IqType.set)
                {
                    //Received: 
                    //<iq xmlns="jabber:client" id="agsXMPP_18" type="set">
                    //    <query xmlns="jabber:iq:roster">
                    //        <item jid="test2@localhost"/>
                    //    </query>
                    //</iq>

                    //Send: 
                    //<iq xmlns="jabber:client" type="set" id="712">
                    //    <query xmlns="jabber:iq:roster">
                    //        <item name="test2" jid="test2@localhost" subscription="none"/>
                    //    </query>
                    //</iq>

                    //Send: 
                    //<iq xmlns="jabber:client" from="test@localhost/MF" to="test@localhost/MF" type="result" id="agsXMPP_18" />

                    Roster oldRoster = iq.Query as Roster;

                    RosterItem[] rosterItems = oldRoster.GetRoster();

                    Friend friend = null;

                    foreach (RosterItem rosterItem in rosterItems)
                    {
                        if (rosterItem.HasAttribute("subscription"))
                        {
                            if (rosterItem.Subscription == SubscriptionType.remove)
                            {
                                friend = this.m_ClientAccount.FindFriend(rosterItem.Jid.ToString());
                                if (friend == null)
                                {
                                    IQ error = new IQ(IqType.error);
                                    error.Namespace = iq.Namespace;
                                    error.Id = iq.Id;
                                    error.To = this.m_ClientAccount.JID;

                                    Send(error);
                                }

                                this.m_ClientAccount.RemoveFriend(friend);


                                RosterIq newRosterIq = null;
                                RosterItem ri = null;

                                Presence newPresence = null;

                                Account contactAccount = this.m_Server.AccountManager.FindAccount(rosterItem.Jid.ToString());
                                Friend userFriend = contactAccount.FindFriend(this.m_ClientAccount.JID.ToString());
                                if (userFriend == null)
                                {

                                    //RECV: 
                                    //<iq xmlns="jabber:client" id="agsXMPP_17" type="set">
                                    //    <query xmlns="jabber:iq:roster">
                                    //        <item jid="test@localhost" subscription="remove" />
                                    //    </query>
                                    //</iq>

                                    //SEND: <iq type="result" id="agsXMPP_17" to="test2@localhost/MF" from="test2@localhost/MF" />

                                    IQ result = new IQ(IqType.result);
                                    result.Id = iq.Id;
                                    result.From = this.m_ClientAccount.JID;
                                    result.To = this.m_ClientAccount.JID;
                                    Send(result);


                                    //SEND: 
                                    //<iq id="221" type="set">
                                    //    <query xmlns="jabber:iq:roster">
                                    //        <item jid="test@localhost" subscription="remove" />
                                    //    </query>
                                    //</iq>

                                    newRosterIq = new RosterIq(IqType.set);
                                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                    ri = new RosterItem();
                                    ri.Name = rosterItem.Name;
                                    ri.Jid = rosterItem.Jid;
                                    ri.Subscription = rosterItem.Subscription;

                                    newRosterIq.Query.AddRosterItem(ri);

                                    Send(newRosterIq);


                                    //SEND: <presence from="test2@localhost/MF" xml:lang="zh-cn" type="unavailable" to="test@localhost/MF" />
                                    newPresence = new Presence();
                                    newPresence.From = this.m_ClientAccount.JID;
                                    newPresence.To = rosterItem.Jid;
                                    newPresence.Type = PresenceType.unavailable;
                                    newPresence.Language = this.objClientlanguage.Name;

                                    bSend = Send(newPresence.To, newPresence);
                                    if (!bSend)
                                    {

                                    }

                                }
                                else
                                {
                                    if (userFriend.SubscriptionType == SubscriptionType.both)
                                    {

                                        userFriend.SubscriptionType = SubscriptionType.to;
                                        userFriend.Save();

                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = userFriend.Nick;
                                        ri.Jid = userFriend.JID;
                                        ri.Subscription = userFriend.SubscriptionType;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        bSend = Send(rosterItem.Jid, newRosterIq);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence = new Presence();
                                        newPresence.From = this.m_ClientAccount.JID;
                                        newPresence.To = rosterItem.Jid;

                                        newPresence.Type = PresenceType.unsubscribe;
                                        bSend = Send(rosterItem.Jid, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        userFriend.SubscriptionType = SubscriptionType.none;
                                        userFriend.Save();

                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = userFriend.Nick;
                                        ri.Jid = userFriend.JID;
                                        ri.Subscription = userFriend.SubscriptionType;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        bSend = Send(rosterItem.Jid, newRosterIq);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence.Type = PresenceType.unsubscribed;
                                        bSend = Send(rosterItem.Jid, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence = new Presence();
                                        newPresence.From = rosterItem.Jid;
                                        newPresence.To = this.m_ClientAccount.JID;
                                        newPresence.Type = PresenceType.unavailable;
                                        newPresence.Language = this.objClientlanguage.Name;

                                        bSend = Send(newPresence.To, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence.SwitchDirection();
                                        bSend = Send(newPresence.To, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        IQ result = new IQ(IqType.result);
                                        result.Id = iq.Id;
                                        result.From = this.m_ClientAccount.JID;
                                        result.To = this.m_ClientAccount.JID;
                                        Send(result);


                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = rosterItem.Name;
                                        ri.Jid = rosterItem.Jid;
                                        ri.Subscription = rosterItem.Subscription;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        Send(newRosterIq);


                                    }
                                    else if (userFriend.SubscriptionType == SubscriptionType.from)
                                    {
                                        contactAccount.RemoveFriend(userFriend);
                                        contactAccount.Save();

                                        newPresence = new Presence();
                                        newPresence.From = this.m_ClientAccount.JID;
                                        newPresence.To = rosterItem.Jid;
                                        newPresence.Type = PresenceType.unavailable;
                                        newPresence.Language = this.objClientlanguage.Name;

                                        bSend = Send(newPresence.To, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        IQ result = new IQ(IqType.result);
                                        result.Id = iq.Id;
                                        result.From = this.m_ClientAccount.JID;
                                        result.To = this.m_ClientAccount.JID;
                                        Send(result);


                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = rosterItem.Name;
                                        ri.Jid = rosterItem.Jid;
                                        ri.Subscription = rosterItem.Subscription;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        Send(newRosterIq);

                                    }
                                    else if (userFriend.SubscriptionType == SubscriptionType.to)
                                    {
                                        userFriend.SubscriptionType = SubscriptionType.none;
                                        userFriend.Save();

                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = userFriend.Nick;
                                        ri.Jid = userFriend.JID;
                                        ri.Subscription = userFriend.SubscriptionType;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        bSend = Send(rosterItem.Jid, newRosterIq);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence = new Presence();
                                        newPresence.From = this.m_ClientAccount.JID;
                                        newPresence.To = rosterItem.Jid;
                                        newPresence.Type = PresenceType.unsubscribed;
                                        bSend = Send(newPresence.To, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        newPresence = new Presence();
                                        newPresence.From = this.m_ClientAccount.JID;
                                        newPresence.To = rosterItem.Jid;
                                        newPresence.Type = PresenceType.unavailable;
                                        newPresence.Language = this.objClientlanguage.Name;

                                        bSend = Send(newPresence.To, newPresence);
                                        if (!bSend)
                                        {

                                        }

                                        IQ result = new IQ(IqType.result);
                                        result.Id = iq.Id;
                                        result.From = this.m_ClientAccount.JID;
                                        result.To = this.m_ClientAccount.JID;
                                        Send(result);


                                        newRosterIq = new RosterIq(IqType.set);
                                        newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                        ri = new RosterItem();
                                        ri.Name = rosterItem.Name;
                                        ri.Jid = rosterItem.Jid;
                                        ri.Subscription = rosterItem.Subscription;

                                        newRosterIq.Query.AddRosterItem(ri);

                                        Send(newRosterIq);


                                    }
                                    else
                                    {

                                    }
                                }

                                ///Save friend Roster to Xml
                                this.m_Server.AccountManager.Save();

                                return;

                            }
                            else
                            {
                                friend = this.m_ClientAccount.FindFriend(rosterItem.Jid.ToString());
                                if (friend == null)
                                {
                                    friend = this.m_ClientAccount.AddFriend();
                                }

                                ///******************************************************
                                ///JID中已经包含有Company,Friend中是否还需要Company信息
                                ///******************************************************
                                friend.JID = rosterItem.Jid;
                                friend.Nick = rosterItem.Name;

                                friend.SubscriptionType = rosterItem.Subscription;
                                friend.SubscriptionStatus = int.Parse(rosterItem.Ask.ToString("D"));

                                foreach (Element groupItem in rosterItem.GetGroups())
                                {
                                    friend.AddGroup(groupItem.InnerXml);
                                }
                                friend.Save();


                                //if (friend.Groups.Count == 0)
                                //{
                                //    friend.AddGroup(friend.Company);
                                //}

                                // push roster set iq to all the resurce
                                RosterIq newRosterIq = new RosterIq(IqType.set);
                                newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                                RosterItem ri = new RosterItem();
                                if (rosterItem.Name == null || rosterItem.Name == string.Empty)
                                {
                                    ri.Name = rosterItem.Jid.User;
                                }
                                else
                                {
                                    ri.Name = rosterItem.Name;
                                }

                                ri.Jid = rosterItem.Jid;
                                ri.Subscription = SubscriptionType.none;

                                ///******************************************************
                                ///订阅用户的分组信息需要考虑?
                                ///******************************************************
                                foreach (Element groupItem in rosterItem.GetGroups())
                                {
                                    ri.AddGroup(groupItem.InnerXml);
                                }

                                newRosterIq.Query.AddRosterItem(ri);

                                //Push roster update to all client
                                //foreach (Account account in this.m_Server.ClientConnections.Keys)
                                //{
                                //    if (account.JID.Bare.ToLower() == this.m_ClientAccount.JID.Bare.ToLower())
                                //    {
                                //        //this.m_Server.ClientConnections[account].Send(newRosterIq);
                                //        SendToAllResource(account, newRosterIq);
                                //    }
                                //}

                                bSend = Send(this.m_ClientAccount, newRosterIq);
                                if (!bSend)
                                {

                                }

                            }
                        }
                        else
                        {
                            friend = this.m_ClientAccount.FindFriend(rosterItem.Jid.ToString());
                            if (friend == null)
                            {
                                friend = this.m_ClientAccount.AddFriend();

                                ///******************************************************
                                ///JID中已经包含有Company,Friend中是否还需要Company信息
                                ///******************************************************
                                friend.JID = rosterItem.Jid;
                                friend.SubscriptionType = SubscriptionType.none;
                                friend.SubscriptionStatus = -1;
                            }

                            friend.Nick = rosterItem.Name;

                            friend.Groups.Clear();

                            foreach (Element groupItem in rosterItem.GetGroups())
                            {
                                friend.AddGroup(groupItem.InnerXml);
                            }

                            friend.Save();

                            //if (friend.Groups.Count == 0)
                            //{
                            //    friend.AddGroup(friend.Company);
                            //}

                            // push roster set iq to all the resurce
                            RosterIq newRosterIq = new RosterIq(IqType.set);
                            newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                            RosterItem ri = new RosterItem();
                            if (rosterItem.Name == null || rosterItem.Name == string.Empty)
                            {
                                ri.Name = rosterItem.Jid.User;
                            }
                            else
                            {
                                ri.Name = rosterItem.Name;
                            }
                            ri.Jid = rosterItem.Jid;
                            ri.Subscription = friend.SubscriptionType;

                            ///******************************************************
                            ///订阅用户的分组信息需要考虑?
                            ///******************************************************
                            foreach (string strGroup in friend.Groups)
                            {
                                ri.AddGroup(strGroup);
                            }

                            newRosterIq.Query.AddRosterItem(ri);

                            //Push roster update to all client
                            //foreach (Account account in this.m_Server.ClientConnections.Keys)
                            //{
                            //    if (account.JID.Bare.ToLower() == this.m_ClientAccount.JID.Bare.ToLower())
                            //    {
                            //        //this.m_Server.ClientConnections[account].Send(newRosterIq);
                            //        SendToAllResource(account, newRosterIq);
                            //    }
                            //}

                            bSend = Send(this.m_ClientAccount, newRosterIq);
                            if (!bSend)
                            {

                            }

                        }


                        //Send Result IQ
                        IQ newIq = new IQ(IqType.result);
                        newIq.Namespace = agsXMPP.Uri.CLIENT;
                        newIq.Id = iq.Id;
                        //newIq.From = this.m_ClientAccount.JID;
                        //newIq.To = this.m_ClientAccount.JID;
                        Send(newIq);

                        ///Save friend Roster to Xml
                        this.m_Server.AccountManager.Save();
                    }

                }
            }
示例#6
0
            private void ProcessPresence(Presence presence)
            {
                bool bSend = false;
                #region subscribe
                if (presence.Type == PresenceType.subscribe)
                {
                    //RECV: <presence xmlns="jabber:client" type="subscribe" to="test2@localhost" />

                    //SEND: 
                    //<iq id="162" type="set">
                    //    <query xmlns="jabber:iq:roster">
                    //        <item jid="test2@localhost" name="test2" subscription="none" ask="subscribe"/>
                    //    </query>
                    //</iq>

                    //SEND: <presence xmlns="jabber:client" type="subscribe" to="test2@localhost" from="test@localhost" />

                    // push roster set iq to all the resurce
                    RosterIq newRosterIq = new RosterIq(IqType.set);
                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                    Jid subscribeJID = presence.To;

                    RosterItem ri = new RosterItem();
                    ri.Name = subscribeJID.User;
                    ri.Jid = subscribeJID;


                    Friend friend = this.m_ClientAccount.FindFriend(subscribeJID.ToString());
                    if (friend == null)
                    {

                    }
                    ///ask status change
                    friend.SubscriptionStatus = 0;

                    ri.Subscription = friend.SubscriptionType;
                    ri.Ask = AskType.subscribe;

                    foreach (string strGroup in friend.Groups)
                    {
                        ri.AddGroup(strGroup);
                    }

                    newRosterIq.Query.AddRosterItem(ri);

                    //Push roster update to all client
                    //foreach (Account account in this.m_Server.ClientConnections.Keys)
                    //{
                    //    if (account.JID.Bare.ToLower() == this.m_ClientAccount.JID.Bare.ToLower())
                    //    {
                    //        //this.m_Server.ClientConnections[account].Send(newRosterIq);
                    //        Send(account, newRosterIq);
                    //    }
                    //}

                    Send(newRosterIq);

                    Presence newPresence = new Presence();
                    newPresence.Namespace = agsXMPP.Uri.CLIENT;
                    newPresence.Type = PresenceType.subscribe;
                    newPresence.From = new Jid(this.m_ClientAccount.JID.Bare);
                    newPresence.To = presence.To;

                    /////路由信息
                    //account = new Account();
                    //account.Company = presence.To.Company;
                    //account.UserID = presence.To.User;

                    //if(this.m_Server.ClientConnections.ContainsKey(account))
                    //{
                    //    //this.m_Server.ClientConnections[account].Send(newPresence);
                    //    SendToAllResource(account, newPresence);
                    //}
                    //else
                    //{
                    //    this.m_Server.CachePresences.Add(newPresence.To, newPresence);
                    //}

                    bSend = Send(presence.To, newPresence);
                    if (!bSend)
                    {

                    }

                    //RosterIq newRosterIq = new RosterIq(IqType.set);

                    //RosterItem ri = new RosterItem();
                    //ri.Name = presence.To.User;
                    //ri.Jid = presence.To;
                    //ri.Subscription = SubscriptionType.none;
                    //ri.Ask = AskType.subscribe;
                    //newRosterIq.Query.AddRosterItem(ri);

                    //Send(newRosterIq);

                }
                #endregion
                #region subscribed
                else if (presence.Type == PresenceType.subscribed)
                {
                    //RECV: <presence xmlns="jabber:client" type="subscribed" to="test@localhost" />

                    //<iq id="178" type="set">
                    //    <query xmlns="jabber:iq:roster">
                    //        <item jid="test@localhost" name="test@localhost" subscription="from" />
                    //    </query>
                    //</iq>

                    //<iq id="181" type="set">
                    //    <query xmlns="jabber:iq:roster">
                    //        <item jid="test2@localhost" name="test2@localhost" subscription="to" />
                    //    </query>
                    //</iq>

                    //SEND: 
                    //<presence xmlns="jabber:client" type="subscribed" to="test@localhost" from="test2@localhost" />
                    //<presence xmlns="jabber:client" from="test2@localhost/MF" xml:lang="zh-cn" to="test@localhost/MF">
                    //    <priority>10</priority>
                    //</presence>

                    RosterIq newRosterIq = null;
                    RosterItem ri = null;

                    Jid userJID = presence.To;
                    Jid contactJID = this.m_ClientAccount.JID;

                    ///改变花名册的订阅状态
                    Friend user = this.m_ClientAccount.FindFriend(userJID.ToString());
                    if (user == null)
                    {
                        user = this.m_ClientAccount.AddFriend();
                        user.JID = userJID;
                        user.Nick = userJID.User;
                        user.SubscriptionType = SubscriptionType.none;
                        user.SubscriptionStatus = -1;
                    }

                    if (user.Nick == null || user.Nick == string.Empty)
                    {
                        user.Nick = userJID.User;
                    }

                    user.SubscriptionStatus = 1;
                    if (user.SubscriptionType == SubscriptionType.none)
                    {
                        user.SubscriptionType = SubscriptionType.from;
                    }
                    else if (user.SubscriptionType == SubscriptionType.to)
                    {
                        user.SubscriptionType = SubscriptionType.both;
                    }
                    else
                    {

                    }

                    //联系人花名册中的用户的订阅状态保存
                    user.Save();

                    // push roster set iq to all the resurce
                    newRosterIq = new RosterIq(IqType.set);
                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                    ri = new RosterItem();
                    ri.Name = userJID.User;
                    ri.Jid = userJID;
                    ri.Subscription = user.SubscriptionType;

                    foreach (string strGroup in user.Groups)
                    {
                        ri.AddGroup(strGroup);
                    }

                    newRosterIq.Query.AddRosterItem(ri);

                    bSend = Send(this.m_ClientAccount, newRosterIq);
                    if (!bSend)
                    {

                    }

                    Account userAccount = this.m_Server.AccountManager.FindAccount(userJID.ToString());
                    Friend contact = userAccount.FindFriend(contactJID.ToString());
                    if (contact == null)
                    {
                        contact = this.m_ClientAccount.AddFriend();
                        contact.JID = contactJID;
                        contact.Nick = contactJID.User;
                        contact.SubscriptionType = SubscriptionType.none;
                        contact.SubscriptionStatus = -1;
                    }

                    if (contact.Nick == null || contact.Nick == string.Empty)
                    {
                        contact.Nick = contactJID.User;
                    }

                    contact.SubscriptionStatus = 1;
                    if (contact.SubscriptionType == SubscriptionType.none)
                    {
                        contact.SubscriptionType = SubscriptionType.to;
                    }
                    else if (contact.SubscriptionType == SubscriptionType.from)
                    {
                        contact.SubscriptionType = SubscriptionType.both;
                    }
                    else
                    {

                    }

                    //用户花名册中的联系人的订阅状态保存
                    contact.Save();

                    // push roster set iq to all the resurce
                    newRosterIq = new RosterIq(IqType.set);
                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                    ri = new RosterItem();
                    ri.Name = contact.Nick;
                    ri.Jid = contact.JID;
                    ri.Subscription = contact.SubscriptionType;

                    foreach (string strGroup in contact.Groups)
                    {
                        ri.AddGroup(strGroup);
                    }

                    newRosterIq.Query.AddRosterItem(ri);

                    bSend = Send(userAccount, newRosterIq);
                    if (!bSend)
                    {

                    }

                    //<presence xmlns="jabber:client" type="subscribed" to="test@localhost" from="test2@localhost" />

                    Presence newPresence = new Presence();
                    newPresence.Namespace = agsXMPP.Uri.CLIENT;
                    newPresence.Type = PresenceType.subscribed;
                    newPresence.From = new Jid(this.m_ClientAccount.JID.Bare);
                    newPresence.To = presence.To;

                    bSend = Send(presence.To, newPresence);
                    if (!bSend)
                    {

                    }

                    //<presence xmlns="jabber:client" from="test2@localhost/MF" xml:lang="zh-cn" to="test@localhost/MF">
                    //    <priority>10</priority>
                    //</presence>

                    newPresence.RemoveAttribute("type");
                    newPresence.Language = this.objClientlanguage.Name;
                    newPresence.Priority = 10;
                    Send(presence.To, newPresence);

                }
                #endregion
                #region unsubscribe
                else if (presence.Type == PresenceType.unsubscribe)
                {



                }
                #endregion
                #region unsubscribed
                else if (presence.Type == PresenceType.unsubscribed)
                {
                    //RECV: 
                    //    <presence xmlns="jabber:client" type="unsubscribed" to="test@localhost" />
                    //SEND: 
                    //    <iq id="168" type="set">
                    //        <query xmlns="jabber:iq:roster">
                    //            <item jid="test2@localhost" name="test2" subscription="none" />
                    //        </query>
                    //    </iq>
                    //SEND: <presence xmlns="jabber:client" type="unsubscribed" to="test@localhost/MF" from="test2@localhost" />

                    //SEND: <presence from="test@localhost/MF" xml:lang="zh-cn" type="unavailable" to="test2@localhost/MF" />

                    // push roster set iq to all the resurce
                    RosterIq newRosterIq = null;
                    RosterItem ri = null;

                    newRosterIq = new RosterIq(IqType.set);
                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                    Jid subscribeJID = presence.To;

                    ri = new RosterItem();
                    ri.Name = subscribeJID.User;
                    ri.Jid = subscribeJID;

                    Friend friend = this.m_ClientAccount.FindFriend(subscribeJID.ToString());
                    if (friend != null)
                    {
                        ///ask status change
                        friend.SubscriptionStatus = 1;
                        friend.Save();

                        ri.Subscription = friend.SubscriptionType;

                        foreach (string strGroup in friend.Groups)
                        {
                            ri.AddGroup(strGroup);
                        }
                    }
                    else
                    {
                        ri.Subscription = SubscriptionType.none;
                    }

                    newRosterIq.Query.AddRosterItem(ri);

                    Send(newRosterIq);

                    ///to user
                    newRosterIq = new RosterIq(IqType.set);
                    newRosterIq.Namespace = agsXMPP.Uri.CLIENT;

                    ri = new RosterItem();

                    Account userAccount = this.m_Server.AccountManager.FindAccount(presence.To.ToString());
                    Friend contactFriend = userAccount.FindFriend(this.m_ClientAccount.JID.ToString());

                    ri.Name = contactFriend.Nick;
                    ri.Jid = contactFriend.JID;
                    ri.Subscription = contactFriend.SubscriptionType;

                    contactFriend.SubscriptionStatus = 1;
                    contactFriend.Save();

                    //Push roster update to all client
                    bSend = Send(presence.To, newRosterIq);
                    if (!bSend)
                    {

                    }

                    Presence newPresence = new Presence();
                    newPresence.Namespace = agsXMPP.Uri.CLIENT;
                    newPresence.Type = PresenceType.unsubscribed;
                    newPresence.From = new Jid(this.m_ClientAccount.JID.Bare);
                    newPresence.To = presence.To;

                    ///路由信息
                    bSend = Send(presence.To, newPresence);
                    if (!bSend)
                    {
                        this.m_Server.CachePresences.Add(newPresence.To, newPresence);
                    }

                    newPresence.Type = PresenceType.unavailable;
                    newPresence.RemoveAttribute("xmlns");
                    newPresence.Language = this.objClientlanguage.Name;

                    bSend = Send(presence.To, newPresence);
                    if (!bSend)
                    {

                    }

                }
                #endregion
                #region unavailable
                else if (presence.Type == PresenceType.unavailable)
                {
                    //<presence xmlns="jabber:client" to="*****@*****.**" type="unavailable" />
                    //<presence from='[email protected]/pda' to='[email protected]/thirdwitch'type='unavailable'/>

                    //<presence
                    //    from='[email protected]/thirdwitch'
                    //    to='[email protected]/desktop'
                    //    type='unavailable'>
                    //  <x xmlns='http://jabber.org/protocol/muc#user'>
                    //    <item affiliation='member' role='none'/>
                    //  </x>
                    //</presence>

                    MucService muc = this.m_Server.GetMucService();
                    if(muc != null)
                    {
                        foreach (KeyValuePair<string, ChatRoom> item in muc.GetRooms())
                        {
                            if (item.Value.JID.ToString() == presence.To.Bare.ToString())
                            {
                                User from = item.Value.FindOnline(this.m_ClientAccount.JID.Bare);
                                if (from == null)
                                {
                                    return;
                                }

                                Presence newPresence = new Presence();
                                newPresence.Type = PresenceType.unavailable;
                                newPresence.From = new Jid(item.Value.JID.ToString() + "/" + from.Nick);
                                foreach (User user in item.Value.GetOnlines())
                                {
                                    newPresence.To = user.JID;

                                    Send(newPresence.To, newPresence);
                                }

                                item.Value.Exit(from);

                                return;
                            }

                        }

                    }

                    return;
                }
                #endregion
                #region else
                else
                {
                    #region showType.Noe
                    if (presence.Show == ShowType.NONE)
                    {
                        ///groupchat roster presence
                        if (presence.To != null)
                        {
                            MucService muc = this.m_Server.GetMucService();
                            if(muc != null)
                            {
                                if (muc.JID.Bare.ToLower() == presence.To.Server.ToLower())
                                {
                                    foreach (KeyValuePair<string, ChatRoom> item in muc.GetRooms())
                                    {
                                        if (item.Value.JID.ToString().ToLower() == presence.To.Bare.ToLower())
                                        {
                                            User login = new User();
                                            login.Nick = presence.To.Resource;
                                            login.Role = agsXMPP.protocol.x.muc.Role.participant;
                                            login.Affiliation = agsXMPP.protocol.x.muc.Affiliation.member;
                                            login.JID = new Jid(this.m_ClientAccount.JID.ToString() + "/" + this.strBindResource);

                                            Presence newPresence = null;

                                            List<User> onlines = item.Value.GetOnlines();
                                            if (onlines == null)
                                            {
                                                item.Value.Enter(login);
                                                return;
                                            }

                                            foreach (User user in onlines)
                                            {
                                                newPresence = new Presence();
                                                newPresence.From = new Jid(presence.To.Bare + "/" + user.Nick);
                                                newPresence.To = login.JID;

                                                newPresence.MucUser = new agsXMPP.protocol.x.muc.User();
                                                newPresence.MucUser.Item = new agsXMPP.protocol.x.muc.Item(user.Affiliation, user.Role);

                                                Send(newPresence.To, newPresence);


                                                newPresence = new Presence();
                                                newPresence.From = new Jid(presence.To.Bare + "/" + login.Nick); ;
                                                newPresence.To = user.JID;

                                                newPresence.MucUser = new agsXMPP.protocol.x.muc.User();
                                                newPresence.MucUser.Item = new agsXMPP.protocol.x.muc.Item(login.Affiliation, login.Role);

                                                Send(newPresence.To, newPresence);

                                            }

                                            item.Value.Enter(login);
                                        }
                                    }

                                    return;

                                }

                            }
                        }

                        foreach (Friend friend in this.m_ClientAccount.Friends)
                        {

                            Account account = this.m_Server.AccountManager.FindAccount(friend.JID.ToString());
                            if (account == null)
                            {
                                continue;
                            }

                            if (!this.m_Server.ClientConnections.ContainsKey(account))
                            {
                                continue;
                            }

                            Presence newPresence = new Presence();
                            //newPresence.From = presence.From;
                            //newPresence.To = presence.To;

                            newPresence.Priority = presence.Priority;

                            SubscriptionType subscriptionType = friend.SubscriptionType;

                            if (subscriptionType == SubscriptionType.from)
                            {
                                newPresence.From = account.JID;
                                newPresence.To = this.m_ClientAccount.JID;
                                Send(newPresence);
                            }
                            else if (subscriptionType == SubscriptionType.to)
                            {
                                newPresence.From = this.m_ClientAccount.JID;
                                newPresence.To = account.JID;

                                Send(account, newPresence);

                            }
                            else if (subscriptionType == SubscriptionType.both)
                            {
                                newPresence.From = account.JID;
                                newPresence.To = this.m_ClientAccount.JID;
                                Send(newPresence);

                                newPresence.SwitchDirection();
                                //this.m_Server.ClientConnections[account].Send(newPresence);
                                Send(account, newPresence);
                            }
                            else
                            {

                            }
                        }

                    }
                    #endregion
                    #region else
                    else
                    {

                    }
                    #endregion

                }
                #endregion

                this.m_Server.AccountManager.Save();

            }
示例#7
0
	    /// <summary>
        /// Removes a contact from the Roster
        /// </summary>
        /// <param name="jid">The BARE jid of the rosteritem that should be removed</param>
        public void RemoveRosterItem(Jid jid)
        {
            RosterIq riq = new RosterIq();
            riq.Type = IqType.set;

            RosterItem ri = new RosterItem();
            ri.Jid = jid;
            ri.Subscription = SubscriptionType.remove;

            riq.Query.AddRosterItem(ri);

            m_connection.Send(riq);
        }
示例#8
0
 public void RequestRoster()
 {
     RosterIq iq = new RosterIq(IqType.get);
     Send(iq);
 }