From 005b18f2f16924676fbecd77222386fbcb32abb8 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 14:30:58 +1300 Subject: printers: Make helper functions for callback data --- panels/printers/pp-utils.c | 497 ++++++++++++++++++++++++++------------------- 1 file changed, 286 insertions(+), 211 deletions(-) diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 8dc86f057..4ec4af325 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1179,40 +1179,53 @@ typedef struct GMainContext *context; } GIAData; -static gboolean -get_ipp_attributes_idle_cb (gpointer user_data) +static GIAData * +gia_data_new (const gchar *printer_name, gchar **attributes_names, GIACallback callback, gpointer user_data) { - GIAData *data = (GIAData *) user_data; + GIAData *data; - data->callback (data->result, data->user_data); + data = g_new0 (GIAData, 1); + data->printer_name = g_strdup (printer_name); + data->attributes_names = g_strdupv (attributes_names); + data->callback = callback; + data->user_data = user_data; + data->context = g_main_context_ref_thread_default (); - return FALSE; + return data; } static void -get_ipp_attributes_data_free (gpointer user_data) +gia_data_free (GIAData *data) { - GIAData *data = (GIAData *) user_data; - - if (data->context) - g_main_context_unref (data->context); g_free (data->printer_name); if (data->attributes_names) g_strfreev (data->attributes_names); + if (data->context) + g_main_context_unref (data->context); g_free (data); } +static gboolean +get_ipp_attributes_idle_cb (gpointer user_data) +{ + GIAData *data = (GIAData *) user_data; + + data->callback (data->result, data->user_data); + + return FALSE; +} + static void get_ipp_attributes_cb (gpointer user_data) { - GIAData *data = (GIAData *) user_data; + GIAData *data = user_data; GSource *idle_source; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, get_ipp_attributes_idle_cb, data, - get_ipp_attributes_data_free); + (GDestroyNotify) gia_data_free); g_source_attach (idle_source, data->context); g_source_unref (idle_source); } @@ -1228,7 +1241,7 @@ static gpointer get_ipp_attributes_func (gpointer user_data) { ipp_attribute_t *attr = NULL; - GIAData *data = (GIAData *) user_data; + GIAData *data = user_data; ipp_t *request; ipp_t *response = NULL; g_autofree gchar *printer_uri = NULL; @@ -1338,12 +1351,7 @@ get_ipp_attributes_async (const gchar *printer_name, g_autoptr(GThread) thread = NULL; g_autoptr(GError) error = NULL; - data = g_new0 (GIAData, 1); - data->printer_name = g_strdup (printer_name); - data->attributes_names = g_strdupv (attributes_names); - data->callback = callback; - data->user_data = user_data; - data->context = g_main_context_ref_thread_default (); + data = gia_data_new (printer_name, attributes_names, callback, user_data); thread = g_thread_try_new ("get-ipp-attributes", get_ipp_attributes_func, @@ -1355,7 +1363,7 @@ get_ipp_attributes_async (const gchar *printer_name, g_warning ("%s", error->message); callback (NULL, user_data); - get_ipp_attributes_data_free (data); + gia_data_free (data); } } @@ -1399,8 +1407,6 @@ ipp_attribute_free (IPPAttribute *attr) } } - - typedef struct { gchar *printer_name; @@ -1410,6 +1416,30 @@ typedef struct gpointer user_data; } PSPData; +static PSPData * +psp_data_new (const gchar *printer_name, const gchar *ppd_copy, GCancellable *cancellable, PSPCallback callback, gpointer user_data) +{ + PSPData *data; + + data = g_new0 (PSPData, 1); + data->printer_name = g_strdup (printer_name); + data->ppd_copy = g_strdup (ppd_copy); + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + return data; +} + +static void +psp_data_free (PSPData *data) +{ + g_free (data->printer_name); + g_free (data->ppd_copy); + g_clear_object (&data->cancellable); + g_free (data); +} + static void printer_set_ppd_async_dbus_cb (GObject *source_object, GAsyncResult *res, @@ -1417,7 +1447,7 @@ printer_set_ppd_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; gboolean result = FALSE; - PSPData *data = (PSPData *) user_data; + PSPData *data = user_data; g_autoptr(GError) error = NULL; output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), @@ -1447,16 +1477,13 @@ printer_set_ppd_async_dbus_cb (GObject *source_object, result, data->user_data); - g_clear_object (&data->cancellable); - if (data->ppd_copy) { g_unlink (data->ppd_copy); g_free (data->ppd_copy); } - g_free (data->printer_name); - g_free (data); + psp_data_free (data); } /* @@ -1471,16 +1498,8 @@ printer_set_ppd_async (const gchar *printer_name, gpointer user_data) { g_autoptr(GDBusConnection) bus = NULL; - PSPData *data; g_autoptr(GError) error = NULL; - data = g_new0 (PSPData, 1); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - data->printer_name = g_strdup (printer_name); - if (printer_name == NULL || printer_name[0] == '\0') { @@ -1508,18 +1527,14 @@ printer_set_ppd_async (const gchar *printer_name, G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, -1, - data->cancellable, + cancellable, printer_set_ppd_async_dbus_cb, - data); + psp_data_new (printer_name, NULL, cancellable, callback, user_data)); return; out: callback (printer_name, FALSE, user_data); - - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data); } static void @@ -1529,7 +1544,7 @@ printer_set_ppd_file_async_scb (GObject *source_object, { g_autoptr(GDBusConnection) bus = NULL; gboolean success; - PSPData *data = (PSPData *) user_data; + PSPData *data = user_data; g_autoptr(GError) error = NULL; success = g_file_copy_finish (G_FILE (source_object), @@ -1572,10 +1587,7 @@ printer_set_ppd_file_async_scb (GObject *source_object, out: data->callback (data->printer_name, FALSE, data->user_data); - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data->ppd_copy); - g_free (data); + psp_data_free (data); } /* @@ -1590,17 +1602,9 @@ printer_set_ppd_file_async (const gchar *printer_name, gpointer user_data) { g_autoptr(GFileIOStream) stream = NULL; - PSPData *data; g_autoptr(GFile) source_ppd_file = NULL; g_autoptr(GFile) destination_ppd_file = NULL; - data = g_new0 (PSPData, 1); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - data->printer_name = g_strdup (printer_name); - if (printer_name == NULL || printer_name[0] == '\0') { @@ -1613,7 +1617,6 @@ printer_set_ppd_file_async (const gchar *printer_name, */ source_ppd_file = g_file_new_for_path (ppd_filename); destination_ppd_file = g_file_new_tmp ("g-c-c-XXXXXX.ppd", &stream, NULL); - data->ppd_copy = g_strdup (g_file_get_path (destination_ppd_file)); g_file_copy_async (source_ppd_file, destination_ppd_file, @@ -1623,16 +1626,12 @@ printer_set_ppd_file_async (const gchar *printer_name, NULL, NULL, printer_set_ppd_file_async_scb, - data); + psp_data_new (printer_name, g_file_get_path (destination_ppd_file), cancellable, callback, user_data)); return; out: callback (printer_name, FALSE, user_data); - - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data); } @@ -1650,28 +1649,41 @@ typedef struct GMainContext *context; } GPAData; -static gboolean -get_ppds_attribute_idle_cb (gpointer user_data) +static GPAData * +gpa_data_new (gchar **ppds_names, gchar *attribute_name, GPACallback callback, gpointer user_data) { - GPAData *data = (GPAData *) user_data; + GPAData *data; - data->callback (data->result, data->user_data); + data = g_new0 (GPAData, 1); + data->ppds_names = g_strdupv (ppds_names); + data->attribute_name = g_strdup (attribute_name); + data->callback = callback; + data->user_data = user_data; + data->context = g_main_context_ref_thread_default (); - return FALSE; + return data; } static void -get_ppds_attribute_data_free (gpointer user_data) +gpa_data_free (GPAData *data) { - GPAData *data = (GPAData *) user_data; - - if (data->context) - g_main_context_unref (data->context); g_free (data->attribute_name); g_strfreev (data->ppds_names); + if (data->context) + g_main_context_unref (data->context); g_free (data); } +static gboolean +get_ppds_attribute_idle_cb (gpointer user_data) +{ + GPAData *data = (GPAData *) user_data; + + data->callback (data->result, data->user_data); + + return FALSE; +} + static void get_ppds_attribute_cb (gpointer user_data) { @@ -1682,7 +1694,7 @@ get_ppds_attribute_cb (gpointer user_data) g_source_set_callback (idle_source, get_ppds_attribute_idle_cb, data, - get_ppds_attribute_data_free); + (GDestroyNotify) gpa_data_free); g_source_attach (idle_source, data->context); g_source_unref (idle_source); } @@ -1692,7 +1704,7 @@ get_ppds_attribute_func (gpointer user_data) { ppd_file_t *ppd_file; ppd_attr_t *ppd_attr; - GPAData *data = (GPAData *) user_data; + GPAData *data = user_data; gint i; data->result = g_new0 (gchar *, g_strv_length (data->ppds_names) + 1); @@ -1739,12 +1751,7 @@ get_ppds_attribute_async (gchar **ppds_names, return; } - data = g_new0 (GPAData, 1); - data->ppds_names = g_strdupv (ppds_names); - data->attribute_name = g_strdup (attribute_name); - data->callback = callback; - data->user_data = user_data; - data->context = g_main_context_ref_thread_default (); + data = gpa_data_new (ppds_names, attribute_name, callback, user_data); thread = g_thread_try_new ("get-ppds-attribute", get_ppds_attribute_func, @@ -1756,7 +1763,7 @@ get_ppds_attribute_async (gchar **ppds_names, g_warning ("%s", error->message); callback (NULL, user_data); - get_ppds_attribute_data_free (data); + gpa_data_free (data); } } @@ -1777,6 +1784,30 @@ typedef struct gpointer user_data; } GDAData; +static GDAData * +gda_data_new (const gchar *printer_name, GCancellable *cancellable, GDACallback callback, gpointer user_data) +{ + GDAData *data; + + data = g_new0 (GDAData, 1); + data->printer_name = g_strdup (printer_name); + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + + return data; +} + +static void +gda_data_free (GDAData *data) +{ + g_free (data->printer_name); + g_free (data->device_uri); + g_clear_object (&data->cancellable); + g_free (data); +} + typedef struct { gchar *printer_name; @@ -1787,11 +1818,35 @@ typedef struct gpointer user_data; } GPNData; +static GPNData * +gpn_data_new (const gchar *printer_name, gint count, GCancellable *cancellable, GPNCallback callback, gpointer user_data) +{ + GPNData *data; + + data = g_new0 (GPNData, 1); + data->printer_name = g_strdup (printer_name); + data->count = count; + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + + return data; +} + +static void +gpn_data_free (GPNData *data) +{ + g_free (data->printer_name); + g_clear_object (&data->cancellable); + g_free (data); +} + static void get_ppd_names_async_cb (gchar **attribute_values, gpointer user_data) { - GPNData *data = (GPNData *) user_data; + GPNData *data = user_data; gint i; if (g_cancellable_is_cancelled (data->cancellable)) @@ -1824,9 +1879,7 @@ out: g_cancellable_is_cancelled (data->cancellable), data->user_data); - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data); + gpn_data_free (data); } static void @@ -1837,7 +1890,7 @@ get_ppd_names_async_dbus_scb (GObject *source_object, g_autoptr(GVariant) output = NULL; PPDName *ppd_item; PPDName **result = NULL; - GPNData *data = (GPNData *) user_data; + GPNData *data = user_data; g_autoptr(GError) error = NULL; GList *driver_list = NULL; GList *iter; @@ -1935,9 +1988,7 @@ get_ppd_names_async_dbus_scb (GObject *source_object, g_cancellable_is_cancelled (data->cancellable), data->user_data); - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data); + gpn_data_free (data); } } @@ -1988,9 +2039,7 @@ out: g_cancellable_is_cancelled (data->cancellable), data->user_data); - g_clear_object (&data->cancellable); - g_free (data->printer_name); - g_free (data); + gpn_data_free (data); } /* @@ -2054,7 +2103,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; - GDAData *data = (GDAData *) user_data; + GDAData *data = user_data; g_autoptr(GError) error = NULL; GList *tmp; gchar *device_id = NULL; @@ -2181,7 +2230,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, DBUS_TIMEOUT, data->cancellable, get_device_attributes_async_dbus_cb, - user_data); + data); if (include_scheme_builder) g_variant_builder_unref (include_scheme_builder); @@ -2204,10 +2253,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, data->device_uri, data->user_data); - g_clear_object (&data->cancellable); - g_free (data->device_uri); - g_free (data->printer_name); - g_free (data); + gda_data_free (data); } static void @@ -2217,7 +2263,7 @@ get_device_attributes_async_scb (GHashTable *result, g_autoptr(GDBusConnection) bus = NULL; GVariantBuilder include_scheme_builder; IPPAttribute *attr; - GDAData *data = (GDAData *) user_data; + GDAData *data = user_data; g_autoptr(GError) error = NULL; GList *tmp; @@ -2274,10 +2320,7 @@ get_device_attributes_async_scb (GHashTable *result, out: data->callback (NULL, NULL, NULL, data->user_data); - g_clear_object (&data->cancellable); - g_free (data->device_uri); - g_free (data->printer_name); - g_free (data); + gda_data_free (data); } /* @@ -2289,7 +2332,6 @@ get_device_attributes_async (const gchar *printer_name, GDACallback callback, gpointer user_data) { - GDAData *data; gchar **attributes; if (!printer_name) @@ -2298,20 +2340,13 @@ get_device_attributes_async (const gchar *printer_name, return; } - data = g_new0 (GDAData, 1); - data->printer_name = g_strdup (printer_name); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - attributes = g_new0 (gchar *, 2); attributes[0] = g_strdup ("device-uri"); get_ipp_attributes_async (printer_name, attributes, get_device_attributes_async_scb, - data); + gda_data_new (printer_name, cancellable, callback, user_data)); g_strfreev (attributes); } @@ -2326,29 +2361,19 @@ get_ppd_names_async (gchar *printer_name, GPNCallback callback, gpointer user_data) { - GPNData *data; - if (!printer_name) { callback (NULL, NULL, TRUE, user_data); return; } - data = g_new0 (GPNData, 1); - data->printer_name = g_strdup (printer_name); - data->count = count; - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - /* * We have to find out device-id for this printer at first. */ get_device_attributes_async (printer_name, cancellable, get_device_attributes_cb, - data); + gpn_data_new (printer_name, count, cancellable, callback, user_data)); } typedef struct @@ -2360,6 +2385,30 @@ typedef struct GMainContext *context; } GAPData; +static GAPData * +gap_data_new (GCancellable *cancellable, GAPCallback callback, gpointer user_data) +{ + GAPData *data; + + data = g_new0 (GAPData, 1); + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + data->context = g_main_context_ref_thread_default (); + + return data; +} + +static void +gap_data_free (GAPData *data) +{ + g_clear_object (&data->cancellable); + if (data->context) + g_main_context_unref (data->context); + g_free (data); +} + static gboolean get_all_ppds_idle_cb (gpointer user_data) { @@ -2380,28 +2429,17 @@ get_all_ppds_idle_cb (gpointer user_data) return FALSE; } -static void -get_all_ppds_data_free (gpointer user_data) -{ - GAPData *data = (GAPData *) user_data; - - if (data->context) - g_main_context_unref (data->context); - g_clear_object (&data->cancellable); - g_free (data); -} - static void get_all_ppds_cb (gpointer user_data) { - GAPData *data = (GAPData *) user_data; + GAPData *data = user_data; GSource *idle_source; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, get_all_ppds_idle_cb, data, - get_all_ppds_data_free); + (GDestroyNotify) gap_data_free); g_source_attach (idle_source, data->context); g_source_unref (idle_source); } @@ -2488,7 +2526,7 @@ get_all_ppds_func (gpointer user_data) ipp_attribute_t *attr; GHashTable *ppds_hash = NULL; GHashTable *manufacturers_hash = NULL; - GAPData *data = (GAPData *) user_data; + GAPData *data = user_data; PPDName *item; ipp_t *request; ipp_t *response; @@ -2713,12 +2751,7 @@ get_all_ppds_async (GCancellable *cancellable, g_autoptr(GThread) thread = NULL; g_autoptr(GError) error = NULL; - data = g_new0 (GAPData, 1); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - data->context = g_main_context_ref_thread_default (); + data = gap_data_new (cancellable, callback, user_data); thread = g_thread_try_new ("get-all-ppds", get_all_ppds_func, @@ -2730,7 +2763,7 @@ get_all_ppds_async (GCancellable *cancellable, g_warning ("%s", error->message); callback (NULL, user_data); - get_all_ppds_data_free (data); + gap_data_free (data); } } @@ -2837,40 +2870,54 @@ typedef struct GMainContext *context; } PGPData; -static gboolean -printer_get_ppd_idle_cb (gpointer user_data) +static PGPData * +pgp_data_new (const gchar *printer_name, const gchar *host_name, gint port, PGPCallback callback, gpointer user_data) { - PGPData *data = (PGPData *) user_data; + PGPData *data; - data->callback (data->result, data->user_data); + data = g_new0 (PGPData, 1); + data->printer_name = g_strdup (printer_name); + data->host_name = g_strdup (host_name); + data->port = port; + data->callback = callback; + data->user_data = user_data; + data->context = g_main_context_ref_thread_default (); - return FALSE; + return data; } static void -printer_get_ppd_data_free (gpointer user_data) +pgp_data_free (PGPData *data) { - PGPData *data = (PGPData *) user_data; - - if (data->context) - g_main_context_unref (data->context); - g_free (data->result); g_free (data->printer_name); g_free (data->host_name); + g_free (data->result); + if (data->context) + g_main_context_unref (data->context); g_free (data); } +static gboolean +printer_get_ppd_idle_cb (gpointer user_data) +{ + PGPData *data = user_data; + + data->callback (data->result, data->user_data); + + return FALSE; +} + static void printer_get_ppd_cb (gpointer user_data) { - PGPData *data = (PGPData *) user_data; + PGPData *data = user_data; GSource *idle_source; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, printer_get_ppd_idle_cb, data, - printer_get_ppd_data_free); + (GDestroyNotify) pgp_data_free); g_source_attach (idle_source, data->context); g_source_unref (idle_source); } @@ -2878,7 +2925,7 @@ printer_get_ppd_cb (gpointer user_data) static gpointer printer_get_ppd_func (gpointer user_data) { - PGPData *data = (PGPData *) user_data; + PGPData *data = user_data; if (data->host_name) { @@ -2917,13 +2964,7 @@ printer_get_ppd_async (const gchar *printer_name, g_autoptr(GThread) thread = NULL; g_autoptr(GError) error = NULL; - data = g_new0 (PGPData, 1); - data->printer_name = g_strdup (printer_name); - data->host_name = g_strdup (host_name); - data->port = port; - data->callback = callback; - data->user_data = user_data; - data->context = g_main_context_ref_thread_default (); + data = pgp_data_new (printer_name, host_name, port, callback, user_data); thread = g_thread_try_new ("printer-get-ppd", printer_get_ppd_func, @@ -2935,7 +2976,7 @@ printer_get_ppd_async (const gchar *printer_name, g_warning ("%s", error->message); callback (NULL, user_data); - printer_get_ppd_data_free (data); + pgp_data_free (data); } } @@ -2948,38 +2989,50 @@ typedef struct GMainContext *context; } GNDData; -static gboolean -get_named_dest_idle_cb (gpointer user_data) +static GNDData * +gnd_data_new (const gchar *printer_name, GNDCallback callback, gpointer user_data) { - GNDData *data = (GNDData *) user_data; + GNDData *data; - data->callback (data->result, data->user_data); + data = g_new0 (GNDData, 1); + data->printer_name = g_strdup (printer_name); + data->callback = callback; + data->user_data = user_data; + data->context = g_main_context_ref_thread_default (); - return FALSE; + return data; } static void -get_named_dest_data_free (gpointer user_data) +gnd_data_free (GNDData *data) { - GNDData *data = (GNDData *) user_data; - + g_free (data->printer_name); if (data->context) g_main_context_unref (data->context); - g_free (data->printer_name); g_free (data); } +static gboolean +get_named_dest_idle_cb (gpointer user_data) +{ + GNDData *data = user_data; + + data->callback (data->result, data->user_data); + + return FALSE; +} + static void get_named_dest_cb (gpointer user_data) { - GNDData *data = (GNDData *) user_data; + GNDData *data = user_data; GSource *idle_source; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, get_named_dest_idle_cb, data, - get_named_dest_data_free); + (GDestroyNotify) gnd_data_free); g_source_attach (idle_source, data->context); g_source_unref (idle_source); } @@ -2987,7 +3040,7 @@ get_named_dest_cb (gpointer user_data) static gpointer get_named_dest_func (gpointer user_data) { - GNDData *data = (GNDData *) user_data; + GNDData *data = user_data; data->result = cupsGetNamedDest (CUPS_HTTP_DEFAULT, data->printer_name, NULL); @@ -3005,11 +3058,7 @@ get_named_dest_async (const gchar *printer_name, g_autoptr(GThread) thread = NULL; g_autoptr(GError) error = NULL; - data = g_new0 (GNDData, 1); - data->printer_name = g_strdup (printer_name); - data->callback = callback; - data->user_data = user_data; - data->context = g_main_context_ref_thread_default (); + data = gnd_data_new (printer_name, callback, user_data); thread = g_thread_try_new ("get-named-dest", get_named_dest_func, @@ -3021,7 +3070,7 @@ get_named_dest_async (const gchar *printer_name, g_warning ("%s", error->message); callback (NULL, user_data); - get_named_dest_data_free (data); + gnd_data_free (data); } } @@ -3032,6 +3081,26 @@ typedef struct gpointer user_data; } PAOData; +static PAOData * +pao_data_new (GCancellable *cancellable, PAOCallback callback, gpointer user_data) +{ + PAOData *data; + + data = g_new0 (PAOData, 1); + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + return data; +} + +static void +pao_data_free (PAOData *data) +{ + g_clear_object (&data->cancellable); + g_free (data); +} + static void printer_add_option_async_dbus_cb (GObject *source_object, GAsyncResult *res, @@ -3039,7 +3108,7 @@ printer_add_option_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; gboolean success = FALSE; - PAOData *data = (PAOData *) user_data; + PAOData *data = user_data; g_autoptr(GError) error = NULL; output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), @@ -3065,8 +3134,7 @@ printer_add_option_async_dbus_cb (GObject *source_object, if (!g_cancellable_is_cancelled (data->cancellable)) data->callback (success, data->user_data); - g_clear_object (&data->cancellable); - g_free (data); + pao_data_free (data); } void @@ -3080,7 +3148,6 @@ printer_add_option_async (const gchar *printer_name, { GVariantBuilder array_builder; g_autoptr(GDBusConnection) bus = NULL; - PAOData *data; g_autoptr(GError) error = NULL; gint i; @@ -3099,12 +3166,6 @@ printer_add_option_async (const gchar *printer_name, g_variant_builder_add (&array_builder, "s", values[i]); } - data = g_new0 (PAOData, 1); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - g_dbus_connection_call (bus, MECHANISM_BUS, "/", @@ -3120,7 +3181,7 @@ printer_add_option_async (const gchar *printer_name, DBUS_TIMEOUT, cancellable, printer_add_option_async_dbus_cb, - data); + pao_data_new (cancellable, callback, user_data)); } typedef struct @@ -3131,6 +3192,29 @@ typedef struct GList *backend_list; } GCDData; +static GCDData * +gcd_data_new (GList *backend_list, GCancellable *cancellable, GCDCallback callback, gpointer user_data) +{ + GCDData *data; + + data = g_new0 (GCDData, 1); + data->backend_list = backend_list; + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + + return data; +} + +static void +gcd_data_free (GCDData *data) +{ + g_list_free_full (data->backend_list, g_free); + g_clear_object (&data->cancellable); + g_free (data); +} + static gint get_suffix_index (const gchar *string) { @@ -3158,7 +3242,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, { g_autoptr(GPtrArray) devices = NULL; g_autoptr(GVariant) output = NULL; - GCDData *data = (GCDData *) user_data; + GCDData *data = user_data; g_autoptr(GError) error = NULL; gint num_of_devices = 0; @@ -3246,10 +3330,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, g_cancellable_is_cancelled (data->cancellable), data->user_data); - g_list_free_full (data->backend_list, g_free); - data->backend_list = NULL; - g_clear_object (&data->cancellable); - g_free (data); + gcd_data_free (data); return; } @@ -3296,7 +3377,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, DBUS_TIMEOUT, data->cancellable, get_cups_devices_async_dbus_cb, - user_data); + data); if (include_scheme_builder) g_variant_builder_unref (include_scheme_builder); @@ -3325,8 +3406,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, data->user_data); } - g_clear_object (&data->cancellable); - g_free (data); + gcd_data_free (data); } void @@ -3336,7 +3416,7 @@ get_cups_devices_async (GCancellable *cancellable, { g_autoptr(GDBusConnection) bus = NULL; GVariantBuilder include_scheme_builder; - GCDData *data; + GList *backend_list; g_autoptr(GError) error = NULL; g_autofree gchar *backend_name = NULL; @@ -3348,19 +3428,14 @@ get_cups_devices_async (GCancellable *cancellable, return; } - data = g_new0 (GCDData, 1); - if (cancellable) - data->cancellable = g_object_ref (cancellable); - data->callback = callback; - data->user_data = user_data; - data->backend_list = create_backends_list (); + backend_list = create_backends_list (); - backend_name = data->backend_list->data; + backend_name = backend_list->data; g_variant_builder_init (&include_scheme_builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&include_scheme_builder, "s", backend_name); - data->backend_list = g_list_remove_link (data->backend_list, data->backend_list); + backend_list = g_list_remove_link (backend_list, backend_list); g_dbus_connection_call (bus, MECHANISM_BUS, @@ -3377,7 +3452,7 @@ get_cups_devices_async (GCancellable *cancellable, DBUS_TIMEOUT, cancellable, get_cups_devices_async_dbus_cb, - data); + gcd_data_new (backend_list, cancellable, callback, user_data)); } gchar * -- cgit v1.2.1