[evolution-data-server] Add ESourceResource extension type.



commit 39bbf1ecc2f8b50cba25b55c79439167b4d537f8
Author: Matthew Barnes <mbarnes redhat com>
Date:   Wed Jun 27 08:18:15 2012 -0400

    Add ESourceResource extension type.
    
    Intended to be used by collection backends to note the server-assigned
    name of a calendar, address book, or any other kind of remote resource
    that an ESource can represent.

 .../libedataserver/libedataserver-docs.sgml        |    1 +
 .../libedataserver/libedataserver-sections.txt     |   21 ++
 docs/reference/libedataserver/libedataserver.types |    1 +
 libedataserver/Makefile.am                         |    2 +
 libedataserver/e-source-resource.c                 |  238 ++++++++++++++++++++
 libedataserver/e-source-resource.h                 |   89 ++++++++
 libedataserver/e-source.c                          |    2 +
 libedataserver/libedataserver.h                    |    1 +
 8 files changed, 355 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/libedataserver/libedataserver-docs.sgml b/docs/reference/libedataserver/libedataserver-docs.sgml
index c7ebff9..54439b5 100644
--- a/docs/reference/libedataserver/libedataserver-docs.sgml
+++ b/docs/reference/libedataserver/libedataserver-docs.sgml
@@ -39,6 +39,7 @@
     <xi:include href="xml/e-source-offline.xml"/>
     <xi:include href="xml/e-source-openpgp.xml"/>
     <xi:include href="xml/e-source-refresh.xml"/>
+    <xi:include href="xml/e-source-resource.xml"/>
     <xi:include href="xml/e-source-security.xml"/>
     <xi:include href="xml/e-source-smime.xml"/>
     <xi:include href="xml/e-source-task-list.xml"/>
diff --git a/docs/reference/libedataserver/libedataserver-sections.txt b/docs/reference/libedataserver/libedataserver-sections.txt
index 14d7505..c0d9469 100644
--- a/docs/reference/libedataserver/libedataserver-sections.txt
+++ b/docs/reference/libedataserver/libedataserver-sections.txt
@@ -849,6 +849,27 @@ e_source_registry_get_type
 </SECTION>
 
 <SECTION>
+<FILE>e-source-resource</FILE>
+<TITLE>ESourceResource</TITLE>
+ESourceResource
+E_SOURCE_EXTENSION_RESOURCE
+e_source_resource_get_identity
+e_source_resource_dup_identity
+e_source_resource_set_identity
+<SUBSECTION Standard>
+E_SOURCE_RESOURCE
+E_IS_SOURCE_RESOURCE
+E_TYPE_SOURCE_RESOURCE
+E_SOURCE_RESOURCE_CLASS
+E_IS_SOURCE_RESOURCE_CLASS
+E_SOURCE_RESOURCE_GET_CLASS
+ESourceResourceClass
+<SUBSECTION Private>
+ESourceResourcePrivate
+e_source_resource_get_type
+</SECTION>
+
+<SECTION>
 <FILE>e-source-security</FILE>
 <TITLE>ESourceSecurity</TITLE>
 ESourceSecurity
diff --git a/docs/reference/libedataserver/libedataserver.types b/docs/reference/libedataserver/libedataserver.types
index ee6c766..18eb94f 100644
--- a/docs/reference/libedataserver/libedataserver.types
+++ b/docs/reference/libedataserver/libedataserver.types
@@ -27,6 +27,7 @@ e_source_offline_get_type
 e_source_openpgp_get_type
 e_source_refresh_get_type
 e_source_registry_get_type
+e_source_resource_get_type
 e_source_security_get_type
 e_source_selectable_get_type
 e_source_smime_get_type
diff --git a/libedataserver/Makefile.am b/libedataserver/Makefile.am
index 87fcfd9..145f0a2 100644
--- a/libedataserver/Makefile.am
+++ b/libedataserver/Makefile.am
@@ -79,6 +79,7 @@ libedataserver_1_2_la_SOURCES =		\
 	e-source-openpgp.c		\
 	e-source-refresh.c		\
 	e-source-registry.c		\
+	e-source-resource.c		\
 	e-source-security.c		\
 	e-source-selectable.c		\
 	e-source-smime.c		\
@@ -151,6 +152,7 @@ libedataserverinclude_HEADERS =		\
 	e-source-openpgp.h		\
 	e-source-refresh.h		\
 	e-source-registry.h		\
+	e-source-resource.h		\
 	e-source-security.h		\
 	e-source-selectable.h		\
 	e-source-smime.h		\
diff --git a/libedataserver/e-source-resource.c b/libedataserver/e-source-resource.c
new file mode 100644
index 0000000..5562e30
--- /dev/null
+++ b/libedataserver/e-source-resource.c
@@ -0,0 +1,238 @@
+/*
+ * e-source-resource.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/>
+ *
+ */
+
+/**
+ * SECTION: e-source-resource
+ * @include: libedataserver/libedataserver.h
+ * @short_description: #ESource extension for a remote resource
+ *
+ * The #ESourceResource extension holds the server-assigned identity of a
+ * remote calendar, address book, or whatever else an #ESource can represent.
+ *
+ * This extension is typically used by an #ECollectionBackend to note a
+ * server-assigned resource identity in an #ESource.  Then in a later session,
+ * after querying the server for available resources, a resource identity can
+ * be paired with the same #ESource #ESource:uid from the previous session,
+ * allowing locally cached data from the previous session to be reused.
+ *
+ * Access the extension as follows:
+ *
+ * |[
+ *   #include <libedataserver/e-source-resource.h>
+ *
+ *   ESourceResource *extension;
+ *
+ *   extension = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE);
+ * ]|
+ **/
+
+#include "e-source-resource.h"
+
+#include <libedataserver/e-data-server-util.h>
+
+#define E_SOURCE_RESOURCE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_SOURCE_RESOURCE, ESourceResourcePrivate))
+
+struct _ESourceResourcePrivate {
+	GMutex *property_lock;
+	gchar *identity;
+};
+
+enum {
+	PROP_0,
+	PROP_IDENTITY
+};
+
+G_DEFINE_TYPE (
+	ESourceResource,
+	e_source_resource,
+	E_TYPE_SOURCE_EXTENSION)
+
+static void
+source_resource_set_property (GObject *object,
+                              guint property_id,
+                              const GValue *value,
+                              GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_IDENTITY:
+			e_source_resource_set_identity (
+				E_SOURCE_RESOURCE (object),
+				g_value_get_string (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+source_resource_get_property (GObject *object,
+                              guint property_id,
+                              GValue *value,
+                              GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_IDENTITY:
+			g_value_take_string (
+				value,
+				e_source_resource_dup_identity (
+				E_SOURCE_RESOURCE (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+source_resource_finalize (GObject *object)
+{
+	ESourceResourcePrivate *priv;
+
+	priv = E_SOURCE_RESOURCE_GET_PRIVATE (object);
+
+	g_mutex_free (priv->property_lock);
+
+	g_free (priv->identity);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (e_source_resource_parent_class)->finalize (object);
+}
+
+static void
+e_source_resource_class_init (ESourceResourceClass *class)
+{
+	GObjectClass *object_class;
+	ESourceExtensionClass *extension_class;
+
+	g_type_class_add_private (class, sizeof (ESourceResourcePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = source_resource_set_property;
+	object_class->get_property = source_resource_get_property;
+	object_class->finalize = source_resource_finalize;
+
+	extension_class = E_SOURCE_EXTENSION_CLASS (class);
+	extension_class->name = E_SOURCE_EXTENSION_RESOURCE;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_IDENTITY,
+		g_param_spec_string (
+			"identity",
+			"Identity",
+			"Resource identity",
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT |
+			G_PARAM_STATIC_STRINGS |
+			E_SOURCE_PARAM_SETTING));
+}
+
+static void
+e_source_resource_init (ESourceResource *extension)
+{
+	extension->priv = E_SOURCE_RESOURCE_GET_PRIVATE (extension);
+	extension->priv->property_lock = g_mutex_new ();
+}
+
+/**
+ * e_source_resource_get_identity:
+ * @extension: an #ESourceResource
+ *
+ * Returns the server-assigned identity of the remote resource associated
+ * with the #ESource to which @extension belongs.
+ *
+ * Returns: the identity of a remote resource
+ *
+ * Since: 3.6
+ **/
+const gchar *
+e_source_resource_get_identity (ESourceResource *extension)
+{
+	g_return_val_if_fail (E_IS_SOURCE_RESOURCE (extension), NULL);
+
+	return extension->priv->identity;
+}
+
+/**
+ * e_source_resource_dup_identity:
+ * @extension: an #ESourceResource
+ *
+ * Thread-safe variation of e_source_resource_get_identity().
+ * Use this function when accessing @extension from multiple threads.
+ *
+ * The returned string should be freed with g_free() when no longer needed.
+ *
+ * Returns: a newly-allocated copy of #ESourceResource:identity
+ *
+ * Since: 3.6
+ **/
+gchar *
+e_source_resource_dup_identity (ESourceResource *extension)
+{
+	const gchar *protected;
+	gchar *duplicate;
+
+	g_return_val_if_fail (E_IS_SOURCE_RESOURCE (extension), NULL);
+
+	g_mutex_lock (extension->priv->property_lock);
+
+	protected = e_source_resource_get_identity (extension);
+	duplicate = g_strdup (protected);
+
+	g_mutex_unlock (extension->priv->property_lock);
+
+	return duplicate;
+}
+
+/**
+ * e_source_resource_set_identity:
+ * @extension: an #ESourceResource
+ * @identity: (allow-none): the identity of a remote resource
+ *
+ * Sets the server-assigned identity of the remote resource associated with
+ * the #ESource to which @extension belongs.
+ *
+ * The internal copy of @identity is automatically stripped of leading and
+ * trailing whitespace.  If the resulting string is empty, %NULL is set
+ * instead.
+ *
+ * Since: 3.6
+ **/
+void
+e_source_resource_set_identity (ESourceResource *extension,
+                                const gchar *identity)
+{
+	g_return_if_fail (E_IS_SOURCE_RESOURCE (extension));
+
+	g_mutex_lock (extension->priv->property_lock);
+
+	if (g_strcmp0 (extension->priv->identity, identity) == 0) {
+		g_mutex_unlock (extension->priv->property_lock);
+		return;
+	}
+
+	g_free (extension->priv->identity);
+	extension->priv->identity = e_util_strdup_strip (identity);
+
+	g_mutex_unlock (extension->priv->property_lock);
+
+	g_object_notify (G_OBJECT (extension), "identity");
+}
+
diff --git a/libedataserver/e-source-resource.h b/libedataserver/e-source-resource.h
new file mode 100644
index 0000000..2b44c80
--- /dev/null
+++ b/libedataserver/e-source-resource.h
@@ -0,0 +1,89 @@
+/*
+ * e-source-resource.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 (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION)
+#error "Only <libedataserver/libedataserver.h> should be included directly."
+#endif
+
+#ifndef E_SOURCE_RESOURCE_H
+#define E_SOURCE_RESOURCE_H
+
+#include <libedataserver/e-source-extension.h>
+
+/* Standard GObject macros */
+#define E_TYPE_SOURCE_RESOURCE \
+	(e_source_resource_get_type ())
+#define E_SOURCE_RESOURCE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SOURCE_RESOURCE, ESourceResource))
+#define E_SOURCE_RESOURCE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SOURCE_RESOURCE, ESourceResourceClass))
+#define E_IS_SOURCE_RESOURCE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SOURCE_RESOURCE))
+#define E_IS_SOURCE_RESOURCE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_SOURCE_RESOURCE))
+#define E_SOURCE_RESOURCE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SOURCE_RESOURCE, ESourceResourceClass))
+
+/**
+ * E_SOURCE_EXTENSION_RESOURCE:
+ *
+ * Pass this extension name to e_source_get_extension() to access
+ * #ESourceResource.  This is also used as a group name in key files.
+ *
+ * Since: 3.6
+ **/
+#define E_SOURCE_EXTENSION_RESOURCE "Resource"
+
+G_BEGIN_DECLS
+
+typedef struct _ESourceResource ESourceResource;
+typedef struct _ESourceResourceClass ESourceResourceClass;
+typedef struct _ESourceResourcePrivate ESourceResourcePrivate;
+
+/**
+ * ESourceResource:
+ *
+ * Contains only private data that should be read and manipulated using the
+ * functions below.
+ *
+ * Since: 3.6
+ **/
+struct _ESourceResource {
+	ESourceExtension parent;
+	ESourceResourcePrivate *priv;
+};
+
+struct _ESourceResourceClass {
+	ESourceExtensionClass parent_class;
+};
+
+GType		e_source_resource_get_type	(void) G_GNUC_CONST;
+const gchar *	e_source_resource_get_identity	(ESourceResource *extension);
+gchar *		e_source_resource_dup_identity	(ESourceResource *extension);
+void		e_source_resource_set_identity	(ESourceResource *extension,
+						 const gchar *identity);
+
+G_END_DECLS
+
+#endif /* E_SOURCE_RESOURCE_H */
+
diff --git a/libedataserver/e-source.c b/libedataserver/e-source.c
index 8a50e9e..1e1357e 100644
--- a/libedataserver/e-source.c
+++ b/libedataserver/e-source.c
@@ -92,6 +92,7 @@
 #include "e-source-offline.h"
 #include "e-source-openpgp.h"
 #include "e-source-refresh.h"
+#include "e-source-resource.h"
 #include "e-source-security.h"
 #include "e-source-selectable.h"
 #include "e-source-smime.h"
@@ -1247,6 +1248,7 @@ e_source_class_init (ESourceClass *class)
 	REGISTER_TYPE (E_TYPE_SOURCE_OFFLINE);
 	REGISTER_TYPE (E_TYPE_SOURCE_OPENPGP);
 	REGISTER_TYPE (E_TYPE_SOURCE_REFRESH);
+	REGISTER_TYPE (E_TYPE_SOURCE_RESOURCE);
 	REGISTER_TYPE (E_TYPE_SOURCE_SECURITY);
 	REGISTER_TYPE (E_TYPE_SOURCE_SELECTABLE);
 	REGISTER_TYPE (E_TYPE_SOURCE_SMIME);
diff --git a/libedataserver/libedataserver.h b/libedataserver/libedataserver.h
index 98d999d..ca98003 100644
--- a/libedataserver/libedataserver.h
+++ b/libedataserver/libedataserver.h
@@ -59,6 +59,7 @@
 #include <libedataserver/e-source-openpgp.h>
 #include <libedataserver/e-source-refresh.h>
 #include <libedataserver/e-source-registry.h>
+#include <libedataserver/e-source-resource.h>
 #include <libedataserver/e-source-security.h>
 #include <libedataserver/e-source-selectable.h>
 #include <libedataserver/e-source-smime.h>



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