aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2010-06-23 20:42:25 +0000
committerVincent Richard <[email protected]>2010-06-23 20:42:25 +0000
commit1930316f362bd5f13b42d952d91bab2a78e303e4 (patch)
tree747d7c1bf69932739e37706f853a651c0e16cfcd
parentImproved automatic encoding selection. Added helper functions on body for set... (diff)
downloadvmime-1930316f362bd5f13b42d952d91bab2a78e303e4.tar.gz
vmime-1930316f362bd5f13b42d952d91bab2a78e303e4.zip
Do not generate 7-bit value for parameter if RFC-2231 extended value is generated (thanks to Eugene A. Shatokhin).
-rw-r--r--src/parameter.cpp49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/parameter.cpp b/src/parameter.cpp
index 6cd8d1fd..53adacae 100644
--- a/src/parameter.cpp
+++ b/src/parameter.cpp
@@ -257,11 +257,23 @@ void parameter::generate(utility::outputStream& os, const string::size_type maxL
// For compatibility with implementations that do not understand RFC-2231,
// also generate a normal "7bit/us-ascii" parameter
+
+ // [By Eugene A. Shatokhin]
+ // Note that if both the normal "7bit/us-ascii" value and the extended
+ // value are present, the latter can be ignored by mail processing systems.
+ // This may lead to annoying problems, for example, with strange names of
+ // attachments with all but 7-bit ascii characters removed, etc. To avoid
+ // this, I would suggest not to create "7bit/us-ascii" value if the extended
+ // value is to be generated.
+
+ // A stream for a temporary storage
+ std::ostringstream sevenBitBuffer;
+
string::size_type pos = curLinePos;
if (pos + name.length() + 10 + value.length() > maxLineLength)
{
- os << NEW_LINE_SEQUENCE;
+ sevenBitBuffer << NEW_LINE_SEQUENCE;
pos = NEW_LINE_SEQUENCE_LENGTH;
}
@@ -301,12 +313,12 @@ void parameter::generate(utility::outputStream& os, const string::size_type maxL
if (needQuoting)
{
- os << name << "=\"";
+ sevenBitBuffer << name << "=\"";
pos += name.length() + 2;
}
else
{
- os << name << "=";
+ sevenBitBuffer << name << "=";
pos += name.length() + 1;
}
@@ -318,12 +330,12 @@ void parameter::generate(utility::outputStream& os, const string::size_type maxL
if (/* needQuoting && */ (c == '"' || c == '\\')) // 'needQuoting' is implicit
{
- os << '\\' << value[i]; // escape 'x' with '\x'
+ sevenBitBuffer << '\\' << value[i]; // escape 'x' with '\x'
pos += 2;
}
else if (parserHelpers::isAscii(c))
{
- os << value[i];
+ sevenBitBuffer << value[i];
++pos;
}
else
@@ -334,17 +346,31 @@ void parameter::generate(utility::outputStream& os, const string::size_type maxL
if (needQuoting)
{
- os << '"';
+ sevenBitBuffer << '"';
++pos;
}
+#if VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+ os << sevenBitBuffer;
+#endif // !VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+
// Also generate an extended parameter if the value contains 8-bit characters
// or is too long for a single line
if (extended || cutValue)
{
+
+#if VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+
os << ';';
++pos;
+#else // !VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+
+ // The data output to 'sevenBitBuffer' will be discarded in this case
+ pos = curLinePos;
+
+#endif // VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+
/* RFC-2231
* ========
*
@@ -477,6 +503,17 @@ void parameter::generate(utility::outputStream& os, const string::size_type maxL
}
}
}
+#if !VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
+ else
+ {
+ // The value does not contain 8-bit characters and
+ // is short enough for a single line.
+ // "7bit/us-ascii" will suffice in this case.
+
+ // Output what has been stored in temporary buffer so far
+ os << sevenBitBuffer.str();
+ }
+#endif // !VMIME_ALWAYS_GENERATE_7BIT_PARAMETER
if (newLinePos)
*newLinePos = pos;