Blob Blame History Raw
From 61543b42289fc986e580f2e3443719f3334f17b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
Date: Sun, 30 Dec 2018 02:46:28 +0100
Subject: [PATCH 07/15] Use forward declaration for Exiv2::Image, port to
 std::unique_ptr

Summary:
Instead of the Exiv2::Image::AutoPtr typedef just use a forward declaration
for Exiv2::Image, and use std::unique_ptr instead of std::auto_ptr.

The forward declaration avoids pulling in Exiv2 declarations everywhere,
e.g. via document.h.

Although it would be possible to use std::auto_ptr, unique_ptr is
preferable for two reasons:
- ownership transfer is explicit (std::move, release()/reset())
- Exiv2 0.28 will use std::unique_ptr as well, i.e. the code is forward
compatible.

Reviewers: #gwenview, cfeck, ngraham

Reviewed By: #gwenview, ngraham

Subscribers: lbeltrame, ngraham, asturmlechner, shubham

Tags: #gwenview

Differential Revision: https://phabricator.kde.org/D17872
---
 lib/cms/cmsprofile.cpp                |  3 +++
 lib/cms/cmsprofile.h                  |  8 +++++---
 lib/document/abstractdocumentimpl.cpp |  5 +++--
 lib/document/abstractdocumentimpl.h   |  7 ++++++-
 lib/document/document.cpp             |  7 +++++--
 lib/document/document.h               | 11 ++++++++---
 lib/document/document_p.h             | 10 +++++++++-
 lib/document/loadingdocumentimpl.cpp  |  7 +++++--
 lib/exiv2imageloader.cpp              | 13 ++++++-------
 lib/exiv2imageloader.h                | 11 ++++++++---
 lib/jpegcontent.cpp                   | 10 +++++-----
 lib/timeutils.cpp                     |  8 +++++---
 tests/auto/cmsprofiletest.cpp         |  4 ++--
 tests/auto/imagemetainfomodeltest.cpp |  9 +++++++--
 14 files changed, 77 insertions(+), 36 deletions(-)

diff --git a/lib/cms/cmsprofile.cpp b/lib/cms/cmsprofile.cpp
index 188b90a4..7d2b753e 100644
--- a/lib/cms/cmsprofile.cpp
+++ b/lib/cms/cmsprofile.cpp
@@ -42,6 +42,9 @@ extern "C" {
 // lcms
 #include <lcms2.h>
 
+// Exiv2
+#include <exiv2/exiv2.hpp>
+
 // X11
 #ifdef HAVE_X11
 #include <X11/Xlib.h>
diff --git a/lib/cms/cmsprofile.h b/lib/cms/cmsprofile.h
index a2a38a87..06c7672d 100644
--- a/lib/cms/cmsprofile.h
+++ b/lib/cms/cmsprofile.h
@@ -29,12 +29,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 #include <QExplicitlySharedDataPointer>
 #include <QSharedData>
 
-// Exiv2
-#include <exiv2/image.hpp>
-
 class QByteArray;
 class QString;
 
+namespace Exiv2
+{
+    class Image;
+}
+
 typedef void* cmsHPROFILE;
 
 namespace Gwenview
diff --git a/lib/document/abstractdocumentimpl.cpp b/lib/document/abstractdocumentimpl.cpp
index d841ae5f..d3d0002c 100644
--- a/lib/document/abstractdocumentimpl.cpp
+++ b/lib/document/abstractdocumentimpl.cpp
@@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 // Self
 #include "abstractdocumentimpl.h"
 
+#include <exiv2/exiv2.hpp>
 // Qt
 
 // KDE
@@ -77,9 +78,9 @@ void AbstractDocumentImpl::setDocumentKind(MimeTypeUtils::Kind kind)
     d->mDocument->setKind(kind);
 }
 
-void AbstractDocumentImpl::setDocumentExiv2Image(Exiv2::Image::AutoPtr image)
+void AbstractDocumentImpl::setDocumentExiv2Image(std::unique_ptr<Exiv2::Image> image)
 {
-    d->mDocument->setExiv2Image(image);
+    d->mDocument->setExiv2Image(std::move(image));
 }
 
 void AbstractDocumentImpl::setDocumentDownSampledImage(const QImage& image, int invertedZoom)
diff --git a/lib/document/abstractdocumentimpl.h b/lib/document/abstractdocumentimpl.h
index 1f427e60..86e6bfd2 100644
--- a/lib/document/abstractdocumentimpl.h
+++ b/lib/document/abstractdocumentimpl.h
@@ -34,6 +34,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 class QImage;
 class QRect;
 
+namespace Exiv2
+{
+    class Image;
+}
+
 namespace Gwenview
 {
 
@@ -108,7 +113,7 @@ protected:
     void setDocumentImageSize(const QSize& size);
     void setDocumentKind(MimeTypeUtils::Kind);
     void setDocumentFormat(const QByteArray& format);
-    void setDocumentExiv2Image(Exiv2::Image::AutoPtr);
+    void setDocumentExiv2Image(std::unique_ptr<Exiv2::Image>);
     void setDocumentDownSampledImage(const QImage&, int invertedZoom);
     void setDocumentCmsProfile(Cms::Profile::Ptr profile);
     void setDocumentErrorString(const QString&);
diff --git a/lib/document/document.cpp b/lib/document/document.cpp
index 18756700..afa9ed03 100644
--- a/lib/document/document.cpp
+++ b/lib/document/document.cpp
@@ -31,6 +31,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #include <KLocalizedString>
 #include <KJobUiDelegate>
 
+// Exiv2
+#include <exiv2/exiv2.hpp>
+
 // Local
 #include "documentjob.h"
 #include "emptydocumentimpl.h"
@@ -388,9 +391,9 @@ AbstractDocumentEditor* Document::editor()
     return d->mImpl->editor();
 }
 
-void Document::setExiv2Image(Exiv2::Image::AutoPtr image)
+void Document::setExiv2Image(std::unique_ptr<Exiv2::Image> image)
 {
-    d->mExiv2Image = image;
+    d->mExiv2Image = std::move(image);
     d->mImageMetaInfoModel.setExiv2Image(d->mExiv2Image.get());
     emit metaInfoUpdated();
 }
diff --git a/lib/document/document.h b/lib/document/document.h
index c0bb454b..4b40a6e1 100644
--- a/lib/document/document.h
+++ b/lib/document/document.h
@@ -22,8 +22,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 #include <lib/gwenviewlib_export.h>
 
-#include <string.h>
-#include <exiv2/image.hpp>
+// STL
+#include <memory>
 
 // Qt
 #include <QObject>
@@ -43,6 +43,11 @@ class QUndoStack;
 class KJob;
 class QUrl;
 
+namespace Exiv2
+{
+    class Image;
+}
+
 namespace Gwenview
 {
 
@@ -235,7 +240,7 @@ private:
     void setKind(MimeTypeUtils::Kind);
     void setFormat(const QByteArray&);
     void setSize(const QSize&);
-    void setExiv2Image(Exiv2::Image::AutoPtr);
+    void setExiv2Image(std::unique_ptr<Exiv2::Image>);
     void setDownSampledImage(const QImage&, int invertedZoom);
     void switchToImpl(AbstractDocumentImpl* impl);
     void setErrorString(const QString&);
diff --git a/lib/document/document_p.h b/lib/document/document_p.h
index 78e0ac6e..4de25f15 100644
--- a/lib/document/document_p.h
+++ b/lib/document/document_p.h
@@ -21,6 +21,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 #ifndef DOCUMENT_P_H
 #define DOCUMENT_P_H
 
+// STL
+#include <memory>
+
 // Local
 #include <imagemetainfomodel.h>
 #include <document/documentjob.h>
@@ -34,6 +37,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 #include <QUndoStack>
 #include <QPointer>
 
+namespace Exiv2
+{
+    class Image;
+}
+
 namespace Gwenview
 {
 
@@ -54,7 +62,7 @@ struct DocumentPrivate
     QSize mSize;
     QImage mImage;
     QMap<int, QImage> mDownSampledImageMap;
-    Exiv2::Image::AutoPtr mExiv2Image;
+    std::unique_ptr<Exiv2::Image> mExiv2Image;
     MimeTypeUtils::Kind mKind;
     QByteArray mFormat;
     ImageMetaInfoModel mImageMetaInfoModel;
diff --git a/lib/document/loadingdocumentimpl.cpp b/lib/document/loadingdocumentimpl.cpp
index 07675783..766a1831 100644
--- a/lib/document/loadingdocumentimpl.cpp
+++ b/lib/document/loadingdocumentimpl.cpp
@@ -24,6 +24,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 // STL
 #include <memory>
 
+// Exiv2
+#include <exiv2/exiv2.hpp>
+
 // Qt
 #include <QBuffer>
 #include <QByteArray>
@@ -100,7 +103,7 @@ struct LoadingDocumentImplPrivate
     QByteArray mData;
     QByteArray mFormat;
     QSize mImageSize;
-    Exiv2::Image::AutoPtr mExiv2Image;
+    std::unique_ptr<Exiv2::Image> mExiv2Image;
     std::unique_ptr<JpegContent> mJpegContent;
     QImage mImage;
     Cms::Profile::Ptr mCmsProfile;
@@ -486,7 +489,7 @@ void LoadingDocumentImpl::slotMetaInfoLoaded()
 
     setDocumentFormat(d->mFormat);
     setDocumentImageSize(d->mImageSize);
-    setDocumentExiv2Image(d->mExiv2Image);
+    setDocumentExiv2Image(std::move(d->mExiv2Image));
     setDocumentCmsProfile(d->mCmsProfile);
 
     d->mMetaInfoLoaded = true;
diff --git a/lib/exiv2imageloader.cpp b/lib/exiv2imageloader.cpp
index f2830f81..f13dff7a 100644
--- a/lib/exiv2imageloader.cpp
+++ b/lib/exiv2imageloader.cpp
@@ -29,8 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 // KDE
 
 // Exiv2
-#include <exiv2/error.hpp>
-#include <exiv2/types.hpp>
+#include <exiv2/exiv2.hpp>
 
 // Local
 
@@ -39,7 +38,7 @@ namespace Gwenview
 
 struct Exiv2ImageLoaderPrivate
 {
-    Exiv2::Image::AutoPtr mImage;
+    std::unique_ptr<Exiv2::Image> mImage;
     QString mErrorMessage;
 };
 
@@ -57,7 +56,7 @@ bool Exiv2ImageLoader::load(const QString& filePath)
 {
     QByteArray filePathByteArray = QFile::encodeName(filePath);
     try {
-        d->mImage = Exiv2::ImageFactory::open(filePathByteArray.constData());
+        d->mImage.reset(Exiv2::ImageFactory::open(filePathByteArray.constData()).release());
         d->mImage->readMetadata();
     } catch (const Exiv2::Error& error) {
         d->mErrorMessage = QString::fromUtf8(error.what());
@@ -69,7 +68,7 @@ bool Exiv2ImageLoader::load(const QString& filePath)
 bool Exiv2ImageLoader::load(const QByteArray& data)
 {
     try {
-        d->mImage = Exiv2::ImageFactory::open((unsigned char*)data.constData(), data.size());
+        d->mImage.reset(Exiv2::ImageFactory::open((unsigned char*)data.constData(), data.size()).release());
         d->mImage->readMetadata();
     } catch (const Exiv2::Error& error) {
         d->mErrorMessage = QString::fromUtf8(error.what());
@@ -83,9 +82,9 @@ QString Exiv2ImageLoader::errorMessage() const
     return d->mErrorMessage;
 }
 
-Exiv2::Image::AutoPtr Exiv2ImageLoader::popImage()
+std::unique_ptr<Exiv2::Image> Exiv2ImageLoader::popImage()
 {
-    return d->mImage;
+    return std::move(d->mImage);
 }
 
 } // namespace
diff --git a/lib/exiv2imageloader.h b/lib/exiv2imageloader.h
index 57ef24d2..12a45b68 100644
--- a/lib/exiv2imageloader.h
+++ b/lib/exiv2imageloader.h
@@ -23,13 +23,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 #include <lib/gwenviewlib_export.h>
 
+// STL
+#include <memory>
+
 // Qt
 
 // KDE
 
 // Exiv2
-#include <string.h>
-#include <exiv2/image.hpp>
+namespace Exiv2
+{
+    class Image;
+}
 
 // Local
 
@@ -54,7 +59,7 @@ public:
     bool load(const QString&);
     bool load(const QByteArray&);
     QString errorMessage() const;
-    Exiv2::Image::AutoPtr popImage();
+    std::unique_ptr<Exiv2::Image> popImage();
 
 private:
     Exiv2ImageLoaderPrivate* const d;
diff --git a/lib/jpegcontent.cpp b/lib/jpegcontent.cpp
index bb810dd4..a8cf909f 100644
--- a/lib/jpegcontent.cpp
+++ b/lib/jpegcontent.cpp
@@ -42,8 +42,7 @@ extern "C" {
 #include <KLocalizedString>
 
 // Exiv2
-#include <exiv2/exif.hpp>
-#include <exiv2/image.hpp>
+#include <exiv2/exiv2.hpp>
 
 // Local
 #include "jpegerrormanager.h"
@@ -216,12 +215,12 @@ bool JpegContent::load(const QString& path)
 
 bool JpegContent::loadFromData(const QByteArray& data)
 {
-    Exiv2::Image::AutoPtr image;
+    std::unique_ptr<Exiv2::Image> image;
     Exiv2ImageLoader loader;
     if (!loader.load(data)) {
         qCritical() << "Could not load image with Exiv2, reported error:" << loader.errorMessage();
     }
-    image = loader.popImage();
+    image.reset(loader.popImage().release());
 
     return loadFromData(data, image.get());
 }
@@ -603,7 +602,8 @@ bool JpegContent::save(QIODevice* device)
         d->mPendingTransformation = false;
     }
 
-    Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open((unsigned char*)d->mRawData.data(), d->mRawData.size());
+    std::unique_ptr<Exiv2::Image> image;
+    image.reset(Exiv2::ImageFactory::open((unsigned char*)d->mRawData.data(), d->mRawData.size()).release());
 
     // Store Exif info
     image->setExifData(d->mExifData);
diff --git a/lib/timeutils.cpp b/lib/timeutils.cpp
index 9e8836a9..3c519098 100644
--- a/lib/timeutils.cpp
+++ b/lib/timeutils.cpp
@@ -21,6 +21,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 // Self
 #include "timeutils.h"
 
+// STL
+#include <memory>
+
 // Qt
 #include <QFile>
 #include <QDateTime>
@@ -30,8 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA
 #include <KFileItem>
 
 // Exiv2
-#include <exiv2/exif.hpp>
-#include <exiv2/image.hpp>
+#include <exiv2/exiv2.hpp>
 
 // Local
 #include <lib/exiv2imageloader.h>
@@ -92,7 +94,7 @@ struct CacheItem
         if (!loader.load(path)) {
             return false;
         }
-        Exiv2::Image::AutoPtr img = loader.popImage();
+        std::unique_ptr<Exiv2::Image> img(loader.popImage().release());
         try {
             Exiv2::ExifData exifData = img->exifData();
             if (exifData.empty()) {
diff --git a/tests/auto/cmsprofiletest.cpp b/tests/auto/cmsprofiletest.cpp
index 4efc441b..f4c7f9e5 100644
--- a/tests/auto/cmsprofiletest.cpp
+++ b/tests/auto/cmsprofiletest.cpp
@@ -69,7 +69,7 @@ void CmsProfileTest::testLoadFromImageData_data()
 void CmsProfileTest::testLoadFromExiv2Image()
 {
     QFETCH(QString, fileName);
-    Exiv2::Image::AutoPtr image;
+    std::unique_ptr<Exiv2::Image> image;
     {
         QByteArray data;
         QString path = pathForTestFile(fileName);
@@ -80,7 +80,7 @@ void CmsProfileTest::testLoadFromExiv2Image()
 
         Exiv2ImageLoader loader;
         QVERIFY(loader.load(data));
-        image = loader.popImage();
+        image.reset(loader.popImage().release());
     }
     Cms::Profile::Ptr ptr = Cms::Profile::loadFromExiv2Image(image.get());
     QVERIFY(!ptr.isNull());
diff --git a/tests/auto/imagemetainfomodeltest.cpp b/tests/auto/imagemetainfomodeltest.cpp
index e3ec8d30..5a286b00 100644
--- a/tests/auto/imagemetainfomodeltest.cpp
+++ b/tests/auto/imagemetainfomodeltest.cpp
@@ -17,6 +17,10 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 */
+
+// STL
+#include <memory>
+
 // Qt
 
 // KDE
@@ -28,7 +32,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #include "../lib/imagemetainfomodel.h"
 #include "testutils.h"
 
-#include <exiv2/exif.hpp>
+// Exiv2
+#include <exiv2/exiv2.hpp>
 
 #include "imagemetainfomodeltest.h"
 
@@ -46,7 +51,7 @@ void ImageMetaInfoModelTest::testCatchExiv2Errors()
         data = file.readAll();
     }
 
-    Exiv2::Image::AutoPtr image;
+    std::unique_ptr<Exiv2::Image> image;
     {
         Exiv2ImageLoader loader;
         QVERIFY(loader.load(data));
-- 
2.17.2