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