From e8ab27defefda8531fbe36723b9e5748f4bbc5df Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 10 Dec 2012 13:42:11 -0500 Subject: [PATCH] Make ENamedParameters a fully boxed type Introspection doesn't handle well typedefs as a general rule, but typedefs for container types are particularly problematic. This ends up breaking the vala build, but the resulting .gir is also unusable by bindings. In this case, I think it's actually cleanest to make ENamedParameters a fully opaque type even to C. The parts of the Evolution code that were peeking inside ENamedParameters really wanted a helper function anyways to create a gchar **. Therefore, this is a net code cleanup. https://bugzilla.gnome.org/show_bug.cgi?id=689871 --- libebackend/e-user-prompter-server.c | 18 ++------- libebackend/e-user-prompter.c | 21 +++------- libedataserver/e-data-server-util.c | 78 +++++++++++++++++++++++++++++------- libedataserver/e-data-server-util.h | 5 ++- 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/libebackend/e-user-prompter-server.c b/libebackend/e-user-prompter-server.c index 3324e4e..2ee9ff8 100644 --- a/libebackend/e-user-prompter-server.c +++ b/libebackend/e-user-prompter-server.c @@ -470,25 +470,15 @@ e_user_prompter_server_response (EUserPrompterServer *server, if (remove_prompt (server, prompt_id, &is_extension_prompt)) { if (is_extension_prompt) { - GPtrArray *values = NULL; + gchar **values; - if (!extension_values || !extension_values->len || - extension_values->pdata[extension_values->len - 1] != NULL) { - gint ii; - - values = g_ptr_array_new (); - for (ii = 0; extension_values && ii < extension_values->len; ii++) { - g_ptr_array_add (values, extension_values->pdata[ii]); - } - g_ptr_array_add (values, NULL); - extension_values = values; - } + values = e_named_parameters_to_strv (extension_values); e_dbus_user_prompter_emit_extension_response (server->priv->dbus_prompter, prompt_id, response, - (const gchar * const *) extension_values->pdata); + (const gchar * const *) values); if (values) - g_ptr_array_free (values, TRUE); + g_strfreev (values); } else { e_dbus_user_prompter_emit_response (server->priv->dbus_prompter, prompt_id, response); } diff --git a/libebackend/e-user-prompter.c b/libebackend/e-user-prompter.c index 3e8e9b7..c1b32f5 100644 --- a/libebackend/e-user-prompter.c +++ b/libebackend/e-user-prompter.c @@ -198,31 +198,20 @@ user_prompter_extension_prompt_invoke (EDBusUserPrompter *dbus_prompter, GError **error) { gboolean success; - GPtrArray *params; - gint ii; + gchar **params; g_return_val_if_fail (dbus_prompter != NULL, FALSE); g_return_val_if_fail (async_data != NULL, FALSE); - - params = g_ptr_array_new (); - for (ii = 0; async_data->in_parameters && ii < async_data->in_parameters->len; ii++) { - gchar *param = async_data->in_parameters->pdata[ii]; - - if (param) - g_ptr_array_add (params, param); - } - - /* NULL-terminated array */ - g_ptr_array_add (params, NULL); - + + params = e_named_parameters_to_strv (async_data->in_parameters); success = e_dbus_user_prompter_call_extension_prompt_sync (dbus_prompter, async_data->dialog_name, - (const gchar *const *) params->pdata, + (const gchar *const *) params, &async_data->prompt_id, cancellable, error); - g_ptr_array_free (params, TRUE); + g_strfreev (params); return success; } diff --git a/libedataserver/e-data-server-util.c b/libedataserver/e-data-server-util.c index accccfe..cc19541 100644 --- a/libedataserver/e-data-server-util.c +++ b/libedataserver/e-data-server-util.c @@ -1723,7 +1723,7 @@ e_data_server_util_get_dbus_call_timeout (void) ENamedParameters * e_named_parameters_new (void) { - return g_ptr_array_new_with_free_func (g_free); + return (ENamedParameters*) g_ptr_array_new_with_free_func (g_free); } /** @@ -1752,7 +1752,7 @@ e_named_parameters_new_strv (const gchar * const *strv) parameters = e_named_parameters_new (); for (ii = 0; strv[ii]; ii++) { - g_ptr_array_add (parameters, g_strdup (strv[ii])); + g_ptr_array_add ((GPtrArray *) parameters, g_strdup (strv[ii])); } return parameters; @@ -1774,7 +1774,7 @@ e_named_parameters_free (ENamedParameters *parameters) if (!parameters) return; - g_ptr_array_free (parameters, TRUE); + g_ptr_array_unref ((GPtrArray *) parameters); } /** @@ -1788,10 +1788,13 @@ e_named_parameters_free (ENamedParameters *parameters) void e_named_parameters_clear (ENamedParameters *parameters) { + GPtrArray *array; g_return_if_fail (parameters != NULL); - if (parameters->len) - g_ptr_array_remove_range (parameters, 0, parameters->len); + array = (GPtrArray *) parameters; + + if (array->len) + g_ptr_array_remove_range (array, 0, array->len); } /** @@ -1814,9 +1817,10 @@ e_named_parameters_assign (ENamedParameters *parameters, if (from) { gint ii; + GPtrArray *from_array = (GPtrArray *) from; - for (ii = 0; ii < from->len; ii++) { - g_ptr_array_add (parameters, g_strdup (from->pdata[ii])); + for (ii = 0; ii < from_array->len; ii++) { + g_ptr_array_add ((GPtrArray *) parameters, g_strdup (from_array->pdata[ii])); } } } @@ -1825,6 +1829,7 @@ static gint get_parameter_index (const ENamedParameters *parameters, const gchar *name) { + GPtrArray *array; gint ii, name_len; g_return_val_if_fail (parameters != NULL, -1); @@ -1832,8 +1837,10 @@ get_parameter_index (const ENamedParameters *parameters, name_len = strlen (name); - for (ii = 0; ii < parameters->len; ii++) { - const gchar *name_and_value = g_ptr_array_index (parameters, ii); + array = (GPtrArray *) parameters; + + for (ii = 0; ii < array->len; ii++) { + const gchar *name_and_value = g_ptr_array_index (array, ii); if (name_and_value && g_ascii_strncasecmp (name_and_value, name, name_len) == 0 && name_and_value[name_len] == ':') @@ -1862,6 +1869,7 @@ e_named_parameters_set (ENamedParameters *parameters, const gchar *name, const gchar *value) { + GPtrArray *array; gint index; gchar *name_and_value; @@ -1870,19 +1878,21 @@ e_named_parameters_set (ENamedParameters *parameters, g_return_if_fail (strchr (name, ':') == NULL); g_return_if_fail (*name != '\0'); + array = (GPtrArray *) parameters; + index = get_parameter_index (parameters, name); if (!value) { if (index != -1) - g_ptr_array_remove_index (parameters, index); + g_ptr_array_remove_index (array, index); return; } name_and_value = g_strconcat (name, ":", value, NULL); if (index != -1) { - g_free (parameters->pdata[index]); - parameters->pdata[index] = name_and_value; + g_free (array->pdata[index]); + array->pdata[index] = name_and_value; } else { - g_ptr_array_add (parameters, name_and_value); + g_ptr_array_add (array, name_and_value); } } @@ -1912,7 +1922,7 @@ e_named_parameters_get (const ENamedParameters *parameters, if (index == -1) return NULL; - name_and_value = g_ptr_array_index (parameters, index); + name_and_value = g_ptr_array_index ((GPtrArray *) parameters, index); return name_and_value + strlen (name) + 1; } @@ -1954,3 +1964,43 @@ e_named_parameters_test (const ENamedParameters *parameters, return g_ascii_strcasecmp (stored_value, value) == 0; } + +/** + * e_named_parameters_to_strv: + * @parameters: an #ENamedParameters + * + * Returns: (transfer full): Contents of @parameters as a null-terminated strv + * + * Since: 3.8 + */ +gchar ** +e_named_parameters_to_strv (const ENamedParameters *parameters) +{ + GPtrArray *array = (GPtrArray *) parameters; + GPtrArray *ret = g_ptr_array_new (); + + if (array) { + guint i; + for (i = 0; i < array->len; i++) { + g_ptr_array_add (ret, g_strdup (array->pdata[i])); + } + } + + g_ptr_array_add (ret, NULL); + + return (gchar **) g_ptr_array_free (ret, FALSE); +} + +static ENamedParameters * +e_named_parameters_ref (ENamedParameters *params) +{ + return (ENamedParameters *) g_ptr_array_ref ((GPtrArray *) params); +} + +static void +e_named_parameters_unref (ENamedParameters *params) +{ + g_ptr_array_unref ((GPtrArray *) params); +} + +G_DEFINE_BOXED_TYPE (ENamedParameters, e_named_parameters, e_named_parameters_ref, e_named_parameters_unref); diff --git a/libedataserver/e-data-server-util.h b/libedataserver/e-data-server-util.h index 455bece..4e5c338 100644 --- a/libedataserver/e-data-server-util.h +++ b/libedataserver/e-data-server-util.h @@ -142,8 +142,10 @@ void e_data_server_util_set_dbus_call_timeout * * Since: 3.8 **/ -typedef GPtrArray ENamedParameters; +struct _ENamedParameters; +typedef struct _ENamedParameters ENamedParameters; +GType e_named_parameters_get_type (void) G_GNUC_CONST; ENamedParameters * e_named_parameters_new (void); ENamedParameters * @@ -157,6 +159,7 @@ void e_named_parameters_set (ENamedParameters *parameters, const gchar *value); const gchar * e_named_parameters_get (const ENamedParameters *parameters, const gchar *name); +gchar ** e_named_parameters_to_strv (const ENamedParameters *parameters); gboolean e_named_parameters_test (const ENamedParameters *parameters, const gchar *name, const gchar *value, -- 2.7.4