[evolution-couchdb] Added views methods and some fixes in EBookBackend class
- From: Rodrigo Moya <rodrigo src gnome org>
- To: svn-commits-list gnome org
- Subject: [evolution-couchdb] Added views methods and some fixes in EBookBackend class
- Date: Thu, 18 Jun 2009 11:14:41 -0400 (EDT)
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]