gloox 1.0.24
privatexml.cpp
1/*
2 Copyright (c) 2004-2019 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#include "privatexml.h"
15#include "clientbase.h"
16#include "stanza.h"
17
18namespace gloox
19{
20
21 // ---- PrivateXML::Query ----
22 PrivateXML::Query::Query( const Tag* tag )
23 : StanzaExtension( ExtPrivateXML ), m_privateXML( 0 )
24 {
25 if( !tag )
26 return;
27
28 if( tag->name() == "query" && tag->xmlns() == XMLNS_PRIVATE_XML )
29 {
30 if( tag->children().size() )
31 m_privateXML = tag->children().front()->clone();
32 }
33 else
34 m_privateXML = tag;
35 }
36
37 const std::string& PrivateXML::Query::filterString() const
38 {
39 static const std::string filter = "/iq/query[@xmlns='" + XMLNS_PRIVATE_XML + "']";
40 return filter;
41 }
42
43 Tag* PrivateXML::Query::tag() const
44 {
45 Tag* t = new Tag( "query" );
46 t->setXmlns( XMLNS_PRIVATE_XML );
47 if( m_privateXML )
48 t->addChild( m_privateXML->clone() );
49 return t;
50 }
51 // ---- ~PrivateXML::Query ----
52
53 // ---- PrivateXML ----
54 PrivateXML::PrivateXML( ClientBase* parent )
55 : m_parent( parent )
56 {
57 if( !m_parent )
58 return;
59
60 m_parent->registerIqHandler( this, ExtPrivateXML );
61 m_parent->registerStanzaExtension( new Query() );
62 }
63
65 {
66 if( !m_parent )
67 return;
68
69 m_parent->removeIqHandler( this, ExtPrivateXML );
70 m_parent->removeIDHandler( this );
72 }
73
74 std::string PrivateXML::requestXML( const std::string& tag, const std::string& xmlns,
76 {
77 const std::string& id = m_parent->getID();
78
79 IQ iq( IQ::Get, JID(), id );
80 iq.addExtension( new Query( tag, xmlns ) );
81
82 m_track[id] = pxh;
83 m_parent->send( iq, this, RequestXml );
84
85 return id;
86 }
87
88 std::string PrivateXML::storeXML( const Tag* tag, PrivateXMLHandler* pxh )
89 {
90 const std::string& id = m_parent->getID();
91
92 IQ iq( IQ::Set, JID(), id );
93 iq.addExtension( new Query( tag ) );
94
95 m_track[id] = pxh;
96 m_parent->send( iq, this, StoreXml );
97
98 return id;
99 }
100
101 void PrivateXML::handleIqID( const IQ& iq, int context )
102 {
103 TrackMap::iterator t = m_track.find( iq.id() );
104 if( t == m_track.end() )
105 return;
106
107 if( iq.subtype() == IQ::Result )
108 {
109 if( context == RequestXml )
110 {
111 const Query* q = iq.findExtension<Query>( ExtPrivateXML );
112 if( q )
113 (*t).second->handlePrivateXML( q->privateXML() );
114 }
115 else if( context == StoreXml )
116 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreOk );
117 }
118 else if( iq.subtype() == IQ::Error )
119 {
120 if( context == RequestXml )
121 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlRequestError );
122 else if( context == StoreXml )
123 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreError );
124 }
125
126 m_track.erase( t );
127 }
128
129}
This is the common base class for a Jabber/XMPP Client and a Jabber Component.
Definition: clientbase.h:79
const std::string getID()
void removeIqHandler(IqHandler *ih, int exttype)
void removeIDHandler(IqHandler *ih)
bool removeStanzaExtension(int ext)
void send(Tag *tag)
void registerIqHandler(IqHandler *ih, int exttype)
void registerStanzaExtension(StanzaExtension *ext)
An abstraction of an IQ stanza.
Definition: iq.h:34
IqType subtype() const
Definition: iq.h:74
@ Set
Definition: iq.h:46
@ Error
Definition: iq.h:49
@ Result
Definition: iq.h:48
@ Get
Definition: iq.h:45
An abstraction of a JID.
Definition: jid.h:31
A virtual interface which can be reimplemented to store and receive private XML data.
std::string requestXML(const std::string &tag, const std::string &xmlns, PrivateXMLHandler *pxh)
Definition: privatexml.cpp:74
virtual void handleIqID(const IQ &iq, int context)
Definition: privatexml.cpp:101
std::string storeXML(const Tag *tag, PrivateXMLHandler *pxh)
Definition: privatexml.cpp:88
virtual ~PrivateXML()
Definition: privatexml.cpp:64
void addExtension(const StanzaExtension *se)
Definition: stanza.cpp:52
const std::string & id() const
Definition: stanza.h:63
const StanzaExtension * findExtension(int type) const
Definition: stanza.cpp:57
This is an abstraction of an XML element.
Definition: tag.h:47
The namespace for the gloox library.
Definition: adhoc.cpp:28
const std::string XMLNS_PRIVATE_XML
Definition: gloox.cpp:44
@ ExtPrivateXML