[evolution-couchdb] Added views methods and some fixes in EBookBackend class



commit 67d291d44006cb7104314ed3a27e2c691bab6385
Author: Rodrigo Moya <rodrigo gnome-db org>
Date:   Thu Jun 18 17:14:11 2009 +0200

    Added views methods and some fixes in EBookBackend class

 addressbook/GNOME_Evolution_CouchDB.server.in |    2 +-
 addressbook/e-book-backend-couchdb-factory.c  |    2 +-
 addressbook/e-book-backend-couchdb.c          |  147 +++++++++++++++++--------
 addressbook/e-book-backend-couchdb.h          |    8 +-
 4 files changed, 110 insertions(+), 49 deletions(-)
---
diff --git a/addressbook/GNOME_Evolution_CouchDB.server.in b/addressbook/GNOME_Evolution_CouchDB.server.in
index fd6b007..7652196 100644
--- a/addressbook/GNOME_Evolution_CouchDB.server.in
+++ b/addressbook/GNOME_Evolution_CouchDB.server.in
@@ -10,7 +10,7 @@
 	</oaf_attribute>
 
 	<oaf_attribute name="name" type="string"
-                       _value="Evolution Addressbook CouchDB backend"/>
+                       value="Evolution Addressbook CouchDB backend"/>
 	<oaf_attribute name="addressbook:supported_protocols" type="stringv">
                 <item value="couchdb"/>
         </oaf_attribute>
diff --git a/addressbook/e-book-backend-couchdb-factory.c b/addressbook/e-book-backend-couchdb-factory.c
index e221be0..8551695 100644
--- a/addressbook/e-book-backend-couchdb-factory.c
+++ b/addressbook/e-book-backend-couchdb-factory.c
@@ -32,7 +32,7 @@ static GType couchdb_type;
 void
 eds_module_initialize (GTypeModule *module)
 {
-	couchdb_type = couchdb_factory_get_type (module);
+	couchdb_type = _couchdb_factory_get_type (module);
 }
 
 void
diff --git a/addressbook/e-book-backend-couchdb.c b/addressbook/e-book-backend-couchdb.c
index bd0539a..42c6f8b 100644
--- a/addressbook/e-book-backend-couchdb.c
+++ b/addressbook/e-book-backend-couchdb.c
@@ -21,16 +21,10 @@
  * Authors: Rodrigo Moya <rodrigo moya canonical com>
  */
 
-#include <couchdb-glib.h>
 #include "e-book-backend-couchdb.h"
 
 G_DEFINE_TYPE (EBookBackendCouchDB, e_book_backend_couchdb, E_TYPE_BOOK_BACKEND);
 
-struct _EBookBackendCouchDBPrivate {
-	CouchDB *couchdb;
-	char *dbname;
-};
-
 static char *
 vcard_from_couch_document (CouchDBDocument *document)
 {
@@ -90,22 +84,22 @@ e_book_backend_couchdb_load_source (EBookBackend *backend,
 
 	g_return_val_if_fail (E_IS_BOOK_BACKEND_COUCHDB (couchdb_backend), GNOME_Evolution_Addressbook_OtherError);
 
-	if (couchdb_backend->priv->couchdb)
-		g_object_unref (couchdb_backend->priv->couchdb);
-	if (couchdb_backend->priv->dbname)
-		g_free (couchdb_backend->priv->dbname);
+	if (couchdb_backend->couchdb)
+		g_object_unref (couchdb_backend->couchdb);
+	if (couchdb_backend->dbname)
+		g_free (couchdb_backend->dbname);
 
 	/* create CouchDB main object */
 	uri = e_source_get_uri (source);
-	couchdb_backend->priv->dbname = g_strdup ("contacts");
+	couchdb_backend->dbname = g_strdup ("contacts");
 
-	if (! (couchdb_backend->priv->couchdb = couchdb_new (NULL /* FIXME: uri */)))
+	if (! (couchdb_backend->couchdb = couchdb_new (NULL /* FIXME: uri */)))
 		return GNOME_Evolution_Addressbook_OtherError;
 	g_free (uri);
 
 	/* check if only_if_exists */
-	db_info = couchdb_get_database_info (couchdb_backend->priv->couchdb,
-					     couchdb_backend->priv->dbname,
+	db_info = couchdb_get_database_info (couchdb_backend->couchdb,
+					     couchdb_backend->dbname,
 					     &error);
 	if (!db_info) {
 		couchdb_free_database_info (db_info);
@@ -115,8 +109,8 @@ e_book_backend_couchdb_load_source (EBookBackend *backend,
 		
 		/* if it does not exist, create it */
 		error = NULL;
-		if (!couchdb_create_database (couchdb_backend->priv->couchdb,
-					      couchdb_backend->priv->dbname,
+		if (!couchdb_create_database (couchdb_backend->couchdb,
+					      couchdb_backend->dbname,
 					      &error))
 			return GNOME_Evolution_Addressbook_PermissionDenied;
 	}
@@ -132,8 +126,6 @@ e_book_backend_couchdb_remove (EBookBackend *backend, EDataBook *book, guint32 o
 {
 	EBookBackendCouchDB *couchdb_backend = E_BOOK_BACKEND_COUCHDB (backend);
 
-	g_return_if_fail (E_IS_BOOK_BACKEND_COUCHDB (couchdb_backend));
-
 	/* We don't remove data from CouchDB, since it would affect other apps,
 	   so just report success */
 	e_data_book_respond_remove (book, opid, GNOME_Evolution_Addressbook_Success);
@@ -153,7 +145,8 @@ e_book_backend_couchdb_create_contact (EBookBackend *backend,
 {
 	EBookBackendCouchDB *couchdb_backend = E_BOOK_BACKEND_COUCHDB (backend);
 
-	g_return_if_fail (E_IS_BOOK_BACKEND_COUCHDB (couchdb_backend));
+	/* FIXME */
+	e_data_book_respond_create(book, opid, GNOME_Evolution_Addressbook_OtherError, NULL);
 }
 
 static void
@@ -162,6 +155,8 @@ e_book_backend_couchdb_remove_contacts (EBookBackend *backend,
 					guint32 opid,
 					GList *id_list)
 {
+	/* FIXME */
+	e_data_book_respond_remove_contacts (book, opid, GNOME_Evolution_Addressbook_OtherError, NULL);
 }
 
 static void
@@ -170,6 +165,8 @@ e_book_backend_couchdb_modify_contact (EBookBackend *backend,
 					 guint32 opid,
 					 const char *vcard)
 {
+	/* FIXME */
+	e_data_book_respond_modify (book, opid, GNOME_Evolution_Addressbook_OtherError, NULL);
 }
 
 static void
@@ -182,21 +179,21 @@ e_book_backend_couchdb_get_contact (EBookBackend *backend,
 	CouchDBDocument *document;
 	EBookBackendCouchDB *couchdb_backend = E_BOOK_BACKEND_COUCHDB (backend);
 
-	g_return_if_fail (E_IS_BOOK_BACKEND_COUCHDB (couchdb_backend));
-
-	document = couchdb_document_get (couchdb_backend->priv->couchdb,
-					 couchdb_backend->priv->dbname,
+	document = couchdb_document_get (couchdb_backend->couchdb,
+					 couchdb_backend->dbname,
 					 id,
 					 &error);
 	if (document) {
 		char *vcard = vcard_from_couch_document (document);
 
+		g_object_unref (G_OBJECT (document));
 		if (vcard) {
 			e_data_book_respond_get_contact (book,
 							 opid,
 							 GNOME_Evolution_Addressbook_Success,
 							 vcard);
 			g_free (vcard);
+			return;
 		}
 	}
 
@@ -213,11 +210,9 @@ e_book_backend_couchdb_get_contact_list (EBookBackend *backend,
 	GError *error = NULL;
 	EBookBackendCouchDB *couchdb_backend = E_BOOK_BACKEND_COUCHDB (backend);
 
-	g_return_if_fail (E_IS_BOOK_BACKEND_COUCHDB (couchdb_backend));
-
 	/* Get the list of documents from CouchDB */
-	doc_list = couchdb_list_documents (couchdb_backend->priv->couchdb,
-					   couchdb_backend->priv->dbname,
+	doc_list = couchdb_list_documents (couchdb_backend->couchdb,
+					   couchdb_backend->dbname,
 					   &error);
 	for (sl = doc_list; sl != NULL; sl = sl->next) {
 		CouchDBDocument *document;
@@ -225,8 +220,8 @@ e_book_backend_couchdb_get_contact_list (EBookBackend *backend,
 
 		/* Retrieve this document */
 		error = NULL;
-		document = couchdb_document_get (couchdb_backend->priv->couchdb,
-						 couchdb_backend->priv->dbname,
+		document = couchdb_document_get (couchdb_backend->couchdb,
+						 couchdb_backend->dbname,
 						 couchdb_document_info_get_docid (doc_info),
 						 &error);
 		if (!document)
@@ -245,6 +240,44 @@ static void
 e_book_backend_couchdb_start_book_view (EBookBackend *backend,
 					EDataBookView *book_view)
 {
+	EBookBackendSExp *sexp;
+	GError *error;
+	GSList *doc_list, *sl;
+	EBookBackendCouchDB *couchdb_backend = E_BOOK_BACKEND_COUCHDB (backend);
+
+	sexp = e_data_book_view_get_card_sexp  (book_view);
+
+	/* Get the list of documents from CouchDB */
+	doc_list = couchdb_list_documents (couchdb_backend->couchdb,
+					   couchdb_backend->dbname,
+					   &error);
+	for (sl = doc_list; sl != NULL; sl = sl->next) {
+		CouchDBDocument *document;
+		char *vcard;
+		CouchDBDocumentInfo *doc_info = (CouchDBDocumentInfo *) sl->data;
+
+		/* Retrieve this document */
+		error = NULL;
+		document = couchdb_document_get (couchdb_backend->couchdb,
+						 couchdb_backend->dbname,
+						 couchdb_document_info_get_docid (doc_info),
+						 &error);
+		if (!document)
+			continue;
+
+		vcard = vcard_from_couch_document (document);
+		if (!vcard)
+			continue;
+
+		if (e_book_backend_sexp_match_vcard (sexp, (const gchar *) vcard))
+			e_data_book_view_notify_update_vcard (book_view, vcard);
+
+		g_free (vcard);
+		g_object_unref (G_OBJECT (document));
+	}
+
+	couchdb_free_document_list (doc_list);
+	e_data_book_view_notify_complete (book_view, GNOME_Evolution_Addressbook_Success);
 }
 
 static void
@@ -276,6 +309,17 @@ e_book_backend_couchdb_get_required_fields (EBookBackend *backend,
 					    EDataBook *book,
 					    guint32 opid)
 {
+	GList *fields = NULL;
+	const gchar *field_name;
+
+	field_name = e_contact_field_name (E_CONTACT_UID);
+	fields = g_list_append(fields, g_strdup(field_name));
+
+	e_data_book_respond_get_required_fields(book, opid,
+						GNOME_Evolution_Addressbook_Success, fields);
+
+	g_list_foreach (fields, (GFunc) g_free, NULL);
+	g_list_free (fields);
 }
 
 static void
@@ -283,11 +327,32 @@ e_book_backend_couchdb_get_supported_fields (EBookBackend *backend,
 					     EDataBook *book,
 					     guint32 opid)
 {
+	GList *fields = NULL;
+	gint i;
+
+	/* we support everything */
+	for (i = 1; i < E_CONTACT_FIELD_LAST; ++i)
+		fields = g_list_append (fields, g_strdup (e_contact_field_name (i)));
+
+	e_data_book_respond_get_supported_fields (book, opid,
+						  GNOME_Evolution_Addressbook_Success, fields);
+
+	g_list_foreach (fields, (GFunc) g_free, NULL);
+	g_list_free (fields);
 }
 
 static void
 e_book_backend_couchdb_get_supported_auth_methods (EBookBackend *backend, EDataBook *book, guint32 opid)
 {
+	GList *auth_methods = NULL;
+
+	auth_methods = g_list_append (auth_methods, g_strdup ("plain/password"));
+
+	e_data_book_respond_get_supported_auth_methods (book, opid,
+							GNOME_Evolution_Addressbook_Success, auth_methods);
+
+	g_list_foreach (auth_methods, (GFunc) g_free, NULL);
+	g_list_free (auth_methods);
 }
 
 static GNOME_Evolution_Addressbook_CallStatus
@@ -318,19 +383,14 @@ e_book_backend_couchdb_dispose (GObject *object)
 	couchdb_backend = E_BOOK_BACKEND_COUCHDB (object);
 
 	/* Free all memory and resources */
-	if (couchdb_backend->priv) {
-		if (couchdb_backend->priv->couchdb) {
-			g_object_unref (G_OBJECT (couchdb_backend->priv->couchdb));
-			couchdb_backend->priv->couchdb = NULL;
-		}
-
-		if (couchdb_backend->priv->dbname) {
-			g_free (couchdb_backend->priv->dbname);
-			couchdb_backend->priv->dbname = NULL;
-		}
+	if (couchdb_backend->couchdb) {
+		g_object_unref (G_OBJECT (couchdb_backend->couchdb));
+		couchdb_backend->couchdb = NULL;
+	}
 
-		g_free (couchdb_backend->priv);
-		couchdb_backend->priv = NULL;
+	if (couchdb_backend->dbname) {
+		g_free (couchdb_backend->dbname);
+		couchdb_backend->dbname = NULL;
 	}
 }
 
@@ -367,7 +427,6 @@ e_book_backend_couchdb_class_init (EBookBackendCouchDBClass *klass)
 static void
 e_book_backend_couchdb_init (EBookBackendCouchDB *backend)
 {
-	EBookBackendCouchDBPrivate *priv;
-
-	priv = g_new0 (EBookBackendCouchDBPrivate, 1);
+	backend->couchdb = NULL;
+	backend->dbname = NULL;
 }
diff --git a/addressbook/e-book-backend-couchdb.h b/addressbook/e-book-backend-couchdb.h
index 2e23496..b1bc93a 100644
--- a/addressbook/e-book-backend-couchdb.h
+++ b/addressbook/e-book-backend-couchdb.h
@@ -24,7 +24,8 @@
 #ifndef __E_BOOK_BACKEND_COUCHDB_H__
 #define __E_BOOK_BACKEND_COUCHDB_H__
 
-#include <libedata-book/e-book-backend-sync.h>
+#include <couchdb-glib.h>
+#include <libedata-book/e-book-backend.h>
 
 #define E_TYPE_BOOK_BACKEND_COUCHDB        (e_book_backend_couchdb_get_type ())
 #define E_BOOK_BACKEND_COUCHDB(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_BOOK_BACKEND_COUCHDB, EBookBackendCouchDB))
@@ -32,11 +33,12 @@
 #define E_IS_BOOK_BACKEND_COUCHDB(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_BOOK_BACKEND_COUCHDB))
 #define E_IS_BOOK_BACKEND_COUCHDB_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_BOOK_BACKEND_COUCHDB))
 #define E_BOOK_BACKEND_COUCHDB_GET_CLASS(k) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_BOOK_BACKEND_COUCHDB, EBookBackenCouchDBClass))
-typedef struct _EBookBackendCouchDBPrivate EBookBackendCouchDBPrivate;
 
 typedef struct {
 	EBookBackend parent_object;
-	EBookBackendCouchDBPrivate *priv;
+
+	CouchDB *couchdb;
+	char *dbname;
 } EBookBackendCouchDB;
 
 typedef struct {



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