Distinguish inline and attachment dispositions.
authorWerner Koch <wk@gnupg.org>
Fri, 2 May 2008 18:37:47 +0000 (18:37 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 2 May 2008 18:37:47 +0000 (18:37 +0000)
src/ChangeLog
src/display.cpp
src/main.c
src/message-events.cpp
src/mimeparser.c
src/rfc822parse.c

index 0c93b13..ee77869 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-02  Werner Koch  <wk@g10code.com>
+
+       * mimeparser.c (t2body): Detect non-inline text parts.
+       * rfc822parse.c (rfc822parse_query_parameter): Add special mode
+       for an ATTR of NULL.
+
 2008-04-16  Werner Koch  <wk@g10code.com>
 
        * message-events.h (class GpgolMessageEvents): Add M_GOTINSPECTOR.
index 63fb780..d00fb63 100644 (file)
@@ -201,9 +201,14 @@ int
 is_inspector_display (HWND hwnd)
 {
   struct find_message_window_state findstate;
+  int rc;
 
   memset (&findstate, 0, sizeof findstate);
-  return !!find_message_window (hwnd, &findstate);
+  rc = !!find_message_window (hwnd, &findstate);
+  if (!rc)
+    log_window_hierarchy (hwnd, "The windows blow hwnd %p", hwnd);
+  
+  return rc;
 }
 
 
index 5e5e202..5ae3ed9 100644 (file)
@@ -1,5 +1,5 @@
 /* main.c - DLL entry point
- *     Copyright (C) 2005, 2007 g10 Code GmbH
+ *     Copyright (C) 2005, 2007, 2008 g10 Code GmbH
  *
  * This file is part of GpgOL.
  *
index a2cdad1..8133d39 100644 (file)
@@ -127,6 +127,11 @@ GpgolMessageEvents::OnRead (LPEXCHEXTCALLBACK eecb)
        shows a grey window with a notice that the message can't be 
        shown due to active content.  */  
 
+  /* The is_inspector_display function is not reliable enough.
+     Missing another solution we set it to true for now with the
+     result that the preview decryption can't be disabled.  */
+  m_gotinspector = 1;
+  
   if (m_gotinspector || opt.preview_decrypt)
     {
       eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
index f735ef5..79b83b6 100644 (file)
@@ -704,6 +704,7 @@ t2body (mime_context_t ctx, rfc822parse_t msg)
   size_t off;
   char *p;
   int is_text = 0;
+  int not_inline_text = 0;
   char *filename = NULL; 
   char *charset = NULL;
         
@@ -731,6 +732,9 @@ t2body (mime_context_t ctx, rfc822parse_t msg)
       s = rfc822parse_query_parameter (field, "filename", 0);
       if (s)
         filename = xstrdup (s);
+      s = rfc822parse_query_parameter (field, NULL, 1);
+      if (s && !strcmp (s, "inline"))
+        not_inline_text = 1;
       rfc822parse_release_field (field);
     }
 
@@ -838,6 +842,11 @@ t2body (mime_context_t ctx, rfc822parse_t msg)
   rfc822parse_release_field (field); /* (Content-type) */
   ctx->in_data = 1;
 
+  /* Need to start an attachment if we have seen a content disposition
+     other then the inline type.  */ 
+  if (is_text && not_inline_text)
+    ctx->collect_attachment = 1;
+
   if (debug_mime_parser)
     log_debug ("%s:%s: this body: nesting=%d partno=%d is_text=%d, is_opq=%d"
                " charset=\"%s\"\n",
@@ -847,7 +856,7 @@ t2body (mime_context_t ctx, rfc822parse_t msg)
                ctx->mimestruct_cur->charset?ctx->mimestruct_cur->charset:"");
 
   /* If this is a text part, decide whether we treat it as our body. */
-  if (is_text)
+  if (is_text && !not_inline_text)
     {
       ctx->collect_attachment = 1;
 
index 2832eb7..8d0c5d0 100644 (file)
@@ -1012,8 +1012,9 @@ is_parameter (TOKEN t)
    With LOWER_VALUE set to true, a matching field value will be
    lowercased.
  
-   Note, that ATTR should be lowercase.  A CTX of NULL is allowed and
-   will return NULL.
+   Note, that ATTR should be lowercase.  If ATTR is NULL the fucntion
+   returns the first token of the field; i.e. not the parameter but
+   the actual value.  A CTX of NULL is allowed and will return NULL.
  */
 const char *
 rfc822parse_query_parameter (rfc822parse_field_t ctx, const char *attr,
@@ -1021,6 +1022,22 @@ rfc822parse_query_parameter (rfc822parse_field_t ctx, const char *attr,
 {
   TOKEN t, a;
 
+  if (!attr)
+    {
+      t = ctx;
+      if (t
+          && (t->type == tATOM || t->type == tQUOTED || t->type == tDOMAINLIT))
+        {
+          if ( lower_value && !t->flags.lowered )
+            {
+              lowercase_string (t->data);
+              t->flags.lowered = 1;
+            }
+          return t->data;
+        }
+      return NULL;
+    }
+
   for (t = ctx; t; t = t->next)
     {
       /* skip to the next semicolon */
@@ -1213,7 +1230,22 @@ msg_cb (void *dummy_arg, rfc822parse_event_t event, rfc822parse_t msg)
         }
       else
         printf ("***   media: text/plain [assumed]\n");
-      
+
+      ctx = rfc822parse_parse_field (msg, "Content-Disposition", -1);
+      if (ctx)
+        {
+          const char *s1;
+          TOKEN t;
+
+          s1 = rfc822parse_query_parameter (ctx, NULL, 1);
+          if (s1)
+            printf ("***   disp: type=`%s'\n", s1);
+          s1 = rfc822parse_query_parameter (ctx, "filename", 0);
+          if (s1)
+            printf ("***   disp: fname=`%s'\n", s1);
+
+          rfc822parse_release_field (ctx);
+        }
     }