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
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__