From 5b0870ddaac421af2639058648a218c7061cdd6f Mon Sep 17 00:00:00 2001 From: Ian Geiser Date: Sun, 8 Nov 2009 22:02:28 +0000 Subject: Added start of XEP-009. This is only the inteface, being able to invoke remote methods is next. --- source/QXmppClient.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) (limited to 'source/QXmppClient.cpp') diff --git a/source/QXmppClient.cpp b/source/QXmppClient.cpp index f94dd7da..c8b16041 100644 --- a/source/QXmppClient.cpp +++ b/source/QXmppClient.cpp @@ -28,6 +28,8 @@ #include "QXmppMessage.h" #include "QXmppReconnectionManager.h" #include "QXmppIbbTransferManager.h" +#include "QXmppInvokable.h" +#include "QXmppRpcIq.h" #include "QXmppUtils.h" /// Creates a QXmppClient object. @@ -375,7 +377,62 @@ QXmppVCardManager& QXmppClient::getVCardManager() return m_stream->getVCardManager(); } +void QXmppClient::addInvokableInterface( QXmppInvokable *interface ) +{ + m_interfaces[ interface->metaObject()->className() ] = interface; +} + + +void QXmppClient::invokeInterfaceMethod( const QXmppRpcInvokeIq &iq ) +{ + QXmppStanza::Error error; + QString interface = iq.getInterface(); + QXmppInvokable *iface = m_interfaces[ interface ]; + if( iface ) + { + if ( iface->isAuthorized( iq.getFrom() ) ) + { + + if ( iface->interfaces().contains( iq.getMethod() ) ) + { + QVariant result = iface->dispatch(iq.getMethod().toLatin1(), + iq.getPayload() ); + QXmppRpcResponseIq resultIq; + resultIq.setId(iq.getId()); + resultIq.setTo(iq.getFrom()); + resultIq.setFrom( m_config.getJid()); + resultIq.setPayload(result); + m_stream->sendPacket( resultIq ); + return; + } + else + { + error.setType(QXmppStanza::Error::Cancel); + error.setCondition(QXmppStanza::Error::ItemNotFound); + + } + } + else + { + error.setType(QXmppStanza::Error::Auth); + error.setCondition(QXmppStanza::Error::Forbidden); + } + } + else + { + error.setType(QXmppStanza::Error::Cancel); + error.setCondition(QXmppStanza::Error::ItemNotFound); + } + QXmppRpcErrorIq errorIq; + errorIq.setId(iq.getId()); + errorIq.setTo(iq.getFrom()); + errorIq.setFrom( m_config.getJid()); + errorIq.setQuery( iq ); + errorIq.setError( error ); + m_stream->sendPacket( errorIq ); +} + QXmppIbbTransferManager* QXmppClient::getIbbTransferManager() const { - return m_ibbTransferManager; + return m_ibbTransferManager; } -- cgit v1.2.3