]> granicus.if.org Git - neomutt/commitdiff
imap: use Mailbox in imap_sync_message_for_copy()
authorMehdi Abaakouk <sileht@sileht.net>
Sat, 8 Dec 2018 19:50:46 +0000 (20:50 +0100)
committerRichard Russon <rich@flatcap.org>
Wed, 12 Dec 2018 12:52:22 +0000 (12:52 +0000)
imap/imap.c
imap/imap_private.h
imap/message.c

index d672ad159e7163ea318a8ed9f3cde26929a44461..0cb8e13a56e035eced22875f1fd103c089057aa5 100644 (file)
@@ -154,18 +154,18 @@ static char *get_flags(struct ListHead *hflags, char *s)
 
 /**
  * set_flag - append str to flags if we currently have permission according to aclbit
- * @param[in]  adata  Imap Account data
+ * @param[in]  m      Selected Imap Mailbox
  * @param[in]  aclbit Permissions, e.g. #MUTT_ACL_WRITE
  * @param[in]  flag   Does the email have the flag set?
  * @param[in]  str    Server flag name
  * @param[out] flags  Buffer for server command
  * @param[in]  flsize Length of buffer
  */
-static void set_flag(struct ImapAccountData *adata, int aclbit, int flag,
-                     const char *str, char *flags, size_t flsize)
+static void set_flag(struct Mailbox *m, int aclbit, int flag, const char *str,
+                     char *flags, size_t flsize)
 {
-  if (mutt_bit_isset(adata->mailbox->rights, aclbit))
-    if (flag && imap_has_flag(&imap_mdata_get(adata->mailbox)->flags, str))
+  if (mutt_bit_isset(m->rights, aclbit))
+    if (flag && imap_has_flag(&imap_mdata_get(m)->flags, str))
       mutt_str_strcat(flags, flsize, str);
 }
 
@@ -1070,7 +1070,7 @@ out:
 
 /**
  * imap_sync_message_for_copy - Update server to reflect the flags of a single message
- * @param[in]  adata        Imap Account data
+ * @param[in]  adata        Imap Mailbox
  * @param[in]  e            Email
  * @param[in]  cmd          Buffer for the command string
  * @param[out] err_continue Did the user force a continue?
@@ -1083,9 +1083,13 @@ out:
  * @note This does not sync the "deleted" flag state, because it is not
  *       desirable to propagate that flag into the copy.
  */
-int imap_sync_message_for_copy(struct ImapAccountData *adata, struct Email *e,
+int imap_sync_message_for_copy(struct Mailbox *m, struct Email *e,
                                struct Buffer *cmd, int *err_continue)
 {
+  struct ImapAccountData *adata = imap_adata_get(m);
+  if (!adata || adata->mailbox != m)
+    return -1;
+
   char flags[LONG_STRING];
   char *tags = NULL;
   char uid[11];
@@ -1104,14 +1108,14 @@ int imap_sync_message_for_copy(struct ImapAccountData *adata, struct Email *e,
 
   flags[0] = '\0';
 
-  set_flag(adata, MUTT_ACL_SEEN, e->read, "\\Seen ", flags, sizeof(flags));
-  set_flag(adata, MUTT_ACL_WRITE, e->old, "Old ", flags, sizeof(flags));
-  set_flag(adata, MUTT_ACL_WRITE, e->flagged, "\\Flagged ", flags, sizeof(flags));
-  set_flag(adata, MUTT_ACL_WRITE, e->replied, "\\Answered ", flags, sizeof(flags));
-  set_flag(adata, MUTT_ACL_DELETE, imap_edata_get(e)->deleted, "\\Deleted ",
-           flags, sizeof(flags));
+  set_flag(m, MUTT_ACL_SEEN, e->read, "\\Seen ", flags, sizeof(flags));
+  set_flag(m, MUTT_ACL_WRITE, e->old, "Old ", flags, sizeof(flags));
+  set_flag(m, MUTT_ACL_WRITE, e->flagged, "\\Flagged ", flags, sizeof(flags));
+  set_flag(m, MUTT_ACL_WRITE, e->replied, "\\Answered ", flags, sizeof(flags));
+  set_flag(m, MUTT_ACL_DELETE, imap_edata_get(e)->deleted, "\\Deleted ", flags,
+           sizeof(flags));
 
-  if (mutt_bit_isset(adata->mailbox->rights, MUTT_ACL_WRITE))
+  if (mutt_bit_isset(m->rights, MUTT_ACL_WRITE))
   {
     /* restore system flags */
     if (imap_edata_get(e)->flags_system)
@@ -1131,16 +1135,15 @@ int imap_sync_message_for_copy(struct ImapAccountData *adata, struct Email *e,
    * explicitly revoke all system flags (if we have permission) */
   if (!*flags)
   {
-    set_flag(adata, MUTT_ACL_SEEN, 1, "\\Seen ", flags, sizeof(flags));
-    set_flag(adata, MUTT_ACL_WRITE, 1, "Old ", flags, sizeof(flags));
-    set_flag(adata, MUTT_ACL_WRITE, 1, "\\Flagged ", flags, sizeof(flags));
-    set_flag(adata, MUTT_ACL_WRITE, 1, "\\Answered ", flags, sizeof(flags));
-    set_flag(adata, MUTT_ACL_DELETE, !imap_edata_get(e)->deleted, "\\Deleted ",
+    set_flag(m, MUTT_ACL_SEEN, 1, "\\Seen ", flags, sizeof(flags));
+    set_flag(m, MUTT_ACL_WRITE, 1, "Old ", flags, sizeof(flags));
+    set_flag(m, MUTT_ACL_WRITE, 1, "\\Flagged ", flags, sizeof(flags));
+    set_flag(m, MUTT_ACL_WRITE, 1, "\\Answered ", flags, sizeof(flags));
+    set_flag(m, MUTT_ACL_DELETE, !imap_edata_get(e)->deleted, "\\Deleted ",
              flags, sizeof(flags));
 
     /* erase custom flags */
-    if (mutt_bit_isset(adata->mailbox->rights, MUTT_ACL_WRITE) &&
-        imap_edata_get(e)->flags_remote)
+    if (mutt_bit_isset(m->rights, MUTT_ACL_WRITE) && imap_edata_get(e)->flags_remote)
       mutt_str_strcat(flags, sizeof(flags), imap_edata_get(e)->flags_remote);
 
     mutt_str_remove_trailing_ws(flags);
@@ -1552,7 +1555,7 @@ int imap_fast_trash(struct Mailbox *m, char *dest)
     if (m->hdrs[i]->active && m->hdrs[i]->changed && m->hdrs[i]->deleted &&
         !m->hdrs[i]->purge)
     {
-      rc = imap_sync_message_for_copy(adata, m->hdrs[i], sync_cmd, &err_continue);
+      rc = imap_sync_message_for_copy(m, m->hdrs[i], sync_cmd, &err_continue);
       if (rc < 0)
       {
         mutt_debug(1, "could not sync\n");
index 1e4231e644833b0322f526d89b288c3767ba622b..0e3c1fe47a827afb838e35f1fb70165285964a4b 100644 (file)
@@ -282,7 +282,7 @@ void imap_close_connection(struct ImapAccountData *adata);
 int imap_read_literal(FILE *fp, struct ImapAccountData *adata, unsigned long bytes, struct Progress *pbar);
 void imap_expunge_mailbox(struct Mailbox *m);
 int imap_login(struct ImapAccountData *adata);
-int imap_sync_message_for_copy(struct ImapAccountData *adata, struct Email *e, struct Buffer *cmd, int *err_continue);
+int imap_sync_message_for_copy(struct Mailbox *m, struct Email *e, struct Buffer *cmd, int *err_continue);
 bool imap_has_flag(struct ListHead *flag_list, const char *flag);
 int imap_adata_find(const char *path, struct ImapAccountData **adata, struct ImapMboxData **mdata);
 
index 6d7c68a69546d562273bc635738478331e17476c..767c674ecfc0cd31c13b27117f725adc34173d5f 100644 (file)
@@ -1606,7 +1606,7 @@ int imap_copy_messages(struct Context *ctx, struct Email *e, char *dest, bool de
 
         if (m->hdrs[i]->active && m->hdrs[i]->changed)
         {
-          rc = imap_sync_message_for_copy(adata, m->hdrs[i], &sync_cmd, &err_continue);
+          rc = imap_sync_message_for_copy(m, m->hdrs[i], &sync_cmd, &err_continue);
           if (rc < 0)
           {
             mutt_debug(1, "#1 could not sync\n");
@@ -1640,7 +1640,7 @@ int imap_copy_messages(struct Context *ctx, struct Email *e, char *dest, bool de
 
       if (e->active && e->changed)
       {
-        rc = imap_sync_message_for_copy(adata, e, &sync_cmd, &err_continue);
+        rc = imap_sync_message_for_copy(m, e, &sync_cmd, &err_continue);
         if (rc < 0)
         {
           mutt_debug(1, "#2 could not sync\n");