clientbase.h
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 "mutex.h"
00025 #include "taghandler.h"
00026 #include "statisticshandler.h"
00027 #include "tlshandler.h"
00028 #include "compressiondatahandler.h"
00029 #include "connectiondatahandler.h"
00030 #include "parser.h"
00031
00032 #include <string>
00033 #include <list>
00034 #include <map>
00035
00036 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00037 #include <windows.h>
00038 #define SECURITY_WIN32
00039 #include <security.h>
00040 #endif
00041
00042 namespace gloox
00043 {
00044
00045 class Disco;
00046 class EventHandler;
00047 class Event;
00048 class Tag;
00049 class IQ;
00050 class Message;
00051 class Presence;
00052 class Subscription;
00053 class MessageSessionHandler;
00054 class ConnectionListener;
00055 class MessageHandler;
00056 class MessageSession;
00057 class PresenceHandler;
00058 class SubscriptionHandler;
00059 class MUCInvitationHandler;
00060 class TagHandler;
00061 class TLSBase;
00062 class ConnectionBase;
00063 class CompressionBase;
00064 class StanzaExtensionFactory;
00065
00075 class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler,
00076 public CompressionDataHandler, public TLSHandler,
00077 public IqHandler
00078 {
00079
00080 friend class RosterManager;
00081
00082 public:
00091 ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00092
00102 ClientBase( const std::string& ns, const std::string& password,
00103 const std::string& server, int port = -1 );
00104
00108 virtual ~ClientBase();
00109
00122 bool connect( bool block = true );
00123
00131 ConnectionError recv( int timeout = -1 );
00132
00137 virtual const std::string& username() const { return m_jid.username(); }
00138
00146 const JID& jid() { return m_authzid ? m_authzid : m_jid; }
00147
00153 void setSasl( bool sasl ) { m_sasl = sasl; }
00154
00160 void setTls( TLSPolicy tls ) { m_tls = tls; }
00161
00167 void setCompression( bool compression ) { m_compress = compression; }
00168
00174 void setPort( int port ) { m_port = port; }
00175
00183 void setServer( const std::string &server );
00184
00189 void setPassword( const std::string &password ) { m_password = password; }
00190
00195 const std::string& server() const { return m_server; }
00196
00201 bool sasl() const { return m_sasl; }
00202
00207 TLSPolicy tls() const { return m_tls; }
00208
00213 bool compression() const { return m_compress; }
00214
00220 int port() const { return m_port; }
00221
00226 virtual const std::string& password() const { return m_password; }
00227
00232 virtual Disco* disco() const { return m_disco; }
00233
00239 const std::string getID();
00240
00248 void send( Tag* tag );
00249
00259 void send( IQ& iq, IqHandler* ih, int context, bool del = false );
00260
00265 void send( const IQ& iq );
00266
00271 void send( const Message& msg );
00272
00277 void send( const Subscription& sub );
00278
00283 void send( Presence& pres );
00284
00289 bool authed() const { return m_authed; }
00290
00295 ConnectionState state() const;
00296
00301 const std::string& xmlLang() const { return m_xmllang; }
00302
00309 void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; }
00310
00316 ConnectionBase* connectionImpl() const { return m_connection; }
00317
00325 void setConnectionImpl( ConnectionBase* cb );
00326
00332 TLSBase* encryptionImpl() const { return m_encryption; }
00333
00341 void setEncryptionImpl( TLSBase* tb );
00342
00348 CompressionBase* compressionImpl() const { return m_compression; }
00349
00357 void setCompressionImpl( CompressionBase* cb );
00358
00363 void whitespacePing();
00364
00371 void xmppPing( const JID& to, EventHandler* eh );
00372
00380 void setAuthzid( const JID& authzid ) { m_authzid = authzid; }
00381
00390 void setAuthcid( const std::string& authcid ) { m_authcid = authcid; }
00391
00402 void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; }
00403
00408 void registerStanzaExtension( StanzaExtension* ext );
00409
00415 bool removeStanzaExtension( int ext );
00416
00421 void registerConnectionListener( ConnectionListener* cl );
00422
00432 void registerIqHandler( IqHandler* ih, int exttype );
00433
00441 void removeIDHandler( IqHandler* ih );
00442
00447 void registerMessageHandler( MessageHandler* mh );
00448
00453 void removeMessageHandler( MessageHandler* mh );
00454
00464 void registerMessageSession( MessageSession* session );
00465
00470 void disposeMessageSession( MessageSession* session );
00471
00476 void registerPresenceHandler( PresenceHandler* ph );
00477
00487 void registerPresenceHandler( const JID& jid, PresenceHandler* ph );
00488
00493 void registerSubscriptionHandler( SubscriptionHandler* sh );
00494
00502 void registerTagHandler( TagHandler* th, const std::string& tag,
00503 const std::string& xmlns );
00504
00511 void registerStatisticsHandler( StatisticsHandler* sh );
00512
00517 void removeConnectionListener( ConnectionListener* cl );
00518
00526 void removeIqHandler( IqHandler* ih, int exttype );
00527
00532 void removePresenceHandler( PresenceHandler* ph );
00533
00540 void removePresenceHandler( const JID& jid, PresenceHandler* ph );
00541
00546 void removeSubscriptionHandler( SubscriptionHandler* sh );
00547
00554 void removeTagHandler( TagHandler* th, const std::string& tag,
00555 const std::string& xmlns );
00556
00560 void removeStatisticsHandler();
00561
00567 void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; }
00568
00580 void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00581
00592 void registerMessageSessionHandler( MessageSessionHandler* msh, int types = 0 );
00593
00598 LogSink& logInstance() { return m_logInstance; }
00599
00606 StreamError streamError() const { return m_streamError; }
00607
00617 const std::string& streamErrorText( const std::string& lang = "default" ) const;
00618
00625 const std::string& streamErrorCData() const { return m_streamErrorCData; }
00626
00632 const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; }
00633
00639 AuthenticationError authError() const { return m_authError; }
00640
00646 StatisticsStruct getStatistics();
00647
00652 void registerMUCInvitationHandler( MUCInvitationHandler* mih );
00653
00657 void removeMUCInvitationHandler();
00658
00666 void addPresenceExtension( StanzaExtension* se );
00667
00673 bool removePresenceExtension( int type );
00674
00679 const StanzaExtensionList& presenceExtensions() const { return m_presenceExtensions; }
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
00747 void notifyStreamEvent( StreamEvent event );
00748
00753 virtual void disconnect( ConnectionError reason );
00754
00758 void header();
00759
00764 void setAuthed( bool authed ) { m_authed = authed; }
00765
00771 void setAuthFailure( AuthenticationError e ) { m_authError = e; }
00772
00780 virtual bool checkStreamVersion( const std::string& version );
00781
00786 void startSASL( SaslMechanism type );
00787
00791 void processSASLSuccess();
00792
00797 void processSASLChallenge( const std::string& challenge );
00798
00803 void processSASLError( Tag* tag );
00804
00809 void setNTLMDomain( const std::string& domain ) { m_ntlmDomain = domain; }
00810
00814 void startTls();
00815
00820 bool hasTls();
00821
00822 JID m_jid;
00823 JID m_authzid;
00824 std::string m_authcid;
00825 ConnectionBase* m_connection;
00826 TLSBase* m_encryption;
00827 CompressionBase* m_compression;
00828 Disco* m_disco;
00831 StanzaExtensionList m_presenceExtensions;
00832
00833 std::string m_selectedResource;
00835 std::string m_clientCerts;
00836 std::string m_clientKey;
00837 std::string m_namespace;
00838 std::string m_password;
00839 std::string m_xmllang;
00840 std::string m_server;
00842 std::string m_sid;
00843 bool m_compressionActive;
00845 bool m_encryptionActive;
00847 bool m_compress;
00849 bool m_authed;
00850 bool m_block;
00851 bool m_sasl;
00852 TLSPolicy m_tls;
00853 int m_port;
00856 int m_availableSaslMechs;
00858 private:
00859 #ifdef CLIENTBASE_TEST
00860 public:
00861 #endif
00862
00868 class Ping : public StanzaExtension
00869 {
00870
00871 public:
00875 Ping();
00876
00880 virtual ~Ping();
00881
00882
00883 virtual const std::string& filterString() const;
00884
00885
00886 virtual StanzaExtension* newInstance( const Tag* tag ) const
00887 {
00888 (void)tag;
00889 return new Ping();
00890 }
00891
00892
00893 virtual Tag* tag() const
00894 {
00895 return new Tag( "ping", "xmlns", XMLNS_XMPP_PING );
00896 }
00897
00898
00899 virtual StanzaExtension* clone() const
00900 {
00901 return new Ping();
00902 }
00903
00904 };
00905
00906 ClientBase( const ClientBase& );
00907 ClientBase& operator=( const ClientBase& );
00908
00912 virtual void handleStartNode() = 0;
00913
00919 virtual bool handleNormalNode( Tag* tag ) = 0;
00920 virtual void rosterFilled() = 0;
00921 virtual void cleanup() {}
00922 virtual void handleIqIDForward( const IQ& iq, int context ) { (void) iq; (void) context; }
00923
00924 void parse( const std::string& data );
00925 void init();
00926 void handleStreamError( Tag* tag );
00927 TLSBase* getDefaultEncryption();
00928 CompressionBase* getDefaultCompression();
00929
00930 void notifyIqHandlers( IQ& iq );
00931 void notifyMessageHandlers( Message& msg );
00932 void notifyPresenceHandlers( Presence& presence );
00933 void notifySubscriptionHandlers( Subscription& s10n );
00934 void notifyTagHandlers( Tag* tag );
00935 void notifyOnDisconnect( ConnectionError e );
00936 void send( const std::string& xml );
00937 void addFrom( Tag* tag );
00938 void addNamespace( Tag* tag );
00939
00940
00941 virtual bool handleIq( const IQ& iq );
00942
00943
00944 virtual void handleIqID( const IQ& iq, int context );
00945
00946 struct TrackStruct
00947 {
00948 IqHandler* ih;
00949 int context;
00950 bool del;
00951 };
00952
00953 struct TagHandlerStruct
00954 {
00955 TagHandler* th;
00956 std::string xmlns;
00957 std::string tag;
00958 };
00959
00960 struct JidPresHandlerStruct
00961 {
00962 JID* jid;
00963 PresenceHandler* ph;
00964 };
00965
00966 enum TrackContext
00967 {
00968 XMPPPing
00969 };
00970
00971 typedef std::list<ConnectionListener*> ConnectionListenerList;
00972 typedef std::multimap<const std::string, IqHandler*> IqHandlerMapXmlns;
00973 typedef std::multimap<const int, IqHandler*> IqHandlerMap;
00974 typedef std::map<const std::string, TrackStruct> IqTrackMap;
00975 typedef std::map<const std::string, MessageHandler*> MessageHandlerMap;
00976 typedef std::list<MessageSession*> MessageSessionList;
00977 typedef std::list<MessageHandler*> MessageHandlerList;
00978 typedef std::list<PresenceHandler*> PresenceHandlerList;
00979 typedef std::list<JidPresHandlerStruct> PresenceJidHandlerList;
00980 typedef std::list<SubscriptionHandler*> SubscriptionHandlerList;
00981 typedef std::list<TagHandlerStruct> TagHandlerList;
00982
00983 ConnectionListenerList m_connectionListeners;
00984 IqHandlerMapXmlns m_iqNSHandlers;
00985 IqHandlerMap m_iqExtHandlers;
00986 IqTrackMap m_iqIDHandlers;
00987 MessageSessionList m_messageSessions;
00988 MessageHandlerList m_messageHandlers;
00989 PresenceHandlerList m_presenceHandlers;
00990 PresenceJidHandlerList m_presenceJidHandlers;
00991 SubscriptionHandlerList m_subscriptionHandlers;
00992 TagHandlerList m_tagHandlers;
00993 StringList m_cacerts;
00994 StatisticsHandler * m_statisticsHandler;
00995 MUCInvitationHandler * m_mucInvitationHandler;
00996 MessageSessionHandler * m_messageSessionHandlerChat;
00997 MessageSessionHandler * m_messageSessionHandlerGroupchat;
00998 MessageSessionHandler * m_messageSessionHandlerHeadline;
00999 MessageSessionHandler * m_messageSessionHandlerNormal;
01000
01001 util::Mutex m_iqHandlerMapMutex;
01002
01003 Parser m_parser;
01004 LogSink m_logInstance;
01005 StanzaExtensionFactory* m_seFactory;
01006 EventDispatcher m_dispatcher;
01007
01008 AuthenticationError m_authError;
01009 StreamError m_streamError;
01010 StringMap m_streamErrorText;
01011 std::string m_streamErrorCData;
01012 Tag* m_streamErrorAppCondition;
01013
01014 StatisticsStruct m_stats;
01015
01016 SaslMechanism m_selectedSaslMech;
01017
01018 std::string m_ntlmDomain;
01019 bool m_autoMessageSession;
01020
01021 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
01022 CredHandle m_credHandle;
01023 CtxtHandle m_ctxtHandle;
01024 #endif
01025
01026 };
01027
01028 }
01029
01030 #endif // CLIENTBASE_H__