]> granicus.if.org Git - mutt/commitdiff
Add helpers to add and remove actx entries. (see #3728)
authorKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:20 +0000 (18:18 -0700)
committerKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:20 +0000 (18:18 -0700)
Use the helper in compose update_idx(), to consolidate the resize
logic and simplify the code.

Separate out the actx "free" routine from a routine to empty out the
idx.  The index regeneration routines should flush and rebuild the
index without having to renerate the actx structure.

attach.c
attach.h
compose.c
recvattach.c

index 7a512419310789a54307f5947f69659d6cbdb525..9b4b649ed290046cf660ba6bf35b11ab01253374 100644 (file)
--- a/attach.c
+++ b/attach.c
@@ -1042,15 +1042,26 @@ int mutt_print_attachment (FILE *fp, BODY *a)
   }
 }
 
-void mutt_free_attach_context (ATTACH_CONTEXT **pactx)
+void mutt_actx_add_attach (ATTACH_CONTEXT *actx, ATTACHPTR *attach, MUTTMENU *menu)
 {
   int i;
-  ATTACH_CONTEXT *actx;
 
-  if (!pactx || !*pactx)
-    return;
+  if (actx->idxlen == actx->idxmax)
+  {
+    actx->idxmax += 5;
+    safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * actx->idxmax);
+    for (i = actx->idxlen; i < actx->idxmax; i++)
+      actx->idx[i] = NULL;
+    if (menu)
+      menu->data = actx->idx;
+  }
 
-  actx = *pactx;
+  actx->idx[actx->idxlen++] = attach;
+}
+
+void mutt_actx_free_entries (ATTACH_CONTEXT *actx)
+{
+  int i;
 
   for (i = 0; i < actx->idxlen; i++)
   {
@@ -1059,7 +1070,19 @@ void mutt_free_attach_context (ATTACH_CONTEXT **pactx)
     FREE (&actx->idx[i]->tree);
     FREE (&actx->idx[i]);
   }
-  FREE (&actx->idx);
 
+  actx->idxlen = 0;
+}
+
+void mutt_free_attach_context (ATTACH_CONTEXT **pactx)
+{
+  ATTACH_CONTEXT *actx;
+
+  if (!pactx || !*pactx)
+    return;
+
+  actx = *pactx;
+  mutt_actx_free_entries (actx);
+  FREE (&actx->idx);
   FREE (pactx);  /* __FREE_CHECKED__ */
 }
index e5b3a82d41ae162063d79b88cf50bf9e1e46816f..41d780872c7f06f2db459f65f0165464729b7875 100644 (file)
--- a/attach.h
+++ b/attach.h
@@ -59,6 +59,8 @@ void mutt_attach_resend (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *);
 void mutt_attach_forward (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *);
 void mutt_attach_reply (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *, int);
 
+void mutt_actx_add_attach (ATTACH_CONTEXT *actx, ATTACHPTR *attach, MUTTMENU *menu);
+void mutt_actx_free_entries (ATTACH_CONTEXT *actx);
 void mutt_free_attach_context (ATTACH_CONTEXT **pactx);
 
 #endif /* _ATTACH_H_ */
index 183976e09872877d4cd1eeeed171c943f8b7cf76..4da1e5ffc626e327dd8703fe7e70e6de43431729 100644 (file)
--- a/compose.c
+++ b/compose.c
@@ -450,13 +450,14 @@ static int delete_attachment (MUTTMENU *menu, short *idxlen, int x)
   return (0);
 }
 
-static void update_idx (MUTTMENU *menu, ATTACH_CONTEXT *actx)
+static void update_idx (MUTTMENU *menu, ATTACH_CONTEXT *actx, ATTACHPTR *new)
 {
-  actx->idx[actx->idxlen]->level = (actx->idxlen > 0) ? actx->idx[actx->idxlen-1]->level : 0;
+  new->level = (actx->idxlen > 0) ? actx->idx[actx->idxlen-1]->level : 0;
   if (actx->idxlen)
-    actx->idx[actx->idxlen - 1]->content->next = actx->idx[actx->idxlen]->content;
-  actx->idx[actx->idxlen]->content->aptr = actx->idx[actx->idxlen];
-  menu->current = actx->idxlen++;
+    actx->idx[actx->idxlen - 1]->content->next = new->content;
+  new->content->aptr = new;
+  mutt_actx_add_attach (actx, new, menu);
+  menu->current = actx->idxlen - 1;
   mutt_update_tree (actx);
   menu->max = actx->idxlen;
 }
@@ -646,6 +647,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
   char fname[_POSIX_PATH_MAX];
   MUTTMENU *menu;
   ATTACH_CONTEXT *actx;
+  ATTACHPTR *new;
   int i, close = 0;
   int r = -1;          /* return value */
   int op = 0;
@@ -784,12 +786,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
        /* attachments may have been added */
        if (actx->idxlen && actx->idx[actx->idxlen - 1]->content->next)
        {
-         for (i = 0; i < actx->idxlen; i++)
-          {
-            FREE (&actx->idx[i]->tree);
-           FREE (&actx->idx[i]);
-          }
-         actx->idxlen = 0;
+          mutt_actx_free_entries (actx);
          mutt_gen_attach_list (actx, msg->content, -1, 0, 1);
          menu->data = actx->idx;
          menu->max = actx->idxlen;
@@ -803,24 +800,19 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
 
       case OP_COMPOSE_ATTACH_KEY:
         if (!(WithCrypto & APPLICATION_PGP))
-          break;       
-       if (actx->idxlen == actx->idxmax)
-        {
-         safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * (actx->idxmax += 5));
-         menu->data = actx->idx;
-       }
-       
-       actx->idx[actx->idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
-       if ((actx->idx[actx->idxlen]->content = crypt_pgp_make_key_attachment(NULL)) != NULL)
+          break;
+
+       new = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+       if ((new->content = crypt_pgp_make_key_attachment(NULL)) != NULL)
        {
-         update_idx (menu, actx);
+         update_idx (menu, actx, new);
          menu->redraw |= REDRAW_INDEX;
        }
        else
-         FREE (&actx->idx[actx->idxlen]);
+         FREE (&new);
 
        menu->redraw |= REDRAW_STATUS;
-       
+
         mutt_message_hook (NULL, msg, MUTT_SEND2HOOK);
         break;
 
@@ -839,32 +831,26 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
              *fname == '\0')
            break;
 
-         if (actx->idxlen + numfiles >= actx->idxmax)
-         {
-           safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * (actx->idxmax += 5 + numfiles));
-           menu->data = actx->idx;
-         }
-
          error = 0;
          if (numfiles > 1)
            mutt_message _("Attaching selected files...");
          for (i = 0; i < numfiles; i++)
          {
            char *att = files[i];
-           actx->idx[actx->idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
-            actx->idx[actx->idxlen]->unowned = 1;
-           actx->idx[actx->idxlen]->content = mutt_make_file_attach (att);
-           if (actx->idx[actx->idxlen]->content != NULL)
-             update_idx (menu, actx);
+           new = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+            new->unowned = 1;
+           new->content = mutt_make_file_attach (att);
+           if (new->content != NULL)
+             update_idx (menu, actx, new);
            else
            {
              error = 1;
              mutt_error (_("Unable to attach %s!"), att);
-             FREE (&actx->idx[actx->idxlen]);
+             FREE (&new);
            }
             FREE (&files[i]);
          }
-         
+
          FREE (&files);
          if (!error) mutt_clear_error ();
 
@@ -923,7 +909,7 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
 
          this = Context; /* remember current folder and sort methods*/
          oldSort = Sort; oldSortAux = SortAux;
-         
+
          Context = ctx;
          set_option(OPTATTACHMSG);
          mutt_message _("Tag the messages you want to attach!");
@@ -941,25 +927,19 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
            break;
          }
 
-         if (actx->idxlen + Context->tagged >= actx->idxmax)
-         {
-           safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * (actx->idxmax += 5 + Context->tagged));
-           menu->data = actx->idx;
-         }
-
          for (i = 0; i < Context->msgcount; i++)
          {
            h = Context->hdrs[i];
            if (h->tagged)
            {
-             actx->idx[actx->idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
-             actx->idx[actx->idxlen]->content = mutt_make_message_attach (Context, h, 1);
-             if (actx->idx[actx->idxlen]->content != NULL)
-               update_idx (menu, actx);
+             new = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+             new->content = mutt_make_message_attach (Context, h, 1);
+             if (new->content != NULL)
+               update_idx (menu, actx, new);
              else
              {
                mutt_error _("Unable to attach!");
-               FREE (&actx->idx[actx->idxlen]);
+               FREE (&new);
              }
            }
          }
@@ -1254,28 +1234,24 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
            mutt_error (_("Unknown Content-Type %s"), type);
            continue;
          }
-         if (actx->idxlen == actx->idxmax)
-         {
-           safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * (actx->idxmax += 5));
-           menu->data = actx->idx;
-         }
 
-         actx->idx[actx->idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+         new = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
          /* Touch the file */
          if (!(fp = safe_fopen (fname, "w")))
          {
            mutt_error (_("Can't create file %s"), fname);
-           FREE (&actx->idx[actx->idxlen]);
+           FREE (&new);
            continue;
          }
          safe_fclose (&fp);
 
-         if ((actx->idx[actx->idxlen]->content = mutt_make_file_attach (fname)) == NULL)
+         if ((new->content = mutt_make_file_attach (fname)) == NULL)
          {
            mutt_error _("What we have here is a failure to make an attachment");
+            FREE (&new);
            continue;
          }
-         update_idx (menu, actx);
+         update_idx (menu, actx, new);
 
          actx->idx[menu->current]->content->type = itype;
          mutt_str_replace (&actx->idx[menu->current]->content->subtype, p);
index 120f6bf4ae6d791001819324f321208d9899e0e6..02e80e84bc648dc51d7e11cd3e3879c99aa589cd 100644 (file)
@@ -105,17 +105,9 @@ void mutt_gen_attach_list (ATTACH_CONTEXT *actx,
                           int compose)
 {
   ATTACHPTR *new;
-  int i;
 
   for (; m; m = m->next)
   {
-    if (actx->idxlen == actx->idxmax)
-    {
-      safe_realloc (&actx->idx, sizeof (ATTACHPTR *) * (actx->idxmax += 5));
-      for (i = actx->idxlen; i < actx->idxmax; i++)
-       actx->idx[i] = NULL;
-    }
-
     if (m->type == TYPEMULTIPART && m->parts
        && (compose || (parent_type == -1 && ascii_strcasecmp ("alternative", m->subtype)))
         && (!(WithCrypto & APPLICATION_PGP) || !mutt_is_multipart_encrypted(m))
@@ -125,10 +117,8 @@ void mutt_gen_attach_list (ATTACH_CONTEXT *actx,
     }
     else
     {
-      if (!actx->idx[actx->idxlen])
-       actx->idx[actx->idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
-
-      new = actx->idx[actx->idxlen++];
+      new = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+      mutt_actx_add_attach (actx, new, NULL);
       new->content = m;
       m->aptr = new;
       new->parent_type = parent_type;
@@ -809,10 +799,7 @@ void mutt_print_attachment_list (FILE *fp, int tag, BODY *top)
 static void
 mutt_update_attach_index (ATTACH_CONTEXT *actx, BODY *cur, MUTTMENU *menu)
 {
-  while (--(actx->idxlen) >= 0)
-    actx->idx[actx->idxlen]->content = NULL;
-  actx->idxlen = 0;
-
+  mutt_actx_free_entries (actx);
   mutt_gen_attach_list (actx, cur, -1, 0, 0);
 
   menu->max  = actx->idxlen;