summaryrefslogtreecommitdiff
path: root/src/QGlib/signal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QGlib/signal.cpp')
-rw-r--r--src/QGlib/signal.cpp160
1 files changed, 78 insertions, 82 deletions
diff --git a/src/QGlib/signal.cpp b/src/QGlib/signal.cpp
index 513737b..5acc4db 100644
--- a/src/QGlib/signal.cpp
+++ b/src/QGlib/signal.cpp
@@ -148,82 +148,6 @@ QList<Signal> Signal::listSignals(Type type)
}
//END ******** Signal ********
-//BEGIN ******** QGlib::emit ********
-
-//static
-Value emit(void *instance, const char *detailedSignal, const QList<Value> & args)
-{
- Value result;
- Type itype = Type::fromInstance(instance);
- QStringList signalParts = QString::fromUtf8(detailedSignal).split(QLatin1String("::"));
- Quark detail;
- if (signalParts.size() > 1) {
- detail = Quark(signalParts[1]);
- }
-
- //initialize arguments array
- GValue *values = new GValue[args.size() + 1];
- memset(values, 0, sizeof(GValue) * (args.size() + 1));
-
- //set instance
- g_value_init(&values[0], itype);
- g_value_set_instance(&values[0], instance);
-
- try {
- //find the signal and perform sanity checks
- Signal signal = Signal::lookup(signalParts[0].toUtf8(), itype);
- if (!signal.isValid()) {
- throw QString(QLatin1String("Could not find any signal named %1 "
- "on this instance type")).arg(signalParts[0]);
- }
-
- QList<Type> paramTypes = signal.paramTypes();
- if (paramTypes.size() != args.size()) {
- throw QString(QLatin1String("The number of arguments that the signal accepts differ "
- "from the number of arguments provided to emit"));
- }
-
- //set arguments
- for(int i=0; i<args.size(); i++) {
- if (!paramTypes[i].isA(args[i].type())) {
- throw QString(QLatin1String("Argument %1 provided to emit is not of the "
- "type that the signal expects")).arg(i);
- } else {
- g_value_init(&values[i+1], args[i].type());
- g_value_copy(args[i], &values[i+1]);
- }
- }
-
- //initialize return value
- GValue returnValue = QGLIB_G_VALUE_INITIALIZER;
- if (signal.returnType() != Type::None) {
- g_value_init(&returnValue, signal.returnType());
- }
-
- //emit the signal
- g_signal_emitv(values, signal.id(), detail, &returnValue);
-
- if (G_IS_VALUE(&returnValue)) {
- result = Value(&returnValue);
- g_value_unset(&returnValue);
- }
- } catch (const QString & msg) {
- QString instanceName = Value(&values[0]).toString();
-
- qCritical() << "Error during emission of signal" << detailedSignal
- << "on object"<< instanceName << ":" << msg;
- }
-
- //cleanup
- for(int i=0; i<args.size() + 1; i++) {
- g_value_unset(&values[i]);
- }
- delete[] values;
-
- return result;
-}
-
-//END ******** QGlib::emit ********
//BEGIN ******** Closure ********
void Closure::ref(bool increaseRef)
@@ -331,12 +255,8 @@ ClosurePtr createCppClosure(ClosureDataBase *closureData)
}
//END ******** Closure internals ********
+//BEGIN ******** connect ********
-} //namespace Private
-
-//BEGIN ******** QGlib::connect ********
-
-//static
SignalHandler connect(void *instance, const char *detailedSignal,
const ClosurePtr & closure, ConnectFlags flags)
{
@@ -345,6 +265,82 @@ SignalHandler connect(void *instance, const char *detailedSignal,
return SignalHandler(instance, id);
}
-//END ******** QGlib::connect ********
+//END ******** connect ********
+//BEGIN ******** emit ********
+
+Value emit(void *instance, const char *detailedSignal, const QList<Value> & args)
+{
+ Value result;
+ Type itype = Type::fromInstance(instance);
+ QStringList signalParts = QString::fromUtf8(detailedSignal).split(QLatin1String("::"));
+ Quark detail;
+ if (signalParts.size() > 1) {
+ detail = Quark(signalParts[1]);
+ }
+
+ //initialize arguments array
+ GValue *values = new GValue[args.size() + 1];
+ memset(values, 0, sizeof(GValue) * (args.size() + 1));
+
+ //set instance
+ g_value_init(&values[0], itype);
+ g_value_set_instance(&values[0], instance);
+
+ try {
+ //find the signal and perform sanity checks
+ Signal signal = Signal::lookup(signalParts[0].toUtf8(), itype);
+ if (!signal.isValid()) {
+ throw QString(QLatin1String("Could not find any signal named %1 "
+ "on this instance type")).arg(signalParts[0]);
+ }
+
+ QList<Type> paramTypes = signal.paramTypes();
+ if (paramTypes.size() != args.size()) {
+ throw QString(QLatin1String("The number of arguments that the signal accepts differ "
+ "from the number of arguments provided to emit"));
+ }
+
+ //set arguments
+ for(int i=0; i<args.size(); i++) {
+ if (!paramTypes[i].isA(args[i].type())) {
+ throw QString(QLatin1String("Argument %1 provided to emit is not of the "
+ "type that the signal expects")).arg(i);
+ } else {
+ g_value_init(&values[i+1], args[i].type());
+ g_value_copy(args[i], &values[i+1]);
+ }
+ }
+
+ //initialize return value
+ GValue returnValue = QGLIB_G_VALUE_INITIALIZER;
+ if (signal.returnType() != Type::None) {
+ g_value_init(&returnValue, signal.returnType());
+ }
+
+ //emit the signal
+ g_signal_emitv(values, signal.id(), detail, &returnValue);
+
+ if (G_IS_VALUE(&returnValue)) {
+ result = Value(&returnValue);
+ g_value_unset(&returnValue);
+ }
+ } catch (const QString & msg) {
+ QString instanceName = Value(&values[0]).toString();
+
+ qCritical() << "Error during emission of signal" << detailedSignal
+ << "on object"<< instanceName << ":" << msg;
+ }
+
+ //cleanup
+ for(int i=0; i<args.size() + 1; i++) {
+ g_value_unset(&values[i]);
+ }
+ delete[] values;
+
+ return result;
+}
+
+//END ******** emit ********
+} //namespace Private
} //namespace QGlib