aboutsummaryrefslogtreecommitdiffstats
path: root/src/encoding.cpp
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2010-05-23 16:18:00 +0000
committerVincent Richard <[email protected]>2010-05-23 16:18:00 +0000
commit2f8026dc5bb17e7fecf126070481e34a20485b67 (patch)
tree74625e9c08910c4db6ed19c341246aa1a922a494 /src/encoding.cpp
parentFileSystemFactory is now a ref. (diff)
downloadvmime-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.cpp38
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);
}