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 "jid.h"
00021 #include "logsink.h"
00022 #include "taghandler.h"
00023 #include "statisticshandler.h"
00024 #include "tlshandler.h"
00025 #include "compressiondatahandler.h"
00026 #include "connectiondatahandler.h"
00027
00028 #include <string>
00029 #include <list>
00030 #include <map>
00031
00032 namespace gloox
00033 {
00034
00035 class Disco;
00036 class Tag;
00037 class Stanza;
00038 class Parser;
00039 class MessageSessionHandler;
00040 class ConnectionListener;
00041 class IqHandler;
00042 class MessageHandler;
00043 class MessageSession;
00044 class PresenceHandler;
00045 class SubscriptionHandler;
00046 class MUCInvitationHandler;
00047 class TagHandler;
00048 class TLSBase;
00049 class ConnectionBase;
00050 class CompressionBase;
00051
00060 class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler,
00061 public CompressionDataHandler, public TLSHandler
00062 {
00063
00064 friend class RosterManager;
00065
00066 public:
00075 ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00076
00086 ClientBase( const std::string& ns, const std::string& password,
00087 const std::string& server, int port = -1 );
00088
00092 virtual ~ClientBase();
00093
00106 bool connect( bool block = true );
00107
00115 ConnectionError recv( int timeout = -1 );
00116
00121 virtual const std::string& username() const { return m_jid.username(); }
00122
00130 const JID& jid() { return m_authzid ? m_authzid : m_jid; }
00131
00137 void setSasl( bool sasl ) { m_sasl = sasl; }
00138
00144 GLOOX_DEPRECATED void setTls( bool tls ) { m_tls = (TLSPolicy)tls; }
00145
00151 void setTls( TLSPolicy tls ) { m_tls = tls; }
00152
00158 void setCompression( bool compression ) { m_compress = compression; }
00159
00165 void setPort( int port ) { m_port = port; }
00166
00174 void setServer( const std::string &server );
00175
00180 void setPassword( const std::string &password ) { m_password = password; }
00181
00186 const std::string& server() const { return m_server; }
00187
00192 bool sasl() const { return m_sasl; }
00193
00198 bool tls() const { return (bool)m_tls; }
00199
00204 bool compression() const { return m_compress; }
00205
00211 int port() const { return m_port; }
00212
00217 virtual const std::string& password() const { return m_password; }
00218
00223 virtual Disco* disco() const { return m_disco; }
00224
00230 const std::string getID();
00231
00239 virtual void send( Tag *tag );
00240
00245 bool authed() const { return m_authed; }
00246
00251 ConnectionState state() const;
00252
00257 const std::string& xmlLang() const { return m_xmllang; }
00258
00265 void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; }
00266
00272 ConnectionBase* connectionImpl() const { return m_connection; }
00273
00281 void setConnectionImpl( ConnectionBase *cb );
00282
00288 TLSBase* encryptionImpl() const { return m_encryption; }
00289
00297 void setEncryptionImpl( TLSBase *tb );
00298
00304 CompressionBase* compressionImpl() const { return m_compression; }
00305
00313 void setCompressionImpl( CompressionBase *cb );
00314
00319 void whitespacePing();
00320
00327 void xmppPing( const JID& to );
00328
00336 void setAuthzid( const JID& authzid ) { m_authzid = authzid; }
00337
00348 void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; }
00349
00354 void registerConnectionListener( ConnectionListener *cl );
00355
00362 void registerIqHandler( IqHandler *ih, const std::string& xmlns );
00363
00372 void trackID( IqHandler *ih, const std::string& id, int context );
00373
00381 void removeIDHandler( IqHandler *ih );
00382
00387 void registerMessageHandler( MessageHandler *mh );
00388
00393 void removeMessageHandler( MessageHandler *mh );
00394
00404 void registerMessageSession( MessageSession *session );
00405
00410 void disposeMessageSession( MessageSession *session );
00411
00416 void registerPresenceHandler( PresenceHandler *ph );
00417
00427 void registerPresenceHandler( const JID& jid, PresenceHandler *ph );
00428
00433 void registerSubscriptionHandler( SubscriptionHandler *sh );
00434
00442 void registerTagHandler( TagHandler *th, const std::string& tag,
00443 const std::string& xmlns );
00444
00451 void registerStatisticsHandler( StatisticsHandler *sh );
00452
00457 void removeConnectionListener( ConnectionListener *cl );
00458
00463 void removeIqHandler( const std::string& xmlns );
00464
00469 void removePresenceHandler( PresenceHandler *ph );
00470
00477 void removePresenceHandler( const JID& jid, PresenceHandler *ph );
00478
00483 void removeSubscriptionHandler( SubscriptionHandler *sh );
00484
00491 void removeTagHandler( TagHandler *th, const std::string& tag,
00492 const std::string& xmlns );
00493
00497 void removeStatisticsHandler();
00498
00504 void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; }
00505
00517 void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00518
00529 void registerMessageSessionHandler( MessageSessionHandler *msh, int types = 0 );
00530
00535 LogSink& logInstance();
00536
00543 StreamError streamError() const { return m_streamError; }
00544
00554 const std::string streamErrorText( const std::string& lang = "default" ) const;
00555
00562 const std::string& streamErrorCData() const { return m_streamErrorCData; }
00563
00569 const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; }
00570
00576 AuthenticationError authError() const { return m_authError; }
00577
00583 StatisticsStruct getStatistics();
00584
00589 void registerMUCInvitationHandler( MUCInvitationHandler *mih );
00590
00594 void removeMUCInvitationHandler();
00595
00596
00597 virtual void handleTag( Tag *tag );
00598
00599
00600 virtual void handleCompressedData( const std::string& data );
00601
00602
00603 virtual void handleDecompressedData( const std::string& data );
00604
00605
00606 virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00607
00608
00609 virtual void handleConnect( const ConnectionBase* connection );
00610
00611
00612 virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00613
00614
00615 virtual void handleEncryptedData( const TLSBase *base, const std::string& data );
00616
00617
00618 virtual void handleDecryptedData( const TLSBase *base, const std::string& data );
00619
00620
00621 virtual void handleHandshakeResult( const TLSBase *base, bool success, CertInfo &certinfo );
00622
00623 protected:
00624 void notifyOnResourceBindError( ResourceBindError error );
00625 void notifyOnSessionCreateError( SessionCreateError error );
00626 bool notifyOnTLSConnect( const CertInfo& info );
00627 void notifyOnConnect();
00628 void notifyStreamEvent( StreamEvent event );
00629 virtual void disconnect( ConnectionError reason );
00630 void header();
00631 void setAuthed( bool authed ) { m_authed = authed; }
00632 void setAuthFailure( AuthenticationError e ) { m_authError = e; }
00633 virtual bool checkStreamVersion( const std::string& version );
00634
00635 void startSASL( SaslMechanism type );
00636 void processSASLChallenge( const std::string& challenge );
00637 void processSASLError( Stanza *stanza );
00638 void startTls();
00639 bool hasTls();
00640
00641 JID m_jid;
00642 JID m_authzid;
00643 ConnectionBase *m_connection;
00644 TLSBase *m_encryption;
00645 CompressionBase *m_compression;
00646 Disco *m_disco;
00647
00648 std::string m_clientCerts;
00649 std::string m_clientKey;
00650 std::string m_namespace;
00651 std::string m_password;
00652 std::string m_xmllang;
00653 std::string m_server;
00654 std::string m_sid;
00655 bool m_compressionActive;
00656 bool m_encryptionActive;
00657 bool m_compress;
00658 bool m_authed;
00659 bool m_block;
00660 bool m_sasl;
00661 TLSPolicy m_tls;
00662 int m_port;
00663
00664 int m_availableSaslMechs;
00665
00666 private:
00667 ClientBase( const ClientBase& );
00668 ClientBase& operator=( const ClientBase& );
00669
00670 virtual void handleStartNode() = 0;
00671 virtual bool handleNormalNode( Stanza *stanza ) = 0;
00672 virtual void rosterFilled() = 0;
00673 virtual void cleanup() {}
00674 void parse( const std::string& data );
00675 void init();
00676 void handleStreamError( Stanza *stanza );
00677 TLSBase* getDefaultEncryption();
00678 CompressionBase* getDefaultCompression();
00679
00680 void notifyIqHandlers( Stanza *stanza );
00681 void notifyMessageHandlers( Stanza *stanza );
00682 void notifyPresenceHandlers( Stanza *stanza );
00683 void notifySubscriptionHandlers( Stanza *stanza );
00684 void notifyTagHandlers( Tag *tag );
00685 void notifyOnDisconnect( ConnectionError e );
00686 void send( const std::string& xml );
00687
00688 struct TrackStruct
00689 {
00690 IqHandler *ih;
00691 int context;
00692 };
00693
00694 struct TagHandlerStruct
00695 {
00696 TagHandler *th;
00697 std::string xmlns;
00698 std::string tag;
00699 };
00700
00701 struct JidPresHandlerStruct
00702 {
00703 JID *jid;
00704 PresenceHandler* ph;
00705 };
00706
00707 typedef std::list<ConnectionListener*> ConnectionListenerList;
00708 typedef std::map<const std::string, IqHandler*> IqHandlerMap;
00709 typedef std::map<const std::string, TrackStruct> IqTrackMap;
00710 typedef std::map<const std::string, MessageHandler*> MessageHandlerMap;
00711 typedef std::list<MessageSession*> MessageSessionList;
00712 typedef std::list<MessageHandler*> MessageHandlerList;
00713 typedef std::list<PresenceHandler*> PresenceHandlerList;
00714 typedef std::list<JidPresHandlerStruct> PresenceJidHandlerList;
00715 typedef std::list<SubscriptionHandler*> SubscriptionHandlerList;
00716 typedef std::list<TagHandlerStruct> TagHandlerList;
00717
00718 ConnectionListenerList m_connectionListeners;
00719 IqHandlerMap m_iqNSHandlers;
00720 IqTrackMap m_iqIDHandlers;
00721 MessageSessionList m_messageSessions;
00722 MessageHandlerList m_messageHandlers;
00723 PresenceHandlerList m_presenceHandlers;
00724 PresenceJidHandlerList m_presenceJidHandlers;
00725 SubscriptionHandlerList m_subscriptionHandlers;
00726 TagHandlerList m_tagHandlers;
00727 StringList m_cacerts;
00728 StatisticsHandler *m_statisticsHandler;
00729 MUCInvitationHandler *m_mucInvitationHandler;
00730 MessageSessionHandler *m_messageSessionHandlerChat;
00731 MessageSessionHandler *m_messageSessionHandlerGroupchat;
00732 MessageSessionHandler *m_messageSessionHandlerHeadline;
00733 MessageSessionHandler *m_messageSessionHandlerNormal;
00734
00735 Parser *m_parser;
00736 LogSink m_logInstance;
00737
00738 AuthenticationError m_authError;
00739 StreamError m_streamError;
00740 StringMap m_streamErrorText;
00741 std::string m_streamErrorCData;
00742 Tag *m_streamErrorAppCondition;
00743
00744 StatisticsStruct m_stats;
00745
00746 SaslMechanism m_selectedSaslMech;
00747
00748 int m_idCount;
00749 bool m_autoMessageSession;
00750
00751 };
00752
00753 }
00754
00755 #endif // CLIENTBASE_H__