gloox 1.0
|
00001 /* 00002 Copyright (c) 2004-2009 by Jakob Schroeter <js@camaya.net> 00003 This file is part of the gloox library. http://camaya.net/gloox 00004 00005 This software is distributed under a license. The full license 00006 agreement can be found in the file LICENSE in this distribution. 00007 This software may not be copied, modified, sold or distributed 00008 other than expressed in the named license agreement. 00009 00010 This software is distributed without any warranty. 00011 */ 00012 00013 00014 #ifndef CLIENT_H__ 00015 #define CLIENT_H__ 00016 00017 #include "clientbase.h" 00018 #include "presence.h" 00019 00020 #include <string> 00021 00022 namespace gloox 00023 { 00024 00025 class Capabilities; 00026 class RosterManager; 00027 class NonSaslAuth; 00028 class IQ; 00029 00098 class GLOOX_API Client : public ClientBase 00099 { 00100 public: 00101 00102 friend class NonSaslAuth; 00103 friend class Parser; 00104 00111 Client( const std::string& server ); 00112 00123 Client( const JID& jid, const std::string& password, int port = -1 ); 00124 00128 virtual ~Client(); 00129 00145 bool bindResource( const std::string& resource ) 00146 { return bindOperation( resource, true ); } 00147 00157 bool selectResource( const std::string& resource ); 00158 00165 bool hasResourceBind() const { return ((m_streamFeatures & StreamFeatureUnbind) == StreamFeatureUnbind); } 00166 00175 bool unbindResource( const std::string& resource ) 00176 { return bindOperation( resource, false ); } 00177 00182 const std::string& resource() const { return m_jid.resource(); } 00183 00188 int priority() const { return m_presence.priority(); } 00189 00194 void setUsername( const std::string &username ); 00195 00200 void setResource( const std::string &resource ) { m_jid.setResource( resource ); } 00201 00212 void setPresence( const JID& to, Presence::PresenceType pres, int priority, 00213 const std::string& status = EmptyString ); 00214 00228 void setPresence( Presence::PresenceType pres, int priority, 00229 const std::string& status = EmptyString ); 00230 00242 void setPresence() { sendPresence( m_presence ); } 00243 00248 Presence& presence() { return m_presence; } 00249 00255 GLOOX_DEPRECATED void setForceNonSasl( bool force = true ) { m_forceNonSasl = force; } 00256 00262 void disableRoster(); 00263 00268 RosterManager* rosterManager() { return m_rosterManager; } 00269 00273 void disconnect(); 00274 00282 bool login(); 00283 00284 protected: 00288 void nonSaslLogin(); 00289 00290 private: 00297 class ResourceBind : public StanzaExtension 00298 { 00299 00300 public: 00307 ResourceBind( const std::string& resource, bool bind = true ); 00308 00313 ResourceBind( const Tag* tag ); 00314 00318 ~ResourceBind(); 00319 00324 const std::string& resource() const { return m_resource; } 00325 00330 const JID& jid() const { return m_jid; } 00331 00337 bool unbind() const { return !m_bind; } 00338 00339 // reimplemented from StanzaExtension 00340 virtual const std::string& filterString() const; 00341 00342 // reimplemented from StanzaExtension 00343 virtual StanzaExtension* newInstance( const Tag* tag ) const 00344 { 00345 return new ResourceBind( tag ); 00346 } 00347 00348 // reimplemented from StanzaExtension 00349 virtual Tag* tag() const; 00350 00351 // reimplemented from StanzaExtension 00352 virtual StanzaExtension* clone() const 00353 { 00354 return new ResourceBind( *this ); 00355 } 00356 00357 private: 00358 std::string m_resource; 00359 JID m_jid; 00360 bool m_bind; 00361 }; 00362 00369 class SessionCreation : public StanzaExtension 00370 { 00371 00372 public: 00376 SessionCreation() : StanzaExtension( ExtSessionCreation ) {} 00377 00381 ~SessionCreation() {} 00382 00383 // reimplemented from StanzaExtension 00384 virtual const std::string& filterString() const { return EmptyString; } 00385 00386 // reimplemented from StanzaExtension 00387 virtual StanzaExtension* newInstance( const Tag* tag ) const 00388 { (void)tag; return 0; } 00389 00390 // reimplemented from StanzaExtension 00391 virtual Tag* tag() const; 00392 00393 // reimplemented from StanzaExtension 00394 virtual StanzaExtension* clone() const 00395 { return 0; } 00396 00397 }; 00398 00399 virtual void handleStartNode() {} 00400 virtual bool handleNormalNode( Tag* tag ); 00401 virtual void disconnect( ConnectionError reason ); 00402 virtual void handleIqIDForward( const IQ& iq, int context ); 00403 00404 int getStreamFeatures( Tag* tag ); 00405 int getSaslMechs( Tag* tag ); 00406 int getCompressionMethods( Tag* tag ); 00407 void processResourceBind( const IQ& iq ); 00408 void processCreateSession( const IQ& iq ); 00409 void sendPresence( Presence& pres ); 00410 void createSession(); 00411 void negotiateCompression( StreamFeature method ); 00412 void connected(); 00413 virtual void rosterFilled(); 00414 virtual void cleanup(); 00415 bool bindOperation( const std::string& resource, bool bind ); 00416 00417 void init(); 00418 00419 enum TrackContext 00420 { 00421 CtxResourceBind = 1000, // must be higher than the last element in ClientBase's TrackContext 00422 CtxResourceUnbind, 00423 CtxSessionEstablishment 00424 }; 00425 00426 RosterManager* m_rosterManager; 00427 NonSaslAuth* m_auth; 00428 00429 Presence m_presence; 00430 00431 bool m_resourceBound; 00432 bool m_forceNonSasl; 00433 bool m_manageRoster; 00434 00435 int m_streamFeatures; 00436 00437 }; 00438 00439 } 00440 00441 #endif // CLIENT_H__