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 #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 {
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
00105
00106 PDictionary<PString, Presence> m_Presence;
00107
00108 PBoolean m_IsDirty;
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 }
00144
00145
00146 #endif // P_EXPAT
00147
00148 #endif // PTLIB_XMPP_ROSTER_H
00149
00150