added a 'domain' argument, and rearragned arguments to be prettier and
authorNot Zed <NotZed@Ximian.com>
Fri, 21 May 2004 09:08:09 +0000 (09:08 +0000)
committerMichael Zucci <zucchi@src.gnome.org>
Fri, 21 May 2004 09:08:09 +0000 (09:08 +0000)
2004-05-21  Not Zed  <NotZed@Ximian.com>

        * camel-session.c (camel_session_get_password): added a 'domain'
        argument, and rearragned arguments to be prettier and more
        consistent.  Fixed all callers.
        (camel_session_forget_password): added a domain argument.  Fixed
        all callers.

        ** See #58376.

        * camel-folder.c (set_message_flags): if system flags change, then
        don't trigger a folder changed event.

        * camel-folder-summary.h (CAMEL_MESSAGE_SYSTEM_MASK): added this
        to indicate which flags are internal/apps not interested in.

        * camel-folder.c (filter_free): rearrange and use some helpers.
        (folder_changed): if we're frozen, dont go firing off threads to
        do any processing on each change, wait until we're called
        unfrozen.  Slight code rearragnement.
        (filter_filter): add progress to junk learn/unlearn, and separate
        them.

14 files changed:
camel/ChangeLog
camel/camel-folder-summary.h
camel/camel-folder.c
camel/camel-gpg-context.c
camel/camel-sasl-popb4smtp.c
camel/camel-session.c
camel/camel-session.h
camel/camel-smime-context.c
camel/providers/imap/camel-imap-store.c
camel/providers/imap4/camel-imap4-store.c
camel/providers/imapp/camel-imapp-store.c
camel/providers/nntp/camel-nntp-store.c
camel/providers/pop3/camel-pop3-store.c
camel/providers/smtp/camel-smtp-transport.c

index 3e94889..f293138 100644 (file)
@@ -1,3 +1,26 @@
+2004-05-21  Not Zed  <NotZed@Ximian.com>
+
+       * camel-session.c (camel_session_get_password): added a 'domain'
+       argument, and rearragned arguments to be prettier and more
+       consistent.  Fixed all callers.
+       (camel_session_forget_password): added a domain argument.  Fixed
+       all callers.
+
+       ** See #58376.
+
+       * camel-folder.c (set_message_flags): if system flags change, then
+       don't trigger a folder changed event.
+
+       * camel-folder-summary.h (CAMEL_MESSAGE_SYSTEM_MASK): added this
+       to indicate which flags are internal/apps not interested in.
+
+       * camel-folder.c (filter_free): rearrange and use some helpers.
+       (folder_changed): if we're frozen, dont go firing off threads to
+       do any processing on each change, wait until we're called
+       unfrozen.  Slight code rearragnement.
+       (filter_filter): add progress to junk learn/unlearn, and separate
+       them.
+
 2004-05-19  Suresh Chandrasekharan  <suresh.chandrasekharan@sun.com>
 
        Fix for #58738 ja_JP.UTF-8: Evolution crashes when certain 
index cf0100b..bc9b9b6 100644 (file)
@@ -81,6 +81,8 @@ enum _CamelMessageFlags {
                                             to learn that message as junk/non junk */
        CAMEL_MESSAGE_USER = 1<<31 /* supports user flags */
 };
+/* Changes to system flags will NOT trigger a folder changed event */
+#define CAMEL_MESSAGE_SYSTEM_MASK (0xffff << 16)
 
 typedef struct _CamelFlag {
        struct _CamelFlag *next;
index feeaab6..cb9cd7d 100644 (file)
@@ -753,7 +753,7 @@ set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 s
 {
        CamelMessageInfo *info;
        CamelFolderChangeInfo *changes;
-       guint32 new;
+       guint32 old;
 
        g_return_val_if_fail(folder->summary != NULL, FALSE);
 
@@ -761,16 +761,19 @@ set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 s
        if (info == NULL)
                return FALSE;
 
-       new = (info->flags & ~flags) | (set & flags);
-       if (new == info->flags) {
-               camel_folder_summary_info_free(folder->summary, info);
-               return FALSE;
+       old = info->flags;
+       info->flags = (old & ~flags) | (set & flags);
+       if (old != info->flags) {
+               info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
+               camel_folder_summary_touch(folder->summary);
        }
-       
-       info->flags = new | CAMEL_MESSAGE_FOLDER_FLAGGED;
-       camel_folder_summary_touch(folder->summary);
+
        camel_folder_summary_info_free(folder->summary, info);
 
+       /* app or vfolders don't need to be notified of system flag changes */
+       if ((old & ~CAMEL_MESSAGE_SYSTEM_MASK) == (info->flags & ~CAMEL_MESSAGE_SYSTEM_MASK))
+               return FALSE;
+
        changes = camel_folder_change_info_new();
        camel_folder_change_info_change_uid(changes, uid);
        camel_object_trigger_event(folder, "folder_changed", changes);
@@ -1656,38 +1659,44 @@ filter_filter(CamelSession *session, CamelSessionThreadMsg *msg)
        CamelURL *uri;
        char *source_url;
        CamelException ex;
+       CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin;
 
-       if (m->junk || m->notjunk) {
-               CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin;
-
-               camel_operation_start (NULL, _("Learning junk and/or non junk message(s)"));
+       if (m->junk) {
+               camel_operation_start (NULL, _("Learning junk"));
 
-               if (m->junk) {
-                       for (i = 0; i < m->junk->len; i ++) {
-                               CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->junk->pdata[i], NULL);
+               for (i = 0; i < m->junk->len; i ++) {
+                       CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->junk->pdata[i], NULL);
+                       int pc = 100 * i / m->junk->len;
+                       
+                       camel_operation_progress(NULL, pc);
 
-                               if (msg) {
-                                       camel_junk_plugin_report_junk (csp, msg);
-                                       camel_object_unref (msg);
-                               }
+                       if (msg) {
+                               camel_junk_plugin_report_junk (csp, msg);
+                               camel_object_unref (msg);
                        }
                }
-               if (m->notjunk) {
-                       for (i = 0; i < m->notjunk->len; i ++) {
-                               CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->notjunk->pdata[i], NULL);
+               camel_operation_end (NULL);
+       }
 
-                               if (msg) {
-                                       camel_junk_plugin_report_notjunk (csp, msg);
-                                       camel_object_unref (msg);
-                               }
-                       }
-               }
+       if (m->notjunk) {
+               camel_operation_start (NULL, _("Learning non-junk"));
+               for (i = 0; i < m->notjunk->len; i ++) {
+                       CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->notjunk->pdata[i], NULL);
+                       int pc = 100 * i / m->notjunk->len;
 
-               camel_junk_plugin_commit_reports (csp);
+                       camel_operation_progress(NULL, pc);
 
+                       if (msg) {
+                               camel_junk_plugin_report_notjunk (csp, msg);
+                               camel_object_unref (msg);
+                       }
+               }
                camel_operation_end (NULL);
        }
 
+       if (m->junk || m->notjunk)
+               camel_junk_plugin_commit_reports (csp);
+
        if (m->driver && m->recents) {
                camel_operation_start(NULL, _("Filtering new message(s)"));
 
@@ -1736,27 +1745,18 @@ static void
 filter_free(CamelSession *session, CamelSessionThreadMsg *msg)
 {
        struct _folder_filter_msg *m = (struct _folder_filter_msg *)msg;
-       int i;
 
-       camel_folder_thaw(m->folder);
-       camel_object_unref((CamelObject *)m->folder);
        if (m->driver)
-               camel_object_unref((CamelObject *)m->driver);
-       if (m->recents) {
-               for (i=0;i<m->recents->len;i++)
-                       g_free(m->recents->pdata[i]);
-               g_ptr_array_free(m->recents, TRUE);
-       }
-       if (m->junk) {
-               for (i=0;i<m->junk->len;i++)
-                       g_free(m->junk->pdata[i]);
-               g_ptr_array_free(m->junk, TRUE);
-       }
-       if (m->notjunk) {
-               for (i=0;i<m->notjunk->len;i++)
-                       g_free(m->notjunk->pdata[i]);
-               g_ptr_array_free(m->notjunk, TRUE);
-       }
+               camel_object_unref(m->driver);
+       if (m->recents)
+               camel_folder_free_deep(m->folder, m->recents);
+       if (m->junk)
+               camel_folder_free_deep(m->folder, m->junk);
+       if (m->notjunk)
+               camel_folder_free_deep(m->folder, m->notjunk);
+
+       camel_folder_thaw(m->folder);
+       camel_object_unref(m->folder);
 }
 
 static CamelSessionThreadOps filter_ops = {
@@ -1768,28 +1768,36 @@ static CamelSessionThreadOps filter_ops = {
 static gboolean
 folder_changed (CamelObject *obj, gpointer event_data)
 {
-       CamelFolder *folder = CAMEL_FOLDER (obj);
+       CamelFolder *folder = (CamelFolder *)obj;
        CamelFolderChangeInfo *changed = event_data;
        CamelSession *session = ((CamelService *)folder->parent_store)->session;
        CamelFilterDriver *driver = NULL;
        GPtrArray *junk = NULL;
        GPtrArray *notjunk = NULL;
        GPtrArray *recents = NULL;
-       gboolean ret = TRUE;
+       int i;
 
-       (printf ("folder_changed(%p, %p), frozen=%d\n", obj, event_data, folder->priv->frozen));
-       (printf(" added %d remoded %d changed %d recent %d\n",
+       d(printf ("folder_changed(%p:'%s', %p), frozen=%d\n", obj, folder->full_name, event_data, folder->priv->frozen));
+       d(printf(" added %d removed %d changed %d recent %d\n",
                 changed->uid_added->len, changed->uid_removed->len,
                 changed->uid_changed->len, changed->uid_recent->len));
 
        if (changed == NULL) {
                w(g_warning ("Class %s is passing NULL to folder_changed event",
                             camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))));
-               return ret;
+               return TRUE;
+       }
+
+       CAMEL_FOLDER_LOCK(folder, change_lock);
+       if (folder->priv->frozen) {
+               camel_folder_change_info_cat(folder->priv->changed_frozen, changed);
+               CAMEL_FOLDER_UNLOCK(folder, change_lock);
+
+               return FALSE;
        }
+       CAMEL_FOLDER_UNLOCK(folder, change_lock);
 
        if (changed->uid_changed->len) {
-               int i;
                guint32 flags;
 
                for (i = 0; i < changed->uid_changed->len; i ++) {
@@ -1808,9 +1816,6 @@ folder_changed (CamelObject *obj, gpointer event_data)
                                camel_folder_set_message_flags (folder, changed->uid_changed->pdata [i], CAMEL_MESSAGE_JUNK_LEARN, 0);
                        }
                }
-               ((junk || notjunk)
-                && printf("** Have '%d' messages for junk filter to learn, launching thread to process them\n",
-                          (junk ? junk->len : 0) + (notjunk ? notjunk->len : 0)));
        }
 
        if ((folder->folder_flags & (CAMEL_FOLDER_FILTER_RECENT|CAMEL_FOLDER_FILTER_JUNK))
@@ -1819,46 +1824,31 @@ folder_changed (CamelObject *obj, gpointer event_data)
                                                         (folder->folder_flags & CAMEL_FOLDER_FILTER_RECENT) 
                                                         ? FILTER_SOURCE_INCOMING : FILTER_SOURCE_JUNKTEST, NULL);
                
-       CAMEL_FOLDER_LOCK(folder, change_lock);
-
        if (driver) {
-               int i;
                recents = g_ptr_array_new();
-                       
                for (i=0;i<changed->uid_recent->len;i++)
                        g_ptr_array_add(recents, g_strdup(changed->uid_recent->pdata[i]));
-
-               (printf("** Have '%d' recent messages, launching thread to process them\n", changed->uid_recent->len));
        }
 
        if (driver || junk || notjunk) {
                struct _folder_filter_msg *msg;
 
-               folder->priv->frozen++;
+               d(printf("* launching filter thread %d new mail, %d junk and %d not junk\n",
+                        recents?recents->len:0, junk?junk->len:0, notjunk?notjunk->len:0));
+
                msg = camel_session_thread_msg_new(session, &filter_ops, sizeof(*msg));
                msg->recents = recents;
                msg->junk = junk;
                msg->notjunk = notjunk;
                msg->folder = folder;
-               camel_object_ref((CamelObject *)folder);
+               camel_object_ref(folder);
+               camel_folder_freeze(folder);
                msg->driver = driver;
                camel_exception_init(&msg->ex);
                camel_session_thread_queue(session, &msg->msg, 0);
-                       
-               /* zero out the recent list so we dont reprocess */
-               /* this pokes past abstraction, but changeinfo is our structure anyway */
-               /* the only other alternative is to recognise when trigger is called from       
-                  thaw(), but thats a pita */
-               g_ptr_array_set_size(changed->uid_recent, 0);
        }
-               
-       if (folder->priv->frozen) {
-               camel_folder_change_info_cat(folder->priv->changed_frozen, changed);
-               ret = FALSE;
-       }
-       CAMEL_FOLDER_UNLOCK(folder, change_lock);
 
-       return ret;
+       return TRUE;
 }
 
 /**
index 5e3632c..b69feb9 100644 (file)
@@ -772,7 +772,7 @@ gpg_ctx_parse_status (struct _GpgCtx *gpg, CamelException *ex)
                prompt = g_strdup_printf (_("You need a passphrase to unlock the key for\n"
                                            "user: \"%s\""), name);
                
-               if ((passwd = camel_session_get_password (gpg->session, prompt, CAMEL_SESSION_PASSWORD_SECRET, NULL, gpg->need_id, ex)) && !gpg->utf8) {
+               if ((passwd = camel_session_get_password (gpg->session, NULL, NULL, prompt,  gpg->need_id, CAMEL_SESSION_PASSWORD_SECRET, ex)) && !gpg->utf8) {
                        char *opasswd = passwd;
                        
                        if ((passwd = g_locale_to_utf8 (passwd, -1, &nread, &nwritten, NULL))) {
@@ -800,7 +800,7 @@ gpg_ctx_parse_status (struct _GpgCtx *gpg, CamelException *ex)
        } else if (!strncmp (status, "BAD_PASSPHRASE", 14)) {
                gpg->bad_passwds++;
                
-               camel_session_forget_password (gpg->session, NULL, gpg->need_id, ex);
+               camel_session_forget_password (gpg->session, NULL, NULL, gpg->need_id, ex);
                
                if (gpg->bad_passwds == 3) {
                        camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE,
index 338a235..fb940b0 100644 (file)
@@ -100,7 +100,7 @@ popb4smtp_challenge (CamelSasl *sasl, GByteArray *token, CamelException *ex)
 
        sasl->authenticated = FALSE;
 
-       popuri = camel_session_get_password (session, _("POP Source URI"), 0, sasl->service, "popb4smtp_uri", ex);
+       popuri = camel_session_get_password (session, sasl->service, NULL, _("POP Source URI"), "popb4smtp_uri", 0, ex);
 
        if (popuri == NULL) {
                camel_exception_setv(ex, 1, _("POP Before SMTP auth using an unknown transport"));
index 59d6be6..5a1b879 100644 (file)
@@ -317,12 +317,13 @@ camel_session_get_storage_path (CamelSession *session, CamelService *service,
 /**
  * camel_session_get_password:
  * @session: session object
+ * @service: the service this query is being made by
+ * @domain: domain of password request.  May be null to use the default.
  * @prompt: prompt to provide to user
+ * @item: an identifier, unique within this service, for the information
  * @flags: CAMEL_SESSION_PASSWORD_REPROMPT, the prompt should force a reprompt
  * CAMEL_SESSION_PASSWORD_SECRET, whether the password is secret
  * CAMEL_SESSION_PASSWORD_STATIC, the password is remembered externally
- * @service: the service this query is being made by
- * @item: an identifier, unique within this service, for the information
  * @ex: a CamelException
  *
  * This function is used by a CamelService to ask the application and
@@ -347,16 +348,16 @@ camel_session_get_storage_path (CamelSession *session, CamelService *service,
  * Return value: the authentication information or %NULL.
  **/
 char *
-camel_session_get_password (CamelSession *session, const char *prompt,
+camel_session_get_password (CamelSession *session, CamelService *service,
+                           const char *domain, const char *prompt, const char *item,
                            guint32 flags,
-                           CamelService *service, const char *item,
                            CamelException *ex)
 {
        g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL);
        g_return_val_if_fail (prompt != NULL, NULL);
        g_return_val_if_fail (item != NULL, NULL);
        
-       return CS_CLASS (session)->get_password (session, prompt, flags, service, item, ex);
+       return CS_CLASS (session)->get_password (session, service, domain, prompt, item, flags, ex);
 }
 
 
@@ -378,12 +379,12 @@ camel_session_get_password (CamelSession *session, const char *prompt,
  **/
 void
 camel_session_forget_password (CamelSession *session, CamelService *service,
-                              const char *item, CamelException *ex)
+                              const char *domain, const char *item, CamelException *ex)
 {
        g_return_if_fail (CAMEL_IS_SESSION (session));
        g_return_if_fail (item != NULL);
 
-       CS_CLASS (session)->forget_password (session, service, item, ex);
+       CS_CLASS (session)->forget_password (session, service, domain, item, ex);
 }
 
 
index d57603d..de4c15f 100644 (file)
@@ -85,13 +85,15 @@ typedef struct {
                                              CamelException *ex);
 
        char *          (*get_password)      (CamelSession *session,
-                                             const char *prompt,
-                                             guint32 flags,
                                              CamelService *service,
+                                             const char *domain,
+                                             const char *prompt,
                                              const char *item,
+                                             guint32 flags,
                                              CamelException *ex);
        void            (*forget_password)   (CamelSession *session,
                                              CamelService *service,
+                                             const char *domain,
                                              const char *item,
                                              CamelException *ex);
        gboolean        (*alert_user)        (CamelSession *session,
@@ -140,13 +142,15 @@ char *             camel_session_get_storage_path   (CamelSession *session,
                                                     CamelException *ex);
 
 char *             camel_session_get_password       (CamelSession *session,
-                                                    const char *prompt,
-                                                    guint32 flags,
                                                     CamelService *service,
+                                                    const char *domain,
+                                                    const char *prompt,
                                                     const char *item,
+                                                    guint32 flags,
                                                     CamelException *ex);
 void               camel_session_forget_password    (CamelSession *session,
                                                     CamelService *service,
+                                                    const char *domain,
                                                     const char *item,
                                                     CamelException *ex);
 gboolean           camel_session_alert_user         (CamelSession *session,
index f087ccd..0c3f5de 100644 (file)
@@ -97,13 +97,13 @@ sm_get_passwd(PK11SlotInfo *info, PRBool retry, void *arg)
 
        /* we got a password, but its asking again, the password we had was wrong */
        if (context->priv->password_tries > 0) {
-               camel_session_forget_password(((CamelCipherContext *)context)->session, NULL, PK11_GetTokenName(info), NULL);
+               camel_session_forget_password(((CamelCipherContext *)context)->session, NULL, NULL, PK11_GetTokenName(info), NULL);
                context->priv->password_tries = 0;
        }
 
        prompt = g_strdup_printf(_("Enter security pass-phrase for `%s'"), PK11_GetTokenName(info));
-       pass = camel_session_get_password(((CamelCipherContext *)context)->session, prompt,
-                                         CAMEL_SESSION_PASSWORD_SECRET|CAMEL_SESSION_PASSWORD_STATIC, NULL, PK11_GetTokenName(info), ex);
+       pass = camel_session_get_password(((CamelCipherContext *)context)->session, NULL, NULL, prompt,
+                                         PK11_GetTokenName(info), CAMEL_SESSION_PASSWORD_SECRET|CAMEL_SESSION_PASSWORD_STATIC, ex);
        camel_exception_free(ex);
        g_free(prompt);
        if (pass) {
index b669398..9c70245 100644 (file)
@@ -1264,7 +1264,7 @@ imap_auth_loop (CamelService *service, CamelException *ex)
        while (!authenticated) {
                if (errbuf) {
                        /* We need to un-cache the password before prompting again */
-                       camel_session_forget_password (session, service, "password", ex);
+                       camel_session_forget_password (session, service, NULL, "password", ex);
                        g_free (service->url->passwd);
                        service->url->passwd = NULL;
                }
@@ -1278,8 +1278,8 @@ imap_auth_loop (CamelService *service, CamelException *ex)
                                                  service->url->user,
                                                  service->url->host);
                        service->url->passwd =
-                               camel_session_get_password (session, prompt, CAMEL_SESSION_PASSWORD_SECRET,
-                                                           service, "password", ex);
+                               camel_session_get_password (session, service, NULL,
+                                                           prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, ex);
                        g_free (prompt);
                        g_free (errbuf);
                        errbuf = NULL;
index 75d4583..85ae324 100644 (file)
@@ -420,7 +420,7 @@ imap4_try_authenticate (CamelService *service, gboolean reprompt, const char *er
                                          service->url->user,
                                          service->url->host);
                
-               service->url->passwd = camel_session_get_password (session, prompt, flags, service, "password", ex);
+               service->url->passwd = camel_session_get_password (session, service, NULL, prompt, "password", flags, ex);
                
                g_free (prompt);
                
index 2332a09..6ae79ca 100644 (file)
@@ -346,8 +346,8 @@ store_get_pass(CamelIMAPPStore *store)
                                          ((CamelService *)store)->url->user,
                                          ((CamelService *)store)->url->host);
                ((CamelService *)store)->url->passwd = camel_session_get_password(camel_service_get_session((CamelService *)store),
-                                                                                 prompt, CAMEL_SESSION_PASSWORD_SECRET,
-                                                                                 (CamelService*)store, "password", &ex);
+                                                                                 (CamelService *)store, NULL,
+                                                                                 prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, &ex);
                g_free (prompt);
                if (camel_exception_is_set(&ex))
                        camel_exception_throw_ex(&ex);
@@ -418,7 +418,7 @@ imap_connect (CamelService *service, CamelException *ex)
                                switch (e->id) {
                                case CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE:
                                        store->login_error = g_strdup_printf("%s\n\n", e->desc);
-                                       camel_session_forget_password(service->session, service, "password", ex);
+                                       camel_session_forget_password(service->session, service, NULL, "password", ex);
                                        camel_url_set_passwd(service->url, NULL);
                                        break;
                                default:
index 3b04f95..d43fc13 100644 (file)
@@ -1001,8 +1001,8 @@ camel_nntp_try_authenticate (CamelNNTPStore *store)
                camel_exception_init (&ex);
                
                service->url->passwd =
-                       camel_session_get_password (session, prompt, CAMEL_SESSION_PASSWORD_SECRET,
-                                                   service, "password", &ex);
+                       camel_session_get_password (session, service, NULL,
+                                                   prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, &ex);
                camel_exception_clear (&ex);
                g_free (prompt);
                
index 5f4defa..685bf49 100644 (file)
@@ -481,8 +481,8 @@ pop3_try_authenticate (CamelService *service, gboolean reprompt, const char *err
                                          errmsg ? errmsg : "",
                                          service->url->user,
                                          service->url->host);
-               service->url->passwd = camel_session_get_password (camel_service_get_session (service),
-                                                                  prompt, flags, service, "password", ex);
+               service->url->passwd = camel_session_get_password (camel_service_get_session (service), service, NULL,
+                                                                  prompt, "password", flags, ex);
                g_free (prompt);
                if (!service->url->passwd)
                        return FALSE;
index 7c1cb97..18583e6 100644 (file)
@@ -503,7 +503,7 @@ smtp_connect (CamelService *service, CamelException *ex)
                while (!authenticated) {
                        if (errbuf) {
                                /* We need to un-cache the password before prompting again */
-                               camel_session_forget_password (session, service, "password", NULL);
+                               camel_session_forget_password (session, service, NULL, "password", NULL);
                                g_free (service->url->passwd);
                                service->url->passwd = NULL;
                        }
@@ -515,8 +515,8 @@ smtp_connect (CamelService *service, CamelException *ex)
                                                          errbuf ? errbuf : "", service->url->user,
                                                          service->url->host);
                                
-                               service->url->passwd = camel_session_get_password (session, prompt, CAMEL_SESSION_PASSWORD_SECRET,
-                                                                                  service, "password", ex);
+                               service->url->passwd = camel_session_get_password (session, service, NULL,
+                                                                                  prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, ex);
                                
                                g_free (prompt);
                                g_free (errbuf);