Blob Blame History Raw
diff -up evolution-ews-3.22.6/src/collection/e-ews-backend.c.subsources-enabled-state evolution-ews-3.22.6/src/collection/e-ews-backend.c
--- evolution-ews-3.22.6/src/collection/e-ews-backend.c.subsources-enabled-state	2016-04-20 22:43:15.000000000 +0200
+++ evolution-ews-3.22.6/src/collection/e-ews-backend.c	2017-03-24 14:50:15.159481455 +0100
@@ -170,6 +170,38 @@ ews_backend_get_settings (EEwsBackend *b
 	return CAMEL_EWS_SETTINGS (settings);
 }
 
+static void
+ews_backend_update_enabled (ESource *data_source,
+			    ESource *collection_source)
+{
+	ESourceCollection *collection_extension = NULL;
+	gboolean part_enabled = TRUE;
+
+	g_return_if_fail (E_IS_SOURCE (data_source));
+
+	if (!collection_source || !e_source_get_enabled (collection_source)) {
+		e_source_set_enabled (data_source, FALSE);
+		return;
+	}
+
+	if (e_source_has_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION))
+		collection_extension = e_source_get_extension (collection_source, E_SOURCE_EXTENSION_COLLECTION);
+
+	if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_CALENDAR) ||
+	    e_source_has_extension (data_source, E_SOURCE_EXTENSION_TASK_LIST) ||
+	    e_source_has_extension (data_source, E_SOURCE_EXTENSION_MEMO_LIST)) {
+		part_enabled = !collection_extension || e_source_collection_get_calendar_enabled (collection_extension);
+	} else if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) {
+		part_enabled = !collection_extension || e_source_collection_get_contacts_enabled (collection_extension);
+	} else if (e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_ACCOUNT) ||
+		   e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_IDENTITY) ||
+		   e_source_has_extension (data_source, E_SOURCE_EXTENSION_MAIL_TRANSPORT)) {
+		part_enabled = !collection_extension || e_source_collection_get_mail_enabled (collection_extension);
+	}
+
+	e_source_set_enabled (data_source, part_enabled);
+}
+
 static ESource *
 ews_backend_new_child (EEwsBackend *backend,
                        EEwsFolder *folder)
@@ -188,7 +220,6 @@ ews_backend_new_child (EEwsBackend *back
 
 	display_name = e_ews_folder_get_name (folder);
 	e_source_set_display_name (source, display_name);
-	e_source_set_enabled (source, TRUE);
 
 	switch (e_ews_folder_get_folder_type (folder)) {
 		case E_EWS_FOLDER_TYPE_CALENDAR:
@@ -210,6 +241,7 @@ ews_backend_new_child (EEwsBackend *back
 	extension = e_source_get_extension (source, extension_name);
 	e_source_backend_set_backend_name (
 		E_SOURCE_BACKEND (extension), "ews");
+	ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
 
 	if (e_ews_folder_get_folder_type (folder) != E_EWS_FOLDER_TYPE_CONTACTS &&
 	    !e_source_has_extension (source, E_SOURCE_EXTENSION_EWS_FOLDER) &&
@@ -378,9 +410,22 @@ ews_backend_add_gal_source (EEwsBackend
 	const gchar *oal_id = NULL;
 	const gchar *uid;
 	gchar *oal_selected;
+	gboolean can_enable;
 
 	settings = ews_backend_get_settings (backend);
 	collection_backend = E_COLLECTION_BACKEND (backend);
+	source = e_backend_get_source (E_BACKEND (backend));
+	if (source) {
+		ESourceCollection *collection_extension = NULL;
+
+		if (e_source_has_extension (source, E_SOURCE_EXTENSION_COLLECTION))
+			collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION);
+
+		can_enable = !collection_extension || (e_source_get_enabled (source) &&
+			e_source_collection_get_contacts_enabled (collection_extension));
+	} else {
+		can_enable = FALSE;
+	}
 
 	gal_uid = camel_ews_settings_get_gal_uid (settings);
 
@@ -390,7 +435,7 @@ ews_backend_add_gal_source (EEwsBackend
 		g_object_unref (server);
 
 		if (source != NULL) {
-			e_source_set_enabled (source, TRUE);
+			e_source_set_enabled (source, can_enable);
 			g_object_unref (source);
 			return;
 		}
@@ -427,7 +472,7 @@ ews_backend_add_gal_source (EEwsBackend
 
 	source = e_collection_backend_new_child (
 		collection_backend, oal_id);
-	e_source_set_enabled (source, TRUE);
+	e_source_set_enabled (source, can_enable);
 
 	e_source_set_display_name (source, display_name);
 
@@ -507,7 +552,7 @@ add_remote_sources (EEwsBackend *backend
 				E_SERVER_SIDE_SOURCE (source), TRUE);
 			e_server_side_source_set_remote_deletable (
 				E_SERVER_SIDE_SOURCE (source), TRUE);
-			e_source_set_enabled (source, TRUE);
+			ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
 			e_source_registry_server_add_source (registry, source);
 		} else {
 			GError *error = NULL;
@@ -635,7 +680,7 @@ ews_backend_claim_old_resources (ECollec
 	for (iter = old_resources; iter; iter = g_list_next (iter)) {
 		ESource *source = iter->data;
 
-		e_source_set_enabled (source, TRUE);
+		ews_backend_update_enabled (source, e_backend_get_source (E_BACKEND (backend)));
 		e_source_registry_server_add_source (registry, source);
 	}