Rocco Rutte:
[apps/madmutt.git] / handler.c
index 521bcc3..2378388 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -19,6 +19,9 @@
 #include <sys/stat.h>
 
 #include "mutt.h"
+#include "ascii.h"
+#include "recvattach.h"
+#include "handler.h"
 #include "mutt_curses.h"
 #include "rfc1524.h"
 #include "keymap.h"
@@ -27,6 +30,7 @@
 #include "charset.h"
 #include "mutt_crypt.h"
 #include "state.h"
+#include "attach.h"
 #include "lib.h"
 
 #include "lib/mem.h"
@@ -34,7 +38,7 @@
 #include "lib/str.h"
 #include "lib/debug.h"
 
-typedef void handler_f (BODY *, STATE *);
+typedef int handler_f (BODY *, STATE *);
 typedef handler_f *handler_t;
 
 int Index_hex[128] = {
@@ -660,7 +664,7 @@ static void enriched_set_flags (const char *tag, struct enriched_state *stte)
   }
 }
 
-void text_enriched_handler (BODY * a, STATE * s)
+int text_enriched_handler (BODY * a, STATE * s)
 {
   enum {
     TEXT, LANGLE, TAG, BOGUS_TAG, NEWLINE, ST_EOF, DONE
@@ -773,6 +777,8 @@ void text_enriched_handler (BODY * a, STATE * s)
   mem_free (&(stte.buffer));
   mem_free (&(stte.line));
   mem_free (&(stte.param));
+
+  return (0);
 }
 
 /*
@@ -889,12 +895,12 @@ static void print_flowed_line (char *line, STATE * s, int ql)
      state_putc('\n',s); */
 }
 
-static void text_plain_flowed_handler (BODY * a, STATE * s)
+static int text_plain_flowed_handler (BODY * a, STATE * s)
 {
   int bytes = a->length;
   char buf[LONG_STRING];
   char *curline = strdup ("");
-  char *t;
+  char *t = NULL;
   unsigned int curline_len = 1;
   unsigned int quotelevel = 0, newql = 0;
   int first_line = 1;
@@ -905,8 +911,9 @@ static void text_plain_flowed_handler (BODY * a, STATE * s)
 
     newql = get_quote_level (buf);
 
-    if ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r'))) {
-      *t = '\0';
+    if (bytes == 0 || ((t = strrchr (buf, '\n')) || (t = strrchr (buf, '\r')))) {
+      if (t)
+        *t = '\0';
       if (str_len (curline) > 0 && curline[str_len (curline) - 1] == ' '
           && newql == quotelevel
           && strcmp (curline + quotelevel, "-- ") != 0) {
@@ -937,31 +944,19 @@ static void text_plain_flowed_handler (BODY * a, STATE * s)
         quotelevel = newql;
       }
     }
-    else if (bytes == 0) {
-      /* in case there's no line end it's likely the last line
-       * so append to current (if any) */
-      if (buf[newql] == ' ')
-        curline[str_len (curline) - 1] = '\0';
-      curline = realloc (curline, curline_len + str_len (buf));
-      if (curline_len == 1)
-        *curline = '\0';
-      curline_len += str_len (buf);
-      str_ncat (curline, curline_len, buf + newql,
-                    str_len (buf + newql));
-      break;
-    }
   }
   if (curline) {
     print_flowed_line (curline, s, quotelevel);
     mem_free (&curline);
   }
+  return (0);
 }
 
 #define TXTHTML     1
 #define TXTPLAIN    2
 #define TXTENRICHED 3
 
-static void alternative_handler (BODY * a, STATE * s)
+static int alternative_handler (BODY * a, STATE * s)
 {
   BODY *choice = NULL;
   BODY *b;
@@ -969,6 +964,7 @@ static void alternative_handler (BODY * a, STATE * s)
   char buf[STRING];
   int type = 0;
   int mustfree = 0;
+  int rc = 0;
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED) {
@@ -1095,21 +1091,23 @@ static void alternative_handler (BODY * a, STATE * s)
   else if (s->flags & M_DISPLAY) {
     /* didn't find anything that we could display! */
     state_mark_attach (s);
-    state_puts (_
-                ("[-- Error:  Could not display any parts of Multipart/Alternative! --]\n"),
-                s);
+    state_puts (_("[-- Error:  Could not display any parts of Multipart/Alternative! --]\n"), s);
+    rc = -1;
   }
 
   if (mustfree)
     mutt_free_body (&a);
+
+  return (rc);
 }
 
 /* handles message/rfc822 body parts */
-void message_handler (BODY * a, STATE * s)
+static int message_handler (BODY * a, STATE * s)
 {
   struct stat st;
   BODY *b;
   long off_start;
+  int rc = 0;
 
   off_start = ftell (s->fpin);
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
@@ -1134,12 +1132,14 @@ void message_handler (BODY * a, STATE * s)
       state_puts (s->prefix, s);
     state_putc ('\n', s);
 
-    mutt_body_handler (b->parts, s);
+    rc = mutt_body_handler (b->parts, s);
   }
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED)
     mutt_free_body (&b);
+
+  return (rc);
 }
 
 /* returns 1 if decoding the attachment will produce output */
@@ -1179,12 +1179,13 @@ int mutt_can_decode (BODY * a)
   return (0);
 }
 
-void multipart_handler (BODY * a, STATE * s)
+static int multipart_handler (BODY * a, STATE * s)
 {
   BODY *b, *p;
   char length[5];
   struct stat st;
   int count;
+  int rc = 0;
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED) {
@@ -1232,19 +1233,21 @@ void multipart_handler (BODY * a, STATE * s)
         state_printf (s, "%s: \n", p->form_name);
 
     }
-    mutt_body_handler (p, s);
+    rc = mutt_body_handler (p, s);
     state_putc ('\n', s);
-    if ((s->flags & M_REPLYING)
-        && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE))
+    if (rc || ((s->flags & M_REPLYING)
+        && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE)))
       break;
   }
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
       a->encoding == ENCUUENCODED)
     mutt_free_body (&b);
+
+  return (rc);
 }
 
-void autoview_handler (BODY * a, STATE * s)
+static int autoview_handler (BODY * a, STATE * s)
 {
   rfc1524_entry *entry = rfc1524_new_entry ();
   char buffer[LONG_STRING];
@@ -1257,6 +1260,7 @@ void autoview_handler (BODY * a, STATE * s)
   FILE *fperr = NULL;
   int piped = FALSE;
   pid_t thepid;
+  int rc = 0;
 
   snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype);
   rfc1524_mailcap_lookup (a, type, entry, M_AUTOVIEW);
@@ -1283,7 +1287,7 @@ void autoview_handler (BODY * a, STATE * s)
     if ((fpin = safe_fopen (tempfile, "w+")) == NULL) {
       mutt_perror ("fopen");
       rfc1524_free_entry (&entry);
-      return;
+      return (-1);
     }
 
     mutt_copy_bytes (s->fpin, fpin, a->length);
@@ -1307,6 +1311,7 @@ void autoview_handler (BODY * a, STATE * s)
         state_mark_attach (s);
         state_printf (s, _("[-- Can't run %s. --]\n"), command);
       }
+      rc = -1;
       goto bail;
     }
 
@@ -1358,9 +1363,10 @@ void autoview_handler (BODY * a, STATE * s)
       mutt_clear_error ();
   }
   rfc1524_free_entry (&entry);
+  return (rc);
 }
 
-static void external_body_handler (BODY * b, STATE * s)
+static int external_body_handler (BODY * b, STATE * s)
 {
   const char *access_type;
   const char *expiration;
@@ -1370,11 +1376,9 @@ static void external_body_handler (BODY * b, STATE * s)
   if (!access_type) {
     if (s->flags & M_DISPLAY) {
       state_mark_attach (s);
-      state_puts (_
-                  ("[-- Error: message/external-body has no access-type parameter --]\n"),
-                  s);
+      state_puts (_("[-- Error: message/external-body has no access-type parameter --]\n"), s);
     }
-    return;
+    return (-1);
   }
 
   expiration = mutt_get_parameter ("expiration", b->parameter);
@@ -1442,6 +1446,7 @@ static void external_body_handler (BODY * b, STATE * s)
                      CH_DECODE, NULL);
     }
   }
+  return (0);
 }
 
 void mutt_decode_attachment (BODY * b, STATE * s)
@@ -1486,7 +1491,7 @@ void mutt_decode_attachment (BODY * b, STATE * s)
     iconv_close (cd);
 }
 
-void mutt_body_handler (BODY * b, STATE * s)
+int mutt_body_handler (BODY * b, STATE * s)
 {
   int decode = 0;
   int plaintext = 0;
@@ -1496,6 +1501,7 @@ void mutt_body_handler (BODY * b, STATE * s)
   long tmpoffset = 0;
   size_t tmplength = 0;
   char type[STRING];
+  int rc = 0;
 
   int oflags = s->flags;
 
@@ -1635,7 +1641,7 @@ void mutt_body_handler (BODY * b, STATE * s)
 
     /* process the (decoded) body part */
     if (handler) {
-      handler (b, s);
+      rc = handler (b, s);
 
       if (decode) {
         b->length = tmplength;
@@ -1664,4 +1670,6 @@ void mutt_body_handler (BODY * b, STATE * s)
 
 bail:
   s->flags = oflags | (s->flags & M_FIRSTDONE);
+
+  return (rc);
 }