aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/ebook/e-book-types.h1
-rw-r--r--addressbook/backend/ebook/e-book.c134
-rw-r--r--addressbook/backend/ebook/e-book.h13
3 files changed, 105 insertions, 43 deletions
diff --git a/addressbook/backend/ebook/e-book-types.h b/addressbook/backend/ebook/e-book-types.h
index 2ce1956080..d7eee35ede 100644
--- a/addressbook/backend/ebook/e-book-types.h
+++ b/addressbook/backend/ebook/e-book-types.h
@@ -23,6 +23,7 @@ typedef enum {
E_BOOK_STATUS_PERMISSION_DENIED,
E_BOOK_STATUS_CARD_NOT_FOUND,
E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED,
+ E_BOOK_STATUS_CANCELLED,
E_BOOK_STATUS_OTHER_ERROR
} EBookStatus;
diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c
index 25fb42a37b..c603f94743 100644
--- a/addressbook/backend/ebook/e-book.c
+++ b/addressbook/backend/ebook/e-book.c
@@ -44,8 +44,7 @@ struct _EBookPrivate {
*/
GList *pending_ops;
- guint sq_tag;
- GList *sq_pending;
+ guint op_tag;
};
enum {
@@ -58,6 +57,8 @@ enum {
static guint e_book_signals [LAST_SIGNAL];
typedef struct {
+ guint tag;
+ gboolean active;
gpointer cb;
gpointer closure;
EBookViewListener *listener;
@@ -66,7 +67,7 @@ typedef struct {
/*
* Local response queue management.
*/
-static void
+static guint
e_book_queue_op (EBook *book,
gpointer cb,
gpointer closure,
@@ -75,12 +76,16 @@ e_book_queue_op (EBook *book,
EBookOp *op;
op = g_new0 (EBookOp, 1);
+ op->tag = book->priv->op_tag++;
+ op->active = TRUE;
op->cb = cb;
op->closure = closure;
op->listener = listener;
book->priv->pending_ops =
g_list_append (book->priv->pending_ops, op);
+
+ return op->tag;
}
static EBookOp *
@@ -104,6 +109,23 @@ e_book_pop_op (EBook *book)
return op;
}
+static gboolean
+e_book_cancel_op (EBook *book, guint tag)
+{
+ GList *iter;
+ gboolean cancelled = FALSE;
+
+ for (iter = book->priv->pending_ops; iter != NULL && !cancelled; iter = g_list_next (iter)) {
+ EBookOp *op = iter->data;
+ if (op->tag == tag) {
+ op->active = FALSE;
+ cancelled = TRUE;
+ }
+ }
+
+ return cancelled;
+}
+
static void
e_book_do_response_create_card (EBook *book,
EBookListenerResponse *resp)
@@ -161,8 +183,12 @@ e_book_do_response_get_cursor (EBook *book,
cursor = e_card_cursor_new(resp->cursor);
- if (op->cb)
- ((EBookCursorCallback) op->cb) (book, resp->status, cursor, op->closure);
+ if (op->cb) {
+ if (op->active)
+ ((EBookCursorCallback) op->cb) (book, resp->status, cursor, op->closure);
+ else
+ ((EBookCursorCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
+ }
/*
* Release the remote GNOME_Evolution_Addressbook_Book in the PAS.
@@ -209,12 +235,19 @@ e_book_do_response_get_view (EBook *book,
"in local op queue!\n");
return;
}
-
+
book_view = e_book_view_new(resp->book_view, op->listener);
- if (op->cb)
- ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure);
-
+ /* Only execute the callback if the operation is still flagged as active (i.e. hasn't
+ been cancelled. This is mildly wasteful since we unnecessaryily create the
+ book_view, etc... but I'm leery of tinkering with the CORBA magic. */
+ if (op->cb) {
+ if (op->active)
+ ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure);
+ else
+ ((EBookBookViewCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
+ }
+
/*
* Release the remote GNOME_Evolution_Addressbook_Book in the PAS.
*/
@@ -262,8 +295,12 @@ e_book_do_response_get_changes (EBook *book,
book_view = e_book_view_new (resp->book_view, op->listener);
- if (op->cb)
- ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure);
+ if (op->cb) {
+ if (op->active)
+ ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure);
+ else
+ ((EBookBookViewCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
+ }
/*
* Release the remote GNOME_Evolution_Addressbook_BookView in the PAS.
@@ -358,8 +395,13 @@ e_book_do_response_get_supported_fields (EBook *book,
return;
}
- if (op->cb)
- ((EBookFieldsCallback) op->cb) (book, resp->status, resp->fields, op->closure);
+ if (op->cb) {
+ if (op->active)
+ ((EBookFieldsCallback) op->cb) (book, resp->status, resp->fields, op->closure);
+ else
+ ((EBookFieldsCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure);
+ }
+
g_free (op);
}
@@ -559,7 +601,7 @@ e_book_get_static_capabilities (EBook *book)
return ret_val;
}
-gboolean
+guint
e_book_get_supported_fields (EBook *book,
EBookFieldsCallback cb,
gpointer closure)
@@ -570,7 +612,7 @@ e_book_get_supported_fields (EBook *book,
if (book->priv->load_state != URILoaded) {
g_warning ("e_book_unload_uri: No URI is loaded!\n");
- return FALSE;
+ return 0;
}
GNOME_Evolution_Addressbook_Book_getSupportedFields(book->priv->corba_book, &ev);
@@ -579,14 +621,12 @@ e_book_get_supported_fields (EBook *book,
g_warning ("e_book_get_supported_fields: Exception "
"during get_supported_fields!\n");
CORBA_exception_free (&ev);
- return FALSE;
+ return 0;
}
CORBA_exception_free (&ev);
- e_book_queue_op (book, cb, closure, NULL);
-
- return TRUE;
+ return e_book_queue_op (book, cb, closure, NULL);
}
static gboolean
@@ -1000,7 +1040,7 @@ e_book_check_connection (EBook *book)
return TRUE;
}
-gboolean
+guint
e_book_get_cursor (EBook *book,
gchar *query,
EBookCursorCallback cb,
@@ -1008,12 +1048,12 @@ e_book_get_cursor (EBook *book,
{
CORBA_Environment ev;
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
+ g_return_val_if_fail (book != NULL, 0);
+ g_return_val_if_fail (E_IS_BOOK (book), 0);
if (book->priv->load_state != URILoaded) {
g_warning ("e_book_check_connection: No URI loaded!\n");
- return FALSE;
+ return 0;
}
CORBA_exception_init (&ev);
@@ -1024,17 +1064,17 @@ e_book_get_cursor (EBook *book,
g_warning ("e_book_get_all_cards: Exception "
"querying list of cards!\n");
CORBA_exception_free (&ev);
- return FALSE;
+ return 0;
}
CORBA_exception_free (&ev);
- e_book_queue_op (book, cb, closure, NULL);
+ return e_book_queue_op (book, cb, closure, NULL);
return TRUE;
}
-gboolean
+guint
e_book_get_book_view (EBook *book,
gchar *query,
EBookBookViewCallback cb,
@@ -1043,12 +1083,12 @@ e_book_get_book_view (EBook *book,
CORBA_Environment ev;
EBookViewListener *listener;
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
+ g_return_val_if_fail (book != NULL, 0);
+ g_return_val_if_fail (E_IS_BOOK (book), 0);
if (book->priv->load_state != URILoaded) {
g_warning ("e_book_get_book_view: No URI loaded!\n");
- return FALSE;
+ return 0;
}
listener = e_book_view_listener_new();
@@ -1061,17 +1101,15 @@ e_book_get_book_view (EBook *book,
g_warning ("e_book_get_book_view: Exception "
"getting book_view!\n");
CORBA_exception_free (&ev);
- return FALSE;
+ return 0;
}
CORBA_exception_free (&ev);
- e_book_queue_op (book, cb, closure, listener);
-
- return TRUE;
+ return e_book_queue_op (book, cb, closure, listener);
}
-gboolean
+guint
e_book_get_changes (EBook *book,
gchar *changeid,
EBookBookViewCallback cb,
@@ -1080,8 +1118,8 @@ e_book_get_changes (EBook *book,
CORBA_Environment ev;
EBookViewListener *listener;
- g_return_val_if_fail (book != NULL, FALSE);
- g_return_val_if_fail (E_IS_BOOK (book), FALSE);
+ g_return_val_if_fail (book != NULL, 0);
+ g_return_val_if_fail (E_IS_BOOK (book), 0);
if (book->priv->load_state != URILoaded) {
g_warning ("e_book_get_changes: No URI loaded!\n");
@@ -1098,14 +1136,31 @@ e_book_get_changes (EBook *book,
g_warning ("e_book_changes: Exception "
"getting changes!\n");
CORBA_exception_free (&ev);
- return FALSE;
+ return 0;
}
CORBA_exception_free (&ev);
- e_book_queue_op (book, cb, closure, listener);
+ return e_book_queue_op (book, cb, closure, listener);
+}
- return TRUE;
+/**
+ * e_book_cancel
+ */
+
+void
+e_book_cancel (EBook *book, guint tag)
+{
+ g_return_if_fail (book != NULL);
+ g_return_if_fail (E_IS_BOOK (book));
+ g_return_if_fail (tag != 0);
+
+ /* In an attempt to be useful, we take a bit of extra care in reporting
+ errors. This might come in handy someday. */
+ if (tag >= book->priv->op_tag)
+ g_warning ("Attempt to cancel unassigned operation (%u)", tag);
+ else if (! e_book_cancel_op (book, tag))
+ g_warning ("Attempt to cancel unknown operation (%u)", tag);
}
/**
@@ -1154,6 +1209,7 @@ e_book_init (EBook *book)
{
book->priv = g_new0 (EBookPrivate, 1);
book->priv->load_state = URINotLoaded;
+ book->priv->op_tag = 1;
}
static void
diff --git a/addressbook/backend/ebook/e-book.h b/addressbook/backend/ebook/e-book.h
index 9e25c9d9a5..72efb7250c 100644
--- a/addressbook/backend/ebook/e-book.h
+++ b/addressbook/backend/ebook/e-book.h
@@ -62,7 +62,7 @@ void e_book_unload_uri (EBook *book);
char *e_book_get_static_capabilities (EBook *book);
-gboolean e_book_get_supported_fields (EBook *book,
+guint e_book_get_supported_fields (EBook *book,
EBookFieldsCallback cb,
gpointer closure);
@@ -112,21 +112,26 @@ gboolean e_book_commit_vcard (EBook *book,
/* Checking to see if we're connected to the card repository. */
gboolean e_book_check_connection (EBook *book);
-gboolean e_book_get_cursor (EBook *book,
+guint e_book_get_cursor (EBook *book,
char *query,
EBookCursorCallback cb,
gpointer closure);
-gboolean e_book_get_book_view (EBook *book,
+guint e_book_get_book_view (EBook *book,
char *query,
EBookBookViewCallback cb,
gpointer closure);
-gboolean e_book_get_changes (EBook *book,
+guint e_book_get_changes (EBook *book,
char *changeid,
EBookBookViewCallback cb,
gpointer closure);
+/* Cancel a pending operation. */
+void e_book_cancel (EBook *book,
+ guint tag);
+
+
/* Getting the name of the repository. */
char *e_book_get_name (EBook *book);