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/QXmppInvokable.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/QXmppInvokable.cpp')
| -rw-r--r-- | source/QXmppInvokable.cpp | 126 |
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; +} + |
