privatexml.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "privatexml.h"
00015 #include "clientbase.h"
00016 #include "stanza.h"
00017
00018 namespace gloox
00019 {
00020
00021
00022 PrivateXML::Query::Query( const Tag* tag )
00023 : StanzaExtension( ExtPrivateXML ), m_privateXML( 0 )
00024 {
00025 if( !tag )
00026 return;
00027
00028 if( tag->name() == "query" && tag->xmlns() == XMLNS_PRIVATE_XML )
00029 {
00030 if( tag->children().size() )
00031 m_privateXML = tag->children().front()->clone();
00032 }
00033 else
00034 m_privateXML = tag;
00035 }
00036
00037 const std::string& PrivateXML::Query::filterString() const
00038 {
00039 static const std::string filter = "/iq/query[@xmlns='" + XMLNS_PRIVATE_XML + "']";
00040 return filter;
00041 }
00042
00043 Tag* PrivateXML::Query::tag() const
00044 {
00045 Tag* t = new Tag( "query" );
00046 t->setXmlns( XMLNS_PRIVATE_XML );
00047 if( m_privateXML )
00048 t->addChild( m_privateXML->clone() );
00049 return t;
00050 }
00051
00052
00053
00054 PrivateXML::PrivateXML( ClientBase* parent )
00055 : m_parent( parent )
00056 {
00057 if( !m_parent )
00058 return;
00059
00060 m_parent->registerIqHandler( this, ExtPrivateXML );
00061 m_parent->registerStanzaExtension( new Query() );
00062 }
00063
00064 PrivateXML::~PrivateXML()
00065 {
00066 if( !m_parent )
00067 return;
00068
00069 m_parent->removeIqHandler( this, ExtPrivateXML );
00070 m_parent->removeIDHandler( this );
00071 m_parent->removeStanzaExtension( ExtPrivateXML );
00072 }
00073
00074 std::string PrivateXML::requestXML( const std::string& tag, const std::string& xmlns,
00075 PrivateXMLHandler* pxh )
00076 {
00077 const std::string& id = m_parent->getID();
00078
00079 IQ iq( IQ::Get, JID(), id );
00080 iq.addExtension( new Query( tag, xmlns ) );
00081
00082 m_track[id] = pxh;
00083 m_parent->send( iq, this, RequestXml );
00084
00085 return id;
00086 }
00087
00088 std::string PrivateXML::storeXML( const Tag* tag, PrivateXMLHandler* pxh )
00089 {
00090 const std::string& id = m_parent->getID();
00091
00092 IQ iq( IQ::Set, JID(), id );
00093 iq.addExtension( new Query( tag ) );
00094
00095 m_track[id] = pxh;
00096 m_parent->send( iq, this, StoreXml );
00097
00098 return id;
00099 }
00100
00101 void PrivateXML::handleIqID( const IQ& iq, int context )
00102 {
00103 TrackMap::iterator t = m_track.find( iq.id() );
00104 if( t == m_track.end() )
00105 return;
00106
00107 if( iq.subtype() == IQ::Result )
00108 {
00109 if( context == RequestXml )
00110 {
00111 const Query* q = iq.findExtension<Query>( ExtPrivateXML );
00112 if( q )
00113 (*t).second->handlePrivateXML( q->privateXML() );
00114 }
00115 else if( context == StoreXml )
00116 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreOk );
00117 }
00118 else if( iq.subtype() == IQ::Error )
00119 {
00120 if( context == RequestXml )
00121 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlRequestError );
00122 else if( context == StoreXml )
00123 (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreError );
00124 }
00125
00126 m_track.erase( t );
00127 }
00128
00129 }