Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

clientbase.h

00001 /*
00002   Copyright (c) 2005-2008 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 "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       // reimplemented from ParserHandler
00682       virtual void handleTag( Tag* tag );
00683 
00684       // reimplemented from CompressionDataHandler
00685       virtual void handleCompressedData( const std::string& data );
00686 
00687       // reimplemented from CompressionDataHandler
00688       virtual void handleDecompressedData( const std::string& data );
00689 
00690       // reimplemented from ConnectionDataHandler
00691       virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00692 
00693       // reimplemented from ConnectionDataHandler
00694       virtual void handleConnect( const ConnectionBase* connection );
00695 
00696       // reimplemented from ConnectionDataHandler
00697       virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00698 
00699       // reimplemented from TLSHandler
00700       virtual void handleEncryptedData( const TLSBase* base, const std::string& data );
00701 
00702       // reimplemented from TLSHandler
00703       virtual void handleDecryptedData( const TLSBase* base, const std::string& data );
00704 
00705       // reimplemented from TLSHandler
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           // reimplemented from StanzaExtension
00815           virtual const std::string& filterString() const;
00816 
00817           // reimplemented from StanzaExtension
00818           virtual StanzaExtension* newInstance( const Tag* tag ) const
00819           {
00820             (void)tag;
00821             return new Ping();
00822           }
00823 
00824           // reimplemented from StanzaExtension
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       // reimplemented from IqHandler
00861       virtual bool handleIq( const IQ& iq );
00862 
00863       // reimplemented from IqHandler
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__

Generated on Sun Dec 28 22:10:16 2008 for gloox by  doxygen 1.4.1