diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/exception.cpp | 12 | ||||
| -rw-r--r-- | src/headerField.cpp | 11 | ||||
| -rw-r--r-- | src/headerFieldFactory.cpp | 15 |
3 files changed, 31 insertions, 7 deletions
diff --git a/src/exception.cpp b/src/exception.cpp index 85f1f4f3..a341c161 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -94,15 +94,15 @@ namespace exceptions // -// bad_field_type +// bad_field_value_type // -bad_field_type::~bad_field_type() throw() {} -bad_field_type::bad_field_type(const exception& other) - : exception("Bad field type.", other) {} +bad_field_value_type::~bad_field_value_type() throw() {} +bad_field_value_type::bad_field_value_type(const string& fieldName, const exception& other) + : exception("Bad value type for field '" + fieldName + "'.", other) {} -exception* bad_field_type::clone() const { return new bad_field_type(*this); } -const char* bad_field_type::name() const throw() { return "bad_field_type"; } +exception* bad_field_value_type::clone() const { return new bad_field_value_type(*this); } +const char* bad_field_value_type::name() const throw() { return "bad_field_value_type"; } diff --git a/src/headerField.cpp b/src/headerField.cpp index 0a17abac..59b10e76 100644 --- a/src/headerField.cpp +++ b/src/headerField.cpp @@ -26,6 +26,8 @@ #include "vmime/parserHelpers.hpp" +#include "vmime/exception.hpp" + namespace vmime { @@ -324,6 +326,9 @@ ref <headerFieldValue> headerField::getValue() void headerField::setValue(ref <headerFieldValue> value) { + if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, *value)) + throw exceptions::bad_field_value_type(getName()); + if (value != NULL) m_value = value; } @@ -331,12 +336,18 @@ void headerField::setValue(ref <headerFieldValue> value) void headerField::setValueConst(ref <const headerFieldValue> value) { + if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, *value)) + throw exceptions::bad_field_value_type(getName()); + m_value = value->clone().dynamicCast <headerFieldValue>(); } void headerField::setValue(const headerFieldValue& value) { + if (!headerFieldFactory::getInstance()->isValueTypeValid(*this, value)) + throw exceptions::bad_field_value_type(getName()); + m_value = value.clone().dynamicCast <headerFieldValue>(); } diff --git a/src/headerFieldFactory.cpp b/src/headerFieldFactory.cpp index e1c725c0..7e021f59 100644 --- a/src/headerFieldFactory.cpp +++ b/src/headerFieldFactory.cpp @@ -126,7 +126,7 @@ ref <headerFieldValue> headerFieldFactory::createValue(const string& fieldName) ref <headerFieldValue> value = NULL; if (pos != m_valueMap.end()) - value = ((*pos).second)(); + value = ((*pos).second.allocFunc)(); else value = registerer <headerFieldValue, text>::creator(); @@ -134,5 +134,18 @@ ref <headerFieldValue> headerFieldFactory::createValue(const string& fieldName) } +bool headerFieldFactory::isValueTypeValid + (const headerField& field, const headerFieldValue& value) const +{ + ValueMap::const_iterator pos = m_valueMap.find + (utility::stringUtils::toLower(field.getName())); + + if (pos != m_valueMap.end()) + return ((*pos).second.checkTypeFunc)(value); + + return true; // No info on this field +} + + } // vmime |
