diff options
author | Vincent Richard <[email protected]> | 2010-05-23 16:18:00 +0000 |
---|---|---|
committer | Vincent Richard <[email protected]> | 2010-05-23 16:18:00 +0000 |
commit | 2f8026dc5bb17e7fecf126070481e34a20485b67 (patch) | |
tree | 74625e9c08910c4db6ed19c341246aa1a922a494 /src/encoding.cpp | |
parent | FileSystemFactory is now a ref. (diff) | |
download | vmime-2f8026dc5bb17e7fecf126070481e34a20485b67.tar.gz vmime-2f8026dc5bb17e7fecf126070481e34a20485b67.zip |
Improved automatic encoding selection. Added helper functions on body for setting contents, type, charset and encoding.
Diffstat (limited to 'src/encoding.cpp')
-rw-r--r-- | src/encoding.cpp | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/encoding.cpp b/src/encoding.cpp index 58ce71de..0919d44c 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -110,7 +110,7 @@ bool encoding::operator!=(const encoding& value) const } -const encoding encoding::decide +const encoding encoding::decideImpl (const string::const_iterator begin, const string::const_iterator end) { const string::difference_type length = end - begin; @@ -164,10 +164,40 @@ const encoding encoding::decide } -const encoding encoding::decide(ref <const contentHandler> /* data */) +const encoding encoding::decide + (ref <const contentHandler> data, const EncodingUsage usage) { - // TODO: a better solution to do that? - return (encoding(encodingTypes::BASE64)); + if (usage == USAGE_TEXT && data->isBuffered() && + data->getLength() > 0 && data->getLength() < 32768) + { + // Extract data into temporary buffer + string buffer; + utility::outputStreamStringAdapter os(buffer); + + data->extract(os); + os.flush(); + + return decideImpl(buffer.begin(), buffer.end()); + } + else + { + return encoding(encodingTypes::BASE64); + } +} + + +const encoding encoding::decide(ref <const contentHandler> data, + const charset& chset, const EncodingUsage usage) +{ + if (usage == USAGE_TEXT) + { + encoding recEncoding; + + if (chset.getRecommendedEncoding(recEncoding)) + return recEncoding; + } + + return decide(data, usage); } |