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. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@@ -14,11 +14,27 @@
#include <Message.h> #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 { struct settings_template {
uint32 type; uint32 type;
const char* name; const char* name;
const settings_template* sub_template; const settings_template* sub_template;
bool parent_value; bool parent_value;
DriverSettingsConverter* converter;
}; };
@@ -49,7 +65,7 @@ private:
const settings_template* _FindParentValueTemplate( const settings_template* _FindParentValueTemplate(
const settings_template* settingsTemplate); const settings_template* settingsTemplate);
status_t _AddParameter(const driver_parameter& parameter, status_t _AddParameter(const driver_parameter& parameter,
const char* name, uint32 type, const settings_template& settingsTemplate,
BMessage& message); BMessage& message);
status_t _ConvertFromDriverParameter( 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. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@@ -18,6 +18,19 @@
#include <String.h> #include <String.h>
DriverSettingsConverter::DriverSettingsConverter()
{
}
DriverSettingsConverter::~DriverSettingsConverter()
{
}
// #pragma mark -
DriverSettingsMessageAdapter::DriverSettingsMessageAdapter() DriverSettingsMessageAdapter::DriverSettingsMessageAdapter()
{ {
} }
@@ -152,30 +165,42 @@ DriverSettingsMessageAdapter::_FindParentValueTemplate(
status_t status_t
DriverSettingsMessageAdapter::_AddParameter(const driver_parameter& parameter, 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++) { 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: case B_STRING_TYPE:
message.AddString(name, parameter.values[i]); message.AddString(settingsTemplate.name, parameter.values[i]);
break; break;
case B_INT32_TYPE: case B_INT32_TYPE:
message.AddInt32(name, atoi(parameter.values[i])); message.AddInt32(settingsTemplate.name,
atoi(parameter.values[i]));
break; break;
case B_BOOL_TYPE: case B_BOOL_TYPE:
if (!strcasecmp(parameter.values[i], "true") if (!strcasecmp(parameter.values[i], "true")
|| !strcasecmp(parameter.values[i], "on") || !strcasecmp(parameter.values[i], "on")
|| !strcasecmp(parameter.values[i], "enabled") || !strcasecmp(parameter.values[i], "enabled")
|| !strcasecmp(parameter.values[i], "1")) || !strcasecmp(parameter.values[i], "1"))
message.AddBool(name, true); message.AddBool(settingsTemplate.name, true);
else else
message.AddBool(name, false); message.AddBool(settingsTemplate.name, false);
break; break;
} }
} }
if (type == B_BOOL_TYPE && parameter.value_count == 0) { if (settingsTemplate.type == B_BOOL_TYPE && parameter.value_count == 0) {
// boolean parameters are always true // Empty boolean parameters are always true
message.AddBool(name, true); return message.AddBool(settingsTemplate.name, true);
} }
return B_OK; return B_OK;
@@ -193,7 +218,7 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter(
return B_BAD_VALUE; return B_BAD_VALUE;
} }
_AddParameter(parameter, parameter.name, settingsTemplate->type, message); _AddParameter(parameter, *settingsTemplate, message);
if (settingsTemplate->type == B_MESSAGE_TYPE if (settingsTemplate->type == B_MESSAGE_TYPE
&& parameter.parameter_count > 0) { && parameter.parameter_count > 0) {
@@ -207,10 +232,8 @@ DriverSettingsMessageAdapter::_ConvertFromDriverParameter(
const settings_template* parentValueTemplate const settings_template* parentValueTemplate
= _FindParentValueTemplate(settingsTemplate); = _FindParentValueTemplate(settingsTemplate);
if (parentValueTemplate != NULL) { if (parentValueTemplate != NULL)
_AddParameter(parameter, parentValueTemplate->name, _AddParameter(parameter, *parentValueTemplate, subMessage);
parentValueTemplate->type, subMessage);
}
} }
if (status == B_OK) if (status == B_OK)
message.AddMessage(parameter.name, &subMessage); message.AddMessage(parameter.name, &subMessage);
@@ -251,6 +274,15 @@ DriverSettingsMessageAdapter::_AppendSettings(
if (valueIndex > 0 && type != B_MESSAGE_TYPE) if (valueIndex > 0 && type != B_MESSAGE_TYPE)
settings.Append(" "); 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) { switch (type) {
case B_BOOL_TYPE: case B_BOOL_TYPE:
{ {