[evolution-data-server] Make ENamedParameters a fully boxed type
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Make ENamedParameters a fully boxed type
- Date: Mon, 10 Dec 2012 19:54:12 +0000 (UTC)
commit e8ab27defefda8531fbe36723b9e5748f4bbc5df
Author: Colin Walters <walters verbum org>
Date: Mon Dec 10 13:42:11 2012 -0500
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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]