[evolution-kolab/ek-wip-porting: 14/14] KolabMailImapClient: fixed the Camel settings and service handling
- From: Christian Hilberg <chilberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-kolab/ek-wip-porting: 14/14] KolabMailImapClient: fixed the Camel settings and service handling
- Date: Tue, 13 Mar 2012 17:09:24 +0000 (UTC)
commit 92e1d4a1995d229aacce984f514b6b101eaa9d6b
Author: Christian Hilberg <hilberg kernelconcepts de>
Date: Tue Mar 13 18:01:42 2012 +0100
KolabMailImapClient: fixed the Camel settings and service handling
* reworked the settings management so it works again
with CamelSettings and the updated CamelSession
* CamelKolabSession and CamelKolabIMAPXStore are now
back to life
src/libekolab/kolab-mail-imap-client.c | 277 ++++++++++++++------------------
1 files changed, 117 insertions(+), 160 deletions(-)
---
diff --git a/src/libekolab/kolab-mail-imap-client.c b/src/libekolab/kolab-mail-imap-client.c
index 7ff45bb..c8f4424 100644
--- a/src/libekolab/kolab-mail-imap-client.c
+++ b/src/libekolab/kolab-mail-imap-client.c
@@ -48,17 +48,6 @@
/*----------------------------------------------------------------------------*/
-#define KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER "X-Evolution-MimeMessage-IMAP-UID"
-#define KOLAB_MAIL_IMAP_CLIENT_DUMMY_FROM_NAME "Nobody"
-#define KOLAB_MAIL_IMAP_CLIENT_DUMMY_FROM_ADDR "nobody localhost localdomain"
-
-#define KOLAB_MAIL_IMAP_CLIENT_CAMELURL_PARAM_SSL "use_ssl"
-#define KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_NONE "never"
-#define KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_SSL "always"
-#define KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_STARTTLS "when-possible"
-
-/*----------------------------------------------------------------------------*/
-
/* TODO
*
* setup
@@ -455,7 +444,7 @@ kolab_mail_imap_client_camel_get_msg_imap_uid (KolabMailImapClient *self,
/* set a custom header on the message carrying the messages' IMAP UID */
camel_medium_set_header (CAMEL_MEDIUM (message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER,
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER,
imap_uid);
return message;
}
@@ -650,7 +639,9 @@ kolab_mail_imap_client_configure (KolabMailImapClient *self,
GError **err)
{
KolabMailImapClientPrivate *priv = NULL;
- const gchar *tmp_str = NULL;
+ /* const gchar *tmp_str = NULL; */
+ const gchar *data_dir = NULL;
+ const gchar *cache_dir = NULL;
GError *tmp_err = NULL;
g_assert (KOLAB_IS_MAIL_IMAP_CLIENT (self));
@@ -689,28 +680,29 @@ kolab_mail_imap_client_configure (KolabMailImapClient *self,
return FALSE;
}
- /* create session object */
- priv->session = g_object_new (CAMEL_TYPE_KOLAB_SESSION, NULL /* FIXME set CamelSession properties */);
-
/* set up session object directories (create if not existing) */
-
- tmp_str = kolab_settings_handler_get_char_field (priv->ksettings,
- KOLAB_SETTINGS_HANDLER_CHAR_FIELD_CAMEL_DATA_DIR,
- &tmp_err);
- if (tmp_str == NULL) {
+ data_dir = \
+ kolab_settings_handler_get_char_field (priv->ksettings,
+ KOLAB_SETTINGS_HANDLER_CHAR_FIELD_CAMEL_DATA_DIR,
+ &tmp_err);
+ if (data_dir == NULL) {
g_propagate_error (err, tmp_err);
return FALSE;
}
- camel_kolab_session_set_data_dir (priv->session, g_strdup(tmp_str));
-
- tmp_str = kolab_settings_handler_get_char_field (priv->ksettings,
- KOLAB_SETTINGS_HANDLER_CHAR_FIELD_CAMEL_CONFIG_DIR,
- &tmp_err);
- if (tmp_str == NULL) {
+ cache_dir = \
+ kolab_settings_handler_get_char_field (priv->ksettings,
+ KOLAB_SETTINGS_HANDLER_CHAR_FIELD_CAMEL_CACHE_DIR,
+ &tmp_err);
+ if (cache_dir == NULL) {
g_propagate_error (err, tmp_err);
return FALSE;
}
- camel_kolab_session_set_config_dir (priv->session, tmp_str);
+
+ /* create session object */
+ priv->session = g_object_new (CAMEL_TYPE_KOLAB_SESSION,
+ CAMEL_KOLAB_SESSION_PROP_DATA_DIR, data_dir,
+ CAMEL_KOLAB_SESSION_PROP_CACHE_DIR, cache_dir,
+ NULL);
/* set to offline state first */
camel_session_set_online (CAMEL_SESSION (priv->session), FALSE);
@@ -718,6 +710,56 @@ kolab_mail_imap_client_configure (KolabMailImapClient *self,
return TRUE;
}
+static gboolean
+kolab_mail_imap_client_configure_store_settings (KolabMailImapClient *self,
+ GError **err)
+{
+ KolabMailImapClientPrivate *priv = NULL;
+ CamelService *service = NULL;
+ CamelSettings *camel_settings = NULL;
+ CamelURL *camel_url = NULL;
+ GError *tmp_err = NULL;
+
+ /* TODO rework this function for new CamelSettings API
+ *
+ * Set the details for the settings object directly
+ * instead of using the camel_settings_load_from_url()
+ * function, which is a transient one only and
+ * scheduled for removal
+ */
+
+ g_assert (KOLAB_IS_MAIL_IMAP_CLIENT (self));
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ priv = KOLAB_MAIL_IMAP_CLIENT_PRIVATE (self);
+
+ /* FIXME this is a transient thing, we should set
+ * the CamelSettings values directly from
+ * KolabSettingsHandler
+ */
+ camel_url = \
+ kolab_util_backend_camel_url_new_from_settings (priv->ksettings,
+ &tmp_err);
+ if (camel_url == NULL) {
+ g_propagate_error (err, tmp_err);
+ return FALSE;
+ }
+
+ /* create new settings object for service */
+ service = CAMEL_SERVICE (priv->store);
+ camel_service_set_settings (service, NULL);
+ camel_settings = camel_service_get_settings (service);
+
+ camel_settings_load_from_url (camel_settings, camel_url);
+
+ /* re-set the settings for our service (store) */
+ camel_service_set_settings (service, camel_settings);
+
+ camel_url_free (camel_url);
+
+ return TRUE;
+}
+
gboolean
kolab_mail_imap_client_bringup (KolabMailImapClient *self,
GCancellable *cancellable,
@@ -725,27 +767,11 @@ kolab_mail_imap_client_bringup (KolabMailImapClient *self,
{
KolabMailImapClientPrivate *priv = NULL;
CamelService *service = NULL;
- gchar *service_uid = NULL;
- /* const gchar *tmp_str = NULL; */
- /* KolabTLSVariantID tlsvariant = KOLAB_TLS_VARIANT_NONE; */
- /* const gchar *variant_str = NULL; */
gchar *dbpath = NULL;
- gboolean ok = FALSE;
+ gchar *account_uid = NULL;
+ gchar *extd_account_uid = NULL;
GError *tmp_err = NULL;
-
- /* TODO rework this function for new CamelSession API
- *
- * CamelServices are now identified by an
- * UID string, not by their CamelURL.
- *
- * We need to set our CamelKolabIMAPXStore
- * on the CamelSession with a call to
- * camel_session_add_service() before retrieving
- * it here. Need to find a suitable place to do
- * that. Also need to get the UID string from
- * somewhere.
- *
- */
+ gboolean ok = FALSE;
g_assert (KOLAB_IS_MAIL_IMAP_CLIENT (self));
/* cancellable may be NULL */
@@ -753,11 +779,11 @@ kolab_mail_imap_client_bringup (KolabMailImapClient *self,
priv = KOLAB_MAIL_IMAP_CLIENT_PRIVATE (self);
- g_assert (priv->is_online == FALSE);
-
if (priv->is_up == TRUE)
return TRUE;
+ g_assert (priv->is_online == FALSE);
+
/* bring up session object */
ok = camel_kolab_session_bringup (priv->session,
cancellable,
@@ -766,110 +792,59 @@ kolab_mail_imap_client_bringup (KolabMailImapClient *self,
g_propagate_error (err, tmp_err);
return FALSE;
}
-#if 0
- /* create url string for session getter */
- camel_url = camel_url_new (KOLAB_CAMELURL_DUMMY_URL, NULL);
- camel_url_set_protocol (camel_url, KOLAB_CAMEL_PROVIDER_PROTOCOL);
- tmp_str = kolab_settings_handler_get_char_field (priv->ksettings,
- KOLAB_SETTINGS_HANDLER_CHAR_FIELD_KOLAB_SERVER_NAME,
- &tmp_err);
- if (tmp_err != NULL) {
- camel_url_free (camel_url);
- g_propagate_error (err, tmp_err);
- return FALSE;
- }
- if (tmp_str == NULL) {
- camel_url_free (camel_url);
- g_set_error (err,
- KOLAB_BACKEND_ERROR,
- KOLAB_BACKEND_ERROR_INTERNAL,
- _("Internal inconsistency detected: Kolab server name not set"));
- return FALSE;
- }
- camel_url_set_host (camel_url, tmp_str);
- tmp_str = kolab_settings_handler_get_char_field (priv->ksettings,
- KOLAB_SETTINGS_HANDLER_CHAR_FIELD_KOLAB_USER_NAME,
- &tmp_err);
- if (tmp_err != NULL) {
- camel_url_free (camel_url);
+ /* create the service uid for the storage path */
+ account_uid = \
+ kolab_util_backend_account_uid_new_from_settings (priv->ksettings,
+ &tmp_err);
+ if (account_uid == NULL) {
g_propagate_error (err, tmp_err);
return FALSE;
}
- if (tmp_str == NULL) {
- camel_url_free (camel_url);
- g_set_error (err,
- KOLAB_BACKEND_ERROR,
- KOLAB_BACKEND_ERROR_INTERNAL,
- _("Internal inconsistency detected: Kolab User ID not set"));
- __func__);
- return FALSE;
-
- }
- camel_url_set_user (camel_url, tmp_str);
- tlsvariant = kolab_settings_handler_get_uint_field (priv->ksettings,
- KOLAB_SETTINGS_HANDLER_UINT_FIELD_TLS_VARIANT,
- &tmp_err);
+ extd_account_uid = g_strconcat (KOLAB_CAMEL_PROVIDER_PROTOCOL,
+ "__",
+ account_uid,
+ NULL);
+ g_free (account_uid);
+
+ /* register Kolab service (store) with CamelSession */
+ service = camel_session_add_service (CAMEL_SESSION (priv->session),
+ extd_account_uid,
+ KOLAB_CAMEL_PROVIDER_PROTOCOL,
+ CAMEL_PROVIDER_STORE,
+ &tmp_err);
+ g_free (extd_account_uid);
if (tmp_err != NULL) {
- camel_url_free (camel_url);
+ if (service != NULL) {
+ /* should not happen */
+ g_warning ("%s: while adding service, error was set, but non-NULL service returned!", __func__);
+ g_object_unref (service);
+ }
g_propagate_error (err, tmp_err);
return FALSE;
}
- switch (tlsvariant) {
- case KOLAB_TLS_VARIANT_SSL:
- variant_str = KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_SSL;
- break;
- case KOLAB_TLS_VARIANT_STARTTLS:
- variant_str = KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_STARTTLS;
- break;
- default:
- variant_str = KOLAB_MAIL_IMAP_CLIENT_TLSVARIANT_NONE;
- }
-
- camel_url_set_param (camel_url,
- KOLAB_MAIL_IMAP_CLIENT_CAMELURL_PARAM_SSL,
- variant_str);
-
- /* camel_url_string = camel_url_to_string (camel_url, CAMEL_URL_HIDE_ALL); */
- camel_url_string = camel_url_to_string (camel_url, 0);
- g_debug ("%s: CamelURL: (%s)", __func__, camel_url_string);
-#endif
- /* bring up imapx object */
- service = camel_session_get_service (CAMEL_SESSION (priv->session),
- service_uid);
-#if 0
- g_free (camel_url_string);
- camel_url_free (camel_url);
- if (tmp_err != NULL) {
- g_debug ("%s: exception set", __func__);
- g_propagate_error (err, tmp_err);
- if (service != NULL)
- g_object_unref (service);
- return FALSE;
- }
- if (service == NULL) {
- g_debug ("%s: NULL service", __func__);
- g_set_error (err,
- KOLAB_BACKEND_ERROR,
- KOLAB_BACKEND_ERROR_CAMEL,
- _("Could not get a Camel service for protocol '%s'"),
- KOLAB_CAMEL_PROVIDER_PROTOCOL);
- return FALSE;
- }
-#endif
priv->store = CAMEL_KOLAB_IMAPX_STORE (service);
ok = camel_kolab_imapx_store_set_folder_context (priv->store,
priv->context);
if (! ok) {
+ /* FIXME mark this as a translatable string */
g_set_error (err,
KOLAB_BACKEND_ERROR,
KOLAB_BACKEND_ERROR_CAMEL,
- _("Could not set PIM folder context %i for this backend"),
+ "Could not set PIM folder context %i for this backend",
priv->context);
return FALSE;
}
+ /* configure the service with settings from KolabSettingsHandler */
+ ok = kolab_mail_imap_client_configure_store_settings (self,
+ &tmp_err);
+ if (! ok) {
+ g_propagate_error (err, tmp_err);
+ return FALSE;
+ }
+
/* set offline state */
ok = camel_offline_store_set_online_sync (CAMEL_OFFLINE_STORE (priv->store),
FALSE, /* offline */
@@ -902,6 +877,7 @@ kolab_mail_imap_client_bringup (KolabMailImapClient *self,
}
priv->is_up = TRUE;
+
return TRUE;
}
@@ -1054,25 +1030,6 @@ kolab_mail_imap_client_go_offline (KolabMailImapClient *self,
return FALSE;
}
- /* TODO check with shaky / broken connection to the server
- *
- * The logout message is sent as a sync one. This may
- * get stuck and we'll wait indefinitely here.
- * Sending LOGOUT should be async and
- * camel_service_disconnect() called with clean=FALSE
- * to avoid lockups here if the server won't answer
- * properly
- */
-
- /* issue LOGOUT message so we can get a BYE from server */
- ok = camel_kolab_imapx_store_logout_sync (priv->store,
- cancellable,
- &tmp_err);
- if (! ok) {
- g_propagate_error (err, tmp_err);
- return FALSE;
- }
-
ok = camel_service_disconnect_sync (CAMEL_SERVICE (priv->store),
TRUE, /* try to disconnect cleanly */
&tmp_err);
@@ -1578,8 +1535,8 @@ kolab_mail_imap_client_store (KolabMailImapClient *self,
headerinfo = g_new0 (KolabMailMimeBuilderHeaderInfo, 1);
headerinfo->kolab_uid = g_strdup (kolab_uid);
- headerinfo->from_name = g_strdup (KOLAB_MAIL_IMAP_CLIENT_DUMMY_FROM_NAME);
- headerinfo->from_addr = g_strdup (KOLAB_MAIL_IMAP_CLIENT_DUMMY_FROM_ADDR);
+ headerinfo->from_name = g_strdup (KOLAB_IMAP_CLIENT_DUMMY_FROM_NAME);
+ headerinfo->from_addr = g_strdup (KOLAB_IMAP_CLIENT_DUMMY_FROM_ADDR);
ok = kolab_mail_mime_builder_camel_set_header (priv->mimebuilder,
new_message,
headerinfo,
@@ -1641,7 +1598,7 @@ kolab_mail_imap_client_store (KolabMailImapClient *self,
}
stored_imap_uid = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (stored_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER));
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER));
if (stored_imap_uid == NULL) {
g_set_error (&tmp_err,
KOLAB_BACKEND_ERROR,
@@ -1652,20 +1609,20 @@ kolab_mail_imap_client_store (KolabMailImapClient *self,
}
camel_medium_set_header (CAMEL_MEDIUM (stored_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER,
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER,
NULL);
/* mark old, existing message as deleted */
if (orig_message != NULL) {
const gchar *local_imap_uid = NULL;
local_imap_uid = camel_medium_get_header (CAMEL_MEDIUM (orig_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER);
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER);
g_debug ("%s: Kolab UID (%s) Folder (%s) IMAP UID (%s) marking for deletion",
__func__, kolab_uid, foldername, local_imap_uid);
if (local_imap_uid != NULL) {
camel_folder_delete_message (folder, local_imap_uid);
camel_medium_set_header (CAMEL_MEDIUM (orig_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER,
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER,
NULL);
} else {
g_warning ("%s: Kolab UID (%s) Folder (%s) IMAP UID not set on camel message",
@@ -2025,9 +1982,9 @@ kolab_mail_imap_client_delete (KolabMailImapClient *self,
/* mark existing message as deleted */
g_free (imap_uid);
imap_uid = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (camel_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER));
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER));
camel_medium_set_header (CAMEL_MEDIUM (camel_message),
- KOLAB_MAIL_IMAP_CLIENT_X_EVO_UID_HEADER,
+ KOLAB_IMAP_CLIENT_X_EVO_UID_HEADER,
NULL);
g_object_unref (camel_message);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]