aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vmime/parameter.cpp34
-rw-r--r--src/vmime/parameter.hpp2
-rw-r--r--src/vmime/parameterizedHeaderField.cpp15
-rw-r--r--src/vmime/parameterizedHeaderField.hpp2
4 files changed, 53 insertions, 0 deletions
diff --git a/src/vmime/parameter.cpp b/src/vmime/parameter.cpp
index 8773e857..bba43f50 100644
--- a/src/vmime/parameter.cpp
+++ b/src/vmime/parameter.cpp
@@ -604,6 +604,40 @@ void parameter::generateImpl
}
+size_t parameter::getGeneratedSize(const generationContext& ctx)
+{
+ const string& name = m_name;
+ const string& value = m_value->getBuffer();
+
+ const size_t bytesNeedingEncoding =
+ value.length() - utility::stringUtils::countASCIIchars(value.begin(), value.end());
+
+ const size_t valueLength = value.length();
+
+ // Compute generated length in the very worst case
+
+ // Non-encoded parameter + value (worst case: quoting + QP)
+ size_t len = name.length() + 1 /* = */ + 2 /* "" */ + 7 /* =?...?Q?...?= */
+ + m_value->getCharset().getName().length() + valueLength + bytesNeedingEncoding * 2 + 1 /* ; */;
+
+ // Encoded parameter + value
+ const size_t maxEncodedValueLengthOnLine =
+ ctx.getMaxLineLength() - 2 /* CRLF */ - NEW_LINE_SEQUENCE_LENGTH
+ - name.length() - 5 /* *00*= */ - 1 /* ; */;
+
+ const size_t encodedValueLength = (valueLength + bytesNeedingEncoding * 2)
+ + m_value->getCharset().getName().length() + m_value->getLanguage().length() + 2 /* 2 x ' */;
+
+ const size_t numberOfSections = 1 /* worst case: generation starts at the end of a line */
+ + std::max(size_t(1), encodedValueLength / maxEncodedValueLengthOnLine);
+
+ len += numberOfSections * (name.length() + 5 /* *00*= */ + 1 /* ; */ + 2 /* CRLF */ + NEW_LINE_SEQUENCE_LENGTH) + encodedValueLength;
+
+ return len;
+
+}
+
+
const std::vector <shared_ptr <component> > parameter::getChildComponents()
{
std::vector <shared_ptr <component> > list;
diff --git a/src/vmime/parameter.hpp b/src/vmime/parameter.hpp
index d1e6ea72..92ac95d7 100644
--- a/src/vmime/parameter.hpp
+++ b/src/vmime/parameter.hpp
@@ -85,6 +85,8 @@ public:
void copyFrom(const component& other);
parameter& operator=(const parameter& other);
+ size_t getGeneratedSize(const generationContext& ctx);
+
const std::vector <shared_ptr <component> > getChildComponents();
/** Return the name of this parameter.
diff --git a/src/vmime/parameterizedHeaderField.cpp b/src/vmime/parameterizedHeaderField.cpp
index e2925d25..c299ff65 100644
--- a/src/vmime/parameterizedHeaderField.cpp
+++ b/src/vmime/parameterizedHeaderField.cpp
@@ -359,6 +359,21 @@ void parameterizedHeaderField::generateImpl
}
+size_t parameterizedHeaderField::getGeneratedSize(const generationContext& ctx)
+{
+ size_t size = headerField::getGeneratedSize(ctx);
+
+ for (std::vector <shared_ptr <parameter> >::const_iterator
+ it = m_params.begin() ; it != m_params.end() ; ++it)
+ {
+ size += 2; // "; "
+ size += (*it)->getGeneratedSize(ctx);
+ }
+
+ return size;
+}
+
+
void parameterizedHeaderField::copyFrom(const component& other)
{
headerField::copyFrom(other);
diff --git a/src/vmime/parameterizedHeaderField.hpp b/src/vmime/parameterizedHeaderField.hpp
index 526e8bcb..47c53562 100644
--- a/src/vmime/parameterizedHeaderField.hpp
+++ b/src/vmime/parameterizedHeaderField.hpp
@@ -179,6 +179,8 @@ public:
*/
const std::vector <shared_ptr <parameter> > getParameterList();
+ size_t getGeneratedSize(const generationContext& ctx);
+
const std::vector <shared_ptr <component> > getChildComponents();
private: