From 6785f15d9ed05ebc66ee200b3c94451c6c633646 Mon Sep 17 00:00:00 2001
From: Andreas Sturmlechner <asturm@gentoo.org>
Date: Sun, 3 Sep 2023 13:30:43 +0200
Subject: [PATCH] Fix 3.16.224 build with exiv2-0.28

Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
---
 ImageLounge/src/DkCore/DkMetaData.cpp | 59 ++++++++++++++++++---------
 ImageLounge/src/DkCore/DkMetaData.h   |  4 +-
 2 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/ImageLounge/src/DkCore/DkMetaData.cpp b/ImageLounge/src/DkCore/DkMetaData.cpp
index bf1d111e..5eaeebf4 100644
--- a/ImageLounge/src/DkCore/DkMetaData.cpp
+++ b/ImageLounge/src/DkCore/DkMetaData.cpp
@@ -73,8 +73,12 @@ void DkMetaDataT::readMetaData(const QString& filePath, QSharedPointer<QByteArra
 			mExifImg = Exiv2::ImageFactory::open(strFilePath);
 		}
 		else {
+#if EXIV2_TEST_VERSION(0, 28, 0)
+			mExifImg = Exiv2::ImageFactory::open((const byte *)ba->constData(), ba->size());
+#else
 			Exiv2::BasicIo::AutoPtr exifBuffer(new Exiv2::MemIo((const byte*)ba->constData(), ba->size()));
 			mExifImg = Exiv2::ImageFactory::open(exifBuffer);
+#endif
 		}
 	} 
 	catch (...) {
@@ -155,14 +159,18 @@ bool DkMetaDataT::saveMetaData(QSharedPointer<QByteArray>& ba, bool force) {
 	Exiv2::ExifData &exifData = mExifImg->exifData();
 	Exiv2::XmpData &xmpData = mExifImg->xmpData();
 	Exiv2::IptcData &iptcData = mExifImg->iptcData();
-
-	Exiv2::Image::AutoPtr exifImgN;
+	std::unique_ptr<Exiv2::Image> exifImgN;
+#if !EXIV2_TEST_VERSION(0, 28, 0)
 	Exiv2::MemIo::AutoPtr exifMem;
+#endif
 
 	try {
-
+#if EXIV2_TEST_VERSION(0, 28, 0)
+		exifImgN = Exiv2::ImageFactory::open((byte *)ba->data(), ba->size());
+#else
 		exifMem = Exiv2::MemIo::AutoPtr(new Exiv2::MemIo((byte*)ba->data(), ba->size()));
 		exifImgN = Exiv2::ImageFactory::open(exifMem);
+#endif
 	} 
 	catch (...) {
 
@@ -186,8 +194,13 @@ bool DkMetaDataT::saveMetaData(QSharedPointer<QByteArray>& ba, bool force) {
 
 	// now get the data again
 	Exiv2::DataBuf exifBuf = exifImgN->io().read((long)exifImgN->io().size());
+#if EXIV2_TEST_VERSION(0, 28, 0)
+	if (!exifBuf.empty()) {
+		QSharedPointer<QByteArray> tmp = QSharedPointer<QByteArray>(new QByteArray((const char *)exifBuf.c_data(), exifBuf.size()));
+#else
 	if (exifBuf.pData_) {
 		QSharedPointer<QByteArray> tmp = QSharedPointer<QByteArray>(new QByteArray((const char*)exifBuf.pData_, exifBuf.size_));
+#endif
 
 		if (tmp->size() > qRound(ba->size()*0.5f))
 			ba = tmp;
@@ -197,7 +210,7 @@ bool DkMetaDataT::saveMetaData(QSharedPointer<QByteArray>& ba, bool force) {
 	else
 		return false;
 
-	mExifImg = exifImgN;
+	mExifImg.swap(exifImgN);
 	mExifState = loaded;
 
 	return true;
@@ -250,7 +263,7 @@ int DkMetaDataT::getOrientationDegree() const {
 
 			if (pos != exifData.end() && pos->count() != 0) {
 			
-				Exiv2::Value::AutoPtr v = pos->getValue();
+				std::unique_ptr<Exiv2::Value> v = pos->getValue();
 				orientation = (int)pos->toFloat();
 
 				switch (orientation) {
@@ -315,7 +328,7 @@ int DkMetaDataT::getRating() const {
 		Exiv2::ExifData::iterator pos = exifData.findKey(key);
 
 		if (pos != exifData.end() && pos->count() != 0) {
-			Exiv2::Value::AutoPtr v = pos->getValue();
+			std::unique_ptr<Exiv2::Value> v = pos->getValue();
 			exifRating = v->toFloat();
 		}
 	}
@@ -327,7 +340,7 @@ int DkMetaDataT::getRating() const {
 
 		//xmp Rating tag
 		if (pos != xmpData.end() && pos->count() != 0) {
-			Exiv2::Value::AutoPtr v = pos->getValue();
+			std::unique_ptr<Exiv2::Value> v = pos->getValue();
 			xmpRating = v->toFloat();
 		}
 
@@ -336,7 +349,7 @@ int DkMetaDataT::getRating() const {
 			key = Exiv2::XmpKey("Xmp.MicrosoftPhoto.Rating");
 			pos = xmpData.findKey(key);
 			if (pos != xmpData.end() && pos->count() != 0) {
-				Exiv2::Value::AutoPtr v = pos->getValue();
+				std::unique_ptr<Exiv2::Value> v = pos->getValue();
 				xmpRating = v->toFloat();
 			}
 		}
@@ -399,7 +412,7 @@ QString DkMetaDataT::getNativeExifValue(const QString& key) const {
 			if (pos->count () < 2000) {	// diem: this is about performance - adobe obviously embeds whole images into tiff exiv data 
 
 				//qDebug() << "pos count: " << pos->count();
-				//Exiv2::Value::AutoPtr v = pos->getValue();
+				//std::unique_ptr<Exiv2::Value> v = pos->getValue();
 				info = exiv2ToQString(pos->toString());
 
 			}
@@ -436,7 +449,7 @@ QString DkMetaDataT::getXmpValue(const QString& key) const {
 		}
 
 		if (pos != xmpData.end() && pos->count() != 0) {
-			Exiv2::Value::AutoPtr v = pos->getValue();
+			std::unique_ptr<Exiv2::Value> v = pos->getValue();
 			info = exiv2ToQString(pos->toString());
 		}
 	}
@@ -478,7 +491,7 @@ QString DkMetaDataT::getExifValue(const QString& key) const {
 		}
 
 		if (pos != exifData.end() && pos->count() != 0) {
-			//Exiv2::Value::AutoPtr v = pos->getValue();
+			//std::unique_ptr<Exiv2::Value> v = pos->getValue();
 			info = exiv2ToQString(pos->toString());
 		}
 	}
@@ -508,7 +521,7 @@ QString DkMetaDataT::getIptcValue(const QString& key) const {
 		}
 
 		if (pos != iptcData.end() && pos->count() != 0) {
-			Exiv2::Value::AutoPtr v = pos->getValue();
+			std::unique_ptr<Exiv2::Value> v = pos->getValue();
 			info = exiv2ToQString(pos->toString());
 		}
 	}
@@ -653,8 +666,11 @@ QImage DkMetaDataT::getThumbnail() const {
 	try {
 		Exiv2::ExifThumb thumb(exifData);
 		Exiv2::DataBuf buffer = thumb.copy();
-
+#if EXIV2_TEST_VERSION(0, 28, 0)
+		QByteArray ba = QByteArray((char *)buffer.c_data(), buffer.size());
+#else
 		QByteArray ba = QByteArray((char*)buffer.pData_, buffer.size_);
+#endif
 		qThumb.loadFromData(ba);
 	}
 	catch (...) {
@@ -931,9 +947,12 @@ void DkMetaDataT::setThumbnail(QImage thumb) {
 
 		try {
 			// whipe all exif data of the thumbnail
+#if EXIV2_TEST_VERSION(0, 28, 0)
+			Exiv2::Image::UniquePtr exifImgThumb = Exiv2::ImageFactory::open((const byte *)ba.constData(), ba.size());
+#else
 			Exiv2::MemIo::AutoPtr exifBufferThumb(new Exiv2::MemIo((const byte*)ba.constData(), ba.size()));
 			Exiv2::Image::AutoPtr exifImgThumb = Exiv2::ImageFactory::open(exifBufferThumb);
-
+#endif
 			if (exifImgThumb.get() != 0 && exifImgThumb->good())
 				exifImgThumb->clearExifData();
 		}
@@ -1045,11 +1064,11 @@ void DkMetaDataT::setOrientation(int o) {
 		pos = exifData.findKey(key);
 	}
 
-	Exiv2::Value::AutoPtr v = pos->getValue();
+	std::unique_ptr<Exiv2::Value> v = pos->getValue();
 	Exiv2::UShortValue* prv = dynamic_cast<Exiv2::UShortValue*>(v.release());
 	if (!prv) return;
 
-	Exiv2::UShortValue::AutoPtr rv = Exiv2::UShortValue::AutoPtr(prv);
+	std::unique_ptr<Exiv2::UShortValue> rv = std::unique_ptr<Exiv2::UShortValue>(prv);
 	if (rv->value_.empty())	return;
 
 	orientation = (int) rv->value_[0];
@@ -1110,7 +1129,7 @@ void DkMetaDataT::setRating(int r) {
 		exifData["Exif.Image.Rating"] = uint16_t(r);
 		exifData["Exif.Image.RatingPercent"] = uint16_t(r);
 
-		Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::xmpText);
+		std::unique_ptr<Exiv2::Value> v = Exiv2::Value::create(Exiv2::xmpText);
 		v->read(sRating);
 		xmpData.add(Exiv2::XmpKey("Xmp.xmp.Rating"), v.get());
 		v->read(sRatingPercent);
@@ -1354,9 +1373,9 @@ DkRotatingRect DkMetaDataT::getXMPRect(const QSize& size) const {
 	return DkRotatingRect(rr);
 }
 
-Exiv2::Image::AutoPtr DkMetaDataT::loadSidecar(const QString& filePath) const {
+std::unique_ptr<Exiv2::Image> DkMetaDataT::loadSidecar(const QString& filePath) const {
 
-	Exiv2::Image::AutoPtr xmpImg;
+	std::unique_ptr<Exiv2::Image> xmpImg;
 
 	//TODO: check if the file type supports xmp
 
@@ -1409,7 +1428,7 @@ bool DkMetaDataT::setXMPValue(Exiv2::XmpData& xmpData, QString xmpKey, QString x
 				setXMPValueSuccessful = true;
 		}
 		else {
-			Exiv2::Value::AutoPtr v = Exiv2::Value::create(Exiv2::xmpText);
+			std::unique_ptr<Exiv2::Value> v = Exiv2::Value::create(Exiv2::xmpText);
 			if (!v->read(xmpValue.toStdString())) {
 				if (!xmpData.add(Exiv2::XmpKey(key), v.get()))
 					setXMPValueSuccessful = true;
diff --git a/ImageLounge/src/DkCore/DkMetaData.h b/ImageLounge/src/DkCore/DkMetaData.h
index c1f73c93..183a906a 100644
--- a/ImageLounge/src/DkCore/DkMetaData.h
+++ b/ImageLounge/src/DkCore/DkMetaData.h
@@ -148,7 +148,7 @@ public:
 
 protected:
 	
-	Exiv2::Image::AutoPtr loadSidecar(const QString& filePath) const;
+	std::unique_ptr<Exiv2::Image> loadSidecar(const QString& filePath) const;
 
 	enum {
 		not_loaded,
@@ -157,7 +157,7 @@ protected:
 		dirty,
 	};
 
-	Exiv2::Image::AutoPtr mExifImg;
+	std::unique_ptr<Exiv2::Image> mExifImg;
 	QString mFilePath;
 	QStringList mQtKeys;
 	QStringList mQtValues;
-- 
2.42.0

