#ifdef HAVE_LIBETPAN
#include "imap-thread.h"
-
+#include <imap.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <gtk/gtk.h>
#include "etpan-thread-manager.h"
+#include "utils.h"
+
+#define DISABLE_LOG_DURING_LOGIN
static struct etpan_thread_manager * thread_manager = NULL;
+static chash * courier_workaround_hash = NULL;
static chash * imap_hash = NULL;
static chash * session_hash = NULL;
static guint thread_manager_signal = 0;
mailstream_network_delay.tv_sec = ETPAN_DEFAULT_NETWORK_TIMEOUT;
mailstream_network_delay.tv_usec = 0;
-
-#if 0
- mailstream_debug = 1;
-#endif
+
+ if (debug_get_mode())
+ mailstream_debug = 1;
+
imap_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE);
session_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE);
+ courier_workaround_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE);
thread_manager = etpan_thread_manager_new();
etpan_thread_manager_free(thread_manager);
+ chash_free(courier_workaround_hash);
chash_free(session_hash);
chash_free(imap_hash);
}
struct etpan_thread * thread;
int finished;
+ imap_folder_ref(folder);
+
op = etpan_thread_op_new();
op->param = param;
op->result = result;
}
etpan_thread_op_free(op);
+
+ imap_folder_unref(folder);
}
value.len = 0;
chash_delete(session_hash, &key, NULL);
+ key.data = &imap;
+ key.len = sizeof(imap);
+ chash_delete(courier_workaround_hash, &key, NULL);
+
mailimap_free(imap);
debug_print("disconnect ok\n");
struct login_param * param;
struct login_result * result;
int r;
+#ifdef DISABLE_LOG_DURING_LOGIN
+ int old_debug;
+#endif
param = op->param;
+
+#ifdef DISABLE_LOG_DURING_LOGIN
+ old_debug = mailstream_debug;
+#endif
+
r = mailimap_login(param->imap,
param->login, param->password);
+#ifdef DISABLE_LOG_DURING_LOGIN
+ mailstream_debug = old_debug;
+#endif
+
result = op->result;
result->error = r;
debug_print("imap login run - end %i\n", r);
param = op->param;
+ fetch_result = NULL;
r = imap_get_messages_list(param->imap, param->first_index,
&fetch_result);
return MAIL_NO_ERROR;
}
+int imap_add_header_fetch_att(struct mailimap_fetch_type * fetch_type)
+{
+ struct mailimap_fetch_att * fetch_att;
+ struct mailimap_section * section;
+
+ section = mailimap_section_new_header();
+ fetch_att = mailimap_fetch_att_new_body_peek_section(section);
+ mailimap_fetch_type_new_fetch_att_list_add(fetch_type, fetch_att);
+
+ return MAIL_NO_ERROR;
+}
+
static int
imap_get_envelopes_list(mailimap * imap, struct mailimap_set * set,
carray ** p_env_list)
clist * fetch_result;
int r;
carray * env_list;
+ chashdatum key;
+ chashdatum value;
fetch_type = mailimap_fetch_type_new_fetch_att_list_empty();
r = mailimap_fetch_type_new_fetch_att_list_add(fetch_type, fetch_att);
/* headers */
- r = imap_add_envelope_fetch_att(fetch_type);
+ key.data = &imap;
+ key.len = sizeof(imap);
+ r = chash_get(courier_workaround_hash, &key, &value);
+ if (r < 0)
+ r = imap_add_envelope_fetch_att(fetch_type);
+ else
+ r = imap_add_header_fetch_att(fetch_type);
r = mailimap_uid_fetch(imap, set, fetch_type, &fetch_result);
param = op->param;
+ env_list = NULL;
r = imap_get_envelopes_list(param->imap, param->set,
&env_list);
threaded_run(folder, ¶m, &result, fetch_env_run);
+ if (result.error != MAILIMAP_NO_ERROR) {
+ chashdatum key;
+ chashdatum value;
+ int r;
+
+ key.data = &imap;
+ key.len = sizeof(imap);
+ r = chash_get(courier_workaround_hash, &key, &value);
+ if (r < 0) {
+ value.data = NULL;
+ value.len = 0;
+ chash_set(courier_workaround_hash, &key, &value, NULL);
+
+ threaded_run(folder, ¶m, &result, fetch_env_run);
+ }
+ }
+
if (result.error != MAILIMAP_NO_ERROR)
return result.error;