[evolution-mapi] Be able to create book/calendar/task/memo folders



commit 69b8988b102524989e3a418460e19dc883461b9b
Author: Milan Crha <mcrha redhat com>
Date:   Thu Aug 23 13:13:01 2012 +0200

    Be able to create book/calendar/task/memo folders

 src/collection/e-mapi-backend.c         |   99 +++++++++++++++++++++++++++---
 src/configuration/e-book-config-mapi.c  |    8 +++
 src/configuration/e-cal-config-mapi.c   |    8 +++
 src/configuration/e-mapi-config-utils.c |   39 ++++++++++++
 src/configuration/e-mapi-config-utils.h |    1 +
 5 files changed, 145 insertions(+), 10 deletions(-)
---
diff --git a/src/collection/e-mapi-backend.c b/src/collection/e-mapi-backend.c
index 87b900d..ea6970b 100644
--- a/src/collection/e-mapi-backend.c
+++ b/src/collection/e-mapi-backend.c
@@ -504,6 +504,72 @@ mapi_backend_child_removed (ECollectionBackend *backend,
 }
 
 static gboolean
+mapi_backend_create_resource_cb (EBackend *backend,
+				 CamelMapiSettings *settings,
+				 EMapiConnection *conn,
+				 gpointer user_data,
+				 GCancellable *cancellable,
+				 GError **error)
+{
+	ESourceBackend *backend_ext = NULL;
+	const gchar *folder_type_str = NULL;
+	ESource *source = user_data;
+	ESourceMapiFolder *folder_ext;
+	mapi_object_t obj_folder;
+	const gchar *foreign_username;
+	gboolean res = FALSE;
+	guint64 fid;
+
+	g_return_val_if_fail (e_source_has_extension (source, E_SOURCE_EXTENSION_MAPI_FOLDER), FALSE);
+
+	folder_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_MAPI_FOLDER);
+	foreign_username = e_source_mapi_folder_get_foreign_username (folder_ext);
+
+	fid = e_source_mapi_folder_get_id (folder_ext);
+	g_return_val_if_fail (fid == 0, FALSE);
+
+	if (e_source_has_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) {
+		backend_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK);
+		folder_type_str = IPF_CONTACT;
+	} else if (e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR)) {
+		backend_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR);
+		folder_type_str = IPF_APPOINTMENT;
+	} else if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) {
+		backend_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_TASK_LIST);
+		folder_type_str = IPF_TASK;
+	} else if (e_source_has_extension (source, E_SOURCE_EXTENSION_MEMO_LIST)) {
+		backend_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_MEMO_LIST);
+		folder_type_str = IPF_STICKYNOTE;
+	}
+
+	if (!backend_ext || g_strcmp0 (e_source_backend_get_backend_name (backend_ext), "mapi") != 0)
+		return FALSE;
+
+	fid = e_source_mapi_folder_get_parent_id (folder_ext);
+
+	if (foreign_username && *foreign_username)
+		res = e_mapi_connection_open_foreign_folder (conn, foreign_username, fid, &obj_folder, cancellable, error);
+	else if (e_source_mapi_folder_is_public (folder_ext))
+		res = e_mapi_connection_open_public_folder (conn, fid, &obj_folder, cancellable, error);
+	else
+		res = e_mapi_connection_open_personal_folder (conn, fid, &obj_folder, cancellable, error);
+
+	if (res) {
+		fid = 0;
+		if (!e_mapi_connection_create_folder (conn, &obj_folder, e_source_get_display_name (source), folder_type_str, &fid, cancellable, error))
+			fid = 0;
+		e_mapi_connection_close_folder (conn, &obj_folder, cancellable, error);
+
+		if (fid)
+			e_source_mapi_folder_set_id (folder_ext, fid);
+		else
+			res = FALSE;
+	}
+
+	return res;
+}
+
+static gboolean
 mapi_backend_create_resource_sync (ECollectionBackend *backend,
                                    ESource *source,
                                    GCancellable *cancellable,
@@ -511,6 +577,9 @@ mapi_backend_create_resource_sync (ECollectionBackend *backend,
 {
 	ESourceRegistryServer *server;
 	ESource *parent_source;
+	CamelMapiSettings *settings;
+	ESourceMapiFolder *folder_ext;
+	const gchar *foreign_username;
 	const gchar *cache_dir;
 	const gchar *parent_uid;
 
@@ -523,8 +592,17 @@ mapi_backend_create_resource_sync (ECollectionBackend *backend,
 		return FALSE;
 	}
 
-	/* UI part takes care of the remote folder creation, if needed,
-	   thus just accept the source here */
+	settings = mapi_backend_get_settings (E_MAPI_BACKEND (backend));
+	g_return_val_if_fail (settings != NULL, FALSE);
+
+	folder_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_MAPI_FOLDER);
+	foreign_username = e_source_mapi_folder_get_foreign_username (folder_ext);
+
+	if (!e_source_mapi_folder_is_public (folder_ext) &&
+	    !(foreign_username && *foreign_username) &&
+	    !e_mapi_backend_authenticator_run (
+		E_BACKEND (backend), settings, mapi_backend_create_resource_cb, source, cancellable, error))
+		return FALSE;
 
 	/* Configure the source as a collection member. */
 	parent_source = e_backend_get_source (E_BACKEND (backend));
@@ -607,14 +685,15 @@ mapi_backend_delete_resource_sync (ECollectionBackend *backend,
 	folder_ext = e_source_get_extension (source, E_SOURCE_EXTENSION_MAPI_FOLDER);
 	foreign_username = e_source_mapi_folder_get_foreign_username (folder_ext);
 
-	if (e_source_mapi_folder_is_public (folder_ext) ||
-	    (foreign_username && *foreign_username) ||
-	    e_mapi_backend_authenticator_run (
-		E_BACKEND (backend), settings, mapi_backend_delete_resource_cb, source, cancellable, error)) {
-		server = e_collection_backend_ref_server (backend);
-		e_source_registry_server_remove_source (server, source);
-		g_object_unref (server);
-	}
+	if (!e_source_mapi_folder_is_public (folder_ext) &&
+	    !(foreign_username && *foreign_username) &&
+	    !e_mapi_backend_authenticator_run (
+		E_BACKEND (backend), settings, mapi_backend_delete_resource_cb, source, cancellable, error))
+		return FALSE;
+
+	server = e_collection_backend_ref_server (backend);
+	e_source_registry_server_remove_source (server, source);
+	g_object_unref (server);
 
 	return TRUE;
 }
diff --git a/src/configuration/e-book-config-mapi.c b/src/configuration/e-book-config-mapi.c
index 48c954d..0ac35f1 100644
--- a/src/configuration/e-book-config-mapi.c
+++ b/src/configuration/e-book-config-mapi.c
@@ -40,6 +40,13 @@ book_config_mapi_insert_widgets (ESourceConfigBackend *backend,
 	e_mapi_config_utils_insert_widgets (backend, scratch_source);
 }
 
+static gboolean
+book_config_mapi_check_complete (ESourceConfigBackend *backend,
+				 ESource *scratch_source)
+{
+	return e_mapi_config_utils_check_complete (scratch_source);
+}
+
 static void
 e_book_config_mapi_class_init (EBookConfigMapiClass *class)
 {
@@ -53,6 +60,7 @@ e_book_config_mapi_class_init (EBookConfigMapiClass *class)
 	backend_class->backend_name = "mapi";
 	backend_class->allow_creation = book_config_mapi_allow_creation;
 	backend_class->insert_widgets = book_config_mapi_insert_widgets;
+	backend_class->check_complete = book_config_mapi_check_complete;
 }
 
 static void
diff --git a/src/configuration/e-cal-config-mapi.c b/src/configuration/e-cal-config-mapi.c
index b724c1f..f93cc81 100644
--- a/src/configuration/e-cal-config-mapi.c
+++ b/src/configuration/e-cal-config-mapi.c
@@ -40,6 +40,13 @@ cal_config_mapi_insert_widgets (ESourceConfigBackend *backend,
 	e_mapi_config_utils_insert_widgets (backend, scratch_source);
 }
 
+static gboolean
+cal_config_mapi_check_complete (ESourceConfigBackend *backend,
+				ESource *scratch_source)
+{
+	return e_mapi_config_utils_check_complete (scratch_source);
+}
+
 static void
 e_cal_config_mapi_class_init (ECalConfigMapiClass *class)
 {
@@ -53,6 +60,7 @@ e_cal_config_mapi_class_init (ECalConfigMapiClass *class)
 	backend_class->backend_name = "mapi";
 	backend_class->allow_creation = cal_config_mapi_allow_creation;
 	backend_class->insert_widgets = cal_config_mapi_insert_widgets;
+	backend_class->check_complete = cal_config_mapi_check_complete;
 }
 
 static void
diff --git a/src/configuration/e-mapi-config-utils.c b/src/configuration/e-mapi-config-utils.c
index 565825b..ed38e6c 100644
--- a/src/configuration/e-mapi-config-utils.c
+++ b/src/configuration/e-mapi-config-utils.c
@@ -1565,6 +1565,10 @@ tree_view_mapped_cb (GObject *tree_view)
 	g_return_if_fail (old_fsd != NULL);
 
 	parent_source = e_source_config_get_collection_source (old_fsd->config);
+	if (!parent_source)
+		parent_source = e_source_registry_find_extension (
+			old_fsd->registry, old_fsd->child_source, E_SOURCE_EXTENSION_COLLECTION);
+
 	g_return_if_fail (parent_source != NULL);
 
 	fsd = g_new0 (struct EMapiFolderStructureData, 1);
@@ -1728,3 +1732,38 @@ e_mapi_config_utils_insert_widgets (ESourceConfigBackend *backend,
 		e_source_config_insert_widget (config, scratch_source, NULL, GTK_WIDGET (content_grid));
 	}
 }
+
+gboolean
+e_mapi_config_utils_check_complete (ESource *scratch_source)
+{
+	ESourceBackend *backend_ext = NULL;
+	ESourceMapiFolder *folder_ext;
+
+	g_return_val_if_fail (scratch_source != NULL, FALSE);
+
+	if (e_source_has_extension (scratch_source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) {
+		backend_ext = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_ADDRESS_BOOK);
+	} else if (e_source_has_extension (scratch_source, E_SOURCE_EXTENSION_CALENDAR)) {
+		backend_ext = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_CALENDAR);
+	} else if (e_source_has_extension (scratch_source, E_SOURCE_EXTENSION_TASK_LIST)) {
+		backend_ext = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_TASK_LIST);
+	} else if (e_source_has_extension (scratch_source, E_SOURCE_EXTENSION_MEMO_LIST)) {
+		backend_ext = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_MEMO_LIST);
+	}
+
+	if (!backend_ext || g_strcmp0 (e_source_backend_get_backend_name (backend_ext), "mapi") != 0)
+		return TRUE;
+
+	folder_ext = e_source_get_extension (scratch_source, E_SOURCE_EXTENSION_MAPI_FOLDER);
+	if (!folder_ext)
+		return FALSE;
+
+	if (!e_source_mapi_folder_get_id (folder_ext) &&
+	    !e_mapi_config_utils_is_online ())
+		return FALSE;
+
+	/* does not have a parent-fid which is needed for folder creation on server */
+	return e_source_mapi_folder_get_parent_id (folder_ext) ||
+		e_source_mapi_folder_get_foreign_username (folder_ext) ||
+		e_source_mapi_folder_is_public (folder_ext);
+}
diff --git a/src/configuration/e-mapi-config-utils.h b/src/configuration/e-mapi-config-utils.h
index f119749..de479ba 100644
--- a/src/configuration/e-mapi-config-utils.h
+++ b/src/configuration/e-mapi-config-utils.h
@@ -70,5 +70,6 @@ GtkWindow *		e_mapi_config_utils_get_widget_toplevel_window		(GtkWidget *widget)
 
 void			e_mapi_config_utils_insert_widgets			(ESourceConfigBackend *backend,
 										 ESource *scratch_source);
+gboolean		e_mapi_config_utils_check_complete			(ESource *scratch_source);
 
 #endif /* E_MAPI_CONFIG_UTILS */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]