00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _XMPP_ROSTER
00038 #define _XMPP_ROSTER
00039
00040 #ifdef P_USE_PRAGMA
00041 #pragma interface
00042 #endif
00043
00044 #include <ptclib/xmpp_c2s.h>
00045
00046 #if P_EXPAT
00047
00049
00050 namespace XMPP
00051 {
00052 class Roster : public PObject
00053 {
00054 PCLASSINFO(Roster, PObject);
00055 public:
00056
00057 enum ItemType {
00058 None,
00059 To,
00060 From,
00061 Both,
00062 Unknown = 999
00063 };
00064
00065 class Item : public PObject
00066 {
00067 PCLASSINFO(Item, PObject);
00068 PDICTIONARY(PresenceInfo, PString, Presence);
00069
00070 public:
00071 Item(PXMLElement * item = 0);
00072 Item(PXMLElement& item);
00073 Item(const JID& jid, ItemType type, const PString& group, const PString& name = PString::Empty());
00074
00075 const JID& GetJID() const { return m_JID; }
00076 ItemType GetType() const { return m_Type; }
00077 const PString& GetName() const { return m_Name; }
00078 const PStringSet& GetGroups() const { return m_Groups; }
00079 const PresenceInfo& GetPresence() const { return m_Presence; }
00080
00081 virtual void SetJID(const JID& jid, BOOL dirty = TRUE)
00082 { m_JID = jid; if (dirty) SetDirty(); }
00083 virtual void SetType(ItemType type, BOOL dirty = TRUE)
00084 { m_Type = type; if (dirty) SetDirty(); }
00085 virtual void SetName(const PString& name, BOOL dirty = TRUE)
00086 { m_Name = name; if (dirty) SetDirty(); }
00087
00088 virtual void AddGroup(const PString& group, BOOL dirty = TRUE);
00089 virtual void RemoveGroup(const PString& group, BOOL dirty = TRUE);
00090
00091 virtual void SetPresence(const Presence& p);
00092
00093 void SetDirty(BOOL b = TRUE) { m_IsDirty = b; }
00094
00097 Item & operator=(
00098 const PXMLElement& item
00099 );
00100
00101 virtual PXMLElement * AsXML(PXMLElement * parent) const;
00102
00103 protected:
00104 BareJID m_JID;
00105 ItemType m_Type;
00106 PString m_Name;
00107 PStringSet m_Groups;
00108
00109
00110
00111 PDictionary<PString, Presence> m_Presence;
00112
00113 BOOL m_IsDirty;
00114 };
00115 PLIST(ItemList, Item);
00116
00117 public:
00118 Roster(XMPP::C2S::StreamHandler * handler = 0);
00119 ~Roster();
00120
00121 const ItemList& GetItems() const { return m_Items; }
00122
00123 virtual Item * FindItem(const PString& jid);
00124
00125 virtual BOOL SetItem(Item * item, BOOL localOnly = FALSE);
00126 virtual BOOL RemoveItem(const PString& jid, BOOL localOnly = FALSE);
00127 virtual BOOL RemoveItem(Item * item, BOOL localOnly = FALSE);
00128
00129 virtual void Attach(XMPP::C2S::StreamHandler * handler);
00130 virtual void Detach();
00131 virtual void Refresh(BOOL sendPresence = TRUE);
00132
00133 virtual PNotifierList& ItemChangedHandlers() { return m_ItemChangedHandlers; }
00134 virtual PNotifierList& RosterChangedHandlers() { return m_RosterChangedHandlers; }
00135
00136 protected:
00137 PDECLARE_NOTIFIER(XMPP::C2S::StreamHandler, Roster, OnSessionEstablished);
00138 PDECLARE_NOTIFIER(XMPP::C2S::StreamHandler, Roster, OnSessionReleased);
00139 PDECLARE_NOTIFIER(XMPP::Presence, Roster, OnPresence);
00140 PDECLARE_NOTIFIER(XMPP::IQ, Roster, OnIQ);
00141
00142 ItemList m_Items;
00143 XMPP::C2S::StreamHandler * m_Handler;
00144 PNotifierList m_ItemChangedHandlers;
00145 PNotifierList m_RosterChangedHandlers;
00146 };
00147
00148 }
00149
00150
00151 #endif // P_EXPAT
00152
00153 #endif // _XMPP_ROSTER
00154
00155
00156