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 (&registry);
+}
+
+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),

Reply via email to