examples/daemon: split service handler from main
Bug: 24307362
Change-Id: I6e931d9ac730f14aabd4f24a2b10f728e5271eab
Reviewed-on: https://weave-review.googlesource.com/1344
Reviewed-by: Johan Euphrosine <proppy@google.com>
diff --git a/libweave/examples/daemon/greeter_handler.h b/libweave/examples/daemon/greeter_handler.h
new file mode 100644
index 0000000..7f71a06
--- /dev/null
+++ b/libweave/examples/daemon/greeter_handler.h
@@ -0,0 +1,111 @@
+// Copyright 2015 The Weave Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <weave/device.h>
+#include <weave/provider/task_runner.h>
+
+#include <base/bind.h>
+#include <base/memory/weak_ptr.h>
+
+namespace weave {
+namespace examples {
+namespace daemon {
+
+class GreeterHandler {
+ public:
+ GreeterHandler(provider::TaskRunner* task_runner)
+ : task_runner_{task_runner} {}
+ void Register(Device* device) {
+ device_ = device;
+
+ device->AddStateDefinitionsFromJson(R"({
+ "_greeter": {"_greetings_counter":"integer"}
+ })");
+
+ device->SetStatePropertiesFromJson(R"({
+ "_greeter": {"_greetings_counter": 0}
+ })",
+ nullptr);
+
+ device->AddCommandDefinitionsFromJson(R"({
+ "_greeter": {
+ "_greet": {
+ "minimalRole": "user",
+ "parameters": {
+ "_name": "string",
+ "_count": {"minimum": 1, "maximum": 100}
+ },
+ "progress": { "_todo": "integer"},
+ "results": { "_greeting": "string" }
+ }
+ }
+ })");
+ device->AddCommandHandler("_greeter._greet",
+ base::Bind(&GreeterHandler::OnGreetCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ private:
+ void DoGreet(const std::weak_ptr<Command>& command, int todo) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+
+ std::string name;
+ if (!cmd->GetParameters()->GetString("_name", &name)) {
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "example",
+ "invalid_parameter_value", "Name is missing");
+ cmd->Abort(error.get(), nullptr);
+ return;
+ }
+
+ if (todo-- > 0) {
+ LOG(INFO) << "Hello " << name;
+
+ base::DictionaryValue progress;
+ progress.SetInteger("_todo", todo);
+ cmd->SetProgress(progress, nullptr);
+
+ base::DictionaryValue state;
+ state.SetInteger("_greeter._greetings_counter", ++counter_);
+ device_->SetStateProperties(state, nullptr);
+ }
+
+ if (todo > 0) {
+ task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&GreeterHandler::DoGreet,
+ weak_ptr_factory_.GetWeakPtr(), command, todo),
+ base::TimeDelta::FromSeconds(1));
+ return;
+ }
+
+ base::DictionaryValue result;
+ result.SetString("_greeting", "Hello " + name);
+ cmd->Complete(result, nullptr);
+ LOG(INFO) << cmd->GetName() << " command finished: " << result;
+ LOG(INFO) << "New state: " << *device_->GetState();
+ }
+
+ void OnGreetCommand(const std::weak_ptr<Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
+
+ int todo = 1;
+ cmd->GetParameters()->GetInteger("_count", &todo);
+ DoGreet(command, todo);
+ }
+
+ Device* device_{nullptr};
+ provider::TaskRunner* task_runner_{nullptr};
+
+ int counter_{0};
+ base::WeakPtrFactory<GreeterHandler> weak_ptr_factory_{this};
+};
+
+} // namespace daemon
+} // namespace examples
+} // namespace weave
diff --git a/libweave/examples/daemon/ledflasher_handler.h b/libweave/examples/daemon/ledflasher_handler.h
new file mode 100644
index 0000000..fba5197
--- /dev/null
+++ b/libweave/examples/daemon/ledflasher_handler.h
@@ -0,0 +1,130 @@
+// Copyright 2015 The Weave Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <weave/device.h>
+
+#include <base/bind.h>
+#include <base/memory/weak_ptr.h>
+
+#include <bitset>
+
+namespace weave {
+namespace examples {
+namespace daemon {
+
+namespace {
+// Supported LED count on this device
+const size_t kLedCount = 3;
+} // namespace
+
+class LedFlasherHandler {
+ public:
+ LedFlasherHandler() {}
+ void Register(Device* device) {
+ device_ = device;
+
+ device->AddStateDefinitionsFromJson(R"({
+ "_ledflasher": {"_leds": {"items": "boolean"}}
+ })");
+
+ device->SetStatePropertiesFromJson(R"({
+ "_ledflasher":{"_leds": [false, false, false]}
+ })",
+ nullptr);
+
+ device->AddCommandDefinitionsFromJson(R"({
+ "_ledflasher": {
+ "_set":{
+ "parameters": {
+ "_led": {"minimum": 1, "maximum": 3},
+ "_on": "boolean"
+ }
+ },
+ "_toggle":{
+ "parameters": {
+ "_led": {"minimum": 1, "maximum": 3}
+ }
+ }
+ }
+ })");
+ device->AddCommandHandler(
+ "_ledflasher._toggle",
+ base::Bind(&LedFlasherHandler::OnFlasherToggleCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ device->AddCommandHandler(
+ "_ledflasher._set", base::Bind(&LedFlasherHandler::OnFlasherSetCommand,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ private:
+ void OnFlasherSetCommand(const std::weak_ptr<Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
+ int32_t led_index = 0;
+ bool cmd_value = false;
+ if (cmd->GetParameters()->GetInteger("_led", &led_index) &&
+ cmd->GetParameters()->GetBoolean("_on", &cmd_value)) {
+ // Display this command in terminal
+ LOG(INFO) << cmd->GetName() << " _led: " << led_index
+ << ", _on: " << (cmd_value ? "true" : "false");
+
+ led_index--;
+ int new_state = cmd_value ? 1 : 0;
+ int cur_state = led_status_[led_index];
+ led_status_[led_index] = new_state;
+
+ if (cmd_value != cur_state) {
+ UpdateLedState();
+ }
+ cmd->Complete({}, nullptr);
+ return;
+ }
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+ "Invalid parameters");
+ cmd->Abort(error.get(), nullptr);
+ }
+
+ void OnFlasherToggleCommand(const std::weak_ptr<Command>& command) {
+ auto cmd = command.lock();
+ if (!cmd)
+ return;
+ LOG(INFO) << "received command: " << cmd->GetName();
+ int32_t led_index = 0;
+ if (cmd->GetParameters()->GetInteger("_led", &led_index)) {
+ LOG(INFO) << cmd->GetName() << " _led: " << led_index;
+ led_index--;
+ led_status_[led_index] = ~led_status_[led_index];
+
+ UpdateLedState();
+ cmd->Complete({}, nullptr);
+ return;
+ }
+ ErrorPtr error;
+ Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
+ "Invalid parameters");
+ cmd->Abort(error.get(), nullptr);
+ }
+
+ void UpdateLedState(void) {
+ base::ListValue list;
+ for (uint32_t i = 0; i < led_status_.size(); i++)
+ list.AppendBoolean(led_status_[i] ? true : false);
+
+ device_->SetStateProperty("_ledflasher._leds", list, nullptr);
+ }
+
+ Device* device_{nullptr};
+
+ // Simulate LED status on this device so client app could explore
+ // Each bit represents one device, indexing from LSB
+ std::bitset<kLedCount> led_status_{0};
+ base::WeakPtrFactory<LedFlasherHandler> weak_ptr_factory_{this};
+};
+
+} // namespace daemon
+} // namespace examples
+} // namespace weave
diff --git a/libweave/examples/daemon/main.cc b/libweave/examples/daemon/main.cc
index cdf3b41..2c3841a 100644
--- a/libweave/examples/daemon/main.cc
+++ b/libweave/examples/daemon/main.cc
@@ -2,13 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <bitset>
-
-#include <base/bind.h>
-#include <base/values.h>
#include <weave/device.h>
#include <weave/error.h>
+#include <base/bind.h>
+
#include "examples/provider/avahi_client.h"
#include "examples/provider/bluez_client.h"
#include "examples/provider/curl_http_client.h"
@@ -18,6 +16,9 @@
#include "examples/provider/file_config_store.h"
#include "examples/provider/wifi_manager.h"
+#include "examples/daemon/greeter_handler.h"
+#include "examples/daemon/ledflasher_handler.h"
+
namespace {
// Supported LED count on this device
@@ -35,194 +36,6 @@
<< "\t--disable_privet Disable local privet\n";
}
-class CommandHandler {
- public:
- CommandHandler(weave::Device* device,
- weave::provider::TaskRunner* task_runner)
- : device_{device}, task_runner_(task_runner) {
- device->AddStateDefinitionsFromJson(R"({
- "_greeter": {"_greetings_counter":"integer"},
- "_ledflasher": {"_leds": {"items": "boolean"}}
- })");
-
- device->SetStatePropertiesFromJson(R"({
- "_greeter": {"_greetings_counter": 0},
- "_ledflasher":{"_leds": [false, false, false]}
- })",
- nullptr);
-
- device->AddCommandDefinitionsFromJson(R"({
- "_greeter": {
- "_greet": {
- "minimalRole": "user",
- "parameters": {
- "_name": "string",
- "_count": {"minimum": 1, "maximum": 100}
- },
- "progress": { "_todo": "integer"},
- "results": { "_greeting": "string" }
- }
- },
- "_ledflasher": {
- "_set":{
- "parameters": {
- "_led": {"minimum": 1, "maximum": 3},
- "_on": "boolean"
- }
- },
- "_toggle":{
- "parameters": {
- "_led": {"minimum": 1, "maximum": 3}
- }
- }
- }
- })");
- device->AddCommandHandler(
- "_ledflasher._toggle",
- base::Bind(&CommandHandler::OnFlasherToggleCommand,
- weak_ptr_factory_.GetWeakPtr()));
- device->AddCommandHandler("_greeter._greet",
- base::Bind(&CommandHandler::OnGreetCommand,
- weak_ptr_factory_.GetWeakPtr()));
- device->AddCommandHandler("_ledflasher._set",
- base::Bind(&CommandHandler::OnFlasherSetCommand,
- weak_ptr_factory_.GetWeakPtr()));
- device->AddCommandHandler("",
- base::Bind(&CommandHandler::OnUnhandledCommand,
- weak_ptr_factory_.GetWeakPtr()));
- }
-
- private:
- void DoGreet(const std::weak_ptr<weave::Command>& command, int todo) {
- auto cmd = command.lock();
- if (!cmd)
- return;
-
- std::string name;
- if (!cmd->GetParameters()->GetString("_name", &name)) {
- weave::ErrorPtr error;
- weave::Error::AddTo(&error, FROM_HERE, "example",
- "invalid_parameter_value", "Name is missing");
- cmd->Abort(error.get(), nullptr);
- return;
- }
-
- if (todo-- > 0) {
- LOG(INFO) << "Hello " << name;
-
- base::DictionaryValue progress;
- progress.SetInteger("_todo", todo);
- cmd->SetProgress(progress, nullptr);
-
- base::DictionaryValue state;
- state.SetInteger("_greeter._greetings_counter", ++counter_);
- device_->SetStateProperties(state, nullptr);
- }
-
- if (todo > 0) {
- task_runner_->PostDelayedTask(
- FROM_HERE, base::Bind(&CommandHandler::DoGreet,
- weak_ptr_factory_.GetWeakPtr(), command, todo),
- base::TimeDelta::FromSeconds(1));
- return;
- }
-
- base::DictionaryValue result;
- result.SetString("_greeting", "Hello " + name);
- cmd->Complete(result, nullptr);
- LOG(INFO) << cmd->GetName() << " command finished: " << result;
- LOG(INFO) << "New state: " << *device_->GetState();
- }
-
- void OnGreetCommand(const std::weak_ptr<weave::Command>& command) {
- auto cmd = command.lock();
- if (!cmd)
- return;
- LOG(INFO) << "received command: " << cmd->GetName();
-
- int todo = 1;
- cmd->GetParameters()->GetInteger("_count", &todo);
- DoGreet(command, todo);
- }
-
- void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) {
- auto cmd = command.lock();
- if (!cmd)
- return;
- LOG(INFO) << "received command: " << cmd->GetName();
- int32_t led_index = 0;
- bool cmd_value = false;
- if (cmd->GetParameters()->GetInteger("_led", &led_index) &&
- cmd->GetParameters()->GetBoolean("_on", &cmd_value)) {
- // Display this command in terminal
- LOG(INFO) << cmd->GetName() << " _led: " << led_index
- << ", _on: " << (cmd_value ? "true" : "false");
-
- led_index--;
- int new_state = cmd_value ? 1 : 0;
- int cur_state = led_status_[led_index];
- led_status_[led_index] = new_state;
-
- if (cmd_value != cur_state) {
- UpdateLedState();
- }
- cmd->Complete({}, nullptr);
- return;
- }
- weave::ErrorPtr error;
- weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
- "Invalid parameters");
- cmd->Abort(error.get(), nullptr);
- }
-
- void OnFlasherToggleCommand(const std::weak_ptr<weave::Command>& command) {
- auto cmd = command.lock();
- if (!cmd)
- return;
- LOG(INFO) << "received command: " << cmd->GetName();
- int32_t led_index = 0;
- if (cmd->GetParameters()->GetInteger("_led", &led_index)) {
- LOG(INFO) << cmd->GetName() << " _led: " << led_index;
- led_index--;
- led_status_[led_index] = ~led_status_[led_index];
-
- UpdateLedState();
- cmd->Complete({}, nullptr);
- return;
- }
- weave::ErrorPtr error;
- weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value",
- "Invalid parameters");
- cmd->Abort(error.get(), nullptr);
- }
-
- void OnUnhandledCommand(const std::weak_ptr<weave::Command>& command) {
- auto cmd = command.lock();
- if (!cmd)
- return;
- LOG(INFO) << cmd->GetName() << " unimplemented command: ignored";
- }
-
- void UpdateLedState(void) {
- base::ListValue list;
- for (uint32_t i = 0; i < led_status_.size(); i++)
- list.AppendBoolean(led_status_[i] ? true : false);
-
- device_->SetStateProperty("_ledflasher._leds", list, nullptr);
- }
-
- weave::Device* device_{nullptr};
- weave::provider::TaskRunner* task_runner_{nullptr};
-
- int counter_{0};
-
- // Simulate LED status on this device so client app could explore
- // Each bit represents one device, indexing from LSB
- std::bitset<kLedCount> led_status_{0};
-
- base::WeakPtrFactory<CommandHandler> weak_ptr_factory_{this};
-};
-
void OnRegisterDeviceDone(weave::Device* device, weave::ErrorPtr error) {
if (error)
LOG(ERROR) << "Fail to register device: " << error->GetMessage();
@@ -295,7 +108,11 @@
base::Bind(&OnRegisterDeviceDone, device.get()));
}
- CommandHandler handler(device.get(), &task_runner);
+ weave::examples::daemon::GreeterHandler greeter{&task_runner};
+ weave::examples::daemon::LedFlasherHandler ledFlasher;
+ greeter.Register(device.get());
+ ledFlasher.Register(device.get());
+
task_runner.Run();
LOG(INFO) << "exit";