Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_xmp_io.cpp File Reference
#include "kis_xmp_io.h"
#include <string>
#include <QIODevice>
#include <QRegularExpression>
#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 <KisUsageLogger.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 36 of file kis_xmp_io.cpp.

37{
38 const QByteArray latin1SchemaUri = _schema->uri().toLatin1();
39 std::string prefix = Exiv2::XmpProperties::prefix(latin1SchemaUri.constData());
40 if (prefix.empty()) {
41 dbgMetaData << "Unknown namespace " << ppVar(_schema->uri()) << ppVar(_schema->prefix());
42 prefix = _schema->prefix().toLatin1().constData();
43 Exiv2::XmpProperties::registerNs(latin1SchemaUri.constData(), prefix);
44 }
45 return prefix;
46}
#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 )

We use Unicode-matching mode, because according to XML specification the name of an entity can contain Unicode characters.

Definition at line 167 of file kis_xmp_io.cpp.

173{
174 arrayIndex = -1;
175 *typeInfo = 0;
176
177 int numSubNames = tagString.count('/') + 1;
178
179 if (numSubNames == 1) {
180 structName.clear();
181 tagName = tagString;
182 *typeInfo = schema->propertyType(tagName);
183 return true;
184 }
185
186 if (numSubNames == 2) {
191 QRegularExpression regexp("([A-Za-z]\\w+)/([A-Za-z]\\w+):([A-Za-z]\\w+)");
192 regexp.setPatternOptions(QRegularExpression::UseUnicodePropertiesOption);
193
194 QRegularExpressionMatch match;
195 if (tagString.contains(regexp, &match)) {
196 structName = match.captured(1);
197 tagName = match.captured(3);
198 *typeInfo = schema->propertyType(structName);
199
200 if (*typeInfo && (*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
201 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
202 }
203
204 return true;
205 }
206
207 QRegularExpression regexp2("([A-Za-z]\\w+)\\[(\\d+)\\]/([A-Za-z]\\w+):([A-Za-z]\\w+)");
208 regexp2.setPatternOptions(QRegularExpression::UseUnicodePropertiesOption);
209
210 QRegularExpressionMatch match2;
211 if (tagString.contains(regexp2, &match2)) {
212 structName = match2.captured(1);
213 arrayIndex = match2.captured(2).toInt() - 1;
214 tagName = match2.captured(4);
215
216 if (schema->propertyType(structName)) {
217 *typeInfo = schema->propertyType(structName)->embeddedPropertyType();
218 Q_ASSERT(*typeInfo);
219
220 if ((*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
221 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
222 }
223 }
224
225 return true;
226 }
227 }
228
229 warnKrita << "WARNING: Unsupported tag. We do not yet support nested tags. The tag will be dropped!";
230 warnKrita << " Failing tag:" << tagString;
231 return false;
232}
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.