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 "connectiondatahandler.h"
00028 #include "parser.h"
00029 #include "tlshandler.h"
00030
00031 #include <string>
00032 #include <list>
00033 #include <map>
00034
00035 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00036 #include <windows.h>
00037 #define SECURITY_WIN32
00038 #include <security.h>
00039 #endif
00040
00041 namespace gloox
00042 {
00043
00044 class Disco;
00045 class EventHandler;
00046 class Event;
00047 class Tag;
00048 class IQ;
00049 class Message;
00050 class Presence;
00051 class Subscription;
00052 class MessageSessionHandler;
00053 class ConnectionListener;
00054 class MessageHandler;
00055 class MessageSession;
00056 class PresenceHandler;
00057 class SubscriptionHandler;
00058 class MUCInvitationHandler;
00059 class TagHandler;
00060 class ConnectionBase;
00061 class ConnectionTLS;
00062 class ConnectionCompression;
00063 class StanzaExtensionFactory;
00064
00074 class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler,
00075 public IqHandler, public TLSHandler
00076 {
00077
00078 friend class RosterManager;
00079
00080 public:
00089 ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00090
00100 ClientBase( const std::string& ns, const std::string& password,
00101 const std::string& server, int port = -1 );
00102
00106 virtual ~ClientBase();
00107
00120 bool connect( bool block = true );
00121
00129 ConnectionError recv( int timeout = -1 );
00130
00135 virtual const std::string& username() const { return m_jid.username(); }
00136
00144 const JID& jid() { return m_authzid ? m_authzid : m_jid; }
00145
00151 void setSasl( bool sasl ) { m_sasl = sasl; }
00152
00158 void setTls( TLSPolicy tls ) { m_tls = tls; }
00159
00165 void setCompression( bool compression ) { m_compress = compression; }
00166
00172 void setPort( int port ) { m_port = port; }
00173
00181 void setServer( const std::string &server );
00182
00187 void setPassword( const std::string &password ) { m_password = password; }
00188
00193 const std::string& server() const { return m_server; }
00194
00199 bool sasl() const { return m_sasl; }
00200
00205 TLSPolicy tls() const { return m_tls; }
00206
00211 bool compression() const { return m_compress; }
00212
00218 int port() const { return m_port; }
00219
00224 virtual const std::string& password() const { return m_password; }
00225
00230 virtual Disco* disco() const { return m_disco; }
00231
00237 const std::string getID();
00238
00246 void send( Tag* tag );
00247
00257 void send( IQ& iq, IqHandler* ih, int context, bool del = false );
00258
00263 void send( const IQ& iq );
00264
00269 void send( const Message& msg );
00270
00275 void send( const Subscription& sub );
00276
00281 void send( const Presence& pres );
00282
00287 bool authed() const { return m_authed; }
00288
00293 ConnectionState state() const;
00294
00299 const std::string& xmlLang() const { return m_xmllang; }
00300
00307 void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; }
00308
00314 ConnectionBase* connectionImpl() const { return m_connection; }
00315
00323 void setConnectionImpl( ConnectionBase* cb );
00324
00329 void whitespacePing();
00330
00337 void xmppPing( const JID& to, EventHandler* eh );
00338
00346 void setAuthzid( const JID& authzid ) { m_authzid = authzid; }
00347
00356 void setAuthcid( const std::string& authcid ) { m_authcid = authcid; }
00357
00368 void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; }
00369
00374 void registerStanzaExtension( StanzaExtension* ext );
00375
00381 bool removeStanzaExtension( int ext );
00382
00387 void registerConnectionListener( ConnectionListener* cl );
00388
00398 void registerIqHandler( IqHandler* ih, int exttype );
00399
00407 void removeIDHandler( IqHandler* ih );
00408
00413 void registerMessageHandler( MessageHandler* mh );
00414
00419 void removeMessageHandler( MessageHandler* mh );
00420
00430 void registerMessageSession( MessageSession* session );
00431
00436 void disposeMessageSession( MessageSession* session );
00437
00442 void registerPresenceHandler( PresenceHandler* ph );
00443
00453 void registerPresenceHandler( const JID& jid, PresenceHandler* ph );
00454
00459 void registerSubscriptionHandler( SubscriptionHandler* sh );
00460
00468 void registerTagHandler( TagHandler* th, const std::string& tag,
00469 const std::string& xmlns );
00470
00477 void registerStatisticsHandler( StatisticsHandler* sh );
00478
00483 void removeConnectionListener( ConnectionListener* cl );
00484
00492 void removeIqHandler( IqHandler* ih, int exttype );
00493
00498 void removePresenceHandler( PresenceHandler* ph );
00499
00506 void removePresenceHandler( const JID& jid, PresenceHandler* ph );
00507
00512 void removeSubscriptionHandler( SubscriptionHandler* sh );
00513
00520 void removeTagHandler( TagHandler* th, const std::string& tag,
00521 const std::string& xmlns );
00522
00526 void removeStatisticsHandler();
00527
00533 void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; }
00534
00546 void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00547
00558 void registerMessageSessionHandler( MessageSessionHandler* msh, int types = 0 );
00559
00564 LogSink& logInstance() { return m_logInstance; }
00565
00572 StreamError streamError() const { return m_streamError; }
00573
00583 const std::string& streamErrorText( const std::string& lang = "default" ) const;
00584
00591 const std::string& streamErrorCData() const { return m_streamErrorCData; }
00592
00598 const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; }
00599
00605 AuthenticationError authError() const { return m_authError; }
00606
00612 StatisticsStruct getStatistics();
00613
00618 void registerMUCInvitationHandler( MUCInvitationHandler* mih );
00619
00623 void removeMUCInvitationHandler();
00624
00632 void addPresenceExtension( StanzaExtension* se );
00633
00639 bool removePresenceExtension( int type );
00640
00645 const StanzaExtensionList& presenceExtensions() const { return m_presenceExtensions; }
00646
00647
00648 virtual void handleTag( Tag* tag );
00649
00650
00651 virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00652
00653
00654 virtual void handleConnect( const ConnectionBase* connection );
00655
00656
00657 virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00658
00659
00660 virtual void handleEncryptedData( const TLSBase* , const std::string& ) {}
00661
00662
00663 virtual void handleDecryptedData( const TLSBase* , const std::string& ) {}
00664
00665
00666 virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo &certinfo );
00667
00668 protected:
00674 void notifyOnResourceBindError( const Error* error );
00675
00680 void notifyOnResourceBind( const std::string& resource );
00681
00687 void notifyOnSessionCreateError( const Error* error );
00688
00696 bool notifyOnTLSConnect( const CertInfo& info );
00697
00701 void notifyOnConnect();
00702
00707 void notifyStreamEvent( StreamEvent event );
00708
00713 virtual void disconnect( ConnectionError reason );
00714
00718 void header();
00719
00724 void setAuthed( bool authed ) { m_authed = authed; }
00725
00731 void setAuthFailure( AuthenticationError e ) { m_authError = e; }
00732
00740 virtual bool checkStreamVersion( const std::string& version );
00741
00746 void startSASL( SaslMechanism type );
00747
00751 void processSASLSuccess();
00752
00757 void processSASLChallenge( const std::string& challenge );
00758
00763 void processSASLError( Tag* tag );
00764
00769 void setNTLMDomain( const std::string& domain ) { m_ntlmDomain = domain; }
00770
00774 void startTls();
00775
00780 bool hasTls();
00781 bool hasCompression();
00782
00783 JID m_jid;
00784 JID m_authzid;
00785 std::string m_authcid;
00786 ConnectionBase* m_connection;
00787 ConnectionTLS* m_encryption;
00788 ConnectionCompression* m_compression;
00789 Disco* m_disco;
00792 StanzaExtensionList m_presenceExtensions;
00793 LogSink m_logInstance;
00794 StringList m_cacerts;
00795
00796 GLOOX_DEPRECATED std::string m_selectedResource;
00800 std::string m_clientCerts;
00801 std::string m_clientKey;
00802 std::string m_namespace;
00803 std::string m_password;
00804 std::string m_xmllang;
00805 std::string m_server;
00807 std::string m_sid;
00808 bool m_compressionActive;
00810 bool m_encryptionActive;
00812 bool m_compress;
00813 bool m_authed;
00814 bool m_block;
00815 bool m_sasl;
00816 TLSPolicy m_tls;
00817 int m_port;
00820 int m_availableSaslMechs;
00822 private:
00823 #ifdef CLIENTBASE_TEST
00824 public:
00825 #endif
00826
00832 class Ping : public StanzaExtension
00833 {
00834
00835 public:
00839 Ping();
00840
00844 virtual ~Ping();
00845
00846
00847 virtual const std::string& filterString() const;
00848
00849
00850 virtual StanzaExtension* newInstance( const Tag* tag ) const
00851 {
00852 (void)tag;
00853 return new Ping();
00854 }
00855
00856
00857 virtual Tag* tag() const
00858 {
00859 return new Tag( "ping", "xmlns", XMLNS_XMPP_PING );
00860 }
00861
00862
00863 virtual StanzaExtension* clone() const
00864 {
00865 return new Ping();
00866 }
00867
00868 };
00869
00870 ClientBase( const ClientBase& );
00871 ClientBase& operator=( const ClientBase& );
00872
00876 virtual void handleStartNode() = 0;
00877
00883 virtual bool handleNormalNode( Tag* tag ) = 0;
00884 virtual void rosterFilled() = 0;
00885 virtual void cleanup() {}
00886 virtual void handleIqIDForward( const IQ& iq, int context ) { (void) iq; (void) context; }
00887
00888 void parse( const std::string& data );
00889 void init();
00890 void handleStreamError( Tag* tag );
00891
00892 void notifyIqHandlers( IQ& iq );
00893 void notifyMessageHandlers( Message& msg );
00894 void notifyPresenceHandlers( Presence& presence );
00895 void notifySubscriptionHandlers( Subscription& s10n );
00896 void notifyTagHandlers( Tag* tag );
00897 void notifyOnDisconnect( ConnectionError e );
00898 void send( const std::string& xml );
00899 void addFrom( Tag* tag );
00900 void addNamespace( Tag* tag );
00901
00902
00903 virtual bool handleIq( const IQ& iq );
00904
00905
00906 virtual void handleIqID( const IQ& iq, int context );
00907
00908 struct TrackStruct
00909 {
00910 IqHandler* ih;
00911 int context;
00912 bool del;
00913 };
00914
00915 struct TagHandlerStruct
00916 {
00917 TagHandler* th;
00918 std::string xmlns;
00919 std::string tag;
00920 };
00921
00922 struct JidPresHandlerStruct
00923 {
00924 JID* jid;
00925 PresenceHandler* ph;
00926 };
00927
00928 enum TrackContext
00929 {
00930 XMPPPing
00931 };
00932
00933 typedef std::list<ConnectionListener*> ConnectionListenerList;
00934 typedef std::multimap<const std::string, IqHandler*> IqHandlerMapXmlns;
00935 typedef std::multimap<const int, IqHandler*> IqHandlerMap;
00936 typedef std::map<const std::string, TrackStruct> IqTrackMap;
00937 typedef std::map<const std::string, MessageHandler*> MessageHandlerMap;
00938 typedef std::list<MessageSession*> MessageSessionList;
00939 typedef std::list<MessageHandler*> MessageHandlerList;
00940 typedef std::list<PresenceHandler*> PresenceHandlerList;
00941 typedef std::list<JidPresHandlerStruct> PresenceJidHandlerList;
00942 typedef std::list<SubscriptionHandler*> SubscriptionHandlerList;
00943 typedef std::list<TagHandlerStruct> TagHandlerList;
00944
00945 ConnectionListenerList m_connectionListeners;
00946 IqHandlerMapXmlns m_iqNSHandlers;
00947 IqHandlerMap m_iqExtHandlers;
00948 IqTrackMap m_iqIDHandlers;
00949 MessageSessionList m_messageSessions;
00950 MessageHandlerList m_messageHandlers;
00951 PresenceHandlerList m_presenceHandlers;
00952 PresenceJidHandlerList m_presenceJidHandlers;
00953 SubscriptionHandlerList m_subscriptionHandlers;
00954 TagHandlerList m_tagHandlers;
00955 StatisticsHandler * m_statisticsHandler;
00956 MUCInvitationHandler * m_mucInvitationHandler;
00957 MessageSessionHandler * m_messageSessionHandlerChat;
00958 MessageSessionHandler * m_messageSessionHandlerGroupchat;
00959 MessageSessionHandler * m_messageSessionHandlerHeadline;
00960 MessageSessionHandler * m_messageSessionHandlerNormal;
00961
00962 util::Mutex m_iqHandlerMapMutex;
00963 util::Mutex m_iqExtHandlerMapMutex;
00964
00965
00966
00967 Parser m_parser;
00968 StanzaExtensionFactory* m_seFactory;
00969 EventDispatcher m_dispatcher;
00970
00971 AuthenticationError m_authError;
00972 StreamError m_streamError;
00973 StringMap m_streamErrorText;
00974 std::string m_streamErrorCData;
00975 Tag* m_streamErrorAppCondition;
00976
00977 ConnectionBase* m_transportConnection;
00978
00979 StatisticsStruct m_stats;
00980
00981 SaslMechanism m_selectedSaslMech;
00982
00983 std::string m_ntlmDomain;
00984 bool m_autoMessageSession;
00985
00986 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00987 CredHandle m_credHandle;
00988 CtxtHandle m_ctxtHandle;
00989 #endif
00990
00991 };
00992
00993 }
00994
00995 #endif // CLIENTBASE_H__