Nico Golde:
[apps/madmutt.git] / handler.c
index 666638b..d407495 100644 (file)
--- a/handler.c
+++ b/handler.c
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */ 
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -31,6 +35,7 @@
 #include "copy.h"
 #include "charset.h"
 #include "mutt_crypt.h"
+#include "lib.h"
 
 
 #define BUFI_SIZE 1000
@@ -898,6 +903,12 @@ void text_enriched_handler (BODY *a, STATE *s)
 
 #define FLOWED_MAX 77
 
+#if 0
+static int flowed_maybe_quoted (char *cont)
+{
+  return regexec ((regex_t *) QuoteRegexp.rx, cont, 0, NULL, 0) == 0;
+}
+
 static void flowed_quote (STATE *s, int level)
 {
   int i;
@@ -914,11 +925,6 @@ static void flowed_quote (STATE *s, int level)
     state_putc ('>', s);
 }
 
-static int flowed_maybe_quoted (char *cont)
-{
-  return regexec ((regex_t *) QuoteRegexp.rx, cont, 0, NULL, 0) == 0;
-}
-
 static void flowed_stuff (STATE *s, char *cont, int level)
 {
   if (!option (OPTTEXTFLOWED) && !(s->flags & M_DISPLAY))
@@ -991,13 +997,19 @@ static void text_plain_flowed_handler (BODY *a, STATE *s)
   if (s->prefix)
     add = 1;
   
+  /*
   if ((flowed_max = FLOWED_MAX) > COLS - 3)
     flowed_max = COLS - 3;
   if (flowed_max > COLS - WrapMargin)
     flowed_max = COLS - WrapMargin;
   if (flowed_max <= 0)
     flowed_max = COLS;
-    
+    */
+  flowed_max = COLS - WrapMargin;
+  if (flowed_max <= 0)
+    flowed_max = COLS;
+  
+  fprintf(stderr,"flowed_max = %d\n",flowed_max);
 
   while (bytes > 0 && fgets (line, sizeof (line), s->fpin))
   {
@@ -1185,9 +1197,155 @@ static void text_plain_flowed_handler (BODY *a, STATE *s)
     state_putc ('\n', s);
   
 }
+#endif
 
+static int get_quote_level(char * line) {
+  int quoted;
+  for (quoted = 0; line[quoted] == '>'; quoted++);
+  return quoted;
+}
 
+static void print_flowed_line(char * line, STATE *s,int ql) {
+  int width;
+  char * pos, * oldpos;
+  int len = strlen(line);
+  int i;
 
+  if (MaxLineLength > 0) {
+    width = MaxLineLength - WrapMargin - ql - 1;
+    if (option(OPTSTUFFQUOTED))
+      --width;
+    if (width < 0)
+      width = MaxLineLength;
+  } 
+  else {
+    if (option(OPTMBOXPANE))
+      width = COLS - SidebarWidth - WrapMargin - ql - 1;
+    else
+      width = COLS - WrapMargin - ql - 1;
+    
+    if (option(OPTSTUFFQUOTED))
+      --width;
+    if (width < 0)
+      width = COLS;
+  } 
+
+  /* fprintf(stderr,"print_flowed_line will print `%s' with ql = %d\n",line,ql); */
+
+  if (strlen(line)==0) {
+    if (s->prefix)
+      state_puts(s->prefix,s);
+    for (i=0;i<ql;++i) state_putc('>',s);
+    if (option(OPTSTUFFQUOTED))
+      state_putc(' ',s);
+    state_putc('\n',s);
+    return;
+  }
+
+  pos=line+ql+width;
+  oldpos=line+ql;
+  if (ql>0 && ISBLANK(*oldpos)) ++oldpos;
+
+  /* fprintf(stderr,"oldpos = %p line+len = %p\n",oldpos,line+len); */
+
+  for (;oldpos<line+len;pos+=width) {
+    /* fprintf(stderr,"outer for loop\n"); */
+    if (pos<line+len) { /* only search a new position when we're not over the end of the string w/ pos */
+      /* fprintf(stderr,"if 1\n"); */
+      if (*pos == ' ') {
+        /* fprintf(stderr,"if 2: good luck! found a space\n"); */
+        *pos = '\0';
+        ++pos;
+      } else {
+        /* fprintf(stderr,"if 2: else\n"); */
+        char * save = pos;
+        while (pos>=oldpos && !isspace(*pos)) {
+          /* fprintf(stderr,"pos(%p) > oldpos(%p)\n",pos,oldpos); */
+          --pos;
+        }
+        if (pos < oldpos) {
+          /* fprintf(stderr,"wow, no space found, searching the other direction\n"); */
+          pos = save;
+          while (pos < line+len && *pos && !isspace(*pos)) {
+            /* fprintf(stderr,"pos(%p) < line+len(%p)\n",pos,line+len); */
+            ++pos;
+          }
+          /* fprintf(stderr,"found a space pos = %p\n",pos); */
+        }
+        *pos = '\0';
+        ++pos;
+      }
+    } else {
+      /* fprintf(stderr,"if 1 else\n"); */
+    }
+    if (s->prefix)
+      state_puts(s->prefix,s);
+    for (i=0;i<ql;++i)
+      state_putc('>',s);
+    if (option(OPTSTUFFQUOTED) && (ql>0 || s->prefix)) state_putc(' ',s);
+    state_puts(oldpos,s);
+    /* fprintf(stderr,"print_flowed_line: `%s'\n",oldpos); */
+    if (pos<line+len)
+      state_putc(' ',s);
+    state_putc('\n',s);
+    oldpos = pos;
+  }
+  /*state_puts(line,s);
+  state_putc('\n',s);*/
+}
+
+static void text_plain_flowed_handler (BODY *a, STATE *s)
+{
+  int bytes = a->length;
+  char buf[LONG_STRING];
+  char * curline = strdup("");
+  char * t;
+  unsigned int curline_len = 1;
+  unsigned int quotelevel = 0, newql = 0;
+  int append_next_line = 0;
+  int first_line = 1;
+
+  while (bytes > 0 && fgets(buf,sizeof(buf),s->fpin)) {
+
+    /* fprintf(stderr,"read `%s'",buf); */
+    bytes -= strlen(buf);
+
+    newql = get_quote_level(buf);
+
+    if ((t=strrchr(buf,'\n')) || (t=strrchr(buf,'\r'))) {
+      *t = '\0';
+      if (strlen(curline)>0 && curline[strlen(curline)-1]==' ' && newql==quotelevel && strcmp(curline+quotelevel,"-- ")!=0) {
+        if (buf[newql]==' ')
+          curline[strlen(curline)-1] = '\0';
+
+        curline = realloc(curline,curline_len+strlen(buf));
+        if (curline_len == 1) *curline = '\0';
+        curline_len+=strlen(buf);
+        safe_strncat(curline,curline_len,buf+newql,strlen(buf+newql));
+      } else {
+        if (first_line) {
+          first_line = 0;
+        } else {
+          print_flowed_line(curline,s,quotelevel);
+        }
+        FREE(&curline);
+        curline_len = 1;
+        curline = realloc(curline,curline_len+strlen(buf));
+        if (curline_len == 1) *curline = '\0';
+        curline_len+=strlen(buf);
+        safe_strncat(curline,curline_len,buf,strlen(buf));
+        quotelevel = newql;
+      }
+    } else {
+      append_next_line = 1;
+      /* @todo: add handling of very long lines */
+    }
+  }
+  if (curline) {
+    print_flowed_line(curline,s,quotelevel);
+    FREE(&curline);
+  }
+}
 
 
 
@@ -1487,6 +1645,9 @@ void multipart_handler (BODY *a, STATE *s)
     }
     mutt_body_handler (p, s);
     state_putc ('\n', s);
+    if ((s->flags & M_REPLYING)
+       && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE))
+      break;
   }
 
   if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE ||
@@ -1722,11 +1883,21 @@ void mutt_decode_attachment (BODY *b, STATE *s)
 
   Quotebuf[0] = '\0';
 
-  if (istext && s->flags & M_CHARCONV)
+  if (istext)
   {
-    char *charset = mutt_get_parameter ("charset", b->parameter);
-    if (charset && Charset)
-      cd = mutt_iconv_open (Charset, charset, M_ICONV_HOOK_FROM);
+    if(s->flags & M_CHARCONV)
+    {
+      char *charset = mutt_get_parameter ("charset", b->parameter);
+      if (!option (OPTSTRICTMIME) && !charset)
+        charset = mutt_get_first_charset (AssumedCharset);
+      if (charset && Charset)
+        cd = mutt_iconv_open (Charset, charset, M_ICONV_HOOK_FROM);
+    }
+    else
+    {
+      if (b->file_charset)
+        cd = mutt_iconv_open (Charset, b->file_charset, M_ICONV_HOOK_FROM);
+    }
   }
 
   fseek (s->fpin, b->offset, 0);
@@ -1897,7 +2068,7 @@ void mutt_body_handler (BODY *b, STATE *s)
        /* restore final destination and substitute the tempfile for input */
        s->fpout = fp;
        fp = s->fpin;
-       s->fpin = fopen (tempfile, "r");
+       s->fpin = safe_fopen (tempfile, "r");
        unlink (tempfile);
 
        /* restore the prefix */
@@ -1922,6 +2093,7 @@ void mutt_body_handler (BODY *b, STATE *s)
        s->fpin = fp;
       }
     }
+    s->flags |= M_FIRSTDONE;
   }
   else if (s->flags & M_DISPLAY)
   {
@@ -1939,5 +2111,5 @@ void mutt_body_handler (BODY *b, STATE *s)
   }
   
   bail:
-  s->flags = oflags;
+  s->flags = oflags | (s->flags & M_FIRSTDONE);
 }