29 switch (
value->typeId()) {
30 case Exiv2::signedByte:
31 case Exiv2::invalidTypeId:
32 case Exiv2::lastTypeId:
33 case Exiv2::directory:
36 case Exiv2::undefined: {
38 QByteArray array(
value->count(), 0);
39 value->copy(
reinterpret_cast<Exiv2::byte *
>(array.data()), Exiv2::invalidByteOrder);
40 return {QString(array.toBase64())};
42 case Exiv2::unsignedByte:
43 case Exiv2::unsignedShort:
44 case Exiv2::unsignedLong:
45 case Exiv2::signedShort:
46 case Exiv2::signedLong: {
47 if (
value->count() == 1 && !forceSeq) {
48#if EXIV2_TEST_VERSION(0,28,0)
49 return {
static_cast<int>(
value->toUint32())};
51 return {
static_cast<int>(
value->toLong())};
55 for (
int i = 0; i <
value->count(); i++)
56#
if EXIV2_TEST_VERSION(0,28,0)
57 array.push_back({
static_cast<int>(
value->toUint32(i))});
59 array.push_back({
static_cast<int>(
value->toLong(i))});
61 return {array, arrayType};
64 case Exiv2::asciiString:
67 return {QString::fromStdString(
value->toString())};
68 case Exiv2::unsignedRational:
69 if (
value->count() == 1 && !forceSeq) {
70 if (
value->size() < 2) {
77#if EXIV2_TEST_VERSION(0,28,0)
78 for (
size_t i = 0; i <
value->count(); i++) {
80 for (
long i = 0; i <
value->count(); i++) {
84 return {array, arrayType};
86 case Exiv2::signedRational:
87 if (
value->count() == 1 && !forceSeq) {
88 if (
value->size() < 2) {
95#if EXIV2_TEST_VERSION(0,28,0)
96 for (
size_t i = 0; i <
value->count(); i++) {
98 for (
long i = 0; i <
value->count(); i++) {
102 return {array, arrayType};
106 return {QDateTime::fromString(QString::fromStdString(
value->toString()), Qt::ISODate)};
127 case Exiv2::undefined: {
128 const QByteArray arr = QByteArray::fromBase64(variant.toString().toLatin1());
129 return new Exiv2::DataValue(
reinterpret_cast<const Exiv2::byte *
>(arr.data()), arr.size());
131 case Exiv2::unsignedByte:
132 return new Exiv2::ValueType<uint16_t>((uint16_t)variant.toUInt());
133 case Exiv2::unsignedShort:
134 return new Exiv2::ValueType<uint16_t>((uint16_t)variant.toUInt());
135 case Exiv2::unsignedLong:
136 return new Exiv2::ValueType<uint32_t>((uint32_t)variant.toUInt());
137 case Exiv2::signedShort:
138 return new Exiv2::ValueType<int16_t>((int16_t)variant.toInt());
139 case Exiv2::signedLong:
140 return new Exiv2::ValueType<int32_t>((int32_t)variant.toInt());
142 QDate date = variant.toDate();
143 return new Exiv2::DateValue(date.year(), date.month(), date.day());
145 case Exiv2::asciiString:
146 if (variant.type() == QVariant::DateTime) {
147 return new Exiv2::AsciiValue(
148 qPrintable(QLocale::c().toString(variant.toDateTime(), QStringLiteral(
"yyyy:MM:dd hh:mm:ss"))));
150 return new Exiv2::AsciiValue(qPrintable(variant.toString()));
151 case Exiv2::string: {
152 if (variant.type() == QVariant::DateTime) {
153 return new Exiv2::StringValue(
154 qPrintable(QLocale::c().toString(variant.toDateTime(), QStringLiteral(
"yyyy:MM:dd hh:mm:ss"))));
156 return new Exiv2::StringValue(qPrintable(variant.toString()));
159 return new Exiv2::CommentValue(qPrintable(variant.toString()));
181 switch (
value.type()) {
183 return Exiv2::Value::create(Exiv2::invalidTypeId).release();
189 if (type == Exiv2::signedRational) {
190 return new Exiv2::RationalValue({
value.asRational().numerator,
value.asRational().denominator});
192 return new Exiv2::URationalValue({
value.asRational().numerator,
value.asRational().denominator});
202 case Exiv2::unsignedByte:
204 case Exiv2::unsignedShort:
205 return arrayToExivValue<uint16_t>(
value);
206 case Exiv2::unsignedLong:
207 return arrayToExivValue<uint32_t>(
value);
208 case Exiv2::signedShort:
209 return arrayToExivValue<int16_t>(
value);
210 case Exiv2::signedLong:
211 return arrayToExivValue<int32_t>(
value);
212 case Exiv2::asciiString:
214 case Exiv2::string: {
223 result <<
v.asVariant().value<QString>();
225 return new Exiv2::StringValue(result.join(
',').toStdString());
227 case Exiv2::signedRational: {
228 Exiv2::RationalValue *exivValue =
new Exiv2::RationalValue();
230 exivValue->value_.reserve(
static_cast<size_t>(array.size()));
233 exivValue->value_.emplace_back(
value.numerator,
value.denominator);
237 case Exiv2::unsignedRational: {
238 Exiv2::URationalValue *exivValue =
new Exiv2::URationalValue();
240 exivValue->value_.reserve(
static_cast<size_t>(array.size()));
243 exivValue->value_.emplace_back(
static_cast<uint32_t
>(
value.numerator),
static_cast<uint32_t
>(
value.denominator));
267 switch (
value.type()) {
269 return new Exiv2::DataValue(Exiv2::invalidTypeId);
271 QVariant var =
value.asVariant();
272 if (var.type() == QVariant::Bool) {
274 return new Exiv2::XmpTextValue(
"True");
276 return new Exiv2::XmpTextValue(
"False");
280 return new Exiv2::XmpTextValue(var.toString().toLatin1().constData());
284 QString rat =
"%1 / %2";
285 rat = rat.arg(
value.asRational().numerator);
286 rat = rat.arg(
value.asRational().denominator);
287 return new Exiv2::XmpTextValue(rat.toLatin1().constData());
292 Exiv2::XmpArrayValue *arrV =
new Exiv2::XmpArrayValue();
293 switch (
value.type()) {
295 arrV->setXmpArrayType(Exiv2::XmpValue::xaSeq);
298 arrV->setXmpArrayType(Exiv2::XmpValue::xaBag);
301 arrV->setXmpArrayType(Exiv2::XmpValue::xaAlt);
310 arrV->read(exivValue->toString());
316 Exiv2::Value *arrV =
new Exiv2::LangAltValue;
317 QMap<QString, KisMetaData::Value> langArray =
value.asLangArray();
318 for (
auto it = langArray.begin(); it != langArray.end(); ++it) {
320 if (it.key() !=
"x-default") {
321 exivVal =
"lang=" + it.key() +
' ';
324 QVariant var = it.value().asVariant();
326 exivVal += var.toString();
327 arrV->read(exivVal.toLatin1().constData());
333 warnKrita <<
"KisExiv2: Unhandled value type";
337 warnKrita <<
"KisExiv2: Unhandled value type";