* Add functions for constructing a settings file from messages and settings
templates. * Prepare saving of such generated config files. Actually writing them out isn't yet done however. * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42805 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include <fs_interface.h>
|
#include <fs_interface.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <PathMonitor.h>
|
#include <PathMonitor.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -214,7 +215,7 @@ Settings::_ConvertFromDriverParameter(const driver_parameter& parameter,
|
|||||||
for (int32 j = 0; j < parameter.parameter_count; j++) {
|
for (int32 j = 0; j < parameter.parameter_count; j++) {
|
||||||
status = _ConvertFromDriverParameter(parameter.parameters[j],
|
status = _ConvertFromDriverParameter(parameter.parameters[j],
|
||||||
settingsTemplate->sub_template, subMessage);
|
settingsTemplate->sub_template, subMessage);
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const settings_template* parentValueTemplate
|
const settings_template* parentValueTemplate
|
||||||
@@ -245,7 +246,7 @@ Settings::_ConvertFromDriverSettings(const driver_settings& settings,
|
|||||||
// ignore unknown entries
|
// ignore unknown entries
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +260,7 @@ Settings::_ConvertFromDriverSettings(const char* name,
|
|||||||
{
|
{
|
||||||
BPath path;
|
BPath path;
|
||||||
status_t status = _GetPath(name, path);
|
status_t status = _GetPath(name, path);
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
void* handle = load_driver_settings(path.Path());
|
void* handle = load_driver_settings(path.Path());
|
||||||
@@ -277,24 +278,164 @@ Settings::_ConvertFromDriverSettings(const char* name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Settings::_AppendSettings(const settings_template* settingsTemplate,
|
||||||
|
BString& settings, const BMessage& message, const char* name,
|
||||||
|
type_code type, int32 count, const char* settingName)
|
||||||
|
{
|
||||||
|
const settings_template* valueTemplate
|
||||||
|
= _FindSettingsTemplate(settingsTemplate, name);
|
||||||
|
if (valueTemplate == NULL) {
|
||||||
|
fprintf(stderr, "unknown field %s\n", name);
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valueTemplate->type != type) {
|
||||||
|
fprintf(stderr, "field type mismatch %s\n", name);
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingName == NULL)
|
||||||
|
settingName = name;
|
||||||
|
|
||||||
|
if (type != B_MESSAGE_TYPE) {
|
||||||
|
settings.Append("\n");
|
||||||
|
settings.Append(settingName);
|
||||||
|
settings.Append("\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32 valueIndex = 0; valueIndex < count; valueIndex++) {
|
||||||
|
if (valueIndex > 0 && type != B_MESSAGE_TYPE)
|
||||||
|
settings.Append(" ");
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case B_BOOL_TYPE:
|
||||||
|
{
|
||||||
|
bool value;
|
||||||
|
status_t result = message.FindBool(name, valueIndex, &value);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
settings.Append(value ? "true" : "false");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case B_STRING_TYPE:
|
||||||
|
{
|
||||||
|
const char* value = NULL;
|
||||||
|
status_t result = message.FindString(name, valueIndex, &value);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
settings.Append(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case B_INT32_TYPE:
|
||||||
|
{
|
||||||
|
int32 value;
|
||||||
|
status_t result = message.FindInt32(name, valueIndex, &value);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
char buffer[100];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%"B_PRId32, value);
|
||||||
|
settings.Append(buffer, sizeof(buffer));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case B_MESSAGE_TYPE:
|
||||||
|
{
|
||||||
|
BMessage subMessage;
|
||||||
|
status_t result = message.FindMessage(name, valueIndex,
|
||||||
|
&subMessage);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
const settings_template* parentValueTemplate
|
||||||
|
= _FindParentValueTemplate(valueTemplate);
|
||||||
|
if (parentValueTemplate != NULL) {
|
||||||
|
_AppendSettings(valueTemplate->sub_template, settings,
|
||||||
|
subMessage, parentValueTemplate->name,
|
||||||
|
parentValueTemplate->type, 1, name);
|
||||||
|
subMessage.RemoveName(parentValueTemplate->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
BString subSettings;
|
||||||
|
_ConvertToDriverSettings(valueTemplate->sub_template,
|
||||||
|
subSettings, subMessage);
|
||||||
|
subSettings.ReplaceAll("\n", "\n\t");
|
||||||
|
subSettings.RemoveFirst("\n");
|
||||||
|
|
||||||
|
settings.Append(" {\n");
|
||||||
|
settings.Append(subSettings);
|
||||||
|
settings.Append("\n}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Settings::_ConvertToDriverSettings(const settings_template* settingsTemplate,
|
||||||
|
BString& settings, const BMessage& message)
|
||||||
|
{
|
||||||
|
int32 index = 0;
|
||||||
|
char *name = NULL;
|
||||||
|
type_code type;
|
||||||
|
int32 count = 0;
|
||||||
|
|
||||||
|
while (message.GetInfo(B_ANY_TYPE, index++, &name, &type, &count) == B_OK) {
|
||||||
|
status_t result = _AppendSettings(settingsTemplate, settings, message,
|
||||||
|
name, type, count);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Settings::_ConvertToDriverSettings(const char* name,
|
||||||
|
const settings_template* settingsTemplate, const BMessage& message)
|
||||||
|
{
|
||||||
|
BPath path;
|
||||||
|
status_t status = _GetPath(name, path);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
BString settings;
|
||||||
|
status = _ConvertToDriverSettings(settingsTemplate, settings, message);
|
||||||
|
if (status == B_OK) {
|
||||||
|
settings.RemoveFirst("\n");
|
||||||
|
// TODO: actually write the settings.String() out into the file
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Settings::_Load(const char* name, uint32* _type)
|
Settings::_Load(const char* name, uint32* _type)
|
||||||
{
|
{
|
||||||
status_t status = B_ENTRY_NOT_FOUND;
|
status_t status = B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
if (name == NULL || !strcmp(name, "interfaces")) {
|
if (name == NULL || strcmp(name, "interfaces") == 0) {
|
||||||
status = _ConvertFromDriverSettings("interfaces", kInterfacesTemplate,
|
status = _ConvertFromDriverSettings("interfaces", kInterfacesTemplate,
|
||||||
fInterfaces);
|
fInterfaces);
|
||||||
if (status == B_OK && _type != NULL)
|
if (status == B_OK && _type != NULL)
|
||||||
*_type = kMsgInterfaceSettingsUpdated;
|
*_type = kMsgInterfaceSettingsUpdated;
|
||||||
}
|
}
|
||||||
if (name == NULL || !strcmp(name, "wireless_networks")) {
|
if (name == NULL || strcmp(name, "wireless_networks") == 0) {
|
||||||
status = _ConvertFromDriverSettings("wireless_networks",
|
status = _ConvertFromDriverSettings("wireless_networks",
|
||||||
kNetworksTemplate, fNetworks);
|
kNetworksTemplate, fNetworks);
|
||||||
if (status == B_OK && _type != NULL)
|
if (status == B_OK && _type != NULL)
|
||||||
*_type = kMsgInterfaceSettingsUpdated;
|
*_type = kMsgInterfaceSettingsUpdated;
|
||||||
}
|
}
|
||||||
if (name == NULL || !strcmp(name, "services")) {
|
if (name == NULL || strcmp(name, "services") == 0) {
|
||||||
status = _ConvertFromDriverSettings("services", kServicesTemplate,
|
status = _ConvertFromDriverSettings("services", kServicesTemplate,
|
||||||
fServices);
|
fServices);
|
||||||
if (status == B_OK && _type != NULL)
|
if (status == B_OK && _type != NULL)
|
||||||
@@ -305,12 +446,34 @@ Settings::_Load(const char* name, uint32* _type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Settings::_Save(const char* name)
|
||||||
|
{
|
||||||
|
status_t status = B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
|
if (name == NULL || strcmp(name, "interfaces") == 0) {
|
||||||
|
status = _ConvertToDriverSettings("interfaces", kInterfacesTemplate,
|
||||||
|
fInterfaces);
|
||||||
|
}
|
||||||
|
if (name == NULL || strcmp(name, "wireless_networks") == 0) {
|
||||||
|
status = _ConvertToDriverSettings("wireless_networks",
|
||||||
|
kNetworksTemplate, fNetworks);
|
||||||
|
}
|
||||||
|
if (name == NULL || strcmp(name, "services") == 0) {
|
||||||
|
status = _ConvertToDriverSettings("services", kServicesTemplate,
|
||||||
|
fServices);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Settings::_StartWatching(const char* name, const BMessenger& target)
|
Settings::_StartWatching(const char* name, const BMessenger& target)
|
||||||
{
|
{
|
||||||
BPath path;
|
BPath path;
|
||||||
status_t status = _GetPath(name, path);
|
status_t status = _GetPath(name, path);
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
return BPrivate::BPathMonitor::StartWatching(path.Path(), B_WATCH_STAT,
|
return BPrivate::BPathMonitor::StartWatching(path.Path(), B_WATCH_STAT,
|
||||||
@@ -352,8 +515,8 @@ Settings::Update(BMessage* message)
|
|||||||
{
|
{
|
||||||
const char* pathName;
|
const char* pathName;
|
||||||
int32 opcode;
|
int32 opcode;
|
||||||
if (message->FindInt32("opcode", &opcode) < B_OK
|
if (message->FindInt32("opcode", &opcode) != B_OK
|
||||||
|| message->FindString("path", &pathName) < B_OK)
|
|| message->FindString("path", &pathName) != B_OK)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
BPath settingsFolderPath;
|
BPath settingsFolderPath;
|
||||||
@@ -412,6 +575,17 @@ Settings::GetNextNetwork(uint32& cookie, BMessage& network)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Settings::AddNetwork(const BMessage& network)
|
||||||
|
{
|
||||||
|
status_t result = fNetworks.AddMessage("network", &network);
|
||||||
|
if (result != B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
return _Save("wireless_networks");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Settings::GetNextService(uint32& cookie, BMessage& service)
|
Settings::GetNextService(uint32& cookie, BMessage& service)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,8 +25,11 @@ public:
|
|||||||
|
|
||||||
status_t GetNextInterface(uint32& cookie,
|
status_t GetNextInterface(uint32& cookie,
|
||||||
BMessage& interface);
|
BMessage& interface);
|
||||||
|
|
||||||
status_t GetNextNetwork(uint32& cookie,
|
status_t GetNextNetwork(uint32& cookie,
|
||||||
BMessage& network);
|
BMessage& network);
|
||||||
|
status_t AddNetwork(const BMessage& network);
|
||||||
|
|
||||||
status_t GetNextService(uint32& cookie,
|
status_t GetNextService(uint32& cookie,
|
||||||
BMessage& service);
|
BMessage& service);
|
||||||
const BMessage& Services() const;
|
const BMessage& Services() const;
|
||||||
@@ -39,6 +42,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
status_t _Load(const char* name = NULL,
|
status_t _Load(const char* name = NULL,
|
||||||
uint32* _type = NULL);
|
uint32* _type = NULL);
|
||||||
|
status_t _Save(const char* name = NULL);
|
||||||
status_t _GetPath(const char* name, BPath& path);
|
status_t _GetPath(const char* name, BPath& path);
|
||||||
|
|
||||||
status_t _StartWatching(const char* name,
|
status_t _StartWatching(const char* name,
|
||||||
@@ -64,6 +68,19 @@ private:
|
|||||||
const settings_template* settingsTemplate,
|
const settings_template* settingsTemplate,
|
||||||
BMessage& message);
|
BMessage& message);
|
||||||
|
|
||||||
|
status_t _AppendSettings(
|
||||||
|
const settings_template* settingsTemplate,
|
||||||
|
BString& settings, const BMessage& message,
|
||||||
|
const char* name, type_code type,
|
||||||
|
int32 count,
|
||||||
|
const char* settingName = NULL);
|
||||||
|
status_t _ConvertToDriverSettings(
|
||||||
|
const settings_template* settingsTemplate,
|
||||||
|
BString& settings, const BMessage& message);
|
||||||
|
status_t _ConvertToDriverSettings(const char* path,
|
||||||
|
const settings_template* settingsTemplate,
|
||||||
|
const BMessage& message);
|
||||||
|
|
||||||
bool _IsWatching(const BMessenger& target) const
|
bool _IsWatching(const BMessenger& target) const
|
||||||
{ return fListener == target; }
|
{ return fListener == target; }
|
||||||
bool _IsWatching() const
|
bool _IsWatching() const
|
||||||
|
|||||||
Reference in New Issue
Block a user