xmpp_roster.h

Go to the documentation of this file.
00001 /*
00002  * xmpp_roster.h
00003  *
00004  * Extensible Messaging and Presence Protocol (XMPP) IM
00005  * Roster management classes
00006  *
00007  * Portable Windows Library
00008  *
00009  * Copyright (c) 2004 Reitek S.p.A.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Portable Windows Library.
00022  *
00023  * The Initial Developer of the Original Code is Post Increment
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Revision: 21788 $
00028  * $Author: rjongbloed $
00029  * $Date: 2008-12-11 23:42:13 -0600 (Thu, 11 Dec 2008) $
00030  */
00031 
00032 #ifndef PTLIB_XMPP_ROSTER_H
00033 #define PTLIB_XMPP_ROSTER_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #include <ptclib/xmpp_c2s.h>
00040 
00041 #if P_EXPAT
00042 
00044 
00045 namespace XMPP
00046 {
00047   class Roster : public PObject
00048   {
00049     PCLASSINFO(Roster, PObject);
00050   public:
00051 
00052     enum ItemType { // Subscription type
00053       None,
00054       To,
00055       From,
00056       Both,
00057       Unknown = 999
00058     };
00059 
00060     class Item : public PObject
00061     {
00062       PCLASSINFO(Item, PObject);
00063       PDICTIONARY(PresenceInfo, PString, Presence);
00064 
00065     public:
00066       Item(PXMLElement * item = 0);
00067       Item(PXMLElement& item);
00068       Item(const JID& jid, ItemType type, const PString& group, const PString& name = PString::Empty());
00069 
00070       const JID&          GetJID() const        { return m_JID; }
00071       ItemType            GetType() const       { return m_Type; }
00072       const PString&      GetName() const       { return m_Name; }
00073       const PStringSet&   GetGroups() const     { return m_Groups; }
00074       const PresenceInfo& GetPresence() const   { return m_Presence; }
00075 
00076       virtual void  SetJID(const JID& jid, PBoolean dirty = PTrue)
00077                                                 { m_JID = jid; if (dirty) SetDirty(); }
00078       virtual void  SetType(ItemType type, PBoolean dirty = PTrue)
00079                                                 { m_Type = type; if (dirty) SetDirty(); }
00080       virtual void  SetName(const PString& name, PBoolean dirty = PTrue) 
00081                                                 { m_Name = name; if (dirty) SetDirty(); }
00082 
00083       virtual void  AddGroup(const PString& group, PBoolean dirty = PTrue);
00084       virtual void  RemoveGroup(const PString& group, PBoolean dirty = PTrue);
00085 
00086       virtual void  SetPresence(const Presence& p);
00087 
00088       void SetDirty(PBoolean b = PTrue) { m_IsDirty = b; }
00089 
00092       Item & operator=(
00093         const PXMLElement& item
00094       );
00095 
00096       virtual PXMLElement * AsXML(PXMLElement * parent) const;
00097 
00098     protected:
00099       BareJID     m_JID;
00100       ItemType    m_Type;
00101       PString     m_Name;
00102       PStringSet  m_Groups;
00103 
00104       // The item's presence state: for each resource (the key to the dictionary) a
00105       // a presence stanza if kept.
00106       PDictionary<PString, Presence> m_Presence;
00107 
00108       PBoolean        m_IsDirty; // item modified locally, server needs to be updated
00109     };
00110     PLIST(ItemList, Item);
00111 
00112   public:
00113     Roster(XMPP::C2S::StreamHandler * handler = 0);
00114     ~Roster();
00115 
00116     const ItemList& GetItems() const    { return m_Items; }
00117 
00118     virtual Item * FindItem(const PString& jid);
00119 
00120     virtual PBoolean SetItem(Item * item, PBoolean localOnly = PFalse);
00121     virtual PBoolean RemoveItem(const PString& jid, PBoolean localOnly = PFalse);
00122     virtual PBoolean RemoveItem(Item * item, PBoolean localOnly = PFalse);
00123 
00124     virtual void  Attach(XMPP::C2S::StreamHandler * handler);
00125     virtual void  Detach();
00126     virtual void  Refresh(PBoolean sendPresence = PTrue);
00127 
00128     virtual PNotifierList& ItemChangedHandlers()    { return m_ItemChangedHandlers; }
00129     virtual PNotifierList& RosterChangedHandlers()  { return m_RosterChangedHandlers; }
00130 
00131   protected:
00132     PDECLARE_NOTIFIER(XMPP::C2S::StreamHandler, Roster, OnSessionEstablished);
00133     PDECLARE_NOTIFIER(XMPP::C2S::StreamHandler, Roster, OnSessionReleased);
00134     PDECLARE_NOTIFIER(XMPP::Presence, Roster, OnPresence);
00135     PDECLARE_NOTIFIER(XMPP::IQ, Roster, OnIQ);
00136 
00137     ItemList m_Items;
00138     XMPP::C2S::StreamHandler * m_Handler;
00139     PNotifierList m_ItemChangedHandlers;
00140     PNotifierList m_RosterChangedHandlers;
00141   };
00142 
00143 } // namespace XMPP
00144 
00145 
00146 #endif  // P_EXPAT
00147 
00148 #endif  // PTLIB_XMPP_ROSTER_H
00149 
00150 // End of File ///////////////////////////////////////////////////////////////

Generated on Thu May 27 01:36:48 2010 for PTLib by  doxygen 1.4.7