diff options
author | Patrick Ohly <patrick.ohly@intel.com> | 2011-07-22 08:36:22 +0200 |
---|---|---|
committer | Patrick Ohly <patrick.ohly@intel.com> | 2011-07-22 08:43:19 +0200 |
commit | 8d5cce896dcc5dba028d1cfa18f08e31adcc6e73 (patch) | |
tree | 47661281aafbc057641e8a04c6cddd7dfea4a923 | |
parent | 01c6ff4f7136d2c72b520818ee1ba89dc53c71f0 (diff) |
"blob" fields: avoid binary encoding if possible
This change is meant for the PHOTO value, which can contain both
binary data and plain text URIs. Other binary data fields might also
benefit when their content turns out to be plain text (shorter
encoding).
The change is that base64 encoding is not enforced if all characters
are ASCII and printable. That allows special characters like colon,
comma, and semicolon to appear unchanged in the content.
Regardless whether the check succeeds, the result is guaranteed to
contain only ASCII characters, either because it only contains those
to start with or because of the base64 encoding.
-rw-r--r-- | src/sysync/mimedirprofile.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/sysync/mimedirprofile.cpp b/src/sysync/mimedirprofile.cpp index 4105d03..1499876 100644 --- a/src/sysync/mimedirprofile.cpp +++ b/src/sysync/mimedirprofile.cpp @@ -23,6 +23,7 @@ #include "syncagent.h" +#include <ctype.h> using namespace sysync; @@ -2274,8 +2275,18 @@ sInt16 TMimeDirProfileHandler::generateValue( } // append to existing string fldP->appendToString(outval,maxSiz); - // force B64 encoding - aEncoding=enc_base64; + // force B64 encoding if non-printable or non-ASCII characters + // are in the value + size_t len = outval.size(); + for (size_t i = 0; i < len; i++) { + char c = outval[i]; + if (!isascii(c) || !isprint(c)) { + aEncoding=enc_base64; + break; + } + } + // only ASCII in value: either because it contains only + // those to start with or because they will be encoded aNonASCII=false; } else { |