diff options
| author | Milan Crha <mcrha@redhat.com> | 2008-10-17 08:22:32 +0000 |
|---|---|---|
| committer | Bharath Acharya <abharath@src.gnome.org> | 2008-10-17 08:22:32 +0000 |
| commit | efd9bf1bfb3e33e2b7dd49bad136164664f175eb (patch) | |
| tree | daa82d77a885d380d4a00887b1fa073e383edf83 /addressbook | |
| parent | 5450ce2eaa2195ade8a21c29c24748a80be25483 (diff) | |
| download | evolution-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/ChangeLog | 10 | ||||
| -rw-r--r-- | addressbook/libebook/e-book.c | 104 | ||||
| -rw-r--r-- | addressbook/libebook/e-book.h | 3 |
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); |
