rostermanager.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef ROSTERMANAGER_H__
00015 #define ROSTERMANAGER_H__
00016
00017 #include "subscriptionhandler.h"
00018 #include "privatexmlhandler.h"
00019 #include "iqhandler.h"
00020 #include "presencehandler.h"
00021 #include "rosterlistener.h"
00022
00023 #include <map>
00024 #include <string>
00025 #include <list>
00026
00027 namespace gloox
00028 {
00029
00030 class ClientBase;
00031 class Stanza;
00032 class PrivateXML;
00033 class RosterItem;
00034
00047 class GLOOX_API RosterManager : public IqHandler, public PresenceHandler, public SubscriptionHandler,
00048 public PrivateXMLHandler
00049 {
00050 public:
00055 RosterManager( ClientBase* parent );
00056
00060 virtual ~RosterManager();
00061
00066 void fill();
00067
00072 Roster* roster();
00073
00082 void subscribe( const JID& jid, const std::string& name = EmptyString,
00083 const StringList& groups = StringList(),
00084 const std::string& msg = EmptyString );
00085
00089 void synchronize();
00090
00098 void add( const JID& jid, const std::string& name, const StringList& groups );
00099
00108 void unsubscribe( const JID& jid, const std::string& msg = EmptyString );
00109
00118 void cancel( const JID& jid, const std::string& msg = EmptyString );
00119
00126 void remove( const JID& jid );
00127
00134 void ackSubscriptionRequest( const JID& to, bool ack );
00135
00141 const std::string& delimiter() const { return m_delimiter; }
00142
00148 void setDelimiter( const std::string& delimiter );
00149
00154 RosterItem* getRosterItem( const JID& jid );
00155
00165 void registerRosterListener( RosterListener* rl, bool syncSubscribeReq = true );
00166
00171 void removeRosterListener();
00172
00173
00174 virtual bool handleIq( const IQ& iq );
00175
00176
00177 virtual void handleIqID( const IQ& iq, int context );
00178
00179
00180 virtual void handlePresence( const Presence& presence );
00181
00182
00183 virtual void handleSubscription( const Subscription& subscription );
00184
00185
00186 virtual void handlePrivateXML( const Tag* xml );
00187
00188
00189 virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult );
00190
00191 private:
00192 #ifdef ROSTERMANAGER_TEST
00193 public:
00194 #endif
00195 typedef std::list<RosterItemData*> RosterData;
00196
00203 class Query : public StanzaExtension
00204 {
00205 public:
00212 Query( const JID& jid, const std::string& name, const StringList& groups );
00213
00218 Query( const JID& jid );
00219
00224 Query( const Tag* tag = 0 );
00225
00229 ~Query();
00230
00237 const RosterData& roster() const { return m_roster; }
00238
00239
00240 virtual const std::string& filterString() const;
00241
00242
00243 virtual StanzaExtension* newInstance( const Tag* tag ) const
00244 {
00245 return new Query( tag );
00246 }
00247
00248
00249 virtual Tag* tag() const;
00250
00251
00252 virtual StanzaExtension* clone() const;
00253
00254 private:
00255 RosterData m_roster;
00256
00257 };
00258
00259 void mergePush( const RosterData& data );
00260 void mergeRoster( const RosterData& data );
00261
00262 RosterListener* m_rosterListener;
00263 Roster m_roster;
00264 ClientBase* m_parent;
00265 PrivateXML* m_privateXML;
00266 RosterItem* m_self;
00267
00268 std::string m_delimiter;
00269 bool m_syncSubscribeReq;
00270
00271 enum RosterContext
00272 {
00273 RequestRoster,
00274 AddRosterItem,
00275 RemoveRosterItem,
00276 SynchronizeRoster
00277 };
00278
00279 };
00280
00281 }
00282
00283 #endif // ROSTER_H__