Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_xmp_io.cpp File Reference
#include "kis_xmp_io.h"
#include <string>
#include <QIODevice>
#include <QRegExp>
#include <kis_exiv2_common.h>
#include <kis_meta_data_entry.h>
#include <kis_meta_data_parser.h>
#include <kis_meta_data_schema.h>
#include <kis_meta_data_schema_registry.h>
#include <kis_meta_data_store.h>
#include <kis_meta_data_type_info.h>
#include <kis_meta_data_value.h>
#include <kis_debug.h>

Go to the source code of this file.

Functions

std::string exiv2Prefix (const KisMetaData::Schema *_schema)
 
bool parseTagName (const QString &tagString, QString &structName, int &arrayIndex, QString &tagName, const KisMetaData::TypeInfo **typeInfo, const KisMetaData::Schema *schema)
 

Function Documentation

◆ exiv2Prefix()

std::string exiv2Prefix ( const KisMetaData::Schema * _schema)
inline

Definition at line 35 of file kis_xmp_io.cpp.

36{
37 const QByteArray latin1SchemaUri = _schema->uri().toLatin1();
38 std::string prefix = Exiv2::XmpProperties::prefix(latin1SchemaUri.constData());
39 if (prefix.empty()) {
40 dbgMetaData << "Unknown namespace " << ppVar(_schema->uri()) << ppVar(_schema->prefix());
41 prefix = _schema->prefix().toLatin1().constData();
42 Exiv2::XmpProperties::registerNs(latin1SchemaUri.constData(), prefix);
43 }
44 return prefix;
45}
#define ppVar(var)
Definition kis_debug.h:155
#define dbgMetaData
Definition kis_debug.h:61

References dbgMetaData, ppVar, KisMetaData::Schema::prefix, and KisMetaData::Schema::uri.

◆ parseTagName()

bool parseTagName ( const QString & tagString,
QString & structName,
int & arrayIndex,
QString & tagName,
const KisMetaData::TypeInfo ** typeInfo,
const KisMetaData::Schema * schema )

Definition at line 163 of file kis_xmp_io.cpp.

169{
170 arrayIndex = -1;
171 *typeInfo = 0;
172
173 int numSubNames = tagString.count('/') + 1;
174
175 if (numSubNames == 1) {
176 structName.clear();
177 tagName = tagString;
178 *typeInfo = schema->propertyType(tagName);
179 return true;
180 }
181
182 if (numSubNames == 2) {
183 QRegExp regexp("([A-Za-z]\\w+)/([A-Za-z]\\w+):([A-Za-z]\\w+)");
184 if (regexp.indexIn(tagString) != -1) {
185 structName = regexp.capturedTexts()[1];
186 tagName = regexp.capturedTexts()[3];
187 *typeInfo = schema->propertyType(structName);
188
189 if (*typeInfo && (*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
190 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
191 }
192
193 return true;
194 }
195
196 QRegExp regexp2("([A-Za-z]\\w+)\\[(\\d+)\\]/([A-Za-z]\\w+):([A-Za-z]\\w+)");
197 if (regexp2.indexIn(tagString) != -1) {
198 structName = regexp2.capturedTexts()[1];
199 arrayIndex = regexp2.capturedTexts()[2].toInt() - 1;
200 tagName = regexp2.capturedTexts()[4];
201
202 if (schema->propertyType(structName)) {
203 *typeInfo = schema->propertyType(structName)->embeddedPropertyType();
204 Q_ASSERT(*typeInfo);
205
206 if ((*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
207 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
208 }
209 }
210
211 return true;
212 }
213 }
214
215 warnKrita << "WARNING: Unsupported tag. We do not yet support nested tags. The tag will be dropped!";
216 warnKrita << " Failing tag:" << tagString;
217 return false;
218}
const TypeInfo * propertyType(const QString &_propertyName) const
const TypeInfo * embeddedPropertyType() const
#define warnKrita
Definition kis_debug.h:87

References KisMetaData::TypeInfo::embeddedPropertyType(), KisMetaData::TypeInfo::propertyType(), KisMetaData::Schema::propertyType(), KisMetaData::TypeInfo::structureSchema(), KisMetaData::TypeInfo::StructureType, and warnKrita.