Make sure example command definitions include 'minimalRole' Server doesn't work correctly if minimalRole is not specified. It just fails to forward a command to the device. Also since Command::GetParameters returns a unique_ptr (rvalue), it is generally a bad pattern to use cmd->GetParameter()->Get... especially with dictionary and list values because by the time the pointer to inner object is used the outer object will be destroyed and access-after-free errors will occur. Change-Id: I33fd3fadbf993ce172725d17befef016089fc0a7 Reviewed-on: https://weave-review.googlesource.com/1653 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/examples/daemon/ledflasher/ledflasher.cc b/examples/daemon/ledflasher/ledflasher.cc index 0019d2c..4733f18 100644 --- a/examples/daemon/ledflasher/ledflasher.cc +++ b/examples/daemon/ledflasher/ledflasher.cc
@@ -35,16 +35,18 @@ device->AddCommandDefinitionsFromJson(R"({ "_ledflasher": { - "_set":{ - "parameters": { - "_led": {"type": "integer", "minimum": 1, "maximum": 3}, - "_on": {"type": "boolean"} - } - }, - "_toggle":{ - "parameters": { - "_led": {"type": "integer", "minimum": 1, "maximum": 3} - } + "_set":{ + "minimalRole": "user", + "parameters": { + "_led": {"type": "integer", "minimum": 1, "maximum": 3}, + "_on": {"type": "boolean"} + } + }, + "_toggle":{ + "minimalRole": "user", + "parameters": { + "_led": {"type": "integer", "minimum": 1, "maximum": 3} + } } } })"); @@ -64,9 +66,10 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); int32_t led_index = 0; + auto params = cmd->GetParameters(); bool cmd_value = false; - if (cmd->GetParameters()->GetInteger("_led", &led_index) && - cmd->GetParameters()->GetBoolean("_on", &cmd_value)) { + if (params->GetInteger("_led", &led_index) && + params->GetBoolean("_on", &cmd_value)) { // Display this command in terminal LOG(INFO) << cmd->GetName() << " _led: " << led_index << ", _on: " << (cmd_value ? "true" : "false"); @@ -93,8 +96,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); int32_t led_index = 0; - if (cmd->GetParameters()->GetInteger("_led", &led_index)) { + if (params->GetInteger("_led", &led_index)) { LOG(INFO) << cmd->GetName() << " _led: " << led_index; led_index--; led_status_[led_index] = ~led_status_[led_index];
diff --git a/examples/daemon/light/light.cc b/examples/daemon/light/light.cc index a7eb9b3..334bd93 100644 --- a/examples/daemon/light/light.cc +++ b/examples/daemon/light/light.cc
@@ -62,21 +62,23 @@ device->AddCommandDefinitionsFromJson(R"({ "onOff": { - "setConfig":{ - "parameters": { - "state": {"type": "string", "enum": ["on", "standby"]} - } - } - }, - "brightness": { - "setConfig":{ - "parameters": { - "brightness": { - "type": "integer", - "minimum": 0, - "maximum": 100 - } - } + "setConfig":{ + "minimalRole": "user", + "parameters": { + "state": {"type": "string", "enum": ["on", "standby"]} + } + } + }, + "brightness": { + "setConfig":{ + "minimalRole": "user", + "parameters": { + "brightness": { + "type": "integer", + "minimum": 0, + "maximum": 100 + } + } } }, "_colorXY": { @@ -88,13 +90,13 @@ "properties": { "_colorX": { "type": "number", - "minimum": 0, - "maximum": 1 + "minimum": 0.0, + "maximum": 1.0 }, "_colorY": { "type": "number", - "minimum": 0, - "maximum": 1 + "minimum": 0.0, + "maximum": 1.0 } } } @@ -119,8 +121,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); int32_t brightness_value = 0; - if (cmd->GetParameters()->GetInteger("brightness", &brightness_value)) { + if (params->GetInteger("brightness", &brightness_value)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " brightness: " << brightness_value; @@ -142,8 +145,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); std::string requested_state; - if (cmd->GetParameters()->GetString("state", &requested_state)) { + if (params->GetString("state", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; bool new_light_status = requested_state == "on";
diff --git a/examples/daemon/lock/lock.cc b/examples/daemon/lock/lock.cc index 7d941c6..f07ee52 100644 --- a/examples/daemon/lock/lock.cc +++ b/examples/daemon/lock/lock.cc
@@ -51,13 +51,14 @@ nullptr); device->AddCommandDefinitionsFromJson(R"({ - "lock": { - "setConfig":{ - "parameters": { - "lockedState": {"type": "string", "enum":["locked", "unlocked"]} - } + "lock": { + "setConfig":{ + "minimalRole": "user", + "parameters": { + "lockedState": {"type": "string", "enum":["locked", "unlocked"]} } } + } })"); device->AddCommandHandler("lock.setConfig", base::Bind(&LockHandler::OnLockSetConfig, @@ -70,8 +71,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); std::string requested_state; - if (cmd->GetParameters()->GetString("lockedState", &requested_state)) { + if (params->GetString("lockedState", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; weave::lockstate::LockState new_lock_status;
diff --git a/examples/daemon/sample/sample.cc b/examples/daemon/sample/sample.cc index e065b06..bde2f03 100644 --- a/examples/daemon/sample/sample.cc +++ b/examples/daemon/sample/sample.cc
@@ -73,8 +73,9 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); std::string name; - if (!cmd->GetParameters()->GetString("_name", &name)) { + if (!params->GetString("_name", &name)) { weave::ErrorPtr error; weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", "Name is missing"); @@ -111,8 +112,9 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); int seconds; - if (!cmd->GetParameters()->GetInteger("_seconds", &seconds)) + if (!params->GetInteger("_seconds", &seconds)) seconds = 10; LOG(INFO) << "starting countdown"; @@ -125,8 +127,9 @@ return; if (seconds > 0) { + auto params = cmd->GetParameters(); std::string todo; - cmd->GetParameters()->GetString("_todo", &todo); + params->GetString("_todo", &todo); LOG(INFO) << "countdown tick: " << seconds << " seconds left"; base::DictionaryValue progress;
diff --git a/examples/daemon/speaker/speaker.cc b/examples/daemon/speaker/speaker.cc index 178be14..89595b0 100644 --- a/examples/daemon/speaker/speaker.cc +++ b/examples/daemon/speaker/speaker.cc
@@ -36,22 +36,24 @@ device->AddCommandDefinitionsFromJson(R"({ "onOff": { - "setConfig":{ - "parameters": { - "state": {"type": "string", "enum": ["on", "standby"]} - } - } - }, - "volume": { - "setConfig":{ - "parameters": { - "volume": { - "type": "integer", - "minimum": 0, - "maximum": 100 - }, - "isMuted": {"type": "boolean"} - } + "setConfig":{ + "minimalRole": "user", + "parameters": { + "state": {"type": "string", "enum": ["on", "standby"]} + } + } + }, + "volume": { + "setConfig":{ + "minimalRole": "user", + "parameters": { + "volume": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "isMuted": {"type": "boolean"} + } } } })"); @@ -70,9 +72,10 @@ return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); // Handle volume parameter int32_t volume_value = 0; - if (cmd->GetParameters()->GetInteger("volume", &volume_value)) { + if (params->GetInteger("volume", &volume_value)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " volume: " << volume_value; @@ -86,7 +89,7 @@ // Handle isMuted parameter bool isMuted_status = false; - if (cmd->GetParameters()->GetBoolean("isMuted", &isMuted_status)) { + if (params->GetBoolean("isMuted", &isMuted_status)) { // Display this command in terminal. LOG(INFO) << cmd->GetName() << " is " << (isMuted_status ? "muted" : "not muted"); @@ -108,8 +111,9 @@ if (!cmd) return; LOG(INFO) << "received command: " << cmd->GetName(); + auto params = cmd->GetParameters(); std::string requested_state; - if (cmd->GetParameters()->GetString("state", &requested_state)) { + if (params->GetString("state", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; bool new_speaker_status = requested_state == "on";