#677: Avoid deleting Exif metadata from the container when writing.

v0.27.3
Andreas Huggel 16 years ago
parent ed6f195c7f
commit 2d91fb1f6d

@ -434,7 +434,7 @@ namespace Exiv2 {
: exifData_(exifData), : exifData_(exifData),
iptcData_(iptcData), iptcData_(iptcData),
xmpData_(xmpData), xmpData_(xmpData),
del_(true), count_(0),
pRoot_(pRoot), pRoot_(pRoot),
pSourceTree_(0), pSourceTree_(0),
byteOrder_(byteOrder), byteOrder_(byteOrder),
@ -555,7 +555,8 @@ namespace Exiv2 {
bool TiffEncoder::dirty() const bool TiffEncoder::dirty() const
{ {
if (dirty_ || exifData_.count() > 0) return true; assert(!(count_ > exifData_.count()));
if (dirty_ || count_ != exifData_.count()) return true;
return false; return false;
} }
@ -630,7 +631,7 @@ namespace Exiv2 {
if (!object->mn_) { if (!object->mn_) {
encodeTiffComponent(object); encodeTiffComponent(object);
} }
else if (del_) { else {
// The makernote is made up of decoded tags, delete binary tag // The makernote is made up of decoded tags, delete binary tag
ExifKey key(object->tag(), tiffGroupName(object->group())); ExifKey key(object->tag(), tiffGroupName(object->group()));
ExifData::iterator pos = exifData_.findKey(key); ExifData::iterator pos = exifData_.findKey(key);
@ -642,7 +643,7 @@ namespace Exiv2 {
{ {
assert(object != 0); assert(object != 0);
ExifData::iterator pos = exifData_.findKey(ExifKey("Exif.MakerNote.ByteOrder")); ExifData::const_iterator pos = exifData_.findKey(ExifKey("Exif.MakerNote.ByteOrder"));
if (pos != exifData_.end()) { if (pos != exifData_.end()) {
// Set Makernote byte order // Set Makernote byte order
ByteOrder bo = stringToByteOrder(pos->toString()); ByteOrder bo = stringToByteOrder(pos->toString());
@ -650,17 +651,15 @@ namespace Exiv2 {
object->setByteOrder(bo); object->setByteOrder(bo);
setDirty(); setDirty();
} }
if (del_) exifData_.erase(pos); ++count_;
} }
if (del_) { // Count remaining synthesized tags
// Remove remaining synthesized tags
static const char* synthesizedTags[] = { static const char* synthesizedTags[] = {
"Exif.MakerNote.Offset", "Exif.MakerNote.Offset",
}; };
for (unsigned int i = 0; i < EXV_COUNTOF(synthesizedTags); ++i) { for (unsigned int i = 0; i < EXV_COUNTOF(synthesizedTags); ++i) {
ExifData::iterator pos = exifData_.findKey(ExifKey(synthesizedTags[i])); ExifData::iterator pos = exifData_.findKey(ExifKey(synthesizedTags[i]));
if (pos != exifData_.end()) exifData_.erase(pos); if (pos != exifData_.end()) ++count_;
}
} }
// Modify encoder for Makernote peculiarities, byte order // Modify encoder for Makernote peculiarities, byte order
byteOrder_ = object->byteOrder(); byteOrder_ = object->byteOrder();
@ -718,7 +717,7 @@ namespace Exiv2 {
{ {
assert(object != 0); assert(object != 0);
ExifData::iterator pos = exifData_.end(); ExifData::const_iterator pos = exifData_.end();
const Exifdatum* ed = datum; const Exifdatum* ed = datum;
if (ed == 0) { if (ed == 0) {
// Non-intrusive writing: find matching tag // Non-intrusive writing: find matching tag
@ -761,9 +760,7 @@ namespace Exiv2 {
object->encode(*this, ed); object->encode(*this, ed);
} }
} }
if (del_ && pos != exifData_.end()) { if (pos != exifData_.end()) ++count_;
exifData_.erase(pos);
}
#ifdef DEBUG #ifdef DEBUG
std::cerr << "\n"; std::cerr << "\n";
#endif #endif
@ -965,10 +962,6 @@ namespace Exiv2 {
writeMethod_ = wmIntrusive; writeMethod_ = wmIntrusive;
pSourceTree_ = pSourceDir; pSourceTree_ = pSourceDir;
// Ensure that the exifData_ entries are not deleted, to be able to
// iterate over all remaining entries.
del_ = false;
ExifData::const_iterator posBo = exifData_.end(); ExifData::const_iterator posBo = exifData_.end();
for (ExifData::const_iterator i = exifData_.begin(); for (ExifData::const_iterator i = exifData_.begin();
i != exifData_.end(); ++i) { i != exifData_.end(); ++i) {

@ -493,7 +493,7 @@ namespace Exiv2 {
ExifData exifData_; //!< Copy of the Exif data to encode ExifData exifData_; //!< Copy of the Exif data to encode
const IptcData& iptcData_; //!< IPTC data to encode, just a reference const IptcData& iptcData_; //!< IPTC data to encode, just a reference
const XmpData& xmpData_; //!< XMP data to encode, just a reference const XmpData& xmpData_; //!< XMP data to encode, just a reference
bool del_; //!< Indicates if Exif data entries should be deleted after encoding long count_; //!< Counter for processed Exifdata elements
TiffComponent* pRoot_; //!< Root element of the composite TiffComponent* pRoot_; //!< Root element of the composite
TiffComponent* pSourceTree_; //!< Parsed source tree for reference TiffComponent* pSourceTree_; //!< Parsed source tree for reference
ByteOrder byteOrder_; //!< Byteorder for encoding ByteOrder byteOrder_; //!< Byteorder for encoding

Loading…
Cancel
Save