diff options
-rw-r--r-- | addressbook/ChangeLog | 10 | ||||
-rw-r--r-- | addressbook/backend/ebook/e-book.c | 74 |
2 files changed, 68 insertions, 16 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index dbb085268e..3b04b46f32 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,5 +1,15 @@ 2001-06-11 Christopher James Lahey <clahey@ximian.com> + * backend/ebook/e-book.c (e_book_load_uri, + e_book_get_supported_fields, e_book_authenticate_user, + e_book_remove_card_by_id, e_book_add_vcard, e_book_commit_vcard, + e_book_get_cursor, e_book_get_book_view, e_book_get_changes): Made + it so that all of these functions queue their ops before calling + their CORBA functions. This way, if the response is sent back + before the CORBA function returns there's no problem. Added + e_book_unqueue_op so that the op could be unqueued if the CORBA + call fails. + * backend/ebook/e-book-listener.c, backend/ebook/e-book-listener.h (e_book_listener_unpop_response): Added this function to put a response back into the queue. diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c index 5217d6ef90..68a267265f 100644 --- a/addressbook/backend/ebook/e-book.c +++ b/addressbook/backend/ebook/e-book.c @@ -97,6 +97,29 @@ e_book_queue_op (EBook *book, return op->tag; } +/* + * Local response queue management. + */ +static void +e_book_unqueue_op (EBook *book) +{ + EBookOp *op; + GList *removed; + + g_print ("Unqueue Op\n"); + + removed = g_list_last (book->priv->pending_ops); + + if (removed) { + book->priv->pending_ops = g_list_remove_link (book->priv->pending_ops, + removed); + op = removed->data; + g_free (op); + g_list_free_1 (removed); + book->priv->op_tag--; + } +} + static EBookOp * e_book_pop_op (EBook *book) { @@ -498,6 +521,8 @@ e_book_load_uri (EBook *book, */ CORBA_exception_init (&ev); + e_book_queue_op (book, open_response, closure, NULL); + GNOME_Evolution_Addressbook_BookFactory_openBook ( book->priv->book_factory, uri, bonobo_object_corba_objref (BONOBO_OBJECT (book->priv->listener)), @@ -506,6 +531,7 @@ e_book_load_uri (EBook *book, if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("e_book_load_uri: CORBA exception while opening addressbook!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return FALSE; } @@ -513,8 +539,6 @@ e_book_load_uri (EBook *book, book->priv->load_state = URILoading; - e_book_queue_op (book, open_response, closure, NULL); - /* Now we play the waiting game. */ return TRUE; @@ -597,6 +621,7 @@ e_book_get_supported_fields (EBook *book, gpointer closure) { CORBA_Environment ev; + guint tag; CORBA_exception_init (&ev); @@ -605,18 +630,21 @@ e_book_get_supported_fields (EBook *book, return 0; } + tag = e_book_queue_op (book, cb, closure, NULL); + GNOME_Evolution_Addressbook_Book_getSupportedFields(book->priv->corba_book, &ev); if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("e_book_get_supported_fields: Exception " "during get_supported_fields!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return 0; } CORBA_exception_free (&ev); - return e_book_queue_op (book, cb, closure, NULL); + return tag; } static gboolean @@ -679,6 +707,8 @@ e_book_authenticate_user (EBook *book, CORBA_exception_init (&ev); + e_book_queue_op (book, cb, closure, NULL); + GNOME_Evolution_Addressbook_Book_authenticateUser (book->priv->corba_book, user, passwd, @@ -687,12 +717,11 @@ e_book_authenticate_user (EBook *book, if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("e_book_authenticate_user: Exception authenticating user with the PAS!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return; } CORBA_exception_free (&ev); - - e_book_queue_op (book, cb, closure, NULL); } /* Fetching cards */ @@ -826,6 +855,8 @@ e_book_remove_card_by_id (EBook *book, CORBA_exception_init (&ev); + e_book_queue_op (book, cb, closure, NULL); + GNOME_Evolution_Addressbook_Book_removeCard ( book->priv->corba_book, (const GNOME_Evolution_Addressbook_CardId) id, &ev); @@ -833,13 +864,12 @@ e_book_remove_card_by_id (EBook *book, g_warning ("e_book_remove_card_by_id: CORBA exception " "talking to PAS!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return FALSE; } CORBA_exception_free (&ev); - e_book_queue_op (book, cb, closure, NULL); - return TRUE; } @@ -904,19 +934,20 @@ e_book_add_vcard (EBook *book, CORBA_exception_init (&ev); + e_book_queue_op (book, (EBookCallback) cb, closure, NULL); + GNOME_Evolution_Addressbook_Book_addCard ( book->priv->corba_book, (const GNOME_Evolution_Addressbook_VCard) vcard, &ev); if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("e_book_add_vcard: Exception adding card to PAS!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return FALSE; } CORBA_exception_free (&ev); - e_book_queue_op (book, (EBookCallback) cb, closure, NULL); - return TRUE; } @@ -981,6 +1012,8 @@ e_book_commit_vcard (EBook *book, CORBA_exception_init (&ev); + e_book_queue_op (book, cb, closure, NULL); + GNOME_Evolution_Addressbook_Book_modifyCard ( book->priv->corba_book, (const GNOME_Evolution_Addressbook_VCard) vcard, &ev); @@ -988,13 +1021,12 @@ e_book_commit_vcard (EBook *book, g_warning ("e_book_commit_vcard: Exception " "modifying card in PAS!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return FALSE; } CORBA_exception_free (&ev); - e_book_queue_op (book, cb, closure, NULL); - return TRUE; } @@ -1037,6 +1069,7 @@ e_book_get_cursor (EBook *book, gpointer closure) { CORBA_Environment ev; + guint tag; g_return_val_if_fail (book != NULL, 0); g_return_val_if_fail (E_IS_BOOK (book), 0); @@ -1047,6 +1080,8 @@ e_book_get_cursor (EBook *book, } CORBA_exception_init (&ev); + + tag = e_book_queue_op (book, cb, closure, NULL); GNOME_Evolution_Addressbook_Book_getCursor (book->priv->corba_book, query, &ev); @@ -1054,14 +1089,13 @@ e_book_get_cursor (EBook *book, g_warning ("e_book_get_all_cards: Exception " "querying list of cards!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return 0; } CORBA_exception_free (&ev); - return e_book_queue_op (book, cb, closure, NULL); - - return TRUE; + return tag; } guint @@ -1072,6 +1106,7 @@ e_book_get_book_view (EBook *book, { CORBA_Environment ev; EBookViewListener *listener; + guint tag; g_return_val_if_fail (book != NULL, 0); g_return_val_if_fail (E_IS_BOOK (book), 0); @@ -1084,6 +1119,8 @@ e_book_get_book_view (EBook *book, listener = e_book_view_listener_new(); CORBA_exception_init (&ev); + + tag = e_book_queue_op (book, cb, closure, listener); GNOME_Evolution_Addressbook_Book_getBookView (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), query, &ev); @@ -1091,12 +1128,13 @@ e_book_get_book_view (EBook *book, g_warning ("e_book_get_book_view: Exception " "getting book_view!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return 0; } CORBA_exception_free (&ev); - return e_book_queue_op (book, cb, closure, listener); + return tag; } guint @@ -1107,6 +1145,7 @@ e_book_get_changes (EBook *book, { CORBA_Environment ev; EBookViewListener *listener; + guint tag; g_return_val_if_fail (book != NULL, 0); g_return_val_if_fail (E_IS_BOOK (book), 0); @@ -1119,6 +1158,8 @@ e_book_get_changes (EBook *book, listener = e_book_view_listener_new(); CORBA_exception_init (&ev); + + tag = e_book_queue_op (book, cb, closure, listener); GNOME_Evolution_Addressbook_Book_getChanges (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), changeid, &ev); @@ -1126,12 +1167,13 @@ e_book_get_changes (EBook *book, g_warning ("e_book_changes: Exception " "getting changes!\n"); CORBA_exception_free (&ev); + e_book_unqueue_op (book); return 0; } CORBA_exception_free (&ev); - return e_book_queue_op (book, cb, closure, listener); + return tag; } /** |