diff --git a/src/servers/launch/SettingsParser.cpp b/src/servers/launch/SettingsParser.cpp index 71b78c8402..1df5f35587 100644 --- a/src/servers/launch/SettingsParser.cpp +++ b/src/servers/launch/SettingsParser.cpp @@ -28,20 +28,19 @@ public: add = &message; index++; } - const char* condition = parameter.values[index]; - BMessage args; - for (index++; index < parameter.value_count; index++) { - status_t status = args.AddString("args", - parameter.values[index]); - if (status != B_OK) - return status; - } - status_t status = add->AddMessage(condition, &args); + + status_t status = _AddSubMessage(parameter, index, *add); if (status == B_OK && not) status = target.AddMessage("not", &message); return status; } + if (strcmp(parameter.name, "not") == 0) { + if (index != 0) + return B_OK; + + return _AddSubMessage(parameter, index, target); + } message.AddString("args", parameter.values[index]); return target.AddMessage(parameter.name, &message); @@ -57,6 +56,21 @@ public: BMessage message; return target.AddMessage(name, &message); } + +private: + status_t _AddSubMessage(const driver_parameter& parameter, int32 index, + BMessage& target) + { + const char* condition = parameter.values[index]; + BMessage args; + for (index++; index < parameter.value_count; index++) { + status_t status = args.AddString("args", + parameter.values[index]); + if (status != B_OK) + return status; + } + return target.AddMessage(condition, &args); + } }; diff --git a/src/tests/servers/launch/SettingsParserTest.cpp b/src/tests/servers/launch/SettingsParserTest.cpp index 17f0a035ab..767aae928c 100644 --- a/src/tests/servers/launch/SettingsParserTest.cpp +++ b/src/tests/servers/launch/SettingsParserTest.cpp @@ -122,7 +122,16 @@ SettingsParserTest::TestConditionsMultiLineFlatNot() CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n" "\tnot safemode\n" "}\n", message)); - message.PrintToStream(); + + BMessage subMessage; + CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("not", + &subMessage)); + CPPUNIT_ASSERT_EQUAL(1, message.CountNames(B_ANY_TYPE)); + + BMessage args; + CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("safemode", &args)); + CPPUNIT_ASSERT_EQUAL(1, subMessage.CountNames(B_ANY_TYPE)); + CPPUNIT_ASSERT(args.IsEmpty()); } @@ -133,7 +142,16 @@ SettingsParserTest::TestConditionsMultiLineFlatNotWithArgs() CPPUNIT_ASSERT_EQUAL(B_OK, _ParseCondition("if {\n" "\tnot file_exists one\n" "}\n", message)); - message.PrintToStream(); + + BMessage subMessage; + CPPUNIT_ASSERT_EQUAL(B_OK, message.FindMessage("not", + &subMessage)); + + BMessage args; + CPPUNIT_ASSERT_EQUAL(B_OK, subMessage.FindMessage("file_exists", &args)); + CPPUNIT_ASSERT_EQUAL(BString("one"), + BString(args.GetString("args", 0, "-"))); + CPPUNIT_ASSERT_EQUAL(1, args.CountNames(B_ANY_TYPE)); }