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";