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