diff --git a/src/exif.cpp b/src/exif.cpp index 99e3446a..c1e04ef0 100644 --- a/src/exif.cpp +++ b/src/exif.cpp @@ -155,6 +155,12 @@ namespace Exiv2 { return Exiv2::setValue(*this, value); } + Exifdatum& Exifdatum::operator=(const Value& value) + { + setValue(&value); + return *this; + } + void Exifdatum::setValue(const Value* pValue) { value_.reset(); @@ -168,10 +174,10 @@ namespace Exiv2 { value_->setDataArea(e.dataArea(), e.sizeDataArea()); } - void Exifdatum::setValue(const std::string& buf) + void Exifdatum::setValue(const std::string& value) { if (value_.get() == 0) value_ = Value::create(asciiString); - value_->read(buf); + value_->read(value); } int TiffThumbnail::setDataArea(ExifData& exifData, Ifd& ifd1, diff --git a/src/exif.hpp b/src/exif.hpp index 4cca64bc..5b6db5cd 100644 --- a/src/exif.hpp +++ b/src/exif.hpp @@ -62,7 +62,8 @@ namespace Exiv2 { // class definitions /*! - @brief Information related to one Exif tag. + @brief Information related to one Exif tag. An Exif metadatum consists of + an ExifKey and a Value and provides methods to manipulate these. */ class Exifdatum : public Metadatum { friend std::ostream& operator<<(std::ostream&, const Exifdatum&); @@ -95,62 +96,60 @@ namespace Exiv2 { //! Assignment operator Exifdatum& operator=(const Exifdatum& rhs); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - AsciiValue value is created and set to \em value. - */ - Exifdatum& operator=(const std::string& value); - /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - UShortValue value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to UShortValue. */ Exifdatum& operator=(const uint16_t& value); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - ULongValue value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to ULongValue. */ Exifdatum& operator=(const uint32_t& value); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - URational value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to URationalValue. */ Exifdatum& operator=(const URational& value); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - ShortValue value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to ShortValue. */ Exifdatum& operator=(const int16_t& value); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - LongValue value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to LongValue. */ Exifdatum& operator=(const int32_t& value); /*! - @brief Assign \em value to the %Exifdatum. If the object already has a - value, it is replaced with \em value. Otherwise a new - Rational value is created and set to \em value. + @brief Assign \em value to the %Exifdatum. The type of the new Value + is set to RationalValue. */ Exifdatum& operator=(const Rational& value); + /*! + @brief Assign \em value to the %Exifdatum. + Calls setValue(const std::string&). + */ + Exifdatum& operator=(const std::string& value); + /*! + @brief Assign \em value to the %Exifdatum. + Calls setValue(const Value*). + */ + Exifdatum& operator=(const Value& value); /*! @brief Set the value. This method copies (clones) the value pointed to by \em pValue. */ void setValue(const Value* pValue); /*! - @brief Set the value from an IFD entry. + @brief Set the value to the string \em value. + Uses Value::read(const std::string&). If the %Exifdatum + does not have a value yet, then an AsciiValue is created. */ - void setValue(const Entry& e, ByteOrder byteOrder); + void setValue(const std::string& value); /*! - @brief Set the value to the string \em buf. - Uses Value::read(const std::string& buf). If the %Exifdatum does - not have a value yet, then an AsciiValue is created. + @brief Set the value from an IFD entry. */ - void setValue(const std::string& buf); + void setValue(const Entry& e, ByteOrder byteOrder); /*! @brief Set the data area by copying (cloning) the buffer pointed to by \em buf. @@ -897,15 +896,10 @@ namespace Exiv2 { template Exifdatum& setValue(Exifdatum& exifDatum, const T& value) { - if (exifDatum.value_.get() == 0) { - std::auto_ptr > v - = std::auto_ptr >(new ValueType); - v->value_.push_back(value); - exifDatum.value_ = v; - } - else { - exifDatum.value_->read(Exiv2::toString(value)); - } + std::auto_ptr > v + = std::auto_ptr >(new ValueType); + v->value_.push_back(value); + exifDatum.value_ = v; return exifDatum; } /*! diff --git a/src/iptc.cpp b/src/iptc.cpp index 9bb1c216..420a1fa8 100644 --- a/src/iptc.cpp +++ b/src/iptc.cpp @@ -96,6 +96,12 @@ namespace Exiv2 { return *this; } + Iptcdatum& Iptcdatum::operator=(const Value& value) + { + setValue(&value); + return *this; + } + void Iptcdatum::setValue(const Value* pValue) { modified_ = true; @@ -103,19 +109,13 @@ namespace Exiv2 { if (pValue) value_ = pValue->clone(); } - void Iptcdatum::setValue(const std::string& buf) + void Iptcdatum::setValue(const std::string& value) { - Value::AutoPtr value; - try { + if (value_.get() == 0) { TypeId type = IptcDataSets::dataSetType(tag(), record()); - value = Value::create(type); - } - catch (const Error&) { - // Default to a StringValue if the type is unknown or the parse fails - value = Value::create(string); + value_ = Value::create(type); } - value->read(buf); - value_ = value; + value_->read(value); modified_ = true; } @@ -213,18 +213,9 @@ namespace Exiv2 { const byte* data, uint32_t sizeData) { Value::AutoPtr value; - try { - // If the type is unknown or the parse fails then - // default to undefined type below. - TypeId type = IptcDataSets::dataSetType(dataSet, record); - value = Value::create(type); - value->read(data, sizeData, bigEndian); - } - catch (const Error&) { - // Default to loading as raw bytes - value = Value::create(undefined); - value->read(data, sizeData, bigEndian); - } + TypeId type = IptcDataSets::dataSetType(dataSet, record); + value = Value::create(type); + value->read(data, sizeData, bigEndian); IptcKey key(dataSet, record); add(key, value.get()); return 0; diff --git a/src/iptc.hpp b/src/iptc.hpp index c9bf527e..bdde1fd6 100644 --- a/src/iptc.hpp +++ b/src/iptc.hpp @@ -49,7 +49,8 @@ namespace Exiv2 { // class definitions /*! - @brief Information related to one Iptc dataset. + @brief Information related to one Iptc dataset. An Iptc metadatum consists + of an IptcKey and a Value and provides methods to manipulate these. */ class Iptcdatum : public Metadatum { public: @@ -80,28 +81,34 @@ namespace Exiv2 { //! Assignment operator Iptcdatum& operator=(const Iptcdatum& rhs); /*! - @brief Assign \em value to the %Iptcdatum. The type of the new value - is determined from %Iptcdatum. If that fails, a StringValue is - used. Calls setValue(const std::string&). + @brief Assign \em value to the %Iptcdatum. The type of the new Value + is set to UShortValue. + */ + Iptcdatum& operator=(const uint16_t& value); + /*! + @brief Assign \em value to the %Iptcdatum. + Calls setValue(const std::string&). */ Iptcdatum& operator=(const std::string& value); /*! - @brief Assign \em value to the %Iptcdatum. The type of the new value - is set to UShortValue. + @brief Assign \em value to the %Iptcdatum. + Calls setValue(const Value*). */ - Iptcdatum& operator=(const uint16_t& value); + Iptcdatum& operator=(const Value& value); /*! - @brief Set the value. This method copies (clones) the value pointed - to by pValue. + @brief Set the Value. This method copies (clones) the %Value pointed + to by \em pValue. */ void setValue(const Value* pValue); /*! - @brief Set the value to the string buf. Uses Value::read(const - std::string& buf). If the %Iptcdatum does not have a value yet, - then a value of the correct type for this %Iptcdatum is - created. If that fails, a StringValue is created. + @brief Set the value to the string \em value, using + Value::read(const std::string&). + If the %Iptcdatum does not have a Value yet, then a %Value of + the correct type for this %Iptcdatum is created. If that + fails (because of an unknown dataset), a StringValue is + created. */ - void setValue(const std::string& buf); + void setValue(const std::string& value); //@} //! @name Accessors diff --git a/src/iptceasy.cpp b/src/iptceasy.cpp index dbd3faa7..0dea905e 100644 --- a/src/iptceasy.cpp +++ b/src/iptceasy.cpp @@ -10,7 +10,6 @@ void printIptc(const Exiv2::IptcData& iptcData); int main() try { - Exiv2::IptcData iptcData; iptcData["Iptc.Application2.Headline"] = "The headline I am"; @@ -21,10 +20,15 @@ try { iptcData["Iptc.Envelope.ModelVersion"] = 2; iptcData["Iptc.Envelope.TimeSent"] = "14:41:0-05:00"; iptcData["Iptc.Application2.RasterizedCaption"] = "230 42 34 2 90 84 23 146"; + iptcData["Iptc.0x0009.0x0001"] = "Who am I?"; + + Exiv2::StringValue value; + value.read("Hi there!"); + iptcData["Iptc.Envelope.ModelVersion"] = value; std::cout << "Time sent: " << iptcData["Iptc.Envelope.TimeSent"] << "\n\n"; - printIptc(iptcData); + printIptc(iptcData); return 0; }