From 4a9a916012b949c9dda6833e4e44e932d38993d4 Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Sun, 4 Jun 2023 18:04:59 +0200 Subject: [PATCH] Fix build with exiv2 0.28 --- plugins/impex/jpeg/kis_jpeg_converter.cc | 8 ++ plugins/impex/tiff/kis_tiff_export.cc | 9 +++ plugins/impex/tiff/kis_tiff_import.cc | 9 +++ plugins/metadata/common/KisExiv2IODevice.cpp | 36 +++++++++ plugins/metadata/common/KisExiv2IODevice.h | 23 ++++++ plugins/metadata/common/kis_exiv2_common.h | 26 ++++++- plugins/metadata/exif/kis_exif_io.cpp | 79 +++++++++++++++++++- plugins/metadata/iptc/kis_iptc_io.cpp | 12 +++ plugins/metadata/xmp/kis_xmp_io.cpp | 9 ++- 9 files changed, 202 insertions(+), 9 deletions(-) diff --git a/plugins/impex/jpeg/kis_jpeg_converter.cc b/plugins/impex/jpeg/kis_jpeg_converter.cc index 3364ae6..476151e 100644 --- a/plugins/impex/jpeg/kis_jpeg_converter.cc +++ b/plugins/impex/jpeg/kis_jpeg_converter.cc @@ -20,6 +20,10 @@ extern "C" { } #include +#include +#if EXIV2_TEST_VERSION(0,28,0) +#include +#endif #include #include @@ -376,7 +380,11 @@ KisImportExportErrorCode KisJPEGConverter::decode(QIODevice *io) uint32_t sizeHdr = 0; // Find actual Iptc data within the APP13 segment if (!Exiv2::Photoshop::locateIptcIrb((Exiv2::byte*)(marker->data + 14), +#if EXIV2_TEST_VERSION(0,28,0) + marker->data_length - 14, &record, sizeHdr, sizeIptc)) { +#else marker->data_length - 14, &record, &sizeHdr, &sizeIptc)) { +#endif if (sizeIptc) { // Decode the IPTC data QByteArray byteArray((const char*)(record + sizeHdr), sizeIptc); diff --git a/plugins/impex/tiff/kis_tiff_export.cc b/plugins/impex/tiff/kis_tiff_export.cc index 8c8f71d..69cbda6 100644 --- a/plugins/impex/tiff/kis_tiff_export.cc +++ b/plugins/impex/tiff/kis_tiff_export.cc @@ -206,7 +206,11 @@ KisImportExportErrorCode KisTIFFExport::convert(KisDocument *document, QIODevice try { KisExiv2IODevice::ptr_type basicIoDevice(new KisExiv2IODevice(filename())); +#if EXIV2_TEST_VERSION(0,28,0) + const std::unique_ptr img = Exiv2::ImageFactory::open(std::move(basicIoDevice)); +#else const std::unique_ptr img(Exiv2::ImageFactory::open(basicIoDevice).release()); +#endif img->readMetadata(); @@ -241,9 +245,14 @@ KisImportExportErrorCode KisTIFFExport::convert(KisDocument *document, QIODevice } // Write metadata img->writeMetadata(); +#if EXIV2_TEST_VERSION(0,28,0) + } catch (Exiv2::Error &e) { + errFile << "Failed injecting TIFF metadata:" << Exiv2::Error(e.code()).what(); +#else } catch (Exiv2::AnyError &e) { errFile << "Failed injecting TIFF metadata:" << e.code() << e.what(); +#endif } } return ImportExportCodes::OK; diff --git a/plugins/impex/tiff/kis_tiff_import.cc b/plugins/impex/tiff/kis_tiff_import.cc index 3845cc5..19b37d7 100644 --- a/plugins/impex/tiff/kis_tiff_import.cc +++ b/plugins/impex/tiff/kis_tiff_import.cc @@ -1840,7 +1840,11 @@ KisTIFFImport::convert(KisDocument *document, try { KisExiv2IODevice::ptr_type basicIoDevice(new KisExiv2IODevice(filename())); +#if EXIV2_TEST_VERSION(0,28,0) + const std::unique_ptr readImg = Exiv2::ImageFactory::open(std::move(basicIoDevice)); +#else const std::unique_ptr readImg(Exiv2::ImageFactory::open(basicIoDevice).release()); +#endif readImg->readMetadata(); @@ -1908,8 +1912,13 @@ KisTIFFImport::convert(KisDocument *document, // Inject the data as any other IOBackend io->loadFrom(layer->metaData(), &ioDevice); +#if EXIV2_TEST_VERSION(0,28,0) + } catch (Exiv2::Error &e) { + errFile << "Failed metadata import:" << Exiv2::Error(e.code()).what(); +#else } catch (Exiv2::AnyError &e) { errFile << "Failed metadata import:" << e.code() << e.what(); +#endif } } diff --git a/plugins/metadata/common/KisExiv2IODevice.cpp b/plugins/metadata/common/KisExiv2IODevice.cpp index c62e2d1..bf5cdc2 100644 --- a/plugins/metadata/common/KisExiv2IODevice.cpp +++ b/plugins/metadata/common/KisExiv2IODevice.cpp @@ -39,7 +39,11 @@ int KisExiv2IODevice::close() return 0; } +#if EXIV2_TEST_VERSION(0,28,0) +size_t KisExiv2IODevice::write(const Exiv2::byte *data, size_t wcount) +#else long KisExiv2IODevice::write(const Exiv2::byte *data, long wcount) +#endif { if (!m_file.isWritable()) { qWarning() << "KisExiv2IODevice: File not open for writing."; @@ -53,7 +57,11 @@ long KisExiv2IODevice::write(const Exiv2::byte *data, long wcount) return 0; } +#if EXIV2_TEST_VERSION(0,28,0) +size_t KisExiv2IODevice::write(Exiv2::BasicIo &src) +#else long KisExiv2IODevice::write(Exiv2::BasicIo &src) +#endif { if (static_cast(this) == &src) { return 0; @@ -88,15 +96,28 @@ int KisExiv2IODevice::putb(Exiv2::byte data) } } +#if EXIV2_TEST_VERSION(0,28,0) +Exiv2::DataBuf KisExiv2IODevice::read(size_t rcount) +#else Exiv2::DataBuf KisExiv2IODevice::read(long rcount) +#endif { Exiv2::DataBuf buf(rcount); +#if EXIV2_TEST_VERSION(0,28,0) + const size_t readCount = read(buf.data(), buf.size()); + buf.resize(readCount); +#else const long readCount = read(buf.pData_, buf.size_); buf.size_ = readCount; +#endif return buf; } +#if EXIV2_TEST_VERSION(0,28,0) +size_t KisExiv2IODevice::read(Exiv2::byte *buf, size_t rcount) +#else long KisExiv2IODevice::read(Exiv2::byte *buf, long rcount) +#endif { const qint64 bytesRead = m_file.read(reinterpret_cast(buf), rcount); if (bytesRead > 0) { @@ -202,7 +223,18 @@ int KisExiv2IODevice::munmap() return 0; } +#if EXIV2_TEST_VERSION(0,28,0) +void KisExiv2IODevice::populateFakeData() +{ + return; +} +#endif + +#if EXIV2_TEST_VERSION(0,28,0) +size_t KisExiv2IODevice::tell() const +#else long KisExiv2IODevice::tell() const +#endif { return m_file.pos(); } @@ -231,7 +263,11 @@ bool KisExiv2IODevice::eof() const return m_file.atEnd(); } +#if EXIV2_TEST_VERSION(0,28,0) +const std::string& KisExiv2IODevice::path() const noexcept +#else std::string KisExiv2IODevice::path() const +#endif { return filePathQString().toStdString(); } diff --git a/plugins/metadata/common/KisExiv2IODevice.h b/plugins/metadata/common/KisExiv2IODevice.h index d90831e..27f5f8d 100644 --- a/plugins/metadata/common/KisExiv2IODevice.h +++ b/plugins/metadata/common/KisExiv2IODevice.h @@ -18,18 +18,30 @@ class KRITAEXIFCOMMON_EXPORT KisExiv2IODevice : public Exiv2::BasicIo { public: +#if EXIV2_TEST_VERSION(0,28,0) + using ptr_type = Exiv2::BasicIo::UniquePtr; +#else using ptr_type = Exiv2::BasicIo::AutoPtr; +#endif KisExiv2IODevice(QString path); ~KisExiv2IODevice() override; int open() override; int close() override; +#if EXIV2_TEST_VERSION(0,28,0) + size_t write(const Exiv2::byte *data, size_t wcount) override; + size_t write(Exiv2::BasicIo &src) override; + int putb(Exiv2::byte data) override; + Exiv2::DataBuf read(size_t rcount) override; + size_t read(Exiv2::byte *buf, size_t rcount) override; +#else long write(const Exiv2::byte *data, long wcount) override; long write(Exiv2::BasicIo &src) override; int putb(Exiv2::byte data) override; Exiv2::DataBuf read(long rcount) override; long read(Exiv2::byte *buf, long rcount) override; +#endif int getb() override; void transfer(BasicIo &src) override; #if defined(_MSC_VER) @@ -39,13 +51,24 @@ public: #endif Exiv2::byte *mmap(bool isWriteable = false) override; +#if EXIV2_TEST_VERSION(0,28,0) + void populateFakeData() override; +#endif int munmap() override; +#if EXIV2_TEST_VERSION(0,28,0) + size_t tell() const override; +#else long tell() const override; +#endif size_t size() const override; bool isopen() const override; int error() const override; bool eof() const override; +#if EXIV2_TEST_VERSION(0,28,0) + const std::string& path() const noexcept override; +#else std::string path() const override; +#endif private: bool open(QFile::OpenMode mode); diff --git a/plugins/metadata/common/kis_exiv2_common.h b/plugins/metadata/common/kis_exiv2_common.h index 3ab34bb..b4912c7 100644 --- a/plugins/metadata/common/kis_exiv2_common.h +++ b/plugins/metadata/common/kis_exiv2_common.h @@ -19,9 +19,11 @@ // Convert an exiv value to a KisMetaData value inline KisMetaData::Value -exivValueToKMDValue(const Exiv2::Value::AutoPtr value, - bool forceSeq, - KisMetaData::Value::ValueType arrayType = KisMetaData::Value::UnorderedArray) +#if EXIV2_TEST_VERSION(0,28,0) +exivValueToKMDValue(const Exiv2::Value::UniquePtr &value, bool forceSeq, KisMetaData::Value::ValueType arrayType = KisMetaData::Value::UnorderedArray) +#else + exivValueToKMDValue(const Exiv2::Value::AutoPtr &value, bool forceSeq, KisMetaData::Value::ValueType arrayType = KisMetaData::Value::UnorderedArray) +#endif { switch (value->typeId()) { case Exiv2::signedByte: @@ -42,11 +44,19 @@ exivValueToKMDValue(const Exiv2::Value::AutoPtr value, case Exiv2::signedShort: case Exiv2::signedLong: { if (value->count() == 1 && !forceSeq) { - return KisMetaData::Value((int)value->toLong()); +#if EXIV2_TEST_VERSION(0,28,0) + return {static_cast(value->toUint32())}; +#else + return {static_cast(value->toLong())}; +#endif } else { QList array; for (int i = 0; i < value->count(); i++) +#if EXIV2_TEST_VERSION(0,28,0) + array.push_back(KisMetaData::Value((int)value->toUint32(i))); +#else array.push_back(KisMetaData::Value((int)value->toLong(i))); +#endif return KisMetaData::Value(array, arrayType); } } @@ -63,7 +73,11 @@ exivValueToKMDValue(const Exiv2::Value::AutoPtr value, return {KisMetaData::Rational(value->toRational().first, value->toRational().second)}; } else { QList array; +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < value->count(); i++) { +#else for (long i = 0; i < value->count(); i++) { +#endif array.push_back(KisMetaData::Rational(value->toRational(i).first, value->toRational(i).second)); } return KisMetaData::Value(array, arrayType); @@ -77,7 +91,11 @@ exivValueToKMDValue(const Exiv2::Value::AutoPtr value, return KisMetaData::Value(KisMetaData::Rational(value->toRational().first, value->toRational().second)); } else { QList array; +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < value->count(); i++) { +#else for (long i = 0; i < value->count(); i++) { +#endif array.push_back(KisMetaData::Rational(value->toRational(i).first, value->toRational(i).second)); } return KisMetaData::Value(array, arrayType); diff --git a/plugins/metadata/exif/kis_exif_io.cpp b/plugins/metadata/exif/kis_exif_io.cpp index 4469712..6afdf75 100644 --- a/plugins/metadata/exif/kis_exif_io.cpp +++ b/plugins/metadata/exif/kis_exif_io.cpp @@ -31,7 +31,11 @@ // ---- Exception conversion functions ---- // // convert ExifVersion and FlashpixVersion to a KisMetaData value +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value exifVersionToKMDValue(const Exiv2::Value::UniquePtr value) +#else KisMetaData::Value exifVersionToKMDValue(const Exiv2::Value::AutoPtr value) +#endif { const Exiv2::DataValue *dvalue = dynamic_cast(&*value); if (dvalue) { @@ -55,13 +59,22 @@ Exiv2::Value *kmdValueToExifVersion(const KisMetaData::Value &value) } // Convert an exif array of integer string to a KisMetaData array of integer +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value exifArrayToKMDIntOrderedArray(const Exiv2::Value::UniquePtr value) +#else KisMetaData::Value exifArrayToKMDIntOrderedArray(const Exiv2::Value::AutoPtr value) +#endif { QList v; const Exiv2::DataValue *dvalue = dynamic_cast(&*value); if (dvalue) { +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < dvalue->count(); i++) { + v.push_back({(int)dvalue->toUint32(i)}); +#else for (long i = 0; i < dvalue->count(); i++) { v.push_back({(int)dvalue->toLong(i)}); +#endif } } else { Q_ASSERT(value->typeId() == Exiv2::asciiString); @@ -81,7 +94,11 @@ Exiv2::Value *kmdIntOrderedArrayToExifArray(const KisMetaData::Value &value) return new Exiv2::DataValue(v.data(), static_cast(v.size())); } +#if EXIV2_TEST_VERSION(0,28,0) +QDateTime exivValueToDateTime(const Exiv2::Value::UniquePtr value) +#else QDateTime exivValueToDateTime(const Exiv2::Value::AutoPtr value) +#endif { return QDateTime::fromString(value->toString().c_str(), Qt::ISODate); } @@ -115,7 +132,11 @@ Exiv2::ByteOrder invertByteOrder(Exiv2::ByteOrder order) return Exiv2::invalidByteOrder; } +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value exifOECFToKMDOECFStructure(const Exiv2::Value::UniquePtr value, Exiv2::ByteOrder order) +#else KisMetaData::Value exifOECFToKMDOECFStructure(const Exiv2::Value::AutoPtr value, Exiv2::ByteOrder order) +#endif { QMap oecfStructure; const Exiv2::DataValue *dvalue = dynamic_cast(&*value); @@ -123,22 +144,39 @@ KisMetaData::Value exifOECFToKMDOECFStructure(const Exiv2::Value::AutoPtr value, QByteArray array(dvalue->count(), 0); dvalue->copy((Exiv2::byte *)array.data()); +#if EXIV2_TEST_VERSION(0,28,0) + size_t columns = fixEndianess((reinterpret_cast(array.data()))[0], order); + size_t rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#else int columns = fixEndianess((reinterpret_cast(array.data()))[0], order); int rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#endif if ((columns * rows + 4) > dvalue->count()) { // Sometime byteOrder get messed up (especially if metadata got saved with kexiv2 library, // or any library that doesn't save back with the same byte order as the camera) order = invertByteOrder(order); +#if EXIV2_TEST_VERSION(0,28,0) + columns = fixEndianess((reinterpret_cast(array.data()))[0], order); + rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#else columns = fixEndianess((reinterpret_cast(array.data()))[0], order); rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#endif Q_ASSERT((columns * rows + 4) > dvalue->count()); } - oecfStructure["Columns"] = KisMetaData::Value(columns); - oecfStructure["Rows"] = KisMetaData::Value(rows); + QVariant qcolumns, qrows; + qcolumns.setValue(columns); + qrows.setValue(rows); + oecfStructure["Columns"] = KisMetaData::Value(qcolumns); + oecfStructure["Rows"] = KisMetaData::Value(qrows); int index = 4; QList names; +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < columns; i++) { +#else for (int i = 0; i < columns; i++) { +#endif int lastIndex = array.indexOf((char)0, index); QString name = array.mid(index, lastIndex - index); if (index != lastIndex) { @@ -153,8 +191,13 @@ KisMetaData::Value exifOECFToKMDOECFStructure(const Exiv2::Value::AutoPtr value, oecfStructure["Names"] = KisMetaData::Value(names, KisMetaData::Value::OrderedArray); QList values; qint32 *dataIt = reinterpret_cast(array.data() + index); +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < columns; i++) { + for (size_t j = 0; j < rows; j++) { +#else for (int i = 0; i < columns; i++) { for (int j = 0; j < rows; j++) { +#endif values.append(KisMetaData::Value( KisMetaData::Rational(fixEndianess(dataIt[0], order), fixEndianess(dataIt[1], order)))); dataIt += 2; @@ -202,7 +245,11 @@ Exiv2::Value *kmdOECFStructureToExifOECF(const KisMetaData::Value &value) return new Exiv2::DataValue((const Exiv2::byte *)array.data(), array.size()); } +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value deviceSettingDescriptionExifToKMD(const Exiv2::Value::UniquePtr value) +#else KisMetaData::Value deviceSettingDescriptionExifToKMD(const Exiv2::Value::AutoPtr value) +#endif { QMap deviceSettingStructure; QByteArray array; @@ -258,15 +305,24 @@ Exiv2::Value *deviceSettingDescriptionKMDToExif(const KisMetaData::Value &value) return new Exiv2::DataValue((const Exiv2::byte *)array.data(), array.size()); } +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value cfaPatternExifToKMD(const Exiv2::Value::UniquePtr value, Exiv2::ByteOrder order) +#else KisMetaData::Value cfaPatternExifToKMD(const Exiv2::Value::AutoPtr value, Exiv2::ByteOrder order) +#endif { QMap cfaPatternStructure; const Exiv2::DataValue *dvalue = dynamic_cast(&*value); Q_ASSERT(dvalue); QByteArray array(dvalue->count(), 0); dvalue->copy((Exiv2::byte *)array.data()); +#if EXIV2_TEST_VERSION(0,28,0) + size_t columns = fixEndianess((reinterpret_cast(array.data()))[0], order); + size_t rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#else int columns = fixEndianess((reinterpret_cast(array.data()))[0], order); int rows = fixEndianess((reinterpret_cast(array.data()))[1], order); +#endif if ((columns * rows + 4) != dvalue->count()) { // Sometime byteOrder get messed up (especially if metadata got saved with kexiv2 library, // or any library that doesn't save back with the same byte order as the camera) @@ -275,8 +331,11 @@ KisMetaData::Value cfaPatternExifToKMD(const Exiv2::Value::AutoPtr value, Exiv2: rows = fixEndianess((reinterpret_cast(array.data()))[1], order); Q_ASSERT((columns * rows + 4) == dvalue->count()); } - cfaPatternStructure["Columns"] = KisMetaData::Value(columns); - cfaPatternStructure["Rows"] = KisMetaData::Value(rows); + QVariant qcolumns, qrows; + qcolumns.setValue(columns); + qrows.setValue(rows); + cfaPatternStructure["Columns"] = KisMetaData::Value(qcolumns); + cfaPatternStructure["Rows"] = KisMetaData::Value(qrows); QList values; int index = 4; for (int i = 0; i < columns * rows; i++) { @@ -310,9 +369,17 @@ Exiv2::Value *cfaPatternKMDToExif(const KisMetaData::Value &value) // Read and write Flash // +#if EXIV2_TEST_VERSION(0,28,0) +KisMetaData::Value flashExifToKMD(const Exiv2::Value::UniquePtr value) +#else KisMetaData::Value flashExifToKMD(const Exiv2::Value::AutoPtr value) +#endif { +#if EXIV2_TEST_VERSION(0,28,0) + const uint16_t v = static_cast(value->toUint32()); +#else const uint16_t v = static_cast(value->toLong()); +#endif QMap flashStructure; bool fired = (v & 0x01); // bit 1 is whether flash was fired or not flashStructure["Fired"] = QVariant(fired); @@ -465,7 +532,11 @@ bool KisExifIO::saveTo(KisMetaData::Store *store, QIODevice *ioDevice, HeaderTyp << exivKey; // << " of KMD value" << entry.value(); } } +#if EXIV2_TEST_VERSION(0,28,0) + } catch (Exiv2::Error &e) { +#else } catch (Exiv2::AnyError &e) { +#endif dbgMetaData << "exiv error " << e.what(); } } diff --git a/plugins/metadata/iptc/kis_iptc_io.cpp b/plugins/metadata/iptc/kis_iptc_io.cpp index 05f66ee..06f91ed 100644 --- a/plugins/metadata/iptc/kis_iptc_io.cpp +++ b/plugins/metadata/iptc/kis_iptc_io.cpp @@ -110,7 +110,11 @@ bool KisIptcIO::saveTo(KisMetaData::Store *store, QIODevice *ioDevice, HeaderTyp if (v && v->typeId() != Exiv2::invalidTypeId) { iptcData.add(iptcKey, v); } +#if EXIV2_TEST_VERSION(0,28,0) + } catch (Exiv2::Error &e) { +#else } catch (Exiv2::AnyError &e) { +#endif dbgMetaData << "exiv error " << e.what(); } } @@ -128,7 +132,11 @@ bool KisIptcIO::saveTo(KisMetaData::Store *store, QIODevice *ioDevice, HeaderTyp header.append(photoshopBimId_); header.append(photoshopIptc_); header.append(QByteArray(2, 0)); +#if EXIV2_TEST_VERSION(0, 28, 0) + qint32 size = rawData.size(); +#else qint32 size = rawData.size_; +#endif QByteArray sizeArray(4, 0); sizeArray[0] = (char)((size & 0xff000000) >> 24); sizeArray[1] = (char)((size & 0x00ff0000) >> 16); @@ -138,7 +146,11 @@ bool KisIptcIO::saveTo(KisMetaData::Store *store, QIODevice *ioDevice, HeaderTyp ioDevice->write(header); } +#if EXIV2_TEST_VERSION(0, 28, 0) + ioDevice->write((const char *)rawData.data(), rawData.size()); +#else ioDevice->write((const char *)rawData.pData_, rawData.size_); +#endif ioDevice->close(); return true; } diff --git a/plugins/metadata/xmp/kis_xmp_io.cpp b/plugins/metadata/xmp/kis_xmp_io.cpp index 14990de..afb6aa9 100644 --- a/plugins/metadata/xmp/kis_xmp_io.cpp +++ b/plugins/metadata/xmp/kis_xmp_io.cpp @@ -248,8 +248,11 @@ bool KisXMPIO::loadFrom(KisMetaData::Store *store, QIODevice *ioDevice) const Q_ASSERT(schema); } } +#if EXIV2_TEST_VERSION(0,28,0) + const Exiv2::Value::UniquePtr value = it->getValue(); +#else const Exiv2::Value::AutoPtr value = it->getValue(); - +#endif QString structName; int arrayIndex = -1; QString tagName; @@ -278,7 +281,11 @@ bool KisXMPIO::loadFrom(KisMetaData::Store *store, QIODevice *ioDevice) const const Exiv2::XmpArrayValue *xav = dynamic_cast(value.get()); Q_ASSERT(xav); QList array; +#if EXIV2_TEST_VERSION(0,28,0) + for (size_t i = 0; i < xav->count(); ++i) { +#else for (int i = 0; i < xav->count(); ++i) { +#endif QString value = QString::fromStdString(xav->toString(i)); if (parser) { array.push_back(parser->parse(value)); -- 2.41.0