void IAPConf::setValue(const QString& key, const QVariant& value) { // Invalid value means unsetting the given key if (!value.isValid()) { int err = conn_settings_unset(d_ptr->settings, QSTRING_TO_CONST_CSTR(key)); if (err != CONN_SETTINGS_E_NO_ERROR) { qWarning("IAPConf: unable to unset key %s: %s", QSTRING_TO_CONST_CSTR(key), conn_settings_error_text((ConnSettingsError)err)); } return; } // Convert value to ConnSettingsValue ConnSettingsValue *val = d_ptr->variantToValue(value); if (val == 0) return; // Set value and handle errors int error = conn_settings_set(d_ptr->settings, QSTRING_TO_CONST_CSTR(key), val); if (error != CONN_SETTINGS_E_NO_ERROR) { qWarning("IAPConf: error in setting key %s: %s", QSTRING_TO_CONST_CSTR(key), conn_settings_error_text((ConnSettingsError)error)); } // Destroy value conn_settings_value_destroy(val); return; }
QVariant IAPConf::value(const QString& key) const { ConnSettingsValue *val = conn_settings_get(d_ptr->settings, QSTRING_TO_CONST_CSTR(key)); QVariant variant = d_ptr->valueToVariant(val); conn_settings_value_destroy(val); return variant; }
ConnSettingsValue *IAPConfPrivate::variantToValue(const QVariant &variant) { // Convert variant to ConnSettingsValue ConnSettingsValue *value = conn_settings_value_new(); if (value == 0) { qWarning("IAPConf: Unable to create new ConnSettingsValue"); return 0; } switch(variant.type()) { case QVariant::Invalid: value->type = CONN_SETTINGS_VALUE_INVALID; break; case QVariant::String: { char *valueStr = strdup(QSTRING_TO_CONST_CSTR(variant.toString())); value->type = CONN_SETTINGS_VALUE_STRING; value->value.string_val = valueStr; break; } case QVariant::Int: value->type = CONN_SETTINGS_VALUE_INT; value->value.int_val = variant.toInt(); break; case QMetaType::Float: case QVariant::Double: value->type = CONN_SETTINGS_VALUE_DOUBLE; value->value.double_val = variant.toDouble(); break; case QVariant::Bool: value->type = CONN_SETTINGS_VALUE_BOOL; value->value.bool_val = variant.toBool() ? 1 : 0; break; case QVariant::ByteArray: { QByteArray array = variant.toByteArray(); value->type = CONN_SETTINGS_VALUE_BYTE_ARRAY; value->value.byte_array.len = array.size(); value->value.byte_array.val = (unsigned char *)malloc(array.size()); memcpy(value->value.byte_array.val, array.constData(), array.size()); break; } case QVariant::List: { QVariantList list = variant.toList(); ConnSettingsValue **list_val = (ConnSettingsValue **)malloc( (list.size() + 1) * sizeof(ConnSettingsValue *)); for (int idx = 0; idx < list.size(); idx++) { list_val[idx] = variantToValue(list.at(idx)); } list_val[list.size()] = 0; value->type = CONN_SETTINGS_VALUE_LIST; value->value.list_val = list_val; break; } default: qWarning("IAPConf: Can not handle QVariant of type %d", variant.type()); conn_settings_value_destroy(value); return 0; } return value; }