From ad23556fb6483ae515f9464c6e779dff8c7b5bd9 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sat, 9 Sep 2023 14:52:24 +0900 Subject: [PATCH] Fix FTBFS when using libexiv2 0.28.0. This resolves issue #3 Signed-off-by: Michele Calgaro --- ChangeLog | 4 +- libkexiv2/libkexiv2/kexiv2.cpp | 117 ++++++++++++++++++++++++-- libkexiv2/libkexiv2/kexiv2private.cpp | 18 +++- 3 files changed, 131 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0177835..2bfb575 100644 --- a/ChangeLog +++ b/ChangeLog @@ -65,8 +65,8 @@ V 0.1.6 - 2007-09-08 2007-08-21 20:48 cgilles * [r703058] libkexiv2/libkexiv2/kexiv2.cpp: - use EXIV2_TEST_VERSION instead EXIV2_CHECK_VERSION witch is - depreciate now + use EXIV2_TEST_VERSION instead EXIV2_CHECK_VERSION which is + deprecated now 2007-08-21 18:54 cgilles diff --git a/libkexiv2/libkexiv2/kexiv2.cpp b/libkexiv2/libkexiv2/kexiv2.cpp index 4c2bafe..a6b879c 100644 --- a/libkexiv2/libkexiv2/kexiv2.cpp +++ b/libkexiv2/libkexiv2/kexiv2.cpp @@ -198,9 +198,15 @@ TQByteArray KExiv2::getIptc(bool addIrbHeader) const c2 = Exiv2::IptcParser::encode(d->iptcMetadata); } +#if (EXIV2_TEST_VERSION(0,28,0)) + TQByteArray data(c2.size()); + if (data.size()) + memcpy(data.data(), c2.c_data(), c2.size()); +#else TQByteArray data(c2.size_); if (data.size()) memcpy(data.data(), c2.pData_, c2.size_); +#endif return data; } } @@ -271,7 +277,11 @@ bool KExiv2::load(const TQByteArray& imgData) try { +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((Exiv2::byte*)imgData.data(), imgData.size()); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((Exiv2::byte*)imgData.data(), imgData.size()); +#endif d->filePath = TQString(); image->readMetadata(); @@ -309,8 +319,13 @@ bool KExiv2::load(const TQString& filePath) try { +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((const char*) + (TQFile::encodeName(filePath))); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*) (TQFile::encodeName(filePath))); +#endif d->filePath = filePath; image->readMetadata(); @@ -368,8 +383,13 @@ bool KExiv2::save(const TQString& filePath) try { Exiv2::AccessMode mode; +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((const char*) + (TQFile::encodeName(filePath))); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*) (TQFile::encodeName(filePath))); +#endif // We need to load target file metadata to merge with new one. It's mandatory with TIFF format: // like all tiff file structure is based on Exif. @@ -459,8 +479,8 @@ bool KExiv2::save(const TQString& filePath) bool KExiv2::applyChanges() { if (d->filePath.isEmpty()) - return false; - + return false; + return save(d->filePath); } @@ -482,8 +502,13 @@ bool KExiv2::canWriteComment(const TQString& filePath) { try { +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((const char*) + (TQFile::encodeName(filePath))); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*) (TQFile::encodeName(filePath))); +#endif Exiv2::AccessMode mode = image->checkMode(Exiv2::mdComment); return (mode == Exiv2::amWrite || mode == Exiv2::amReadWrite); @@ -491,7 +516,7 @@ bool KExiv2::canWriteComment(const TQString& filePath) catch( Exiv2::Error &e ) { std::string s(e.what()); - tqDebug("%s (Error #%i: %s)", "Cannot check Comment access mode using Exiv2 ", e.code(), s.c_str()); + tqDebug("%s (Error #%i: %s)", "Cannot check Comment access mode using Exiv2 ", (int)e.code(), s.c_str()); } return false; @@ -501,8 +526,13 @@ bool KExiv2::canWriteExif(const TQString& filePath) { try { +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((const char*) + (TQFile::encodeName(filePath))); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*) (TQFile::encodeName(filePath))); +#endif Exiv2::AccessMode mode = image->checkMode(Exiv2::mdExif); return (mode == Exiv2::amWrite || mode == Exiv2::amReadWrite); @@ -510,7 +540,7 @@ bool KExiv2::canWriteExif(const TQString& filePath) catch( Exiv2::Error &e ) { std::string s(e.what()); - tqDebug("%s (Error #%i: %s)", "Cannot check Exif access mode using Exiv2 ", e.code(), s.c_str()); + tqDebug("%s (Error #%i: %s)", "Cannot check Exif access mode using Exiv2 ", (int)e.code(), s.c_str()); } return false; @@ -520,8 +550,13 @@ bool KExiv2::canWriteIptc(const TQString& filePath) { try { +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open((const char*) + (TQFile::encodeName(filePath))); +#else Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((const char*) (TQFile::encodeName(filePath))); +#endif Exiv2::AccessMode mode = image->checkMode(Exiv2::mdIptc); return (mode == Exiv2::amWrite || mode == Exiv2::amReadWrite); @@ -529,7 +564,7 @@ bool KExiv2::canWriteIptc(const TQString& filePath) catch( Exiv2::Error &e ) { std::string s(e.what()); - tqDebug("%s (Error #%i: %s)", "Cannot check Iptc access mode using Exiv2 ", e.code(), s.c_str()); + tqDebug("%s (Error #%i: %s)", "Cannot check Iptc access mode using Exiv2 ", (int)e.code(), s.c_str()); } return false; @@ -584,7 +619,11 @@ TQSize KExiv2::getImageDimensions() const try { +#if (EXIV2_TEST_VERSION(0,28,0)) + int64_t width=-1, height=-1; +#else long width=-1, height=-1; +#endif // Try to get Exif.Photo tags @@ -593,13 +632,25 @@ TQSize KExiv2::getImageDimensions() const Exiv2::ExifData::iterator it = exifData.findKey(key); if (it != exifData.end()) + { +#if (EXIV2_TEST_VERSION(0,28,0)) + width = it->toInt64(); +#else width = it->toLong(); +#endif + } Exiv2::ExifKey key2("Exif.Photo.PixelYDimension"); Exiv2::ExifData::iterator it2 = exifData.findKey(key2); if (it2 != exifData.end()) + { +#if (EXIV2_TEST_VERSION(0,28,0)) + height = it2->toInt64(); +#else height = it2->toLong(); +#endif + } if (width != -1 && height != -1) return TQSize(width, height); @@ -613,13 +664,25 @@ TQSize KExiv2::getImageDimensions() const Exiv2::ExifData::iterator it3 = exifData.findKey(key3); if (it3 != exifData.end()) + { +#if (EXIV2_TEST_VERSION(0,28,0)) + width = it3->toInt64(); +#else width = it3->toLong(); +#endif + } Exiv2::ExifKey key4("Exif.Image.ImageLength"); Exiv2::ExifData::iterator it4 = exifData.findKey(key4); if (it4 != exifData.end()) + { +#if (EXIV2_TEST_VERSION(0,28,0)) + height = it4->toInt64(); +#else height = it4->toLong(); +#endif + } if (width != -1 && height != -1) return TQSize(width, height); @@ -665,7 +728,11 @@ TQImage KExiv2::getExifThumbnail(bool fixOrientation) const { Exiv2::ExifThumbC thumb(d->exifMetadata); Exiv2::DataBuf const c1 = thumb.copy(); +#if (EXIV2_TEST_VERSION(0,28,0)) + thumbnail.loadFromData(c1.c_data(), c1.size()); +#else thumbnail.loadFromData(c1.pData_, c1.size_); +#endif if (!thumbnail.isNull()) { @@ -677,7 +744,11 @@ TQImage KExiv2::getExifThumbnail(bool fixOrientation) const if (it != exifData.end()) { TQWMatrix matrix; +#if (EXIV2_TEST_VERSION(0,28,0)) + int64_t orientation = it->toInt64(); +#else long orientation = it->toLong(); +#endif tqDebug("Exif Thumbnail Qt::Orientation: %i", (int)orientation); switch (orientation) @@ -777,7 +848,11 @@ KExiv2::ImageOrientation KExiv2::getImageOrientation() const { Exiv2::ExifData exifData(d->exifMetadata); Exiv2::ExifData::iterator it; +#if (EXIV2_TEST_VERSION(0,28,0)) + int64_t orientation; +#else long orientation; +#endif ImageOrientation imageOrient = ORIENTATION_NORMAL; // Because some camera set a wrong standard exif orientation tag, @@ -792,7 +867,11 @@ KExiv2::ImageOrientation KExiv2::getImageOrientation() const if (it != exifData.end()) { +#if (EXIV2_TEST_VERSION(0,28,0)) + orientation = it->toInt64(); +#else orientation = it->toLong(); +#endif tqDebug("Minolta Makernote Qt::Orientation: %i", (int)orientation); switch(orientation) { @@ -811,7 +890,11 @@ KExiv2::ImageOrientation KExiv2::getImageOrientation() const if (it != exifData.end()) { +#if (EXIV2_TEST_VERSION(0,28,0)) + orientation = it->toInt64(); +#else orientation = it->toLong(); +#endif tqDebug("Minolta Makernote Qt::Orientation: %i", (int)orientation); switch(orientation) { @@ -833,7 +916,11 @@ KExiv2::ImageOrientation KExiv2::getImageOrientation() const if (it != exifData.end()) { +#if (EXIV2_TEST_VERSION(0,28,0)) + orientation = it->toInt64(); +#else orientation = it->toLong(); +#endif tqDebug("Exif Qt::Orientation: %i", (int)orientation); return (ImageOrientation)orientation; } @@ -1305,7 +1392,11 @@ bool KExiv2::getExifTagLong(const char* exifTagName, long &val) const Exiv2::ExifData::iterator it = exifData.findKey(exifKey); if (it != exifData.end()) { +#if (EXIV2_TEST_VERSION(0,28,0)) + val = (long)it->toInt64(); +#else val = it->toLong(); +#endif return true; } } @@ -1829,7 +1920,11 @@ bool KExiv2::setGPSInfo(double altitude, double latitude, double longitude, bool // Do all the easy constant ones first. // GPSVersionID tag: standard says is should be four bytes: 02 00 00 00 // (and, must be present). +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Value::UniquePtr value = Exiv2::Value::create(Exiv2::unsignedByte); +#else Exiv2::Value::AutoPtr value = Exiv2::Value::create(Exiv2::unsignedByte); +#endif value->read("2 0 0 0"); d->exifMetadata.add(Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID"), value.get()); @@ -2097,7 +2192,11 @@ bool KExiv2::setImageKeywords(const TQStringList& oldKeywords, const TQStringLis TQString key = *it; key.truncate(64); +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Value::UniquePtr val = Exiv2::Value::create(Exiv2::string); +#else Exiv2::Value::AutoPtr val = Exiv2::Value::create(Exiv2::string); +#endif val->read(key.latin1()); iptcData.add(iptcTag, val.get()); } @@ -2180,7 +2279,11 @@ bool KExiv2::setImageSubjects(const TQStringList& oldSubjects, const TQStringLis TQString key = *it; key.truncate(236); +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Value::UniquePtr val = Exiv2::Value::create(Exiv2::string); +#else Exiv2::Value::AutoPtr val = Exiv2::Value::create(Exiv2::string); +#endif val->read(key.latin1()); iptcData.add(iptcTag, val.get()); } @@ -2264,7 +2367,11 @@ bool KExiv2::setImageSubCategories(const TQStringList& oldSubCategories, const T TQString key = *it; key.truncate(32); +#if (EXIV2_TEST_VERSION(0,28,0)) + Exiv2::Value::UniquePtr val = Exiv2::Value::create(Exiv2::string); +#else Exiv2::Value::AutoPtr val = Exiv2::Value::create(Exiv2::string); +#endif val->read(key.latin1()); iptcData.add(iptcTag, val.get()); } diff --git a/libkexiv2/libkexiv2/kexiv2private.cpp b/libkexiv2/libkexiv2/kexiv2private.cpp index f92776d..6377bb7 100644 --- a/libkexiv2/libkexiv2/kexiv2private.cpp +++ b/libkexiv2/libkexiv2/kexiv2private.cpp @@ -49,11 +49,19 @@ bool KExiv2Priv::setExif(Exiv2::DataBuf const data) { try { +#if (EXIV2_TEST_VERSION(0,28,0)) + if (data.size() != 0) + { + Exiv2::ExifParser::decode(exifMetadata, data.c_data(), data.size()); + return (!exifMetadata.empty()); + } +#else if (data.size_ != 0) { Exiv2::ExifParser::decode(exifMetadata, data.pData_, data.size_); return (!exifMetadata.empty()); } +#endif } catch( Exiv2::Error &e ) { @@ -70,11 +78,19 @@ bool KExiv2Priv::setIptc(Exiv2::DataBuf const data) { try { +#if (EXIV2_TEST_VERSION(0,28,0)) + if (data.size() != 0) + { + Exiv2::IptcParser::decode(iptcMetadata, data.c_data(), data.size()); + return (!iptcMetadata.empty()); + } +#else if (data.size_ != 0) { Exiv2::IptcParser::decode(iptcMetadata, data.pData_, data.size_); return (!iptcMetadata.empty()); } +#endif } catch( Exiv2::Error &e ) { @@ -90,7 +106,7 @@ bool KExiv2Priv::setIptc(Exiv2::DataBuf const data) void KExiv2Priv::printExiv2ExceptionError(const TQString& msg, Exiv2::Error& e) { std::string s(e.what()); - tqDebug("%s (Error #%i: %s)", msg.ascii(), e.code(), s.c_str()); + tqDebug("%s (Error #%i: %s)", msg.ascii(), (int)e.code(), s.c_str()); } TQString KExiv2Priv::convertCommentValue(const Exiv2::Exifdatum &exifDatum)