summaryrefslogtreecommitdiff
path: root/addressbook
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2008-10-17 08:22:32 +0000
committerBharath Acharya <abharath@src.gnome.org>2008-10-17 08:22:32 +0000
commitefd9bf1bfb3e33e2b7dd49bad136164664f175eb (patch)
treedaa82d77a885d380d4a00887b1fa073e383edf83 /addressbook
parent5450ce2eaa2195ade8a21c29c24748a80be25483 (diff)
downloadevolution-data-server-efd9bf1bfb3e33e2b7dd49bad136164664f175eb.tar.gz
** Part of fix for bug #364542
2008-10-17 Milan Crha <mcrha@redhat.com> ** Part of fix for bug #364542 * libebook/e-book.c: (e_book_new_op), (e_book_get_current_sync_op): Do set opid to 0 for sync operations, thus we will find it later. * libebook/e-book.h: (e_book_cancel_async_op): * libebook/e-book.c: (e_book_cancel_async_op), (do_cancel), (e_book_cancel): Be able to cancel async op too (at least any). svn path=/trunk/; revision=9686
Diffstat (limited to 'addressbook')
-rw-r--r--addressbook/ChangeLog10
-rw-r--r--addressbook/libebook/e-book.c104
-rw-r--r--addressbook/libebook/e-book.h3
3 files changed, 82 insertions, 35 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index d2d0751cf..f519ded1c 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,13 @@
+2008-10-17 Milan Crha <mcrha@redhat.com>
+
+ ** Part of fix for bug #364542
+
+ * libebook/e-book.c: (e_book_new_op), (e_book_get_current_sync_op):
+ Do set opid to 0 for sync operations, thus we will find it later.
+ * libebook/e-book.h: (e_book_cancel_async_op):
+ * libebook/e-book.c: (e_book_cancel_async_op), (do_cancel),
+ (e_book_cancel): Be able to cancel async op too (at least any).
+
2008-09-29 Milan Crha <mcrha@redhat.com>
** Part of fix for bug #497928
diff --git a/addressbook/libebook/e-book.c b/addressbook/libebook/e-book.c
index 7611540de..18e028377 100644
--- a/addressbook/libebook/e-book.c
+++ b/addressbook/libebook/e-book.c
@@ -176,7 +176,10 @@ e_book_new_op (EBook *book, gboolean sync)
op->flag = e_flag_new ();
op->synchronous = sync;
- op->opid = book->priv->current_op_id++;
+ if (sync)
+ op->opid = 0;
+ else
+ op->opid = book->priv->current_op_id++;
g_hash_table_insert (book->priv->id_to_op,
&op->opid, op);
@@ -194,9 +197,7 @@ e_book_get_op (EBook *book, int opid)
static EBookOp*
e_book_get_current_sync_op (EBook *book)
{
- guint32 opid = 0;
- return (EBookOp*)g_hash_table_lookup (book->priv->id_to_op,
- &opid);
+ return e_book_get_op (book, 0);
}
static void
@@ -2487,6 +2488,47 @@ e_book_response_generic (EBook *book,
g_mutex_unlock (book->priv->mutex);
}
+static gboolean
+do_cancel (EBook *book, GError **error, EBookOp *op, const char *func_name)
+{
+ EBookStatus status;
+ gboolean rv;
+ CORBA_Environment ev;
+
+ if (op == NULL) {
+ g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_COULD_NOT_CANCEL,
+ _("%s: there is no current operation"), func_name);
+ return FALSE;
+ }
+
+ status = GNOME_Evolution_Addressbook_Book_cancelOperation(book->priv->corba_book, &ev);
+
+ if (ev._major != CORBA_NO_EXCEPTION) {
+
+ CORBA_exception_free (&ev);
+
+ g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_CORBA_EXCEPTION,
+ _("CORBA exception making \"%s\" call"),
+ "Book::cancelOperation");
+ return FALSE;
+ }
+
+ CORBA_exception_free (&ev);
+
+ if (status == E_BOOK_ERROR_OK) {
+ op->status = E_BOOK_ERROR_CANCELLED;
+ e_flag_set (op->flag);
+ rv = TRUE;
+ }
+ else {
+ g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_COULD_NOT_CANCEL,
+ _("%s: could not cancel"), func_name);
+ rv = FALSE;
+ }
+
+ return rv;
+}
+
/**
* e_book_cancel:
* @book: an #EBook
@@ -2509,51 +2551,43 @@ e_book_cancel (EBook *book,
GError **error)
{
EBookOp *op;
- EBookStatus status;
- gboolean rv;
- CORBA_Environment ev;
e_return_error_if_fail (book && E_IS_BOOK (book), E_BOOK_ERROR_INVALID_ARG, FALSE);
g_mutex_lock (book->priv->mutex);
-
- if (e_book_get_current_sync_op (book) == NULL) {
- g_mutex_unlock (book->priv->mutex);
- g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_COULD_NOT_CANCEL,
- _("%s: there is no current operation"), "e_book_cacnel");
- return FALSE;
- }
-
op = e_book_get_current_sync_op (book);
-
g_mutex_unlock (book->priv->mutex);
- status = GNOME_Evolution_Addressbook_Book_cancelOperation(book->priv->corba_book, &ev);
+ return do_cancel (book, error, op, "e_book_cancel");
+}
- if (ev._major != CORBA_NO_EXCEPTION) {
+/**
+ * e_book_cancel_async_op:
+ * Similar to above e_book_cancel function, only cancels last, still running,
+ * asynchronous operation.
+ **/
+gboolean
+e_book_cancel_async_op (EBook *book, GError **error)
+{
+ EBookOp *op;
+ guint32 opid;
- CORBA_exception_free (&ev);
+ e_return_error_if_fail (book && E_IS_BOOK (book), E_BOOK_ERROR_INVALID_ARG, FALSE);
- g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_CORBA_EXCEPTION,
- _("CORBA exception making \"%s\" call"),
- "Book::cancelOperation");
- return FALSE;
- }
+ g_mutex_lock (book->priv->mutex);
- CORBA_exception_free (&ev);
+ /* find nearest unfinished async op to cancel */
+ op = NULL;
+ for (opid = book->priv->current_op_id; opid > 0 && !op; opid--) {
+ op = e_book_get_op (book, opid);
- if (status == E_BOOK_ERROR_OK) {
- op->status = E_BOOK_ERROR_CANCELLED;
- e_flag_set (op->flag);
- rv = TRUE;
- }
- else {
- g_set_error (error, E_BOOK_ERROR, E_BOOK_ERROR_COULD_NOT_CANCEL,
- _("%s: could not cancel"), "e_book_cancel");
- rv = FALSE;
+ if (op && op->synchronous)
+ op = NULL;
}
- return rv;
+ g_mutex_unlock (book->priv->mutex);
+
+ return do_cancel (book, error, op, "e_book_cancel_async_op");
}
diff --git a/addressbook/libebook/e-book.h b/addressbook/libebook/e-book.h
index e7dc40be5..823457251 100644
--- a/addressbook/libebook/e-book.h
+++ b/addressbook/libebook/e-book.h
@@ -241,6 +241,9 @@ gboolean e_book_is_online (EBook *book);
gboolean e_book_cancel (EBook *book,
GError **error);
+gboolean e_book_cancel_async_op (EBook *book,
+ GError **error);
+
/* Identity */
gboolean e_book_get_self (EContact **contact, EBook **book, GError **error);
gboolean e_book_set_self (EBook *book, EContact *contact, GError **error);