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 65 of file kis_iptc_io.cpp.

◆ ~KisIptcIO()

KisIptcIO::~KisIptcIO ( )
override

Definition at line 71 of file kis_iptc_io.cpp.

72{
73 delete d;
74}

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 159 of file kis_iptc_io.cpp.

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

◆ 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 76 of file kis_iptc_io.cpp.

77{
78 // For some reason, initializing the tables in the constructor makes the it crash
79 if (d->iptcToKMD.size() == 0) {
80 for (int i = 0; !mappings[i].exivTag.isEmpty(); i++) {
81 dbgKrita << "mapping[i] = " << mappings[i].exivTag << " " << mappings[i].namespaceUri << " "
82 << mappings[i].name;
85 ->schemaFromUri(mappings[i].namespaceUri)
87 }
88 }
89}
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 165 of file kis_iptc_io.cpp.

166{
168 dbgMetaData << "Loading IPTC Tags";
169 ioDevice->open(QIODevice::ReadOnly);
170 QByteArray arr = ioDevice->readAll();
171 Exiv2::IptcData iptcData;
172#if !EXIV2_TEST_VERSION(0, 18, 0)
173 iptcData.load((const Exiv2::byte *)arr.data(), arr.size());
174#else
175 Exiv2::IptcParser::decode(iptcData, (const Exiv2::byte *)arr.data(), arr.size());
176#endif
177 dbgMetaData << "There are" << iptcData.count() << " entries in the IPTC section";
178 for (Exiv2::IptcMetadata::const_iterator it = iptcData.begin(); it != iptcData.end(); ++it) {
179 dbgMetaData << "Reading info for key" << it->key().c_str();
180 if (d->iptcToKMD.contains(it->key().c_str())) {
181 const IPTCToKMD &iptcToKMd = d->iptcToKMD[it->key().c_str()];
182 const KisMetaData::Schema *schema =
185 if (iptcToKMd.exivTag == "Iptc.Application2.Keywords") {
186 Q_ASSERT(it->getValue()->typeId() == Exiv2::string);
187 QString data = it->getValue()->toString().c_str();
188
189 QStringList list = data.split(',');
191 Q_FOREACH (const QString &entry, list) {
192 values.push_back(KisMetaData::Value(entry));
193 }
195 } else {
196 value = exivValueToKMDValue(it->getValue(), false);
197 }
198 store->addEntry(KisMetaData::Entry(schema, iptcToKMd.name, value));
199 }
200 }
201 return false;
202}
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 91 of file kis_iptc_io.cpp.

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