Fold non-encoded lines in the case there is no whitespace in them.

This commit is contained in:
Vincent Richard 2010-10-18 14:20:34 +00:00
parent 097bde861d
commit dbcb03893c
2 changed files with 48 additions and 1 deletions

View File

@ -351,7 +351,6 @@ void word::generate(utility::outputStream& os, const string::size_type maxLineLe
// - there is enough remaining space on the current line to hold the whole buffer
if (!encodingNeeded &&
(flags & text::QUOTE_IF_POSSIBLE) &&
!encodingNeeded &&
m_buffer.find('"') == string::npos &&
(curLineLength + 2 /* 2 x " */ + m_buffer.length()) < maxLineLength)
{
@ -361,6 +360,40 @@ void word::generate(utility::outputStream& os, const string::size_type maxLineLe
// We will fold lines without encoding them.
else if (!encodingNeeded)
{
// Here, we could have the following conditions:
//
// * a maximum line length of N bytes
// * a buffer containing N+1 bytes, with no whitespace
//
// Look in the buffer for any run (ie. whitespace-separated sequence) which
// is longer than the maximum line length. If there is one, then force encoding,
// so that no generated line is longer than the maximum line length.
string::size_type maxRunLength = 0;
string::size_type curRunLength = 0;
for (string::const_iterator p = m_buffer.begin(), end = m_buffer.end() ; p != end ; ++p)
{
if (parserHelpers::isSpace(*p))
{
maxRunLength = std::max(maxRunLength, curRunLength);
curRunLength = 0;
}
else
{
curRunLength++;
}
}
maxRunLength = std::max(maxRunLength, curRunLength);
if (maxRunLength >= maxLineLength - 3)
{
// Generate with encoding forced
generate(os, maxLineLength, curLinePos, newLinePos, flags | text::FORCE_ENCODING, state);
return;
}
// Output runs, and fold line when a whitespace is encountered
string::const_iterator lastWSpos = m_buffer.end(); // last white-space position
string::const_iterator curLineStart = m_buffer.begin(); // current line start

View File

@ -50,6 +50,8 @@ VMIME_TEST_SUITE_BEGIN
VMIME_TEST(testWhitespace)
VMIME_TEST(testWhitespaceMBox)
VMIME_TEST(testFoldingAscii)
VMIME_TEST_LIST_END
@ -428,5 +430,17 @@ VMIME_TEST_SUITE_BEGIN
VASSERT_EQ("parse.email", "me@vmime.org", mbox.getEmail());
}
void testFoldingAscii()
{
// In this test, no encoding is needed, but line should be folded anyway
vmime::word w("01234567890123456789012345678901234567890123456789"
"01234567890123456789012345678901234567890123456789", vmime::charset("us-ascii"));
VASSERT_EQ("fold.ascii",
"=?us-ascii?Q?01234567890123456789012345678901234?=\r\n"
" =?us-ascii?Q?5678901234567890123456789012345678?=\r\n"
" =?us-ascii?Q?9012345678901234567890123456789?=", w.generate(50));
}
VMIME_TEST_SUITE_END