1/*
2 This file is part of the KDE Baloo project.
3 SPDX-FileCopyrightText: 2019 Stefan BrĂ¼ns <stefan.bruens@rwth-aachen.de>
4
5 SPDX-License-Identifier: LGPL-2.1-or-later
6*/
7
8#include "propertydata.h"
9#include <QJsonArray>
10#include <QJsonValue>
11
12namespace Baloo
13{
14
15const QJsonObject propertyMapToJson(const KFileMetaData::PropertyMultiMap& properties)
16{
17 auto it = properties.cbegin();
18 QJsonObject jsonDict;
19
20 while (it != properties.cend()) {
21 auto property = it.key();
22 QString keyString = QString::number(static_cast<int>(property));
23
24 auto rangeEnd = properties.upperBound(key: property);
25
26 QJsonValue value;
27 // In case a key has multiple values, convert to QJsonArray
28 if (std::distance(first: it, last: rangeEnd) > 1) {
29 QJsonArray values;
30
31 // Last inserted is first element, for backwards compatible
32 // ordering prepend earlier elements
33 while (it != rangeEnd) {
34 values.insert(i: 0, value: QJsonValue::fromVariant(variant: it.value()));
35 ++it;
36 };
37
38 value = values;
39 } else {
40 auto type = it.value().userType();
41 if ((type == QMetaType::QVariantList) || (type == QMetaType::QStringList)) {
42 // if it is a QList<T>, recurse
43 auto list = it.value().toList();
44 QJsonArray values;
45 while (!list.isEmpty()) {
46 values.push_back(t: QJsonValue::fromVariant(variant: list.takeLast()));
47 }
48 value = values;
49 } else {
50 value = QJsonValue::fromVariant(variant: it.value());
51 }
52 }
53
54 jsonDict.insert(key: keyString, value);
55
56 // pivot to next key
57 it = rangeEnd;
58 }
59
60 return jsonDict;
61}
62
63const KFileMetaData::PropertyMultiMap jsonToPropertyMap(const QJsonObject& properties)
64{
65 KFileMetaData::PropertyMultiMap propertyMap;
66
67 auto it = properties.begin();
68 while (it != properties.end()) {
69 int propNum = it.key().toInt();
70 auto prop = static_cast<KFileMetaData::Property::Property>(propNum);
71
72 if (it.value().isArray()) {
73 const auto values = it.value().toArray();
74 for (const auto val : values) {
75 propertyMap.insert(key: prop, value: val.toVariant());
76 }
77
78 } else if (it.value().isDouble()) {
79 propertyMap.insert(key: prop, value: it.value().toDouble());
80 } else {
81 propertyMap.insert(key: prop, value: it.value().toString());
82 }
83 ++it;
84 }
85
86 return propertyMap;
87}
88
89} // namespace Baloo
90

source code of baloo/src/file/propertydata.cpp