• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

libs/libkexiv2/libkexiv2

  • sources
  • kde-4.14
  • kdegraphics
  • libs
  • libkexiv2
  • libkexiv2
kexiv2_p.h
Go to the documentation of this file.
1 
28 #ifndef KEXIV2PRIVATE_H
29 #define KEXIV2PRIVATE_H
30 
31 #include "kexiv2.h"
32 
33  // C++ includes
34 
35 #include <cstdlib>
36 #include <cstdio>
37 #include <cassert>
38 #include <cmath>
39 #include <cfloat>
40 #include <iostream>
41 #include <iomanip>
42 #include <string>
43 
44 // Qt includes
45 
46 #include <QBuffer>
47 #include <QFile>
48 #include <QImage>
49 #include <QSize>
50 #include <QLatin1String>
51 #include <QTextCodec>
52 #include <QMatrix>
53 #include <QFileInfo>
54 #include <QDataStream>
55 #include <QSharedData>
56 
57 // KDE includes
58 
59 #include <ktemporaryfile.h>
60 #include <kencodingdetector.h>
61 #include <kstringhandler.h>
62 #include <kdeversion.h>
63 #include <kdebug.h>
64 
65 // Exiv2 includes -------------------------------------------------------
66 
67 // NOTE: All Exiv2 header must be stay there to not expose external source code to Exiv2 API
68 // and reduce Exiv2 dependency to client code.
69 
70 // The pragmas are required to be able to catch exceptions thrown by libexiv2:
71 // See http://gcc.gnu.org/wiki/Visibility, the section about c++ exceptions.
72 // They are needed for all libexiv2 versions that do not care about visibility.
73 #ifdef __GNUC__
74 #pragma GCC visibility push(default)
75 #endif
76 
77 #include <exiv2/exv_conf.h>
78 #include <exiv2/error.hpp>
79 #include <exiv2/image.hpp>
80 #include <exiv2/jpgimage.hpp>
81 #include <exiv2/datasets.hpp>
82 #include <exiv2/tags.hpp>
83 #include <exiv2/preview.hpp>
84 #include <exiv2/properties.hpp>
85 #include <exiv2/types.hpp>
86 #include <exiv2/exif.hpp>
87 #include <exiv2/xmpsidecar.hpp>
88 
89 // Check if Exiv2 support XMP
90 
91 #ifdef EXV_HAVE_XMP_TOOLKIT
92 # define _XMP_SUPPORT_ 1
93 #endif
94 
95 // Make sure an EXIV2_TEST_VERSION macro exists:
96 
97 #ifdef EXIV2_VERSION
98 # ifndef EXIV2_TEST_VERSION
99 # define EXIV2_TEST_VERSION(major,minor,patch) \
100  ( EXIV2_VERSION >= EXIV2_MAKE_VERSION(major,minor,patch) )
101 # endif
102 #else
103 # define EXIV2_TEST_VERSION(major,minor,patch) (false)
104 #endif
105 
106 // With exiv2 > 0.20.0, all makernote header files have been removed to increase binary compatibility.
107 // See Exiv2 bugzilla entry http://dev.exiv2.org/issues/719
108 // and wiki topic http://dev.exiv2.org/boards/3/topics/583
109 
110 #ifdef __GNUC__
111 #pragma GCC visibility pop
112 #endif
113 
114 // End of Exiv2 headers ------------------------------------------------------
115 
116 namespace KExiv2Iface
117 {
118 
119 class KExiv2Data::Private : public QSharedData
120 {
121 public:
122 
123  void clear();
124 
125 public:
126 
127  std::string imageComments;
128 
129  Exiv2::ExifData exifMetadata;
130 
131  Exiv2::IptcData iptcMetadata;
132 
133 #ifdef _XMP_SUPPORT_
134  Exiv2::XmpData xmpMetadata;
135 #endif
136 };
137 
138 // --------------------------------------------------------------------------
139 
140 class KExiv2::Private
141 {
142 public:
143 
144  Private();
145  ~Private();
146 
147  void copyPrivateData(const Private* const other);
148 
149  bool saveToXMPSidecar(const QFileInfo& finfo) const;
150  bool saveToFile(const QFileInfo& finfo) const;
151  bool saveOperations(const QFileInfo& finfo, Exiv2::Image::AutoPtr image) const;
152 
155  QString convertCommentValue(const Exiv2::Exifdatum& exifDatum) const;
156 
159  QString detectEncodingAndDecode(const std::string& value) const;
160 
161  int getXMPTagsListFromPrefix(const QString& pf, KExiv2::TagsMap& tagsMap) const;
162 
163  const Exiv2::ExifData& exifMetadata() const { return data.constData()->exifMetadata; }
164  const Exiv2::IptcData& iptcMetadata() const { return data.constData()->iptcMetadata; }
165  const std::string& imageComments() const { return data.constData()->imageComments; }
166 
167 #ifdef _XMP_SUPPORT_
168  const Exiv2::XmpData& xmpMetadata() const { return data.constData()->xmpMetadata; }
169 #endif
170 
171  Exiv2::ExifData& exifMetadata() { return data.data()->exifMetadata; }
172  Exiv2::IptcData& iptcMetadata() { return data.data()->iptcMetadata; }
173  std::string& imageComments() { return data.data()->imageComments; }
174 
175 #ifdef _XMP_SUPPORT_
176  Exiv2::XmpData& xmpMetadata() { return data.data()->xmpMetadata; }
177 
178  void loadSidecarData(Exiv2::Image::AutoPtr xmpsidecar);
179 #endif
180 
181 public:
182 
186  static void printExiv2ExceptionError(const QString& msg, Exiv2::Error& e);
187 
191  static void printExiv2MessageHandler(int lvl, const char* msg);
192 
193 public:
194 
195  bool writeRawFiles;
196  bool updateFileTimeStamp;
197 
198  bool useXMPSidecar4Reading;
199 
201  int metadataWritingMode;
202 
204  bool loadedFromSidecar;
205 
206  QString filePath;
207  QSize pixelSize;
208  QString mimeType;
209 
210  QSharedDataPointer<KExiv2Data::Private> data;
211 };
212 
213 template <class Data, class Key, class KeyString, class KeyStringList = QList<KeyString> >
214 class MergeHelper
215 {
216 public:
217 
218  KeyStringList keys;
219 
220  MergeHelper& operator<<(const KeyString& key)
221  {
222  keys << key;
223  return *this;
224  }
225 
230  void mergeAll(const Data& src, Data& dest)
231  {
232  for (typename Data::const_iterator it = src.begin(); it != src.end(); ++it)
233  {
234  typename Data::iterator destIt = dest.findKey(Key(it->key()));
235 
236  if (destIt == dest.end())
237  {
238  dest.add(*it);
239  }
240  else
241  {
242  *destIt = *it;
243  }
244  }
245  }
246 
252  void mergeFields(const Data& src, Data& dest)
253  {
254  foreach (const KeyString& keyString, keys)
255  {
256  Key key(keyString.latin1());
257  typename Data::const_iterator it = src.findKey(key);
258  if (it == src.end())
259  {
260  continue;
261  }
262  typename Data::iterator destIt = dest.findKey(key);
263  if (destIt == dest.end())
264  {
265  dest.add(*it);
266  }
267  else
268  {
269  *destIt = *it;
270  }
271  }
272  }
273 
281  void exclusiveMerge(const Data& src, Data& dest)
282  {
283  foreach (const KeyString& keyString, keys)
284  {
285  Key key(keyString.latin1());
286  typename Data::const_iterator it = src.findKey(key);
287  typename Data::iterator destIt = dest.findKey(key);
288 
289  if (destIt == dest.end())
290  {
291  if (it != src.end())
292  {
293  dest.add(*it);
294  }
295  }
296  else
297  {
298  if (it == src.end())
299  {
300  dest.erase(destIt);
301  }
302  else
303  {
304  *destIt = *it;
305  }
306  }
307  }
308  }
309 };
310 
311 class ExifMergeHelper : public MergeHelper<Exiv2::ExifData, Exiv2::ExifKey, QLatin1String>
312 {
313 };
314 
315 class IptcMergeHelper : public MergeHelper<Exiv2::IptcData, Exiv2::IptcKey, QLatin1String>
316 {
317 };
318 
319 #ifdef _XMP_SUPPORT_
320 class XmpMergeHelper : public MergeHelper<Exiv2::XmpData, Exiv2::XmpKey, QLatin1String>
321 {
322 };
323 #endif
324 
325 
326 } // NameSpace KExiv2Iface
327 
328 #endif // KEXIV2PRIVATE_H
KExiv2Iface::KExiv2::Private::imageComments
std::string & imageComments()
Definition: kexiv2_p.h:173
KExiv2Iface::KExiv2::Private::writeRawFiles
bool writeRawFiles
Definition: kexiv2_p.h:195
KExiv2Iface::KExiv2Data::Private::clear
void clear()
KExiv2Iface::KExiv2::Private::Private
Private()
KExiv2Iface::KExiv2::Private::exifMetadata
const Exiv2::ExifData & exifMetadata() const
Definition: kexiv2_p.h:163
KExiv2Iface::MergeHelper::keys
KeyStringList keys
Definition: kexiv2_p.h:218
KExiv2Iface::KExiv2::Private::exifMetadata
Exiv2::ExifData & exifMetadata()
Definition: kexiv2_p.h:171
KExiv2Iface::KExiv2::Private::iptcMetadata
const Exiv2::IptcData & iptcMetadata() const
Definition: kexiv2_p.h:164
KExiv2Iface::KExiv2::Private::pixelSize
QSize pixelSize
Definition: kexiv2_p.h:207
QMap
KExiv2Iface::MergeHelper::operator<<
MergeHelper & operator<<(const KeyString &key)
Definition: kexiv2_p.h:220
KExiv2Iface::KExiv2::Private::filePath
QString filePath
Definition: kexiv2_p.h:206
KExiv2Iface::KExiv2::Private::imageComments
const std::string & imageComments() const
Definition: kexiv2_p.h:165
KeyStringList
KExiv2Iface::KExiv2::Private::data
QSharedDataPointer< KExiv2Data::Private > data
Definition: kexiv2_p.h:210
KExiv2Iface::KExiv2::Private::saveOperations
bool saveOperations(const QFileInfo &finfo, Exiv2::Image::AutoPtr image) const
KExiv2Iface::MergeHelper::mergeAll
void mergeAll(const Data &src, Data &dest)
Merge two (Exif,IPTC,Xmp)Data packages, where the result is stored in dest and fields from src take p...
Definition: kexiv2_p.h:230
QSharedData
KExiv2Iface::KExiv2::Private::metadataWritingMode
int metadataWritingMode
A mode from MetadataWritingMode enum.
Definition: kexiv2_p.h:201
KExiv2Iface::KExiv2::Private::useXMPSidecar4Reading
bool useXMPSidecar4Reading
Definition: kexiv2_p.h:198
KExiv2Iface::KExiv2::Private::getXMPTagsListFromPrefix
int getXMPTagsListFromPrefix(const QString &pf, KExiv2::TagsMap &tagsMap) const
QString
KExiv2Iface::KExiv2::Private::iptcMetadata
Exiv2::IptcData & iptcMetadata()
Definition: kexiv2_p.h:172
KExiv2Iface::KExiv2::Private::detectEncodingAndDecode
QString detectEncodingAndDecode(const std::string &value) const
Charset autodetection to convert a string to a QString.
KExiv2Iface::KExiv2::Private::~Private
~Private()
QFileInfo
KExiv2Iface::KExiv2::Private
Definition: kexiv2_p.h:140
KExiv2Iface::KExiv2::Private::saveToXMPSidecar
bool saveToXMPSidecar(const QFileInfo &finfo) const
QSize
KExiv2Iface::MergeHelper::mergeFields
void mergeFields(const Data &src, Data &dest)
Merge two (Exif,IPTC,Xmp)Data packages, the result is stored in dest.
Definition: kexiv2_p.h:252
KExiv2Iface::KExiv2Data::Private::iptcMetadata
Exiv2::IptcData iptcMetadata
Definition: kexiv2_p.h:131
KExiv2Iface::KExiv2::Private::loadedFromSidecar
bool loadedFromSidecar
XMP, and parts of EXIF/IPTC, were loaded from an XMP sidecar file.
Definition: kexiv2_p.h:204
KExiv2Iface::KExiv2::Private::printExiv2ExceptionError
static void printExiv2ExceptionError(const QString &msg, Exiv2::Error &e)
Generic method to print the Exiv2 C++ Exception error message from 'e'.
KExiv2Iface::KExiv2::Private::convertCommentValue
QString convertCommentValue(const Exiv2::Exifdatum &exifDatum) const
Wrapper method to convert a Comments content to a QString.
KExiv2Iface::KExiv2::Private::updateFileTimeStamp
bool updateFileTimeStamp
Definition: kexiv2_p.h:196
KExiv2Iface::MergeHelper
Definition: kexiv2_p.h:214
KExiv2Iface::KExiv2Data::Private::imageComments
std::string imageComments
Definition: kexiv2_p.h:127
KExiv2Iface::KExiv2Data::Private
Definition: kexiv2_p.h:119
KExiv2Iface::KExiv2::Private::printExiv2MessageHandler
static void printExiv2MessageHandler(int lvl, const char *msg)
Generic method to print debug message from Exiv2.
KExiv2Iface::KExiv2::Private::mimeType
QString mimeType
Definition: kexiv2_p.h:208
KExiv2Iface::KExiv2::Private::saveToFile
bool saveToFile(const QFileInfo &finfo) const
KExiv2Iface::MergeHelper::exclusiveMerge
void exclusiveMerge(const Data &src, Data &dest)
Merge two (Exif,IPTC,Xmp)Data packages, the result is stored in dest.
Definition: kexiv2_p.h:281
KExiv2Iface::IptcMergeHelper
Definition: kexiv2_p.h:315
KExiv2Iface::KExiv2::Private::copyPrivateData
void copyPrivateData(const Private *const other)
KExiv2Iface::ExifMergeHelper
Definition: kexiv2_p.h:311
kexiv2.h
===========================================================This file is a part of digiKam project htt...
QSharedDataPointer
KExiv2Iface::KExiv2Data::Private::exifMetadata
Exiv2::ExifData exifMetadata
Definition: kexiv2_p.h:129
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:19:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libs/libkexiv2/libkexiv2

Skip menu "libs/libkexiv2/libkexiv2"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkdcraw
  •     libkexiv2
  •     libkipi
  •     libksane
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal