/* PIP - Platform Independent Primitives PIValueTree conversions Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #include "pivaluetree_conversions.h" #include "pipropertystorage.h" #include "pijson.h" #include "piiostring.h" PIValueTree PIValueTreeConversions::fromPropertyStorage(const PIPropertyStorage & ps) { PIValueTree ret; for (const auto & i: ps) { PIValueTree v; v.setName(i.name); v.setValue(i.value); v.setComment(i.comment); ret.addChild(v); } return ret; } PIValueTree fromJSONTree(const PIJSON & json) { PIValueTree ret; ret.setName(json["name"].toString()); ret.setComment(json["comment"].toString()); PIString value_str = json["value"].toString(); PIVariant value = PIVariant::fromType(json["type"].toString()); if (value_str.isNotEmpty()) { if (value.isValid()) value.setValueFromString(value_str); else value = value_str; } ret.setValue(value); const PIJSON & attr(json["attributes"]); for (const auto & i: attr.object()) ret.attributes()[i.first] = i.second.value(); bool is_array = ret.isArray(); int chindex = 0; const PIJSON & chl(json["children"]); for (const auto & i: chl.array()) { PIValueTree c = fromJSONTree(i); if (is_array) c.setName(PIString::fromNumber(chindex++)); ret.addChild(c); } return ret; } PIValueTree PIValueTreeConversions::fromJSON(const PIJSON & json) { PIValueTree ret; if (json.isObject()) ret = fromJSONTree(json); if (json.isArray()) { for (const auto & i: json.array()) ret.addChild(fromJSONTree(i)); } return ret; } PIValueTree PIValueTreeConversions::fromText(PIIODevice * device) { PIValueTree ret; return ret; } PIJSON toJSONTree(const PIValueTree & root) { PIJSON ret = PIJSON::newObject(); if (root.name().isNotEmpty()) ret["name"] = root.name(); if (root.comment().isNotEmpty()) ret["comment"] = root.comment(); if (root.value().isValid()) { ret["type"] = root.value().typeName(); ret["value"] = root.value().toString(); } if (root.attributes().isNotEmpty()) { PIJSON j; for (const auto & a: root.attributes()) j[a.first] = a.second.toString(); ret["attributes"] = j; } if (root.hasChildren()) { PIJSON j; for (const auto & c: root.children()) j << toJSONTree(c); ret["children"] = j; } return ret; } PIJSON PIValueTreeConversions::toJSON(const PIValueTree & root) { PIJSON ret = PIJSON::newArray(); for (const auto & c: root.children()) ret << toJSONTree(c); return ret; } PIString PIValueTreeConversions::toText(const PIValueTree & root) { PIString ret; return ret; }