digiKam
Loading...
Searching...
No Matches
metaengine_p.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2006-09-15
7 * Description : Exiv2 library interface.
8 * Internal private container.
9 *
10 * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 * SPDX-FileCopyrightText: 2006-2013 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19#include "metaengine.h"
20
21 // C++ includes
22
23#include <cstdlib>
24#include <cstdio>
25#include <cmath>
26#include <cfloat>
27#include <iostream>
28#include <iomanip>
29#include <string>
30#include <memory>
31
32// Qt includes
33
34#include <QDir>
35#include <QFile>
36#include <QSize>
37#include <QLatin1String>
38#include <QFileInfo>
39#include <QSharedData>
40#include <QMutexLocker>
41#include <QRecursiveMutex>
42#include <QMimeDatabase>
43
44// Exiv2 includes -------------------------------------------------------
45
46// NOTE: All Exiv2 headers must be stay there to not expose external source code to Exiv2 API
47// and reduce Exiv2 dependency to client code.
48
49#if defined(Q_CC_CLANG)
50# pragma clang diagnostic push
51# pragma clang diagnostic ignored "-Wdeprecated-declarations"
52#endif
53
54// The pragmas are required to be able to catch exceptions thrown by libexiv2:
55// See gcc.gnu.org/wiki/Visibility, the section about c++ exceptions.
56// They are needed for all libexiv2 versions that do not care about visibility.
57
58#ifdef Q_CC_GNU
59# pragma GCC visibility push(default)
60#endif
61
62#include <exiv2/exv_conf.h>
63#include <exiv2/error.hpp>
64#include <exiv2/convert.hpp>
65#include <exiv2/image.hpp>
66#include <exiv2/jpgimage.hpp>
67#include <exiv2/datasets.hpp>
68#include <exiv2/tags.hpp>
69#include <exiv2/preview.hpp>
70#include <exiv2/properties.hpp>
71#include <exiv2/types.hpp>
72#include <exiv2/exif.hpp>
73#include <exiv2/xmpsidecar.hpp>
74#include <exiv2/version.hpp>
75
76// Check if Exiv2 support XMP
77
78#ifdef EXV_HAVE_XMP_TOOLKIT
79# define _XMP_SUPPORT_ 1
80#endif
81
82#ifndef EXIV2_TEST_VERSION
83# define EXIV2_TEST_VERSION(major,minor,patch) \
84 ( EXIV2_VERSION >= EXIV2_MAKE_VERSION(major,minor,patch) )
85#endif
86
87#if EXIV2_TEST_VERSION(0,27,99)
88# define AutoPtr UniquePtr
89# define AnyError Error
90# define kerErrorMessage ErrorCode::kerErrorMessage
91# include <exiv2/photoshop.hpp>
92#endif
93
94#if EXIV2_TEST_VERSION(0,27,4)
95# include <exiv2/bmffimage.hpp>
96#endif
97
98// With exiv2 > 0.20.0, all makernote header files have been removed to increase binary compatibility.
99// See Exiv2 bugzilla entry dev.exiv2.org/issues/719
100// and wiki topic dev.exiv2.org/boards/3/topics/583
101
102#ifdef Q_CC_GNU
103# pragma GCC visibility pop
104#endif
105
106// End of Exiv2 headers ------------------------------------------------------
107
108// Local includes
109
111#include "metaenginesettings.h"
112#include "digikam_globals.h"
113
114namespace Digikam
115{
116
117extern QRecursiveMutex s_metaEngineMutex;
118extern bool s_metaEngineSupportBmff;
119extern bool s_metaEngineWarnOrError;
120
121// --------------------------------------------------------------------------
122
123class Q_DECL_HIDDEN MetaEngine::Private
124{
125public:
126
127 explicit Private(MetaEngine* const q);
128 ~Private() = default;
129
130 void copyPrivateData(const Private* const other);
131
132 bool saveToXMPSidecar(const QFileInfo& finfo) const;
133 bool saveToFile(const QFileInfo& finfo) const;
134 bool saveUsingExiv2(const QFileInfo& finfo,
135 const QDateTime& modTime,
136 Exiv2::Image::AutoPtr image) const;
137 bool saveUsingExifTool(const QFileInfo& finfo,
138 const QDateTime& modTime) const;
139
140 bool exportChanges(const QString& exvTmpFile) const;
141
145 QString convertCommentValue(const Exiv2::Exifdatum& exifDatum) const;
146
150 QString detectEncodingAndDecode(const std::string& value) const;
151
155 bool isUtf8(const char* const buffer) const;
156
160 bool decodeGPSCoordinate(const char* exifTagName, double* const coordinate) const;
161
162 int getXMPTagsListFromPrefix(const QString& pf, MetaEngine::TagsMap& tagsMap) const;
163
164 const Exiv2::ExifData& exifMetadata() const;
165 const Exiv2::IptcData& iptcMetadata() const;
166 const std::string& itemComments() const;
167 const Exiv2::ByteOrder& exifByteOrder() const;
168 const Exiv2::DataBuf& iccProfileBuf() const;
169
170 Exiv2::ExifData& exifMetadata();
171 Exiv2::IptcData& iptcMetadata();
172 std::string& itemComments();
173 Exiv2::ByteOrder& exifByteOrder();
174 Exiv2::DataBuf& iccProfileBuf();
175
176public:
177
178#ifdef _XMP_SUPPORT_
179
180 const Exiv2::XmpData& xmpMetadata() const;
181 Exiv2::XmpData& xmpMetadata();
182
183 void loadSidecarData(Exiv2::Image::AutoPtr xmpsidecar);
184
185#endif
186
187public:
188
192 QString extractIptcTagString(const Exiv2::IptcData& iptcData, const Exiv2::Iptcdatum& iptcTag) const;
193
194public:
195
200 static void printExiv2ExceptionError(const QString& msg, Exiv2::AnyError& e);
201
206 static void printExiv2MessageHandler(int lvl, const char* msg);
207
208public:
209
210 bool readWithExifTool = false;
211 bool writeWithExifTool = false;
212 bool writeRawFiles = false;
213 bool writeDngFiles = false;
214 bool updateFileTimeStamp = false;
215
216 bool useXMPSidecar4Reading = false;
217 bool useCompatibleFileName = false;
218
220 int metadataWritingMode = WRITE_TO_FILE_ONLY;
221
223 bool loadedFromSidecar = false;
224
225 QString filePath;
227 QString mimeType;
228
229 MetaEngine* parent = nullptr;
230
231 QExplicitlySharedDataPointer<MetaEngineData::Private> data;
232};
233
234} // namespace Digikam
235
236#if defined(Q_CC_CLANG)
237# pragma clang diagnostic pop
238#endif
Definition metaengine_p.h:124
QString filePath
Definition metaengine_p.h:225
QSize pixelSize
Definition metaengine_p.h:226
bool exportChanges(const QString &exvTmpFile) const
QExplicitlySharedDataPointer< MetaEngineData::Private > data
Definition metaengine_p.h:231
QString mimeType
Definition metaengine_p.h:227
Definition metaengine.h:48
QMap< QString, QStringList > TagsMap
Definition metaengine.h:143
qulonglong value
Definition itemviewutilities.cpp:585
Definition datefolderview.cpp:34
bool s_metaEngineWarnOrError
Flag for Exiv2 has printed a warning or error.
Definition metaengine_p.cpp:65
bool s_metaEngineSupportBmff
Flag for Exiv2 Base Media File Format support.
Definition metaengine_p.cpp:59
QRecursiveMutex s_metaEngineMutex
Mutex to fix no re-entrancy from Exiv2.
Definition metaengine_p.cpp:53