diff options
| author | Ian Geiser <ian.geiser@gmail.com> | 2009-11-08 22:02:28 +0000 |
|---|---|---|
| committer | Ian Geiser <ian.geiser@gmail.com> | 2009-11-08 22:02:28 +0000 |
| commit | 5b0870ddaac421af2639058648a218c7061cdd6f (patch) | |
| tree | 351dd9d9ecb92fb1db4ded641a986066ad888914 /source/QXmppClient.cpp | |
| parent | 89e052995997c9a372d7deee6a9d31e100e10533 (diff) | |
| download | qxmpp-5b0870ddaac421af2639058648a218c7061cdd6f.tar.gz | |
Added start of XEP-009. This is only the inteface, being able to invoke remote methods is next.
Diffstat (limited to 'source/QXmppClient.cpp')
| -rw-r--r-- | source/QXmppClient.cpp | 59 |
1 files changed, 58 insertions, 1 deletions
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; } |
