aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
authorJP Rosevear <jpr@helixcode.com>2000-11-01 03:20:31 +0800
committerJP Rosevear <jpr@src.gnome.org>2000-11-01 03:20:31 +0800
commitb3a536d46bfc6f4ed4524ec6252abfcea2f97423 (patch)
treef327398c9f76da31d1248890f5781af95aa34fef /addressbook/backend
parentae91213c361f16e5f132024dce23718f035a8c27 (diff)
downloadgsoc2013-evolution-b3a536d46bfc6f4ed4524ec6252abfcea2f97423.tar.gz
gsoc2013-evolution-b3a536d46bfc6f4ed4524ec6252abfcea2f97423.tar.zst
gsoc2013-evolution-b3a536d46bfc6f4ed4524ec6252abfcea2f97423.zip
Let the warning make sense (compute_pid): remove
2000-10-31 JP Rosevear <jpr@helixcode.com> * conduit/address-conduit.c (cursor_cb): Let the warning make sense (compute_pid): remove (local_record_from_ecard): Create local record from ecard - not finished (local_record_from_uid): Obtain local_record from uid with the proper e-book way (set_status_cleared): Add empty callback (add_archive_record): kill (delete_archive_record): kill (archive_record): Add empty callback (conduit_get_gpilot_conduit): Update signal connects * backend/pas/pas-backend-file.c (vcard_change_type): Function to determine the type of change - not finished (pas_backend_file_search_changes): Create a view and callback based on how the cards have changed (pas_backend_file_process_get_changes): Implement the get changes operation for files (pas_backend_file_process_client_requests): Add GetChanges method for processing * backend/pas/pas-book.c (pas_book_queue_get_changes): Add changes to the list (impl_Evolution_Book_get_changes): implement object method (pas_book_get_epv): Add get changes to epv (pas_book_respond_get_changes): Respond to the get changes operation * backend/pas/pas-book.h: Add GetChanges PASOperation * backend/idl/addressbook.idl: add get_changes and respond_get_changes methods * backend/ebook/e-book.c (e_book_get_changes): Client function to a view of the changed objects * backend/ebook/e-book.h: New prototype 2000-10-31 JP Rosevear <jpr@helixcode.com> * conduits/todo/todo-conduit.h: Remove add/del/mod hashes and add changed_hash. * conduits/calendar/calendar-conduit.h: ditto * conduits/todo/todo-conduit.c (next_changed_item): Utility function to get the next "really" changed item (changed status can be cleared now) (compute_status): Compute status based on changed_hash (pre_sync): Fill changed_hash and counts adds/mods/dels (set_status_cleared): New callback handler - avoid double syncing (for_each_modified): Use next_changed_item to iterate (add_archive_record): kill (delete_archive_record): kill (archive_record): New callback handler - mark/unmark archive status (conduit_get_gpilot_conduit): Adjust signal connects * conduits/calendar/calendar-conduit.c: ditto svn path=/trunk/; revision=6297
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/ebook/e-book.c36
-rw-r--r--addressbook/backend/ebook/e-book.h5
-rw-r--r--addressbook/backend/idl/addressbook.idl4
-rw-r--r--addressbook/backend/pas/pas-backend-file.c157
-rw-r--r--addressbook/backend/pas/pas-book.c64
-rw-r--r--addressbook/backend/pas/pas-book.h4
6 files changed, 269 insertions, 1 deletions
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c
index bb0226eb5a..32103fc9df 100644
--- a/addressbook/backend/ebook/e-book.c
+++ b/addressbook/backend/ebook/e-book.c
@@ -909,6 +909,42 @@ gboolean e_book_get_book_view (EBook *book,
return TRUE;
}
+gboolean e_book_get_changes (EBook *book,
+ gchar *changeid,
+ EBookBookViewCallback cb,
+ gpointer closure)
+{
+ CORBA_Environment ev;
+ EBookViewListener *listener;
+
+ g_return_val_if_fail (book != NULL, FALSE);
+ g_return_val_if_fail (E_IS_BOOK (book), FALSE);
+
+ if (book->priv->load_state != URILoaded) {
+ g_warning ("e_book_get_changes: No URI loaded!\n");
+ return FALSE;
+ }
+
+ listener = e_book_view_listener_new();
+
+ CORBA_exception_init (&ev);
+
+ Evolution_Book_get_changes (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), changeid, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_warning ("e_book_changes: Exception "
+ "getting changes!\n");
+ CORBA_exception_free (&ev);
+ return FALSE;
+ }
+
+ CORBA_exception_free (&ev);
+
+ e_book_queue_op (book, cb, closure, listener);
+
+ return TRUE;
+}
+
/**
* e_book_get_name:
*/
diff --git a/addressbook/backend/ebook/e-book.h b/addressbook/backend/ebook/e-book.h
index 29f3787f66..3c3f2bc65b 100644
--- a/addressbook/backend/ebook/e-book.h
+++ b/addressbook/backend/ebook/e-book.h
@@ -107,6 +107,11 @@ gboolean e_book_get_book_view (EBook *book,
EBookBookViewCallback cb,
gpointer closure);
+gboolean e_book_get_changes (EBook *book,
+ char *changeid,
+ EBookBookViewCallback cb,
+ gpointer closure);
+
/* Getting the name of the repository. */
char *e_book_get_name (EBook *book);
diff --git a/addressbook/backend/idl/addressbook.idl b/addressbook/backend/idl/addressbook.idl
index e520621858..2c5a54487e 100644
--- a/addressbook/backend/idl/addressbook.idl
+++ b/addressbook/backend/idl/addressbook.idl
@@ -83,6 +83,8 @@ module Evolution {
*/
void get_book_view(in BookViewListener listener, in string query);
+ void get_changes(in BookViewListener listener, in string changeid);
+
void check_connection ();
string get_static_capabilities ();
@@ -115,6 +117,8 @@ module Evolution {
void respond_get_view (in CallStatus status, in BookView view);
+ void respond_get_changes (in CallStatus status, in BookView view);
+
/**
* report_connection_status:
*
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index a54d32d424..84a21d4c6f 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -485,6 +485,104 @@ pas_backend_file_search (PASBackendFile *bf,
g_list_free (cards);
}
+typedef enum {
+ VCardChangeNone,
+ VCardChangeAdded,
+ VCardChangeModified,
+ VCardChangeDeleted
+} VCardChangeType;
+
+static VCardChangeType
+vcard_change_type (const PASBackendFileBookView *view, char *vcard_string)
+{
+ ECard *card;
+
+ card = e_card_new (vcard_string);
+ view->search_context->card = e_card_simple_new (card);
+ gtk_object_unref(GTK_OBJECT(card));
+
+ /* if it's not a valid vcard why is it in our db? :) */
+ if (!view->search_context->card)
+ return VCardChangeNone;
+
+ /* FIX ME, actually need to implement this */
+
+ gtk_object_unref(GTK_OBJECT(view->search_context->card));
+
+ return VCardChangeNone;
+}
+
+static void
+pas_backend_file_search_changes (PASBackendFile *bf,
+ PASBook *book,
+ const PASBackendFileBookView *cnstview)
+{
+ int db_error = 0;
+ GList *add_cards = NULL;
+ GList *mod_cards = NULL;
+ GList *del_cards = NULL;
+ DB *db = bf->priv->file_db;
+ DBT id_dbt, vcard_dbt;
+ PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview;
+
+ if (!bf->priv->loaded)
+ return;
+
+ db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
+
+ while (db_error == 0) {
+
+ /* don't include the version in the list of cards */
+ if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1
+ || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
+ char *vcard_string = vcard_dbt.data;
+
+ /* check what type of change has occurred, if any */
+ switch (vcard_change_type (view, vcard_string)) {
+ case VCardChangeNone:
+ break;
+ case VCardChangeAdded:
+ add_cards = g_list_append (add_cards, strdup(vcard_string));
+ break;
+ case VCardChangeModified:
+ mod_cards = g_list_append (mod_cards, strdup(vcard_string));
+ break;
+ case VCardChangeDeleted:
+ del_cards = g_list_append (del_cards, strdup(vcard_string));
+ break;
+ }
+ }
+
+ db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
+ }
+
+ if (db_error == -1) {
+ g_warning ("pas_backend_file_search_changes: error building list\n");
+ } else {
+ GList *l;
+
+ pas_book_view_notify_add (view->book_view, add_cards);
+ pas_book_view_notify_change (view->book_view, mod_cards);
+
+ for (l = del_cards; l != NULL; l = l->next){
+ char *card = l->data;
+ pas_book_view_notify_remove (view->book_view, card);
+ }
+
+ pas_book_view_notify_complete (view->book_view);
+ }
+
+ /*
+ ** It's fine to do this now since the data has been handed off.
+ */
+ g_list_foreach (add_cards, (GFunc)g_free, NULL);
+ g_list_foreach (mod_cards, (GFunc)g_free, NULL);
+ g_list_foreach (del_cards, (GFunc)g_free, NULL);
+ g_list_free (add_cards);
+ g_list_free (mod_cards);
+ g_list_free (del_cards);
+}
+
static char *
do_create(PASBackend *backend,
char *vcard_req,
@@ -848,6 +946,61 @@ pas_backend_file_process_get_book_view (PASBackend *backend,
}
static void
+pas_backend_file_process_get_changes (PASBackend *backend,
+ PASBook *book,
+ PASRequest *req)
+{
+ PASBackendFile *bf = PAS_BACKEND_FILE (backend);
+ CORBA_Environment ev;
+ PASBookView *book_view;
+ Evolution_Book corba_book;
+ PASBackendFileBookView view;
+ PASBackendFileSearchContext ctx;
+ EIterator *iterator;
+
+ g_return_if_fail (req->listener != NULL);
+
+ corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book));
+
+ CORBA_exception_init(&ev);
+
+ Evolution_Book_ref(corba_book, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_warning("pas_backend_file_process_get_book_view: Exception reffing "
+ "corba book.\n");
+ }
+
+ CORBA_exception_free(&ev);
+
+ book_view = pas_book_view_new (req->listener);
+
+ gtk_signal_connect(GTK_OBJECT(book_view), "destroy",
+ GTK_SIGNAL_FUNC(view_destroy), book);
+
+ pas_book_respond_get_changes (book,
+ (book_view != NULL
+ ? Evolution_BookListener_Success
+ : Evolution_BookListener_CardNotFound /* XXX */),
+ book_view);
+
+ view.book_view = book_view;
+ view.search = req->search;
+ view.search_sexp = NULL;
+ view.search_context = &ctx;
+ ctx.card = NULL;
+
+ e_list_append(bf->priv->book_views, &view);
+
+ iterator = e_list_get_iterator(bf->priv->book_views);
+ e_iterator_last(iterator);
+ pas_backend_file_search_changes (bf, book, e_iterator_get(iterator));
+ gtk_object_unref(GTK_OBJECT(iterator));
+
+ g_free(req->search);
+}
+
+static void
pas_backend_file_process_check_connection (PASBackend *backend,
PASBook *book,
PASRequest *req)
@@ -932,6 +1085,10 @@ pas_backend_file_process_client_requests (PASBook *book)
case GetBookView:
pas_backend_file_process_get_book_view (backend, book, req);
break;
+
+ case GetChanges:
+ pas_backend_file_process_get_changes (backend, book, req);
+ break;
}
g_free (req);
diff --git a/addressbook/backend/pas/pas-book.c b/addressbook/backend/pas/pas-book.c
index 4cd51237a1..6a8c17a584 100644
--- a/addressbook/backend/pas/pas-book.c
+++ b/addressbook/backend/pas/pas-book.c
@@ -130,6 +130,30 @@ pas_book_queue_get_book_view (PASBook *book, const Evolution_BookViewListener li
}
static void
+pas_book_queue_get_changes (PASBook *book, const Evolution_BookViewListener listener, const char *search)
+{
+ PASRequest *req;
+ CORBA_Environment ev;
+
+ req = g_new0 (PASRequest, 1);
+ req->op = GetChanges;
+ req->search = g_strdup(search);
+
+ CORBA_exception_init (&ev);
+
+ req->listener = CORBA_Object_duplicate(listener, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_warning ("pas_book_queue_get_changes: Exception "
+ "duplicating BookViewListener!\n");
+ }
+
+ CORBA_exception_free (&ev);
+
+ pas_book_queue_request (book, req);
+}
+
+static void
pas_book_queue_check_connection (PASBook *book)
{
PASRequest *req;
@@ -233,6 +257,17 @@ impl_Evolution_Book_get_book_view (PortableServer_Servant servant,
}
static void
+impl_Evolution_Book_get_changes (PortableServer_Servant servant,
+ const Evolution_BookViewListener listener,
+ const CORBA_char *search,
+ CORBA_Environment *ev)
+{
+ PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant));
+
+ pas_book_queue_get_changes (book, listener, search);
+}
+
+static void
impl_Evolution_Book_check_connection (PortableServer_Servant servant,
CORBA_Environment *ev)
{
@@ -442,7 +477,7 @@ pas_book_respond_get_cursor (PASBook *book,
}
/**
- * pas_book_respond_get_cursor:
+ * pas_book_respond_get_book_view:
*/
void
pas_book_respond_get_book_view (PASBook *book,
@@ -468,6 +503,32 @@ pas_book_respond_get_book_view (PASBook *book,
}
/**
+ * pas_book_respond_get_changes:
+ */
+void
+pas_book_respond_get_changes (PASBook *book,
+ Evolution_BookListener_CallStatus status,
+ PASBookView *book_view)
+{
+ CORBA_Environment ev;
+ CORBA_Object object;
+
+ CORBA_exception_init (&ev);
+
+ object = bonobo_object_corba_objref(BONOBO_OBJECT(book_view));
+
+ Evolution_BookListener_respond_get_changes (
+ book->priv->listener, status, object, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION) {
+ g_warning ("pas_book_respond_get_changes: Exception "
+ "responding to BookListener!\n");
+ }
+
+ CORBA_exception_free (&ev);
+}
+
+/**
* pas_book_report_connection:
*/
void
@@ -622,6 +683,7 @@ pas_book_get_epv (void)
epv->get_static_capabilities = impl_Evolution_Book_get_static_capabilities;
epv->get_cursor = impl_Evolution_Book_get_cursor;
epv->get_book_view = impl_Evolution_Book_get_book_view;
+ epv->get_changes = impl_Evolution_Book_get_changes;
return epv;
diff --git a/addressbook/backend/pas/pas-book.h b/addressbook/backend/pas/pas-book.h
index 9ca81eb25d..ab59d7bb3e 100644
--- a/addressbook/backend/pas/pas-book.h
+++ b/addressbook/backend/pas/pas-book.h
@@ -29,6 +29,7 @@ typedef enum {
ModifyCard,
GetCursor,
GetBookView,
+ GetChanges,
CheckConnection
} PASOperation;
@@ -80,6 +81,9 @@ void pas_book_respond_get_cursor (PASBook
void pas_book_respond_get_book_view (PASBook *book,
Evolution_BookListener_CallStatus status,
PASBookView *book_view);
+void pas_book_respond_get_changes (PASBook *book,
+ Evolution_BookListener_CallStatus status,
+ PASBookView *book_view);
void pas_book_report_connection (PASBook *book,
gboolean connected);