00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef CLIENTBASE_H__
00016 #define CLIENTBASE_H__
00017
00018 #include "macros.h"
00019 #include "gloox.h"
00020 #include "eventdispatcher.h"
00021 #include "iqhandler.h"
00022 #include "jid.h"
00023 #include "logsink.h"
00024 #include "taghandler.h"
00025 #include "statisticshandler.h"
00026 #include "tlshandler.h"
00027 #include "compressiondatahandler.h"
00028 #include "connectiondatahandler.h"
00029 #include "parser.h"
00030
00031 #include <string>
00032 #include <list>
00033 #include <map>
00034
00035 namespace gloox
00036 {
00037
00038 class Disco;
00039 class EventHandler;
00040 class Event;
00041 class Tag;
00042 class IQ;
00043 class Message;
00044 class Presence;
00045 class Subscription;
00046 class MessageSessionHandler;
00047 class ConnectionListener;
00048 class MessageHandler;
00049 class MessageSession;
00050 class PresenceHandler;
00051 class SubscriptionHandler;
00052 class MUCInvitationHandler;
00053 class TagHandler;
00054 class TLSBase;
00055 class ConnectionBase;
00056 class CompressionBase;
00057 class StanzaExtensionFactory;
00058
00067 class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler,
00068 public CompressionDataHandler, public TLSHandler,
00069 public IqHandler
00070 {
00071
00072 friend class RosterManager;
00073
00074 public:
00083 ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00084
00094 ClientBase( const std::string& ns, const std::string& password,
00095 const std::string& server, int port = -1 );
00096
00100 virtual ~ClientBase();
00101
00114 bool connect( bool block = true );
00115
00123 ConnectionError recv( int timeout = -1 );
00124
00129 virtual const std::string& username() const { return m_jid.username(); }
00130
00138 const JID& jid() { return m_authzid ? m_authzid : m_jid; }
00139
00145 void setSasl( bool sasl ) { m_sasl = sasl; }
00146
00152 void setTls( TLSPolicy tls ) { m_tls = tls; }
00153
00159 void setCompression( bool compression ) { m_compress = compression; }
00160
00166 void setPort( int port ) { m_port = port; }
00167
00175 void setServer( const std::string &server );
00176
00181 void setPassword( const std::string &password ) { m_password = password; }
00182
00187 const std::string& server() const { return m_server; }
00188
00193 bool sasl() const { return m_sasl; }
00194
00199 TLSPolicy tls() const { return m_tls; }
00200
00205 bool compression() const { return m_compress; }
00206
00212 int port() const { return m_port; }
00213
00218 virtual const std::string& password() const { return m_password; }
00219
00224 virtual Disco* disco() const { return m_disco; }
00225
00231 const std::string getID();
00232
00240 void send( Tag* tag );
00241
00251 void send( IQ& iq, IqHandler* ih, int context, bool del = false );
00252
00257 void send( const IQ& iq );
00258
00263 void send( const Message& msg );
00264
00269 void send( const Subscription& sub );
00270
00275 void send( const Presence& pres );
00276
00281 bool authed() const { return m_authed; }
00282
00287 ConnectionState state() const;
00288
00293 const std::string& xmlLang() const { return m_xmllang; }
00294
00301 void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; }
00302
00308 ConnectionBase* connectionImpl() const { return m_connection; }
00309
00317 void setConnectionImpl( ConnectionBase* cb );
00318
00324 TLSBase* encryptionImpl() const { return m_encryption; }
00325
00333 void setEncryptionImpl( TLSBase* tb );
00334
00340 CompressionBase* compressionImpl() const { return m_compression; }
00341
00349 void setCompressionImpl( CompressionBase* cb );
00350
00355 void whitespacePing();
00356
00363 void xmppPing( const JID& to, EventHandler* eh );
00364
00372 void setAuthzid( const JID& authzid ) { m_authzid = authzid; }
00373
00382 void setAuthcid( const std::string& authcid ) { m_authcid = authcid; }
00383
00394 void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; }
00395
00400 void registerStanzaExtension( StanzaExtension* ext );
00401
00407 bool removeStanzaExtension( int ext );
00408
00413 void registerConnectionListener( ConnectionListener* cl );
00414
00422 GLOOX_DEPRECATED void registerIqHandler( IqHandler* ih, const std::string& xmlns );
00423
00433 void registerIqHandler( IqHandler* ih, int exttype );
00434
00444 GLOOX_DEPRECATED void trackID( IqHandler* ih, const std::string& id, int context );
00445
00453 void removeIDHandler( IqHandler* ih );
00454
00459 void registerMessageHandler( MessageHandler* mh );
00460
00465 void removeMessageHandler( MessageHandler* mh );
00466
00476 void registerMessageSession( MessageSession* session );
00477
00482 void disposeMessageSession( MessageSession* session );
00483
00488 void registerPresenceHandler( PresenceHandler* ph );
00489
00499 void registerPresenceHandler( const JID& jid, PresenceHandler* ph );
00500
00505 void registerSubscriptionHandler( SubscriptionHandler* sh );
00506
00514 void registerTagHandler( TagHandler* th, const std::string& tag,
00515 const std::string& xmlns );
00516
00523 void registerStatisticsHandler( StatisticsHandler* sh );
00524
00529 void removeConnectionListener( ConnectionListener* cl );
00530
00539 GLOOX_DEPRECATED void removeIqHandler( IqHandler* ih, const std::string& xmlns );
00540
00548 void removeIqHandler( IqHandler* ih, int exttype );
00549
00554 void removePresenceHandler( PresenceHandler* ph );
00555
00562 void removePresenceHandler( const JID& jid, PresenceHandler* ph );
00563
00568 void removeSubscriptionHandler( SubscriptionHandler* sh );
00569
00576 void removeTagHandler( TagHandler* th, const std::string& tag,
00577 const std::string& xmlns );
00578
00582 void removeStatisticsHandler();
00583
00589 void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; }
00590
00602 void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00603
00614 void registerMessageSessionHandler( MessageSessionHandler* msh, int types = 0 );
00615
00620 LogSink& logInstance() { return m_logInstance; }
00621
00628 StreamError streamError() const { return m_streamError; }
00629
00639 const std::string& streamErrorText( const std::string& lang = "default" ) const;
00640
00647 const std::string& streamErrorCData() const { return m_streamErrorCData; }
00648
00654 const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; }
00655
00661 AuthenticationError authError() const { return m_authError; }
00662
00668 StatisticsStruct getStatistics();
00669
00674 void registerMUCInvitationHandler( MUCInvitationHandler* mih );
00675
00679 void removeMUCInvitationHandler();
00680
00681
00682 virtual void handleTag( Tag* tag );
00683
00684
00685 virtual void handleCompressedData( const std::string& data );
00686
00687
00688 virtual void handleDecompressedData( const std::string& data );
00689
00690
00691 virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00692
00693
00694 virtual void handleConnect( const ConnectionBase* connection );
00695
00696
00697 virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00698
00699
00700 virtual void handleEncryptedData( const TLSBase* base, const std::string& data );
00701
00702
00703 virtual void handleDecryptedData( const TLSBase* base, const std::string& data );
00704
00705
00706 virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo &certinfo );
00707
00708 protected:
00714 void notifyOnResourceBindError( const Error* error );
00715
00720 void notifyOnResourceBind( const std::string& resource );
00721
00727 void notifyOnSessionCreateError( const Error* error );
00728
00736 bool notifyOnTLSConnect( const CertInfo& info );
00737
00741 void notifyOnConnect();
00742 void notifyStreamEvent( StreamEvent event );
00743 virtual void disconnect( ConnectionError reason );
00744 void header();
00745 void setAuthed( bool authed ) { m_authed = authed; }
00746 void setAuthFailure( AuthenticationError e ) { m_authError = e; }
00747
00755 virtual bool checkStreamVersion( const std::string& version );
00756
00757 void startSASL( SaslMechanism type );
00758 void processSASLChallenge( const std::string& challenge );
00759 void processSASLError( Tag* tag );
00760 void startTls();
00761 bool hasTls();
00762
00763 JID m_jid;
00764 JID m_authzid;
00765 std::string m_authcid;
00766 ConnectionBase* m_connection;
00767 TLSBase* m_encryption;
00768 CompressionBase* m_compression;
00769 Disco* m_disco;
00770
00771 std::string m_selectedResource;
00772 std::string m_clientCerts;
00773 std::string m_clientKey;
00774 std::string m_namespace;
00775 std::string m_password;
00776 std::string m_xmllang;
00777 std::string m_server;
00778 std::string m_sid;
00779 bool m_compressionActive;
00780 bool m_encryptionActive;
00781 bool m_compress;
00782 bool m_authed;
00783 bool m_block;
00784 bool m_sasl;
00785 TLSPolicy m_tls;
00786 int m_port;
00787
00788 int m_availableSaslMechs;
00789
00790 private:
00791 #ifdef CLIENTBASE_TEST
00792 public:
00793 #endif
00794
00800 class Ping : public StanzaExtension
00801 {
00802
00803 public:
00807 Ping();
00808
00812 virtual ~Ping();
00813
00814
00815 virtual const std::string& filterString() const;
00816
00817
00818 virtual StanzaExtension* newInstance( const Tag* tag ) const
00819 {
00820 (void)tag;
00821 return new Ping();
00822 }
00823
00824
00825 virtual Tag* tag() const
00826 {
00827 return new Tag( "ping", "xmlns", XMLNS_XMPP_PING );
00828 }
00829
00830 };
00831
00832 ClientBase( const ClientBase& );
00833 ClientBase& operator=( const ClientBase& );
00834
00838 virtual void handleStartNode() = 0;
00839 virtual bool handleNormalNode( Tag* tag ) = 0;
00840 virtual void rosterFilled() = 0;
00841 virtual void cleanup() {}
00842 virtual void handleIqIDForward( const IQ& iq, int context ) { (void) iq; (void) context; }
00843
00844 void parse( const std::string& data );
00845 void init();
00846 void handleStreamError( Tag* tag );
00847 TLSBase* getDefaultEncryption();
00848 CompressionBase* getDefaultCompression();
00849
00850 void notifyIqHandlers( IQ& iq );
00851 void notifyMessageHandlers( Message& msg );
00852 void notifyPresenceHandlers( Presence& presence );
00853 void notifySubscriptionHandlers( Subscription& s10n );
00854 void notifyTagHandlers( Tag* tag );
00855 void notifyOnDisconnect( ConnectionError e );
00856 void send( const std::string& xml );
00857 void addFrom( Tag* tag );
00858 void addNamespace( Tag* tag );
00859
00860
00861 virtual bool handleIq( const IQ& iq );
00862
00863
00864 virtual void handleIqID( const IQ& iq, int context );
00865
00866 struct TrackStruct
00867 {
00868 IqHandler* ih;
00869 int context;
00870 bool del;
00871 };
00872
00873 struct TagHandlerStruct
00874 {
00875 TagHandler* th;
00876 std::string xmlns;
00877 std::string tag;
00878 };
00879
00880 struct JidPresHandlerStruct
00881 {
00882 JID* jid;
00883 PresenceHandler* ph;
00884 };
00885
00886 enum TrackContext
00887 {
00888 XMPPPing
00889 };
00890
00891 typedef std::list<ConnectionListener*> ConnectionListenerList;
00892 typedef std::multimap<const std::string, IqHandler*> IqHandlerMapXmlns;
00893 typedef std::multimap<const int, IqHandler*> IqHandlerMap;
00894 typedef std::map<const std::string, TrackStruct> IqTrackMap;
00895 typedef std::map<const std::string, MessageHandler*> MessageHandlerMap;
00896 typedef std::list<MessageSession*> MessageSessionList;
00897 typedef std::list<MessageHandler*> MessageHandlerList;
00898 typedef std::list<PresenceHandler*> PresenceHandlerList;
00899 typedef std::list<JidPresHandlerStruct> PresenceJidHandlerList;
00900 typedef std::list<SubscriptionHandler*> SubscriptionHandlerList;
00901 typedef std::list<TagHandlerStruct> TagHandlerList;
00902
00903 ConnectionListenerList m_connectionListeners;
00904 IqHandlerMapXmlns m_iqNSHandlers;
00905 IqHandlerMap m_iqExtHandlers;
00906 IqTrackMap m_iqIDHandlers;
00907 MessageSessionList m_messageSessions;
00908 MessageHandlerList m_messageHandlers;
00909 PresenceHandlerList m_presenceHandlers;
00910 PresenceJidHandlerList m_presenceJidHandlers;
00911 SubscriptionHandlerList m_subscriptionHandlers;
00912 TagHandlerList m_tagHandlers;
00913 StringList m_cacerts;
00914 StatisticsHandler * m_statisticsHandler;
00915 MUCInvitationHandler * m_mucInvitationHandler;
00916 MessageSessionHandler * m_messageSessionHandlerChat;
00917 MessageSessionHandler * m_messageSessionHandlerGroupchat;
00918 MessageSessionHandler * m_messageSessionHandlerHeadline;
00919 MessageSessionHandler * m_messageSessionHandlerNormal;
00920
00921 Parser m_parser;
00922 LogSink m_logInstance;
00923 StanzaExtensionFactory* m_seFactory;
00924 EventDispatcher m_dispatcher;
00925
00926 AuthenticationError m_authError;
00927 StreamError m_streamError;
00928 StringMap m_streamErrorText;
00929 std::string m_streamErrorCData;
00930 Tag* m_streamErrorAppCondition;
00931
00932 StatisticsStruct m_stats;
00933
00934 SaslMechanism m_selectedSaslMech;
00935
00936 int m_idCount;
00937 bool m_autoMessageSession;
00938
00939 };
00940
00941 }
00942
00943 #endif // CLIENTBASE_H__