diff options
| author | Christophe Dumez <christophe.dumez@intel.com> | 2011-06-21 16:26:58 +0300 |
|---|---|---|
| committer | Christophe Dumez <christophe.dumez@intel.com> | 2011-06-21 16:26:58 +0300 |
| commit | a66d6bcc8883fe0203d1117f3d0364244941fb68 (patch) | |
| tree | 2f09a4595c87c23b214eeb415ba97dd90540c166 | |
| parent | 89782e3924430d6d262c8d42c0e0c243b2d09a17 (diff) | |
| download | evolution-data-server-a66d6bcc8883fe0203d1117f3d0364244941fb68.tar.gz | |
Fix "avoid initial notifications" functionality
The file backend does need to notify the view so that it can
update its hash table of ids. The filtering needs to be done in
EDataBookView instead, AFTER the hash table is updated.
This way, the functionality does not require any change in the
backend and works for all backends.
Bug report:
https://bugzilla.gnome.org/show_bug.cgi?id=652171
| -rw-r--r-- | addressbook/backends/file/e-book-backend-file.c | 17 | ||||
| -rw-r--r-- | addressbook/libedata-book/e-data-book-view.c | 16 |
2 files changed, 18 insertions, 15 deletions
diff --git a/addressbook/backends/file/e-book-backend-file.c b/addressbook/backends/file/e-book-backend-file.c index efb7047c7..a65e126e2 100644 --- a/addressbook/backends/file/e-book-backend-file.c +++ b/addressbook/backends/file/e-book-backend-file.c @@ -803,21 +803,12 @@ static void e_book_backend_file_start_book_view (EBookBackend *backend, EDataBookView *book_view) { - FileBackendSearchClosure *closure; - EBookViewFlags flags; - - /* Start a thread and send all the initial notifications if appropriate */ - flags = e_data_book_view_get_flags (book_view); - if ((flags & E_BOOK_VIEW_NOTIFY_INITIAL) != 0) { - d(printf ("starting book view thread\n")); + FileBackendSearchClosure *closure = init_closure (book_view, E_BOOK_BACKEND_FILE (backend)); - closure = init_closure (book_view, E_BOOK_BACKEND_FILE (backend)); - closure->thread = g_thread_create (book_view_thread, book_view, TRUE, NULL); + d(printf ("starting book view thread\n")); + closure->thread = g_thread_create (book_view_thread, book_view, TRUE, NULL); - e_flag_wait (closure->running); - } - else - e_data_book_view_notify_complete (book_view, NULL /* Success */); + e_flag_wait (closure->running); /* at this point we know the book view thread is actually running */ d(printf ("returning from start_book_view\n")); diff --git a/addressbook/libedata-book/e-data-book-view.c b/addressbook/libedata-book/e-data-book-view.c index 24e124fae..b011f0cb9 100644 --- a/addressbook/libedata-book/e-data-book-view.c +++ b/addressbook/libedata-book/e-data-book-view.c @@ -53,6 +53,7 @@ struct _EDataBookViewPrivate { EBookViewFlags flags; gboolean running; + gboolean complete; GMutex *pending_mutex; GArray *adds; @@ -108,6 +109,7 @@ book_destroyed_cb (gpointer data, GObject *dead) if (priv->running) { e_book_backend_stop_book_view (priv->backend, view); priv->running = FALSE; + priv->complete = FALSE; } } @@ -225,12 +227,17 @@ notify_remove (EDataBookView *view, gchar *id) static void notify_add (EDataBookView *view, const gchar *id, gchar *vcard) { + EBookViewFlags flags; EDataBookViewPrivate *priv = view->priv; send_pending_changes (view); send_pending_removes (view); - if (priv->adds->len == THRESHOLD_ITEMS) { - send_pending_adds (view); + /* Do not send contact add notifications during initial stage */ + flags = e_data_book_view_get_flags (view); + if (priv->complete || (flags & E_BOOK_VIEW_NOTIFY_INITIAL) != 0) { + if (priv->adds->len == THRESHOLD_ITEMS) { + send_pending_adds (view); + } } g_array_append_val (priv->adds, vcard); @@ -438,6 +445,8 @@ e_data_book_view_notify_complete (EDataBookView *book_view, const GError *error) if (!priv->running) return; + /* View is complete */ + priv->complete = TRUE; g_mutex_lock (priv->pending_mutex); @@ -515,6 +524,7 @@ bookview_idle_start (gpointer data) EDataBookView *book_view = data; book_view->priv->running = TRUE; + book_view->priv->complete = FALSE; book_view->priv->idle_id = 0; e_book_backend_start_book_view (book_view->priv->backend, book_view); @@ -540,6 +550,7 @@ bookview_idle_stop (gpointer data) e_book_backend_stop_book_view (book_view->priv->backend, book_view); book_view->priv->running = FALSE; + book_view->priv->complete = FALSE; book_view->priv->idle_id = 0; return FALSE; @@ -596,6 +607,7 @@ e_data_book_view_init (EDataBookView *book_view) g_signal_connect (priv->gdbus_object, "handle-dispose", G_CALLBACK (impl_DataBookView_dispose), book_view); priv->running = FALSE; + priv->complete = FALSE; priv->pending_mutex = g_mutex_new (); priv->adds = g_array_sized_new (TRUE, TRUE, sizeof (gchar *), THRESHOLD_ITEMS); |
