aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend/pas/pas-backend-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend/pas/pas-backend-file.c')
-rw-r--r--addressbook/backend/pas/pas-backend-file.c93
1 files changed, 82 insertions, 11 deletions
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index 20de42808c..e2ca9a7348 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -33,6 +33,7 @@ typedef struct _PASBackendFileSearchContext PASBackendFileSearchContext;
struct _PASBackendFilePrivate {
GList *clients;
gboolean loaded;
+ char *uri;
DB *file_db;
GList *book_views;
};
@@ -825,11 +826,11 @@ pas_backend_file_process_client_requests (PASBook *book)
}
static void
-pas_backend_file_book_destroy_cb (PASBook *book)
+pas_backend_file_book_destroy_cb (PASBook *book, gpointer data)
{
PASBackendFile *backend;
- backend = PAS_BACKEND_FILE (pas_book_get_backend (book));
+ backend = PAS_BACKEND_FILE (data);
pas_backend_remove_client (PAS_BACKEND (backend), book);
}
@@ -924,7 +925,7 @@ pas_backend_file_maybe_upgrade_db (PASBackendFile *bf)
return ret_val;
}
-static void
+static gboolean
pas_backend_file_load_uri (PASBackend *backend,
const char *uri)
{
@@ -937,18 +938,45 @@ pas_backend_file_load_uri (PASBackend *backend,
bf->priv->file_db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL);
+ g_free (filename);
+
if (bf->priv->file_db != NULL) {
if (pas_backend_file_maybe_upgrade_db (bf))
bf->priv->loaded = TRUE;
/* XXX what if we fail to upgrade it? */
+
+ bf->priv->uri = g_strdup (uri);
+ } else {
+ GList *l;
+
+ for (l = bf->priv->clients; l; l = l->next) {
+ PASBook *book;
+
+ book = PAS_BOOK (l->data);
+ pas_book_respond_open (book, Evolution_BookListener_OtherError);
+ }
+
+ return FALSE;
}
- else
- g_warning ("pas_backend_file_load_uri failed for '%s'\n", filename);
- g_free (filename);
+ return TRUE;
}
-static void
+/* Get_uri handler for the addressbook file backend */
+static const char *
+pas_backend_file_get_uri (PASBackend *backend)
+{
+ PASBackendFile *bf;
+
+ bf = PAS_BACKEND_FILE (backend);
+
+ g_return_val_if_fail (bf->priv->loaded, NULL);
+ g_assert (bf->priv->uri != NULL);
+
+ return bf->priv->uri;
+}
+
+static gboolean
pas_backend_file_add_client (PASBackend *backend,
Evolution_BookListener listener)
{
@@ -964,10 +992,15 @@ pas_backend_file_add_client (PASBackend *backend,
backend, listener,
pas_backend_file_get_vcard);
- g_assert (book != NULL);
+ if (!book) {
+ if (!bf->priv->clients)
+ pas_backend_last_client_gone (backend);
+
+ return FALSE;
+ }
gtk_signal_connect (GTK_OBJECT (book), "destroy",
- pas_backend_file_book_destroy_cb, NULL);
+ pas_backend_file_book_destroy_cb, backend);
gtk_signal_connect (GTK_OBJECT (book), "requests_queued",
pas_backend_file_process_client_requests, NULL);
@@ -983,18 +1016,46 @@ pas_backend_file_add_client (PASBackend *backend,
pas_book_respond_open (
book, Evolution_BookListener_Success);
}
+
+ return TRUE;
}
static void
pas_backend_file_remove_client (PASBackend *backend,
PASBook *book)
{
+ PASBackendFile *bf;
+ GList *l;
+ PASBook *lbook;
+
g_return_if_fail (backend != NULL);
- g_return_if_fail (PAS_IS_BACKEND (backend));
+ g_return_if_fail (PAS_IS_BACKEND_FILE (backend));
g_return_if_fail (book != NULL);
g_return_if_fail (PAS_IS_BOOK (book));
- g_warning ("pas_backend_file_remove_client: Unimplemented!\n");
+ bf = PAS_BACKEND_FILE (backend);
+
+ /* Find the book in the list of clients */
+
+ for (l = bf->priv->clients; l; l = l->next) {
+ lbook = PAS_BOOK (l->data);
+
+ if (lbook == book)
+ break;
+ }
+
+ g_assert (l != NULL);
+
+ /* Disconnect */
+
+ bf->priv->clients = g_list_remove_link (bf->priv->clients, l);
+ g_list_free_1 (l);
+
+ /* When all clients go away, notify the parent factory about it so that
+ * it may decide whether to kill the backend or not.
+ */
+ if (!bf->priv->clients)
+ pas_backend_last_client_gone (backend);
}
static gboolean
@@ -1031,6 +1092,15 @@ pas_backend_file_new (void)
static void
pas_backend_file_destroy (GtkObject *object)
{
+ PASBackendFile *bf;
+
+ bf = PAS_BACKEND_FILE (object);
+
+ if (bf->priv->uri) {
+ g_free (bf->priv->uri);
+ bf->priv->uri = NULL;
+ }
+
GTK_OBJECT_CLASS (pas_backend_file_parent_class)->destroy (object);
}
@@ -1046,6 +1116,7 @@ pas_backend_file_class_init (PASBackendFileClass *klass)
/* Set the virtual methods. */
parent_class->load_uri = pas_backend_file_load_uri;
+ parent_class->get_uri = pas_backend_file_get_uri;
parent_class->add_client = pas_backend_file_add_client;
parent_class->remove_client = pas_backend_file_remove_client;