aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppRpcManager.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-12-10 16:20:17 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-12-10 16:20:17 +0000
commit71789caae022b638fc4cf3627be466004f17afe6 (patch)
tree7124141c099dacfc4d7dda8137c6a5b58761a9b8 /src/QXmppRpcManager.cpp
parentb4cf1c29e384cf98fe665b33f143dfc7f41d7bcf (diff)
downloadqxmpp-71789caae022b638fc4cf3627be466004f17afe6.tar.gz
add some RPC code which just barely compiles
Diffstat (limited to 'src/QXmppRpcManager.cpp')
-rw-r--r--src/QXmppRpcManager.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/QXmppRpcManager.cpp b/src/QXmppRpcManager.cpp
index c1c4e41f..86cffbe1 100644
--- a/src/QXmppRpcManager.cpp
+++ b/src/QXmppRpcManager.cpp
@@ -21,7 +21,10 @@
*
*/
+#include "QXmppClient.h"
#include "QXmppConstants.h"
+#include "QXmppInvokable.h"
+#include "QXmppRemoteMethod.h"
#include "QXmppRpcIq.h"
#include "QXmppRpcManager.h"
@@ -31,6 +34,98 @@ QXmppRpcManager::QXmppRpcManager()
{
}
+void QXmppRpcManager::addInvokableInterface( QXmppInvokable *interface )
+{
+ m_interfaces[ interface->metaObject()->className() ] = interface;
+}
+
+void QXmppRpcManager::invokeInterfaceMethod( const QXmppRpcInvokeIq &iq )
+{
+ QXmppStanza::Error error;
+
+ const QStringList methodBits = iq.method().split('.');
+ if (methodBits.size() != 2)
+ return;
+ const QString interface = methodBits.first();
+ const QString method = methodBits.last();
+ QXmppInvokable *iface = m_interfaces.value(interface);
+ if (iface)
+ {
+ if ( iface->isAuthorized( iq.from() ) )
+ {
+
+ if ( iface->interfaces().contains(method) )
+ {
+ QVariant result = iface->dispatch(method.toLatin1(),
+ iq.arguments() );
+ QXmppRpcResponseIq resultIq;
+ resultIq.setId(iq.id());
+ resultIq.setTo(iq.from());
+ resultIq.setValues(QVariantList() << result);
+ client()->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.id());
+ errorIq.setTo(iq.from());
+ errorIq.setQuery(iq);
+ errorIq.setError(error);
+ client()->sendPacket(errorIq);
+}
+
+QXmppRemoteMethodResult QXmppRpcManager::callRemoteMethod( const QString &jid,
+ const QString &interface,
+ const QVariant &arg1,
+ const QVariant &arg2,
+ const QVariant &arg3,
+ const QVariant &arg4,
+ const QVariant &arg5,
+ const QVariant &arg6,
+ const QVariant &arg7,
+ const QVariant &arg8,
+ const QVariant &arg9,
+ const QVariant &arg10 )
+{
+ QVariantList args;
+ if( arg1.isValid() ) args << arg1;
+ if( arg2.isValid() ) args << arg2;
+ if( arg3.isValid() ) args << arg3;
+ if( arg4.isValid() ) args << arg4;
+ if( arg5.isValid() ) args << arg5;
+ if( arg6.isValid() ) args << arg6;
+ if( arg7.isValid() ) args << arg7;
+ if( arg8.isValid() ) args << arg8;
+ if( arg9.isValid() ) args << arg9;
+ if( arg10.isValid() ) args << arg10;
+
+ QXmppRemoteMethod method( jid, interface, args, client() );
+#if 0
+ connect( d->stream, SIGNAL(rpcCallResponse(QXmppRpcResponseIq)),
+ &method, SLOT(gotResult(QXmppRpcResponseIq)));
+ connect( d->stream, SIGNAL(rpcCallError(QXmppRpcErrorIq)),
+ &method, SLOT(gotError(QXmppRpcErrorIq)));
+#endif
+ return method.call();
+}
+
QStringList QXmppRpcManager::discoveryFeatures() const
{
// XEP-0009: Jabber-RPC