DriverSettingsMessageAdapter: optional field converter.

* You can now optionally specify a converter that does the actual
  message to settings conversion, and vice versa.
* This allows for more sophisticated and custom conversions.
This commit is contained in:
Axel Dörfler
2015-03-27 13:21:50 +01:00
parent 9461249c5a
commit 3211cbcd15
2 changed files with 65 additions and 17 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2006-2013, Haiku, Inc. All Rights Reserved.
* Copyright 2006-2015, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -14,11 +14,27 @@
#include <Message.h>
class DriverSettingsConverter {
public:
DriverSettingsConverter();
virtual ~DriverSettingsConverter();
virtual status_t ConvertFromDriverSettings(
const driver_parameter& parameter,
const char* name, uint32 type,
BMessage& target) = 0;
virtual status_t ConvertToDriverSettings(const BMessage& source,
const char* name, int32 index,
uint32 type, BString& value) = 0;
};
struct settings_template {
uint32 type;
const char* name;
const settings_template* sub_template;
bool parent_value;
DriverSettingsConverter* converter;
};
@@ -49,7 +65,7 @@ private:
const settings_template* _FindParentValueTemplate(
const settings_template* settingsTemplate);
status_t _AddParameter(const driver_parameter& parameter,
const char* name, uint32 type,
const settings_template& settingsTemplate,
BMessage& message);
status_t _ConvertFromDriverParameter(
@@ -1,5 +1,5 @@
/*
* Copyright 2006-2013, Haiku, Inc. All Rights Reserved.
* Copyright 2006-2015, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -18,6 +18,19 @@
#include <String.h>
DriverSettingsConverter::DriverSettingsConverter()
{
}
DriverSettingsConverter::~DriverSettingsConverter()
{
}
// #pragma mark -
DriverSettingsMessageAdapter::DriverSettingsMessageAdapter()
{
}
@@ -152,30 +165,42 @@ DriverSettingsMessageAdapter::_FindParentValueTemplate(
status_t
DriverSettingsMessageAdapter::_AddParameter(const driver_parameter& parameter,
const char* name, uint32 type, BMessage& message)
const settings_template& settingsTemplate, BMessage& message)
{
for (int32 i = 0; i < parameter.value_count; i++) {
switch (type) {
if (settingsTemplate.converter != NULL) {
status_t status
= settingsTemplate.converter->ConvertFromDriverSettings(
parameter, settingsTemplate.name, settingsTemplate.type,
message);
if (status == B_OK)
continue;
if (status != B_NOT_SUPPORTED)
return status;
}
switch (settingsTemplate.type) {
case B_STRING_TYPE:
message.AddString(name, parameter.values[i]);
message.AddString(settingsTemplate.name, parameter.values[i]);
break;
case B_INT32_TYPE:
message.AddInt32(name, atoi(parameter.values[i]));
message.AddInt32(settingsTemplate.name,
atoi(parameter.values[i]));
break;
case B_BOOL_TYPE:
if (!strcasecmp(parameter.values[i], "true")
|| !strcasecmp(parameter.values[i], "on")
|| !strcasecmp(parameter.values[i], "enabled")
|| !strcasecmp(parameter.values[i], "1"))
message.AddBool(name, true);
message.AddBool(settingsTemplate.name, true);
else
message.AddBool(name, false);
message.AddBool(settingsTemplate.name, false);
break;
}
}
if (type == B_BOOL_TYPE && parameter.value_count == 0) {
// boolean parameters are always true
message.AddBool(name, true);
if (settingsTemplate.type == B_BOOL_TYPE && parameter.value_count == 0) {
// Empty boolean parameters are always true
return message.AddBool(settingsTemplate.name, true);
}
return B_OK;
@@ -193,7 +218,7 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter(
return B_BAD_VALUE;
}
_AddParameter(parameter, parameter.name, settingsTemplate->type, message);
_AddParameter(parameter, *settingsTemplate, message);
if (settingsTemplate->type == B_MESSAGE_TYPE
&& parameter.parameter_count > 0) {
@@ -207,10 +232,8 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter(
const settings_template* parentValueTemplate
= _FindParentValueTemplate(settingsTemplate);
if (parentValueTemplate != NULL) {
_AddParameter(parameter, parentValueTemplate->name,
parentValueTemplate->type, subMessage);
}
if (parentValueTemplate != NULL)
_AddParameter(parameter, *parentValueTemplate, subMessage);
}
if (status == B_OK)
message.AddMessage(parameter.name, &subMessage);
@@ -251,6 +274,15 @@ DriverSettingsMessageAdapter::_AppendSettings(
if (valueIndex > 0 && type != B_MESSAGE_TYPE)
settings.Append(" ");
if (valueTemplate->converter != NULL) {
status_t status = valueTemplate->converter->ConvertToDriverSettings(
message, name, type, valueIndex, settings);
if (status == B_OK)
continue;
if (status != B_NOT_SUPPORTED)
return status;
}
switch (type) {
case B_BOOL_TYPE:
{