diff --git a/headers/private/shared/DriverSettingsMessageAdapter.h b/headers/private/shared/DriverSettingsMessageAdapter.h index 3068d99ebc..f08aa53f7a 100644 --- a/headers/private/shared/DriverSettingsMessageAdapter.h +++ b/headers/private/shared/DriverSettingsMessageAdapter.h @@ -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 +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( diff --git a/src/kits/shared/DriverSettingsMessageAdapter.cpp b/src/kits/shared/DriverSettingsMessageAdapter.cpp index 08b8d91d70..e88a63b4c3 100644 --- a/src/kits/shared/DriverSettingsMessageAdapter.cpp +++ b/src/kits/shared/DriverSettingsMessageAdapter.cpp @@ -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 +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: {