aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/pas/pas-backend-file.c92
1 files changed, 88 insertions, 4 deletions
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index ad5679c7e1..93e92df76a 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -1,3 +1,4 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Author:
* Nat Friedman (nat@helixcode.com)
@@ -6,6 +7,7 @@
*/
#include <gtk/gtksignal.h>
+#include <fcntl.h>
#include <db.h>
#include <pas-backend-file.h>
@@ -16,6 +18,7 @@ static PASBackendClass *pas_backend_file_parent_class;
struct _PASBackendFilePrivate {
GList *clients;
gboolean loaded;
+ DB *file_db;
};
static void
@@ -23,8 +26,24 @@ pas_backend_file_process_create_card (PASBackend *backend,
PASBook *book,
PASRequest *req)
{
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+ DB *db = bf->priv->file_db;
+ DBT id_dbt, vcard_dbt;
+ int db_error;
+
+ id_dbt.data = "foo"; /* XXX create unique id here */
+ id_dbt.size = strlen(id_dbt.data);
+
+ vcard_dbt.data = (void*)req->vcard;
+ vcard_dbt.size = strlen(req->vcard);
+
+ db_error = db->put(db, &id_dbt, &vcard_dbt, 0);
+
pas_book_respond_create (
- book, Evolution_BookListener_Success);
+ book,
+ (db_error == 0
+ ? Evolution_BookListener_Success
+ : Evolution_BookListener_CardNotFound));
g_free (req->vcard);
}
@@ -34,8 +53,21 @@ pas_backend_file_process_remove_card (PASBackend *backend,
PASBook *book,
PASRequest *req)
{
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+ DB *db = bf->priv->file_db;
+ DBT id_dbt;
+ int db_error;
+
+ id_dbt.data = (void*)req->id;
+ id_dbt.size = strlen(req->id);
+
+ db_error = db->del(db, &id_dbt, 0);
+
pas_book_respond_remove (
- book, Evolution_BookListener_Success);
+ book,
+ (db_error == 0
+ ? Evolution_BookListener_Success
+ : Evolution_BookListener_CardNotFound));
g_free (req->id);
}
@@ -45,8 +77,24 @@ pas_backend_file_process_modify_card (PASBackend *backend,
PASBook *book,
PASRequest *req)
{
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+ DB *db = bf->priv->file_db;
+ DBT id_dbt, vcard_dbt;
+ int db_error;
+
+ id_dbt.data = (void*)req->id;
+ id_dbt.size = strlen(req->id);
+
+ vcard_dbt.data = (void*)req->vcard;
+ vcard_dbt.size = strlen(req->vcard);
+
+ db_error = db->put(db, &id_dbt, &vcard_dbt, 0);
+
pas_book_respond_modify (
- book, Evolution_BookListener_Success);
+ book,
+ (db_error == 0
+ ? Evolution_BookListener_Success
+ : Evolution_BookListener_CardNotFound));
g_free (req->vcard);
}
@@ -56,7 +104,9 @@ pas_backend_file_process_check_connection (PASBackend *backend,
PASBook *book,
PASRequest *req)
{
- pas_book_report_connection (book, TRUE);
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+
+ pas_book_report_connection (book, bf->priv->file_db != NULL);
}
static void
@@ -104,6 +154,31 @@ pas_backend_file_book_destroy_cb (PASBook *book)
static char *
pas_backend_file_get_vcard (PASBook *book, const char *id)
{
+ PASBackendFile *bf;
+ DBT id_dbt, vcard_dbt;
+ DB *db;
+ int db_error;
+
+ bf = PAS_BACKEND_FILE (pas_book_get_backend (book));
+ db = bf->priv->file_db;
+
+ id_dbt.data = (void*)id;
+ id_dbt.size = strlen(id);
+
+ db_error = db->get(db, &id_dbt, &vcard_dbt, 0);
+ if (db_error == 0) {
+ /* success */
+ return g_strndup(vcard_dbt.data, vcard_dbt.size);
+ }
+ else if (db_error == 1) {
+ /* key was not in file */
+ return g_strdup(""); /* XXX */
+ }
+ else /* if (db_error < 0)*/ {
+ /* error */
+ return g_strdup(""); /* XXX */
+ }
+
return g_strdup ("blah blah blah");
}
@@ -125,6 +200,15 @@ pas_backend_file_load_uri (PASBackend *backend,
g_assert (bf->priv->loaded == FALSE);
filename = pas_backend_file_extract_path_from_uri (uri);
+
+ bf->priv->file_db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL);
+
+ if (bf->priv->file_db != NULL)
+ bf->priv->loaded = TRUE;
+ else
+ g_warning("pas_backend_file_load_uri failed for '%s'\n", filename);
+
+ g_free (filename);
}
static void