GConfLayer::~GConfLayer() { QMutableHashIterator<QString, GConfHandle *> i(m_handles); while (i.hasNext()) { i.next(); doRemoveHandle(Handle(i.value())); } }
bool GConfLayer::setValue(QValueSpacePublisher */*creator*/, Handle handle, const QString &subPath, const QVariant &data) { QMutexLocker locker(&m_mutex); GConfHandle *sh = gConfHandle(handle); if (!sh) return false; QString path(subPath); while (path.endsWith(QLatin1Char('/'))) path.chop(1); int index = path.lastIndexOf(QLatin1Char('/'), -1); bool createdHandle = false; QString value; if (index == -1) { value = path; } else { // want a value that is in a sub path under handle value = path.mid(index + 1); path.truncate(index); if (path.isEmpty()) path.append(QLatin1Char('/')); sh = gConfHandle(getItem(Handle(sh), path)); createdHandle = true; } QString fullPath(sh->path); if (fullPath != QLatin1String("/") && !value.isEmpty()) fullPath.append(QLatin1Char('/')); fullPath.append(value); GConfItem gconfItem(fullPath); switch (data.type()) { case QVariant::Invalid: case QVariant::Bool: case QVariant::Int: case QVariant::Double: case QVariant::String: case QVariant::StringList: case QVariant::List: gconfItem.set(data); break; default: QByteArray byteArray; QDataStream writeStream(&byteArray, QIODevice::WriteOnly); writeStream << data; QString serializedValue(byteArray.toBase64()); gconfItem.set(serializedValue); } if (createdHandle) doRemoveHandle(Handle(sh)); return true; }
void GConfLayer::removeHandle(Handle handle) { QMutexLocker locker(&m_mutex); doRemoveHandle(handle); }
bool GConfLayer::getValue(Handle handle, const QString &subPath, QVariant *data) { if (handle != InvalidHandle && !gConfHandle(handle)) return false; QString path(subPath); while (path.endsWith(QLatin1Char('/'))) path.chop(1); if (handle != InvalidHandle) while (path.startsWith(QLatin1Char('/'))) path = path.mid(1); int index = path.lastIndexOf(QLatin1Char('/'), -1); bool createdHandle = false; QString value; if (index == -1) { value = path; } else { // want a value that is in a sub path under handle value = path.mid(index + 1); path.truncate(index); if (path.isEmpty()) path.append(QLatin1Char('/')); handle = getItem(handle, path); createdHandle = true; } GConfHandle *sh = gConfHandle(handle); if (!sh) return false; QString fullPath(sh->path); if (fullPath != QLatin1String("/") && !value.isEmpty()) fullPath.append(QLatin1Char('/')); fullPath.append(value); GConfItem gconfItem(fullPath); QVariant readValue = gconfItem.value(); switch (readValue.type()) { case QVariant::Invalid: case QVariant::Bool: case QVariant::Int: case QVariant::Double: case QVariant::StringList: case QVariant::List: *data = readValue; break; case QVariant::String: { QString readString = readValue.toString(); QDataStream readStream(QByteArray::fromBase64(readString.toAscii())); QVariant serializedValue; readStream >> serializedValue; if (serializedValue.isValid()) { *data = serializedValue; } else { *data = readValue; } break; } default: break; } if (createdHandle) doRemoveHandle(handle); return data->isValid(); }