Krita Source Code Documentation
Loading...
Searching...
No Matches
KisIptcIO Class Reference

#include <kis_iptc_io.h>

+ Inheritance diagram for KisIptcIO:

Classes

struct  Private
 

Public Member Functions

bool canSaveAllEntries (KisMetaData::Store *store) const override
 
QString id () const override
 
 KisIptcIO ()
 
bool loadFrom (KisMetaData::Store *store, QIODevice *ioDevice) const override
 
QString name () const override
 
bool saveTo (const KisMetaData::Store *store, QIODevice *ioDevice, HeaderType headerType=NoHeader) const override
 
bool supportLoading () const override
 
bool supportSaving () const override
 
BackendType type () const override
 
 ~KisIptcIO () override
 

Private Member Functions

void initMappingsTable () const
 

Private Attributes

Private *const d
 

Additional Inherited Members

Detailed Description

Definition at line 15 of file kis_iptc_io.h.

Constructor & Destructor Documentation

◆ KisIptcIO()

KisIptcIO::KisIptcIO ( )

Definition at line 66 of file kis_iptc_io.cpp.

◆ ~KisIptcIO()

KisIptcIO::~KisIptcIO ( )
override

Definition at line 72 of file kis_iptc_io.cpp.

73{
74 delete d;
75}

References d.

Member Function Documentation

◆ canSaveAllEntries()

bool KisIptcIO::canSaveAllEntries ( KisMetaData::Store * store) const
overridevirtual
Parameters
storethe list of metadata
Returns
true if this backend is capable of saving all the metadata of the store

Implements KisMetaData::IOBackend.

Definition at line 160 of file kis_iptc_io.cpp.

161{
162 Q_UNUSED(store);
163 return false;
164}

◆ id()

QString KisIptcIO::id ( ) const
inlineoverridevirtual

Implements KisMetaData::IOBackend.

Definition at line 20 of file kis_iptc_io.h.

21 {
22 return "iptc";
23 }

◆ initMappingsTable()

void KisIptcIO::initMappingsTable ( ) const
private

Definition at line 77 of file kis_iptc_io.cpp.

78{
79 // For some reason, initializing the tables in the constructor makes the it crash
80 if (d->iptcToKMD.size() == 0) {
81 for (int i = 0; !mappings[i].exivTag.isEmpty(); i++) {
82 dbgKrita << "mapping[i] = " << mappings[i].exivTag << " " << mappings[i].namespaceUri << " "
83 << mappings[i].name;
86 ->schemaFromUri(mappings[i].namespaceUri)
88 }
89 }
90}
QString name() const override
Definition kis_iptc_io.h:24
static KisMetaData::SchemaRegistry * instance()
const Schema * schemaFromUri(const QString &uri) const
QString generateQualifiedName(const QString &) const
#define dbgKrita
Definition kis_debug.h:45
static const IPTCToKMD mappings[]
QString name
QString exivTag
QString namespaceUri
QHash< QString, IPTCToKMD > iptcToKMD
QHash< QString, IPTCToKMD > kmdToIPTC

References d, dbgKrita, IPTCToKMD::exivTag, KisMetaData::Schema::generateQualifiedName(), KisMetaData::SchemaRegistry::instance(), KisIptcIO::Private::iptcToKMD, KisIptcIO::Private::kmdToIPTC, mappings, IPTCToKMD::name, name(), IPTCToKMD::namespaceUri, and KisMetaData::SchemaRegistry::schemaFromUri().

◆ loadFrom()

bool KisIptcIO::loadFrom ( KisMetaData::Store * store,
QIODevice * ioDevice ) const
overridevirtual
Parameters
storethe list of metadata to load
ioDevicethe device from where the metadata will be loaded
Returns
true if the load was successful

Implements KisMetaData::IOBackend.

Definition at line 166 of file kis_iptc_io.cpp.

167{
169 dbgMetaData << "Loading IPTC Tags";
170 ioDevice->open(QIODevice::ReadOnly);
171 QByteArray arr = ioDevice->readAll();
172 Exiv2::IptcData iptcData;
173#if !EXIV2_TEST_VERSION(0, 18, 0)
174 iptcData.load((const Exiv2::byte *)arr.data(), arr.size());
175#else
176 Exiv2::IptcParser::decode(iptcData, (const Exiv2::byte *)arr.data(), arr.size());
177#endif
178 dbgMetaData << "There are" << iptcData.count() << " entries in the IPTC section";
179 for (Exiv2::IptcMetadata::const_iterator it = iptcData.begin(); it != iptcData.end(); ++it) {
180 dbgMetaData << "Reading info for key" << it->key().c_str();
181 if (d->iptcToKMD.contains(it->key().c_str())) {
182 const IPTCToKMD &iptcToKMd = d->iptcToKMD[it->key().c_str()];
183 const KisMetaData::Schema *schema =
186 if (iptcToKMd.exivTag == "Iptc.Application2.Keywords") {
187 Q_ASSERT(it->getValue()->typeId() == Exiv2::string);
188 QString data = it->getValue()->toString().c_str();
189
190 QStringList list = data.split(',');
192 Q_FOREACH (const QString &entry, list) {
193 values.push_back(KisMetaData::Value(entry));
194 }
196 } else {
197 value = exivValueToKMDValue(it->getValue(), false);
198 }
199 store->addEntry(KisMetaData::Entry(schema, iptcToKMd.name, value));
200 }
201 }
202 return false;
203}
float value(const T *src, size_t ch)
void initMappingsTable() const
bool addEntry(const Entry &entry)
#define dbgMetaData
Definition kis_debug.h:61
KisMetaData::Value exivValueToKMDValue(const Exiv2::Value::AutoPtr &value, bool forceSeq, KisMetaData::Value::ValueType arrayType=KisMetaData::Value::UnorderedArray)

References KisMetaData::Store::addEntry(), d, dbgMetaData, IPTCToKMD::exivTag, exivValueToKMDValue(), initMappingsTable(), KisMetaData::SchemaRegistry::instance(), KisIptcIO::Private::iptcToKMD, IPTCToKMD::name, IPTCToKMD::namespaceUri, KisMetaData::SchemaRegistry::schemaFromUri(), KisMetaData::Value::UnorderedArray, and value().

◆ name()

QString KisIptcIO::name ( ) const
inlineoverridevirtual

Implements KisMetaData::IOBackend.

Definition at line 24 of file kis_iptc_io.h.

25 {
26 return i18n("Iptc");
27 }

◆ saveTo()

bool KisIptcIO::saveTo ( const KisMetaData::Store * store,
QIODevice * ioDevice,
HeaderType headerType = NoHeader ) const
overridevirtual
Parameters
storethe list of metadata to save
ioDevicethe device to where the metadata will be saved
headerTypedetermine if an header must be prepend to the binary header, and if it does, which type of header
Returns
true if the save was successful (XXX: actually, all backends always return true...)

Implements KisMetaData::IOBackend.

Definition at line 92 of file kis_iptc_io.cpp.

93{
94 QStringList blockedEntries = QStringList() << "photoshop:DateCreated";
95
97 ioDevice->open(QIODevice::WriteOnly);
98 Exiv2::IptcData iptcData;
99 for (const KisMetaData::Entry &entry : *store) {
100 if (d->kmdToIPTC.contains(entry.qualifiedName())) {
101 if (blockedEntries.contains(entry.qualifiedName())) {
102 warnKrita << "skipping" << entry.qualifiedName() << entry.value();
103 continue;
104 }
105 try {
106 QString iptcKeyStr = d->kmdToIPTC[entry.qualifiedName()].exivTag;
107 Exiv2::IptcKey iptcKey(qPrintable(iptcKeyStr));
108 Exiv2::Value *v =
109 kmdValueToExivValue(entry.value(),
110 Exiv2::IptcDataSets::dataSetType(iptcKey.tag(), iptcKey.record()));
111
112 if (v && v->typeId() != Exiv2::invalidTypeId) {
113 iptcData.add(iptcKey, v);
114 }
115#if EXIV2_TEST_VERSION(0,28,0)
116 } catch (Exiv2::Error &e) {
117#else
118 } catch (Exiv2::AnyError &e) {
119#endif
120 dbgMetaData << "exiv error " << e.what();
121 }
122 }
123 }
124#if !EXIV2_TEST_VERSION(0, 18, 0)
125 Exiv2::DataBuf rawData = iptcData.copy();
126#else
127 Exiv2::DataBuf rawData = Exiv2::IptcParser::encode(iptcData);
128#endif
129
130 if (headerType == KisMetaData::IOBackend::JpegHeader) {
131 QByteArray header;
132 header.append(photoshopMarker);
133 header.append(QByteArray(1, 0)); // Null terminated string
134 header.append(photoshopBimId_);
135 header.append(photoshopIptc_);
136 header.append(QByteArray(2, 0));
137#if EXIV2_TEST_VERSION(0, 28, 0)
138 qint32 size = rawData.size();
139#else
140 qint32 size = rawData.size_;
141#endif
142 QByteArray sizeArray(4, 0);
143 sizeArray[0] = (char)((size & 0xff000000) >> 24);
144 sizeArray[1] = (char)((size & 0x00ff0000) >> 16);
145 sizeArray[2] = (char)((size & 0x0000ff00) >> 8);
146 sizeArray[3] = (char)(size & 0x000000ff);
147 header.append(sizeArray);
148 ioDevice->write(header);
149 }
150
151#if EXIV2_TEST_VERSION(0, 28, 0)
152 ioDevice->write((const char *)rawData.data(), rawData.size());
153#else
154 ioDevice->write((const char *)rawData.pData_, rawData.size_);
155#endif
156 ioDevice->close();
157 return true;
158}
qreal v
QList< QString > QStringList
@ JpegHeader
Append Jpeg-style header.
#define warnKrita
Definition kis_debug.h:87
Exiv2::Value * kmdValueToExivValue(const KisMetaData::Value &value, Exiv2::TypeId type)
Convert a KisMetaData to an Exiv value.
const char photoshopBimId_[]
const char photoshopMarker[]
const QByteArray photoshopIptc_((char *)&photoshopIptc, 2)
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References d, dbgMetaData, initMappingsTable(), KisMetaData::IOBackend::JpegHeader, KisIptcIO::Private::kmdToIPTC, kmdValueToExivValue(), photoshopBimId_, photoshopIptc_(), photoshopMarker, v, and warnKrita.

◆ supportLoading()

bool KisIptcIO::supportLoading ( ) const
inlineoverridevirtual
Returns
true if this backend support loading

Implements KisMetaData::IOBackend.

Definition at line 38 of file kis_iptc_io.h.

39 {
40 return true;
41 }

◆ supportSaving()

bool KisIptcIO::supportSaving ( ) const
inlineoverridevirtual
Returns
tell if this backend support saving

Implements KisMetaData::IOBackend.

Definition at line 32 of file kis_iptc_io.h.

33 {
34 return true;
35 }

◆ type()

BackendType KisIptcIO::type ( ) const
inlineoverridevirtual
Returns
the type of the backend

Implements KisMetaData::IOBackend.

Definition at line 28 of file kis_iptc_io.h.

References KisMetaData::IOBackend::Binary.

Member Data Documentation

◆ d

Private* const KisIptcIO::d
private

Definition at line 49 of file kis_iptc_io.h.


The documentation for this class was generated from the following files: