2004-10-27 [paul] 0.9.12cvs134.1
[claws.git] / src / procmime.c
index e9305da58b81756a6863d704c0871a764b2272e7..48b80fd8072159b9d436f9824cf9b54083674daf 100644 (file)
@@ -1515,18 +1515,70 @@ MimeInfo *procmime_scan_queue_file(const gchar *filename)
        return mimeinfo;
 }
 
+typedef enum {
+    ENC_AS_TOKEN,
+    ENC_AS_QUOTED_STRING,
+    ENC_AS_ENCODED_WORD,
+} EncodeAs;
+
 static void write_parameters(gpointer key, gpointer value, gpointer user_data)
 {
        gchar *param = key;
-       gchar *val = value;
+       gchar *val = value, *valpos;
        FILE *fp = user_data;
+       EncodeAs encas = ENC_AS_TOKEN;
 
-       /* FIXME: better encoding of parameters */
        fprintf(fp, "; %s=", param);
-       if (strchr(val, ' ') != NULL)
+
+       for (valpos = val; *valpos != 0; valpos++) {
+               if (!IS_ASCII(*valpos)) {
+                       encas = ENC_AS_ENCODED_WORD;
+                       break;
+               }
+           
+               /* CTLs */
+               if (((*valpos >= 0) && (*valpos < 037)) || (*valpos == 0177)) {
+                       encas = ENC_AS_QUOTED_STRING;
+                       continue;
+               }
+
+               /* tspecials + SPACE */
+               switch (*valpos) {
+               case ' ':
+               case '(': 
+               case ')':
+               case '<':
+               case '>':
+               case '@':
+               case ',':
+               case ';':
+               case ':':
+               case '\\':
+               case '"':
+               case '/':
+               case '[':
+               case ']':
+               case '?':
+               case '=':
+                       encas = ENC_AS_QUOTED_STRING;
+                       continue;
+               }
+       }
+
+       switch (encas) {
+       case ENC_AS_TOKEN:
+               fprintf(fp, "%s", val);
+               break;
+
+       case ENC_AS_QUOTED_STRING:
                fprintf(fp, "\"%s\"", val);
-       else
+               break;
+
+       case ENC_AS_ENCODED_WORD:
+               /* FIXME: not yet handled */
                fprintf(fp, "%s", val);
+               break;
+       }
 }
 
 void procmime_write_mime_header(MimeInfo *mimeinfo, FILE *fp)