Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Hi, to end the series of Evolution last-minute bugfixes from git, here is evolution-ews. It also includes a packaging change, to help security support by using the system libmspack instead of the bundled one. evolution-ews (3.12.9~git20141130.278fe7-1) UNRELEASED; urgency=medium * New upstream git snapshot from stable branch, includes only bugfixes and translations. * Update evolution and e-d-s build-dependencies to 3.12.9~. * Require libmspack and stop building with the embedded code copy. I’m attaching the upstream and Debian changes. Individual upstream patches can be found at: https://git.gnome.org/browse/evolution-ews/log/?h=evolution-ews-3-12 unblock evolution-ews/3.12.9~git20141130.278fe7-1 Thanks for considering. -- .''`. Josselin Mouette : :' : `. `' `-
diff --git a/NEWS b/NEWS index dc05cf3..d5be244 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,13 @@ +Evolution-EWS 3.12.8 2014-11-10 +------------------------------- + +Bug Fixes: + Bug 738987 - Crash under e_ews_notification_unsubscribe_folder_sync() (Milan Crha) + Bug 691293 - Claim old resources in offline mode (Milan Crha) + +Miscellaneous: + Use G_IO_ERROR_CANCELLED instead of EWS_CONNECTION_ERROR_CANCELLED (Milan Crha) + Evolution-EWS 3.12.7 2014-10-13 ------------------------------- diff --git a/configure.ac b/configure.ac index fd257d8..6430905 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl Evolution-EWS version m4_define([ews_major_version], [3]) m4_define([ews_minor_version], [12]) -m4_define([ews_micro_version], [7]) +m4_define([ews_micro_version], [9]) m4_define([ews_version], [ews_major_version.ews_minor_version.ews_micro_version]) diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c index 1416db4..bd9ffb0 100644 --- a/src/addressbook/e-book-backend-ews.c +++ b/src/addressbook/e-book-backend-ews.c @@ -184,8 +184,6 @@ convert_error_to_edb_error (GError **perror) case EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED: error = EDB_ERROR_EX (AUTHENTICATION_FAILED, (*perror)->message); break; - case EWS_CONNECTION_ERROR_CANCELLED: - break; case EWS_CONNECTION_ERROR_FOLDERNOTFOUND: case EWS_CONNECTION_ERROR_MANAGEDFOLDERNOTFOUND: case EWS_CONNECTION_ERROR_PARENTFOLDERNOTFOUND: @@ -3280,6 +3278,17 @@ e_book_backend_ews_start_view (EBookBackend *backend, E_BACKEND (backend), E_SOURCE_AUTHENTICATOR (backend), cancellable, &error); + if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_NORESPONSE)) { + /* possibly server unreachable, try offline */ + if (priv->summary) + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &is_populated, NULL); + if (is_populated) { + g_clear_error (&error); + fetch_from_offline (ebews, book_view, query, cancellable, &error); + goto out; + } + } + if (error != NULL) goto out; } @@ -3861,7 +3870,7 @@ e_book_backend_ews_open_sync (EBookBackend *backend, ews_settings = book_backend_ews_get_collection_settings (ebews); PRIV_LOCK (priv); - need_to_authenticate = priv->cnc == NULL && e_backend_get_online (E_BACKEND (backend)); + need_to_authenticate = priv->cnc == NULL && e_backend_is_destination_reachable (E_BACKEND (backend), cancellable, NULL); PRIV_UNLOCK (priv); if (need_to_authenticate && @@ -3889,11 +3898,6 @@ e_book_backend_ews_open_sync (EBookBackend *backend, if (priv->listen_notifications) ebews_listen_notifications_cb (ebews, NULL, ews_settings); - g_signal_connect_swapped ( - priv->cnc, - "server-notification", - G_CALLBACK (ebews_server_notification_cb), - ebews); PRIV_UNLOCK (priv); g_signal_connect_swapped ( @@ -4111,6 +4115,12 @@ book_backend_ews_try_password_sync (ESourceAuthenticator *authenticator, backend->priv->cnc = g_object_ref (connection); backend->priv->is_writable = !backend->priv->is_gal; + g_signal_connect_swapped ( + backend->priv->cnc, + "server-notification", + G_CALLBACK (ebews_server_notification_cb), + backend); + PRIV_UNLOCK (backend->priv); e_backend_set_online (E_BACKEND (backend), TRUE); diff --git a/src/calendar/e-cal-backend-ews-utils.c b/src/calendar/e-cal-backend-ews-utils.c index f7e247d..8ad1229 100644 --- a/src/calendar/e-cal-backend-ews-utils.c +++ b/src/calendar/e-cal-backend-ews-utils.c @@ -123,13 +123,19 @@ e_cal_backend_ews_populate_windows_zones (void) tokens = g_strsplit ((gchar *) ical, " ", 0); tokens_len = g_strv_length (tokens); if (tokens_len == 1) { - g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup ((gchar *) ical)); - g_hash_table_insert (ical_to_msdn, g_strdup ((gchar *) ical), g_strdup ((gchar *) msdn)); + if (!g_hash_table_lookup (msdn_to_ical, msdn)) + g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup ((gchar *) ical)); + + if (!g_hash_table_lookup (ical_to_msdn, ical)) + g_hash_table_insert (ical_to_msdn, g_strdup ((gchar *) ical), g_strdup ((gchar *) msdn)); } else { gint j; for (j = 0; j < tokens_len; j++) { - g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup (tokens[j])); - g_hash_table_insert (ical_to_msdn, g_strdup (tokens[j]), g_strdup ((gchar *) msdn)); + if (!g_hash_table_lookup (msdn_to_ical, msdn)) + g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup (tokens[j])); + + if (!g_hash_table_lookup (ical_to_msdn, tokens[j])) + g_hash_table_insert (ical_to_msdn, g_strdup (tokens[j]), g_strdup ((gchar *) msdn)); } } diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c index 69d802d..e2a6c02 100644 --- a/src/calendar/e-cal-backend-ews.c +++ b/src/calendar/e-cal-backend-ews.c @@ -190,8 +190,6 @@ convert_error_to_edc_error (GError **perror) case EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED: error = EDC_ERROR_EX (AuthenticationFailed, (*perror)->message); break; - case EWS_CONNECTION_ERROR_CANCELLED: - break; case EWS_CONNECTION_ERROR_FOLDERNOTFOUND: case EWS_CONNECTION_ERROR_MANAGEDFOLDERNOTFOUND: case EWS_CONNECTION_ERROR_PARENTFOLDERNOTFOUND: @@ -445,6 +443,41 @@ e_cal_backend_ews_discard_alarm (ECalBackend *backend, edad); } +static gchar * +cal_backend_ews_get_builtin_zone_object (const gchar *tzid) +{ + icalcomponent *icalcomp = NULL, *free_comp = NULL; + icaltimezone *zone; + gchar *object = NULL; + + zone = icaltimezone_get_builtin_timezone (tzid); + if (!zone) { + icalcomp = free_comp = icaltzutil_fetch_timezone (tzid); + } + + if (zone) + icalcomp = icaltimezone_get_component (zone); + + if (icalcomp) { + icalcomponent *clone = icalcomponent_new_clone (icalcomp); + icalproperty *prop; + + prop = icalcomponent_get_first_property (clone, ICAL_TZID_PROPERTY); + if (prop) { + /* change tzid to our, because the component has the buildin tzid */ + icalproperty_set_tzid (prop, tzid); + + object = icalcomponent_as_ical_string_r (clone); + } + icalcomponent_free (clone); + } + + if (free_comp) + icalcomponent_free (free_comp); + + return object; +} + static void e_cal_backend_ews_get_timezone (ECalBackend *backend, EDataCal *cal, @@ -478,37 +511,21 @@ e_cal_backend_ews_get_timezone (ECalBackend *backend, slashes++; } - if (slashes == 1) { - icalcomponent *icalcomp = NULL, *free_comp = NULL; + if (slashes == 1) + object = cal_backend_ews_get_builtin_zone_object (tzid); - icaltimezone *zone = icaltimezone_get_builtin_timezone (tzid); - if (!zone) { - icalcomp = free_comp = icaltzutil_fetch_timezone (tzid); + if (!object) { + /* The timezone can be sometimes the Windows zone, try to convert it to libical */ + const gchar *ical_location = e_cal_backend_ews_tz_util_get_ical_equivalent (tzid); + if (ical_location) { + object = cal_backend_ews_get_builtin_zone_object (ical_location); } - - if (zone) - icalcomp = icaltimezone_get_component (zone); - - if (icalcomp) { - icalcomponent *clone = icalcomponent_new_clone (icalcomp); - icalproperty *prop; - - prop = icalcomponent_get_first_property (clone, ICAL_TZID_PROPERTY); - if (prop) { - /* change tzid to our, because the component has the buildin tzid */ - icalproperty_set_tzid (prop, tzid); - - object = icalcomponent_as_ical_string_r (clone); - g_clear_error (&error); - } - icalcomponent_free (clone); - } - - if (free_comp) - icalcomponent_free (free_comp); } } + if (!object && !error) + g_propagate_error (&error, e_data_cal_create_error (ObjectNotFound, NULL)); + convert_error_to_edc_error (&error); e_data_cal_respond_get_timezone (cal, context, error, object); g_free (object); @@ -782,7 +799,7 @@ e_cal_backend_ews_open (ECalBackend *backend, need_to_authenticate = (priv->cnc == NULL) && - (e_backend_get_online (E_BACKEND (backend))); + (e_backend_is_destination_reachable (E_BACKEND (backend), cancellable, NULL)); PRIV_UNLOCK (priv); @@ -801,12 +818,6 @@ e_cal_backend_ews_open (ECalBackend *backend, if (priv->listen_notifications) cbews_listen_notifications_cb (cbews, NULL, ews_settings); - - g_signal_connect_swapped ( - priv->cnc, - "server-notification", - G_CALLBACK (cbews_server_notification_cb), - cbews); } PRIV_UNLOCK (priv); } @@ -1308,6 +1319,8 @@ ews_create_attachments_cb (GObject *object, if (error != NULL) g_clear_error (&error); + e_cal_backend_ews_async_data_free (create_data); + return; } @@ -1353,7 +1366,7 @@ ews_create_attachments_cb (GObject *object, modify_data->extra_comp = g_object_ref (create_data->extra_comp); modify_data->cal = g_object_ref (create_data->cal); modify_data->context = create_data->context; - modify_data->item_id = create_data->item_id; + modify_data->item_id = g_strdup (create_data->item_id); convert_data.connection = create_data->cbews->priv->cnc; convert_data.user_email = create_data->cbews->priv->user_email; @@ -4249,6 +4262,12 @@ cal_backend_ews_try_password_sync (ESourceAuthenticator *authenticator, g_object_unref (backend->priv->cnc); backend->priv->cnc = g_object_ref (connection); + g_signal_connect_swapped ( + backend->priv->cnc, + "server-notification", + G_CALLBACK (cbews_server_notification_cb), + backend); + PRIV_UNLOCK (backend->priv); ews_start_sync (backend); diff --git a/src/calendar/windowsZones.xml b/src/calendar/windowsZones.xml index ce1fdc4..d3d197d 100644 --- a/src/calendar/windowsZones.xml +++ b/src/calendar/windowsZones.xml @@ -471,7 +471,7 @@ For terms of use, see http://www.unicode.org/copyright.html <mapZone other="Pakistan Standard Time" territory="PK" type="Asia/Karachi"/> <!-- (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi --> - <mapZone other="India Standard Time" territory="001" type="Asia/Calcutta"/> + <mapZone other="India Standard Time" territory="001" type="Asia/Kolkata"/> <mapZone other="India Standard Time" territory="IN" type="Asia/Calcutta"/> <!-- (UTC+05:30) Sri Jayawardenepura --> @@ -648,13 +648,6 @@ For terms of use, see http://www.unicode.org/copyright.html <!-- (UTC+13:00) Samoa --> <mapZone other="Samoa Standard Time" territory="001" type="Pacific/Apia"/> <mapZone other="Samoa Standard Time" territory="WS" type="Pacific/Apia"/> - - <!-- Internal fixes --> - <mapZone other="Argentina Standard Time" territory="AR" type="America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Jujuy America/Argentina/Catamarca America/Argentina/Mendoza"/> - <mapZone other="India Standard Time" territory="IN" type="Asia/Kolkata"/> - <mapZone other="Nepal Standard Time" territory="NP" type="Asia/Kathmandu"/> - <mapZone other="Eastern Standard Time" territory="US" type="America/Kentucky/Louisville"/> - <mapZone other="US Eastern Standard Time" territory="US" type="America/Indiana/Indianapolis"/> </mapTimezones> </windowsZones> </supplementalData> diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c index f02a3ba..0e964bb 100644 --- a/src/camel/camel-ews-folder.c +++ b/src/camel/camel-ews-folder.c @@ -1884,7 +1884,18 @@ ews_append_message_sync (CamelFolder *folder, e_ews_folder_id_free (fid); g_free (folder_id); - camel_ews_summary_add_message (folder->summary, itemid, changekey, info, message); + if (camel_ews_summary_add_message (folder->summary, itemid, changekey, info, message)) { + CamelFolderChangeInfo *changes; + + changes = camel_folder_change_info_new (); + + camel_folder_change_info_add_uid (changes, itemid); + + if (camel_folder_change_info_changed (changes)) + camel_folder_changed (folder, changes); + + camel_folder_change_info_free (changes); + } if (appended_uid) *appended_uid = itemid; @@ -2008,8 +2019,8 @@ ews_transfer_messages_to_sync (CamelFolder *source, clone = camel_message_info_clone (info); - camel_ews_summary_add_message (destination->summary, id->id, id->change_key, clone, message); - camel_folder_change_info_add_uid (changes, id->id); + if (camel_ews_summary_add_message (destination->summary, id->id, id->change_key, clone, message)) + camel_folder_change_info_add_uid (changes, id->id); camel_message_info_unref (clone); camel_message_info_unref (info); diff --git a/src/camel/camel-ews-store-summary.c b/src/camel/camel-ews-store-summary.c index f5a999a..413a40d 100644 --- a/src/camel/camel-ews-store-summary.c +++ b/src/camel/camel-ews-store-summary.c @@ -14,7 +14,7 @@ #define S_UNLOCK(x) (g_rec_mutex_unlock(&(x)->priv->s_lock)) #define STORE_GROUP_NAME "##storepriv" -#define CURRENT_SUMMARY_VERSION 1 +#define CURRENT_SUMMARY_VERSION 2 struct _CamelEwsStoreSummaryPrivate { GKeyFile *key_file; diff --git a/src/camel/camel-ews-store.c b/src/camel/camel-ews-store.c index 3029665..ad82405 100644 --- a/src/camel/camel-ews-store.c +++ b/src/camel/camel-ews-store.c @@ -1982,7 +1982,7 @@ get_public_folder_full_name (EEwsFolder *folder, g_return_val_if_fail (folder != NULL, NULL); g_return_val_if_fail (folders_by_id != NULL, NULL); - full_name = g_string_new (e_ews_folder_get_name (folder)); + full_name = g_string_new (e_ews_folder_get_escaped_name (folder)); while (folder) { parent_fid = e_ews_folder_get_parent_id (folder); if (!parent_fid || !parent_fid->id) @@ -1991,7 +1991,7 @@ get_public_folder_full_name (EEwsFolder *folder, folder = g_hash_table_lookup (folders_by_id, parent_fid->id); if (folder) { g_string_prepend (full_name, "/"); - g_string_prepend (full_name, e_ews_folder_get_name (folder)); + g_string_prepend (full_name, e_ews_folder_get_escaped_name (folder)); } } @@ -3248,10 +3248,10 @@ ews_store_subscribe_folder_sync (CamelSubscribable *subscribable, g_return_val_if_fail (parent_name != NULL, FALSE); - tmp = g_strconcat (parent_name, "/", e_ews_folder_get_name (folder), NULL); + tmp = g_strconcat (parent_name, "/", e_ews_folder_get_escaped_name (folder), NULL); g_free (parent_name); } else { - tmp = g_strconcat (EWS_PUBLIC_FOLDER_ROOT_DISPLAY_NAME, "/", e_ews_folder_get_name (folder), NULL); + tmp = g_strconcat (EWS_PUBLIC_FOLDER_ROOT_DISPLAY_NAME, "/", e_ews_folder_get_escaped_name (folder), NULL); } if (e_ews_folder_get_folder_type (folder) != E_EWS_FOLDER_TYPE_MAILBOX) { diff --git a/src/camel/camel-ews-summary.c b/src/camel/camel-ews-summary.c index 971e902..1f10cb2 100644 --- a/src/camel/camel-ews-summary.c +++ b/src/camel/camel-ews-summary.c @@ -273,7 +273,7 @@ ews_info_set_flags (CamelMessageInfo *info, return CAMEL_FOLDER_SUMMARY_CLASS (camel_ews_summary_parent_class)->info_set_flags (info, flags, set); } -void +gboolean camel_ews_summary_add_message (CamelFolderSummary *summary, const gchar *uid, const gchar *change_key, @@ -284,13 +284,13 @@ camel_ews_summary_add_message (CamelFolderSummary *summary, const CamelFlag *flag; const CamelTag *tag; - g_return_if_fail (uid != NULL); - g_return_if_fail (info != NULL); - g_return_if_fail (message != NULL); + g_return_val_if_fail (uid != NULL, FALSE); + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (message != NULL, FALSE); /* Create summary entry */ mi = (CamelEwsMessageInfo *) camel_folder_summary_info_new_from_message (summary, message, NULL); - g_return_if_fail (mi != NULL); + g_return_val_if_fail (mi != NULL, FALSE); /* Set the change_key */ mi->change_key = g_strdup (change_key); @@ -317,6 +317,8 @@ camel_ews_summary_add_message (CamelFolderSummary *summary, camel_folder_summary_add (summary, (CamelMessageInfo *) mi); camel_folder_summary_touch (summary); camel_folder_summary_save_to_db (summary, NULL); + + return TRUE; } static gboolean diff --git a/src/camel/camel-ews-summary.h b/src/camel/camel-ews-summary.h index b28d4e1..2d6cee1 100644 --- a/src/camel/camel-ews-summary.h +++ b/src/camel/camel-ews-summary.h @@ -88,7 +88,8 @@ gboolean CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags); -void camel_ews_summary_add_message (CamelFolderSummary *summary, +gboolean + camel_ews_summary_add_message (CamelFolderSummary *summary, const gchar *uid, const gchar *change_key, CamelMessageInfo *info, diff --git a/src/camel/camel-ews-utils.c b/src/camel/camel-ews-utils.c index c6996fd..8f3d7e1 100644 --- a/src/camel/camel-ews-utils.c +++ b/src/camel/camel-ews-utils.c @@ -48,6 +48,7 @@ camel_ews_utils_build_folder_info (CamelEwsStore *store, { CamelEwsStoreSummary *ews_summary = store->summary; CamelFolderInfo *fi; + gchar *folder_name; fi = camel_folder_info_new (); fi->full_name = camel_ews_store_summary_get_folder_full_name ( @@ -60,14 +61,14 @@ camel_ews_utils_build_folder_info (CamelEwsStore *store, return NULL; } - fi->display_name = camel_ews_store_summary_get_folder_name ( - ews_summary, fid, NULL); - fi->flags = camel_ews_store_summary_get_folder_flags ( - ews_summary, fid, NULL); - fi->unread = camel_ews_store_summary_get_folder_unread ( - ews_summary, fid, NULL); - fi->total = camel_ews_store_summary_get_folder_total ( - ews_summary, fid, NULL); + folder_name = camel_ews_store_summary_get_folder_name (ews_summary, fid, NULL); + + fi->display_name = e_ews_folder_utils_unescape_name (folder_name); + fi->flags = camel_ews_store_summary_get_folder_flags (ews_summary, fid, NULL); + fi->unread = camel_ews_store_summary_get_folder_unread (ews_summary, fid, NULL); + fi->total = camel_ews_store_summary_get_folder_total (ews_summary, fid, NULL); + + g_free (folder_name); if (!(fi->flags & CAMEL_FOLDER_TYPE_MASK)) { switch (camel_ews_store_summary_get_folder_type (ews_summary, fid, NULL)) { diff --git a/src/collection/e-ews-backend.c b/src/collection/e-ews-backend.c index 386e41d..42791e5 100644 --- a/src/collection/e-ews-backend.c +++ b/src/collection/e-ews-backend.c @@ -394,6 +394,7 @@ ews_backend_add_gal_source (EEwsBackend *backend) g_object_unref (server); if (source != NULL) { + e_source_set_enabled (source, TRUE); g_object_unref (source); return; } @@ -430,6 +431,7 @@ ews_backend_add_gal_source (EEwsBackend *backend) source = e_collection_backend_new_child ( collection_backend, oal_id); + e_source_set_enabled (source, TRUE); e_source_set_display_name (source, display_name); @@ -463,48 +465,21 @@ ews_backend_add_gal_source (EEwsBackend *backend) g_object_unref (source); } +static void ews_backend_populate (ECollectionBackend *backend); + static void ews_backend_source_changed_cb (ESource *source, EEwsBackend *backend) { - CamelEwsSettings *settings; - const gchar *oal_selected; - const gchar *gal_uid; - if (!e_source_get_enabled (source)) { backend->priv->need_update_folders = TRUE; return; } - if (!e_backend_get_online (E_BACKEND (backend)) || - !backend->priv->need_update_folders) - return; - - settings = ews_backend_get_settings (backend); - gal_uid = camel_ews_settings_get_gal_uid (settings); - oal_selected = camel_ews_settings_get_oal_selected (settings); - - if (g_strcmp0 (oal_selected, backend->priv->oal_selected) == 0) + if (!backend->priv->need_update_folders) return; - /* Remove the old Global Address List source if present. */ - if (gal_uid != NULL) { - ECollectionBackend *collection_backend; - ESourceRegistryServer *server; - - collection_backend = E_COLLECTION_BACKEND (backend); - server = e_collection_backend_ref_server (collection_backend); - source = e_source_registry_server_ref_source (server, gal_uid); - - if (source != NULL) { - e_source_registry_server_remove_source (server, source); - g_object_unref (source); - } - - camel_ews_settings_set_gal_uid (settings, NULL); - } - - ews_backend_add_gal_source (backend); + ews_backend_populate (E_COLLECTION_BACKEND (backend)); } static void @@ -652,6 +627,43 @@ ews_backend_constructed (GObject *object) } static void +ews_backend_claim_old_resources (ECollectionBackend *backend) +{ + ESourceRegistryServer *registry; + GList *old_resources, *iter; + + g_return_if_fail (E_IS_COLLECTION_BACKEND (backend)); + + registry = e_collection_backend_ref_server (backend); + old_resources = e_collection_backend_claim_all_resources (backend); + + for (iter = old_resources; iter; iter = g_list_next (iter)) { + ESource *source = iter->data; + + e_source_set_enabled (source, TRUE); + e_source_registry_server_add_source (registry, source); + } + + g_list_free_full (old_resources, g_object_unref); + g_clear_object (®istry); +} + +static void +ews_backend_folders_synced_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + EEwsBackend *ews_backend; + + g_return_if_fail (E_IS_EWS_BACKEND (source)); + + ews_backend = E_EWS_BACKEND (source); + + if (!e_ews_backend_sync_folders_finish (ews_backend, result, NULL)) + ews_backend_claim_old_resources (E_COLLECTION_BACKEND (ews_backend)); +} + +static void ews_backend_populate (ECollectionBackend *backend) { ESource *source; @@ -661,20 +673,21 @@ ews_backend_populate (ECollectionBackend *backend) ews_backend->priv->need_update_folders = TRUE; - /* do not do anything, if account is disabled */ - if (!e_source_get_enabled (source)) - return; - if (!ews_backend->priv->notify_online_id) ews_backend->priv->notify_online_id = g_signal_connect ( backend, "notify::online", G_CALLBACK (ews_backend_populate), NULL); - /* For now at least, we don't need to know the - * results, so no callback function is needed. */ - e_ews_backend_sync_folders (ews_backend, NULL, NULL, NULL); + /* do not do anything, if account is disabled */ + if (!e_source_get_enabled (source)) + return; ews_backend_add_gal_source (ews_backend); + + if (e_backend_get_online (E_BACKEND (backend))) + e_ews_backend_sync_folders (ews_backend, NULL, ews_backend_folders_synced_cb, NULL); + else + ews_backend_claim_old_resources (backend); } static gchar * diff --git a/src/configuration/e-ews-subscribe-foreign-folder.c b/src/configuration/e-ews-subscribe-foreign-folder.c index 2f6fba8..feeea71 100644 --- a/src/configuration/e-ews-subscribe-foreign-folder.c +++ b/src/configuration/e-ews-subscribe-foreign-folder.c @@ -124,8 +124,11 @@ add_foreign_folder_to_camel (CamelEwsStore *ews_store, CAMEL_FOLDER_SUBSCRIBED, e_ews_folder_get_total_count (folder), TRUE, FALSE); } else { const gchar *displayname; + gchar *escaped_name; - fullname = g_strdup_printf ("%s/%s/%s", EWS_FOREIGN_FOLDER_ROOT_DISPLAY_NAME, mailbox, display_foldername); + escaped_name = e_ews_folder_utils_escape_name (display_foldername); + fullname = g_strdup_printf ("%s/%s/%s", EWS_FOREIGN_FOLDER_ROOT_DISPLAY_NAME, mailbox, escaped_name); + g_free (escaped_name); /* make sure the path is unique */ camel_ews_store_ensure_unique_path (ews_store, &fullname); diff --git a/src/configuration/e-mail-config-ews-delegates-page.c b/src/configuration/e-mail-config-ews-delegates-page.c index ced835b..e837c25 100644 --- a/src/configuration/e-mail-config-ews-delegates-page.c +++ b/src/configuration/e-mail-config-ews-delegates-page.c @@ -1123,6 +1123,7 @@ mail_config_ews_delegates_page_constructed (GObject *object) "responding to meeting requests. If you want to grant folder " "permissions without giving send-on-behalf-of permissions, close this " "dialog box, right-click the folder, click Permissions and change the options there.")); + gtk_label_set_max_width_chars (GTK_LABEL (widget), 80); gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_grid_attach (grid, widget, 0, row, 2, 1); @@ -1170,6 +1171,7 @@ mail_config_ews_delegates_page_constructed (GObject *object) widget = gtk_label_new ( _("Deliver meeting requests addressed to me and responses to meeting " "requests where I am the organizer to:")); + gtk_label_set_max_width_chars (GTK_LABEL (widget), 80); gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_grid_attach (grid, widget, 0, row, 2, 1); diff --git a/src/configuration/e-mail-config-ews-ooo-page.c b/src/configuration/e-mail-config-ews-ooo-page.c index a4a84e4..e882654 100644 --- a/src/configuration/e-mail-config-ews-ooo-page.c +++ b/src/configuration/e-mail-config-ews-ooo-page.c @@ -448,6 +448,7 @@ mail_config_ews_ooo_page_constructed (GObject *object) text = _("The messages specified below will be automatically sent to " "each internal and external person who sends a mail to you."); widget = gtk_label_new (text); + gtk_label_set_max_width_chars (GTK_LABEL (widget), 80); gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c index 117f3bb..ad14f92 100644 --- a/src/server/e-ews-connection.c +++ b/src/server/e-ews-connection.c @@ -736,8 +736,8 @@ ews_cancel_request (GCancellable *cancellable, g_simple_async_result_set_error ( simple, - EWS_CONNECTION_ERROR, - EWS_CONNECTION_ERROR_CANCELLED, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, _("Operation Cancelled")); if (found) { ews_connection_schedule_cancel_message (cnc, SOUP_MESSAGE (msg)); @@ -9403,14 +9403,15 @@ e_ews_connection_disable_notifications_sync (EEwsConnection *cnc, e_ews_notification_stop_listening_sync (cnc->priv->notification); - g_clear_object (&cnc->priv->notification); - g_slist_free_full (cnc->priv->subscribed_folders, g_free); cnc->priv->subscribed_folders = NULL; g_hash_table_foreach (cnc->priv->subscriptions, ews_connection_build_subscribed_folders_list, cnc); - if (cnc->priv->subscribed_folders != NULL) + if (cnc->priv->subscribed_folders != NULL) { e_ews_notification_start_listening_sync (cnc->priv->notification, cnc->priv->subscribed_folders); + } else { + g_clear_object (&cnc->priv->notification); + } exit: NOTIFICATION_UNLOCK (cnc); diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c index b4960c4..3a7e42c 100644 --- a/src/server/e-ews-folder.c +++ b/src/server/e-ews-folder.c @@ -38,6 +38,7 @@ G_DEFINE_TYPE (EEwsFolder, e_ews_folder, G_TYPE_OBJECT) struct _EEwsFolderPrivate { GError *error; gchar *name; + gchar *escaped_name; EwsFolderId *fid; EwsFolderId *parent_fid; EEwsFolderType folder_type; @@ -75,6 +76,9 @@ e_ews_folder_finalize (GObject *object) priv->name = NULL; } + g_free (priv->escaped_name); + priv->escaped_name = NULL; + if (priv->fid) { g_free (priv->fid->id); g_free (priv->fid->change_key); @@ -184,8 +188,10 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder, } subparam = e_soap_parameter_get_first_child_by_name (node, "DisplayName"); - if (subparam) + if (subparam) { priv->name = e_soap_parameter_get_string_value (subparam); + priv->escaped_name = e_ews_folder_utils_escape_name (priv->name); + } subparam = e_soap_parameter_get_first_child_by_name (node, "UnreadCount"); if (subparam) @@ -381,7 +387,18 @@ e_ews_folder_set_name (EEwsFolder *folder, priv = folder->priv; g_free (priv->name); + g_free (priv->escaped_name); + priv->name = g_strdup (new_name); + priv->escaped_name = e_ews_folder_utils_escape_name (priv->name); +} + +const gchar * +e_ews_folder_get_escaped_name (const EEwsFolder *folder) +{ + g_return_val_if_fail (E_IS_EWS_FOLDER (folder), NULL); + + return folder->priv->escaped_name; } const EwsFolderId * @@ -486,6 +503,70 @@ e_ews_folder_set_foreign (EEwsFolder *folder, folder->priv->foreign = is_foreign; } +/* escapes backslashes with \5C and forward slashes with \2F */ +gchar * +e_ews_folder_utils_escape_name (const gchar *folder_name) +{ + gint ii, jj, count = 0; + gchar *res; + + if (!folder_name) + return NULL; + + for (ii = 0; folder_name[ii]; ii++) { + if (folder_name[ii] == '\\' || folder_name[ii] == '/') + count++; + } + + if (!count) + return g_strdup (folder_name); + + res = g_malloc0 (sizeof (gchar *) * (1 + ii + (2 * count))); + for (ii = 0, jj = 0; folder_name[ii]; ii++, jj++) { + if (folder_name[ii] == '\\') { + res[jj] = '\\'; + res[jj + 1] = '5'; + res[jj + 2] = 'C'; + jj += 2; + } else if (folder_name[ii] == '/') { + res[jj] = '\\'; + res[jj + 1] = '2'; + res[jj + 2] = 'F'; + jj += 2; + } else { + res[jj] = folder_name[ii]; + } + } + + res[jj] = '\0'; + + return res; +} + +/* reverses e_ews_folder_utils_escape_name() processing */ +gchar * +e_ews_folder_utils_unescape_name (const gchar *escaped_folder_name) +{ + gchar *res = g_strdup (escaped_folder_name); + gint ii, jj; + + if (!res) + return res; + + for (ii = 0, jj = 0; res[ii]; ii++, jj++) { + if (res[ii] == '\\' && g_ascii_isxdigit (res[ii + 1]) && g_ascii_isxdigit (res[ii + 2])) { + res[jj] = ((g_ascii_xdigit_value (res[ii + 1]) & 0xF) << 4) | (g_ascii_xdigit_value (res[ii + 2]) & 0xF); + ii += 2; + } else if (ii != jj) { + res[jj] = res[ii]; + } + } + + res[jj] = '\0'; + + return res; +} + gchar * e_ews_folder_utils_pick_color_spec (gint move_by, gboolean around_middle) diff --git a/src/server/e-ews-folder.h b/src/server/e-ews-folder.h index 8bf4b41..21e9a58 100644 --- a/src/server/e-ews-folder.h +++ b/src/server/e-ews-folder.h @@ -63,6 +63,7 @@ gboolean e_ews_folder_is_error (EEwsFolder *folder); const GError * e_ews_folder_get_error (const EEwsFolder *folder); const gchar * e_ews_folder_get_name (const EEwsFolder *folder); void e_ews_folder_set_name (EEwsFolder *folder, const gchar *new_name); +const gchar * e_ews_folder_get_escaped_name (const EEwsFolder *folder); void e_ews_folder_set_parent_id (EEwsFolder *folder, EwsFolderId *fid); const EwsFolderId * e_ews_folder_get_parent_id (const EEwsFolder *folder); @@ -87,6 +88,9 @@ gboolean e_ews_folder_id_is_equal (const EwsFolderId *a, const EwsFolderId *b, gboolean check_change_key); +gchar * e_ews_folder_utils_escape_name (const gchar *folder_name); +gchar * e_ews_folder_utils_unescape_name (const gchar *escaped_folder_name); + typedef enum { E_EWS_ESOURCE_FLAG_NONE = 0, E_EWS_ESOURCE_FLAG_INCLUDE_SUBFOLDERS = 1 << 0, diff --git a/src/server/e-ews-notification.c b/src/server/e-ews-notification.c index 1b5e37f..6e73ccf 100644 --- a/src/server/e-ews-notification.c +++ b/src/server/e-ews-notification.c @@ -202,6 +202,7 @@ ews_notification_dispose (GObject *object) g_signal_handlers_disconnect_by_func ( priv->soup_session, ews_notification_authenticate, object); + g_clear_object (&priv->soup_session); } if (priv->cancellable != NULL) @@ -318,6 +319,10 @@ e_ews_notification_subscribe_folder_sync (EEwsNotification *notification, g_return_val_if_fail (notification != NULL, FALSE); g_return_val_if_fail (notification->priv != NULL, FALSE); + /* Can happen during process shutdown */ + if (!notification->priv->connection) + return FALSE; + msg = e_ews_message_new_with_header ( e_ews_connection_get_uri (notification->priv->connection), e_ews_connection_get_impersonate_user (notification->priv->connection), @@ -435,6 +440,10 @@ e_ews_notification_unsubscribe_folder_sync (EEwsNotification *notification, g_return_val_if_fail (notification != NULL, FALSE); g_return_val_if_fail (notification->priv != NULL, FALSE); + /* Can happen during process shutdown */ + if (!notification->priv->connection) + return FALSE; + msg = e_ews_message_new_with_header ( e_ews_connection_get_uri (notification->priv->connection), e_ews_connection_get_impersonate_user (notification->priv->connection), @@ -616,7 +625,8 @@ ews_notification_fire_events_from_response (EEwsNotification *notification, } if (events != NULL) { - g_signal_emit_by_name (notification->priv->connection, "server-notification", events); + if (notification->priv->connection) + g_signal_emit_by_name (notification->priv->connection, "server-notification", events); g_slist_free_full (events, (GDestroyNotify) e_ews_notification_event_free); } } diff --git a/src/server/ews-errors.h b/src/server/ews-errors.h index 93a3331..fc48ead 100644 --- a/src/server/ews-errors.h +++ b/src/server/ews-errors.h @@ -299,7 +299,6 @@ enum { EWS_CONNECTION_ERROR_WIN32INTEROPERROR, /* Below this point are no longer direct translations of EWS errors */ EWS_CONNECTION_ERROR_NORESPONSE, - EWS_CONNECTION_ERROR_CANCELLED, EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED, EWS_CONNECTION_ERROR_UNKNOWN };
Index: debian/changelog =================================================================== --- debian/changelog (révision 2640) +++ debian/changelog (copie de travail) @@ -1,3 +1,12 @@ +evolution-ews (3.12.9~git20141130.278fe7-1) UNRELEASED; urgency=medium + + * New upstream git snapshot from stable branch, includes only bugfixes + and translations. + * Update evolution and e-d-s build-dependencies to 3.12.9~. + * Require libmspack and stop building with the embedded code copy. + + -- Josselin Mouette <j...@debian.org> Sun, 30 Nov 2014 10:53:34 +0100 + evolution-ews (3.12.7-1) unstable; urgency=medium * Make sure to not build with -Bsymbolic-functions in LDFLAGS - this causes Index: debian/rules =================================================================== --- debian/rules (révision 2640) +++ debian/rules (copie de travail) @@ -14,8 +14,7 @@ endif DEB_CONFIGURE_EXTRA_FLAGS += --with-krb5 \ - --enable-gtk-doc \ - --with-internal-lzx + --enable-gtk-doc binary-install/evolution-ews:: find debian/evolution-ews -name \*.la -delete Index: debian/control =================================================================== --- debian/control (révision 2640) +++ debian/control (copie de travail) @@ -19,18 +19,19 @@ cdbs (>= 0.4.37), gnome-pkg-tools, gtk-doc-tools (>= 1.9), - evolution-dev (>= 3.12.7), - evolution-data-server-dev (>= 3.12.7), - libcamel1.2-dev (>= 3.12.7), - libedataserver1.2-dev (>= 3.12.7), - libebackend1.2-dev (>= 3.12.7), - libecal1.2-dev (>= 3.12.7), - libedata-cal1.2-dev (>= 3.12.7), - libebook1.2-dev (>= 3.12.7), - libedata-book1.2-dev (>= 3.12.7), + evolution-dev (>= 3.12.9~), + evolution-data-server-dev (>= 3.12.9~), + libcamel1.2-dev (>= 3.12.9~), + libedataserver1.2-dev (>= 3.12.9~), + libebackend1.2-dev (>= 3.12.9~), + libecal1.2-dev (>= 3.12.9~), + libedata-cal1.2-dev (>= 3.12.9~), + libebook1.2-dev (>= 3.12.9~), + libedata-book1.2-dev (>= 3.12.9~), libglib2.0-dev (>= 2.32), libgtk-3-dev (>= 3.0), libical-dev, + libmspack-dev (>= 0.4), libkrb5-dev, libsoup2.4-dev (>= 2.42), intltool (>= 0.35.5),