[evolution-data-server] Add CamelSettings.



commit a519522f9345304b47c54f574b0843a179329c41
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Jul 28 19:37:23 2011 -0500

    Add CamelSettings.
    
    CamelSettings is an abstract base class for holding settings values for
    various CamelService subclasses.  In general each CamelService subclass
    should define a custom CamelSettings subclass.  It's critical that all
    settings values have a corresponding GObject property.

 camel/Makefile.am                             |    2 +
 camel/camel-service.c                         |   99 +++++
 camel/camel-service.h                         |    6 +
 camel/camel-settings.c                        |  489 +++++++++++++++++++++++++
 camel/camel-settings.h                        |   86 +++++
 camel/camel.h                                 |    1 +
 configure.ac                                  |    2 +-
 docs/reference/camel/camel-docs.sgml          |    1 +
 docs/reference/camel/camel-sections.txt       |   24 ++
 docs/reference/camel/camel.types              |    1 +
 docs/reference/camel/tmpl/camel-service.sgml  |   23 ++
 docs/reference/camel/tmpl/camel-settings.sgml |   75 ++++
 12 files changed, 808 insertions(+), 1 deletions(-)
---
diff --git a/camel/Makefile.am b/camel/Makefile.am
index 0490cfe..c958ff3 100644
--- a/camel/Makefile.am
+++ b/camel/Makefile.am
@@ -83,6 +83,7 @@ libcamel_provider_1_2_la_SOURCES = 		\
 	camel-search-sql-sexp.c			\
 	camel-service.c				\
 	camel-session.c				\
+	camel-settings.c			\
 	camel-smime-context.c			\
 	camel-store-summary.c			\
 	camel-store.c				\
@@ -131,6 +132,7 @@ libcamel_providerinclude_HEADERS =		\
 	camel-search-sql-sexp.h			\
 	camel-service.h				\
 	camel-session.h				\
+	camel-settings.h			\
 	camel-smime-context.h			\
 	camel-store-summary.h			\
 	camel-store.h				\
diff --git a/camel/camel-service.c b/camel/camel-service.c
index b015a91..9609e97 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -54,6 +54,7 @@ typedef struct _AsyncContext AsyncContext;
 struct _CamelServicePrivate {
 	gpointer session;  /* weak pointer */
 
+	CamelSettings *settings;
 	CamelProvider *provider;
 	CamelURL *url;
 
@@ -75,6 +76,7 @@ enum {
 	PROP_0,
 	PROP_PROVIDER,
 	PROP_SESSION,
+	PROP_SETTINGS,
 	PROP_UID,
 	PROP_URL
 };
@@ -239,6 +241,12 @@ service_set_property (GObject *object,
 				g_value_get_object (value));
 			return;
 
+		case PROP_SETTINGS:
+			camel_service_set_settings (
+				CAMEL_SERVICE (object),
+				g_value_get_object (value));
+			return;
+
 		case PROP_UID:
 			service_set_uid (
 				CAMEL_SERVICE (object),
@@ -274,6 +282,12 @@ service_get_property (GObject *object,
 				CAMEL_SERVICE (object)));
 			return;
 
+		case PROP_SETTINGS:
+			g_value_set_object (
+				value, camel_service_get_settings (
+				CAMEL_SERVICE (object)));
+			return;
+
 		case PROP_UID:
 			g_value_set_string (
 				value, camel_service_get_uid (
@@ -303,6 +317,11 @@ service_dispose (GObject *object)
 		priv->session = NULL;
 	}
 
+	if (priv->settings != NULL) {
+		g_object_unref (priv->settings);
+		priv->settings = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (camel_service_parent_class)->dispose (object);
 }
@@ -549,6 +568,7 @@ camel_service_class_init (CamelServiceClass *class)
 	object_class->finalize = service_finalize;
 	object_class->constructed = service_constructed;
 
+	class->settings_type = CAMEL_TYPE_SETTINGS;
 	class->get_name = service_get_name;
 	class->cancel_connect = service_cancel_connect;
 	class->connect_sync = service_connect_sync;
@@ -583,6 +603,18 @@ camel_service_class_init (CamelServiceClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_SETTINGS,
+		g_param_spec_object (
+			"settings",
+			"Settings",
+			"A CamelSettings instance",
+			CAMEL_TYPE_SETTINGS,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT |
+			G_PARAM_STATIC_STRINGS));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_UID,
 		g_param_spec_string (
 			"uid",
@@ -741,6 +773,73 @@ camel_service_get_session (CamelService *service)
 }
 
 /**
+ * camel_service_get_settings:
+ * @service: a #CamelService
+ *
+ * Returns the #CamelSettings instance associated with the service.
+ *
+ * Returns: the #CamelSettings
+ *
+ * Since: 3.2
+ **/
+CamelSettings *
+camel_service_get_settings (CamelService *service)
+{
+	g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
+
+	/* Every service should have a settings object. */
+	g_warn_if_fail (service->priv->settings != NULL);
+
+	return service->priv->settings;
+}
+
+/**
+ * camel_service_set_settings:
+ * @service: a #CamelService
+ * @settings: an instance derviced from #CamelSettings, or %NULL
+ *
+ * Associates a new #CamelSettings instance with the service.
+ * The @settings instance must match the settings type defined in
+ * #CamelServiceClass.  If @settings is %NULL, a new #CamelSettings
+ * instance of the appropriate type is created with all properties
+ * set to defaults.
+ *
+ * Since: 3.2
+ **/
+void
+camel_service_set_settings (CamelService *service,
+                            CamelSettings *settings)
+{
+	CamelServiceClass *class;
+
+	g_return_if_fail (CAMEL_IS_SERVICE (service));
+
+	class = CAMEL_SERVICE_GET_CLASS (service);
+
+	if (settings != NULL) {
+		g_return_if_fail (
+			g_type_is_a (
+				G_OBJECT_TYPE (settings),
+				class->settings_type));
+		g_object_ref (settings);
+
+	} else {
+		g_return_if_fail (
+			g_type_is_a (
+				class->settings_type,
+				CAMEL_TYPE_SETTINGS));
+		settings = g_object_new (class->settings_type, NULL);
+	}
+
+	if (service->priv->settings != NULL)
+		g_object_unref (service->priv->settings);
+
+	service->priv->settings = settings;
+
+	g_object_notify (G_OBJECT (service), "settings");
+}
+
+/**
  * camel_service_get_uid:
  * @service: a #CamelService
  *
diff --git a/camel/camel-service.h b/camel/camel-service.h
index 1d8fd69..4599a81 100644
--- a/camel/camel-service.h
+++ b/camel/camel-service.h
@@ -34,6 +34,7 @@
 #include <camel/camel-url.h>
 #include <camel/camel-provider.h>
 #include <camel/camel-operation.h>
+#include <camel/camel-settings.h>
 
 /* Standard GObject macros */
 #define CAMEL_TYPE_SERVICE \
@@ -101,6 +102,8 @@ struct _CamelService {
 struct _CamelServiceClass {
 	CamelObjectClass parent_class;
 
+	GType settings_type;
+
 	/* Non-Blocking Methods */
 	gchar *		(*get_name)		(CamelService *service,
 						 gboolean brief);
@@ -148,6 +151,9 @@ gchar *		camel_service_get_name		(CamelService *service,
 CamelProvider *	camel_service_get_provider	(CamelService *service);
 struct _CamelSession *
 		camel_service_get_session	(CamelService *service);
+CamelSettings *	camel_service_get_settings	(CamelService *service);
+void		camel_service_set_settings	(CamelService *service,
+						 CamelSettings *settings);
 const gchar *	camel_service_get_uid		(CamelService *service);
 CamelURL *	camel_service_get_camel_url	(CamelService *service);
 gchar *		camel_service_get_url		(CamelService *service);
diff --git a/camel/camel-settings.c b/camel/camel-settings.c
new file mode 100644
index 0000000..4a57080
--- /dev/null
+++ b/camel/camel-settings.c
@@ -0,0 +1,489 @@
+/*
+ * camel-settings.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "camel-settings.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+G_DEFINE_TYPE (CamelSettings, camel_settings, G_TYPE_OBJECT)
+
+static GParamSpec **
+settings_list_settings (CamelSettingsClass *class,
+                        guint *n_settings)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+	return g_object_class_list_properties (object_class, n_settings);
+}
+
+static CamelSettings *
+settings_clone (CamelSettings *settings)
+{
+	CamelSettingsClass *class;
+	GParamSpec **properties;
+	GParameter *parameters;
+	CamelSettings *clone;
+	guint ii, n_properties;
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings);
+	properties = camel_settings_class_list_settings (class, &n_properties);
+
+	parameters = g_new0 (GParameter, n_properties);
+
+	for (ii = 0; ii < n_properties; ii++) {
+		parameters[ii].name = properties[ii]->name;
+		g_value_init (
+			&parameters[ii].value,
+			properties[ii]->value_type);
+		g_object_get_property (
+			G_OBJECT (settings),
+			parameters[ii].name,
+			&parameters[ii].value);
+	}
+
+	clone = g_object_newv (
+		G_OBJECT_TYPE (settings),
+		n_properties, parameters);
+
+	for (ii = 0; ii < n_properties; ii++)
+		g_value_unset (&parameters[ii].value);
+
+	g_free (parameters);
+	g_free (properties);
+
+	return clone;
+}
+
+static gboolean
+settings_equal (CamelSettings *settings_a,
+                CamelSettings *settings_b)
+{
+	CamelSettingsClass *class;
+	GParamSpec **properties;
+	GValue *value_a;
+	GValue *value_b;
+	guint ii, n_properties;
+	gboolean equal = TRUE;
+
+	/* Make sure both instances are of the same type. */
+	if (G_OBJECT_TYPE (settings_a) != G_OBJECT_TYPE (settings_b))
+		return FALSE;
+
+	value_a = g_slice_new0 (GValue);
+	value_b = g_slice_new0 (GValue);
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings_a);
+	properties = camel_settings_class_list_settings (class, &n_properties);
+
+	for (ii = 0; equal && ii < n_properties; ii++) {
+		GParamSpec *pspec = properties[ii];
+
+		g_value_init (value_a, pspec->value_type);
+		g_value_init (value_b, pspec->value_type);
+
+		g_object_get_property (
+			G_OBJECT (settings_a),
+			pspec->name, value_a);
+
+		g_object_get_property (
+			G_OBJECT (settings_b),
+			pspec->name, value_b);
+
+		equal = (g_param_values_cmp (pspec, value_a, value_b) == 0);
+
+		g_value_unset (value_a);
+		g_value_unset (value_b);
+	}
+
+	g_free (properties);
+
+	g_slice_free (GValue, value_a);
+	g_slice_free (GValue, value_b);
+
+	return equal;
+}
+
+static void
+camel_settings_class_init (CamelSettingsClass *class)
+{
+	class->list_settings = settings_list_settings;
+	class->clone = settings_clone;
+	class->equal = settings_equal;
+}
+
+static void
+camel_settings_init (CamelSettings *settings)
+{
+}
+
+/**
+ * camel_settings_class_list_settings:
+ * @class: a #CamelSettingsClass
+ * @n_settings: return location for the length of the returned array
+ *
+ * Returns an array of #GParamSpec for properties of @class which are
+ * considered to be settings.  By default all properties are considered
+ * to be settings, but subclasses may wish to exclude certain properties.
+ * Free the returned array with g_free().
+ *
+ * Returns: an array of #GParamSpec which should be freed after use
+ *
+ * Since: 3.2
+ **/
+GParamSpec **
+camel_settings_class_list_settings (CamelSettingsClass *class,
+                                    guint *n_settings)
+{
+	g_return_val_if_fail (CAMEL_IS_SETTINGS_CLASS (class), NULL);
+	g_return_val_if_fail (class->list_settings != NULL, NULL);
+
+	return class->list_settings (class, n_settings);
+}
+
+/**
+ * camel_settings_clone:
+ * @settings: a #CamelSettings
+ *
+ * Creates an copy of @settings, such that passing @settings and the
+ * copied instance to camel_settings_equal() would return %TRUE.
+ *
+ * By default, this creates a new settings instance with the same #GType
+ * as @settings, and copies all #GObject property values from @settings
+ * to the new instance.
+ *
+ * Returns: a newly-created copy of @settings
+ *
+ * Since: 3.2
+ **/
+CamelSettings *
+camel_settings_clone (CamelSettings *settings)
+{
+	CamelSettingsClass *class;
+	CamelSettings *clone;
+
+	g_return_val_if_fail (CAMEL_IS_SETTINGS (settings), NULL);
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings);
+	g_return_val_if_fail (class->clone != NULL, NULL);
+
+	clone = class->clone (settings);
+
+	/* Make sure the documented invariant is satisfied. */
+	g_warn_if_fail (camel_settings_equal (settings, clone));
+
+	return clone;
+}
+
+/**
+ * camel_settings_equal:
+ * @settings_a: a #CamelSettings
+ * @settings_b: another #CamelSettings
+ *
+ * Returns %TRUE if @settings_a and @settings_b are equal.
+ *
+ * By default, equality requires both instances to have the same #GType
+ * with the same set of #GObject properties, and each property value in
+ * @settings_a is equal to the corresponding value in @settings_b.
+ *
+ * Returns: %TRUE if @settings_a and @settings_b are equal
+ *
+ * Since: 3.2
+ **/
+gboolean
+camel_settings_equal (CamelSettings *settings_a,
+                      CamelSettings *settings_b)
+{
+	CamelSettingsClass *class;
+
+	g_return_val_if_fail (CAMEL_IS_SETTINGS (settings_a), FALSE);
+	g_return_val_if_fail (CAMEL_IS_SETTINGS (settings_b), FALSE);
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings_a);
+	g_return_val_if_fail (class->equal != NULL, FALSE);
+
+	return class->equal (settings_a, settings_b);
+}
+
+/**
+ * camel_settings_load_from_url:
+ * @settings: a #CamelSettings
+ * @url: a #CamelURL
+ *
+ * Populates @settings with parameters from @url.  The @url parameter value
+ * is converted according to the #GParamSpec for the corresponding property
+ * name in @settings.
+ *
+ * This function is highly Evolution-centric and is only temporary.
+ * Expect this function to be removed as early as version 3.4.
+ *
+ * Since: 3.2
+ **/
+void
+camel_settings_load_from_url (CamelSettings *settings,
+                              CamelURL *url)
+{
+	CamelSettingsClass *class;
+	GParamSpec **properties;
+	GValue value;
+	guint ii, n_properties;
+
+	g_return_if_fail (CAMEL_IS_SETTINGS (settings));
+	g_return_if_fail (url != NULL);
+
+	memset (&value, 0, sizeof (GValue));
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings);
+	properties = camel_settings_class_list_settings (class, &n_properties);
+
+	g_object_freeze_notify (G_OBJECT (settings));
+
+	for (ii = 0; ii < n_properties; ii++) {
+		GParamSpec *pspec = properties[ii];
+		const gchar *string;
+		gboolean value_is_set = FALSE;
+
+		string = g_datalist_get_data (&url->params, pspec->name);
+
+		/* If no corresponding URL parameter is found,
+		 * leave the CamelSettings property unchanged. */
+		if (string == NULL)
+			continue;
+
+		/* Handle more types as needed. */
+
+		if (G_IS_PARAM_SPEC_CHAR (pspec) ||
+		    G_IS_PARAM_SPEC_UCHAR (pspec) ||
+		    G_IS_PARAM_SPEC_INT (pspec) ||
+		    G_IS_PARAM_SPEC_UINT (pspec) ||
+		    G_IS_PARAM_SPEC_LONG (pspec) ||
+		    G_IS_PARAM_SPEC_ULONG (pspec)) {
+			glong v_long;
+			gchar *endptr;
+
+			v_long = strtol (string, &endptr, 10);
+
+			if (*string != '\0' && *endptr == '\0') {
+				g_value_init (&value, G_TYPE_LONG);
+				g_value_set_long (&value, v_long);
+				value_is_set = TRUE;
+			}
+
+		} else if (G_IS_PARAM_SPEC_BOOLEAN (pspec)) {
+			gboolean v_boolean = FALSE;
+
+			value_is_set = TRUE;
+
+			/* If the value is empty, then the mere
+			 * presence of the parameter means TRUE. */
+			if (*string == '\0')
+				v_boolean = TRUE;
+
+			else if (g_ascii_strcasecmp (string, "true") == 0)
+				v_boolean = TRUE;
+
+			else if (g_ascii_strcasecmp (string, "yes") == 0)
+				v_boolean = TRUE;
+
+			else if (g_ascii_strcasecmp (string, "1") == 0)
+				v_boolean = TRUE;
+
+			else if (g_ascii_strcasecmp (string, "false") == 0)
+				v_boolean = FALSE;
+
+			else if (g_ascii_strcasecmp (string, "no") == 0)
+				v_boolean = FALSE;
+
+			else if (g_ascii_strcasecmp (string, "0") == 0)
+				v_boolean = FALSE;
+
+			else
+				value_is_set = FALSE;
+
+			if (value_is_set) {
+				g_value_init (&value, G_TYPE_BOOLEAN);
+				g_value_set_boolean (&value, v_boolean);
+			}
+
+		} else if (G_IS_PARAM_SPEC_ENUM (pspec)) {
+			GParamSpecEnum *enum_pspec;
+			GEnumValue *enum_value;
+
+			enum_pspec = G_PARAM_SPEC_ENUM (pspec);
+			enum_value = g_enum_get_value_by_nick (
+				enum_pspec->enum_class, string);
+			if (enum_value != NULL) {
+				g_value_init (&value, pspec->value_type);
+				g_value_set_enum (&value, enum_value->value);
+				value_is_set = TRUE;
+			}
+
+		} else if (G_IS_PARAM_SPEC_FLOAT (pspec) ||
+			   G_IS_PARAM_SPEC_DOUBLE (pspec)) {
+			gdouble v_double;
+			gchar *endptr;
+
+			v_double = g_ascii_strtod (string, &endptr);
+
+			if (*string != '\0' && *endptr == '\0') {
+				g_value_init (&value, G_TYPE_DOUBLE);
+				g_value_set_double (&value, v_double);
+				value_is_set = TRUE;
+			}
+
+		} else if (G_IS_PARAM_SPEC_STRING (pspec)) {
+			g_value_init (&value, G_TYPE_STRING);
+			g_value_set_string (&value, string);
+			value_is_set = TRUE;
+
+		} else if (g_type_is_a (pspec->value_type, G_TYPE_STRV)) {
+			gchar **strv;
+
+			strv = g_strsplit (string, ",", -1);
+			g_value_init (&value, G_TYPE_STRV);
+			g_value_take_boxed (&value, strv);
+			value_is_set = TRUE;
+
+		} else
+			g_warning (
+				"No handler to load property %s:%s (type %s)",
+				G_OBJECT_TYPE_NAME (settings),
+				pspec->name, g_type_name (pspec->value_type));
+
+		if (value_is_set) {
+			g_object_set_property (
+				G_OBJECT (settings),
+				pspec->name, &value);
+			g_value_unset (&value);
+		}
+	}
+
+	g_object_thaw_notify (G_OBJECT (settings));
+
+	g_free (properties);
+}
+
+/**
+ * camel_settings_save_to_url:
+ * @settings: a #CamelSettings
+ * @url: a #CamelURL
+ *
+ * Writes the values of all properties of @settings to @url as parameter
+ * strings.  The parameter name in @url matches the corresponding property
+ * in @settings.
+ *
+ * This function is highly Evolution-centric and is only temporary.
+ * Expect this function to be removed as early as version 3.4.
+ *
+ * Since: 3.2
+ **/
+void
+camel_settings_save_to_url (CamelSettings *settings,
+                            CamelURL *url)
+{
+	CamelSettingsClass *class;
+	GParamSpec **properties;
+	GValue pvalue;
+	GValue svalue;
+	guint ii, n_properties;
+
+	g_return_if_fail (CAMEL_IS_SETTINGS (settings));
+	g_return_if_fail (url != NULL);
+
+	memset (&pvalue, 0, sizeof (GValue));
+	memset (&svalue, 0, sizeof (GValue));
+
+	g_value_init (&svalue, G_TYPE_STRING);
+
+	class = CAMEL_SETTINGS_GET_CLASS (settings);
+	properties = camel_settings_class_list_settings (class, &n_properties);
+
+	for (ii = 0; ii < n_properties; ii++) {
+		GParamSpec *pspec = properties[ii];
+		gchar *string = NULL;
+
+		g_value_init (&pvalue, pspec->value_type);
+
+		g_object_get_property (
+			G_OBJECT (settings),
+			pspec->name, &pvalue);
+
+		/* If the property value matches the default value,
+		 * remove the corresponding URL parameter so we keep
+		 * the URL string to a minimum. */
+		if (g_param_value_defaults (pspec, &pvalue)) {
+			g_datalist_remove_data (&url->params, pspec->name);
+			g_value_unset (&pvalue);
+			continue;
+		}
+
+		/* For the most part we can just transform any supported
+		 * property type to a string, with a couple exceptions. */
+
+		/* Transforming a boolean GValue to a string results
+		 * in "TRUE" or "FALSE" (all uppercase).  Instead use
+		 * all lowercase since GKeyFile will require it. */
+		if (G_VALUE_HOLDS_BOOLEAN (&pvalue)) {
+			gboolean v_boolean = g_value_get_boolean (&pvalue);
+			string = g_strdup (v_boolean ? "true" : "false");
+
+		/* Transforming an enum GValue to a string results in
+		 * the GEnumValue name.  We want the shorter nickname. */
+		} else if (G_VALUE_HOLDS_ENUM (&pvalue)) {
+			GParamSpecEnum *enum_pspec;
+			GEnumClass *enum_class;
+			GEnumValue *enum_value;
+			gint value;
+
+			enum_pspec = G_PARAM_SPEC_ENUM (pspec);
+			enum_class = enum_pspec->enum_class;
+
+			value = g_value_get_enum (&pvalue);
+			enum_value = g_enum_get_value (enum_class, value);
+
+			if (enum_value != NULL)
+				string = g_strdup (enum_value->value_nick);
+
+		} else if (G_VALUE_HOLDS (&pvalue, G_TYPE_STRV)) {
+			gchar **strv = g_value_get_boxed (&pvalue);
+
+			if (strv != NULL)
+				string = g_strjoinv (",", strv);
+
+		} else if (g_value_transform (&pvalue, &svalue)) {
+			string = g_value_dup_string (&svalue);
+
+		} else
+			g_warning (
+				"No handler to save property %s:%s (type %s)",
+				G_OBJECT_TYPE_NAME (settings),
+				pspec->name, g_type_name (pspec->value_type));
+
+		/* CamelURL takes ownership of the string. */
+		if (string != NULL)
+			g_datalist_set_data_full (
+				&url->params, pspec->name, string,
+				(GDestroyNotify) g_free);
+
+		g_value_unset (&pvalue);
+	}
+
+	g_free (properties);
+
+	g_value_unset (&svalue);
+}
diff --git a/camel/camel-settings.h b/camel/camel-settings.h
new file mode 100644
index 0000000..d5337fe
--- /dev/null
+++ b/camel/camel-settings.h
@@ -0,0 +1,86 @@
+/*
+ * camel-settings.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
+#error "Only <camel/camel.h> can be included directly."
+#endif
+
+#ifndef CAMEL_SETTINGS_H
+#define CAMEL_SETTINGS_H
+
+#include <glib-object.h>
+#include <camel/camel-url.h>
+
+/* Standard GObject macros */
+#define CAMEL_TYPE_SETTINGS \
+	(camel_settings_get_type ())
+#define CAMEL_SETTINGS(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), CAMEL_TYPE_SETTINGS, CamelSettings))
+#define CAMEL_SETTINGS_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), CAMEL_TYPE_SETTINGS, CamelSettingsClass))
+#define CAMEL_IS_SETTINGS(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), CAMEL_TYPE_SETTINGS))
+#define CAMEL_IS_SETTINGS_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), CAMEL_TYPE_SETTINGS))
+#define CAMEL_SETTINGS_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), CAMEL_TYPE_SETTINGS, CamelSettingsClass))
+
+G_BEGIN_DECLS
+
+typedef struct _CamelSettings CamelSettings;
+typedef struct _CamelSettingsClass CamelSettingsClass;
+typedef struct _CamelSettingsPrivate CamelSettingsPrivate;
+
+struct _CamelSettings {
+	GObject parent;
+	CamelSettingsPrivate *priv;
+};
+
+struct _CamelSettingsClass {
+	GObjectClass parent_class;
+
+	GParamSpec **	(*list_settings)	(CamelSettingsClass *klass,
+						 guint *n_settings);
+
+	CamelSettings *	(*clone)		(CamelSettings *settings);
+	gboolean	(*equal)		(CamelSettings *settings_a,
+						 CamelSettings *settings_b);
+};
+
+GType		camel_settings_get_type		(void) G_GNUC_CONST;
+GParamSpec **	camel_settings_class_list_settings
+						(CamelSettingsClass *klass,
+						 guint *n_settings);
+CamelSettings *	camel_settings_clone		(CamelSettings *settings);
+gboolean	camel_settings_equal		(CamelSettings *settings_a,
+						 CamelSettings *settings_b);
+
+/* XXX These functions are temporary.  Fair warning. */
+void		camel_settings_load_from_url	(CamelSettings *settings,
+						 CamelURL *url);
+void		camel_settings_save_to_url	(CamelSettings *settings,
+						 CamelURL *url);
+
+G_END_DECLS
+
+#endif /* CAMEL_SETTINGS_H */
diff --git a/camel/camel.h b/camel/camel.h
index f758781..0b54f9b 100644
--- a/camel/camel.h
+++ b/camel/camel.h
@@ -110,6 +110,7 @@
 #include <camel/camel-sasl-popb4smtp.h>
 #include <camel/camel-service.h>
 #include <camel/camel-session.h>
+#include <camel/camel-settings.h>
 #include <camel/camel-smime-context.h>
 #include <camel/camel-store.h>
 #include <camel/camel-store-summary.h>
diff --git a/configure.ac b/configure.ac
index 3be23e8..8bbfee0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -105,7 +105,7 @@ LIBEGROUPWISE_CURRENT=13
 LIBEGROUPWISE_REVISION=1
 LIBEGROUPWISE_AGE=0
 
-LIBCAMEL_CURRENT=28
+LIBCAMEL_CURRENT=29
 LIBCAMEL_REVISION=0
 LIBCAMEL_AGE=0
 
diff --git a/docs/reference/camel/camel-docs.sgml b/docs/reference/camel/camel-docs.sgml
index 73e2397..1a45e51 100644
--- a/docs/reference/camel/camel-docs.sgml
+++ b/docs/reference/camel/camel-docs.sgml
@@ -95,6 +95,7 @@
       <xi:include href="xml/camel-store-summary.xml"/>
       <xi:include href="xml/camel-offline-store.xml"/>
       <xi:include href="xml/camel-transport.xml"/>
+      <xi:include href="xml/camel-settings.xml"/>
     </chapter>
 
     <chapter id="Filters">
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index 660d563..568f648 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -1921,6 +1921,8 @@ camel_service_get_user_data_dir
 camel_service_get_name
 camel_service_get_provider
 camel_service_get_session
+camel_service_get_settings
+camel_service_set_settings
 camel_service_get_uid
 camel_service_get_camel_url
 camel_service_get_url
@@ -1998,6 +2000,28 @@ camel_session_get_type
 </SECTION>
 
 <SECTION>
+<FILE>camel-settings</FILE>
+<TITLE>CamelSettings</TITLE>
+CamelSettings
+camel_settings_class_list_settings
+camel_settings_clone
+camel_settings_equal
+camel_settings_load_from_url
+camel_settings_save_to_url
+<SUBSECTION Standard>
+CAMEL_SETTINGS
+CAMEL_IS_SETTINGS
+CAMEL_TYPE_SETTINGS
+CAMEL_SETTINGS_CLASS
+CAMEL_IS_SETTINGS_CLASS
+CAMEL_SETTINGS_GET_CLASS
+CamelSettingsClass
+<SUBSECTION Private>
+CamelSettingsPrivate
+camel_settings_get_type
+</SECTION>
+
+<SECTION>
 <FILE>camel-smime-context</FILE>
 <TITLE>CamelSMIMEContext</TITLE>
 CamelSMIMEContext
diff --git a/docs/reference/camel/camel.types b/docs/reference/camel/camel.types
index e1f2054..055f465 100644
--- a/docs/reference/camel/camel.types
+++ b/docs/reference/camel/camel.types
@@ -65,6 +65,7 @@ camel_sasl_plain_get_type
 camel_sasl_popb4smtp_get_type
 camel_service_get_type
 camel_session_get_type
+camel_settings_get_type
 camel_smime_context_get_type
 camel_store_get_type
 camel_store_summary_get_type
diff --git a/docs/reference/camel/tmpl/camel-service.sgml b/docs/reference/camel/tmpl/camel-service.sgml
index 63ce39b..2161313 100644
--- a/docs/reference/camel/tmpl/camel-service.sgml
+++ b/docs/reference/camel/tmpl/camel-service.sgml
@@ -36,6 +36,11 @@ CamelService
 
 </para>
 
+<!-- ##### ARG CamelService:settings ##### -->
+<para>
+
+</para>
+
 <!-- ##### ARG CamelService:uid ##### -->
 <para>
 
@@ -121,6 +126,24 @@ CamelService
 @Returns: 
 
 
+<!-- ##### FUNCTION camel_service_get_settings ##### -->
+<para>
+
+</para>
+
+ service: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_service_set_settings ##### -->
+<para>
+
+</para>
+
+ service: 
+ settings: 
+
+
 <!-- ##### FUNCTION camel_service_get_uid ##### -->
 <para>
 
diff --git a/docs/reference/camel/tmpl/camel-settings.sgml b/docs/reference/camel/tmpl/camel-settings.sgml
new file mode 100644
index 0000000..f561bcc
--- /dev/null
+++ b/docs/reference/camel/tmpl/camel-settings.sgml
@@ -0,0 +1,75 @@
+<!-- ##### SECTION Title ##### -->
+CamelSettings
+
+<!-- ##### SECTION Short_Description ##### -->
+
+
+<!-- ##### SECTION Long_Description ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION See_Also ##### -->
+<para>
+
+</para>
+
+<!-- ##### SECTION Stability_Level ##### -->
+
+
+<!-- ##### SECTION Image ##### -->
+
+
+<!-- ##### STRUCT CamelSettings ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### FUNCTION camel_settings_class_list_settings ##### -->
+<para>
+
+</para>
+
+ klass: 
+ n_settings: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_settings_clone ##### -->
+<para>
+
+</para>
+
+ settings: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_settings_equal ##### -->
+<para>
+
+</para>
+
+ settings_a: 
+ settings_b: 
+ Returns: 
+
+
+<!-- ##### FUNCTION camel_settings_load_from_url ##### -->
+<para>
+
+</para>
+
+ settings: 
+ url: 
+
+
+<!-- ##### FUNCTION camel_settings_save_to_url ##### -->
+<para>
+
+</para>
+
+ settings: 
+ url: 
+
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]