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 
00023 namespace gloox
00024 {
00025 
00026   class string;
00027   class map;
00028   class list;
00029   class Connection;
00030   class Packet;
00031   class Tag;
00032   class Stanza;
00033   class Parser;
00034   class MessageSessionHandler;
00035   class ConnectionListener;
00036   class IqHandler;
00037   class MessageHandler;
00038   class PresenceHandler;
00039 //   class RosterListener;
00040   class SubscriptionHandler;
00041 //   class LogHandler;
00042   class TagHandler;
00043 
00051   class GLOOX_API ClientBase
00052   {
00053 
00054     friend class Parser;
00055     friend class RosterManager;
00056 
00057     public:
00066       ClientBase( const std::string& ns, const std::string& server, int port = -1 );
00067 
00077       ClientBase( const std::string& ns, const std::string& password,
00078                   const std::string& server, int port = -1 );
00079 
00083       virtual ~ClientBase();
00084 
00095       bool connect( bool block = true );
00096 
00104       ConnectionError recv( int timeout = -1 );
00105 
00110       virtual const std::string username() const = 0;
00111 
00118       JID& jid() { return m_jid; };
00119 
00124       void setSasl( bool sasl ) { m_sasl = sasl; };
00125 
00130       void setTls( bool tls ) { m_tls = tls; };
00131 
00137       void setPort( int port ) { m_port = port; };
00138 
00145       void setServer( const std::string &server ) { m_server = server; };
00146 
00151       void setPassword( const std::string &password ) { m_password = password; };
00152 
00157       const std::string server() const { return m_server; };
00158 
00163       bool sasl() const { return m_sasl; };
00164 
00169       bool tls() const { return m_tls; };
00170 
00176       int port() const { return m_port; };
00177 
00182       virtual const std::string password() const { return m_password; };
00183 
00189       const std::string getID();
00190 
00197       virtual void send( Tag *tag );
00198 
00203       bool authed() const { return m_authed; };
00204 
00209       ConnectionState state() const;
00210 
00215       const std::string& xmlLang() const { return m_xmllang; };
00216 
00223       void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; };
00224 
00231       int fileDescriptor();
00232 
00236       void ping();
00237 
00242       void registerConnectionListener( ConnectionListener *cl );
00243 
00250       void registerIqHandler( IqHandler *ih, const std::string& xmlns );
00251 
00260       void trackID( IqHandler *ih, const std::string& id, int context );
00261 
00269       void removeIDHandler( IqHandler *ih );
00270 
00275       void registerMessageHandler( MessageHandler *mh );
00276 
00286       void registerMessageHandler( const std::string& jid, MessageHandler *mh, bool wantUpgrade );
00287 
00292       void registerPresenceHandler( PresenceHandler *ph );
00293 
00298       void registerSubscriptionHandler( SubscriptionHandler *sh );
00299 
00307       void registerTagHandler( TagHandler *th, const std::string& tag,
00308                                                 const std::string& xmlns );
00309 
00314       void removeConnectionListener( ConnectionListener *cl );
00315 
00320       void removeIqHandler( const std::string& xmlns );
00321 
00326       void removeMessageHandler( MessageHandler *mh );
00327 
00332       void removeMessageHandler( const std::string& jid );
00333 
00338       void removePresenceHandler( PresenceHandler *ph );
00339 
00344       void removeSubscriptionHandler( SubscriptionHandler *sh );
00345 
00352       void removeTagHandler( TagHandler *th, const std::string& tag,
00353                                              const std::string& xmlns );
00354 
00360       void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; };
00361 
00373       void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00374 
00385       void setAutoMessageSession( bool autoMS, MessageSessionHandler *msh );
00386 
00391       LogSink& logInstance();
00392 
00397       StreamError streamError() const { return m_streamError; };
00398 
00408       const std::string streamErrorText( const std::string& lang = "default" ) const;
00409 
00416       const std::string streamErrorCData() const { return m_streamErrorCData; };
00417 
00423       const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; };
00424 
00430       AuthenticationError authError() const { return m_authError; };
00431 
00432     protected:
00433       enum SaslMechanisms
00434       {
00435         SaslDigestMd5,          
00436         SaslPlain,               
00437         SaslAnonymous,           
00439         SaslExternal             
00440       };
00441 
00442       void notifyOnResourceBindError( ResourceBindError error );
00443       void notifyOnSessionCreateError( SessionCreateError error );
00444       bool notifyOnTLSConnect( const CertInfo& info );
00445       void notifyOnConnect();
00446       virtual void disconnect( ConnectionError reason );
00447       void header();
00448       void setAuthed( bool authed ) { m_authed = authed; };
00449       void setAuthFailure( AuthenticationError e ) { m_authError = e; };
00450       virtual bool checkStreamVersion( const std::string& version );
00451 
00452       void startSASL( SaslMechanisms type );
00453       void processSASLChallenge( const std::string& challenge );
00454       void processSASLError( Stanza *stanza );
00455       void startTls();
00456       bool hasTls();
00457 
00458       JID m_jid;
00459       Connection *m_connection;
00460 
00461       std::string m_clientCerts;
00462       std::string m_clientKey;
00463       std::string m_namespace;
00464       std::string m_password;
00465       std::string m_xmllang;
00466       std::string m_server;
00467       std::string m_sid;
00468       bool m_authed;
00469       bool m_sasl;
00470       bool m_tls;
00471       int m_port;
00472 
00473     private:
00474       enum NodeType
00475       {
00476         NODE_STREAM_START,             
00477         NODE_STREAM_ERROR,             
00478         NODE_STREAM_CLOSE,             
00479         NODE_STREAM_CHILD              
00480       };
00481 
00482       virtual void handleStartNode() = 0;
00483       virtual bool handleNormalNode( Stanza *stanza ) = 0;
00484       virtual void rosterFilled() = 0;
00485       virtual void cleanup() {};
00486       void handleStreamError( Stanza *stanza );
00487 
00488       void notifyIqHandlers( Stanza *stanza );
00489       void notifyMessageHandlers( Stanza *stanza );
00490       void notifyPresenceHandlers( Stanza *stanza );
00491       void notifySubscriptionHandlers( Stanza *stanza );
00492       void notifyTagHandlers( Stanza *stanza );
00493       void notifyOnDisconnect( ConnectionError e );
00494       void filter( NodeType type, Stanza *stanza );
00495       void logEvent( const char *data, size_t size, int is_incoming );
00496       void send( const std::string& xml );
00497 
00498       struct TrackStruct
00499       {
00500         IqHandler *ih;
00501         int context;
00502       };
00503 
00504       struct TagHandlerStruct
00505       {
00506         TagHandler *th;
00507         std::string xmlns;
00508         std::string tag;
00509       };
00510 
00511       struct JidHandlerStruct
00512       {
00513         MessageHandler *mh;
00514         bool wantUpgrade;
00515       };
00516 
00517       typedef std::list<ConnectionListener*>                ConnectionListenerList;
00518       typedef std::map<const std::string, IqHandler*>       IqHandlerMap;
00519       typedef std::map<const std::string, TrackStruct>      IqTrackMap;
00520       typedef std::map<const std::string, MessageHandler*>  MessageHandlerMap;
00521       typedef std::map<const std::string, JidHandlerStruct> MessageJidHandlerMap;
00522       typedef std::list<MessageHandler*>                    MessageHandlerList;
00523       typedef std::list<PresenceHandler*>                   PresenceHandlerList;
00524       typedef std::list<SubscriptionHandler*>               SubscriptionHandlerList;
00525       typedef std::list<TagHandlerStruct>                   TagHandlerList;
00526 
00527       ConnectionListenerList  m_connectionListeners;
00528       IqHandlerMap            m_iqNSHandlers;
00529       IqTrackMap              m_iqIDHandlers;
00530       MessageJidHandlerMap    m_messageJidHandlers;
00531       MessageHandlerList      m_messageHandlers;
00532       PresenceHandlerList     m_presenceHandlers;
00533       SubscriptionHandlerList m_subscriptionHandlers;
00534       TagHandlerList          m_tagHandlers;
00535       StringList              m_cacerts;
00536       MessageSessionHandler  *m_messageSessionHandler;
00537 
00538       Parser *m_parser;
00539       LogSink m_logInstance;
00540 
00541       AuthenticationError m_authError;
00542       StreamError m_streamError;
00543       StringMap m_streamErrorText;
00544       std::string m_streamErrorCData;
00545       Tag *m_streamErrorAppCondition;
00546       int m_idCount;
00547       bool m_autoMessageSession;
00548       bool m_fdRequested;
00549       bool m_disconnectAnnounced;
00550   };
00551 
00552 }
00553 
00554 #endif // CLIENTBASE_H__

Generated on Tue May 1 14:20:20 2007 for gloox by  doxygen 1.5.1