QJsonValue NJson::remove(QJsonValue parentValue, const QString &keysStr) { QStringList keys = keysStr.split("."); QString key = keys[0]; int index = key.toInt(); if (keys.size() == 1) { if (parentValue.isArray()) { QJsonArray array = parentValue.toArray(); array.removeAt(index); return QJsonValue(array); } else { QJsonObject object = parentValue.toObject(); object.remove(key); return QJsonValue(object); } } else { keys.pop_front(); if (parentValue.isArray()) { QJsonArray array= parentValue.toArray(); QJsonValue newValue = remove(QJsonValue(array[index]), keys.join(".")); if (array.size() <= index) { array.insert(index, newValue); } else { array[index] = newValue; } return QJsonValue(array); } else { QJsonObject object = parentValue.toObject(); object[key] = remove(QJsonValue(parentValue.toObject()[key]), keys.join(".")); return QJsonValue(object); } } }
bool LOCACC::updateScreen(QStringList newScreenData, QTreeWidgetItem *currentItem) { QString screenId = currentItem->text(0); QJsonArray locArray = m_jsonMasterObj["locAccData"].toArray(); QJsonObject tempObj; for(int i = 0 ; i < locArray.count() ; i++) { tempObj = locArray.at(i).toObject(); if(tempObj["id"] == screenId) { locArray.removeAt(i); if(screenExistance(newScreenData,locArray)) { return false; } tempObj["id"] = newScreenData.at(0); tempObj["name"] = newScreenData.at(1); locArray.insert(i,tempObj); break; } } m_jsonMasterObj["locAccData"] = locArray; currentItem->setText(0,newScreenData.at(0)); writeFile(); return true; }
bool LOCACC::deleteElement(QTreeWidgetItem *currentItem) { QString elementId = currentItem->text(0); QJsonArray jArray = m_jsonMasterObj["locAccData"].toArray(); QString parentScreen = currentItem->parent()->text(0); QJsonObject tempObj ; for(int i = 0 ; i < jArray.count() ; i++ ) { tempObj = jArray.at(i).toObject(); if(tempObj["id"] == parentScreen) { QJsonArray eleJArray = tempObj["elements"].toArray(); QJsonObject eleObject ; for(int j = 0 ; j < eleJArray.count() ; j++) { eleObject = eleJArray.at(j).toObject(); if(eleObject["id"] == elementId) { eleJArray.removeAt(j); tempObj["elements"] = eleJArray; jArray.replace(i,tempObj); break; } } } } m_jsonMasterObj["locAccData"] = jArray; currentItem->parent()->removeChild(currentItem); emptyTreeWidget(currentItem); writeFile(); return true; }
void AccessControlPage::removeAccessControlRule() { QJsonArray accessControlRules = VeyonCore::config().accessControlRules(); accessControlRules.removeAt( ui->accessControlRulesView->currentIndex().row() ); VeyonCore::config().setAccessControlRules( accessControlRules ); updateAccessControlRules(); }
bool LOCACC::updateMessage(QStringList newMessageData, bool isAccTextSame, QTreeWidgetItem *currentItem) { QString messageId = currentItem->text(0); QString eleId = currentItem->parent()->text(0); QJsonArray jArray = m_jsonMasterObj["locAccData"].toArray(); QString parentScreen = currentItem->parent()->parent()->text(0); QJsonObject tempObj ; for(int i = 0 ; i < jArray.count() ; i++ ) { tempObj = jArray.at(i).toObject(); if(tempObj["id"] == parentScreen) { QJsonArray eleJArray = tempObj["elements"].toArray(); QJsonObject tempEleObj; for(int j = 0 ; j < eleJArray.count(); j++) { tempEleObj = eleJArray.at(j).toObject(); if(tempEleObj["id"] == eleId) { QJsonArray msgsArray = tempEleObj["messages"].toArray(); QJsonObject tempMsgObj; for(int k = 0; k < msgsArray.count() ; k++) { tempMsgObj = msgsArray.at(k).toObject(); if(tempMsgObj["id"] == messageId) { msgsArray.removeAt(k); if(messageExistance(newMessageData,msgsArray)) { return false; } QJsonObject newMsgObj = getMessageJson(newMessageData,isAccTextSame); msgsArray.insert(k,newMsgObj); tempEleObj["messages"] = msgsArray; eleJArray.replace(j,tempEleObj); tempObj["elements"] = eleJArray; jArray.replace(i,tempObj); setMessageTooltip(currentItem,newMsgObj); break; } } } } } } m_jsonMasterObj["locAccData"] = jArray; currentItem->setText(0,newMessageData.at(0)); writeFile(); return true; }
static MetaDataResult::Tag tryReadPluginMetaDataFromCacheFile(const QString& canonicalPluginPath, RawPluginMetaData& result) { QJsonDocument jsonDocument; if (readMetaDataFromCacheFile(jsonDocument) != ReadResult::Success) return MetaDataResult::NotAvailable; QJsonArray array = jsonDocument.array(); QDateTime pluginLastModified = QFileInfo(canonicalPluginPath).lastModified(); for (QJsonArray::const_iterator i = array.constBegin(); i != array.constEnd(); ++i) { QJsonValue item = *i; if (!item.isObject()) { cacheFile()->remove(); return MetaDataResult::NotAvailable; } QJsonObject object = item.toObject(); if (object.value(QStringLiteral("path")).toString() == canonicalPluginPath) { QString timestampString = object.value(QStringLiteral("timestamp")).toString(); if (timestampString.isEmpty()) { cacheFile()->remove(); return MetaDataResult::NotAvailable; } QDateTime timestamp = QDateTime::fromString(timestampString); if (timestamp < pluginLastModified) { // Out of date data for this plugin => remove it from the file. array.removeAt(i.i); writeToCacheFile(array); return MetaDataResult::NotAvailable; } if (object.contains(QLatin1String("unloadable"))) return MetaDataResult::Unloadable; // Match. result.name = object.value(QStringLiteral("name")).toString(); result.description = object.value(QStringLiteral("description")).toString(); result.mimeDescription = object.value(QStringLiteral("mimeDescription")).toString(); if (result.mimeDescription.isEmpty()) { // Only the mime description is mandatory. // Don't trust in the cache file if it is empty. cacheFile()->remove(); return MetaDataResult::NotAvailable; } return MetaDataResult::Available; } } return MetaDataResult::NotAvailable; }
void ContactList::on_removeContact_clicked() { if(!ui->contactList->currentIndex().isValid() || QMessageBox::Cancel == QMessageBox::warning(this, "Confirm contact deletion", "This will delete the contact. You cool with that?", QMessageBox::Ok, QMessageBox::Cancel)) return; int sourceRow = searchContactListModel->mapToSource(ui->contactList->currentIndex()).row(); contactListModel->removeRow(sourceRow); QJsonArray array = document->array(); array.removeAt(sourceRow); document->setArray(array); emit currentIndexChanged(ui->contactList->currentIndex()); }
bool LOCACC::deleteScreen(QTreeWidgetItem *currentItem) { QString screenId = currentItem->text(0); QJsonArray locArray = m_jsonMasterObj["locAccData"].toArray(); QJsonObject tempObj; for(int i = 0 ; i < locArray.count() ; i++) { tempObj = locArray.at(i).toObject(); if(tempObj["id"] == screenId) { locArray.removeAt(i); break; } } m_jsonMasterObj["locAccData"] = locArray; currentItem->parent()->removeChild(currentItem); emptyTreeWidget(currentItem); writeFile(); return true; }
bool LOCACC::updateElement(QStringList newElementData, QTreeWidgetItem *currentItem) { QString elementId = currentItem->text(0); QJsonArray jArray = m_jsonMasterObj["locAccData"].toArray(); QString parentScreen = currentItem->parent()->text(0); QJsonObject tempObj ; for(int i = 0 ; i < jArray.count() ; i++ ) { tempObj = jArray.at(i).toObject(); if(tempObj["id"] == parentScreen) { QJsonArray eleJArray = tempObj["elements"].toArray(); QJsonObject eleObject ; for(int j = 0 ; j < eleJArray.count() ; j++) { eleObject = eleJArray.at(j).toObject(); if(eleObject["id"] == elementId) { eleJArray.removeAt(j); if(elementExistance(newElementData,eleJArray)) { return false; } QJsonObject newEleJson = getElementJson(newElementData); newEleJson["messages"] = eleObject["messages"]; eleJArray.insert(j,newEleJson); tempObj["elements"] = eleJArray; jArray.replace(i,tempObj); break; } } } } m_jsonMasterObj["locAccData"] = jArray; currentItem->setText(0,newElementData.at(0)); writeFile(); return true; }
bool LOCACC::changeOrder(int currentIndex, int newIndex, QTreeWidgetItem *item) { // qDebug() << "informal :" << currentIndex ; if (item && ((currentIndex < newIndex && currentIndex < m_qtwiRoot->childCount() - 1) || (currentIndex > 0 && currentIndex > newIndex))) { // Visual Update QList<QTreeWidgetItem *> items = m_qtwiRoot->takeChildren(); items.removeAt(currentIndex); items.insert(newIndex,item); m_qtwiRoot->insertChildren(0,items); // Actual Update QJsonArray locAccArray = m_jsonMasterObj.find("locAccData").value().toArray(); QJsonObject objectToRemove = locAccArray.at(currentIndex).toObject(); locAccArray.removeAt(currentIndex); locAccArray.insert(newIndex,objectToRemove); m_jsonMasterObj["locAccData"] = locAccArray; //writeFile(); // Do not update file on change in order. return true; } return false; }
/*! * \brief JsonDbObject::updateVersionOptimistic implement an optimisticWrite * \param other the object containing the update to be written. Do NOT call computeVersion() * on the other object before passing it in! other._meta.history is assumed untrusted. * \param versionWritten contains the version string of the write upon return * \param trackHistory whether version history should be tracked or not. Defaults to true. * \return true if the passed object is a valid write. As this version can operate * on conflicts too, version() and versionWritten can differ. */ bool JsonDbObject::updateVersionOptimistic(const JsonDbObject &other, QString *versionWrittenOut, bool trackHistory) { QString versionWritten; // this is trusted and expected to contain a _meta object with book keeping info QJsonObject meta = value(JsonDbString::kMetaStr).toObject(); // an array of all versions this object has replaced QJsonArray history = meta.value(QStringLiteral("history")).toArray(); // all known conflicts QJsonArray conflicts = meta.value(JsonDbString::kConflictsStr).toArray(); // check for in-object override of history tracking if (trackHistory && value(JsonDbString::kLocalStr).toBool()) trackHistory = false; QString replacedVersion = other.version(); int replacedCount; QString replacedHash = tokenizeVersion(replacedVersion, &replacedCount); int updateCount = replacedCount; QString hash = replacedHash; // we don't trust other._meta.history, so other._version must be replacedVersion // if other.computeVersion() was called before updateVersionOptimistic(), other can at max be a replay // as we lost which version other is replacing. bool isReplay = !other.computeVersion(replacedCount, replacedHash, &updateCount, &hash); bool isValidWrite = false; // first we check if this version can eliminate a conflict for (QJsonArray::const_iterator ii = conflicts.begin(); ii < conflicts.end(); ii++) { JsonDbObject conflict((*ii).toObject()); if (conflict.version() == replacedVersion) { if (!isReplay) conflicts.removeAt(ii.i); if (!isValidWrite) { addAncestor(&history, updateCount, hash); versionWritten = versionAsString(updateCount, hash); } isValidWrite = true; } } // now we check if this version can progress the head if (version().isEmpty() || version() == replacedVersion) { if (!isReplay) *this = other; if (!isValidWrite) versionWritten = versionAsString(updateCount, hash); insert(JsonDbString::kVersionStr, versionWritten); isValidWrite = true; } // make sure we can resurrect a tombstone // Issue: Recreating a _uuid must have a updateCount higher than the tombstone // otherwise it is considered a conflict. if (!isValidWrite && isDeleted()) { if (!isReplay) { addAncestor(&history, replacedCount, replacedHash); } replacedHash = tokenizeVersion(version(), &replacedCount); updateCount = replacedCount + 1; versionWritten = versionAsString(updateCount, hash); *this = other; insert(JsonDbString::kVersionStr, versionWritten); isValidWrite = true; } // update the book keeping of what versions we have replaced in this version branch if (isValidWrite && !isReplay) { addAncestor(&history, replacedCount, replacedHash); meta = QJsonObject(); if (trackHistory && history.size()) meta.insert(QStringLiteral("history"), history); if (conflicts.size()) meta.insert(JsonDbString::kConflictsStr, history); if (!meta.isEmpty()) insert(JsonDbString::kMetaStr, meta); else insert(JsonDbString::kMetaStr, QJsonValue::Undefined); } // last chance for a valid write: other is a replay from history if (!isValidWrite && isAncestorOf(history, updateCount, hash)) { isValidWrite = true; versionWritten = versionAsString(updateCount, hash); } if (versionWrittenOut) *versionWrittenOut = versionWritten; return isValidWrite; }