[evolution-kolab/ek-wip-porting: 14/14] KolabMailImapClient: fixed the Camel settings and service handling



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]