aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppInvokable.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/QXmppInvokable.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/QXmppInvokable.cpp')
-rw-r--r--source/QXmppInvokable.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/source/QXmppInvokable.cpp b/source/QXmppInvokable.cpp
new file mode 100644
index 00000000..9127820c
--- /dev/null
+++ b/source/QXmppInvokable.cpp
@@ -0,0 +1,126 @@
+/***************************************************************************
+* Copyright (C) 2006 by Ian Reinhart Geiser *
+* geiseri@sourcextreme.com *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU Library General Public License as *
+* published by the Free Software Foundation; either version 2 of the *
+* License, or (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU Library General Public *
+* License along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+***************************************************************************/
+#include "QXmppInvokable.h"
+
+#include <QVariant>
+#include <QMetaMethod>
+#include <QStringList>
+
+#include <qdebug.h>
+
+QXmppInvokable::QXmppInvokable( QObject *parent )
+ : QObject( parent )
+{
+
+}
+
+
+QXmppInvokable::~QXmppInvokable()
+{
+
+}
+
+QVariant QXmppInvokable::dispatch( const QByteArray & method, const QList< QVariant > & args )
+{
+ buildMethodHash();
+
+ if( !m_methodHash.contains(method))
+ return QVariant();
+
+ int idx = m_methodHash[method];
+ if( paramTypes( args) != metaObject()->method(idx).parameterTypes ())
+ return QVariant();
+
+ const char *typeName = metaObject()->method(idx).typeName();
+ int resultType = QMetaType::type(typeName);
+ void *result = QMetaType::construct(resultType, 0);
+
+ QGenericReturnArgument ret( typeName, result );
+ QList<QGenericArgument> genericArgs;
+ QList<QVariant>::ConstIterator iter = args.begin();
+ while( iter != args.end())
+ {
+ const void *data = iter->data();
+ const char *name = iter->typeName();
+ genericArgs << QGenericArgument(name,data);
+ ++iter;
+ }
+
+ if( QMetaObject::invokeMethod ( this, method.constData(), ret,
+ genericArgs.value(0, QGenericArgument() ),
+ genericArgs.value(1, QGenericArgument() ),
+ genericArgs.value(2, QGenericArgument() ),
+ genericArgs.value(3, QGenericArgument() ),
+ genericArgs.value(4, QGenericArgument() ),
+ genericArgs.value(5, QGenericArgument() ),
+ genericArgs.value(6, QGenericArgument() ),
+ genericArgs.value(7, QGenericArgument() ),
+ genericArgs.value(8, QGenericArgument() ),
+ genericArgs.value(9, QGenericArgument() )) )
+ {
+ QVariant returnValue( resultType, result);
+ QMetaType::destroy(resultType, result);
+ return returnValue;
+ }
+ else
+ {
+ qDebug("No such method '%s'", method.constData() );
+ return QVariant();
+ }
+}
+
+QList< QByteArray > QXmppInvokable::paramTypes( const QList< QVariant > & params )
+{
+ QList<QByteArray> types;
+ foreach( QVariant variant, params)
+ types << variant.typeName();
+ return types;
+}
+
+void QXmppInvokable::buildMethodHash( )
+{
+ QWriteLocker locker(&m_lock);
+ if( m_methodHash.size() > 0 )
+ return;
+
+ int methodCount = metaObject()->methodCount ();
+ for( int idx = 0; idx < methodCount; ++idx)
+ {
+ QByteArray signature = metaObject()->method(idx).signature();
+ m_methodHash[signature.left(signature.indexOf('('))] = idx;
+// qDebug() << metaObject()->method(idx).parameterTypes();
+ }
+}
+
+QStringList QXmppInvokable::interfaces( ) const
+{
+ QStringList results;
+ int methodCount = metaObject()->methodCount ();
+ for( int idx = 0; idx < methodCount; ++idx)
+ {
+ if( metaObject()->method(idx).methodType() == QMetaMethod::Slot )
+ {
+ QByteArray signature = metaObject()->method(idx).signature();
+ results << signature.left(signature.indexOf('('));
+ }
+ }
+ return results;
+}
+