00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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__