--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: Pre-approval for evolution-ews/3.12.9~git20141130.278fe7-1
- From: Josselin Mouette <joss@debian.org>
- Date: Sun, 30 Nov 2014 12:06:11 +0100
- Message-id: <20141130110611.GA3419@malsain.org>
Package: release.debian.org
Severity: normal
User: release.debian.org@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 <joss@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),
--- End Message ---