aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/exception.cpp12
-rw-r--r--src/headerField.cpp11
-rw-r--r--src/headerFieldFactory.cpp15
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