[evolution-data-server] Make ENamedParameters a fully boxed type



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]