gloox  1.0.22
lastactivity.cpp
1 /*
2  Copyright (c) 2005-2017 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 
15 #include "lastactivity.h"
16 #include "disco.h"
17 #include "discohandler.h"
18 #include "clientbase.h"
19 #include "error.h"
20 #include "lastactivityhandler.h"
21 
22 #include <cstdlib>
23 
24 namespace gloox
25 {
26 
27  // ---- LastActivity::Query ----
29  : StanzaExtension( ExtLastActivity ), m_seconds( -1 )
30  {
31  if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_LAST )
32  return;
33 
34  if( tag->hasAttribute( "seconds" ) )
35  m_seconds = atoi( tag->findAttribute( "seconds" ).c_str() );
36 
37  m_status = tag->cdata();
38  }
39 
40  LastActivity::Query::Query( const std::string& _status, long _seconds )
41  : StanzaExtension( ExtLastActivity ), m_seconds( _seconds ),
42  m_status( _status )
43  {
44  }
45 
47  {
48  }
49 
50  const std::string& LastActivity::Query::filterString() const
51  {
52  static const std::string filter = "/iq/query[@xmlns='" + XMLNS_LAST + "']"
53  "|/presence/query[@xmlns='" + XMLNS_LAST + "']";
54  return filter;
55  }
56 
58  {
59  Tag* t = new Tag( "query" );
60  t->setXmlns( XMLNS_LAST );
61  t->addAttribute( "seconds", m_seconds );
62  t->setCData( m_status );
63  return t;
64  }
65  // ---- ~LastActivity::Query ----
66 
67  // ---- LastActivity ----
69  : m_lastActivityHandler( 0 ), m_parent( parent ),
70  m_active( time ( 0 ) )
71  {
72  if( m_parent )
73  {
74  m_parent->registerStanzaExtension( new Query() );
75  m_parent->registerIqHandler( this, ExtLastActivity );
76  m_parent->disco()->addFeature( XMLNS_LAST );
77  }
78  }
79 
81  {
82  if( m_parent )
83  {
84  m_parent->disco()->removeFeature( XMLNS_LAST );
85  m_parent->removeIqHandler( this, ExtLastActivity );
86  m_parent->removeIDHandler( this );
87  }
88  }
89 
90  void LastActivity::query( const JID& jid )
91  {
92  IQ iq( IQ::Get, jid, m_parent->getID() );
93  iq.addExtension( new Query() );
94  m_parent->send( iq, this, 0 );
95  }
96 
97  bool LastActivity::handleIq( const IQ& iq )
98  {
99  const Query* q = iq.findExtension<Query>( ExtLastActivity );
100  if( !q || iq.subtype() != IQ::Get )
101  return false;
102 
103  IQ re( IQ::Result, iq.from(), iq.id() );
104  re.addExtension( new Query( EmptyString, static_cast<long>( time( 0 ) - m_active ) ) );
105  m_parent->send( re );
106 
107  return true;
108  }
109 
110  void LastActivity::handleIqID( const IQ& iq, int /*context*/ )
111  {
112  if( !m_lastActivityHandler )
113  return;
114 
115  if( iq.subtype() == IQ::Result )
116  {
117  const Query* q = iq.findExtension<Query>( ExtLastActivity );
118  if( !q || q->seconds() < 0 )
119  return;
120 
121  m_lastActivityHandler->handleLastActivityResult( iq.from(), q->seconds(), q->status() );
122  }
123  else if( iq.subtype() == IQ::Error && iq.error() )
124  m_lastActivityHandler->handleLastActivityError( iq.from(), iq.error()->error() );
125  }
126 
128  {
129  m_active = time( 0 );
130  }
131 
132 }
gloox::LastActivityHandler::handleLastActivityResult
virtual void handleLastActivityResult(const JID &jid, long seconds, const std::string &status)=0
gloox::IQ::Error
@ Error
Definition: iq.h:49
gloox::ClientBase::getID
const std::string getID()
Definition: clientbase.cpp:1168
gloox::StanzaExtension
This class abstracts a stanza extension, which is usually an XML child element in a specific namespac...
Definition: stanzaextension.h:203
gloox::LastActivity::Query::~Query
virtual ~Query()
Definition: lastactivity.cpp:46
gloox::Stanza::addExtension
void addExtension(const StanzaExtension *se)
Definition: stanza.cpp:52
gloox::XMLNS_LAST
const std::string XMLNS_LAST
Definition: gloox.cpp:45
gloox::Stanza::findExtension
const StanzaExtension * findExtension(int type) const
Definition: stanza.cpp:57
gloox::LastActivity::Query::status
const std::string & status() const
Definition: lastactivity.h:85
gloox::LastActivity::Query::filterString
virtual const std::string & filterString() const
Definition: lastactivity.cpp:50
gloox::LastActivity::query
void query(const JID &jid)
Definition: lastactivity.cpp:90
gloox::ClientBase::send
void send(Tag *tag)
Definition: clientbase.cpp:1004
gloox::LastActivity::LastActivity
LastActivity(ClientBase *parent)
Definition: lastactivity.cpp:68
gloox::LastActivity::Query::tag
virtual Tag * tag() const
Definition: lastactivity.cpp:57
gloox::Stanza::from
const JID & from() const
Definition: stanza.h:51
gloox::Tag::findAttribute
const std::string & findAttribute(const std::string &name) const
Definition: tag.cpp:589
gloox::IQ::Result
@ Result
Definition: iq.h:48
gloox::ExtLastActivity
@ ExtLastActivity
Definition: stanzaextension.h:80
gloox::EmptyString
const std::string EmptyString
Definition: gloox.cpp:124
gloox::IQ::subtype
IqType subtype() const
Definition: iq.h:74
gloox::LastActivity::resetIdleTimer
void resetIdleTimer()
Definition: lastactivity.cpp:127
gloox::IQ::Get
@ Get
Definition: iq.h:45
gloox::LastActivity::Query
This is an abstraction of a LastActivity Query that can be used in XEP-0012 as well as XEP-0256.
Definition: lastactivity.h:52
gloox::Stanza::error
const Error * error() const
Definition: stanza.cpp:47
gloox::JID
An abstraction of a JID.
Definition: jid.h:30
gloox::Tag::xmlns
const std::string xmlns() const
Definition: tag.cpp:543
gloox::LastActivity::Query::Query
Query(const Tag *tag=0)
Definition: lastactivity.cpp:28
gloox::Tag::hasAttribute
bool hasAttribute(const std::string &name, const std::string &value=EmptyString) const
Definition: tag.cpp:602
gloox
The namespace for the gloox library.
Definition: adhoc.cpp:27
gloox::LastActivity::handleIq
virtual bool handleIq(const IQ &iq)
Definition: lastactivity.cpp:97
gloox::ClientBase::disco
virtual Disco * disco() const
Definition: clientbase.h:233
gloox::Tag
This is an abstraction of an XML element.
Definition: tag.h:46
gloox::Tag::addAttribute
bool addAttribute(Attribute *attr)
Definition: tag.cpp:354
gloox::IQ
An abstraction of an IQ stanza.
Definition: iq.h:33
gloox::ClientBase
This is the common base class for a Jabber/XMPP Client and a Jabber Component.
Definition: clientbase.h:76
gloox::Stanza::id
const std::string & id() const
Definition: stanza.h:63
gloox::ClientBase::registerIqHandler
void registerIqHandler(IqHandler *ih, int exttype)
Definition: clientbase.cpp:1374
gloox::Tag::name
const std::string & name() const
Definition: tag.h:394
gloox::LastActivity::Query::seconds
long seconds() const
Definition: lastactivity.h:78
gloox::ClientBase::registerStanzaExtension
void registerStanzaExtension(StanzaExtension *ext)
Definition: clientbase.cpp:1102
gloox::ClientBase::removeIDHandler
void removeIDHandler(IqHandler *ih)
Definition: clientbase.cpp:1359
gloox::Tag::setCData
bool setCData(const std::string &cdata)
Definition: tag.cpp:447
gloox::LastActivity::~LastActivity
virtual ~LastActivity()
Definition: lastactivity.cpp:80
gloox::Tag::setXmlns
bool setXmlns(const std::string &xmlns, const std::string &prefix=EmptyString)
Definition: tag.cpp:522
gloox::Error::error
StanzaError error() const
Definition: error.h:75
gloox::LastActivity::handleIqID
virtual void handleIqID(const IQ &iq, int context)
Definition: lastactivity.cpp:110
gloox::ClientBase::removeIqHandler
void removeIqHandler(IqHandler *ih, int exttype)
Definition: clientbase.cpp:1391
gloox::LastActivityHandler::handleLastActivityError
virtual void handleLastActivityError(const JID &jid, StanzaError error)=0
gloox::Disco::removeFeature
void removeFeature(const std::string &feature)
Definition: disco.h:430
gloox::Tag::cdata
const std::string cdata() const
Definition: tag.cpp:497
gloox::Disco::addFeature
void addFeature(const std::string &feature)
Definition: disco.h:422