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-2009 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 "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       // reimplemented from ParserHandler
00648       virtual void handleTag( Tag* tag );
00649 
00650       // reimplemented from ConnectionDataHandler
00651       virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
00652 
00653       // reimplemented from ConnectionDataHandler
00654       virtual void handleConnect( const ConnectionBase* connection );
00655 
00656       // reimplemented from ConnectionDataHandler
00657       virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
00658 
00659       // reimplemented from TLSHandler
00660       virtual void handleEncryptedData( const TLSBase* /*base*/, const std::string& /*data*/ ) {}
00661 
00662       // reimplemented from TLSHandler
00663       virtual void handleDecryptedData( const TLSBase* /*base*/, const std::string& /*data*/ ) {}
00664 
00665       // reimplemented from TLSHandler
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           // reimplemented from StanzaExtension
00847           virtual const std::string& filterString() const;
00848 
00849           // reimplemented from StanzaExtension
00850           virtual StanzaExtension* newInstance( const Tag* tag ) const
00851           {
00852             (void)tag;
00853             return new Ping();
00854           }
00855 
00856           // reimplemented from StanzaExtension
00857           virtual Tag* tag() const
00858           {
00859             return new Tag( "ping", "xmlns", XMLNS_XMPP_PING );
00860           }
00861 
00862           // reimplemented from StanzaExtension
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       // reimplemented from IqHandler
00903       virtual bool handleIq( const IQ& iq );
00904 
00905       // reimplemented from IqHandler
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; // TODO Enable this mutex again. However
00964                                           // it must be possible to register new IQ handlers
00965                                           // while an IQ is being handled!
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__

Generated on Tue May 4 16:35:11 2010 for gloox by  doxygen 1.4.1