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:
@@ -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:
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user