/// <summary>
        /// Modify the roles of the parties in this list.
        /// To use, retrive a ParticipantCollection, change the roles
        /// of the parties in that collection, then pass that modified
        /// collection in here.
        /// </summary>
        /// <param name="parties">The modified participant collection</param>
        /// <param name="reason">The reason for the change</param>
        /// <param name="callback">A callback to call when complete.  Will have a null IQ if there were no changes to make.</param>
        /// <param name="state">Caller's state information</param>
        public void ModifyRoles(ParticipantCollection parties, string reason, IqCB callback, object state)
        {
            /*
            <iq from='[email protected]/globe'
            id='voice4'
            to='*****@*****.**'
            type='set'>
              <query xmlns='http://jabber.org/protocol/muc#admin'>
            <item nick='Hecate'
              role='visitor'/>
            <item nick='rosencrantz'
              role='participant'>
              <reason>A worthy fellow.</reason>
            </item>
            <item nick='guildenstern'
              role='participant'>
              <reason>A worthy fellow.</reason>
            </item>
              </query>
            </iq>
            */
            RoomAdminIQ iq = new RoomAdminIQ(m_manager.Stream.Document);
            iq.To = m_room;
            iq.Type = IQType.set;
            AdminQuery query = iq.Instruction;

            int count = 0;
            foreach (RoomParticipant party in parties)
            {
                if (party.Changed)
                {
                    count++;
                    AdminItem item = query.AddItem();
                    item.Nick = party.Nick;
                    item.Role = party.Role;
                    item.Reason = reason;
                }
            }
            if (count > 0)
                m_manager.BeginIQ(iq, callback, state);
            else
                callback(this, null, state);
        }
 private void GotList(object sender, IQ iq, object state)
 {
     RetrieveParticipantsState rps = (RetrieveParticipantsState)state;
     if (iq.Type == IQType.error)
     {
         rps.Callback(this, null, rps.State);
         return;
     }
     /*
     <iq from='*****@*****.**'
     id='ban2'
     to='[email protected]/throne'
     type='result'>
       <query xmlns='http://jabber.org/protocol/muc#admin'>
     <item affiliation='outcast'
       jid='*****@*****.**'>
       <reason>Treason</reason>
     </item>
       </query>
     </iq>
     */
     ParticipantCollection parties = new ParticipantCollection();
     AdminQuery query = (AdminQuery)iq.Query;
     ParticipantCollection.Modification mod;
     foreach (AdminItem item in query.GetItems())
     {
         Presence pres = new Presence(m_manager.Stream.Document);
         pres.From = new JID(m_jid.User, m_jid.Server, item.Nick);
         UserX x = new UserX(m_manager.Stream.Document);
         RoomItem xi = x.RoomItem;
         xi.Role = item.Role;
         xi.Affiliation = item.Affiliation;
         xi.Nick = item.Nick;
         xi.JID = item.JID;
         pres.AppendChild(x);
         parties.Modify(pres, out mod);
     }
     rps.Callback(this, parties, rps.State);
 }
        /// <summary>
        /// Modify the roles of the parties in this list.
        /// To use, retrive a ParticipantCollection, change the roles
        /// of the parties in that collection, then pass that modified
        /// collection in here.
        /// </summary>
        /// <param name="parties">The modified participant collection</param>
        /// <param name="reason">The reason for the change</param>
        /// <param name="callback">A callback to call when complete.  Will have a null IQ if there were no changes to make.</param>
        /// <param name="state">Caller's state information</param>
        public void ModifyAffiliations(ParticipantCollection parties, string reason, IqCB callback, object state)
        {
            /*
            <iq from='*****@*****.**'
            id='ban2'
            to='[email protected]/throne'
            type='result'>
              <query xmlns='http://jabber.org/protocol/muc#admin'>
            <item affiliation='outcast'
              jid='*****@*****.**'>
              <reason>Treason</reason>
            </item>
              </query>
            </iq>
            */
            RoomAdminIQ iq = new RoomAdminIQ(m_manager.Stream.Document);
            iq.To = m_room;
            iq.Type = IQType.set;
            AdminQuery query = iq.Instruction;

            int count = 0;
            foreach (RoomParticipant party in parties)
            {
                if (party.Changed && (party.RealJID != null))
                {
                    count++;
                    AdminItem item = query.AddItem();
                    item.JID = party.RealJID;
                    item.Affiliation = party.Affiliation;
                    item.Reason = reason;
                }
            }
            if (count > 0)
                m_manager.BeginIQ(iq, callback, state);
            else
                callback(this, null, state);
        }