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