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 "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
00040 class SubscriptionHandler;
00041
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__