aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppClient.cpp
diff options
context:
space:
mode:
authorIan Geiser <ian.geiser@gmail.com>2009-11-08 22:02:28 +0000
committerIan Geiser <ian.geiser@gmail.com>2009-11-08 22:02:28 +0000
commit5b0870ddaac421af2639058648a218c7061cdd6f (patch)
tree351dd9d9ecb92fb1db4ded641a986066ad888914 /source/QXmppClient.cpp
parent89e052995997c9a372d7deee6a9d31e100e10533 (diff)
downloadqxmpp-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.cpp59
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;
}