00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef PUBSUBMANAGER_H__
00014 #define PUBSUBMANAGER_H__
00015
00016 #include "pubsub.h"
00017 #include "dataform.h"
00018 #include "iqhandler.h"
00019 #include "mutex.h"
00020
00021 #include <map>
00022 #include <string>
00023
00024 namespace gloox
00025 {
00026
00027 class ClientBase;
00028
00029 namespace PubSub
00030 {
00031
00032 class ResultHandler;
00033
00078 class GLOOX_API Manager : public IqHandler
00079 {
00080 public:
00081
00086 Manager( ClientBase* parent );
00087
00091 virtual ~Manager() {}
00092
00108 const std::string subscribe( const JID& service, const std::string& node,
00109 ResultHandler* handler, const JID& jid = JID(),
00110 SubscriptionObject type = SubscriptionNodes,
00111 int depth = 1, const std::string& expire = EmptyString );
00112
00126 const std::string unsubscribe( const JID& service,
00127 const std::string& node,
00128 const std::string& subid,
00129 ResultHandler* handler,
00130 const JID& jid = JID() );
00131
00141 const std::string getSubscriptions( const JID& service,
00142 ResultHandler* handler )
00143 {
00144 return getSubscriptionsOrAffiliations( service,
00145 handler,
00146 GetSubscriptionList );
00147 }
00148
00158 const std::string getAffiliations( const JID& service,
00159 ResultHandler* handler )
00160 {
00161 return getSubscriptionsOrAffiliations( service,
00162 handler,
00163 GetAffiliationList );
00164 }
00165
00177 const std::string getSubscriptionOptions( const JID& service,
00178 const JID& jid,
00179 const std::string& node,
00180 ResultHandler* handler)
00181 { return subscriptionOptions( GetSubscriptionOptions, service, jid, node, handler, 0 ); }
00182
00195 const std::string setSubscriptionOptions( const JID& service,
00196 const JID& jid,
00197 const std::string& node,
00198 DataForm* df,
00199 ResultHandler* handler )
00200 { return subscriptionOptions( SetSubscriptionOptions, service, jid, node, handler, df ); }
00201
00211 void getAffiliations( const JID& service,
00212 const std::string& node,
00213 ResultHandler* handler );
00214
00224 const std::string requestItems( const JID& service,
00225 const std::string& node,
00226 const std::string& subid,
00227 int maxItems,
00228 ResultHandler* handler);
00229
00239 const std::string requestItems( const JID& service,
00240 const std::string& node,
00241 const std::string& subid,
00242 const ItemList& items,
00243 ResultHandler* handler);
00244
00259 const std::string publishItem( const JID& service,
00260 const std::string& node,
00261 ItemList& items,
00262 DataForm* options,
00263 ResultHandler* handler );
00264
00277 const std::string deleteItem( const JID& service,
00278 const std::string& node,
00279 const ItemList& items,
00280 bool notify,
00281 ResultHandler* handler );
00282
00295 const std::string createNode( const JID& service,
00296 const std::string& node,
00297 DataForm* config,
00298 ResultHandler* handler );
00299
00310 const std::string deleteNode( const JID& service,
00311 const std::string& node,
00312 ResultHandler* handler );
00313
00324 const std::string getDefaultNodeConfig( const JID& service,
00325 NodeType type,
00326 ResultHandler* handler );
00327
00338 const std::string purgeNode( const JID& service,
00339 const std::string& node,
00340 ResultHandler* handler );
00341
00352 const std::string getSubscribers( const JID& service,
00353 const std::string& node,
00354 ResultHandler* handler )
00355 { return subscriberList( GetSubscriberList, service,
00356 node, SubscriberList(),
00357 handler ); }
00358
00371 const std::string setSubscribers( const JID& service,
00372 const std::string& node,
00373 const SubscriberList& list,
00374 ResultHandler* handler )
00375 { return subscriberList( SetSubscriberList, service,
00376 node, list, handler ); }
00377
00388 const std::string getAffiliates( const JID& service,
00389 const std::string& node,
00390 ResultHandler* handler )
00391 { return affiliateList( GetAffiliateList, service,
00392 node, AffiliateList(),
00393 handler ); }
00394
00406 const std::string setAffiliates( const JID& service,
00407 const std::string& node,
00408 const AffiliateList& list,
00409 ResultHandler* handler )
00410 { return affiliateList( SetAffiliateList, service,
00411 node, list, handler ); }
00412
00423 const std::string getNodeConfig( const JID& service,
00424 const std::string& node,
00425 ResultHandler* handler )
00426 { return nodeConfig( service, node, 0, handler ); }
00427
00439 const std::string setNodeConfig( const JID& service,
00440 const std::string& node,
00441 DataForm* config,
00442 ResultHandler* handler )
00443 { return nodeConfig( service, node, config, handler ); }
00444
00450 bool removeID( const std::string& id );
00451
00452
00453 void handleDiscoInfoResult( IQ* iq, int context );
00454
00455
00456 void handleDiscoItemsResult( IQ* iq, int context );
00457
00458
00459 void handleDiscoError( IQ* iq, int context );
00460
00461
00462 bool handleDiscoSet( IQ* ) { return 0; }
00463
00464
00465 virtual bool handleIq( const IQ& iq ) { (void)iq; return false; }
00466
00467
00468 virtual void handleIqID( const IQ& iq, int context );
00469
00470 private:
00471 #ifdef PUBSUBMANAGER_TEST
00472 public:
00473 #endif
00474
00475 enum TrackContext
00476 {
00477 Subscription,
00478 Unsubscription,
00479 GetSubscriptionOptions,
00480 SetSubscriptionOptions,
00481 GetSubscriptionList,
00482 GetSubscriberList,
00483 SetSubscriberList,
00484 GetAffiliationList,
00485 GetAffiliateList,
00486 SetAffiliateList,
00487 GetNodeConfig,
00488 SetNodeConfig,
00489 DefaultNodeConfig,
00490 GetItemList,
00491 PublishItem,
00492 DeleteItem,
00493 CreateNode,
00494 DeleteNode,
00495 PurgeNodeItems,
00496 NodeAssociation,
00497 NodeDisassociation,
00498 GetFeatureList,
00499 DiscoServiceInfos,
00500 DiscoNodeInfos,
00501 DiscoNodeItems,
00502 RequestItems,
00503 InvalidContext
00504 };
00505
00506 class PubSubOwner : public StanzaExtension
00507 {
00508 public:
00513 PubSubOwner( TrackContext context = InvalidContext );
00514
00519 PubSubOwner( const Tag* tag );
00520
00524 virtual ~PubSubOwner();
00525
00530 void setNode( const std::string& node ) { m_node = node; }
00531
00536 const std::string& node() const { return m_node; }
00537
00542 void setConfig( DataForm* config )
00543 { m_form = config; }
00544
00549 const DataForm* config() const { return m_form; }
00550
00555 void setSubscriberList( const SubscriberList& subList )
00556 { m_subList = subList; }
00557
00562 void setAffiliateList( const AffiliateList& affList )
00563 { m_affList = affList; }
00564
00565
00566 virtual const std::string& filterString() const;
00567
00568
00569 virtual StanzaExtension* newInstance( const Tag* tag ) const
00570 {
00571 return new PubSubOwner( tag );
00572 }
00573
00574
00575 virtual Tag* tag() const;
00576
00577
00578 virtual StanzaExtension* clone() const
00579 {
00580 PubSubOwner* p = new PubSubOwner();
00581 p->m_node = m_node;
00582 p->m_ctx = m_ctx;
00583 p->m_form = m_form ? new DataForm( *m_form ) : 0;
00584 p->m_subList = m_subList;
00585 p->m_affList = m_affList;
00586 return p;
00587 }
00588
00589 private:
00590 std::string m_node;
00591 TrackContext m_ctx;
00592 DataForm* m_form;
00593 SubscriberList m_subList;
00594 AffiliateList m_affList;
00595 };
00596
00597 class PubSub : public StanzaExtension
00598 {
00599 public:
00604 PubSub( TrackContext context = InvalidContext );
00605
00610 PubSub( const Tag* tag );
00611
00615 virtual ~PubSub();
00616
00621 void setJID( const JID& jid ) { m_jid = jid; }
00622
00627 const JID& jid() const { return m_jid; }
00628
00633 void setNode( const std::string& node ) { m_node = node; }
00634
00639 const std::string& node() const { return m_node; }
00640
00645 void setSubscriptionID( const std::string& subid )
00646 { m_subid = subid; }
00647
00652 const std::string& subscriptionID() const { return m_subid; }
00653
00660 void setOptions( const std::string& node, DataForm* df )
00661 {
00662 m_options.node = node;
00663 m_options.df = df;
00664 }
00665
00670 const DataForm* options() const
00671 { return m_options.df; }
00672
00677 const ItemList& items() const { return m_items; }
00678
00683 void setItems( const ItemList& items )
00684 { m_items = items; }
00685
00690 void setMaxItems( int maxItems )
00691 { m_maxItems = maxItems; }
00692
00697 const SubscriptionMap& subscriptions() const
00698 { return m_subscriptionMap; }
00699
00704 const AffiliationMap& affiliations() const
00705 { return m_affiliationMap; }
00706
00711 void setNotify( bool notify ) { m_notify = notify; }
00712
00713
00714 virtual const std::string& filterString() const;
00715
00716
00717 virtual StanzaExtension* newInstance( const Tag* tag ) const
00718 {
00719 return new PubSub( tag );
00720 }
00721
00722
00723 virtual Tag* tag() const;
00724
00725
00726 virtual StanzaExtension* clone() const;
00727
00728 private:
00729 AffiliationMap m_affiliationMap;
00730 SubscriptionMap m_subscriptionMap;
00731 TrackContext m_ctx;
00732
00733 struct Options
00734 {
00735 std::string node;
00736 DataForm* df;
00737 };
00738 Options m_options;
00739 JID m_jid;
00740 std::string m_node;
00741 std::string m_subid;
00742 ItemList m_items;
00743 int m_maxItems;
00744 bool m_notify;
00745 };
00746
00758 const std::string nodeConfig( const JID& service,
00759 const std::string& node,
00760 DataForm* config,
00761 ResultHandler* handler );
00762
00776 const std::string subscriberList( TrackContext ctx,
00777 const JID& service,
00778 const std::string& node,
00779 const SubscriberList& config,
00780 ResultHandler* handler );
00781
00795 const std::string affiliateList( TrackContext ctx,
00796 const JID& service,
00797 const std::string& node,
00798 const AffiliateList& config,
00799 ResultHandler* handler );
00800
00801 const std::string subscriptionOptions( TrackContext context,
00802 const JID& service,
00803 const JID& jid,
00804 const std::string& node,
00805 ResultHandler* handler,
00806 DataForm* df );
00807
00808 const std::string getSubscriptionsOrAffiliations( const JID& service,
00809 ResultHandler* handler,
00810 TrackContext context );
00811
00812 typedef std::map < std::string, std::string > NodeOperationTrackMap;
00813 typedef std::map < std::string, ResultHandler* > ResultHandlerTrackMap;
00814
00815 ClientBase* m_parent;
00816
00817 NodeOperationTrackMap m_nopTrackMap;
00818 ResultHandlerTrackMap m_resultHandlerTrackMap;
00819
00820 util::Mutex m_trackMapMutex;
00821
00822 };
00823
00824 }
00825
00826 }
00827
00828 #endif // PUBSUBMANAGER_H__