From 005b18f2f16924676fbecd77222386fbcb32abb8 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 14:30:58 +1300 Subject: [PATCH 1/9] 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 * -- GitLab From cede2f5a810a55bfd0e45a023abda4abf663d08d Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 14:42:49 +1300 Subject: [PATCH 2/9] printers: Use g_autoptr for utility functions --- panels/printers/pp-utils.c | 74 ++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 4ec4af325..5f95f8f32 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1219,7 +1219,7 @@ static void get_ipp_attributes_cb (gpointer user_data) { GIAData *data = user_data; - GSource *idle_source; + g_autoptr(GSource) idle_source = NULL; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, @@ -1227,7 +1227,6 @@ get_ipp_attributes_cb (gpointer user_data) data, (GDestroyNotify) gia_data_free); g_source_attach (idle_source, data->context); - g_source_unref (idle_source); } static void @@ -1440,6 +1439,8 @@ psp_data_free (PSPData *data) g_free (data); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (PSPData, psp_data_free) + static void printer_set_ppd_async_dbus_cb (GObject *source_object, GAsyncResult *res, @@ -1447,7 +1448,7 @@ printer_set_ppd_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; gboolean result = FALSE; - PSPData *data = user_data; + g_autoptr(PSPData) data = user_data; g_autoptr(GError) error = NULL; output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), @@ -1482,8 +1483,6 @@ printer_set_ppd_async_dbus_cb (GObject *source_object, g_unlink (data->ppd_copy); g_free (data->ppd_copy); } - - psp_data_free (data); } /* @@ -1544,7 +1543,7 @@ printer_set_ppd_file_async_scb (GObject *source_object, { g_autoptr(GDBusConnection) bus = NULL; gboolean success; - PSPData *data = user_data; + g_autoptr(PSPData) data = user_data; g_autoptr(GError) error = NULL; success = g_file_copy_finish (G_FILE (source_object), @@ -1581,13 +1580,12 @@ printer_set_ppd_file_async_scb (GObject *source_object, data->cancellable, printer_set_ppd_async_dbus_cb, data); + g_steal_pointer (&data); return; out: data->callback (data->printer_name, FALSE, data->user_data); - - psp_data_free (data); } /* @@ -1688,7 +1686,7 @@ static void get_ppds_attribute_cb (gpointer user_data) { GPAData *data = (GPAData *) user_data; - GSource *idle_source; + g_autoptr(GSource) idle_source = NULL; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, @@ -1696,7 +1694,6 @@ get_ppds_attribute_cb (gpointer user_data) data, (GDestroyNotify) gpa_data_free); g_source_attach (idle_source, data->context); - g_source_unref (idle_source); } static gpointer @@ -1808,6 +1805,8 @@ gda_data_free (GDAData *data) g_free (data); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GDAData, gda_data_free) + typedef struct { gchar *printer_name; @@ -1842,11 +1841,13 @@ gpn_data_free (GPNData *data) g_free (data); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GPNData, gpn_data_free) + static void get_ppd_names_async_cb (gchar **attribute_values, gpointer user_data) { - GPNData *data = user_data; + g_autoptr(GPNData) data = user_data; gint i; if (g_cancellable_is_cancelled (data->cancellable)) @@ -1878,8 +1879,6 @@ out: data->printer_name, g_cancellable_is_cancelled (data->cancellable), data->user_data); - - gpn_data_free (data); } static void @@ -1890,7 +1889,7 @@ get_ppd_names_async_dbus_scb (GObject *source_object, g_autoptr(GVariant) output = NULL; PPDName *ppd_item; PPDName **result = NULL; - GPNData *data = user_data; + g_autoptr(GPNData) data = user_data; g_autoptr(GError) error = NULL; GList *driver_list = NULL; GList *iter; @@ -1978,6 +1977,7 @@ get_ppd_names_async_dbus_scb (GObject *source_object, "NickName", get_ppd_names_async_cb, data); + g_steal_pointer (&data); g_strfreev (ppds_names); } @@ -1987,8 +1987,6 @@ get_ppd_names_async_dbus_scb (GObject *source_object, data->printer_name, g_cancellable_is_cancelled (data->cancellable), data->user_data); - - gpn_data_free (data); } } @@ -2000,7 +1998,7 @@ get_device_attributes_cb (gchar *device_id, { g_autoptr(GDBusConnection) bus = NULL; g_autoptr(GError) error = NULL; - GPNData *data = (GPNData *) user_data; + g_autoptr(GPNData) data = user_data; if (g_cancellable_is_cancelled (data->cancellable)) goto out; @@ -2030,6 +2028,7 @@ get_device_attributes_cb (gchar *device_id, data->cancellable, get_ppd_names_async_dbus_scb, data); + g_steal_pointer (&data); return; @@ -2038,8 +2037,6 @@ out: data->printer_name, g_cancellable_is_cancelled (data->cancellable), data->user_data); - - gpn_data_free (data); } /* @@ -2103,7 +2100,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; - GDAData *data = user_data; + g_autoptr(GDAData) data = user_data; g_autoptr(GError) error = NULL; GList *tmp; gchar *device_id = NULL; @@ -2231,6 +2228,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, data->cancellable, get_device_attributes_async_dbus_cb, data); + g_steal_pointer (&data); if (include_scheme_builder) g_variant_builder_unref (include_scheme_builder); @@ -2252,8 +2250,6 @@ get_device_attributes_async_dbus_cb (GObject *source_object, device_make_and_model, data->device_uri, data->user_data); - - gda_data_free (data); } static void @@ -2263,7 +2259,7 @@ get_device_attributes_async_scb (GHashTable *result, g_autoptr(GDBusConnection) bus = NULL; GVariantBuilder include_scheme_builder; IPPAttribute *attr; - GDAData *data = user_data; + g_autoptr(GDAData) data = user_data; g_autoptr(GError) error = NULL; GList *tmp; @@ -2314,13 +2310,12 @@ get_device_attributes_async_scb (GHashTable *result, data->cancellable, get_device_attributes_async_dbus_cb, data); + g_steal_pointer (&data); return; out: data->callback (NULL, NULL, NULL, data->user_data); - - gda_data_free (data); } /* @@ -2332,7 +2327,7 @@ get_device_attributes_async (const gchar *printer_name, GDACallback callback, gpointer user_data) { - gchar **attributes; + g_auto(GStrv) attributes = NULL; if (!printer_name) { @@ -2347,8 +2342,6 @@ get_device_attributes_async (const gchar *printer_name, attributes, get_device_attributes_async_scb, gda_data_new (printer_name, cancellable, callback, user_data)); - - g_strfreev (attributes); } /* @@ -2433,7 +2426,7 @@ static void get_all_ppds_cb (gpointer user_data) { GAPData *data = user_data; - GSource *idle_source; + g_autoptr(GSource) idle_source = NULL; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, @@ -2441,7 +2434,6 @@ get_all_ppds_cb (gpointer user_data) data, (GDestroyNotify) gap_data_free); g_source_attach (idle_source, data->context); - g_source_unref (idle_source); } static const struct { @@ -2911,7 +2903,7 @@ static void printer_get_ppd_cb (gpointer user_data) { PGPData *data = user_data; - GSource *idle_source; + g_autoptr(GSource) idle_source = NULL; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, @@ -2919,7 +2911,6 @@ printer_get_ppd_cb (gpointer user_data) data, (GDestroyNotify) pgp_data_free); g_source_attach (idle_source, data->context); - g_source_unref (idle_source); } static gpointer @@ -3026,7 +3017,7 @@ static void get_named_dest_cb (gpointer user_data) { GNDData *data = user_data; - GSource *idle_source; + g_autoptr(GSource) idle_source = NULL; idle_source = g_idle_source_new (); g_source_set_callback (idle_source, @@ -3034,7 +3025,6 @@ get_named_dest_cb (gpointer user_data) data, (GDestroyNotify) gnd_data_free); g_source_attach (idle_source, data->context); - g_source_unref (idle_source); } static gpointer @@ -3101,6 +3091,8 @@ pao_data_free (PAOData *data) g_free (data); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (PAOData, pao_data_free) + static void printer_add_option_async_dbus_cb (GObject *source_object, GAsyncResult *res, @@ -3108,7 +3100,7 @@ printer_add_option_async_dbus_cb (GObject *source_object, { g_autoptr(GVariant) output = NULL; gboolean success = FALSE; - PAOData *data = user_data; + g_autoptr(PAOData) data = user_data; g_autoptr(GError) error = NULL; output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), @@ -3133,8 +3125,6 @@ printer_add_option_async_dbus_cb (GObject *source_object, if (!g_cancellable_is_cancelled (data->cancellable)) data->callback (success, data->user_data); - - pao_data_free (data); } void @@ -3215,6 +3205,8 @@ gcd_data_free (GCDData *data) g_free (data); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GCDData, gcd_data_free) + static gint get_suffix_index (const gchar *string) { @@ -3242,7 +3234,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, { g_autoptr(GPtrArray) devices = NULL; g_autoptr(GVariant) output = NULL; - GCDData *data = user_data; + g_autoptr(GCDData) data = user_data; g_autoptr(GError) error = NULL; gint num_of_devices = 0; @@ -3329,9 +3321,6 @@ get_cups_devices_async_dbus_cb (GObject *source_object, TRUE, g_cancellable_is_cancelled (data->cancellable), data->user_data); - - gcd_data_free (data); - return; } @@ -3378,6 +3367,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, data->cancellable, get_cups_devices_async_dbus_cb, data); + g_steal_pointer (&data); if (include_scheme_builder) g_variant_builder_unref (include_scheme_builder); @@ -3405,8 +3395,6 @@ get_cups_devices_async_dbus_cb (GObject *source_object, g_cancellable_is_cancelled (data->cancellable), data->user_data); } - - gcd_data_free (data); } void -- GitLab From 0d913f7283236086e041d87e244d5f803f3d8bde Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 14:45:23 +1300 Subject: [PATCH 3/9] printers: Remove use of goto --- panels/printers/pp-utils.c | 89 +++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 5f95f8f32..aed1bb89d 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1502,14 +1502,16 @@ printer_set_ppd_async (const gchar *printer_name, if (printer_name == NULL || printer_name[0] == '\0') { - goto out; + callback (printer_name, FALSE, user_data); + return; } bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (!bus) { g_warning ("Failed to get system bus: %s", error->message); - goto out; + callback (printer_name, FALSE, user_data); + return; } g_dbus_connection_call (bus, @@ -1529,11 +1531,6 @@ printer_set_ppd_async (const gchar *printer_name, cancellable, printer_set_ppd_async_dbus_cb, psp_data_new (printer_name, NULL, cancellable, callback, user_data)); - - return; - -out: - callback (printer_name, FALSE, user_data); } static void @@ -1553,14 +1550,16 @@ printer_set_ppd_file_async_scb (GObject *source_object, if (!success) { g_warning ("%s", error->message); - goto out; + data->callback (data->printer_name, FALSE, data->user_data); + return; } bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (!bus) { g_warning ("Failed to get system bus: %s", error->message); - goto out; + data->callback (data->printer_name, FALSE, data->user_data); + return; } g_dbus_connection_call (bus, @@ -1581,11 +1580,6 @@ printer_set_ppd_file_async_scb (GObject *source_object, printer_set_ppd_async_dbus_cb, data); g_steal_pointer (&data); - - return; - -out: - data->callback (data->printer_name, FALSE, data->user_data); } /* @@ -1606,7 +1600,8 @@ printer_set_ppd_file_async (const gchar *printer_name, if (printer_name == NULL || printer_name[0] == '\0') { - goto out; + callback (printer_name, FALSE, user_data); + return; } /* @@ -1625,15 +1620,8 @@ printer_set_ppd_file_async (const gchar *printer_name, NULL, printer_set_ppd_file_async_scb, psp_data_new (printer_name, g_file_get_path (destination_ppd_file), cancellable, callback, user_data)); - - return; - -out: - callback (printer_name, FALSE, user_data); } - - typedef void (*GPACallback) (gchar **attribute_values, gpointer user_data); @@ -1863,7 +1851,11 @@ get_ppd_names_async_cb (gchar **attribute_values, g_free (data->result); data->result = NULL; - goto out; + data->callback (NULL, + data->printer_name, + TRUE, + data->user_data); + return; } if (attribute_values) @@ -1874,10 +1866,9 @@ get_ppd_names_async_cb (gchar **attribute_values, g_free (attribute_values); } -out: data->callback (data->result, data->printer_name, - g_cancellable_is_cancelled (data->cancellable), + FALSE, data->user_data); } @@ -2001,16 +1992,32 @@ get_device_attributes_cb (gchar *device_id, g_autoptr(GPNData) data = user_data; if (g_cancellable_is_cancelled (data->cancellable)) - goto out; + { + data->callback (NULL, + data->printer_name, + TRUE, + data->user_data); + return; + } if (!device_id || !device_make_and_model || !device_uri) - goto out; + { + data->callback (NULL, + data->printer_name, + FALSE, + data->user_data); + return; + } bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); if (!bus) { g_warning ("Failed to get system bus: %s", error->message); - goto out; + data->callback (NULL, + data->printer_name, + FALSE, + data->user_data); + return; } g_dbus_connection_call (bus, @@ -2029,14 +2036,6 @@ get_device_attributes_cb (gchar *device_id, get_ppd_names_async_dbus_scb, data); g_steal_pointer (&data); - - return; - -out: - data->callback (NULL, - data->printer_name, - g_cancellable_is_cancelled (data->cancellable), - data->user_data); } /* @@ -2273,16 +2272,23 @@ get_device_attributes_async_scb (GHashTable *result, } if (g_cancellable_is_cancelled (data->cancellable)) - goto out; + { + data->callback (NULL, NULL, NULL, data->user_data); + return; + } if (!data->device_uri) - goto out; + { + data->callback (NULL, NULL, NULL, data->user_data); + return; + } bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (!bus) { g_warning ("Failed to get system bus: %s", error->message); - goto out; + data->callback (NULL, NULL, NULL, data->user_data); + return; } data->backend_list = create_backends_list (); @@ -2311,11 +2317,6 @@ get_device_attributes_async_scb (GHashTable *result, get_device_attributes_async_dbus_cb, data); g_steal_pointer (&data); - - return; - -out: - data->callback (NULL, NULL, NULL, data->user_data); } /* -- GitLab From d970ae48b47357ecca74dd28917e702a8234b461 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:01:43 +1300 Subject: [PATCH 4/9] printers: Don't pass ownership in get_ppd_names_async callback --- panels/printers/pp-details-dialog.c | 20 ----------------- panels/printers/pp-utils.c | 33 +++++++++++++---------------- 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/panels/printers/pp-details-dialog.c b/panels/printers/pp-details-dialog.c index 28b047234..4e5039f47 100644 --- a/panels/printers/pp-details-dialog.c +++ b/panels/printers/pp-details-dialog.c @@ -75,25 +75,6 @@ printer_name_changed (PpDetailsDialog *self) gtk_label_set_label (self->dialog_title, title); } -static void -ppd_names_free (gpointer user_data) -{ - PPDName **names = (PPDName **) user_data; - gint i; - - if (names) - { - for (i = 0; names[i]; i++) - { - g_free (names[i]->ppd_name); - g_free (names[i]->ppd_display_name); - g_free (names[i]); - } - - g_free (names); - } -} - static void set_ppd_cb (const gchar *printer_name, gboolean success, gpointer user_data); static void @@ -114,7 +95,6 @@ get_ppd_names_cb (PPDName **names, self->cancellable, set_ppd_cb, self); - ppd_names_free (names); } else { diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index aed1bb89d..39e31d847 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1627,8 +1627,8 @@ typedef void (*GPACallback) (gchar **attribute_values, typedef struct { - gchar *attribute_name; gchar **ppds_names; + gchar *attribute_name; gchar **result; GPACallback callback; gpointer user_data; @@ -1655,6 +1655,8 @@ gpa_data_free (GPAData *data) { g_free (data->attribute_name); g_strfreev (data->ppds_names); + if (data->result != NULL) + g_strfreev (data->result); if (data->context) g_main_context_unref (data->context); g_free (data); @@ -1825,6 +1827,16 @@ static void gpn_data_free (GPNData *data) { g_free (data->printer_name); + if (data->result != NULL) + { + for (int i = 0; data->result[i]; i++) + { + g_free (data->result[i]->ppd_name); + g_free (data->result[i]->ppd_display_name); + g_free (data->result[i]); + } + g_free (data->result); + } g_clear_object (&data->cancellable); g_free (data); } @@ -1840,17 +1852,6 @@ get_ppd_names_async_cb (gchar **attribute_values, if (g_cancellable_is_cancelled (data->cancellable)) { - g_strfreev (attribute_values); - - for (i = 0; data->result[i]; i++) - { - g_free (data->result[i]->ppd_name); - g_free (data->result[i]); - } - - g_free (data->result); - data->result = NULL; - data->callback (NULL, data->printer_name, TRUE, @@ -1861,9 +1862,7 @@ get_ppd_names_async_cb (gchar **attribute_values, if (attribute_values) { for (i = 0; attribute_values[i]; i++) - data->result[i]->ppd_display_name = attribute_values[i]; - - g_free (attribute_values); + data->result[i]->ppd_display_name = g_strdup (attribute_values[i]); } data->callback (data->result, @@ -1956,7 +1955,7 @@ get_ppd_names_async_dbus_scb (GObject *source_object, if (result) { - gchar **ppds_names; + g_auto(GStrv) ppds_names = NULL; data->result = result; @@ -1969,8 +1968,6 @@ get_ppd_names_async_dbus_scb (GObject *source_object, get_ppd_names_async_cb, data); g_steal_pointer (&data); - - g_strfreev (ppds_names); } else { -- GitLab From 98fd38278a79121692f885090a36ab882cdfb086 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:04:52 +1300 Subject: [PATCH 5/9] printers: Don't pass ownership in get_ipp_attributes_async callback --- panels/printers/pp-ipp-option-widget.c | 2 +- panels/printers/pp-options-dialog.c | 2 +- panels/printers/pp-utils.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/panels/printers/pp-ipp-option-widget.c b/panels/printers/pp-ipp-option-widget.c index 00d56df39..ec2c92a82 100644 --- a/panels/printers/pp-ipp-option-widget.c +++ b/panels/printers/pp-ipp-option-widget.c @@ -539,7 +539,7 @@ get_ipp_attributes_cb (GHashTable *table, if (self->ipp_attribute) g_hash_table_unref (self->ipp_attribute); - self->ipp_attribute = table; + self->ipp_attribute = g_hash_table_ref (table); update_widget_real (self); } diff --git a/panels/printers/pp-options-dialog.c b/panels/printers/pp-options-dialog.c index d1164bd13..59229cd48 100644 --- a/panels/printers/pp-options-dialog.c +++ b/panels/printers/pp-options-dialog.c @@ -727,7 +727,7 @@ get_ipp_attributes_cb (GHashTable *table, if (self->ipp_attributes) g_hash_table_unref (self->ipp_attributes); - self->ipp_attributes = table; + self->ipp_attributes = g_hash_table_ref (table); self->ipp_attributes_set = TRUE; if (self->ppd_filename_set && diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 39e31d847..a911503b2 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1200,6 +1200,8 @@ gia_data_free (GIAData *data) g_free (data->printer_name); if (data->attributes_names) g_strfreev (data->attributes_names); + if (data->result) + g_hash_table_unref (data->result); if (data->context) g_main_context_unref (data->context); g_free (data); -- GitLab From 5b086c44e8e85d5e3d43dbec56fee8c07e37ea55 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:13:21 +1300 Subject: [PATCH 6/9] printers: Don't pass ownership in get_all_ppds_async callback --- panels/printers/cc-printers-panel.c | 2 +- panels/printers/pp-details-dialog.c | 2 +- panels/printers/pp-utils.c | 17 +++++------------ 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c index 9d8505a1c..4c7d3f779 100644 --- a/panels/printers/cc-printers-panel.c +++ b/panels/printers/cc-printers-panel.c @@ -1089,7 +1089,7 @@ get_all_ppds_async_cb (PPDList *ppds, { CcPrintersPanel *self = (CcPrintersPanel*) user_data; - self->all_ppds_list = ppds; + self->all_ppds_list = ppd_list_copy (ppds); if (self->pp_new_printer_dialog) pp_new_printer_dialog_set_ppd_list (self->pp_new_printer_dialog, diff --git a/panels/printers/pp-details-dialog.c b/panels/printers/pp-details-dialog.c index 4e5039f47..d6b13c8f3 100644 --- a/panels/printers/pp-details-dialog.c +++ b/panels/printers/pp-details-dialog.c @@ -164,7 +164,7 @@ get_all_ppds_async_cb (PPDList *ppds, { PpDetailsDialog *self = user_data; - self->all_ppds_list = ppds; + self->all_ppds_list = ppd_list_copy (ppds); if (self->pp_ppd_selection_dialog) pp_ppd_selection_dialog_set_ppd_list (self->pp_ppd_selection_dialog, diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index a911503b2..79ee4f0e7 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -2396,6 +2396,8 @@ gap_data_new (GCancellable *cancellable, GAPCallback callback, gpointer user_dat static void gap_data_free (GAPData *data) { + if (data->result != NULL) + ppd_list_free (data->result); g_clear_object (&data->cancellable); if (data->context) g_main_context_unref (data->context); @@ -2405,19 +2407,10 @@ gap_data_free (GAPData *data) static gboolean get_all_ppds_idle_cb (gpointer user_data) { - GAPData *data = (GAPData *) user_data; + GAPData *data = user_data; - /* Don't call callback if cancelled */ - if (data->cancellable && - g_cancellable_is_cancelled (data->cancellable)) - { - ppd_list_free (data->result); - data->result = NULL; - } - else - { - data->callback (data->result, data->user_data); - } + if (!g_cancellable_is_cancelled (data->cancellable)) + data->callback (data->result, data->user_data); return FALSE; } -- GitLab From 797c36dc0abdd4c120efc6b490c231ade22f7a66 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:19:02 +1300 Subject: [PATCH 7/9] printers: Improve memory management of backend list --- panels/printers/pp-utils.c | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 79ee4f0e7..9d4f7723b 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1767,8 +1767,8 @@ typedef struct { gchar *printer_name; gchar *device_uri; - GCancellable *cancellable; GList *backend_list; + GCancellable *cancellable; GDACallback callback; gpointer user_data; } GDAData; @@ -1793,6 +1793,7 @@ gda_data_free (GDAData *data) { g_free (data->printer_name); g_free (data->device_uri); + g_list_free_full(data->backend_list, g_free); g_clear_object (&data->cancellable); g_free (data); } @@ -2100,7 +2101,6 @@ get_device_attributes_async_dbus_cb (GObject *source_object, g_autoptr(GVariant) output = NULL; g_autoptr(GDAData) data = user_data; g_autoptr(GError) error = NULL; - GList *tmp; gchar *device_id = NULL; gchar *device_make_and_model = NULL; @@ -2206,9 +2206,7 @@ get_device_attributes_async_dbus_cb (GObject *source_object, exclude_scheme_builder = create_other_backends_array (); } - tmp = data->backend_list; - data->backend_list = g_list_remove_link (data->backend_list, tmp); - g_list_free_full (tmp, g_free); + data->backend_list = g_list_delete_link (data->backend_list, data->backend_list); g_dbus_connection_call (G_DBUS_CONNECTION (g_object_ref (source_object)), MECHANISM_BUS, @@ -2238,12 +2236,6 @@ get_device_attributes_async_dbus_cb (GObject *source_object, } } - if (data->backend_list) - { - g_list_free_full (data->backend_list, g_free); - data->backend_list = NULL; - } - data->callback (device_id, device_make_and_model, data->device_uri, @@ -2259,7 +2251,6 @@ get_device_attributes_async_scb (GHashTable *result, IPPAttribute *attr; g_autoptr(GDAData) data = user_data; g_autoptr(GError) error = NULL; - GList *tmp; if (result) { @@ -2295,9 +2286,7 @@ get_device_attributes_async_scb (GHashTable *result, g_variant_builder_init (&include_scheme_builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&include_scheme_builder, "s", data->backend_list->data); - tmp = data->backend_list; - data->backend_list = g_list_remove_link (data->backend_list, tmp); - g_list_free_full (tmp, g_free); + data->backend_list = g_list_delete_link (data->backend_list, data->backend_list); g_dbus_connection_call (g_object_ref (bus), MECHANISM_BUS, @@ -3169,10 +3158,10 @@ printer_add_option_async (const gchar *printer_name, typedef struct { + GList *backend_list; GCancellable *cancellable; GCDCallback callback; gpointer user_data; - GList *backend_list; } GCDData; static GCDData * @@ -3342,7 +3331,7 @@ get_cups_devices_async_dbus_cb (GObject *source_object, exclude_scheme_builder = create_other_backends_array (); } - data->backend_list = g_list_remove_link (data->backend_list, data->backend_list); + data->backend_list = g_list_delete_link (data->backend_list, data->backend_list); g_dbus_connection_call (G_DBUS_CONNECTION (g_object_ref (source_object)), MECHANISM_BUS, @@ -3376,9 +3365,6 @@ get_cups_devices_async_dbus_cb (GObject *source_object, TRUE, TRUE, data->user_data); - - g_list_free_full (data->backend_list, g_free); - data->backend_list = NULL; } } else @@ -3416,7 +3402,7 @@ get_cups_devices_async (GCancellable *cancellable, g_variant_builder_init (&include_scheme_builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&include_scheme_builder, "s", backend_name); - backend_list = g_list_remove_link (backend_list, backend_list); + backend_list = g_list_delete_link (backend_list, backend_list); g_dbus_connection_call (bus, MECHANISM_BUS, -- GitLab From 81392210f2ea100e1bdd0111d929769082fc8391 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:22:17 +1300 Subject: [PATCH 8/9] printers: Add note about callback that passed ownership --- panels/printers/pp-utils.h | 1 + 1 file changed, 1 insertion(+) diff --git a/panels/printers/pp-utils.h b/panels/printers/pp-utils.h index 34762ff33..f1d840ffc 100644 --- a/panels/printers/pp-utils.h +++ b/panels/printers/pp-utils.h @@ -218,6 +218,7 @@ void printer_get_ppd_async (const gchar *printer_name, PGPCallback callback, gpointer user_data); +/* NOTE: 'destination' is passed with ownership as cupsCopyDest doesn't seem to work as expected */ typedef void (*GNDCallback) (cups_dest_t *destination, gpointer user_data); -- GitLab From 2ee5f1422aed5b17b91280cc9ab065233be495d9 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 12 Feb 2021 15:25:20 +1300 Subject: [PATCH 9/9] printers: Ensure PPD copy is always deleted --- panels/printers/pp-utils.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/panels/printers/pp-utils.c b/panels/printers/pp-utils.c index 9d4f7723b..7a94745a0 100644 --- a/panels/printers/pp-utils.c +++ b/panels/printers/pp-utils.c @@ -1436,7 +1436,11 @@ static void psp_data_free (PSPData *data) { g_free (data->printer_name); - g_free (data->ppd_copy); + if (data->ppd_copy != NULL) + { + g_unlink (data->ppd_copy); + g_free (data->ppd_copy); + } g_clear_object (&data->cancellable); g_free (data); } @@ -1479,12 +1483,6 @@ printer_set_ppd_async_dbus_cb (GObject *source_object, data->callback (data->printer_name, result, data->user_data); - - if (data->ppd_copy) - { - g_unlink (data->ppd_copy); - g_free (data->ppd_copy); - } } /* -- GitLab