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