4 Commits

Author SHA1 Message Date
f50a3abc8e PIString::buildData for ICU fix according to official doc 2026-02-08 17:01:52 +03:00
8c15113cb0 fix PIHTTPClient with queryArguments 2026-02-08 02:50:54 +03:00
4253acb72b rename override to override_vt 2026-02-03 20:33:23 +03:00
e22630b1bd version 5.5.4
add PIValueTree::merge
PIValueTreeConversions::from*File supports .override files (replace or add values)
empty JSON arrays now 0 size
2026-02-03 18:56:58 +03:00
7 changed files with 63 additions and 10 deletions

View File

@@ -6,7 +6,7 @@ endif()
project(PIP)
set(PIP_MAJOR 5)
set(PIP_MINOR 5)
set(PIP_REVISION 3)
set(PIP_REVISION 4)
set(PIP_SUFFIX )
set(PIP_COMPANY SHS)
set(PIP_DOMAIN org.SHS)

View File

@@ -59,7 +59,7 @@ bool PIHTTPClient::init() {
if (is_cancel) return false;
CurlThreadPool::instance();
if (!PRIVATE->init()) return false;
auto ait = request.arguments().makeIterator();
auto ait = request.queryArguments().makeIterator();
while (ait.next()) {
if (!url.contains('?'))
url.append('?');

View File

@@ -400,9 +400,9 @@ PIJSON PIJSON::parseValue(PIString & s) {
s.trim();
if (s.isEmpty()) return ret;
if (s[0] == '{') {
ret = parseObject(s.takeRange('{', '}'));
ret = parseObject(s.takeRange('{', '}').trim());
} else if (s[0] == '[') {
ret = parseArray(s.takeRange('[', ']'));
ret = parseArray(s.takeRange('[', ']').trim());
} else {
s.trim();
if (s.startsWith('"')) {

View File

@@ -42,6 +42,14 @@ PIString mask(const PIString & str) {
return ret;
}
PIString overrideFile(PIString path) {
if (path.isEmpty()) return {};
PIFile::FileInfo fi(path);
auto ext = fi.extension();
path.insert(path.size_s() - ext.size_s() - (ext.isEmpty() ? 0 : 1), ".override");
return path;
}
PIValueTree PIValueTreeConversions::fromPropertyStorage(const PIPropertyStorage & ps) {
PIValueTree ret;
@@ -292,7 +300,11 @@ PIString toTextTree(const PIValueTree & root, PIString prefix, PIValueTreeConver
ret += "\n[" + prefix + "]\n";
if (root.isArray() && options[PIValueTreeConversions::WithAttributes]) ret += toTextTreeAttributes(root, "", options);
for (const auto & c: root.children()) {
PIString cp = prefix;
if (c.hasChildren()) continue;
ret += toTextTree(c, prefix, options);
}
for (const auto & c: root.children()) {
if (!c.hasChildren()) continue;
ret += toTextTree(c, prefix, options);
}
} else {
@@ -315,9 +327,13 @@ PIString toTextTree(const PIValueTree & root, PIString prefix, PIValueTreeConver
PIString PIValueTreeConversions::toText(const PIValueTree & root, Options options) {
PIString ret;
for (const auto & c: root.children()) {
ret += toTextTree(c, PIString(), options);
if (c.hasChildren()) continue;
ret += toTextTree(c, {}, options);
}
for (const auto & c: root.children()) {
if (!c.hasChildren()) continue;
ret += toTextTree(c, {}, options);
}
return ret;
}
@@ -329,13 +345,26 @@ PIValueTree PIValueTreeConversions::fromText(const PIString & str) {
PIValueTree PIValueTreeConversions::fromJSONFile(const PIString & path) {
return PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(path))));
auto ret = PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(path))));
auto ofp = overrideFile(path);
if (PIFile::isExists(ofp)) {
auto override_vt = PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(ofp))));
ret.merge(override_vt);
}
return ret;
}
PIValueTree PIValueTreeConversions::fromTextFile(const PIString & path) {
PIFile f(path, PIIODevice::ReadOnly);
return PIValueTreeConversions::fromText(&f);
auto ret = PIValueTreeConversions::fromText(&f);
auto ofp = overrideFile(path);
if (PIFile::isExists(ofp)) {
PIFile of(ofp, PIIODevice::ReadOnly);
auto override_vt = PIValueTreeConversions::fromText(&of);
ret.merge(override_vt);
}
return ret;
}

View File

@@ -469,7 +469,7 @@ void PIString::buildData(const char * cp) const {
UErrorCode e((UErrorCode)0);
UConverter * cc = ucnv_open(cp, &e);
if (cc) {
const size_t len = MB_CUR_MAX * size() + 1;
const size_t len = UCNV_GET_MAX_BYTES_FOR_STRING(size(), ucnv_getMaxCharSize(cc)) + 1; // MB_CUR_MAX * size() + 1;
data_ = (char *)malloc(len);
int sz = ucnv_fromUChars(cc, data_, len, (const UChar *)(d.data()), d.size_s(), &e);
ucnv_close(cc);

View File

@@ -124,6 +124,23 @@ void PIValueTree::applyValues(const PIValueTree & root, bool recursive) {
}
void PIValueTree::merge(const PIValueTree & root) {
if (_is_null) return;
for (const auto & c: root._children) {
bool found = false;
for (auto & i: _children) {
if (c.name() == i.name()) {
if (c.isValid()) i._value = c._value;
i.merge(c);
found = true;
break;
}
}
if (!found) _children << c;
}
}
PIVariant PIValueTree::childValue(const PIString & child_name, const PIVariant & default_value, bool * exists) const {
const PIValueTree & node = child(child_name);
if (node.isNull()) {

View File

@@ -170,6 +170,13 @@ public:
//! \param recursive Если установлено в true, то значения будут применяться рекурсивно к дочерним узлам.
void applyValues(const PIValueTree & root, bool recursive = true);
//! \~\brief
//! \~english Set or add the values of a given %PIValueTree object to the current %PIValueTree object.
//! \param root The %PIValueTree object whose values are to be merged.
//! \~russian Устанавливает или добавляет значения данного объекта %PIValueTree к текущему объекту %PIValueTree.
//! \param root Объект %PIValueTree, значения которого должны быть добавлены.
void merge(const PIValueTree & root);
//! \~\brief
//! \~english Returns the children of the current %PIValueTree object.
//! \~russian Возвращает дочерние элементы текущего объекта %PIValueTree.