diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2011-10-26 20:17:56 -0200 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:56:15 -0300 |
commit | 67d6455fa52921d631001e7938aa7b9fa40b45aa (patch) | |
tree | 11e72784d6dea502c8df4089f20bceea666c3ff4 /libpyside/signalmanager.cpp | |
parent | 15ceed791f8dda4aa1256e67c11f8a748ce4b7b0 (diff) |
Unify the code used to do QObject meta calls.
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 57 |
1 files changed, 7 insertions, 50 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 8e5f2e613..a95f5f130 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -26,6 +26,7 @@ #include "pysideproperty_p.h" #include "pyside.h" #include "dynamicqmetaobject.h" +#include "pysidemetafunction_p.h" #include <QHash> #include <QStringList> @@ -34,6 +35,7 @@ #include <gilstate.h> #include <QDebug> #include <limits> +#include <algorithm> #include <typeresolver.h> #include <basewrapper.h> #include <conversions.h> @@ -54,7 +56,6 @@ namespace { static int callMethod(QObject* object, int id, void** args); static PyObject* parseArguments(QList<QByteArray> paramTypese, void** args); static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* args); - static bool emitNormalSignal(QObject* source, int signalIndex, const char* signal, PyObject* args, const QStringList& argTypes); #ifdef IS_PY3K static void destroyMetaObject(PyObject* obj) @@ -338,13 +339,14 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar int signalIndex = source->metaObject()->indexOfSignal(signal); if (signalIndex != -1) { - bool isShortCircuit; - QStringList argTypes = Signal::getArgsFromSignature(signal, &isShortCircuit); - + // cryptic but works! + // if the signature doesn't have a '(' it's a shor circuited signal, i.e. std::find + // returned the string null terminator. + bool isShortCircuit = !*std::find(signal, signal + std::strlen(signal), '('); if (isShortCircuit) return emitShortCircuitSignal(source, signalIndex, args); else - return emitNormalSignal(source, signalIndex, signal, args, argTypes); + return MetaFunction::call(source, signalIndex, args); } return false; } @@ -572,49 +574,4 @@ static bool emitShortCircuitSignal(QObject* source, int signalIndex, PyObject* a return true; } -static bool emitNormalSignal(QObject* source, int signalIndex, const char* signal, PyObject* args, const QStringList& argTypes) -{ - Shiboken::AutoDecRef sequence(PySequence_Fast(args, 0)); - int argsGiven = PySequence_Fast_GET_SIZE(sequence.object()); - - if (argsGiven != argTypes.count()) { - PyErr_Format(PyExc_TypeError, "%s only accepts %d arguments, %d given!", signal, argTypes.count(), argsGiven); - return false; - } - - QVariant* signalValues = new QVariant[argsGiven]; - void** signalArgs = new void*[argsGiven + 1]; - signalArgs[0] = 0; - - int i; - for (i = 0; i < argsGiven; ++i) { - QByteArray typeName = argTypes[i].toAscii(); - Shiboken::TypeResolver* typeResolver = Shiboken::TypeResolver::get(typeName); - if (typeResolver) { - if (Shiboken::TypeResolver::getType(typeName) == Shiboken::TypeResolver::ValueType) { - int typeId = QMetaType::type(typeName); - if (!typeId) { - PyErr_Format(PyExc_TypeError, "Value type used on signal needs to be registered on meta type: %s", typeName.data()); - break; - } - signalValues[i] = QVariant(typeId, (void*) 0); - } - signalArgs[i+1] = signalValues[i].data(); - typeResolver->toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i), &signalArgs[i+1]); - } else { - PyErr_Format(PyExc_TypeError, "Unknown type used to emit a signal: %s", qPrintable(argTypes[i])); - break; - } - } - - bool ok = i == argsGiven; - if (ok) - source->qt_metacall(QMetaObject::InvokeMetaMethod, signalIndex, signalArgs); - - delete[] signalArgs; - delete[] signalValues; - - return ok; -} - } //namespace |