[haiku-commits] r42805 - haiku/trunk/src/servers/net

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 7 Oct 2011 12:15:57 +0200 (CEST)

Author: mmlr
Date: 2011-10-07 12:15:57 +0200 (Fri, 07 Oct 2011)
New Revision: 42805
Changeset: https://dev.haiku-os.org/changeset/42805

Modified:
   haiku/trunk/src/servers/net/Settings.cpp
   haiku/trunk/src/servers/net/Settings.h
Log:
* 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.


Modified: haiku/trunk/src/servers/net/Settings.cpp
===================================================================
--- haiku/trunk/src/servers/net/Settings.cpp    2011-10-06 10:22:02 UTC (rev 
42804)
+++ haiku/trunk/src/servers/net/Settings.cpp    2011-10-07 10:15:57 UTC (rev 
42805)
@@ -14,6 +14,7 @@
 #include <fs_interface.h>
 #include <Path.h>
 #include <PathMonitor.h>
+#include <String.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -214,7 +215,7 @@
                for (int32 j = 0; j < parameter.parameter_count; j++) {
                        status = 
_ConvertFromDriverParameter(parameter.parameters[j],
                                settingsTemplate->sub_template, subMessage);
-                       if (status < B_OK)
+                       if (status != B_OK)
                                break;
 
                        const settings_template* parentValueTemplate
@@ -245,7 +246,7 @@
                        // ignore unknown entries
                        continue;
                }
-               if (status < B_OK)
+               if (status != B_OK)
                        return status;
        }
 
@@ -259,7 +260,7 @@
 {
        BPath path;
        status_t status = _GetPath(name, path);
-       if (status < B_OK)
+       if (status != B_OK)
                return status;
 
        void* handle = load_driver_settings(path.Path());
@@ -278,23 +279,163 @@
 
 
 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
 Settings::_Load(const char* name, uint32* _type)
 {
        status_t status = B_ENTRY_NOT_FOUND;
 
-       if (name == NULL || !strcmp(name, "interfaces")) {
+       if (name == NULL || strcmp(name, "interfaces") == 0) {
                status = _ConvertFromDriverSettings("interfaces", 
kInterfacesTemplate,
                        fInterfaces);
                if (status == B_OK && _type != NULL)
                        *_type = kMsgInterfaceSettingsUpdated;
        }
-       if (name == NULL || !strcmp(name, "wireless_networks")) {
+       if (name == NULL || strcmp(name, "wireless_networks") == 0) {
                status = _ConvertFromDriverSettings("wireless_networks",
                        kNetworksTemplate, fNetworks);
                if (status == B_OK && _type != NULL)
                        *_type = kMsgInterfaceSettingsUpdated;
        }
-       if (name == NULL || !strcmp(name, "services")) {
+       if (name == NULL || strcmp(name, "services") == 0) {
                status = _ConvertFromDriverSettings("services", 
kServicesTemplate,
                        fServices);
                if (status == B_OK && _type != NULL)
@@ -306,11 +447,33 @@
 
 
 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
 Settings::_StartWatching(const char* name, const BMessenger& target)
 {
        BPath path;
        status_t status = _GetPath(name, path);
-       if (status < B_OK)
+       if (status != B_OK)
                return status;
 
        return BPrivate::BPathMonitor::StartWatching(path.Path(), B_WATCH_STAT,
@@ -352,8 +515,8 @@
 {
        const char* pathName;
        int32 opcode;
-       if (message->FindInt32("opcode", &opcode) < B_OK
-               || message->FindString("path", &pathName) < B_OK)
+       if (message->FindInt32("opcode", &opcode) != B_OK
+               || message->FindString("path", &pathName) != B_OK)
                return B_BAD_VALUE;
 
        BPath settingsFolderPath;
@@ -413,6 +576,17 @@
 
 
 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
 Settings::GetNextService(uint32& cookie, BMessage& service)
 {
        status_t status = fServices.FindMessage("service", cookie, &service);

Modified: haiku/trunk/src/servers/net/Settings.h
===================================================================
--- haiku/trunk/src/servers/net/Settings.h      2011-10-06 10:22:02 UTC (rev 
42804)
+++ haiku/trunk/src/servers/net/Settings.h      2011-10-07 10:15:57 UTC (rev 
42805)
@@ -25,8 +25,11 @@
 
                        status_t                        
GetNextInterface(uint32& cookie,
                                                                        
BMessage& interface);
+
                        status_t                        GetNextNetwork(uint32& 
cookie,
                                                                        
BMessage& network);
+                       status_t                        AddNetwork(const 
BMessage& network);
+
                        status_t                        GetNextService(uint32& 
cookie,
                                                                        
BMessage& service);
                        const BMessage&         Services() const;
@@ -39,6 +42,7 @@
 private:
                        status_t                        _Load(const char* name 
= NULL,
                                                                        uint32* 
_type = NULL);
+                       status_t                        _Save(const char* name 
= NULL);
                        status_t                        _GetPath(const char* 
name, BPath& path);
 
                        status_t                        _StartWatching(const 
char* name,
@@ -64,6 +68,19 @@
                                                                        const 
settings_template* settingsTemplate,
                                                                        
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
                                                                        { 
return fListener == target; }
                        bool                            _IsWatching() const


Other related posts:

  • » [haiku-commits] r42805 - haiku/trunk/src/servers/net - mmlr