Hi! This patch fixes (and simplifies) the get_authentication_support() methods in tny-camel-account.c. I don't know if it is completely correct but it works at least for IMAP accounts. POP3 accounts don't have priv->service set and I don't know about a work-around for them, yet. I removed lots of extra threading code because I think it's overkill and that one extra thread for this method is really enough. Regards, Johannes
Index: libtinymail-camel/camel-lite/camel/camel-service.c
===================================================================
--- libtinymail-camel/camel-lite/camel/camel-service.c (revision 2068)
+++ libtinymail-camel/camel-lite/camel/camel-service.c (working copy)
@@ -639,6 +639,7 @@
camel_service_query_auth_types (CamelService *service, CamelException *ex)
{
GList *ret;
+ g_return_val_if_fail(service != NULL, NULL);
/* note that we get the connect lock here, which means the callee
must not call the connect functions itself */
Index: libtinymail-camel/camel-lite/ChangeLog
===================================================================
--- libtinymail-camel/camel-lite/ChangeLog (revision 2072)
+++ libtinymail-camel/camel-lite/ChangeLog (working copy)
@@ -1,3 +1,10 @@
+2007-06-03 Johannes Schmid <johannes schmid openismus com>
+
+ * camel/camel-service.c: (camel_service_query_auth_types):
+
+ Added a g_return_if_fail to avoid crashes with buggy code if
+ no service is set for the account.
+
Note: Please use this ChangeLog file only for merge changes (from upstream to
this version, and the other way around)
Index: libtinymail-camel/tny-camel-account.c
===================================================================
--- libtinymail-camel/tny-camel-account.c (revision 2068)
+++ libtinymail-camel/tny-camel-account.c (working copy)
@@ -370,7 +370,6 @@
return;
}
-
static gboolean
tny_camel_account_is_connected (TnyAccount *self)
{
@@ -1144,73 +1143,6 @@
TnySessionCamel *session;
} GetSupportedAuthInfo;
-
-static void
-tny_camel_account_get_supported_secure_authentication_async_status (struct _CamelOperation *op, const char *what, int sofar, int oftotal, void *thr_user_data)
-{
- printf ("DEBUG: %s\n", __FUNCTION__);
-
- /* Use the generic tny_progress* idle callback system
- * to call our status callback,
- * using the IdleStopper to stop the status callback
- * from being called after the main callback: */
- GetSupportedAuthInfo *info = thr_user_data;
- TnyProgressInfo *progress_info = tny_progress_info_new (
- G_OBJECT (info->self),
- info->status_callback,
- TNY_GET_SUPPORTED_SECURE_AUTH_STATUS,
- TNY_GET_SUPPORTED_SECURE_AUTH_STATUS_GET_SECURE_AUTH,
- what, sofar,
- oftotal, info->stopper, info->user_data);
-
- g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
- tny_progress_info_idle_func, progress_info,
- tny_progress_info_destroy);
-}
-
-/** This is the GDestroyNotify callback provided to g_idle_add_full()
- * for tny_camel_account_get_supported_secure_authentication_async_callback().
- */
-static void
-tny_camel_account_get_supported_secure_authentication_async_destroyer (gpointer thr_user_data)
-{
- printf ("DEBUG: %s)\n", __FUNCTION__);
-
- GetSupportedAuthInfo *info = thr_user_data;
- TnyCamelAccount *self = info->self;
-
- /* thread reference */
- g_object_unref (G_OBJECT (self));
- if (info->err) {
- g_error_free (info->err);
- info->err = NULL;
- }
-
- _tny_session_stop_operation (info->session);
-
- tny_idle_stopper_destroy (info->stopper);
- info->stopper = NULL;
-
- g_slice_free (GetSupportedAuthInfo, thr_user_data);
-}
-
-static gboolean
-tny_camel_account_get_supported_secure_authentication_async_callback (gpointer thr_user_data)
-{
- GetSupportedAuthInfo *info = thr_user_data;
-
- if (info->callback)
- info->callback (info->self, info->cancelled, info->result, &info->err, info->user_data);
-
- /* Prevent status callbacks from being called after this
- * (can happen because the 2 idle callbacks have different priorities)
- * by causing tny_idle_stopper_is_stopped() to return TRUE. */
- tny_idle_stopper_stop (info->stopper);
-
- return FALSE;
-}
-
-
/* Starts the operation in the thread: */
static gpointer
tny_camel_account_get_supported_secure_authentication_async_thread (
@@ -1223,23 +1155,29 @@
TnyCamelAccountPriv *priv = TNY_CAMEL_ACCOUNT_GET_PRIVATE (self);
CamelException ex = CAMEL_EXCEPTION_INITIALISER;
GError *err = NULL;
-
+ TnyStatus* status;
+
g_static_rec_mutex_lock (priv->service_lock);
- info->cancelled = FALSE;
-
- /* Make sure that the status callback is called (in an idle handler)
- * while this thread is running: */
- _tny_camel_account_start_camel_operation (TNY_CAMEL_ACCOUNT (self),
- tny_camel_account_get_supported_secure_authentication_async_status, info,
- "Querying supported secure authentication methods from server.");
-
+ status = tny_status_new_literal(TNY_GET_SUPPORTED_SECURE_AUTH_STATUS,
+ TNY_GET_SUPPORTED_SECURE_AUTH_STATUS_GET_SECURE_AUTH, 0, 1,
+ "Get secure authentication methods");
+
+ info->status_callback(G_OBJECT(self),
+ status,
+ info->user_data);
+
/* Do the actual work:
* This is happening in a thread,
* and the status callback is being called regularly while this is
* happening. */
GList *authtypes = camel_service_query_auth_types (priv->service, &ex);
-
+
+ tny_status_set_fraction(status, 1);
+ info->status_callback(G_OBJECT(self),
+ status,
+ info->user_data);
+
/* The result will be a TnyList of TnyPairs: */
TnyList *result = tny_simple_list_new ();
GList *iter = authtypes;
@@ -1252,7 +1190,7 @@
printf ("DEBUG: %s: authproto =%s, name=%s\n", __FUNCTION__, item->authproto, item->name);
/* We don't use the value part of the TnyPair. */
- TnyPair *pair = tny_pair_new (item->authproto, NULL);
+ TnyPair *pair = tny_pair_new (item->name, NULL);
tny_list_append (result, G_OBJECT (pair));
g_object_unref (pair);
}
@@ -1266,10 +1204,6 @@
/* The work has finished, so clean up and provide the result via the
* main callback: */
info->result = result;
-
- info->cancelled = camel_operation_cancel_check (priv->cancel);
-
- _tny_camel_account_stop_camel_operation (TNY_CAMEL_ACCOUNT (self));
/* Create the GError if necessary,
* from the CamelException: */
@@ -1288,13 +1222,12 @@
/* Call the callback, with the result, in an idle thread,
* and stop this thread: */
if (info->callback) {
- g_idle_add_full (G_PRIORITY_HIGH,
- tny_camel_account_get_supported_secure_authentication_async_callback,
- info, tny_camel_account_get_supported_secure_authentication_async_destroyer);
+ info->callback (info->self, info->cancelled, info->result, &info->err, info->user_data);
} else {
/* Thread reference */
g_object_unref (G_OBJECT (self));
}
+ tny_status_free(status);
g_thread_exit (NULL);
return NULL;
Index: ChangeLog
===================================================================
--- ChangeLog (revision 2072)
+++ ChangeLog (working copy)
@@ -1,3 +1,12 @@
+2007-06-03 Johannes Schmid <johannes schmid openismus com>
+
+ * libtinymail-camel/tny-camel-account.c:
+ (tny_camel_account_get_supported_secure_authentication_async_thread
+ ):
+
+ Fixed implementation to get the secure authentication support
+ methods and simplied them a lot.
+
2007-06-03 Philip Van Hoof <pvanhoof gnome org>
* Support for removing messages from a POP server after retrieval
Attachment:
signature.asc
Description: OpenPGP digital signature