clientbase.h

00001 /*
00002   Copyright (c) 2005-2007 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
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       // reimplemented from ParserHandler
00597       virtual void handleTag( Tag *tag );
00598 
00599       // reimplemented from CompressionDataHandler
00600       virtual void handleCompressedData( const std::string& data );
00601 
00602       // reimplemented from CompressionDataHandler
00603       virtual void handleDecompressedData( const std::string& data );
00604 
00605       // reimplemented from ConnectionDataHandler
00606       virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00607 
00608       // reimplemented from ConnectionDataHandler
00609       virtual void handleConnect( const ConnectionBase* connection );
00610 
00611       // reimplemented from ConnectionDataHandler
00612       virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00613 
00614       // reimplemented from TLSHandler
00615       virtual void handleEncryptedData( const TLSBase *base, const std::string& data );
00616 
00617       // reimplemented from TLSHandler
00618       virtual void handleDecryptedData( const TLSBase *base, const std::string& data );
00619 
00620       // reimplemented from TLSHandler
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__

Generated on Sat Nov 10 08:50:27 2007 for gloox by  doxygen 1.5.3-20071008