summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2013-07-29 01:18:01 +0800
committerLAN-TW <lantw44@gmail.com>2013-07-29 01:18:01 +0800
commit31c05567055f9b4e05d3ff018ae6a4960609b98a (patch)
tree8d7e1c1bd64e7d10ba541304cfc14b7673d47c0f
parent4b7090a13f499332af917d1cc69f0c775fc50014 (diff)
downloadgsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar.gz
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar.bz2
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar.lz
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar.xz
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.tar.zst
gsoc2013-libgnome-autoar-31c05567055f9b4e05d3ff018ae6a4960609b98a.zip
Use g_signal_query to get signal infomation
Remove duplicate code about signal in the source file.
-rw-r--r--autoar-extract.c60
1 files changed, 28 insertions, 32 deletions
diff --git a/autoar-extract.c b/autoar-extract.c
index 508fb72..c88f74e 100644
--- a/autoar-extract.c
+++ b/autoar-extract.c
@@ -83,6 +83,7 @@ struct _AutoarExtractPrivate
struct _AutoarExtractSignalEmitData
{
GValue instance_and_params[3]; /* Maximum number of parameters + 1 */
+ gssize used_values; /* Number of GValues to be unset */
guint signal_id;
GQuark detail;
};
@@ -506,17 +507,11 @@ _g_pattern_spec_free (void *pattern_compiled)
static void
autoar_extract_signal_emit_data_free (AutoarExtractSignalEmitData *emit_data)
{
- g_value_unset (emit_data->instance_and_params + 0);
- if (emit_data->signal_id == autoar_extract_signals[SCANNED]) {
- g_value_unset (emit_data->instance_and_params + 1);
- } else if (emit_data->signal_id == autoar_extract_signals[DECIDE_DEST]) {
- g_value_unset (emit_data->instance_and_params + 1);
- } else if (emit_data->signal_id == autoar_extract_signals[PROGRESS]) {
- g_value_unset (emit_data->instance_and_params + 1);
- g_value_unset (emit_data->instance_and_params + 2);
- } else if (emit_data->signal_id == autoar_extract_signals[ERROR]) {
- g_value_unset (emit_data->instance_and_params + 1);
- }
+ int i;
+
+ for (i = 0; i < emit_data->used_values; i++)
+ g_value_unset (emit_data->instance_and_params + i);
+
g_free (emit_data);
}
@@ -543,40 +538,41 @@ _g_signal_emit (gboolean in_thread,
va_start (ap, detail);
if (in_thread) {
+ int i;
gchar *error;
+ GSignalQuery query;
AutoarExtractSignalEmitData *emit_data;
error = NULL;
emit_data = g_new0 (AutoarExtractSignalEmitData, 1);
emit_data->signal_id = signal_id;
emit_data->detail = detail;
+ emit_data->used_values = 1;
g_value_init (emit_data->instance_and_params, G_TYPE_FROM_INSTANCE (instance));
g_value_set_instance (emit_data->instance_and_params, instance);
- if (signal_id == autoar_extract_signals[SCANNED]) {
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + 1, G_TYPE_UINT, ap, 0, &error);
- } else if (signal_id == autoar_extract_signals[DECIDE_DEST]) {
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + 1, G_TYPE_FILE, ap, 0, &error);
- } else if (signal_id == autoar_extract_signals[PROGRESS]) {
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + 1, G_TYPE_DOUBLE, ap, 0, &error);
- if (error != NULL)
- goto invoke_end;
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + 2, G_TYPE_DOUBLE, ap, 0, &error);
- } else if (signal_id == autoar_extract_signals[ERROR]) {
- G_VALUE_COLLECT_INIT (emit_data->instance_and_params + 1, G_TYPE_POINTER, ap, 0, &error);
- } else {
- /* "completed" signal does not have parameters. */
- if (signal_id != autoar_extract_signals[COMPLETED])
- goto invoke_end;
+ g_signal_query (signal_id, &query);
+ if (query.signal_id == 0) {
+ autoar_extract_signal_emit_data_free (emit_data);
+ va_end (ap);
+ return;
}
- if (error != NULL)
- goto invoke_end;
-
- g_main_context_invoke (NULL, _g_signal_emit_main_context, emit_data);
+ emit_data->used_values = query.n_params + 1;
+ for (i = 0; i < query.n_params; i++) {
+ G_VALUE_COLLECT_INIT (emit_data->instance_and_params + i + 1,
+ query.param_types[i],
+ ap,
+ 0,
+ &error);
+ if (error != NULL)
+ break;
+ emit_data->used_values++;
+ }
-invoke_end:
- if (error != NULL) {
+ if (error == NULL) {
+ g_main_context_invoke (NULL, _g_signal_emit_main_context, emit_data);
+ } else {
autoar_extract_signal_emit_data_free (emit_data);
g_debug ("G_VALUE_COLLECT_INIT: Error: %s", error);
g_free (error);