aboutsummaryrefslogtreecommitdiffstats
path: root/src/exiv2wrapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/exiv2wrapper.cpp')
-rw-r--r--src/exiv2wrapper.cpp205
1 files changed, 97 insertions, 108 deletions
diff --git a/src/exiv2wrapper.cpp b/src/exiv2wrapper.cpp
index cc2d455..d8ee8e5 100644
--- a/src/exiv2wrapper.cpp
+++ b/src/exiv2wrapper.cpp
@@ -41,58 +41,6 @@
namespace exiv2wrapper
{
-// Static helper function to set the values of an IptcData for a given key
-static void set_iptc_tag_values(const std::string& key,
- Exiv2::IptcData* metadata,
- const boost::python::list& values)
-{
- Exiv2::IptcKey iptcKey = Exiv2::IptcKey(key);
- unsigned int index = 0;
- unsigned int max = boost::python::len(values);
- Exiv2::IptcMetadata::iterator iterator = metadata->findKey(iptcKey);
- while (index < max)
- {
- std::string value = boost::python::extract<std::string>(values[index++]);
- if (iterator != metadata->end())
- {
- // Override an existing value
- iterator->setValue(value);
- // Jump to the next datum matching the key
- ++iterator;
- while ((iterator != metadata->end()) && (iterator->key() != key))
- {
- ++iterator;
- }
- }
- else
- {
- // Append a new value
- Exiv2::Iptcdatum datum(iptcKey);
- datum.setValue(value);
- int state = metadata->add(datum);
- if (state == 6)
- {
- throw Exiv2::Error(NON_REPEATABLE);
- }
- // Reset iterator that has been invalidated by appending a datum
- iterator = metadata->end();
- }
- }
- // Erase the remaining values if any
- while (iterator != metadata->end())
- {
- if (iterator->key() == key)
- {
- iterator = metadata->erase(iterator);
- }
- else
- {
- ++iterator;
- }
- }
-}
-
-
void Image::_instantiate_image()
{
// If an exception is thrown, it has to be done outside of the
@@ -281,13 +229,6 @@ const ExifTag Image::getExifTag(std::string key)
return ExifTag(key, &_exifData[key], &_exifData);
}
-void Image::setExifTagValue(std::string key, std::string value)
-{
- CHECK_METADATA_READ
-
- _exifData[key] = value;
-}
-
void Image::deleteExifTag(std::string key)
{
CHECK_METADATA_READ
@@ -335,13 +276,6 @@ const IptcTag Image::getIptcTag(std::string key)
return IptcTag(key, &_iptcData);
}
-void Image::setIptcTagValues(std::string key, boost::python::list values)
-{
- CHECK_METADATA_READ
-
- set_iptc_tag_values(key, &_iptcData, values);
-}
-
void Image::deleteIptcTag(std::string key)
{
CHECK_METADATA_READ
@@ -395,47 +329,6 @@ const XmpTag Image::getXmpTag(std::string key)
return XmpTag(key, &_xmpData[key]);
}
-void Image::setXmpTagTextValue(const std::string& key, const std::string& value)
-{
- CHECK_METADATA_READ
-
- _xmpData[key].setValue(value);
-}
-
-void Image::setXmpTagArrayValue(const std::string& key, const boost::python::list& values)
-{
- CHECK_METADATA_READ
-
- Exiv2::Xmpdatum& datum = _xmpData[key];
- // Reset the value
- datum.setValue(0);
-
- for(boost::python::stl_input_iterator<std::string> iterator(values);
- iterator != boost::python::stl_input_iterator<std::string>();
- ++iterator)
- {
- datum.setValue(*iterator);
- }
-}
-
-void Image::setXmpTagLangAltValue(const std::string& key, const boost::python::dict& values)
-{
- CHECK_METADATA_READ
-
- Exiv2::Xmpdatum& datum = _xmpData[key];
- // Reset the value
- datum.setValue(0);
-
- for(boost::python::stl_input_iterator<std::string> iterator(values);
- iterator != boost::python::stl_input_iterator<std::string>();
- ++iterator)
- {
- std::string key = *iterator;
- std::string value = boost::python::extract<std::string>(values.get(key));
- datum.setValue("lang=\"" + key + "\" " + value);
- }
-}
-
void Image::deleteXmpTag(std::string key)
{
CHECK_METADATA_READ
@@ -571,6 +464,15 @@ void ExifTag::setRawValue(const std::string& value)
_datum->setValue(value);
}
+void ExifTag::setParentImage(Image& image)
+{
+ _data = image.getExifData();
+ std::string value = _datum->toString();
+ delete _datum;
+ _datum = &(*_data)[_key.key()];
+ _datum->setValue(value);
+}
+
const std::string ExifTag::getKey()
{
return _key.key();
@@ -681,7 +583,58 @@ void IptcTag::setRawValues(const boost::python::list& values)
throw Exiv2::Error(NON_REPEATABLE);
}
- set_iptc_tag_values(_key.key(), _data, values);
+ unsigned int index = 0;
+ unsigned int max = boost::python::len(values);
+ Exiv2::IptcMetadata::iterator iterator = _data->findKey(_key);
+ while (index < max)
+ {
+ std::string value = boost::python::extract<std::string>(values[index++]);
+ if (iterator != _data->end())
+ {
+ // Override an existing value
+ iterator->setValue(value);
+ // Jump to the next datum matching the key
+ ++iterator;
+ while ((iterator != _data->end()) && (iterator->key() != _key.key()))
+ {
+ ++iterator;
+ }
+ }
+ else
+ {
+ // Append a new value
+ Exiv2::Iptcdatum datum(_key);
+ datum.setValue(value);
+ int state = _data->add(datum);
+ if (state == 6)
+ {
+ throw Exiv2::Error(NON_REPEATABLE);
+ }
+ // Reset iterator that has been invalidated by appending a datum
+ iterator = _data->end();
+ }
+ }
+ // Erase the remaining values if any
+ while (iterator != _data->end())
+ {
+ if (iterator->key() == _key.key())
+ {
+ iterator = _data->erase(iterator);
+ }
+ else
+ {
+ ++iterator;
+ }
+ }
+}
+
+void IptcTag::setParentImage(Image& image)
+{
+ const boost::python::list values = getRawValues();
+ delete _data;
+ _from_data = true;
+ _data = image.getIptcData();
+ setRawValues(values);
}
const std::string IptcTag::getKey()
@@ -820,6 +773,42 @@ void XmpTag::setLangAltValue(const boost::python::dict& values)
}
}
+void XmpTag::setParentImage(Image& image)
+{
+ switch (Exiv2::XmpProperties::propertyType(_key))
+ {
+ case Exiv2::xmpText:
+ {
+ const std::string value = getTextValue();
+ delete _datum;
+ _from_datum = true;
+ _datum = &(*image.getXmpData())[_key.key()];
+ setTextValue(value);
+ break;
+ }
+ case Exiv2::xmpAlt:
+ case Exiv2::xmpBag:
+ case Exiv2::xmpSeq:
+ {
+ const boost::python::list value = getArrayValue();
+ delete _datum;
+ _from_datum = true;
+ _datum = &(*image.getXmpData())[_key.key()];
+ setArrayValue(value);
+ break;
+ }
+ case Exiv2::langAlt:
+ {
+ const boost::python::dict value = getLangAltValue();
+ delete _datum;
+ _from_datum = true;
+ _datum = &(*image.getXmpData())[_key.key()];
+ setLangAltValue(value);
+ break;
+ }
+ }
+}
+
const std::string XmpTag::getKey()
{
return _key.key();