diff options
author | Chris Toshok <toshok@ximian.com> | 2003-02-08 17:05:42 +0800 |
---|---|---|
committer | Chris Toshok <toshok@src.gnome.org> | 2003-02-08 17:05:42 +0800 |
commit | aaa6c778e8c8458e107f564d12f1089880810f04 (patch) | |
tree | 19ac67dfd11ad7b236f93cfe2b04e9d5a6064bf3 /addressbook/backend/ebook/e-book.c | |
parent | 5d961e94b2009211f6e7069ee80c7bd448556446 (diff) | |
download | gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar.gz gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar.bz2 gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar.lz gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar.xz gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.tar.zst gsoc2013-evolution-aaa6c778e8c8458e107f564d12f1089880810f04.zip |
[ huge change, all for 1 little performance problem :) fixes #18207 ] use
2003-02-08 Chris Toshok <toshok@ximian.com>
[ huge change, all for 1 little performance problem :) fixes #18207 ]
* gui/widgets/e-addressbook-model.c (get_view): use
e_book_check_static_capability here to make things a little
prettier.
(remove_card): complain about my life, and add code to use one
"model_changed" signal if we get back a list of cards instead of
multiple "card_removed" signals.
* gui/widgets/e-addressbook-model.h: little clean up.
* gui/widgets/e-addressbook-view.c (delete): write a bulk-remove
case for this. if the backend supports it, send all the ids at
once. otherwise loop over the ids.
(e_addressbook_view_delete_selection): fake a CardAndBook
structure and call delete, instead of duplicating the code in 2
places.
* gui/component/addressbook.c (delete_contact_cb): don't call
e_contact_editor_confirm_delete here, it's handled by the
EAddressbookView.
* backend/pas/pas-card-cursor.c (pas_card_cursor_construct): fix a
compiler warning about a stupid crash.
* backend/pas/pas-book.h (PASOperation): RemoveCard ->
RemoveCards.
(PASRemoveCardsReques): char *id -> GList *ids.
(PASRequest): PASRemoveCardRequest -> PASRemoveCardsRequest.
* backend/pas/pas-book.c (pas_book_queue_remove_cards): build up a
GList from the id sequence.
(pas_book_respond_remove): notifyCardRemoved ->
notifyCardsRemoved.
(impl_GNOME_Evolution_Addressbook_Book_removeCards): rename.
(pas_book_free_request): free the idlist for RemoveCards.
(pas_book_class_init): removeCard -> removeCards.
* backend/pas/pas-book-view.h: change prototype for
pas_book_view_notify_remove, and add prototype for
pas_book_view_notify_remove_1.
* backend/pas/pas-book-view.c (pas_book_view_notify_remove_1):
build up a list and call pas_book_view_notify_remove.
(pas_book_view_notify_remove): build up the corba id sequence and
call BookViewListener::notifyCardsRemoved.
* backend/pas/pas-backend.h: remove_card -> remove_cards.
* backend/pas/pas-backend.c (pas_backend_remove_cards): rename
from _remove_card.
(process_client_requests): RemoveCard -> RemoveCards and
_remove_card -> _remove_cards.
* backend/pas/pas-backend-ldap.c (check_schema_support):
g_strcasecmp -> g_ascii_strcasecmp.
(remove_card_handler): _remove => _remove_1.
(modify_card_modify_handler): same.
(pas_backend_ldap_process_remove_cards): rename from _remove_card.
(pas_backend_ldap_class_init): _remove_card -> _remove_cards.
* backend/pas/pas-backend-file.c (pas_backend_file_class_init):
remove_card -> remove_cards.
(pas_backend_file_get_static_capabilities): add "bulk-removes".
(pas_backend_file_process_remove_cards): rewrite this function
largely, so that it handles lists of ids. first we loop through
and for every successful deletion we build a list of deleted
ECards. Then for each view we build a list (a subset of the
deleted ECard list) and pass back that list to the view.
(pas_backend_file_process_modify_card): use _remove_1 instead of
_remove.
(ecard_matches_search): new function.
* backend/pas/pas-backend-card-sexp.c
(pas_backend_card_sexp_match_vcard): rewrite in terms of
_match_ecard.
(pas_backend_card_sexp_match_ecard): new function, the guts from
_match_vcard.
* backend/pas/pas-backend-card-sexp.h: add prototype for
pas_backend_card_sexp_match_ecard.
* backend/idl/addressbook.idl: the card removal stuff now takes
CardIdList.
* backend/ebook/e-book.c (e_book_get_static_capabilities): cache
successful capability queries (since they're static).
(e_book_check_static_capability): new, convenience function to
check if a particular capability is supported.
(e_book_remove_card_by_id): build a single element GList and call
e_book_remove_cards.
(e_book_remove_cards): build up a CORBA sequence from the GList
and call Book::removeCards.
(e_book_dispose): free the cached capabilities string.
* backend/ebook/e-book.h: add new prototypes for
e_book_check_static_capability and e_book_remove_cards.
* backend/ebook/e-book-view.h (struct _EBookViewClass): rename
"card_removed" signal to "cards_removed".
* backend/ebook/e-book-view.c (e_book_view_do_removed_event): id
-> ids, and free the id list.
(e_book_view_check_listener_queue): CardRemovedEvent ->
CardsRemovedEvent.
* backend/ebook/e-book-view-listener.c
(e_book_view_listener_queue_response): free the id list.
(e_book_view_listener_queue_idlist_event): new function, used for
cards_removed.
(e_book_view_listener_queue_status_event): id -> ids.
(e_book_view_listener_queue_sequence_event): same.
(e_book_view_listener_queue_message_event): same.
(impl_BookViewListener_notify_cards_removed): call
queue_idlist_event.
(e_book_view_listener_dispose): free the id list.
(e_book_view_listener_class_init): track change to idl call.
* backend/ebook/e-book-view-listener.h
(EBookViewListenerOperation): CardRemovedEvent ->
CardsRemovedEvent.
(EBookViewListenerResponse): char *id -> GList *ids.
* backend/ebook/e-book-listener.c
(impl_BookListener_respond_remove_cards): rename from remove_card.
svn path=/trunk/; revision=19853
Diffstat (limited to 'addressbook/backend/ebook/e-book.c')
-rw-r--r-- | addressbook/backend/ebook/e-book.c | 97 |
1 files changed, 77 insertions, 20 deletions
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c index fff07bcfb9..7cdca25d95 100644 --- a/addressbook/backend/ebook/e-book.c +++ b/addressbook/backend/ebook/e-book.c @@ -35,6 +35,9 @@ struct _EBookPrivate { GList *book_factories; GList *iter; + char *cap; + gboolean cap_queried; + EBookListener *listener; EComponentListener *comp_listener; @@ -836,32 +839,52 @@ e_book_get_uri (EBook *book) char * e_book_get_static_capabilities (EBook *book) { - CORBA_Environment ev; - char *temp; - char *ret_val; + if (!book->priv->cap_queried) { + CORBA_Environment ev; + char *temp; - CORBA_exception_init (&ev); + CORBA_exception_init (&ev); - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_unload_uri: No URI is loaded!\n"); - return g_strdup(""); - } + if (book->priv->load_state != URILoaded) { + g_warning ("e_book_unload_uri: No URI is loaded!\n"); + return g_strdup(""); + } - temp = GNOME_Evolution_Addressbook_Book_getStaticCapabilities(book->priv->corba_book, &ev); + temp = GNOME_Evolution_Addressbook_Book_getStaticCapabilities(book->priv->corba_book, &ev); + + if (ev._major != CORBA_NO_EXCEPTION) { + g_warning ("e_book_get_static_capabilities: Exception " + "during get_static_capabilities!\n"); + CORBA_exception_free (&ev); + return g_strdup(""); + } + + book->priv->cap = g_strdup(temp); + book->priv->cap_queried = TRUE; + + CORBA_free(temp); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_static_capabilities: Exception " - "during get_static_capabilities!\n"); CORBA_exception_free (&ev); - return g_strdup(""); } - ret_val = g_strdup(temp); - CORBA_free(temp); + return g_strdup (book->priv->cap); +} - CORBA_exception_free (&ev); +gboolean +e_book_check_static_capability (EBook *book, const char *cap) +{ + gboolean rv = FALSE; + char *caps = e_book_get_static_capabilities (book); + if (!caps) + return FALSE; + + /* XXX this is an inexact test but it works for our use */ + if (strstr (caps, cap)) + rv = TRUE; + + g_free (caps); - return ret_val; + return rv; } guint @@ -1077,11 +1100,32 @@ e_book_remove_card_by_id (EBook *book, gpointer closure) { + GList *list = NULL; + gboolean rv; + + list = g_list_prepend (list, (char*)id); + + rv = e_book_remove_cards (book, list, cb, closure); + + g_list_free (list); + + return rv; +} + +gboolean +e_book_remove_cards (EBook *book, + GList *ids, + EBookCallback cb, + gpointer closure) +{ + GNOME_Evolution_Addressbook_CardIdList idlist; CORBA_Environment ev; + GList *l; + int num_ids, i; g_return_val_if_fail (book != NULL, FALSE); g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (id != NULL, FALSE); + g_return_val_if_fail (ids != NULL, FALSE); if (book->priv->load_state != URILoaded) { g_warning ("e_book_remove_card_by_id: No URI loaded!\n"); @@ -1092,8 +1136,16 @@ e_book_remove_card_by_id (EBook *book, e_book_queue_op (book, cb, closure, NULL); - GNOME_Evolution_Addressbook_Book_removeCard ( - book->priv->corba_book, (const GNOME_Evolution_Addressbook_CardId) id, &ev); + num_ids = g_list_length (ids); + idlist._buffer = CORBA_sequence_GNOME_Evolution_Addressbook_CardId_allocbuf (num_ids); + idlist._maximum = num_ids; + idlist._length = num_ids; + + for (l = ids, i = 0; l; l=l->next, i ++) { + idlist._buffer[i] = CORBA_string_dup (l->data); + } + + GNOME_Evolution_Addressbook_Book_removeCards (book->priv->corba_book, &idlist, &ev); if (ev._major != CORBA_NO_EXCEPTION) { g_warning ("e_book_remove_card_by_id: CORBA exception " @@ -1105,9 +1157,12 @@ e_book_remove_card_by_id (EBook *book, CORBA_exception_free (&ev); + CORBA_free(idlist._buffer); + return TRUE; } + /* Adding cards. */ /** @@ -1557,6 +1612,8 @@ e_book_dispose (GObject *object) book->priv->comp_listener = NULL; } + g_free (book->priv->cap); + g_free (book->priv->uri); g_free (book->priv); |