summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/imapdriver_tools.c
Side-by-side diff
Diffstat (limited to 'kmicromail/libetpan/generic/imapdriver_tools.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/imapdriver_tools.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/kmicromail/libetpan/generic/imapdriver_tools.c b/kmicromail/libetpan/generic/imapdriver_tools.c
index 3d737f3..de4008f 100644
--- a/kmicromail/libetpan/generic/imapdriver_tools.c
+++ b/kmicromail/libetpan/generic/imapdriver_tools.c
@@ -3014,335 +3014,359 @@ uid_list_to_env_list(clist * fetch_result,
MAILIMAP_FLAG_DELETED,
MAILIMAP_FLAG_SEEN,
MAILIMAP_FLAG_DRAFT,
MAILIMAP_FLAG_KEYWORD,
MAILIMAP_FLAG_EXTENSION
*/
static int imap_flags_to_flags(struct mailimap_msg_att_dynamic * att_dyn,
struct mail_flags ** result)
{
struct mail_flags * flags;
clist * flag_list;
clistiter * cur;
flags = mail_flags_new_empty();
if (flags == NULL)
goto err;
flags->fl_flags = 0;
flag_list = att_dyn->att_list;
if (flag_list != NULL) {
for(cur = clist_begin(flag_list) ; cur != NULL ;
cur = clist_next(cur)) {
struct mailimap_flag_fetch * flag_fetch;
flag_fetch = clist_content(cur);
if (flag_fetch->fl_type == MAILIMAP_FLAG_FETCH_RECENT)
flags->fl_flags |= MAIL_FLAG_NEW;
else {
char * keyword;
int r;
switch (flag_fetch->fl_flag->fl_type) {
case MAILIMAP_FLAG_ANSWERED:
flags->fl_flags |= MAIL_FLAG_ANSWERED;
break;
case MAILIMAP_FLAG_FLAGGED:
flags->fl_flags |= MAIL_FLAG_FLAGGED;
break;
case MAILIMAP_FLAG_DELETED:
flags->fl_flags |= MAIL_FLAG_DELETED;
break;
case MAILIMAP_FLAG_SEEN:
flags->fl_flags |= MAIL_FLAG_SEEN;
break;
case MAILIMAP_FLAG_DRAFT:
keyword = strdup("Draft");
if (keyword == NULL)
goto free;
r = clist_append(flags->fl_extension, keyword);
if (r < 0) {
free(keyword);
goto free;
}
break;
case MAILIMAP_FLAG_KEYWORD:
if (strcasecmp(flag_fetch->fl_flag->fl_data.fl_keyword,
"$Forwarded") == 0) {
flags->fl_flags |= MAIL_FLAG_FORWARDED;
}
else {
keyword = strdup(flag_fetch->fl_flag->fl_data.fl_keyword);
if (keyword == NULL)
goto free;
r = clist_append(flags->fl_extension, keyword);
if (r < 0) {
free(keyword);
goto free;
}
}
break;
case MAILIMAP_FLAG_EXTENSION:
/* do nothing */
break;
}
}
}
/*
MAIL_FLAG_NEW was set for \Recent messages.
Correct this flag for \Seen messages by unsetting it.
*/
if ((flags->fl_flags & MAIL_FLAG_SEEN) && (flags->fl_flags & MAIL_FLAG_NEW)) {
flags->fl_flags &= ~MAIL_FLAG_NEW;
}
}
* result = flags;
return MAIL_NO_ERROR;
free:
mail_flags_free(flags);
err:
return MAIL_ERROR_MEMORY;
}
-static int flags_to_imap_flags(struct mail_flags * flags,
- struct mailimap_store_att_flags ** result)
+int imap_flags_to_imap_flags(struct mail_flags * flags,
+ struct mailimap_flag_list ** result)
{
struct mailimap_flag * flag;
struct mailimap_flag_list * flag_list;
- struct mailimap_store_att_flags * att_flags;
int res;
clistiter * cur;
int r;
-
+
flag_list = mailimap_flag_list_new_empty();
if (flag_list == NULL) {
res = MAIL_ERROR_MEMORY;
goto err;
}
if ((flags->fl_flags & MAIL_FLAG_DELETED) != 0) {
flag = mailimap_flag_new_deleted();
if (flag == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
if ((flags->fl_flags & MAIL_FLAG_FLAGGED) != 0) {
flag = mailimap_flag_new_flagged();
if (flag == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
if ((flags->fl_flags & MAIL_FLAG_SEEN) != 0) {
flag = mailimap_flag_new_seen();
if (flag == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
if ((flags->fl_flags & MAIL_FLAG_ANSWERED) != 0) {
flag = mailimap_flag_new_answered();
if (flag == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
if ((flags->fl_flags & MAIL_FLAG_FORWARDED) != 0) {
char * flag_str;
flag_str = strdup("$Forwarded");
if (flag_str == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
flag = mailimap_flag_new_flag_keyword(flag_str);
if (flag == NULL) {
free(flag_str);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
for(cur = clist_begin(flags->fl_extension) ; cur != NULL ;
cur = clist_next(cur)) {
char * flag_str;
flag_str = clist_content(cur);
if (strcasecmp(flag_str, "Draft") == 0) {
flag = mailimap_flag_new_draft();
if (flag == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
else {
flag_str = strdup(flag_str);
if (flag_str == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
flag = mailimap_flag_new_flag_keyword(flag_str);
if (flag == NULL) {
free(flag_str);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
r = mailimap_flag_list_add(flag_list, flag);
if (r != MAILIMAP_NO_ERROR) {
mailimap_flag_free(flag);
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
}
}
+
+ * result = flag_list;
+
+ return MAIL_NO_ERROR;
+
+ free_flag_list:
+ mailimap_flag_list_free(flag_list);
+ err:
+ return res;
+}
+static int flags_to_imap_flags(struct mail_flags * flags,
+ struct mailimap_store_att_flags ** result)
+{
+ struct mailimap_flag_list * flag_list;
+ struct mailimap_store_att_flags * att_flags;
+ int res;
+ int r;
+
+ r = imap_flags_to_imap_flags(flags,
+ &flag_list);
+ if (r != MAIL_NO_ERROR) {
+ res = r;
+ goto err;
+ }
+
att_flags = mailimap_store_att_flags_new_set_flags_silent(flag_list);
if (att_flags == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_flag_list;
}
-
+
* result = att_flags;
-
+
return MAIL_NO_ERROR;
-
+
free_flag_list:
mailimap_flag_list_free(flag_list);
err:
return res;
}
static int
imap_fetch_result_to_flags(clist * fetch_result, uint32_t index,
struct mail_flags ** result)
{
clistiter * cur;
int r;
for(cur = clist_begin(fetch_result) ; cur != NULL ;
cur = clist_next(cur)) {
struct mailimap_msg_att * msg_att;
clistiter * item_cur;
uint32_t uid;
struct mailimap_msg_att_dynamic * att_dyn;
msg_att = clist_content(cur);
uid = 0;
att_dyn = NULL;
for(item_cur = clist_begin(msg_att->att_list) ; item_cur != NULL ;
item_cur = clist_next(item_cur)) {
struct mailimap_msg_att_item * item;
item = clist_content(item_cur);
if (item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
switch (item->att_data.att_static->att_type) {
case MAILIMAP_MSG_ATT_UID:
uid = item->att_data.att_static->att_data.att_uid;
break;
}
}
else if (item->att_type == MAILIMAP_MSG_ATT_ITEM_DYNAMIC) {
if (att_dyn == NULL) {
att_dyn = item->att_data.att_dyn;
}
}
}
if (uid != 0) {
if (uid == index) {
struct mail_flags * flags;
if (att_dyn != NULL) {
r = imap_flags_to_flags(att_dyn, &flags);
if (r == MAIL_NO_ERROR) {
* result = flags;
return MAIL_NO_ERROR;
}
}
}
}
}
return MAIL_ERROR_MSG_NOT_FOUND;
}
int imap_fetch_flags(mailimap * imap,
uint32_t index, struct mail_flags ** result)
{
struct mailimap_fetch_att * fetch_att;
struct mailimap_fetch_type * fetch_type;
struct mailimap_set * set;
int r;
int res;
clist * fetch_result;
struct mail_flags * flags;
fetch_type = mailimap_fetch_type_new_fetch_att_list_empty();
if (fetch_type == NULL) {
res = MAIL_ERROR_MEMORY;
goto err;
}
fetch_att = mailimap_fetch_att_new_uid();
if (fetch_att == NULL) {
res = MAIL_ERROR_MEMORY;
goto free_fetch_type;
}
r = mailimap_fetch_type_new_fetch_att_list_add(fetch_type, fetch_att);
if (r != MAILIMAP_NO_ERROR) {
mailimap_fetch_att_free(fetch_att);
res = MAIL_ERROR_MEMORY;
goto free_fetch_type;
}