[evolution-mapi] Be able to create book/calendar/task/memo folders
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-mapi] Be able to create book/calendar/task/memo folders
- Date: Thu, 23 Aug 2012 11:13:53 +0000 (UTC)
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]