diff options
Diffstat (limited to 'src/utility/encoder')
-rw-r--r-- | src/utility/encoder/b64Encoder.cpp | 21 | ||||
-rw-r--r-- | src/utility/encoder/defaultEncoder.cpp | 12 | ||||
-rw-r--r-- | src/utility/encoder/qpEncoder.cpp | 21 | ||||
-rw-r--r-- | src/utility/encoder/uuEncoder.cpp | 16 |
4 files changed, 70 insertions, 0 deletions
diff --git a/src/utility/encoder/b64Encoder.cpp b/src/utility/encoder/b64Encoder.cpp index d67a91ac..20e16b98 100644 --- a/src/utility/encoder/b64Encoder.cpp +++ b/src/utility/encoder/b64Encoder.cpp @@ -304,6 +304,27 @@ utility::stream::size_type b64Encoder::decode(utility::inputStream& in, } +utility::stream::size_type b64Encoder::getEncodedSize(const utility::stream::size_type n) const +{ + const string::size_type propMaxLineLength = + getProperties().getProperty <string::size_type>("maxlinelength", static_cast <string::size_type>(-1)); + + const bool cutLines = (propMaxLineLength != static_cast <string::size_type>(-1)); + const string::size_type maxLineLength = std::min(propMaxLineLength, static_cast <string::size_type>(76)); + + return (n * 4) / 3 // 3 bytes of input provide 4 bytes of output + + (cutLines ? (n / maxLineLength) * 2 : 0) // CRLF (2 bytes) for each line. + + 4; // padding +} + + +utility::stream::size_type b64Encoder::getDecodedSize(const utility::stream::size_type n) const +{ + // 4 bytes of input provide 3 bytes of output + return (n * 3) / 4; +} + + } // encoder } // utility } // vmime diff --git a/src/utility/encoder/defaultEncoder.cpp b/src/utility/encoder/defaultEncoder.cpp index 3a0656c9..95e531cd 100644 --- a/src/utility/encoder/defaultEncoder.cpp +++ b/src/utility/encoder/defaultEncoder.cpp @@ -70,6 +70,18 @@ utility::stream::size_type defaultEncoder::decode(utility::inputStream& in, } +utility::stream::size_type defaultEncoder::getEncodedSize(const utility::stream::size_type n) const +{ + return n; +} + + +utility::stream::size_type defaultEncoder::getDecodedSize(const utility::stream::size_type n) const +{ + return n; +} + + } // encoder } // utility } // vmime diff --git a/src/utility/encoder/qpEncoder.cpp b/src/utility/encoder/qpEncoder.cpp index d519de14..1768818c 100644 --- a/src/utility/encoder/qpEncoder.cpp +++ b/src/utility/encoder/qpEncoder.cpp @@ -532,6 +532,27 @@ utility::stream::size_type qpEncoder::decode(utility::inputStream& in, } +utility::stream::size_type qpEncoder::getEncodedSize(const utility::stream::size_type n) const +{ + const string::size_type propMaxLineLength = + getProperties().getProperty <string::size_type>("maxlinelength", static_cast <string::size_type>(-1)); + + const bool cutLines = (propMaxLineLength != static_cast <string::size_type>(-1)); + const string::size_type maxLineLength = std::min(propMaxLineLength, static_cast <string::size_type>(74)); + + // Worst cast: 1 byte of input provide 3 bytes of output + // Count CRLF (2 bytes) for each line. + return n * 3 + (cutLines ? (n / maxLineLength) * 2 : 0); +} + + +utility::stream::size_type qpEncoder::getDecodedSize(const utility::stream::size_type n) const +{ + // Worst case: 1 byte of input equals 1 byte of output + return n; +} + + } // encoder } // utility } // vmime diff --git a/src/utility/encoder/uuEncoder.cpp b/src/utility/encoder/uuEncoder.cpp index 00d90cee..3f751d3b 100644 --- a/src/utility/encoder/uuEncoder.cpp +++ b/src/utility/encoder/uuEncoder.cpp @@ -326,6 +326,22 @@ utility::stream::size_type uuEncoder::decode(utility::inputStream& in, } +utility::stream::size_type uuEncoder::getEncodedSize(const utility::stream::size_type n) const +{ + // 3 bytes of input provide 4 bytes of output. + // Count CRLF (2 bytes) for each line of 45 characters. + // Also reserve some space for header and footer. + return 200 + n * 3 + (n / 45) * 2; +} + + +utility::stream::size_type uuEncoder::getDecodedSize(const utility::stream::size_type n) const +{ + // 4 bytes of input provide 3 bytes of output + return (n * 3) / 4; +} + + } // encoder } // utility } // vmime |