Registry::WriteResult Registry::write(const QVariant &data, Key key, const QString &subkey, const QString &value) { HKEY hKey; if(RegOpenKeyEx(enumToKey(key), subkey.toStdWString().c_str(), 0, KEY_WRITE, &hKey) != ERROR_SUCCESS) return WriteCannotFindSubKey; std::wstring wideValue = value.toStdWString(); switch(data.type()) { case QVariant::Int: case QVariant::UInt: { int intData = data.toInt(); if(RegSetValueEx(hKey, wideValue.c_str(), 0, REG_DWORD, reinterpret_cast<LPBYTE>(&intData), sizeof(int)) != ERROR_SUCCESS) { RegCloseKey(hKey); return WriteCannotWriteValue; } } break; case QVariant::LongLong: case QVariant::ULongLong: { long long intData = data.toLongLong(); if(RegSetValueEx(hKey, wideValue.c_str(), 0, REG_QWORD, reinterpret_cast<LPBYTE>(&intData), sizeof(long long)) != ERROR_SUCCESS) { RegCloseKey(hKey); return WriteCannotWriteValue; } } break; case QVariant::StringList: { const QStringList &stringList = data.toStringList(); std::wstring wideData; for(const QString &string: stringList) { wideData += string.toStdWString(); wideData += L'\0'; } if(RegSetValueEx(hKey, wideValue.c_str(), 0, REG_MULTI_SZ, reinterpret_cast<LPBYTE>(const_cast<wchar_t*>(wideData.c_str())), static_cast<DWORD>(wideData.size() * sizeof(wchar_t))) != ERROR_SUCCESS) { RegCloseKey(hKey); return WriteCannotWriteValue; } } break; case QVariant::ByteArray: { QByteArray byteArray = data.toByteArray(); if(RegSetValueEx(hKey, wideValue.c_str(), 0, REG_BINARY, reinterpret_cast<LPBYTE>(byteArray.data()), byteArray.size()) != ERROR_SUCCESS) { RegCloseKey(hKey); return WriteCannotWriteValue; } } break; default: { if(data.type() == QVariant::String || data.canConvert(QVariant::String)) { std::wstring wideData = data.toString().toStdWString(); if(RegSetValueEx(hKey, wideValue.c_str(), 0, REG_SZ, reinterpret_cast<LPBYTE>(const_cast<wchar_t*>(wideData.c_str())), static_cast<DWORD>(wideData.size() * sizeof(wchar_t))) != ERROR_SUCCESS) { RegCloseKey(hKey); return WriteCannotWriteValue; } } else { RegCloseKey(hKey); return WriteCannotWriteValue; } } break; } RegCloseKey(hKey); return WriteOk; }
Registry::ReadResult Registry::read(QVariant &result, Key key, const QString &subkey, const QString &value) { HKEY hKey; if(RegOpenKeyEx(enumToKey(key), subkey.toStdWString().c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) return ReadCannotFindSubKey; DWORD size; DWORD type; std::wstring wideValue = value.toStdWString(); if(RegQueryValueEx(hKey, wideValue.c_str(), 0, &type, 0, &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return ReadCannotFindValue; } switch(type) { case REG_DWORD: case REG_DWORD_BIG_ENDIAN: { qint32 value; if(RegQueryValueEx(hKey, wideValue.c_str(), 0, 0, reinterpret_cast<LPBYTE>(&value), &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return ReadCannotFindValue; } if(type == REG_DWORD_BIG_ENDIAN) value = qFromBigEndian(value); result = value; } break; case REG_SZ: case REG_EXPAND_SZ: case REG_LINK: case REG_MULTI_SZ: { std::vector<wchar_t> buffer(size); if(RegQueryValueEx(hKey, wideValue.c_str(), 0, 0, reinterpret_cast<LPBYTE>(buffer.data()), &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return ReadCannotFindValue; } if(type == REG_MULTI_SZ) { QStringList stringList = QString::fromWCharArray(buffer.data(), size / 2).split(QChar(L'\0'), QString::SkipEmptyParts); if(stringList.last().isEmpty()) stringList.removeLast(); result = stringList; } else result = QString::fromWCharArray(buffer.data(), size / 2); } break; case REG_BINARY: { std::vector<char> buffer(size); if(RegQueryValueEx(hKey, wideValue.c_str(), 0, 0, reinterpret_cast<LPBYTE>(buffer.data()), &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return ReadCannotFindValue; } result = QByteArray::fromRawData(buffer.data(), size); } break; case REG_QWORD: { qint64 value; if(RegQueryValueEx(hKey, wideValue.c_str(), 0, 0, reinterpret_cast<LPBYTE>(&value), &size) != ERROR_SUCCESS) { RegCloseKey(hKey); return ReadCannotFindValue; } result = value; } break; case REG_NONE: default: RegCloseKey(hKey); return ReadInvalidValueType; break; } RegCloseKey(hKey); return ReadOk; }
void FAttentionSettingsWidget::savePullDown(QComboBox *pulldown, QString field) { bool isglobal = channelname.isEmpty(); AttentionMode value = (AttentionMode)(pulldown->currentIndex()+ (isglobal ? 1 : 0)); settings->qsettings->setValue(settingprefix + field, enumToKey(value)); }