diff options
author | Vincent Richard <[email protected]> | 2012-04-05 21:15:04 +0000 |
---|---|---|
committer | Vincent Richard <[email protected]> | 2012-04-05 21:15:04 +0000 |
commit | 0633a49b049de934f11fee89c2cd448f4694f20e (patch) | |
tree | 482c0bc990a4b2f98ef81256bac331499ba6379d /src/encoding.cpp | |
parent | Added tests for Quoted-Printable encoding. (diff) | |
download | vmime-0633a49b049de934f11fee89c2cd448f4694f20e.tar.gz vmime-0633a49b049de934f11fee89c2cd448f4694f20e.zip |
Fixed wrong encoding of line breaks in QP-encoded text (issue #7).
Diffstat (limited to 'src/encoding.cpp')
-rw-r--r-- | src/encoding.cpp | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/src/encoding.cpp b/src/encoding.cpp index 0919d44c..b4e79db7 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -34,19 +34,28 @@ namespace vmime encoding::encoding() - : m_name(encodingTypes::SEVEN_BIT) + : m_name(encodingTypes::SEVEN_BIT), + m_usage(USAGE_UNKNOWN) { } encoding::encoding(const string& name) - : m_name(utility::stringUtils::toLower(name)) + : m_name(utility::stringUtils::toLower(name)), + m_usage(USAGE_UNKNOWN) +{ +} + + +encoding::encoding(const string& name, const EncodingUsage usage) + : m_name(utility::stringUtils::toLower(name)), + m_usage(usage) { } encoding::encoding(const encoding& enc) - : headerFieldValue(), m_name(enc.m_name) + : headerFieldValue(), m_name(enc.m_name), m_usage(enc.m_usage) { } @@ -54,6 +63,8 @@ encoding::encoding(const encoding& enc) void encoding::parse(const string& buffer, const string::size_type position, const string::size_type end, string::size_type* newPosition) { + m_usage = USAGE_UNKNOWN; + m_name = utility::stringUtils::toLower(utility::stringUtils::trim (utility::stringUtils::unquote(utility::stringUtils::trim (string(buffer.begin() + position, buffer.begin() + end))))); @@ -80,7 +91,14 @@ void encoding::generate(utility::outputStream& os, const string::size_type /* ma ref <utility::encoder::encoder> encoding::getEncoder() const { - return (utility::encoder::encoderFactory::getInstance()->create(generate())); + ref <utility::encoder::encoder> encoder = + utility::encoder::encoderFactory::getInstance()->create(generate()); + + // FIXME: this should not be here (move me into QP encoder instead?) + if (m_usage == USAGE_TEXT && m_name == encodingTypes::QUOTED_PRINTABLE) + encoder->getProperties()["text"] = true; + + return encoder; } @@ -94,6 +112,7 @@ encoding& encoding::operator=(const encoding& other) encoding& encoding::operator=(const string& name) { m_name = utility::stringUtils::toLower(name); + m_usage = USAGE_UNKNOWN; return (*this); } @@ -167,6 +186,8 @@ const encoding encoding::decideImpl const encoding encoding::decide (ref <const contentHandler> data, const EncodingUsage usage) { + encoding enc; + if (usage == USAGE_TEXT && data->isBuffered() && data->getLength() > 0 && data->getLength() < 32768) { @@ -177,12 +198,16 @@ const encoding encoding::decide data->extract(os); os.flush(); - return decideImpl(buffer.begin(), buffer.end()); + enc = decideImpl(buffer.begin(), buffer.end()); } else { - return encoding(encodingTypes::BASE64); + enc = encoding(encodingTypes::BASE64); } + + enc.setUsage(usage); + + return enc; } @@ -194,7 +219,10 @@ const encoding encoding::decide(ref <const contentHandler> data, encoding recEncoding; if (chset.getRecommendedEncoding(recEncoding)) + { + recEncoding.setUsage(usage); return recEncoding; + } } return decide(data, usage); @@ -227,6 +255,18 @@ void encoding::setName(const string& name) } +encoding::EncodingUsage encoding::getUsage() const +{ + return m_usage; +} + + +void encoding::setUsage(const EncodingUsage usage) +{ + m_usage = usage; +} + + const std::vector <ref <const component> > encoding::getChildComponents() const { return std::vector <ref <const component> >(); |