clientbase.h

00001 /*
00002   Copyright (c) 2005 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 "gloox.h"
00019 
00020 #include "connectionlistener.h"
00021 #include "iqhandler.h"
00022 #include "messagehandler.h"
00023 #include "presencehandler.h"
00024 #include "rosterlistener.h"
00025 #include "subscriptionhandler.h"
00026 #include "loghandler.h"
00027 #include "taghandler.h"
00028 #include "jid.h"
00029 
00030 
00031 namespace gloox
00032 {
00033 
00034   class string;
00035   class map;
00036   class list;
00037   class Connection;
00038   class Packet;
00039   class Tag;
00040   class Stanza;
00041   class Parser;
00042 
00050   class GLOOX_EXPORT ClientBase
00051   {
00052 
00053     friend class Parser;
00054 
00055     public:
00056 
00065       ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00066 
00076       ClientBase( const std::string& ns, const std::string& password,
00077                   const std::string& server, int port = -1 );
00078 
00082       virtual ~ClientBase();
00083 
00094       bool connect( bool block = true );
00095 
00102       ConnectionError recv( int timeout = -1 );
00103 
00107       void disconnect();
00108 
00113       virtual const std::string username() const = 0;
00114 
00121       JID& jid() { return m_jid; };
00122 
00127       void setSasl( bool sasl ) { m_sasl = sasl; };
00128 
00133       void setTls( bool tls ) { m_tls = tls; };
00134 
00140       void setPort( int port ) { m_port = port; };
00141 
00148       void setServer( const std::string &server ) { m_server = server; };
00149 
00154       void setPassword( const std::string &password ) { m_password = password; };
00155 
00160       const std::string server() const { return m_server; };
00161 
00166       bool sasl() const { return m_sasl; };
00167 
00172       bool tls() const { return m_tls; };
00173 
00179       int port() const { return m_port; };
00180 
00185       virtual const std::string password() const { return m_password; };
00186 
00192       const std::string getID();
00193 
00198       virtual void send( Tag *tag );
00199 
00204       bool authed() const { return m_authed; };
00205 
00210       ConnectionState state() const;
00211 
00216       const std::string& xmlLang() const { return m_xmllang; };
00217 
00224       void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; };
00225 
00232       int fileDescriptor() const;
00233 
00238       void registerConnectionListener( ConnectionListener *cl );
00239 
00246       void registerIqHandler( IqHandler *ih, const std::string& xmlns );
00247 
00256       void trackID( IqHandler *ih, const std::string& id, int context );
00257 
00262       void registerMessageHandler( MessageHandler *mh );
00263 
00268       void registerPresenceHandler( PresenceHandler *ph );
00269 
00274       void registerSubscriptionHandler( SubscriptionHandler *sh );
00275 
00281       void registerLogHandler( LogHandler *lh );
00282 
00290       void registerTagHandler( TagHandler *th, const std::string& tag,
00291                                                 const std::string& xmlns );
00292 
00297       void removeConnectionListener( ConnectionListener *cl );
00298 
00303       void removeIqHandler( const std::string& xmlns );
00304 
00309       void removeMessageHandler( MessageHandler *mh );
00310 
00315       void removePresenceHandler( PresenceHandler *ph );
00316 
00321       void removeSubscriptionHandler( SubscriptionHandler *sh );
00322 
00329       void removeTagHandler( TagHandler *th, const std::string& tag,
00330                                               const std::string& xmlns );
00331 
00336       void removeLogHandler( LogHandler *lh );
00337 
00343       void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; };
00344 
00349       StreamError streamError() const { return m_streamError; };
00350 
00360       const std::string streamErrorText( const std::string& lang = "default" ) const;
00361 
00368       const std::string streamErrorCData() const { return m_streamErrorCData; };
00369 
00375       const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; };
00376 
00382       AuthenticationError authError() const { return m_authError; };
00383 
00384     protected:
00385       enum SaslMechanisms
00386       {
00387         SASL_DIGEST_MD5,          
00388         SASL_PLAIN,               
00389         SASL_ANONYMOUS            
00391       };
00392 
00393       void notifyOnResourceBindError( ConnectionListener::ResourceBindError error );
00394       void notifyOnSessionCreateError( ConnectionListener::SessionCreateError error );
00395       bool notifyOnTLSConnect( const CertInfo& info );
00396       void log( const std::string& xml, bool incoming );
00397       void notifyOnConnect();
00398       void disconnect( ConnectionError reason );
00399       void header();
00400       void setAuthed( bool authed ) { m_authed = authed; };
00401       void setAuthFailure( AuthenticationError e ) { m_authError = e; };
00402       virtual bool checkStreamVersion( const std::string& version );
00403 
00404       void startSASL( SaslMechanisms type );
00405       void processSASLChallenge( const std::string& challenge );
00406       void processSASLError( Stanza *stanza );
00407       void startTls();
00408       bool hasTls();
00409 
00410       JID m_jid;
00411       Connection *m_connection;
00412 
00413       std::string m_namespace;
00414       std::string m_password;
00415       std::string m_xmllang;
00416       std::string m_server;
00417       std::string m_sid;
00418       bool m_authed;
00419       bool m_sasl;
00420       bool m_tls;
00421       int m_port;
00422 
00423     private:
00424       enum NodeType
00425       {
00426         NODE_STREAM_START,             
00427         NODE_STREAM_ERROR,             
00428         NODE_STREAM_CLOSE,             
00429         NODE_STREAM_CHILD              
00430       };
00431 
00432       virtual void handleStartNode() = 0;
00433       virtual bool handleNormalNode( Stanza *stanza ) = 0;
00434       void handleStreamError( Stanza *stanza );
00435 
00436       void notifyIqHandlers( Stanza *stanza );
00437       void notifyMessageHandlers( Stanza *stanza );
00438       void notifyPresenceHandlers( Stanza *stanza );
00439       void notifySubscriptionHandlers( Stanza *stanza );
00440       void notifyTagHandlers( Stanza *stanza );
00441       void notifyLogHandlers( const std::string& xml, bool incoming );
00442       void notifyOnDisconnect( ConnectionError e );
00443       void filter( NodeType type, Stanza *stanza );
00444       void logEvent( const char *data, size_t size, int is_incoming );
00445       void send( const std::string& xml );
00446 
00447       struct TrackStruct
00448       {
00449         IqHandler *ih;
00450         int context;
00451       };
00452 
00453       struct TagHandlerStruct
00454       {
00455         TagHandler *th;
00456         std::string xmlns;
00457         std::string tag;
00458       };
00459 
00460       typedef std::list<ConnectionListener*>            ConnectionListenerList;
00461       typedef std::map<const std::string, IqHandler*>   IqHandlerMap;
00462       typedef std::map<const std::string, TrackStruct>  IqTrackMap;
00463       typedef std::list<MessageHandler*>                MessageHandlerList;
00464       typedef std::list<PresenceHandler*>               PresenceHandlerList;
00465       typedef std::list<SubscriptionHandler*>           SubscriptionHandlerList;
00466       typedef std::list<LogHandler*>                    LogHandlerList;
00467       typedef std::list<TagHandlerStruct>               TagHandlerList;
00468 
00469       ConnectionListenerList  m_connectionListeners;
00470       IqHandlerMap            m_iqNSHandlers;
00471       IqTrackMap              m_iqIDHandlers;
00472       MessageHandlerList      m_messageHandlers;
00473       PresenceHandlerList     m_presenceHandlers;
00474       SubscriptionHandlerList m_subscriptionHandlers;
00475       LogHandlerList          m_logHandlers;
00476       TagHandlerList          m_tagHandlers;
00477       StringList              m_cacerts;
00478 
00479       Parser *m_parser;
00480 
00481       AuthenticationError m_authError;
00482       StreamError m_streamError;
00483           StringMap m_streamErrorText;
00484       std::string m_streamErrorCData;
00485       Tag *m_streamErrorAppCondition;
00486       int m_idCount;
00487 
00488   };
00489 
00490 }
00491 
00492 #endif // CLIENTBASE_H__

Generated on Mon Jan 16 16:19:54 2006 for gloox by  doxygen 1.4.6