gloox  0.9.9.12
clientbase.h
1 /*
2  Copyright (c) 2005-2008 by Jakob Schroeter <js@camaya.net>
3  This file is part of the gloox library. http://camaya.net/gloox
4 
5  This software is distributed under a license. The full license
6  agreement can be found in the file LICENSE in this distribution.
7  This software may not be copied, modified, sold or distributed
8  other than expressed in the named license agreement.
9 
10  This software is distributed without any warranty.
11 */
12 
13 
14 
15 #ifndef CLIENTBASE_H__
16 #define CLIENTBASE_H__
17 
18 #include "macros.h"
19 #include "gloox.h"
20 #include "jid.h"
21 #include "logsink.h"
22 #include "taghandler.h"
23 #include "statisticshandler.h"
24 #include "tlshandler.h"
25 #include "compressiondatahandler.h"
26 #include "connectiondatahandler.h"
27 
28 #include <string>
29 #include <list>
30 #include <map>
31 
32 namespace gloox
33 {
34 
35  class Disco;
36  class Tag;
37  class Stanza;
38  class Parser;
39  class MessageSessionHandler;
40  class ConnectionListener;
41  class IqHandler;
42  class MessageHandler;
43  class MessageSession;
44  class PresenceHandler;
45  class SubscriptionHandler;
46  class MUCInvitationHandler;
47  class TagHandler;
48  class TLSBase;
49  class ConnectionBase;
50  class CompressionBase;
51 
60  class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler,
61  public CompressionDataHandler, public TLSHandler
62  {
63 
64  friend class RosterManager;
65 
66  public:
75  ClientBase( const std::string& ns, const std::string& server, int port = -1 );
76 
86  ClientBase( const std::string& ns, const std::string& password,
87  const std::string& server, int port = -1 );
88 
92  virtual ~ClientBase();
93 
106  bool connect( bool block = true );
107 
115  ConnectionError recv( int timeout = -1 );
116 
121  virtual const std::string& username() const { return m_jid.username(); }
122 
130  const JID& jid() { return m_authzid ? m_authzid : m_jid; }
131 
137  void setSasl( bool sasl ) { m_sasl = sasl; }
138 
144  GLOOX_DEPRECATED void setTls( bool tls ) { m_tls = (TLSPolicy)tls; }
145 
151  void setTls( TLSPolicy tls ) { m_tls = tls; }
152 
158  void setCompression( bool compression ) { m_compress = compression; }
159 
165  void setPort( int port ) { m_port = port; }
166 
174  void setServer( const std::string &server );
175 
180  void setPassword( const std::string &password ) { m_password = password; }
181 
186  const std::string& server() const { return m_server; }
187 
192  bool sasl() const { return m_sasl; }
193 
198  bool tls() const { return m_tls != TLSDisabled; }
199 
204  bool compression() const { return m_compress; }
205 
211  int port() const { return m_port; }
212 
217  virtual const std::string& password() const { return m_password; }
218 
223  virtual Disco* disco() const { return m_disco; }
224 
230  const std::string getID();
231 
239  virtual void send( Tag *tag );
240 
245  bool authed() const { return m_authed; }
246 
251  ConnectionState state() const;
252 
257  const std::string& xmlLang() const { return m_xmllang; }
258 
265  void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; }
266 
272  ConnectionBase* connectionImpl() const { return m_connection; }
273 
281  void setConnectionImpl( ConnectionBase *cb );
282 
288  TLSBase* encryptionImpl() const { return m_encryption; }
289 
297  void setEncryptionImpl( TLSBase *tb );
298 
304  CompressionBase* compressionImpl() const { return m_compression; }
305 
313  void setCompressionImpl( CompressionBase *cb );
314 
319  void whitespacePing();
320 
327  void xmppPing( const JID& to );
328 
336  void setAuthzid( const JID& authzid ) { m_authzid = authzid; }
337 
348  void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; }
349 
354  void registerConnectionListener( ConnectionListener *cl );
355 
362  void registerIqHandler( IqHandler *ih, const std::string& xmlns );
363 
372  void trackID( IqHandler *ih, const std::string& id, int context );
373 
381  void removeIDHandler( IqHandler *ih );
382 
387  void registerMessageHandler( MessageHandler *mh );
388 
393  void removeMessageHandler( MessageHandler *mh );
394 
404  void registerMessageSession( MessageSession *session );
405 
410  void disposeMessageSession( MessageSession *session );
411 
416  void registerPresenceHandler( PresenceHandler *ph );
417 
427  void registerPresenceHandler( const JID& jid, PresenceHandler *ph );
428 
433  void registerSubscriptionHandler( SubscriptionHandler *sh );
434 
442  void registerTagHandler( TagHandler *th, const std::string& tag,
443  const std::string& xmlns );
444 
451  void registerStatisticsHandler( StatisticsHandler *sh );
452 
457  void removeConnectionListener( ConnectionListener *cl );
458 
463  void removeIqHandler( const std::string& xmlns );
464 
469  void removePresenceHandler( PresenceHandler *ph );
470 
477  void removePresenceHandler( const JID& jid, PresenceHandler *ph );
478 
483  void removeSubscriptionHandler( SubscriptionHandler *sh );
484 
491  void removeTagHandler( TagHandler *th, const std::string& tag,
492  const std::string& xmlns );
493 
497  void removeStatisticsHandler();
498 
504  void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; }
505 
517  void setClientCert( const std::string& clientKey, const std::string& clientCerts );
518 
529  void registerMessageSessionHandler( MessageSessionHandler *msh, int types = 0 );
530 
535  LogSink& logInstance();
536 
543  StreamError streamError() const { return m_streamError; }
544 
554  const std::string streamErrorText( const std::string& lang = "default" ) const;
555 
562  const std::string& streamErrorCData() const { return m_streamErrorCData; }
563 
569  const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; }
570 
576  AuthenticationError authError() const { return m_authError; }
577 
583  StatisticsStruct getStatistics();
584 
589  void registerMUCInvitationHandler( MUCInvitationHandler *mih );
590 
594  void removeMUCInvitationHandler();
595 
596  // reimplemented from ParserHandler
597  virtual void handleTag( Tag *tag );
598 
599  // reimplemented from CompressionDataHandler
600  virtual void handleCompressedData( const std::string& data );
601 
602  // reimplemented from CompressionDataHandler
603  virtual void handleDecompressedData( const std::string& data );
604 
605  // reimplemented from ConnectionDataHandler
606  virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data );
607 
608  // reimplemented from ConnectionDataHandler
609  virtual void handleConnect( const ConnectionBase* connection );
610 
611  // reimplemented from ConnectionDataHandler
612  virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason );
613 
614  // reimplemented from TLSHandler
615  virtual void handleEncryptedData( const TLSBase *base, const std::string& data );
616 
617  // reimplemented from TLSHandler
618  virtual void handleDecryptedData( const TLSBase *base, const std::string& data );
619 
620  // reimplemented from TLSHandler
621  virtual void handleHandshakeResult( const TLSBase *base, bool success, CertInfo &certinfo );
622 
623  protected:
624  void notifyOnResourceBindError( ResourceBindError error );
625  void notifyOnSessionCreateError( SessionCreateError error );
626  bool notifyOnTLSConnect( const CertInfo& info );
627  void notifyOnConnect();
628  void notifyStreamEvent( StreamEvent event );
629  virtual void disconnect( ConnectionError reason );
630  void header();
631  void setAuthed( bool authed ) { m_authed = authed; }
632  void setAuthFailure( AuthenticationError e ) { m_authError = e; }
633  virtual bool checkStreamVersion( const std::string& version );
634 
635  void startSASL( SaslMechanism type );
636  void processSASLChallenge( const std::string& challenge );
637  void processSASLError( Stanza *stanza );
638  void startTls();
639  bool hasTls();
640 
641  JID m_jid;
642  JID m_authzid;
643  ConnectionBase *m_connection;
644  TLSBase *m_encryption;
645  CompressionBase *m_compression;
646  Disco *m_disco;
647 
648  std::string m_clientCerts;
649  std::string m_clientKey;
650  std::string m_namespace;
651  std::string m_password;
652  std::string m_xmllang;
653  std::string m_server;
654  std::string m_sid;
655  bool m_compressionActive;
656  bool m_encryptionActive;
657  bool m_compress;
658  bool m_authed;
659  bool m_block;
660  bool m_sasl;
661  TLSPolicy m_tls;
662  int m_port;
663 
664  int m_availableSaslMechs;
665 
666  private:
667  ClientBase( const ClientBase& );
668  ClientBase& operator=( const ClientBase& );
669 
670  virtual void handleStartNode() = 0;
671  virtual bool handleNormalNode( Stanza *stanza ) = 0;
672  virtual void rosterFilled() = 0;
673  virtual void cleanup() {}
674  void parse( const std::string& data );
675  void init();
676  void handleStreamError( Stanza *stanza );
677  TLSBase* getDefaultEncryption();
678  CompressionBase* getDefaultCompression();
679 
680  void notifyIqHandlers( Stanza *stanza );
681  void notifyMessageHandlers( Stanza *stanza );
682  void notifyPresenceHandlers( Stanza *stanza );
683  void notifySubscriptionHandlers( Stanza *stanza );
684  void notifyTagHandlers( Tag *tag );
685  void notifyOnDisconnect( ConnectionError e );
686  void send( const std::string& xml );
687 
688  struct TrackStruct
689  {
690  IqHandler *ih;
691  int context;
692  };
693 
694  struct TagHandlerStruct
695  {
696  TagHandler *th;
697  std::string xmlns;
698  std::string tag;
699  };
700 
701  struct JidPresHandlerStruct
702  {
703  JID *jid;
704  PresenceHandler* ph;
705  };
706 
707  typedef std::list<ConnectionListener*> ConnectionListenerList;
708  typedef std::map<const std::string, IqHandler*> IqHandlerMap;
709  typedef std::map<const std::string, TrackStruct> IqTrackMap;
710  typedef std::map<const std::string, MessageHandler*> MessageHandlerMap;
711  typedef std::list<MessageSession*> MessageSessionList;
712  typedef std::list<MessageHandler*> MessageHandlerList;
713  typedef std::list<PresenceHandler*> PresenceHandlerList;
714  typedef std::list<JidPresHandlerStruct> PresenceJidHandlerList;
715  typedef std::list<SubscriptionHandler*> SubscriptionHandlerList;
716  typedef std::list<TagHandlerStruct> TagHandlerList;
717 
718  ConnectionListenerList m_connectionListeners;
719  IqHandlerMap m_iqNSHandlers;
720  IqTrackMap m_iqIDHandlers;
721  MessageSessionList m_messageSessions;
722  MessageHandlerList m_messageHandlers;
723  PresenceHandlerList m_presenceHandlers;
724  PresenceJidHandlerList m_presenceJidHandlers;
725  SubscriptionHandlerList m_subscriptionHandlers;
726  TagHandlerList m_tagHandlers;
727  StringList m_cacerts;
728  StatisticsHandler *m_statisticsHandler;
729  MUCInvitationHandler *m_mucInvitationHandler;
730  MessageSessionHandler *m_messageSessionHandlerChat;
731  MessageSessionHandler *m_messageSessionHandlerGroupchat;
732  MessageSessionHandler *m_messageSessionHandlerHeadline;
733  MessageSessionHandler *m_messageSessionHandlerNormal;
734 
735  Parser *m_parser;
736  LogSink m_logInstance;
737 
738  AuthenticationError m_authError;
739  StreamError m_streamError;
740  StringMap m_streamErrorText;
741  std::string m_streamErrorCData;
742  Tag *m_streamErrorAppCondition;
743 
744  StatisticsStruct m_stats;
745 
746  SaslMechanism m_selectedSaslMech;
747 
748  int m_idCount;
749  bool m_autoMessageSession;
750 
751  };
752 
753 }
754 
755 #endif // CLIENTBASE_H__