diff options
author | Milan Crha <mcrha@redhat.com> | 2011-06-14 14:54:20 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2011-06-14 14:54:20 +0800 |
commit | 38790d8478e906a5c59d0c4a5216f297f305bfeb (patch) | |
tree | 0f9a96db2765901f2a27b68c84815a491214ecc1 | |
parent | 08af0d1f81a4e983bb49d8fb8fe74e670adbb8f6 (diff) | |
download | gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar.gz gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar.bz2 gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar.lz gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar.xz gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.tar.zst gsoc2013-evolution-38790d8478e906a5c59d0c4a5216f297f305bfeb.zip |
Do not use deprecated EBook/ECal API
187 files changed, 4828 insertions, 4763 deletions
diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c index b636190777..4088837f90 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ b/addressbook/gui/contact-editor/e-contact-editor.c @@ -35,7 +35,7 @@ #include <gdk-pixbuf/gdk-pixbuf.h> #include <libebook/e-address-western.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-categories-dialog.h> #include <libedataserverui/e-category-completion.h> #include <libedataserverui/e-source-combo-box.h> @@ -107,8 +107,8 @@ static EABEditorClass *parent_class = NULL; /* The arguments we take */ enum { PROP_0, - PROP_SOURCE_BOOK, - PROP_TARGET_BOOK, + PROP_SOURCE_CLIENT, + PROP_TARGET_CLIENT, PROP_CONTACT, PROP_IS_NEW_CONTACT, PROP_EDITABLE, @@ -213,7 +213,7 @@ e_contact_editor_contact_added (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error adding contact"), error); @@ -227,7 +227,7 @@ e_contact_editor_contact_modified (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error modifying contact"), error); @@ -241,7 +241,7 @@ e_contact_editor_contact_deleted (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error removing contact"), error); @@ -305,22 +305,22 @@ e_contact_editor_class_init (EContactEditorClass *klass) g_object_class_install_property ( object_class, - PROP_SOURCE_BOOK, + PROP_SOURCE_CLIENT, g_param_spec_object ( - "source_book", - "Source Book", + "source_client", + "Source EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( object_class, - PROP_TARGET_BOOK, + PROP_TARGET_CLIENT, g_param_spec_object ( - "target_book", - "Target Book", + "target_client", + "Target EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -346,21 +346,19 @@ e_contact_editor_class_init (EContactEditorClass *klass) g_object_class_install_property ( object_class, PROP_WRITABLE_FIELDS, - g_param_spec_object ( + g_param_spec_pointer ( "writable_fields", "Writable Fields", NULL, - E_TYPE_LIST, G_PARAM_READWRITE)); g_object_class_install_property ( object_class, PROP_REQUIRED_FIELDS, - g_param_spec_object ( + g_param_spec_pointer ( "required_fields", "Required Fields", NULL, - E_TYPE_LIST, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -394,9 +392,8 @@ entry_activated (EContactEditor *editor) static gboolean is_field_supported (EContactEditor *editor, EContactField field_id) { - EList *fields; + GSList *fields, *iter; const gchar *field; - EIterator *iter; fields = editor->writable_fields; if (!fields) @@ -406,10 +403,8 @@ is_field_supported (EContactEditor *editor, EContactField field_id) if (!field) return FALSE; - for (iter = e_list_get_iterator (fields); - e_iterator_is_valid (iter); - e_iterator_next (iter)) { - const gchar *this_field = e_iterator_get (iter); + for (iter = fields; iter; iter = iter->next) { + const gchar *this_field = iter->data; if (!this_field) continue; @@ -692,7 +687,7 @@ fill_in_source_field (EContactEditor *editor) { GtkWidget *source_menu; - if (!editor->target_book) + if (!editor->target_client) return; source_menu = e_builder_get_widget ( @@ -700,7 +695,7 @@ fill_in_source_field (EContactEditor *editor) e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (source_menu), - e_book_get_source (editor->target_book)); + e_client_get_source (E_CLIENT (editor->target_client))); } static void @@ -2976,25 +2971,27 @@ init_all (EContactEditor *editor) } static void -contact_editor_book_loaded_cb (ESource *source, +contact_editor_book_loaded_cb (GObject *source_object, GAsyncResult *result, - EContactEditor *editor) + gpointer user_data) { - EBook *book; + ESource *source = E_SOURCE (source_object); + EContactEditor *editor = user_data; + EClient *client = NULL; GError *error = NULL; - book = e_load_book_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_warn_if_fail (book == NULL); + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { + g_warn_if_fail (client == NULL); g_error_free (error); - goto exit; - } else if (error != NULL) { GtkWidget *source_combo_box; GtkWindow *parent; - g_warn_if_fail (book == NULL); + g_warn_if_fail (client == NULL); parent = eab_editor_get_window (EAB_EDITOR (editor)); eab_load_error_dialog (GTK_WIDGET (parent), NULL, source, error); @@ -3005,17 +3002,18 @@ contact_editor_book_loaded_cb (ESource *source, E_SOURCE_COMBO_BOX (source_combo_box), source); g_error_free (error); - goto exit; - } + } else { + EBookClient *book_client; - g_return_if_fail (E_IS_BOOK (book)); + book_client = E_BOOK_CLIENT (client); + g_return_if_fail (book_client != NULL); - /* FIXME Write a private contact_editor_set_target_book(). */ - g_object_set (editor, "target_book", book, NULL); + /* FIXME Write a private contact_editor_set_target_client(). */ + g_object_set (editor, "target_client", book_client, NULL); - g_object_unref (book); + g_object_unref (book_client); + } -exit: g_object_unref (editor); } @@ -3034,20 +3032,19 @@ source_changed (ESourceComboBox *source_combo_box, EContactEditor *editor) editor->cancellable = NULL; } - if (e_source_equal (e_book_get_source (editor->target_book), source)) + if (e_source_equal (e_client_get_source (E_CLIENT (editor->target_client)), source)) return; - if (e_source_equal (e_book_get_source (editor->source_book), source)) { - g_object_set (editor, "target_book", editor->source_book, NULL); + if (e_source_equal (e_client_get_source (E_CLIENT (editor->source_client)), source)) { + g_object_set (editor, "target_client", editor->source_client, NULL); return; } editor->cancellable = g_cancellable_new (); - e_load_book_source_async ( - source, parent, editor->cancellable, - (GAsyncReadyCallback) contact_editor_book_loaded_cb, - g_object_ref (editor)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, editor->cancellable, + e_client_utils_authenticate_handler, parent, + contact_editor_book_loaded_cb, g_object_ref (editor)); } static void @@ -3348,10 +3345,15 @@ typedef struct { } EditorCloseStruct; static void -contact_moved_cb (EBook *book, const GError *error, EditorCloseStruct *ecs) +contact_removed_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EditorCloseStruct *ecs = user_data; EContactEditor *ce = ecs->ce; gboolean should_close = ecs->should_close; + GError *error = NULL; + + e_book_client_remove_contact_finish (book_client, result, &error); gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; @@ -3364,44 +3366,43 @@ contact_moved_cb (EBook *book, const GError *error, EditorCloseStruct *ecs) if (should_close) { eab_editor_close (EAB_EDITOR (ce)); - } - else { + } else { ce->changed = FALSE; - g_object_ref (ce->target_book); - g_object_unref (ce->source_book); - ce->source_book = ce->target_book; + g_object_ref (ce->target_client); + g_object_unref (ce->source_client); + ce->source_client = ce->target_client; sensitize_all (ce); } + if (error) + g_error_free (error); + g_object_unref (ce); g_free (ecs->new_id); g_free (ecs); } static void -contact_added_cb (EBook *book, - const GError *error, - const gchar *id, - EditorCloseStruct *ecs) +contact_added_cb (EBookClient *book_client, const GError *error, const gchar *id, gpointer closure) { + EditorCloseStruct *ecs = closure; EContactEditor *ce = ecs->ce; gboolean should_close = ecs->should_close; - if (ce->source_book != ce->target_book && e_book_is_writable (ce->source_book) && + if (ce->source_client != ce->target_client && !e_client_is_readonly (E_CLIENT (ce->source_client)) && !error && ce->is_new_contact == FALSE) { ecs->new_id = g_strdup (id); - e_book_remove_contact_async ( - ce->source_book, ce->contact, - (EBookAsyncCallback) contact_moved_cb, ecs); + e_book_client_remove_contact ( + ce->source_client, ce->contact, NULL, contact_removed_cb, ecs); return; } gtk_widget_set_sensitive (ce->app, TRUE); ce->in_async_call = FALSE; - e_contact_set (ce->contact, E_CONTACT_UID, (gchar *) id); + e_contact_set (ce->contact, E_CONTACT_UID, id); eab_editor_contact_added (EAB_EDITOR (ce), error, ce->contact); @@ -3410,8 +3411,7 @@ contact_added_cb (EBook *book, if (should_close) { eab_editor_close (EAB_EDITOR (ce)); - } - else { + } else { ce->changed = FALSE; sensitize_all (ce); } @@ -3422,8 +3422,9 @@ contact_added_cb (EBook *book, } static void -contact_modified_cb (EBook *book, const GError *error, EditorCloseStruct *ecs) +contact_modified_cb (EBookClient *book_client, const GError *error, gpointer closure) { + EditorCloseStruct *ecs = closure; EContactEditor *ce = ecs->ce; gboolean should_close = ecs->should_close; @@ -3446,6 +3447,20 @@ contact_modified_cb (EBook *book, const GError *error, EditorCloseStruct *ecs) g_free (ecs); } +static void +contact_modified_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EBookClient *book_client = E_BOOK_CLIENT (source_object); + GError *error = NULL; + + e_book_client_modify_contact_finish (book_client, result, &error); + + contact_modified_cb (book_client, error, user_data); + + if (error) + g_error_free (error); +} + /* Emits the signal to request saving a contact */ static void real_save_contact (EContactEditor *ce, gboolean should_close) @@ -3461,23 +3476,24 @@ real_save_contact (EContactEditor *ce, gboolean should_close) gtk_widget_set_sensitive (ce->app, FALSE); ce->in_async_call = TRUE; - if (ce->source_book != ce->target_book) { + if (ce->source_client != ce->target_client) { /* Two-step move; add to target, then remove from source */ eab_merging_book_add_contact ( - ce->target_book, ce->contact, - (EBookIdAsyncCallback) contact_added_cb, ecs); + ce->target_client, ce->contact, + contact_added_cb, ecs); } else { if (ce->is_new_contact) eab_merging_book_add_contact ( - ce->target_book, ce->contact, - (EBookIdAsyncCallback) contact_added_cb, ecs); + ce->target_client, ce->contact, + contact_added_cb, ecs); else if (ce->check_merge) - eab_merging_book_commit_contact ( - ce->target_book, ce->contact, - (EBookAsyncCallback) contact_modified_cb, ecs); + eab_merging_book_modify_contact ( + ce->target_client, ce->contact, + contact_modified_cb, ecs); else - e_book_commit_contact_async (ce->target_book, ce->contact, - (EBookAsyncCallback) contact_modified_cb, ecs); + e_book_client_modify_contact ( + ce->target_client, ce->contact, NULL, + contact_modified_ready_cb, ecs); } } @@ -3488,10 +3504,10 @@ save_contact (EContactEditor *ce, gboolean should_close) const gchar *name_entry_string, *file_as_entry_string, *company_name_string; GtkWidget *entry_fullname, *entry_file_as, *company_name; - if (!ce->target_book) + if (!ce->target_client) return; - if (ce->target_editable && !e_book_is_writable (ce->source_book)) { + if (ce->target_editable && e_client_is_readonly (E_CLIENT (ce->source_client))) { if (e_alert_run_dialog_for_args ( GTK_WINDOW (ce->app), "addressbook:prompt-move", @@ -3592,7 +3608,7 @@ e_contact_editor_is_valid (EABEditor *editor) EContactEditor *ce = E_CONTACT_EDITOR (editor); GtkWidget *widget; gboolean validation_error = FALSE; - EIterator *iter; + GSList *iter; GString *errmsg = g_string_new (_("The contact data is invalid:\n\n")); widget = e_builder_get_widget (ce->builder, "dateedit-birthday"); @@ -3610,11 +3626,8 @@ e_contact_editor_is_valid (EABEditor *editor) validation_error = TRUE; } - iter = e_list_get_iterator (ce->required_fields); - for (e_iterator_last (iter); - e_iterator_is_valid (iter); - e_iterator_prev (iter)) { - const gchar *field_name = e_iterator_get (iter); + for (iter = ce->required_fields; iter; iter = iter->next) { + const gchar *field_name = iter->data; EContactField field_id = e_contact_field_id (field_name); if (is_non_string_field (field_id)) { @@ -3967,11 +3980,11 @@ e_contact_editor_dispose (GObject *object) } if (e_contact_editor->writable_fields) { - g_object_unref (e_contact_editor->writable_fields); + e_client_util_free_string_slist (e_contact_editor->writable_fields); e_contact_editor->writable_fields = NULL; } if (e_contact_editor->required_fields) { - g_object_unref (e_contact_editor->required_fields); + e_client_util_free_string_slist (e_contact_editor->required_fields); e_contact_editor->required_fields = NULL; } if (e_contact_editor->contact) { @@ -3979,17 +3992,17 @@ e_contact_editor_dispose (GObject *object) e_contact_editor->contact = NULL; } - if (e_contact_editor->source_book) { - g_object_unref (e_contact_editor->source_book); - e_contact_editor->source_book = NULL; + if (e_contact_editor->source_client) { + g_object_unref (e_contact_editor->source_client); + e_contact_editor->source_client = NULL; } - if (e_contact_editor->target_book) { + if (e_contact_editor->target_client) { g_signal_handler_disconnect ( - e_contact_editor->target_book, + e_contact_editor->target_client, e_contact_editor->target_editable_id); - g_object_unref (e_contact_editor->target_book); - e_contact_editor->target_book = NULL; + g_object_unref (e_contact_editor->target_client); + e_contact_editor->target_client = NULL; } if (e_contact_editor->name) { @@ -4012,46 +4025,78 @@ e_contact_editor_dispose (GObject *object) } static void -supported_fields_cb (EBook *book, - const GError *error, - EList *fields, - EContactEditor *ce) +supported_fields_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EContactEditor *ce = user_data; + gchar *prop_value = NULL; + GSList *fields; + GError *error = NULL; + + if (!e_client_get_backend_property_finish (E_CLIENT (book_client), result, &prop_value, &error)) + prop_value = NULL; + + if (error) { + g_debug ("%s: Failed to get supported fields: %s", G_STRFUNC, error->message); + g_error_free (error); + } + if (!g_slist_find (eab_editor_get_all_editors (), ce)) { g_warning ( "supported_fields_cb called for book that's still " "around, but contact editor that's been destroyed."); + g_free (prop_value); return; } + fields = e_client_util_parse_comma_strings (prop_value); + g_object_set (ce, "writable_fields", fields, NULL); + e_client_util_free_string_slist (fields); + g_free (prop_value); + eab_editor_show (EAB_EDITOR (ce)); sensitize_all (ce); } static void -required_fields_cb (EBook *book, - const GError *error, - EList *fields, - EContactEditor *ce) +required_fields_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EContactEditor *ce = user_data; + gchar *prop_value = NULL; + GSList *fields; + GError *error = NULL; + + if (!e_client_get_backend_property_finish (E_CLIENT (book_client), result, &prop_value, &error)) + prop_value = NULL; + + if (error) { + g_debug ("%s: Failed to get supported fields: %s", G_STRFUNC, error->message); + g_error_free (error); + } if (!g_slist_find (eab_editor_get_all_editors (), ce)) { g_warning ( "supported_fields_cb called for book that's still " "around, but contact editor that's been destroyed."); + g_free (prop_value); return; } + fields = e_client_util_parse_comma_strings (prop_value); + g_object_set (ce, "required_fields", fields, NULL); + e_client_util_free_string_slist (fields); + g_free (prop_value); } EABEditor * e_contact_editor_new (EShell *shell, - EBook *book, + EBookClient *book_client, EContact *contact, gboolean is_new_contact, gboolean editable) @@ -4059,34 +4104,29 @@ e_contact_editor_new (EShell *shell, EABEditor *editor; g_return_val_if_fail (E_IS_SHELL (shell), NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); + g_return_val_if_fail (E_IS_BOOK_CLIENT (book_client), NULL); g_return_val_if_fail (E_IS_CONTACT (contact), NULL); editor = g_object_new (E_TYPE_CONTACT_EDITOR, "shell", shell, NULL); g_object_set ( editor, - "source_book", book, + "source_client", book_client, "contact", contact, "is_new_contact", is_new_contact, "editable", editable, NULL); - if (book) - e_book_get_supported_fields_async ( - book, (EBookEListAsyncCallback) - supported_fields_cb, editor); - return editor; } static void -writable_changed (EBook *book, gboolean writable, EContactEditor *ce) +notify_readonly_cb (EBookClient *book_client, EContactEditor *ce) { gint new_target_editable; gboolean changed = FALSE; - new_target_editable = e_book_is_writable (ce->target_book); + new_target_editable = !e_client_is_readonly (E_CLIENT (ce->target_client)); if (ce->target_editable != new_target_editable) changed = TRUE; @@ -4108,41 +4148,35 @@ e_contact_editor_set_property (GObject *object, editor = E_CONTACT_EDITOR (object); switch (prop_id) { - case PROP_SOURCE_BOOK: { + case PROP_SOURCE_CLIENT: { gboolean writable; gboolean changed = FALSE; - EBook *source_book; + EBookClient *source_client; - source_book = E_BOOK (g_value_get_object (value)); + source_client = E_BOOK_CLIENT (g_value_get_object (value)); - if (source_book == editor->source_book) + if (source_client == editor->source_client) break; - if (editor->source_book) - g_object_unref (editor->source_book); + if (editor->source_client) + g_object_unref (editor->source_client); - editor->source_book = source_book; - g_object_ref (editor->source_book); + editor->source_client = source_client; + g_object_ref (editor->source_client); - if (!editor->target_book) { - editor->target_book = editor->source_book; - g_object_ref (editor->target_book); + if (!editor->target_client) { + editor->target_client = editor->source_client; + g_object_ref (editor->target_client); editor->target_editable_id = g_signal_connect ( - editor->target_book, "writable_status", - G_CALLBACK (writable_changed), editor); - - e_book_get_supported_fields_async ( - editor->target_book, - (EBookEListAsyncCallback) - supported_fields_cb, editor); - e_book_get_required_fields_async ( - editor->target_book, - (EBookEListAsyncCallback) - required_fields_cb, editor); + editor->target_client, "notify::readonly", + G_CALLBACK (notify_readonly_cb), editor); + + e_client_get_backend_property (E_CLIENT (editor->target_client), BOOK_BACKEND_PROPERTY_SUPPORTED_FIELDS, NULL, supported_fields_cb, editor); + e_client_get_backend_property (E_CLIENT (editor->target_client), BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS, NULL, required_fields_cb, editor); } - writable = e_book_is_writable (editor->target_book); + writable = !e_client_is_readonly (E_CLIENT (editor->target_client)); if (writable != editor->target_editable) { editor->target_editable = writable; changed = TRUE; @@ -4154,43 +4188,35 @@ e_contact_editor_set_property (GObject *object, break; } - case PROP_TARGET_BOOK: { + case PROP_TARGET_CLIENT: { gboolean writable; gboolean changed = FALSE; - EBook *target_book; + EBookClient *target_client; - target_book = E_BOOK (g_value_get_object (value)); + target_client = E_BOOK_CLIENT (g_value_get_object (value)); - if (target_book == editor->target_book) + if (target_client == editor->target_client) break; - if (editor->target_book) { - g_signal_handler_disconnect ( - editor->target_book, - editor->target_editable_id); - g_object_unref (editor->target_book); + if (editor->target_client) { + g_signal_handler_disconnect (editor->target_client, editor->target_editable_id); + g_object_unref (editor->target_client); } - editor->target_book = target_book; - g_object_ref (editor->target_book); + editor->target_client = target_client; + g_object_ref (editor->target_client); editor->target_editable_id = g_signal_connect ( - editor->target_book, "writable_status", - G_CALLBACK (writable_changed), editor); - - e_book_get_supported_fields_async ( - editor->target_book, - (EBookEListAsyncCallback) - supported_fields_cb, editor); - - e_book_get_required_fields_async ( - editor->target_book, - (EBookEListAsyncCallback) - required_fields_cb, editor); + editor->target_client, "notify::readonly", + G_CALLBACK (notify_readonly_cb), editor); + + e_client_get_backend_property (E_CLIENT (editor->target_client), BOOK_BACKEND_PROPERTY_SUPPORTED_FIELDS, NULL, supported_fields_cb, editor); + e_client_get_backend_property (E_CLIENT (editor->target_client), BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS, NULL, required_fields_cb, editor); + if (!editor->is_new_contact) editor->changed = TRUE; - writable = e_book_is_writable (editor->target_book); + writable = !e_client_is_readonly (E_CLIENT (editor->target_client)); if (writable != editor->target_editable) { editor->target_editable = writable; @@ -4238,24 +4264,16 @@ e_contact_editor_set_property (GObject *object, } case PROP_WRITABLE_FIELDS: if (editor->writable_fields) - g_object_unref (editor->writable_fields); + e_client_util_free_string_slist (editor->writable_fields); - editor->writable_fields = g_value_get_object (value); - if (editor->writable_fields) - g_object_ref (editor->writable_fields); - else - editor->writable_fields = e_list_new (NULL, NULL, NULL); + editor->writable_fields = e_client_util_copy_string_slist (NULL, g_value_get_pointer (value)); sensitize_all (editor); break; case PROP_REQUIRED_FIELDS: if (editor->required_fields) - g_object_unref (editor->required_fields); - editor->required_fields = g_value_get_object (value); - if (editor->required_fields) - g_object_ref (editor->required_fields); - else - editor->required_fields = e_list_new (NULL, NULL, NULL); + e_client_util_free_string_slist (editor->required_fields); + editor->required_fields = e_client_util_copy_string_slist (NULL, g_value_get_pointer (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -4274,12 +4292,12 @@ e_contact_editor_get_property (GObject *object, e_contact_editor = E_CONTACT_EDITOR (object); switch (prop_id) { - case PROP_SOURCE_BOOK: - g_value_set_object (value, e_contact_editor->source_book); + case PROP_SOURCE_CLIENT: + g_value_set_object (value, e_contact_editor->source_client); break; - case PROP_TARGET_BOOK: - g_value_set_object (value, e_contact_editor->target_book); + case PROP_TARGET_CLIENT: + g_value_set_object (value, e_contact_editor->target_client); break; case PROP_CONTACT: @@ -4303,20 +4321,10 @@ e_contact_editor_get_property (GObject *object, break; case PROP_WRITABLE_FIELDS: - if (e_contact_editor->writable_fields) - g_value_set_object ( - value, e_list_duplicate ( - e_contact_editor->writable_fields)); - else - g_value_set_object (value, NULL); + g_value_set_pointer (value, e_contact_editor->writable_fields); break; case PROP_REQUIRED_FIELDS: - if (e_contact_editor->required_fields) - g_value_set_object ( - value, e_list_duplicate ( - e_contact_editor->required_fields)); - else - g_value_set_object (value, NULL); + g_value_set_pointer (value, e_contact_editor->required_fields); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h index 2f00a12f67..7f39fe421e 100644 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ b/addressbook/gui/contact-editor/e-contact-editor.h @@ -25,7 +25,7 @@ #include "addressbook/gui/contact-editor/eab-editor.h" -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> #include <gtk/gtk.h> @@ -55,8 +55,8 @@ struct _EContactEditor EABEditor object; /* item specific fields */ - EBook *source_book; - EBook *target_book; + EBookClient *source_client; + EBookClient *target_client; EContact *contact; GtkBuilder *builder; @@ -90,9 +90,9 @@ struct _EContactEditor /* Whether to try to reduce space used */ guint compress_ui : 1; - EList *writable_fields; + GSList *writable_fields; - EList *required_fields; + GSList *required_fields; GCancellable *cancellable; @@ -110,7 +110,7 @@ struct _EContactEditorClass GType e_contact_editor_get_type (void); EABEditor *e_contact_editor_new (EShell *shell, - EBook *book, + EBookClient *book_client, EContact *contact, gboolean is_new_contact, gboolean editable); diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.c b/addressbook/gui/contact-editor/e-contact-quick-add.c index c7a42233c2..ac46c0ecfc 100644 --- a/addressbook/gui/contact-editor/e-contact-quick-add.c +++ b/addressbook/gui/contact-editor/e-contact-quick-add.c @@ -28,9 +28,9 @@ #include <string.h> #include <gtk/gtk.h> #include <glib/gi18n.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-combo-box.h> #include <addressbook/util/eab-book-util.h> #include "e-contact-editor.h" @@ -121,37 +121,42 @@ quick_add_set_vcard (QuickAdd *qa, const gchar *vcard) } static void -merge_cb (ESource *source, - GAsyncResult *result, - QuickAdd *qa) +merge_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; + ESource *source = E_SOURCE (source_object); + QuickAdd *qa = user_data; + EClient *client = NULL; GError *error = NULL; - book = e_load_book_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; /* Ignore cancellations. */ - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { + g_error_free (error); return; + } if (!error) { - if (e_book_is_writable (book)) - eab_merging_book_add_contact (book, qa->contact, NULL, NULL); + if (!e_client_is_readonly (client)) + eab_merging_book_add_contact (E_BOOK_CLIENT (client), qa->contact, NULL, NULL); else e_alert_run_dialog_for_args (e_shell_get_active_window (NULL), "addressbook:error-read-only", - e_source_peek_name (e_book_get_source (book)), + e_source_peek_name (e_client_get_source (client)), NULL); if (qa->cb) qa->cb (qa->contact, qa->closure); - g_object_unref (book); + g_object_unref (client); } else { /* Something went wrong. */ - if (book) - g_object_unref (book); + if (client) + g_object_unref (client); if (qa->cb) qa->cb (NULL, qa->closure); + g_error_free (error); } quick_add_unref (qa); @@ -167,9 +172,9 @@ quick_add_merge_contact (QuickAdd *qa) qa->cancellable = g_cancellable_new (); - e_load_book_source_async ( - qa->source, NULL, qa->cancellable, - (GAsyncReadyCallback) merge_cb, qa); + e_client_utils_open_new (qa->source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, qa->cancellable, + e_client_utils_authenticate_handler, NULL, + merge_cb, qa); } /* Raise a contact editor with all fields editable, @@ -177,7 +182,7 @@ quick_add_merge_contact (QuickAdd *qa) static void contact_added_cb (EContactEditor *ce, - EBookStatus status, + const GError *error, EContact *contact, gpointer closure) { @@ -204,7 +209,7 @@ editor_closed_cb (GtkWidget *w, gpointer closure) } static void -ce_have_contact (EBook *book, +ce_have_contact (EBookClient *book_client, const GError *error, EContact *contact, gpointer closure) @@ -212,8 +217,8 @@ ce_have_contact (EBook *book, QuickAdd *qa = (QuickAdd *) closure; if (error) { - if (book) - g_object_unref (book); + if (book_client) + g_object_unref (book_client); g_warning ( "Failed to find contact, status %d (%s).", error->code, error->message); @@ -231,7 +236,7 @@ ce_have_contact (EBook *book, shell = e_shell_get_default (); contact_editor = e_contact_editor_new ( - shell, book, qa->contact, TRUE, TRUE /* XXX */); + shell, book_client, qa->contact, TRUE, TRUE /* XXX */); /* Mark it as changed so the Save buttons are * enabled when we bring up the dialog. */ @@ -256,31 +261,36 @@ ce_have_contact (EBook *book, G_CALLBACK (editor_closed_cb), NULL); - g_object_unref (book); + g_object_unref (book_client); } } static void -ce_have_book (ESource *source, - GAsyncResult *result, - QuickAdd *qa) +ce_have_book (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; + ESource *source = E_SOURCE (source_object); + QuickAdd *qa = user_data; + EClient *client = NULL; GError *error = NULL; - book = e_load_book_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; /* Ignore cancellations. */ - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { + g_error_free (error); return; + } if (error) { - if (book) - g_object_unref (book); + if (client) + g_object_unref (client); g_warning ("Couldn't open local address book (%s).", error->message); quick_add_unref (qa); + g_error_free (error); } else { - eab_merging_book_find_contact (book, qa->contact, ce_have_contact, qa); + eab_merging_book_find_contact (E_BOOK_CLIENT (client), qa->contact, ce_have_contact, qa); } } @@ -294,9 +304,9 @@ edit_contact (QuickAdd *qa) qa->cancellable = g_cancellable_new (); - e_load_book_source_async ( - qa->source, NULL, qa->cancellable, - (GAsyncReadyCallback) ce_have_book, qa); + e_client_utils_open_new (qa->source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, qa->cancellable, + e_client_utils_authenticate_handler, NULL, + ce_have_book, qa); } #define QUICK_ADD_RESPONSE_EDIT_FULL 2 diff --git a/addressbook/gui/contact-editor/eab-editor.h b/addressbook/gui/contact-editor/eab-editor.h index 5623aa5bd4..43e36e53a3 100644 --- a/addressbook/gui/contact-editor/eab-editor.h +++ b/addressbook/gui/contact-editor/eab-editor.h @@ -25,7 +25,6 @@ #define __EAB_EDITOR_H__ #include <gtk/gtk.h> -#include <libebook/e-book.h> #include <libebook/e-contact.h> #include <shell/e-shell.h> diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c index 3fae1a2013..a4f30ca573 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.c @@ -37,7 +37,7 @@ #include <gdk/gdkkeysyms.h> #include <camel/camel.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-combo-box.h> #include "e-util/e-util.h" @@ -90,7 +90,7 @@ enum { PROP_0, - PROP_BOOK, + PROP_CLIENT, PROP_CONTACT, PROP_IS_NEW_LIST, PROP_EDITABLE @@ -103,7 +103,7 @@ typedef struct { struct _EContactListEditorPrivate { - EBook *book; + EBookClient *book_client; EContact *contact; GtkBuilder *builder; @@ -208,17 +208,20 @@ contact_list_editor_add_email (EContactListEditor *editor) } static void -contact_list_editor_book_loaded_cb (ESource *source, +contact_list_editor_book_loaded_cb (GObject *source_object, GAsyncResult *result, - EContactListEditor *editor) + gpointer user_data) { + ESource *source = E_SOURCE (source_object); + EContactListEditor *editor = user_data; EContactListEditorPrivate *priv = editor->priv; EContactStore *contact_store; ENameSelectorEntry *entry; - EBook *book; + EClient *client = NULL; + EBookClient *book_client; GError *error = NULL; - book = e_load_book_source_finish (source, result, &error); + e_client_utils_open_new_finish (source, result, &client, &error); if (error != NULL) { GtkWindow *parent; @@ -228,20 +231,21 @@ contact_list_editor_book_loaded_cb (ESource *source, e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (WIDGET (SOURCE_MENU)), - e_book_get_source (priv->book)); + e_client_get_source (E_CLIENT (priv->book_client))); g_error_free (error); goto exit; } - g_return_if_fail (E_IS_BOOK (book)); + book_client = E_BOOK_CLIENT (client); + g_return_if_fail (E_IS_BOOK_CLIENT (book_client)); entry = E_NAME_SELECTOR_ENTRY (WIDGET (EMAIL_ENTRY)); contact_store = e_name_selector_entry_peek_contact_store (entry); - e_contact_store_add_book (contact_store, book); - e_contact_list_editor_set_book (editor, book); + e_contact_store_add_client (contact_store, book_client); + e_contact_list_editor_set_client (editor, book_client); - g_object_unref (book); + g_object_unref (book_client); exit: g_object_unref (editor); @@ -261,11 +265,12 @@ contact_list_editor_contact_exists (EContactListModel *model, } static void -contact_list_editor_list_added_cb (EBook *book, +contact_list_editor_list_added_cb (EBookClient *book_client, const GError *error, const gchar *id, - EditorCloseStruct *ecs) + gpointer closure) { + EditorCloseStruct *ecs = closure; EContactListEditor *editor = ecs->editor; EContactListEditorPrivate *priv = editor->priv; gboolean should_close = ecs->should_close; @@ -292,10 +297,11 @@ contact_list_editor_list_added_cb (EBook *book, } static void -contact_list_editor_list_modified_cb (EBook *book, +contact_list_editor_list_modified_cb (EBookClient *book_client, const GError *error, - EditorCloseStruct *ecs) + gpointer closure) { + EditorCloseStruct *ecs = closure; EContactListEditor *editor = ecs->editor; EContactListEditorPrivate *priv = editor->priv; gboolean should_close = ecs->should_close; @@ -500,7 +506,7 @@ contact_list_editor_drag_data_received_cb (GtkWidget *widget, gboolean changed = FALSE; gboolean handled = FALSE; const guchar *data; - GList *list, *iter; + GSList *list, *iter; GdkAtom target; gint n_addresses = 0; gchar *text; @@ -546,8 +552,7 @@ contact_list_editor_drag_data_received_cb (GtkWidget *widget, } } - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); contact_list_editor_scroll_to_end (editor); @@ -894,21 +899,17 @@ void contact_list_editor_source_menu_changed_cb (GtkWidget *widget) { EContactListEditor *editor; - GtkWindow *parent; ESource *source; editor = contact_list_editor_extract (widget); source = e_source_combo_box_get_active (E_SOURCE_COMBO_BOX (widget)); - if (e_source_equal (e_book_get_source (editor->priv->book), source)) + if (e_source_equal (e_client_get_source (E_CLIENT (editor->priv->book_client)), source)) return; - parent = eab_editor_get_window (EAB_EDITOR (editor)); - - e_load_book_source_async ( - source, parent, NULL, (GAsyncReadyCallback) - contact_list_editor_book_loaded_cb, - g_object_ref (editor)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, eab_editor_get_window (EAB_EDITOR (editor)), + contact_list_editor_book_loaded_cb, g_object_ref (editor)); } gboolean @@ -1097,7 +1098,7 @@ contact_list_editor_bottom_button_clicked_cb (GtkButton *button) /******************** GtkBuilder Custom Widgets Functions ********************/ static gpointer -contact_editor_fudge_new (EBook *book, +contact_editor_fudge_new (EBookClient *book_client, EContact *contact, gboolean is_new, gboolean editable) @@ -1108,11 +1109,11 @@ contact_editor_fudge_new (EBook *book, * was a terrible idea. Now we're stuck with it. */ return e_contact_editor_new ( - shell, book, contact, is_new, editable); + shell, book_client, contact, is_new, editable); } static gpointer -contact_list_editor_fudge_new (EBook *book, +contact_list_editor_fudge_new (EBookClient *book_client, EContact *contact, gboolean is_new, gboolean editable) @@ -1123,20 +1124,19 @@ contact_list_editor_fudge_new (EBook *book, * was a terrible idea. Now we're stuck with it. */ return e_contact_list_editor_new ( - shell, book, contact, is_new, editable); + shell, book_client, contact, is_new, editable); } static void setup_custom_widgets (EContactListEditor *editor) { - const gchar *key = "/apps/evolution/addressbook/sources"; GtkWidget *combo_box; - GConfClient *client; ESourceList *source_list; ENameSelectorEntry *name_selector_entry; ENameSelector *name_selector; GtkWidget *old, *parent; EContactListEditorPrivate *priv; + GError *error = NULL; guint ba = 0, la = 0, ra = 0, ta = 0, xo = 0, xp = 0, yo = 0, yp = 0; g_return_if_fail (editor != NULL); @@ -1144,11 +1144,16 @@ setup_custom_widgets (EContactListEditor *editor) priv = editor->priv; combo_box = WIDGET (SOURCE_MENU); - client = gconf_client_get_default (); - source_list = e_source_list_new_for_gconf (client, key); + if (!e_book_client_get_sources (&source_list, &error)) + source_list = NULL; g_object_set (G_OBJECT (combo_box), "source-list", source_list, NULL); - g_object_unref (source_list); - g_object_unref (client); + if (source_list) + g_object_unref (source_list); + + if (error) { + g_debug ("%s: Failed to get sources: %s", G_STRFUNC, error->message); + g_error_free (error); + } g_signal_connect ( combo_box, "changed", G_CALLBACK ( @@ -1237,8 +1242,8 @@ contact_list_editor_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_BOOK: - e_contact_list_editor_set_book ( + case PROP_CLIENT: + e_contact_list_editor_set_client ( E_CONTACT_LIST_EDITOR (object), g_value_get_object (value)); return; @@ -1272,10 +1277,10 @@ contact_list_editor_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_BOOK: + case PROP_CLIENT: g_value_set_object ( value, - e_contact_list_editor_get_book ( + e_contact_list_editor_get_client ( E_CONTACT_LIST_EDITOR (object))); return; @@ -1354,7 +1359,7 @@ contact_list_editor_save_contact (EABEditor *eab_editor, contact = e_contact_list_editor_get_contact (editor); - if (priv->book == NULL) + if (priv->book_client == NULL) return; ecs = g_new (EditorCloseStruct, 1); @@ -1366,11 +1371,11 @@ contact_list_editor_save_contact (EABEditor *eab_editor, if (priv->is_new_list) eab_merging_book_add_contact ( - priv->book, contact, (EBookIdAsyncCallback) + priv->book_client, contact, contact_list_editor_list_added_cb, ecs); else - eab_merging_book_commit_contact ( - priv->book, contact, (EBookAsyncCallback) + eab_merging_book_modify_contact ( + priv->book_client, contact, contact_list_editor_list_modified_cb, ecs); priv->changed = FALSE; @@ -1411,7 +1416,7 @@ contact_list_editor_contact_added (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error adding list"), error); @@ -1425,7 +1430,7 @@ contact_list_editor_contact_modified (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error modifying list"), error); @@ -1439,7 +1444,7 @@ contact_list_editor_contact_deleted (EABEditor *editor, if (!error) return; - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) return; eab_error_dialog (NULL, _("Error removing list"), error); @@ -1483,12 +1488,12 @@ contact_list_editor_class_init (EContactListEditorClass *class) g_object_class_install_property ( object_class, - PROP_BOOK, + PROP_CLIENT, g_param_spec_object ( - "book", - "Book", + "client", + "EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -1615,7 +1620,7 @@ e_contact_list_editor_get_type (void) EABEditor * e_contact_list_editor_new (EShell *shell, - EBook *book, + EBookClient *book_client, EContact *list_contact, gboolean is_new_list, gboolean editable) @@ -1629,7 +1634,7 @@ e_contact_list_editor_new (EShell *shell, "shell", shell, NULL); g_object_set (editor, - "book", book, + "client", book_client, "contact", list_contact, "is_new_list", is_new_list, "editable", editable, @@ -1638,32 +1643,30 @@ e_contact_list_editor_new (EShell *shell, return editor; } -EBook * -e_contact_list_editor_get_book (EContactListEditor *editor) +EBookClient * +e_contact_list_editor_get_client (EContactListEditor *editor) { g_return_val_if_fail (E_IS_CONTACT_LIST_EDITOR (editor), NULL); - return editor->priv->book; + return editor->priv->book_client; } void -e_contact_list_editor_set_book (EContactListEditor *editor, - EBook *book) +e_contact_list_editor_set_client (EContactListEditor *editor, + EBookClient *book_client) { g_return_if_fail (E_IS_CONTACT_LIST_EDITOR (editor)); - g_return_if_fail (E_IS_BOOK (book)); + g_return_if_fail (E_IS_BOOK_CLIENT (book_client)); - if (editor->priv->book != NULL) - g_object_unref (editor->priv->book); - editor->priv->book = g_object_ref (book); + if (editor->priv->book_client != NULL) + g_object_unref (editor->priv->book_client); + editor->priv->book_client = g_object_ref (book_client); - editor->priv->allows_contact_lists = - e_book_check_static_capability ( - editor->priv->book, "contact-lists"); + editor->priv->allows_contact_lists = e_client_check_capability (E_CLIENT (editor->priv->book_client), "contact-lists"); contact_list_editor_update (editor); - g_object_notify (G_OBJECT (editor), "book"); + g_object_notify (G_OBJECT (editor), "client"); } EContact * @@ -1823,10 +1826,10 @@ e_contact_list_editor_set_contact (EContactListEditor *editor, g_list_free (email_list); } - if (priv->book != NULL) { + if (priv->book_client != NULL) { e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (WIDGET (SOURCE_MENU)), - e_book_get_source (priv->book)); + e_client_get_source (E_CLIENT (priv->book_client))); gtk_widget_set_sensitive ( WIDGET (SOURCE_MENU), priv->is_new_list); } diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h index 11242b3dee..38713ba7ab 100644 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.h +++ b/addressbook/gui/contact-list-editor/e-contact-list-editor.h @@ -27,7 +27,7 @@ #include "addressbook/gui/contact-editor/eab-editor.h" -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> #include <libebook/e-destination.h> @@ -68,13 +68,13 @@ struct _EContactListEditorClass GType e_contact_list_editor_get_type (void); EABEditor * e_contact_list_editor_new (EShell *shell, - EBook *book, + EBookClient *book_client, EContact *list_contact, gboolean is_new_list, gboolean editable); -EBook * e_contact_list_editor_get_book (EContactListEditor *editor); -void e_contact_list_editor_set_book (EContactListEditor *editor, - EBook *book); +EBookClient * e_contact_list_editor_get_client(EContactListEditor *editor); +void e_contact_list_editor_set_client(EContactListEditor *editor, + EBookClient *book_client); EContact * e_contact_list_editor_get_contact (EContactListEditor *editor); void e_contact_list_editor_set_contact diff --git a/addressbook/gui/merging/eab-contact-compare.c b/addressbook/gui/merging/eab-contact-compare.c index 4e226e798c..1ba9b3811f 100644 --- a/addressbook/gui/merging/eab-contact-compare.c +++ b/addressbook/gui/merging/eab-contact-compare.c @@ -27,7 +27,8 @@ #include <ctype.h> #include <string.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libebook/e-book-query.h> +#include <libedataserverui/e-client-utils.h> #include "addressbook/util/eab-book-util.h" #include "eab-contact-compare.h" @@ -572,24 +573,31 @@ match_search_info_free (MatchSearchInfo *info) } static void -query_cb (EBook *book, const GError *error, GList *contacts, gpointer closure) +query_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - /* XXX we need to free contacts */ - MatchSearchInfo *info = (MatchSearchInfo *) closure; + MatchSearchInfo *info = (MatchSearchInfo *) user_data; EABContactMatchType best_match = EAB_CONTACT_MATCH_NONE; EContact *best_contact = NULL; - GList *remaining_contacts = NULL; - const GList *i; + EBookClient *book_client = E_BOOK_CLIENT (source_object); + GSList *remaining_contacts = NULL; + GSList *contacts = NULL; + GError *error = NULL; + const GSList *ii; + + if (result && !e_book_client_get_contacts_finish (book_client, result, &contacts, &error)) { + g_debug ("%s: Failed to get contacts: %s\n", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); - if (error) { info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); match_search_info_free (info); + g_object_unref (book_client); return; } /* remove the contacts we're to avoid from the list, if they're present */ - for (i = contacts; i != NULL; i = g_list_next (i)) { - EContact *this_contact = E_CONTACT (i->data); + for (ii = contacts; ii != NULL; ii = g_slist_next (ii)) { + EContact *this_contact = E_CONTACT (ii->data); const gchar *this_uid; GList *iterator; gboolean avoid = FALSE; @@ -611,30 +619,36 @@ query_cb (EBook *book, const GError *error, GList *contacts, gpointer closure) } } if (!avoid) - remaining_contacts = g_list_prepend (remaining_contacts, this_contact); + remaining_contacts = g_slist_prepend (remaining_contacts, g_object_ref (this_contact)); } - remaining_contacts = g_list_reverse (remaining_contacts); + remaining_contacts = g_slist_reverse (remaining_contacts); - for (i = remaining_contacts; i != NULL; i = g_list_next (i)) { - EContact *this_contact = E_CONTACT (i->data); + for (ii = remaining_contacts; ii != NULL; ii = g_slist_next (ii)) { + EContact *this_contact = E_CONTACT (ii->data); EABContactMatchType this_match = eab_contact_compare (info->contact, this_contact); if ((gint) this_match > (gint) best_match) { best_match = this_match; - best_contact = this_contact; + best_contact = this_contact; } } - g_list_free (remaining_contacts); + if (best_contact) + best_contact = g_object_ref (best_contact); + + e_client_util_free_object_slist (contacts); + e_client_util_free_object_slist (remaining_contacts); info->cb (info->contact, best_contact, best_match, info->closure); match_search_info_free (info); + g_object_unref (book_client); + g_object_unref (best_contact); } #define MAX_QUERY_PARTS 10 static void -use_common_book (EBook *book, - MatchSearchInfo *info) +use_common_book_client (EBookClient *book_client, + MatchSearchInfo *info) { EContact *contact = info->contact; EContactName *contact_name; @@ -645,7 +659,7 @@ use_common_book (EBook *book, EBookQuery *query = NULL; gint i; - if (book == NULL) { + if (book_client == NULL) { info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); match_search_info_free (info); return; @@ -713,10 +727,14 @@ use_common_book (EBook *book, query = NULL; } - if (query) - e_book_get_contacts_async (book, query, query_cb, info); - else - query_cb (book, NULL, NULL, info); + if (query) { + gchar *query_str = e_book_query_to_string (query); + + e_book_client_get_contacts (book_client, query_str, NULL, query_cb, info); + + g_free (query_str); + } else + query_cb (G_OBJECT (book_client), NULL, info); g_free (qj); if (query) @@ -724,14 +742,18 @@ use_common_book (EBook *book, } static void -book_loaded_cb (ESource *source, +book_loaded_cb (GObject *source_object, GAsyncResult *result, - MatchSearchInfo *info) + gpointer user_data) { - EBook *book; + ESource *source = E_SOURCE (source_object); + MatchSearchInfo *info = user_data; + EClient *client = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, NULL)) + client = NULL; - book = e_load_book_source_finish (source, result, NULL); - use_common_book (book, info); + use_common_book_client (client ? E_BOOK_CLIENT (client): NULL, info); } void @@ -754,7 +776,7 @@ eab_contact_locate_match (EContact *contact, * Look for the best match and return it using the EABContactMatchQueryCallback. **/ void -eab_contact_locate_match_full (EBook *book, +eab_contact_locate_match_full (EBookClient *book_client, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, @@ -773,18 +795,18 @@ eab_contact_locate_match_full (EBook *book, info->avoid = g_list_copy (avoid); g_list_foreach (info->avoid, (GFunc) g_object_ref, NULL); - if (book) { - use_common_book (book, info); + if (book_client) { + use_common_book_client (g_object_ref (book_client), info); return; } - if (!e_book_get_addressbooks (&info->source_list, NULL)) + if (!e_book_client_get_sources (&info->source_list, NULL)) return; source = e_source_list_peek_default_source (info->source_list); - e_load_book_source_async ( - source, NULL, NULL, (GAsyncReadyCallback) + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, book_loaded_cb, info); } diff --git a/addressbook/gui/merging/eab-contact-compare.h b/addressbook/gui/merging/eab-contact-compare.h index 4fc8ed1569..df67c5d752 100644 --- a/addressbook/gui/merging/eab-contact-compare.h +++ b/addressbook/gui/merging/eab-contact-compare.h @@ -26,7 +26,7 @@ #ifndef __EAB_CONTACT_COMPARE_H__ #define __EAB_CONTACT_COMPARE_H__ -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> typedef enum { @@ -64,7 +64,7 @@ EABContactMatchType eab_contact_compare_telephone (EContact *contact1, EContact EABContactMatchType eab_contact_compare (EContact *contact1, EContact *contact2); void eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure); -void eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure); +void eab_contact_locate_match_full (EBookClient *book_client, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure); #endif /* __E_CONTACT_COMPARE_H__ */ diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c index 49e9968074..99bb2d39fb 100644 --- a/addressbook/gui/merging/eab-contact-merging.c +++ b/addressbook/gui/merging/eab-contact-merging.c @@ -45,15 +45,15 @@ typedef enum { typedef struct { EContactMergingOpType op; - EBook *book; + EBookClient *book_client; /*contact is the new contact which the user has tried to add to the addressbook*/ EContact *contact; /*match is the duplicate contact already existing in the addressbook*/ EContact *match; GList *avoid; - EBookIdAsyncCallback id_cb; - EBookAsyncCallback cb; - EBookContactAsyncCallback c_cb; + EABMergingAsyncCallback cb; + EABMergingIdAsyncCallback id_cb; + EABMergingContactAsyncCallback c_cb; gpointer closure; } EContactMergingLookup; @@ -73,7 +73,7 @@ add_lookup (EContactMergingLookup *lookup) { if (running_merge_requests < SIMULTANEOUS_MERGING_REQUESTS) { running_merge_requests++; - eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup); + eab_contact_locate_match_full (lookup->book_client, lookup->contact, lookup->avoid, match_query_callback, lookup); } else { merging_queue = g_list_append (merging_queue, lookup); @@ -96,14 +96,14 @@ finished_lookup (void) merging_queue = g_list_remove_link (merging_queue, merging_queue); running_merge_requests++; - eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup); + eab_contact_locate_match_full (lookup->book_client, lookup->contact, lookup->avoid, match_query_callback, lookup); } } static void free_lookup (EContactMergingLookup *lookup) { - g_object_unref (lookup->book); + g_object_unref (lookup->book_client); g_object_unref (lookup->contact); g_list_free (lookup->avoid); if (lookup->match) @@ -112,12 +112,12 @@ free_lookup (EContactMergingLookup *lookup) } static void -final_id_cb (EBook *book, const GError *error, const gchar *id, gpointer closure) +final_id_cb (EBookClient *book_client, const GError *error, const gchar *id, gpointer closure) { EContactMergingLookup *lookup = closure; if (lookup->id_cb) - lookup->id_cb (lookup->book, error, id, lookup->closure); + lookup->id_cb (lookup->book_client, error, id, lookup->closure); free_lookup (lookup); @@ -125,12 +125,12 @@ final_id_cb (EBook *book, const GError *error, const gchar *id, gpointer closure } static void -final_cb_as_id (EBook *book, const GError *error, gpointer closure) +final_cb_as_id (EBookClient *book_client, const GError *error, gpointer closure) { EContactMergingLookup *lookup = closure; if (lookup->id_cb) - lookup->id_cb (lookup->book, error, lookup->contact ? e_contact_get_const (lookup->contact, E_CONTACT_UID) : NULL, lookup->closure); + lookup->id_cb (lookup->book_client, error, lookup->contact ? e_contact_get_const (lookup->contact, E_CONTACT_UID) : NULL, lookup->closure); free_lookup (lookup); @@ -138,12 +138,12 @@ final_cb_as_id (EBook *book, const GError *error, gpointer closure) } static void -final_cb (EBook *book, const GError *error, gpointer closure) +final_cb (EBookClient *book_client, const GError *error, gpointer closure) { EContactMergingLookup *lookup = closure; if (lookup->cb) - lookup->cb (lookup->book, error, lookup->closure); + lookup->cb (lookup->book_client, error, lookup->closure); free_lookup (lookup); @@ -151,26 +151,67 @@ final_cb (EBook *book, const GError *error, gpointer closure) } static void -doit (EContactMergingLookup *lookup, gboolean force_commit) +modify_contact_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EContactMergingLookup *lookup = user_data; + GError *error = NULL; + + g_return_if_fail (book_client != NULL); + g_return_if_fail (lookup != NULL); + + e_book_client_modify_contact_finish (book_client, result, &error); + + if (lookup->op == E_CONTACT_MERGING_ADD) + final_cb_as_id (book_client, error, lookup); + else + final_cb (book_client, error, lookup); + + if (error) + g_error_free (error); +} + +static void +add_contact_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EContactMergingLookup *lookup = user_data; + gchar *uid = NULL; + GError *error = NULL; + + g_return_if_fail (book_client != NULL); + g_return_if_fail (lookup != NULL); + + if (!e_book_client_add_contact_finish (book_client, result, &uid, &error)) + uid = NULL; + + final_id_cb (book_client, error, uid, lookup); + + if (error) + g_error_free (error); +} + +static void +doit (EContactMergingLookup *lookup, gboolean force_modify) { if (lookup->op == E_CONTACT_MERGING_ADD) { - if (force_commit) - e_book_commit_contact_async (lookup->book, lookup->contact, final_cb_as_id, lookup); + if (force_modify) + e_book_client_modify_contact (lookup->book_client, lookup->contact, NULL, modify_contact_ready_cb, lookup); else - e_book_add_contact_async (lookup->book, lookup->contact, final_id_cb, lookup); + e_book_client_add_contact (lookup->book_client, lookup->contact, NULL, add_contact_ready_cb, lookup); } else if (lookup->op == E_CONTACT_MERGING_COMMIT) - e_book_commit_contact_async (lookup->book, lookup->contact, final_cb, lookup); + e_book_client_modify_contact (lookup->book_client, lookup->contact, NULL, modify_contact_ready_cb, lookup); } static void cancelit (EContactMergingLookup *lookup) { - GError *error = g_error_new (E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED, _("Cancelled")); + GError *error = e_client_error_create (E_CLIENT_ERROR_CANCELLED, NULL); if (lookup->op == E_CONTACT_MERGING_ADD) { - final_id_cb (lookup->book, error, NULL, lookup); + final_id_cb (lookup->book_client, error, NULL, lookup); } else if (lookup->op == E_CONTACT_MERGING_COMMIT) { - final_cb (lookup->book, error, lookup); + final_cb (lookup->book_client, error, lookup); } g_error_free (error); @@ -209,6 +250,26 @@ dropdown_changed (GtkWidget *dropdown, dropdown_data *data) return; } +static void +remove_contact_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EContactMergingLookup *lookup = user_data; + GError *error = NULL; + + g_return_if_fail (book_client != NULL); + g_return_if_fail (lookup != NULL); + + e_book_client_remove_contact_finish (book_client, result, &error); + + if (error) { + g_debug ("%s: Failed to remove contact: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + e_book_client_add_contact (book_client, lookup->contact, NULL, add_contact_ready_cb, lookup); +} + static gint mergeit (EContactMergingLookup *lookup) { @@ -373,12 +434,10 @@ mergeit (EContactMergingLookup *lookup) gtk_widget_show_all ((GtkWidget *) table); result = gtk_dialog_run (dialog); - switch (result) - { + switch (result) { case GTK_RESPONSE_OK: lookup->contact = lookup->match; - e_book_remove_contact_async (lookup->book, lookup->match, NULL, lookup); - e_book_add_contact_async (lookup->book, lookup->contact, final_id_cb, lookup); + e_book_client_remove_contact (lookup->book_client, lookup->match, NULL, remove_contact_ready_cb, lookup); value = 1; break; case GTK_RESPONSE_CANCEL: @@ -472,7 +531,7 @@ match_query_callback (EContact *contact, EContact *match, EABContactMatchType ty if (lookup->op == E_CONTACT_MERGING_FIND) { if (lookup->c_cb) - lookup->c_cb (lookup->book, NULL, (gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE ? NULL : match, lookup->closure); + lookup->c_cb (lookup->book_client, NULL, (gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE ? NULL : match, lookup->closure); free_lookup (lookup); finished_lookup (); @@ -547,17 +606,17 @@ match_query_callback (EContact *contact, EContact *match, EABContactMatchType ty } gboolean -eab_merging_book_add_contact (EBook *book, - EContact *contact, - EBookIdAsyncCallback cb, - gpointer closure) +eab_merging_book_add_contact (EBookClient *book_client, + EContact *contact, + EABMergingIdAsyncCallback cb, + gpointer closure) { EContactMergingLookup *lookup; lookup = g_new (EContactMergingLookup, 1); lookup->op = E_CONTACT_MERGING_ADD; - lookup->book = g_object_ref (book); + lookup->book_client = g_object_ref (book_client); lookup->contact = g_object_ref (contact); lookup->id_cb = cb; lookup->closure = closure; @@ -570,17 +629,17 @@ eab_merging_book_add_contact (EBook *book, } gboolean -eab_merging_book_commit_contact (EBook *book, - EContact *contact, - EBookAsyncCallback cb, - gpointer closure) +eab_merging_book_modify_contact (EBookClient *book_client, + EContact *contact, + EABMergingAsyncCallback cb, + gpointer closure) { EContactMergingLookup *lookup; lookup = g_new (EContactMergingLookup, 1); lookup->op = E_CONTACT_MERGING_COMMIT; - lookup->book = g_object_ref (book); + lookup->book_client = g_object_ref (book_client); lookup->contact = g_object_ref (contact); lookup->cb = cb; lookup->closure = closure; @@ -593,17 +652,17 @@ eab_merging_book_commit_contact (EBook *book, } gboolean -eab_merging_book_find_contact (EBook *book, - EContact *contact, - EBookContactAsyncCallback cb, - gpointer closure) +eab_merging_book_find_contact (EBookClient *book_client, + EContact *contact, + EABMergingContactAsyncCallback cb, + gpointer closure) { EContactMergingLookup *lookup; lookup = g_new (EContactMergingLookup, 1); lookup->op = E_CONTACT_MERGING_FIND; - lookup->book = g_object_ref (book); + lookup->book_client = g_object_ref (book_client); lookup->contact = g_object_ref (contact); lookup->c_cb = cb; lookup->closure = closure; diff --git a/addressbook/gui/merging/eab-contact-merging.h b/addressbook/gui/merging/eab-contact-merging.h index 40d12a5a29..c8e2ddb3ef 100644 --- a/addressbook/gui/merging/eab-contact-merging.h +++ b/addressbook/gui/merging/eab-contact-merging.h @@ -26,22 +26,28 @@ #ifndef __E_CONTACT_MERGING_H__ #define __E_CONTACT_MERGING_H__ -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> G_BEGIN_DECLS -gboolean eab_merging_book_add_contact (EBook *book, - EContact *contact, - EBookIdAsyncCallback cb, - gpointer closure); -gboolean eab_merging_book_commit_contact (EBook *book, - EContact *contact, - EBookAsyncCallback cb, - gpointer closure); -gboolean eab_merging_book_find_contact (EBook *book, - EContact *contact, - EBookContactAsyncCallback cb, - gpointer closure); +typedef void (*EABMergingAsyncCallback) (EBookClient *book_client, const GError *error, gpointer closure); +typedef void (*EABMergingIdAsyncCallback) (EBookClient *book_client, const GError *error, const gchar *id, gpointer closure); +typedef void (*EABMergingContactAsyncCallback) (EBookClient *book_client, const GError *error, EContact *contact, gpointer closure); + +gboolean eab_merging_book_add_contact (EBookClient *book_client, + EContact *contact, + EABMergingIdAsyncCallback cb, + gpointer closure); + +gboolean eab_merging_book_modify_contact (EBookClient *book_client, + EContact *contact, + EABMergingAsyncCallback cb, + gpointer closure); + +gboolean eab_merging_book_find_contact (EBookClient *book_client, + EContact *contact, + EABMergingContactAsyncCallback cb, + gpointer closure); G_END_DECLS diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c index 30720513d0..497b8fe353 100644 --- a/addressbook/gui/widgets/e-addressbook-model.c +++ b/addressbook/gui/widgets/e-addressbook-model.c @@ -32,10 +32,10 @@ #include "eab-gui-util.h" struct _EAddressbookModelPrivate { - EBook *book; - EBookQuery *query; - EBookView *book_view; - guint book_view_idle_id; + EBookClient *book_client; + gchar *query_str; + EBookClientView *client_view; + guint client_view_idle_id; /* Query Results */ GPtrArray *contacts; @@ -58,7 +58,7 @@ struct _EAddressbookModelPrivate { enum { PROP_0, - PROP_BOOK, + PROP_CLIENT, PROP_EDITABLE, PROP_QUERY }; @@ -94,25 +94,25 @@ free_data (EAddressbookModel *model) static void remove_book_view (EAddressbookModel *model) { - if (model->priv->book_view && model->priv->create_contact_id) + if (model->priv->client_view && model->priv->create_contact_id) g_signal_handler_disconnect ( - model->priv->book_view, + model->priv->client_view, model->priv->create_contact_id); - if (model->priv->book_view && model->priv->remove_contact_id) + if (model->priv->client_view && model->priv->remove_contact_id) g_signal_handler_disconnect ( - model->priv->book_view, + model->priv->client_view, model->priv->remove_contact_id); - if (model->priv->book_view && model->priv->modify_contact_id) + if (model->priv->client_view && model->priv->modify_contact_id) g_signal_handler_disconnect ( - model->priv->book_view, + model->priv->client_view, model->priv->modify_contact_id); - if (model->priv->book_view && model->priv->status_message_id) + if (model->priv->client_view && model->priv->status_message_id) g_signal_handler_disconnect ( - model->priv->book_view, + model->priv->client_view, model->priv->status_message_id); - if (model->priv->book_view && model->priv->view_complete_id) + if (model->priv->client_view && model->priv->view_complete_id) g_signal_handler_disconnect ( - model->priv->book_view, + model->priv->client_view, model->priv->view_complete_id); if (model->priv->remove_status_id) g_source_remove (model->priv->remove_status_id); @@ -126,12 +126,19 @@ remove_book_view (EAddressbookModel *model) model->priv->search_in_progress = FALSE; - if (model->priv->book_view) { - e_book_view_stop (model->priv->book_view); - g_object_unref (model->priv->book_view); - model->priv->book_view = NULL; + if (model->priv->client_view) { + GError *error = NULL; - g_signal_emit (model, signals[STATUS_MESSAGE], 0, NULL); + e_book_client_view_stop (model->priv->client_view, &error); + if (error) { + g_debug ("%s: Failed to stop client view: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + g_object_unref (model->priv->client_view); + model->priv->client_view = NULL; + + g_signal_emit (model, signals[STATUS_MESSAGE], 0, NULL, -1); } } @@ -159,9 +166,7 @@ update_folder_bar_message (EAddressbookModel *model) } static void -create_contact (EBookView *book_view, - const GList *contact_list, - EAddressbookModel *model) +view_create_contact_cb (EBookClientView *client_view, const GSList *contact_list, EAddressbookModel *model) { GPtrArray *array; guint count; @@ -193,12 +198,10 @@ sort_descending (gconstpointer ca, } static void -remove_contact (EBookView *book_view, - GList *ids, - EAddressbookModel *model) +view_remove_contact_cb (EBookClientView *client_view, const GSList *ids, EAddressbookModel *model) { /* XXX we should keep a hash around instead of this O(n*m) loop */ - GList *iter; + const GSList *iter; GArray *indices; GPtrArray *array; gint ii; @@ -249,9 +252,7 @@ remove_contact (EBookView *book_view, } static void -modify_contact (EBookView *book_view, - const GList *contact_list, - EAddressbookModel *model) +view_modify_contact_cb (EBookClientView *client_view, const GSList *contact_list, EAddressbookModel *model) { GPtrArray *array; @@ -290,122 +291,109 @@ modify_contact (EBookView *book_view, } static void -status_message (EBookView *book_view, - gchar * status, - EAddressbookModel *model) +view_progress_cb (EBookClientView *client_view, guint percent, const gchar *message, EAddressbookModel *model) { if (model->priv->remove_status_id) g_source_remove (model->priv->remove_status_id); model->priv->remove_status_id = 0; - g_signal_emit (model, signals[STATUS_MESSAGE], 0, status); + g_signal_emit (model, signals[STATUS_MESSAGE], 0, message, percent); } static void -view_complete (EBookView *book_view, - EBookViewStatus status, - const gchar *error_msg, - EAddressbookModel *model) +view_complete_cb (EBookClientView *client_view, const GError *error, EAddressbookModel *model) { model->priv->search_in_progress = FALSE; - status_message (book_view, NULL, model); - g_signal_emit (model, signals[SEARCH_RESULT], 0, status, error_msg); + view_progress_cb (client_view, -1, NULL, model); + g_signal_emit (model, signals[SEARCH_RESULT], 0, error); g_signal_emit (model, signals[STOP_STATE_CHANGED], 0); } static void -writable_status (EBook *book, - gboolean writable, - EAddressbookModel *model) +readonly_cb (EBookClient *book_client, EAddressbookModel *model) { if (!model->priv->editable_set) { - model->priv->editable = writable; + model->priv->editable = !e_client_is_readonly (E_CLIENT (book_client)); - g_signal_emit (model, signals[WRITABLE_STATUS], 0, writable); + g_signal_emit (model, signals[WRITABLE_STATUS], 0, model->priv->editable); } } static void -backend_died (EBook *book, - EAddressbookModel *model) +backend_died_cb (EBookClient *book_client, EAddressbookModel *model) { g_signal_emit (model, signals[BACKEND_DIED], 0); } static void -book_view_loaded (EBook *book, - const GError *error, - EBookView *book_view, - gpointer closure) +client_view_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EAddressbookModel *model = closure; + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EBookClientView *client_view = NULL; + EAddressbookModel *model = user_data; + GError *error = NULL; + + if (!e_book_client_get_view_finish (book_client, result, &client_view, &error)) + client_view = NULL; if (error) { eab_error_dialog (NULL, _("Error getting book view"), error); + g_error_free (error); return; } remove_book_view (model); free_data (model); - model->priv->book_view = book_view; - if (model->priv->book_view) - g_object_ref (model->priv->book_view); - - model->priv->create_contact_id = g_signal_connect ( - model->priv->book_view, "contacts-added", - G_CALLBACK (create_contact), model); - model->priv->remove_contact_id = g_signal_connect ( - model->priv->book_view, "contacts-removed", - G_CALLBACK (remove_contact), model); - model->priv->modify_contact_id = g_signal_connect ( - model->priv->book_view, "contacts-changed", - G_CALLBACK (modify_contact), model); - model->priv->status_message_id = g_signal_connect ( - model->priv->book_view, "status-message", - G_CALLBACK (status_message), model); - model->priv->view_complete_id = g_signal_connect ( - model->priv->book_view, "view-complete", - G_CALLBACK (view_complete), model); - - model->priv->search_in_progress = TRUE; + model->priv->client_view = client_view; + if (model->priv->client_view) { + model->priv->create_contact_id = g_signal_connect ( + model->priv->client_view, "objects-added", + G_CALLBACK (view_create_contact_cb), model); + model->priv->remove_contact_id = g_signal_connect ( + model->priv->client_view, "objects-removed", + G_CALLBACK (view_remove_contact_cb), model); + model->priv->modify_contact_id = g_signal_connect ( + model->priv->client_view, "objects-modified", + G_CALLBACK (view_modify_contact_cb), model); + model->priv->status_message_id = g_signal_connect ( + model->priv->client_view, "progress", + G_CALLBACK (view_progress_cb), model); + model->priv->view_complete_id = g_signal_connect ( + model->priv->client_view, "complete", + G_CALLBACK (view_complete_cb), model); + + model->priv->search_in_progress = TRUE; + } + g_signal_emit (model, signals[MODEL_CHANGED], 0); g_signal_emit (model, signals[SEARCH_STARTED], 0); g_signal_emit (model, signals[STOP_STATE_CHANGED], 0); - e_book_view_start (model->priv->book_view); + if (model->priv->client_view) { + e_book_client_view_start (model->priv->client_view, &error); + if (error) { + g_debug ("%s: Failed to start client view: %s", G_STRFUNC, error->message); + g_error_free (error); + } + } } static gboolean addressbook_model_idle_cb (EAddressbookModel *model) { - model->priv->book_view_idle_id = 0; - - if (model->priv->book && model->priv->query) { - ESource *source; - const gchar *limit_str; - gint limit = -1; - - source = e_book_get_source (model->priv->book); - - limit_str = e_source_get_property (source, "limit"); - if (limit_str && *limit_str) - limit = atoi (limit_str); - + model->priv->client_view_idle_id = 0; + + if (model->priv->book_client && model->priv->query_str) { remove_book_view (model); if (model->priv->first_get_view) { - gboolean do_initial_query; - model->priv->first_get_view = FALSE; - do_initial_query = e_book_check_static_capability ( - model->priv->book, "do-initial-query"); - - if (do_initial_query) { - e_book_get_book_view_async ( - model->priv->book, model->priv->query, - NULL, limit, book_view_loaded, model); + if (e_client_check_capability (E_CLIENT (model->priv->book_client), "do-initial-query")) { + e_book_client_get_view ( + model->priv->book_client, model->priv->query_str, + NULL, client_view_ready_cb, model); } else { free_data (model); @@ -415,9 +403,9 @@ addressbook_model_idle_cb (EAddressbookModel *model) model, signals[STOP_STATE_CHANGED], 0); } } else - e_book_get_book_view_async ( - model->priv->book, model->priv->query, - NULL, limit, book_view_loaded, model); + e_book_client_get_view ( + model->priv->book_client, model->priv->query_str, + NULL, client_view_ready_cb, model); } @@ -434,7 +422,7 @@ remove_status_cb (gpointer data) g_return_val_if_fail (model != NULL, FALSE); g_return_val_if_fail (E_IS_ADDRESSBOOK_MODEL (model), FALSE); - g_signal_emit (model, signals[STATUS_MESSAGE], 0, NULL); + g_signal_emit (model, signals[STATUS_MESSAGE], 0, NULL, -1); model->priv->remove_status_id = 0; return FALSE; @@ -447,8 +435,8 @@ addressbook_model_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_BOOK: - e_addressbook_model_set_book ( + case PROP_CLIENT: + e_addressbook_model_set_client ( E_ADDRESSBOOK_MODEL (object), g_value_get_object (value)); return; @@ -477,9 +465,9 @@ addressbook_model_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_BOOK: + case PROP_CLIENT: g_value_set_object ( - value, e_addressbook_model_get_book ( + value, e_addressbook_model_get_client ( E_ADDRESSBOOK_MODEL (object))); return; @@ -490,7 +478,7 @@ addressbook_model_get_property (GObject *object, return; case PROP_QUERY: - g_value_take_string ( + g_value_set_string ( value, e_addressbook_model_get_query ( E_ADDRESSBOOK_MODEL (object))); return; @@ -507,26 +495,26 @@ addressbook_model_dispose (GObject *object) remove_book_view (model); free_data (model); - if (model->priv->book) { + if (model->priv->book_client) { if (model->priv->writable_status_id) g_signal_handler_disconnect ( - model->priv->book, + model->priv->book_client, model->priv->writable_status_id); model->priv->writable_status_id = 0; if (model->priv->backend_died_id) g_signal_handler_disconnect ( - model->priv->book, + model->priv->book_client, model->priv->backend_died_id); model->priv->backend_died_id = 0; - g_object_unref (model->priv->book); - model->priv->book = NULL; + g_object_unref (model->priv->book_client); + model->priv->book_client = NULL; } - if (model->priv->query) { - e_book_query_unref (model->priv->query); - model->priv->query = NULL; + if (model->priv->query_str) { + g_free (model->priv->query_str); + model->priv->query_str = NULL; } /* Chain up to parent's dispose() method. */ @@ -562,12 +550,12 @@ addressbook_model_class_init (EAddressbookModelClass *class) g_object_class_install_property ( object_class, - PROP_BOOK, + PROP_CLIENT, g_param_spec_object ( - "book", - "Book", + "client", + "EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -607,9 +595,9 @@ addressbook_model_class_init (EAddressbookModelClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EAddressbookModelClass, status_message), NULL, NULL, - g_cclosure_marshal_VOID__POINTER, + e_marshal_VOID__STRING_INT, G_TYPE_NONE, - 1, G_TYPE_POINTER); + 2, G_TYPE_STRING, G_TYPE_INT); signals[SEARCH_STARTED] = g_signal_new ("search_started", @@ -626,8 +614,8 @@ addressbook_model_class_init (EAddressbookModelClass *class) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EAddressbookModelClass, search_result), NULL, NULL, - e_marshal_VOID__UINT_STRING, - G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING); + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, G_TYPE_ERROR); signals[FOLDER_BAR_MESSAGE] = g_signal_new ("folder_bar_message", @@ -762,7 +750,7 @@ e_addressbook_model_stop (EAddressbookModel *model) message = _("Search Interrupted"); g_signal_emit (model, signals[STOP_STATE_CHANGED], 0); - g_signal_emit (model, signals[STATUS_MESSAGE], 0, message); + g_signal_emit (model, signals[STATUS_MESSAGE], 0, message, -1); if (!model->priv->remove_status_id) model->priv->remove_status_id = @@ -828,64 +816,64 @@ e_addressbook_model_find (EAddressbookModel *model, return -1; } -EBook * -e_addressbook_model_get_book (EAddressbookModel *model) +EBookClient * +e_addressbook_model_get_client (EAddressbookModel *model) { g_return_val_if_fail (E_IS_ADDRESSBOOK_MODEL (model), NULL); - return model->priv->book; + return model->priv->book_client; } void -e_addressbook_model_set_book (EAddressbookModel *model, - EBook *book) +e_addressbook_model_set_client (EAddressbookModel *model, + EBookClient *book_client) { g_return_if_fail (E_IS_ADDRESSBOOK_MODEL (model)); - g_return_if_fail (E_IS_BOOK (book)); + g_return_if_fail (E_IS_BOOK_CLIENT (book_client)); - if (model->priv->book != NULL) { - if (model->priv->book == book) + if (model->priv->book_client != NULL) { + if (model->priv->book_client == book_client) return; if (model->priv->writable_status_id != 0) g_signal_handler_disconnect ( - model->priv->book, + model->priv->book_client, model->priv->writable_status_id); model->priv->writable_status_id = 0; if (model->priv->backend_died_id != 0) g_signal_handler_disconnect ( - model->priv->book, + model->priv->book_client, model->priv->backend_died_id); model->priv->backend_died_id = 0; - g_object_unref (model->priv->book); + g_object_unref (model->priv->book_client); } - model->priv->book = g_object_ref (book); + model->priv->book_client = g_object_ref (book_client); model->priv->first_get_view = TRUE; model->priv->writable_status_id = g_signal_connect ( - book, "writable-status", - G_CALLBACK (writable_status), model); + book_client, "notify::readonly", + G_CALLBACK (readonly_cb), model); model->priv->backend_died_id = g_signal_connect ( - book, "backend-died", - G_CALLBACK (backend_died), model); + book_client, "backend-died", + G_CALLBACK (backend_died_cb), model); if (!model->priv->editable_set) { - model->priv->editable = e_book_is_writable (book); + model->priv->editable = !e_client_is_readonly (E_CLIENT (book_client)); g_signal_emit ( model, signals[WRITABLE_STATUS], 0, model->priv->editable); } - if (model->priv->book_view_idle_id == 0) - model->priv->book_view_idle_id = g_idle_add ( + if (model->priv->client_view_idle_id == 0) + model->priv->client_view_idle_id = g_idle_add ( (GSourceFunc) addressbook_model_idle_cb, g_object_ref (model)); - g_object_notify (G_OBJECT (model), "book"); + g_object_notify (G_OBJECT (model), "client"); } gboolean @@ -913,10 +901,7 @@ e_addressbook_model_get_query (EAddressbookModel *model) { g_return_val_if_fail (E_IS_ADDRESSBOOK_MODEL (model), NULL); - if (!model->priv->query) - return NULL; - - return e_book_query_to_string (model->priv->query); + return model->priv->query_str; } void @@ -932,31 +917,30 @@ e_addressbook_model_set_query (EAddressbookModel *model, else book_query = e_book_query_from_string (query); + /* also checks whether the query is a valid query string */ if (!book_query) return; - if (model->priv->query != NULL) { - gchar *old_query, *new_query; + if (model->priv->query_str != NULL) { + gchar *new_query; - old_query = e_book_query_to_string (model->priv->query); new_query = e_book_query_to_string (book_query); - if (old_query && new_query && g_str_equal (old_query, new_query)) { - g_free (old_query); + if (new_query && g_str_equal (model->priv->query_str, new_query)) { g_free (new_query); e_book_query_unref (book_query); return; } - g_free (old_query); g_free (new_query); - e_book_query_unref (model->priv->query); } - model->priv->query = book_query; + g_free (model->priv->query_str); + model->priv->query_str = e_book_query_to_string (book_query); + e_book_query_unref (book_query); - if (model->priv->book_view_idle_id == 0) - model->priv->book_view_idle_id = g_idle_add ( + if (model->priv->client_view_idle_id == 0) + model->priv->client_view_idle_id = g_idle_add ( (GSourceFunc) addressbook_model_idle_cb, g_object_ref (model)); diff --git a/addressbook/gui/widgets/e-addressbook-model.h b/addressbook/gui/widgets/e-addressbook-model.h index 44b22df4cd..13d23e92b0 100644 --- a/addressbook/gui/widgets/e-addressbook-model.h +++ b/addressbook/gui/widgets/e-addressbook-model.h @@ -21,9 +21,9 @@ #ifndef E_ADDRESSBOOK_MODEL_H #define E_ADDRESSBOOK_MODEL_H -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-client-view.h> #include <libebook/e-book-query.h> -#include <libebook/e-book-view.h> /* Standard GObject macros */ #define E_TYPE_ADDRESSBOOK_MODEL \ @@ -63,10 +63,10 @@ struct _EAddressbookModelClass { gboolean writable); void (*search_started) (EAddressbookModel *model); void (*search_result) (EAddressbookModel *model, - EBookViewStatus status, - const gchar *error_msg); + const GError *error); void (*status_message) (EAddressbookModel *model, - const gchar *message); + const gchar *message, + gint percent); void (*folder_bar_message) (EAddressbookModel *model, const gchar *message); void (*contact_added) (EAddressbookModel *model, @@ -101,9 +101,9 @@ EContact * e_addressbook_model_contact_at (EAddressbookModel *model, gint index); gint e_addressbook_model_find (EAddressbookModel *model, EContact *contact); -EBook * e_addressbook_model_get_book (EAddressbookModel *model); -void e_addressbook_model_set_book (EAddressbookModel *model, - EBook *book); +EBookClient * e_addressbook_model_get_client (EAddressbookModel *model); +void e_addressbook_model_set_client (EAddressbookModel *model, + EBookClient *book_client); gboolean e_addressbook_model_get_editable (EAddressbookModel *model); void e_addressbook_model_set_editable (EAddressbookModel *model, gboolean editable); diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c index 0561b766b6..680a511d05 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c @@ -47,7 +47,7 @@ static EReflowModel *parent_class; enum { PROP_0, - PROP_BOOK, + PROP_CLIENT, PROP_QUERY, PROP_EDITABLE, PROP_MODEL @@ -382,8 +382,7 @@ search_started (EAddressbookModel *model, static void search_result (EAddressbookModel *model, - EBookViewStatus status, - const gchar *error_msg, + const GError *error, EAddressbookReflowAdapter *adapter) { EAddressbookReflowAdapterPrivate *priv = adapter->priv; @@ -403,9 +402,9 @@ addressbook_set_property (GObject *object, EAddressbookReflowAdapterPrivate *priv = adapter->priv; switch (prop_id) { - case PROP_BOOK: + case PROP_CLIENT: g_object_set (priv->model, - "book", g_value_get_object (value), + "client", g_value_get_object (value), NULL); break; case PROP_QUERY: @@ -434,9 +433,9 @@ addressbook_get_property (GObject *object, EAddressbookReflowAdapterPrivate *priv = adapter->priv; switch (prop_id) { - case PROP_BOOK: { + case PROP_CLIENT: { g_object_get_property (G_OBJECT (priv->model), - "book", value); + "client", value); break; } case PROP_QUERY: { @@ -469,11 +468,11 @@ e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) object_class->get_property = addressbook_get_property; object_class->dispose = addressbook_dispose; - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - "Book", + g_object_class_install_property (object_class, PROP_CLIENT, + g_param_spec_object ("client", + "EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_QUERY, diff --git a/addressbook/gui/widgets/e-addressbook-selector.c b/addressbook/gui/widgets/e-addressbook-selector.c index 76b0e98f74..954b1e19b9 100644 --- a/addressbook/gui/widgets/e-addressbook-selector.c +++ b/addressbook/gui/widgets/e-addressbook-selector.c @@ -25,6 +25,7 @@ #include "e-addressbook-selector.h" #include <e-util/e-selection.h> +#include <libedataserverui/e-client-utils.h> #include <eab-book-util.h> #include <eab-contact-merging.h> @@ -36,11 +37,11 @@ struct _EAddressbookSelectorPrivate { }; struct _MergeContext { - EBook *source_book; - EBook *target_book; + EBookClient *source_client; + EBookClient *target_client; EContact *current_contact; - GList *remaining_contacts; + GSList *remaining_contacts; guint pending_removals; gboolean pending_adds; @@ -62,7 +63,7 @@ static gpointer parent_class; static void merge_context_next (MergeContext *merge_context) { - GList *list; + GSList *list; merge_context->current_contact = NULL; if (!merge_context->remaining_contacts) @@ -70,20 +71,20 @@ merge_context_next (MergeContext *merge_context) list = merge_context->remaining_contacts; merge_context->current_contact = list->data; - list = g_list_delete_link (list, list); + list = g_slist_delete_link (list, list); merge_context->remaining_contacts = list; } static MergeContext * -merge_context_new (EBook *source_book, - EBook *target_book, - GList *contact_list) +merge_context_new (EBookClient *source_client, + EBookClient *target_client, + GSList *contact_list) { MergeContext *merge_context; merge_context = g_slice_new0 (MergeContext); - merge_context->source_book = source_book; - merge_context->target_book = target_book; + merge_context->source_client = source_client; + merge_context->target_client = target_client; merge_context->remaining_contacts = contact_list; merge_context_next (merge_context); @@ -93,20 +94,28 @@ merge_context_new (EBook *source_book, static void merge_context_free (MergeContext *merge_context) { - if (merge_context->source_book != NULL) - g_object_unref (merge_context->source_book); + if (merge_context->source_client != NULL) + g_object_unref (merge_context->source_client); - if (merge_context->target_book != NULL) - g_object_unref (merge_context->target_book); + if (merge_context->target_client != NULL) + g_object_unref (merge_context->target_client); g_slice_free (MergeContext, merge_context); } static void -addressbook_selector_removed_cb (EBook *book, - const GError *error, - MergeContext *merge_context) +addressbook_selector_removed_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EBookClient *book_client = E_BOOK_CLIENT (source_object); + MergeContext *merge_context = user_data; + GError *error = NULL; + + e_book_client_remove_contact_finish (book_client, result, &error); + if (error) { + g_debug ("%s: Failed to remove contact: %s", G_STRFUNC, error->message); + g_error_free (error); + } + merge_context->pending_removals--; if (merge_context->pending_adds) @@ -119,18 +128,19 @@ addressbook_selector_removed_cb (EBook *book, } static void -addressbook_selector_merge_next_cb (EBook *book, +addressbook_selector_merge_next_cb (EBookClient *book_client, const GError *error, const gchar *id, - MergeContext *merge_context) + gpointer closure) { + MergeContext *merge_context = closure; + if (merge_context->remove_from_source && !error) { /* Remove previous contact from source. */ - e_book_remove_contact_async ( - merge_context->source_book, - merge_context->current_contact, - (EBookAsyncCallback) addressbook_selector_removed_cb, - merge_context); + e_book_client_remove_contact ( + merge_context->source_client, + merge_context->current_contact, NULL, + addressbook_selector_removed_cb, merge_context); merge_context->pending_removals++; } @@ -139,10 +149,9 @@ addressbook_selector_merge_next_cb (EBook *book, if (merge_context->remaining_contacts != NULL) { merge_context_next (merge_context); eab_merging_book_add_contact ( - merge_context->target_book, + merge_context->target_client, merge_context->current_contact, - (EBookIdAsyncCallback) addressbook_selector_merge_next_cb, - merge_context); + addressbook_selector_merge_next_cb, merge_context); } else if (merge_context->pending_removals == 0) { merge_context_free (merge_context); @@ -242,6 +251,39 @@ addressbook_selector_constructed (GObject *object) G_OBJECT_CLASS (parent_class)->constructed (object); } +static void +target_client_open_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + ESource *source = E_SOURCE (source_object); + MergeContext *merge_context = user_data; + EClient *client = NULL; + GError *error = NULL; + + g_return_if_fail (merge_context != NULL); + + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; + + if (error) { + g_debug ("%s: Failed to open targer client: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + merge_context->target_client = client ? E_BOOK_CLIENT (client) : NULL; + + if (!merge_context->target_client) { + g_slist_foreach (merge_context->remaining_contacts, (GFunc) g_object_unref, NULL); + g_slist_free (merge_context->remaining_contacts); + + merge_context_free (merge_context); + return; + } + + eab_merging_book_add_contact ( + merge_context->target_client, merge_context->current_contact, + addressbook_selector_merge_next_cb, merge_context); +} + static gboolean addressbook_selector_data_dropped (ESourceSelector *selector, GtkSelectionData *selection_data, @@ -252,9 +294,8 @@ addressbook_selector_data_dropped (ESourceSelector *selector, EAddressbookSelectorPrivate *priv; MergeContext *merge_context; EAddressbookModel *model; - EBook *source_book; - EBook *target_book; - GList *list; + EBookClient *source_client = NULL; + GSList *list; const gchar *string; gboolean remove_from_source; @@ -264,30 +305,26 @@ addressbook_selector_data_dropped (ESourceSelector *selector, string = (const gchar *) gtk_selection_data_get_data (selection_data); remove_from_source = (action == GDK_ACTION_MOVE); - target_book = e_book_new (destination, NULL); - if (target_book == NULL) - return FALSE; - - e_book_open (target_book, FALSE, NULL); - /* XXX Function assumes both out arguments are provided. All we - * care about is the contact list; source_book will be NULL. */ - eab_book_and_contact_list_from_string (string, &source_book, &list); + * care about is the contact list; source_client will be NULL. */ + eab_book_and_contact_list_from_string (string, &source_client, &list); + if (source_client) + g_object_unref (source_client); + if (list == NULL) return FALSE; model = e_addressbook_view_get_model (priv->current_view); - source_book = e_addressbook_model_get_book (model); - g_return_val_if_fail (E_IS_BOOK (source_book), FALSE); + source_client = e_addressbook_model_get_client (model); + g_return_val_if_fail (E_IS_BOOK_CLIENT (source_client), FALSE); - merge_context = merge_context_new (source_book, target_book, list); + merge_context = merge_context_new (g_object_ref (source_client), NULL, list); merge_context->remove_from_source = remove_from_source; merge_context->pending_adds = TRUE; - eab_merging_book_add_contact ( - target_book, merge_context->current_contact, - (EBookIdAsyncCallback) addressbook_selector_merge_next_cb, - merge_context); + e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, + target_client_open_ready_cb, merge_context); return TRUE; } diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.c b/addressbook/gui/widgets/e-addressbook-table-adapter.c index e246118d3a..e47b5bb186 100644 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-table-adapter.c @@ -25,6 +25,9 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> + +#include <libebook/e-book-client.h> + #include "e-addressbook-model.h" #include "e-addressbook-table-adapter.h" #include "eab-contact-merging.h" @@ -145,7 +148,7 @@ addressbook_value_at (ETableModel *etc, gint col, gint row) /* This function sets the value at a particular point in our ETableModel. */ static void -contact_modified_cb (EBook* book, +contact_modified_cb (EBookClient *book_client, const GError *error, gpointer user_data) { @@ -182,8 +185,8 @@ addressbook_set_value_at (ETableModel *etc, gint col, gint row, gconstpointer va } e_contact_set (contact, col, (gpointer) val); - eab_merging_book_commit_contact ( - e_addressbook_model_get_book (priv->model), + eab_merging_book_modify_contact ( + e_addressbook_model_get_client (priv->model), contact, contact_modified_cb, etc); g_object_unref (contact); @@ -227,7 +230,7 @@ addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER (etm); EAddressbookTableAdapterPrivate *priv = adapter->priv; EContact *contact; - EBook *book; + EBookClient *book_client; gint col; contact = e_contact_new (); @@ -237,8 +240,8 @@ addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) e_contact_set (contact, col, (gpointer) val); } - book = e_addressbook_model_get_book (priv->model); - eab_merging_book_add_contact (book, contact, NULL, NULL); + book_client = e_addressbook_model_get_client (priv->model); + eab_merging_book_add_contact (book_client, contact, NULL, NULL); g_object_unref (contact); } diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.h b/addressbook/gui/widgets/e-addressbook-table-adapter.h index 71999bd4d1..17cf4cfadb 100644 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.h +++ b/addressbook/gui/widgets/e-addressbook-table-adapter.h @@ -22,8 +22,6 @@ #define _EAB_TABLE_ADAPTER_H_ #include <table/e-table-model.h> -#include <libebook/e-book.h> -#include <libebook/e-book-view.h> #define E_TYPE_AB_TABLE_ADAPTER (eab_table_adapter_get_type ()) #define EAB_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapter)) diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c index 321a9fd949..00f106ea40 100644 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ b/addressbook/gui/widgets/e-addressbook-view.c @@ -64,10 +64,9 @@ #define d(x) static void status_message (EAddressbookView *view, - const gchar *status); + const gchar *status, gint percent); static void search_result (EAddressbookView *view, - EBookViewStatus status, - const gchar *error_msg); + const GError *error); static void folder_bar_message (EAddressbookView *view, const gchar *status); static void stop_state_changed (GObject *object, @@ -240,8 +239,8 @@ table_drag_data_get (ETable *table, { EAddressbookView *view = user_data; EAddressbookModel *model; - EBook *book; - GList *contact_list; + EBookClient *book_client; + GSList *contact_list; GdkAtom target; gchar *value; @@ -249,7 +248,7 @@ table_drag_data_get (ETable *table, return; model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book_client = e_addressbook_model_get_client (model); contact_list = e_addressbook_view_get_selected (view); target = gtk_selection_data_get_target (selection_data); @@ -267,7 +266,7 @@ table_drag_data_get (ETable *table, case DND_TARGET_TYPE_SOURCE_VCARD: value = eab_book_and_contact_list_to_string ( - book, contact_list); + book_client, contact_list); gtk_selection_data_set ( selection_data, target, 8, @@ -277,8 +276,7 @@ table_drag_data_get (ETable *table, break; } - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); + e_client_util_free_object_slist (contact_list); } static void @@ -668,7 +666,7 @@ addressbook_view_copy_clipboard (ESelectable *selectable) { EAddressbookView *view; GtkClipboard *clipboard; - GList *contact_list; + GSList *contact_list; gchar *string; view = E_ADDRESSBOOK_VIEW (selectable); @@ -680,18 +678,17 @@ addressbook_view_copy_clipboard (ESelectable *selectable) e_clipboard_set_directory (clipboard, string, -1); g_free (string); - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); + e_client_util_free_object_slist (contact_list); } static void addressbook_view_paste_clipboard (ESelectable *selectable) { - EBook *book; + EBookClient *book_client; EAddressbookView *view; EAddressbookModel *model; GtkClipboard *clipboard; - GList *contact_list, *iter; + GSList *contact_list, *iter; gchar *string; view = E_ADDRESSBOOK_VIEW (selectable); @@ -701,7 +698,7 @@ addressbook_view_paste_clipboard (ESelectable *selectable) return; model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book_client = e_addressbook_model_get_client (model); string = e_clipboard_wait_for_directory (clipboard); contact_list = eab_contact_list_from_string (string); @@ -710,11 +707,10 @@ addressbook_view_paste_clipboard (ESelectable *selectable) for (iter = contact_list; iter != NULL; iter = iter->next) { EContact *contact = iter->data; - eab_merging_book_add_contact (book, contact, NULL, NULL); + eab_merging_book_add_contact (book_client, contact, NULL, NULL); } - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); + e_client_util_free_object_slist (contact_list); } static void @@ -979,14 +975,14 @@ e_addressbook_view_get_view_object (EAddressbookView *view) static void add_to_list (gint model_row, gpointer closure) { - GList **list = closure; - *list = g_list_prepend (*list, GINT_TO_POINTER (model_row)); + GSList **list = closure; + *list = g_slist_prepend (*list, GINT_TO_POINTER (model_row)); } -GList * +GSList * e_addressbook_view_get_selected (EAddressbookView *view) { - GList *list, *iter; + GSList *list, *iter; ESelectionModel *selection; g_return_val_if_fail (E_IS_ADDRESSBOOK_VIEW (view), NULL); @@ -998,9 +994,7 @@ e_addressbook_view_get_selected (EAddressbookView *view) for (iter = list; iter != NULL; iter = iter->next) iter->data = e_addressbook_model_get_contact ( view->priv->model, GPOINTER_TO_INT (iter->data)); - list = g_list_reverse (list); - - return list; + return g_slist_reverse (list); } ESelectionModel * @@ -1064,8 +1058,7 @@ e_addressbook_view_get_paste_target_list (EAddressbookView *view) } static void -status_message (EAddressbookView *view, - const gchar *status) +status_message (EAddressbookView *view, const gchar *status, gint percent) { EActivity *activity; EShellView *shell_view; @@ -1086,16 +1079,19 @@ status_message (EAddressbookView *view, activity = e_activity_new (); view->priv->activity = activity; e_activity_set_text (activity, status); + if (percent >= 0) + e_activity_set_percent (activity, percent); e_shell_backend_add_activity (shell_backend, activity); - - } else + } else { e_activity_set_text (activity, status); + if (percent >= 0) + e_activity_set_percent (activity, percent); + } } static void search_result (EAddressbookView *view, - EBookViewStatus status, - const gchar *error_msg) + const GError *error) { EShellView *shell_view; EAlertSink *alert_sink; @@ -1103,7 +1099,7 @@ search_result (EAddressbookView *view, shell_view = e_addressbook_view_get_shell_view (view); alert_sink = E_ALERT_SINK (e_shell_view_get_shell_content (shell_view)); - eab_search_result_dialog (alert_sink, status, error_msg); + eab_search_result_dialog (alert_sink, error); } static void @@ -1143,17 +1139,17 @@ backend_died (EAddressbookView *view) EShellView *shell_view; EAlertSink *alert_sink; EAddressbookModel *model; - EBook *book; + EBookClient *book_client; shell_view = e_addressbook_view_get_shell_view (view); alert_sink = E_ALERT_SINK (e_shell_view_get_shell_content (shell_view)); model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book_client = e_addressbook_model_get_client (model); e_alert_submit (alert_sink, "addressbook:backend-died", - e_book_get_uri (book), NULL); + e_client_get_uri (E_CLIENT (book_client)), NULL); } static void @@ -1215,31 +1211,29 @@ e_addressbook_view_print (EAddressbookView *view, /* Print the selected contacts. */ if (GAL_IS_VIEW_MINICARD (gal_view) && selection_only) { - GList *contact_list; + GSList *contact_list; contact_list = e_addressbook_view_get_selected (view); e_contact_print (NULL, NULL, contact_list, action); - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); + e_client_util_free_object_slist (contact_list); /* Print the latest query results. */ } else if (GAL_IS_VIEW_MINICARD (gal_view)) { EAddressbookModel *model; - EBook *book; + EBookClient *book_client; EBookQuery *query; - gchar *query_string; + const gchar *query_string; model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book_client = e_addressbook_model_get_client (model); query_string = e_addressbook_model_get_query (model); if (query_string != NULL) query = e_book_query_from_string (query_string); else query = NULL; - g_free (query_string); - e_contact_print (book, query, NULL, action); + e_contact_print (book_client, query, NULL, action); if (query != NULL) e_book_query_unref (query); @@ -1259,26 +1253,51 @@ e_addressbook_view_print (EAddressbookView *view, } } +static void +report_and_free_error_if_any (GError *error) +{ + if (!error) + return; + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { + g_error_free (error); + return; + } + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_PERMISSION_DENIED)) { + e_alert_run_dialog_for_args (e_shell_get_active_window (NULL), + "addressbook:contact-delete-error-perm", + NULL); + } else { + eab_error_dialog (NULL, _("Failed to delete contact"), error); + } + + g_error_free (error); +} + /* callback function to handle removal of contacts for * which a user doesnt have write permission */ static void -delete_contacts_cb (EBook *book, const GError *error, gpointer closure) +remove_contacts_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - switch (error ? error->code : E_BOOK_ERROR_OK) { - case E_BOOK_ERROR_OK : - case E_BOOK_ERROR_CANCELLED : - break; - case E_BOOK_ERROR_PERMISSION_DENIED : - e_alert_run_dialog_for_args (e_shell_get_active_window (NULL), - "addressbook:contact-delete-error-perm", - NULL); - break; - default : - /* Unknown error */ - eab_error_dialog (NULL, _("Failed to delete contact"), error); - break; - } + EBookClient *book_client = E_BOOK_CLIENT (source_object); + GError *error = NULL; + + e_book_client_remove_contacts_finish (book_client, result, &error); + + report_and_free_error_if_any (error); +} + +static void +remove_contact_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EBookClient *book_client = E_BOOK_CLIENT (source_object); + GError *error = NULL; + + e_book_client_remove_contact_finish (book_client, result, &error); + + report_and_free_error_if_any (error); } static gboolean @@ -1340,12 +1359,12 @@ addressbook_view_confirm_delete (GtkWindow *parent, void e_addressbook_view_delete_selection (EAddressbookView *view, gboolean is_delete) { - GList *list, *l; + GSList *list, *l; gboolean plural = FALSE, is_list = FALSE; EContact *contact; ETable *etable = NULL; EAddressbookModel *model; - EBook *book; + EBookClient *book_client; ESelectionModel *selection_model = NULL; GalViewInstance *view_instance; GalView *gal_view; @@ -1354,7 +1373,7 @@ e_addressbook_view_delete_selection (EAddressbookView *view, gboolean is_delete) gint row = 0, select; model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book_client = e_addressbook_model_get_client (model); view_instance = e_addressbook_view_get_view_instance (view); gal_view = gal_view_instance_get_current_view (view_instance); @@ -1362,7 +1381,7 @@ e_addressbook_view_delete_selection (EAddressbookView *view, gboolean is_delete) list = e_addressbook_view_get_selected (view); contact = list->data; - if (g_list_next (list)) + if (g_slist_next (list)) plural = TRUE; else name = e_contact_get (contact, E_CONTACT_FILE_AS); @@ -1387,38 +1406,29 @@ e_addressbook_view_delete_selection (EAddressbookView *view, gboolean is_delete) GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), plural, is_list, name)) { g_free (name); - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); return; } - if (e_book_check_static_capability (book, "bulk-remove")) { - GList *ids = NULL; + if (e_client_check_capability (E_CLIENT (book_client), "bulk-remove")) { + GSList *ids = NULL; - for (l=list;l;l=g_list_next (l)) { + for (l = list; l; l = g_slist_next (l)) { contact = l->data; - ids = g_list_prepend ( - ids, (gchar *) e_contact_get_const ( - contact, E_CONTACT_UID)); + ids = g_slist_prepend (ids, (gpointer) e_contact_get_const (contact, E_CONTACT_UID)); } /* Remove the cards all at once. */ - e_book_remove_contacts_async (book, - ids, - delete_contacts_cb, - NULL); + e_book_client_remove_contacts (book_client, ids, NULL, remove_contacts_cb, NULL); - g_list_free (ids); - } - else { - for (l=list;l;l=g_list_next (l)) { + g_slist_free (ids); + } else { + for (l = list; l; l = g_slist_next (l)) { contact = l->data; + /* Remove the card. */ - e_book_remove_contact_async (book, - contact, - delete_contacts_cb, - NULL); + e_book_client_remove_contact (book_client, contact, NULL, remove_contact_cb, NULL); } } @@ -1449,21 +1459,20 @@ e_addressbook_view_delete_selection (EAddressbookView *view, gboolean is_delete) row = e_table_view_to_model_row (E_TABLE (etable), select); e_table_set_cursor_row (E_TABLE (etable), row); } - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); } void e_addressbook_view_view (EAddressbookView *view) { - GList *list, *iter; + GSList *list, *iter; gint response; guint length; g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view)); list = e_addressbook_view_get_selected (view); - length = g_list_length (list); + length = g_slist_length (list); response = GTK_RESPONSE_YES; if (length > 5) { @@ -1495,8 +1504,7 @@ e_addressbook_view_view (EAddressbookView *view) addressbook_view_emit_open_contact ( view, iter->data, FALSE); - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); } void @@ -1515,42 +1523,78 @@ e_addressbook_view_stop (EAddressbookView *view) e_addressbook_model_stop (view->priv->model); } +struct TransferContactsData +{ + gboolean delete_from_source; + EAddressbookView *view; +}; + static void -view_transfer_contacts (EAddressbookView *view, - gboolean delete_from_source, - gboolean all) +all_contacts_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; - GList *contacts = NULL; + EBookClient *book_client = E_BOOK_CLIENT (source_object); + struct TransferContactsData *tcd = user_data; EShellView *shell_view; EAlertSink *alert_sink; + GSList *contacts = NULL; + GError *error = NULL; - book = e_addressbook_model_get_book (view->priv->model); - shell_view = e_addressbook_view_get_shell_view (view); + g_return_if_fail (book_client != NULL); + g_return_if_fail (tcd != NULL); + + if (!e_book_client_get_contacts_finish (book_client, result, &contacts, &error)) + contacts = NULL; + + shell_view = e_addressbook_view_get_shell_view (tcd->view); alert_sink = E_ALERT_SINK (e_shell_view_get_shell_content (shell_view)); + if (error) { + e_alert_submit ( + alert_sink, "addressbook:search-error", + error->message, NULL); + g_error_free (error); + } else if (contacts) { + eab_transfer_contacts (book_client, contacts, tcd->delete_from_source, alert_sink); + } + + g_object_unref (tcd->view); + g_free (tcd); +} + +static void +view_transfer_contacts (EAddressbookView *view, + gboolean delete_from_source, + gboolean all) +{ + EBookClient *book_client; + + book_client = e_addressbook_model_get_client (view->priv->model); + if (all) { EBookQuery *query; - GError *error = NULL; + gchar *query_str; + struct TransferContactsData *tcd; query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &contacts, &error); + query_str = e_book_query_to_string (query); e_book_query_unref (query); - if (error) { - e_alert_submit ( - alert_sink, "addressbook:search-error", - error->message, NULL); - g_error_free (error); - return; - } + tcd = g_new0 (struct TransferContactsData, 1); + tcd->delete_from_source = delete_from_source; + tcd->view = g_object_ref (view); + + e_book_client_get_contacts (book_client, query_str, NULL, all_contacts_ready_cb, tcd); } else { - contacts = e_addressbook_view_get_selected (view); - } + GSList *contacts = NULL; + EShellView *shell_view; + EAlertSink *alert_sink; - eab_transfer_contacts (book, contacts, delete_from_source, alert_sink); + shell_view = e_addressbook_view_get_shell_view (view); + alert_sink = E_ALERT_SINK (e_shell_view_get_shell_content (shell_view)); + contacts = e_addressbook_view_get_selected (view); - g_object_unref (book); + eab_transfer_contacts (book_client, contacts, delete_from_source, alert_sink); + } } void diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h index 4b85293cd5..1ccfba99b3 100644 --- a/addressbook/gui/widgets/e-addressbook-view.h +++ b/addressbook/gui/widgets/e-addressbook-view.h @@ -23,7 +23,7 @@ #ifndef E_ADDRESSBOOK_VIEW_H #define E_ADDRESSBOOK_VIEW_H -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> #include <menus/gal-view-instance.h> @@ -73,8 +73,6 @@ struct _EAddressbookViewClass { gboolean is_new_contact); void (*popup_event) (EAddressbookView *view, GdkEvent *event); - void (*status_message) (EAddressbookView *view, - const gchar *message); void (*command_state_change) (EAddressbookView *view); void (*selection_change) (EAddressbookView *view); }; @@ -89,7 +87,7 @@ GalViewInstance * (EAddressbookView *view); GObject * e_addressbook_view_get_view_object (EAddressbookView *view); -GList * e_addressbook_view_get_selected (EAddressbookView *view); +GSList * e_addressbook_view_get_selected (EAddressbookView *view); ESelectionModel * e_addressbook_view_get_selection_model (EAddressbookView *view); diff --git a/addressbook/gui/widgets/e-minicard-view-widget.c b/addressbook/gui/widgets/e-minicard-view-widget.c index 4421b1a739..65fa12d9f1 100644 --- a/addressbook/gui/widgets/e-minicard-view-widget.c +++ b/addressbook/gui/widgets/e-minicard-view-widget.c @@ -63,7 +63,7 @@ static gpointer parent_class; /* The arguments we take */ enum { PROP_0, - PROP_BOOK, + PROP_CLIENT, PROP_QUERY, PROP_EDITABLE, PROP_COLUMN_WIDTH @@ -132,11 +132,11 @@ e_minicard_view_widget_class_init (EMinicardViewWidgetClass *class) class->column_width_changed = NULL; class->right_click = NULL; - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - "Book", + g_object_class_install_property (object_class, PROP_CLIENT, + g_param_spec_object ("client", + "EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_QUERY, @@ -211,7 +211,7 @@ e_minicard_view_widget_init (EMinicardViewWidget *view) { view->emv = NULL; - view->book = NULL; + view->book_client = NULL; view->query = NULL; view->editable = FALSE; view->column_width = 225; @@ -240,18 +240,18 @@ e_minicard_view_widget_set_property (GObject *object, emvw = E_MINICARD_VIEW_WIDGET (object); switch (prop_id) { - case PROP_BOOK: - if (emvw->book) - g_object_unref (emvw->book); + case PROP_CLIENT: + if (emvw->book_client) + g_object_unref (emvw->book_client); if (g_value_get_object (value)) { - emvw->book = E_BOOK (g_value_get_object (value)); - if (emvw->book) - g_object_ref (emvw->book); + emvw->book_client = E_BOOK_CLIENT (g_value_get_object (value)); + if (emvw->book_client) + g_object_ref (emvw->book_client); } else - emvw->book = NULL; + emvw->book_client = NULL; if (emvw->emv) g_object_set (emvw->emv, - "book", emvw->book, + "client", emvw->book_client, NULL); break; case PROP_QUERY: @@ -293,8 +293,8 @@ e_minicard_view_widget_get_property (GObject *object, emvw = E_MINICARD_VIEW_WIDGET (object); switch (prop_id) { - case PROP_BOOK: - g_value_set_object (value, emvw->book); + case PROP_CLIENT: + g_value_set_object (value, emvw->book_client); break; case PROP_QUERY: g_value_set_string (value, emvw->query); @@ -316,9 +316,9 @@ e_minicard_view_widget_dispose (GObject *object) { EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET (object); - if (view->book) { - g_object_unref (view->book); - view->book = NULL; + if (view->book_client) { + g_object_unref (view->book_client); + view->book_client = NULL; } if (view->query) { g_free (view->query); diff --git a/addressbook/gui/widgets/e-minicard-view-widget.h b/addressbook/gui/widgets/e-minicard-view-widget.h index ab5bda2881..aea68bd5db 100644 --- a/addressbook/gui/widgets/e-minicard-view-widget.h +++ b/addressbook/gui/widgets/e-minicard-view-widget.h @@ -24,7 +24,7 @@ #define __E_MINICARD_VIEW_WIDGET_H__ #include <misc/e-canvas.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include "e-minicard-view.h" G_BEGIN_DECLS @@ -47,7 +47,7 @@ struct _EMinicardViewWidget EAddressbookReflowAdapter *adapter; - EBook *book; + EBookClient *book_client; gchar *query; guint editable : 1; diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c index a00b03816c..91a4a12991 100644 --- a/addressbook/gui/widgets/e-minicard-view.c +++ b/addressbook/gui/widgets/e-minicard-view.c @@ -24,6 +24,8 @@ #include <config.h> #endif +#include <libebook/e-book-client.h> + #include "e-minicard-view.h" #include "eab-gui-util.h" @@ -52,7 +54,7 @@ static EReflowClass *parent_class = NULL; enum { PROP_0, PROP_ADAPTER, - PROP_BOOK, + PROP_CLIENT, PROP_QUERY, PROP_EDITABLE }; @@ -105,15 +107,17 @@ e_minicard_view_drag_data_get (GtkWidget *widget, break; } case DND_TARGET_TYPE_SOURCE_VCARD_LIST: { - EBook *book; + EBookClient *book_client = NULL; gchar *value; - g_object_get (view->adapter, "book", &book, NULL); - value = eab_book_and_contact_list_to_string (book, view->drag_list); + g_object_get (view->adapter, "book_client", &book_client, NULL); + value = eab_book_and_contact_list_to_string (book_client, view->drag_list); gtk_selection_data_set ( selection_data, target, 8, (guchar *) value, strlen (value)); + + g_object_unref (book_client); g_free (value); break; } @@ -123,8 +127,7 @@ e_minicard_view_drag_data_get (GtkWidget *widget, static void clear_drag_data (EMinicardView *view) { - g_list_foreach (view->drag_list, (GFunc) g_object_unref, NULL); - g_list_free (view->drag_list); + e_client_util_free_object_slist (view->drag_list); view->drag_list = NULL; } @@ -141,7 +144,7 @@ e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, view->drag_list = e_minicard_view_get_card_list (view); - g_print ("dragging %d card(s)\n", g_list_length (view->drag_list)); + g_print ("dragging %d card(s)\n", g_slist_length (view->drag_list)); target_list = gtk_target_list_new (drag_types, G_N_ELEMENTS (drag_types)); @@ -163,21 +166,26 @@ set_empty_message (EMinicardView *view) { gchar *empty_message; gboolean editable = FALSE, perform_initial_query = FALSE, searching = FALSE; - EBook *book; if (view->adapter) { EAddressbookModel *model = NULL; + EBookClient *book_client = NULL; g_object_get (view->adapter, "editable", &editable, "model", &model, - "book", &book, + "client", &book_client, NULL); - if (book && !e_book_check_static_capability (book, "do-initial-query")) + if (book_client && !e_client_check_capability (E_CLIENT (book_client), "do-initial-query")) perform_initial_query = TRUE; searching = model && e_addressbook_model_can_stop (model); + + if (book_client) + g_object_unref (book_client); + if (model) + g_object_unref (model); } if (searching) { @@ -277,9 +285,9 @@ e_minicard_view_set_property (GObject *object, } break; - case PROP_BOOK: + case PROP_CLIENT: g_object_set (view->adapter, - "book", g_value_get_object (value), + "client", g_value_get_object (value), NULL); set_empty_message (view); break; @@ -314,9 +322,9 @@ e_minicard_view_get_property (GObject *object, case PROP_ADAPTER: g_value_set_object (value, view->adapter); break; - case PROP_BOOK: + case PROP_CLIENT: g_object_get_property (G_OBJECT (view->adapter), - "book", value); + "client", value); break; case PROP_QUERY: g_object_get_property (G_OBJECT (view->adapter), @@ -455,33 +463,6 @@ e_minicard_view_selection_event (EReflow *reflow, return return_val; } -typedef struct { - EMinicardView *view; - EBookAsyncCallback cb; - gpointer closure; -} ViewCbClosure; - -static void -do_remove (gint i, gpointer user_data) -{ - EBook *book; - EContact *contact; - ViewCbClosure *viewcbclosure = user_data; - EMinicardView *view = viewcbclosure->view; - EBookAsyncCallback cb = viewcbclosure->cb; - gpointer closure = viewcbclosure->closure; - - g_object_get (view->adapter, - "book", &book, - NULL); - - contact = e_addressbook_reflow_adapter_get_contact (view->adapter, i); - - e_book_remove_contact_async (book, contact, cb, closure); - - g_object_unref (contact); -} - #if 0 static gint compare_to_utf_str (EMinicard *card, const gchar *utf_str) @@ -532,11 +513,11 @@ e_minicard_view_class_init (EMinicardViewClass *klass) E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, G_PARAM_READWRITE)); - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - "Book", + g_object_class_install_property (object_class, PROP_CLIENT, + g_param_spec_object ("client", + "EBookClient", NULL, - E_TYPE_BOOK, + E_TYPE_BOOK_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_QUERY, @@ -625,21 +606,6 @@ e_minicard_view_get_type (void) } void -e_minicard_view_remove_selection (EMinicardView *view, - EBookAsyncCallback cb, - gpointer closure) -{ - ViewCbClosure viewcbclosure; - viewcbclosure.view = view; - viewcbclosure.cb = cb; - viewcbclosure.closure = closure; - - e_selection_model_foreach (E_REFLOW (view)->selection, - do_remove, - &viewcbclosure); -} - -void e_minicard_view_jump_to_letter (EMinicardView *view, gunichar letter) { @@ -654,7 +620,7 @@ e_minicard_view_jump_to_letter (EMinicardView *view, } typedef struct { - GList *list; + GSList *list; EAddressbookReflowAdapter *adapter; } ModelAndList; @@ -662,12 +628,12 @@ static void add_to_list (gint index, gpointer closure) { ModelAndList *mal = closure; - mal->list = g_list_prepend ( + mal->list = g_slist_prepend ( mal->list, e_addressbook_reflow_adapter_get_contact ( mal->adapter, index)); } -GList * +GSList * e_minicard_view_get_card_list (EMinicardView *view) { ModelAndList mal; @@ -677,8 +643,7 @@ e_minicard_view_get_card_list (EMinicardView *view) e_selection_model_foreach (E_REFLOW (view)->selection, add_to_list, &mal); - mal.list = g_list_reverse (mal.list); - return mal.list; + return g_slist_reverse (mal.list); } void diff --git a/addressbook/gui/widgets/e-minicard-view.h b/addressbook/gui/widgets/e-minicard-view.h index 8b37ba6df5..1024a85088 100644 --- a/addressbook/gui/widgets/e-minicard-view.h +++ b/addressbook/gui/widgets/e-minicard-view.h @@ -28,7 +28,6 @@ #include <text/e-reflow.h> #include <misc/e-selection-model-simple.h> -#include <libebook/e-book.h> #include "e-addressbook-reflow-adapter.h" G_BEGIN_DECLS @@ -69,7 +68,7 @@ struct _EMinicardView /* item specific fields */ - GList *drag_list; + GSList *drag_list; guint canvas_drag_data_get_id; guint writable_status_id; @@ -84,12 +83,9 @@ struct _EMinicardViewClass }; GType e_minicard_view_get_type (void); -void e_minicard_view_remove_selection (EMinicardView *view, - EBookAsyncCallback cb, - gpointer closure); void e_minicard_view_jump_to_letter (EMinicardView *view, gunichar letter); -GList *e_minicard_view_get_card_list (EMinicardView *view); +GSList *e_minicard_view_get_card_list (EMinicardView *view); void e_minicard_view_create_contact (EMinicardView *view); void e_minicard_view_create_contact_list (EMinicardView *view); diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 98cf1c2f98..352604984c 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -32,7 +32,6 @@ #include <e-util/e-util.h> #include <misc/e-canvas-utils.h> #include <misc/e-canvas.h> -#include <libebook/e-book.h> #include "eab-gui-util.h" #include "e-minicard.h" #include "e-minicard-label.h" diff --git a/addressbook/gui/widgets/ea-minicard-view.c b/addressbook/gui/widgets/ea-minicard-view.c index 6850813ca7..a61c6074a0 100644 --- a/addressbook/gui/widgets/ea-minicard-view.c +++ b/addressbook/gui/widgets/ea-minicard-view.c @@ -148,7 +148,7 @@ ea_minicard_view_get_name (AtkObject *accessible) EReflow *reflow; gchar *string; EMinicardView *card_view; - EBook *book = NULL; + EBookClient *book_client = NULL; const gchar *source_name; g_return_val_if_fail (EA_IS_MINICARD_VIEW (accessible), NULL); @@ -161,9 +161,9 @@ ea_minicard_view_get_name (AtkObject *accessible) /* Get the current name of minicard view*/ card_view = E_MINICARD_VIEW (reflow); - g_object_get (card_view->adapter, "book", &book, NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); - source_name = e_source_peek_name (e_book_get_source (book)); + g_object_get (card_view->adapter, "client", &book_client, NULL); + g_return_val_if_fail (E_IS_BOOK_CLIENT (book_client), NULL); + source_name = e_source_peek_name (e_client_get_source (E_CLIENT (book_client))); if (!source_name) source_name=""; @@ -173,7 +173,7 @@ ea_minicard_view_get_name (AtkObject *accessible) ATK_OBJECT_CLASS (parent_class)->set_name (accessible, string); g_free (string); - g_object_unref (book); + g_object_unref (book_client); return accessible->name; } diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c index 1ade6b143a..359c104c89 100644 --- a/addressbook/gui/widgets/eab-gui-util.c +++ b/addressbook/gui/widgets/eab-gui-util.c @@ -35,7 +35,7 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> #include <libedataserver/e-data-server-util.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include <e-util/e-util.h> #include "eab-gui-util.h" @@ -108,7 +108,7 @@ eab_load_error_dialog (GtkWidget *parent, EAlertSink *alert_sink, ESource *sourc uri = e_source_get_uri (source); - if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_OFFLINE_UNAVAILABLE)) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_OFFLINE_UNAVAILABLE)) { can_detail_error = FALSE; label_string = _("This address book cannot be opened. This either means this " "book is not marked for offline usage or not yet downloaded " @@ -166,7 +166,7 @@ eab_load_error_dialog (GtkWidget *parent, EAlertSink *alert_sink, ESource *sourc if (can_detail_error) { /* do not show repository offline message, it's kind of generic error */ - if (error && !g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_REPOSITORY_OFFLINE)) { + if (error && !g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_REPOSITORY_OFFLINE)) { label = g_strconcat (label_string, "\n\n", _("Detailed error message:"), " ", error->message, NULL); label_string = label; } @@ -187,46 +187,50 @@ eab_load_error_dialog (GtkWidget *parent, EAlertSink *alert_sink, ESource *sourc } void -eab_search_result_dialog (EAlertSink *alert_sink, - EBookViewStatus status, - const gchar *error_msg) +eab_search_result_dialog (EAlertSink *alert_sink, const GError *error) { gchar *str = NULL; - switch (status) { - case E_BOOK_VIEW_STATUS_OK: + if (!error) return; - case E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED: - str = _("More cards matched this query than either the server is \n" - "configured to return or Evolution is configured to display.\n" - "Please make your search more specific or raise the result limit in\n" - "the directory server preferences for this address book."); - str = g_strdup (str); - break; - case E_BOOK_VIEW_STATUS_TIME_LIMIT_EXCEEDED: - str = _("The time to execute this query exceeded the server limit or the limit\n" - "configured for this address book. Please make your search\n" - "more specific or raise the time limit in the directory server\n" - "preferences for this address book."); - str = g_strdup (str); - break; - case E_BOOK_VIEW_ERROR_INVALID_QUERY: - /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ - str = _("The backend for this address book was unable to parse this query. %s"); - str = g_strdup_printf (str, error_msg ? error_msg : ""); - break; - case E_BOOK_VIEW_ERROR_QUERY_REFUSED: - /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ - str = _("The backend for this address book refused to perform this query. %s"); - str = g_strdup_printf (str, error_msg ? error_msg : ""); - break; - case E_BOOK_VIEW_ERROR_OTHER_ERROR: + + if (error->domain == E_CLIENT_ERROR) { + switch (error->code) { + case E_CLIENT_ERROR_SEARCH_SIZE_LIMIT_EXCEEDED: + str = _("More cards matched this query than either the server is \n" + "configured to return or Evolution is configured to display.\n" + "Please make your search more specific or raise the result limit in\n" + "the directory server preferences for this address book."); + str = g_strdup (str); + break; + case E_CLIENT_ERROR_SEARCH_TIME_LIMIT_EXCEEDED: + str = _("The time to execute this query exceeded the server limit or the limit\n" + "configured for this address book. Please make your search\n" + "more specific or raise the time limit in the directory server\n" + "preferences for this address book."); + str = g_strdup (str); + break; + case E_CLIENT_ERROR_INVALID_QUERY: + /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ + str = _("The backend for this address book was unable to parse this query. %s"); + str = g_strdup_printf (str, error->message); + break; + case E_CLIENT_ERROR_QUERY_REFUSED: + /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ + str = _("The backend for this address book refused to perform this query. %s"); + str = g_strdup_printf (str, error->message); + break; + case E_CLIENT_ERROR_OTHER_ERROR: + default: + /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ + str = _("This query did not complete successfully. %s"); + str = g_strdup_printf (str, error->message); + break; + } + } else { /* Translators: %s is replaced with a detailed error message, or an empty string, if not provided */ str = _("This query did not complete successfully. %s"); - str = g_strdup_printf (str, error_msg ? error_msg : ""); - break; - default: - g_return_if_reached (); + str = g_strdup_printf (str, error->message); } e_alert_submit (alert_sink, "addressbook:search-error", str, NULL); @@ -284,7 +288,7 @@ eab_select_source (ESource *except_source, const gchar *title, const gchar *mess GtkWidget *scrolled_window; gint response; - if (!e_book_get_addressbooks (&source_list, NULL)) + if (!e_book_client_get_sources (&source_list, NULL)) return NULL; dialog = gtk_dialog_new_with_buttons (_("Select Address Book"), parent, @@ -331,13 +335,13 @@ eab_select_source (ESource *except_source, const gchar *title, const gchar *mess } gchar * -eab_suggest_filename (GList *contact_list) +eab_suggest_filename (const GSList *contact_list) { gchar *res = NULL; g_return_val_if_fail (contact_list != NULL, NULL); - if (g_list_length (contact_list) == 1) { + if (!contact_list->next) { EContact *contact = E_CONTACT (contact_list->data); gchar *string; @@ -357,36 +361,58 @@ eab_suggest_filename (GList *contact_list) typedef struct ContactCopyProcess_ ContactCopyProcess; -typedef void (*ContactCopyDone) (ContactCopyProcess *process); - struct ContactCopyProcess_ { gint count; gboolean book_status; - GList *contacts; - EBook *source; - EBook *destination; - ContactCopyDone done_cb; + GSList *contacts; + EBookClient *source; + EBookClient *destination; + gboolean delete_from_source; EAlertSink *alert_sink; }; +static void process_unref (ContactCopyProcess *process); + static void -do_delete (gpointer data, gpointer user_data) +remove_contact_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book = user_data; + EBookClient *book_client = E_BOOK_CLIENT (source_object); + ContactCopyProcess *process = user_data; + GError *error = NULL; + + e_book_client_remove_contact_by_uid_finish (book_client, result, &error); + + if (error) { + g_debug ("%s: Remove contact by uid failed: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + process_unref (process); +} + +static void +do_delete_from_source (gpointer data, gpointer user_data) +{ + ContactCopyProcess *process = user_data; EContact *contact = data; const gchar *id; + EBookClient *book_client = process->source; id = e_contact_get_const (contact, E_CONTACT_UID); - e_book_remove_contact (book, id, NULL); + g_return_if_fail (id != NULL); + g_return_if_fail (book_client != NULL); + + process->count++; + e_book_client_remove_contact_by_uid (book_client, id, NULL, remove_contact_ready_cb, process); } static void delete_contacts (ContactCopyProcess *process) { if (process->book_status == TRUE) { - g_list_foreach (process->contacts, - do_delete, - process->source); + g_slist_foreach (process->contacts, + do_delete_from_source, + process); } } @@ -395,12 +421,15 @@ process_unref (ContactCopyProcess *process) { process->count--; if (process->count == 0) { - if (process->done_cb) - process->done_cb (process); - g_list_foreach ( - process->contacts, - (GFunc) g_object_unref, NULL); - g_list_free (process->contacts); + if (process->delete_from_source) { + delete_contacts (process); + /* to not repeate this again */ + process->delete_from_source = FALSE; + + if (process->count > 0) + return; + } + e_client_util_free_object_slist (process->contacts); g_object_unref (process->source); g_object_unref (process->destination); g_free (process); @@ -408,58 +437,62 @@ process_unref (ContactCopyProcess *process) } static void -contact_added_cb (EBook* book, const GError *error, const gchar *id, gpointer user_data) +contact_added_cb (EBookClient *book_client, const GError *error, const gchar *id, gpointer user_data) { ContactCopyProcess *process = user_data; - if (error && !g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) { + if (error && !g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { process->book_status = FALSE; eab_error_dialog (process->alert_sink, _("Error adding contact"), error); } - else if (g_error_matches (error, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)) { + else if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { process->book_status = FALSE; } else { /* success */ process->book_status = TRUE; } + process_unref (process); } static void do_copy (gpointer data, gpointer user_data) { - EBook *book; + EBookClient *book_client; EContact *contact; ContactCopyProcess *process; process = user_data; contact = data; - book = process->destination; + book_client = process->destination; process->count++; - eab_merging_book_add_contact (book, contact, contact_added_cb, process); + eab_merging_book_add_contact (book_client, contact, contact_added_cb, process); } static void -book_loaded_cb (ESource *destination, - GAsyncResult *result, - ContactCopyProcess *process) +book_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; + ESource *destination = E_SOURCE (source_object); + ContactCopyProcess *process = user_data; + EClient *client = NULL; + EBookClient *book_client; GError *error = NULL; - book = e_load_book_source_finish (destination, result, &error); + if (!e_client_utils_open_new_finish (destination, result, &client, &error)) + client = NULL; + + book_client = client ? E_BOOK_CLIENT (client) : NULL; - if (book != NULL) { + if (book_client != NULL) { g_warn_if_fail (error == NULL); - process->destination = book; + process->destination = book_client; process->book_status = TRUE; - g_list_foreach (process->contacts, do_copy, process); - + g_slist_foreach (process->contacts, do_copy, process); } else if (error != NULL) { - g_warning ("%s", error->message); + g_debug ("%s: Failed to open destination client: %s", G_STRFUNC, error->message); g_error_free (error); } @@ -467,8 +500,8 @@ book_loaded_cb (ESource *destination, } void -eab_transfer_contacts (EBook *source_book, - GList *contacts /* adopted */, +eab_transfer_contacts (EBookClient *source_client, + GSList *contacts /* adopted */, gboolean delete_from_source, EAlertSink *alert_sink) { @@ -478,7 +511,7 @@ eab_transfer_contacts (EBook *source_book, gchar *desc; GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (alert_sink))); - g_return_if_fail (E_IS_BOOK (source_book)); + g_return_if_fail (E_IS_BOOK_CLIENT (source_client)); if (contacts == NULL) return; @@ -499,7 +532,7 @@ eab_transfer_contacts (EBook *source_book, } destination = eab_select_source ( - e_book_get_source (source_book), + e_client_get_source (E_CLIENT (source_client)), desc, NULL, last_uid, window); if (!destination) @@ -513,19 +546,16 @@ eab_transfer_contacts (EBook *source_book, process = g_new (ContactCopyProcess, 1); process->count = 1; process->book_status = FALSE; - process->source = g_object_ref (source_book); + process->source = g_object_ref (source_client); process->contacts = contacts; process->destination = NULL; process->alert_sink = alert_sink; + process->delete_from_source = delete_from_source; - if (delete_from_source) - process->done_cb = delete_contacts; - else - process->done_cb = NULL; - - e_load_book_source_async ( - destination, window, NULL, - (GAsyncReadyCallback) book_loaded_cb, process); + e_client_utils_open_new ( + destination, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, window, + book_loaded_cb, process); } /* To parse something like... diff --git a/addressbook/gui/widgets/eab-gui-util.h b/addressbook/gui/widgets/eab-gui-util.h index b50df6de95..88a759b75b 100644 --- a/addressbook/gui/widgets/eab-gui-util.h +++ b/addressbook/gui/widgets/eab-gui-util.h @@ -25,7 +25,7 @@ #define __E_ADDRESSBOOK_UTIL_H__ #include <gtk/gtk.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include "e-util/e-alert-sink.h" G_BEGIN_DECLS @@ -38,14 +38,13 @@ void eab_load_error_dialog (GtkWidget *parent, ESource *source, const GError *error); void eab_search_result_dialog (EAlertSink *alert_sink, - EBookViewStatus status, - const gchar *error_msg); + const GError *error); gint eab_prompt_save_dialog (GtkWindow *parent); -void eab_transfer_contacts (EBook *source_book, - GList *contacts, /* adopted */ +void eab_transfer_contacts (EBookClient *source_client, + GSList *contacts, /* adopted */ gboolean delete_from_source, EAlertSink *alert_sink); -gchar * eab_suggest_filename (GList *contact_list); +gchar * eab_suggest_filename (const GSList *contact_list); ESource * eab_select_source (ESource *except_source, const gchar *title, const gchar *message, diff --git a/addressbook/importers/evolution-addressbook-importers.h b/addressbook/importers/evolution-addressbook-importers.h index 8278e67b12..e4579cbc4e 100644 --- a/addressbook/importers/evolution-addressbook-importers.h +++ b/addressbook/importers/evolution-addressbook-importers.h @@ -25,4 +25,4 @@ struct _EImportImporter *evolution_csv_mozilla_importer_peek (void); struct _EImportImporter *evolution_csv_evolution_importer_peek (void); /* private utility function for importers only */ -struct _GtkWidget *evolution_contact_importer_get_preview_widget (const GList *contacts); +struct _GtkWidget *evolution_contact_importer_get_preview_widget (const GSList *contacts); diff --git a/addressbook/importers/evolution-csv-importer.c b/addressbook/importers/evolution-csv-importer.c index 358b8198ab..76607f342e 100644 --- a/addressbook/importers/evolution-csv-importer.c +++ b/addressbook/importers/evolution-csv-importer.c @@ -34,8 +34,8 @@ #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <libebook/e-book.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libebook/e-book-client.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include <libebook/e-destination.h> @@ -66,7 +66,7 @@ typedef struct { * file to an index in the known fields array. */ GHashTable *fields_map; - EBook *book; + EBookClient *book_client; GSList *contacts; } CSVImporter; @@ -721,7 +721,11 @@ csv_import_contacts (gpointer d) { EContact *contact = NULL; while ((contact = getNextCSVEntry (gci, gci->file))) { - e_book_add_contact (gci->book, contact, NULL); + gchar *uid = NULL; + if (e_book_client_add_contact_sync (gci->book_client, contact, &uid, NULL, NULL) && uid) { + e_contact_set (contact, E_CONTACT_UID, uid); + g_free (uid); + } gci->contacts = g_slist_prepend (gci->contacts, contact); } if (contact == NULL) { @@ -755,7 +759,7 @@ csv_getwidget (EImport *ei, EImportTarget *target, EImportImporter *im) ESourceList *source_list; /* FIXME Better error handling */ - if (!e_book_get_addressbooks (&source_list, NULL)) + if (!e_book_client_get_sources (&source_list, NULL)) return NULL; vbox = gtk_vbox_new (FALSE, FALSE); @@ -829,7 +833,7 @@ csv_import_done (CSVImporter *gci) g_source_remove (gci->idle_id); fclose (gci->file); - g_object_unref (gci->book); + g_object_unref (gci->book_client); g_slist_foreach (gci->contacts, (GFunc) g_object_unref, NULL); g_slist_free (gci->contacts); @@ -843,13 +847,20 @@ csv_import_done (CSVImporter *gci) } static void -book_loaded_cb (ESource *source, +book_loaded_cb (GObject *source_object, GAsyncResult *result, - CSVImporter *gci) + gpointer user_data) { - gci->book = e_load_book_source_finish (source, result, NULL); + ESource *source = E_SOURCE (source_object); + CSVImporter *gci = user_data; + EClient *client = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, NULL)) + client = NULL; + + gci->book_client = client ? E_BOOK_CLIENT (client) : NULL; - if (gci->book == NULL) { + if (gci->book_client == NULL) { csv_import_done (gci); return; } @@ -893,8 +904,8 @@ csv_import (EImport *ei, EImportTarget *target, EImportImporter *im) source = g_datalist_get_data (&target->data, "csv-source"); - e_load_book_source_async ( - source, NULL, NULL, (GAsyncReadyCallback) + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, book_loaded_cb, gci); } @@ -931,7 +942,7 @@ static GtkWidget * csv_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) { GtkWidget *preview; - GList *contacts = NULL; + GSList *contacts = NULL; EContact *contact; EImportTargetURI *s = (EImportTargetURI *) target; gchar *filename; @@ -960,14 +971,13 @@ csv_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) fseek (file, 0, SEEK_SET); while (contact = getNextCSVEntry (gci, gci->file), contact != NULL) { - contacts = g_list_prepend (contacts, contact); + contacts = g_slist_prepend (contacts, contact); } - contacts = g_list_reverse (contacts); + contacts = g_slist_reverse (contacts); preview = evolution_contact_importer_get_preview_widget (contacts); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + e_client_util_free_object_slist (contacts); fclose (file); g_free (gci); diff --git a/addressbook/importers/evolution-ldif-importer.c b/addressbook/importers/evolution-ldif-importer.c index 85e46923d1..79d446cdaa 100644 --- a/addressbook/importers/evolution-ldif-importer.c +++ b/addressbook/importers/evolution-ldif-importer.c @@ -41,8 +41,8 @@ #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <libebook/e-book.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libebook/e-book-client.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include <libebook/e-destination.h> @@ -63,7 +63,7 @@ typedef struct { FILE *file; gulong size; - EBook *book; + EBookClient *book_client; GSList *contacts; GSList *list_contacts; @@ -497,10 +497,15 @@ ldif_import_contacts (gpointer d) gci->list_contacts = g_slist_prepend ( gci->list_contacts, contact); } else { + gchar *uid = NULL; + add_to_notes (contact, E_CONTACT_OFFICE); add_to_notes (contact, E_CONTACT_SPOUSE); add_to_notes (contact, E_CONTACT_BLOG_URL); - e_book_add_contact (gci->book, contact, NULL); + if (e_book_client_add_contact_sync (gci->book_client, contact, &uid, NULL, NULL) && uid) { + e_contact_set (contact, E_CONTACT_UID, uid); + g_free (uid); + } gci->contacts = g_slist_prepend (gci->contacts, contact); } count++; @@ -512,9 +517,14 @@ ldif_import_contacts (gpointer d) } if (gci->state == 1) { for (iter = gci->list_iterator;count < 50 && iter;iter=iter->next) { + gchar *uid = NULL; + contact = iter->data; resolve_list_card (gci, contact); - e_book_add_contact (gci->book, contact, NULL); + if (e_book_client_add_contact_sync (gci->book_client, contact, &uid, NULL, NULL) && uid) { + e_contact_set (contact, E_CONTACT_UID, uid); + g_free (uid); + } count++; } gci->list_iterator = iter; @@ -548,7 +558,7 @@ ldif_getwidget (EImport *ei, EImportTarget *target, EImportImporter *im) ESourceList *source_list; /* FIXME Better error handling */ - if (!e_book_get_addressbooks (&source_list, NULL)) + if (!e_book_client_get_sources (&source_list, NULL)) return NULL; vbox = gtk_vbox_new (FALSE, FALSE); @@ -618,7 +628,7 @@ ldif_import_done (LDIFImporter *gci) g_source_remove (gci->idle_id); fclose (gci->file); - g_object_unref (gci->book); + g_object_unref (gci->book_client); g_slist_foreach (gci->contacts, (GFunc) g_object_unref, NULL); g_slist_foreach (gci->list_contacts, (GFunc) g_object_unref, NULL); g_slist_free (gci->contacts); @@ -632,13 +642,20 @@ ldif_import_done (LDIFImporter *gci) } static void -book_loaded_cb (ESource *source, +book_loaded_cb (GObject *source_object, GAsyncResult *result, - LDIFImporter *gci) + gpointer user_data) { - gci->book = e_load_book_source_finish (source, result, NULL); + ESource *source = E_SOURCE (source_object); + LDIFImporter *gci = user_data; + EClient *client = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, NULL)) + client = NULL; + + gci->book_client = client ? E_BOOK_CLIENT (client) : NULL; - if (gci->book == NULL) { + if (gci->book_client == NULL) { ldif_import_done (gci); return; } @@ -681,8 +698,8 @@ ldif_import (EImport *ei, EImportTarget *target, EImportImporter *im) source = g_datalist_get_data (&target->data, "ldif-source"); - e_load_book_source_async ( - source, NULL, NULL, (GAsyncReadyCallback) + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, book_loaded_cb, gci); } @@ -699,7 +716,7 @@ static GtkWidget * ldif_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) { GtkWidget *preview; - GList *contacts = NULL; + GSList *contacts = NULL; EContact *contact; EImportTargetURI *s = (EImportTargetURI *) target; gchar *filename; @@ -732,16 +749,15 @@ ldif_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) add_to_notes (contact, E_CONTACT_BLOG_URL); } - contacts = g_list_prepend (contacts, contact); + contacts = g_slist_prepend (contacts, contact); } g_hash_table_destroy (dn_contact_hash); - contacts = g_list_reverse (contacts); + contacts = g_slist_reverse (contacts); preview = evolution_contact_importer_get_preview_widget (contacts); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + e_client_util_free_object_slist (contacts); fclose (file); return preview; diff --git a/addressbook/importers/evolution-vcard-importer.c b/addressbook/importers/evolution-vcard-importer.c index 04f81b222c..09ad3d1f7f 100644 --- a/addressbook/importers/evolution-vcard-importer.c +++ b/addressbook/importers/evolution-vcard-importer.c @@ -35,8 +35,8 @@ #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <libebook/e-book.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libebook/e-book-client.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include <util/eab-book-util.h> @@ -69,9 +69,9 @@ typedef struct { ESource *primary; - GList *contactlist; - GList *iterator; - EBook *book; + GSList *contactlist; + GSList *iterator; + EBookClient *book_client; /* when opening book */ gchar *contents; @@ -109,6 +109,7 @@ vcard_import_contact (VCardImporter *gci, EContact *contact) { EContactPhoto *photo; GList *attrs, *attr; + gchar *uid = NULL; /* Apple's addressbook.app exports PHOTO's without a TYPE param, so let's figure out the format here if there's a @@ -249,7 +250,10 @@ vcard_import_contact (VCardImporter *gci, EContact *contact) add_to_notes (contact, E_CONTACT_BLOG_URL); /* FIXME Error checking */ - e_book_add_contact (gci->book, contact, NULL); + if (e_book_client_add_contact_sync (gci->book_client, contact, &uid, NULL, NULL) && uid) { + e_contact_set (contact, E_CONTACT_UID, uid); + g_free (uid); + } } static gboolean @@ -257,7 +261,7 @@ vcard_import_contacts (gpointer data) { VCardImporter *gci = data; gint count = 0; - GList *iterator = gci->iterator; + GSList *iterator = gci->iterator; if (gci->state == 0) { while (count < 50 && iterator) { @@ -402,7 +406,7 @@ vcard_getwidget (EImport *ei, EImportTarget *target, EImportImporter *im) ESourceList *source_list; /* FIXME Better error handling */ - if (!e_book_get_addressbooks (&source_list, NULL)) + if (!e_book_client_get_sources (&source_list, NULL)) return NULL; vbox = gtk_vbox_new (FALSE, FALSE); @@ -465,9 +469,8 @@ vcard_import_done (VCardImporter *gci) g_source_remove (gci->idle_id); g_free (gci->contents); - g_object_unref (gci->book); - g_list_foreach (gci->contactlist, (GFunc) g_object_unref, NULL); - g_list_free (gci->contactlist); + g_object_unref (gci->book_client); + e_client_util_free_object_slist (gci->contactlist); e_import_complete (gci->import, gci->target); g_object_unref (gci->import); @@ -475,13 +478,20 @@ vcard_import_done (VCardImporter *gci) } static void -book_loaded_cb (ESource *source, +book_loaded_cb (GObject *source_object, GAsyncResult *result, - VCardImporter *gci) + gpointer user_data) { - gci->book = e_load_book_source_finish (source, result, NULL); + ESource *source = E_SOURCE (source_object); + VCardImporter *gci = user_data; + EClient *client = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, NULL)) + client = NULL; + + gci->book_client = client ? E_BOOK_CLIENT (client) : NULL; - if (gci->book == NULL) { + if (gci->book_client == NULL) { vcard_import_done (gci); return; } @@ -504,7 +514,7 @@ book_loaded_cb (ESource *source, g_free (gci->contents); gci->contents = NULL; gci->iterator = gci->contactlist; - gci->total = g_list_length (gci->contactlist); + gci->total = g_slist_length (gci->contactlist); if (gci->iterator) gci->idle_id = g_idle_add (vcard_import_contacts, gci); @@ -554,8 +564,8 @@ vcard_import (EImport *ei, EImportTarget *target, EImportImporter *im) source = g_datalist_get_data (&target->data, "vcard-source"); - e_load_book_source_async ( - source, NULL, NULL, (GAsyncReadyCallback) + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, book_loaded_cb, gci); } @@ -572,7 +582,7 @@ static GtkWidget * vcard_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) { GtkWidget *preview; - GList *contacts; + GSList *contacts; gchar *contents; VCardEncoding encoding; EImportTargetURI *s = (EImportTargetURI *) target; @@ -617,8 +627,7 @@ vcard_get_preview (EImport *ei, EImportTarget *target, EImportImporter *im) preview = evolution_contact_importer_get_preview_widget (contacts); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + e_client_util_free_object_slist (contacts); return preview; } @@ -904,14 +913,14 @@ preview_selection_changed_cb (GtkTreeSelection *selection, EWebViewPreview *prev } GtkWidget * -evolution_contact_importer_get_preview_widget (const GList *contacts) +evolution_contact_importer_get_preview_widget (const GSList *contacts) { GtkWidget *preview; GtkTreeView *tree_view; GtkTreeSelection *selection; GtkListStore *store; GtkTreeIter iter; - const GList *c; + const GSList *c; if (!contacts) return NULL; diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c index 05f1101467..8057192f77 100644 --- a/addressbook/printing/e-contact-print.c +++ b/addressbook/printing/e-contact-print.c @@ -32,7 +32,8 @@ #include <libxml/parser.h> #include <libxml/xmlmemory.h> #include <glib/gi18n.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-client-view.h> #include <libebook/e-contact.h> #include <libedataserver/e-flag.h> @@ -49,6 +50,7 @@ typedef struct _ContactPrintItem ContactPrintItem; struct _EContactPrintContext { + GtkPrintOperationAction action; GtkPrintContext *context; gdouble x; gdouble y; @@ -64,10 +66,7 @@ struct _EContactPrintContext gchar *section; gboolean first_contact; - EBook *book; - EBookQuery *query; - - GList *contact_list; + GSList *contact_list; }; static gdouble @@ -385,12 +384,12 @@ contact_compare (EContact *contact1, } static void -contacts_added (EBookView *book_view, - const GList *contact_list, +contacts_added (EBookClientView *book_view, + const GSList *contact_list, EContactPrintContext *ctxt) { while (contact_list != NULL) { - ctxt->contact_list = g_list_insert_sorted ( + ctxt->contact_list = g_slist_insert_sorted ( ctxt->contact_list, g_object_ref (contact_list->data), (GCompareFunc) contact_compare); @@ -399,12 +398,25 @@ contacts_added (EBookView *book_view, } static void -view_complete (EBookView *book_view, - EBookViewStatus status, - const gchar *error_msg, - EFlag *book_view_started) +view_complete (EBookClientView *client_view, + const GError *error, + GtkPrintOperation *operation) { - e_flag_set (book_view_started); + EContactPrintContext *ctxt; + + g_return_if_fail (operation != NULL); + + ctxt = g_object_get_data (G_OBJECT (operation), "contact-print-ctx"); + g_return_if_fail (ctxt != NULL); + + e_book_client_view_stop (client_view, NULL); + g_signal_handlers_disconnect_by_func (client_view, G_CALLBACK (contacts_added), ctxt); + g_signal_handlers_disconnect_by_func (client_view, G_CALLBACK (view_complete), operation); + + g_object_unref (client_view); + + gtk_print_operation_run (operation, ctxt->action, NULL, NULL); + g_object_unref (operation); } static gboolean @@ -584,40 +596,6 @@ e_contact_build_style (EContactPrintStyle *style) } static void -load_contacts (EContactPrintContext *ctxt) -{ - /* Load contacts from the EBook. This is an asynchronous operation - * but we force it to be synchronous here. */ - - EBookView *book_view; - EFlag *book_view_started; - - book_view_started = e_flag_new (); - - e_book_get_book_view ( - ctxt->book, ctxt->query, NULL, -1, &book_view, NULL); - - g_signal_connect ( - book_view, "contacts_added", - G_CALLBACK (contacts_added), ctxt); - g_signal_connect ( - book_view, "view_complete", - G_CALLBACK (view_complete), book_view_started); - - e_book_view_start (book_view); - - while (!e_flag_is_set (book_view_started)) - g_main_context_iteration (NULL, TRUE); - - e_flag_free (book_view_started); - - g_signal_handlers_disconnect_by_func ( - book_view, G_CALLBACK (contacts_added), ctxt); - g_signal_handlers_disconnect_by_func ( - book_view, G_CALLBACK (view_complete), book_view_started); -} - -static void contact_draw (EContact *contact, EContactPrintContext *ctxt) { @@ -674,13 +652,6 @@ contact_draw (EContact *contact, } static void -free_contacts (EContactPrintContext *ctxt) -{ - g_list_foreach (ctxt->contact_list, (GFunc) g_object_unref, NULL); - g_list_free (ctxt->contact_list); -} - -static void contact_begin_print (GtkPrintOperation *operation, GtkPrintContext *context, EContactPrintContext *ctxt) @@ -714,11 +685,10 @@ contact_begin_print (GtkPrintOperation *operation, pango_font_description_get_size ( ctxt->style->headings_font) * 1.5); - if (ctxt->book != NULL) { - load_contacts (ctxt); + if (ctxt->contact_list != NULL) { ctxt->page_nr = -1; ctxt->pages = 1; - g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt); + g_slist_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt); gtk_print_operation_set_n_pages (operation, ctxt->pages); } } @@ -788,7 +758,7 @@ contact_draw_page (GtkPrintOperation *operation, ctxt->first_section = TRUE; ctxt->section = NULL; - g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt); + g_slist_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt); contact_page_draw_footer (operation, context, page_nr); } @@ -803,49 +773,88 @@ contact_end_print (GtkPrintOperation *operation, pango_font_description_free (ctxt->style->footer_font); pango_font_description_free (ctxt->letter_heading_font); + e_client_util_free_object_slist (ctxt->contact_list); + + g_free (ctxt->style); g_free (ctxt->section); +} + +static void +get_view_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + GtkPrintOperation *operation = user_data; + EBookClient *book_client = E_BOOK_CLIENT (source_object); + EBookClientView *client_view = NULL; + EContactPrintContext *ctxt; + GError *error = NULL; + + e_book_client_get_view_finish (book_client, result, &client_view, &error); + + ctxt = g_object_get_data (G_OBJECT (operation), "contact-print-ctx"); + g_return_if_fail (ctxt != NULL); + + if (error) { + g_debug ("%s: Failed to get view: %s", G_STRFUNC, error->message); + g_error_free (error); + + gtk_print_operation_run (operation, ctxt->action, NULL, NULL); + g_object_unref (operation); + } else { + g_signal_connect (client_view, "objects-added", G_CALLBACK (contacts_added), ctxt); + g_signal_connect (client_view, "complete", G_CALLBACK (view_complete), operation); + + e_book_client_view_start (client_view, &error); - if (ctxt->book != NULL) - free_contacts (ctxt); + if (error) { + g_debug ("%s: Failed to start view: %s\n", G_STRFUNC, error->message); + g_error_free (error); + + gtk_print_operation_run (operation, ctxt->action, NULL, NULL); + g_object_unref (operation); + } + } } void -e_contact_print (EBook *book, +e_contact_print (EBookClient *book_client, EBookQuery *query, - GList *contact_list, + const GSList *contact_list, GtkPrintOperationAction action) { GtkPrintOperation *operation; - EContactPrintContext ctxt; - EContactPrintStyle style; + EContactPrintContext *ctxt; - if (book != NULL) { - ctxt.book = book; - ctxt.query = query; - ctxt.contact_list = NULL; - } else { - ctxt.book = NULL; - ctxt.query = NULL; - ctxt.contact_list = contact_list; - } - ctxt.style = &style; - ctxt.page_nr = 0; - ctxt.pages = 0; + ctxt = g_new0 (EContactPrintContext, 1); + ctxt->action = action; + ctxt->contact_list = e_client_util_copy_object_slist (NULL, contact_list); + ctxt->style = g_new0 (EContactPrintStyle, 1); + ctxt->page_nr = 0; + ctxt->pages = 0; operation = e_print_operation_new (); gtk_print_operation_set_n_pages (operation, 1); + g_object_set_data_full (G_OBJECT (operation), "contact-print-ctx", ctxt, g_free); + g_signal_connect ( operation, "begin-print", - G_CALLBACK (contact_begin_print), &ctxt); + G_CALLBACK (contact_begin_print), ctxt); g_signal_connect ( operation, "draw_page", - G_CALLBACK (contact_draw_page), &ctxt); + G_CALLBACK (contact_draw_page), ctxt); g_signal_connect ( operation, "end-print", - G_CALLBACK (contact_end_print), &ctxt); + G_CALLBACK (contact_end_print), ctxt); - gtk_print_operation_run (operation, action, NULL, NULL); + if (book_client) { + gchar *query_str = e_book_query_to_string (query); - g_object_unref (operation); + e_book_client_get_view (book_client, query_str, NULL, get_view_ready_cb, operation); + + g_free (query_str); + } else { + gtk_print_operation_run (operation, action, NULL, NULL); + + g_object_unref (operation); + } } diff --git a/addressbook/printing/e-contact-print.h b/addressbook/printing/e-contact-print.h index d87a3e6fcb..94a61b080c 100644 --- a/addressbook/printing/e-contact-print.h +++ b/addressbook/printing/e-contact-print.h @@ -24,12 +24,13 @@ #define E_CONTACT_PRINT_H #include <gtk/gtk.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include "e-contact-print-types.h" -void e_contact_print (EBook *book, +void e_contact_print (EBookClient *book_client, EBookQuery *query, - GList *contact_list, + const GSList *contact_list, GtkPrintOperationAction action); void contact_page_draw_footer (GtkPrintOperation *operation, GtkPrintContext *context, diff --git a/addressbook/tools/evolution-addressbook-export-list-cards.c b/addressbook/tools/evolution-addressbook-export-list-cards.c index eed6dbc183..b886b2cc32 100644 --- a/addressbook/tools/evolution-addressbook-export-list-cards.c +++ b/addressbook/tools/evolution-addressbook-export-list-cards.c @@ -31,7 +31,8 @@ #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include <libebook/e-contact.h> #include "evolution-addressbook-export.h" @@ -243,7 +244,7 @@ gchar *e_contact_get_csv (EContact * contact, GSList * csv_all_fields); gchar *delivery_address_get_sub_field (const EContactAddress * delivery_address, DeliveryAddressField sub_field); gchar *check_null_pointer (gchar * orig); gchar *escape_string (gchar * orig); -gint output_n_cards_file (FILE * outputfile, GList *contacts, gint size, gint begin_no, CARD_FORMAT format); +gint output_n_cards_file (FILE * outputfile, GSList *contacts, gint size, gint begin_no, CARD_FORMAT format); static void fork_to_background (void); void set_pre_defined_field (GSList ** pre_defined_fields); @@ -562,12 +563,12 @@ escape_string (gchar *orig) } gint -output_n_cards_file (FILE * outputfile, GList *contacts, gint size, gint begin_no, CARD_FORMAT format) +output_n_cards_file (FILE * outputfile, GSList *contacts, gint size, gint begin_no, CARD_FORMAT format) { gint i; if (format == CARD_FORMAT_VCARD) { for (i = begin_no; i < size + begin_no; i++) { - EContact *contact = g_list_nth_data (contacts, i); + EContact *contact = g_slist_nth_data (contacts, i); gchar *vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); fprintf (outputfile, "%s\n", vcard); g_free (vcard); @@ -583,7 +584,7 @@ output_n_cards_file (FILE * outputfile, GList *contacts, gint size, gint begin_n g_free (csv_fields_name); for (i = begin_no; i < size + begin_no; i++) { - EContact *contact = g_list_nth_data (contacts, i); + EContact *contact = g_slist_nth_data (contacts, i); gchar *csv = e_contact_get_csv (contact, pre_defined_fields); fprintf (outputfile, "%s\n", csv); g_free (csv); @@ -616,7 +617,7 @@ fork_to_background (void) } static void -action_list_cards (GList *contacts, ActionContext * p_actctx) +action_list_cards (GSList *contacts, ActionContext * p_actctx) { FILE *outputfile; long length; @@ -626,7 +627,7 @@ action_list_cards (GList *contacts, ActionContext * p_actctx) CARD_FORMAT format; gint size; - length = g_list_length (contacts); + length = g_slist_length (contacts); if (length <= 0) { g_warning ("Couldn't load addressbook correctly!!!! %s####", p_actctx->action_list_cards.addressbook_folder_uri ? @@ -761,31 +762,47 @@ set_pre_defined_field (GSList ** pre_defined_fields) guint action_list_cards_init (ActionContext * p_actctx) { - EBook *book; + EBookClient *book_client; EBookQuery *query; - GList *contacts; + gchar *query_str; + GSList *contacts; + GError *error = NULL; if (p_actctx->action_list_cards.addressbook_folder_uri != NULL) { - book = e_book_new_from_uri (p_actctx->action_list_cards.addressbook_folder_uri, NULL); + book_client = e_book_client_new_from_uri (p_actctx->action_list_cards.addressbook_folder_uri, &error); } else { - book = e_book_new_default_addressbook (NULL); + book_client = e_book_client_new_default (&error); } - if (!book - || !e_book_open (book, TRUE, NULL)) { - g_warning ("Couldn't load addressbook %s", p_actctx->action_list_cards.addressbook_folder_uri ? - p_actctx->action_list_cards.addressbook_folder_uri : "NULL"); + if (!book_client + || !e_client_open_sync (E_CLIENT (book_client), TRUE, NULL, &error)) { + g_warning ("Couldn't load addressbook %s: %s", p_actctx->action_list_cards.addressbook_folder_uri ? + p_actctx->action_list_cards.addressbook_folder_uri : "'default'", + error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + if (book_client) + g_object_unref (book_client); exit (-1); } query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &contacts, NULL); + query_str = e_book_query_to_string (query); e_book_query_unref (query); + if (!e_book_client_get_contacts_sync (book_client, query_str, &contacts, NULL, &error)) + contacts = NULL; + action_list_cards (contacts, p_actctx); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); + g_object_unref (book_client); - return SUCCESS; + if (error) { + g_warning ("Failed to get contacts: %s", error->message); + g_error_free (error); + } + + return error ? FAILED : SUCCESS; } diff --git a/addressbook/tools/evolution-addressbook-export-list-folders.c b/addressbook/tools/evolution-addressbook-export-list-folders.c index 440b757097..82241f8f67 100644 --- a/addressbook/tools/evolution-addressbook-export-list-folders.c +++ b/addressbook/tools/evolution-addressbook-export-list-folders.c @@ -26,7 +26,8 @@ #include <glib/gi18n.h> #include <glib/gstdio.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include "evolution-addressbook-export.h" @@ -36,9 +37,14 @@ action_list_folders_init (ActionContext * p_actctx) ESourceList *addressbooks = NULL; GSList *groups, *group; FILE *outputfile = NULL; - - if (!e_book_get_addressbooks (&addressbooks, NULL)) { - g_warning (_("Couldn't get list of address books")); + GError *error = NULL; + EBookQuery *query; + gchar *query_str; + + if (!e_book_client_get_sources (&addressbooks, &error)) { + g_warning (_("Couldn't get list of address books: %s"), error ? error->message : _("Unknown error")); + if (error) + g_error_free (error); exit (-1); } @@ -49,6 +55,10 @@ action_list_folders_init (ActionContext * p_actctx) } } + query = e_book_query_any_field_contains (""); + query_str = e_book_query_to_string (query); + e_book_query_unref (query); + groups = e_source_list_peek_groups (addressbooks); for (group = groups; group; group = group->next) { ESourceGroup *g = group->data; @@ -57,22 +67,23 @@ action_list_folders_init (ActionContext * p_actctx) sources = e_source_group_peek_sources (g); for (source = sources; source; source = source->next) { ESource *s = source->data; - EBook *book; - EBookQuery *query; - GList *contacts; + EBookClient *book_client; + GSList *contacts; gchar *uri; const gchar *name; - book = e_book_new (s, NULL); - if (!book - || !e_book_open (book, TRUE, NULL)) { - g_warning (_("failed to open book")); + error = NULL; + book_client = e_book_client_new (s, &error); + if (!book_client + || !e_client_open_sync (E_CLIENT (book_client), TRUE, NULL, &error)) { + g_warning (_("Failed to open client '%s': %s"), e_source_peek_name (s), error ? error->message : _("Unknown error")); + if (error) + g_error_free (error); continue; } - query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &contacts, NULL); - e_book_query_unref (query); + if (!e_book_client_get_contacts_sync (book_client, query_str, &contacts, NULL, &error)) + contacts = NULL; uri = e_source_get_uri (s); name = e_source_peek_name (s); @@ -80,18 +91,20 @@ action_list_folders_init (ActionContext * p_actctx) if (outputfile) fprintf ( outputfile, "\"%s\",\"%s\",%d\n", - uri, name, g_list_length (contacts)); + uri, name, g_slist_length (contacts)); else - printf ("\"%s\",\"%s\",%d\n", uri, name, g_list_length (contacts)); + printf ("\"%s\",\"%s\",%d\n", uri, name, g_slist_length (contacts)); g_free (uri); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); - g_object_unref (book); + g_object_unref (book_client); } } + g_free (query_str); + if (outputfile) fclose (outputfile); diff --git a/addressbook/tools/evolution-addressbook-export.c b/addressbook/tools/evolution-addressbook-export.c index e780cfbfda..56a2b14a54 100644 --- a/addressbook/tools/evolution-addressbook-export.c +++ b/addressbook/tools/evolution-addressbook-export.c @@ -27,7 +27,7 @@ #include <string.h> #include <glib/gi18n.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include "evolution-addressbook-export.h" diff --git a/addressbook/util/eab-book-util.c b/addressbook/util/eab-book-util.c index 638f536c37..de6900d1d0 100644 --- a/addressbook/util/eab-book-util.c +++ b/addressbook/util/eab-book-util.c @@ -25,143 +25,9 @@ #include <config.h> #endif -#include "eab-book-util.h" - #include <string.h> -/* - * - * Specialized Queries - * - */ - -static gchar * -escape (const gchar *str) -{ - GString *s = g_string_new (NULL); - const gchar *p = str; - - while (*p) { - if (*p == '\\') - g_string_append_len (s, "\\\\", 2); - else if (*p == '"') - g_string_append_len (s, "\\\"", 2); - else - g_string_append_c (s, *p); - - p++; - } - - return g_string_free (s, FALSE); -} - -guint -eab_name_and_email_query (EBook *book, - const gchar *name, - const gchar *email, - EBookListAsyncCallback cb, - gpointer closure) -{ - gchar *email_query=NULL, *name_query=NULL; - EBookQuery *query; - guint tag; - gchar *escaped_name, *escaped_email; - - g_return_val_if_fail (book && E_IS_BOOK (book), 0); - g_return_val_if_fail (cb != NULL, 0); - - if (name && !*name) - name = NULL; - if (email && !*email) - email = NULL; - - if (name == NULL && email == NULL) - return 0; - - escaped_name = name ? escape (name) : NULL; - escaped_email = email ? escape (email) : NULL; - - /* Build our e-mail query. - * We only query against the username part of the address, to avoid not matching - * fred@foo.com and fred@mail.foo.com. While their may be namespace collisions - * in the usernames of everyone out there, it shouldn't be that bad. (Famous last words.) - * But if name is missing we query against complete email id to avoid matching emails like - * users@foo.org with users@bar.org - */ - if (escaped_email) { - const gchar *t = escaped_email; - while (*t && *t != '@') - ++t; - if (*t == '@' && escaped_name) { - email_query = g_strdup_printf ("(beginswith \"email\" \"%.*s@\")", (gint)(t-escaped_email), escaped_email); - - } else { - email_query = g_strdup_printf ("(beginswith \"email\" \"%s\")", escaped_email); - } - } - - /* Build our name query.*/ - - if (escaped_name) - name_query = g_strdup_printf ("(or (beginswith \"file_as\" \"%s\") (beginswith \"full_name\" \"%s\"))", escaped_name, escaped_name); - - /* Assemble our e-mail & name queries */ - if (email_query && name_query) { - gchar *full_query = g_strdup_printf ("(and %s %s)", email_query, name_query); - query = e_book_query_from_string (full_query); - g_free (full_query); - } - else if (email_query) { - query = e_book_query_from_string (email_query); - } - else if (name_query) { - query = e_book_query_from_string (name_query); - } - else - return 0; - - tag = e_book_get_contacts_async (book, query, cb, closure); - - g_free (email_query); - g_free (name_query); - g_free (escaped_email); - g_free (escaped_name); - e_book_query_unref (query); - - return tag; -} - -/* - * Simple nickname query - */ -guint -eab_nickname_query (EBook *book, - const gchar *nickname, - EBookListAsyncCallback cb, - gpointer closure) -{ - EBookQuery *query; - gchar *query_string; - guint retval; - - g_return_val_if_fail (E_IS_BOOK (book), 0); - g_return_val_if_fail (nickname != NULL, 0); - - /* The empty-string case shouldn't generate a warning. */ - if (!*nickname) - return 0; - - query_string = g_strdup_printf ("(is \"nickname\" \"%s\")", nickname); - - query = e_book_query_from_string (query_string); - - retval = e_book_get_contacts_async (book, query, cb, closure); - - g_free (query_string); - e_book_query_unref (query); - - return retval; -} +#include "eab-book-util.h" /* Copied from camel_strstrcase */ static gchar * @@ -188,10 +54,10 @@ eab_strstrcase (const gchar *haystack, const gchar *needle) return NULL; } -GList* +GSList * eab_contact_list_from_string (const gchar *str) { - GList *contacts = NULL; + GSList *contacts = NULL; GString *gstr = g_string_new (NULL); gchar *str_stripped; gchar *p = (gchar *) str; @@ -249,20 +115,20 @@ eab_contact_list_from_string (const gchar *str) break; card_str = g_strndup (p, q - p); - contacts = g_list_append (contacts, e_contact_new_from_vcard (card_str)); + contacts = g_slist_prepend (contacts, e_contact_new_from_vcard (card_str)); g_free (card_str); } g_free (str_stripped); - return contacts; + return g_slist_reverse (contacts); } gchar * -eab_contact_list_to_string (GList *contacts) +eab_contact_list_to_string (const GSList *contacts) { GString *str = g_string_new (""); - GList *l; + const GSList *l; for (l = contacts; l; l = l->next) { EContact *contact = l->data; @@ -277,13 +143,13 @@ eab_contact_list_to_string (GList *contacts) } gboolean -eab_book_and_contact_list_from_string (const gchar *str, EBook **book, GList **contacts) +eab_book_and_contact_list_from_string (const gchar *str, EBookClient **book_client, GSList **contacts) { const gchar *s0, *s1; gchar *uri; g_return_val_if_fail (str != NULL, FALSE); - g_return_val_if_fail (book != NULL, FALSE); + g_return_val_if_fail (book_client != NULL, FALSE); g_return_val_if_fail (contacts != NULL, FALSE); *contacts = eab_contact_list_from_string (str); @@ -300,19 +166,19 @@ eab_book_and_contact_list_from_string (const gchar *str, EBook **book, GList **c } if (!s0 || !s1) { - *book = NULL; + *book_client = NULL; return FALSE; } uri = g_strndup (s0, s1 - s0); - *book = e_book_new_from_uri (uri, NULL); + *book_client = e_book_client_new_from_uri (uri, NULL); g_free (uri); - return *book ? TRUE : FALSE; + return *book_client ? TRUE : FALSE; } gchar * -eab_book_and_contact_list_to_string (EBook *book, GList *contacts) +eab_book_and_contact_list_to_string (EBookClient *book_client, const GSList *contacts) { gchar *s0, *s1; @@ -320,8 +186,8 @@ eab_book_and_contact_list_to_string (EBook *book, GList *contacts) if (!s0) s0 = g_strdup (""); - if (book) - s1 = g_strconcat ("Book: ", e_book_get_uri (book), "\r\n", s0, NULL); + if (book_client) + s1 = g_strconcat ("Book: ", e_client_get_uri (E_CLIENT (book_client)), "\r\n", s0, NULL); else s1 = g_strdup (s0); @@ -329,70 +195,6 @@ eab_book_and_contact_list_to_string (EBook *book, GList *contacts) return s1; } -#ifdef notyet -/* - * Convenience routine to check for addresses in the local address book. - */ - -typedef struct _HaveAddressInfo HaveAddressInfo; -struct _HaveAddressInfo { - gchar *email; - EBookHaveAddressCallback cb; - gpointer closure; -}; - -static void -have_address_query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *contacts, gpointer closure) -{ - HaveAddressInfo *info = (HaveAddressInfo *) closure; - - info->cb (book, - info->email, - contacts && (status == E_BOOK_ERROR_OK) ? E_CONTACT (contacts->data) : NULL, - info->closure); - - g_free (info->email); - g_free (info); -} - -static void -have_address_book_open_cb (EBook *book, gpointer closure) -{ - HaveAddressInfo *info = (HaveAddressInfo *) closure; - - if (book) { - - e_book_name_and_email_query (book, NULL, info->email, have_address_query_cb, info); - - } else { - - info->cb (NULL, info->email, NULL, info->closure); - - g_free (info->email); - g_free (info); - - } -} - -void -eab_query_address_default (const gchar *email, - EABHaveAddressCallback cb, - gpointer closure) -{ - HaveAddressInfo *info; - - g_return_if_fail (email != NULL); - g_return_if_fail (cb != NULL); - - info = g_new0 (HaveAddressInfo, 1); - info->email = g_strdup (email); - info->cb = cb; - info->closure = closure; - - e_book_use_default_book (have_address_book_open_cb, info); -} -#endif - /* bad place for this i know. */ gint e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, gint len) diff --git a/addressbook/util/eab-book-util.h b/addressbook/util/eab-book-util.h index 1cda93c102..602e7bd44b 100644 --- a/addressbook/util/eab-book-util.h +++ b/addressbook/util/eab-book-util.h @@ -21,42 +21,22 @@ * */ -#ifndef __EAB_UTIL_H__ -#define __EAB_UTIL_H__ +#ifndef EAB_BOOK_UTIL_H +#define EAB_BOOK_UTIL_H -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> G_BEGIN_DECLS -typedef void (*EABHaveAddressCallback) (EBook *book, const gchar *addr, EContact *contact, gpointer closure); +GSList * eab_contact_list_from_string (const gchar *str); +gchar * eab_contact_list_to_string (const GSList *contacts); -/* Specialized Name/Email Queries */ -guint eab_name_and_email_query (EBook *book, - const gchar *name, - const gchar *email, - EBookListAsyncCallback cb, - gpointer closure); -guint eab_nickname_query (EBook *book, - const gchar *nickname, - EBookListAsyncCallback cb, - gpointer closure); +gboolean eab_book_and_contact_list_from_string (const gchar *str, EBookClient **book_client, GSList **contacts); +gchar * eab_book_and_contact_list_to_string (EBookClient *book_client, const GSList *contacts); -GList *eab_contact_list_from_string (const gchar *str); -gchar *eab_contact_list_to_string (GList *contacts); - -gboolean eab_book_and_contact_list_from_string (const gchar *str, EBook **book, GList **contacts); -gchar *eab_book_and_contact_list_to_string (EBook *book, GList *contacts); - -/* Returns the EContact associated to email in the callback, - or NULL if no match is found in the default address book. */ -void eab_query_address_default (const gchar *email, - EABHaveAddressCallback cb, - gpointer closure); - -gint e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, gint len); -gint e_utf8_casefold_collate (const gchar *str1, const gchar *str2); +gint e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, gint len); +gint e_utf8_casefold_collate (const gchar *str1, const gchar *str2); G_END_DECLS -#endif /* __EAB_UTIL_H__ */ - +#endif /* EAB_BOOK_UTIL_H */ diff --git a/calendar/Makefile.am b/calendar/Makefile.am index dfed6e66c7..76bc20338d 100644 --- a/calendar/Makefile.am +++ b/calendar/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = common importers gui +SUBDIRS = importers gui error_DATA = calendar.error errordir = $(privdatadir)/errors diff --git a/calendar/common/Makefile.am b/calendar/common/Makefile.am deleted file mode 100644 index 5a6c18f417..0000000000 --- a/calendar/common/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -noinst_LTLIBRARIES = libevolution-calendarprivate.la - -ecalendarcommonincludedir = $(privincludedir)/calendar/common -ecalendarcommoninclude_HEADERS = \ - authentication.h - -libevolution_calendarprivate_la_CPPFLAGS = \ - $(AM_CPPFLAGS) \ - -DG_LOG_DOMAIN=\"calendar-gui\" \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/shell \ - -I$(top_srcdir) \ - -I$(top_srcdir)/calendar \ - -I$(top_srcdir)/widgets \ - $(EVOLUTION_CALENDAR_CFLAGS) - -libevolution_calendarprivate_la_SOURCES = \ - authentication.c \ - authentication.h - --include $(top_srcdir)/git.mk diff --git a/calendar/common/authentication.c b/calendar/common/authentication.c deleted file mode 100644 index 7989107e64..0000000000 --- a/calendar/common/authentication.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <glib/gi18n.h> -#include <libedataserver/e-source.h> -#include <libedataserverui/e-passwords.h> -#include "authentication.h" -#include <libedataserver/e-url.h> - -static gboolean -get_remember_password (ESource *source) -{ - const gchar *value; - - value = e_source_get_property (source, "remember_password"); - if (value && !g_ascii_strcasecmp (value, "true")) - return TRUE; - - return FALSE; -} - -static void -set_remember_password (ESource *source, gboolean value) -{ - e_source_set_property (source, "remember_password", - value ? "true" : "false"); -} - -static gchar * -auth_func_cb (ECal *ecal, - const gchar *prompt, - const gchar *key, - gpointer user_data) -{ - gchar *password, *auth_domain; - ESource *source; - const gchar *component_name; - - source = e_cal_get_source (ecal); - auth_domain = e_source_get_duped_property (source, "auth-domain"); - component_name = auth_domain ? auth_domain : "Calendar"; - password = e_passwords_get_password (component_name, key); - - if (!password) { - gboolean remember; - - remember = get_remember_password (source); - - password = e_passwords_ask_password ( - _("Enter password"), - component_name, key, prompt, - E_PASSWORDS_REMEMBER_FOREVER | - E_PASSWORDS_SECRET | - E_PASSWORDS_ONLINE, - &remember, NULL); - - if (password) - set_remember_password (source, remember); - } - - g_free (auth_domain); - - return password; -} - -static gchar * -build_pass_key (ECal *ecal) -{ - gchar *euri_str; - const gchar *uri; - EUri *euri; - - uri = e_cal_get_uri (ecal); - - euri = e_uri_new (uri); - euri_str = e_uri_to_string (euri, FALSE); - - e_uri_free (euri); - return euri_str; -} - -void -e_auth_cal_forget_password (ECal *ecal) -{ - ESource *source = NULL; - const gchar *auth_domain = NULL, *component_name = NULL, *auth_type = NULL; - - source = e_cal_get_source (ecal); - auth_domain = e_source_get_property (source, "auth-domain"); - component_name = auth_domain ? auth_domain : "Calendar"; - - auth_type = e_source_get_property (source, "auth-type"); - if (auth_type) { - gchar *key = NULL; - - key = build_pass_key (ecal); - e_passwords_forget_password (component_name, key); - g_free (key); - } - - e_passwords_forget_password (component_name, e_source_get_uri (source)); -} - -ECal * -e_auth_new_cal_from_default (ECalSourceType type) -{ - ECal *ecal = NULL; - - if (!e_cal_open_default (&ecal, type, auth_func_cb, NULL, NULL)) - return NULL; - - return ecal; -} - -ECal * -e_auth_new_cal_from_source (ESource *source, ECalSourceType type) -{ - ECal *cal; - - cal = e_cal_new (source, type); - if (cal) - e_cal_set_auth_func (cal, (ECalAuthFunc) auth_func_cb, NULL); - - return cal; -} - -typedef struct { - ECal *cal; - GtkWindow *parent; - GCancellable *cancellable; - ECalSourceType source_type; - icaltimezone *default_zone; - - /* Authentication Details */ - gchar *auth_component; -} LoadContext; - -static void -load_cal_source_context_free (LoadContext *context) -{ - if (context->cal != NULL) - g_object_unref (context->cal); - - if (context->parent != NULL) - g_object_unref (context->parent); - - if (context->cancellable != NULL) - g_object_unref (context->cancellable); - - g_free (context->auth_component); - - g_slice_free (LoadContext, context); -} - -static void -load_cal_source_get_auth_details (ESource *source, - LoadContext *context) -{ - const gchar *property; - - /* ECal figures out most of the details before invoking the - * authentication callback, but we still need a component name - * for e_passwords_ask_password(). */ - - /* auth_component */ - - property = e_source_get_property (source, "auth-domain"); - - if (property == NULL) - property = "Calendar"; - - context->auth_component = g_strdup (property); -} - -static gchar * -load_cal_source_authenticate (ECal *cal, - const gchar *prompt, - const gchar *uri, - gpointer not_used) -{ - const gchar *auth_component; - const gchar *title; - GtkWindow *parent; - gchar *password; - - /* XXX Dig up authentication info embedded in the ECal instance. - * (See load_cal_source_thread() for an explanation of why.) */ - auth_component = g_object_get_data (G_OBJECT (cal), "auth-component"); - g_return_val_if_fail (auth_component != NULL, NULL); - - parent = g_object_get_data (G_OBJECT (cal), "parent-window"); - - /* Remember the URI so we don't have to reconstruct it if - * authentication fails and we have to forget the password. */ - g_object_set_data_full ( - G_OBJECT (cal), - "auth-uri", g_strdup (uri), - (GDestroyNotify) g_free); - - /* XXX Dialog windows should not have titles. */ - title = ""; - - password = e_passwords_get_password (auth_component, uri); - - if (password == NULL) { - gboolean remember; - ESource *source = e_cal_get_source (cal); - - remember = get_remember_password (source); - - password = e_passwords_ask_password ( - title, auth_component, uri, - prompt, E_PASSWORDS_REMEMBER_FOREVER | - E_PASSWORDS_SECRET | E_PASSWORDS_ONLINE, - &remember, parent); - - if (password) - set_remember_password (source, remember); - } - - return password; -} - -static void -load_cal_source_thread (GSimpleAsyncResult *simple, - ESource *source, - GCancellable *cancellable) -{ - ECal *cal; - LoadContext *context; - GError *error = NULL; - - context = g_simple_async_result_get_op_res_gpointer (simple); - - /* XXX This doesn't take a GError, it just dumps - * error messages to the terminal... so broken. */ - cal = e_cal_new (source, context->source_type); - g_return_if_fail (cal != NULL); - - if (g_cancellable_set_error_if_cancelled (cancellable, &error)) { - g_simple_async_result_set_from_error (simple, error); - g_object_unref (cal); - g_error_free (error); - return; - } - - if (!e_cal_set_default_timezone (cal, context->default_zone, &error)) { - g_simple_async_result_set_from_error (simple, error); - g_object_unref (cal); - g_error_free (error); - return; - } - - /* XXX e_cal_set_auth_func() does not take a GDestroyNotify callback - * for the 'user_data' argument, which makes the argument rather - * useless. So instead, we'll embed the information needed by - * the authentication callback directly into the ECal instance - * using g_object_set_data_full(). */ - g_object_set_data_full ( - G_OBJECT (cal), "auth-component", - g_strdup (context->auth_component), - (GDestroyNotify) g_free); - if (context->parent != NULL) - g_object_set_data_full ( - G_OBJECT (cal), "parent-window", - g_object_ref (context->parent), - (GDestroyNotify) g_object_unref); - - e_cal_set_auth_func ( - cal, (ECalAuthFunc) load_cal_source_authenticate, NULL); - -try_again: - if (!e_cal_open (cal, FALSE, &error)) - goto fail; - - if (g_cancellable_set_error_if_cancelled (cancellable, &error)) { - g_simple_async_result_set_from_error (simple, error); - g_object_unref (cal); - g_error_free (error); - return; - } - - context->cal = cal; - - return; - -fail: - g_return_if_fail (error != NULL); - - /* If authentication failed, forget the password and reprompt. */ - if (g_error_matches ( - error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED)) { - const gchar *auth_uri; - - /* Retrieve the URI set by the authentication function. */ - auth_uri = g_object_get_data (G_OBJECT (cal), "auth-uri"); - - e_passwords_forget_password ( - context->auth_component, auth_uri); - g_clear_error (&error); - goto try_again; - - /* XXX Might this cause a busy loop? */ - } else if (g_error_matches ( - error, E_CALENDAR_ERROR, E_CALENDAR_STATUS_BUSY)) { - g_clear_error (&error); - g_usleep (250000); - goto try_again; - - } else { - g_simple_async_result_set_from_error (simple, error); - g_object_unref (cal); - g_error_free (error); - } -} - -/** - * e_load_cal_source_async: - * @source: an #ESource - * @source_type: the type of #ECal to load - * @default_zone: default time zone, or %NULL to use UTC - * @parent: parent window for password dialogs, or %NULL - * @cancellable: optional #GCancellable object, %NULL to ignore - * @callback: a #GAsyncReadyCallback to call when the request is satisfied - * @user_data: the data to pass to @callback - * - * Creates a new #ECal specified by @source and opens it, prompting the - * user for authentication if necessary. - * - * When the operation is finished, @callback will be called. You can - * then call e_load_cal_source_finish() to obtain the resulting #ECal. - **/ -void -e_load_cal_source_async (ESource *source, - ECalSourceType source_type, - icaltimezone *default_zone, - GtkWindow *parent, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *simple; - LoadContext *context; - - g_return_if_fail (E_IS_SOURCE (source)); - - /* Source must have a group so we can obtain its URI. */ - g_return_if_fail (e_source_peek_group (source) != NULL); - - if (parent != NULL) { - g_return_if_fail (GTK_IS_WINDOW (parent)); - g_object_ref (parent); - } - - if (cancellable != NULL) { - g_return_if_fail (G_IS_CANCELLABLE (cancellable)); - g_object_ref (cancellable); - } else { - /* always provide cancellable, because the code depends on it */ - cancellable = g_cancellable_new (); - } - - if (default_zone == NULL) - default_zone = icaltimezone_get_utc_timezone (); - - context = g_slice_new0 (LoadContext); - context->parent = parent; - context->cancellable = cancellable; - context->source_type = source_type; - context->default_zone = default_zone; - - /* Extract authentication details from the ESource before - * spawning the thread, since ESource is not thread-safe. */ - load_cal_source_get_auth_details (source, context); - - simple = g_simple_async_result_new ( - G_OBJECT (source), callback, - user_data, e_load_cal_source_async); - - g_simple_async_result_set_op_res_gpointer ( - simple, context, (GDestroyNotify) - load_cal_source_context_free); - - g_simple_async_result_run_in_thread ( - simple, (GSimpleAsyncThreadFunc) load_cal_source_thread, - G_PRIORITY_DEFAULT, context->cancellable); - - g_object_unref (simple); -} - -/** - * e_load_cal_source_finish: - * @source: an #ESource - * @result: a #GAsyncResult - * @error: return location for a #GError, or %NULL - * - * Finishes an asynchronous #ECal open operation started with - * e_load_cal_source_async(). If an error occurred, or the user - * declined to authenticate, the function will return %NULL and - * set @error. - * - * Returns: a ready-to-use #ECal, or %NULL on error - **/ -ECal * -e_load_cal_source_finish (ESource *source, - GAsyncResult *result, - GError **error) -{ - GSimpleAsyncResult *simple; - LoadContext *context; - - g_return_val_if_fail (E_IS_SOURCE (source), NULL); - g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); - - g_return_val_if_fail ( - g_simple_async_result_is_valid ( - result, G_OBJECT (source), - e_load_cal_source_async), NULL); - - simple = G_SIMPLE_ASYNC_RESULT (result); - - if (g_simple_async_result_propagate_error (simple, error)) - return NULL; - - context = g_simple_async_result_get_op_res_gpointer (simple); - g_return_val_if_fail (context != NULL, NULL); - - return g_object_ref (context->cal); -} diff --git a/calendar/common/authentication.h b/calendar/common/authentication.h deleted file mode 100644 index 11b2dc1dfc..0000000000 --- a/calendar/common/authentication.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Authors: - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#ifndef AUTHENTICATION_H -#define AUTHENTICATION_H - -#include <gtk/gtk.h> -#include <libedataserver/e-source.h> -#include <libecal/e-cal.h> - -ECal *e_auth_new_cal_from_default (ECalSourceType type); -ECal *e_auth_new_cal_from_source (ESource *source, ECalSourceType type); -void e_auth_cal_forget_password (ECal *ecal); - -void e_load_cal_source_async (ESource *source, - ECalSourceType source_type, - icaltimezone *default_zone, - GtkWindow *parent, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -ECal * e_load_cal_source_finish (ESource *source, - GAsyncResult *result, - GError **error); - -#endif /* AUTHENTICATION_H */ diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index 0a404d429c..09cc0559b0 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -209,7 +209,6 @@ libevolution_calendar_la_LIBADD = \ $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(top_builddir)/widgets/menus/libmenus.la \ $(top_builddir)/shell/libeshell.la \ - $(top_builddir)/calendar/common/libevolution-calendarprivate.la \ $(top_builddir)/calendar/gui/dialogs/libcal-dialogs.la \ $(top_builddir)/calendar/importers/libevolution-calendar-importers.la \ $(top_builddir)/widgets/e-timezone-dialog/libetimezonedialog.la \ diff --git a/calendar/gui/alarm-notify/Makefile.am b/calendar/gui/alarm-notify/Makefile.am index 5296f95f19..c15181ad9c 100644 --- a/calendar/gui/alarm-notify/Makefile.am +++ b/calendar/gui/alarm-notify/Makefile.am @@ -44,7 +44,6 @@ evolution_alarm_notify_SOURCES = \ evolution_alarm_notify_LDADD = \ $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ - $(top_builddir)/calendar/common/libevolution-calendarprivate.la \ $(CAMEL_LIBS) \ $(EVOLUTION_CALENDAR_LIBS) \ $(CANBERRA_LIBS) \ diff --git a/calendar/gui/alarm-notify/alarm-notify.c b/calendar/gui/alarm-notify/alarm-notify.c index 96e8a177aa..28b10ff602 100644 --- a/calendar/gui/alarm-notify/alarm-notify.c +++ b/calendar/gui/alarm-notify/alarm-notify.c @@ -26,16 +26,16 @@ #include <string.h> #include <camel/camel.h> +#include <libecal/e-cal-client.h> #include <libedataserver/e-url.h> #include <libedataserver/e-data-server-util.h> #include <libedataserverui/e-passwords.h> -#include <libecal/e-cal.h> +#include <libedataserverui/e-client-utils.h> #include "alarm.h" #include "alarm-notify.h" #include "alarm-queue.h" #include "config-data.h" -#include "common/authentication.h" #define APPLICATION_ID "org.gnome.EvolutionAlarmNotify" @@ -43,8 +43,8 @@ struct _AlarmNotifyPrivate { /* Mapping from EUri's to LoadedClient structures */ /* FIXME do we need per source type uri hashes? or perhaps we just need to hash based on source */ - GHashTable *uri_client_hash[E_CAL_SOURCE_TYPE_LAST]; - ESourceList *source_lists[E_CAL_SOURCE_TYPE_LAST]; + GHashTable *uri_client_hash[E_CAL_CLIENT_SOURCE_TYPE_LAST]; + ESourceList *source_lists[E_CAL_CLIENT_SOURCE_TYPE_LAST]; ESourceList *selected_calendars; GMutex *mutex; }; @@ -97,7 +97,7 @@ alarm_notify_list_changed_cb (ESourceList *source_list, AlarmNotify *an) { GSList *groups, *sources, *p, *q; - ECalSourceType source_type = E_CAL_SOURCE_TYPE_LAST; + ECalClientSourceType source_type = E_CAL_CLIENT_SOURCE_TYPE_LAST; ProcessRemovalsData prd; GList *l; gint i; @@ -106,13 +106,13 @@ alarm_notify_list_changed_cb (ESourceList *source_list, source_list, alarm_notify_list_changed_cb, an); /* Figure out the source type */ - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { + for (i = 0; i < E_CAL_CLIENT_SOURCE_TYPE_LAST; i++) { if (source_list == an->priv->source_lists[i]) { source_type = i; break; } } - if (source_type == E_CAL_SOURCE_TYPE_LAST) + if (source_type == E_CAL_CLIENT_SOURCE_TYPE_LAST) return; /* process the additions */ @@ -156,12 +156,12 @@ alarm_notify_list_changed_cb (ESourceList *source_list, static void alarm_notify_load_calendars (AlarmNotify *an, - ECalSourceType source_type) + ECalClientSourceType source_type) { ESourceList *source_list; GSList *groups, *sources, *p, *q; - if (!e_cal_get_sources (&source_list, source_type, NULL)) { + if (!e_cal_client_get_sources (&source_list, source_type, NULL)) { debug (("Cannont get sources")); an->priv->source_lists[source_type] = NULL; @@ -198,7 +198,7 @@ alarm_notify_load_calendars (AlarmNotify *an, static void alarm_notify_dequeue_client (gpointer key, - ECal *client) + ECalClient *client) { alarm_queue_remove_client (client, TRUE); } @@ -211,7 +211,7 @@ alarm_notify_finalize (GObject *object) priv = ALARM_NOTIFY (object)->priv; - for (ii = 0; ii < E_CAL_SOURCE_TYPE_LAST; ii++) { + for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++) { g_hash_table_foreach ( priv->uri_client_hash[ii], (GHFunc) alarm_notify_dequeue_client, NULL); @@ -279,7 +279,7 @@ alarm_notify_init (AlarmNotify *an) an->priv->selected_calendars = config_data_get_calendars ( "/apps/evolution/calendar/sources"); - for (ii = 0; ii < E_CAL_SOURCE_TYPE_LAST; ii++) + for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++) an->priv->uri_client_hash[ii] = g_hash_table_new_full ( g_str_hash, g_str_equal, (GDestroyNotify) g_free, @@ -287,7 +287,7 @@ alarm_notify_init (AlarmNotify *an) alarm_queue_init (an); - for (ii = 0; ii < E_CAL_SOURCE_TYPE_LAST; ii++) + for (ii = 0; ii < E_CAL_CLIENT_SOURCE_TYPE_LAST; ii++) alarm_notify_load_calendars (an, ii); } @@ -313,22 +313,30 @@ alarm_notify_new (void) } static void -cal_opened_cb (ECal *client, const GError *error, gpointer user_data) +client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { AlarmNotifyPrivate *priv; AlarmNotify *an = ALARM_NOTIFY (user_data); + EClient *client = NULL; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; priv = an->priv; - debug (("%s - Calendar Status %d%s%s%s", e_cal_get_uri (client), error ? error->code : 0, error ? " (" : "", error ? error->message : "", error ? ")" : "")); + debug (("%s - Calendar Status %d%s%s%s", e_client_get_uri (client), error ? error->code : 0, error ? " (" : "", error ? error->message : "", error ? ")" : "")); + + if (!error) { + ECalClient *cal_client = E_CAL_CLIENT (client); + + g_hash_table_insert (priv->uri_client_hash[e_cal_client_get_source_type (cal_client)], g_strdup (e_client_get_uri (client)), cal_client); + /* to resolve floating DATE-TIME properly */ + e_cal_client_set_default_timezone (cal_client, config_data_get_timezone ()); - if (!error) - alarm_queue_add_client (client); - else { - g_hash_table_remove (priv->uri_client_hash[e_cal_get_source_type (client)], - e_cal_get_uri (client)); - g_signal_handlers_disconnect_matched (G_OBJECT (client), G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, an); + alarm_queue_add_client (cal_client); + } else { + g_error_free (error); } } @@ -344,10 +352,9 @@ cal_opened_cb (ECal *client, const GError *error, gpointer user_data) * that it can be loaded in the future when the alarm daemon starts up. **/ void -alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource *source, gboolean load_afterwards) +alarm_notify_add_calendar (AlarmNotify *an, ECalClientSourceType source_type, ESource *source, gboolean load_afterwards) { AlarmNotifyPrivate *priv; - ECal *client; EUri *e_uri; gchar *str_uri; gchar *pass_key; @@ -390,16 +397,16 @@ alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource } } - client = e_auth_new_cal_from_source (source, source_type); + debug (("%s - Calendar Open Async... %p", str_uri, source)); - if (client) { - debug (("%s - Calendar Open Async... %p", str_uri, client)); - g_hash_table_insert (priv->uri_client_hash[source_type], g_strdup (str_uri), client); - g_signal_connect (G_OBJECT (client), "cal_opened_ex", G_CALLBACK (cal_opened_cb), an); - /* to resolve floating DATE-TIME properly */ - e_cal_set_default_timezone (client, config_data_get_timezone (), NULL); - e_cal_open_async (client, FALSE); - } + e_client_utils_open_new (source, + source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS ? E_CLIENT_SOURCE_TYPE_EVENTS : + source_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS ? E_CLIENT_SOURCE_TYPE_TASKS : + source_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS ? E_CLIENT_SOURCE_TYPE_MEMOS : + E_CLIENT_SOURCE_TYPE_LAST, + TRUE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_cb, an); g_free (str_uri); g_free (pass_key); @@ -407,17 +414,17 @@ alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource } void -alarm_notify_remove_calendar (AlarmNotify *an, ECalSourceType source_type, const gchar *str_uri) +alarm_notify_remove_calendar (AlarmNotify *an, ECalClientSourceType source_type, const gchar *str_uri) { AlarmNotifyPrivate *priv; - ECal *client; + ECalClient *cal_client; priv = an->priv; - client = g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri); - if (client) { - debug (("Removing Client %p", client)); - alarm_queue_remove_client (client, FALSE); + cal_client = g_hash_table_lookup (priv->uri_client_hash[source_type], str_uri); + if (cal_client) { + debug (("Removing Client %p", cal_client)); + alarm_queue_remove_client (cal_client, FALSE); g_hash_table_remove (priv->uri_client_hash[source_type], str_uri); } } diff --git a/calendar/gui/alarm-notify/alarm-notify.h b/calendar/gui/alarm-notify/alarm-notify.h index de7e0398a6..51837d21d5 100644 --- a/calendar/gui/alarm-notify/alarm-notify.h +++ b/calendar/gui/alarm-notify/alarm-notify.h @@ -27,7 +27,8 @@ #define ALARM_NOTIFY_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> /* Standard GObject macros */ #define TYPE_ALARM_NOTIFY \ @@ -66,11 +67,11 @@ struct _AlarmNotifyClass { GType alarm_notify_get_type (void); AlarmNotify * alarm_notify_new (void); void alarm_notify_add_calendar (AlarmNotify *an, - ECalSourceType source_type, + ECalClientSourceType source_type, ESource *source, gboolean load_afterwards); void alarm_notify_remove_calendar (AlarmNotify *an, - ECalSourceType source_type, + ECalClientSourceType source_type, const gchar *str_uri); ESourceList * alarm_notify_get_selected_calendars (AlarmNotify *an); diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c index e8e5485e45..fde985f8be 100644 --- a/calendar/gui/alarm-notify/alarm-queue.c +++ b/calendar/gui/alarm-notify/alarm-queue.c @@ -34,6 +34,7 @@ #include <canberra-gtk.h> #endif +#include <libecal/e-cal-client-view.h> #include <libecal/e-cal-time-util.h> #include <libecal/e-cal-component.h> @@ -69,10 +70,10 @@ static AlarmNotify *an; /* Structure that stores a client we are monitoring */ typedef struct { /* Monitored client */ - ECal *client; + ECalClient *cal_client; - /* The live query to the calendar */ - ECalView *query; + /* The live view to the calendar */ + ECalClientView *view; /* Hash table of component UID -> CompQueuedAlarms. If an element is * present here, then it means its cqa->queued_alarms contains at least @@ -142,17 +143,17 @@ static void popup_notification (time_t trigger, gpointer alarm_id, gboolean use_description); #endif -static void query_objects_changed_cb (ECal *client, - GList *objects, +static void query_objects_modified_cb (ECalClientView *view, + const GSList *objects, gpointer data); -static void query_objects_removed_cb (ECal *client, - GList *objects, +static void query_objects_removed_cb (ECalClientView *view, + const GSList *uids, gpointer data); static void update_cqa (CompQueuedAlarms *cqa, ECalComponent *comp); static void update_qa (ECalComponentAlarms *alarms, QueuedAlarm *qa); static void tray_list_remove_cqa (CompQueuedAlarms *cqa); -static void on_dialog_objs_removed_cb (ECal *client, GList *objects, gpointer data); +static void on_dialog_objs_removed_cb (ECalClientView *view, const GSList *uids, gpointer data); /* Alarm queue engine */ @@ -299,9 +300,9 @@ midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data) /* Looks up a client in the client alarms hash table */ static ClientAlarms * -lookup_client (ECal *client) +lookup_client (ECalClient *cal_client) { - return g_hash_table_lookup (client_alarms_hash, client); + return g_hash_table_lookup (client_alarms_hash, cal_client); } /* Looks up a queued alarm based on its alarm ID */ @@ -347,10 +348,21 @@ remove_queued_alarm (CompQueuedAlarms *cqa, gpointer alarm_id, cqa->queued_alarms = g_slist_delete_link (cqa->queued_alarms, l); if (remove_alarm) { - cqa->expecting_update = TRUE; - e_cal_discard_alarm (cqa->parent_client->client, cqa->alarms->comp, - qa->instance->auid, NULL); - cqa->expecting_update = FALSE; + GError *error = NULL; + ECalComponentId *id = e_cal_component_get_id (cqa->alarms->comp); + if (id) { + cqa->expecting_update = TRUE; + e_cal_client_discard_alarm_sync (cqa->parent_client->cal_client, id->uid, id->rid, + qa->instance->auid, NULL, &error); + cqa->expecting_update = FALSE; + + if (error) { + if (!g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_NOT_SUPPORTED)) + g_debug ("%s: Failed to discard alarm: %s", G_STRFUNC, error->message); + g_error_free (error); + } + e_cal_component_free_id (id); + } } g_free (qa); @@ -425,7 +437,7 @@ alarm_trigger_cb (gpointer alarm_id, time_t trigger, gpointer data) cqa = data; comp = cqa->alarms->comp; - config_data_set_last_notification_time (cqa->parent_client->client, trigger); + config_data_set_last_notification_time (cqa->parent_client->cal_client, trigger); debug (("Setting Last notification time to %s", e_ctime (&trigger))); qa = lookup_queued_alarm (cqa, alarm_id); @@ -543,6 +555,7 @@ static void load_alarms (ClientAlarms *ca, time_t start, time_t end) { gchar *str_query, *iso_start, *iso_end; + GError *error = NULL; debug (("...")); @@ -563,31 +576,36 @@ load_alarms (ClientAlarms *ca, time_t start, time_t end) g_free (iso_end); /* create the live query */ - if (ca->query) { + if (ca->view) { debug (("Disconnecting old queries")); g_signal_handlers_disconnect_matched ( - ca->query, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); - g_object_unref (ca->query); - ca->query = NULL; + ca->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); + g_object_unref (ca->view); + ca->view = NULL; } - /* FIXME: handle errors */ - if (!e_cal_get_query (ca->client, str_query, &ca->query, NULL)) { - g_warning (G_STRLOC ": Could not get query for client"); + if (!e_cal_client_get_view_sync (ca->cal_client, str_query, &ca->view, NULL, &error)) { + g_debug ("%s: Could not get query for client: %s", error ? error->message : "Unknown error", G_STRFUNC); + if (error) + g_error_free (error); } else { debug (("Setting Call backs")); g_signal_connect ( - ca->query, "objects_added", - G_CALLBACK (query_objects_changed_cb), ca); + ca->view, "objects-added", + G_CALLBACK (query_objects_modified_cb), ca); g_signal_connect ( - ca->query, "objects_modified", - G_CALLBACK (query_objects_changed_cb), ca); + ca->view, "objects-modified", + G_CALLBACK (query_objects_modified_cb), ca); g_signal_connect ( - ca->query, "objects_removed", + ca->view, "objects-removed", G_CALLBACK (query_objects_removed_cb), ca); - e_cal_view_start (ca->query); + e_cal_client_view_start (ca->view, &error); + if (error) { + g_debug ("%s: Failed to start view: %s", G_STRFUNC, error->message); + g_error_free (error); + } } g_free (str_query); @@ -609,7 +627,7 @@ load_alarms_for_today (ClientAlarms *ca) * half-open; we do not want to display the "last" displayed alarm * twice, once when it occurs and once when the alarm daemon restarts. */ - from = config_data_get_last_notification_time (ca->client) + 1; + from = config_data_get_last_notification_time (ca->cal_client) + 1; if (from <= 0) from = MAX (from, day_start); @@ -618,20 +636,6 @@ load_alarms_for_today (ClientAlarms *ca) load_alarms (ca, from, day_end); } -/* Called when a calendar client finished loading; we load its alarms */ -static void -cal_opened_cb (ECal *client, const GError *error, gpointer data) -{ - ClientAlarms *ca; - - ca = data; - - if (error) - return; - - load_alarms_for_today (ca); -} - /* Looks up a component's queued alarm structure in a client alarms structure */ static CompQueuedAlarms * lookup_comp_queued_alarms (ClientAlarms *ca, const ECalComponentId *id) @@ -693,35 +697,71 @@ remove_comp (ClientAlarms *ca, ECalComponentId *id) */ struct _query_msg { Message header; - GList *objects; + GSList *objects; gpointer data; }; -static GList * -duplicate_ical (GList *in_list) +static GSList * +duplicate_ical (const GSList *in_list) { - GList *l, *out_list = NULL; + const GSList *l; + GSList *out_list = NULL; for (l = in_list; l; l = l->next) { - out_list = g_list_prepend (out_list, icalcomponent_new_clone (l->data)); + out_list = g_slist_prepend (out_list, icalcomponent_new_clone (l->data)); } - return g_list_reverse (out_list); + return g_slist_reverse (out_list); } -static GList * -duplicate_ecal (GList *in_list) +static GSList * +duplicate_ecal (const GSList *in_list) { - GList *l, *out_list = NULL; + const GSList *l; + GSList *out_list = NULL; for (l = in_list; l; l = l->next) { ECalComponentId *id, *old; old = l->data; id = g_new0 (ECalComponentId, 1); id->uid = g_strdup (old->uid); id->rid = g_strdup (old->rid); - out_list = g_list_prepend (out_list, id); + out_list = g_slist_prepend (out_list, id); + } + + return g_slist_reverse (out_list); +} + +static gboolean +get_alarms_for_object (ECalClient *cal_client, const ECalComponentId *id, time_t start, time_t end, ECalComponentAlarms **alarms) +{ + icalcomponent *icalcomp; + ECalComponent *comp; + ECalComponentAlarmAction omit[] = {-1}; + + g_return_val_if_fail (cal_client != NULL, FALSE); + g_return_val_if_fail (id != NULL, FALSE); + g_return_val_if_fail (alarms != NULL, FALSE); + g_return_val_if_fail (start >= 0 && end >= 0, FALSE); + g_return_val_if_fail (start <= end, FALSE); + + if (!e_cal_client_get_object_sync (cal_client, id->uid, id->rid, &icalcomp, NULL, NULL)) + return FALSE; + + if (!icalcomp) + return FALSE; + + comp = e_cal_component_new (); + if (!e_cal_component_set_icalcomponent (comp, icalcomp)) { + icalcomponent_free (icalcomp); + g_object_unref (comp); + return FALSE; } - return g_list_reverse (out_list); + *alarms = e_cal_util_generate_alarms_for_comp (comp, start, end, omit, e_cal_client_resolve_tzid_cb, + cal_client, e_cal_client_get_default_timezone (cal_client)); + + g_object_unref (comp); + + return TRUE; } static void @@ -733,13 +773,13 @@ query_objects_changed_async (struct _query_msg *msg) gboolean found; icaltimezone *zone; CompQueuedAlarms *cqa; - GList *l; - GList *objects; + GSList *l; + GSList *objects; ca = msg->data; objects = msg->objects; - from = config_data_get_last_notification_time (ca->client); + from = config_data_get_last_notification_time (ca->cal_client); if (from == -1) from = time (NULL); else @@ -757,10 +797,10 @@ query_objects_changed_async (struct _query_msg *msg) e_cal_component_set_icalcomponent (comp, l->data); id = e_cal_component_get_id (comp); - found = e_cal_get_alarms_for_object (ca->client, id, from, day_end, &alarms); + found = get_alarms_for_object (ca->cal_client, id, from, day_end, &alarms); if (!found) { - debug (("No Alarm found for client %p", ca->client)); + debug (("No Alarm found for client %p", ca->cal_client)); tray_list_remove_cqa (lookup_comp_queued_alarms (ca, id)); remove_comp (ca, id); g_hash_table_remove (ca->uid_alarms_hash, id); @@ -826,13 +866,13 @@ query_objects_changed_async (struct _query_msg *msg) g_object_unref (comp); comp = NULL; } - g_list_free (objects); + g_slist_free (objects); g_slice_free (struct _query_msg, msg); } static void -query_objects_changed_cb (ECal *client, GList *objects, gpointer data) +query_objects_modified_cb (ECalClientView *view, const GSList *objects, gpointer data) { struct _query_msg *msg; @@ -851,13 +891,13 @@ static void query_objects_removed_async (struct _query_msg *msg) { ClientAlarms *ca; - GList *l; - GList *objects; + GSList *l; + GSList *objects; ca = msg->data; objects = msg->objects; - debug (("Removing %d objects", g_list_length (objects))); + debug (("Removing %d objects", g_slist_length (objects))); for (l = objects; l != NULL; l = l->next) { /* If the alarm is already triggered remove it. */ @@ -867,19 +907,19 @@ query_objects_removed_async (struct _query_msg *msg) e_cal_component_free_id (l->data); } - g_list_free (objects); + g_slist_free (objects); g_slice_free (struct _query_msg, msg); } static void -query_objects_removed_cb (ECal *client, GList *objects, gpointer data) +query_objects_removed_cb (ECalClientView *view, const GSList *uids, gpointer data) { struct _query_msg *msg; msg = g_slice_new0 (struct _query_msg); msg->header.func = (MessageFunc) query_objects_removed_async; - msg->objects = duplicate_ecal (objects); + msg->objects = duplicate_ecal (uids); msg->data = data; message_push ((Message *) msg); @@ -919,7 +959,7 @@ create_snooze (CompQueuedAlarms *cqa, gpointer alarm_id, gint snooze_mins) /* Launches a component editor for a component */ static void -edit_component (ECal *client, ECalComponent *comp) +edit_component (ECalClient *cal_client, ECalComponent *comp) { ESource *source; gchar *command_line; @@ -931,19 +971,19 @@ edit_component (ECal *client, ECalComponent *comp) /* XXX Don't we have a function to construct these URIs? * How are other apps expected to know this stuff? */ - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (cal_client)); source_uid = e_source_peek_uid (source); e_cal_component_get_uid (comp, &comp_uid); - switch (e_cal_get_source_type (client)) { - case E_CAL_SOURCE_TYPE_EVENT: + switch (e_cal_client_get_source_type (cal_client)) { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: scheme = "calendar:"; break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: scheme = "task:"; break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: scheme = "memo:"; break; default: @@ -973,8 +1013,8 @@ typedef struct { CompQueuedAlarms *cqa; gpointer alarm_id; ECalComponent *comp; - ECal *client; - ECalView *query; + ECalClient *cal_client; + ECalClientView *view; GdkPixbuf *image; GtkTreeIter iter; } TrayIconData; @@ -999,13 +1039,13 @@ free_tray_icon_data (TrayIconData *tray_data) tray_data->location = NULL; } - g_object_unref (tray_data->client); - tray_data->client = NULL; + g_object_unref (tray_data->cal_client); + tray_data->cal_client = NULL; - g_signal_handlers_disconnect_matched (tray_data->query, G_SIGNAL_MATCH_FUNC, + g_signal_handlers_disconnect_matched (tray_data->view, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_dialog_objs_removed_cb, NULL); - g_object_unref (tray_data->query); - tray_data->query = NULL; + g_object_unref (tray_data->view); + tray_data->view = NULL; g_object_unref (tray_data->comp); tray_data->comp = NULL; @@ -1020,44 +1060,47 @@ free_tray_icon_data (TrayIconData *tray_data) static void on_dialog_objs_removed_async (struct _query_msg *msg) { - const gchar *our_uid; - GList *l; TrayIconData *tray_data; - GList *objects; + GSList *l, *objects; + ECalComponentId *our_id; debug (("...")); tray_data = msg->data; objects = msg->objects; - e_cal_component_get_uid (tray_data->comp, &our_uid); - g_return_if_fail (our_uid && *our_uid); + our_id = e_cal_component_get_id (tray_data->comp); + g_return_if_fail (our_id); for (l = objects; l != NULL; l = l->next) { - const gchar *uid = l->data; + ECalComponentId *id = l->data; - if (!uid) + if (!id) continue; - if (!strcmp (uid, our_uid)) { + if (g_strcmp0 (id->uid, our_id->uid) == 0&& g_strcmp0 (id->rid, our_id->rid) == 0) { tray_data->cqa = NULL; tray_data->alarm_id = NULL; tray_icons_list = g_list_remove (tray_icons_list, tray_data); tray_data = NULL; } + + e_cal_component_free_id (id); } + e_cal_component_free_id (our_id); + g_slist_free (objects); g_slice_free (struct _query_msg, msg); } static void -on_dialog_objs_removed_cb (ECal *client, GList *objects, gpointer data) +on_dialog_objs_removed_cb (ECalClientView *view, const GSList *uids, gpointer data) { struct _query_msg *msg; msg = g_slice_new0 (struct _query_msg); msg->header.func = (MessageFunc) on_dialog_objs_removed_async; - msg->objects = objects; + msg->objects = duplicate_ecal (uids); msg->data = data; message_push ((Message *) msg); @@ -1219,7 +1262,7 @@ notify_dialog_cb (AlarmNotifyResult result, gint snooze_mins, gpointer data) debug (("Received from dialog")); - g_signal_handlers_disconnect_matched (tray_data->query, G_SIGNAL_MATCH_FUNC, + g_signal_handlers_disconnect_matched (tray_data->view, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_dialog_objs_removed_cb, NULL); switch (result) { @@ -1254,7 +1297,7 @@ notify_dialog_cb (AlarmNotifyResult result, gint snooze_mins, gpointer data) break; case ALARM_NOTIFY_EDIT: - edit_component (tray_data->client, tray_data->comp); + edit_component (tray_data->cal_client, tray_data->comp); break; @@ -1530,11 +1573,11 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, tray_data->cqa = cqa; tray_data->alarm_id = alarm_id; tray_data->comp = g_object_ref (e_cal_component_clone (comp)); - tray_data->client = cqa->parent_client->client; - tray_data->query = g_object_ref (cqa->parent_client->query); + tray_data->cal_client = cqa->parent_client->cal_client; + tray_data->view = g_object_ref (cqa->parent_client->view); tray_data->blink_state = FALSE; tray_data->snooze_set = FALSE; - g_object_ref (tray_data->client); + g_object_ref (tray_data->cal_client); /* Task to add tray_data to the global tray_icon_list */ tray_list_add_new (tray_data); @@ -1558,7 +1601,7 @@ display_notification (time_t trigger, CompQueuedAlarms *cqa, g_free (time_str); g_free (str); - g_signal_connect (G_OBJECT (tray_data->query), "objects_removed", + g_signal_connect (G_OBJECT (tray_data->view), "objects_removed", G_CALLBACK (on_dialog_objs_removed_cb), tray_data); /* FIXME: We should remove this check */ @@ -1731,8 +1774,7 @@ mail_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id) debug (("...")); - if (!e_cal_get_static_capability (cqa->parent_client->client, - CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS)) + if (!e_client_check_capability (E_CLIENT (cqa->parent_client->cal_client), CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS)) return; dialog = gtk_dialog_new_with_buttons (_("Warning"), @@ -1932,20 +1974,20 @@ free_client_alarms_cb (gpointer key, gpointer value, gpointer user_data) if (ca) { remove_client_alarms (ca); - if (ca->client) { + if (ca->cal_client) { debug (("Disconnecting Client")); - g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA, + g_signal_handlers_disconnect_matched (ca->cal_client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); - g_object_unref (ca->client); + g_object_unref (ca->cal_client); } - if (ca->query) { + if (ca->view) { debug (("Disconnecting Query")); - g_signal_handlers_disconnect_matched (ca->query, G_SIGNAL_MATCH_DATA, + g_signal_handlers_disconnect_matched (ca->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); - g_object_unref (ca->query); + g_object_unref (ca->view); } g_hash_table_destroy (ca->uid_alarms_hash); @@ -2016,52 +2058,46 @@ hash_ids (gpointer a) struct _alarm_client_msg { Message header; - ECal *client; + ECalClient *cal_client; }; static void alarm_queue_add_async (struct _alarm_client_msg *msg) { ClientAlarms *ca; - ECal *client = msg->client; + ECalClient *cal_client = msg->cal_client; g_return_if_fail (alarm_queue_inited); - g_return_if_fail (client != NULL); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (cal_client != NULL); + g_return_if_fail (E_IS_CAL_CLIENT (cal_client)); - ca = lookup_client (client); + ca = lookup_client (cal_client); if (ca) { /* We already have it. Unref the passed one*/ - g_object_unref (client); + g_object_unref (cal_client); return; } - debug (("client=%p", client)); + debug (("client=%p", cal_client)); ca = g_new (ClientAlarms, 1); - ca->client = client; - ca->query = NULL; + ca->cal_client = cal_client; + ca->view = NULL; - g_hash_table_insert (client_alarms_hash, client, ca); + g_hash_table_insert (client_alarms_hash, cal_client, ca); ca->uid_alarms_hash = g_hash_table_new ( (GHashFunc) hash_ids, (GEqualFunc) compare_ids); - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) { - load_alarms_for_today (ca); - } else { - g_signal_connect (client, "cal_opened_ex", - G_CALLBACK (cal_opened_cb), - ca); - } + load_alarms_for_today (ca); g_slice_free (struct _alarm_client_msg, msg); } /** * alarm_queue_add_client: - * @client: A calendar client. + * @cal_client: A calendar client. * * Adds a calendar client to the alarm queueing system. Alarm trigger * notifications will be presented at the appropriate times. The client should @@ -2074,13 +2110,13 @@ alarm_queue_add_async (struct _alarm_client_msg *msg) * queueing system when it is no longer wanted. **/ void -alarm_queue_add_client (ECal *client) +alarm_queue_add_client (ECalClient *cal_client) { struct _alarm_client_msg *msg; msg = g_slice_new0 (struct _alarm_client_msg); msg->header.func = (MessageFunc) alarm_queue_add_async; - msg->client = g_object_ref (client); + msg->cal_client = g_object_ref (cal_client); message_push ((Message *) msg); } @@ -2137,35 +2173,35 @@ static void alarm_queue_remove_async (struct _alarm_client_msg *msg) { ClientAlarms *ca; - ECal *client = msg->client; + ECalClient *cal_client = msg->cal_client; g_return_if_fail (alarm_queue_inited); - g_return_if_fail (client != NULL); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (cal_client != NULL); + g_return_if_fail (E_IS_CAL_CLIENT (cal_client)); - ca = lookup_client (client); + ca = lookup_client (cal_client); g_return_if_fail (ca != NULL); debug (("...")); remove_client_alarms (ca); /* Clean up */ - if (ca->client) { + if (ca->cal_client) { debug (("Disconnecting Client")); - g_signal_handlers_disconnect_matched (ca->client, G_SIGNAL_MATCH_DATA, + g_signal_handlers_disconnect_matched (ca->cal_client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); - g_object_unref (ca->client); - ca->client = NULL; + g_object_unref (ca->cal_client); + ca->cal_client = NULL; } - if (ca->query) { + if (ca->view) { debug (("Disconnecting Query")); - g_signal_handlers_disconnect_matched (ca->query, G_SIGNAL_MATCH_DATA, + g_signal_handlers_disconnect_matched (ca->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, ca); - g_object_unref (ca->query); - ca->query = NULL; + g_object_unref (ca->view); + ca->view = NULL; } g_hash_table_destroy (ca->uid_alarms_hash); @@ -2173,7 +2209,7 @@ alarm_queue_remove_async (struct _alarm_client_msg *msg) g_free (ca); - g_hash_table_remove (client_alarms_hash, client); + g_hash_table_remove (client_alarms_hash, cal_client); g_slice_free (struct _alarm_client_msg, msg); } @@ -2181,18 +2217,18 @@ alarm_queue_remove_async (struct _alarm_client_msg *msg) /** alarm_queue_remove_client * * asynchronously remove client from alarm queue. - * @client: Client to remove. + * @cal_client: Client to remove. * @immediately: Indicates whether use thread or do it right now. */ void -alarm_queue_remove_client (ECal *client, gboolean immediately) +alarm_queue_remove_client (ECalClient *cal_client, gboolean immediately) { struct _alarm_client_msg *msg; msg = g_slice_new0 (struct _alarm_client_msg); msg->header.func = (MessageFunc) alarm_queue_remove_async; - msg->client = client; + msg->cal_client = cal_client; if (immediately) { alarm_queue_remove_async (msg); @@ -2220,7 +2256,7 @@ update_cqa (CompQueuedAlarms *cqa, ECalComponent *newcomp) debug (("Generating alarms between %s and %s", e_ctime (&from), e_ctime (&to))); alarms = e_cal_util_generate_alarms_for_comp (newcomp, from, to, omit, - e_cal_resolve_tzid_cb, cqa->parent_client->client, zone); + e_cal_client_resolve_tzid_cb, cqa->parent_client->cal_client, zone); /* Update auids in Queued Alarms*/ for (qa_list = cqa->queued_alarms; qa_list; qa_list = qa_list->next) { diff --git a/calendar/gui/alarm-notify/alarm-queue.h b/calendar/gui/alarm-notify/alarm-queue.h index c594e12a6b..e43027bd60 100644 --- a/calendar/gui/alarm-notify/alarm-queue.h +++ b/calendar/gui/alarm-notify/alarm-queue.h @@ -26,12 +26,12 @@ #ifndef ALARM_QUEUE_H #define ALARM_QUEUE_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> void alarm_queue_init (gpointer); void alarm_queue_done (void); -void alarm_queue_add_client (ECal *client); -void alarm_queue_remove_client (ECal *client, gboolean immediately); +void alarm_queue_add_client (ECalClient *cal_client); +void alarm_queue_remove_client (ECalClient *cal_client, gboolean immediately); #endif diff --git a/calendar/gui/alarm-notify/config-data.c b/calendar/gui/alarm-notify/config-data.c index 41207d48fb..b5e6faa923 100644 --- a/calendar/gui/alarm-notify/config-data.c +++ b/calendar/gui/alarm-notify/config-data.c @@ -259,7 +259,7 @@ config_data_get_notify_with_tray (void) * triggered while it was not running. **/ void -config_data_set_last_notification_time (ECal *cal, time_t t) +config_data_set_last_notification_time (ECalClient *cal, time_t t) { GConfClient *client; time_t current_t, now = time (NULL); @@ -267,7 +267,7 @@ config_data_set_last_notification_time (ECal *cal, time_t t) g_return_if_fail (t != -1); if (cal) { - ESource *source = e_cal_get_source (cal); + ESource *source = e_client_get_source (E_CLIENT (cal)); if (source) { GTimeVal tmval = {0}; gchar *as_text; @@ -301,13 +301,13 @@ config_data_set_last_notification_time (ECal *cal, time_t t) * Return value: The last saved value, or -1 if no value had been saved before. **/ time_t -config_data_get_last_notification_time (ECal *cal) +config_data_get_last_notification_time (ECalClient *cal) { GConfValue *value; GConfClient *client; if (cal) { - ESource *source = e_cal_get_source (cal); + ESource *source = e_client_get_source (E_CLIENT (cal)); if (source) { const gchar *last_notified; diff --git a/calendar/gui/alarm-notify/config-data.h b/calendar/gui/alarm-notify/config-data.h index 85b2593a8b..1023609d6a 100644 --- a/calendar/gui/alarm-notify/config-data.h +++ b/calendar/gui/alarm-notify/config-data.h @@ -27,7 +27,7 @@ #define CONFIG_DATA_H #include <libical/ical.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <gconf/gconf-client.h> #include <libedataserver/e-source-list.h> @@ -37,10 +37,10 @@ gboolean config_data_get_24_hour_format (void); gboolean config_data_get_notify_with_tray (void); void config_data_set_last_notification_time - (ECal *cal, + (ECalClient *cal, time_t t); time_t config_data_get_last_notification_time - (ECal *cal); + (ECalClient *cal); void config_data_save_blessed_program (const gchar *program); gboolean config_data_is_blessed_program (const gchar *program); diff --git a/calendar/gui/cal-editor-utils.c b/calendar/gui/cal-editor-utils.c index c49e648883..4ddc3899b9 100644 --- a/calendar/gui/cal-editor-utils.c +++ b/calendar/gui/cal-editor-utils.c @@ -32,7 +32,7 @@ /** * open_component_editor: - * @client: Already opened #ECal, where to store the component + * @client: Already opened #ECalClient, where to store the component * @comp: #ECalComponent component to be stored * @is_new: Whether the @comp is a new component or an existing * @error: #GError for possible error reporting @@ -45,7 +45,7 @@ **/ void open_component_editor (EShell *shell, - ECal *client, + ECalClient *client, ECalComponent *comp, gboolean is_new, GError **error) @@ -55,7 +55,7 @@ open_component_editor (EShell *shell, CompEditor *editor = NULL; g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); g_return_if_fail (E_IS_CAL_COMPONENT (comp)); id = e_cal_component_get_id (comp); @@ -99,10 +99,7 @@ open_component_editor (EShell *shell, break; default: if (error) - *error = g_error_new ( - E_CALENDAR_ERROR, - E_CALENDAR_STATUS_INVALID_OBJECT, - "%s", _("Invalid object")); + *error = e_client_error_create (E_CLIENT_ERROR_INVALID_ARG, NULL); break; } diff --git a/calendar/gui/cal-editor-utils.h b/calendar/gui/cal-editor-utils.h index 00f24a5b33..26b2104ea4 100644 --- a/calendar/gui/cal-editor-utils.h +++ b/calendar/gui/cal-editor-utils.h @@ -20,14 +20,14 @@ #ifndef CAL_EDITOR_UTILS_H #define CAL_EDITOR_UTILS_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include <shell/e-shell.h> G_BEGIN_DECLS void open_component_editor (EShell *shell, - ECal *client, + ECalClient *client, ECalComponent *comp, gboolean is_new, GError **error); diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h index f905af4d40..61e92efae4 100644 --- a/calendar/gui/calendar-config.h +++ b/calendar/gui/calendar-config.h @@ -29,7 +29,7 @@ #define _CALENDAR_CONFIG_H_ #include <gdk/gdk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <gconf/gconf-client.h> #include <e-util/e-util-enums.h> diff --git a/calendar/gui/comp-util.c b/calendar/gui/comp-util.c index fbf9e7dc82..a6095d0bcc 100644 --- a/calendar/gui/comp-util.c +++ b/calendar/gui/comp-util.c @@ -32,8 +32,8 @@ #include "comp-util.h" #include "dialogs/delete-comp.h" #include <libecal/e-cal-component.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-categories-config.h" -#include "common/authentication.h" #include "gnome-cal.h" #include "shell/e-shell-window.h" @@ -90,7 +90,7 @@ e_cal_component_compare_tzid (const gchar *tzid1, const gchar *tzid2) /** * cal_comp_util_compare_event_timezones: * @comp: A calendar component object. - * @client: A #ECal. + * @client: A #ECalClient. * * Checks if the component uses the given timezone for both the start and * the end time, or if the UTC offsets of the start and end times are the same @@ -101,7 +101,7 @@ e_cal_component_compare_tzid (const gchar *tzid1, const gchar *tzid2) **/ gboolean cal_comp_util_compare_event_timezones (ECalComponent *comp, - ECal *client, + ECalClient *client, icaltimezone *zone) { ECalComponentDateTime start_datetime, end_datetime; @@ -151,8 +151,8 @@ cal_comp_util_compare_event_timezones (ECalComponent *comp, /* If the TZIDs differ, we have to compare the UTC offsets of the start and end times, using their own timezones and the given timezone. */ - if (!e_cal_get_timezone (client, start_datetime.tzid, - &start_zone, NULL)) + if (!e_cal_client_get_timezone_sync (client, start_datetime.tzid, + &start_zone, NULL, NULL)) goto out; if (start_datetime.value) { @@ -166,8 +166,8 @@ cal_comp_util_compare_event_timezones (ECalComponent *comp, goto out; } - if (!e_cal_get_timezone (client, end_datetime.tzid, - &end_zone, NULL)) + if (!e_cal_client_get_timezone_sync (client, end_datetime.tzid, + &end_zone, NULL, NULL)) goto out; if (end_datetime.value) { @@ -211,7 +211,7 @@ cal_comp_util_compare_event_timezones (ECalComponent *comp, * user cancelled the deletion. **/ gboolean -cal_comp_is_on_server (ECalComponent *comp, ECal *client) +cal_comp_is_on_server (ECalComponent *comp, ECalClient *client) { const gchar *uid; gchar *rid = NULL; @@ -221,7 +221,7 @@ cal_comp_is_on_server (ECalComponent *comp, ECal *client) g_return_val_if_fail (comp != NULL, FALSE); g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE); g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (E_IS_CAL (client), FALSE); + g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE); /* See if the component is on the server. If it is not, then it likely * means that the appointment is new, only in the day view, and we @@ -234,19 +234,18 @@ cal_comp_is_on_server (ECalComponent *comp, ECal *client) /* TODO We should not be checking for this here. But since * e_cal_util_construct_instance does not create the instances * of all day events, so we default to old behaviour. */ - if (e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { + if (e_cal_client_check_recurrences_no_master (client)) { rid = e_cal_component_get_recurid_as_string (comp); } - if (e_cal_get_object (client, uid, rid, &icalcomp, &error)) { + if (e_cal_client_get_object_sync (client, uid, rid, &icalcomp, NULL, &error)) { icalcomponent_free (icalcomp); g_free (rid); return TRUE; } - if (error->code != E_CALENDAR_STATUS_OBJECT_NOT_FOUND) + if (!g_error_matches (error, E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND)) g_warning (G_STRLOC ": %s", error->message); g_clear_error (&error); @@ -261,7 +260,7 @@ cal_comp_is_on_server (ECalComponent *comp, ECal *client) * icalcomponent, not the ECalComponent. **/ gboolean -is_icalcomp_on_the_server (icalcomponent *icalcomp, ECal *client) +is_icalcomp_on_the_server (icalcomponent *icalcomp, ECalClient *client) { gboolean on_server; ECalComponent *comp; @@ -288,7 +287,7 @@ is_icalcomp_on_the_server (icalcomponent *icalcomp, ECal *client) * Return value: A newly-created calendar component. **/ ECalComponent * -cal_comp_event_new_with_defaults (ECal *client, +cal_comp_event_new_with_defaults (ECalClient *client, gboolean all_day, gboolean use_default_reminder, gint default_reminder_interval, @@ -300,7 +299,7 @@ cal_comp_event_new_with_defaults (ECal *client, icalproperty *icalprop; ECalComponentAlarmTrigger trigger; - if (!e_cal_get_default_object (client, &icalcomp, NULL)) + if (!e_cal_client_get_default_object_sync (client, &icalcomp, NULL, NULL)) icalcomp = icalcomponent_new (ICAL_VEVENT_COMPONENT); comp = e_cal_component_new (); @@ -358,7 +357,7 @@ cal_comp_event_new_with_defaults (ECal *client, } ECalComponent * -cal_comp_event_new_with_current_time (ECal *client, +cal_comp_event_new_with_current_time (ECalClient *client, gboolean all_day, icaltimezone *zone, gboolean use_default_reminder, @@ -398,12 +397,12 @@ cal_comp_event_new_with_current_time (ECal *client, } ECalComponent * -cal_comp_task_new_with_defaults (ECal *client) +cal_comp_task_new_with_defaults (ECalClient *client) { ECalComponent *comp; icalcomponent *icalcomp; - if (!e_cal_get_default_object (client, &icalcomp, NULL)) + if (!e_cal_client_get_default_object_sync (client, &icalcomp, NULL, NULL)) icalcomp = icalcomponent_new (ICAL_VTODO_COMPONENT); comp = e_cal_component_new (); @@ -417,12 +416,12 @@ cal_comp_task_new_with_defaults (ECal *client) } ECalComponent * -cal_comp_memo_new_with_defaults (ECal *client) +cal_comp_memo_new_with_defaults (ECalClient *client) { ECalComponent *comp; icalcomponent *icalcomp; - if (!e_cal_get_default_object (client, &icalcomp, NULL)) + if (!e_cal_client_get_default_object_sync (client, &icalcomp, NULL, NULL)) icalcomp = icalcomponent_new (ICAL_VJOURNAL_COMPONENT); comp = e_cal_component_new (); @@ -613,7 +612,7 @@ cal_comp_selection_get_string_list (GtkSelectionData *selection_data) } static void -datetime_to_zone (ECal *client, ECalComponentDateTime *date, const gchar *tzid) +datetime_to_zone (ECalClient *client, ECalComponentDateTime *date, const gchar *tzid) { icaltimezone *from, *to; @@ -625,16 +624,21 @@ datetime_to_zone (ECal *client, ECalComponentDateTime *date, const gchar *tzid) from = icaltimezone_get_builtin_timezone_from_tzid (date->tzid); if (!from) { - if (!e_cal_get_timezone (client, date->tzid, &from, NULL)) + GError *error = NULL; + + if (!e_cal_client_get_timezone_sync (client, date->tzid, &from, NULL, &error)) g_warning ( - "%s: Could not get timezone from server: %s", - G_STRFUNC, date->tzid ? date->tzid : ""); + "%s: Could not get timezone '%s' from server: %s", + G_STRFUNC, date->tzid ? date->tzid : "", error ? error->message : "Unknown error"); + + if (error) + g_error_free (error); } to = icaltimezone_get_builtin_timezone_from_tzid (tzid); if (!to) { /* do not check failure here, maybe the zone is not available there */ - e_cal_get_timezone (client, tzid, &to, NULL); + e_cal_client_get_timezone_sync (client, tzid, &to, NULL, NULL); } icaltimezone_convert_time (date->value, from, to); @@ -643,14 +647,14 @@ datetime_to_zone (ECal *client, ECalComponentDateTime *date, const gchar *tzid) /** * cal_comp_set_dtstart_with_oldzone: - * @client: ECal structure, to retrieve timezone from, when required. + * @client: ECalClient structure, to retrieve timezone from, when required. * @comp: Component, where make the change. * @pdate: Value, to change to. * * Changes 'dtstart' of the component, but converts time to the old timezone. **/ void -cal_comp_set_dtstart_with_oldzone (ECal *client, +cal_comp_set_dtstart_with_oldzone (ECalClient *client, ECalComponent *comp, const ECalComponentDateTime *pdate) { @@ -671,14 +675,14 @@ cal_comp_set_dtstart_with_oldzone (ECal *client, /** * cal_comp_set_dtend_with_oldzone: - * @client: ECal structure, to retrieve timezone from, when required. + * @client: ECalClient structure, to retrieve timezone from, when required. * @comp: Component, where make the change. * @pdate: Value, to change to. * * Changes 'dtend' of the component, but converts time to the old timezone. **/ void -cal_comp_set_dtend_with_oldzone (ECal *client, +cal_comp_set_dtend_with_oldzone (ECalClient *client, ECalComponent *comp, const ECalComponentDateTime *pdate) { @@ -699,18 +703,21 @@ cal_comp_set_dtend_with_oldzone (ECal *client, void comp_util_sanitize_recurrence_master (ECalComponent *comp, - ECal *client) + ECalClient *client) { ECalComponent *master = NULL; icalcomponent *icalcomp = NULL; ECalComponentRange rid; ECalComponentDateTime sdt; const gchar *uid; + GError *error = NULL; /* Get the master component */ e_cal_component_get_uid (comp, &uid); - if (!e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) { - g_warning ("Unable to get the master component \n"); + if (!e_cal_client_get_object_sync (client, uid, NULL, &icalcomp, NULL, &error)) { + g_warning ("Unable to get the master component: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } diff --git a/calendar/gui/comp-util.h b/calendar/gui/comp-util.h index c99e1d0c3f..1f69ddb107 100644 --- a/calendar/gui/comp-util.h +++ b/calendar/gui/comp-util.h @@ -27,7 +27,7 @@ #include <gtk/gtk.h> #include <libecal/e-cal-component.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <e-util/e-util-enums.h> struct _EShell; @@ -38,41 +38,41 @@ void cal_comp_util_add_exdate (ECalComponent *comp, time_t t, icaltimezone *zone and DTEND, or if the UTC offsets of the start and end times are the same as in the given zone. */ gboolean cal_comp_util_compare_event_timezones (ECalComponent *comp, - ECal *client, + ECalClient *client, icaltimezone *zone); /* Returns the number of icons owned by the ECalComponent */ gint cal_comp_util_get_n_icons (ECalComponent *comp, GSList **pixbufs); gboolean cal_comp_is_on_server (ECalComponent *comp, - ECal *client); -gboolean is_icalcomp_on_the_server (icalcomponent *icalcomp, ECal *client); + ECalClient *client); +gboolean is_icalcomp_on_the_server (icalcomponent *icalcomp, ECalClient *client); ECalComponent * cal_comp_event_new_with_defaults - (ECal *client, + (ECalClient *client, gboolean all_day, gboolean use_default_reminder, gint default_reminder_interval, EDurationType default_reminder_units); ECalComponent * cal_comp_event_new_with_current_time - (ECal *client, + (ECalClient *client, gboolean all_day, icaltimezone *zone, gboolean use_default_reminder, gint default_reminder_interval, EDurationType default_reminder_units); -ECalComponent *cal_comp_task_new_with_defaults (ECal *client); -ECalComponent *cal_comp_memo_new_with_defaults (ECal *client); +ECalComponent *cal_comp_task_new_with_defaults (ECalClient *client); +ECalComponent *cal_comp_memo_new_with_defaults (ECalClient *client); void cal_comp_update_time_by_active_window (ECalComponent *comp, struct _EShell *shell); void cal_comp_selection_set_string_list (GtkSelectionData *data, GSList *str_list); GSList *cal_comp_selection_get_string_list (GtkSelectionData *data); -void cal_comp_set_dtstart_with_oldzone (ECal *client, ECalComponent *comp, const ECalComponentDateTime *pdate); -void cal_comp_set_dtend_with_oldzone (ECal *client, ECalComponent *comp, const ECalComponentDateTime *pdate); +void cal_comp_set_dtstart_with_oldzone (ECalClient *client, ECalComponent *comp, const ECalComponentDateTime *pdate); +void cal_comp_set_dtend_with_oldzone (ECalClient *client, ECalComponent *comp, const ECalComponentDateTime *pdate); -void comp_util_sanitize_recurrence_master (ECalComponent *comp, ECal *client); +void comp_util_sanitize_recurrence_master (ECalComponent *comp, ECalClient *client); gchar *icalcomp_suggest_filename (icalcomponent *icalcomp, const gchar *default_name); diff --git a/calendar/gui/dialogs/alarm-dialog.c b/calendar/gui/dialogs/alarm-dialog.c index 6b234f6cce..564c4dd1f4 100644 --- a/calendar/gui/dialogs/alarm-dialog.c +++ b/calendar/gui/dialogs/alarm-dialog.c @@ -54,7 +54,7 @@ typedef struct { ECalComponentAlarm *alarm; /* The client */ - ECal *ecal; + ECalClient *cal_client; /* Toplevel */ GtkWidget *toplevel; @@ -209,16 +209,16 @@ alarm_to_dialog (Dialog *dialog) for (i = 0; valid && action_map[i] != -1; i++) { gtk_list_store_set ( GTK_LIST_STORE (model), &iter, - 1, !e_cal_get_static_capability (dialog->ecal, action_map_cap[i]), + 1, !e_client_check_capability (E_CLIENT (dialog->cal_client), action_map_cap[i]), -1); valid = gtk_tree_model_iter_next (model, &iter); } /* Set a default address if possible */ - if (!e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS) - && !e_cal_component_alarm_has_attendees (dialog->alarm) - && e_cal_get_alarm_email_address (dialog->ecal, &email, NULL)) { + if (!e_client_check_capability (E_CLIENT (dialog->cal_client), CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS) + && !e_cal_component_alarm_has_attendees (dialog->alarm) + && e_client_get_backend_property_sync (E_CLIENT (dialog->cal_client), CAL_BACKEND_PROPERTY_ALARM_EMAIL_ADDRESS, &email, NULL, NULL)) { ECalComponentAttendee *a; GSList attendee_list; @@ -235,7 +235,7 @@ alarm_to_dialog (Dialog *dialog) } /* If we can repeat */ - repeat = !e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT); + repeat = !e_client_check_capability (E_CLIENT (dialog->cal_client), CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT); gtk_widget_set_sensitive (dialog->repeat_toggle, repeat); /* if we are editing a exiting alarm */ @@ -880,27 +880,6 @@ get_widgets (Dialog *dialog) && dialog->palarm_args); } -#if 0 -/* Callback used when the alarm options button is clicked */ -static void -show_options (Dialog *dialog) -{ - gboolean repeat; - gchar *email; - - e_cal_component_alarm_set_action (dialog->alarm, - e_dialog_combo_box_get (dialog->action_combo, action_map)); - - repeat = !e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT); - - if (e_cal_get_static_capability (dialog->ecal, CAL_STATIC_CAPABILITY_NO_EMAIL_ALARMS) - || e_cal_get_alarm_email_address (dialog->ecal, &email, NULL)) { - if (!alarm_options_dialog_run (dialog->toplevel, dialog->alarm, email, repeat)) - g_message (G_STRLOC ": not create the alarm options dialog"); - } -} -#endif - static void addressbook_clicked_cb (GtkWidget *widget, Dialog *dialog) { @@ -1202,7 +1181,7 @@ init_widgets (Dialog *dialog) } gboolean -alarm_dialog_run (GtkWidget *parent, ECal *ecal, ECalComponentAlarm *alarm) +alarm_dialog_run (GtkWidget *parent, ECalClient *cal_client, ECalComponentAlarm *alarm) { Dialog dialog; GtkWidget *container; @@ -1211,7 +1190,7 @@ alarm_dialog_run (GtkWidget *parent, ECal *ecal, ECalComponentAlarm *alarm) g_return_val_if_fail (alarm != NULL, FALSE); dialog.alarm = alarm; - dialog.ecal = ecal; + dialog.cal_client = cal_client; dialog.builder = gtk_builder_new (); e_load_ui_builder_definition (dialog.builder, "alarm-dialog.ui"); diff --git a/calendar/gui/dialogs/alarm-dialog.h b/calendar/gui/dialogs/alarm-dialog.h index b5560f9ff4..d99d47f15f 100644 --- a/calendar/gui/dialogs/alarm-dialog.h +++ b/calendar/gui/dialogs/alarm-dialog.h @@ -30,12 +30,12 @@ #ifndef ALARM_DIALOG_H #define ALARM_DIALOG_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> G_BEGIN_DECLS -gboolean alarm_dialog_run (GtkWidget *parent, ECal *ecal, ECalComponentAlarm *alarm); +gboolean alarm_dialog_run (GtkWidget *parent, ECalClient *cal_client, ECalComponentAlarm *alarm); G_END_DECLS diff --git a/calendar/gui/dialogs/alarm-list-dialog.c b/calendar/gui/dialogs/alarm-list-dialog.c index 1990e076df..3e854da751 100644 --- a/calendar/gui/dialogs/alarm-list-dialog.c +++ b/calendar/gui/dialogs/alarm-list-dialog.c @@ -48,7 +48,7 @@ typedef struct { GtkBuilder *builder; /* The client */ - ECal *ecal; + ECalClient *cal_client; /* The list store */ EAlarmList *list_store; @@ -94,18 +94,13 @@ sensitize_buttons (Dialog *dialog) GtkTreeSelection *selection; GtkTreeIter iter; gboolean have_selected, read_only = FALSE; - GError *error = NULL; - if (!e_cal_is_read_only (dialog->ecal, &read_only, &error)) { - if (error->code != E_CALENDAR_STATUS_BUSY) - read_only = TRUE; - g_error_free (error); - } + read_only = e_client_is_readonly (E_CLIENT (dialog->cal_client)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->list)); have_selected = gtk_tree_selection_get_selected (selection, NULL, &iter); - if ((e_cal_get_one_alarm_only (dialog->ecal) && have_selected) || read_only) + if ((e_cal_client_check_one_alarm_only (dialog->cal_client) && have_selected) || read_only) gtk_widget_set_sensitive (dialog->add, FALSE); else gtk_widget_set_sensitive (dialog->add, TRUE); @@ -133,7 +128,7 @@ add_clicked_cb (GtkButton *button, gpointer data) icalproperty_set_x_name (icalprop, "X-EVOLUTION-NEEDS-DESCRIPTION"); icalcomponent_add_property (icalcomp, icalprop); - if (alarm_dialog_run (dialog->toplevel, dialog->ecal, alarm)) { + if (alarm_dialog_run (dialog->toplevel, dialog->cal_client, alarm)) { e_alarm_list_append (dialog->list_store, &iter, alarm); gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter); } else { @@ -165,7 +160,7 @@ edit_clicked_cb (GtkButton *button, gpointer data) alarm = (ECalComponentAlarm *) e_alarm_list_get_alarm (dialog->list_store, &iter); path = gtk_tree_model_get_path (GTK_TREE_MODEL (dialog->list_store), &iter); - if (alarm_dialog_run (dialog->toplevel, dialog->ecal, alarm)) { + if (alarm_dialog_run (dialog->toplevel, dialog->cal_client, alarm)) { gtk_tree_selection_select_iter (gtk_tree_view_get_selection (view), &iter); gtk_tree_model_row_changed (GTK_TREE_MODEL (dialog->list_store), path, &iter); } @@ -216,7 +211,7 @@ selection_changed_cb (GtkTreeSelection *selection, gpointer data) } void -alarm_list_dialog_set_client (GtkWidget *dlg_box, ECal *client) +alarm_list_dialog_set_client (GtkWidget *dlg_box, ECalClient *cal_client) { Dialog *dialog; @@ -224,7 +219,7 @@ alarm_list_dialog_set_client (GtkWidget *dlg_box, ECal *client) dialog = g_object_get_data (G_OBJECT (dlg_box), "dialog"); if (dialog) { - dialog->ecal = client; + dialog->cal_client = cal_client; sensitize_buttons (dialog); } } @@ -267,13 +262,13 @@ init_widgets (Dialog *dialog) } gboolean -alarm_list_dialog_run (GtkWidget *parent, ECal *ecal, EAlarmList *list_store) +alarm_list_dialog_run (GtkWidget *parent, ECalClient *cal_client, EAlarmList *list_store) { Dialog dialog; GtkWidget *container; gint response_id; - dialog.ecal = ecal; + dialog.cal_client = cal_client; dialog.list_store = list_store; dialog.builder = gtk_builder_new (); @@ -313,12 +308,12 @@ alarm_list_dialog_run (GtkWidget *parent, ECal *ecal, EAlarmList *list_store) } GtkWidget * -alarm_list_dialog_peek (ECal *ecal, EAlarmList *list_store) +alarm_list_dialog_peek (ECalClient *cal_client, EAlarmList *list_store) { Dialog *dialog; dialog = (Dialog *) g_new (Dialog, 1); - dialog->ecal = ecal; + dialog->cal_client = cal_client; dialog->list_store = list_store; dialog->builder = gtk_builder_new (); diff --git a/calendar/gui/dialogs/alarm-list-dialog.h b/calendar/gui/dialogs/alarm-list-dialog.h index 7d58fcb0af..163582c556 100644 --- a/calendar/gui/dialogs/alarm-list-dialog.h +++ b/calendar/gui/dialogs/alarm-list-dialog.h @@ -30,15 +30,15 @@ #ifndef ALARM_LIST_DIALOG_H #define ALARM_LIST_DIALOG_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include "../e-alarm-list.h" G_BEGIN_DECLS -gboolean alarm_list_dialog_run (GtkWidget *parent, ECal *ecal, EAlarmList *list_store); -GtkWidget *alarm_list_dialog_peek (ECal *ecal, EAlarmList *list_store); -void alarm_list_dialog_set_client (GtkWidget *dlg_box, ECal *client); +gboolean alarm_list_dialog_run (GtkWidget *parent, ECalClient *cal_client, EAlarmList *list_store); +GtkWidget *alarm_list_dialog_peek (ECalClient *cal_client, EAlarmList *list_store); +void alarm_list_dialog_set_client (GtkWidget *dlg_box, ECalClient *cal_client); G_END_DECLS diff --git a/calendar/gui/dialogs/calendar-setup.c b/calendar/gui/dialogs/calendar-setup.c index 5981076ee6..231cd0dd34 100644 --- a/calendar/gui/dialogs/calendar-setup.c +++ b/calendar/gui/dialogs/calendar-setup.c @@ -32,7 +32,7 @@ #include <libedataserver/e-source-list.h> #include <shell/e-shell.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "calendar-setup.h" #include "../e-cal-config.h" @@ -55,7 +55,7 @@ struct _CalendarSourceDialog { /* Source group we're creating/editing a source in */ ESourceGroup *source_group; - ECalSourceType source_type; + ECalClientSourceType source_type; }; static gboolean @@ -272,11 +272,11 @@ eccp_general_offline (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidg else { g_object_get (parent, "n-rows", &row, NULL); - if (sdialog->source_type == E_CAL_SOURCE_TYPE_EVENT) + if (sdialog->source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) offline_setting = gtk_check_button_new_with_mnemonic (_("Cop_y calendar contents locally for offline operation")); - else if (sdialog->source_type == E_CAL_SOURCE_TYPE_TODO) + else if (sdialog->source_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS) offline_setting = gtk_check_button_new_with_mnemonic (_("Cop_y task list contents locally for offline operation")); - else if (sdialog->source_type == E_CAL_SOURCE_TYPE_JOURNAL) + else if (sdialog->source_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) offline_setting = gtk_check_button_new_with_mnemonic (_("Cop_y memo list contents locally for offline operation")); gtk_widget_show (offline_setting); @@ -469,7 +469,7 @@ calendar_setup_edit_calendar (GtkWindow *parent, ESource *source, ESourceGroup * e_source_set_absolute_uri (sdialog->source, NULL); e_source_set_group (sdialog->source, sdialog->source_group); - sdialog->source_type = E_CAL_SOURCE_TYPE_EVENT; + sdialog->source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties"); for (i = 0; eccp_items[i].path; i++) items = g_slist_prepend (items, &eccp_items[i]); @@ -477,7 +477,7 @@ calendar_setup_edit_calendar (GtkWindow *parent, ESource *source, ESourceGroup * e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog); target = e_cal_config_target_new_source (ec, sdialog->source); - target->source_type = E_CAL_SOURCE_TYPE_EVENT; + target->source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); sdialog->window = e_config_create_window ((EConfig *)ec, NULL, source ? _("Calendar Properties") : _("New Calendar")); @@ -525,7 +525,7 @@ calendar_setup_edit_task_list (GtkWindow *parent, ESource *source) e_source_set_absolute_uri (sdialog->source, NULL); e_source_set_group (sdialog->source, sdialog->source_group); - sdialog->source_type = E_CAL_SOURCE_TYPE_TODO; + sdialog->source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties"); for (i = 0; ectp_items[i].path; i++) items = g_slist_prepend (items, &ectp_items[i]); @@ -533,7 +533,7 @@ calendar_setup_edit_task_list (GtkWindow *parent, ESource *source) e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog); target = e_cal_config_target_new_source (ec, sdialog->source); - target->source_type = E_CAL_SOURCE_TYPE_TODO; + target->source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); sdialog->window = e_config_create_window ((EConfig *)ec, NULL, source ? _("Task List Properties") : _("New Task List")); @@ -581,7 +581,7 @@ calendar_setup_edit_memo_list (GtkWindow *parent, ESource *source) e_source_set_absolute_uri (sdialog->source, NULL); e_source_set_group (sdialog->source, sdialog->source_group); - sdialog->source_type = E_CAL_SOURCE_TYPE_JOURNAL; + sdialog->source_type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS; sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties"); for (i = 0; ecmp_items[i].path; i++) items = g_slist_prepend (items, &ecmp_items[i]); @@ -589,7 +589,7 @@ calendar_setup_edit_memo_list (GtkWindow *parent, ESource *source) e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog); target = e_cal_config_target_new_source (ec, sdialog->source); - target->source_type = E_CAL_SOURCE_TYPE_JOURNAL; + target->source_type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS; e_config_set_target ((EConfig *) ec, (EConfigTarget *) target); sdialog->window = e_config_create_window ((EConfig *)ec, NULL, source ? _("Memo List Properties") : _("New Memo List")); diff --git a/calendar/gui/dialogs/cancel-comp.c b/calendar/gui/dialogs/cancel-comp.c index 4482d4d7ab..86663eda97 100644 --- a/calendar/gui/dialogs/cancel-comp.c +++ b/calendar/gui/dialogs/cancel-comp.c @@ -66,14 +66,14 @@ is_past_event (ECalComponent *comp) **/ gboolean cancel_component_dialog (GtkWindow *parent, - ECal *client, + ECalClient *cal_client, ECalComponent *comp, gboolean deleting) { ECalComponentVType vtype; const gchar *id; - if (deleting && e_cal_get_save_schedules (client)) + if (deleting && e_cal_client_check_save_schedules (cal_client)) return TRUE; vtype = e_cal_component_get_vtype (comp); diff --git a/calendar/gui/dialogs/cancel-comp.h b/calendar/gui/dialogs/cancel-comp.h index db455b06d7..3514cf19f5 100644 --- a/calendar/gui/dialogs/cancel-comp.h +++ b/calendar/gui/dialogs/cancel-comp.h @@ -26,9 +26,9 @@ #ifndef CANCEL_COMP_H #define CANCEL_COMP_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> -gboolean cancel_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean deleting); +gboolean cancel_component_dialog (GtkWindow *parent, ECalClient *cal_client, ECalComponent *comp, gboolean deleting); #endif diff --git a/calendar/gui/dialogs/comp-editor-page.h b/calendar/gui/dialogs/comp-editor-page.h index 2b9f7a4467..a33d83810d 100644 --- a/calendar/gui/dialogs/comp-editor-page.h +++ b/calendar/gui/dialogs/comp-editor-page.h @@ -28,7 +28,7 @@ #include <time.h> #include <gtk/gtk.h> #include <libecal/e-cal-component.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <calendar/gui/e-meeting-attendee.h> diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index cc794ae3f5..21ac86e9c3 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -43,6 +43,9 @@ #include <e-util/gconf-bridge.h> #include <shell/e-shell.h> +#include <libecal/e-cal-client.h> +#include <libecal/e-cal-client-view.h> + #include "../print.h" #include "../comp-util.h" #include "save-comp.h" @@ -75,13 +78,14 @@ struct _CompEditorPrivate { GtkWindowGroup *window_group; /* Client to use */ - ECal *client; + ECalClient *cal_client; /* Source client (where comp lives currently) */ - ECal *source_client; + ECalClient *source_client; /* View to listen for changes */ - ECalView *view; + ECalClientView *view; + GCancellable *view_cancellable; /* Calendar object/uid we are editing; this is an internal copy */ ECalComponent *comp; @@ -198,8 +202,8 @@ static void page_dates_changed_cb (CompEditor *editor, CompEditorPageDates *dates, CompEditorPage *page); -static void obj_modified_cb (ECal *client, GList *objs, CompEditor *editor); -static void obj_removed_cb (ECal *client, GList *uids, CompEditor *editor); +static void obj_modified_cb (ECalClientView *view, const GSList *objs, CompEditor *editor); +static void obj_removed_cb (ECalClientView *view, const GSList *uids, CompEditor *editor); G_DEFINE_TYPE_WITH_CODE ( CompEditor, comp_editor, GTK_TYPE_WINDOW, @@ -303,7 +307,7 @@ get_attachment_list (CompEditor *editor) view = E_ATTACHMENT_VIEW (editor->priv->attachment_view); store = e_attachment_view_get_store (view); - local_store = e_cal_get_local_attachment_store (editor->priv->client); + local_store = e_cal_client_get_local_attachment_store (editor->priv->cal_client); e_cal_component_get_uid (editor->priv->comp, &comp_uid); path = g_build_path ("/", local_store, comp_uid, NULL); destination = g_file_new_for_path (path); @@ -344,6 +348,40 @@ commit_all_fields (CompEditor *editor) } static void +changes_view_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + CompEditor *editor = user_data; + ECalClientView *view = NULL; + GError *error = NULL; + + g_return_if_fail (editor != NULL); + + if (!e_cal_client_get_view_finish (E_CAL_CLIENT (source_object), result, &view, &error)) + view = NULL; + + if (view) { + editor->priv->view = view; + g_signal_connect ( + view, "objects_modified", + G_CALLBACK (obj_modified_cb), editor); + g_signal_connect ( + view, "objects_removed", + G_CALLBACK (obj_removed_cb), editor); + + e_cal_client_view_start (view, &error); + + if (error) { + g_debug ("%s: Failed to stat view: %s", G_STRFUNC, error->message); + g_error_free (error); + } + } else if (error) { + if (!g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) + g_debug ("%s: Failed to get view: %s", G_STRFUNC, error->message); + g_error_free (error); + } +} + +static void listen_for_changes (CompEditor *editor) { CompEditorPrivate *priv; @@ -352,6 +390,12 @@ listen_for_changes (CompEditor *editor) priv = editor->priv; /* Discard change listener */ + if (priv->view_cancellable) { + g_cancellable_cancel (priv->view_cancellable); + g_object_unref (priv->view_cancellable); + priv->view_cancellable = NULL; + } + if (priv->view) { g_signal_handlers_disconnect_matched (G_OBJECT (priv->view), G_SIGNAL_MATCH_DATA, @@ -369,21 +413,11 @@ listen_for_changes (CompEditor *editor) if (uid) { gchar *query; + priv->view_cancellable = g_cancellable_new (); query = g_strdup_printf ("(uid? \"%s\")", uid); - e_cal_get_query (priv->source_client, query, &priv->view, NULL); + e_cal_client_get_view (priv->source_client, query, priv->view_cancellable, changes_view_ready_cb, editor); g_free (query); } - - if (priv->view) { - g_signal_connect ( - priv->view, "objects_modified", - G_CALLBACK (obj_modified_cb), editor); - g_signal_connect ( - priv->view, "objects_removed", - G_CALLBACK (obj_removed_cb), editor); - - e_cal_view_start (priv->view); - } } static void @@ -391,8 +425,14 @@ send_timezone (gpointer key, gpointer value, gpointer user_data) { icaltimezone *zone = value; CompEditor *editor = user_data; + GError *error = NULL; + + e_cal_client_add_timezone_sync (editor->priv->cal_client, zone, NULL, &error); - e_cal_add_timezone (editor->priv->client, zone, NULL); + if (error) { + g_debug ("%s: Failed to add timezone: %s", G_STRFUNC, error->message); + g_error_free (error); + } } static gboolean @@ -448,8 +488,8 @@ save_comp (CompEditor *editor) /* If we are not the organizer, we don't update the sequence number */ if (!e_cal_component_has_organizer (clone) || - itip_organizer_is_user (clone, priv->client) || - itip_sentby_is_user (clone, priv->client)) + itip_organizer_is_user (clone, priv->cal_client) || + itip_sentby_is_user (clone, priv->cal_client)) e_cal_component_commit_sequence (clone); else e_cal_component_abort_sequence (clone); @@ -472,10 +512,14 @@ save_comp (CompEditor *editor) priv->comp, get_attachment_list (editor)); icalcomp = e_cal_component_get_icalcomponent (priv->comp); /* send the component to the server */ - if (!cal_comp_is_on_server (priv->comp, priv->client)) { - result = e_cal_create_object (priv->client, icalcomp, NULL, &error); - if (result) + if (!cal_comp_is_on_server (priv->comp, priv->cal_client)) { + gchar *uid = NULL; + result = e_cal_client_create_object_sync (priv->cal_client, icalcomp, &uid, NULL, &error); + if (result) { + icalcomponent_set_uid (icalcomp, uid); + g_free (uid); g_signal_emit_by_name (editor, "object_created"); + } } else { gboolean has_recurrences; @@ -484,7 +528,7 @@ save_comp (CompEditor *editor) if (has_recurrences && priv->mod == CALOBJ_MOD_ALL) comp_util_sanitize_recurrence_master ( - priv->comp, priv->client); + priv->comp, priv->cal_client); if (priv->mod == CALOBJ_MOD_THIS) { e_cal_component_set_rdate_list (priv->comp, NULL); @@ -492,13 +536,13 @@ save_comp (CompEditor *editor) e_cal_component_set_exdate_list (priv->comp, NULL); e_cal_component_set_exrule_list (priv->comp, NULL); } - result = e_cal_modify_object (priv->client, icalcomp, priv->mod, &error); + result = e_cal_client_modify_object_sync (priv->cal_client, icalcomp, priv->mod, NULL, &error); if (priv->mod == CALOBJ_MOD_THIS) { if (result && ((flags & COMP_EDITOR_DELEGATE) || !e_cal_component_has_organizer (clone) || - itip_organizer_is_user (clone, priv->client) || - itip_sentby_is_user (clone, priv->client))) + itip_organizer_is_user (clone, priv->cal_client) || + itip_sentby_is_user (clone, priv->cal_client))) e_cal_component_commit_sequence (clone); else e_cal_component_abort_sequence (clone); @@ -550,25 +594,31 @@ save_comp (CompEditor *editor) return FALSE; } else { if (priv->source_client && - !e_source_equal (e_cal_get_source (priv->client), - e_cal_get_source (priv->source_client)) && + !e_source_equal (e_client_get_source (E_CLIENT (priv->cal_client)), + e_client_get_source (E_CLIENT (priv->source_client))) && cal_comp_is_on_server (priv->comp, priv->source_client)) { /* Comp found a new home. Remove it from old one. */ + GError *error = NULL; if (e_cal_component_is_instance (priv->comp) || e_cal_component_has_recurrences (priv->comp)) - e_cal_remove_object_with_mod ( + e_cal_client_remove_object_sync ( priv->source_client, orig_uid_copy, - NULL, CALOBJ_MOD_ALL, NULL); + NULL, CALOBJ_MOD_ALL, NULL, &error); else - e_cal_remove_object ( + e_cal_client_remove_object_sync ( priv->source_client, - orig_uid_copy, NULL); + orig_uid_copy, NULL, CALOBJ_MOD_THIS, NULL, &error); + + if (error) { + g_debug ("%s: Failed to remove object: %s", G_STRFUNC, error->message); + g_error_free (error); + } /* Let priv->source_client point to new home, * so we can move it again this session. */ g_object_unref (priv->source_client); - priv->source_client = g_object_ref (priv->client); + priv->source_client = g_object_ref (priv->cal_client); listen_for_changes (editor); } @@ -608,9 +658,9 @@ save_comp_with_send (CompEditor *editor) if (!save_comp (editor)) return FALSE; - delegated = delegate && !e_cal_get_save_schedules (priv->client); + delegated = delegate && !e_cal_client_check_save_schedules (priv->cal_client); if (delegated || (send && send_component_dialog ( - (GtkWindow *) editor, priv->client, priv->comp, + (GtkWindow *) editor, priv->cal_client, priv->comp, !priv->existing_org, &strip_alarms, !priv->existing_org ? NULL : &only_new_attendees))) { if (delegated) @@ -622,8 +672,8 @@ save_comp_with_send (CompEditor *editor) (only_new_attendees ? COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY : 0)); - if ((itip_organizer_is_user (priv->comp, priv->client) || - itip_sentby_is_user (priv->comp, priv->client))) { + if ((itip_organizer_is_user (priv->comp, priv->cal_client) || + itip_sentby_is_user (priv->comp, priv->cal_client))) { if (e_cal_component_get_vtype (priv->comp) == E_CAL_COMPONENT_JOURNAL) return comp_editor_send_comp ( editor, E_CAL_COMPONENT_METHOD_PUBLISH, @@ -768,7 +818,7 @@ action_print_cb (GtkAction *action, use_24_hour_format = comp_editor_get_use_24_hour_format (editor); print_comp ( - comp, priv->client, zone, use_24_hour_format, + comp, priv->cal_client, zone, use_24_hour_format, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG); g_object_unref (comp); @@ -798,14 +848,14 @@ action_print_preview_cb (GtkAction *action, use_24_hour_format = comp_editor_get_use_24_hour_format (editor); print_comp ( - comp, priv->client, zone, use_24_hour_format, + comp, priv->cal_client, zone, use_24_hour_format, GTK_PRINT_OPERATION_ACTION_PREVIEW); g_object_unref (comp); } static gboolean -remove_event_dialog (ECal *client, +remove_event_dialog (ECalClient *client, ECalComponent *comp, GtkWindow *parent) { @@ -833,7 +883,7 @@ action_save_cb (GtkAction *action, EAttachmentView *view; ECalComponentText text; gboolean delegated = FALSE; - gboolean read_only, correct = FALSE; + gboolean correct = FALSE; ECalComponent *comp; view = E_ATTACHMENT_VIEW (priv->attachment_view); @@ -860,12 +910,12 @@ action_save_cb (GtkAction *action, return; } - if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) { + if (e_client_is_readonly (E_CLIENT (priv->cal_client))) { e_alert_submit ( E_ALERT_SINK (editor), "calendar:prompt-read-only-cal-editor", e_source_peek_name ( - e_cal_get_source (priv->client)), + e_client_get_source (E_CLIENT (priv->cal_client))), NULL); return; } @@ -873,7 +923,7 @@ action_save_cb (GtkAction *action, commit_all_fields (editor); if (e_cal_component_has_recurrences (priv->comp)) { if (!recur_component_dialog ( - priv->client, priv->comp, &priv->mod, + priv->cal_client, priv->comp, &priv->mod, GTK_WINDOW (editor), delegated)) return; } else if (e_cal_component_is_instance (priv->comp)) @@ -888,7 +938,7 @@ action_save_cb (GtkAction *action, if (!text.value) if (!send_component_prompt_subject ( - (GtkWindow *) editor, priv->client, priv->comp)) + (GtkWindow *) editor, priv->cal_client, priv->comp)) return; if (save_comp_with_send (editor)) { @@ -899,7 +949,7 @@ action_save_cb (GtkAction *action, delegate = flags & COMP_EDITOR_DELEGATE; if (delegate && !remove_event_dialog ( - priv->client, priv->comp, GTK_WINDOW (editor))) { + priv->cal_client, priv->comp, GTK_WINDOW (editor))) { const gchar *uid = NULL; GError *error = NULL; @@ -909,12 +959,10 @@ action_save_cb (GtkAction *action, e_cal_component_has_recurrences (priv->comp)) { gchar *rid; rid = e_cal_component_get_recurid_as_string (priv->comp); - e_cal_remove_object_with_mod ( - priv->client, uid, rid, - priv->mod, &error); + e_cal_client_remove_object_sync (priv->cal_client, uid, rid, priv->mod, NULL, &error); g_free (rid); } else - e_cal_remove_object (priv->client, uid, &error); + e_cal_client_remove_object_sync (priv->cal_client, uid, NULL, CALOBJ_MOD_THIS, NULL, &error); g_clear_error (&error); } @@ -1470,9 +1518,9 @@ comp_editor_dispose (GObject *object) priv->window_group = NULL; } - if (priv->client) { - g_object_unref (priv->client); - priv->client = NULL; + if (priv->cal_client) { + g_object_unref (priv->cal_client); + priv->cal_client = NULL; } if (priv->source_client) { @@ -1480,6 +1528,12 @@ comp_editor_dispose (GObject *object) priv->source_client = NULL; } + if (priv->view_cancellable) { + g_cancellable_cancel (priv->view_cancellable); + g_object_unref (priv->view_cancellable); + priv->view_cancellable = NULL; + } + if (priv->view) { g_signal_handlers_disconnect_matched (G_OBJECT (priv->view), G_SIGNAL_MATCH_DATA, @@ -1690,7 +1744,7 @@ comp_editor_class_init (CompEditorClass *class) "client", NULL, NULL, - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); @@ -2074,7 +2128,7 @@ static gboolean prompt_and_save_changes (CompEditor *editor, gboolean send) { CompEditorPrivate *priv; - gboolean read_only, correct = FALSE; + gboolean correct = FALSE; ECalComponent *comp; ECalComponentText text; @@ -2085,12 +2139,12 @@ prompt_and_save_changes (CompEditor *editor, gboolean send) switch (save_component_dialog (GTK_WINDOW (editor), priv->comp)) { case GTK_RESPONSE_YES: /* Save */ - if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) { + if (e_client_is_readonly (E_CLIENT (priv->cal_client))) { e_alert_submit ( E_ALERT_SINK (editor), "calendar:prompt-read-only-cal-editor", e_source_peek_name ( - e_cal_get_source (priv->client)), + e_client_get_source (E_CLIENT (priv->cal_client))), NULL); /* don't discard changes when selected readonly calendar */ return FALSE; @@ -2105,12 +2159,12 @@ prompt_and_save_changes (CompEditor *editor, gboolean send) if (!text.value) if (!send_component_prompt_subject ( - (GtkWindow *) editor, priv->client, priv->comp)) + (GtkWindow *) editor, priv->cal_client, priv->comp)) return FALSE; if (e_cal_component_is_instance (priv->comp)) if (!recur_component_dialog ( - priv->client, priv->comp, &priv->mod, + priv->cal_client, priv->comp, &priv->mod, GTK_WINDOW (editor), FALSE)) return FALSE; @@ -2815,27 +2869,27 @@ comp_editor_show_page (CompEditor *editor, CompEditorPage *page) /** * comp_editor_set_client: * @editor: A component editor - * @client: The calendar client to use + * @cal_client: The calendar client to use * * Sets the calendar client used by the editor to update components **/ void comp_editor_set_client (CompEditor *editor, - ECal *client) + ECalClient *cal_client) { g_return_if_fail (IS_COMP_EDITOR (editor)); - g_return_if_fail (client == NULL || E_IS_CAL (client)); + g_return_if_fail (cal_client == NULL || E_IS_CAL_CLIENT (cal_client)); - if (client != NULL) - g_object_ref (client); + if (cal_client != NULL) + g_object_ref (cal_client); - if (editor->priv->client != NULL) - g_object_unref (editor->priv->client); + if (editor->priv->cal_client != NULL) + g_object_unref (editor->priv->cal_client); - editor->priv->client = client; + editor->priv->cal_client = cal_client; - if (editor->priv->source_client == NULL && client != NULL) - editor->priv->source_client = g_object_ref (client); + if (editor->priv->source_client == NULL && cal_client != NULL) + editor->priv->source_client = g_object_ref (cal_client); g_object_notify (G_OBJECT (editor), "client"); } @@ -2848,12 +2902,12 @@ comp_editor_set_client (CompEditor *editor, * * Return value: The calendar client of the editor **/ -ECal * +ECalClient * comp_editor_get_client (CompEditor *editor) { g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL); - return editor->priv->client; + return editor->priv->cal_client; } static void @@ -3046,7 +3100,7 @@ set_attendees_for_delegation (ECalComponent *comp, } static void -get_users_from_memo_comp (ECalComponent *comp, GList **users) +get_users_from_memo_comp (ECalComponent *comp, GSList **users) { icalcomponent *icalcomp; icalproperty *icalprop; @@ -3072,7 +3126,7 @@ get_users_from_memo_comp (ECalComponent *comp, GList **users) iter = emails; while (*iter) { - *users = g_list_append (*users, g_strdup (*iter)); + *users = g_slist_append (*users, g_strdup (*iter)); iter++; } g_strfreev (emails); @@ -3088,7 +3142,7 @@ real_send_comp (CompEditor *editor, CompEditorFlags flags; ECalComponent *send_comp = NULL; gchar *address = NULL; - GList *users = NULL; + GSList *users = NULL; g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE); @@ -3101,7 +3155,7 @@ real_send_comp (CompEditor *editor, const gchar *uid = NULL; e_cal_component_get_uid (priv->comp, &uid); - if (e_cal_get_object (priv->client, uid, NULL, &icalcomp, NULL) && icalcomp) { + if (e_cal_client_get_object_sync (priv->cal_client, uid, NULL, &icalcomp, NULL, NULL) && icalcomp) { send_comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (send_comp, icalcomp)) { icalcomponent_free (icalcomp); @@ -3122,17 +3176,17 @@ real_send_comp (CompEditor *editor, /* The user updates the delegated status to the Organizer, * so remove all other attendees. */ if (flags & COMP_EDITOR_DELEGATE) { - address = itip_get_comp_attendee (send_comp, priv->client); + address = itip_get_comp_attendee (send_comp, priv->cal_client); if (address) set_attendees_for_delegation (send_comp, address, method); } if (!e_cal_component_has_attachments (priv->comp) || - e_cal_get_static_capability (priv->client, + e_client_check_capability (E_CLIENT (priv->cal_client), CAL_STATIC_CAPABILITY_CREATE_MESSAGES)) { if (itip_send_comp ( - method, send_comp, priv->client, + method, send_comp, priv->cal_client, NULL, NULL, users, strip_alarms, priv->flags & COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY)) { g_object_unref (send_comp); @@ -3162,7 +3216,7 @@ real_send_comp (CompEditor *editor, } if (itip_send_comp ( - method, send_comp, priv->client, + method, send_comp, priv->cal_client, NULL, mime_attach_list, users, strip_alarms, priv->flags & COMP_EDITOR_SEND_TO_NEW_ATTENDEES_ONLY)) { gboolean saved = save_comp (editor); @@ -3279,10 +3333,10 @@ comp_editor_delete_comp (CompEditor *editor) e_cal_component_get_uid (priv->comp, &uid); if (e_cal_component_is_instance (priv->comp) || e_cal_component_has_recurrences (priv->comp)) - e_cal_remove_object_with_mod (priv->client, uid, NULL, - CALOBJ_MOD_ALL, NULL); + e_cal_client_remove_object_sync (priv->cal_client, uid, NULL, + CALOBJ_MOD_ALL, NULL, NULL); else - e_cal_remove_object (priv->client, uid, NULL); + e_cal_client_remove_object_sync (priv->cal_client, uid, NULL, CALOBJ_MOD_THIS, NULL, NULL); close_dialog (editor); } @@ -3428,8 +3482,8 @@ page_dates_changed_cb (CompEditor *editor, } static void -obj_modified_cb (ECal *client, - GList *objects, +obj_modified_cb (ECalClientView *view, + const GSList *objects, CompEditor *editor) { CompEditorPrivate *priv; @@ -3465,8 +3519,8 @@ obj_modified_cb (ECal *client, } static void -obj_removed_cb (ECal *client, - GList *uids, +obj_removed_cb (ECalClientView *view, + const GSList *uids, CompEditor *editor) { CompEditorPrivate *priv = editor->priv; diff --git a/calendar/gui/dialogs/comp-editor.h b/calendar/gui/dialogs/comp-editor.h index 591300ffd2..3f1ddbb673 100644 --- a/calendar/gui/dialogs/comp-editor.h +++ b/calendar/gui/dialogs/comp-editor.h @@ -26,7 +26,7 @@ #define COMP_EDITOR_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "../itip-utils.h" #include "comp-editor-page.h" #include <shell/e-shell.h> @@ -165,8 +165,8 @@ void comp_editor_remove_page (CompEditor *editor, void comp_editor_show_page (CompEditor *editor, CompEditorPage *page); void comp_editor_set_client (CompEditor *editor, - ECal *client); -ECal * comp_editor_get_client (CompEditor *editor); + ECalClient *cal_client); +ECalClient * comp_editor_get_client (CompEditor *editor); void comp_editor_edit_comp (CompEditor *ee, ECalComponent *comp); ECalComponent * comp_editor_get_comp (CompEditor *editor); diff --git a/calendar/gui/dialogs/copy-source-dialog.c b/calendar/gui/dialogs/copy-source-dialog.c index 547a91069c..7b75624a56 100644 --- a/calendar/gui/dialogs/copy-source-dialog.c +++ b/calendar/gui/dialogs/copy-source-dialog.c @@ -27,33 +27,35 @@ #endif #include <glib/gi18n.h> +#include <libedataserverui/e-client-utils.h> + #include "copy-source-dialog.h" #include "select-source-dialog.h" -#include "common/authentication.h" typedef struct { GtkWindow *parent; ESource *orig_source; - ECalSourceType obj_type; + EClientSourceType obj_type; ESource *selected_source; + ECalClient *source_client, *dest_client; } CopySourceDialogData; static void -show_error (CopySourceDialogData *csdd, const gchar *msg) +show_error (CopySourceDialogData *csdd, const gchar *msg, const GError *error) { GtkWidget *dialog; dialog = gtk_message_dialog_new ( csdd->parent, 0, GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, "%s", msg); + GTK_BUTTONS_CLOSE, error ? "%s\n%s" : "%s", msg, error ? error->message : ""); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } struct ForeachTzidData { - ECal *source_client; - ECal *dest_client; + ECalClient *source_client; + ECalClient *dest_client; }; static void @@ -71,61 +73,70 @@ add_timezone_to_cal_cb (icalparameter *param, gpointer data) if (!tzid || !*tzid) return; - if (e_cal_get_timezone (ftd->source_client, tzid, &tz, NULL) && tz) - e_cal_add_timezone (ftd->dest_client, tz, NULL); + if (e_cal_client_get_timezone_sync (ftd->source_client, tzid, &tz, NULL, NULL) && tz) + e_cal_client_add_timezone_sync (ftd->dest_client, tz, NULL, NULL); } -static gboolean -copy_source (CopySourceDialogData *csdd) +static void +free_copy_data (CopySourceDialogData *csdd) { - ECal *source_client, *dest_client; - gboolean read_only = TRUE; - GList *obj_list = NULL; - gboolean result = FALSE; - - if (!csdd->selected_source) - return FALSE; - - /* open the source */ - source_client = e_auth_new_cal_from_source (csdd->orig_source, csdd->obj_type); - if (!e_cal_open (source_client, TRUE, NULL)) { - show_error (csdd, _("Could not open source")); - g_object_unref (source_client); - return FALSE; - } + if (!csdd) + return; - /* open the destination */ - dest_client = e_auth_new_cal_from_source (csdd->selected_source, csdd->obj_type); - if (!e_cal_open (dest_client, FALSE, NULL)) { - show_error (csdd, _("Could not open destination")); - g_object_unref (dest_client); - g_object_unref (source_client); - return FALSE; + if (csdd->orig_source) + g_object_unref (csdd->orig_source); + if (csdd->selected_source) + g_object_unref (csdd->selected_source); + if (csdd->source_client) + g_object_unref (csdd->source_client); + if (csdd->dest_client) + g_object_unref (csdd->dest_client); + g_free (csdd); +} + +static void +dest_source_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + CopySourceDialogData *csdd = user_data; + EClient *client = NULL; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (!client) { + show_error (csdd, _("Could not open destination"), error); + if (error) + g_error_free (error); + free_copy_data (csdd); + return; } + csdd->dest_client = E_CAL_CLIENT (client); + + e_client_utils_open_new (csdd->selected_source, csdd->obj_type, FALSE, NULL, + e_client_utils_authenticate_handler, csdd->parent, + dest_source_opened_cb, csdd); + /* check if the destination is read only */ - e_cal_is_read_only (dest_client, &read_only, NULL); - if (read_only) { - show_error (csdd, _("Destination is read only")); + if (e_client_is_readonly (E_CLIENT (csdd->dest_client))) { + show_error (csdd, _("Destination is read only"), NULL); } else { - if (e_cal_get_object_list (source_client, "#t", &obj_list, NULL)) { - GList *l; + GSList *obj_list = NULL; + if (e_cal_client_get_object_list_sync (csdd->source_client, "#t", &obj_list, NULL, NULL)) { + GSList *l; icalcomponent *icalcomp; struct ForeachTzidData ftd; - ftd.source_client = source_client; - ftd.dest_client = dest_client; + ftd.source_client = csdd->source_client; + ftd.dest_client = csdd->dest_client; for (l = obj_list; l != NULL; l = l->next) { /* FIXME: process recurrences */ /* FIXME: process errors */ - if (e_cal_get_object ( - dest_client, - icalcomponent_get_uid (l->data), - NULL, &icalcomp, NULL)) { - e_cal_modify_object ( - dest_client, l->data, - CALOBJ_MOD_ALL, NULL); + if (e_cal_client_get_object_sync (csdd->dest_client, icalcomponent_get_uid (l->data), NULL, + &icalcomp, NULL, NULL)) { + e_cal_client_modify_object_sync (csdd->dest_client, l->data, CALOBJ_MOD_ALL, NULL, NULL); icalcomponent_free (icalcomp); } else { gchar *uid = NULL; @@ -139,11 +150,11 @@ copy_source (CopySourceDialogData *csdd) icalcomp, add_timezone_to_cal_cb, &ftd); - if (e_cal_create_object (dest_client, icalcomp, &uid, &error)) { + if (e_cal_client_create_object_sync (csdd->dest_client, icalcomp, &uid, NULL, &error)) { g_free (uid); } else { if (error) { - show_error (csdd, error->message); + show_error (csdd, _("Cannot create object"), error); g_error_free (error); } break; @@ -151,15 +162,57 @@ copy_source (CopySourceDialogData *csdd) } } - e_cal_free_object_list (obj_list); + e_cal_client_free_icalcomp_slist (obj_list); } } - /* free memory */ - g_object_unref (dest_client); - g_object_unref (source_client); + free_copy_data (csdd); +} + +static void +orig_source_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + CopySourceDialogData *csdd = user_data; + EClient *client = NULL; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (!client) { + show_error (csdd, _("Could not open source"), error); + if (error) + g_error_free (error); + free_copy_data (csdd); + return; + } + + csdd->source_client = E_CAL_CLIENT (client); + + e_client_utils_open_new (csdd->selected_source, csdd->obj_type, FALSE, NULL, + e_client_utils_authenticate_handler, csdd->parent, + dest_source_opened_cb, csdd); +} + +static void +copy_source (const CopySourceDialogData *const_csdd) +{ + CopySourceDialogData *csdd; + + if (!const_csdd->selected_source) + return; - return result; + g_return_if_fail (const_csdd->obj_type != E_CLIENT_SOURCE_TYPE_LAST); + + csdd = g_new0 (CopySourceDialogData, 1); + csdd->parent = const_csdd->parent; + csdd->orig_source = g_object_ref (const_csdd->orig_source); + csdd->obj_type = const_csdd->obj_type; + csdd->selected_source = g_object_ref (const_csdd->selected_source); + + e_client_utils_open_new (csdd->orig_source, csdd->obj_type, FALSE, NULL, + e_client_utils_authenticate_handler, csdd->parent, + orig_source_opened_cb, csdd); } /** @@ -168,26 +221,29 @@ copy_source (CopySourceDialogData *csdd) * Implements the Copy command for sources, allowing the user to select a target * source to copy to. */ -gboolean -copy_source_dialog (GtkWindow *parent, ESource *source, ECalSourceType obj_type) +void +copy_source_dialog (GtkWindow *parent, ESource *source, ECalClientSourceType obj_type) { CopySourceDialogData csdd; - gboolean result = FALSE; - g_return_val_if_fail (E_IS_SOURCE (source), FALSE); + g_return_if_fail (E_IS_SOURCE (source)); + g_return_if_fail (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS || + obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS || + obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS); csdd.parent = parent; csdd.orig_source = source; csdd.selected_source = NULL; - csdd.obj_type = obj_type; + csdd.obj_type = obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS ? E_CLIENT_SOURCE_TYPE_EVENTS : + obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS ? E_CLIENT_SOURCE_TYPE_TASKS : + obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS ? E_CLIENT_SOURCE_TYPE_MEMOS : + E_CLIENT_SOURCE_TYPE_LAST; csdd.selected_source = select_source_dialog (parent, obj_type, source); if (csdd.selected_source) { - result = copy_source (&csdd); + copy_source (&csdd); /* free memory */ g_object_unref (csdd.selected_source); } - - return result; } diff --git a/calendar/gui/dialogs/copy-source-dialog.h b/calendar/gui/dialogs/copy-source-dialog.h index 4c6f5b19c8..d9475f742c 100644 --- a/calendar/gui/dialogs/copy-source-dialog.h +++ b/calendar/gui/dialogs/copy-source-dialog.h @@ -28,9 +28,9 @@ #include <gtk/gtk.h> #include <libedataserver/e-source.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-util.h> -gboolean copy_source_dialog (GtkWindow *parent, ESource *source, ECalSourceType type); +void copy_source_dialog (GtkWindow *parent, ESource *source, ECalClientSourceType type); #endif diff --git a/calendar/gui/dialogs/delete-error.c b/calendar/gui/dialogs/delete-error.c index 9b9d22ae4c..cd461c7858 100644 --- a/calendar/gui/dialogs/delete-error.c +++ b/calendar/gui/dialogs/delete-error.c @@ -45,11 +45,11 @@ delete_error_dialog (const GError *error, ECalComponentVType vtype) const gchar *str; const gchar *icon_name = NULL; - if (!error) + if (!error || error->domain != E_CLIENT_ERROR) return; switch (error->code) { - case E_CALENDAR_STATUS_DBUS_EXCEPTION: + case E_CLIENT_ERROR_DBUS_ERROR: switch (vtype) { case E_CAL_COMPONENT_EVENT: /* Translators: The '%s' is replaced with a detailed error message */ @@ -69,7 +69,7 @@ delete_error_dialog (const GError *error, ECalComponentVType vtype) break; } break; - case E_CALENDAR_STATUS_PERMISSION_DENIED: + case E_CLIENT_ERROR_PERMISSION_DENIED: switch (vtype) { case E_CAL_COMPONENT_EVENT: str = _("The event could not be deleted because permission was denied"); @@ -85,7 +85,7 @@ delete_error_dialog (const GError *error, ECalComponentVType vtype) break; } break; - case E_CALENDAR_STATUS_OTHER_ERROR: + case E_CLIENT_ERROR_OTHER_ERROR: switch (vtype) { case E_CAL_COMPONENT_EVENT: /* Translators: The '%s' is replaced with a detailed error message */ @@ -105,8 +105,6 @@ delete_error_dialog (const GError *error, ECalComponentVType vtype) break; } break; - case E_CALENDAR_STATUS_OK: - case E_CALENDAR_STATUS_OBJECT_NOT_FOUND: default: /* If not found, we don't care - its gone anyhow */ return; diff --git a/calendar/gui/dialogs/delete-error.h b/calendar/gui/dialogs/delete-error.h index 480edcbd42..91e38c146f 100644 --- a/calendar/gui/dialogs/delete-error.h +++ b/calendar/gui/dialogs/delete-error.h @@ -26,7 +26,7 @@ #ifndef DELETE_ERROR_H #define DELETE_ERROR_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> void delete_error_dialog (const GError *error, ECalComponentVType vtype); diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index 64d3b67891..f4c798bfd1 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -286,7 +286,7 @@ event_editor_constructor (GType type, GtkActionGroup *action_group; GtkWidget *content_area; EShell *shell; - ECal *client; + ECalClient *client; gboolean is_meeting; GtkWidget *alarm_page; GtkWidget *attendee_page; @@ -363,8 +363,7 @@ event_editor_constructor (GType type, if (is_meeting) { - if (e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS)) event_page_show_options (priv->event_page); comp_editor_set_group_item (editor, TRUE); @@ -604,7 +603,7 @@ event_editor_edit_comp (CompEditor *editor, ECalComponent *comp) ECalComponentOrganizer organizer; gboolean delegate; ECalComponentDateTime dtstart, dtend; - ECal *client; + ECalClient *client; GSList *attendees = NULL; priv = EVENT_EDITOR (editor)->priv; @@ -645,8 +644,8 @@ event_editor_edit_comp (CompEditor *editor, ECalComponent *comp) gtk_action_set_visible (action, TRUE); } - if (!(delegate && e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY))) { + if (!(delegate && e_client_check_capability ( + E_CLIENT (client), CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY))) { event_page_remove_all_attendees (priv->event_page); for (l = attendees; l != NULL; l = l->next) { @@ -685,7 +684,7 @@ event_editor_edit_comp (CompEditor *editor, ECalComponent *comp) if (ia != NULL) e_meeting_attendee_set_edit_level ( ia, E_MEETING_ATTENDEE_EDIT_STATUS); - } else if (e_cal_get_organizer_must_attend (client)) { + } else if (e_cal_client_check_organizer_must_attend (client)) { EMeetingAttendee *ia; ia = e_meeting_store_find_attendee ( @@ -726,7 +725,7 @@ event_editor_send_comp (CompEditor *editor, comp = event_page_get_cancel_comp (priv->event_page); if (comp != NULL) { - ECal *client; + ECalClient *client; gboolean result; client = e_meeting_store_get_client (priv->model); @@ -748,7 +747,7 @@ event_editor_send_comp (CompEditor *editor, /** * event_editor_new: - * @client: a ECal + * @client: a ECalClient * * Creates a new event editor dialog. * @@ -756,11 +755,11 @@ event_editor_send_comp (CompEditor *editor, * editor could not be created. **/ CompEditor * -event_editor_new (ECal *client, +event_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags) { - g_return_val_if_fail (E_IS_CAL (client), NULL); + g_return_val_if_fail (E_IS_CAL_CLIENT (client), NULL); g_return_val_if_fail (E_IS_SHELL (shell), NULL); return g_object_new ( diff --git a/calendar/gui/dialogs/event-editor.h b/calendar/gui/dialogs/event-editor.h index abb8f0e659..eaa2c49057 100644 --- a/calendar/gui/dialogs/event-editor.h +++ b/calendar/gui/dialogs/event-editor.h @@ -65,7 +65,7 @@ struct _EventEditorClass { }; GType event_editor_get_type (void); -CompEditor * event_editor_new (ECal *client, +CompEditor * event_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags); void event_editor_show_meeting (EventEditor *ee); diff --git a/calendar/gui/dialogs/event-page.c b/calendar/gui/dialogs/event-page.c index b6d7c2630b..68210d1090 100644 --- a/calendar/gui/dialogs/event-page.c +++ b/calendar/gui/dialogs/event-page.c @@ -35,8 +35,8 @@ #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> #include <libedataserverui/e-category-completion.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-combo-box.h> -#include "common/authentication.h" #include "misc/e-dateedit.h" #include "misc/e-send-options.h" #include "misc/e-buffer-tagger.h" @@ -604,7 +604,7 @@ create_alarm_image_button (const gchar *image_text, static void sensitize_widgets (EventPage *epage) { - ECal *client; + ECalClient *client; EShell *shell; CompEditor *editor; CompEditorFlags flags; @@ -623,8 +623,7 @@ sensitize_widgets (EventPage *epage) if (flags & COMP_EDITOR_MEETING) sens = flags & COMP_EDITOR_USER_ORG; - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); delegate = flags & COMP_EDITOR_DELEGATE; @@ -724,7 +723,7 @@ update_time (EventPage *epage, ECalComponentDateTime *end_date) { CompEditor *editor; - ECal *client; + ECalClient *client; GtkAction *action; struct icaltimetype *start_tt, *end_tt, implied_tt; icaltimezone *start_zone = NULL, *def_zone = NULL; @@ -734,15 +733,20 @@ update_time (EventPage *epage, editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); client = comp_editor_get_client (editor); - /* Note that if we are creating a new event, the timezones may not be - on the server, so we try to get the builtin timezone with the TZID - first. */ - start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid); - if (!start_zone) { - /* FIXME: Handle error better. */ - if (!e_cal_get_timezone (client, start_date->tzid, &start_zone, NULL)) { - g_warning ("Couldn't get timezone from server: %s", - start_date->tzid ? start_date->tzid : ""); + if (start_date->tzid) { + /* Note that if we are creating a new event, the timezones may not be + on the server, so we try to get the builtin timezone with the TZID + first. */ + start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid); + if (!start_zone) { + /* FIXME: Handle error better. */ + GError *error = NULL; + if (!e_cal_client_get_timezone_sync (client, start_date->tzid, &start_zone, NULL, &error)) { + g_warning ("Couldn't get timezone '%s' from server: %s", + start_date->tzid ? start_date->tzid : "", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + } } } @@ -1068,7 +1072,7 @@ static gboolean event_page_fill_widgets (CompEditorPage *page, ECalComponent *comp) { - ECal *client; + ECalClient *client; CompEditor *editor; CompEditorFlags flags; EventPage *epage; @@ -1135,7 +1139,7 @@ event_page_fill_widgets (CompEditorPage *page, e_cal_component_free_text_list (l); e_buffer_tagger_update_tags (GTK_TEXT_VIEW (priv->description)); - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); set_subscriber_info_string (epage, backend_addr); if (priv->is_meeting) { @@ -1156,13 +1160,13 @@ event_page_fill_widgets (CompEditorPage *page, gchar *string; if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) { - if (e_cal_get_static_capability ( - client, + if (e_client_check_capability ( + E_CLIENT (client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) priv->user_org = TRUE; } else { - if (e_cal_get_static_capability ( - client, + if (e_client_check_capability ( + E_CLIENT (client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) gtk_widget_set_sensitive (priv->invite, FALSE); gtk_widget_set_sensitive (priv->add, FALSE); @@ -1171,7 +1175,7 @@ event_page_fill_widgets (CompEditorPage *page, priv->user_org = FALSE; } - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE)) string = g_strdup (backend_addr); else if ( organizer.cn != NULL) string = g_strdup_printf ("%s <%s>", organizer.cn, strip); @@ -1224,7 +1228,7 @@ event_page_fill_widgets (CompEditorPage *page, backend_mailto = mailto = NULL; } - if (client && e_cal_get_organizer_must_accept (client)) + if (client && e_cal_client_check_organizer_must_accept (client)) e_meeting_attendee_set_status ( attendee, ICAL_PARTSTAT_NEEDSACTION); else @@ -1277,7 +1281,7 @@ event_page_fill_widgets (CompEditorPage *page, break; } - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_TRANSPARENCY)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_TRANSPARENCY)) enable_busy_time_menu (epage, FALSE); else enable_busy_time_menu (epage, TRUE); @@ -1318,7 +1322,7 @@ event_page_fill_widgets (CompEditorPage *page, /* Source */ e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); e_cal_component_get_uid (comp, &uid); if (!(flags & COMP_EDITOR_DELEGATE) @@ -1337,7 +1341,7 @@ event_page_fill_component (CompEditorPage *page, { CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; EventPage *epage; EventPagePrivate *priv; ECalComponentClassification classification; @@ -1622,7 +1626,7 @@ event_page_fill_component (CompEditorPage *page, gchar *name; gchar *mailto; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); /* Find the identity for the organizer or sentby field */ if (!get_current_identity (epage, &name, &mailto)) { @@ -2172,7 +2176,7 @@ attendee_added_cb (EMeetingListView *emlv, EventPagePrivate *priv = epage->priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); client = comp_editor_get_client (editor); @@ -2186,7 +2190,7 @@ attendee_added_cb (EMeetingListView *emlv, /* do not remove here, it did EMeetingListView already */ e_meeting_attendee_set_delfrom (ia, g_strdup_printf ("MAILTO:%s", priv->user_add ? priv->user_add : "")); - if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) { + if (!e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) { EMeetingAttendee *delegator; gtk_widget_set_sensitive (priv->invite, FALSE); @@ -2822,7 +2826,7 @@ event_page_send_options_clicked_cb (EventPage *epage) CompEditor *editor; GtkWidget *toplevel; ESource *source; - ECal *client; + ECalClient *client; priv = epage->priv; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); @@ -2836,7 +2840,7 @@ event_page_send_options_clicked_cb (EventPage *epage) priv->sod->data->initialized = TRUE; } - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) { + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) { e_send_options_set_need_general_options (priv->sod, FALSE); } @@ -2850,25 +2854,28 @@ source_changed_cb (ESourceComboBox *source_combo_box, EventPage *epage) EventPagePrivate *priv = epage->priv; CompEditor *editor; ESource *source; - ECal *client; + ECalClient *client; + GError *error = NULL; if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (epage))) return; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); source = e_source_combo_box_get_active (source_combo_box); - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); + client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &error); if (client) { icaltimezone *zone; zone = e_meeting_store_get_timezone (epage->priv->meeting_store); - e_cal_set_default_timezone (client, zone, NULL); + e_cal_client_set_default_timezone (client, zone); + + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); } - if (!client || !e_cal_open (client, FALSE, NULL)) { + if (!client || !e_client_open_sync (E_CLIENT (client), FALSE, NULL, &error)) { GtkWidget *dialog; - ECal *old_client; + ECalClient *old_client; old_client = comp_editor_get_client (editor); @@ -2877,17 +2884,21 @@ source_changed_cb (ESourceComboBox *source_combo_box, EventPage *epage) e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (old_client)); + e_client_get_source (E_CLIENT (old_client))); dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - _("Unable to open the calendar '%s'."), - e_source_peek_name (source)); + _("Unable to open the calendar '%s': %s"), + e_source_peek_name (source), + error ? error->message : _("Unknown error")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); + + if (error) + g_error_free (error); } else { comp_editor_set_client (editor, client); - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_meeting) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_meeting) event_page_show_options (epage); else event_page_hide_options (epage); @@ -2895,7 +2906,7 @@ source_changed_cb (ESourceComboBox *source_combo_box, EventPage *epage) if (client) { gchar *backend_addr = NULL; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); if (priv->is_meeting) event_page_select_organizer (epage, backend_addr); @@ -2914,12 +2925,12 @@ static void set_subscriber_info_string (EventPage *epage, const gchar *backend_address) { CompEditor *editor; - ECal *client; + ECalClient *client; ESource *source; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); client = comp_editor_get_client (editor); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (e_source_get_property (source, "subscriber")) { g_free (epage->priv->subscriber_info_text); @@ -3033,7 +3044,7 @@ alarm_custom_clicked_cb (GtkWidget *widget, GtkTreeIter iter; gboolean valid_iter; GtkWidget *toplevel; - ECal *client; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage)); client = comp_editor_get_client (editor); @@ -3084,7 +3095,7 @@ init_widgets (EventPage *epage) GtkAction *action; GtkTreeSelection *selection; gboolean active; - ECal *client; + ECalClient *client; GtkTreeIter iter; GtkListStore *store; @@ -3328,7 +3339,7 @@ event_page_select_organizer (EventPage *epage, const gchar *backend_address) { EventPagePrivate *priv = epage->priv; CompEditor *editor; - ECal *client; + ECalClient *client; const gchar *default_address; gboolean subscribed_cal = FALSE; ESource *source = NULL; @@ -3339,7 +3350,7 @@ event_page_select_organizer (EventPage *epage, const gchar *backend_address) client = comp_editor_get_client (editor); if (client) - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (source) user_addr = e_source_get_property (source, "subscriber"); diff --git a/calendar/gui/dialogs/goto-dialog.c b/calendar/gui/dialogs/goto-dialog.c index bc20baa7c2..3ef0db31bf 100644 --- a/calendar/gui/dialogs/goto-dialog.c +++ b/calendar/gui/dialogs/goto-dialog.c @@ -89,7 +89,7 @@ ecal_date_range_changed (ECalendarItem *calitem, gpointer user_data) { GoToDialog *dlg = user_data; ECalModel *model; - ECal *client; + ECalClient *client; model = gnome_calendar_get_model (dlg->gcal); client = e_cal_model_get_default_client (model); diff --git a/calendar/gui/dialogs/memo-editor.c b/calendar/gui/dialogs/memo-editor.c index 2f64910cab..e7dd1e7f93 100644 --- a/calendar/gui/dialogs/memo-editor.c +++ b/calendar/gui/dialogs/memo-editor.c @@ -158,7 +158,7 @@ memo_editor_init (MemoEditor *me) /** * memo_editor_new: - * @client: an ECal + * @client: an #ECalClient * * Creates a new event editor dialog. * @@ -166,11 +166,11 @@ memo_editor_init (MemoEditor *me) * editor could not be created. **/ CompEditor * -memo_editor_new (ECal *client, +memo_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags) { - g_return_val_if_fail (E_IS_CAL (client), NULL); + g_return_val_if_fail (E_IS_CAL_CLIENT (client), NULL); g_return_val_if_fail (E_IS_SHELL (shell), NULL); return g_object_new ( diff --git a/calendar/gui/dialogs/memo-editor.h b/calendar/gui/dialogs/memo-editor.h index cd4bc194ac..a5d32c07eb 100644 --- a/calendar/gui/dialogs/memo-editor.h +++ b/calendar/gui/dialogs/memo-editor.h @@ -67,7 +67,7 @@ struct _MemoEditorClass { }; GType memo_editor_get_type (void); -CompEditor * memo_editor_new (ECal *client, +CompEditor * memo_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags); diff --git a/calendar/gui/dialogs/memo-page.c b/calendar/gui/dialogs/memo-page.c index e055072959..d720e91b1d 100644 --- a/calendar/gui/dialogs/memo-page.c +++ b/calendar/gui/dialogs/memo-page.c @@ -34,6 +34,7 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> #include <libedataserverui/e-category-completion.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-combo-box.h> #include <libedataserverui/e-name-selector.h> #include <libedataserverui/e-name-selector-entry.h> @@ -48,7 +49,6 @@ #include "e-util/e-dialog-widgets.h" #include "e-util/e-util-private.h" -#include "common/authentication.h" #include "../calendar-config.h" #include "comp-editor.h" #include "comp-editor-util.h" @@ -242,7 +242,7 @@ memo_page_fill_widgets (CompEditorPage *page, MemoPagePrivate *priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; ECalComponentClassification cl; ECalComponentText text; ECalComponentDateTime d; @@ -297,7 +297,7 @@ memo_page_fill_widgets (CompEditorPage *page, e_cal_component_get_categories (comp, &categories); e_dialog_editable_set (priv->categories, categories); - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); set_subscriber_info_string (mpage, backend_addr); if (e_cal_component_has_organizer (comp)) { @@ -333,7 +333,7 @@ memo_page_fill_widgets (CompEditorPage *page, /* Source */ e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); if (priv->to_entry && (flags & COMP_EDITOR_IS_SHARED) && !(flags & COMP_EDITOR_NEW_ITEM)) gtk_entry_set_text (GTK_ENTRY (priv->to_entry), get_recipients (comp)); @@ -403,7 +403,7 @@ sensitize_widgets (MemoPage *mpage) CompEditor *editor; CompEditorFlags flags; MemoPagePrivate *priv; - ECal *client; + ECalClient *client; priv = mpage->priv; @@ -411,8 +411,7 @@ sensitize_widgets (MemoPage *mpage) client = comp_editor_get_client (editor); flags = comp_editor_get_flags (editor); - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); if (flags & COMP_EDITOR_IS_SHARED) sens = flags & COMP_EDITOR_USER_ORG; @@ -511,53 +510,51 @@ fill_comp_with_recipients (ENameSelector *name_selector, ECalComponent *comp) /* check if the contact is contact list which is not expanded yet */ /* we expand it by getting the list again from the server forming the query */ if (contact && e_contact_get (contact , E_CONTACT_IS_LIST)) { - EBook *book = NULL; + EBookClient *book_client = NULL; ENameSelectorDialog *dialog; ENameSelectorModel *model; EContactStore *c_store; - GList *books, *l; + GSList *clients, *l; gchar *uri = e_contact_get (contact, E_CONTACT_BOOK_URI); dialog = e_name_selector_peek_dialog (name_selector); model = e_name_selector_dialog_peek_model (dialog); c_store = e_name_selector_model_peek_contact_store (model); - books = e_contact_store_get_books (c_store); + clients = e_contact_store_get_clients (c_store); - for (l = books; l; l = l->next) { - EBook *b = l->data; - if (g_str_equal (uri, e_book_get_uri (b))) { - book = b; + for (l = clients; l; l = l->next) { + EBookClient *b = l->data; + if (g_str_equal (uri, e_client_get_uri (E_CLIENT (b)))) { + book_client = b; break; } } - if (book) { - GList *contacts = NULL; + if (book_client) { + GSList *contacts = NULL; EContact *n_con = NULL; - gchar *qu; - EBookQuery *query; + gchar *query; - qu = g_strdup_printf ("(is \"full_name\" \"%s\")", + query = g_strdup_printf ("(is \"full_name\" \"%s\")", (gchar *) e_contact_get (contact, E_CONTACT_FULL_NAME)); - query = e_book_query_from_string (qu); - if (!e_book_get_contacts (book, query, &contacts, NULL)) { + if (!e_book_client_get_contacts_sync (book_client, query, &contacts, NULL, NULL)) { g_warning ("Could not get contact from the book \n"); } else { des = e_destination_new (); n_con = contacts->data; e_destination_set_contact (des, n_con, 0); + e_destination_set_client (des, book_client); list_dests = e_destination_list_get_dests (des); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); } - e_book_query_unref (query); - g_free (qu); + g_free (query); } - g_list_free (books); + g_slist_free (clients); } else { card_dest.next = NULL; card_dest.prev = NULL; @@ -611,7 +608,7 @@ memo_page_fill_component (CompEditorPage *page, MemoPagePrivate *priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; ECalComponentClassification classification; ECalComponentDateTime start_date; struct icaltimetype start_tt; @@ -724,7 +721,7 @@ memo_page_fill_component (CompEditorPage *page, gchar *name; gchar *mailto; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); /* Find the identity for the organizer or sentby field */ if (!get_current_identity (mpage, &name, &mailto)) { @@ -888,7 +885,8 @@ source_changed_cb (ESourceComboBox *source_combo_box, CompEditor *editor; CompEditorFlags flags; ESource *source; - ECal *client; + ECalClient *client; + GError *error = NULL; if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (mpage))) return; @@ -897,11 +895,14 @@ source_changed_cb (ESourceComboBox *source_combo_box, flags = comp_editor_get_flags (editor); source = e_source_combo_box_get_active (source_combo_box); - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL); + client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_MEMOS, &error); - if (!client || !e_cal_open (client, FALSE, NULL)) { + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!client || !e_client_open_sync (E_CLIENT (client), FALSE, NULL, &error)) { GtkWidget *dialog; - ECal *old_client; + ECalClient *old_client; old_client = comp_editor_get_client (editor); @@ -910,21 +911,25 @@ source_changed_cb (ESourceComboBox *source_combo_box, e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (old_client)); + e_client_get_source (E_CLIENT (old_client))); dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - _("Unable to open memos in '%s'."), - e_source_peek_name (source)); + _("Unable to open memos in '%s': %s"), + e_source_peek_name (source), + error ? error->message : _("Unknown error")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); + + if (error) + g_error_free (error); } else { comp_editor_set_client (editor, client); if (client) { gchar *backend_addr = NULL; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); if (flags & COMP_EDITOR_IS_SHARED) memo_page_select_organizer (mpage, backend_addr); @@ -942,12 +947,12 @@ set_subscriber_info_string (MemoPage *mpage, const gchar *backend_address) { CompEditor *editor; - ECal *client; + ECalClient *client; ESource *source; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage)); client = comp_editor_get_client (editor); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (e_source_get_property (source, "subscriber")) { g_free (mpage->priv->subscriber_info_text); @@ -1097,7 +1102,7 @@ memo_page_select_organizer (MemoPage *mpage, const gchar *backend_address) MemoPagePrivate *priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; const gchar *default_address; gboolean subscribed_cal = FALSE; ESource *source = NULL; @@ -1110,7 +1115,7 @@ memo_page_select_organizer (MemoPage *mpage, const gchar *backend_address) flags = comp_editor_get_flags (editor); if (client) - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (source) user_addr = e_source_get_property (source, "subscriber"); diff --git a/calendar/gui/dialogs/recur-comp.c b/calendar/gui/dialogs/recur-comp.c index 7793647723..3514c03dbf 100644 --- a/calendar/gui/dialogs/recur-comp.c +++ b/calendar/gui/dialogs/recur-comp.c @@ -32,7 +32,7 @@ gboolean -recur_component_dialog (ECal *client, +recur_component_dialog (ECalClient *client, ECalComponent *comp, CalObjModType *mod, GtkWindow *parent, gboolean delegated) @@ -90,13 +90,13 @@ recur_component_dialog (ECal *client, rb_this = gtk_radio_button_new_with_label (NULL, _("This Instance Only")); gtk_container_add (GTK_CONTAINER (vbox), rb_this); - if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_THISANDPRIOR)) { + if (!e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_THISANDPRIOR)) { rb_prior = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rb_this), _("This and Prior Instances")); gtk_container_add (GTK_CONTAINER (vbox), rb_prior); } else rb_prior = NULL; - if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_THISANDFUTURE)) { + if (!e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_THISANDFUTURE)) { rb_future = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rb_this), _("This and Future Instances")); gtk_container_add (GTK_CONTAINER (vbox), rb_future); } else diff --git a/calendar/gui/dialogs/recur-comp.h b/calendar/gui/dialogs/recur-comp.h index 47236ef8cd..7087daa166 100644 --- a/calendar/gui/dialogs/recur-comp.h +++ b/calendar/gui/dialogs/recur-comp.h @@ -26,11 +26,11 @@ #define RECUR_COMP_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include <libecal/e-cal-util.h> -gboolean recur_component_dialog (ECal *client, +gboolean recur_component_dialog (ECalClient *client, ECalComponent *comp, CalObjModType *mod, GtkWindow *parent, diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index 8d2701fab2..bf8f1c191c 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -212,7 +212,7 @@ preview_recur (RecurrencePage *rpage) { RecurrencePagePrivate *priv = rpage->priv; CompEditor *editor; - ECal *client; + ECalClient *client; ECalComponent *comp; ECalComponentDateTime cdt; GSList *l; @@ -236,8 +236,8 @@ preview_recur (RecurrencePage *rpage) e_cal_component_get_dtstart (priv->comp, &cdt); if (cdt.tzid != NULL) { - /* FIXME Will e_cal_get_timezone really not return builtin zones? */ - if (!e_cal_get_timezone (client, cdt.tzid, &zone, NULL)) + /* FIXME Will e_cal_client_get_timezone_sync really not return builtin zones? */ + if (!e_cal_client_get_timezone_sync (client, cdt.tzid, &zone, NULL, NULL)) zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid); } e_cal_component_set_dtstart (comp, &cdt); @@ -586,7 +586,7 @@ sensitize_buttons (RecurrencePage *rpage) gboolean read_only, sensitize = TRUE; gint selected_rows; icalcomponent *icalcomp; - ECal *client; + ECalClient *client; const gchar *uid; if (priv->comp == NULL) @@ -602,27 +602,26 @@ sensitize_buttons (RecurrencePage *rpage) selected_rows = gtk_tree_selection_count_selected_rows ( gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list))); - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); if (!read_only) { e_cal_component_get_uid (priv->comp, &uid); - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) { + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_client_get_object_sync (client, uid, NULL, &icalcomp, NULL, NULL)) { read_only = TRUE; icalcomponent_free (icalcomp); } if (!read_only) { - GList *list; + GSList *list = NULL; /* see if we have detached instances */ - if (e_cal_get_objects_for_uid (client, uid, &list, NULL)) { - if (list && g_list_length (list) > 1) + if (e_cal_client_get_objects_for_uid_sync (client, uid, &list, NULL, NULL)) { + if (list && g_slist_length (list) > 1) read_only = TRUE; - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + g_slist_foreach (list, (GFunc) g_object_unref, NULL); + g_slist_free (list); } } } @@ -1485,7 +1484,7 @@ fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r) { RecurrencePagePrivate *priv = rpage->priv; CompEditor *editor; - ECal *client; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); client = comp_editor_get_client (editor); @@ -1512,9 +1511,16 @@ fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r) to_zone = e_meeting_store_get_timezone (priv->meeting_store); else if (dt.tzid == NULL) to_zone = icaltimezone_get_utc_timezone (); - else + else { + GError *error = NULL; /* FIXME Error checking? */ - e_cal_get_timezone (client, dt.tzid, &to_zone, NULL); + e_cal_client_get_timezone_sync (client, dt.tzid, &to_zone, NULL, &error); + + if (error) { + g_debug ("%s: Failed to get timezone: %s", G_STRFUNC, error->message); + g_error_free (error); + } + } from_zone = icaltimezone_get_utc_timezone (); icaltimezone_convert_time (&r->until, from_zone, to_zone); @@ -2069,7 +2075,7 @@ type_toggled_cb (GtkToggleButton *toggle, { RecurrencePagePrivate *priv = rpage->priv; CompEditor *editor; - ECal *client; + ECalClient *client; gboolean read_only; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage)); @@ -2079,8 +2085,7 @@ type_toggled_cb (GtkToggleButton *toggle, sensitize_buttons (rpage); /* enable/disable the 'Add' button */ - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recurs)) || read_only) gtk_widget_set_sensitive (priv->exception_add, FALSE); diff --git a/calendar/gui/dialogs/schedule-page.c b/calendar/gui/dialogs/schedule-page.c index 26ea1cdf5c..c4191e68dc 100644 --- a/calendar/gui/dialogs/schedule-page.c +++ b/calendar/gui/dialogs/schedule-page.c @@ -68,16 +68,12 @@ sensitize_widgets (SchedulePage *spage) { SchedulePagePrivate *priv = spage->priv; CompEditor *editor; - ECal *client; - gboolean read_only; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); client = comp_editor_get_client (editor); - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; - - e_meeting_time_selector_set_read_only (priv->sel, read_only); + e_meeting_time_selector_set_read_only (priv->sel, e_client_is_readonly (E_CLIENT (client))); } /* Set date/time */ @@ -90,30 +86,43 @@ update_time (SchedulePage *spage, CompEditor *editor; struct icaltimetype start_tt, end_tt; icaltimezone *start_zone = NULL, *end_zone = NULL; - ECal *client; + ECalClient *client; gboolean all_day; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage)); client = comp_editor_get_client (editor); - /* Note that if we are creating a new event, the timezones may not be - on the server, so we try to get the builtin timezone with the TZID - first. */ - start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid); - if (!start_zone) { - if (!e_cal_get_timezone (client, start_date->tzid, &start_zone, NULL)) { - /* FIXME: Handle error better. */ - g_warning ("Couldn't get timezone from server: %s", - start_date->tzid ? start_date->tzid : ""); + if (start_date->tzid) { + /* Note that if we are creating a new event, the timezones may not be + on the server, so we try to get the builtin timezone with the TZID + first. */ + start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid); + if (!start_zone) { + GError *error = NULL; + + if (!e_cal_client_get_timezone_sync (client, start_date->tzid, &start_zone, NULL, &error)) { + /* FIXME: Handle error better. */ + g_warning ("Couldn't get timezone '%s' from server: %s", + start_date->tzid ? start_date->tzid : "", + error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + } } } - end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid); - if (!end_zone) { - if (!e_cal_get_timezone (client, end_date->tzid, &end_zone, NULL)) { - /* FIXME: Handle error better. */ - g_warning ("Couldn't get timezone from server: %s", - end_date->tzid ? end_date->tzid : ""); + if (end_date->tzid) { + end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid); + if (!end_zone) { + GError *error = NULL; + if (!e_cal_client_get_timezone_sync (client, end_date->tzid, &end_zone, NULL, &error)) { + /* FIXME: Handle error better. */ + g_warning ("Couldn't get timezone '%s' from server: %s", + end_date->tzid ? end_date->tzid : "", + error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + } } } diff --git a/calendar/gui/dialogs/select-source-dialog.c b/calendar/gui/dialogs/select-source-dialog.c index 79905d5f01..4ae9f0a0d8 100644 --- a/calendar/gui/dialogs/select-source-dialog.c +++ b/calendar/gui/dialogs/select-source-dialog.c @@ -35,7 +35,7 @@ * Implements dialog for allowing user to select a destination source. */ ESource * -select_source_dialog (GtkWindow *parent, ECalSourceType obj_type, ESource *except_source) +select_source_dialog (GtkWindow *parent, ECalClientSourceType obj_type, ESource *except_source) { GtkWidget *dialog; ESourceList *source_list; @@ -44,11 +44,11 @@ select_source_dialog (GtkWindow *parent, ECalSourceType obj_type, ESource *excep GConfClient *conf_client; const gchar *icon_name = NULL; - if (obj_type == E_CAL_SOURCE_TYPE_EVENT) + if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) gconf_key = "/apps/evolution/calendar/sources"; - else if (obj_type == E_CAL_SOURCE_TYPE_TODO) + else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS) gconf_key = "/apps/evolution/tasks/sources"; - else if (obj_type == E_CAL_SOURCE_TYPE_JOURNAL) + else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) gconf_key = "/apps/evolution/memos/sources"; else return NULL; @@ -59,11 +59,11 @@ select_source_dialog (GtkWindow *parent, ECalSourceType obj_type, ESource *excep /* create the dialog */ dialog = e_source_selector_dialog_new (parent, source_list); - if (obj_type == E_CAL_SOURCE_TYPE_EVENT) + if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) icon_name = "x-office-calendar"; - else if (obj_type == E_CAL_SOURCE_TYPE_TODO) + else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_TASKS) icon_name = "stock_todo"; - else if (obj_type == E_CAL_SOURCE_TYPE_JOURNAL) + else if (obj_type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) icon_name = "stock_journal"; if (icon_name) diff --git a/calendar/gui/dialogs/select-source-dialog.h b/calendar/gui/dialogs/select-source-dialog.h index 902ac3fc03..6d64fb825a 100644 --- a/calendar/gui/dialogs/select-source-dialog.h +++ b/calendar/gui/dialogs/select-source-dialog.h @@ -28,8 +28,8 @@ #include <gtk/gtk.h> #include <libedataserver/e-source.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> -ESource *select_source_dialog (GtkWindow *parent, ECalSourceType type, ESource *except_source); +ESource *select_source_dialog (GtkWindow *parent, ECalClientSourceType type, ESource *except_source); #endif diff --git a/calendar/gui/dialogs/send-comp.c b/calendar/gui/dialogs/send-comp.c index 070fb6b735..d67d9fb626 100644 --- a/calendar/gui/dialogs/send-comp.c +++ b/calendar/gui/dialogs/send-comp.c @@ -133,7 +133,7 @@ add_checkbox (GtkBox *where, const gchar *caption) * Return value: TRUE if the user clicked Yes, FALSE otherwise. **/ gboolean -send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms, gboolean *only_new_attendees) +send_component_dialog (GtkWindow *parent, ECalClient *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms, gboolean *only_new_attendees) { ECalComponentVType vtype; const gchar *id; @@ -144,7 +144,7 @@ send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gbo if (strip_alarms) *strip_alarms = TRUE; - if (e_cal_get_save_schedules (client) || !component_has_recipients (comp)) + if (e_cal_client_check_save_schedules (client) || !component_has_recipients (comp)) return FALSE; vtype = e_cal_component_get_vtype (comp); @@ -206,7 +206,7 @@ send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gbo } gboolean -send_component_prompt_subject (GtkWindow *parent, ECal *client, ECalComponent *comp) +send_component_prompt_subject (GtkWindow *parent, ECalClient *client, ECalComponent *comp) { ECalComponentVType vtype; const gchar *id; diff --git a/calendar/gui/dialogs/send-comp.h b/calendar/gui/dialogs/send-comp.h index 83f356b142..91584a7f4b 100644 --- a/calendar/gui/dialogs/send-comp.h +++ b/calendar/gui/dialogs/send-comp.h @@ -25,10 +25,10 @@ #define SEND_COMP_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> -gboolean send_component_dialog (GtkWindow *parent, ECal *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms, gboolean *only_new_attendees); -gboolean send_component_prompt_subject (GtkWindow *parent, ECal *client, ECalComponent *comp); +gboolean send_component_dialog (GtkWindow *parent, ECalClient *client, ECalComponent *comp, gboolean new, gboolean *strip_alarms, gboolean *only_new_attendees); +gboolean send_component_prompt_subject (GtkWindow *parent, ECalClient *client, ECalComponent *comp); #endif diff --git a/calendar/gui/dialogs/task-details-page.c b/calendar/gui/dialogs/task-details-page.c index 7f72dd3e38..bc828cf431 100644 --- a/calendar/gui/dialogs/task-details-page.c +++ b/calendar/gui/dialogs/task-details-page.c @@ -149,14 +149,13 @@ sensitize_widgets (TaskDetailsPage *tdpage) TaskDetailsPagePrivate *priv = tdpage->priv; CompEditor *editor; GtkWidget *entry; - ECal *client; + ECalClient *client; gboolean read_only; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tdpage)); client = comp_editor_get_client (editor); - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); gtk_widget_set_sensitive (priv->status_combo, !read_only); gtk_widget_set_sensitive (priv->priority_combo, !read_only); diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index f24db192b2..1e859cb293 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -148,7 +148,7 @@ task_editor_constructor (GType type, CompEditorFlags flags; TaskEditorPrivate *priv; GtkActionGroup *action_group; - ECal *client; + ECalClient *client; gboolean is_assigned; /* Chain up to parent's constructor() method. */ @@ -168,8 +168,7 @@ task_editor_constructor (GType type, gtk_action_group_set_visible (action_group, is_assigned); if (is_assigned) { - if (e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS)) task_page_show_options (priv->task_page); comp_editor_set_group_item (editor, TRUE); } @@ -380,7 +379,7 @@ task_editor_edit_comp (CompEditor *editor, ECalComponent *comp) { TaskEditorPrivate *priv; ECalComponentOrganizer organizer; - ECal *client; + ECalClient *client; GSList *attendees = NULL; priv = TASK_EDITOR_GET_PRIVATE (editor); @@ -429,7 +428,7 @@ task_editor_edit_comp (CompEditor *editor, ECalComponent *comp) if (ia != NULL) e_meeting_attendee_set_edit_level (ia, E_MEETING_ATTENDEE_EDIT_STATUS); - } else if (e_cal_get_organizer_must_attend (client)) { + } else if (e_cal_client_check_organizer_must_attend (client)) { EMeetingAttendee *ia; ia = e_meeting_store_find_attendee (priv->model, organizer.value, &row); @@ -466,7 +465,7 @@ task_editor_send_comp (CompEditor *editor, comp = task_page_get_cancel_comp (priv->task_page); if (comp != NULL) { - ECal *client; + ECalClient *client; gboolean result; client = e_meeting_store_get_client (priv->model); @@ -488,7 +487,7 @@ task_editor_send_comp (CompEditor *editor, /** * task_editor_new: - * @client: a ECal + * @client: a ECalClient * * Creates a new event editor dialog. * @@ -496,11 +495,11 @@ task_editor_send_comp (CompEditor *editor, * editor could not be created. **/ CompEditor * -task_editor_new (ECal *client, +task_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags) { - g_return_val_if_fail (E_IS_CAL (client), NULL); + g_return_val_if_fail (E_IS_CAL_CLIENT (client), NULL); g_return_val_if_fail (E_IS_SHELL (shell), NULL); return g_object_new ( diff --git a/calendar/gui/dialogs/task-editor.h b/calendar/gui/dialogs/task-editor.h index f026acae0c..0808cd547d 100644 --- a/calendar/gui/dialogs/task-editor.h +++ b/calendar/gui/dialogs/task-editor.h @@ -65,7 +65,7 @@ struct _TaskEditorClass { }; GType task_editor_get_type (void); -CompEditor * task_editor_new (ECal *client, +CompEditor * task_editor_new (ECalClient *client, EShell *shell, CompEditorFlags flags); void task_editor_show_assignment (TaskEditor *te); diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c index bb18780250..12902ff6d4 100644 --- a/calendar/gui/dialogs/task-page.c +++ b/calendar/gui/dialogs/task-page.c @@ -34,11 +34,11 @@ #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> #include <libedataserverui/e-category-completion.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-combo-box.h> #include <misc/e-dateedit.h> #include "misc/e-buffer-tagger.h" #include <e-util/e-dialog-utils.h> -#include "common/authentication.h" #include "../e-timezone-entry.h" #include "comp-editor.h" #include "comp-editor-util.h" @@ -111,7 +111,7 @@ struct _TaskPagePrivate { GtkWidget *attendees_label; /* ListView stuff */ - ECal *client; + ECalClient *client; EMeetingStore *meeting_store; EMeetingListView *list_view; gint row; @@ -264,7 +264,7 @@ sensitize_widgets (TaskPage *tpage) TaskPagePrivate *priv = tpage->priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; GtkActionGroup *action_group; GtkAction *action; gboolean read_only, sens = TRUE, sensitize; @@ -273,8 +273,7 @@ sensitize_widgets (TaskPage *tpage) client = comp_editor_get_client (editor); flags = comp_editor_get_flags (editor); - if (!e_cal_is_read_only (client, &read_only, NULL)) - read_only = TRUE; + read_only = e_client_is_readonly (E_CLIENT (client)); if (flags & COMP_EDITOR_IS_ASSIGNED) sens = flags & COMP_EDITOR_USER_ORG; @@ -473,7 +472,7 @@ task_page_fill_widgets (CompEditorPage *page, CompEditor *editor; CompEditorFlags flags; GtkAction *action; - ECal *client; + ECalClient *client; GSList *l; icalcomponent *icalcomp; const gchar *categories, *uid; @@ -555,10 +554,13 @@ task_page_fill_widgets (CompEditorPage *page, on the server, so we try to get the builtin timezone with the TZID first. */ if (!zone && d.tzid) { - if (!e_cal_get_timezone (client, d.tzid, &zone, NULL)) + GError *error = NULL; + if (!e_cal_client_get_timezone_sync (client, d.tzid, &zone, NULL, &error)) /* FIXME: Handle error better. */ - g_warning ("Couldn't get timezone from server: %s", - d.tzid ? d.tzid : ""); + g_warning ("Couldn't get timezone '%s' from server: %s", + d.tzid ? d.tzid : "", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); } e_timezone_entry_set_timezone (E_TIMEZONE_ENTRY (priv->timezone), @@ -611,7 +613,7 @@ task_page_fill_widgets (CompEditorPage *page, comp_editor_set_classification (editor, cl); e_cal_component_get_uid (comp, &uid); - if (e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) { + if (e_cal_client_get_object_sync (client, uid, NULL, &icalcomp, NULL, NULL)) { icalcomponent_free (icalcomp); task_page_hide_options (tpage); } @@ -623,9 +625,9 @@ task_page_fill_widgets (CompEditorPage *page, /* Source */ e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); set_subscriber_info_string (tpage, backend_addr); if (priv->is_assignment) { @@ -646,14 +648,10 @@ task_page_fill_widgets (CompEditorPage *page, gchar *string; if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) { - if (e_cal_get_static_capability ( - client, - CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) priv->user_org = TRUE; } else { - if (e_cal_get_static_capability ( - client, - CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) gtk_widget_set_sensitive (priv->invite, FALSE); gtk_widget_set_sensitive (priv->add, FALSE); gtk_widget_set_sensitive (priv->edit, FALSE); @@ -661,7 +659,7 @@ task_page_fill_widgets (CompEditorPage *page, priv->user_org = FALSE; } - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE)) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE)) string = g_strdup (priv->user_add); else if ( organizer.cn != NULL) string = g_strdup_printf ("%s <%s>", organizer.cn, strip); @@ -714,7 +712,7 @@ task_page_fill_widgets (CompEditorPage *page, backend_mailto = mailto = NULL; } - if (client && e_cal_get_organizer_must_accept (client)) + if (client && e_cal_client_check_organizer_must_accept (client)) e_meeting_attendee_set_status ( attendee, ICAL_PARTSTAT_NEEDSACTION); else @@ -748,7 +746,7 @@ task_page_fill_component (CompEditorPage *page, ECalComponentDateTime date; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; struct icaltimetype start_tt, due_tt; gchar *cat, *str; gboolean start_date_set, due_date_set, time_set; @@ -898,7 +896,7 @@ task_page_fill_component (CompEditorPage *page, gchar *name; gchar *mailto; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); /* Find the identity for the organizer or sentby field */ if (!get_current_identity (tpage, &name, &mailto)) { @@ -1314,7 +1312,7 @@ attendee_added_cb (EMeetingListView *emlv, TaskPagePrivate *priv = page->priv; CompEditor *editor; CompEditorFlags flags; - ECal *client; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page)); client = comp_editor_get_client (editor); @@ -1328,7 +1326,7 @@ attendee_added_cb (EMeetingListView *emlv, /* do not remove here, it did EMeetingListView already */ e_meeting_attendee_set_delfrom (ia, g_strdup_printf ("MAILTO:%s", priv->user_add ? priv->user_add : "")); - if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) { + if (!e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) { EMeetingAttendee *delegator; gtk_widget_set_sensitive (priv->invite, FALSE); @@ -1773,7 +1771,8 @@ source_changed_cb (ESourceComboBox *source_combo_box, TaskPage *tpage) TaskPagePrivate *priv = tpage->priv; CompEditor *editor; ESource *source; - ECal *client; + ECalClient *client; + GError *error = NULL; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage)); source = e_source_combo_box_get_active (source_combo_box); @@ -1781,15 +1780,18 @@ source_changed_cb (ESourceComboBox *source_combo_box, TaskPage *tpage) if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage))) return; - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO); + client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_TASKS, &error); if (client) { icaltimezone *zone; zone = comp_editor_get_timezone (editor); - e_cal_set_default_timezone (client, zone, NULL); + e_cal_client_set_default_timezone (client, zone); } - if (!client || !e_cal_open (client, FALSE, NULL)) { + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!client || !e_client_open_sync (E_CLIENT (client), FALSE, NULL, &error)) { GtkWidget *dialog; if (client) @@ -1799,18 +1801,22 @@ source_changed_cb (ESourceComboBox *source_combo_box, TaskPage *tpage) e_source_combo_box_set_active ( E_SOURCE_COMBO_BOX (priv->source_selector), - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, - _("Unable to open tasks in '%s'."), - e_source_peek_name (source)); + _("Unable to open tasks in '%s': %s"), + e_source_peek_name (source), + error ? error->message : _("Unknown error")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); + + if (error) + g_error_free (error); } else { comp_editor_set_client (editor, client); comp_editor_page_changed (COMP_EDITOR_PAGE (tpage)); - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_assignment) + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_assignment) task_page_show_options (tpage); else task_page_hide_options (tpage); @@ -1818,7 +1824,7 @@ source_changed_cb (ESourceComboBox *source_combo_box, TaskPage *tpage) if (client) { gchar *backend_addr = NULL; - e_cal_get_cal_address (client, &backend_addr, NULL); + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &backend_addr, NULL, NULL); if (priv->is_assignment) task_page_select_organizer (tpage, backend_addr); @@ -1835,12 +1841,12 @@ static void set_subscriber_info_string (TaskPage *tpage, const gchar *backend_address) { CompEditor *editor; - ECal *client; + ECalClient *client; ESource *source; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage)); client = comp_editor_get_client (editor); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (e_source_get_property (source, "subscriber")) { g_free (tpage->priv->subscriber_info_text); @@ -1863,7 +1869,7 @@ task_page_send_options_clicked_cb (TaskPage *tpage) CompEditor *editor; GtkWidget *toplevel; ESource *source; - ECal *client; + ECalClient *client; editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage)); client = comp_editor_get_client (editor); @@ -1876,7 +1882,7 @@ task_page_send_options_clicked_cb (TaskPage *tpage) e_send_options_utils_set_default_data (priv->sod, source, "task"); } - if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) { + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) { e_send_options_set_need_general_options (priv->sod, FALSE); } @@ -2041,7 +2047,7 @@ task_page_select_organizer (TaskPage *tpage, const gchar *backend_address) const gchar *default_address; gboolean subscribed_cal = FALSE; ESource *source = NULL; - ECal *client; + ECalClient *client; const gchar *user_addr = NULL; gint ii; @@ -2049,7 +2055,7 @@ task_page_select_organizer (TaskPage *tpage, const gchar *backend_address) client = comp_editor_get_client (editor); if (client) - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); if (source) user_addr = e_source_get_property (source, "subscriber"); @@ -2094,7 +2100,7 @@ task_page_select_organizer (TaskPage *tpage, const gchar *backend_address) TaskPage * task_page_construct (TaskPage *tpage, EMeetingStore *meeting_store, - ECal *client) + ECalClient *client) { TaskPagePrivate *priv; GtkTreeModel *model; @@ -2155,7 +2161,7 @@ TaskPage * task_page_new (EMeetingStore *model, CompEditor *editor) { TaskPage *tpage; - ECal *client; + ECalClient *client; tpage = g_object_new (TYPE_TASK_PAGE, "editor", editor, NULL); client = comp_editor_get_client (editor); diff --git a/calendar/gui/dialogs/task-page.h b/calendar/gui/dialogs/task-page.h index 007dcdeec4..9d713deaef 100644 --- a/calendar/gui/dialogs/task-page.h +++ b/calendar/gui/dialogs/task-page.h @@ -72,7 +72,7 @@ struct _TaskPageClass { GType task_page_get_type (void); TaskPage * task_page_construct (TaskPage *epage, EMeetingStore *model, - ECal *client); + ECalClient *client); TaskPage * task_page_new (EMeetingStore *model, CompEditor *editor); ECalComponent * task_page_get_cancel_comp (TaskPage *page); diff --git a/calendar/gui/e-cal-component-preview.c b/calendar/gui/e-cal-component-preview.c index c964a6f1ed..d2c979151f 100644 --- a/calendar/gui/e-cal-component-preview.c +++ b/calendar/gui/e-cal-component-preview.c @@ -70,7 +70,7 @@ clear_comp_info (ECalComponentPreview *preview) returns whether component in the preview changed */ static gboolean update_comp_info (ECalComponentPreview *preview, - ECal *ecal, + ECalClient *client, ECalComponent *comp) { ECalComponentPreviewPrivate *priv; @@ -81,7 +81,7 @@ update_comp_info (ECalComponentPreview *preview, priv = preview->priv; - if (!E_IS_CAL_COMPONENT (comp) || !E_IS_CAL (ecal)) { + if (!E_IS_CAL_COMPONENT (comp) || !E_IS_CAL_CLIENT (client)) { changed = !priv->cal_uid; clear_comp_info (preview); } else { @@ -92,7 +92,7 @@ update_comp_info (ECalComponentPreview *preview, gint *sequence = NULL; gint comp_sequence; - cal_uid = g_strdup (e_source_peek_uid (e_cal_get_source (ecal))); + cal_uid = g_strdup (e_source_peek_uid (e_client_get_source (E_CLIENT (client)))); e_cal_component_get_uid (comp, &uid); comp_uid = g_strdup (uid); e_cal_component_get_last_modified (comp, &itm); @@ -128,7 +128,7 @@ update_comp_info (ECalComponentPreview *preview, /* Converts a time_t to a string, relative to the specified timezone */ static gchar * timet_to_str_with_zone (ECalComponentDateTime *dt, - ECal *ecal, + ECalClient *client, icaltimezone *default_zone, gboolean use_24_hour_format) { @@ -139,7 +139,7 @@ timet_to_str_with_zone (ECalComponentDateTime *dt, if (dt->tzid) { /* If we can't find the zone, we'll guess its "local" */ - if (!e_cal_get_timezone (ecal, dt->tzid, &zone, NULL)) + if (!e_cal_client_get_timezone_sync (client, dt->tzid, &zone, NULL, NULL)) zone = NULL; } else if (dt->value->is_utc) { zone = icaltimezone_get_utc_timezone (); @@ -161,7 +161,7 @@ timet_to_str_with_zone (ECalComponentDateTime *dt, static void cal_component_preview_write_html (GString *buffer, - ECal *ecal, + ECalClient *client, ECalComponent *comp, icaltimezone *default_zone, gboolean use_24_hour_format) @@ -240,7 +240,7 @@ cal_component_preview_write_html (GString *buffer, e_cal_component_get_dtstart (comp, &dt); if (dt.value != NULL) { str = timet_to_str_with_zone ( - &dt, ecal, default_zone, use_24_hour_format); + &dt, client, default_zone, use_24_hour_format); g_string_append_printf ( buffer, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\">" "<B>%s</B></TD><TD>%s</TD></TR>", @@ -254,7 +254,7 @@ cal_component_preview_write_html (GString *buffer, e_cal_component_get_dtend (comp, &dt); if (dt.value != NULL) { str = timet_to_str_with_zone ( - &dt, ecal, default_zone, use_24_hour_format); + &dt, client, default_zone, use_24_hour_format); g_string_append_printf ( buffer, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\">" "<B>%s</B></TD><TD>%s</TD></TR>", @@ -268,7 +268,7 @@ cal_component_preview_write_html (GString *buffer, e_cal_component_get_due (comp, &dt); if (dt.value != NULL) { str = timet_to_str_with_zone ( - &dt, ecal, default_zone, use_24_hour_format); + &dt, client, default_zone, use_24_hour_format); g_string_append_printf ( buffer, "<TR><TD VALIGN=\"TOP\" ALIGN=\"RIGHT\">" "<B>%s</B></TD><TD>%s</TD></TR>", @@ -444,7 +444,7 @@ e_cal_component_preview_new (void) void e_cal_component_preview_display (ECalComponentPreview *preview, - ECal *ecal, + ECalClient *client, ECalComponent *comp, icaltimezone *zone, gboolean use_24_hour_format) @@ -456,14 +456,14 @@ e_cal_component_preview_display (ECalComponentPreview *preview, /* do not update preview when setting the same component as last time, which even didn't change */ - if (!update_comp_info (preview, ecal, comp)) + if (!update_comp_info (preview, client, comp)) return; /* XXX The initial buffer size is arbitrary. Tune it. */ buffer = g_string_sized_new (4096); cal_component_preview_write_html ( - buffer, ecal, comp, zone, use_24_hour_format); + buffer, client, comp, zone, use_24_hour_format); e_web_view_load_string (E_WEB_VIEW (preview), buffer->str); g_string_free (buffer, TRUE); } diff --git a/calendar/gui/e-cal-component-preview.h b/calendar/gui/e-cal-component-preview.h index f713df7321..091f66c252 100644 --- a/calendar/gui/e-cal-component-preview.h +++ b/calendar/gui/e-cal-component-preview.h @@ -25,7 +25,7 @@ #define E_CAL_COMPONENT_PREVIEW_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <misc/e-web-view.h> /* Standard GObject macros */ @@ -69,7 +69,7 @@ struct _ECalComponentPreviewClass { GType e_cal_component_preview_get_type (void); GtkWidget * e_cal_component_preview_new (void); void e_cal_component_preview_display (ECalComponentPreview *preview, - ECal *ecal, + ECalClient *client, ECalComponent *comp, icaltimezone *zone, gboolean use_24_hour_format); diff --git a/calendar/gui/e-cal-config.h b/calendar/gui/e-cal-config.h index 7751c3e42f..f803e99285 100644 --- a/calendar/gui/e-cal-config.h +++ b/calendar/gui/e-cal-config.h @@ -24,7 +24,7 @@ #ifndef __E_CAL_CONFIG_H__ #define __E_CAL_CONFIG_H__ -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "e-util/e-config.h" /* Standard GObject macros */ @@ -74,7 +74,7 @@ struct _ECalConfigTargetSource { EConfigTarget target; struct _ESource *source; - ECalSourceType source_type; + ECalClientSourceType source_type; }; struct _ECalConfigTargetPrefs { diff --git a/calendar/gui/e-cal-list-view.c b/calendar/gui/e-cal-list-view.c index 7893dae0e8..c287b7a6ca 100644 --- a/calendar/gui/e-cal-list-view.c +++ b/calendar/gui/e-cal-list-view.c @@ -102,7 +102,6 @@ e_cal_list_view_class_init (ECalListViewClass *class) static void e_cal_list_view_init (ECalListView *cal_list_view) { - cal_list_view->query = NULL; cal_list_view->table = NULL; cal_list_view->cursor_event = NULL; cal_list_view->set_table_id = 0; @@ -330,13 +329,6 @@ e_cal_list_view_dispose (GObject *object) cal_list_view = E_CAL_LIST_VIEW (object); - if (cal_list_view->query) { - g_signal_handlers_disconnect_matched (cal_list_view->query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, cal_list_view); - g_object_unref (cal_list_view->query); - cal_list_view->query = NULL; - } - if (cal_list_view->set_table_id) { g_source_remove (cal_list_view->set_table_id); cal_list_view->set_table_id = 0; diff --git a/calendar/gui/e-cal-list-view.h b/calendar/gui/e-cal-list-view.h index faf37bbc9f..ed4636f753 100644 --- a/calendar/gui/e-cal-list-view.h +++ b/calendar/gui/e-cal-list-view.h @@ -67,9 +67,6 @@ struct _ECalListView { /* The main display table */ ETable *table; - /* S-expression for query and the query object */ - ECalView *query; - /* The default category for new events */ gchar *default_category; diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c index 4ac73089bb..ea8dd7bba7 100644 --- a/calendar/gui/e-cal-model-calendar.c +++ b/calendar/gui/e-cal-model-calendar.c @@ -130,7 +130,7 @@ get_dtend (ECalModelCalendar *model, ECalModelComponent *comp_data) tt_end = icalproperty_get_dtend (prop); if (icaltime_get_tzid (tt_end) - && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_end), &zone, NULL)) + && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_end), &zone, NULL, NULL)) got_zone = TRUE; model_zone = e_cal_model_get_timezone (E_CAL_MODEL (model)); @@ -295,6 +295,7 @@ ecmc_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) CalObjModType mod = CALOBJ_MOD_ALL; ECalComponent *comp; ECalModelCalendar *model = (ECalModelCalendar *) etm; + GError *error = NULL; g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model)); g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST); @@ -335,7 +336,7 @@ ecmc_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) break; } - if (e_cal_modify_object (comp_data->client, comp_data->icalcomp, mod, NULL)) { + if (e_cal_client_modify_object_sync (comp_data->client, comp_data->icalcomp, mod, NULL, &error)) { gboolean strip_alarms = TRUE; if (itip_organizer_is_user (comp, comp_data->client) && @@ -348,7 +349,7 @@ ecmc_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) const gchar *uid = NULL; e_cal_component_get_uid (comp, &uid); - if (e_cal_get_object (comp_data->client, uid, NULL, &icalcomp, NULL) && icalcomp) { + if (e_cal_client_get_object_sync (comp_data->client, uid, NULL, &icalcomp, NULL, NULL) && icalcomp) { send_comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (send_comp, icalcomp)) { icalcomponent_free (icalcomp); @@ -365,9 +366,11 @@ ecmc_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) g_object_unref (send_comp); } } else { - g_warning (G_STRLOC ": Could not modify the object!"); + g_warning (G_STRLOC ": Could not modify the object! %s", error ? error->message : "Unknown error"); /* FIXME Show error dialog */ + if (error) + g_error_free (error); } g_object_unref (comp); diff --git a/calendar/gui/e-cal-model-memos.c b/calendar/gui/e-cal-model-memos.c index 0356dacf0c..59a48d031c 100644 --- a/calendar/gui/e-cal-model-memos.c +++ b/calendar/gui/e-cal-model-memos.c @@ -140,6 +140,7 @@ ecmm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) { ECalModelComponent *comp_data; ECalModelMemos *model = (ECalModelMemos *) etm; + GError *error = NULL; g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model)); g_return_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST); @@ -157,10 +158,12 @@ ecmm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) } /* TODO ask about mod type */ - if (!e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) { - g_warning (G_STRLOC ": Could not modify the object!"); + if (!e_cal_client_modify_object_sync (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL, &error)) { + g_warning (G_STRLOC ": Could not modify the object! %s", error ? error->message : "Unknown error"); /* TODO Show error dialog */ + if (error) + g_error_free (error); } } diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c index ff829e319f..51811c783f 100644 --- a/calendar/gui/e-cal-model-tasks.c +++ b/calendar/gui/e-cal-model-tasks.c @@ -325,7 +325,7 @@ get_completed (ECalModelComponent *comp_data) comp_data->completed->tt = tt_completed; if (icaltime_get_tzid (tt_completed) - && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_completed), &zone, NULL)) + && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_completed), &zone, NULL, NULL)) comp_data->completed->zone = zone; else comp_data->completed->zone = NULL; @@ -355,7 +355,7 @@ get_due (ECalModelComponent *comp_data) comp_data->due->tt = tt_due; if (icaltime_get_tzid (tt_due) - && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_due), &zone, NULL)) + && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_due), &zone, NULL, NULL)) comp_data->due->zone = zone; else comp_data->due->zone = NULL; @@ -525,7 +525,7 @@ get_due_status (ECalModelTasks *model, ECalModelComponent *comp_data) /* Get the current time in the same timezone as the DUE date.*/ tzid = icalparameter_get_tzid (param); - if (!e_cal_get_timezone (comp_data->client, tzid, &zone, NULL)) + if (!e_cal_client_get_timezone_sync (comp_data->client, tzid, &zone, NULL, NULL)) return E_CAL_MODEL_TASKS_DUE_FUTURE; now_tt = icaltime_current_time_with_zone (zone); @@ -1252,13 +1252,17 @@ void e_cal_model_tasks_mark_comp_incomplete (ECalModelTasks *model, ECalModelCom static void commit_component_changes (ECalModelComponent *comp_data) { + GError *error = NULL; + g_return_if_fail (comp_data != NULL); /* FIXME ask about mod type */ - if (!e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) { - g_warning (G_STRLOC ": Could not modify the object!"); + if (!e_cal_client_modify_object_sync (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL, &error)) { + g_warning (G_STRLOC ": Could not modify the object! %s", error ? error->message : "Unknown error"); /* FIXME Show error dialog */ + if (error) + g_error_free (error); } } diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index a2e0418cbc..5e0c9cc337 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -30,6 +30,7 @@ #include <glib/gi18n.h> #include <libedataserver/e-flag.h> #include <libedataserver/e-time-utils.h> +#include <libecal/e-cal-client-view.h> #include <libecal/e-cal-time-util.h> #include "comp-util.h" #include "e-cal-model.h" @@ -41,8 +42,8 @@ #include "e-util/e-util-enumtypes.h" typedef struct { - ECal *client; - ECalView *query; + ECalClient *client; + ECalClientView *view; gboolean do_query; } ECalModelClient; @@ -52,7 +53,7 @@ struct _ECalModelPrivate { GList *clients; /* The default client in the list */ - ECal *default_client; + ECalClient *default_client; /* Array for storing the objects. Each element is of type ECalModelComponent */ GPtrArray *objects; @@ -108,9 +109,9 @@ struct _ECalModelPrivate { gboolean in_modified; gboolean in_removed; - GList *notify_added; - GList *notify_modified; - GList *notify_removed; + GSList *notify_added; + GSList *notify_modified; + GSList *notify_removed; GMutex *notify_lock; }; @@ -129,8 +130,8 @@ static gchar *ecm_value_to_string (ETableModel *etm, gint col, gconstpointer val static const gchar *ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data); -static ECalModelClient *add_new_client (ECalModel *model, ECal *client, gboolean do_query); -static ECalModelClient *find_client_data (ECalModel *model, ECal *client); +static ECalModelClient *add_new_client (ECalModel *model, ECalClient *client, gboolean do_query); +static ECalModelClient *find_client_data (ECalModel *model, ECalClient *client); static void remove_client_objects (ECalModel *model, ECalModelClient *client_data); static void remove_client (ECalModel *model, ECalModelClient *client_data); @@ -156,9 +157,6 @@ enum { ROW_APPENDED, COMPS_DELETED, CAL_VIEW_PROGRESS, - #ifndef E_CAL_DISABLE_DEPRECATED - CAL_VIEW_DONE, - #endif CAL_VIEW_COMPLETE, STATUS_MESSAGE, TIMEZONE_CHANGED, @@ -385,15 +383,15 @@ cal_model_dispose (GObject *object) g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, object); - if (client_data->query) - g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA, + if (client_data->view) + g_signal_handlers_disconnect_matched (client_data->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, object); priv->clients = g_list_remove (priv->clients, client_data); g_object_unref (client_data->client); - if (client_data->query) - g_object_unref (client_data->query); + if (client_data->view) + g_object_unref (client_data->view); g_free (client_data); } @@ -493,9 +491,9 @@ e_cal_model_class_init (ECalModelClass *class) PROP_DEFAULT_CLIENT, g_param_spec_object ( "default-client", - "Default Client", + "Default ECalClient", NULL, - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -646,25 +644,14 @@ e_cal_model_class_init (ECalModelClass *class) e_marshal_VOID__STRING_INT_INT, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); - #ifndef E_CAL_DISABLE_DEPRECATED - signals[CAL_VIEW_DONE] = - g_signal_new ("cal_view_done", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, cal_view_done), - NULL, NULL, - e_marshal_VOID__INT_INT, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - #endif - signals[CAL_VIEW_COMPLETE] = g_signal_new ("cal_view_complete", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ECalModelClass, cal_view_complete), NULL, NULL, - e_marshal_VOID__INT_STRING_INT, - G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT); + e_marshal_VOID__BOXED_INT, + G_TYPE_NONE, 2, G_TYPE_ERROR, G_TYPE_INT); signals[STATUS_MESSAGE] = g_signal_new ( "status-message", @@ -827,7 +814,7 @@ get_dtstart (ECalModel *model, ECalModelComponent *comp_data) tt_start = icalproperty_get_dtstart (prop); if (icaltime_get_tzid (tt_start) - && e_cal_get_timezone (comp_data->client, icaltime_get_tzid (tt_start), &zone, NULL)) + && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_start), &zone, NULL, NULL)) got_zone = TRUE; if (e_cal_model_get_flags (model) & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES) { @@ -1080,7 +1067,7 @@ set_description (ECalModelComponent *comp_data, const gchar *value) } static void -datetime_to_zone (ECal *client, struct icaltimetype *tt, icaltimezone *tt_zone, const gchar *tzid) +datetime_to_zone (ECalClient *client, struct icaltimetype *tt, icaltimezone *tt_zone, const gchar *tzid) { icaltimezone *from, *to; const gchar *tt_tzid = NULL; @@ -1098,7 +1085,7 @@ datetime_to_zone (ECal *client, struct icaltimetype *tt, icaltimezone *tt_zone, to = icaltimezone_get_builtin_timezone_from_tzid (tzid); if (!to) { /* do not check failure here, maybe the zone is not available there */ - e_cal_get_timezone (client, tzid, &to, NULL); + e_cal_client_get_timezone_sync (client, tzid, &to, NULL, NULL); } icaltimezone_convert_time (tt, from, to); @@ -1196,6 +1183,7 @@ ecm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) ECalModelPrivate *priv; ECalModelComponent *comp_data; ECalModel *model = (ECalModel *) etm; + GError *error = NULL; g_return_if_fail (E_IS_CAL_MODEL (model)); @@ -1226,10 +1214,12 @@ ecm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value) } /* FIXME ask about mod type */ - if (!e_cal_modify_object (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL)) { - g_warning (G_STRLOC ": Could not modify the object!"); + if (!e_cal_client_modify_object_sync (comp_data->client, comp_data->icalcomp, CALOBJ_MOD_ALL, NULL, &error)) { + g_warning (G_STRLOC ": Could not modify the object! %s", error ? error->message : "Unknown error"); /* FIXME Show error dialog */ + if (error) + g_error_free (error); } } @@ -1248,7 +1238,7 @@ gboolean e_cal_model_test_row_editable (ECalModel *model, gint row) { gboolean readonly; - ECal *cal = NULL; + ECalClient *client = NULL; if (row != -1) { ECalModelComponent *comp_data; @@ -1256,17 +1246,16 @@ e_cal_model_test_row_editable (ECalModel *model, gint row) comp_data = e_cal_model_get_component_at (model, row); if (comp_data) - cal = comp_data->client; + client = comp_data->client; } else { - cal = e_cal_model_get_default_client (model); + client = e_cal_model_get_default_client (model); } - readonly = cal == NULL; + readonly = client == NULL; if (!readonly) - if (!e_cal_is_read_only (cal, &readonly, NULL)) - readonly = TRUE; + readonly = e_client_is_readonly (E_CLIENT (client)); return !readonly; } @@ -1305,6 +1294,8 @@ ecm_append_row (ETableModel *etm, ETableModel *source, gint row) ECalModelClass *model_class; ECalModelComponent *comp_data; ECalModel *model = (ECalModel *) etm; + gchar *uid = NULL; + GError *error = NULL; g_return_if_fail (E_IS_CAL_MODEL (model)); g_return_if_fail (E_IS_TABLE_MODEL (source)); @@ -1316,7 +1307,7 @@ ecm_append_row (ETableModel *etm, ETableModel *source, gint row) g_object_ref (comp_data->client); /* guard against saving before the calendar is open */ - if (!(comp_data->client && e_cal_get_load_state (comp_data->client) == E_CAL_LOAD_LOADED)) { + if (!comp_data->client || !e_client_is_opened (E_CLIENT (comp_data->client))) { g_object_unref (comp_data); return; } @@ -1353,14 +1344,20 @@ ecm_append_row (ETableModel *etm, ETableModel *source, gint row) model_class->fill_component_from_model (model, comp_data, source, row); } - if (!e_cal_create_object (comp_data->client, comp_data->icalcomp, NULL, NULL)) { - g_warning (G_STRLOC ": Could not create the object!"); + if (!e_cal_client_create_object_sync (comp_data->client, comp_data->icalcomp, &uid, NULL, &error)) { + g_warning (G_STRLOC ": Could not create the object! %s", error ? error->message : "Unknown error"); /* FIXME: show error dialog */ + if (error) + g_error_free (error); } else { + if (uid) + icalcomponent_set_uid (comp_data->icalcomp, uid); + g_signal_emit (G_OBJECT (model), signals[ROW_APPENDED], 0); } + g_free (uid); g_object_unref (comp_data); } @@ -1561,7 +1558,7 @@ ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data) g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); - source = e_cal_get_source (comp_data->client); + source = e_client_get_source (E_CLIENT (comp_data->client)); color_spec = e_source_peek_color_spec (source); if (color_spec != NULL) { g_free (comp_data->color); @@ -1579,7 +1576,7 @@ ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data) for (l = assigned_colors[i].uris; l != NULL; l = l->next) { if (!strcmp ((const gchar *) l->data, - e_cal_get_uri (comp_data->client))) + e_client_get_uri (E_CLIENT (comp_data->client)))) { return assigned_colors[i].color; } @@ -1588,7 +1585,7 @@ ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data) /* return the first unused color */ assigned_colors[first_empty].uris = g_list_append (assigned_colors[first_empty].uris, - g_strdup (e_cal_get_uri (comp_data->client))); + g_strdup (e_client_get_uri (E_CLIENT (comp_data->client)))); return assigned_colors[first_empty].color; } @@ -1887,7 +1884,7 @@ e_cal_model_set_work_day_start_minute (ECalModel *model, g_object_notify (G_OBJECT (model), "work-day-start-minute"); } -ECal * +ECalClient * e_cal_model_get_default_client (ECalModel *model) { ECalModelPrivate *priv; @@ -1913,7 +1910,7 @@ e_cal_model_get_default_client (ECalModel *model) } void -e_cal_model_set_default_client (ECalModel *model, ECal *client) +e_cal_model_set_default_client (ECalModel *model, ECalClient *client) { ECalModelPrivate *priv; ECalModelClient *client_data; @@ -1921,7 +1918,7 @@ e_cal_model_set_default_client (ECalModel *model, ECal *client) g_return_if_fail (E_IS_CAL_MODEL (model)); if (client != NULL) - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); priv = model->priv; @@ -1951,7 +1948,7 @@ GList * e_cal_model_get_client_list (ECalModel *model) { GList *list = NULL, *l; - ECal *default_client; + ECalClient *default_client; g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); @@ -1975,7 +1972,7 @@ e_cal_model_get_client_list (ECalModel *model) * @model: A calendar model. * @uri: Uri for the client to get. */ -ECal * +ECalClient * e_cal_model_get_client_for_uri (ECalModel *model, const gchar *uri) { GList *l; @@ -1986,7 +1983,7 @@ e_cal_model_get_client_for_uri (ECalModel *model, const gchar *uri) for (l = model->priv->clients; l != NULL; l = l->next) { ECalModelClient *client_data = (ECalModelClient *) l->data; - if (!strcmp (uri, e_cal_get_uri (client_data->client))) + if (!strcmp (uri, e_client_get_uri (E_CLIENT (client_data->client)))) return client_data->client; } @@ -1994,7 +1991,7 @@ e_cal_model_get_client_for_uri (ECalModel *model, const gchar *uri) } static ECalModelClient * -find_client_data (ECalModel *model, ECal *client) +find_client_data (ECalModel *model, ECalClient *client) { ECalModelPrivate *priv; GList *l; @@ -2012,7 +2009,7 @@ find_client_data (ECalModel *model, ECal *client) } static ECalModelComponent * -search_by_id_and_client (ECalModelPrivate *priv, ECal *client, const ECalComponentId *id) +search_by_id_and_client (ECalModelPrivate *priv, ECalClient *client, const ECalComponentId *id) { gint i; @@ -2051,8 +2048,8 @@ search_by_id_and_client (ECalModelPrivate *priv, ECal *client, const ECalCompone } typedef struct { - ECal *client; - ECalView *query; + ECalClient *client; + ECalClientView *view; ECalModel *model; icalcomponent *icalcomp; } RecurrenceExpansionData; @@ -2075,7 +2072,8 @@ add_instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end /* set the right instance start date to component */ e_cal_component_get_dtstart (comp, &datetime); - e_cal_get_timezone (rdata->client, datetime.tzid, &zone, NULL); + if (datetime.tzid) + e_cal_client_get_timezone_sync (rdata->client, datetime.tzid, &zone, NULL, NULL); time = icaltime_from_timet_with_zone (instance_start, FALSE, zone ? zone : priv->zone); to_set.value = &time; to_set.tzid = datetime.tzid; @@ -2084,7 +2082,9 @@ add_instance_cb (ECalComponent *comp, time_t instance_start, time_t instance_end /* set the right instance end date to component*/ e_cal_component_get_dtend (comp, &datetime); - e_cal_get_timezone (rdata->client, datetime.tzid, &zone, NULL); + zone = NULL; + if (datetime.tzid) + e_cal_client_get_timezone_sync (rdata->client, datetime.tzid, &zone, NULL, NULL); time = icaltime_from_timet_with_zone (instance_end, FALSE, zone ? zone : priv->zone); to_set.value = &time; to_set.tzid = datetime.tzid; @@ -2162,24 +2162,25 @@ place_master_object_first_cb (gconstpointer p1, gconstpointer p2) return res; } -static void e_cal_view_objects_added_cb (ECalView *query, GList *objects, ECalModel *model); +static void client_view_objects_added_cb (ECalClientView *view, const GSList *objects, ECalModel *model); static void -process_added (ECalView *query, GList *objects, ECalModel *model) +process_added (ECalClientView *view, const GSList *objects, ECalModel *model) { ECalModelPrivate *priv; - GList *l, *copy; + const GSList *l; + GSList *copy; priv = model->priv; /* order matters, process master object first, then detached instances */ - copy = g_list_sort (g_list_copy (objects), place_master_object_first_cb); + copy = g_slist_sort (g_slist_copy ((GSList *) objects), place_master_object_first_cb); for (l = copy; l; l = l->next) { ECalModelComponent *comp_data; ECalComponentId *id; ECalComponent *comp = e_cal_component_new (); - ECal *client = e_cal_view_get_client (query); + ECalClient *client = e_cal_client_view_get_client (view); /* This will fail for alarm or VCalendar component */ if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) { @@ -2217,19 +2218,17 @@ process_added (ECalView *query, GList *objects, ECalModel *model) if (e_cal_util_component_has_recurrences (l->data) && (priv->flags & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES)) { RecurrenceExpansionData rdata; - rdata.client = e_cal_view_get_client (query); - rdata.query = query; + rdata.client = client; + rdata.view = view; rdata.model = model; rdata.icalcomp = l->data; - e_cal_generate_instances_for_object (rdata.client, l->data, - priv->start, priv->end, - (ECalRecurInstanceFn) add_instance_cb, - &rdata); + e_cal_client_generate_instances_for_object (rdata.client, l->data, priv->start, priv->end, + (ECalRecurInstanceFn) add_instance_cb, &rdata); } else { e_table_model_pre_change (E_TABLE_MODEL (model)); comp_data = g_object_new (E_TYPE_CAL_MODEL_COMPONENT, NULL); - comp_data->client = g_object_ref (e_cal_view_get_client (query)); + comp_data->client = g_object_ref (client); comp_data->icalcomp = icalcomponent_new_clone (l->data); e_cal_model_set_instance_times (comp_data, priv->zone); @@ -2238,27 +2237,28 @@ process_added (ECalView *query, GList *objects, ECalModel *model) } } - g_list_free (copy); + g_slist_free (copy); } static void -process_modified (ECalView *query, GList *objects, ECalModel *model) +process_modified (ECalClientView *view, const GSList *objects, ECalModel *model) { ECalModelPrivate *priv; - GList *l, *list = NULL; + const GSList *l; + GSList *list = NULL; priv = model->priv; /* re-add only the recurrence objects */ - for (l = objects; l != NULL; l = g_list_next (l)) { + for (l = objects; l != NULL; l = g_slist_next (l)) { if (!e_cal_util_component_is_instance (l->data) && e_cal_util_component_has_recurrences (l->data) && (priv->flags & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES)) - list = g_list_prepend (list, l->data); + list = g_slist_prepend (list, l->data); else { gint pos; ECalModelComponent *comp_data; ECalComponentId *id; ECalComponent *comp = e_cal_component_new (); - ECal *client = e_cal_view_get_client (query); + ECalClient *client = e_cal_client_view_get_client (view); if (!e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (l->data))) { g_object_unref (comp); @@ -2319,15 +2319,15 @@ process_modified (ECalView *query, GList *objects, ECalModel *model) } } - e_cal_view_objects_added_cb (query, list, model); - g_list_free (list); + client_view_objects_added_cb (view, list, model); + g_slist_free (list); } static void -process_removed (ECalView *query, GList *ids, ECalModel *model) +process_removed (ECalClientView *view, const GSList *ids, ECalModel *model) { ECalModelPrivate *priv; - GList *l; + const GSList *l; priv = model->priv; @@ -2337,7 +2337,7 @@ process_removed (ECalView *query, GList *ids, ECalModel *model) gint pos; /* make sure we remove all objects with this UID */ - while ((comp_data = search_by_id_and_client (priv, e_cal_view_get_client (query), id))) { + while ((comp_data = search_by_id_and_client (priv, e_cal_client_view_get_client (view), id))) { GSList *l = NULL; pos = get_position_in_array (priv->objects, comp_data); @@ -2387,19 +2387,19 @@ free_comp_id (gpointer id) } static void -process_event (ECalView *query, GList *objects, ECalModel *model, - void (*process_fn) (ECalView *query, GList *objects, ECalModel *model), - gboolean *in, GList **save_list, gpointer (*copy_fn) (gpointer data), void (*free_fn)(gpointer data)) +process_event (ECalClientView *view, const GSList *objects, ECalModel *model, + void (*process_fn) (ECalClientView *view, const GSList *objects, ECalModel *model), + gboolean *in, GSList **save_list, gpointer (*copy_fn) (gpointer data), void (*free_fn)(gpointer data)) { gboolean skip = FALSE; - GList *l; + const GSList *l; g_mutex_lock (model->priv->notify_lock); if (*in) { skip = TRUE; for (l = objects; l; l = l->next) { if (l->data) - *save_list = g_list_append (*save_list, copy_fn (l->data)); + *save_list = g_slist_append (*save_list, copy_fn (l->data)); } } else { *in = TRUE; @@ -2411,23 +2411,23 @@ process_event (ECalView *query, GList *objects, ECalModel *model, return; /* do it */ - process_fn (query, objects, model); + process_fn (view, objects, model); g_mutex_lock (model->priv->notify_lock); while (*save_list) { - GList *copy = *save_list; + GSList *copy = *save_list; *save_list = NULL; g_mutex_unlock (model->priv->notify_lock); /* do it */ - process_fn (query, copy, model); + process_fn (view, copy, model); for (l = copy; l; l = l->next) { if (l->data) { free_fn (l->data); } } - g_list_free (copy); + g_slist_free (copy); g_mutex_lock (model->priv->notify_lock); } @@ -2437,56 +2437,51 @@ process_event (ECalView *query, GList *objects, ECalModel *model, } static void -e_cal_view_objects_added_cb (ECalView *query, GList *objects, ECalModel *model) +client_view_objects_added_cb (ECalClientView *view, const GSList *objects, ECalModel *model) { - process_event (query, objects, model, + process_event (view, objects, model, process_added, &model->priv->in_added, &model->priv->notify_added, (gpointer (*)(gpointer)) icalcomponent_new_clone, (void (*)(gpointer)) icalcomponent_free); } static void -e_cal_view_objects_modified_cb (ECalView *query, GList *objects, ECalModel *model) +client_view_objects_modified_cb (ECalClientView *view, const GSList *objects, ECalModel *model) { - process_event (query, objects, model, + process_event (view, objects, model, process_modified, &model->priv->in_modified, &model->priv->notify_modified, (gpointer (*)(gpointer)) icalcomponent_new_clone, (void (*)(gpointer)) icalcomponent_free); } static void -e_cal_view_objects_removed_cb (ECalView *query, GList *ids, ECalModel *model) +client_view_objects_removed_cb (ECalClientView *view, const GSList *ids, ECalModel *model) { - process_event (query, ids, model, + process_event (view, ids, model, process_removed, &model->priv->in_removed, &model->priv->notify_removed, copy_comp_id, free_comp_id); } static void -e_cal_view_progress_cb (ECalView *query, const gchar *message, gint percent, gpointer user_data) +client_view_progress_cb (ECalClientView *view, gint percent, const gchar *message, gpointer user_data) { ECalModel *model = (ECalModel *) user_data; - ECal *client = e_cal_view_get_client (query); + ECalClient *client = e_cal_client_view_get_client (view); g_return_if_fail (E_IS_CAL_MODEL (model)); g_signal_emit (G_OBJECT (model), signals[CAL_VIEW_PROGRESS], 0, message, - percent, e_cal_get_source_type (client)); + percent, e_cal_client_get_source_type (client)); } static void -e_cal_view_complete_cb (ECalView *query, ECalendarStatus status, const gchar *error_msg, gpointer user_data) +client_view_complete_cb (ECalClientView *view, const GError *error, gpointer user_data) { ECalModel *model = (ECalModel *) user_data; - ECal *client = e_cal_view_get_client (query); + ECalClient *client = e_cal_client_view_get_client (view); g_return_if_fail (E_IS_CAL_MODEL (model)); - #ifndef E_CAL_DISABLE_DEPRECATED - /* emit the signal on the model and let the view catch it to display */ - g_signal_emit (G_OBJECT (model), signals[CAL_VIEW_DONE], 0, status, - e_cal_get_source_type (client)); - #endif - g_signal_emit (G_OBJECT (model), signals[CAL_VIEW_COMPLETE], 0, status, error_msg, - e_cal_get_source_type (client)); + g_signal_emit (G_OBJECT (model), signals[CAL_VIEW_COMPLETE], 0, error, + e_cal_client_get_source_type (client)); } static void @@ -2499,27 +2494,27 @@ update_e_cal_view_for_client (ECalModel *model, ECalModelClient *client_data) priv = model->priv; /* Skip if this client has not finished loading yet */ - if (e_cal_get_load_state (client_data->client) != E_CAL_LOAD_LOADED) + if (!e_client_is_opened (E_CLIENT (client_data->client))) return; - /* free the previous query, if any */ - if (client_data->query) { - g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA, + /* free the previous view, if any */ + if (client_data->view) { + g_signal_handlers_disconnect_matched (client_data->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); - g_object_unref (client_data->query); - client_data->query = NULL; + g_object_unref (client_data->view); + client_data->view = NULL; } - /* prepare the query */ + /* prepare the view */ g_return_if_fail (priv->full_sexp != NULL); /* Don't create the new query if we won't use it */ if (!client_data->do_query) return; -try_again: - if (!e_cal_get_query (client_data->client, priv->full_sexp, &client_data->query, &error)) { - if (error->code == E_CALENDAR_STATUS_BUSY && tries != 10) { + try_again: + if (!e_cal_client_get_view_sync (client_data->client, priv->full_sexp, &client_data->view, NULL, &error)) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_BUSY) && tries != 10) { tries++; /*TODO chose an optimal value */ g_usleep (500); @@ -2527,18 +2522,24 @@ try_again: goto try_again; } - g_warning (G_STRLOC ": Unable to get query, %s", error->message); + g_warning (G_STRLOC ": Unable to get query, %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } - g_signal_connect (client_data->query, "objects_added", G_CALLBACK (e_cal_view_objects_added_cb), model); - g_signal_connect (client_data->query, "objects_modified", G_CALLBACK (e_cal_view_objects_modified_cb), model); - g_signal_connect (client_data->query, "objects_removed", G_CALLBACK (e_cal_view_objects_removed_cb), model); - g_signal_connect (client_data->query, "view_progress", G_CALLBACK (e_cal_view_progress_cb), model); - g_signal_connect (client_data->query, "view_complete", G_CALLBACK (e_cal_view_complete_cb), model); + g_signal_connect (client_data->view, "objects-added", G_CALLBACK (client_view_objects_added_cb), model); + g_signal_connect (client_data->view, "objects-modified", G_CALLBACK (client_view_objects_modified_cb), model); + g_signal_connect (client_data->view, "objects-removed", G_CALLBACK (client_view_objects_removed_cb), model); + g_signal_connect (client_data->view, "progress", G_CALLBACK (client_view_progress_cb), model); + g_signal_connect (client_data->view, "complete", G_CALLBACK (client_view_complete_cb), model); - e_cal_view_start (client_data->query); + e_cal_client_view_start (client_data->view, &error); + if (error) { + g_debug ("%s: Failed to start view: %s", G_STRFUNC, error->message); + g_error_free (error); + } } void @@ -2550,7 +2551,7 @@ e_cal_model_update_status_message (ECalModel *model, const gchar *message, gdoub } static void -backend_died_cb (ECal *client, gpointer user_data) +backend_died_cb (ECalClient *client, gpointer user_data) { ECalModel *model; @@ -2559,35 +2560,20 @@ backend_died_cb (ECal *client, gpointer user_data) e_cal_model_remove_client (model, client); } -static gboolean -wait_open_cb (gpointer data) -{ - ECal *client = data; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (E_IS_CAL (client), FALSE); - - e_cal_open_async (client, FALSE); - - return FALSE; -} - static void -cal_opened_cb (ECal *client, const GError *error, gpointer user_data) +client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + ECalClient *client = E_CAL_CLIENT (source_object); ECalModel *model = (ECalModel *) user_data; ECalModelClient *client_data; + GError *error = NULL; - if (g_error_matches (error, E_CALENDAR_ERROR, E_CALENDAR_STATUS_BUSY)) { - g_timeout_add (250, wait_open_cb, client); - return; - } - - /* Stop listening for this calendar to be opened */ - g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, NULL, cal_opened_cb, model); + e_client_open_finish (E_CLIENT (client), result, &error); if (error) { e_cal_model_remove_client (model, client); + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_client_get_uri (E_CLIENT (client)), error->message); + g_error_free (error); e_cal_model_update_status_message (model, NULL, -1.0); return; } @@ -2601,7 +2587,7 @@ cal_opened_cb (ECal *client, const GError *error, gpointer user_data) } static ECalModelClient * -add_new_client (ECalModel *model, ECal *client, gboolean do_query) +add_new_client (ECalModel *model, ECalClient *client, gboolean do_query) { ECalModelPrivate *priv; ECalModelClient *client_data; @@ -2626,7 +2612,7 @@ add_new_client (ECalModel *model, ECal *client, gboolean do_query) client_data = g_new0 (ECalModelClient, 1); client_data->client = g_object_ref (client); - client_data->query = NULL; + client_data->view = NULL; client_data->do_query = do_query; priv->clients = g_list_append (priv->clients, client_data); @@ -2635,19 +2621,18 @@ add_new_client (ECalModel *model, ECal *client, gboolean do_query) G_CALLBACK (backend_died_cb), model); load: - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) { + if (e_client_is_opened (E_CLIENT (client))) { update_e_cal_view_for_client (model, client_data); } else { gchar *msg; - msg = g_strdup_printf (_("Opening %s"), e_cal_get_uri (client)); + msg = g_strdup_printf (_("Opening %s"), e_client_get_uri (E_CLIENT (client))); e_cal_model_update_status_message (model, msg, -1.0); g_free (msg); - e_cal_set_default_timezone (client, e_cal_model_get_timezone (model), NULL); + e_cal_client_set_default_timezone (client, e_cal_model_get_timezone (model)); - g_signal_connect (client, "cal_opened_ex", G_CALLBACK (cal_opened_cb), model); - e_cal_open_async (client, TRUE); + e_client_open (E_CLIENT (client), TRUE, NULL, client_opened_cb, model); } return client_data; @@ -2657,10 +2642,10 @@ add_new_client (ECalModel *model, ECal *client, gboolean do_query) * e_cal_model_add_client */ void -e_cal_model_add_client (ECalModel *model, ECal *client) +e_cal_model_add_client (ECalModel *model, ECalClient *client) { g_return_if_fail (E_IS_CAL_MODEL (model)); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); add_new_client (model, client, TRUE); } @@ -2701,8 +2686,8 @@ remove_client (ECalModel *model, ECalModelClient *client_data) { /* FIXME We might not want to disconnect the open signal for the default client */ g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); - if (client_data->query) - g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); + if (client_data->view) + g_signal_handlers_disconnect_matched (client_data->view, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); remove_client_objects (model, client_data); @@ -2722,8 +2707,8 @@ remove_client (ECalModel *model, ECalModelClient *client_data) /* free all remaining memory */ g_object_unref (client_data->client); - if (client_data->query) - g_object_unref (client_data->query); + if (client_data->view) + g_object_unref (client_data->view); g_free (client_data); } @@ -2731,12 +2716,12 @@ remove_client (ECalModel *model, ECalModelClient *client_data) * e_cal_model_remove_client */ void -e_cal_model_remove_client (ECalModel *model, ECal *client) +e_cal_model_remove_client (ECalModel *model, ECalClient *client) { ECalModelClient *client_data; g_return_if_fail (E_IS_CAL_MODEL (model)); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); client_data = find_client_data (model, client); if (client_data) @@ -2876,7 +2861,7 @@ redo_queries (ECalModel *model) e_flag_free (data.eflag); - /* update the query for all clients */ + /* update the view for all clients */ for (l = priv->clients; l != NULL; l = l->next) { ECalModelClient *client_data; @@ -3002,7 +2987,7 @@ e_cal_model_create_component_with_defaults (ECalModel *model, gboolean all_day) ECalModelPrivate *priv; ECalComponent *comp; icalcomponent *icalcomp; - ECal *client; + ECalClient *client; g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); @@ -3302,7 +3287,7 @@ e_cal_model_generate_instances (ECalModel *model, time_t start, time_t end, mdata.cb_data = cb_data; if (comp_data->instance_start < end && comp_data->instance_end > start) - e_cal_generate_instances_for_object (comp_data->client, comp_data->icalcomp, start, end, cb, &mdata); + e_cal_client_generate_instances_for_object (comp_data->client, comp_data->icalcomp, start, end, cb, &mdata); } } @@ -3361,7 +3346,8 @@ e_cal_model_set_instance_times (ECalModelComponent *comp_data, const icaltimezon icaltimezone *st_zone = NULL; tzid = icalparameter_get_tzid (param); - e_cal_get_timezone (comp_data->client, tzid, &st_zone, NULL); + if (tzid) + e_cal_client_get_timezone_sync (comp_data->client, tzid, &st_zone, NULL, NULL); if (st_zone) zone = st_zone; @@ -3385,7 +3371,8 @@ e_cal_model_set_instance_times (ECalModelComponent *comp_data, const icaltimezon icaltimezone *end_zone = NULL; tzid = icalparameter_get_tzid (param); - e_cal_get_timezone (comp_data->client, tzid, &end_zone, NULL); + if (tzid) + e_cal_client_get_timezone_sync (comp_data->client, tzid, &end_zone, NULL, NULL); if (end_zone) zone = end_zone; diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h index db744d3d32..766fd6286f 100644 --- a/calendar/gui/e-cal-model.h +++ b/calendar/gui/e-cal-model.h @@ -28,7 +28,7 @@ #include <e-util/e-util-enums.h> #include <table/e-table-model.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "e-cell-date-edit-text.h" /* Standard GObject macros */ @@ -105,7 +105,7 @@ typedef struct _ECalModelComponentPrivate ECalModelComponentPrivate; struct _ECalModelComponent { GObject object; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; time_t instance_start; time_t instance_end; @@ -160,16 +160,10 @@ struct _ECalModelClass { void (*cal_view_progress) (ECalModel *model, const gchar *message, gint progress, - ECalSourceType type); - #ifndef E_CAL_DISABLE_DEPRECATED - void (*cal_view_done) (ECalModel *model, - ECalendarStatus status, - ECalSourceType type); - #endif + ECalClientSourceType type); void (*cal_view_complete) (ECalModel *model, - ECalendarStatus status, - const gchar *error_msg, - ECalSourceType type); + const GError *error, + ECalClientSourceType type); void (*status_message) (ECalModel *model, const gchar *message, gdouble percent); @@ -246,16 +240,16 @@ gint e_cal_model_get_work_day_start_minute void e_cal_model_set_work_day_start_minute (ECalModel *model, gint work_day_start_minute); -ECal * e_cal_model_get_default_client (ECalModel *model); +ECalClient * e_cal_model_get_default_client (ECalModel *model); void e_cal_model_set_default_client (ECalModel *model, - ECal *client); + ECalClient *client); GList * e_cal_model_get_client_list (ECalModel *model); -ECal * e_cal_model_get_client_for_uri (ECalModel *model, +ECalClient * e_cal_model_get_client_for_uri (ECalModel *model, const gchar *uri); void e_cal_model_add_client (ECalModel *model, - ECal *client); + ECalClient *cal_client); void e_cal_model_remove_client (ECalModel *model, - ECal *client); + ECalClient *cal_client); void e_cal_model_remove_all_clients (ECalModel *model); void e_cal_model_get_time_range (ECalModel *model, time_t *start, diff --git a/calendar/gui/e-calendar-selector.c b/calendar/gui/e-calendar-selector.c index 86d42aedb1..d31578cbd0 100644 --- a/calendar/gui/e-calendar-selector.c +++ b/calendar/gui/e-calendar-selector.c @@ -24,9 +24,9 @@ #include "e-calendar-selector.h" -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-selection.h" -#include "common/authentication.h" struct _ECalendarSelectorPrivate { gint dummy_value; @@ -35,7 +35,7 @@ struct _ECalendarSelectorPrivate { static gpointer parent_class; static gboolean -calendar_selector_update_single_object (ECal *client, +calendar_selector_update_single_object (ECalClient *client, icalcomponent *icalcomp) { gchar *uid; @@ -43,15 +43,23 @@ calendar_selector_update_single_object (ECal *client, uid = (gchar *) icalcomponent_get_uid (icalcomp); - if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL)) - return e_cal_modify_object ( - client, icalcomp, CALOBJ_MOD_ALL, NULL); + if (e_cal_client_get_object_sync (client, uid, NULL, &tmp_icalcomp, NULL, NULL)) + return e_cal_client_modify_object_sync ( + client, icalcomp, CALOBJ_MOD_ALL, NULL, NULL); - return e_cal_create_object (client, icalcomp, &uid, NULL); + uid = NULL; + if (!e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, NULL)) + return FALSE; + + if (uid) + icalcomponent_set_uid (icalcomp, uid); + g_free (uid); + + return TRUE; } static gboolean -calendar_selector_update_objects (ECal *client, +calendar_selector_update_objects (ECalClient *client, icalcomponent *icalcomp) { icalcomponent *subcomp; @@ -72,14 +80,19 @@ calendar_selector_update_objects (ECal *client, kind = icalcomponent_isa (subcomp); if (kind == ICAL_VTIMEZONE_COMPONENT) { icaltimezone *zone; + GError *error = NULL; zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - success = e_cal_add_timezone (client, zone, NULL); + success = e_cal_client_add_timezone_sync (client, zone, NULL, &error); icaltimezone_free (zone, 1); - if (!success) + if (!success) { + g_debug ("%s: Failed to ass timezone: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return FALSE; + } } else if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT) { success = calendar_selector_update_single_object ( @@ -95,6 +108,31 @@ calendar_selector_update_objects (ECal *client, return TRUE; } +static void +client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EClient *client = NULL; + icalcomponent *icalcomp = user_data; + GError *error = NULL; + + g_return_if_fail (icalcomp != NULL); + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (client) { + calendar_selector_update_objects (E_CAL_CLIENT (client), icalcomp); + g_object_unref (client); + } + + if (error) { + g_debug ("%s: Failed to open client: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + icalcomponent_free (icalcomp); +} + static gboolean calendar_selector_data_dropped (ESourceSelector *selector, GtkSelectionData *selection_data, @@ -103,7 +141,6 @@ calendar_selector_data_dropped (ESourceSelector *selector, guint info) { GtkTreePath *path = NULL; - ECal *client; icalcomponent *icalcomp; const guchar *data; gboolean success = FALSE; @@ -123,17 +160,9 @@ calendar_selector_data_dropped (ESourceSelector *selector, icalcomponent_set_uid (icalcomp, uid); } - client = e_auth_new_cal_from_source ( - destination, E_CAL_SOURCE_TYPE_EVENT); - - if (client != NULL) { - if (e_cal_open (client, TRUE, NULL)) - calendar_selector_update_objects (client, icalcomp); - - g_object_unref (client); - } - - icalcomponent_free (icalcomp); + e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_cb, icalcomp); success = TRUE; diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 34f6eae6b0..32c5301fe1 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -31,6 +31,7 @@ #include <glib/gstdio.h> #include <gdk/gdkkeysyms.h> #include <libedataserver/e-time-utils.h> +#include <libedataserverui/e-client-utils.h> #include <e-util/e-util.h> #include <e-util/e-alert-dialog.h> #include <e-util/e-extensible.h> @@ -43,7 +44,6 @@ #include <misc/e-selectable.h> #include <shell/e-shell.h> -#include "common/authentication.h" #include "comp-util.h" #include "ea-calendar.h" #include "e-cal-model-calendar.h" @@ -132,7 +132,7 @@ calendar_view_add_retract_data (ECalComponent *comp, static gboolean calendar_view_check_for_retract (ECalComponent *comp, - ECal *client) + ECalClient *client) { ECalComponentOrganizer organizer; const gchar *strip; @@ -142,14 +142,14 @@ calendar_view_check_for_retract (ECalComponent *comp, if (!e_cal_component_has_attendees (comp)) return FALSE; - if (!e_cal_get_save_schedules (client)) + if (!e_cal_client_check_save_schedules (client)) return FALSE; e_cal_component_get_organizer (comp, &organizer); strip = itip_strip_mailto (organizer.value); ret_val = - e_cal_get_cal_address (client, &email, NULL) && + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &email, NULL, NULL) && (g_ascii_strcasecmp (email, strip) == 0); g_free (email); @@ -177,7 +177,7 @@ calendar_view_delete_event (ECalendarView *cal_view, vtype = e_cal_component_get_vtype (comp); /*FIXME remove it once the we dont set the recurrence id for all the generated instances */ - if (!e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) + if (!e_cal_client_check_recurrences_no_master (event->comp_data->client)) e_cal_component_set_recurid (comp, NULL); /*FIXME Retract should be moved to Groupwise features plugin */ @@ -187,15 +187,15 @@ calendar_view_delete_event (ECalendarView *cal_view, delete = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view), &retract); if (retract) { - GList *users = NULL; + GSList *users = NULL; icalcomponent *icalcomp = NULL, *mod_comp = NULL; calendar_view_add_retract_data ( comp, retract_comment, CALOBJ_MOD_ALL); icalcomp = e_cal_component_get_icalcomponent (comp); icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); - if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users, - &mod_comp, &error)) { + if (!e_cal_client_send_objects_sync (event->comp_data->client, icalcomp, &users, + &mod_comp, NULL, &error)) { delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); error = NULL; @@ -205,8 +205,8 @@ calendar_view_delete_event (ECalendarView *cal_view, icalcomponent_free (mod_comp); if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } } } @@ -232,10 +232,10 @@ calendar_view_delete_event (ECalendarView *cal_view, } rid = e_cal_component_get_recurid_as_string (comp); if (e_cal_util_component_is_instance (event->comp_data->icalcomp) || e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) - e_cal_remove_object_with_mod (event->comp_data->client, uid, - rid, CALOBJ_MOD_ALL, &error); + e_cal_client_remove_object_sync (event->comp_data->client, uid, + rid, CALOBJ_MOD_ALL, NULL, &error); else - e_cal_remove_object (event->comp_data->client, uid, &error); + e_cal_client_remove_object_sync (event->comp_data->client, uid, NULL, CALOBJ_MOD_THIS, NULL, &error); delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); @@ -392,9 +392,8 @@ calendar_view_update_actions (ESelectable *selectable, for (iter = list; iter != NULL; iter = iter->next) { ECalendarViewEvent *event = iter->data; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; - gboolean read_only; if (event == NULL || event->comp_data == NULL) continue; @@ -402,8 +401,7 @@ calendar_view_update_actions (ESelectable *selectable, client = event->comp_data->client; icalcomp = event->comp_data->icalcomp; - e_cal_is_read_only (client, &read_only, NULL); - sources_are_editable &= !read_only; + sources_are_editable = sources_are_editable && !e_client_is_readonly (E_CLIENT (client)); recurring |= e_cal_util_component_is_instance (icalcomp) || @@ -488,17 +486,14 @@ calendar_view_cut_clipboard (ESelectable *selectable) /* when cutting detached instances, only cut that instance */ rid = e_cal_component_get_recurid_as_string (comp); - if (e_cal_get_object (event->comp_data->client, uid, rid, &icalcomp, NULL)) { - e_cal_remove_object_with_mod (event->comp_data->client, uid, - rid, CALOBJ_MOD_THIS, - &error); + if (e_cal_client_get_object_sync (event->comp_data->client, uid, rid, &icalcomp, NULL, NULL)) { + e_cal_client_remove_object_sync (event->comp_data->client, uid, rid, CALOBJ_MOD_THIS, NULL, &error); icalcomponent_free (icalcomp); } else - e_cal_remove_object_with_mod (event->comp_data->client, uid, NULL, - CALOBJ_MOD_ALL, &error); + e_cal_client_remove_object_sync (event->comp_data->client, uid, NULL, CALOBJ_MOD_ALL, NULL, &error); g_free (rid); } else - e_cal_remove_object (event->comp_data->client, uid, &error); + e_cal_client_remove_object_sync (event->comp_data->client, uid, NULL, CALOBJ_MOD_ALL, NULL, &error); delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); @@ -514,7 +509,7 @@ calendar_view_cut_clipboard (ESelectable *selectable) } static void -add_related_timezones (icalcomponent *des_icalcomp, icalcomponent *src_icalcomp, ECal *client) +add_related_timezones (icalcomponent *des_icalcomp, icalcomponent *src_icalcomp, ECalClient *client) { icalproperty_kind look_in[] = { ICAL_DTSTART_PROPERTY, @@ -540,7 +535,7 @@ add_related_timezones (icalcomponent *des_icalcomp, icalcomponent *src_icalcomp, GError *error = NULL; icaltimezone *zone = NULL; - if (!e_cal_get_timezone (client, tzid, &zone, &error)) { + if (!e_cal_client_get_timezone_sync (client, tzid, &zone, NULL, &error)) { g_warning ("%s: Cannot get timezone for '%s'. %s", G_STRFUNC, tzid, error ? error->message : ""); if (error) g_error_free (error); @@ -628,7 +623,7 @@ clipboard_get_calendar_data (ECalendarView *cal_view, icalcomponent_kind kind; time_t selected_time_start, selected_time_end; icaltimezone *default_zone; - ECal *client; + ECalClient *client; gboolean in_top_canvas; g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view)); @@ -671,7 +666,7 @@ clipboard_get_calendar_data (ECalendarView *cal_view, zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - if (!e_cal_add_timezone (client, zone, &error)) { + if (!e_cal_client_add_timezone_sync (client, zone, NULL, &error)) { icalproperty *tzidprop = icalcomponent_get_first_property (subcomp, ICAL_TZID_PROPERTY); g_warning ("%s: Add zone '%s' failed. %s", G_STRFUNC, tzidprop ? icalproperty_get_tzid (tzidprop) : "???", error ? error->message : ""); @@ -949,7 +944,7 @@ e_calendar_view_popup_event (ECalendarView *calendar_view, } void -e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart, +e_calendar_view_add_event (ECalendarView *cal_view, ECalClient *client, time_t dtstart, icaltimezone *default_zone, icalcomponent *icalcomp, gboolean in_top_canvas) { ECalComponent *comp; @@ -1049,7 +1044,7 @@ e_calendar_view_add_event (ECalendarView *cal_view, ECal *client, time_t dtstart e_cal_component_commit_sequence (comp); uid = NULL; - if (e_cal_create_object (client, e_cal_component_get_icalcomponent (comp), &uid, &error)) { + if (e_cal_client_create_object_sync (client, e_cal_component_get_icalcomponent (comp), &uid, NULL, &error)) { gboolean strip_alarms = TRUE; if (uid) { @@ -1284,15 +1279,15 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) delete = prompt_retract_dialog (comp, &retract_comment, GTK_WIDGET (cal_view), &retract); if (retract) { - GList *users = NULL; + GSList *users = NULL; icalcomponent *icalcomp = NULL, *mod_comp = NULL; calendar_view_add_retract_data ( comp, retract_comment, CALOBJ_MOD_THIS); icalcomp = e_cal_component_get_icalcomponent (comp); icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); - if (!e_cal_send_objects (event->comp_data->client, icalcomp, &users, - &mod_comp, &error)) { + if (!e_cal_client_send_objects_sync (event->comp_data->client, icalcomp, &users, + &mod_comp, NULL, &error)) { delete_error_dialog (error, E_CAL_COMPONENT_EVENT); g_clear_error (&error); error = NULL; @@ -1300,8 +1295,8 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) if (mod_comp) icalcomponent_free (mod_comp); if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } } } @@ -1323,7 +1318,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) if (dt.tzid) { GError *error = NULL; - e_cal_get_timezone (event->comp_data->client, dt.tzid, &zone, &error); + e_cal_client_get_timezone_sync (event->comp_data->client, dt.tzid, &zone, NULL, &error); if (error) { zone = e_calendar_view_get_timezone (cal_view); g_clear_error (&error); @@ -1339,7 +1334,7 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) if ((itip_organizer_is_user (comp, event->comp_data->client) || itip_sentby_is_user (comp, event->comp_data->client)) && cancel_component_dialog ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (cal_view)), event->comp_data->client, - comp, TRUE) && !e_cal_get_save_schedules (event->comp_data->client)) { + comp, TRUE) && !e_cal_client_check_save_schedules (event->comp_data->client)) { if (!e_cal_component_is_instance (comp)) { ECalComponentRange range; @@ -1355,15 +1350,14 @@ e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view) } if (is_instance) - e_cal_remove_object_with_mod (event->comp_data->client, uid, rid, CALOBJ_MOD_THIS, &error); + e_cal_client_remove_object_sync (event->comp_data->client, uid, rid, CALOBJ_MOD_THIS, NULL, &error); else { struct icaltimetype instance_rid; instance_rid = icaltime_from_timet_with_zone (event->comp_data->instance_start, TRUE, zone ? zone : icaltimezone_get_utc_timezone ()); e_cal_util_remove_instances (event->comp_data->icalcomp, instance_rid, CALOBJ_MOD_THIS); - e_cal_modify_object (event->comp_data->client, event->comp_data->icalcomp, CALOBJ_MOD_THIS, - &error); + e_cal_client_modify_object_sync (event->comp_data->client, event->comp_data->icalcomp, CALOBJ_MOD_THIS, NULL, &error); } delete_error_dialog (error, E_CAL_COMPONENT_EVENT); @@ -1414,10 +1408,9 @@ e_calendar_view_new_appointment_for (ECalendarView *cal_view, ECalComponent *comp; icalcomponent *icalcomp; ECalComponentTransparency transparency; - ECal *default_client = NULL; + ECalClient *default_client = NULL; gpointer parent; guint32 flags = 0; - gboolean readonly = FALSE; g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view)); @@ -1428,15 +1421,15 @@ e_calendar_view_new_appointment_for (ECalendarView *cal_view, default_client = e_cal_model_get_default_client (priv->model); - if (!default_client || e_cal_get_load_state (default_client) != E_CAL_LOAD_LOADED) { + if (!default_client || !e_client_is_opened (E_CLIENT (default_client))) { g_warning ("Default client not loaded \n"); return; } - if (e_cal_is_read_only (default_client, &readonly, NULL) && readonly) { + if (e_client_is_readonly (E_CLIENT (default_client))) { GtkWidget *widget; - widget = e_alert_dialog_new_for_args (parent, "calendar:prompt-read-only-cal", e_source_peek_name (e_cal_get_source (default_client)), NULL); + widget = e_alert_dialog_new_for_args (parent, "calendar:prompt-read-only-cal", e_source_peek_name (e_client_get_source (E_CLIENT (default_client))), NULL); g_signal_connect ((GtkDialog *)widget, "response", G_CALLBACK (gtk_widget_destroy), widget); @@ -1588,7 +1581,7 @@ object_created_cb (CompEditor *ce, ECalendarView *cal_view) } CompEditor * -e_calendar_view_open_event_with_flags (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, guint32 flags) +e_calendar_view_open_event_with_flags (ECalendarView *cal_view, ECalClient *client, icalcomponent *icalcomp, guint32 flags) { CompEditor *ce; const gchar *uid; @@ -1631,12 +1624,12 @@ e_calendar_view_open_event_with_flags (ECalendarView *cal_view, ECal *client, ic * object. */ void -e_calendar_view_edit_appointment (ECalendarView *cal_view, ECal *client, icalcomponent *icalcomp, EEditEventMode mode) +e_calendar_view_edit_appointment (ECalendarView *cal_view, ECalClient *client, icalcomponent *icalcomp, EEditEventMode mode) { guint32 flags = 0; g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view)); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); g_return_if_fail (icalcomp != NULL); if ((mode == EDIT_EVENT_AUTODETECT && icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY) != NULL) @@ -1654,15 +1647,17 @@ e_calendar_view_edit_appointment (ECalendarView *cal_view, ECal *client, icalcom void e_calendar_view_modify_and_send (ECalComponent *comp, - ECal *client, + ECalClient *client, CalObjModType mod, GtkWindow *toplevel, gboolean new) { gboolean only_new_attendees = FALSE; + GError *error = NULL; + e_cal_component_commit_sequence (comp); - if (e_cal_modify_object (client, e_cal_component_get_icalcomponent (comp), mod, NULL)) { + if (e_cal_client_modify_object_sync (client, e_cal_component_get_icalcomponent (comp), mod, NULL, &error)) { gboolean strip_alarms = TRUE; if ((itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp, client)) && @@ -1675,7 +1670,7 @@ e_calendar_view_modify_and_send (ECalComponent *comp, const gchar *uid = NULL; e_cal_component_get_uid (comp, &uid); - if (e_cal_get_object (client, uid, NULL, &icalcomp, NULL) && icalcomp) { + if (e_cal_client_get_object_sync (client, uid, NULL, &icalcomp, NULL, NULL) && icalcomp) { send_comp = e_cal_component_new (); if (!e_cal_component_set_icalcomponent (send_comp, icalcomp)) { icalcomponent_free (icalcomp); @@ -1694,7 +1689,10 @@ e_calendar_view_modify_and_send (ECalComponent *comp, g_object_unref (send_comp); } } else { - g_message (G_STRLOC ": Could not update the object!"); + g_message (G_STRLOC ": Could not update the object! %s", error ? error->message : "Unknown error"); + + if (error) + g_error_free (error); } } @@ -1770,7 +1768,7 @@ e_calendar_view_move_tip (GtkWidget *widget, gint x, gint y) * Free returned pointer with g_free. **/ gchar * -e_calendar_view_get_attendees_status_info (ECalComponent *comp, ECal *client) +e_calendar_view_get_attendees_status_info (ECalComponent *comp, ECalClient *client) { struct _values { icalparameter_partstat status; @@ -1867,7 +1865,7 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data) GdkWindow *window; ECalComponent *newcomp = e_cal_component_new (); icaltimezone *zone, *default_zone; - ECal *client = NULL; + ECalClient *client = NULL; gboolean free_text = FALSE; /* Delete any stray tooltip if left */ @@ -1961,7 +1959,7 @@ e_calendar_view_get_tooltips (const ECalendarViewEventData *data) if (dtstart.tzid) { zone = icalcomponent_get_timezone (e_cal_component_get_icalcomponent (newcomp), dtstart.tzid); if (!zone) - e_cal_get_timezone (client, dtstart.tzid, &zone, NULL); + e_cal_client_get_timezone_sync (client, dtstart.tzid, &zone, NULL, NULL); if (!zone) zone = default_zone; @@ -2067,7 +2065,7 @@ icalcomp_contains_category (icalcomponent *icalcomp, const gchar *category) */ const gchar * -e_calendar_view_get_icalcomponent_summary (ECal *ecal, icalcomponent *icalcomp, gboolean *free_text) +e_calendar_view_get_icalcomponent_summary (ECalClient *client, icalcomponent *icalcomp, gboolean *free_text) { const gchar *summary; @@ -2081,11 +2079,11 @@ e_calendar_view_get_icalcomponent_summary (ECal *ecal, icalcomponent *icalcomp, struct icaltimetype dtstart, dtnow; icalcomponent *item_icalcomp = NULL; - if (e_cal_get_object (ecal, + if (e_cal_client_get_object_sync (client, icalcomponent_get_uid (icalcomp), icalcomponent_get_relcalid (icalcomp), &item_icalcomp, - NULL)) { + NULL, NULL)) { dtstart = icalcomponent_get_dtstart (item_icalcomp); dtnow = icalcomponent_get_dtstart (icalcomp); diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index 88ebbeea66..decfdfffbf 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -24,7 +24,7 @@ #define E_CALENDAR_VIEW_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "e-cal-model.h" #include "gnome-cal.h" #include "dialogs/comp-editor.h" @@ -210,7 +210,7 @@ void e_calendar_view_delete_selected_occurrence (ECalendarView *cal_view); CompEditor * e_calendar_view_open_event_with_flags (ECalendarView *cal_view, - ECal *client, + ECalClient *client, icalcomponent *icalcomp, guint32 flags); @@ -218,7 +218,7 @@ void e_calendar_view_popup_event (ECalendarView *cal_view, GdkEventButton *event); void e_calendar_view_add_event (ECalendarView *cal_view, - ECal *client, + ECalClient *client, time_t dtstart, icaltimezone *default_zone, icalcomponent *icalcomp, @@ -236,12 +236,12 @@ void e_calendar_view_new_appointment_full gboolean no_past_date); void e_calendar_view_new_appointment (ECalendarView *cal_view); void e_calendar_view_edit_appointment (ECalendarView *cal_view, - ECal *client, + ECalClient *client, icalcomponent *icalcomp, EEditEventMode mode); void e_calendar_view_open_event (ECalendarView *cal_view); void e_calendar_view_modify_and_send (ECalComponent *comp, - ECal *client, + ECalClient *client, CalObjModType mod, GtkWindow *toplevel, gboolean new); @@ -253,12 +253,12 @@ void e_calendar_view_move_tip (GtkWidget *widget, gint y); const gchar * e_calendar_view_get_icalcomponent_summary - (ECal *ecal, + (ECalClient *ecal, icalcomponent *icalcomp, gboolean *free_text); gchar * e_calendar_view_get_attendees_status_info (ECalComponent *comp, - ECal *client); + ECalClient *client); void e_calendar_view_emit_user_created (ECalendarView *cal_view); diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 4aa87719fe..e7e44bab46 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -273,7 +273,7 @@ static ECalendarViewPosition e_day_view_convert_position_in_main_canvas (EDayVie gint *row_return, gint *event_num_return); static gboolean e_day_view_find_event_from_uid (EDayView *day_view, - ECal *client, + ECalClient *client, const gchar *uid, const gchar *rid, gint *day_return, @@ -2137,7 +2137,7 @@ e_day_view_update_event_label (EDayView *day_view, "text", text, NULL); - if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) + if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) && e_cal_util_component_has_attendee (event->comp_data->icalcomp)) set_text_as_bold (event); @@ -2172,7 +2172,7 @@ e_day_view_update_long_event_label (EDayView *day_view, if (free_text) g_free ((gchar *) summary); - if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) + if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) && e_cal_util_component_has_attendee (event->comp_data->icalcomp)) set_text_as_bold (event); } @@ -2225,7 +2225,7 @@ e_day_view_find_event_from_item (EDayView *day_view, see if any events with the uid exist. */ static gboolean e_day_view_find_event_from_uid (EDayView *day_view, - ECal *client, + ECalClient *client, const gchar *uid, const gchar *rid, gint *day_return, @@ -3475,9 +3475,7 @@ e_day_view_on_event_click (EDayView *day_view, !e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) && (pos == E_CALENDAR_VIEW_POS_TOP_EDGE || pos == E_CALENDAR_VIEW_POS_BOTTOM_EDGE)) { - gboolean read_only = FALSE; - - if (event && (!event->is_editable || (e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && read_only))) { + if (event && (!event->is_editable || e_client_is_readonly (E_CLIENT (event->comp_data->client)))) { return; } @@ -3936,11 +3934,10 @@ e_day_view_on_main_canvas_motion (GtkWidget *widget, gtk_target_list_unref (target_list); } } else { - gboolean read_only = FALSE; cursor = day_view->normal_cursor; /* Check if the event is editable and client is not readonly while changing the cursor */ - if (event && event->is_editable && is_comp_data_valid (event) && e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && !read_only) { + if (event && event->is_editable && is_comp_data_valid (event) && !e_client_is_readonly (E_CLIENT (event->comp_data->client))) { switch (pos) { case E_CALENDAR_VIEW_POS_LEFT_EDGE: @@ -4119,7 +4116,6 @@ e_day_view_update_resize (EDayView *day_view, EDayViewEvent *event; gint day, event_num; gboolean need_reshape = FALSE; - gboolean read_only = FALSE; #if 0 g_print ("Updating resize Row:%i\n", row); @@ -4137,7 +4133,7 @@ e_day_view_update_resize (EDayView *day_view, event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); - if (event && (!event->is_editable || !is_comp_data_valid (event) || (e_cal_is_read_only (event->comp_data->client, &read_only, NULL) && read_only))) { + if (event && (!event->is_editable || !is_comp_data_valid (event) || e_client_is_readonly (E_CLIENT (event->comp_data->client)))) { return; } @@ -4175,7 +4171,7 @@ e_day_view_finish_long_event_resize (EDayView *day_view) ECalComponentDateTime date; struct icaltimetype itt; time_t dt; - ECal *client; + ECalClient *client; CalObjModType mod = CALOBJ_MOD_ALL; GtkWindow *toplevel; gint is_date; @@ -4290,7 +4286,7 @@ e_day_view_finish_resize (EDayView *day_view) ECalComponentDateTime date; struct icaltimetype itt; time_t dt; - ECal *client; + ECalClient *client; CalObjModType mod = CALOBJ_MOD_ALL; GtkWindow *toplevel; @@ -5062,7 +5058,7 @@ static gboolean e_day_view_add_new_event_in_selected_range (EDayView *day_view, GdkEventKey *key_event) { icalcomponent *icalcomp; - ECal *ecal; + ECalClient *client; ECalModel *model; ECalComponent *comp; gint day, event_num; @@ -5071,12 +5067,11 @@ e_day_view_add_new_event_in_selected_range (EDayView *day_view, GdkEventKey *key struct icaltimetype start_tt, end_tt; const gchar *uid; AddEventData add_event_data; - gboolean read_only = TRUE; /* Check if the client is read only */ model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)); - ecal = e_cal_model_get_default_client (model); - if (!e_cal_is_read_only (ecal, &read_only, NULL) || read_only) + client = e_cal_model_get_default_client (model); + if (e_client_is_readonly (E_CLIENT (client))) return FALSE; icalcomp = e_cal_model_create_component_with_defaults (model, day_view->selection_in_top_canvas); @@ -5128,7 +5123,7 @@ e_day_view_add_new_event_in_selected_range (EDayView *day_view, GdkEventKey *key gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); - if (!e_day_view_find_event_from_uid (day_view, ecal, uid, NULL, &day, &event_num)) { + if (!e_day_view_find_event_from_uid (day_view, client, uid, NULL, &day, &event_num)) { g_warning ("Couldn't find event to start editing.\n"); g_object_unref (comp); return FALSE; @@ -5980,7 +5975,6 @@ e_day_view_start_editing_event (EDayView *day_view, EDayViewEvent *event; ETextEventProcessor *event_processor = NULL; ETextEventProcessorCommand command; - gboolean read_only; #if 0 g_print ("In e_day_view_start_editing_event\n"); @@ -6008,7 +6002,7 @@ e_day_view_start_editing_event (EDayView *day_view, if (!is_comp_data_valid (event)) return; - if (!e_cal_is_read_only (event->comp_data->client, &read_only, NULL) || read_only) + if (e_client_is_readonly (E_CLIENT (event->comp_data->client))) return; /* If the event is not shown, don't try to edit it. */ @@ -6416,7 +6410,7 @@ e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt ECalComponent *comp; ECalComponentDateTime date; struct icaltimetype itt; - ECal *client; + ECalClient *client; CalObjModType mod = CALOBJ_MOD_ALL; GtkWindow *toplevel; @@ -6643,7 +6637,7 @@ e_day_view_on_editing_stopped (EDayView *day_view, gchar *text = NULL; ECalComponentText summary; ECalComponent *comp; - ECal *client; + ECalClient *client; gboolean on_server; /* Note: the item we are passed here isn't reliable, so we just stop @@ -6728,11 +6722,21 @@ e_day_view_on_editing_stopped (EDayView *day_view, e_cal_component_commit_sequence (comp); if (!on_server) { - if (!e_cal_create_object (client, icalcomp, NULL, NULL)) - g_message (G_STRLOC ": Could not create the object!"); - else + gchar *uid = NULL; + GError *error = NULL; + + if (!e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, &error)) { + uid = NULL; + g_debug (G_STRLOC ": Could not create the object! %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + } else { + icalcomponent_set_uid (icalcomp, uid); e_calendar_view_emit_user_created ( E_CALENDAR_VIEW (day_view)); + } + + g_free (uid); /* we remove the object since we either got the update from the server or failed */ e_day_view_remove_event_cb (day_view, day, event_num, NULL); @@ -7801,7 +7805,7 @@ e_day_view_on_drag_data_get (GtkWidget *widget, comp_str = icalcomponent_as_ical_string_r (vcal); if (comp_str) { - ESource *source = e_cal_get_source (event->comp_data->client); + ESource *source = e_client_get_source (E_CLIENT (event->comp_data->client)); const gchar *source_uid = e_source_peek_uid (source); GdkAtom target; gchar *tmp; @@ -7841,7 +7845,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, struct icaltimetype itt; time_t dt; gboolean all_day_event; - ECal *client; + ECalClient *client; ECalModel *model; ECalendarView *cal_view; gboolean drag_from_same_window; @@ -8043,7 +8047,7 @@ e_day_view_on_top_canvas_drag_data_received (GtkWidget *widget, zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - e_cal_add_timezone (client, zone, NULL); + e_cal_client_add_timezone_sync (client, zone, NULL, NULL); icaltimezone_free (zone, 1); } @@ -8087,7 +8091,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, ECalComponentDateTime date; struct icaltimetype itt; time_t dt; - ECal *client; + ECalClient *client; gboolean drag_from_same_window; const guchar *data; gint format, length; @@ -8270,7 +8274,7 @@ e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget, zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - e_cal_add_timezone (client, zone, NULL); + e_cal_client_add_timezone_sync (client, zone, NULL, NULL); icaltimezone_free (zone, 1); } diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index 8728b24283..ae1cf79d56 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -235,9 +235,6 @@ struct _EDayView { /* label showing week number in upper-left corner */ GtkWidget *week_number_label; - /* S-expression for query and the query object */ - ECalView *query; - /* The start and end of the days shown. */ time_t lower; time_t upper; diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c index c702bdfd77..11f47e6030 100644 --- a/calendar/gui/e-meeting-list-view.c +++ b/calendar/gui/e-meeting-list-view.c @@ -28,7 +28,7 @@ #include <string.h> #include <gtk/gtk.h> #include <glib/gi18n.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-vcard.h> #include <libecal/e-cal-component.h> #include <libecal/e-cal-util.h> @@ -762,54 +762,54 @@ process_section (EMeetingListView *view, GList *destinations, icalparameter_role /* check if the contact is contact list which is not expanded yet */ /* we expand it by getting the list again from the server forming the query */ if (contact && e_contact_get (contact , E_CONTACT_IS_LIST)) { - EBook *book = NULL; + EBookClient *book_client = NULL; ENameSelectorDialog *dialog; ENameSelectorModel *model; EContactStore *c_store; - GList *books, *l; + GSList *clients, *l; gchar *uri = e_contact_get (contact, E_CONTACT_BOOK_URI); dialog = e_name_selector_peek_dialog (view->priv->name_selector); model = e_name_selector_dialog_peek_model (dialog); c_store = e_name_selector_model_peek_contact_store (model); - books = e_contact_store_get_books (c_store); + clients = e_contact_store_get_clients (c_store); - for (l = books; l; l = l->next) { - EBook *b = l->data; - if (g_str_equal (uri, e_book_get_uri (b))) { - book = b; + for (l = clients; l; l = l->next) { + EBookClient *b = l->data; + if (g_str_equal (uri, e_client_get_uri (E_CLIENT (b)))) { + book_client = b; break; } } - if (book) { - GList *contacts; + if (book_client) { + GSList *contacts; EContact *n_con = NULL; - gchar *qu; - EBookQuery *query; + gchar *query; - qu = g_strdup_printf ("(is \"full_name\" \"%s\")", + query = g_strdup_printf ("(is \"full_name\" \"%s\")", (gchar *) e_contact_get (contact, E_CONTACT_FULL_NAME)); - query = e_book_query_from_string (qu); - if (!e_book_get_contacts (book, query, &contacts, NULL)) { + if (!e_book_client_get_contacts_sync (book_client, query, &contacts, NULL, NULL)) { g_warning ("Could not get contact from the book \n"); + g_free (query); + g_slist_free (clients); return; } else { des = e_destination_new (); n_con = contacts->data; e_destination_set_contact (des, n_con, 0); + e_destination_set_client (des, book_client); list_dests = e_destination_list_get_dests (des); - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); } - e_book_query_unref (query); - g_free (qu); + g_free (query); } - g_list_free (books); + g_slist_free (clients); } else { card_dest.next = NULL; card_dest.prev = NULL; @@ -822,31 +822,10 @@ process_section (EMeetingListView *view, GList *destinations, icalparameter_role EDestination *dest = l->data; EContact *contact; const gchar *name, *attendee = NULL; - gchar *attr = NULL, *fburi = NULL; + gchar *fburi = NULL; name = e_destination_get_name (dest); - - /* Get the field as attendee from the backend */ - if (e_cal_get_ldap_attribute (e_meeting_store_get_client (priv->store), - &attr, NULL)) { - /* FIXME this should be more general */ - if (!g_ascii_strcasecmp (attr, "icscalendar")) { - - /* FIXME: this does not work, have to use first - e_destination_use_contact () */ - contact = e_destination_get_contact (dest); - if (contact) { - attendee = e_contact_get (contact, E_CONTACT_FREEBUSY_URL); - if (!attendee) - attendee = e_contact_get (contact, E_CONTACT_CALENDAR_URI); - } - } - } - - /* If we couldn't get the attendee prior, get the email address as the default */ - if (attendee == NULL || *attendee == '\0') { - attendee = e_destination_get_email (dest); - } + attendee = e_destination_get_email (dest); if (attendee == NULL || *attendee == '\0') continue; diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c index e18c259f65..ca4df0b854 100644 --- a/calendar/gui/e-meeting-store.c +++ b/calendar/gui/e-meeting-store.c @@ -49,7 +49,7 @@ struct _EMeetingStorePrivate { GPtrArray *attendees; gint stamp; - ECal *client; + ECalClient *client; icaltimezone *zone; gint default_reminder_interval; @@ -756,9 +756,9 @@ e_meeting_store_class_init (EMeetingStoreClass *class) PROP_CLIENT, g_param_spec_object ( "client", - "Client", + "ECalClient", NULL, - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -840,7 +840,7 @@ e_meeting_store_new (void) return g_object_new (E_TYPE_MEETING_STORE, NULL); } -ECal * +ECalClient * e_meeting_store_get_client (EMeetingStore *store) { g_return_val_if_fail (E_IS_MEETING_STORE (store), NULL); @@ -850,12 +850,12 @@ e_meeting_store_get_client (EMeetingStore *store) void e_meeting_store_set_client (EMeetingStore *store, - ECal *client) + ECalClient *client) { g_return_if_fail (E_IS_MEETING_STORE (store)); if (client != NULL) { - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); g_object_ref (client); } @@ -1454,11 +1454,11 @@ replace_string (gchar *string, const gchar *from_value, gchar *to_value) static void start_async_read (const gchar *uri, gpointer data); typedef struct { - ECal *client; + ECalClient *client; time_t startt; time_t endt; - GList *users; - GList *fb_data; + GSList *users; + GSList *fb_data; gchar *fb_uri; gchar *email; EMeetingAttendee *attendee; @@ -1469,6 +1469,21 @@ typedef struct { #define USER_SUB "%u" #define DOMAIN_SUB "%d" +static void +client_free_busy_data_cb (ECalClient *client, const GSList *ecalcomps, FreeBusyAsyncData *fbd) +{ + const GSList *iter; + + g_return_if_fail (fbd != NULL); + + for (iter = ecalcomps; iter != NULL; iter = iter->next) { + ECalComponent *comp = iter->data; + + if (comp) + fbd->fb_data = g_slist_prepend (fbd->fb_data, g_object_ref (comp)); + } +} + static gboolean freebusy_async (gpointer data) { @@ -1480,19 +1495,20 @@ freebusy_async (gpointer data) EMeetingStorePrivate *priv = fbd->store->priv; if (fbd->client) { + guint sigid; /* FIXME This a workaround for getting all the free busy * information for the users. We should be able to * get free busy asynchronously. */ g_static_mutex_lock (&mutex); priv->num_queries++; - e_cal_get_free_busy ( - fbd->client, fbd->users, fbd->startt, - fbd->endt, &(fbd->fb_data), NULL); + sigid = g_signal_connect (fbd->client, "free-busy-data", G_CALLBACK (client_free_busy_data_cb), fbd); + e_cal_client_get_free_busy_sync (fbd->client, fbd->startt, fbd->endt, fbd->users, NULL, NULL); + g_signal_handler_disconnect (fbd->client, sigid); priv->num_queries--; g_static_mutex_unlock (&mutex); - g_list_foreach (fbd->users, (GFunc) g_free, NULL); - g_list_free (fbd->users); + g_slist_foreach (fbd->users, (GFunc) g_free, NULL); + g_slist_free (fbd->users); if (fbd->fb_data != NULL) { ECalComponent *comp = fbd->fb_data->data; @@ -1623,7 +1639,7 @@ refresh_busy_periods (gpointer data) fbd->endt = icaltime_as_timet_with_zone (itt, priv->zone); fbd->qdata = qdata; - fbd->users = g_list_append (fbd->users, g_strdup (fbd->email)); + fbd->users = g_slist_append (fbd->users, g_strdup (fbd->email)); } @@ -1634,8 +1650,8 @@ refresh_busy_periods (gpointer data) thread = g_thread_create ((GThreadFunc) freebusy_async, fbd, FALSE, &error); if (!thread) { /* do clean up stuff here */ - g_list_foreach (fbd->users, (GFunc) g_free, NULL); - g_list_free (fbd->users); + g_slist_foreach (fbd->users, (GFunc) g_free, NULL); + g_slist_free (fbd->users); g_free (fbd->email); priv->refresh_idle_id = 0; diff --git a/calendar/gui/e-meeting-store.h b/calendar/gui/e-meeting-store.h index 2c863ef506..ec98bae554 100644 --- a/calendar/gui/e-meeting-store.h +++ b/calendar/gui/e-meeting-store.h @@ -24,7 +24,7 @@ #define E_MEETING_STORE_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <e-util/e-util-enums.h> #include "e-meeting-attendee.h" @@ -86,9 +86,9 @@ void e_meeting_store_set_value (EMeetingStore *meeting_store, gint row, gint col, const gchar *val); -ECal * e_meeting_store_get_client (EMeetingStore *meeting_store); +ECalClient * e_meeting_store_get_client (EMeetingStore *meeting_store); void e_meeting_store_set_client (EMeetingStore *meeting_store, - ECal *client); + ECalClient *client); gint e_meeting_store_get_default_reminder_interval (EMeetingStore *meeting_store); void e_meeting_store_set_default_reminder_interval diff --git a/calendar/gui/e-memo-list-selector.c b/calendar/gui/e-memo-list-selector.c index bb41412417..abc4bf9bf3 100644 --- a/calendar/gui/e-memo-list-selector.c +++ b/calendar/gui/e-memo-list-selector.c @@ -25,9 +25,9 @@ #include "e-memo-list-selector.h" #include <string.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-selection.h" -#include "calendar/common/authentication.h" #include "calendar/gui/comp-util.h" struct _EMemoListSelectorPrivate { @@ -37,23 +37,31 @@ struct _EMemoListSelectorPrivate { static gpointer parent_class; static gboolean -memo_list_selector_update_single_object (ECal *client, +memo_list_selector_update_single_object (ECalClient *client, icalcomponent *icalcomp) { - gchar *uid; + gchar *uid = NULL; icalcomponent *tmp_icalcomp; uid = (gchar *) icalcomponent_get_uid (icalcomp); - if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL)) - return e_cal_modify_object ( - client, icalcomp, CALOBJ_MOD_ALL, NULL); + if (e_cal_client_get_object_sync (client, uid, NULL, &tmp_icalcomp, NULL, NULL)) + return e_cal_client_modify_object_sync ( + client, icalcomp, CALOBJ_MOD_ALL, NULL, NULL); - return e_cal_create_object (client, icalcomp, &uid, NULL); + if (!e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, NULL)) + return FALSE; + + if (uid) + icalcomponent_set_uid (icalcomp, uid); + + g_free (uid); + + return TRUE; } static gboolean -memo_list_selector_update_objects (ECal *client, +memo_list_selector_update_objects (ECalClient *client, icalcomponent *icalcomp) { icalcomponent *subcomp; @@ -74,14 +82,19 @@ memo_list_selector_update_objects (ECal *client, kind = icalcomponent_isa (subcomp); if (kind == ICAL_VTIMEZONE_COMPONENT) { icaltimezone *zone; + GError *error = NULL; zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - success = e_cal_add_timezone (client, zone, NULL); + success = e_cal_client_add_timezone_sync (client, zone, NULL, &error); icaltimezone_free (zone, 1); - if (!success) + if (!success) { + g_debug ("%s: Failed to add timezone: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return FALSE; + } } else if (kind == ICAL_VJOURNAL_COMPONENT) { success = memo_list_selector_update_single_object ( client, subcomp); @@ -96,9 +109,36 @@ memo_list_selector_update_objects (ECal *client, return TRUE; } +static void +client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + gchar *uid = user_data; + EClient *client = NULL; + GError *error = NULL; + + g_return_if_fail (uid != NULL); + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (error) { + g_debug ("%s: Failed to open memo list: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + if (client) { + if (!e_client_is_readonly (client)) + e_cal_client_remove_object_sync (E_CAL_CLIENT (client), uid, NULL, CALOBJ_MOD_THIS, NULL, NULL); + + g_object_unref (client); + } + + g_free (uid); +} + static gboolean memo_list_selector_process_data (ESourceSelector *selector, - ECal *client, + ECalClient *client, const gchar *source_uid, icalcomponent *icalcomp, GdkDragAction action) @@ -109,7 +149,6 @@ memo_list_selector_process_data (ESourceSelector *selector, const gchar *uid; gchar *old_uid = NULL; gboolean success = FALSE; - gboolean read_only = TRUE; GError *error = NULL; /* FIXME Deal with GDK_ACTION_ASK. */ @@ -123,13 +162,13 @@ memo_list_selector_process_data (ESourceSelector *selector, if (old_uid == NULL) old_uid = g_strdup (uid); - if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, &error)) { + if (e_cal_client_get_object_sync (client, uid, NULL, &tmp_icalcomp, NULL, &error)) { icalcomponent_free (tmp_icalcomp); success = TRUE; goto exit; } - if (error != NULL && error->code != E_CALENDAR_STATUS_OBJECT_NOT_FOUND) { + if (error != NULL && !g_error_matches (error, E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND)) { g_message ( "Failed to search the object in destination " "task list: %s", error->message); @@ -137,6 +176,9 @@ memo_list_selector_process_data (ESourceSelector *selector, goto exit; } + if (error) + g_error_free (error); + success = memo_list_selector_update_objects (client, icalcomp); if (!success || action != GDK_ACTION_MOVE) @@ -148,74 +190,93 @@ memo_list_selector_process_data (ESourceSelector *selector, if (!E_IS_SOURCE (source) || e_source_get_readonly (source)) goto exit; - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL); - if (client == NULL) { - g_message ("Cannot create source client to remove old memo"); - goto exit; - } - - e_cal_is_read_only (client, &read_only, NULL); - if (!read_only && e_cal_open (client, TRUE, NULL)) - e_cal_remove_object (client, old_uid, NULL); - else if (!read_only) - g_message ("Cannot open source client to remove old memo"); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_cb, g_strdup (old_uid)); - g_object_unref (client); - -exit: + exit: g_free (old_uid); return success; } -static gboolean -memo_list_selector_data_dropped (ESourceSelector *selector, - GtkSelectionData *selection_data, - ESource *destination, - GdkDragAction action, - guint info) +struct DropData { - ECal *client; - GSList *list, *iter; - gboolean success = FALSE; + ESourceSelector *selector; + GdkDragAction action; + GSList *list; +}; - client = e_auth_new_cal_from_source ( - destination, E_CAL_SOURCE_TYPE_JOURNAL); +static void +client_opened_for_drop_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + struct DropData *dd = user_data; + EClient *client = NULL; + GError *error = NULL; - if (client == NULL || !e_cal_open (client, TRUE, NULL)) - goto exit; + g_return_if_fail (dd != NULL); - list = cal_comp_selection_get_string_list (selection_data); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; - for (iter = list; iter != NULL; iter = iter->next) { - gchar *source_uid = iter->data; - icalcomponent *icalcomp; - gchar *component_string; + if (error) { + g_debug ("%s: Failed to open memo list: %s", G_STRFUNC, error->message); + g_error_free (error); + } - /* Each string is "source_uid\ncomponent_string". */ - component_string = strchr (source_uid, '\n'); - if (component_string == NULL) - continue; + if (client) { + ECalClient *cal_client = E_CAL_CLIENT (client); + GSList *iter; - *component_string++ = '\0'; - icalcomp = icalparser_parse_string (component_string); - if (icalcomp == NULL) - continue; + for (iter = dd->list; iter != NULL; iter = iter->next) { + gchar *source_uid = iter->data; + icalcomponent *icalcomp; + gchar *component_string; - success = memo_list_selector_process_data ( - selector, client, source_uid, icalcomp, action); + /* Each string is "source_uid\ncomponent_string". */ + component_string = strchr (source_uid, '\n'); + if (component_string == NULL) + continue; - icalcomponent_free (icalcomp); - } + *component_string++ = '\0'; + icalcomp = icalparser_parse_string (component_string); + if (icalcomp == NULL) + continue; + + memo_list_selector_process_data ( + dd->selector, cal_client, source_uid, icalcomp, dd->action); - g_slist_foreach (list, (GFunc) g_free, NULL); - g_slist_free (list); + icalcomponent_free (icalcomp); + } -exit: - if (client != NULL) g_object_unref (client); + } - return success; + g_slist_foreach (dd->list, (GFunc) g_free, NULL); + g_slist_free (dd->list); + g_object_unref (dd->selector); + g_free (dd); +} + +static gboolean +memo_list_selector_data_dropped (ESourceSelector *selector, + GtkSelectionData *selection_data, + ESource *destination, + GdkDragAction action, + guint info) +{ + struct DropData *dd; + + dd = g_new0 (struct DropData, 1); + dd->selector = g_object_ref (selector); + dd->action = action; + dd->list = cal_comp_selection_get_string_list (selection_data); + + e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_for_drop_cb, dd); + + return TRUE; } static void diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c index ab0ce1253d..e6396427da 100644 --- a/calendar/gui/e-memo-table.c +++ b/calendar/gui/e-memo-table.c @@ -155,7 +155,7 @@ static void memo_table_model_cal_view_progress_cb (EMemoTable *memo_table, const gchar *message, gint progress, - ECalSourceType type) + ECalClientSourceType type) { gdouble percent = (gdouble) progress; @@ -164,9 +164,8 @@ memo_table_model_cal_view_progress_cb (EMemoTable *memo_table, static void memo_table_model_cal_view_complete_cb ( EMemoTable *memo_table, - ECalendarStatus status, - const gchar *error_msg, - ECalSourceType type) + const GError *error, + ECalClientSourceType type) { memo_table_emit_status_message (memo_table, NULL, -1.0); } @@ -187,8 +186,8 @@ delete_selected_components (EMemoTable *memo_table) ECalModelComponent *comp_data = (ECalModelComponent *) l->data; GError *error = NULL; - e_cal_remove_object (comp_data->client, - icalcomponent_get_uid (comp_data->icalcomp), &error); + e_cal_client_remove_object_sync (comp_data->client, + icalcomponent_get_uid (comp_data->icalcomp), NULL, CALOBJ_MOD_THIS, NULL, &error); delete_error_dialog (error, E_CAL_COMPONENT_JOURNAL); g_clear_error (&error); } @@ -560,8 +559,8 @@ memo_table_query_tooltip (GtkWidget *widget, e_cal_component_get_icalcomponent (new_comp), dtstart.tzid); if (!zone) - e_cal_get_timezone ( - comp_data->client, dtstart.tzid, &zone, NULL); + e_cal_client_get_timezone_sync ( + comp_data->client, dtstart.tzid, &zone, NULL, NULL); if (!zone) zone = default_zone; } else { @@ -701,12 +700,10 @@ memo_table_update_actions (ESelectable *selectable, n_selected = e_table_selected_count (E_TABLE (memo_table)); list = e_memo_table_get_selected (memo_table); - for (iter = list; iter != NULL; iter = iter->next) { + for (iter = list; iter != NULL && sources_are_editable; iter = iter->next) { ECalModelComponent *comp_data = iter->data; - gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); - sources_are_editable &= !read_only; + sources_are_editable = sources_are_editable && !e_client_is_readonly (E_CLIENT (comp_data->client)); } g_slist_free (list); @@ -826,7 +823,7 @@ clipboard_get_calendar_data (EMemoTable *memo_table, icalcomponent *icalcomp; gchar *uid; ECalComponent *comp; - ECal *client; + ECalClient *client; ECalModel *model; icalcomponent_kind kind; const gchar *status_message; @@ -869,6 +866,7 @@ clipboard_get_calendar_data (EMemoTable *memo_table, child_kind == ICAL_VTODO_COMPONENT || child_kind == ICAL_VJOURNAL_COMPONENT) { ECalComponent *tmp_comp; + GError *error = NULL; uid = e_cal_component_gen_uid (); tmp_comp = e_cal_component_new (); @@ -876,31 +874,45 @@ clipboard_get_calendar_data (EMemoTable *memo_table, tmp_comp, icalcomponent_new_clone (subcomp)); e_cal_component_set_uid (tmp_comp, uid); - free (uid); + g_free (uid); + uid = NULL; /* FIXME Should we convert start/due/complete * times? Also, need error handling.*/ - e_cal_create_object ( - client, e_cal_component_get_icalcomponent (tmp_comp), - NULL, NULL); + if (!e_cal_client_create_object_sync (client, e_cal_component_get_icalcomponent (tmp_comp), &uid, NULL, &error)) + uid = NULL; + g_free (uid); g_object_unref (tmp_comp); + + if (error) { + g_debug ("%s: Failed to create object: %s", G_STRFUNC, error->message); + g_error_free (error); + } } subcomp = icalcomponent_get_next_component ( vcal_comp, ICAL_ANY_COMPONENT); } } else { + GError *error = NULL; + comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomp); uid = e_cal_component_gen_uid (); e_cal_component_set_uid (comp, (const gchar *) uid); - free (uid); + g_free (uid); - e_cal_create_object ( - client, e_cal_component_get_icalcomponent (comp), - NULL, NULL); + uid = NULL; + if (!e_cal_client_create_object_sync (client, e_cal_component_get_icalcomponent (comp), &uid, NULL, &error)) + uid = NULL; + g_free (uid); g_object_unref (comp); + + if (error) { + g_debug ("%s: Failed to create object: %s", G_STRFUNC, error->message); + g_error_free (error); + } } memo_table_emit_status_message (memo_table, NULL, -1.0); diff --git a/calendar/gui/e-task-list-selector.c b/calendar/gui/e-task-list-selector.c index 6967648b1f..9d1fb5cb99 100644 --- a/calendar/gui/e-task-list-selector.c +++ b/calendar/gui/e-task-list-selector.c @@ -25,9 +25,9 @@ #include "e-task-list-selector.h" #include <string.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-selection.h" -#include "calendar/common/authentication.h" #include "calendar/gui/comp-util.h" struct _ETaskListSelectorPrivate { @@ -37,23 +37,31 @@ struct _ETaskListSelectorPrivate { static gpointer parent_class; static gboolean -task_list_selector_update_single_object (ECal *client, +task_list_selector_update_single_object (ECalClient *client, icalcomponent *icalcomp) { - gchar *uid; + gchar *uid = NULL; icalcomponent *tmp_icalcomp; uid = (gchar *) icalcomponent_get_uid (icalcomp); - if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, NULL)) - return e_cal_modify_object ( - client, icalcomp, CALOBJ_MOD_ALL, NULL); + if (e_cal_client_get_object_sync (client, uid, NULL, &tmp_icalcomp, NULL, NULL)) + return e_cal_client_modify_object_sync ( + client, icalcomp, CALOBJ_MOD_ALL, NULL, NULL); - return e_cal_create_object (client, icalcomp, &uid, NULL); + if (!e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, NULL)) + return FALSE; + + if (uid) + icalcomponent_set_uid (icalcomp, uid); + + g_free (uid); + + return TRUE; } static gboolean -task_list_selector_update_objects (ECal *client, +task_list_selector_update_objects (ECalClient *client, icalcomponent *icalcomp) { icalcomponent *subcomp; @@ -74,14 +82,19 @@ task_list_selector_update_objects (ECal *client, kind = icalcomponent_isa (subcomp); if (kind == ICAL_VTIMEZONE_COMPONENT) { icaltimezone *zone; + GError *error = NULL; zone = icaltimezone_new (); icaltimezone_set_component (zone, subcomp); - success = e_cal_add_timezone (client, zone, NULL); + success = e_cal_client_add_timezone_sync (client, zone, NULL, &error); icaltimezone_free (zone, 1); - if (!success) + if (!success) { + g_debug ("%s: Failed to add timezone: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return FALSE; + } } else if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT) { success = task_list_selector_update_single_object ( @@ -97,9 +110,36 @@ task_list_selector_update_objects (ECal *client, return TRUE; } +static void +client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + gchar *uid = user_data; + EClient *client = NULL; + GError *error = NULL; + + g_return_if_fail (uid != NULL); + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (error) { + g_debug ("%s: Failed to open task list: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + if (client) { + if (!e_client_is_readonly (client)) + e_cal_client_remove_object_sync (E_CAL_CLIENT (client), uid, NULL, CALOBJ_MOD_THIS, NULL, NULL); + + g_object_unref (client); + } + + g_free (uid); +} + static gboolean task_list_selector_process_data (ESourceSelector *selector, - ECal *client, + ECalClient *client, const gchar *source_uid, icalcomponent *icalcomp, GdkDragAction action) @@ -110,7 +150,6 @@ task_list_selector_process_data (ESourceSelector *selector, const gchar *uid; gchar *old_uid = NULL; gboolean success = FALSE; - gboolean read_only = TRUE; GError *error = NULL; /* FIXME Deal with GDK_ACTION_ASK. */ @@ -124,13 +163,13 @@ task_list_selector_process_data (ESourceSelector *selector, if (old_uid == NULL) old_uid = g_strdup (uid); - if (e_cal_get_object (client, uid, NULL, &tmp_icalcomp, &error)) { + if (e_cal_client_get_object_sync (client, uid, NULL, &tmp_icalcomp, NULL, &error)) { icalcomponent_free (tmp_icalcomp); success = TRUE; goto exit; } - if (error != NULL && error->code != E_CALENDAR_STATUS_OBJECT_NOT_FOUND) { + if (error != NULL && !g_error_matches (error, E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND)) { g_message ( "Failed to search the object in destination " "task list: %s", error->message); @@ -138,6 +177,10 @@ task_list_selector_process_data (ESourceSelector *selector, goto exit; } + if (error) + g_error_free (error); + error = NULL; + success = task_list_selector_update_objects (client, icalcomp); if (!success || action != GDK_ACTION_MOVE) @@ -149,74 +192,93 @@ task_list_selector_process_data (ESourceSelector *selector, if (!E_IS_SOURCE (source) || e_source_get_readonly (source)) goto exit; - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO); - if (client == NULL) { - g_message ("Cannot create source client to remove old task"); - goto exit; - } - - e_cal_is_read_only (client, &read_only, NULL); - if (!read_only && e_cal_open (client, TRUE, NULL)) - e_cal_remove_object (client, old_uid, NULL); - else if (!read_only) - g_message ("Cannot open source client to remove old task"); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, TRUE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_cb, g_strdup (old_uid)); - g_object_unref (client); - -exit: + exit: g_free (old_uid); return success; } -static gboolean -task_list_selector_data_dropped (ESourceSelector *selector, - GtkSelectionData *selection_data, - ESource *destination, - GdkDragAction action, - guint info) +struct DropData { - ECal *client; - GSList *list, *iter; - gboolean success = FALSE; + ESourceSelector *selector; + GdkDragAction action; + GSList *list; +}; - client = e_auth_new_cal_from_source ( - destination, E_CAL_SOURCE_TYPE_TODO); +static void +client_opened_for_drop_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + struct DropData *dd = user_data; + EClient *client = NULL; + GError *error = NULL; - if (client == NULL || !e_cal_open (client, TRUE, NULL)) - goto exit; + g_return_if_fail (dd != NULL); - list = cal_comp_selection_get_string_list (selection_data); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; - for (iter = list; iter != NULL; iter = iter->next) { - gchar *source_uid = iter->data; - icalcomponent *icalcomp; - gchar *component_string; + if (error) { + g_debug ("%s: Failed to open task list: %s", G_STRFUNC, error->message); + g_error_free (error); + } - /* Each string is "source_uid\ncomponent_string". */ - component_string = strchr (source_uid, '\n'); - if (component_string == NULL) - continue; + if (client) { + ECalClient *cal_client = E_CAL_CLIENT (client); + GSList *iter; - *component_string++ = '\0'; - icalcomp = icalparser_parse_string (component_string); - if (icalcomp == NULL) - continue; + for (iter = dd->list; iter != NULL; iter = iter->next) { + gchar *source_uid = iter->data; + icalcomponent *icalcomp; + gchar *component_string; - success = task_list_selector_process_data ( - selector, client, source_uid, icalcomp, action); + /* Each string is "source_uid\ncomponent_string". */ + component_string = strchr (source_uid, '\n'); + if (component_string == NULL) + continue; - icalcomponent_free (icalcomp); - } + *component_string++ = '\0'; + icalcomp = icalparser_parse_string (component_string); + if (icalcomp == NULL) + continue; + + task_list_selector_process_data ( + dd->selector, cal_client, source_uid, icalcomp, dd->action); - g_slist_foreach (list, (GFunc) g_free, NULL); - g_slist_free (list); + icalcomponent_free (icalcomp); + } -exit: - if (client != NULL) g_object_unref (client); + } - return success; + g_slist_foreach (dd->list, (GFunc) g_free, NULL); + g_slist_free (dd->list); + g_object_unref (dd->selector); + g_free (dd); +} + +static gboolean +task_list_selector_data_dropped (ESourceSelector *selector, + GtkSelectionData *selection_data, + ESource *destination, + GdkDragAction action, + guint info) +{ + struct DropData *dd; + + dd = g_new0 (struct DropData, 1); + dd->selector = g_object_ref (selector); + dd->action = action; + dd->list = cal_comp_selection_get_string_list (selection_data); + + e_client_utils_open_new (destination, E_CLIENT_SOURCE_TYPE_TASKS, TRUE, NULL, + e_client_utils_authenticate_handler, NULL, + client_opened_for_drop_cb, dd); + + return TRUE; } static void diff --git a/calendar/gui/e-task-table.c b/calendar/gui/e-task-table.c index 540ce1cc63..38b1d9ece5 100644 --- a/calendar/gui/e-task-table.c +++ b/calendar/gui/e-task-table.c @@ -233,7 +233,7 @@ static void task_table_model_cal_view_progress_cb (ETaskTable *task_table, const gchar *message, gint progress, - ECalSourceType type) + ECalClientSourceType type) { gdouble percent = (gdouble) progress; @@ -242,9 +242,8 @@ task_table_model_cal_view_progress_cb (ETaskTable *task_table, static void task_table_model_cal_view_complete_cb ( ETaskTable *task_table, - ECalendarStatus status, - const gchar *error_msg, - ECalSourceType type) + const GError *error, + ECalClientSourceType type) { task_table_emit_status_message (task_table, NULL, -1.0); } @@ -265,8 +264,7 @@ delete_selected_components (ETaskTable *task_table) ECalModelComponent *comp_data = (ECalModelComponent *) l->data; GError *error = NULL; - e_cal_remove_object (comp_data->client, - icalcomponent_get_uid (comp_data->icalcomp), &error); + e_cal_client_remove_object_sync (comp_data->client, icalcomponent_get_uid (comp_data->icalcomp), NULL, CALOBJ_MOD_THIS, NULL, &error); delete_error_dialog (error, E_CAL_COMPONENT_TODO); g_clear_error (&error); } @@ -782,8 +780,8 @@ task_table_query_tooltip (GtkWidget *widget, e_cal_component_get_icalcomponent (new_comp), dtstart.tzid); if (!zone) - e_cal_get_timezone ( - comp_data->client, dtstart.tzid, &zone, NULL); + e_cal_client_get_timezone_sync ( + comp_data->client, dtstart.tzid, &zone, NULL, NULL); if (!zone) zone = default_zone; } else { @@ -932,12 +930,10 @@ task_table_update_actions (ESelectable *selectable, n_selected = e_table_selected_count (E_TABLE (task_table)); list = e_task_table_get_selected (task_table); - for (iter = list; iter != NULL; iter = iter->next) { + for (iter = list; iter != NULL && sources_are_editable; iter = iter->next) { ECalModelComponent *comp_data = iter->data; - gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); - sources_are_editable &= !read_only; + sources_are_editable = sources_are_editable && !e_client_is_readonly (E_CLIENT (comp_data->client)); } g_slist_free (list); @@ -1058,7 +1054,7 @@ clipboard_get_calendar_data (ETaskTable *task_table, gchar *uid; ECalComponent *comp; ECalModel *model; - ECal *client; + ECalClient *client; icalcomponent_kind kind; const gchar *status_message; @@ -1100,6 +1096,7 @@ clipboard_get_calendar_data (ETaskTable *task_table, child_kind == ICAL_VTODO_COMPONENT || child_kind == ICAL_VJOURNAL_COMPONENT) { ECalComponent *tmp_comp; + GError *error = NULL; uid = e_cal_component_gen_uid (); tmp_comp = e_cal_component_new (); @@ -1107,31 +1104,45 @@ clipboard_get_calendar_data (ETaskTable *task_table, tmp_comp, icalcomponent_new_clone (subcomp)); e_cal_component_set_uid (tmp_comp, uid); - free (uid); + g_free (uid); + uid = NULL; /* FIXME should we convert start/due/complete * times? Also, need error handling. */ - e_cal_create_object ( - client, e_cal_component_get_icalcomponent (tmp_comp), - NULL, NULL); + if (!e_cal_client_create_object_sync (client, e_cal_component_get_icalcomponent (tmp_comp), &uid, NULL, &error)) + uid = NULL; + + if (error) { + g_debug ("%s: Failed to create object: %s", G_STRFUNC, error->message); + g_error_free (error); + } g_object_unref (tmp_comp); + g_free (uid); } subcomp = icalcomponent_get_next_component ( vcal_comp, ICAL_ANY_COMPONENT); } } else { + GError *error = NULL; + comp = e_cal_component_new (); e_cal_component_set_icalcomponent (comp, icalcomp); uid = e_cal_component_gen_uid (); e_cal_component_set_uid (comp, (const gchar *) uid); - free (uid); + g_free (uid); + uid = NULL; - e_cal_create_object ( - client, e_cal_component_get_icalcomponent (comp), - NULL, NULL); + if (!e_cal_client_create_object_sync (client, e_cal_component_get_icalcomponent (comp), &uid, NULL, &error)) + uid = NULL; + + if (error) { + g_debug ("%s: Failed to create object: %s", G_STRFUNC, error->message); + g_error_free (error); + } g_object_unref (comp); + g_free (uid); } task_table_emit_status_message (task_table, NULL, -1.0); @@ -1228,7 +1239,7 @@ add_retract_data (ECalComponent *comp, const gchar *retract_comment) } static gboolean -check_for_retract (ECalComponent *comp, ECal *client) +check_for_retract (ECalComponent *comp, ECalClient *client) { ECalComponentOrganizer org; gchar *email = NULL; @@ -1238,15 +1249,15 @@ check_for_retract (ECalComponent *comp, ECal *client) if (!e_cal_component_has_attendees (comp)) return FALSE; - if (!e_cal_get_save_schedules (client)) + if (!e_cal_client_check_save_schedules (client)) return FALSE; e_cal_component_get_organizer (comp, &org); strip = itip_strip_mailto (org.value); ret_val = - e_cal_get_cal_address (client, &email, NULL) && - g_ascii_strcasecmp (email, strip) == 0; + e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &email, NULL, NULL) && + email && g_ascii_strcasecmp (email, strip) == 0; g_free (email); @@ -1292,14 +1303,13 @@ task_table_delete_selection (ESelectable *selectable) comp, &retract_comment, GTK_WIDGET (task_table), &retract); if (retract) { - GList *users = NULL; + GSList *users = NULL; icalcomponent *icalcomp = NULL, *mod_comp = NULL; add_retract_data (comp, retract_comment); icalcomp = e_cal_component_get_icalcomponent (comp); icalcomponent_set_method (icalcomp, ICAL_METHOD_CANCEL); - if (!e_cal_send_objects (comp_data->client, icalcomp, &users, - &mod_comp, &error)) { + if (!e_cal_client_send_objects_sync (comp_data->client, icalcomp, &users, &mod_comp, NULL, &error)) { delete_error_dialog (error, E_CAL_COMPONENT_TODO); g_clear_error (&error); error = NULL; @@ -1309,8 +1319,8 @@ task_table_delete_selection (ESelectable *selectable) icalcomponent_free (mod_comp); if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } } @@ -1596,17 +1606,21 @@ hide_completed_rows (ECalModel *model, gchar *hide_sexp, GPtrArray *comp_objects) { - GList *l, *m, *objects; - ECal *client; + GList *l; + GSList *m, *objects; + ECalClient *client; gint pos; gboolean changed = FALSE; for (l = clients_list; l != NULL; l = l->next) { - client = l->data; + GError *error = NULL; - if (!e_cal_get_object_list (client, hide_sexp, &objects, NULL)) { - g_warning (G_STRLOC ": Could not get the objects"); + client = l->data; + if (!e_cal_client_get_object_list_sync (client, hide_sexp, &objects, NULL, &error)) { + g_debug ("%s: Could not get the objects: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); continue; } @@ -1635,8 +1649,8 @@ hide_completed_rows (ECalModel *model, g_object_unref (comp); } - g_list_foreach (objects, (GFunc) icalcomponent_free, NULL); - g_list_free (objects); + g_slist_foreach (objects, (GFunc) icalcomponent_free, NULL); + g_slist_free (objects); } if (changed) { @@ -1652,15 +1666,19 @@ show_completed_rows (ECalModel *model, gchar *show_sexp, GPtrArray *comp_objects) { - GList *l, *m, *objects; - ECal *client; + GList *l; + GSList *m, *objects; + ECalClient *client; for (l = clients_list; l != NULL; l = l->next) { - client = l->data; + GError *error = NULL; - if (!e_cal_get_object_list (client, show_sexp, &objects, NULL)) { - g_warning (G_STRLOC ": Could not get the objects"); + client = l->data; + if (!e_cal_client_get_object_list_sync (client, show_sexp, &objects, NULL, &error)) { + g_debug ("%s: Could not get the objects: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); continue; } @@ -1697,6 +1715,9 @@ show_completed_rows (ECalModel *model, e_cal_component_free_id (id); g_object_unref (comp); } + + g_slist_foreach (objects, (GFunc) icalcomponent_free, NULL); + g_slist_free (objects); } } diff --git a/calendar/gui/e-timezone-entry.h b/calendar/gui/e-timezone-entry.h index 6c0cd1dc6b..59d2c00cb1 100644 --- a/calendar/gui/e-timezone-entry.h +++ b/calendar/gui/e-timezone-entry.h @@ -33,7 +33,7 @@ #define E_TIMEZONE_ENTRY_H #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> /* Standard GObject macros */ #define E_TYPE_TIMEZONE_ENTRY \ diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index d6f430f2a1..47f03a9fa2 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -148,7 +148,7 @@ static void e_week_view_on_editing_started (EWeekView *week_view, static void e_week_view_on_editing_stopped (EWeekView *week_view, GnomeCanvasItem *item); static gboolean e_week_view_find_event_from_uid (EWeekView *week_view, - ECal *client, + ECalClient *client, const gchar *uid, const gchar *rid, gint *event_num_return); @@ -708,7 +708,6 @@ e_week_view_init (EWeekView *week_view) gtk_widget_set_can_focus (GTK_WIDGET (week_view), TRUE); - week_view->query = NULL; week_view->event_destroyed = FALSE; week_view->events = g_array_new (FALSE, FALSE, sizeof (EWeekViewEvent)); @@ -875,13 +874,6 @@ e_week_view_dispose (GObject *object) week_view->events = NULL; } - if (week_view->query) { - g_signal_handlers_disconnect_matched (week_view->query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, week_view); - g_object_unref (week_view->query); - week_view->query = NULL; - } - if (week_view->small_font_desc) { pango_font_description_free (week_view->small_font_desc); week_view->small_font_desc = NULL; @@ -3018,7 +3010,7 @@ tooltip_event_cb (GnomeCanvasItem *item, } static const gchar * -get_comp_summary (ECal *ecal, icalcomponent *icalcomp, gboolean *free_text) +get_comp_summary (ECalClient *client, icalcomponent *icalcomp, gboolean *free_text) { const gchar *my_summary, *location; const gchar *summary; @@ -3026,7 +3018,7 @@ get_comp_summary (ECal *ecal, icalcomponent *icalcomp, gboolean *free_text) g_return_val_if_fail (icalcomp != NULL && free_text != NULL, NULL); - my_summary = e_calendar_view_get_icalcomponent_summary (ecal, icalcomp, &my_free_text); + my_summary = e_calendar_view_get_icalcomponent_summary (client, icalcomp, &my_free_text); location = icalcomponent_get_location (icalcomp); if (location && *location) { @@ -3172,7 +3164,7 @@ e_week_view_reshape_event_span (EWeekView *week_view, if (free_text) g_free ((gchar *) summary); - if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) + if (e_client_check_capability (E_CLIENT (event->comp_data->client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING) && e_cal_util_component_has_attendee (event->comp_data->icalcomp)) { set_text_as_bold (event, span); } @@ -3335,7 +3327,6 @@ e_week_view_start_editing_event (EWeekView *week_view, ETextEventProcessor *event_processor = NULL; ETextEventProcessorCommand command; ECalModelComponent *comp_data; - gboolean read_only; /* If we are already editing the event, just return. */ if (event_num == week_view->editing_event_num @@ -3356,7 +3347,7 @@ e_week_view_start_editing_event (EWeekView *week_view, span = &g_array_index (week_view->spans, EWeekViewEventSpan, event->spans_index + span_num); - if (!e_cal_is_read_only (event->comp_data->client, &read_only, NULL) || read_only) + if (e_client_is_readonly (E_CLIENT (event->comp_data->client))) return FALSE; /* If the event is not shown, don't try to edit it. */ @@ -3814,7 +3805,7 @@ e_week_view_change_event_time (EWeekView *week_view, time_t start_dt, time_t end ECalComponent *comp; ECalComponentDateTime date; struct icaltimetype itt; - ECal *client; + ECalClient *client; CalObjModType mod = CALOBJ_MOD_ALL; GtkWindow *toplevel; @@ -3924,7 +3915,7 @@ e_week_view_on_editing_stopped (EWeekView *week_view, gchar *text = NULL; ECalComponent *comp; ECalComponentText summary; - ECal *client; + ECalClient *client; const gchar *uid; gboolean on_server; @@ -4003,11 +3994,24 @@ e_week_view_on_editing_stopped (EWeekView *week_view, e_cal_component_commit_sequence (comp); if (!on_server) { - if (!e_cal_create_object (client, icalcomp, NULL, NULL)) - g_message (G_STRLOC ": Could not create the object!"); - else + gchar *uid = NULL; + GError *error = NULL; + + if (!e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, &error)) { + g_message (G_STRLOC ": Could not create the object! %s", error ? error->message : "Unknown error"); + uid = NULL; + } else { + if (uid) + icalcomponent_set_uid (icalcomp, uid); + e_calendar_view_emit_user_created ( E_CALENDAR_VIEW (week_view)); + } + + if (uid) + g_free (uid); + if (error) + g_error_free (error); /* we remove the object since we either got the update from the server or failed */ e_week_view_remove_event_cb (week_view, event_num, NULL); @@ -4130,7 +4134,7 @@ e_week_view_find_event_from_item (EWeekView *week_view, see if any events with the uid exist. */ static gboolean e_week_view_find_event_from_uid (EWeekView *week_view, - ECal *client, + ECalClient *client, const gchar *uid, const gchar *rid, gint *event_num_return) @@ -4256,7 +4260,7 @@ e_week_view_cursor_key_right (EWeekView *week_view) static gboolean e_week_view_add_new_event_in_selected_range (EWeekView *week_view, const gchar *initial_text) { - ECal *ecal; + ECalClient *client; ECalModel *model; ECalComponent *comp; icalcomponent *icalcomp; @@ -4266,14 +4270,13 @@ e_week_view_add_new_event_in_selected_range (EWeekView *week_view, const gchar * time_t dtstart, dtend; const gchar *uid; AddEventData add_event_data; - gboolean read_only = TRUE; EWeekViewEvent *wvevent; EWeekViewEventSpan *span; /* Check if the client is read only */ model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)); - ecal = e_cal_model_get_default_client (model); - if (!e_cal_is_read_only (ecal, &read_only, NULL) || read_only) + client = e_cal_model_get_default_client (model); + if (e_client_is_readonly (E_CLIENT (client))) return FALSE; /* Add a new event covering the selected range. */ @@ -4316,7 +4319,7 @@ e_week_view_add_new_event_in_selected_range (EWeekView *week_view, const gchar * e_week_view_check_layout (week_view); gtk_widget_queue_draw (week_view->main_canvas); - if (!e_week_view_find_event_from_uid (week_view, ecal, uid, NULL, &event_num)) { + if (!e_week_view_find_event_from_uid (week_view, client, uid, NULL, &event_num)) { g_warning ("Couldn't find event to start editing.\n"); g_object_unref (comp); return FALSE; diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index 3f65149f19..9525b87c02 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -185,9 +185,6 @@ struct _EWeekView { GtkWidget *vscrollbar; - /* The query object */ - ECalView *query; - /* The array of EWeekViewEvent elements. */ GArray *events; gboolean events_sorted; diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index ffbc449584..78721bf214 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -38,7 +38,9 @@ #include <libedataserver/e-categories.h> #include <libedataserver/e-url.h> #include <libedataserverui/e-passwords.h> +#include <libedataserverui/e-client-utils.h> +#include <libecal/e-cal-client-view.h> #include <libecal/e-cal-time-util.h> #include <widgets/menus/gal-view-factory-etable.h> #include <widgets/menus/gal-view-etable.h> @@ -63,7 +65,6 @@ #include "tag-calendar.h" #include "misc.h" #include "ea-calendar.h" -#include "common/authentication.h" #include "e-memo-table.h" #include "e-task-table.h" @@ -290,7 +291,7 @@ static void view_progress_cb (ECalModel *model, const gchar *message, gint percent, - ECalSourceType type, + ECalClientSourceType type, GnomeCalendar *gcal) { gcal_update_status_message (gcal, message, percent); @@ -298,9 +299,8 @@ view_progress_cb (ECalModel *model, static void view_complete_cb (ECalModel *model, - ECalendarStatus status, - const gchar *error_msg, - ECalSourceType type, + const GError *error, + ECalClientSourceType type, GnomeCalendar *gcal) { gcal_update_status_message (gcal, NULL, -1); @@ -752,11 +752,11 @@ ensure_dates_are_in_default_zone (GnomeCalendar *gcal, /* Callback used when the calendar query reports of an updated object */ static void -dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data) +dn_client_view_objects_added_cb (ECalClientView *view, const GSList *objects, gpointer data) { GnomeCalendar *gcal; GnomeCalendarPrivate *priv; - GList *l; + const GSList *l; gcal = GNOME_CALENDAR (data); priv = gcal->priv; @@ -774,14 +774,14 @@ dn_e_cal_view_objects_added_cb (ECalView *query, GList *objects, gpointer data) tag_calendar_by_comp ( priv->date_navigator, comp, - e_cal_view_get_client (query), + e_cal_client_view_get_client (view), NULL, FALSE, TRUE, TRUE); g_object_unref (comp); } } static void -dn_e_cal_view_objects_modified_cb (ECalView *query, GList *objects, gpointer data) +dn_client_view_objects_modified_cb (ECalClientView *view, const GSList *objects, gpointer data) { GnomeCalendar *gcal; @@ -796,7 +796,7 @@ dn_e_cal_view_objects_modified_cb (ECalView *query, GList *objects, gpointer dat /* Callback used when the calendar query reports of a removed object */ static void -dn_e_cal_view_objects_removed_cb (ECalView *query, GList *ids, gpointer data) +dn_client_view_objects_removed_cb (ECalClientView *view, const GSList *ids, gpointer data) { GnomeCalendar *gcal; @@ -808,17 +808,11 @@ dn_e_cal_view_objects_removed_cb (ECalView *query, GList *ids, gpointer data) /* Callback used when the calendar query is done */ static void -dn_e_cal_view_complete_cb (ECalView *query, - ECalendarStatus status, - const gchar *error_msg, - gpointer data) +dn_client_view_complete_cb (ECalClientView *query, const GError *error, gpointer data) { /* FIXME Better error reporting */ - if (status != E_CALENDAR_STATUS_OK) - g_warning ( - G_STRLOC ": Query did not successfully complete, " - "code: %d (%s)", status, error_msg ? error_msg : - "Unknown error"); + if (error) + g_debug ("%s: Query did not complete successfully: %s", G_STRFUNC, error->message); } ECalendarView * @@ -1009,7 +1003,7 @@ get_date_navigator_range (GnomeCalendar *gcal, time_t *start_time, time_t *end_t /* Adjusts a given query sexp with the time range of the date navigator */ static gchar * -adjust_e_cal_view_sexp (GnomeCalendar *gcal, const gchar *sexp) +adjust_client_view_sexp (GnomeCalendar *gcal, const gchar *sexp) { time_t start_time, end_time; gchar *start, *end; @@ -1058,9 +1052,7 @@ free_dn_queries (GnomeCalendar *gcal) for (l = priv->dn_queries; l != NULL; l = l->next) { if (!l->data) continue; - g_signal_handlers_disconnect_matched ( - l->data, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, gcal); + g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, gcal); g_object_unref (l->data); } @@ -1075,7 +1067,7 @@ update_query_async (struct _date_query_msg *msg) { GnomeCalendar *gcal = msg->gcal; GnomeCalendarPrivate *priv; - ECalView *new_query; + ECalClientView *new_view; gchar *real_sexp; GList *list, *iter; @@ -1086,7 +1078,7 @@ update_query_async (struct _date_query_msg *msg) g_return_if_fail (priv->sexp != NULL); - real_sexp = adjust_e_cal_view_sexp (gcal, priv->sexp); + real_sexp = adjust_client_view_sexp (gcal, priv->sexp); if (!real_sexp) { return; /* No time range is set, so don't start a query */ } @@ -1096,19 +1088,19 @@ update_query_async (struct _date_query_msg *msg) /* create queries for each loaded client */ for (iter = list; iter != NULL; iter = iter->next) { - ECal *client = E_CAL (iter->data); + ECalClient *client = E_CAL_CLIENT (iter->data); GError *error = NULL; gint tries = 0; /* don't create queries for clients not loaded yet */ - if (e_cal_get_load_state (client) != E_CAL_LOAD_LOADED) + if (!e_client_is_opened (E_CLIENT (client))) continue; -try_again: - new_query = NULL; - if (!e_cal_get_query (client, real_sexp, &new_query, &error)) { + try_again: + new_view = NULL; + if (!e_cal_client_get_view_sync (client, real_sexp, &new_view, NULL, &error)) { /* If calendar is busy try again for 3 times. */ - if (error->code == E_CALENDAR_STATUS_BUSY && tries != 10) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_BUSY) && tries != 10) { tries++; /*TODO chose an optimal value */ g_usleep (500); @@ -1117,24 +1109,28 @@ try_again: goto try_again; } - g_warning (G_STRLOC ": Could not create the query: %s ", error->message); + g_warning (G_STRLOC ": Could not create the view: %s ", error->message); g_clear_error (&error); continue; } - g_signal_connect (new_query, "objects_added", - G_CALLBACK (dn_e_cal_view_objects_added_cb), gcal); - g_signal_connect (new_query, "objects_modified", - G_CALLBACK (dn_e_cal_view_objects_modified_cb), gcal); - g_signal_connect (new_query, "objects_removed", - G_CALLBACK (dn_e_cal_view_objects_removed_cb), gcal); - g_signal_connect (new_query, "view_complete", - G_CALLBACK (dn_e_cal_view_complete_cb), gcal); + g_signal_connect (new_view, "objects-added", + G_CALLBACK (dn_client_view_objects_added_cb), gcal); + g_signal_connect (new_view, "objects-modified", + G_CALLBACK (dn_client_view_objects_modified_cb), gcal); + g_signal_connect (new_view, "objects-removed", + G_CALLBACK (dn_client_view_objects_removed_cb), gcal); + g_signal_connect (new_view, "complete", + G_CALLBACK (dn_client_view_complete_cb), gcal); g_mutex_lock (priv->dn_query_lock); - priv->dn_queries = g_list_append (priv->dn_queries, new_query); - e_cal_view_start (new_query); + priv->dn_queries = g_list_append (priv->dn_queries, new_view); + e_cal_client_view_start (new_view, &error); + if (error) { + g_debug ("%s: Failed to start view: %s", G_STRFUNC, error->message); + g_clear_error (&error); + } g_mutex_unlock (priv->dn_query_lock); } @@ -2221,15 +2217,17 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than) /* FIXME Confirm expunge */ clients = e_cal_model_get_client_list (gnome_calendar_get_model (gcal)); for (l = clients; l != NULL; l = l->next) { - ECal *client = l->data; - GList *objects, *m; - gboolean read_only; + ECalClient *client = l->data; + GSList *objects, *m; + GError *error = NULL; - if (!e_cal_is_read_only (client, &read_only, NULL) || read_only) + if (e_client_is_readonly (E_CLIENT (client))) continue; - if (!e_cal_get_object_list (client, sexp, &objects, NULL)) { - g_warning (G_STRLOC ": Could not get the objects"); + if (!e_cal_client_get_object_list_sync (client, sexp, &objects, NULL, &error)) { + g_warning (G_STRLOC ": Could not get the objects: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); continue; } @@ -2240,16 +2238,15 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than) /* FIXME write occur-before and occur-after * sexp funcs so we don't have to use the max * gint */ - if (!e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { + if (!e_cal_client_check_recurrences_no_master (client)) { struct purge_data pd; pd.remove = TRUE; pd.older_than = older_than; - e_cal_generate_instances_for_object (client, m->data, + e_cal_client_generate_instances_for_object (client, m->data, older_than, G_MAXINT32, - (ECalRecurInstanceFn) check_instance_cb, + check_instance_cb, &pd); remove = pd.remove; @@ -2270,23 +2267,21 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than) if (!icaltime_is_null_time (recur_id) ) rid = icaltime_as_ical_string_r (recur_id); - e_cal_remove_object_with_mod ( - client, uid, rid, - CALOBJ_MOD_ALL, &error); + e_cal_client_remove_object_sync (client, uid, rid, CALOBJ_MOD_ALL, NULL, &error); g_free (rid); } else { - e_cal_remove_object (client, uid, &error); + e_cal_client_remove_object_sync (client, uid, NULL, CALOBJ_MOD_THIS, NULL, &error); } if (error) { - g_warning ("Unable to purge events %s \n", error->message); + g_debug ("%s: Unable to purge events: %s", G_STRFUNC, error->message); g_error_free (error); } } } - g_list_foreach (objects, (GFunc) icalcomponent_free, NULL); - g_list_free (objects); + g_slist_foreach (objects, (GFunc) icalcomponent_free, NULL); + g_slist_free (objects); } g_list_free (clients); diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h index 92f6f3ad36..6657b8efe3 100644 --- a/calendar/gui/gnome-cal.h +++ b/calendar/gui/gnome-cal.h @@ -30,7 +30,7 @@ #include <time.h> #include <gtk/gtk.h> #include <misc/e-calendar.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include "e-cal-model.h" diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c index 4d56645b38..d095d4ecbe 100644 --- a/calendar/gui/itip-utils.c +++ b/calendar/gui/itip-utils.c @@ -157,14 +157,14 @@ itip_address_is_user (const gchar *address) gboolean itip_organizer_is_user (ECalComponent *comp, - ECal *client) + ECalClient *cal_client) { - return itip_organizer_is_user_ex (comp, client, FALSE); + return itip_organizer_is_user_ex (comp, cal_client, FALSE); } gboolean itip_organizer_is_user_ex (ECalComponent *comp, - ECal *client, + ECalClient *cal_client, gboolean skip_cap_test) { ECalComponentOrganizer organizer; @@ -172,8 +172,8 @@ itip_organizer_is_user_ex (ECalComponent *comp, gboolean user_org = FALSE; if (!e_cal_component_has_organizer (comp) || - (!skip_cap_test && e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_NO_ORGANIZER))) + (!skip_cap_test && e_client_check_capability ( + E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_NO_ORGANIZER))) return FALSE; e_cal_component_get_organizer (comp, &organizer); @@ -181,11 +181,10 @@ itip_organizer_is_user_ex (ECalComponent *comp, strip = itip_strip_mailto (organizer.value); - if (e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) { + if (e_client_check_capability (E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS)) { gchar *email = NULL; - if (e_cal_get_cal_address (client, &email, NULL) && + if (e_client_get_backend_property_sync (E_CLIENT (cal_client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &email, NULL, NULL) && !g_ascii_strcasecmp (email, strip)) { g_free (email); @@ -204,15 +203,15 @@ itip_organizer_is_user_ex (ECalComponent *comp, gboolean itip_sentby_is_user (ECalComponent *comp, - ECal *client) + ECalClient *cal_client) { ECalComponentOrganizer organizer; const gchar *strip; gboolean user_sentby = FALSE; if (!e_cal_component_has_organizer (comp) || - e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_NO_ORGANIZER)) + e_client_check_capability ( + E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_NO_ORGANIZER)) return FALSE; e_cal_component_get_organizer (comp, &organizer); @@ -277,7 +276,7 @@ html_new_lines_for (const gchar *string) gchar * itip_get_comp_attendee (ECalComponent *comp, - ECal *client) + ECalClient *cal_client) { GSList *attendees; EAccountList *al; @@ -289,8 +288,8 @@ itip_get_comp_attendee (ECalComponent *comp, e_cal_component_get_attendee_list (comp, &attendees); al = e_get_account_list (); - if (client) - e_cal_get_cal_address (client, &address, NULL); + if (cal_client) + e_client_get_backend_property_sync (E_CLIENT (cal_client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &address, NULL, NULL); if (address && *address) { attendee = get_attendee (attendees, address); @@ -386,7 +385,7 @@ get_label (struct icaltimetype *tt, typedef struct { GHashTable *tzids; icalcomponent *icomp; - ECal *client; + ECalClient *client; icalcomponent *zones; } ItipUtilTZData; @@ -409,7 +408,7 @@ foreach_tzid_callback (icalparameter *param, gpointer data) if (zone == NULL) zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); if (zone == NULL && tz_data->client != NULL) - e_cal_get_timezone (tz_data->client, tzid, &zone, NULL); + e_cal_client_get_timezone_sync (tz_data->client, tzid, &zone, NULL, NULL); if (zone == NULL) return; @@ -426,7 +425,7 @@ foreach_tzid_callback (icalparameter *param, gpointer data) static icalcomponent * comp_toplevel_with_zones (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, + ECalClient *cal_client, icalcomponent *zones) { icalcomponent *top_level, *icomp; @@ -446,7 +445,7 @@ comp_toplevel_with_zones (ECalComponentItipMethod method, tz_data.tzids = g_hash_table_new (g_str_hash, g_str_equal); tz_data.icomp = top_level; - tz_data.client = client; + tz_data.client = cal_client; tz_data.zones = zones; icalcomponent_foreach_tzid (icomp, foreach_tzid_callback, &tz_data); g_hash_table_destroy (tz_data.tzids); @@ -457,10 +456,10 @@ comp_toplevel_with_zones (ECalComponentItipMethod method, } static gboolean -users_has_attendee (GList *users, +users_has_attendee (const GSList *users, const gchar *address) { - GList *l; + const GSList *l; for (l = users; l != NULL; l = l->next) { if (!g_ascii_strcasecmp (address, l->data)) @@ -525,7 +524,7 @@ comp_from (ECalComponentItipMethod method, static EDestination ** comp_to_list (ECalComponentItipMethod method, ECalComponent *comp, - GList *users, + const GSList *users, gboolean reply_all, const GSList *only_attendees) { @@ -703,7 +702,7 @@ comp_to_list (ECalComponentItipMethod method, break; case E_CAL_COMPONENT_METHOD_PUBLISH: if (users) { - GList *list; + const GSList *list; array = g_ptr_array_new (); @@ -945,19 +944,19 @@ comp_description (ECalComponent *comp, static gboolean comp_server_send (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, + ECalClient *cal_client, icalcomponent *zones, - GList **users) + GSList **users) { icalcomponent *top_level, *returned_icalcomp = NULL; gboolean retval = TRUE; GError *error = NULL; - top_level = comp_toplevel_with_zones (method, comp, client, zones); - if (!e_cal_send_objects (client, top_level, users, &returned_icalcomp, &error)) { + top_level = comp_toplevel_with_zones (method, comp, cal_client, zones); + if (!e_cal_client_send_objects_sync (cal_client, top_level, users, &returned_icalcomp, NULL, &error)) { /* FIXME Really need a book problem status code */ - if (error->code != E_CALENDAR_STATUS_OK) { - if (error->code == E_CALENDAR_STATUS_OBJECT_ID_ALREADY_EXISTS) { + if (error) { + if (g_error_matches (error, E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_OBJECT_ID_ALREADY_EXISTS)) { e_notice ( NULL, GTK_MESSAGE_ERROR, _("Unable to book a resource, the " @@ -1051,7 +1050,7 @@ comp_limit_attendees (ECalComponent *comp) } static void -comp_sentby (ECalComponent *comp, ECal *client) +comp_sentby (ECalComponent *comp, ECalClient *cal_client) { ECalComponentOrganizer organizer; GSList * attendees, *l; @@ -1073,7 +1072,7 @@ comp_sentby (ECalComponent *comp, ECal *client) } e_cal_component_get_attendee_list (comp, &attendees); - user = itip_get_comp_attendee (comp, client); + user = itip_get_comp_attendee (comp, cal_client); for (l = attendees; l; l = l->next) { ECalComponentAttendee *a = l->data; @@ -1086,8 +1085,7 @@ comp_sentby (ECalComponent *comp, ECal *client) } } - if (!itip_organizer_is_user (comp, client) && - !itip_sentby_is_user (comp, client)) { + if (!itip_organizer_is_user (comp, cal_client) && !itip_sentby_is_user (comp, cal_client)) { EAccount *a = e_get_default_account (); organizer.value = g_strdup (organizer.value); @@ -1213,7 +1211,7 @@ strip_x_microsoft_props (ECalComponent *comp) static ECalComponent * comp_compliant (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, + ECalClient *client, icalcomponent *zones, icaltimezone *default_zone, gboolean strip_alarms) @@ -1252,7 +1250,7 @@ comp_compliant (ECalComponentItipMethod method, from_zone = icaltimezone_get_builtin_timezone_from_tzid (dt.tzid); if (from_zone == NULL && client != NULL) /* FIXME Error checking */ - e_cal_get_timezone (client, dt.tzid, &from_zone, NULL); + e_cal_client_get_timezone_sync (client, dt.tzid, &from_zone, NULL, NULL); } to_zone = icaltimezone_get_utc_timezone (); @@ -1420,7 +1418,7 @@ find_enabled_account (EAccountList *accounts, static void setup_from (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, + ECalClient *cal_client, EComposerHeaderTable *table) { EAccountList *accounts; @@ -1430,7 +1428,7 @@ setup_from (ECalComponentItipMethod method, EAccount *account = NULL; /* always use organizer's email when user is an organizer */ - if (itip_organizer_is_user (comp, client)) { + if (itip_organizer_is_user (comp, cal_client)) { ECalComponentOrganizer organizer = {0}; e_cal_component_get_organizer (comp, &organizer); @@ -1458,10 +1456,10 @@ setup_from (ECalComponentItipMethod method, gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *send_comp, - ECal *client, + ECalClient *cal_client, icalcomponent *zones, GSList *attachments_list, - GList *users, + GSList *users, gboolean strip_alarms, gboolean only_new_attendees) { @@ -1490,29 +1488,29 @@ itip_send_comp (ECalComponentItipMethod method, shell_settings, "cal-use-24-hour-format"); /* check whether backend could handle auto-saving requests/updates */ - if (method != E_CAL_COMPONENT_METHOD_PUBLISH && e_cal_get_save_schedules (client)) + if (method != E_CAL_COMPONENT_METHOD_PUBLISH && e_cal_client_check_save_schedules (cal_client)) return TRUE; /* Give the server a chance to manipulate the comp */ if (method != E_CAL_COMPONENT_METHOD_PUBLISH) { - if (!comp_server_send (method, send_comp, client, zones, &users)) + if (!comp_server_send (method, send_comp, cal_client, zones, &users)) goto cleanup; } /* check whether backend could handle sending requests/updates */ if (method != E_CAL_COMPONENT_METHOD_PUBLISH && - e_cal_get_static_capability (client, + e_client_check_capability (E_CLIENT (cal_client), CAL_STATIC_CAPABILITY_CREATE_MESSAGES)) { if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } return TRUE; } /* Tidy up the comp */ comp = comp_compliant ( - method, send_comp, client, zones, default_zone, strip_alarms); + method, send_comp, cal_client, zones, default_zone, strip_alarms); if (comp == NULL) goto cleanup; @@ -1536,7 +1534,7 @@ itip_send_comp (ECalComponentItipMethod method, composer = e_msg_composer_new (shell); table = e_msg_composer_get_header_table (composer); - setup_from (method, send_comp, client, table); + setup_from (method, send_comp, cal_client, table); e_composer_header_table_set_subject (table, subject); e_composer_header_table_set_destinations_to (table, destinations); @@ -1545,7 +1543,7 @@ itip_send_comp (ECalComponentItipMethod method, /* Content type */ content_type = comp_content_type (comp, method); - top_level = comp_toplevel_with_zones (method, comp, client, zones); + top_level = comp_toplevel_with_zones (method, comp, cal_client, zones); ical_string = icalcomponent_as_ical_string_r (top_level); if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_EVENT) { @@ -1595,8 +1593,8 @@ cleanup: icalcomponent_free (top_level); if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } g_free (content_type); @@ -1609,7 +1607,7 @@ cleanup: gboolean reply_to_calendar_comp (ECalComponentItipMethod method, ECalComponent *send_comp, - ECal *client, + ECalClient *cal_client, gboolean reply_all, icalcomponent *zones, GSList *attachments_list) @@ -1622,7 +1620,7 @@ reply_to_calendar_comp (ECalComponentItipMethod method, ECalComponent *comp = NULL; icalcomponent *top_level = NULL; icaltimezone *default_zone; - GList *users = NULL; + GSList *users = NULL; gchar *subject = NULL; gchar *ical_string = NULL; gboolean retval = FALSE; @@ -1636,7 +1634,7 @@ reply_to_calendar_comp (ECalComponentItipMethod method, /* Tidy up the comp */ comp = comp_compliant ( - method, send_comp, client, zones, default_zone, TRUE); + method, send_comp, cal_client, zones, default_zone, TRUE); if (comp == NULL) goto cleanup; @@ -1649,13 +1647,13 @@ reply_to_calendar_comp (ECalComponentItipMethod method, composer = e_msg_composer_new (shell); table = e_msg_composer_get_header_table (composer); - setup_from (method, send_comp, client, table); + setup_from (method, send_comp, cal_client, table); e_composer_header_table_set_subject (table, subject); e_composer_header_table_set_destinations_to (table, destinations); e_destination_freev (destinations); - top_level = comp_toplevel_with_zones (method, comp, client, zones); + top_level = comp_toplevel_with_zones (method, comp, cal_client, zones); ical_string = icalcomponent_as_ical_string_r (top_level); if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_EVENT) { @@ -1703,12 +1701,15 @@ reply_to_calendar_comp (ECalComponentItipMethod method, e_cal_component_get_dtstart (comp, &dtstart); if (dtstart.value) { start_zone = icaltimezone_get_builtin_timezone_from_tzid (dtstart.tzid); - if (!start_zone) { - if (!e_cal_get_timezone (client, dtstart.tzid, &start_zone, NULL)) - g_warning ( - "Couldn't get timezone from " - "server: %s", dtstart.tzid ? - dtstart.tzid : ""); + if (!start_zone && dtstart.tzid) { + GError *error = NULL; + + if (!e_cal_client_get_timezone_sync (cal_client, dtstart.tzid, &start_zone, NULL, &error)) + g_debug ("%s: Couldn't get timezone '%s' from server: %s", G_STRFUNC, + dtstart.tzid ? dtstart.tzid : "", error ? error->message : "Unknown error"); + + if (error) + g_error_free (error); } if (!start_zone || dtstart.value->is_date) @@ -1767,8 +1768,8 @@ reply_to_calendar_comp (ECalComponentItipMethod method, icalcomponent_free (top_level); if (users) { - g_list_foreach (users, (GFunc) g_free, NULL); - g_list_free (users); + g_slist_foreach (users, (GFunc) g_free, NULL); + g_slist_free (users); } g_free (subject); @@ -1778,11 +1779,11 @@ reply_to_calendar_comp (ECalComponentItipMethod method, gboolean itip_publish_begin (ECalComponent *pub_comp, - ECal *client, + ECalClient *cal_client, gboolean cloned, ECalComponent **clone) { - icalcomponent *icomp =NULL, *icomp_clone = NULL; + icalcomponent *icomp = NULL, *icomp_clone = NULL; icalproperty *prop; if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) { @@ -1920,7 +1921,7 @@ comp_fb_normalize (icalcomponent *icomp) } gboolean -itip_publish_comp (ECal *client, +itip_publish_comp (ECalClient *cal_client, gchar *uri, gchar *username, gchar *password, diff --git a/calendar/gui/itip-utils.h b/calendar/gui/itip-utils.h index c5718894fc..6da2519d07 100644 --- a/calendar/gui/itip-utils.h +++ b/calendar/gui/itip-utils.h @@ -22,7 +22,7 @@ #include <libical/ical.h> #include <string.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include <libedataserver/e-account-list.h> @@ -53,35 +53,35 @@ gchar ** itip_get_user_identities (void); gchar * itip_get_fallback_identity (void); gboolean itip_address_is_user (const gchar *address); gboolean itip_organizer_is_user (ECalComponent *comp, - ECal *client); + ECalClient *cal_client); gboolean itip_organizer_is_user_ex (ECalComponent *comp, - ECal *client, + ECalClient *cal_client, gboolean skip_cap_test); gboolean itip_sentby_is_user (ECalComponent *comp, - ECal *client); + ECalClient *cal_client); const gchar * itip_strip_mailto (const gchar *address); gchar * itip_get_comp_attendee (ECalComponent *comp, - ECal *client); + ECalClient *cal_client); gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp, - ECal *client, + ECalClient *cal_client, icalcomponent *zones, GSList *attachments_list, - GList *users, + GSList *users, gboolean strip_alarms, gboolean only_new_attendees); -gboolean itip_publish_comp (ECal *client, +gboolean itip_publish_comp (ECalClient *cal_client, gchar *uri, gchar *username, gchar *password, ECalComponent **pub_comp); gboolean itip_publish_begin (ECalComponent *pub_comp, - ECal *client, + ECalClient *cal_client, gboolean cloned, ECalComponent **clone); gboolean reply_to_calendar_comp (ECalComponentItipMethod method, ECalComponent *send_comp, - ECal *client, + ECalClient *cal_client, gboolean reply_all, icalcomponent *zones, GSList *attachments_list); diff --git a/calendar/gui/print.c b/calendar/gui/print.c index a4d4fd61c8..702f281b5a 100644 --- a/calendar/gui/print.c +++ b/calendar/gui/print.c @@ -57,7 +57,7 @@ typedef struct PrintCompItem PrintCompItem; typedef struct PrintCalItem PrintCalItem; struct PrintCompItem { - ECal *client; + ECalClient *client; ECalComponent *comp; icaltimezone *zone; gboolean use_24_hour_format; @@ -2924,18 +2924,22 @@ write_label_piece (time_t t, } static icaltimezone* -get_zone_from_tzid (ECal *client, const gchar *tzid) +get_zone_from_tzid (ECalClient *client, const gchar *tzid) { icaltimezone *zone; /* Note that the timezones may not be on the server, so we try to get the builtin timezone with the TZID first. */ zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); - if (!zone) { - if (!e_cal_get_timezone (client, tzid, &zone, NULL)) - /* FIXME: Handle error better. */ - g_warning ("Couldn't get timezone from server: %s", - tzid ? tzid : ""); + if (!zone && tzid) { + GError *error = NULL; + + if (!e_cal_client_get_timezone_sync (client, tzid, &zone, NULL, &error)) { + g_warning ("Couldn't get timezone '%s' from server: %s", + tzid ? tzid : "", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + } } return zone; @@ -2944,7 +2948,7 @@ get_zone_from_tzid (ECal *client, const gchar *tzid) static void print_date_label (GtkPrintContext *context, ECalComponent *comp, - ECal *client, + ECalClient *client, icaltimezone *zone, gboolean use_24_hour_format, gdouble left, @@ -3137,7 +3141,7 @@ print_comp_draw_real (GtkPrintOperation *operation, { GtkPageSetup *setup; PangoFontDescription *font; - ECal *client; + ECalClient *client; ECalComponent *comp; ECalComponentVType vtype; ECalComponentText text; @@ -3413,7 +3417,7 @@ print_comp_begin_print (GtkPrintOperation *operation, void print_comp (ECalComponent *comp, - ECal *client, + ECalClient *cal_client, icaltimezone *zone, gboolean use_24_hour_format, GtkPrintOperationAction action) @@ -3424,7 +3428,7 @@ print_comp (ECalComponent *comp, g_return_if_fail (E_IS_CAL_COMPONENT (comp)); pci.comp = comp; - pci.client = client; + pci.client = cal_client; pci.zone = zone; pci.use_24_hour_format = use_24_hour_format; diff --git a/calendar/gui/print.h b/calendar/gui/print.h index 85397b0356..b81bcfa36c 100644 --- a/calendar/gui/print.h +++ b/calendar/gui/print.h @@ -40,7 +40,7 @@ void print_calendar (GnomeCalendar *gcal, GtkPrintOperationAction action, time_t start); void print_comp (ECalComponent *comp, - ECal *client, + ECalClient *cal_client, icaltimezone *zone, gboolean use_24_hour_format, GtkPrintOperationAction action); diff --git a/calendar/gui/tag-calendar.c b/calendar/gui/tag-calendar.c index 0af271e1de..dff1285587 100644 --- a/calendar/gui/tag-calendar.c +++ b/calendar/gui/tag-calendar.c @@ -151,18 +151,18 @@ get_recur_events_italic (void) **/ void tag_calendar_by_client (ECalendar *ecal, - ECal *client) + ECalClient *client) { struct calendar_tag_closure c; g_return_if_fail (E_IS_CALENDAR (ecal)); - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); /* If the ECalendar isn't visible, we just return. */ if (!gtk_widget_get_visible (GTK_WIDGET (ecal))) return; - if (e_cal_get_load_state (client) != E_CAL_LOAD_LOADED) + if (!e_client_is_opened (E_CLIENT (client))) return; if (!prepare_tag (ecal, &c, NULL, TRUE)) @@ -171,7 +171,7 @@ tag_calendar_by_client (ECalendar *ecal, c.skip_transparent_events = TRUE; c.recur_events_italic = get_recur_events_italic (); - e_cal_generate_instances ( + e_cal_client_generate_instances ( client, c.start_time, c.end_time, tag_calendar_cb, &c); } @@ -182,19 +182,25 @@ static icaltimezone* resolve_tzid_cb (const gchar *tzid, gpointer data) { - ECal *client; + ECalClient *client; icaltimezone *zone = NULL; - g_return_val_if_fail (E_IS_CAL (data), NULL); + g_return_val_if_fail (E_IS_CAL_CLIENT (data), NULL); - client = E_CAL (data); + client = E_CAL_CLIENT (data); /* Try to find the builtin timezone first. */ zone = icaltimezone_get_builtin_timezone_from_tzid (tzid); - if (!zone) { + if (!zone && tzid) { /* FIXME: Handle errors. */ - e_cal_get_timezone (client, tzid, &zone, NULL); + GError *error = NULL; + + if (!e_cal_client_get_timezone_sync (client, tzid, &zone, NULL, &error)) { + g_debug ("%s: Failed to get timezone '%s': %s", G_STRFUNC, tzid, error->message); + if (error) + g_error_free (error); + } } return zone; @@ -217,7 +223,7 @@ resolve_tzid_cb (const gchar *tzid, void tag_calendar_by_comp (ECalendar *ecal, ECalComponent *comp, - ECal *client, + ECalClient *client, icaltimezone *display_zone, gboolean clear_first, gboolean comp_is_on_server, @@ -239,7 +245,7 @@ tag_calendar_by_comp (ECalendar *ecal, c.recur_events_italic = can_recur_events_italic && get_recur_events_italic (); if (comp_is_on_server) - e_cal_generate_instances_for_object ( + e_cal_client_generate_instances_for_object ( client, e_cal_component_get_icalcomponent (comp), c.start_time, c.end_time, tag_calendar_cb, &c); else diff --git a/calendar/gui/tag-calendar.h b/calendar/gui/tag-calendar.h index ebf996173e..2dc5bff176 100644 --- a/calendar/gui/tag-calendar.h +++ b/calendar/gui/tag-calendar.h @@ -28,11 +28,11 @@ #define TAG_CALENDAR_H #include <misc/e-calendar.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> -void tag_calendar_by_client (ECalendar *ecal, ECal *client); +void tag_calendar_by_client (ECalendar *ecal, ECalClient *client); void tag_calendar_by_comp (ECalendar *ecal, ECalComponent *comp, - ECal *client, icaltimezone *display_zone, + ECalClient *client, icaltimezone *display_zone, gboolean clear_first, gboolean comp_is_on_server, gboolean can_recur_events_italic); diff --git a/calendar/importers/Makefile.am b/calendar/importers/Makefile.am index b54e619249..dc7b0dc89f 100644 --- a/calendar/importers/Makefile.am +++ b/calendar/importers/Makefile.am @@ -19,7 +19,6 @@ libevolution_calendar_importers_la_LDFLAGS = $(NO_UNDEFINED) libevolution_calendar_importers_la_LIBADD = \ $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/calendar/common/libevolution-calendarprivate.la \ $(top_builddir)/shell/libeshell.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ $(EVOLUTION_CALENDAR_LIBS) \ diff --git a/calendar/importers/icalendar-importer.c b/calendar/importers/icalendar-importer.c index 38c1fc8251..c523e57e39 100644 --- a/calendar/importers/icalendar-importer.c +++ b/calendar/importers/icalendar-importer.c @@ -35,13 +35,13 @@ #include <gtk/gtk.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-time-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include <libical/icalvcal.h> #include "evolution-calendar-importer.h" #include "shell/e-shell.h" -#include "common/authentication.h" #include "gui/calendar-config-keys.h" #include "e-util/e-import.h" @@ -58,21 +58,25 @@ typedef struct { guint idle_id; - ECal *client; - ECalSourceType source_type; + ECalClient *cal_client; + EClientSourceType source_type; icalcomponent *icalcomp; - guint cancelled:1; + GCancellable *cancellable; } ICalImporter; typedef struct { - guint cancelled:1; + EImport *ei; + EImportTarget *target; + GList *tasks; + icalcomponent *icalcomp; + GCancellable *cancellable; } ICalIntelligentImporter; static const gint import_type_map[] = { - E_CAL_SOURCE_TYPE_EVENT, - E_CAL_SOURCE_TYPE_TODO, + E_CLIENT_SOURCE_TYPE_EVENTS, + E_CLIENT_SOURCE_TYPE_TASKS, -1 }; @@ -99,11 +103,13 @@ is_icalcomp_usable (icalcomponent *icalcomp) static void ivcal_import_done (ICalImporter *ici) { - g_object_unref (ici->client); + if (ici->cal_client) + g_object_unref (ici->cal_client); icalcomponent_free (ici->icalcomp); e_import_complete (ici->import, ici->target); g_object_unref (ici->import); + g_object_unref (ici->cancellable); g_free (ici); } @@ -165,12 +171,39 @@ prepare_tasks (icalcomponent *icalcomp, GList *vtodos) g_list_free (vtodos); } -static gboolean -update_objects (ECal *client, icalcomponent *icalcomp) +struct UpdateObjectsData +{ + void (*done_cb) (gpointer user_data); + gpointer user_data; +}; + +static void +receive_objects_ready_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + ECalClient *cal_client = E_CAL_CLIENT (source_object); + struct UpdateObjectsData *uod = user_data; + GError *error = NULL; + + g_return_if_fail (uod != NULL); + + e_cal_client_receive_objects_finish (cal_client, result, &error); + + if (error) { + g_debug ("%s: Failed to receive objects: %s", G_STRFUNC, error->message); + g_error_free (error); + } + + if (uod->done_cb) + uod->done_cb (uod->user_data); + g_free (uod); +} + +static void +update_objects (ECalClient *cal_client, icalcomponent *icalcomp, GCancellable *cancellable, void (*done_cb)(gpointer user_data), gpointer user_data) { icalcomponent_kind kind; icalcomponent *vcal; - gboolean success = TRUE; + struct UpdateObjectsData *uod; kind = icalcomponent_isa (icalcomp); if (kind == ICAL_VTODO_COMPONENT || kind == ICAL_VEVENT_COMPONENT) { @@ -184,15 +217,21 @@ update_objects (ECal *client, icalcomponent *icalcomp) vcal = icalcomponent_new_clone (icalcomp); if (!icalcomponent_get_first_property (vcal, ICAL_METHOD_PROPERTY)) icalcomponent_set_method (vcal, ICAL_METHOD_PUBLISH); - } else - return FALSE; + } else { + if (done_cb) + done_cb (user_data); + return; + } - if (!e_cal_receive_objects (client, vcal, NULL)) - success = FALSE; + uod = g_new0 (struct UpdateObjectsData, 1); + uod->done_cb = done_cb; + uod->user_data = user_data; + + e_cal_client_receive_objects (cal_client, vcal, cancellable, receive_objects_ready_cb, uod); icalcomponent_free (vcal); - return success; + return; } struct _selector_data { @@ -246,7 +285,7 @@ ivcal_getwidget (EImport *ei, EImportTarget *target, EImportImporter *im) struct _selector_data *sd; /* FIXME Better error handling */ - if (!e_cal_get_sources (&source_list, import_type_map[i], NULL)) + if (!e_cal_client_get_sources (&source_list, import_type_map[i], NULL)) continue; selector = e_source_selector_new (source_list); @@ -290,71 +329,86 @@ ivcal_getwidget (EImport *ei, EImportTarget *target, EImportImporter *im) return vbox; } +static void +ivcal_call_import_done (gpointer user_data) +{ + ivcal_import_done (user_data); +} + static gboolean ivcal_import_items (gpointer d) { ICalImporter *ici = d; switch (ici->source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CLIENT_SOURCE_TYPE_EVENTS: prepare_events (ici->icalcomp, NULL); - if (!update_objects (ici->client, ici->icalcomp)) { - /* FIXME: e_alert ... */; - } + update_objects (ici->cal_client, ici->icalcomp, ici->cancellable, ivcal_call_import_done, ici); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CLIENT_SOURCE_TYPE_TASKS: prepare_tasks (ici->icalcomp, NULL); - if (!update_objects (ici->client, ici->icalcomp)) { - /* FIXME: e_alert ... */; - } + update_objects (ici->cal_client, ici->icalcomp, ici->cancellable, ivcal_call_import_done, ici); break; default: - g_return_val_if_reached (FALSE); + g_warn_if_reached (); + + ici->idle_id = 0; + ivcal_import_done (ici); + return FALSE; } - ivcal_import_done (ici); ici->idle_id = 0; return FALSE; } static void -ivcal_opened (ECal *ecal, const GError *error, ICalImporter *ici) +ivcal_opened (GObject *source_object, GAsyncResult *result, gpointer user_data) { - if (!ici->cancelled && !error) { + EClient *client = NULL; + ICalImporter *ici = user_data; + GError *error = NULL; + + g_return_if_fail (ici != NULL); + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + ici->cal_client = client ? E_CAL_CLIENT (client) : NULL; + + if (!g_cancellable_is_cancelled (ici->cancellable) && !error) { e_import_status(ici->import, ici->target, _("Importing..."), 0); ici->idle_id = g_idle_add (ivcal_import_items, ici); } else ivcal_import_done (ici); + + if (error) { + g_debug ("%s: Failed to open calendar: %s", G_STRFUNC, error->message); + g_error_free (error); + } } static void ivcal_import (EImport *ei, EImportTarget *target, icalcomponent *icalcomp) { - ECal *client; - ECalSourceType type; + EClientSourceType type; + ICalImporter *ici = g_malloc0 (sizeof (*ici)); type = GPOINTER_TO_INT(g_datalist_get_data(&target->data, "primary-type")); - client = e_auth_new_cal_from_source (g_datalist_get_data(&target->data, "primary-source"), type); - if (client) { - ICalImporter *ici = g_malloc0 (sizeof (*ici)); - - ici->import = ei; - g_datalist_set_data(&target->data, "ivcal-data", ici); - g_object_ref (ei); - ici->target = target; - ici->icalcomp = icalcomp; - ici->client = client; - ici->source_type = type; - e_import_status(ei, target, _("Opening calendar"), 0); - g_signal_connect(client, "cal-opened-ex", G_CALLBACK(ivcal_opened), ici); - e_cal_open_async (client, TRUE); - return; - } else { - icalcomponent_free (icalcomp); - e_import_complete (ei, target); - } + ici->import = ei; + g_datalist_set_data(&target->data, "ivcal-data", ici); + g_object_ref (ei); + ici->target = target; + ici->icalcomp = icalcomp; + ici->cal_client = NULL; + ici->source_type = type; + ici->cancellable = g_cancellable_new (); + e_import_status (ei, target, _("Opening calendar"), 0); + + e_client_utils_open_new (g_datalist_get_data(&target->data, "primary-source"), type, FALSE, ici->cancellable, + e_client_utils_authenticate_handler, NULL, + ivcal_opened, ici); } static void @@ -363,7 +417,7 @@ ivcal_cancel (EImport *ei, EImportTarget *target, EImportImporter *im) ICalImporter *ici = g_datalist_get_data(&target->data, "ivcal-data"); if (ici) - ici->cancelled = 1; + g_cancellable_cancel (ici->cancellable); } /* ********************************************************************** */ @@ -684,13 +738,152 @@ gnome_calendar_supported (EImport *ei, EImportTarget *target, EImportImporter *i } static void +free_ici (gpointer ptr) +{ + ICalIntelligentImporter *ici = ptr; + + if (!ici) + return; + + if (ici->icalcomp) + icalcomponent_free (ici->icalcomp); + + g_object_unref (ici->cancellable); + g_free (ici); +} + +struct OpenDefaultSourceData +{ + ICalIntelligentImporter *ici; + void (* opened_cb) (ECalClient *cal_client, const GError *error, ICalIntelligentImporter *ici); +}; + +static void +default_source_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) +{ + EClient *client = NULL; + struct OpenDefaultSourceData *odsd = user_data; + GError *error = NULL; + + g_return_if_fail (odsd != NULL); + g_return_if_fail (odsd->ici != NULL); + g_return_if_fail (odsd->opened_cb != NULL); + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + odsd->opened_cb (client ? E_CAL_CLIENT (client) : NULL, error, odsd->ici); + + if (client) + g_object_unref (client); + if (error) + g_error_free (error); + + g_free (odsd); +} + +static void +open_default_source (ICalIntelligentImporter *ici, ECalClientSourceType source_type, void (* opened_cb) (ECalClient *cal_client, const GError *error, ICalIntelligentImporter *ici)) +{ + ESource *source; + ECalClient *cal_client; + GError *error = NULL; + struct OpenDefaultSourceData *odsd; + + g_return_if_fail (ici != NULL); + g_return_if_fail (opened_cb != NULL); + + cal_client = e_cal_client_new_default (source_type, NULL); + if (!cal_client) + cal_client = e_cal_client_new_system (source_type, &error); + + if (!cal_client) { + opened_cb (NULL, error, ici); + if (error) + g_error_free (error); + return; + } + + source = e_client_get_source (E_CLIENT (cal_client)); + g_return_if_fail (source != NULL); + + source = g_object_ref (source); + g_object_unref (cal_client); + + odsd = g_new0 (struct OpenDefaultSourceData, 1); + odsd->ici = ici; + odsd->opened_cb = opened_cb; + + e_import_status (ici->ei, ici->target, _("Opening calendar"), 0); + + e_client_utils_open_new (source, source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS ? E_CLIENT_SOURCE_TYPE_EVENTS : E_CLIENT_SOURCE_TYPE_TASKS, FALSE, ici->cancellable, + e_client_utils_authenticate_handler, NULL, + default_source_opened_cb, odsd); + + g_object_unref (source); +} + +static void +continue_done_cb (gpointer user_data) +{ + ICalIntelligentImporter *ici = user_data; + + g_return_if_fail (ici != NULL); + + e_import_complete (ici->ei, ici->target); +} + +static void +gc_import_tasks (ECalClient *cal_client, const GError *error, ICalIntelligentImporter *ici) +{ + g_return_if_fail (ici != NULL); + + if (!cal_client) { + g_debug ("%s: Failed to open tasks: %s", G_STRFUNC, error ? error->message : "Unknown error"); + e_import_complete (ici->ei, ici->target); + return; + } + + e_import_status (ici->ei, ici->target, _("Importing..."), 0); + + prepare_tasks (ici->icalcomp, ici->tasks); + update_objects (cal_client, ici->icalcomp, ici->cancellable, continue_done_cb, ici); +} + +static void +continue_tasks_cb (gpointer user_data) +{ + ICalIntelligentImporter *ici = user_data; + + g_return_if_fail (ici != NULL); + + open_default_source (ici, E_CAL_CLIENT_SOURCE_TYPE_TASKS, gc_import_tasks); +} + +static void +gc_import_events (ECalClient *cal_client, const GError *error, ICalIntelligentImporter *ici) +{ + g_return_if_fail (ici != NULL); + + if (!cal_client) { + g_debug ("%s: Failed to open events calendar: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (ici->tasks) + open_default_source (ici, E_CAL_CLIENT_SOURCE_TYPE_TASKS, gc_import_tasks); + else + e_import_complete (ici->ei, ici->target); + return; + } + + e_import_status (ici->ei, ici->target, _("Importing..."), 0); + + update_objects (cal_client, ici->icalcomp, ici->cancellable, ici->tasks ? continue_tasks_cb : continue_done_cb, ici); +} + +static void gnome_calendar_import (EImport *ei, EImportTarget *target, EImportImporter *im) { icalcomponent *icalcomp = NULL; gchar *filename; - GList *vtodos; - ECal *calendar_client = NULL, *tasks_client = NULL; - gint t; gint do_calendar, do_tasks; ICalIntelligentImporter *ici; @@ -704,21 +897,6 @@ gnome_calendar_import (EImport *ei, EImportTarget *target, EImportImporter *im) if (!do_calendar && !do_tasks) return; - e_import_status(ei, target, _("Opening calendar"), 0); - - /* Try to open the default calendar & tasks folders. */ - if (do_calendar) { - calendar_client = e_auth_new_cal_from_default (E_CAL_SOURCE_TYPE_EVENT); - if (!calendar_client) - goto out; - } - - if (do_tasks) { - tasks_client = e_auth_new_cal_from_default (E_CAL_SOURCE_TYPE_TODO); - if (!tasks_client) - goto out; - } - /* Load the Gnome Calendar file and convert to iCalendar. */ filename = g_build_filename(g_get_home_dir (), "user-cal.vcf", NULL); icalcomp = load_vcalendar_file (filename); @@ -729,64 +907,29 @@ gnome_calendar_import (EImport *ei, EImportTarget *target, EImportImporter *im) goto out; ici = g_malloc0 (sizeof (*ici)); - g_datalist_set_data_full(&target->data, "gnomecal-data", ici, g_free); + ici->ei = ei; + ici->target = target; + ici->cancellable = g_cancellable_new (); + ici->icalcomp = icalcomp; + icalcomp = NULL; - /* Wait for client to finish opening the calendar & tasks folders. */ - for (t = 0; t < IMPORTER_TIMEOUT_SECONDS; t++) { - ECalLoadState calendar_state, tasks_state; + g_datalist_set_data_full(&target->data, "gnomecal-data", ici, free_ici); - calendar_state = tasks_state = E_CAL_LOAD_LOADED; - - /* We need this so the ECal gets notified that the - folder is opened, via Corba. */ - while (gtk_events_pending ()) - gtk_main_iteration (); - - if (do_calendar) - calendar_state = e_cal_get_load_state (calendar_client); - - if (do_tasks) - tasks_state = e_cal_get_load_state (tasks_client); - - if (calendar_state == E_CAL_LOAD_LOADED - && tasks_state == E_CAL_LOAD_LOADED) - break; - - g_usleep (1000000); - if (ici->cancelled) - goto out; + prepare_events (ici->icalcomp, &ici->tasks); + if (do_calendar) { + open_default_source (ici, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, gc_import_events); + return; } - /* If we timed out, just return. */ - if (t == IMPORTER_TIMEOUT_SECONDS) - goto out; - - e_import_status(ei, target, _("Importing..."), 0); - - /* - * Import the calendar events into the default calendar folder. - */ - prepare_events (icalcomp, &vtodos); - if (do_calendar) - update_objects (calendar_client, icalcomp); - - if (ici->cancelled) - goto out; - - /* - * Import the tasks into the default tasks folder. - */ - prepare_tasks (icalcomp, vtodos); - if (do_tasks) - update_objects (tasks_client, icalcomp); + prepare_tasks (ici->icalcomp, ici->tasks); + if (do_tasks) { + open_default_source (ici, E_CAL_CLIENT_SOURCE_TYPE_TASKS, gc_import_tasks); + return; + } out: if (icalcomp) icalcomponent_free (icalcomp); - if (calendar_client) - g_object_unref (calendar_client); - if (tasks_client) - g_object_unref (tasks_client); e_import_complete (ei, target); } @@ -841,7 +984,7 @@ gnome_calendar_cancel (EImport *ei, EImportTarget *target, EImportImporter *im) ICalIntelligentImporter *ici = g_datalist_get_data(&target->data, "gnomecal-data"); if (ici) - ici->cancelled = 1; + g_cancellable_cancel (ici->cancellable); } static EImportImporter gnome_calendar_importer = { diff --git a/capplet/settings/mail-capplet-shell.c b/capplet/settings/mail-capplet-shell.c index a22bb88dcf..5a70fad6d4 100644 --- a/capplet/settings/mail-capplet-shell.c +++ b/capplet/settings/mail-capplet-shell.c @@ -285,9 +285,12 @@ setup_abooks (void) ESourceList *list = NULL; ESourceGroup *on_this_computer = NULL; ESource *personal_source = NULL; + GError *error = NULL; - if (!e_book_get_addressbooks (&list, NULL)) { - g_warning ("Unable to get books\n"); + if (!e_book_client_get_sources (&list, &error)) { + g_debug ("%s: Unable to get books: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } diff --git a/composer/e-composer-name-header.c b/composer/e-composer-name-header.c index dcaecab464..a99f1cd949 100644 --- a/composer/e-composer-name-header.c +++ b/composer/e-composer-name-header.c @@ -51,7 +51,7 @@ G_DEFINE_TYPE ( E_TYPE_COMPOSER_HEADER) static gpointer -contact_editor_fudge_new (EBook *book, +contact_editor_fudge_new (EBookClient *book_client, EContact *contact, gboolean is_new, gboolean editable) @@ -62,11 +62,11 @@ contact_editor_fudge_new (EBook *book, * was a terrible idea. Now we're stuck with it. */ return e_contact_editor_new ( - shell, book, contact, is_new, editable); + shell, book_client, contact, is_new, editable); } static gpointer -contact_list_editor_fudge_new (EBook *book, +contact_list_editor_fudge_new (EBookClient *book_client, EContact *contact, gboolean is_new, gboolean editable) @@ -77,7 +77,7 @@ contact_list_editor_fudge_new (EBook *book, * was a terrible idea. Now we're stuck with it. */ return e_contact_list_editor_new ( - shell, book, contact, is_new, editable); + shell, book_client, contact, is_new, editable); } static void diff --git a/configure.ac b/configure.ac index 3afa648953..1078197d2a 100644 --- a/configure.ac +++ b/configure.ac @@ -73,6 +73,8 @@ AS_COMPILER_FLAGS(WARNING_FLAGS, -DEDS_DISABLE_DEPRECATED -DG_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES + -DE_BOOK_DISABLE_DEPRECATED + -DE_CAL_DISABLE_DEPRECATED -Wall -Wextra -Wno-missing-field-initializers -Wno-sign-compare @@ -1687,7 +1689,6 @@ widgets/text/Makefile widgets/table/Makefile calendar/Makefile calendar/importers/Makefile -calendar/common/Makefile calendar/gui/Makefile calendar/gui/alarm-notify/Makefile calendar/gui/dialogs/Makefile diff --git a/e-util/e-marshal.list b/e-util/e-marshal.list index 3a9e367cb9..ce8e393fce 100644 --- a/e-util/e-marshal.list +++ b/e-util/e-marshal.list @@ -20,6 +20,7 @@ INT:INT,INT,BOXED INT:INT,POINTER,INT,BOXED INT:OBJECT,BOXED INT:POINTER +NONE:BOXED,INT NONE:ENUM,OBJECT,OBJECT NONE:INT,INT NONE:INT,INT,BOXED @@ -34,7 +35,6 @@ NONE:INT,POINTER,INT,OBJECT NONE:INT,POINTER,INT,OBJECT,BOXED,UINT,UINT NONE:INT,POINTER,INT,OBJECT,INT,INT,BOXED,UINT,UINT NONE:INT,POINTER,INT,OBJECT,UINT -NONE:INT,STRING,INT NONE:LONG,LONG NONE:OBJECT,BOOLEAN NONE:OBJECT,DOUBLE,DOUBLE,BOOLEAN @@ -51,6 +51,7 @@ NONE:POINTER,OBJECT NONE:POINTER,POINTER NONE:POINTER,POINTER,INT NONE:STRING,DOUBLE +NONE:STRING,INT NONE:STRING,INT,INT NONE:STRING,POINTER,POINTER NONE:STRING,STRING diff --git a/mail/em-utils.c b/mail/em-utils.c index 7d11f5e9bf..db6bd958f9 100644 --- a/mail/em-utils.c +++ b/mail/em-utils.c @@ -41,7 +41,8 @@ #undef interface #endif -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include "em-filter-editor.h" @@ -1439,35 +1440,30 @@ emu_addr_setup (gpointer user_data) GError *err = NULL; ESourceList **psource_list = user_data; - if (!e_book_get_addressbooks (psource_list, &err)) + if (!e_book_client_get_sources (psource_list, &err)) g_error_free (err); return NULL; } static void -emu_addr_cancel_book (gpointer data) +emu_addr_cancel_stop (gpointer data) { - EBook **pbook = data; - GError *err = NULL; + gboolean *stop = data; - g_return_if_fail (pbook != NULL); + g_return_if_fail (stop != NULL); - if (*pbook) { - /* we dunna care if this fails, its just the best we can try */ - e_book_cancel (*pbook, &err); - g_clear_error (&err); - } + *stop = TRUE; } static void -emu_addr_cancel_stop (gpointer data) +emu_addr_cancel_cancellable (gpointer data) { - gboolean *stop = data; + GCancellable *cancellable = data; - g_return_if_fail (stop != NULL); + g_return_if_fail (cancellable != NULL); - *stop = TRUE; + g_cancellable_cancel (cancellable); } struct TryOpenEBookStruct { @@ -1477,32 +1473,36 @@ struct TryOpenEBookStruct { }; static void -try_open_e_book_cb (EBook *book, const GError *error, gpointer closure) +try_open_book_client_cb (GObject *source_object, GAsyncResult *result, gpointer closure) { + EBookClient *book_client = E_BOOK_CLIENT (source_object); struct TryOpenEBookStruct *data = (struct TryOpenEBookStruct *) closure; + GError *error = NULL; if (!data) return; + e_client_open_finish (E_CLIENT (book_client), result, &error); + data->result = error == NULL; if (!data->result) { g_clear_error (data->error); - g_propagate_error (data->error, g_error_copy (error)); + g_propagate_error (data->error, error); } e_flag_set (data->flag); } -/** - * try_open_e_book: +/* + * try_open_book_client: * Tries to open address book asynchronously, but acts as synchronous. * The advantage is it checks periodically whether the camel_operation * has been canceled or not, and if so, then stops immediately, with - * result FALSE. Otherwise returns same as e_book_open - **/ + * result FALSE. Otherwise returns same as e_client_open() + */ static gboolean -try_open_e_book (EBook *book, gboolean only_if_exists, GError **error) +try_open_book_client (EBookClient *book_client, gboolean only_if_exists, GCancellable *cancellable, GError **error) { struct TryOpenEBookStruct data; gboolean canceled = FALSE; @@ -1512,15 +1512,7 @@ try_open_e_book (EBook *book, gboolean only_if_exists, GError **error) data.flag = flag; data.result = FALSE; - if (!e_book_open_async (book, only_if_exists, try_open_e_book_cb, &data)) { - e_flag_free (flag); - g_clear_error (error); - g_set_error ( - error, E_BOOK_ERROR, - E_BOOK_ERROR_OTHER_ERROR, - "Failed to call e_book_open_async."); - return FALSE; - } + e_client_open (E_CLIENT (book_client), only_if_exists, cancellable, try_open_book_client_cb, &data); while (canceled = camel_operation_cancel_check (NULL), !canceled && !e_flag_is_set (flag)) { @@ -1533,16 +1525,10 @@ try_open_e_book (EBook *book, gboolean only_if_exists, GError **error) } if (canceled) { + g_cancellable_cancel (cancellable); + g_clear_error (error); - g_set_error ( - error, E_BOOK_ERROR, - E_BOOK_ERROR_CANCELLED, - "Operation has been canceled."); - /* if the operation is cancelled sucessfully set the flag - * else wait. file, groupwise,.. backend's operations - * are not cancellable */ - if (e_book_cancel_async_op (book, NULL)) - e_flag_set (flag); + g_propagate_error (error, e_client_error_create (E_CLIENT_ERROR_CANCELLED, NULL)); } e_flag_wait (flag); @@ -1578,8 +1564,11 @@ search_address_in_addressbooks (const gchar *address, gboolean found = FALSE, stop = FALSE, found_any = FALSE; gchar *lowercase_addr; gpointer ptr; - EBookQuery *query; + EBookQuery *book_query; + gchar *query; GSList *s, *g, *addr_sources = NULL; + GHook *hook_cancellable; + GCancellable *cancellable; if (!address || !*address) return FALSE; @@ -1611,7 +1600,9 @@ search_address_in_addressbooks (const gchar *address, return ptr != NOT_FOUND_BOOK; } - query = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_IS, address); + book_query = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_IS, address); + query = e_book_query_to_string (book_query); + e_book_query_unref (book_query); for (g = e_source_list_peek_groups (emu_books_source_list); g; g = g_slist_next (g)) { @@ -1635,11 +1626,14 @@ search_address_in_addressbooks (const gchar *address, } } + cancellable = g_cancellable_new (); + hook_cancellable = mail_cancel_hook_add (emu_addr_cancel_cancellable, cancellable); + for (s = addr_sources; !stop && !found && s; s = g_slist_next (s)) { ESource *source = s->data; - GList *contacts; - EBook *book = NULL; - GHook *hook_book, *hook_stop; + GSList *contacts; + EBookClient *book_client = NULL; + GHook *hook_stop; gboolean cached_book = FALSE; GError *err = NULL; @@ -1653,17 +1647,14 @@ search_address_in_addressbooks (const gchar *address, d(printf(" checking '%s'\n", e_source_get_uri(source))); - hook_book = mail_cancel_hook_add (emu_addr_cancel_book, &book); hook_stop = mail_cancel_hook_add (emu_addr_cancel_stop, &stop); - book = g_hash_table_lookup (emu_books_hash, e_source_peek_uid (source)); - if (!book) { - book = e_book_new (source, &err); + book_client = g_hash_table_lookup (emu_books_hash, e_source_peek_uid (source)); + if (!book_client) { + book_client = e_book_client_new (source, &err); - if (book == NULL) { - if (err && g_error_matches ( - err, E_BOOK_ERROR, - E_BOOK_ERROR_CANCELLED)) { + if (book_client == NULL) { + if (err && g_error_matches (err, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { stop = TRUE; } else if (err) { gchar *source_uid; @@ -1682,13 +1673,11 @@ search_address_in_addressbooks (const gchar *address, err->message); } g_clear_error (&err); - } else if (!stop && !try_open_e_book (book, TRUE, &err)) { - g_object_unref (book); - book = NULL; + } else if (!stop && !try_open_book_client (book_client, TRUE, cancellable, &err)) { + g_object_unref (book_client); + book_client = NULL; - if (err && g_error_matches ( - err, E_BOOK_ERROR, - E_BOOK_ERROR_CANCELLED)) { + if (err && g_error_matches (err, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { stop = TRUE; } else if (err) { gchar *source_uid; @@ -1712,18 +1701,15 @@ search_address_in_addressbooks (const gchar *address, cached_book = TRUE; } - if (book && !stop && e_book_get_contacts (book, query, &contacts, &err)) { + if (book_client && !stop && e_book_client_get_contacts_sync (book_client, query, &contacts, cancellable, &err)) { if (contacts != NULL) { if (!found_any) { - g_hash_table_insert ( - contact_cache, - g_strdup (lowercase_addr), - book); + g_hash_table_insert (contact_cache, g_strdup (lowercase_addr), book_client); } found_any = TRUE; if (check_contact) { - GList *l; + GSList *l; for (l = contacts; l && !found; l = l->next) { EContact *contact = l->data; @@ -1734,12 +1720,12 @@ search_address_in_addressbooks (const gchar *address, found = TRUE; } - g_list_foreach (contacts, (GFunc) g_object_unref, NULL); - g_list_free (contacts); + g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); + g_slist_free (contacts); } - } else if (book) { + } else if (book_client) { stop = stop || (err && g_error_matches ( - err, E_BOOK_ERROR, E_BOOK_ERROR_CANCELLED)); + err, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)); if (err && !stop) { gchar *source_uid = g_strdup (e_source_peek_uid (source)); @@ -1753,24 +1739,26 @@ search_address_in_addressbooks (const gchar *address, g_clear_error (&err); } - mail_cancel_hook_remove (hook_book); mail_cancel_hook_remove (hook_stop); stop = stop || camel_operation_cancel_check (NULL); - if (stop && !cached_book && book) { - g_object_unref (book); - } else if (!stop && book && !cached_book) { + if (stop && !cached_book && book_client) { + g_object_unref (book_client); + } else if (!stop && book_client && !cached_book) { g_hash_table_insert ( emu_books_hash, g_strdup ( - e_source_peek_uid (source)), book); + e_source_peek_uid (source)), book_client); } } + mail_cancel_hook_remove (hook_cancellable); + g_object_unref (cancellable); + g_slist_foreach (addr_sources, (GFunc) g_object_unref, NULL); g_slist_free (addr_sources); - e_book_query_unref (query); + g_free (query); if (!found_any) { g_hash_table_insert (contact_cache, lowercase_addr, NOT_FOUND_BOOK); diff --git a/mail/importers/pine-importer.c b/mail/importers/pine-importer.c index fea9218e2e..c75a78a332 100644 --- a/mail/importers/pine-importer.c +++ b/mail/importers/pine-importer.c @@ -38,7 +38,7 @@ #include <gconf/gconf-client.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-destination.h> #include "mail-importer.h" @@ -98,7 +98,7 @@ FIXME: we dont handle aliases in lists. */ static void -import_contact (EBook *book, gchar *line) +import_contact (EBookClient *book_client, gchar *line) { gchar **strings, *addr, **addrs; gint i; @@ -106,10 +106,13 @@ import_contact (EBook *book, gchar *line) /*EContactName *name;*/ EContact *card; gsize len; + GError *error = NULL; card = e_contact_new (); strings = g_strsplit(line, "\t", 5); if (strings[0] && strings[1] && strings[2]) { + gchar *new_uid = NULL; + e_contact_set (card, E_CONTACT_NICKNAME, strings[0]); e_contact_set (card, E_CONTACT_FULL_NAME, strings[1]); @@ -150,8 +153,15 @@ import_contact (EBook *book, gchar *line) if (strings[3] && strings[4]) e_contact_set (card, E_CONTACT_NOTE, strings[4]); - /* FIXME Error checking */ - e_book_add_contact (book, card, NULL); + if (!e_book_client_add_contact_sync (book_client, card, &new_uid, NULL, &error)) { + g_debug ("%s: Failed to add contact: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + error = NULL; + } else { + g_free (new_uid); + } + g_object_unref (card); } g_strfreev (strings); @@ -162,16 +172,22 @@ import_contacts (void) { ESource *primary; ESourceList *source_list; - EBook *book; + EBookClient *book_client; gchar *name; GString *line; FILE *fp; gsize offset; + GError *error = NULL; printf("importing pine addressbook\n"); - if (!e_book_get_addressbooks (&source_list, NULL)) + if (!e_book_client_get_sources (&source_list, &error)) { + if (error) { + g_debug ("%s: Failed to get book sources: %s", G_STRFUNC, error->message); + g_error_free (error); + } return; + } name = g_build_filename(g_get_home_dir(), ".addressbook", NULL); fp = fopen(name, "r"); @@ -181,13 +197,24 @@ import_contacts (void) primary = e_source_list_peek_source_any (source_list); /* FIXME Better error handling */ - if ((book = e_book_new (primary,NULL)) == NULL) { + if ((book_client = e_book_client_new (primary, &error)) == NULL) { fclose (fp); - g_warning ("Could not create EBook."); + g_warning ("Could not create EBook: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } - e_book_open (book, TRUE, NULL); + if (!e_client_open_sync (E_CLIENT (book_client), TRUE, NULL, &error)) { + g_object_unref (primary); + g_object_unref (source_list); + fclose (fp); + + g_warning ("%s: Failed to open book client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + return; + } g_object_unref (primary); g_object_unref (source_list); @@ -208,13 +235,13 @@ import_contacts (void) g_string_truncate (line, len); } - import_contact (book, line->str); + import_contact (book_client, line->str); offset = 0; } g_string_free (line, TRUE); fclose (fp); - g_object_unref (book); + g_object_unref (book_client); } static gchar * diff --git a/modules/addressbook/e-book-shell-backend.c b/modules/addressbook/e-book-shell-backend.c index f9dba4cfee..e697e89990 100644 --- a/modules/addressbook/e-book-shell-backend.c +++ b/modules/addressbook/e-book-shell-backend.c @@ -27,11 +27,11 @@ #include <string.h> #include <glib/gi18n.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libedataserver/e-url.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-group.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-import.h" #include "shell/e-shell.h" @@ -79,14 +79,16 @@ book_shell_backend_ensure_sources (EShellBackend *shell_backend) ESource *personal; GSList *sources, *iter; const gchar *name; + GError *error = NULL; on_this_computer = NULL; personal = NULL; priv = E_BOOK_SHELL_BACKEND (shell_backend)->priv; - if (!e_book_get_addressbooks (&priv->source_list, NULL)) { - g_warning ("Could not get addressbook sources from GConf!"); + if (!e_book_client_get_sources (&priv->source_list, &error)) { + g_warning ("Could not get addressbook sources: %s", error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -154,60 +156,68 @@ book_shell_backend_init_importers (void) } static void -book_shell_backend_new_contact_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +book_shell_backend_new_contact_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; - EContact *contact; - EABEditor *editor; + EShell *shell = user_data; + EClient *client = NULL; + GError *error = NULL; - book = e_load_book_source_finish (source, result, NULL); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; /* XXX Handle errors better. */ - if (book == NULL) - goto exit; + if (client == NULL) { + g_debug ("%s: Failed to open book: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); + } else { + EBookClient *book_client = E_BOOK_CLIENT (client); + EContact *contact; + EABEditor *editor; - contact = e_contact_new (); + contact = e_contact_new (); - editor = e_contact_editor_new ( - shell, book, contact, TRUE, TRUE); + editor = e_contact_editor_new ( + shell, book_client, contact, TRUE, TRUE); - eab_editor_show (editor); + eab_editor_show (editor); - g_object_unref (contact); - g_object_unref (book); + g_object_unref (contact); + g_object_unref (book_client); + } -exit: g_object_unref (shell); } static void -book_shell_backend_new_contact_list_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +book_shell_backend_new_contact_list_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; - EContact *contact; - EABEditor *editor; + EShell *shell = user_data; + EClient *client = NULL; + GError *error = NULL; - book = e_load_book_source_finish (source, result, NULL); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; /* XXX Handle errors better. */ - if (book == NULL) - goto exit; + if (client == NULL) { + g_debug ("%s: Failed to open book: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); + } else { + EBookClient *book_client = E_BOOK_CLIENT (client); + EContact *contact; + EABEditor *editor; - contact = e_contact_new (); + contact = e_contact_new (); - editor = e_contact_list_editor_new ( - shell, book, contact, TRUE, TRUE); + editor = e_contact_list_editor_new ( + shell, book_client, contact, TRUE, TRUE); - eab_editor_show (editor); + eab_editor_show (editor); - g_object_unref (contact); - g_object_unref (book); + g_object_unref (contact); + g_object_unref (book_client); + } -exit: g_object_unref (shell); } @@ -249,17 +259,13 @@ action_contact_new_cb (GtkAction *action, /* Use a callback function appropriate for the action. */ action_name = gtk_action_get_name (action); if (strcmp (action_name, "contact-new") == 0) - e_load_book_source_async ( - source, GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - book_shell_backend_new_contact_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + book_shell_backend_new_contact_cb, g_object_ref (shell)); if (strcmp (action_name, "contact-new-list") == 0) - e_load_book_source_async ( - source, GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - book_shell_backend_new_contact_list_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + book_shell_backend_new_contact_list_cb, g_object_ref (shell)); g_object_unref (source_list); } diff --git a/modules/addressbook/e-book-shell-content.c b/modules/addressbook/e-book-shell-content.c index 82e1f297d9..e8f2afd83b 100644 --- a/modules/addressbook/e-book-shell-content.c +++ b/modules/addressbook/e-book-shell-content.c @@ -66,7 +66,7 @@ book_shell_content_send_message_cb (EBookShellContent *book_shell_content, EShellContent *shell_content; EShellWindow *shell_window; EShellView *shell_view; - GList node = { destination, NULL, NULL }; + GSList node = { destination, NULL }; shell_content = E_SHELL_CONTENT (book_shell_content); shell_view = e_shell_content_get_shell_view (shell_content); diff --git a/modules/addressbook/e-book-shell-migrate.c b/modules/addressbook/e-book-shell-migrate.c index df27f39e47..a88219348a 100644 --- a/modules/addressbook/e-book-shell-migrate.c +++ b/modules/addressbook/e-book-shell-migrate.c @@ -38,7 +38,7 @@ #include <gtk/gtk.h> #include <libebook/e-destination.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <glib/gi18n.h> #include <libedataserver/e-xml-utils.h> @@ -169,7 +169,7 @@ migration_context_new (const gchar *data_dir) (GDestroyNotify) g_free, (GDestroyNotify) g_free); - e_book_get_addressbooks (&context->source_list, NULL); + e_book_client_get_sources (&context->source_list, NULL); context->data_dir = data_dir; diff --git a/modules/addressbook/e-book-shell-view-actions.c b/modules/addressbook/e-book-shell-view-actions.c index 029bdd783d..52d8243ead 100644 --- a/modules/addressbook/e-book-shell-view-actions.c +++ b/modules/addressbook/e-book-shell-view-actions.c @@ -61,7 +61,7 @@ action_address_book_delete_cb (GtkAction *action, ESourceSelector *selector; ESourceGroup *source_group; ESourceList *source_list; - EBook *book; + EBookClient *book; gint response; GError *error = NULL; @@ -84,14 +84,14 @@ action_address_book_delete_cb (GtkAction *action, if (response != GTK_RESPONSE_YES) return; - book = e_book_new (source, &error); + book = e_book_client_new (source, &error); if (error != NULL) { g_warning ("Error removing addressbook: %s", error->message); g_error_free (error); return; } - if (!e_book_remove (book, NULL)) { + if (!e_client_remove_sync (E_CLIENT (book), NULL, NULL)) { e_alert_run_dialog_for_args ( GTK_WINDOW (shell_window), "addressbook:remove-addressbook", NULL); @@ -249,7 +249,7 @@ map_window_show_contact_editor_cb (EContactMapWindow *window, EBookShellSidebar *book_shell_sidebar; ESource *source; ESourceSelector *selector; - EBook *book; + EBookClient *book_client; EContact *contact; EABEditor *editor; GError *error = NULL; @@ -259,23 +259,24 @@ map_window_show_contact_editor_cb (EContactMapWindow *window, source = e_source_selector_get_primary_selection (selector); g_return_if_fail (source != NULL); - book = e_book_new (source, &error); + book_client = e_book_client_new (source, &error); if (error) { g_warning ("Error loading addressbook: %s", error->message); g_error_free (error); - g_object_unref (book); + if (book_client) + g_object_unref (book_client); return; } - e_book_get_contact (book, contact_uid, &contact, &error); + e_book_client_get_contact_sync (book_client, contact_uid, &contact, NULL, &error); if (error) { g_warning ("Error getting contact from addressbook: %s", error->message); g_error_free (error); - g_object_unref (book); + g_object_unref (book_client); return; } - editor = e_contact_editor_new (shell, book, contact, FALSE, TRUE); + editor = e_contact_editor_new (shell, book_client, contact, FALSE, TRUE); g_signal_connect (editor, "contact-modified", G_CALLBACK (contact_editor_contact_modified_cb), window); @@ -283,7 +284,7 @@ map_window_show_contact_editor_cb (EContactMapWindow *window, G_CALLBACK (g_object_unref), editor); eab_editor_show (editor); - g_object_unref (book); + g_object_unref (book_client); } #endif @@ -297,7 +298,7 @@ action_address_book_map_cb (GtkAction *action, EBookShellSidebar *book_shell_sidebar; ESource *source; ESourceSelector *selector; - EBook *book; + EBookClient *book_client; GError *error = NULL; book_shell_sidebar = book_shell_view->priv->book_shell_sidebar; @@ -305,7 +306,7 @@ action_address_book_map_cb (GtkAction *action, source = e_source_selector_get_primary_selection (selector); g_return_if_fail (source != NULL); - book = e_book_new (source, &error); + book_client = e_book_client_new (source, &error); if (error != NULL) { g_warning ("Error loading addressbook: %s", error->message); g_error_free (error); @@ -313,7 +314,7 @@ action_address_book_map_cb (GtkAction *action, } map_window = e_contact_map_window_new (); - e_contact_map_window_load_addressbook (map_window, book); + e_contact_map_window_load_addressbook (map_window, book_client); /* Free the map_window automatically when it is closed */ g_signal_connect_swapped (GTK_WIDGET (map_window), "hide", @@ -323,7 +324,7 @@ action_address_book_map_cb (GtkAction *action, gtk_widget_show_all (GTK_WIDGET (map_window)); - g_object_unref (book); + g_object_unref (book_client); #endif } @@ -353,8 +354,8 @@ action_address_book_save_as_cb (GtkAction *action, EAddressbookView *view; EActivity *activity; EBookQuery *query; - EBook *book; - GList *list = NULL; + EBookClient *book; + GSList *list = NULL; GFile *file; gchar *string; @@ -368,12 +369,15 @@ action_address_book_save_as_cb (GtkAction *action, g_return_if_fail (view != NULL); model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book = e_addressbook_model_get_client (model); query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &list, NULL); + string = e_book_query_to_string (query); e_book_query_unref (query); + e_book_client_get_contacts_sync (book, string, &list, NULL, NULL); + g_free (string); + if (list == NULL) goto exit; @@ -415,8 +419,7 @@ action_address_book_save_as_cb (GtkAction *action, g_object_unref (file); exit: - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); } static void @@ -483,7 +486,7 @@ action_contact_forward_cb (GtkAction *action, EShellWindow *shell_window; EBookShellContent *book_shell_content; EAddressbookView *view; - GList *list, *iter; + GSList *list, *iter; shell_view = E_SHELL_VIEW (book_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -510,8 +513,7 @@ action_contact_forward_cb (GtkAction *action, eab_send_as_attachment (shell, list); - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); } static void @@ -540,7 +542,7 @@ action_contact_new_cb (GtkAction *action, EAddressbookModel *model; EContact *contact; EABEditor *editor; - EBook *book; + EBookClient *book; shell_view = E_SHELL_VIEW (book_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -551,7 +553,7 @@ action_contact_new_cb (GtkAction *action, g_return_if_fail (view != NULL); model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book = e_addressbook_model_get_client (model); g_return_if_fail (book != NULL); contact = e_contact_new (); @@ -572,7 +574,7 @@ action_contact_new_list_cb (GtkAction *action, EAddressbookModel *model; EContact *contact; EABEditor *editor; - EBook *book; + EBookClient *book; shell_view = E_SHELL_VIEW (book_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -583,7 +585,7 @@ action_contact_new_list_cb (GtkAction *action, g_return_if_fail (view != NULL); model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book = e_addressbook_model_get_client (model); g_return_if_fail (book != NULL); contact = e_contact_new (); @@ -657,7 +659,7 @@ action_contact_save_as_cb (GtkAction *action, EBookShellContent *book_shell_content; EAddressbookView *view; EActivity *activity; - GList *list; + GSList *list; GFile *file; gchar *string; @@ -712,9 +714,8 @@ action_contact_save_as_cb (GtkAction *action, g_object_unref (file); -exit: - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + exit: + e_client_util_free_object_slist (list); } static void @@ -726,7 +727,7 @@ action_contact_send_message_cb (GtkAction *action, EShellWindow *shell_window; EBookShellContent *book_shell_content; EAddressbookView *view; - GList *list, *iter; + GSList *list, *iter; shell_view = E_SHELL_VIEW (book_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -753,8 +754,7 @@ action_contact_send_message_cb (GtkAction *action, eab_send_as_to (shell, list); - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); + e_client_util_free_object_slist (list); } static void diff --git a/modules/addressbook/e-book-shell-view-private.c b/modules/addressbook/e-book-shell-view-private.c index 8a05d26282..c9a233df9f 100644 --- a/modules/addressbook/e-book-shell-view-private.c +++ b/modules/addressbook/e-book-shell-view-private.c @@ -41,7 +41,7 @@ open_contact (EBookShellView *book_shell_view, EShellWindow *shell_window; EAddressbookModel *model; EABEditor *editor; - EBook *book; + EBookClient *book; gboolean editable; shell_view = E_SHELL_VIEW (book_shell_view); @@ -49,7 +49,7 @@ open_contact (EBookShellView *book_shell_view, shell = e_shell_window_get_shell (shell_window); model = e_addressbook_view_get_model (view); - book = e_addressbook_model_get_book (model); + book = e_addressbook_model_get_client (model); editable = e_addressbook_model_get_editable (model); if (e_contact_get (contact, E_CONTACT_IS_LIST)) @@ -184,21 +184,25 @@ contacts_removed (EBookShellView *book_shell_view, } static void -book_shell_view_loaded_cb (ESource *source, - GAsyncResult *result, - EAddressbookView *view) +book_shell_view_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; + ESource *source = E_SOURCE (source_object); + EAddressbookView *view = user_data; + EClient *client = NULL; + EBookClient *book; GError *error = NULL; - book = e_load_book_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; + + book = client ? E_BOOK_CLIENT (client) : NULL; if (book != NULL) { EAddressbookModel *model; g_warn_if_fail (error == NULL); model = e_addressbook_view_get_model (view); - e_addressbook_model_set_book (model, book); + e_addressbook_model_set_client (model, book); e_addressbook_model_force_folder_bar_message (model); } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { @@ -254,14 +258,11 @@ book_shell_view_activate_selected_source (EBookShellView *book_shell_view, model = e_addressbook_view_get_model (view); source = e_addressbook_view_get_source (view); - if (e_addressbook_model_get_book (model) == NULL) + if (e_addressbook_model_get_client (model) == NULL) /* XXX No way to cancel this? */ - e_load_book_source_async ( - source, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - book_shell_view_loaded_cb, - g_object_ref (view)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + book_shell_view_loaded_cb, g_object_ref (view)); } else { /* Create a view for this UID. */ @@ -304,10 +305,9 @@ book_shell_view_activate_selected_source (EBookShellView *book_shell_view, model = e_addressbook_view_get_model (view); /* XXX No way to cancel this? */ - e_load_book_source_async ( - source, GTK_WINDOW (shell_window), NULL, - (GAsyncReadyCallback) book_shell_view_loaded_cb, - g_object_ref (view)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + book_shell_view_loaded_cb, g_object_ref (view)); g_signal_connect_object ( model, "contact-changed", diff --git a/modules/addressbook/e-book-shell-view-private.h b/modules/addressbook/e-book-shell-view-private.h index 528a34d282..a715d5acdf 100644 --- a/modules/addressbook/e-book-shell-view-private.h +++ b/modules/addressbook/e-book-shell-view-private.h @@ -27,10 +27,10 @@ #include <string.h> #include <glib/gi18n.h> #include <gdk/gdkkeysyms.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libedataserver/e-categories.h> #include <libedataserver/e-sexp.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> #include "e-util/e-util.h" diff --git a/modules/addressbook/eab-composer-util.c b/modules/addressbook/eab-composer-util.c index 629f5a651a..215dacea05 100644 --- a/modules/addressbook/eab-composer-util.c +++ b/modules/addressbook/eab-composer-util.c @@ -33,7 +33,7 @@ void eab_send_as_to (EShell *shell, - GList *destinations) + GSList *destinations) { EMsgComposer *composer; EComposerHeaderTable *table; @@ -68,7 +68,7 @@ eab_send_as_to (EShell *shell, } else g_ptr_array_add (to_array, destination); - destinations = g_list_next (destinations); + destinations = g_slist_next (destinations); } /* Add sentinels to each array. */ @@ -115,12 +115,12 @@ get_email (EContact *contact, EContactField field_id, gchar **to_free) void eab_send_as_attachment (EShell *shell, - GList *destinations) + GSList *destinations) { EMsgComposer *composer; EComposerHeaderTable *table; CamelMimePart *attachment; - GList *contacts, *iter; + GSList *contacts, *iter; gchar *data; g_return_if_fail (E_IS_SHELL (shell)); @@ -133,11 +133,11 @@ eab_send_as_attachment (EShell *shell, attachment = camel_mime_part_new (); - contacts = g_list_copy (destinations); + contacts = g_slist_copy (destinations); for (iter = contacts; iter != NULL; iter = iter->next) iter->data = e_destination_get_contact (iter->data); data = eab_contact_list_to_string (contacts); - g_list_free (contacts); + g_slist_free (contacts); camel_mime_part_set_content ( attachment, data, strlen (data), "text/x-vcard"); diff --git a/modules/addressbook/eab-composer-util.h b/modules/addressbook/eab-composer-util.h index a2feb2f999..b8644ab187 100644 --- a/modules/addressbook/eab-composer-util.h +++ b/modules/addressbook/eab-composer-util.h @@ -24,9 +24,9 @@ G_BEGIN_DECLS void eab_send_as_to (EShell *shell, - GList *destinations); + GSList *destinations); void eab_send_as_attachment (EShell *shell, - GList *destinations); + GSList *destinations); G_END_DECLS diff --git a/modules/calendar/e-cal-attachment-handler.c b/modules/calendar/e-cal-attachment-handler.c index c1b03874ff..a2932a0d17 100644 --- a/modules/calendar/e-cal-attachment-handler.c +++ b/modules/calendar/e-cal-attachment-handler.c @@ -27,11 +27,10 @@ #include <glib/gi18n.h> #include <libical/ical.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <camel/camel.h> #include <libedataserverui/e-source-selector.h> - -#include "calendar/common/authentication.h" +#include <libedataserverui/e-client-utils.h> typedef struct _ImportContext ImportContext; @@ -40,9 +39,9 @@ struct _ECalAttachmentHandlerPrivate { }; struct _ImportContext { - ECal *client; + ECalClient *client; icalcomponent *component; - ECalSourceType source_type; + ECalClientSourceType source_type; }; static gpointer parent_class; @@ -110,12 +109,13 @@ attachment_handler_get_component (EAttachment *attachment) } static gboolean -attachment_handler_update_objects (ECal *client, +attachment_handler_update_objects (ECalClient *client, icalcomponent *component) { icalcomponent_kind kind; icalcomponent *vcalendar; gboolean success; + GError *error = NULL; kind = icalcomponent_isa (component); @@ -141,7 +141,10 @@ attachment_handler_update_objects (ECal *client, return FALSE; } - success = e_cal_receive_objects (client, vcalendar, NULL); + success = e_cal_client_receive_objects_sync (client, vcalendar, NULL, &error); + if (error) + g_debug ("%s: Failed to receive objects: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); icalcomponent_free (vcalendar); @@ -149,16 +152,23 @@ attachment_handler_update_objects (ECal *client, } static void -attachment_handler_import_event (ECal *client, - const GError *error, - EAttachment *attachment) +attachment_handler_import_event (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EAttachment *attachment = user_data; + EClient *client = NULL; + GError *error = NULL; icalcomponent *component; icalcomponent *subcomponent; icalcompiter iter; - /* FIXME Notify the user somehow. */ - g_return_if_fail (error == NULL); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (!client) { + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_source_peek_name (E_SOURCE (source_object)), error ? error->message : "Unknown error"); + g_object_unref (attachment); + return; + } component = attachment_handler_get_component (attachment); g_return_if_fail (component != NULL); @@ -182,23 +192,30 @@ attachment_handler_import_event (ECal *client, } /* XXX Do something with the return value. */ - attachment_handler_update_objects (client, component); + attachment_handler_update_objects (E_CAL_CLIENT (client), component); g_object_unref (attachment); g_object_unref (client); } static void -attachment_handler_import_todo (ECal *client, - const GError *error, - EAttachment *attachment) +attachment_handler_import_todo (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EAttachment *attachment = user_data; + EClient *client = NULL; + GError *error = NULL; icalcomponent *component; icalcomponent *subcomponent; icalcompiter iter; - /* FIXME Notify the user somehow. */ - g_return_if_fail (error == NULL); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (!client) { + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_source_peek_name (E_SOURCE (source_object)), error ? error->message : "Unknown error"); + g_object_unref (attachment); + return; + } component = attachment_handler_get_component (attachment); g_return_if_fail (component != NULL); @@ -222,7 +239,7 @@ attachment_handler_import_todo (ECal *client, } /* XXX Do something with the return value. */ - attachment_handler_update_objects (client, component); + attachment_handler_update_objects (E_CAL_CLIENT (client), component); g_object_unref (attachment); g_object_unref (client); @@ -237,27 +254,25 @@ attachment_handler_row_activated_cb (GtkDialog *dialog) static void attachment_handler_run_dialog (GtkWindow *parent, EAttachment *attachment, - ECalSourceType source_type, + ECalClientSourceType source_type, const gchar *title) { GtkWidget *dialog; GtkWidget *container; GtkWidget *widget; - GCallback callback; ESourceSelector *selector; ESourceList *source_list; ESource *source; - ECal *client; icalcomponent *component; GError *error = NULL; component = attachment_handler_get_component (attachment); g_return_if_fail (component != NULL); - e_cal_get_sources (&source_list, source_type, &error); + e_cal_client_get_sources (&source_list, source_type, &error); if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); + g_debug ("%s: Faield to get cal sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -309,22 +324,22 @@ attachment_handler_run_dialog (GtkWindow *parent, if (source == NULL) goto exit; - client = e_auth_new_cal_from_source (source, source_type); - if (client == NULL) - goto exit; - - if (source_type == E_CAL_SOURCE_TYPE_EVENT) - callback = G_CALLBACK (attachment_handler_import_event); - else if (source_type == E_CAL_SOURCE_TYPE_TODO) - callback = G_CALLBACK (attachment_handler_import_todo); - else - goto exit; - - g_object_ref (attachment); - g_signal_connect (client, "cal-opened-ex", callback, attachment); - e_cal_open_async (client, FALSE); + switch (source_type) { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, + attachment_handler_import_event, g_object_ref (attachment)); + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_TASKS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, + attachment_handler_import_todo, g_object_ref (attachment)); + break; + default: + break; + } -exit: + exit: gtk_widget_destroy (dialog); } @@ -348,7 +363,7 @@ attachment_handler_import_to_calendar (GtkAction *action, attachment_handler_run_dialog ( parent, attachment, - E_CAL_SOURCE_TYPE_EVENT, + E_CAL_CLIENT_SOURCE_TYPE_EVENTS, _("Select a Calendar")); g_object_unref (attachment); @@ -375,7 +390,7 @@ attachment_handler_import_to_tasks (GtkAction *action, attachment_handler_run_dialog ( parent, attachment, - E_CAL_SOURCE_TYPE_TODO, + E_CAL_CLIENT_SOURCE_TYPE_TASKS, _("Select a Task List")); g_object_unref (attachment); diff --git a/modules/calendar/e-cal-shell-backend.c b/modules/calendar/e-cal-shell-backend.c index 51ed54b810..8d0c6ef36a 100644 --- a/modules/calendar/e-cal-shell-backend.c +++ b/modules/calendar/e-cal-shell-backend.c @@ -27,11 +27,12 @@ #include <string.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-time-util.h> #include <libedataserver/e-url.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-group.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-import.h" #include "shell/e-shell.h" @@ -39,7 +40,6 @@ #include "shell/e-shell-window.h" #include "widgets/misc/e-preferences-window.h" -#include "calendar/common/authentication.h" #include "calendar/gui/comp-util.h" #include "calendar/gui/dialogs/calendar-setup.h" #include "calendar/gui/dialogs/event-editor.h" @@ -85,6 +85,7 @@ cal_shell_backend_ensure_sources (EShellBackend *shell_backend) const gchar *name; gchar *property; gboolean save_list = FALSE; + GError *error = NULL; birthdays = NULL; personal = NULL; @@ -94,10 +95,11 @@ cal_shell_backend_ensure_sources (EShellBackend *shell_backend) shell = e_shell_backend_get_shell (shell_backend); shell_settings = e_shell_get_shell_settings (shell); - if (!e_cal_get_sources ( + if (!e_cal_client_get_sources ( &cal_shell_backend->priv->source_list, - E_CAL_SOURCE_TYPE_EVENT, NULL)) { - g_warning ("Could not get calendar sources from GConf!"); + E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &error)) { + g_debug ("%s: Could not get calendar sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -234,20 +236,31 @@ cal_shell_backend_new_event (ESource *source, CompEditorFlags flags, gboolean all_day) { - ECal *cal; + EClient *client = NULL; + ECalClient *cal_client; ECalComponent *comp; EShellSettings *shell_settings; CompEditor *editor; + GError *error = NULL; /* XXX Handle errors better. */ - cal = e_load_cal_source_finish (source, result, NULL); - g_return_if_fail (E_IS_CAL (cal)); + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; + + if (!client) { + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); + return; + } + + g_return_if_fail (E_IS_CAL_CLIENT (client)); + cal_client = E_CAL_CLIENT (client); shell_settings = e_shell_get_shell_settings (shell); - editor = event_editor_new (cal, shell, flags); + editor = event_editor_new (cal_client, shell, flags); comp = cal_comp_event_new_with_current_time ( - cal, all_day, + cal_client, all_day, e_shell_settings_get_pointer ( shell_settings, "cal-timezone"), e_shell_settings_get_boolean ( @@ -262,13 +275,11 @@ cal_shell_backend_new_event (ESource *source, gtk_window_present (GTK_WINDOW (editor)); g_object_unref (comp); - g_object_unref (cal); + g_object_unref (client); } static void -cal_shell_backend_event_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +cal_shell_backend_event_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; gboolean all_day = FALSE; @@ -276,15 +287,13 @@ cal_shell_backend_event_new_cb (ESource *source, flags |= COMP_EDITOR_NEW_ITEM; flags |= COMP_EDITOR_USER_ORG; - cal_shell_backend_new_event (source, result, shell, flags, all_day); + cal_shell_backend_new_event (E_SOURCE (source_object), result, shell, flags, all_day); g_object_unref (shell); } static void -cal_shell_backend_event_all_day_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +cal_shell_backend_event_all_day_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; gboolean all_day = TRUE; @@ -292,15 +301,13 @@ cal_shell_backend_event_all_day_new_cb (ESource *source, flags |= COMP_EDITOR_NEW_ITEM; flags |= COMP_EDITOR_USER_ORG; - cal_shell_backend_new_event (source, result, shell, flags, all_day); + cal_shell_backend_new_event (E_SOURCE (source_object), result, shell, flags, all_day); g_object_unref (shell); } static void -cal_shell_backend_event_meeting_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +cal_shell_backend_event_meeting_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; gboolean all_day = FALSE; @@ -309,7 +316,7 @@ cal_shell_backend_event_meeting_new_cb (ESource *source, flags |= COMP_EDITOR_USER_ORG; flags |= COMP_EDITOR_MEETING; - cal_shell_backend_new_event (source, result, shell, flags, all_day); + cal_shell_backend_new_event (E_SOURCE (source_object), result, shell, flags, all_day); g_object_unref (shell); } @@ -324,7 +331,7 @@ action_event_new_cb (GtkAction *action, EShellSettings *shell_settings; ESource *source = NULL; ESourceList *source_list; - ECalSourceType source_type; + EClientSourceType source_type; const gchar *action_name; gchar *uid; @@ -361,7 +368,7 @@ action_event_new_cb (GtkAction *action, /* This callback is used for both appointments and meetings. */ - source_type = E_CAL_SOURCE_TYPE_EVENT; + source_type = E_CLIENT_SOURCE_TYPE_EVENTS; shell = e_shell_window_get_shell (shell_window); shell_settings = e_shell_get_shell_settings (shell); @@ -387,26 +394,17 @@ action_event_new_cb (GtkAction *action, * FIXME Need to obtain a better default time zone. */ action_name = gtk_action_get_name (action); if (strcmp (action_name, "event-all-day-new") == 0) - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - cal_shell_backend_event_all_day_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, source_type, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + cal_shell_backend_event_all_day_new_cb, g_object_ref (shell)); else if (strcmp (action_name, "event-meeting-new") == 0) - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - cal_shell_backend_event_meeting_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, source_type, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + cal_shell_backend_event_meeting_new_cb, g_object_ref (shell)); else - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - cal_shell_backend_event_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, source_type, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + cal_shell_backend_event_new_cb, g_object_ref (shell)); g_object_unref (source_list); } @@ -489,11 +487,11 @@ cal_shell_backend_handle_uri_cb (EShellBackend *shell_backend, EShellSettings *shell_settings; CompEditor *editor; CompEditorFlags flags = 0; - ECal *client; + ECalClient *client; ECalComponent *comp; ESource *source; ESourceList *source_list; - ECalSourceType source_type; + ECalClientSourceType source_type; EUri *euri; icalcomponent *icalcomp; icalproperty *icalprop; @@ -507,7 +505,7 @@ cal_shell_backend_handle_uri_cb (EShellBackend *shell_backend, gboolean handled = FALSE; GError *error = NULL; - source_type = E_CAL_SOURCE_TYPE_EVENT; + source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; shell = e_shell_backend_get_shell (shell_backend); shell_settings = e_shell_get_shell_settings (shell); @@ -589,24 +587,23 @@ cal_shell_backend_handle_uri_cb (EShellBackend *shell_backend, * we successfully open it is another matter... */ handled = TRUE; - if (!e_cal_get_sources (&source_list, source_type, NULL)) { - g_printerr ("Could not get calendar sources from GConf!\n"); + if (!e_cal_client_get_sources (&source_list, source_type, &error)) { + g_debug ("%s: Could not get calendar sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); goto exit; } source = e_source_list_peek_source_by_uid (source_list, source_uid); if (source == NULL) { - g_printerr ("No source for UID '%s'\n", source_uid); + g_debug ("%s: No source for UID '%s'", G_STRFUNC, source_uid); g_object_unref (source_list); goto exit; } - client = e_auth_new_cal_from_source (source, source_type); - if (client == NULL || !e_cal_open (client, TRUE, &error)) { - if (error != NULL) { - g_printerr ("%s\n", error->message); - g_error_free (error); - } + client = e_cal_client_new (source, source_type, &error); + if (client == NULL || !e_client_open_sync (E_CLIENT (client), TRUE, NULL, &error)) { + g_debug ("%s: Failed to create/open client '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); g_object_unref (source_list); goto exit; } @@ -619,10 +616,10 @@ cal_shell_backend_handle_uri_cb (EShellBackend *shell_backend, if (editor != NULL) goto present; - if (!e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, &error)) { - g_printerr ("%s\n", error->message); + if (!e_cal_client_get_object_sync (client, comp_uid, comp_rid, &icalcomp, NULL, &error)) { + g_debug ("%s: Failed to get object from client: %s", G_STRFUNC, error ? error->message : "Unknown error"); g_object_unref (source_list); - g_error_free (error); + g_clear_error (&error); goto exit; } diff --git a/modules/calendar/e-cal-shell-sidebar.c b/modules/calendar/e-cal-shell-sidebar.c index d49b143eef..8e3010ddb7 100644 --- a/modules/calendar/e-cal-shell-sidebar.c +++ b/modules/calendar/e-cal-shell-sidebar.c @@ -27,12 +27,12 @@ #include <string.h> #include <glib/gi18n.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-alert-dialog.h" #include "e-util/gconf-bridge.h" #include "widgets/misc/e-paned.h" -#include "calendar/common/authentication.h" #include "calendar/gui/e-calendar-selector.h" #include "calendar/gui/misc.h" #include "calendar/gui/dialogs/calendar-setup.h" @@ -56,7 +56,7 @@ struct _ECalShellSidebarPrivate { * opened. So the user first highlights a source, then * sometime later we update our default-client property * which is bound by an EBinding to ECalModel. */ - ECal *default_client; + ECalClient *default_client; GCancellable *loading_default_client; }; @@ -81,7 +81,7 @@ static GType cal_shell_sidebar_type; static void cal_shell_sidebar_emit_client_added (ECalShellSidebar *cal_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_ADDED]; @@ -90,7 +90,7 @@ cal_shell_sidebar_emit_client_added (ECalShellSidebar *cal_shell_sidebar, static void cal_shell_sidebar_emit_client_removed (ECalShellSidebar *cal_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_REMOVED]; @@ -108,7 +108,7 @@ cal_shell_sidebar_emit_status_message (ECalShellSidebar *cal_shell_sidebar, static void cal_shell_sidebar_backend_died_cb (ECalShellSidebar *cal_shell_sidebar, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -123,7 +123,7 @@ cal_shell_sidebar_backend_died_cb (ECalShellSidebar *cal_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_object_ref (source); @@ -141,7 +141,7 @@ cal_shell_sidebar_backend_died_cb (ECalShellSidebar *cal_shell_sidebar, static void cal_shell_sidebar_backend_error_cb (ECalShellSidebar *cal_shell_sidebar, const gchar *message, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -153,7 +153,7 @@ cal_shell_sidebar_backend_error_cb (ECalShellSidebar *cal_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); source_group = e_source_peek_group (source); e_alert_submit ( @@ -164,38 +164,43 @@ cal_shell_sidebar_backend_error_cb (ECalShellSidebar *cal_shell_sidebar, } static void -cal_shell_sidebar_client_opened_cb (ECalShellSidebar *cal_shell_sidebar, - const GError *error, - ECal *client) +cal_shell_sidebar_client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + ECalClient *client = E_CAL_CLIENT (source_object); + ECalShellSidebar *cal_shell_sidebar = user_data; EShellView *shell_view; EShellContent *shell_content; EShellSidebar *shell_sidebar; const gchar *message; + GError *error = NULL; shell_sidebar = E_SHELL_SIDEBAR (cal_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - if (g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED) || - g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED)) - e_auth_cal_forget_password (client); + e_client_open_finish (E_CLIENT (client), result, &error); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_REQUIRED)) + e_client_utils_forget_password (E_CLIENT (client)); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) { + e_client_open (E_CLIENT (client), FALSE, NULL, cal_shell_sidebar_client_opened_cb, user_data); + g_clear_error (&error); + return; + } /* Handle errors. */ - switch (error ? error->code : E_CALENDAR_STATUS_OK) { - case E_CALENDAR_STATUS_OK: + switch ((error && error->domain == E_CLIENT_ERROR) ? error->code : -1) { + case -1: break; - case E_CALENDAR_STATUS_AUTHENTICATION_FAILED: - e_cal_open_async (client, FALSE); - return; - - case E_CALENDAR_STATUS_BUSY: + case E_CLIENT_ERROR_BUSY: + g_debug ("%s: Cannot open '%s', it's busy (%s)", G_STRFUNC, e_source_peek_name (e_client_get_source (E_CLIENT (client))), error->message); + g_clear_error (&error); return; - case E_CALENDAR_STATUS_REPOSITORY_OFFLINE: + case E_CLIENT_ERROR_REPOSITORY_OFFLINE: e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:prompt-no-contents-offline-calendar", @@ -203,7 +208,7 @@ cal_shell_sidebar_client_opened_cb (ECalShellSidebar *cal_shell_sidebar, /* fall through */ default: - if (error->code != E_CALENDAR_STATUS_REPOSITORY_OFFLINE) { + if (error->code != E_CLIENT_ERROR_REPOSITORY_OFFLINE) { e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:failed-open-calendar", @@ -212,15 +217,12 @@ cal_shell_sidebar_client_opened_cb (ECalShellSidebar *cal_shell_sidebar, e_cal_shell_sidebar_remove_source ( cal_shell_sidebar, - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); + g_clear_error (&error); return; } - g_assert (error == NULL); - - g_signal_handlers_disconnect_matched ( - client, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, - cal_shell_sidebar_client_opened_cb, NULL); + g_clear_error (&error); message = _("Loading calendars"); cal_shell_sidebar_emit_status_message (cal_shell_sidebar, message); @@ -229,27 +231,31 @@ cal_shell_sidebar_client_opened_cb (ECalShellSidebar *cal_shell_sidebar, } static void -cal_shell_sidebar_default_loaded_cb (ESource *source, - GAsyncResult *result, - EShellSidebar *shell_sidebar) +cal_shell_sidebar_default_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EShellSidebar *shell_sidebar = user_data; ECalShellSidebarPrivate *priv; EShellContent *shell_content; EShellView *shell_view; - ECal *client; + ECalShellContent *cal_shell_content; + ECalModel *model; + EClient *client = NULL; GError *error = NULL; priv = E_CAL_SHELL_SIDEBAR (shell_sidebar)->priv; shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); + cal_shell_content = E_CAL_SHELL_CONTENT (shell_content); + model = e_cal_shell_content_get_model (cal_shell_content); - client = e_load_cal_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { g_error_free (error); goto exit; - } else if (error != NULL) { e_alert_submit ( E_ALERT_SINK (shell_content), @@ -259,16 +265,18 @@ cal_shell_sidebar_default_loaded_cb (ESource *source, goto exit; } - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); if (priv->default_client != NULL) g_object_unref (priv->default_client); - priv->default_client = client; + priv->default_client = E_CAL_CLIENT (client); + + e_cal_client_set_default_timezone (priv->default_client, e_cal_model_get_timezone (model)); g_object_notify (G_OBJECT (shell_sidebar), "default-client"); -exit: + exit: g_object_unref (shell_sidebar); } @@ -279,29 +287,18 @@ cal_shell_sidebar_set_default (ECalShellSidebar *cal_shell_sidebar, ECalShellSidebarPrivate *priv; EShellView *shell_view; EShellWindow *shell_window; - EShellContent *shell_content; EShellSidebar *shell_sidebar; - ECalShellContent *cal_shell_content; - ECalSourceType source_type; - ECalModel *model; - ECal *client; - icaltimezone *timezone; + ECalClient *client; const gchar *uid; priv = cal_shell_sidebar->priv; - source_type = E_CAL_SOURCE_TYPE_EVENT; /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to ECalShellView. */ shell_sidebar = E_SHELL_SIDEBAR (cal_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); - shell_content = e_shell_view_get_shell_content (shell_view); shell_window = e_shell_view_get_shell_window (shell_view); - cal_shell_content = E_CAL_SHELL_CONTENT (shell_content); - model = e_cal_shell_content_get_model (cal_shell_content); - timezone = e_cal_model_get_timezone (model); - /* Cancel any unfinished previous request. */ if (priv->loading_default_client != NULL) { g_cancellable_cancel (priv->loading_default_client); @@ -324,11 +321,9 @@ cal_shell_sidebar_set_default (ECalShellSidebar *cal_shell_sidebar, priv->loading_default_client = g_cancellable_new (); - e_load_cal_source_async ( - source, source_type, timezone, - GTK_WINDOW (shell_window), priv->loading_default_client, - (GAsyncReadyCallback) cal_shell_sidebar_default_loaded_cb, - g_object_ref (shell_sidebar)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_EVENTS, FALSE, priv->loading_default_client, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + cal_shell_sidebar_default_loaded_cb, g_object_ref (shell_sidebar)); } static void @@ -702,7 +697,7 @@ cal_shell_sidebar_check_state (EShellSidebar *shell_sidebar) source = e_source_selector_get_primary_selection (selector); if (source != NULL) { - ECal *client; + ECalClient *client; const gchar *uri; const gchar *delete; @@ -717,7 +712,7 @@ cal_shell_sidebar_check_state (EShellSidebar *shell_sidebar) cal_shell_sidebar->priv->client_table, e_source_peek_uid (source)); refresh_supported = - client && e_cal_get_refresh_supported (client); + client && e_client_check_refresh_supported (E_CLIENT (client)); } if (source != NULL) @@ -734,7 +729,7 @@ cal_shell_sidebar_check_state (EShellSidebar *shell_sidebar) static void cal_shell_sidebar_client_removed (ECalShellSidebar *cal_shell_sidebar, - ECal *client) + ECalClient *client) { ESourceSelector *selector; GHashTable *client_table; @@ -748,7 +743,7 @@ cal_shell_sidebar_client_removed (ECalShellSidebar *cal_shell_sidebar, client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, cal_shell_sidebar); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_return_if_fail (uid != NULL); @@ -793,9 +788,9 @@ cal_shell_sidebar_class_init (ECalShellSidebarClass *class) PROP_DEFAULT_CLIENT, g_param_spec_object ( "default-client", - "Default Calendar Client", + "Default Calendar ECalClient", "Default client for calendar operations", - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READABLE)); g_object_class_install_property ( @@ -816,7 +811,7 @@ cal_shell_sidebar_class_init (ECalShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[CLIENT_REMOVED] = g_signal_new ( "client-removed", @@ -826,7 +821,7 @@ cal_shell_sidebar_class_init (ECalShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[STATUS_MESSAGE] = g_signal_new ( "status-message", @@ -917,7 +912,7 @@ e_cal_shell_sidebar_get_date_navigator (ECalShellSidebar *cal_shell_sidebar) return E_CALENDAR (cal_shell_sidebar->priv->date_navigator); } -ECal * +ECalClient * e_cal_shell_sidebar_get_default_client (ECalShellSidebar *cal_shell_sidebar) { g_return_val_if_fail ( @@ -943,12 +938,12 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, EShellContent *shell_content; EShellSidebar *shell_sidebar; ECalShellContent *cal_shell_content; - ECalSourceType source_type; + ECalClientSourceType source_type; ESourceSelector *selector; GHashTable *client_table; ECalModel *model; - ECal *default_client; - ECal *client; + ECalClient *default_client; + ECalClient *client; icaltimezone *timezone; const gchar *uid; const gchar *uri; @@ -957,7 +952,7 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, g_return_if_fail (E_IS_CAL_SHELL_SIDEBAR (cal_shell_sidebar)); g_return_if_fail (E_IS_SOURCE (source)); - source_type = E_CAL_SOURCE_TYPE_EVENT; + source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; client_table = cal_shell_sidebar->priv->client_table; default_client = cal_shell_sidebar->priv->default_client; selector = e_cal_shell_sidebar_get_selector (cal_shell_sidebar); @@ -972,15 +967,18 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, ESource *default_source; const gchar *default_uid; - default_source = e_cal_get_source (default_client); + default_source = e_client_get_source (E_CLIENT (default_client)); default_uid = e_source_peek_uid (default_source); if (g_strcmp0 (uid, default_uid) == 0) client = g_object_ref (default_client); } - if (client == NULL) - client = e_auth_new_cal_from_source (source, source_type); + if (client == NULL) { + client = e_cal_client_new (source, source_type, NULL); + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + } g_return_if_fail (client != NULL); @@ -997,17 +995,12 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, g_hash_table_insert (client_table, g_strdup (uid), client); e_source_selector_select_source (selector, source); - uri = e_cal_get_uri (client); + uri = e_client_get_uri (E_CLIENT (client)); /* Translators: The string field is a URI. */ message = g_strdup_printf (_("Opening calendar at %s"), uri); cal_shell_sidebar_emit_status_message (cal_shell_sidebar, message); g_free (message); - g_signal_connect_swapped ( - client, "cal-opened-ex", - G_CALLBACK (cal_shell_sidebar_client_opened_cb), - cal_shell_sidebar); - /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to ECalShellView. */ shell_sidebar = E_SHELL_SIDEBAR (cal_shell_sidebar); @@ -1018,8 +1011,8 @@ e_cal_shell_sidebar_add_source (ECalShellSidebar *cal_shell_sidebar, model = e_cal_shell_content_get_model (cal_shell_content); timezone = e_cal_model_get_timezone (model); - e_cal_set_default_timezone (client, timezone, NULL); - e_cal_open_async (client, FALSE); + e_cal_client_set_default_timezone (client, timezone); + e_client_open (E_CLIENT (client), FALSE, NULL, cal_shell_sidebar_client_opened_cb, cal_shell_sidebar); } void @@ -1027,7 +1020,7 @@ e_cal_shell_sidebar_remove_source (ECalShellSidebar *cal_shell_sidebar, ESource *source) { GHashTable *client_table; - ECal *client; + ECalClient *client; const gchar *uid; g_return_if_fail (E_IS_CAL_SHELL_SIDEBAR (cal_shell_sidebar)); diff --git a/modules/calendar/e-cal-shell-sidebar.h b/modules/calendar/e-cal-shell-sidebar.h index 6919d7ab52..3e4d00a87f 100644 --- a/modules/calendar/e-cal-shell-sidebar.h +++ b/modules/calendar/e-cal-shell-sidebar.h @@ -22,7 +22,7 @@ #ifndef E_CAL_SHELL_SIDEBAR_H #define E_CAL_SHELL_SIDEBAR_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserverui/e-source-selector.h> #include <shell/e-shell-sidebar.h> @@ -71,9 +71,9 @@ struct _ECalShellSidebarClass { /* Signals */ void (*client_added) (ECalShellSidebar *cal_shell_sidebar, - ECal *client); + ECalClient *client); void (*client_removed) (ECalShellSidebar *cal_shell_sidebar, - ECal *client); + ECalClient *client); void (*status_message) (ECalShellSidebar *cal_shell_sidebar, const gchar *status_message); }; @@ -86,7 +86,7 @@ GList * e_cal_shell_sidebar_get_clients (ECalShellSidebar *cal_shell_sidebar); ECalendar * e_cal_shell_sidebar_get_date_navigator (ECalShellSidebar *cal_shell_sidebar); -ECal * e_cal_shell_sidebar_get_default_client +ECalClient * e_cal_shell_sidebar_get_default_client (ECalShellSidebar *cal_shell_sidebar); ESourceSelector * e_cal_shell_sidebar_get_selector diff --git a/modules/calendar/e-cal-shell-view-actions.c b/modules/calendar/e-cal-shell-view-actions.c index c82f0036f5..6537cde8b4 100644 --- a/modules/calendar/e-cal-shell-view-actions.c +++ b/modules/calendar/e-cal-shell-view-actions.c @@ -51,7 +51,7 @@ action_calendar_copy_cb (GtkAction *action, copy_source_dialog ( GTK_WINDOW (shell_window), - source, E_CAL_SOURCE_TYPE_EVENT); + source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS); } static void @@ -67,7 +67,7 @@ action_calendar_delete_cb (GtkAction *action, GnomeCalendarViewType view_type; GnomeCalendar *calendar; ECalModel *model; - ECal *client; + ECalClient *client; ESourceSelector *selector; ESourceGroup *source_group; ESourceList *source_list; @@ -102,14 +102,14 @@ action_calendar_delete_cb (GtkAction *action, uri = e_source_get_uri (source); client = e_cal_model_get_client_for_uri (model, uri); if (client == NULL) - client = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_EVENT); + client = e_cal_client_new_from_uri (uri, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, NULL); g_free (uri); g_return_if_fail (client != NULL); - if (!e_cal_remove (client, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + if (!e_client_remove_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to remove client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -125,8 +125,8 @@ action_calendar_delete_cb (GtkAction *action, source_list = e_cal_shell_backend_get_source_list ( E_CAL_SHELL_BACKEND (shell_backend)); if (!e_source_list_sync (source_list, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + g_debug ("%s: Failed to sync source list: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -362,7 +362,7 @@ action_calendar_refresh_cb (GtkAction *action, ECalShellContent *cal_shell_content; ECalShellSidebar *cal_shell_sidebar; ESourceSelector *selector; - ECal *client; + ECalClient *client; ECalModel *model; ESource *source; gchar *uri; @@ -384,14 +384,11 @@ action_calendar_refresh_cb (GtkAction *action, if (client == NULL) return; - g_return_if_fail (e_cal_get_refresh_supported (client)); + g_return_if_fail (e_client_check_refresh_supported (E_CLIENT (client))); - if (!e_cal_refresh (client, &error) && error) { - g_warning ( - "%s: Failed to refresh '%s', %s\n", - G_STRFUNC, e_source_peek_name (source), - error->message); - g_error_free (error); + if (!e_client_refresh_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to refresh '%s', %s\n", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -499,8 +496,9 @@ action_event_copy_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarView *calendar_view; ESource *source_source = NULL, *destination_source = NULL; - ECal *destination_client = NULL; + ECalClient *destination_client = NULL; GList *selected, *iter; + GError *error = NULL; shell_view = E_SHELL_VIEW (cal_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -517,22 +515,27 @@ action_event_copy_cb (GtkAction *action, ECalendarViewEvent *event = selected->data; if (is_comp_data_valid (event) && event->comp_data->client) - source_source = e_cal_get_source (event->comp_data->client); + source_source = e_client_get_source (E_CLIENT (event->comp_data->client)); } /* Get a destination source from the user. */ destination_source = select_source_dialog ( - GTK_WINDOW (shell_window), E_CAL_SOURCE_TYPE_EVENT, source_source); + GTK_WINDOW (shell_window), E_CAL_CLIENT_SOURCE_TYPE_EVENTS, source_source); if (destination_source == NULL) return; /* Open the destination calendar. */ - destination_client = e_auth_new_cal_from_source ( - destination_source, E_CAL_SOURCE_TYPE_EVENT); + destination_client = e_cal_client_new ( + destination_source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, NULL); if (destination_client == NULL) goto exit; - if (!e_cal_open (destination_client, FALSE, NULL)) + g_signal_connect (destination_client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!e_client_open_sync (E_CLIENT (destination_client), FALSE, NULL, &error)) { + g_debug ("%s: Failed to open destination client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); goto exit; + } e_cal_shell_view_set_status_message ( cal_shell_view, _("Copying Items"), -1.0); @@ -565,7 +568,7 @@ action_event_delegate_cb (GtkAction *action, ECalendarView *calendar_view; ECalendarViewEvent *event; ECalComponent *component; - ECal *client; + ECalClient *client; GList *selected; icalcomponent *clone; icalproperty *property; @@ -702,7 +705,7 @@ action_event_forward_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarViewEvent *event; ECalComponent *component; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; GList *selected; @@ -769,8 +772,9 @@ action_event_move_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarView *calendar_view; ESource *source_source = NULL, *destination_source = NULL; - ECal *destination_client = NULL; + ECalClient *destination_client = NULL; GList *selected, *iter; + GError *error = NULL; shell_view = E_SHELL_VIEW (cal_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -787,22 +791,26 @@ action_event_move_cb (GtkAction *action, ECalendarViewEvent *event = selected->data; if (is_comp_data_valid (event) && event->comp_data->client) - source_source = e_cal_get_source (event->comp_data->client); + source_source = e_client_get_source (E_CLIENT (event->comp_data->client)); } /* Get a destination source from the user. */ destination_source = select_source_dialog ( - GTK_WINDOW (shell_window), E_CAL_SOURCE_TYPE_EVENT, source_source); + GTK_WINDOW (shell_window), E_CAL_CLIENT_SOURCE_TYPE_EVENTS, source_source); if (destination_source == NULL) return; /* Open the destination calendar. */ - destination_client = e_auth_new_cal_from_source ( - destination_source, E_CAL_SOURCE_TYPE_EVENT); + destination_client = e_cal_client_new (destination_source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, NULL); if (destination_client == NULL) goto exit; - if (!e_cal_open (destination_client, FALSE, NULL)) + g_signal_connect (destination_client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!e_client_open_sync (E_CLIENT (destination_client), FALSE, NULL, &error)) { + g_debug ("%s: Failed to open destination client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); goto exit; + } e_cal_shell_view_set_status_message ( cal_shell_view, _("Moving Items"), -1.0); @@ -856,7 +864,7 @@ action_event_occurrence_movable_cb (GtkAction *action, ECalComponent *recurring_component; ECalComponentDateTime date; ECalComponentId *id; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; icaltimetype itt; icaltimezone *timezone; @@ -922,14 +930,14 @@ action_event_occurrence_movable_cb (GtkAction *action, * since at present the updates happend synchronously so our * event may disappear. */ - e_cal_remove_object_with_mod ( - client, id->uid, id->rid, CALOBJ_MOD_THIS, NULL); + e_cal_client_remove_object_sync ( + client, id->uid, id->rid, CALOBJ_MOD_THIS, NULL, NULL); e_cal_component_free_id (id); g_object_unref (recurring_component); icalcomp = e_cal_component_get_icalcomponent (exception_component); - if (e_cal_create_object (client, icalcomp, &uid, NULL)) + if (e_cal_client_create_object_sync (client, icalcomp, &uid, NULL, NULL)) g_free (uid); g_object_unref (exception_component); @@ -965,7 +973,7 @@ action_event_print_cb (GtkAction *action, ECalendarViewEvent *event; ECalComponent *component; ECalModel *model; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; GList *selected; @@ -1011,7 +1019,7 @@ action_event_reply_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarViewEvent *event; ECalComponent *component; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; GList *selected; gboolean reply_all = FALSE; @@ -1055,7 +1063,7 @@ action_event_reply_all_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarViewEvent *event; ECalComponent *component; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; GList *selected; gboolean reply_all = TRUE; @@ -1102,7 +1110,7 @@ action_event_save_as_cb (GtkAction *action, GnomeCalendar *calendar; ECalendarView *calendar_view; ECalendarViewEvent *event; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; EActivity *activity; GList *selected; @@ -1140,7 +1148,7 @@ action_event_save_as_cb (GtkAction *action, if (file == NULL) return; - string = e_cal_get_component_as_string (client, icalcomp); + string = e_cal_client_get_component_as_string (client, icalcomp); if (string == NULL) { g_warning ("Could not convert item to a string"); goto exit; @@ -1172,7 +1180,7 @@ edit_event_as (ECalShellView *cal_shell_view, gboolean as_meeting) GnomeCalendar *calendar; ECalendarView *calendar_view; ECalendarViewEvent *event; - ECal *client; + ECalClient *client; icalcomponent *icalcomp; GList *selected; diff --git a/modules/calendar/e-cal-shell-view-memopad.c b/modules/calendar/e-cal-shell-view-memopad.c index 84d14cf09b..e154667826 100644 --- a/modules/calendar/e-cal-shell-view-memopad.c +++ b/modules/calendar/e-cal-shell-view-memopad.c @@ -66,7 +66,7 @@ action_calendar_memopad_new_cb (GtkAction *action, ECalShellContent *cal_shell_content; EMemoTable *memo_table; ECalModelComponent *comp_data; - ECal *client; + ECalClient *client; ECalComponent *comp; CompEditor *editor; GSList *list; @@ -224,7 +224,7 @@ action_calendar_memopad_save_as_cb (GtkAction *action, return; /* XXX We only save the first selected memo. */ - string = e_cal_get_component_as_string ( + string = e_cal_client_get_component_as_string ( comp_data->client, comp_data->icalcomp); if (string == NULL) { g_warning ("Could not convert memo to a string."); @@ -355,7 +355,7 @@ e_cal_shell_view_memopad_actions_update (ECalShellView *cal_shell_view) icalproperty *prop; gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); + read_only = e_client_is_readonly (E_CLIENT (comp_data->client)); editable &= !read_only; prop = icalcomponent_get_first_property ( diff --git a/modules/calendar/e-cal-shell-view-private.c b/modules/calendar/e-cal-shell-view-private.c index c6c9fa5673..d4cee1a627 100644 --- a/modules/calendar/e-cal-shell-view-private.c +++ b/modules/calendar/e-cal-shell-view-private.c @@ -283,7 +283,7 @@ cal_shell_view_selector_popup_event_cb (EShellView *shell_view, static void cal_shell_view_selector_client_added_cb (ECalShellView *cal_shell_view, - ECal *client) + ECalClient *client) { ECalShellContent *cal_shell_content; GnomeCalendar *calendar; @@ -300,7 +300,7 @@ cal_shell_view_selector_client_added_cb (ECalShellView *cal_shell_view, static void cal_shell_view_selector_client_removed_cb (ECalShellView *cal_shell_view, - ECal *client) + ECalClient *client) { ECalShellContent *cal_shell_content; GnomeCalendar *calendar; @@ -341,12 +341,12 @@ cal_shell_view_user_created_cb (ECalShellView *cal_shell_view, { ECalShellSidebar *cal_shell_sidebar; ECalModel *model; - ECal *client; + ECalClient *client; ESource *source; model = e_calendar_view_get_model (calendar_view); client = e_cal_model_get_default_client (model); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); cal_shell_sidebar = cal_shell_view->priv->cal_shell_sidebar; e_cal_shell_sidebar_add_source (cal_shell_sidebar, source); @@ -824,7 +824,7 @@ e_cal_shell_view_set_status_message (ECalShellView *cal_shell_view, void e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, ECalendarViewEvent *event, - ECal *destination_client, + ECalClient *destination_client, gboolean remove) { icalcomponent *icalcomp; @@ -838,7 +838,7 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, g_return_if_fail (E_IS_CAL_SHELL_VIEW (cal_shell_view)); g_return_if_fail (event != NULL); - g_return_if_fail (E_IS_CAL (destination_client)); + g_return_if_fail (E_IS_CAL_CLIENT (destination_client)); if (!is_comp_data_valid (event)) return; @@ -848,25 +848,26 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, /* Put the new object into the destination calendar. */ - success = e_cal_get_object ( - destination_client, uid, NULL, &icalcomp, NULL); + success = e_cal_client_get_object_sync ( + destination_client, uid, NULL, &icalcomp, NULL, NULL); if (success) { icalcomponent_free (icalcomp); - success = e_cal_modify_object ( + success = e_cal_client_modify_object_sync ( destination_client, icalcomp_event, - CALOBJ_MOD_ALL, NULL); + CALOBJ_MOD_ALL, NULL, NULL); /* do not delete the event when it was found in the calendar */ return; } else { icalproperty *icalprop; gchar *new_uid; + GError *error = NULL; if (e_cal_util_component_is_instance (icalcomp_event)) { - success = e_cal_get_object ( + success = e_cal_client_get_object_sync ( event->comp_data->client, - uid, NULL, &icalcomp, NULL); + uid, NULL, &icalcomp, NULL, NULL); if (success) { /* Use master object when working * with a recurring event ... */ @@ -904,10 +905,11 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, } new_uid = NULL; - success = e_cal_create_object ( - destination_client, icalcomp_clone, &new_uid, NULL); + success = e_cal_client_create_object_sync ( + destination_client, icalcomp_clone, &new_uid, NULL, &error); if (!success) { icalcomponent_free (icalcomp_clone); + g_debug ("%s: Failed to create object: %s", G_STRFUNC, error ? error->message : "Unknown error"); return; } @@ -916,7 +918,7 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, } if (remove) { - ECal *source_client = event->comp_data->client; + ECalClient *source_client = event->comp_data->client; /* Remove the item from the source calendar. */ if (e_cal_util_component_is_instance (icalcomp_event) || @@ -930,11 +932,11 @@ e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, rid = icaltime_as_ical_string_r (icaltime); else rid = NULL; - e_cal_remove_object_with_mod ( - source_client, uid, rid, CALOBJ_MOD_ALL, NULL); + e_cal_client_remove_object_sync ( + source_client, uid, rid, CALOBJ_MOD_ALL, NULL, NULL); g_free (rid); } else - e_cal_remove_object (source_client, uid, NULL); + e_cal_client_remove_object_sync (source_client, uid, NULL, CALOBJ_MOD_THIS, NULL, NULL); } } @@ -1091,10 +1093,10 @@ e_cal_shell_view_update_timezone (ECalShellView *cal_shell_view) clients = e_cal_shell_sidebar_get_clients (cal_shell_sidebar); for (iter = clients; iter != NULL; iter = iter->next) { - ECal *client = iter->data; + ECalClient *client = iter->data; - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) - e_cal_set_default_timezone (client, timezone, NULL); + if (e_client_is_opened (E_CLIENT (client))) + e_cal_client_set_default_timezone (client, timezone); } g_list_free (clients); diff --git a/modules/calendar/e-cal-shell-view-private.h b/modules/calendar/e-cal-shell-view-private.h index 52ec374295..7c78130fc3 100644 --- a/modules/calendar/e-cal-shell-view-private.h +++ b/modules/calendar/e-cal-shell-view-private.h @@ -31,6 +31,7 @@ #include <libedataserver/e-categories.h> #include <libedataserver/e-data-server-util.h> #include <libedataserver/e-sexp.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-account-utils.h" #include "e-util/e-selection.h" @@ -41,7 +42,6 @@ #include "misc/e-popup-action.h" #include "misc/e-selectable.h" -#include "calendar/common/authentication.h" #include "calendar/gui/calendar-config.h" #include "calendar/gui/comp-util.h" #include "calendar/gui/e-cal-list-view.h" @@ -142,7 +142,7 @@ void e_cal_shell_view_set_status_message void e_cal_shell_view_transfer_item_to (ECalShellView *cal_shell_view, ECalendarViewEvent *event, - ECal *destination_client, + ECalClient *destination_client, gboolean remove); void e_cal_shell_view_update_sidebar (ECalShellView *cal_shell_view); diff --git a/modules/calendar/e-cal-shell-view-taskpad.c b/modules/calendar/e-cal-shell-view-taskpad.c index 48fd850790..48c81ac085 100644 --- a/modules/calendar/e-cal-shell-view-taskpad.c +++ b/modules/calendar/e-cal-shell-view-taskpad.c @@ -135,7 +135,7 @@ action_calendar_taskpad_new_cb (GtkAction *action, ECalShellContent *cal_shell_content; ECalModelComponent *comp_data; ETaskTable *task_table; - ECal *client; + ECalClient *client; ECalComponent *comp; CompEditor *editor; GSList *list; @@ -290,7 +290,7 @@ action_calendar_taskpad_save_as_cb (GtkAction *action, if (file == NULL) return; - string = e_cal_get_component_as_string ( + string = e_cal_client_get_component_as_string ( comp_data->client, comp_data->icalcomp); if (string == NULL) { g_warning ("Could not convert task to a string"); @@ -446,15 +446,15 @@ e_cal_shell_view_taskpad_actions_update (ECalShellView *cal_shell_view) const gchar *cap; gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); + read_only = e_client_is_readonly (E_CLIENT (comp_data->client)); editable &= !read_only; cap = CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT; - if (e_cal_get_static_capability (comp_data->client, cap)) + if (e_client_check_capability (E_CLIENT (comp_data->client), cap)) assignable = FALSE; cap = CAL_STATIC_CAPABILITY_NO_CONV_TO_ASSIGN_TASK; - if (e_cal_get_static_capability (comp_data->client, cap)) + if (e_client_check_capability (E_CLIENT (comp_data->client), cap)) assignable = FALSE; prop = icalcomponent_get_first_property ( diff --git a/modules/calendar/e-cal-shell-view.c b/modules/calendar/e-cal-shell-view.c index 1d7269cd55..2249bf96e4 100644 --- a/modules/calendar/e-cal-shell-view.c +++ b/modules/calendar/e-cal-shell-view.c @@ -353,7 +353,7 @@ cal_shell_view_update_actions (EShellView *shell_view) for (iter = list; iter != NULL; iter = iter->next) { ECalendarViewEvent *event = iter->data; - ECal *client; + ECalClient *client; ECalComponent *comp; icalcomponent *icalcomp; gchar *user_email = NULL; @@ -366,7 +366,7 @@ cal_shell_view_update_actions (EShellView *shell_view) client = event->comp_data->client; icalcomp = event->comp_data->icalcomp; - e_cal_is_read_only (client, &read_only, NULL); + read_only = e_client_is_readonly (E_CLIENT (client)); editable = editable && !read_only; is_instance |= e_cal_util_component_is_instance (icalcomp); @@ -391,11 +391,9 @@ cal_shell_view_update_actions (EShellView *shell_view) itip_organizer_is_user (comp, client); is_delegatable = - e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_DELEGATE_SUPPORTED) && - ((e_cal_get_static_capability ( - client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) || - (!user_org && !is_delegated (icalcomp, user_email))); + e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_DELEGATE_SUPPORTED) && + (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY) || + (!user_org && !is_delegated (icalcomp, user_email))); g_free (user_email); g_object_unref (comp); diff --git a/modules/calendar/e-calendar-preferences.c b/modules/calendar/e-calendar-preferences.c index ec15e3c2d1..f35c88a6ed 100644 --- a/modules/calendar/e-calendar-preferences.c +++ b/modules/calendar/e-calendar-preferences.c @@ -435,7 +435,7 @@ show_alarms_config (ECalendarPreferences *prefs) { GConfClient *gconf; - if (e_cal_get_sources (&prefs->alarms_list, E_CAL_SOURCE_TYPE_EVENT, NULL)) { + if (e_cal_client_get_sources (&prefs->alarms_list, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, NULL)) { prefs->alarm_list_widget = e_source_selector_new (prefs->alarms_list); atk_object_set_name (gtk_widget_get_accessible (prefs->alarm_list_widget), _("Selected Calendars for Alarms")); gtk_container_add (GTK_CONTAINER (prefs->scrolled_window), prefs->alarm_list_widget); diff --git a/modules/calendar/e-memo-shell-backend.c b/modules/calendar/e-memo-shell-backend.c index e99e3e2931..8d39843054 100644 --- a/modules/calendar/e-memo-shell-backend.c +++ b/modules/calendar/e-memo-shell-backend.c @@ -27,17 +27,17 @@ #include <string.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserver/e-url.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> #include <libedataserver/e-source-group.h> +#include <libedataserverui/e-client-utils.h> #include "shell/e-shell.h" #include "shell/e-shell-backend.h" #include "shell/e-shell-window.h" -#include "calendar/common/authentication.h" #include "calendar/gui/comp-util.h" #include "calendar/gui/dialogs/calendar-setup.h" #include "calendar/gui/dialogs/memo-editor.h" @@ -75,6 +75,7 @@ memo_shell_backend_ensure_sources (EShellBackend *shell_backend) GSList *sources, *iter; const gchar *name; gboolean save_list = FALSE; + GError *error = NULL; personal = NULL; @@ -83,10 +84,11 @@ memo_shell_backend_ensure_sources (EShellBackend *shell_backend) shell = e_shell_backend_get_shell (shell_backend); shell_settings = e_shell_get_shell_settings (shell); - if (!e_cal_get_sources ( + if (!e_cal_client_get_sources ( &memo_shell_backend->priv->source_list, - E_CAL_SOURCE_TYPE_JOURNAL, NULL)) { - g_warning ("Could not get memo sources from GConf!"); + E_CAL_CLIENT_SOURCE_TYPE_MEMOS, &error)) { + g_debug ("%s: Could not get memo sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -164,43 +166,50 @@ memo_shell_backend_new_memo (ESource *source, EShell *shell, CompEditorFlags flags) { - ECal *cal; + EClient *client = NULL; + ECalClient *cal_client; ECalComponent *comp; CompEditor *editor; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; /* XXX Handle errors better. */ - cal = e_load_cal_source_finish (source, result, NULL); - g_return_if_fail (E_IS_CAL (cal)); + if (!client) { + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); + return; + } - comp = cal_comp_memo_new_with_defaults (cal); + g_return_if_fail (E_IS_CAL_CLIENT (client)); + + cal_client = E_CAL_CLIENT (client); + comp = cal_comp_memo_new_with_defaults (cal_client); cal_comp_update_time_by_active_window (comp, shell); - editor = memo_editor_new (cal, shell, flags); + editor = memo_editor_new (cal_client, shell, flags); comp_editor_edit_comp (editor, comp); gtk_window_present (GTK_WINDOW (editor)); g_object_unref (comp); - g_object_unref (cal); + g_object_unref (client); } static void -memo_shell_backend_memo_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +memo_shell_backend_memo_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; flags |= COMP_EDITOR_NEW_ITEM; - memo_shell_backend_new_memo (source, result, shell, flags); + memo_shell_backend_new_memo (E_SOURCE (source_object), result, shell, flags); g_object_unref (shell); } static void -memo_shell_backend_memo_shared_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +memo_shell_backend_memo_shared_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; @@ -208,7 +217,7 @@ memo_shell_backend_memo_shared_new_cb (ESource *source, flags |= COMP_EDITOR_IS_SHARED; flags |= COMP_EDITOR_USER_ORG; - memo_shell_backend_new_memo (source, result, shell, flags); + memo_shell_backend_new_memo (E_SOURCE (source_object), result, shell, flags); g_object_unref (shell); } @@ -222,14 +231,11 @@ action_memo_new_cb (GtkAction *action, EShellSettings *shell_settings; ESource *source = NULL; ESourceList *source_list; - ECalSourceType source_type; const gchar *action_name; gchar *uid; /* This callback is used for both memos and shared memos. */ - source_type = E_CAL_SOURCE_TYPE_JOURNAL; - shell = e_shell_window_get_shell (shell_window); shell_settings = e_shell_get_shell_settings (shell); shell_backend = e_shell_get_backend_by_name (shell, "memos"); @@ -254,19 +260,13 @@ action_memo_new_cb (GtkAction *action, * FIXME Need to obtain a better default time zone. */ action_name = gtk_action_get_name (action); if (g_strcmp0 (action_name, "memo-shared-new") == 0) - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - memo_shell_backend_memo_shared_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + memo_shell_backend_memo_shared_new_cb, g_object_ref (shell)); else - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - memo_shell_backend_memo_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + memo_shell_backend_memo_new_cb, g_object_ref (shell)); g_object_unref (source_list); } @@ -312,11 +312,11 @@ memo_shell_backend_handle_uri_cb (EShellBackend *shell_backend, EShell *shell; CompEditor *editor; CompEditorFlags flags = 0; - ECal *client; + ECalClient *client; ECalComponent *comp; ESource *source; ESourceList *source_list; - ECalSourceType source_type; + ECalClientSourceType source_type; EUri *euri; icalcomponent *icalcomp; const gchar *cp; @@ -326,7 +326,7 @@ memo_shell_backend_handle_uri_cb (EShellBackend *shell_backend, gboolean handled = FALSE; GError *error = NULL; - source_type = E_CAL_SOURCE_TYPE_JOURNAL; + source_type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS; shell = e_shell_backend_get_shell (shell_backend); if (strncmp (uri, "memo:", 5) != 0) @@ -379,8 +379,9 @@ memo_shell_backend_handle_uri_cb (EShellBackend *shell_backend, * we successfully open it is another matter... */ handled = TRUE; - if (!e_cal_get_sources (&source_list, source_type, NULL)) { - g_printerr ("Could not get memo sources from GConf!\n"); + if (!e_cal_client_get_sources (&source_list, source_type, &error)) { + g_debug ("%s: Could not get memo sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); goto exit; } @@ -391,12 +392,13 @@ memo_shell_backend_handle_uri_cb (EShellBackend *shell_backend, goto exit; } - client = e_auth_new_cal_from_source (source, source_type); - if (client == NULL || !e_cal_open (client, TRUE, &error)) { - if (error != NULL) { - g_printerr ("%s\n", error->message); - g_error_free (error); - } + client = e_cal_client_new (source, source_type, &error); + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (client == NULL || !e_client_open_sync (E_CLIENT (client), TRUE, NULL, &error)) { + g_debug ("%s: Failed to create/open client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); g_object_unref (source_list); goto exit; } @@ -409,10 +411,10 @@ memo_shell_backend_handle_uri_cb (EShellBackend *shell_backend, if (editor != NULL) goto present; - if (!e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, &error)) { - g_printerr ("%s\n", error->message); + if (!e_cal_client_get_object_sync (client, comp_uid, comp_rid, &icalcomp, NULL, &error)) { + g_debug ("%s: Failed to get object: %s", G_STRFUNC, error ? error->message : "Unknown error"); g_object_unref (source_list); - g_error_free (error); + g_clear_error (&error); goto exit; } diff --git a/modules/calendar/e-memo-shell-content.c b/modules/calendar/e-memo-shell-content.c index 9f7d0768b9..f0f4fe958f 100644 --- a/modules/calendar/e-memo-shell-content.c +++ b/modules/calendar/e-memo-shell-content.c @@ -115,7 +115,7 @@ memo_shell_content_table_foreach_cb (gint model_row, ESource *source; const gchar *source_uid; - source = e_cal_get_source (comp_data->client); + source = e_client_get_source (E_CLIENT (comp_data->client)); source_uid = e_source_peek_uid (source); foreach_data->list = g_slist_prepend ( @@ -575,7 +575,7 @@ memo_shell_content_check_state (EShellContent *shell_content) icalproperty *prop; gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); + read_only = e_client_is_readonly (E_CLIENT (comp_data->client)); editable &= !read_only; prop = icalcomponent_get_first_property ( diff --git a/modules/calendar/e-memo-shell-sidebar.c b/modules/calendar/e-memo-shell-sidebar.c index befe60cbc1..5a28611652 100644 --- a/modules/calendar/e-memo-shell-sidebar.c +++ b/modules/calendar/e-memo-shell-sidebar.c @@ -27,11 +27,11 @@ #include <string.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-alert-dialog.h" #include "e-util/e-util.h" -#include "calendar/common/authentication.h" #include "calendar/gui/e-memo-list-selector.h" #include "calendar/gui/misc.h" @@ -52,7 +52,7 @@ struct _EMemoShellSidebarPrivate { * opened. So the user first highlights a source, then * sometime later we update our default-client property * which is bound by an EBinding to ECalModel. */ - ECal *default_client; + ECalClient *default_client; GCancellable *loading_default_client; }; @@ -76,7 +76,7 @@ static GType memo_shell_sidebar_type; static void memo_shell_sidebar_emit_client_added (EMemoShellSidebar *memo_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_ADDED]; @@ -85,7 +85,7 @@ memo_shell_sidebar_emit_client_added (EMemoShellSidebar *memo_shell_sidebar, static void memo_shell_sidebar_emit_client_removed (EMemoShellSidebar *memo_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_REMOVED]; @@ -103,7 +103,7 @@ memo_shell_sidebar_emit_status_message (EMemoShellSidebar *memo_shell_sidebar, static void memo_shell_sidebar_backend_died_cb (EMemoShellSidebar *memo_shell_sidebar, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -118,7 +118,7 @@ memo_shell_sidebar_backend_died_cb (EMemoShellSidebar *memo_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_object_ref (source); @@ -136,7 +136,7 @@ memo_shell_sidebar_backend_died_cb (EMemoShellSidebar *memo_shell_sidebar, static void memo_shell_sidebar_backend_error_cb (EMemoShellSidebar *memo_shell_sidebar, const gchar *message, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -148,7 +148,7 @@ memo_shell_sidebar_backend_error_cb (EMemoShellSidebar *memo_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); source_group = e_source_peek_group (source); e_alert_submit ( @@ -159,38 +159,43 @@ memo_shell_sidebar_backend_error_cb (EMemoShellSidebar *memo_shell_sidebar, } static void -memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar, - const GError *error, - ECal *client) +memo_shell_sidebar_client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + ECalClient *client = E_CAL_CLIENT (source_object); + EMemoShellSidebar *memo_shell_sidebar = user_data; EShellView *shell_view; EShellContent *shell_content; EShellSidebar *shell_sidebar; const gchar *message; + GError *error = NULL; shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - if (g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED) || - g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED)) - e_auth_cal_forget_password (client); + e_client_open_finish (E_CLIENT (client), result, &error); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_REQUIRED)) + e_client_utils_forget_password (E_CLIENT (client)); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) { + e_client_open (E_CLIENT (client), FALSE, NULL, memo_shell_sidebar_client_opened_cb, user_data); + g_clear_error (&error); + return; + } /* Handle errors. */ - switch (error ? error->code : E_CALENDAR_STATUS_OK) { - case E_CALENDAR_STATUS_OK: + switch ((error && error->domain == E_CLIENT_ERROR) ? error->code : -1) { + case -1: break; - case E_CALENDAR_STATUS_AUTHENTICATION_FAILED: - e_cal_open_async (client, FALSE); - return; - - case E_CALENDAR_STATUS_BUSY: + case E_CLIENT_ERROR_BUSY: + g_debug ("%s: Cannot open '%s', it's busy (%s)", G_STRFUNC, e_source_peek_name (e_client_get_source (E_CLIENT (client))), error->message); + g_clear_error (&error); return; - case E_CALENDAR_STATUS_REPOSITORY_OFFLINE: + case E_CLIENT_ERROR_REPOSITORY_OFFLINE: e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:prompt-no-contents-offline-memos", @@ -198,7 +203,7 @@ memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar, /* fall through */ default: - if (error->code != E_CALENDAR_STATUS_REPOSITORY_OFFLINE) { + if (error->code != E_CLIENT_ERROR_REPOSITORY_OFFLINE) { e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:failed-open-memos", @@ -207,15 +212,12 @@ memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar, e_memo_shell_sidebar_remove_source ( memo_shell_sidebar, - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); + g_clear_error (&error); return; } - g_assert (error == NULL); - - g_signal_handlers_disconnect_matched ( - client, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, - memo_shell_sidebar_client_opened_cb, NULL); + g_clear_error (&error); message = _("Loading memos"); memo_shell_sidebar_emit_status_message (memo_shell_sidebar, message); @@ -224,27 +226,31 @@ memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar, } static void -memo_shell_sidebar_default_loaded_cb (ESource *source, - GAsyncResult *result, - EShellSidebar *shell_sidebar) +memo_shell_sidebar_default_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EShellSidebar *shell_sidebar = user_data; EMemoShellSidebarPrivate *priv; EShellContent *shell_content; EShellView *shell_view; - ECal *client; + EMemoShellContent *memo_shell_content; + ECalModel *model; + EClient *client = NULL; GError *error = NULL; priv = E_MEMO_SHELL_SIDEBAR (shell_sidebar)->priv; shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); + memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content); + model = e_memo_shell_content_get_memo_model (memo_shell_content); - client = e_load_cal_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { g_error_free (error); goto exit; - } else if (error != NULL) { e_alert_submit ( E_ALERT_SINK (shell_content), @@ -254,16 +260,18 @@ memo_shell_sidebar_default_loaded_cb (ESource *source, goto exit; } - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); if (priv->default_client != NULL) g_object_unref (priv->default_client); - priv->default_client = client; + priv->default_client = E_CAL_CLIENT (client); + + e_cal_client_set_default_timezone (priv->default_client, e_cal_model_get_timezone (model)); g_object_notify (G_OBJECT (shell_sidebar), "default-client"); -exit: + exit: g_object_unref (shell_sidebar); } @@ -274,29 +282,18 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, EMemoShellSidebarPrivate *priv; EShellView *shell_view; EShellWindow *shell_window; - EShellContent *shell_content; EShellSidebar *shell_sidebar; - EMemoShellContent *memo_shell_content; - ECalSourceType source_type; - ECalModel *model; - ECal *client; - icaltimezone *timezone; + ECalClient *client; const gchar *uid; priv = memo_shell_sidebar->priv; - source_type = E_CAL_SOURCE_TYPE_JOURNAL; /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to EMemoShellView. */ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); - shell_content = e_shell_view_get_shell_content (shell_view); shell_window = e_shell_view_get_shell_window (shell_view); - memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content); - model = e_memo_shell_content_get_memo_model (memo_shell_content); - timezone = e_cal_model_get_timezone (model); - /* Cancel any unfinished previous request. */ if (priv->loading_default_client != NULL) { g_cancellable_cancel (priv->loading_default_client); @@ -319,11 +316,9 @@ memo_shell_sidebar_set_default (EMemoShellSidebar *memo_shell_sidebar, priv->loading_default_client = g_cancellable_new (); - e_load_cal_source_async ( - source, source_type, timezone, - GTK_WINDOW (shell_window), priv->loading_default_client, - (GAsyncReadyCallback) memo_shell_sidebar_default_loaded_cb, - g_object_ref (shell_sidebar)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_MEMOS, FALSE, priv->loading_default_client, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + memo_shell_sidebar_default_loaded_cb, g_object_ref (shell_sidebar)); } static void @@ -607,7 +602,7 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar) source = e_source_selector_get_primary_selection (selector); if (source != NULL) { - ECal *client; + ECalClient *client; const gchar *uri; const gchar *delete; @@ -622,7 +617,7 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar) memo_shell_sidebar->priv->client_table, e_source_peek_uid (source)); refresh_supported = - client && e_cal_get_refresh_supported (client); + client && e_client_check_refresh_supported (E_CLIENT (client)); } if (source != NULL) @@ -639,7 +634,7 @@ memo_shell_sidebar_check_state (EShellSidebar *shell_sidebar) static void memo_shell_sidebar_client_removed (EMemoShellSidebar *memo_shell_sidebar, - ECal *client) + ECalClient *client) { ESourceSelector *selector; GHashTable *client_table; @@ -653,7 +648,7 @@ memo_shell_sidebar_client_removed (EMemoShellSidebar *memo_shell_sidebar, client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, memo_shell_sidebar); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_return_if_fail (uid != NULL); @@ -688,9 +683,9 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class) PROP_DEFAULT_CLIENT, g_param_spec_object ( "default-client", - "Default Memo Client", + "Default Memo ECalClient", "Default client for memo operations", - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READABLE)); g_object_class_install_property ( @@ -711,7 +706,7 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[CLIENT_REMOVED] = g_signal_new ( "client-removed", @@ -721,7 +716,7 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[STATUS_MESSAGE] = g_signal_new ( "status-message", @@ -804,7 +799,7 @@ e_memo_shell_sidebar_get_clients (EMemoShellSidebar *memo_shell_sidebar) return g_hash_table_get_values (client_table); } -ECal * +ECalClient * e_memo_shell_sidebar_get_default_client (EMemoShellSidebar *memo_shell_sidebar) { g_return_val_if_fail ( @@ -830,12 +825,12 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, EShellContent *shell_content; EShellSidebar *shell_sidebar; EMemoShellContent *memo_shell_content; - ECalSourceType source_type; + ECalClientSourceType source_type; ESourceSelector *selector; GHashTable *client_table; ECalModel *model; - ECal *default_client; - ECal *client; + ECalClient *default_client; + ECalClient *client; icaltimezone *timezone; const gchar *uid; const gchar *uri; @@ -844,7 +839,7 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, g_return_if_fail (E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar)); g_return_if_fail (E_IS_SOURCE (source)); - source_type = E_CAL_SOURCE_TYPE_JOURNAL; + source_type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS; client_table = memo_shell_sidebar->priv->client_table; default_client = memo_shell_sidebar->priv->default_client; selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar); @@ -859,15 +854,18 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, ESource *default_source; const gchar *default_uid; - default_source = e_cal_get_source (default_client); + default_source = e_client_get_source (E_CLIENT (default_client)); default_uid = e_source_peek_uid (default_source); if (g_strcmp0 (uid, default_uid) == 0) client = g_object_ref (default_client); } - if (client == NULL) - client = e_auth_new_cal_from_source (source, source_type); + if (client == NULL) { + client = e_cal_client_new (source, source_type, NULL); + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + } g_return_if_fail (client != NULL); @@ -884,17 +882,12 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, g_hash_table_insert (client_table, g_strdup (uid), client); e_source_selector_select_source (selector, source); - uri = e_cal_get_uri (client); + uri = e_client_get_uri (E_CLIENT (client)); /* Translators: The string field is a URI. */ message = g_strdup_printf (_("Opening memos at %s"), uri); memo_shell_sidebar_emit_status_message (memo_shell_sidebar, message); g_free (message); - g_signal_connect_swapped ( - client, "cal-opened-ex", - G_CALLBACK (memo_shell_sidebar_client_opened_cb), - memo_shell_sidebar); - /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to EMemoShellView. */ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar); @@ -905,8 +898,8 @@ e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar, model = e_memo_shell_content_get_memo_model (memo_shell_content); timezone = e_cal_model_get_timezone (model); - e_cal_set_default_timezone (client, timezone, NULL); - e_cal_open_async (client, FALSE); + e_cal_client_set_default_timezone (client, timezone); + e_client_open (E_CLIENT (client), FALSE, NULL, memo_shell_sidebar_client_opened_cb, memo_shell_sidebar); } void @@ -914,7 +907,7 @@ e_memo_shell_sidebar_remove_source (EMemoShellSidebar *memo_shell_sidebar, ESource *source) { GHashTable *client_table; - ECal *client; + ECalClient *client; const gchar *uid; g_return_if_fail (E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar)); diff --git a/modules/calendar/e-memo-shell-sidebar.h b/modules/calendar/e-memo-shell-sidebar.h index 91e0ccc618..24e73f11d1 100644 --- a/modules/calendar/e-memo-shell-sidebar.h +++ b/modules/calendar/e-memo-shell-sidebar.h @@ -22,7 +22,7 @@ #ifndef E_MEMO_SHELL_SIDEBAR_H #define E_MEMO_SHELL_SIDEBAR_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserverui/e-source-selector.h> #include <shell/e-shell-sidebar.h> @@ -70,9 +70,9 @@ struct _EMemoShellSidebarClass { /* Signals */ void (*client_added) (EMemoShellSidebar *memo_shell_sidebar, - ECal *client); + ECalClient *client); void (*client_removed) (EMemoShellSidebar *memo_shell_sidebar, - ECal *client); + ECalClient *client); void (*status_message) (EMemoShellSidebar *memo_shell_sidebar, const gchar *status_message, gdouble percent); @@ -85,7 +85,7 @@ GtkWidget * e_memo_shell_sidebar_new (EShellView *shell_view); GList * e_memo_shell_sidebar_get_clients (EMemoShellSidebar *memo_shell_sidebar); -ECal * e_memo_shell_sidebar_get_default_client +ECalClient * e_memo_shell_sidebar_get_default_client (EMemoShellSidebar *memo_shell_sidebar); ESourceSelector * e_memo_shell_sidebar_get_selector diff --git a/modules/calendar/e-memo-shell-view-actions.c b/modules/calendar/e-memo-shell-view-actions.c index 593031235d..75d957c684 100644 --- a/modules/calendar/e-memo-shell-view-actions.c +++ b/modules/calendar/e-memo-shell-view-actions.c @@ -121,7 +121,7 @@ action_memo_list_copy_cb (GtkAction *action, copy_source_dialog ( GTK_WINDOW (shell_window), - source, E_CAL_SOURCE_TYPE_JOURNAL); + source, E_CAL_CLIENT_SOURCE_TYPE_MEMOS); } static void @@ -134,7 +134,7 @@ action_memo_list_delete_cb (GtkAction *action, EShellWindow *shell_window; EShellView *shell_view; EMemoTable *memo_table; - ECal *client; + ECalClient *client; ECalModel *model; ESourceSelector *selector; ESourceGroup *source_group; @@ -170,14 +170,14 @@ action_memo_list_delete_cb (GtkAction *action, uri = e_source_get_uri (source); client = e_cal_model_get_client_for_uri (model, uri); if (client == NULL) - client = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_JOURNAL); + client = e_cal_client_new_from_uri (uri, E_CAL_CLIENT_SOURCE_TYPE_MEMOS, NULL); g_free (uri); g_return_if_fail (client != NULL); - if (!e_cal_remove (client, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + if (!e_client_remove_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to remove client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -191,8 +191,8 @@ action_memo_list_delete_cb (GtkAction *action, e_source_group_remove_source (source_group, source); if (!e_source_list_sync (source_list, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + g_debug ("%s: Failed to sync source list: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -266,7 +266,7 @@ action_memo_list_refresh_cb (GtkAction *action, EMemoShellContent *memo_shell_content; EMemoShellSidebar *memo_shell_sidebar; ESourceSelector *selector; - ECal *client; + ECalClient *client; ECalModel *model; ESource *source; gchar *uri; @@ -288,14 +288,11 @@ action_memo_list_refresh_cb (GtkAction *action, if (client == NULL) return; - g_return_if_fail (e_cal_get_refresh_supported (client)); + g_return_if_fail (e_client_check_refresh_supported (E_CLIENT (client))); - if (!e_cal_refresh (client, &error) && error) { - g_warning ( - "%s: Failed to refresh '%s', %s\n", - G_STRFUNC, e_source_peek_name (source), - error->message); - g_error_free (error); + if (!e_client_refresh_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to refresh '%s', %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -338,7 +335,7 @@ action_memo_new_cb (GtkAction *action, EShellWindow *shell_window; EMemoShellContent *memo_shell_content; EMemoTable *memo_table; - ECal *client; + ECalClient *client; ECalComponent *comp; CompEditor *editor; GSList *list; @@ -518,7 +515,7 @@ action_memo_save_as_cb (GtkAction *action, return; /* XXX We only save the first selected memo. */ - string = e_cal_get_component_as_string ( + string = e_cal_client_get_component_as_string ( comp_data->client, comp_data->icalcomp); if (string == NULL) { g_warning ("Could not convert memo to a string"); diff --git a/modules/calendar/e-memo-shell-view-private.c b/modules/calendar/e-memo-shell-view-private.c index 36f09fd954..c1278cb46e 100644 --- a/modules/calendar/e-memo-shell-view-private.c +++ b/modules/calendar/e-memo-shell-view-private.c @@ -34,13 +34,13 @@ memo_shell_view_model_row_appended_cb (EMemoShellView *memo_shell_view, ECalModel *model) { EMemoShellSidebar *memo_shell_sidebar; - ECal *client; + ECalClient *client; ESource *source; /* This is the "Click to Add" handler. */ client = e_cal_model_get_default_client (model); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar; e_memo_shell_sidebar_add_source (memo_shell_sidebar, source); @@ -58,7 +58,7 @@ memo_shell_view_table_popup_event_cb (EShellView *shell_view, static void memo_shell_view_selector_client_added_cb (EMemoShellView *memo_shell_view, - ECal *client) + ECalClient *client) { EMemoShellContent *memo_shell_content; EMemoTable *memo_table; @@ -74,7 +74,7 @@ memo_shell_view_selector_client_added_cb (EMemoShellView *memo_shell_view, static void memo_shell_view_selector_client_removed_cb (EMemoShellView *memo_shell_view, - ECal *client) + ECalClient *client) { EMemoShellContent *memo_shell_content; EMemoTable *memo_table; @@ -452,10 +452,10 @@ e_memo_shell_view_update_timezone (EMemoShellView *memo_shell_view) clients = e_memo_shell_sidebar_get_clients (memo_shell_sidebar); for (iter = clients; iter != NULL; iter = iter->next) { - ECal *client = iter->data; + ECalClient *client = iter->data; - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) - e_cal_set_default_timezone (client, timezone, NULL); + if (e_client_is_opened (E_CLIENT (client))) + e_cal_client_set_default_timezone (client, timezone); } g_list_free (clients); diff --git a/modules/calendar/e-task-shell-backend.c b/modules/calendar/e-task-shell-backend.c index b9f95b3a72..768f46fd28 100644 --- a/modules/calendar/e-task-shell-backend.c +++ b/modules/calendar/e-task-shell-backend.c @@ -27,17 +27,17 @@ #include <string.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserver/e-url.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> #include <libedataserver/e-source-group.h> +#include <libedataserverui/e-client-utils.h> #include "shell/e-shell.h" #include "shell/e-shell-backend.h" #include "shell/e-shell-window.h" -#include "calendar/common/authentication.h" #include "calendar/gui/comp-util.h" #include "calendar/gui/dialogs/calendar-setup.h" #include "calendar/gui/dialogs/task-editor.h" @@ -74,6 +74,7 @@ task_shell_backend_ensure_sources (EShellBackend *shell_backend) GSList *sources, *iter; const gchar *name; gboolean save_list = FALSE; + GError *error = NULL; on_this_computer = NULL; personal = NULL; @@ -83,10 +84,11 @@ task_shell_backend_ensure_sources (EShellBackend *shell_backend) shell = e_shell_backend_get_shell (shell_backend); shell_settings = e_shell_get_shell_settings (shell); - if (!e_cal_get_sources ( + if (!e_cal_client_get_sources ( &task_shell_backend->priv->source_list, - E_CAL_SOURCE_TYPE_TODO, NULL)) { - g_warning ("Could not get task sources from GConf!"); + E_CAL_CLIENT_SOURCE_TYPE_TASKS, &error)) { + g_debug ("%s: Could not get task sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -164,42 +166,49 @@ task_shell_backend_new_task (ESource *source, EShell *shell, CompEditorFlags flags) { - ECal *cal; + EClient *client = NULL; + ECalClient *cal_client; ECalComponent *comp; CompEditor *editor; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (source, result, &client, &error)) + client = NULL; /* XXX Handle errors better. */ - cal = e_load_cal_source_finish (source, result, NULL); - g_return_if_fail (E_IS_CAL (cal)); + if (!client) { + g_debug ("%s: Failed to open '%s': %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); + return; + } - editor = task_editor_new (cal, shell, flags); - comp = cal_comp_task_new_with_defaults (cal); + g_return_if_fail (E_IS_CAL_CLIENT (client)); + + cal_client = E_CAL_CLIENT (client); + editor = task_editor_new (cal_client, shell, flags); + comp = cal_comp_task_new_with_defaults (cal_client); comp_editor_edit_comp (editor, comp); gtk_window_present (GTK_WINDOW (editor)); g_object_unref (comp); - g_object_unref (cal); + g_object_unref (client); } static void -task_shell_backend_task_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +task_shell_backend_task_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; flags |= COMP_EDITOR_NEW_ITEM; - task_shell_backend_new_task (source, result, shell, flags); + task_shell_backend_new_task (E_SOURCE (source_object), result, shell, flags); g_object_unref (shell); } static void -task_shell_backend_task_assigned_new_cb (ESource *source, - GAsyncResult *result, - EShell *shell) +task_shell_backend_task_assigned_new_cb (GObject *source_object, GAsyncResult *result, gpointer shell) { CompEditorFlags flags = 0; @@ -207,7 +216,7 @@ task_shell_backend_task_assigned_new_cb (ESource *source, flags |= COMP_EDITOR_IS_ASSIGNED; flags |= COMP_EDITOR_USER_ORG; - task_shell_backend_new_task (source, result, shell, flags); + task_shell_backend_new_task (E_SOURCE (source_object), result, shell, flags); g_object_unref (shell); } @@ -221,14 +230,11 @@ action_task_new_cb (GtkAction *action, EShellSettings *shell_settings; ESource *source = NULL; ESourceList *source_list; - ECalSourceType source_type; const gchar *action_name; gchar *uid; /* This callback is used for both tasks and assigned tasks. */ - source_type = E_CAL_SOURCE_TYPE_TODO; - shell = e_shell_window_get_shell (shell_window); shell_settings = e_shell_get_shell_settings (shell); shell_backend = e_shell_get_backend_by_name (shell, "tasks"); @@ -253,19 +259,13 @@ action_task_new_cb (GtkAction *action, * FIXME Need to obtain a better default time zone. */ action_name = gtk_action_get_name (action); if (strcmp (action_name, "task-assigned-new") == 0) - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - task_shell_backend_task_assigned_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_TASKS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + task_shell_backend_task_assigned_new_cb, g_object_ref (shell)); else - e_load_cal_source_async ( - source, source_type, NULL, - GTK_WINDOW (shell_window), - NULL, (GAsyncReadyCallback) - task_shell_backend_task_new_cb, - g_object_ref (shell)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_TASKS, FALSE, NULL, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + task_shell_backend_task_new_cb, g_object_ref (shell)); g_object_unref (source_list); } @@ -311,11 +311,11 @@ task_shell_backend_handle_uri_cb (EShellBackend *shell_backend, EShell *shell; CompEditor *editor; CompEditorFlags flags = 0; - ECal *client; + ECalClient *client; ECalComponent *comp; ESource *source; ESourceList *source_list; - ECalSourceType source_type; + ECalClientSourceType source_type; EUri *euri; icalcomponent *icalcomp; icalproperty *icalprop; @@ -326,7 +326,7 @@ task_shell_backend_handle_uri_cb (EShellBackend *shell_backend, gboolean handled = FALSE; GError *error = NULL; - source_type = E_CAL_SOURCE_TYPE_TODO; + source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; shell = e_shell_backend_get_shell (shell_backend); if (strncmp (uri, "task:", 5) != 0) @@ -379,8 +379,9 @@ task_shell_backend_handle_uri_cb (EShellBackend *shell_backend, * we successfully open it is another matter... */ handled = TRUE; - if (!e_cal_get_sources (&source_list, source_type, NULL)) { - g_printerr ("Could not get task sources from GConf!\n"); + if (!e_cal_client_get_sources (&source_list, source_type, &error)) { + g_debug ("%s: Could not get task sources: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); goto exit; } @@ -391,12 +392,13 @@ task_shell_backend_handle_uri_cb (EShellBackend *shell_backend, goto exit; } - client = e_auth_new_cal_from_source (source, source_type); - if (client == NULL || !e_cal_open (client, TRUE, &error)) { - if (error != NULL) { - g_printerr ("%s\n", error->message); - g_error_free (error); - } + client = e_cal_client_new (source, source_type, &error); + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (client == NULL || !e_client_open_sync (E_CLIENT (client), TRUE, NULL, &error)) { + g_debug ("%s: Failed to create/open client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); g_object_unref (source_list); goto exit; } @@ -409,8 +411,8 @@ task_shell_backend_handle_uri_cb (EShellBackend *shell_backend, if (editor != NULL) goto present; - if (!e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, &error)) { - g_printerr ("%s\n", error->message); + if (!e_cal_client_get_object_sync (client, comp_uid, comp_rid, &icalcomp, NULL, &error)) { + g_debug ("%s: Failed to get object: %s", G_STRFUNC, error ? error->message : "Unknown error"); g_object_unref (source_list); g_error_free (error); goto exit; diff --git a/modules/calendar/e-task-shell-content.c b/modules/calendar/e-task-shell-content.c index 0ffa6fb5a3..743bb937e7 100644 --- a/modules/calendar/e-task-shell-content.c +++ b/modules/calendar/e-task-shell-content.c @@ -115,7 +115,7 @@ task_shell_content_table_foreach_cb (gint model_row, ESource *source; const gchar *source_uid; - source = e_cal_get_source (comp_data->client); + source = e_client_get_source (E_CLIENT (comp_data->client)); source_uid = e_source_peek_uid (source); foreach_data->list = g_slist_prepend ( @@ -577,15 +577,15 @@ task_shell_content_check_state (EShellContent *shell_content) const gchar *cap; gboolean read_only; - e_cal_is_read_only (comp_data->client, &read_only, NULL); + read_only = e_client_is_readonly (E_CLIENT (comp_data->client)); editable &= !read_only; cap = CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT; - if (e_cal_get_static_capability (comp_data->client, cap)) + if (e_client_check_capability (E_CLIENT (comp_data->client), cap)) assignable = FALSE; cap = CAL_STATIC_CAPABILITY_NO_CONV_TO_ASSIGN_TASK; - if (e_cal_get_static_capability (comp_data->client, cap)) + if (e_client_check_capability (E_CLIENT (comp_data->client), cap)) assignable = FALSE; prop = icalcomponent_get_first_property ( diff --git a/modules/calendar/e-task-shell-sidebar.c b/modules/calendar/e-task-shell-sidebar.c index 098726af22..b37ab6dec6 100644 --- a/modules/calendar/e-task-shell-sidebar.c +++ b/modules/calendar/e-task-shell-sidebar.c @@ -27,11 +27,11 @@ #include <string.h> #include <glib/gi18n.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-alert-dialog.h" #include "e-util/e-util.h" -#include "calendar/common/authentication.h" #include "calendar/gui/e-task-list-selector.h" #include "calendar/gui/misc.h" @@ -52,7 +52,7 @@ struct _ETaskShellSidebarPrivate { * opened. So the user first highlights a source, then * sometime later we update our default-client property * which is bound by an EBinding to ECalModel. */ - ECal *default_client; + ECalClient *default_client; GCancellable *loading_default_client; }; @@ -76,7 +76,7 @@ static GType task_shell_sidebar_type; static void task_shell_sidebar_emit_client_added (ETaskShellSidebar *task_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_ADDED]; @@ -85,7 +85,7 @@ task_shell_sidebar_emit_client_added (ETaskShellSidebar *task_shell_sidebar, static void task_shell_sidebar_emit_client_removed (ETaskShellSidebar *task_shell_sidebar, - ECal *client) + ECalClient *client) { guint signal_id = signals[CLIENT_REMOVED]; @@ -103,7 +103,7 @@ task_shell_sidebar_emit_status_message (ETaskShellSidebar *task_shell_sidebar, static void task_shell_sidebar_backend_died_cb (ETaskShellSidebar *task_shell_sidebar, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -118,7 +118,7 @@ task_shell_sidebar_backend_died_cb (ETaskShellSidebar *task_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_object_ref (source); @@ -136,7 +136,7 @@ task_shell_sidebar_backend_died_cb (ETaskShellSidebar *task_shell_sidebar, static void task_shell_sidebar_backend_error_cb (ETaskShellSidebar *task_shell_sidebar, const gchar *message, - ECal *client) + ECalClient *client) { EShellView *shell_view; EShellContent *shell_content; @@ -148,7 +148,7 @@ task_shell_sidebar_backend_error_cb (ETaskShellSidebar *task_shell_sidebar, shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); source_group = e_source_peek_group (source); e_alert_submit ( @@ -159,38 +159,43 @@ task_shell_sidebar_backend_error_cb (ETaskShellSidebar *task_shell_sidebar, } static void -task_shell_sidebar_client_opened_cb (ETaskShellSidebar *task_shell_sidebar, - const GError *error, - ECal *client) +task_shell_sidebar_client_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + ECalClient *client = E_CAL_CLIENT (source_object); + ETaskShellSidebar *task_shell_sidebar = user_data; EShellView *shell_view; EShellContent *shell_content; EShellSidebar *shell_sidebar; const gchar *message; + GError *error = NULL; shell_sidebar = E_SHELL_SIDEBAR (task_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); - if (g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_FAILED) || - g_error_matches (error, E_CALENDAR_ERROR, - E_CALENDAR_STATUS_AUTHENTICATION_REQUIRED)) - e_auth_cal_forget_password (client); + e_client_open_finish (E_CLIENT (client), result, &error); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_REQUIRED)) + e_client_utils_forget_password (E_CLIENT (client)); + + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) { + e_client_open (E_CLIENT (client), FALSE, NULL, task_shell_sidebar_client_opened_cb, user_data); + g_clear_error (&error); + return; + } /* Handle errors. */ - switch (error ? error->code : E_CALENDAR_STATUS_OK) { - case E_CALENDAR_STATUS_OK: + switch ((error && error->domain == E_CLIENT_ERROR) ? error->code : -1) { + case -1: break; - case E_CALENDAR_STATUS_AUTHENTICATION_FAILED: - e_cal_open_async (client, FALSE); - return; - - case E_CALENDAR_STATUS_BUSY: + case E_CLIENT_ERROR_BUSY: + g_debug ("%s: Cannot open '%s', it's busy (%s)", G_STRFUNC, e_source_peek_name (e_client_get_source (E_CLIENT (client))), error->message); + g_clear_error (&error); return; - case E_CALENDAR_STATUS_REPOSITORY_OFFLINE: + case E_CLIENT_ERROR_REPOSITORY_OFFLINE: e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:prompt-no-contents-offline-tasks", @@ -198,7 +203,7 @@ task_shell_sidebar_client_opened_cb (ETaskShellSidebar *task_shell_sidebar, /* fall through */ default: - if (error->code != E_CALENDAR_STATUS_REPOSITORY_OFFLINE) { + if (error->code != E_CLIENT_ERROR_REPOSITORY_OFFLINE) { e_alert_submit ( E_ALERT_SINK (shell_content), "calendar:failed-open-tasks", @@ -207,15 +212,12 @@ task_shell_sidebar_client_opened_cb (ETaskShellSidebar *task_shell_sidebar, e_task_shell_sidebar_remove_source ( task_shell_sidebar, - e_cal_get_source (client)); + e_client_get_source (E_CLIENT (client))); + g_clear_error (&error); return; } - g_assert (error == NULL); - - g_signal_handlers_disconnect_matched ( - client, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, - task_shell_sidebar_client_opened_cb, NULL); + g_clear_error (&error); message = _("Loading tasks"); task_shell_sidebar_emit_status_message (task_shell_sidebar, message); @@ -224,27 +226,31 @@ task_shell_sidebar_client_opened_cb (ETaskShellSidebar *task_shell_sidebar, } static void -task_shell_sidebar_default_loaded_cb (ESource *source, - GAsyncResult *result, - EShellSidebar *shell_sidebar) +task_shell_sidebar_default_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { + EShellSidebar *shell_sidebar = user_data; ETaskShellSidebarPrivate *priv; EShellContent *shell_content; EShellView *shell_view; - ECal *client; + ETaskShellContent *task_shell_content; + ECalModel *model; + EClient *client = NULL; GError *error = NULL; priv = E_TASK_SHELL_SIDEBAR (shell_sidebar)->priv; shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); shell_content = e_shell_view_get_shell_content (shell_view); + task_shell_content = E_TASK_SHELL_CONTENT (shell_content); + model = e_task_shell_content_get_task_model (task_shell_content); - client = e_load_cal_source_finish (source, result, &error); + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || + g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED)) { g_error_free (error); goto exit; - } else if (error != NULL) { e_alert_submit ( E_ALERT_SINK (shell_content), @@ -254,16 +260,18 @@ task_shell_sidebar_default_loaded_cb (ESource *source, goto exit; } - g_return_if_fail (E_IS_CAL (client)); + g_return_if_fail (E_IS_CAL_CLIENT (client)); if (priv->default_client != NULL) g_object_unref (priv->default_client); - priv->default_client = client; + priv->default_client = E_CAL_CLIENT (client); + + e_cal_client_set_default_timezone (priv->default_client, e_cal_model_get_timezone (model)); g_object_notify (G_OBJECT (shell_sidebar), "default-client"); -exit: + exit: g_object_unref (shell_sidebar); } @@ -274,29 +282,18 @@ task_shell_sidebar_set_default (ETaskShellSidebar *task_shell_sidebar, ETaskShellSidebarPrivate *priv; EShellView *shell_view; EShellWindow *shell_window; - EShellContent *shell_content; EShellSidebar *shell_sidebar; - ETaskShellContent *task_shell_content; - ECalSourceType source_type; - ECalModel *model; - ECal *client; - icaltimezone *timezone; + ECalClient *client; const gchar *uid; priv = task_shell_sidebar->priv; - source_type = E_CAL_SOURCE_TYPE_TODO; /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to ETaskShellView. */ shell_sidebar = E_SHELL_SIDEBAR (task_shell_sidebar); shell_view = e_shell_sidebar_get_shell_view (shell_sidebar); - shell_content = e_shell_view_get_shell_content (shell_view); shell_window = e_shell_view_get_shell_window (shell_view); - task_shell_content = E_TASK_SHELL_CONTENT (shell_content); - model = e_task_shell_content_get_task_model (task_shell_content); - timezone = e_cal_model_get_timezone (model); - /* Cancel any unfinished previous request. */ if (priv->loading_default_client != NULL) { g_cancellable_cancel (priv->loading_default_client); @@ -319,11 +316,9 @@ task_shell_sidebar_set_default (ETaskShellSidebar *task_shell_sidebar, priv->loading_default_client = g_cancellable_new (); - e_load_cal_source_async ( - source, source_type, timezone, - GTK_WINDOW (shell_window), priv->loading_default_client, - (GAsyncReadyCallback) task_shell_sidebar_default_loaded_cb, - g_object_ref (shell_sidebar)); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_TASKS, FALSE, priv->loading_default_client, + e_client_utils_authenticate_handler, GTK_WINDOW (shell_window), + task_shell_sidebar_default_loaded_cb, g_object_ref (shell_sidebar)); } static void @@ -607,22 +602,22 @@ task_shell_sidebar_check_state (EShellSidebar *shell_sidebar) source = e_source_selector_get_primary_selection (selector); if (source != NULL) { - ECal *client; + ECalClient *client; const gchar *uri; - const gchar *delete; + const gchar *delete_prop; uri = e_source_peek_relative_uri (source); is_system = (uri == NULL || strcmp (uri, "system") == 0); can_delete = !is_system; - delete = e_source_get_property (source, "delete"); - can_delete &= (delete == NULL || strcmp (delete, "no") != 0); + delete_prop = e_source_get_property (source, "delete"); + can_delete = can_delete && (delete_prop == NULL || strcmp (delete_prop, "no") != 0); client = g_hash_table_lookup ( task_shell_sidebar->priv->client_table, e_source_peek_uid (source)); refresh_supported = - client && e_cal_get_refresh_supported (client); + client && e_client_check_refresh_supported (E_CLIENT (client)); } if (source != NULL) @@ -639,7 +634,7 @@ task_shell_sidebar_check_state (EShellSidebar *shell_sidebar) static void task_shell_sidebar_client_removed (ETaskShellSidebar *task_shell_sidebar, - ECal *client) + ECalClient *client) { ESourceSelector *selector; GHashTable *client_table; @@ -653,7 +648,7 @@ task_shell_sidebar_client_removed (ETaskShellSidebar *task_shell_sidebar, client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, task_shell_sidebar); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); uid = e_source_peek_uid (source); g_return_if_fail (uid != NULL); @@ -688,9 +683,9 @@ task_shell_sidebar_class_init (ETaskShellSidebarClass *class) PROP_DEFAULT_CLIENT, g_param_spec_object ( "default-client", - "Default Task Client", + "Default Task ECalClient", "Default client for task operations", - E_TYPE_CAL, + E_TYPE_CAL_CLIENT, G_PARAM_READABLE)); g_object_class_install_property ( @@ -711,7 +706,7 @@ task_shell_sidebar_class_init (ETaskShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[CLIENT_REMOVED] = g_signal_new ( "client-removed", @@ -721,7 +716,7 @@ task_shell_sidebar_class_init (ETaskShellSidebarClass *class) NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - E_TYPE_CAL); + E_TYPE_CAL_CLIENT); signals[STATUS_MESSAGE] = g_signal_new ( "status-message", @@ -804,7 +799,7 @@ e_task_shell_sidebar_get_clients (ETaskShellSidebar *task_shell_sidebar) return g_hash_table_get_values (client_table); } -ECal * +ECalClient * e_task_shell_sidebar_get_default_client (ETaskShellSidebar *task_shell_sidebar) { g_return_val_if_fail ( @@ -830,12 +825,12 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, EShellContent *shell_content; EShellSidebar *shell_sidebar; ETaskShellContent *task_shell_content; - ECalSourceType source_type; + ECalClientSourceType source_type; ESourceSelector *selector; GHashTable *client_table; ECalModel *model; - ECal *default_client; - ECal *client; + ECalClient *default_client; + ECalClient *client; icaltimezone *timezone; const gchar *uid; const gchar *uri; @@ -844,7 +839,7 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, g_return_if_fail (E_IS_TASK_SHELL_SIDEBAR (task_shell_sidebar)); g_return_if_fail (E_IS_SOURCE (source)); - source_type = E_CAL_SOURCE_TYPE_TODO; + source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; client_table = task_shell_sidebar->priv->client_table; default_client = task_shell_sidebar->priv->default_client; selector = e_task_shell_sidebar_get_selector (task_shell_sidebar); @@ -859,15 +854,18 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, ESource *default_source; const gchar *default_uid; - default_source = e_cal_get_source (default_client); + default_source = e_client_get_source (E_CLIENT (default_client)); default_uid = e_source_peek_uid (default_source); if (g_strcmp0 (uid, default_uid) == 0) client = g_object_ref (default_client); } - if (client == NULL) - client = e_auth_new_cal_from_source (source, source_type); + if (client == NULL) { + client = e_cal_client_new (source, source_type, NULL); + if (client) + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + } g_return_if_fail (client != NULL); @@ -884,17 +882,12 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, g_hash_table_insert (client_table, g_strdup (uid), client); e_source_selector_select_source (selector, source); - uri = e_cal_get_uri (client); + uri = e_client_get_uri (E_CLIENT (client)); /* Translators: The string field is a URI. */ message = g_strdup_printf (_("Opening tasks at %s"), uri); task_shell_sidebar_emit_status_message (task_shell_sidebar, message); g_free (message); - g_signal_connect_swapped ( - client, "cal-opened-ex", - G_CALLBACK (task_shell_sidebar_client_opened_cb), - task_shell_sidebar); - /* FIXME Sidebar should not be accessing the EShellContent. * This probably needs to be moved to ETaskShellView. */ shell_sidebar = E_SHELL_SIDEBAR (task_shell_sidebar); @@ -905,8 +898,8 @@ e_task_shell_sidebar_add_source (ETaskShellSidebar *task_shell_sidebar, model = e_task_shell_content_get_task_model (task_shell_content); timezone = e_cal_model_get_timezone (model); - e_cal_set_default_timezone (client, timezone, NULL); - e_cal_open_async (client, FALSE); + e_cal_client_set_default_timezone (client, timezone); + e_client_open (E_CLIENT (client), FALSE, NULL, task_shell_sidebar_client_opened_cb, task_shell_sidebar); } void @@ -914,7 +907,7 @@ e_task_shell_sidebar_remove_source (ETaskShellSidebar *task_shell_sidebar, ESource *source) { GHashTable *client_table; - ECal *client; + ECalClient *client; const gchar *uid; g_return_if_fail (E_IS_TASK_SHELL_SIDEBAR (task_shell_sidebar)); diff --git a/modules/calendar/e-task-shell-sidebar.h b/modules/calendar/e-task-shell-sidebar.h index 17e50f8239..24c64cf2af 100644 --- a/modules/calendar/e-task-shell-sidebar.h +++ b/modules/calendar/e-task-shell-sidebar.h @@ -22,7 +22,7 @@ #ifndef E_TASK_SHELL_SIDEBAR_H #define E_TASK_SHELL_SIDEBAR_H -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserverui/e-source-selector.h> #include <shell/e-shell-sidebar.h> @@ -70,9 +70,9 @@ struct _ETaskShellSidebarClass { /* Signals */ void (*client_added) (ETaskShellSidebar *task_shell_sidebar, - ECal *client); + ECalClient *client); void (*client_removed) (ETaskShellSidebar *task_shell_sidebar, - ECal *client); + ECalClient *client); void (*status_message) (ETaskShellSidebar *task_shell_sidebar, const gchar *status_message, gdouble percent); @@ -85,7 +85,7 @@ GtkWidget * e_task_shell_sidebar_new (EShellView *shell_view); GList * e_task_shell_sidebar_get_clients (ETaskShellSidebar *task_shell_sidebar); -ECal * e_task_shell_sidebar_get_default_client +ECalClient * e_task_shell_sidebar_get_default_client (ETaskShellSidebar *task_shell_sidebar); ESourceSelector * e_task_shell_sidebar_get_selector diff --git a/modules/calendar/e-task-shell-view-actions.c b/modules/calendar/e-task-shell-view-actions.c index 297120e29c..4938452309 100644 --- a/modules/calendar/e-task-shell-view-actions.c +++ b/modules/calendar/e-task-shell-view-actions.c @@ -144,7 +144,7 @@ action_task_list_copy_cb (GtkAction *action, copy_source_dialog ( GTK_WINDOW (shell_window), - source, E_CAL_SOURCE_TYPE_TODO); + source, E_CAL_CLIENT_SOURCE_TYPE_TASKS); } static void @@ -157,7 +157,7 @@ action_task_list_delete_cb (GtkAction *action, EShellWindow *shell_window; EShellView *shell_view; ETaskTable *task_table; - ECal *client; + ECalClient *client; ECalModel *model; ESourceSelector *selector; ESourceGroup *source_group; @@ -193,14 +193,14 @@ action_task_list_delete_cb (GtkAction *action, uri = e_source_get_uri (source); client = e_cal_model_get_client_for_uri (model, uri); if (client == NULL) - client = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_JOURNAL); + client = e_cal_client_new_from_uri (uri, E_CAL_CLIENT_SOURCE_TYPE_MEMOS, NULL); g_free (uri); g_return_if_fail (client != NULL); - if (!e_cal_remove (client, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + if (!e_client_remove_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to remove client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); return; } @@ -214,8 +214,8 @@ action_task_list_delete_cb (GtkAction *action, e_source_group_remove_source (source_group, source); if (!e_source_list_sync (source_list, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + g_debug ("%s: Failed to sync srouce list: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -289,7 +289,7 @@ action_task_list_refresh_cb (GtkAction *action, ETaskShellContent *task_shell_content; ETaskShellSidebar *task_shell_sidebar; ESourceSelector *selector; - ECal *client; + ECalClient *client; ECalModel *model; ESource *source; gchar *uri; @@ -311,14 +311,11 @@ action_task_list_refresh_cb (GtkAction *action, if (client == NULL) return; - g_return_if_fail (e_cal_get_refresh_supported (client)); + g_return_if_fail (e_client_check_refresh_supported (E_CLIENT (client))); - if (!e_cal_refresh (client, &error) && error) { - g_warning ( - "%s: Failed to refresh '%s', %s\n", - G_STRFUNC, e_source_peek_name (source), - error->message); - g_error_free (error); + if (!e_client_refresh_sync (E_CLIENT (client), NULL, &error)) { + g_debug ("%s: Failed to refresh '%s', %s", G_STRFUNC, e_source_peek_name (source), error ? error->message : "Unknown error"); + g_clear_error (&error); } } @@ -407,7 +404,7 @@ action_task_new_cb (GtkAction *action, EShellWindow *shell_window; ETaskShellContent *task_shell_content; ETaskTable *task_table; - ECal *client; + ECalClient *client; ECalComponent *comp; CompEditor *editor; GSList *list; @@ -635,7 +632,7 @@ action_task_save_as_cb (GtkAction *action, return; /* XXX We only save the first selected task. */ - string = e_cal_get_component_as_string ( + string = e_cal_client_get_component_as_string ( comp_data->client, comp_data->icalcomp); if (string == NULL) { g_warning ("Could not convert task to a string"); diff --git a/modules/calendar/e-task-shell-view-private.c b/modules/calendar/e-task-shell-view-private.c index 0ce8339849..77e4beae1e 100644 --- a/modules/calendar/e-task-shell-view-private.c +++ b/modules/calendar/e-task-shell-view-private.c @@ -34,13 +34,13 @@ task_shell_view_model_row_appended_cb (ETaskShellView *task_shell_view, ECalModel *model) { ETaskShellSidebar *task_shell_sidebar; - ECal *client; + ECalClient *client; ESource *source; /* This is the "Click to Add" handler. */ client = e_cal_model_get_default_client (model); - source = e_cal_get_source (client); + source = e_client_get_source (E_CLIENT (client)); task_shell_sidebar = task_shell_view->priv->task_shell_sidebar; e_task_shell_sidebar_add_source (task_shell_sidebar, source); @@ -81,7 +81,7 @@ task_shell_view_table_popup_event_cb (EShellView *shell_view, static void task_shell_view_selector_client_added_cb (ETaskShellView *task_shell_view, - ECal *client) + ECalClient *client) { ETaskShellContent *task_shell_content; ETaskTable *task_table; @@ -97,7 +97,7 @@ task_shell_view_selector_client_added_cb (ETaskShellView *task_shell_view, static void task_shell_view_selector_client_removed_cb (ETaskShellView *task_shell_view, - ECal *client) + ECalClient *client) { ETaskShellContent *task_shell_content; ETaskTable *task_table; @@ -472,39 +472,33 @@ e_task_shell_view_delete_completed (ETaskShellView *task_shell_view) task_shell_view, _("Expunging"), -1.0); for (iter = list; iter != NULL; iter = iter->next) { - ECal *client = E_CAL (iter->data); - GList *objects; - gboolean read_only = TRUE; + ECalClient *client = E_CAL_CLIENT (iter->data); + GSList *objects, *obj; GError *error = NULL; - if (!e_cal_is_read_only (client, &read_only, &error)) { - g_warning ("%s", error->message); - g_error_free (error); - continue; - } - - if (read_only) + if (e_client_is_readonly (E_CLIENT (client))) continue; - if (!e_cal_get_object_list (client, sexp, &objects, &error)) { - g_warning ("%s", error->message); - g_error_free (error); + if (!e_cal_client_get_object_list_sync (client, sexp, &objects, NULL, &error)) { + g_debug ("%s: Failed to get object list: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); continue; } - while (objects != NULL) { - icalcomponent *component = objects->data; + for (obj = objects; obj != NULL; obj = obj->next) { + icalcomponent *component = obj->data; const gchar *uid; uid = icalcomponent_get_uid (component); - if (!e_cal_remove_object (client, uid, &error)) { - g_warning ("%s", error->message); + if (!e_cal_client_remove_object_sync (client, uid, NULL, CALOBJ_MOD_THIS, NULL, &error)) { + g_debug ("%s: Failed to remove object: %s", G_STRFUNC, error ? error->message : "Unknown error"); g_clear_error (&error); } icalcomponent_free (component); - objects = g_list_delete_link (objects, objects); } + + e_cal_client_free_icalcomp_slist (objects); } e_task_shell_view_set_status_message (task_shell_view, NULL, -1.0); @@ -603,10 +597,10 @@ e_task_shell_view_update_timezone (ETaskShellView *task_shell_view) clients = e_task_shell_sidebar_get_clients (task_shell_sidebar); for (iter = clients; iter != NULL; iter = iter->next) { - ECal *client = iter->data; + ECalClient *client = iter->data; - if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED) - e_cal_set_default_timezone (client, timezone, NULL); + if (e_client_is_opened (E_CLIENT (client))) + e_cal_client_set_default_timezone (client, timezone); } g_list_free (clients); diff --git a/modules/calendar/e-task-shell-view-private.h b/modules/calendar/e-task-shell-view-private.h index b7dace83b7..ec2173f201 100644 --- a/modules/calendar/e-task-shell-view-private.h +++ b/modules/calendar/e-task-shell-view-private.h @@ -29,6 +29,7 @@ #include <libecal/e-cal-time-util.h> #include <libedataserver/e-categories.h> #include <libedataserver/e-sexp.h> +#include <libedataserverui/e-client-utils.h> #include "e-util/e-dialog-utils.h" #include "e-util/e-file-utils.h" @@ -38,7 +39,6 @@ #include "misc/e-popup-action.h" #include "misc/e-selectable.h" -#include "calendar/common/authentication.h" #include "calendar/gui/calendar-config.h" #include "calendar/gui/comp-util.h" #include "calendar/gui/e-cal-component-preview.h" diff --git a/plugins/bbdb/bbdb.c b/plugins/bbdb/bbdb.c index bfb63c5505..e0005a967e 100644 --- a/plugins/bbdb/bbdb.c +++ b/plugins/bbdb/bbdb.c @@ -28,8 +28,9 @@ #include <glib/gi18n.h> #include <string.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libedataserverui/e-source-combo-box.h> +#include <libedataserverui/e-client-utils.h> #include <e-util/e-config.h> #include <mail/em-config.h> @@ -58,7 +59,7 @@ struct bbdb_stuff { /* Static forward declarations */ static gboolean bbdb_timeout (gpointer data); -static void bbdb_do_it (EBook *book, const gchar *name, const gchar *email); +static void bbdb_do_it (EBookClient *client, const gchar *name, const gchar *email); static void add_email_to_contact (EContact *contact, const gchar *email); static void enable_toggled_cb (GtkWidget *widget, gpointer data); static void source_changed_cb (ESourceComboBox *source_combo_box, struct bbdb_stuff *stuff); @@ -191,10 +192,10 @@ G_LOCK_DEFINE_STATIC (todo); static gpointer bbdb_do_in_thread (gpointer data) { - EBook *book = data; + EBookClient *client = data; /* Open the addressbook */ - if (!book || !bbdb_open_ebook (book)) { + if (!client || !bbdb_open_book_client (client)) { G_LOCK (todo); g_slist_foreach (todo, (GFunc) free_todo_struct, NULL); @@ -214,7 +215,7 @@ bbdb_do_in_thread (gpointer data) G_UNLOCK (todo); if (td) { - bbdb_do_it (book, td->name, td->email); + bbdb_do_it (client, td->name, td->email); free_todo_struct (td); } @@ -222,7 +223,7 @@ bbdb_do_in_thread (gpointer data) } G_UNLOCK (todo); - g_object_unref (book); + g_object_unref (client); return NULL; } @@ -246,18 +247,18 @@ bbdb_do_thread (const gchar *name, const gchar *email) todo = g_slist_append (todo, td); } else { GError *error = NULL; - EBook *book = bbdb_create_ebook (AUTOMATIC_CONTACTS_ADDRESSBOOK); + EBookClient *client = bbdb_create_book_client (AUTOMATIC_CONTACTS_ADDRESSBOOK); /* list was empty, add item and create a thread */ todo = g_slist_append (todo, td); - g_thread_create (bbdb_do_in_thread, book, FALSE, &error); + g_thread_create (bbdb_do_in_thread, client, FALSE, &error); if (error) { g_warning ("%s: Creation of the thread failed with error: %s", G_STRFUNC, error->message); g_error_free (error); G_UNLOCK (todo); - bbdb_do_in_thread (book); + bbdb_do_in_thread (client); G_LOCK (todo); } } @@ -324,16 +325,15 @@ bbdb_handle_send (EPlugin *ep, EMEventTargetComposer *target) } static void -bbdb_do_it (EBook *book, const gchar *name, const gchar *email) +bbdb_do_it (EBookClient *client, const gchar *name, const gchar *email) { - gchar *query_string, *delim, *temp_name = NULL; - EBookQuery *query; - GList *contacts = NULL, *l; + gchar *query_string, *delim, *temp_name = NULL, *uid; + GSList *contacts = NULL; gboolean status; EContact *contact; GError *error = NULL; - g_return_if_fail (book != NULL); + g_return_if_fail (client != NULL); if (email == NULL || !strcmp (email, "")) return; @@ -349,16 +349,10 @@ bbdb_do_it (EBook *book, const gchar *name, const gchar *email) /* If any contacts exists with this email address, don't do anything */ query_string = g_strdup_printf ("(contains \"email\" \"%s\")", email); - query = e_book_query_from_string (query_string); + status = e_book_client_get_contacts_sync (client, query_string, &contacts, NULL, NULL); g_free (query_string); - - status = e_book_get_contacts (book, query, &contacts, NULL); - if (query) - e_book_query_unref (query); if (contacts != NULL || !status) { - for (l = contacts; l != NULL; l = l->next) - g_object_unref ((GObject *) l->data); - g_list_free (contacts); + e_client_util_free_object_slist (contacts); g_free (temp_name); return; @@ -376,39 +370,31 @@ bbdb_do_it (EBook *book, const gchar *name, const gchar *email) name = temp_name; } + contacts = NULL; /* If a contact exists with this name, add the email address to it. */ query_string = g_strdup_printf ("(is \"full_name\" \"%s\")", name); - query = e_book_query_from_string (query_string); + status = e_book_client_get_contacts_sync (client, query_string, &contacts, NULL, NULL); g_free (query_string); - - status = e_book_get_contacts (book, query, &contacts, NULL); - if (query) - e_book_query_unref (query); if (contacts != NULL || !status) { - /* FIXME: If there's more than one contact with this name, just give up; we're not smart enough for this. */ if (!status || contacts->next != NULL) { - for (l = contacts; l != NULL; l = l->next) - g_object_unref ((GObject *) l->data); - g_list_free (contacts); + e_client_util_free_object_slist (contacts); g_free (temp_name); return; } contact = (EContact *) contacts->data; add_email_to_contact (contact, email); - if (!e_book_commit_contact (book, contact, &error)) { + if (!e_book_client_modify_contact_sync (client, contact, NULL, &error)) { g_warning ("bbdb: Could not modify contact: %s\n", error->message); g_error_free (error); } - for (l = contacts; l != NULL; l = l->next) - g_object_unref ((GObject *) l->data); - g_list_free (contacts); - + e_client_util_free_object_slist (contacts); g_free (temp_name); + g_free (uid); return; } @@ -418,21 +404,22 @@ bbdb_do_it (EBook *book, const gchar *name, const gchar *email) add_email_to_contact (contact, email); g_free (temp_name); - if (!e_book_add_contact (book, contact, &error)) { - g_warning ("bbdb: Failed to add new contact: %s\n", error->message); + uid = NULL; + if (!e_book_client_add_contact_sync (client, contact, &uid, NULL, &error)) { + g_warning ("bbdb: Failed to add new contact: %s", error->message); g_error_free (error); - return; } g_object_unref (G_OBJECT (contact)); + g_free (uid); } -EBook * -bbdb_create_ebook (gint type) +EBookClient * +bbdb_create_book_client (gint type) { GConfClient *gconf; gchar *uri; - EBook *book = NULL; + EBookClient *client = NULL; GError *error = NULL; gboolean enable = TRUE; @@ -454,33 +441,36 @@ bbdb_create_ebook (gint type) g_object_unref (G_OBJECT (gconf)); if (uri == NULL) - book = e_book_new_system_addressbook (&error); + client = e_book_client_new_system (&error); else { - book = e_book_new_from_uri (uri, &error); + client = e_book_client_new_from_uri (uri, &error); g_free (uri); } - if (book == NULL) { - g_warning ("bbdb: failed to get addressbook: %s\n", error->message); - g_error_free (error); + if (client == NULL) { + g_warning ("bbdb: failed to get addressbook: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return NULL; } - return book; + return client; } gboolean -bbdb_open_ebook (EBook *book) +bbdb_open_book_client (EBookClient *client) { GError *error = NULL; - if (!book) + if (!client) return FALSE; - if (!e_book_open (book, FALSE, &error)) { - g_warning ("bbdb: failed to open addressbook: %s\n", error->message); - g_error_free (error); - g_object_unref (book); + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + if (!e_client_open_sync (E_CLIENT (client), FALSE, NULL, &error)) { + g_warning ("bbdb: failed to open addressbook: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + g_object_unref (client); return FALSE; } diff --git a/plugins/bbdb/bbdb.h b/plugins/bbdb/bbdb.h index fe7b998274..cbeb4ebb42 100644 --- a/plugins/bbdb/bbdb.h +++ b/plugins/bbdb/bbdb.h @@ -37,14 +37,17 @@ #define GAIM_ADDRESSBOOK 1 #define AUTOMATIC_CONTACTS_ADDRESSBOOK 0 +#include <libebook/e-book-client.h> +#include <libebook/e-contact.h> + /* bbdb.c */ -/* creates an EBook for a given type (gaim or contacts), but doesn't open it; +/* creates an EBookClient for a given type (gaim or contacts), but doesn't open it; this function should be called in a main thread. */ -EBook *bbdb_create_ebook (gint type); +EBookClient *bbdb_create_book_client (gint type); -/* opens an EBook. Returns false if it fails, and unrefs the book too; +/* opens an EBookClient. Returns false if it fails, and unrefs the book too; this function can be called in any thread */ -gboolean bbdb_open_ebook (EBook *book); +gboolean bbdb_open_book_client (EBookClient *client); gboolean bbdb_check_gaim_enabled (void); diff --git a/plugins/bbdb/gaimbuddies.c b/plugins/bbdb/gaimbuddies.c index f6a048e975..1becdee0ac 100644 --- a/plugins/bbdb/gaimbuddies.c +++ b/plugins/bbdb/gaimbuddies.c @@ -42,7 +42,8 @@ #include <glib/gi18n.h> #include <string.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include <libedataserverui/e-source-combo-box.h> #include <sys/time.h> @@ -60,7 +61,7 @@ typedef struct { } GaimBuddy; /* Forward declarations for this file. */ -static gboolean bbdb_merge_buddy_to_contact (EBook *book, GaimBuddy *b, EContact *c); +static gboolean bbdb_merge_buddy_to_contact (EBookClient *client, GaimBuddy *b, EContact *c); static GList *bbdb_get_gaim_buddy_list (void); static gchar *get_node_text (xmlNodePtr node); static gchar *get_buddy_icon_from_setting (xmlNodePtr setting); @@ -189,7 +190,7 @@ G_LOCK_DEFINE_STATIC (syncing); struct sync_thread_data { GList *blist; - EBook *book; + EBookClient *client; }; static gpointer @@ -200,8 +201,8 @@ bbdb_sync_buddy_list_in_thread (gpointer data) g_return_val_if_fail (std != NULL, NULL); - if (!bbdb_open_ebook (std->book)) { - /* book got freed in bbdb_open_ebook on a failure */ + if (!bbdb_open_book_client (std->client)) { + /* client got freed in bbdb_open_book_client on a failure */ free_buddy_list (std->blist); g_free (std); @@ -217,7 +218,8 @@ bbdb_sync_buddy_list_in_thread (gpointer data) for (l = std->blist; l != NULL; l = l->next) { GaimBuddy *b = l->data; EBookQuery *query; - GList *contacts = NULL; + gchar *query_string, *uid; + GSList *contacts = NULL; GError *error = NULL; EContact *c; @@ -227,52 +229,59 @@ bbdb_sync_buddy_list_in_thread (gpointer data) } /* Look for an exact match full name == buddy alias */ - query = e_book_query_field_test ( - E_CONTACT_FULL_NAME, E_BOOK_QUERY_IS, b->alias); - - if (!e_book_get_contacts (std->book, query, &contacts, NULL)) { - e_book_query_unref (query); + query = e_book_query_field_test (E_CONTACT_FULL_NAME, E_BOOK_QUERY_IS, b->alias); + query_string = e_book_query_to_string (query); + e_book_query_unref (query); + if (!e_book_client_get_contacts_sync (std->client, query_string, &contacts, NULL, NULL)) { + g_free (query_string); continue; } - e_book_query_unref (query); + g_free (query_string); if (contacts != NULL) { /* FIXME: If there's more than one contact with this name, just give up; we're not smart enough for this. */ - if (contacts->next != NULL) + if (contacts->next != NULL) { + e_client_util_free_object_slist (contacts); continue; + } c = E_CONTACT (contacts->data); - if (!bbdb_merge_buddy_to_contact (std->book, b, c)) + if (!bbdb_merge_buddy_to_contact (std->client, b, c)) { + e_client_util_free_object_slist (contacts); continue; + } /* Write it out to the addressbook */ - if (!e_book_commit_contact (std->book, c, &error)) { - g_warning ("bbdb: Could not modify contact: %s\n", error->message); + if (!e_book_client_modify_contact_sync (std->client, c, NULL, &error)) { + g_warning ("bbdb: Could not modify contact: %s", error->message); g_error_free (error); } + e_client_util_free_object_slist (contacts); continue; } /* Otherwise, create a new contact. */ c = e_contact_new (); e_contact_set (c, E_CONTACT_FULL_NAME, (gpointer) b->alias); - if (!bbdb_merge_buddy_to_contact (std->book, b, c)) { - g_object_unref (G_OBJECT (c)); + if (!bbdb_merge_buddy_to_contact (std->client, b, c)) { + g_object_unref (c); continue; } - if (!e_book_add_contact (std->book, c, &error)) { - g_warning ("bbdb: Failed to add new contact: %s\n", error->message); + uid = NULL; + if (!e_book_client_add_contact_sync (std->client, c, &uid, NULL, &error)) { + g_warning ("bbdb: Failed to add new contact: %s", error->message); g_error_free (error); goto finish; } - g_object_unref (G_OBJECT (c)); + g_object_unref (c); + g_free (uid); } g_idle_add (store_last_sync_idle_cb, NULL); @@ -280,7 +289,7 @@ bbdb_sync_buddy_list_in_thread (gpointer data) finish: printf ("bbdb: Done syncing buddy list to contacts.\n"); - g_object_unref (std->book); + g_object_unref (std->client); free_buddy_list (std->blist); g_free (std); @@ -296,7 +305,7 @@ bbdb_sync_buddy_list (void) { GList *blist; GError *error = NULL; - EBook *book = NULL; + EBookClient *client = NULL; struct sync_thread_data *std; G_LOCK (syncing); @@ -314,8 +323,8 @@ bbdb_sync_buddy_list (void) } /* Open the addressbook */ - book = bbdb_create_ebook (GAIM_ADDRESSBOOK); - if (book == NULL) { + client = bbdb_create_book_client (GAIM_ADDRESSBOOK); + if (client == NULL) { free_buddy_list (blist); G_UNLOCK (syncing); return; @@ -323,7 +332,7 @@ bbdb_sync_buddy_list (void) std = g_new0 (struct sync_thread_data, 1); std->blist = blist; - std->book = book; + std->client = client; syncing = TRUE; @@ -358,7 +367,7 @@ im_list_contains_buddy (GList *ims, GaimBuddy *b) } static gboolean -bbdb_merge_buddy_to_contact (EBook *book, GaimBuddy *b, EContact *c) +bbdb_merge_buddy_to_contact (EBookClient *client, GaimBuddy *b, EContact *c) { EContactField field; GList *ims; diff --git a/plugins/caldav/caldav-browse-server.c b/plugins/caldav/caldav-browse-server.c index 3a78217b1a..d169dda8f8 100644 --- a/plugins/caldav/caldav-browse-server.c +++ b/plugins/caldav/caldav-browse-server.c @@ -32,7 +32,7 @@ #include <libxml/xpath.h> #include <libxml/xpathInternals.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserver/e-proxy.h> #include <libedataserverui/e-cell-renderer-color.h> #include <libedataserverui/e-passwords.h> @@ -1369,13 +1369,13 @@ init_dialog (GtkDialog *dialog, GtkWidget **new_url_entry, GtkWidget **new_userm switch (source_type) { default: - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: source_type_str = "VEVENT"; break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: source_type_str = "VTODO"; break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: source_type_str = "VJOURNAL"; break; } diff --git a/plugins/caldav/caldav-source.c b/plugins/caldav/caldav-source.c index 11c651f7d9..41cebef760 100644 --- a/plugins/caldav/caldav-source.c +++ b/plugins/caldav/caldav-source.c @@ -33,7 +33,7 @@ #include <e-util/e-plugin-util.h> #include <calendar/gui/e-cal-config.h> #include <libedataserver/e-account-list.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <string.h> @@ -53,12 +53,15 @@ GtkWidget * oge_caldav (EPlugin *epl, /* plugin intialization */ static void -ensure_caldav_source_group (ECalSourceType source_type) +ensure_caldav_source_group (ECalClientSourceType source_type) { - ESourceList *slist; + ESourceList *slist; + GError *error = NULL; - if (!e_cal_get_sources (&slist, source_type, NULL)) { - g_warning ("Could not get calendar source list from GConf!"); + if (!e_cal_client_get_sources (&slist, source_type, &error)) { + g_warning ("Could not get calendar sources: %s", error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } @@ -72,9 +75,9 @@ e_plugin_lib_enable (EPlugin *ep, gint enable) if (enable) { d(g_print ("CalDAV Eplugin starting up ...\n")); - ensure_caldav_source_group (E_CAL_SOURCE_TYPE_EVENT); - ensure_caldav_source_group (E_CAL_SOURCE_TYPE_TODO); - ensure_caldav_source_group (E_CAL_SOURCE_TYPE_JOURNAL); + ensure_caldav_source_group (E_CAL_CLIENT_SOURCE_TYPE_EVENTS); + ensure_caldav_source_group (E_CAL_CLIENT_SOURCE_TYPE_TASKS); + ensure_caldav_source_group (E_CAL_CLIENT_SOURCE_TYPE_MEMOS); } return 0; diff --git a/plugins/calendar-file/calendar-file.c b/plugins/calendar-file/calendar-file.c index f162914dd8..a7b821d285 100644 --- a/plugins/calendar-file/calendar-file.c +++ b/plugins/calendar-file/calendar-file.c @@ -165,16 +165,16 @@ e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data) const gchar *file_name = NULL; switch (t->source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: file_name = "calendar.ics"; break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: file_name = "tasks.ics"; break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: file_name = "journal.ics"; break; - case E_CAL_SOURCE_TYPE_LAST: + case E_CAL_CLIENT_SOURCE_TYPE_LAST: break; } diff --git a/plugins/dbx-import/dbx-importer.c b/plugins/dbx-import/dbx-importer.c index 1c977750b1..3bc70030db 100644 --- a/plugins/dbx-import/dbx-importer.c +++ b/plugins/dbx-import/dbx-importer.c @@ -57,9 +57,8 @@ #include <shell/e-shell-view.h> #include <libebook/e-contact.h> -#include <libebook/e-book.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include <libedataserver/e-data-server-util.h> diff --git a/plugins/default-source/default-source.c b/plugins/default-source/default-source.c index 770dc25852..02a0d42baa 100644 --- a/plugins/default-source/default-source.c +++ b/plugins/default-source/default-source.c @@ -30,8 +30,8 @@ #include <calendar/gui/e-cal-config.h> #include <libedataserver/e-source.h> #include <addressbook/gui/widgets/eab-config.h> -#include <libebook/e-book.h> -#include <libecal/e-cal.h> +#include <libebook/e-book-client.h> +#include <libecal/e-cal-client.h> #include <glib/gi18n.h> #include <string.h> @@ -58,7 +58,7 @@ commit_default_calendar (EPlugin *epl, EConfigTarget *target) cal_target = (ECalConfigTargetSource *) target; source = cal_target->source; if (e_source_get_property (source, "default")) - e_cal_set_default_source (source, cal_target->source_type, NULL); + e_cal_client_set_default_source (source, cal_target->source_type, NULL); } void @@ -70,7 +70,7 @@ commit_default_book (EPlugin *epl, EConfigTarget *target) book_target = (EABConfigTargetSource *) target; source = book_target->source; if (e_source_get_property (source, "default")) - e_book_set_default_source (source, NULL); + e_book_client_set_default_source (source, NULL); } @@ -101,14 +101,14 @@ org_gnome_autocomplete_book (EPlugin *epl, EConfigHookItemFactoryData *data) } static const gchar * -get_calendar_option_caption (ECalSourceType source_type) +get_calendar_option_caption (ECalClientSourceType source_type) { const gchar *res = "???"; switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: res = _("Mark as _default calendar"); break; - case E_CAL_SOURCE_TYPE_TODO: res = _("Mark as _default task list"); break; - case E_CAL_SOURCE_TYPE_JOURNAL: res = _("Mark as _default memo list"); break; + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: res = _("Mark as _default calendar"); break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: res = _("Mark as _default task list"); break; + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: res = _("Mark as _default memo list"); break; default: break; } diff --git a/plugins/google-account-setup/google-source.c b/plugins/google-account-setup/google-source.c index 38bbad3385..1fce9858b8 100644 --- a/plugins/google-account-setup/google-source.c +++ b/plugins/google-account-setup/google-source.c @@ -42,7 +42,7 @@ #include <libedataserver/e-url.h> #include <libedataserver/e-account-list.h> #include <libedataserver/e-proxy.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserverui/e-cell-renderer-color.h> #include <libedataserverui/e-passwords.h> @@ -71,9 +71,12 @@ static void ensure_google_source_group (void) { ESourceList *slist; + GError *error = NULL; - if (!e_cal_get_sources (&slist, E_CAL_SOURCE_TYPE_EVENT, NULL)) { - g_warning ("Could not get calendar source list from GConf!"); + if (!e_cal_client_get_sources (&slist, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &error)) { + g_debug ("%s: Could not get calendar source list: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return; } diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c index 95c6238c0a..c8adbcf615 100644 --- a/plugins/itip-formatter/itip-formatter.c +++ b/plugins/itip-formatter/itip-formatter.c @@ -28,9 +28,10 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> #include <gconf/gconf-client.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-time-util.h> #include <libedataserverui/e-source-selector.h> +#include <libedataserverui/e-client-utils.h> #include <gtkhtml/gtkhtml-embedded.h> #include <mail/em-format-hook.h> #include <mail/em-config.h> @@ -44,7 +45,6 @@ #include <e-util/e-alert-dialog.h> #include <e-util/e-mktemp.h> #include <calendar/gui/itip-utils.h> -#include <calendar/common/authentication.h> #include <shell/e-shell.h> #include <shell/e-shell-utils.h> #include "itip-view.h" @@ -66,11 +66,11 @@ struct _itip_puri { gchar *uid; GtkWidget *view; - ESourceList *source_lists[E_CAL_SOURCE_TYPE_LAST]; - GHashTable *ecals[E_CAL_SOURCE_TYPE_LAST]; + ESourceList *source_lists[E_CAL_CLIENT_SOURCE_TYPE_LAST]; + GHashTable *ecals[E_CAL_CLIENT_SOURCE_TYPE_LAST]; - ECal *current_ecal; - ECalSourceType type; + ECalClient *current_client; + ECalClientSourceType type; gchar *vcalendar; ECalComponent *comp; @@ -145,8 +145,6 @@ typedef struct { gint count; } FormatItipFindData; -typedef void (* FormatItipOpenFunc) (ECal *ecal, const GError *error, gpointer data); - static gboolean check_is_instance (icalcomponent *icalcomp); gint @@ -419,7 +417,7 @@ get_real_item (struct _itip_puri *pitip) e_cal_component_get_uid (pitip->comp, &uid); - found = e_cal_get_object (pitip->current_ecal, uid, NULL, &icalcomp, NULL); + found = e_cal_client_get_object_sync (pitip->current_client, uid, NULL, &icalcomp, NULL, NULL); if (!found) return NULL; @@ -465,10 +463,10 @@ set_buttons_sensitive (struct _itip_puri *pitip) { gboolean read_only = TRUE; - if (pitip->current_ecal) - e_cal_is_read_only (pitip->current_ecal, &read_only, NULL); + if (pitip->current_client) + read_only = e_client_is_readonly (E_CLIENT (pitip->current_client)); - itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), pitip->current_ecal != NULL && !read_only); + itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), pitip->current_client != NULL && !read_only); } static void @@ -490,32 +488,42 @@ add_failed_to_load_msg (ItipView *view, ESource *source, const GError *error) } static void -cal_opened_cb (ECal *ecal, const GError *error, gpointer data) +cal_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - struct _itip_puri *pitip = data; + struct _itip_puri *pitip = user_data; ESource *source; - ECalSourceType source_type; + ECalClientSourceType source_type; + ECalClient *client = E_CAL_CLIENT (source_object); + GError *error = NULL; - source_type = e_cal_get_source_type (ecal); - source = e_cal_get_source (ecal); + if (!e_client_open_finish (E_CLIENT (client), result, &error)) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) { + g_error_free (error); + e_client_open (E_CLIENT (client), TRUE, NULL, cal_opened_cb, user_data); + return; + } + } - g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, cal_opened_cb, NULL); + source_type = e_cal_client_get_source_type (client); + source = e_client_get_source (E_CLIENT (client)); if (error) { d(printf ("Failed opening itip formatter calendar '%s' during non-search opening\n", e_source_peek_name (source))); add_failed_to_load_msg (ITIP_VIEW (pitip->view), source, error); - if (pitip->current_ecal == ecal) { - pitip->current_ecal = NULL; + if (pitip->current_client == client) { + pitip->current_client = NULL; itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), FALSE); } g_hash_table_remove (pitip->ecals[source_type], e_source_peek_uid (source)); + + g_error_free (error); return; } - if (e_cal_get_static_capability (ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { + if (e_cal_client_check_recurrences_no_master (client)) { icalcomponent *icalcomp = e_cal_component_get_icalcomponent (pitip->comp); if (check_is_instance (icalcomp)) @@ -524,23 +532,23 @@ cal_opened_cb (ECal *ecal, const GError *error, gpointer data) itip_view_set_show_recur_check (ITIP_VIEW (pitip->view), FALSE); } - if (pitip->type == E_CAL_SOURCE_TYPE_JOURNAL) { - if (e_cal_get_static_capability (ecal, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)) + if (pitip->type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) { + if (e_client_check_capability (E_CLIENT (client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)) itip_view_set_needs_decline (ITIP_VIEW (pitip->view), TRUE); else itip_view_set_needs_decline (ITIP_VIEW (pitip->view), FALSE); itip_view_set_mode (ITIP_VIEW (pitip->view), ITIP_VIEW_MODE_PUBLISH); } - pitip->current_ecal = ecal; + pitip->current_client = client; set_buttons_sensitive (pitip); } -static ECal * -start_calendar_server (struct _itip_puri *pitip, ESource *source, ECalSourceType type, FormatItipOpenFunc func, gpointer data) +static ECalClient * +start_calendar_server (struct _itip_puri *pitip, ESource *source, ECalClientSourceType type, GAsyncReadyCallback func, gpointer data) { - ECal *ecal; + ECalClient *client; EShell *shell; EShellSettings *shell_settings; icaltimezone *zone = NULL; @@ -550,43 +558,41 @@ start_calendar_server (struct _itip_puri *pitip, ESource *source, ECalSourceType shell = e_shell_get_default (); shell_settings = e_shell_get_shell_settings (shell); - ecal = g_hash_table_lookup (pitip->ecals[type], e_source_peek_uid (source)); - if (ecal) { - pitip->current_ecal = ecal; + client = g_hash_table_lookup (pitip->ecals[type], e_source_peek_uid (source)); + if (client) { + pitip->current_client = client; itip_view_remove_lower_info_item (ITIP_VIEW (pitip->view), pitip->progress_info_id); pitip->progress_info_id = 0; set_buttons_sensitive (pitip); - return ecal; + return client; } - ecal = e_auth_new_cal_from_source (source, type); - - if (!ecal) + client = e_cal_client_new (source, type, NULL); + if (!client) return NULL; - g_signal_connect (G_OBJECT (ecal), "cal_opened_ex", G_CALLBACK (func), data); + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); - g_hash_table_insert (pitip->ecals[type], g_strdup (e_source_peek_uid (source)), ecal); + g_hash_table_insert (pitip->ecals[type], g_strdup (e_source_peek_uid (source)), client); zone = e_shell_settings_get_pointer (shell_settings, "cal-timezone"); - e_cal_set_default_timezone (ecal, zone, NULL); + e_cal_client_set_default_timezone (client, zone); + e_client_open (E_CLIENT (client), TRUE, NULL, func, data); - e_cal_open_async (ecal, TRUE); - - return ecal; + return client; } -static ECal * -start_calendar_server_by_uid (struct _itip_puri *pitip, const gchar *uid, ECalSourceType type) +static ECalClient * +start_calendar_server_by_uid (struct _itip_puri *pitip, const gchar *uid, ECalClientSourceType type) { gint i; itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), FALSE); - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { + for (i = 0; i < E_CAL_CLIENT_SOURCE_TYPE_LAST; i++) { ESource *source; source = e_source_list_peek_source_by_uid (pitip->source_lists[i], uid); @@ -610,21 +616,29 @@ source_selected_cb (ItipView *view, ESource *source, gpointer data) } static void -find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) +find_cal_opened_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - FormatItipFindData *fd = data; + FormatItipFindData *fd = user_data; struct _itip_puri *pitip = fd->puri; ESource *source; - ECalSourceType source_type; + ECalClientSourceType source_type; icalcomponent *icalcomp; - GList *objects = NULL; + GSList *objects = NULL; + ECalClient *client = E_CAL_CLIENT (source_object); + GError *error = NULL; - source_type = e_cal_get_source_type (ecal); - source = e_cal_get_source (ecal); + if (!e_client_open_finish (E_CLIENT (client), result, &error)) { + if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) { + g_error_free (error); + e_client_open (E_CLIENT (client), TRUE, NULL, find_cal_opened_cb, user_data); + return; + } + } - fd->count--; + source_type = e_cal_client_get_source_type (client); + source = e_client_get_source (E_CLIENT (client)); - g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, find_cal_opened_cb, NULL); + fd->count--; if (error) { /* FIXME Do we really want to warn here? If we fail @@ -633,31 +647,32 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) d(printf ("Failed opening itip formatter calendar '%s' during search opening... ", e_source_peek_name (source))); add_failed_to_load_msg (ITIP_VIEW (pitip->view), source, error); - if (pitip->current_ecal == ecal) { - pitip->current_ecal = NULL; + if (pitip->current_client == client) { + pitip->current_client = NULL; itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), FALSE); } g_hash_table_remove (pitip->ecals[source_type], e_source_peek_uid (source)); + g_error_free (error); goto cleanup; } /* Check for conflicts */ /* If the query fails, we'll just ignore it */ /* FIXME What happens for recurring conflicts? */ - if (pitip->type == E_CAL_SOURCE_TYPE_EVENT + if (pitip->type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS && e_source_get_property (E_SOURCE (source), "conflict") && !g_ascii_strcasecmp (e_source_get_property (E_SOURCE (source), "conflict"), "true") - && e_cal_get_object_list (ecal, fd->sexp, &objects, NULL) - && g_list_length (objects) > 0) { + && e_cal_client_get_object_list_sync (client, fd->sexp, &objects, NULL, NULL) + && g_slist_length (objects) > 0) { itip_view_add_upper_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_WARNING, _("An appointment in the calendar '%s' conflicts with this meeting"), e_source_peek_name (source)); - e_cal_free_object_list (objects); + e_cal_client_free_icalcomp_slist (objects); } /* search for a master object if the detached object doesn't exist in the calendar */ - if (!pitip->current_ecal && (e_cal_get_object (ecal, fd->uid, fd->rid, &icalcomp, NULL) || (fd->rid && e_cal_get_object (ecal, fd->uid, NULL, &icalcomp, NULL)))) { + if (!pitip->current_client && (e_cal_client_get_object_sync (client, fd->uid, fd->rid, &icalcomp, NULL, NULL) || (fd->rid && e_cal_client_get_object_sync (client, fd->uid, NULL, &icalcomp, NULL, NULL)))) { if ((pitip->method == ICAL_METHOD_PUBLISH || pitip->method == ICAL_METHOD_REQUEST) && (icalcomponent_get_first_component (icalcomp, ICAL_VALARM_COMPONENT) || icalcomponent_get_first_component (icalcomp, ICAL_XAUDIOALARM_COMPONENT) || @@ -670,7 +685,7 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) icalcomponent_free (icalcomp); - pitip->current_ecal = ecal; + pitip->current_client = client; /* Provide extra info, since its not in the component */ /* FIXME Check sequence number of meeting? */ @@ -690,11 +705,11 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) _("Found the appointment in the calendar '%s'"), e_source_peek_name (source)); set_buttons_sensitive (pitip); - } else if (!pitip->current_ecal) + } else if (!pitip->current_client) itip_view_set_show_keep_alarm_check (ITIP_VIEW (pitip->view), FALSE); - if (pitip->current_ecal) { - if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_RECURRENCES_NO_MASTER)) { + if (pitip->current_client) { + if (e_cal_client_check_recurrences_no_master (pitip->current_client)) { icalcomponent *icalcomp = e_cal_component_get_icalcomponent (pitip->comp); if (check_is_instance (icalcomp)) @@ -703,9 +718,9 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) itip_view_set_show_recur_check (ITIP_VIEW (pitip->view), FALSE); } - if (pitip->type == E_CAL_SOURCE_TYPE_JOURNAL) { + if (pitip->type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) { /* TODO The static capability should be made generic to convey that the calendar contains unaccepted items */ - if (e_cal_get_static_capability (pitip->current_ecal, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)) + if (e_client_check_capability (E_CLIENT (pitip->current_client), CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)) itip_view_set_needs_decline (ITIP_VIEW (pitip->view), TRUE); else itip_view_set_needs_decline (ITIP_VIEW (pitip->view), FALSE); @@ -729,7 +744,7 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) * invitiations (REQUEST), but not replies (REPLY). * Replies only make sense for events with an organizer. */ - if (!e_cal_get_static_capability (ecal, CAL_STATIC_CAPABILITY_SAVE_SCHEDULES) && + if (!e_cal_client_check_save_schedules (client) && (pitip->method == ICAL_METHOD_PUBLISH || pitip->method == ICAL_METHOD_REQUEST) && pitip->has_organizer) { rsvp_enabled = TRUE; @@ -740,7 +755,7 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) itip_view_set_rsvp (ITIP_VIEW (pitip->view), !pitip->no_reply_wanted); if ((pitip->method == ICAL_METHOD_PUBLISH || pitip->method == ICAL_METHOD_REQUEST) - && !pitip->current_ecal) { + && !pitip->current_client) { /* Reuse already declared one or rename? */ EShell *shell; EShellSettings *shell_settings; @@ -752,15 +767,15 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) shell_settings = e_shell_get_shell_settings (shell); switch (pitip->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: uid = e_shell_settings_get_string ( shell_settings, "cal-primary-calendar"); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: uid = e_shell_settings_get_string ( shell_settings, "cal-primary-task-list"); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: uid = e_shell_settings_get_string ( shell_settings, "cal-primary-memo-list"); break; @@ -789,17 +804,17 @@ find_cal_opened_cb (ECal *ecal, const GError *error, gpointer data) itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to find any calendars")); itip_view_set_buttons_sensitive (ITIP_VIEW (pitip->view), FALSE); } - } else if (!pitip->current_ecal) { + } else if (!pitip->current_client) { switch (pitip->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: itip_view_add_lower_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_WARNING, _("Unable to find this meeting in any calendar")); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: itip_view_add_lower_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_WARNING, _("Unable to find this task in any task list")); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: itip_view_add_lower_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_WARNING, _("Unable to find this memo in any memo list")); break; @@ -913,7 +928,7 @@ find_server (struct _itip_puri *pitip, ECalComponent *comp) d(printf ("Increasing itip formatter search count to %d\n", fd->count)); if (current_source == source) - pitip->current_ecal = start_calendar_server (pitip, source, pitip->type, find_cal_opened_cb, fd); + pitip->current_client = start_calendar_server (pitip, source, pitip->type, find_cal_opened_cb, fd); else start_calendar_server (pitip, source, pitip->type, find_cal_opened_cb, fd); @@ -925,18 +940,6 @@ find_server (struct _itip_puri *pitip, ECalComponent *comp) g_free (rid); } -static void -cleanup_ecal (gpointer data) -{ - ECal *ecal = data; - - /* Clean up any signals */ - g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, cal_opened_cb, NULL); - g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, find_cal_opened_cb, NULL); - - g_object_unref (ecal); -} - static gboolean change_status (icalcomponent *ical_comp, const gchar *address, icalparameter_partstat status) { @@ -1167,7 +1170,7 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) result = FALSE; goto cleanup; } - source = e_cal_get_source (pitip->current_ecal); + source = e_client_get_source (E_CLIENT (pitip->current_client)); if (itip_view_get_keep_alarm_check_state (ITIP_VIEW (pitip->view))) { ECalComponent *real_comp; @@ -1250,7 +1253,7 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response) e_cal_component_set_attachment_list (clone_comp, new_attachments); } - if (!e_cal_receive_objects (pitip->current_ecal, pitip->top_level, &error)) { + if (!e_cal_client_receive_objects_sync (pitip->current_client, pitip->top_level, NULL, &error)) { itip_view_add_lower_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("Unable to send item to calendar '%s'. %s"), e_source_peek_name (source), error->message); @@ -1340,7 +1343,7 @@ set_attendee (ECalComponent *comp, const gchar *address) } static gboolean -send_comp_to_attendee (ECalComponentItipMethod method, ECalComponent *comp, const gchar *user, ECal *client, const gchar *comment) +send_comp_to_attendee (ECalComponentItipMethod method, ECalComponent *comp, const gchar *user, ECalClient *client, const gchar *comment) { gboolean status; ECalComponent *send_comp = e_cal_component_clone (comp); @@ -1375,9 +1378,9 @@ remove_delegate (struct _itip_puri *pitip, const gchar *delegate, const gchar *d gchar *comment = g_strdup_printf (_("Organizer has removed the delegate %s "), itip_strip_mailto (delegate)); /* send cancellation notice to delegate */ - status = send_comp_to_attendee (E_CAL_COMPONENT_METHOD_CANCEL, pitip->comp, delegate, pitip->current_ecal, comment); + status = send_comp_to_attendee (E_CAL_COMPONENT_METHOD_CANCEL, pitip->comp, delegate, pitip->current_client, comment); if (status) - send_comp_to_attendee (E_CAL_COMPONENT_METHOD_REQUEST, pitip->comp, delegator, pitip->current_ecal, comment); + send_comp_to_attendee (E_CAL_COMPONENT_METHOD_REQUEST, pitip->comp, delegator, pitip->current_client, comment); if (status) { itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("Sent a cancelation notice to the delegate")); } else @@ -1424,7 +1427,7 @@ update_attendee_status (struct _itip_puri *pitip) rid = e_cal_component_get_recurid_as_string (pitip->comp); /* search for a master object if the detached object doesn't exist in the calendar */ - if (e_cal_get_object (pitip->current_ecal, uid, rid, &icalcomp, NULL) || (rid && e_cal_get_object (pitip->current_ecal, uid, NULL, &icalcomp, NULL))) { + if (e_cal_client_get_object_sync (pitip->current_client, uid, rid, &icalcomp, NULL, NULL) || (rid && e_cal_client_get_object_sync (pitip->current_client, uid, NULL, &icalcomp, NULL, NULL))) { GSList *attendees; comp = e_cal_component_new (); @@ -1516,10 +1519,10 @@ update_attendee_status (struct _itip_puri *pitip) if (itip_view_get_update (ITIP_VIEW (pitip->view))) { e_cal_component_commit_sequence (comp); - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE, FALSE); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_client, NULL, NULL, NULL, TRUE, FALSE); } - if (!e_cal_modify_object (pitip->current_ecal, icalcomp, rid ? CALOBJ_MOD_THIS : CALOBJ_MOD_ALL, &error)) { + if (!e_cal_client_modify_object_sync (pitip->current_client, icalcomp, rid ? CALOBJ_MOD_THIS : CALOBJ_MOD_ALL, NULL, &error)) { itip_view_add_lower_info_item_printf (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to update attendee. %s"), error->message); @@ -1546,17 +1549,17 @@ send_item (struct _itip_puri *pitip) comp = get_real_item (pitip); if (comp != NULL) { - itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_ecal, NULL, NULL, NULL, TRUE, FALSE); + itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, pitip->current_client, NULL, NULL, NULL, TRUE, FALSE); g_object_unref (comp); switch (pitip->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("Meeting information sent")); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("Task information sent")); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("Memo information sent")); break; default: @@ -1565,13 +1568,13 @@ send_item (struct _itip_puri *pitip) } } else { switch (pitip->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to send meeting information, the meeting does not exist")); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to send task information, the task does not exist")); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: itip_view_add_lower_info_item (ITIP_VIEW (pitip->view), ITIP_VIEW_INFO_ITEM_TYPE_ERROR, _("Unable to send memo information, the memo does not exist")); break; default: @@ -1760,7 +1763,7 @@ extract_itip_data (struct _itip_puri *pitip, GtkContainer *container, gboolean * switch (icalcomponent_isa (pitip->ical_comp)) { case ICAL_VEVENT_COMPONENT: - pitip->type = E_CAL_SOURCE_TYPE_EVENT; + pitip->type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; pitip->has_organizer = icalcomponent_get_first_property (pitip->ical_comp, ICAL_ORGANIZER_PROPERTY) != NULL; if (icalcomponent_get_first_property (pitip->ical_comp, ICAL_ATTENDEE_PROPERTY) == NULL) { /* no attendees: assume that that this is not a meeting and organizer doesn't want a reply */ @@ -1773,10 +1776,10 @@ extract_itip_data (struct _itip_puri *pitip, GtkContainer *container, gboolean * } break; case ICAL_VTODO_COMPONENT: - pitip->type = E_CAL_SOURCE_TYPE_TODO; + pitip->type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; break; case ICAL_VJOURNAL_COMPONENT: - pitip->type = E_CAL_SOURCE_TYPE_JOURNAL; + pitip->type = E_CAL_CLIENT_SOURCE_TYPE_MEMOS; break; default: set_itip_error (pitip, container, @@ -2023,8 +2026,8 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) e_cal_component_set_transparency (pitip->comp, E_CAL_COMPONENT_TRANSP_OPAQUE); } - if (!pitip->to_address && pitip->current_ecal != NULL) - e_cal_get_cal_address (pitip->current_ecal, &pitip->to_address, NULL); + if (!pitip->to_address && pitip->current_client != NULL) + e_client_get_backend_property_sync (E_CLIENT (pitip->current_client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &pitip->to_address, NULL, NULL); /* check if it is a recur instance (no master object) and * add a property */ @@ -2035,12 +2038,11 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) } /*FIXME Save schedules is misused here, remove it */ - save_schedules = e_cal_get_static_capability (pitip->current_ecal, - CAL_STATIC_CAPABILITY_SAVE_SCHEDULES); + save_schedules = e_cal_client_check_save_schedules (pitip->current_client); switch (response) { case ITIP_VIEW_RESPONSE_ACCEPT: - if (pitip->type != E_CAL_SOURCE_TYPE_JOURNAL) + if (pitip->type != E_CAL_CLIENT_SOURCE_TYPE_MEMOS) status = change_status (pitip->ical_comp, pitip->to_address, ICAL_PARTSTAT_ACCEPTED); else @@ -2064,7 +2066,7 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) } break; case ITIP_VIEW_RESPONSE_DECLINE: - if (pitip->type != E_CAL_SOURCE_TYPE_JOURNAL) + if (pitip->type != E_CAL_CLIENT_SOURCE_TYPE_MEMOS) status = change_status (pitip->ical_comp, pitip->to_address, ICAL_PARTSTAT_DECLINED); else { @@ -2220,7 +2222,7 @@ view_response_cb (GtkWidget *widget, ItipViewResponse response, gpointer data) } e_cal_component_rescan (comp); - if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_ecal, pitip->top_level, NULL, NULL, TRUE, FALSE) && pitip->folder) { + if (itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, pitip->current_client, pitip->top_level, NULL, NULL, TRUE, FALSE) && pitip->folder) { camel_folder_set_message_flags ( pitip->folder, pitip->uid, CAMEL_MESSAGE_ANSWERED, @@ -2323,13 +2325,13 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject info->accounts = e_get_account_list (); /* Source Lists and open ecal clients */ - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { - if (!e_cal_get_sources (&info->source_lists[i], i, NULL)) + for (i = 0; i < E_CAL_CLIENT_SOURCE_TYPE_LAST; i++) { + if (!e_cal_client_get_sources (&info->source_lists[i], i, NULL)) /* FIXME More error handling? */ info->source_lists[i] = NULL; /* Initialize the ecal hashes */ - info->ecals[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, cleanup_ecal); + info->ecals[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); } /* FIXME Handle multiple VEVENTS with the same UID, ie detached instances */ @@ -2587,13 +2589,13 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject if (e_cal_component_has_recurrences (info->comp)) { /* FIXME Tell the user we don't support recurring tasks */ switch (info->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: itip_view_add_upper_info_item (ITIP_VIEW (info->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("This meeting recurs")); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: itip_view_add_upper_info_item (ITIP_VIEW (info->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("This task recurs")); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: itip_view_add_upper_info_item (ITIP_VIEW (info->view), ITIP_VIEW_INFO_ITEM_TYPE_INFO, _("This memo recurs")); break; default: @@ -2605,10 +2607,10 @@ format_itip_object (EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject if (response_enabled) { g_signal_connect (info->view, "response", G_CALLBACK (view_response_cb), info); - itip_view_set_show_free_time_check (ITIP_VIEW (info->view), info->type == E_CAL_SOURCE_TYPE_EVENT && (info->method == ICAL_METHOD_PUBLISH || info->method == ICAL_METHOD_REQUEST)); + itip_view_set_show_free_time_check (ITIP_VIEW (info->view), info->type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS && (info->method == ICAL_METHOD_PUBLISH || info->method == ICAL_METHOD_REQUEST)); if (info->calendar_uid) - info->current_ecal = start_calendar_server_by_uid (info, info->calendar_uid, info->type); + info->current_client = start_calendar_server_by_uid (info, info->calendar_uid, info->type); else { find_server (info, info->comp); set_buttons_sensitive (info); @@ -2624,7 +2626,7 @@ puri_free (EMFormatPURI *puri) struct _itip_puri *pitip = (struct _itip_puri*) puri; gint i; - for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) { + for (i = 0; i < E_CAL_CLIENT_SOURCE_TYPE_LAST; i++) { if (pitip->source_lists[i]) g_object_unref (pitip->source_lists[i]); pitip->source_lists[i] = NULL; @@ -2857,7 +2859,7 @@ itip_formatter_page_factory (EPlugin *ep, EConfigHookItemFactoryData *hook_data) gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (inner_vbox), label, FALSE, FALSE, 0); - if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_EVENT, NULL)) { + if (!e_cal_client_get_sources (&source_list, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, NULL)) { /* FIXME Error handling */; } diff --git a/plugins/itip-formatter/itip-view.c b/plugins/itip-formatter/itip-view.c index 70ae97784e..50d0fe3534 100644 --- a/plugins/itip-formatter/itip-view.c +++ b/plugins/itip-formatter/itip-view.c @@ -30,7 +30,7 @@ #include <libedataserver/e-time-utils.h> #include <libedataserver/e-data-server-util.h> #include <libedataserverui/e-source-combo-box.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-time-util.h> #include <gtkhtml/gtkhtml-embedded.h> #include <mail/em-format-hook.h> @@ -54,7 +54,7 @@ typedef struct { struct _ItipViewPrivate { ItipViewMode mode; - ECalSourceType type; + ECalClientSourceType type; GtkWidget *sender_label; gchar *organizer; @@ -585,13 +585,13 @@ set_sender_text (ItipView *view) priv = view->priv; switch (priv->type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: set_calendar_sender_text (view); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: set_tasklist_sender_text (view); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: set_journal_sender_text (view); break; default: @@ -855,7 +855,7 @@ set_buttons (ItipView *view) set_one_button (view, is_recur_set ? _("A_ccept all") : _("A_ccept"), GTK_STOCK_APPLY, ITIP_VIEW_RESPONSE_ACCEPT); break; case ITIP_VIEW_MODE_ADD: - if (priv->type != E_CAL_SOURCE_TYPE_JOURNAL) { + if (priv->type != E_CAL_CLIENT_SOURCE_TYPE_MEMOS) { set_one_button (view, _("_Decline"), GTK_STOCK_CANCEL, ITIP_VIEW_RESPONSE_DECLINE); set_one_button (view, _("_Tentative"), GTK_STOCK_DIALOG_QUESTION, ITIP_VIEW_RESPONSE_TENTATIVE); } @@ -1232,7 +1232,7 @@ itip_view_get_mode (ItipView *view) } void -itip_view_set_item_type (ItipView *view, ECalSourceType type) +itip_view_set_item_type (ItipView *view, ECalClientSourceType type) { ItipViewPrivate *priv; @@ -1246,7 +1246,7 @@ itip_view_set_item_type (ItipView *view, ECalSourceType type) set_sender_text (view); } -ECalSourceType +ECalClientSourceType itip_view_get_item_type (ItipView *view) { ItipViewPrivate *priv; @@ -1918,11 +1918,11 @@ itip_view_set_source_list (ItipView *view, ESourceList *source_list) G_CALLBACK (source_changed_cb), view); if (!priv->escb_header) { - if (priv->type == E_CAL_SOURCE_TYPE_EVENT) + if (priv->type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) priv->escb_header = gtk_label_new_with_mnemonic (_("_Calendar:")); - else if (priv->type == E_CAL_SOURCE_TYPE_TODO) + else if (priv->type == E_CAL_CLIENT_SOURCE_TYPE_TASKS) priv->escb_header = gtk_label_new_with_mnemonic (_("_Tasks:")); - else if (priv->type == E_CAL_SOURCE_TYPE_JOURNAL) + else if (priv->type == E_CAL_CLIENT_SOURCE_TYPE_MEMOS) priv->escb_header = gtk_label_new_with_mnemonic (_("_Memos:")); gtk_label_set_selectable (GTK_LABEL (priv->escb_header), TRUE); diff --git a/plugins/itip-formatter/itip-view.h b/plugins/itip-formatter/itip-view.h index b9da4eac8b..d68ebdf9a9 100644 --- a/plugins/itip-formatter/itip-view.h +++ b/plugins/itip-formatter/itip-view.h @@ -28,7 +28,7 @@ #include <unistd.h> #include <gtk/gtk.h> #include <libedataserver/e-source-list.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> G_BEGIN_DECLS @@ -96,8 +96,8 @@ GtkWidget *itip_view_new (void); void itip_view_set_mode (ItipView *view, ItipViewMode mode); ItipViewMode itip_view_get_mode (ItipView *view); -void itip_view_set_item_type (ItipView *view, ECalSourceType type); -ECalSourceType itip_view_get_item_type (ItipView *view); +void itip_view_set_item_type (ItipView *view, ECalClientSourceType type); +ECalClientSourceType itip_view_get_item_type (ItipView *view); void itip_view_set_organizer (ItipView *view, const gchar *organizer); const gchar *itip_view_get_organizer (ItipView *view); diff --git a/plugins/mail-to-task/Makefile.am b/plugins/mail-to-task/Makefile.am index 481390ced0..c263702904 100644 --- a/plugins/mail-to-task/Makefile.am +++ b/plugins/mail-to-task/Makefile.am @@ -21,7 +21,6 @@ liborg_gnome_mail_to_task_la_LIBADD = \ $(top_builddir)/shell/libeshell.la \ $(top_builddir)/em-format/libemformat.la \ $(top_builddir)/calendar/gui/libevolution-calendar.la \ - $(top_builddir)/calendar/common/libevolution-calendarprivate.la \ $(top_builddir)/mail/libevolution-mail.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ $(EVOLUTION_CALENDAR_LIBS) \ diff --git a/plugins/mail-to-task/mail-to-task.c b/plugins/mail-to-task/mail-to-task.c index 3ebc818013..29e0a10e5b 100644 --- a/plugins/mail-to-task/mail-to-task.c +++ b/plugins/mail-to-task/mail-to-task.c @@ -34,9 +34,10 @@ #include <gtkhtml/gtkhtml.h> #include <gconf/gconf-client.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libedataserver/e-account.h> #include <libedataserverui/e-source-selector-dialog.h> +#include <libedataserverui/e-client-utils.h> #include <mail/e-mail-browser.h> #include <mail/em-utils.h> @@ -44,7 +45,6 @@ #include <mail/message-list.h> #include <e-util/e-account-utils.h> #include <e-util/e-dialog-utils.h> -#include <calendar/common/authentication.h> #include <misc/e-popup-action.h> #include <shell/e-shell-view.h> #include <shell/e-shell-window-actions.h> @@ -291,7 +291,7 @@ attachment_save_finished (EAttachmentStore *store, } static void -set_attachments (ECal *client, ECalComponent *comp, CamelMimeMessage *message) +set_attachments (ECalClient *client, ECalComponent *comp, CamelMimeMessage *message) { /* XXX Much of this is copied from CompEditor::get_attachment_list(). * Perhaps it should be split off as a separate utility? */ @@ -321,7 +321,7 @@ set_attachments (ECal *client, ECalComponent *comp, CamelMimeMessage *message) return; e_cal_component_get_uid (comp, &comp_uid); - local_store = e_cal_get_local_attachment_store (client); + local_store = e_cal_client_get_local_attachment_store (client); path = g_build_path ("/", local_store, comp_uid, NULL); destination = g_file_new_for_path (path); @@ -438,7 +438,7 @@ report_error_idle (const gchar *format, const gchar *param) struct _manage_comp { - ECal *client; + ECalClient *client; ECalComponent *comp; icalcomponent *stored_comp; /* the one in client already */ }; @@ -481,18 +481,18 @@ do_ask (const gchar *text, gboolean is_create_edit_add) } static const gchar * -get_question_edit_old (ECalSourceType source_type) +get_question_edit_old (ECalClientSourceType source_type) { const gchar *ask = NULL; switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: ask = _("Selected calendar contains event '%s' already. Would you like to edit the old event?"); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: ask = _("Selected task list contains task '%s' already. Would you like to edit the old task?"); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: ask = _("Selected memo list contains memo '%s' already. Would you like to edit the old memo?"); break; default: @@ -504,24 +504,24 @@ get_question_edit_old (ECalSourceType source_type) } static const gchar * -get_question_create_new (ECalSourceType source_type) +get_question_create_new (ECalClientSourceType source_type) { const gchar *ask = NULL; switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you feel is most appropriate for your language. */ ask = _("Selected calendar contains some events for the given mails already. Would you like to create new events anyway?"); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you feel is most appropriate for your language. */ ask = _("Selected task list contains some tasks for the given mails already. Would you like to create new tasks anyway?"); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you feel is most appropriate for your language. */ @@ -536,12 +536,12 @@ get_question_create_new (ECalSourceType source_type) } static const gchar * -get_question_create_new_n (ECalSourceType source_type, gint count) +get_question_create_new_n (ECalClientSourceType source_type, gint count) { const gchar *ask = NULL; switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: ask = ngettext ( /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you @@ -550,7 +550,7 @@ get_question_create_new_n (ECalSourceType source_type, gint count) "Selected calendar contains events for the given mails already. Would you like to create new events anyway?", count); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: ask = ngettext ( /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you @@ -559,7 +559,7 @@ get_question_create_new_n (ECalSourceType source_type, gint count) "Selected task list contains tasks for the given mails already. Would you like to create new tasks anyway?", count); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: ask = ngettext ( /* Translators: Codewise it is impossible to provide separate strings for all combinations of singular and plural. Please translate it in the way that you @@ -582,7 +582,7 @@ do_manage_comp_idle (GSList *manage_comp_datas) GError *error = NULL; guint with_old = 0; gboolean need_editor = FALSE; - ECalSourceType source_type = E_CAL_SOURCE_TYPE_LAST; + ECalClientSourceType source_type = E_CAL_CLIENT_SOURCE_TYPE_LAST; GSList *l; g_return_val_if_fail (manage_comp_datas != NULL, FALSE); @@ -593,10 +593,10 @@ do_manage_comp_idle (GSList *manage_comp_datas) if (mc->comp && (e_cal_component_has_attendees (mc->comp) || e_cal_component_has_organizer (mc->comp))) need_editor = TRUE; - source_type = e_cal_get_source_type (mc->client); + source_type = e_cal_client_get_source_type (mc->client); } - if (source_type == E_CAL_SOURCE_TYPE_LAST) { + if (source_type == E_CAL_CLIENT_SOURCE_TYPE_LAST) { g_slist_foreach (manage_comp_datas, (GFunc) free_manage_comp_struct, NULL); g_slist_free (manage_comp_datas); @@ -634,7 +634,7 @@ do_manage_comp_idle (GSList *manage_comp_datas) g_object_unref (edit_comp); edit_comp = NULL; - error = g_error_new (E_CALENDAR_ERROR, E_CALENDAR_STATUS_INVALID_OBJECT, "%s", _("Invalid object returned from a server")); + error = g_error_new (E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_INVALID_OBJECT, "%s", _("Invalid object returned from a server")); } } else if (chosen == GTK_RESPONSE_NO) { /* user wants to create a new event, thus generate a new UID */ @@ -686,6 +686,7 @@ do_manage_comp_idle (GSList *manage_comp_datas) if (can) { for (l = manage_comp_datas; l && !error; l = l->next) { struct _manage_comp *mc = l->data; + gchar *uid = NULL; if (!mc) continue; @@ -699,7 +700,8 @@ do_manage_comp_idle (GSList *manage_comp_datas) g_free (new_uid); } - e_cal_create_object (mc->client, e_cal_component_get_icalcomponent (mc->comp), NULL, &error); + e_cal_client_create_object_sync (mc->client, e_cal_component_get_icalcomponent (mc->comp), &uid, NULL, &error); + g_free (uid); } } } @@ -716,7 +718,7 @@ do_manage_comp_idle (GSList *manage_comp_datas) } typedef struct { - ECal *client; + ECalClient *client; CamelFolder *folder; GPtrArray *uids; gchar *selected_text; @@ -726,27 +728,26 @@ typedef struct { static gboolean do_mail_to_event (AsyncData *data) { - ECal *client = data->client; + ECalClient *client = data->client; CamelFolder *folder = data->folder; GPtrArray *uids = data->uids; GError *err = NULL; - gboolean readonly = FALSE; /* open the task client */ - if (!e_cal_open (client, FALSE, &err)) { + if (!e_client_open_sync (E_CLIENT (client), FALSE, NULL, &err)) { report_error_idle (_("Cannot open calendar. %s"), err ? err->message : _("Unknown error.")); - } else if (!e_cal_is_read_only (client, &readonly, &err) || readonly) { + } else if (e_client_is_readonly (E_CLIENT (client))) { if (err) report_error_idle ("Check readonly failed. %s", err->message); else { - switch (e_cal_get_source_type (client)) { - case E_CAL_SOURCE_TYPE_EVENT: + switch (e_cal_client_get_source_type (client)) { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: report_error_idle (_("Selected source is read only, thus cannot create event there. Select other source, please."), NULL); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: report_error_idle (_("Selected source is read only, thus cannot create task there. Select other source, please."), NULL); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: report_error_idle (_("Selected source is read only, thus cannot create memo there. Select other source, please."), NULL); break; default: @@ -757,7 +758,7 @@ do_mail_to_event (AsyncData *data) } else { GSList *mcs = NULL; gint i; - ECalSourceType source_type = e_cal_get_source_type (client); + ECalClientSourceType source_type = e_cal_client_get_source_type (client); ECalComponentDateTime dt, dt2; struct icaltimetype tt, tt2; @@ -791,13 +792,13 @@ do_mail_to_event (AsyncData *data) comp = e_cal_component_new (); switch (source_type) { - case E_CAL_SOURCE_TYPE_EVENT: + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT); break; - case E_CAL_SOURCE_TYPE_TODO: + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO); break; - case E_CAL_SOURCE_TYPE_JOURNAL: + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_JOURNAL); break; default: @@ -808,7 +809,7 @@ do_mail_to_event (AsyncData *data) e_cal_component_set_uid (comp, camel_mime_message_get_message_id (message)); e_cal_component_set_dtstart (comp, &dt); - if (source_type == E_CAL_SOURCE_TYPE_EVENT) { + if (source_type == E_CAL_CLIENT_SOURCE_TYPE_EVENTS) { /* make it an all-day event */ e_cal_component_set_dtend (comp, &dt2); } @@ -859,7 +860,7 @@ do_mail_to_event (AsyncData *data) mc->client = g_object_ref (client); mc->comp = g_object_ref (comp); - if (!e_cal_get_object (client, icalcomponent_get_uid (icalcomp), NULL, &(mc->stored_comp), NULL)) + if (!e_cal_client_get_object_sync (client, icalcomponent_get_uid (icalcomp), NULL, &(mc->stored_comp), NULL, NULL)) mc->stored_comp = NULL; mcs = g_slist_append (mcs, mc); @@ -937,7 +938,7 @@ get_selected_text (EMailReader *reader) } static void -mail_to_event (ECalSourceType source_type, +mail_to_event (ECalClientSourceType source_type, gboolean with_attendees, EMailReader *reader) { @@ -952,7 +953,7 @@ mail_to_event (ECalSourceType source_type, folder = e_mail_reader_get_folder (reader); uids = e_mail_reader_get_selected_uids (reader); - if (!e_cal_get_sources (&source_list, source_type, &error)) { + if (!e_cal_client_get_sources (&source_list, source_type, &error)) { e_notice (NULL, GTK_MESSAGE_ERROR, _("Cannot get source list. %s"), error ? error->message : _("Unknown error.")); if (error) @@ -999,21 +1000,26 @@ mail_to_event (ECalSourceType source_type, if (source) { /* if a source has been selected, perform the mail2event operation */ - ECal *client = NULL; + ECalClient *client = NULL; AsyncData *data = NULL; GThread *thread = NULL; + GError *error = NULL; - client = e_auth_new_cal_from_source (source, source_type); + client = e_cal_client_new (source, source_type, &error); if (!client) { gchar *uri = e_source_get_uri (source); - e_notice (NULL, GTK_MESSAGE_ERROR, "Could not create the client: %s", uri); + e_notice (NULL, GTK_MESSAGE_ERROR, "Could not create the client '%s': %s", uri, error ? error->message : "Unknown error"); g_free (uri); g_object_unref (source_list); + if (error) + g_error_free (error); return; } + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + /* Fill the elements in AsynData */ data = g_new0 (AsyncData, 1); data->client = client; @@ -1040,28 +1046,28 @@ static void action_mail_convert_to_event_cb (GtkAction *action, EMailReader *reader) { - mail_to_event (E_CAL_SOURCE_TYPE_EVENT, FALSE, reader); + mail_to_event (E_CAL_CLIENT_SOURCE_TYPE_EVENTS, FALSE, reader); } static void action_mail_convert_to_meeting_cb (GtkAction *action, EMailReader *reader) { - mail_to_event (E_CAL_SOURCE_TYPE_EVENT, TRUE, reader); + mail_to_event (E_CAL_CLIENT_SOURCE_TYPE_EVENTS, TRUE, reader); } static void action_mail_convert_to_memo_cb (GtkAction *action, EMailReader *reader) { - mail_to_event (E_CAL_SOURCE_TYPE_JOURNAL, FALSE, reader); + mail_to_event (E_CAL_CLIENT_SOURCE_TYPE_MEMOS, FALSE, reader); } static void action_mail_convert_to_task_cb (GtkAction *action, EMailReader *reader) { - mail_to_event (E_CAL_SOURCE_TYPE_TODO, FALSE, reader); + mail_to_event (E_CAL_CLIENT_SOURCE_TYPE_TASKS, FALSE, reader); } /* Note, we're not using EPopupActions here because we update the state diff --git a/plugins/pst-import/pst-importer.c b/plugins/pst-import/pst-importer.c index 9ede806b73..201b09df7b 100644 --- a/plugins/pst-import/pst-importer.c +++ b/plugins/pst-import/pst-importer.c @@ -44,9 +44,9 @@ #include <e-util/e-plugin.h> #include <libebook/e-contact.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-component.h> #include <libedataserver/e-data-server-util.h> @@ -125,10 +125,10 @@ struct _PstImporter { gint folder_count; gint current_item; - EBook *addressbook; - ECal *calendar; - ECal *tasks; - ECal *journal; + EBookClient *addressbook; + ECalClient *calendar; + ECalClient *tasks; + ECalClient *journal; }; gboolean @@ -366,29 +366,41 @@ pst_import_describe (PstImporter *m, gint complete) return g_strdup (_("Importing Outlook data")); } -static ECal* -open_ecal (ECalSourceType type, const gchar *name) +static ECalClient * +open_ecal (ECalClientSourceType type, const gchar *name) { /* Hack - grab the first calendar we can find TODO - add a selection mechanism in get_widget */ ESource *primary; ESourceList *source_list; - ECal *cal; + ECalClient *cal; + GError *error = NULL; - if ((e_cal_get_sources (&source_list, type, NULL)) == 0) { - g_warning ("Could not get any sources of type %s.", name); + if ((e_cal_client_get_sources (&source_list, type, &error)) == 0) { + g_debug ("%s: Could not get any sources of type %s: %s", G_STRFUNC, name, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); return NULL; } primary = e_source_list_peek_source_any (source_list); - if ((cal = e_cal_new (primary, type)) == NULL) { - g_warning ("Could not create %s.", name); + if ((cal = e_cal_client_new (primary, type, &error)) == NULL) { + g_debug ("%s: Could not create %s: %s", G_STRFUNC, name, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); g_object_unref (source_list); return NULL; } - e_cal_open (cal, TRUE, NULL); + if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error)) { + g_debug ("%s: Failed to open %s: %s", G_STRFUNC, name, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); + g_object_unref (cal); + cal = NULL; + } + g_object_unref (primary); g_object_unref (source_list); @@ -405,32 +417,39 @@ pst_import_import (PstImporter *m, TODO - add a selection mechanism in get_widget */ ESource *primary; ESourceList *source_list; + GError *error = NULL; - if (e_book_get_addressbooks (&source_list, NULL)) { + if (e_book_client_get_sources (&source_list, &error)) { primary = e_source_list_peek_source_any (source_list); - if ((m->addressbook = e_book_new (primary,NULL))) { - e_book_open (m->addressbook, TRUE, NULL); + if ((m->addressbook = e_book_client_new (primary, &error))) { + if (!e_client_open_sync (E_CLIENT (m->addressbook), TRUE, NULL, &error)) { + g_debug ("%s: Failed to open book client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + } + g_object_unref (primary); g_object_unref (source_list); } else { - g_warning ("Could not create EBook."); + g_debug ("%s: Could not create book client: %s", G_STRFUNC, error ? error->message : "Unknown error"); } } else { - g_warning ("Could not get address books."); + g_debug ("%s: Could not get address books: %s", G_STRFUNC, error ? error->message : "Unknown error"); } + + if (error) + g_error_free (error); } if (GPOINTER_TO_INT (g_datalist_get_data (&m->target->data, "pst-do-appt"))) { - m->calendar = open_ecal (E_CAL_SOURCE_TYPE_EVENT, "calendar"); + m->calendar = open_ecal (E_CAL_CLIENT_SOURCE_TYPE_EVENTS, "calendar"); } if (GPOINTER_TO_INT (g_datalist_get_data (&m->target->data, "pst-do-task"))) { - m->tasks = open_ecal (E_CAL_SOURCE_TYPE_TODO, "task list"); + m->tasks = open_ecal (E_CAL_CLIENT_SOURCE_TYPE_TASKS, "task list"); } if (GPOINTER_TO_INT (g_datalist_get_data (&m->target->data, "pst-do-journal"))) { - m->journal = open_ecal (E_CAL_SOURCE_TYPE_JOURNAL, "journal"); + m->journal = open_ecal (E_CAL_CLIENT_SOURCE_TYPE_MEMOS, "journal"); } pst_import_file (m); @@ -1082,6 +1101,8 @@ pst_process_contact (PstImporter *m, pst_item *item) pst_item_contact *c; EContact *ec; GString *notes; + gchar *uid = NULL; + GError *error = NULL; c = item->contact; notes = g_string_sized_new (2048); @@ -1218,9 +1239,16 @@ pst_process_contact (PstImporter *m, pst_item *item) contact_set_string (ec, E_CONTACT_NOTE, notes->str); g_string_free (notes, TRUE); - e_book_add_contact (m->addressbook, ec, NULL); + if (!e_book_client_add_contact_sync (m->addressbook, ec, &uid, NULL, &error)) + uid = NULL; + g_object_unref (ec); + g_free (uid); + if (error) { + g_debug ("%s: Failed to add contact: %s", G_STRFUNC, error->message); + g_error_free (error); + } } /** @@ -1246,7 +1274,7 @@ get_ical_date (FILETIME *date, gboolean is_date) } static void -set_cal_attachments (ECal *cal, ECalComponent *ec, PstImporter *m, pst_item_attach *attach) +set_cal_attachments (ECalClient *cal, ECalComponent *ec, PstImporter *m, pst_item_attach *attach) { GSList *list = NULL; const gchar *uid; @@ -1257,7 +1285,7 @@ set_cal_attachments (ECal *cal, ECalComponent *ec, PstImporter *m, pst_item_atta } e_cal_component_get_uid (ec, &uid); - store_dir = g_filename_from_uri (e_cal_get_local_attachment_store (cal), NULL, NULL); + store_dir = g_filename_from_uri (e_cal_client_get_local_attachment_store (cal), NULL, NULL); while (attach != NULL) { const gchar * orig_filename; @@ -1502,9 +1530,10 @@ fill_calcomponent (PstImporter *m, pst_item *item, ECalComponent *ec, const gcha } static void -pst_process_component (PstImporter *m, pst_item *item, const gchar *comp_type, ECal *cal) +pst_process_component (PstImporter *m, pst_item *item, const gchar *comp_type, ECalClient *cal) { ECalComponent *ec; + gchar *uid = NULL; GError *error = NULL; g_return_if_fail (item->appointment != NULL); @@ -1515,12 +1544,13 @@ pst_process_component (PstImporter *m, pst_item *item, const gchar *comp_type, E fill_calcomponent (m, item, ec, comp_type); set_cal_attachments (cal, ec, m, item->attach); - if (!e_cal_create_object (cal, e_cal_component_get_icalcomponent (ec), NULL, &error)) { + if (!e_cal_client_create_object_sync (cal, e_cal_component_get_icalcomponent (ec), &uid, NULL, &error)) { + uid = NULL; g_warning ("Creation of %s failed: %s", comp_type, error ? error->message : "Unknown error"); } g_object_unref (ec); - + g_free (uid); if (error) g_error_free (error); } diff --git a/plugins/publish-calendar/publish-format-fb.c b/plugins/publish-calendar/publish-format-fb.c index 2f9b0626cf..65762e0c8a 100644 --- a/plugins/publish-calendar/publish-format-fb.c +++ b/plugins/publish-calendar/publish-format-fb.c @@ -30,23 +30,38 @@ #include <gconf/gconf-client.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> -#include <libecal/e-cal.h> +#include <libedataserverui/e-client-utils.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-util.h> #include <libecal/e-cal-time-util.h> -#include <calendar/common/authentication.h> #include "publish-format-fb.h" +static void +free_busy_data_cb (ECalClient *client, const GSList *free_busy_ecalcomps, GSList **pobjects) +{ + const GSList *iter; + + g_return_if_fail (pobjects != NULL); + + for (iter = free_busy_ecalcomps; iter != NULL; iter = iter->next) { + ECalComponent *comp = iter->data; + + if (comp) + *pobjects = g_slist_prepend (*pobjects, g_object_ref (comp)); + } +} + static gboolean -write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, gint dur_type, gint dur_value, GError **error) +write_calendar (const gchar *uid, ESourceList *source_list, GOutputStream *stream, gint dur_type, gint dur_value, GError **error) { ESource *source; - ECal *client = NULL; - GList *objects; + ECalClient *client = NULL; + GSList *objects = NULL; icaltimezone *utc; time_t start = time (NULL), end; icalcomponent *top_level; gchar *email = NULL; - GList *users = NULL; + GSList *users = NULL; gboolean res = FALSE; utc = icaltimezone_get_utc_timezone (); @@ -67,46 +82,52 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, gin source = e_source_list_peek_source_by_uid (source_list, uid); if (source) - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); + client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, error); if (!client) { - if (error) - *error = g_error_new (e_calendar_error_quark (), E_CALENDAR_STATUS_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); + if (error && !*error) + *error = g_error_new (E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); return FALSE; } - if (!e_cal_open (client, TRUE, error)) { + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!e_client_open_sync (E_CLIENT (client), TRUE, NULL, error)) { g_object_unref (client); return FALSE; } - if (e_cal_get_cal_address (client, &email, NULL)) { + if (e_client_get_backend_property_sync (E_CLIENT (client), CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS, &email, NULL, NULL)) { if (email && *email) - users = g_list_append (users, email); + users = g_slist_append (users, email); } top_level = e_cal_util_new_top_level (); - if (e_cal_get_free_busy (client, users, start, end, &objects, error)) { + g_signal_connect (client, "free-busy-data", G_CALLBACK (free_busy_data_cb), &objects); + + if (e_cal_client_get_free_busy_sync (client, start, end, users, NULL, error)) { gchar *ical_string; + GSList *iter; - while (objects) { + for (iter = objects; iter; iter = iter->next) { ECalComponent *comp = objects->data; icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp); icalcomponent_add_component (top_level, icalcomp); - objects = g_list_remove (objects, comp); } ical_string = icalcomponent_as_ical_string_r (top_level); res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, error); + e_cal_client_free_ecalcomp_slist (objects); g_free (ical_string); } if (users) - g_list_free (users); + g_slist_free (users); g_free (email); g_object_unref (client); + icalcomponent_free (top_level); return res; } @@ -116,12 +137,11 @@ publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri, GError **error) { GSList *l; ESourceList *source_list; - GConfClient *gconf_client; - gconf_client = gconf_client_get_default (); + if (!e_cal_client_get_sources (&source_list, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, error)) + return; /* events */ - source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources"); l = uri->events; while (l) { gchar *uid = l->data; @@ -129,7 +149,6 @@ publish_calendar_as_fb (GOutputStream *stream, EPublishUri *uri, GError **error) break; l = g_slist_next (l); } - g_object_unref (source_list); - g_object_unref (gconf_client); + g_object_unref (source_list); } diff --git a/plugins/publish-calendar/publish-format-ical.c b/plugins/publish-calendar/publish-format-ical.c index b4b5451a2f..de6b342c3d 100644 --- a/plugins/publish-calendar/publish-format-ical.c +++ b/plugins/publish-calendar/publish-format-ical.c @@ -29,14 +29,14 @@ #include <gconf/gconf-client.h> #include <libedataserver/e-source.h> #include <libedataserver/e-source-list.h> -#include <libecal/e-cal.h> +#include <libedataserverui/e-client-utils.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-util.h> -#include <calendar/common/authentication.h> #include "publish-format-ical.h" typedef struct { GHashTable *zones; - ECal *ecal; + ECalClient *client; } CompTzData; static void @@ -53,7 +53,7 @@ insert_tz_comps (icalparameter *param, gpointer cb_data) if (g_hash_table_lookup (tdata->zones, tzid)) return; - if (!e_cal_get_timezone (tdata->ecal, tzid, &zone, &error)) { + if (!e_cal_client_get_timezone_sync (tdata->client, tzid, &zone, NULL, &error)) { g_warning ("Could not get the timezone information for %s : %s \n", tzid, error->message); g_error_free (error); return; @@ -70,42 +70,44 @@ append_tz_to_comp (gpointer key, gpointer value, icalcomponent *toplevel) } static gboolean -write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GError **error) +write_calendar (const gchar *uid, ESourceList *source_list, GOutputStream *stream, GError **error) { ESource *source; - ECal *client = NULL; - GList *objects; + ECalClient *client = NULL; + GSList *objects; icalcomponent *top_level; gboolean res = FALSE; source = e_source_list_peek_source_by_uid (source_list, uid); if (source) - client = e_auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT); + client = e_cal_client_new (source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, error); if (!client) { - if (error) - *error = g_error_new (e_calendar_error_quark (), E_CALENDAR_STATUS_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); + if (error && !error) + *error = g_error_new (E_CAL_CLIENT_ERROR, E_CAL_CLIENT_ERROR_NO_SUCH_CALENDAR, _("Could not publish calendar: Calendar backend no longer exists")); return FALSE; } - if (!e_cal_open (client, TRUE, error)) { + g_signal_connect (client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!e_client_open_sync (E_CLIENT (client), TRUE, NULL, error)) { g_object_unref (client); return FALSE; } top_level = e_cal_util_new_top_level (); - if (e_cal_get_object_list (client, "#t", &objects, error)) { + if (e_cal_client_get_object_list_sync (client, "#t", &objects, NULL, error)) { + GSList *iter; gchar *ical_string; CompTzData tdata; tdata.zones = g_hash_table_new (g_str_hash, g_str_equal); - tdata.ecal = client; + tdata.client = client; - while (objects) { + for (iter = objects; iter; iter = iter->next) { icalcomponent *icalcomp = objects->data; icalcomponent_foreach_tzid (icalcomp, insert_tz_comps, &tdata); icalcomponent_add_component (top_level, icalcomp); - objects = g_list_remove (objects, icalcomp); } g_hash_table_foreach (tdata.zones, (GHFunc) append_tz_to_comp, top_level); @@ -116,9 +118,11 @@ write_calendar (gchar *uid, ESourceList *source_list, GOutputStream *stream, GEr ical_string = icalcomponent_as_ical_string_r (top_level); res = g_output_stream_write_all (stream, ical_string, strlen (ical_string), NULL, NULL, error); g_free (ical_string); + e_cal_client_free_icalcomp_slist (objects); } g_object_unref (client); + icalcomponent_free (top_level); return res; } @@ -128,12 +132,11 @@ publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri, GError **erro { GSList *l; ESourceList *source_list; - GConfClient *gconf_client; - - gconf_client = gconf_client_get_default (); /* events */ - source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources"); + if (!e_cal_client_get_sources (&source_list, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, error)) + return; + l = uri->events; while (l) { gchar *uid = l->data; @@ -141,7 +144,6 @@ publish_calendar_as_ical (GOutputStream *stream, EPublishUri *uri, GError **erro break; l = g_slist_next (l); } - g_object_unref (source_list); - g_object_unref (gconf_client); + g_object_unref (source_list); } diff --git a/plugins/save-calendar/csv-format.c b/plugins/save-calendar/csv-format.c index 15ed83817e..da21588d8c 100644 --- a/plugins/save-calendar/csv-format.c +++ b/plugins/save-calendar/csv-format.c @@ -30,8 +30,8 @@ #include <libecal/e-cal-time-util.h> #include <libedataserver/e-data-server-util.h> #include <libedataserverui/e-source-selector.h> -#include <libecal/e-cal.h> -#include "calendar/common/authentication.h" +#include <libedataserverui/e-client-utils.h> +#include <libecal/e-cal-client.h> #include <string.h> #include "format-handler.h" @@ -300,7 +300,7 @@ userstring_to_systemstring (const gchar *userstring) static void do_save_calendar_csv (FormatHandler *handler, ESourceSelector *selector, - ECalSourceType type, + ECalClientSourceType type, gchar *dest_uri) { @@ -314,9 +314,9 @@ do_save_calendar_csv (FormatHandler *handler, */ ESource *primary_source; - ECal *source_client; + ECalClient *source_client; GError *error = NULL; - GList *objects=NULL; + GSList *objects = NULL; GOutputStream *stream; GString *line = NULL; CsvConfig *config = NULL; @@ -329,12 +329,16 @@ do_save_calendar_csv (FormatHandler *handler, primary_source = e_source_selector_get_primary_selection (selector); /* open source client */ - source_client = e_auth_new_cal_from_source (primary_source, type); - if (!e_cal_open (source_client, TRUE, &error)) { + source_client = e_cal_client_new (primary_source, type, &error); + if (source_client) + g_signal_connect (source_client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!source_client || !e_client_open_sync (E_CLIENT (source_client), TRUE, NULL, &error)) { display_error_message ( gtk_widget_get_toplevel (GTK_WIDGET (selector)), error); - g_object_unref (source_client); + if (source_client) + g_object_unref (source_client); g_error_free (error); return; } @@ -354,8 +358,8 @@ do_save_calendar_csv (FormatHandler *handler, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (selector))), dest_uri, &error); - if (stream && e_cal_get_object_list_as_comp ( - source_client, "#t", &objects, NULL)) { + if (stream && e_cal_client_get_object_list_as_comps_sync (source_client, "#t", &objects, NULL, NULL)) { + GSList *iter; if (config->header) { @@ -396,7 +400,7 @@ do_save_calendar_csv (FormatHandler *handler, g_string_free (line, TRUE); } - while (objects != NULL) { + for (iter = objects; iter; iter = iter->next) { ECalComponent *comp = objects->data; gchar *delimiter_temp = NULL; const gchar *temp_constchar; @@ -521,11 +525,11 @@ do_save_calendar_csv (FormatHandler *handler, /* It's written, so we can free it */ g_string_free (line, TRUE); - - objects = g_list_next (objects); } g_output_stream_close (stream, NULL, NULL); + + e_cal_client_free_ecalcomp_slist (objects); } if (stream) diff --git a/plugins/save-calendar/format-handler.h b/plugins/save-calendar/format-handler.h index e04d95fbf1..b7376920ef 100644 --- a/plugins/save-calendar/format-handler.h +++ b/plugins/save-calendar/format-handler.h @@ -24,7 +24,7 @@ #include <gio/gio.h> #include <libedataserver/e-source.h> #include <libedataserverui/e-source-selector.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> typedef struct _FormatHandler FormatHandler; @@ -39,7 +39,7 @@ struct _FormatHandler void (*save) (FormatHandler *handler, ESourceSelector *selector, - ECalSourceType type, + ECalClientSourceType type, gchar *dest_uri); }; diff --git a/plugins/save-calendar/ical-format.c b/plugins/save-calendar/ical-format.c index fa4f6a5515..39cac6f2e0 100644 --- a/plugins/save-calendar/ical-format.c +++ b/plugins/save-calendar/ical-format.c @@ -29,9 +29,9 @@ #include <glib/gi18n.h> #include <libedataserver/e-source.h> #include <libedataserverui/e-source-selector.h> -#include <libecal/e-cal.h> +#include <libedataserverui/e-client-utils.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-util.h> -#include <calendar/common/authentication.h> #include <string.h> #include "format-handler.h" @@ -48,7 +48,7 @@ display_error_message (GtkWidget *parent, const gchar *message) typedef struct { GHashTable *zones; - ECal *ecal; + ECalClient *client; } CompTzData; static void @@ -65,7 +65,7 @@ insert_tz_comps (icalparameter *param, gpointer cb_data) if (g_hash_table_lookup (tdata->zones, tzid)) return; - if (!e_cal_get_timezone (tdata->ecal, tzid, &zone, &error)) { + if (!e_cal_client_get_timezone_sync (tdata->client, tzid, &zone, NULL, &error)) { g_warning ("Could not get the timezone information for %s : %s \n", tzid, error->message); g_error_free (error); return; @@ -82,12 +82,12 @@ append_tz_to_comp (gpointer key, gpointer value, icalcomponent *toplevel) } static void -do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, ECalSourceType type, gchar *dest_uri) +do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, ECalClientSourceType type, gchar *dest_uri) { ESource *primary_source; - ECal *source_client; + ECalClient *source_client; GError *error = NULL; - GList *objects; + GSList *objects = NULL; icalcomponent *top_level = NULL; primary_source = e_source_selector_get_primary_selection (selector); @@ -96,10 +96,14 @@ do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, ECalSo return; /* open source client */ - source_client = (ECal*) e_auth_new_cal_from_source (primary_source, type); - if (!e_cal_open (source_client, TRUE, &error)) { + source_client = e_cal_client_new (primary_source, type, &error); + if (source_client) + g_signal_connect (source_client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!source_client || !e_client_open_sync (E_CLIENT (source_client), TRUE, NULL, &error)) { display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (selector)), error->message); - g_object_unref (source_client); + if (source_client) + g_object_unref (source_client); g_error_free (error); return; } @@ -108,21 +112,19 @@ do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, ECalSo top_level = e_cal_util_new_top_level (); error = NULL; - if (e_cal_get_object_list (source_client, "#t", &objects, &error)) { + if (e_cal_client_get_object_list_sync (source_client, "#t", &objects, NULL, &error)) { CompTzData tdata; GOutputStream *stream; + GSList *iter; tdata.zones = g_hash_table_new (g_str_hash, g_str_equal); - tdata.ecal = source_client; + tdata.client = source_client; - while (objects != NULL) { + for (iter = objects; iter; iter = iter->next) { icalcomponent *icalcomp = objects->data; icalcomponent_foreach_tzid (icalcomp, insert_tz_comps, &tdata); icalcomponent_add_component (top_level, icalcomp); - - /* remove item from the list */ - objects = g_list_remove (objects, icalcomp); } g_hash_table_foreach (tdata.zones, (GHFunc) append_tz_to_comp, top_level); @@ -142,6 +144,8 @@ do_save_calendar_ical (FormatHandler *handler, ESourceSelector *selector, ECalSo g_object_unref (stream); g_free (ical_str); } + + e_cal_client_free_icalcomp_slist (objects); } if (error) { diff --git a/plugins/save-calendar/rdf-format.c b/plugins/save-calendar/rdf-format.c index 084250e70c..c64b31f055 100644 --- a/plugins/save-calendar/rdf-format.c +++ b/plugins/save-calendar/rdf-format.c @@ -27,8 +27,9 @@ #include <gtk/gtk.h> #include <glib/gi18n.h> #include <libedataserver/e-source.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <libecal/e-cal-time-util.h> #include <libedataserver/e-data-server-util.h> #include <libxml/xmlmemory.h> @@ -38,7 +39,6 @@ #include <libxml/xpath.h> #include <string.h> -#include "calendar/common/authentication.c" #include "format-handler.h" static void @@ -169,7 +169,7 @@ add_string_to_rdf (xmlNodePtr node, const gchar *tag, const gchar *value) } static void -do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSourceType type, gchar *dest_uri) +do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalClientSourceType type, gchar *dest_uri) { /* @@ -182,9 +182,9 @@ do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSou */ ESource *primary_source; - ECal *source_client; + ECalClient *source_client; GError *error = NULL; - GList *objects=NULL; + GSList *objects = NULL; gchar *temp = NULL; GOutputStream *stream; @@ -194,17 +194,23 @@ do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSou primary_source = e_source_selector_get_primary_selection (selector); /* open source client */ - source_client = e_auth_new_cal_from_source (primary_source, type); - if (!e_cal_open (source_client, TRUE, &error)) { + source_client = e_cal_client_new (primary_source, type, &error); + if (source_client) + g_signal_connect (source_client, "authenticate", G_CALLBACK (e_client_utils_authenticate_handler), NULL); + + if (!source_client || !e_client_open_sync (E_CLIENT (source_client), TRUE, NULL, &error)) { display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (selector)), error); - g_object_unref (source_client); + if (source_client) + g_object_unref (source_client); g_error_free (error); return; } stream = open_for_writing (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (selector))), dest_uri, &error); - if (stream && e_cal_get_object_list_as_comp (source_client, "#t", &objects, NULL)) { + if (stream && e_cal_client_get_object_list_as_comps_sync (source_client, "#t", &objects, NULL, NULL)) { + GSList *iter; + xmlBufferPtr buffer=xmlBufferCreate (); xmlDocPtr doc = xmlNewDoc((xmlChar *) "1.0"); xmlNodePtr fnode; @@ -238,7 +244,7 @@ do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSou /* Version of this RDF-format */ xmlNewChild (fnode, NULL, (const guchar *)"version", (const guchar *)"2.0"); - while (objects != NULL) { + for (iter = objects; iter; iter = iter->next) { ECalComponent *comp = objects->data; const gchar *temp_constchar; gchar *tmp_str = NULL; @@ -334,8 +340,6 @@ do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSou * http://www.gnome.org/projects/evolution/developer-doc/libecal/ECalComponent.html * #e-cal-component-get-last-modified */ - - objects = g_list_next (objects); } /* I used a buffer rather than xmlDocDump: I want gio support */ @@ -344,6 +348,8 @@ do_save_calendar_rdf (FormatHandler *handler, ESourceSelector *selector, ECalSou g_output_stream_write_all (stream, xmlBufferContent (buffer), xmlBufferLength (buffer), NULL, NULL, &error); g_output_stream_close (stream, NULL, NULL); + e_cal_client_free_ecalcomp_slist (objects); + xmlBufferFree (buffer); xmlFreeDoc (doc); } diff --git a/plugins/save-calendar/save-calendar.c b/plugins/save-calendar/save-calendar.c index 8bf0067b79..a1a48be7cf 100644 --- a/plugins/save-calendar/save-calendar.c +++ b/plugins/save-calendar/save-calendar.c @@ -32,7 +32,7 @@ #include <glib/gi18n.h> #include <libedataserver/e-source.h> #include <libedataserverui/e-source-selector.h> -#include <libecal/e-cal.h> +#include <libecal/e-cal-client.h> #include <e-util/e-alert-dialog.h> #include <e-util/e-plugin.h> #include <string.h> @@ -113,7 +113,7 @@ format_handlers_foreach_free (gpointer data, gpointer user_data) } static void -ask_destination_and_save (ESourceSelector *selector, ECalSourceType type) +ask_destination_and_save (ESourceSelector *selector, ECalClientSourceType type) { FormatHandler *handler = NULL; @@ -284,7 +284,7 @@ open_for_writing (GtkWindow *parent, const gchar *uri, GError **error) static void save_general (EShellView *shell_view, - ECalSourceType type) + ECalClientSourceType type) { EShellSidebar *shell_sidebar; ESourceSelector *selector = NULL; @@ -302,21 +302,21 @@ static void action_calendar_save_as_cb (GtkAction *action, EShellView *shell_view) { - save_general (shell_view, E_CAL_SOURCE_TYPE_EVENT); + save_general (shell_view, E_CAL_CLIENT_SOURCE_TYPE_EVENTS); } static void action_memo_list_save_as_cb (GtkAction *action, EShellView *shell_view) { - save_general (shell_view, E_CAL_SOURCE_TYPE_JOURNAL); + save_general (shell_view, E_CAL_CLIENT_SOURCE_TYPE_MEMOS); } static void action_task_list_save_as_cb (GtkAction *action, EShellView *shell_view) { - save_general (shell_view, E_CAL_SOURCE_TYPE_TODO); + save_general (shell_view, E_CAL_CLIENT_SOURCE_TYPE_TASKS); } gboolean diff --git a/plugins/vcard-inline/vcard-inline.c b/plugins/vcard-inline/vcard-inline.c index 062f21e598..7e56da440b 100644 --- a/plugins/vcard-inline/vcard-inline.c +++ b/plugins/vcard-inline/vcard-inline.c @@ -22,10 +22,10 @@ #include <gtk/gtk.h> #include <glib/gi18n-lib.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <libebook/e-contact.h> #include <gtkhtml/gtkhtml-embedded.h> -#include <libedataserverui/e-book-auth-util.h> +#include <libedataserverui/e-client-utils.h> #include <libedataserverui/e-source-selector-dialog.h> #include "addressbook/gui/merging/eab-contact-merging.h" @@ -41,7 +41,7 @@ typedef struct _VCardInlinePObject VCardInlinePObject; struct _VCardInlinePObject { EMFormatHTMLPObject object; - GList *contact_list; + GSList *contact_list; ESourceList *source_list; GtkWidget *contact_display; GtkWidget *message_label; @@ -66,10 +66,7 @@ org_gnome_vcard_inline_pobject_free (EMFormatHTMLPObject *object) vcard_object = (VCardInlinePObject *) object; - g_list_foreach ( - vcard_object->contact_list, - (GFunc) g_object_unref, NULL); - g_list_free (vcard_object->contact_list); + e_client_util_free_object_slist (vcard_object->contact_list); vcard_object->contact_list = NULL; if (vcard_object->source_list != NULL) { @@ -95,7 +92,7 @@ org_gnome_vcard_inline_decode (VCardInlinePObject *vcard_object, CamelDataWrapper *data_wrapper; CamelMedium *medium; CamelStream *stream; - GList *contact_list; + GSList *contact_list; GByteArray *array; const gchar *string; const guint8 padding[2] = {0}; @@ -121,37 +118,43 @@ org_gnome_vcard_inline_decode (VCardInlinePObject *vcard_object, } static void -org_gnome_vcard_inline_book_loaded_cb (ESource *source, - GAsyncResult *result, - GList *contact_list) +org_gnome_vcard_inline_client_loaded_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EBook *book; - GList *iter; - - book = e_load_book_source_finish (source, result, NULL); - - if (book == NULL) + EClient *client = NULL; + EBookClient *book_client; + GSList *contact_list = user_data, *iter; + GError *error = NULL; + + if (!e_client_utils_open_new_finish (E_SOURCE (source_object), result, &client, &error)) + client = NULL; + + if (client == NULL) { + g_debug ("%s: Failed to open book client: %s", G_STRFUNC, error ? error->message : "Unknown error"); + if (error) + g_error_free (error); goto exit; + } + + book_client = E_BOOK_CLIENT (client); for (iter = contact_list; iter != NULL; iter = iter->next) { EContact *contact; contact = E_CONTACT (iter->data); - eab_merging_book_add_contact (book, contact, NULL, NULL); + eab_merging_book_add_contact (book_client, contact, NULL, NULL); } - g_object_unref (book); + g_object_unref (client); -exit: - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); + exit: + e_client_util_free_object_slist (contact_list); } static void org_gnome_vcard_inline_save_cb (VCardInlinePObject *vcard_object) { ESource *source; - GList *contact_list; + GSList *contact_list; GtkWidget*dialog; g_return_if_fail (vcard_object->source_list != NULL); @@ -173,12 +176,11 @@ org_gnome_vcard_inline_save_cb (VCardInlinePObject *vcard_object) g_return_if_fail (source != NULL); - contact_list = g_list_copy (vcard_object->contact_list); - g_list_foreach (contact_list, (GFunc) g_object_ref, NULL); + contact_list = e_client_util_copy_object_slist (NULL, vcard_object->contact_list); - e_load_book_source_async ( - source, NULL, NULL, (GAsyncReadyCallback) - org_gnome_vcard_inline_book_loaded_cb, contact_list); + e_client_utils_open_new (source, E_CLIENT_SOURCE_TYPE_CONTACTS, FALSE, NULL, + e_client_utils_authenticate_handler, NULL, + org_gnome_vcard_inline_client_loaded_cb, contact_list); } static void @@ -218,7 +220,7 @@ org_gnome_vcard_inline_embed (EMFormatHTML *format, guint length; vcard_object = (VCardInlinePObject *) object; - length = g_list_length (vcard_object->contact_list); + length = g_slist_length (vcard_object->contact_list); if (vcard_object->contact_list != NULL) contact = E_CONTACT (vcard_object->contact_list->data); @@ -328,7 +330,7 @@ org_gnome_vcard_inline_format (gpointer ep, EMFormatHookTarget *target) vcard_object->object.free = org_gnome_vcard_inline_pobject_free; org_gnome_vcard_inline_decode (vcard_object, target->part); - e_book_get_addressbooks (&vcard_object->source_list, NULL); + e_book_client_get_sources (&vcard_object->source_list, NULL); camel_stream_printf ( target->stream, "<object classid=%s></object>", classid); diff --git a/po/POTFILES.in b/po/POTFILES.in index b11778909d..fc0d0207f0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -37,7 +37,6 @@ addressbook/tools/evolution-addressbook-export-list-cards.c addressbook/tools/evolution-addressbook-export-list-folders.c addressbook/tools/evolution-addressbook-export.c calendar/calendar.error.xml -calendar/common/authentication.c calendar/gui/alarm-notify/alarm-notify-dialog.c [type: gettext/glade]calendar/gui/alarm-notify/alarm-notify.ui calendar/gui/alarm-notify/alarm-queue.c diff --git a/widgets/misc/e-contact-map-window.c b/widgets/misc/e-contact-map-window.c index 117051528d..1618086a1b 100644 --- a/widgets/misc/e-contact-map-window.c +++ b/widgets/misc/e-contact-map-window.c @@ -30,7 +30,8 @@ #include <champlain/champlain.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> +#include <libebook/e-book-query.h> #include <libebook/e-contact.h> #include <string.h> @@ -73,25 +74,27 @@ marker_doubleclick_cb (ClutterActor *marker, } static void -book_contacts_received_cb (EBook *book, - const GError *error, - GList *list, - gpointer closure) +book_contacts_received_cb (GObject *source_object, GAsyncResult *result, gpointer user_data) { - EContactMapWindow *window = closure; - GList *p; + EContactMapWindow *window = user_data; + EBookClient *client = E_BOOK_CLIENT (source_object); + GSList *contacts = NULL, *p; + GError *error = NULL; - g_return_if_fail (error == NULL); + if (!e_book_client_get_contacts_finish (client, result, &contacts, &error)) + contacts = NULL; - for (p = list; p; p = p->next) { + if (error) { + g_debug ("%s: Failed to get contacts: %s", G_STRFUNC, error ? error->message : "Unknown error"); + g_clear_error (&error); + } + for (p = contacts; p; p = p->next) { e_contact_map_add_contact (window->priv->map, (EContact*) p->data); - } - g_list_foreach (list, (GFunc) g_object_unref, NULL); - g_list_free (list); - g_object_unref (book); + e_client_util_free_object_slist (contacts); + g_object_unref (client); } static void @@ -435,23 +438,26 @@ e_contact_map_window_new (void) */ void e_contact_map_window_load_addressbook (EContactMapWindow *map, - EBook *book) + EBookClient *book_client) { EBookQuery *book_query; + gchar *query_string; + + g_return_if_fail (E_IS_CONTACT_MAP_WINDOW (map)); + g_return_if_fail (E_IS_BOOK_CLIENT (book_client)); + /* Reference book, so that it does not get deleted before the callback is involved. The book is unrefed in the callback */ - g_object_ref (book); - - g_return_if_fail (E_IS_CONTACT_MAP_WINDOW (map)); - g_return_if_fail (E_IS_BOOK (book)); + g_object_ref (book_client); book_query = e_book_query_field_exists (E_CONTACT_ADDRESS); + query_string = e_book_query_to_string (book_query); + e_book_query_unref (book_query); - e_book_get_contacts_async (book, book_query, - (EBookListAsyncCallback) book_contacts_received_cb, map); + e_book_client_get_contacts (book_client, query_string, NULL, book_contacts_received_cb, map); - e_book_query_unref (book_query); + g_free (query_string); } EContactMap* diff --git a/widgets/misc/e-contact-map-window.h b/widgets/misc/e-contact-map-window.h index ea96d88e39..ea92d75c46 100644 --- a/widgets/misc/e-contact-map-window.h +++ b/widgets/misc/e-contact-map-window.h @@ -23,7 +23,7 @@ #include <gtk/gtk.h> -#include <libebook/e-book.h> +#include <libebook/e-book-client.h> #include <e-contact-map.h> @@ -68,7 +68,7 @@ GType e_contact_map_window_get_type (void) G_GNUC_CONST; EContactMapWindow* e_contact_map_window_new (void); void e_contact_map_window_load_addressbook (EContactMapWindow *window, - EBook *book); + EBookClient *book); EContactMap* e_contact_map_window_get_map (EContactMapWindow *window); |