From 2f8026dc5bb17e7fecf126070481e34a20485b67 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Sun, 23 May 2010 16:18:00 +0000 Subject: Improved automatic encoding selection. Added helper functions on body for setting contents, type, charset and encoding. --- src/encoding.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'src/encoding.cpp') 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 /* data */) +const encoding encoding::decide + (ref 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 data, + const charset& chset, const EncodingUsage usage) +{ + if (usage == USAGE_TEXT) + { + encoding recEncoding; + + if (chset.getRecommendedEncoding(recEncoding)) + return recEncoding; + } + + return decide(data, usage); } -- cgit v1.2.3