clientbase.h

00001 /*
00002   Copyright (c) 2005-2006 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 
00237       void registerConnectionListener( ConnectionListener *cl );
00238 
00245       void registerIqHandler( IqHandler *ih, const std::string& xmlns );
00246 
00255       void trackID( IqHandler *ih, const std::string& id, int context );
00256 
00261       void registerMessageHandler( MessageHandler *mh );
00262 
00270       void registerMessageHandler( const std::string& jid,  MessageHandler *mh );
00271 
00276       void registerPresenceHandler( PresenceHandler *ph );
00277 
00282       void registerSubscriptionHandler( SubscriptionHandler *sh );
00283 
00291       void registerTagHandler( TagHandler *th, const std::string& tag,
00292                                                 const std::string& xmlns );
00293 
00298       void removeConnectionListener( ConnectionListener *cl );
00299 
00304       void removeIqHandler( const std::string& xmlns );
00305 
00310       void removeMessageHandler( MessageHandler *mh );
00311 
00316       void removeMessageHandler( const std::string& jid );
00317 
00322       void removePresenceHandler( PresenceHandler *ph );
00323 
00328       void removeSubscriptionHandler( SubscriptionHandler *sh );
00329 
00336       void removeTagHandler( TagHandler *th, const std::string& tag,
00337                                               const std::string& xmlns );
00338 
00344       void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; };
00345 
00357       void setClientCert( const std::string& clientKey, const std::string& clientCerts );
00358 
00369       void setAutoMessageSession( bool autoMS, MessageSessionHandler *msh );
00370 
00375       LogSink& logInstance();
00376 
00381       StreamError streamError() const { return m_streamError; };
00382 
00392       const std::string streamErrorText( const std::string& lang = "default" ) const;
00393 
00400       const std::string streamErrorCData() const { return m_streamErrorCData; };
00401 
00407       const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; };
00408 
00414       AuthenticationError authError() const { return m_authError; };
00415 
00416     protected:
00417       enum SaslMechanisms
00418       {
00419         SaslDigestMd5,          
00420         SaslPlain,               
00421         SaslAnonymous,           
00423         SaslExternal             
00424       };
00425 
00426       void notifyOnResourceBindError( ResourceBindError error );
00427       void notifyOnSessionCreateError( SessionCreateError error );
00428       bool notifyOnTLSConnect( const CertInfo& info );
00429       void notifyOnConnect();
00430       virtual void disconnect( ConnectionError reason );
00431       void header();
00432       void setAuthed( bool authed ) { m_authed = authed; };
00433       void setAuthFailure( AuthenticationError e ) { m_authError = e; };
00434       virtual bool checkStreamVersion( const std::string& version );
00435 
00436       void startSASL( SaslMechanisms type );
00437       void processSASLChallenge( const std::string& challenge );
00438       void processSASLError( Stanza *stanza );
00439       void startTls();
00440       bool hasTls();
00441 
00442       JID m_jid;
00443       Connection *m_connection;
00444 
00445       std::string m_clientCerts;
00446       std::string m_clientKey;
00447       std::string m_namespace;
00448       std::string m_password;
00449       std::string m_xmllang;
00450       std::string m_server;
00451       std::string m_sid;
00452       bool m_authed;
00453       bool m_sasl;
00454       bool m_tls;
00455       int m_port;
00456 
00457     private:
00458       enum NodeType
00459       {
00460         NODE_STREAM_START,             
00461         NODE_STREAM_ERROR,             
00462         NODE_STREAM_CLOSE,             
00463         NODE_STREAM_CHILD              
00464       };
00465 
00466       virtual void handleStartNode() = 0;
00467       virtual bool handleNormalNode( Stanza *stanza ) = 0;
00468       virtual void rosterFilled() = 0;
00469       virtual void cleanup();
00470       void handleStreamError( Stanza *stanza );
00471 
00472       void notifyIqHandlers( Stanza *stanza );
00473       void notifyMessageHandlers( Stanza *stanza );
00474       void notifyPresenceHandlers( Stanza *stanza );
00475       void notifySubscriptionHandlers( Stanza *stanza );
00476       void notifyTagHandlers( Stanza *stanza );
00477       void notifyOnDisconnect( ConnectionError e );
00478       void filter( NodeType type, Stanza *stanza );
00479       void logEvent( const char *data, size_t size, int is_incoming );
00480       void send( const std::string& xml );
00481 
00482       struct TrackStruct
00483       {
00484         IqHandler *ih;
00485         int context;
00486       };
00487 
00488       struct TagHandlerStruct
00489       {
00490         TagHandler *th;
00491         std::string xmlns;
00492         std::string tag;
00493       };
00494 
00495       typedef std::list<ConnectionListener*>                ConnectionListenerList;
00496       typedef std::map<const std::string, IqHandler*>       IqHandlerMap;
00497       typedef std::map<const std::string, TrackStruct>      IqTrackMap;
00498       typedef std::map<const std::string, MessageHandler*>  MessageHandlerMap;
00499       typedef std::list<MessageHandler*>                    MessageHandlerList;
00500       typedef std::list<PresenceHandler*>                   PresenceHandlerList;
00501       typedef std::list<SubscriptionHandler*>               SubscriptionHandlerList;
00502       typedef std::list<TagHandlerStruct>                   TagHandlerList;
00503 
00504       ConnectionListenerList  m_connectionListeners;
00505       IqHandlerMap            m_iqNSHandlers;
00506       IqTrackMap              m_iqIDHandlers;
00507       MessageHandlerMap       m_messageJidHandlers;
00508       MessageHandlerList      m_messageHandlers;
00509       PresenceHandlerList     m_presenceHandlers;
00510       SubscriptionHandlerList m_subscriptionHandlers;
00511       TagHandlerList          m_tagHandlers;
00512       StringList              m_cacerts;
00513       MessageSessionHandler  *m_messageSessionHandler;
00514 
00515       Parser *m_parser;
00516       LogSink m_logInstance;
00517 
00518       AuthenticationError m_authError;
00519       StreamError m_streamError;
00520       StringMap m_streamErrorText;
00521       std::string m_streamErrorCData;
00522       Tag *m_streamErrorAppCondition;
00523       int m_idCount;
00524       bool m_autoMessageSession;
00525       bool m_fdRequested;
00526 
00527   };
00528 
00529 }
00530 
00531 #endif // CLIENTBASE_H__

Generated on Wed Sep 13 21:33:46 2006 for gloox by  doxygen 1.4.7