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