gloox  1.0.16
client.h
1 /*
2  Copyright (c) 2004-2015 by Jakob Schröter <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 #ifndef CLIENT_H__
15 #define CLIENT_H__
16 
17 #include "clientbase.h"
18 #include "presence.h"
19 
20 #include <string>
21 
22 namespace gloox
23 {
24 
25  class Capabilities;
26  class RosterManager;
27  class NonSaslAuth;
28  class IQ;
29 
116  class GLOOX_API Client : public ClientBase
117  {
118  public:
119 
120  friend class NonSaslAuth;
121  friend class Parser;
122 
129  Client( const std::string& server );
130 
141  Client( const JID& jid, const std::string& password, int port = -1 );
142 
146  virtual ~Client();
147 
163  bool bindResource( const std::string& resource )
164  { return bindOperation( resource, true ); }
165 
175  bool selectResource( const std::string& resource );
176 
183  bool hasResourceBind() const { return ((m_streamFeatures & StreamFeatureUnbind) == StreamFeatureUnbind); }
184 
193  bool unbindResource( const std::string& resource )
194  { return bindOperation( resource, false ); }
195 
200  const std::string& resource() const { return m_jid.resource(); }
201 
213  void setStreamManagement( bool enable = true, bool resume = true );
214 
224  void ackStreamManagement();
225 
233  void reqStreamManagement();
234 
239  int priority() const { return m_presence.priority(); }
240 
245  void setUsername( const std::string &username );
246 
251  void setResource( const std::string &resource ) { m_jid.setResource( resource ); }
252 
263  void setPresence( const JID& to, Presence::PresenceType pres, int priority,
264  const std::string& status = EmptyString );
265 
279  void setPresence( Presence::PresenceType pres, int priority,
280  const std::string& status = EmptyString );
281 
293  void setPresence() { sendPresence( m_presence ); }
294 
299  Presence& presence() { return m_presence; }
300 
306  GLOOX_DEPRECATED void setForceNonSasl( bool force = true ) { m_forceNonSasl = force; }
307 
313  void disableRoster();
314 
319  RosterManager* rosterManager() { return m_rosterManager; }
320 
324  void disconnect();
325 
333  bool login();
334 
335  protected:
339  void nonSaslLogin();
340 
341  private:
342 #ifdef CLIENT_TEST
343  public:
344 #endif
345 
351  class ResourceBind : public StanzaExtension
352  {
353 
354  public:
361  ResourceBind( const std::string& resource, bool bind = true );
362 
367  ResourceBind( const Tag* tag );
368 
372  ~ResourceBind();
373 
378  const std::string& resource() const { return m_resource; }
379 
384  const JID& jid() const { return m_jid; }
385 
391  bool unbind() const { return !m_bind; }
392 
393  // reimplemented from StanzaExtension
394  virtual const std::string& filterString() const;
395 
396  // reimplemented from StanzaExtension
397  virtual StanzaExtension* newInstance( const Tag* tag ) const
398  {
399  return new ResourceBind( tag );
400  }
401 
402  // reimplemented from StanzaExtension
403  virtual Tag* tag() const;
404 
405  // reimplemented from StanzaExtension
406  virtual StanzaExtension* clone() const
407  {
408  return new ResourceBind( *this );
409  }
410 
411  private:
412  std::string m_resource;
413  JID m_jid;
414  bool m_bind;
415  };
416 
423  class SessionCreation : public StanzaExtension
424  {
425 
426  public:
430  SessionCreation() : StanzaExtension( ExtSessionCreation ) {}
431 
435  ~SessionCreation() {}
436 
437  // reimplemented from StanzaExtension
438  virtual const std::string& filterString() const { return EmptyString; }
439 
440  // reimplemented from StanzaExtension
441  virtual StanzaExtension* newInstance( const Tag* tag ) const
442  { (void)tag; return 0; }
443 
444  // reimplemented from StanzaExtension
445  virtual Tag* tag() const;
446 
447  // reimplemented from StanzaExtension
448  virtual StanzaExtension* clone() const
449  { return 0; }
450 
451  };
452 
453  virtual void handleStartNode( const Tag* /*start*/ ) {}
454  virtual bool handleNormalNode( Tag* tag );
455  virtual void disconnect( ConnectionError reason );
456  virtual void handleIqIDForward( const IQ& iq, int context );
457 
458  int getStreamFeatures( Tag* tag );
459  int getSaslMechs( Tag* tag );
460  int getCompressionMethods( Tag* tag );
461  void processResourceBind( const IQ& iq );
462  void processCreateSession( const IQ& iq );
463  void sendPresence( Presence& pres );
464  void createSession();
465  void negotiateCompression( StreamFeature method );
466  void connected();
467  virtual void rosterFilled();
468  virtual void cleanup();
469  bool bindOperation( const std::string& resource, bool bind );
470  void sendStreamManagement();
471 
472  void init();
473 
474  enum TrackContext
475  {
476  CtxResourceBind = 1000, // must be higher than the last element in ClientBase's TrackContext
477  CtxResourceUnbind,
478  CtxSessionEstablishment
479  };
480 
481  RosterManager* m_rosterManager;
482  NonSaslAuth* m_auth;
483 
484  Presence m_presence;
485 
486  bool m_resourceBound;
487  bool m_forceNonSasl;
488  bool m_manageRoster;
489 
490  std::string m_smId;
491  std::string m_smLocation;
492  bool m_smResume;
493  bool m_smWanted;
494  int m_smMax;
495 
496  int m_streamFeatures;
497 
498  };
499 
500 }
501 
502 #endif // CLIENT_H__
Presence & presence()
Definition: client.h:299
GLOOX_DEPRECATED void setForceNonSasl(bool force=true)
Definition: client.h:306
bool hasResourceBind() const
Definition: client.h:183
This class implements a basic Jabber/XMPP Client.
Definition: client.h:116
This class implements an XML parser.
Definition: parser.h:34
This class is an implementation of XEP-0078 (Non-SASL Authentication).
Definition: nonsaslauth.h:39
ConnectionError
Definition: gloox.h:679
RosterManager * rosterManager()
Definition: client.h:319
void setResource(const std::string &resource)
Definition: client.h:251
bool bindResource(const std::string &resource)
Definition: client.h:163
An abstraction of a presence stanza.
Definition: presence.h:32
The namespace for the gloox library.
Definition: adhoc.cpp:27
This class abstracts a stanza extension, which is usually an element in a specific namespace...
This class implements Jabber/XMPP roster handling in the jabber:iq:roster namespace.
Definition: rostermanager.h:47
int priority() const
Definition: client.h:239
An abstraction of a JID.
Definition: jid.h:30
StreamFeature
Definition: gloox.h:729
const std::string & resource() const
Definition: client.h:200
void setPresence()
Definition: client.h:293
bool unbindResource(const std::string &resource)
Definition: client.h:193
const std::string EmptyString
Definition: gloox.cpp:123
This is the common base class for a Jabber/XMPP Client and a Jabber Component.
Definition: clientbase.h:76
This is an abstraction of an XML element.
Definition: tag.h:46