Fix encoding of last line
authorAndre Heinecke <aheinecke@intevation.de>
Fri, 7 Sep 2018 08:28:11 +0000 (10:28 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Fri, 7 Sep 2018 08:30:28 +0000 (10:30 +0200)
* src/mimedataprovider.cpp (get_body, get_html_body): Don't
append raw undecoded data anymore.
(MimeDataProvider::finalize): New. Parse the last unfinished data.
* src/parsecontroller.cpp (ParseController::parse): Call
finalize.

--
Before this a quoted printable line without a line feed at the
end would not be decoded. Leading to a broken display.

src/mimedataprovider.cpp
src/mimedataprovider.h
src/parsecontroller.cpp

index e869cc5..ba49428 100644 (file)
@@ -1030,37 +1030,29 @@ MimeDataProvider::create_attachment()
   /* TODO handle encoding */
 }
 
-const std::string &MimeDataProvider::get_body ()
+void MimeDataProvider::finalize ()
 {
-  if (m_rawbuf.size())
+  if (m_rawbuf.size ())
     {
-      /* If there was some data left in the rawbuf this could
-         mean that some plaintext was not finished with a linefeed.
-         In that case we append it to the bodies. */
-      m_body += m_rawbuf;
-      m_html_body += m_rawbuf;
-      m_rawbuf.clear();
+      m_rawbuf += "\r\n";
+      size_t not_taken = collect_input_lines (m_rawbuf.c_str(),
+                                              m_rawbuf.size());
+      m_rawbuf.erase (0, m_rawbuf.size() - not_taken);
+      if (m_rawbuf.size ())
+        {
+          log_error ("%s:%s: Collect left data in buffer.\n",
+                     SRCNAME, __func__);
+        }
     }
+}
+
+const std::string &MimeDataProvider::get_body ()
+{
   return m_body;
 }
 
 const std::string &MimeDataProvider::get_html_body ()
 {
-  if (!m_has_html_body)
-    {
-      /* Don't do the last line handling if we don't
-         have html */
-      return m_html_body;
-    }
-  if (m_rawbuf.size())
-    {
-      /* If there was some data left in the rawbuf this could
-         mean that some plaintext was not finished with a linefeed.
-         In that case we append it to the bodies. */
-      m_body += m_rawbuf;
-      m_html_body += m_rawbuf;
-      m_rawbuf.clear();
-    }
   return m_html_body;
 }
 
index 4841d73..40e1c18 100644 (file)
@@ -118,6 +118,9 @@ public:
   const std::string &get_body_charset() const;
 
   void set_has_html_body(bool value) {m_has_html_body = value;}
+
+  /* Finalize the bodys */
+  void finalize ();
 private:
 #ifdef HAVE_W32_SYSTEM
   /* Collect the data from mapi. */
index df5b8fe..82d10e7 100644 (file)
@@ -519,6 +519,11 @@ ParseController::parse()
     }
   TRACEPOINT;
 
+  if (m_outputprovider)
+    {
+      m_outputprovider->finalize ();
+    }
+
   return;
 }