Revert "Merge remote-tracking branch 'weave/master' into aosp-master2" This reverts commit ca54c12635b4af2786807c980723c5964b06903d. Change-Id: I5819d299e565a9ecb3cb7eaa21c3731b266d5c63 Reviewed-on: https://weave-review.googlesource.com/1486 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/README b/README index bf9b70b..b62b547 100644 --- a/README +++ b/README
@@ -56,7 +56,7 @@ examples/build.sh -Execute example (check examples/daemon/README for details): +Execute example: sudo out/Debug/weave_daemon
diff --git a/examples/build.sh b/examples/build.sh index e4c412d..2bd398ef 100755 --- a/examples/build.sh +++ b/examples/build.sh
@@ -8,7 +8,7 @@ cd $ROOT_DIR -gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f ninja $DIR/daemon/examples.gyp +gyp -Ilibweave_common.gypi --toplevel-dir=. --depth=. -f ninja $DIR/daemon/daemon.gyp if [ -z "$BUILD_CONFIG" ]; then export BUILD_CONFIG=Debug @@ -16,7 +16,7 @@ export BUILD_TARGET=$* if [ -z "$BUILD_TARGET" ]; then - export BUILD_TARGET="weave_daemon_examples libweave_testrunner libweave_exports_testrunner" + export BUILD_TARGET="weave_daemon libweave_testrunner libweave_exports_testrunner" fi export CORES=`cat /proc/cpuinfo | grep processor | wc -l`
diff --git a/examples/daemon/README b/examples/daemon/README index 287459f..4743883 100644 --- a/examples/daemon/README +++ b/examples/daemon/README
@@ -84,16 +84,16 @@ Enter request body: { "deviceId": "0f8a5ff5-1ef0-ec39-f9d8-66d1caeb9e3d", - "name": "_sample._hello", + "name": "_greeter._greet", "parameters": { "_name": "cloud user" } } "Send the request", you command will be "queued" as its "state" - verify the command execution with weave daemon in terminal running the daemon, observe something similar to - New command '_sample._hello' arrived, ... - received command: _sample._hello - _sample._hello command: finished + New command '_greeter._greet' arrived, ... + received command: _greeter._greet + _greeter._greet command: finished - verify the command history with oauthplayground Similar to "Acquire Registration Ticket" section in this document, except in "step 3", do: @@ -104,9 +104,9 @@ "Send the request", you get all of the commands executed on your device, find something like "kind": "clouddevices#command", - "name": "_sample._hello", + "name": "_greeter._greet", "results": { - "_reply": "Hello cloud user" + "_greeting": "Hello cloud user" }, ...
diff --git a/examples/daemon/common/daemon.h b/examples/daemon/common/daemon.h deleted file mode 100644 index 0e05b88..0000000 --- a/examples/daemon/common/daemon.h +++ /dev/null
@@ -1,124 +0,0 @@ -// 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/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" -#include "examples/provider/event_http_server.h" -#include "examples/provider/event_network.h" -#include "examples/provider/event_task_runner.h" -#include "examples/provider/file_config_store.h" -#include "examples/provider/wifi_manager.h" - -class Daemon { - public: - struct Options { - bool force_bootstrapping_ = false; - bool disable_security_ = false; - bool disable_privet_ = false; - std::string registration_ticket_; - - static void ShowUsage(const std::string& name) { - LOG(ERROR) << "\nUsage: " << name << " <option(s)>" - << "\nOptions:\n" - << "\t-h,--help Show this help message\n" - << "\t--v=LEVEL Logging level\n" - << "\t-b,--bootstrapping Force WiFi bootstrapping\n" - << "\t-d,--disable_security Disable privet security\n" - << "\t--registration_ticket=TICKET Register device with the " - "given ticket\n" - << "\t--disable_privet Disable local privet\n"; - } - - bool Parse(int argc, char** argv) { - for (int i = 1; i < argc; ++i) { - std::string arg = argv[i]; - if (arg == "-h" || arg == "--help") { - return false; - } else if (arg == "-b" || arg == "--bootstrapping") { - force_bootstrapping_ = true; - } else if (arg == "-d" || arg == "--disable_security") { - disable_security_ = true; - } else if (arg == "--disable_privet") { - disable_privet_ = true; - } else if (arg.find("--registration_ticket") != std::string::npos) { - auto pos = arg.find("="); - if (pos == std::string::npos) { - return false; - } - registration_ticket_ = arg.substr(pos + 1); - } else if (arg.find("--v") != std::string::npos) { - auto pos = arg.find("="); - if (pos == std::string::npos) { - return false; - } - logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1))); - } else { - return false; - } - } - return true; - } - }; - - Daemon(const Options& opts) - : config_store_{new weave::examples::FileConfigStore( - opts.disable_security_)}, - task_runner_{new weave::examples::EventTaskRunner}, - http_client_{new weave::examples::CurlHttpClient(task_runner_.get())}, - network_{new weave::examples::EventNetworkImpl(task_runner_.get())}, - bluetooth_{new weave::examples::BluetoothImpl} { - if (!opts.disable_privet_) { - network_->SetSimulateOffline(opts.force_bootstrapping_); - - dns_sd_.reset(new weave::examples::AvahiClient); - http_server_.reset( - new weave::examples::HttpServerImpl{task_runner_.get()}); - if (weave::examples::WifiImpl::HasWifiCapability()) - wifi_.reset( - new weave::examples::WifiImpl{task_runner_.get(), network_.get()}); - } - device_ = weave::Device::Create(config_store_.get(), task_runner_.get(), - http_client_.get(), network_.get(), - dns_sd_.get(), http_server_.get(), - wifi_.get(), bluetooth_.get()); - - if (!opts.registration_ticket_.empty()) { - device_->Register(opts.registration_ticket_, - base::Bind(&OnRegisterDeviceDone, device_.get())); - } - } - - void Run() { task_runner_->Run(); } - - weave::Device* GetDevice() const { return device_.get(); } - - weave::examples::EventTaskRunner* GetTaskRunner() const { - return task_runner_.get(); - } - - private: - static void OnRegisterDeviceDone(weave::Device* device, - weave::ErrorPtr error) { - if (error) - LOG(ERROR) << "Fail to register device: " << error->GetMessage(); - else - LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id; - } - - std::unique_ptr<weave::examples::FileConfigStore> config_store_; - std::unique_ptr<weave::examples::EventTaskRunner> task_runner_; - std::unique_ptr<weave::examples::CurlHttpClient> http_client_; - std::unique_ptr<weave::examples::EventNetworkImpl> network_; - std::unique_ptr<weave::examples::BluetoothImpl> bluetooth_; - std::unique_ptr<weave::examples::AvahiClient> dns_sd_; - std::unique_ptr<weave::examples::HttpServerImpl> http_server_; - std::unique_ptr<weave::examples::WifiImpl> wifi_; - std::unique_ptr<weave::Device> device_; -};
diff --git a/examples/daemon/lock/daemon.gyp b/examples/daemon/daemon.gyp similarity index 86% rename from examples/daemon/lock/daemon.gyp rename to examples/daemon/daemon.gyp index 0402a29..c6f8837 100644 --- a/examples/daemon/lock/daemon.gyp +++ b/examples/daemon/daemon.gyp
@@ -4,10 +4,10 @@ { 'targets': [ { - 'target_name': 'weave_daemon_lock', + 'target_name': 'weave_daemon', 'type': 'executable', 'sources': [ - 'lock.cc', + 'main.cc', ], 'dependencies': [ '<@(DEPTH)/libweave_standalone.gyp:libweave',
diff --git a/examples/daemon/examples.gyp b/examples/daemon/examples.gyp deleted file mode 100644 index 8fee90d..0000000 --- a/examples/daemon/examples.gyp +++ /dev/null
@@ -1,14 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'weave_daemon_examples', - 'type': 'none', - 'dependencies': [ - 'sample/daemon.gyp:weave_daemon_sample', - 'light/daemon.gyp:weave_daemon_light', - 'lock/daemon.gyp:weave_daemon_lock', - 'ledflasher/daemon.gyp:weave_daemon_ledflasher' - ] - } - ] -}
diff --git a/examples/daemon/ledflasher/daemon.gyp b/examples/daemon/ledflasher/daemon.gyp deleted file mode 100644 index 5abfcd6..0000000 --- a/examples/daemon/ledflasher/daemon.gyp +++ /dev/null
@@ -1,18 +0,0 @@ -# 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. -{ - 'targets': [ - { - 'target_name': 'weave_daemon_ledflasher', - 'type': 'executable', - 'sources': [ - 'ledflasher.cc', - ], - 'dependencies': [ - '<@(DEPTH)/libweave_standalone.gyp:libweave', - '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider', - ] - } - ] -}
diff --git a/examples/daemon/ledflasher/ledflasher.cc b/examples/daemon/ledflasher_handler.h similarity index 78% rename from examples/daemon/ledflasher/ledflasher.cc rename to examples/daemon/ledflasher_handler.h index 38314f5..812a3d4 100644 --- a/examples/daemon/ledflasher/ledflasher.cc +++ b/examples/daemon/ledflasher_handler.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "examples/daemon/common/daemon.h" - #include <weave/device.h> #include <base/bind.h> @@ -11,6 +9,10 @@ #include <bitset> +namespace weave { +namespace examples { +namespace daemon { + namespace { // Supported LED count on this device const size_t kLedCount = 3; @@ -21,7 +23,7 @@ class LedFlasherHandler { public: LedFlasherHandler() {} - void Register(weave::Device* device) { + void Register(Device* device) { device_ = device; device->AddStateDefinitionsFromJson(R"({ @@ -58,7 +60,7 @@ } private: - void OnFlasherSetCommand(const std::weak_ptr<weave::Command>& command) { + void OnFlasherSetCommand(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -82,13 +84,13 @@ cmd->Complete({}, nullptr); return; } - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", - "Invalid parameters"); + ErrorPtr error; + 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) { + void OnFlasherToggleCommand(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -103,13 +105,13 @@ cmd->Complete({}, nullptr); return; } - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", - "Invalid parameters"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Invalid parameters"); cmd->Abort(error.get(), nullptr); } - void UpdateLedState() { + void UpdateLedState(void) { base::ListValue list; for (uint32_t i = 0; i < led_status_.size(); i++) list.AppendBoolean(led_status_[i] ? true : false); @@ -117,7 +119,7 @@ device_->SetStateProperty("_ledflasher._leds", list, nullptr); } - weave::Device* device_{nullptr}; + Device* device_{nullptr}; // Simulate LED status on this device so client app could explore // Each bit represents one device, indexing from LSB @@ -125,15 +127,6 @@ base::WeakPtrFactory<LedFlasherHandler> weak_ptr_factory_{this}; }; -int main(int argc, char** argv) { - Daemon::Options opts; - if (!opts.Parse(argc, argv)) { - Daemon::Options::ShowUsage(argv[0]); - return 1; - } - Daemon daemon{opts}; - LedFlasherHandler handler; - handler.Register(daemon.GetDevice()); - daemon.Run(); - return 0; -} +} // namespace daemon +} // namespace examples +} // namespace weave
diff --git a/examples/daemon/light/daemon.gyp b/examples/daemon/light/daemon.gyp deleted file mode 100644 index e8bb646..0000000 --- a/examples/daemon/light/daemon.gyp +++ /dev/null
@@ -1,18 +0,0 @@ -# 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. -{ - 'targets': [ - { - 'target_name': 'weave_daemon_light', - 'type': 'executable', - 'sources': [ - 'light.cc', - ], - 'dependencies': [ - '<@(DEPTH)/libweave_standalone.gyp:libweave', - '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider', - ] - } - ] -}
diff --git a/examples/daemon/light/light.cc b/examples/daemon/light_handler.h similarity index 68% rename from examples/daemon/light/light.cc rename to examples/daemon/light_handler.h index 484b9e1..33b440a 100644 --- a/examples/daemon/light/light.cc +++ b/examples/daemon/light_handler.h
@@ -2,19 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "examples/daemon/common/daemon.h" - #include <weave/device.h> #include <base/bind.h> #include <base/memory/weak_ptr.h> +namespace weave { +namespace examples { +namespace daemon { + // LightHandler is a command handler example that shows // how to handle commands for a Weave light. class LightHandler { public: LightHandler() = default; - void Register(weave::Device* device) { + void Register(Device* device) { device_ = device; device->AddStateDefinitionsFromJson(R"({ @@ -48,16 +50,18 @@ } } })"); - device->AddCommandHandler("onOff.setConfig", - base::Bind(&LightHandler::OnOnOffSetConfig, - weak_ptr_factory_.GetWeakPtr())); - device->AddCommandHandler("brightness.setConfig", - base::Bind(&LightHandler::OnBrightnessSetConfig, - weak_ptr_factory_.GetWeakPtr())); + device->AddCommandHandler( + "onOff.setConfig", + base::Bind(&LightHandler::OnOnOffSetConfig, + weak_ptr_factory_.GetWeakPtr())); + device->AddCommandHandler( + "brightness.setConfig", + base::Bind(&LightHandler::OnBrightnessSetConfig, + weak_ptr_factory_.GetWeakPtr())); } private: - void OnBrightnessSetConfig(const std::weak_ptr<weave::Command>& command) { + void OnBrightnessSetConfig(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -74,13 +78,13 @@ cmd->Complete({}, nullptr); return; } - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", - "Invalid parameters"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Invalid parameters"); cmd->Abort(error.get(), nullptr); } - void OnOnOffSetConfig(const std::weak_ptr<weave::Command>& command) { + void OnOnOffSetConfig(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -99,20 +103,20 @@ cmd->Complete({}, nullptr); return; } - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", - "Invalid parameters"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Invalid parameters"); cmd->Abort(error.get(), nullptr); } - void UpdateLightState() { + void UpdateLightState(void) { base::DictionaryValue state; state.SetString("onOff.state", light_status_ ? "on" : "standby"); state.SetInteger("brightness.brightness", brightness_state_); device_->SetStateProperties(state, nullptr); } - weave::Device* device_{nullptr}; + Device* device_{nullptr}; // Simulate the state of the light. bool light_status_; @@ -120,15 +124,6 @@ base::WeakPtrFactory<LightHandler> weak_ptr_factory_{this}; }; -int main(int argc, char** argv) { - Daemon::Options opts; - if (!opts.Parse(argc, argv)) { - Daemon::Options::ShowUsage(argv[0]); - return 1; - } - Daemon daemon{opts}; - LightHandler handler; - handler.Register(daemon.GetDevice()); - daemon.Run(); - return 0; -} +} // namespace daemon +} // namespace examples +} // namespace weave
diff --git a/examples/daemon/lock/lock.cc b/examples/daemon/lock_handler.h similarity index 63% rename from examples/daemon/lock/lock.cc rename to examples/daemon/lock_handler.h index e1ca2d9..b2fd9b5 100644 --- a/examples/daemon/lock/lock.cc +++ b/examples/daemon/lock_handler.h
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "examples/daemon/common/daemon.h" - #include <weave/device.h> #include <weave/enum_to_string.h> @@ -11,26 +9,29 @@ #include <base/memory/weak_ptr.h> namespace weave { + namespace lockstate { enum class LockState { kUnlocked, kLocked, kPartiallyLocked }; const weave::EnumToStringMap<LockState>::Map kLockMapMethod[] = { - {LockState::kLocked, "locked"}, - {LockState::kUnlocked, "unlocked"}, - {LockState::kPartiallyLocked, "partiallyLocked"}}; + {LockState::kLocked, "locked"}, + {LockState::kUnlocked, "unlocked"}, + {LockState::kPartiallyLocked, "partiallyLocked"}}; } // namespace lockstate template <> EnumToStringMap<lockstate::LockState>::EnumToStringMap() - : EnumToStringMap(lockstate::kLockMapMethod) {} -} // namespace weave + : EnumToStringMap(lockstate::kLockMapMethod) {} + +namespace examples { +namespace daemon { // LockHandler is a command handler example that shows // how to handle commands for a Weave lock. class LockHandler { public: LockHandler() = default; - void Register(weave::Device* device) { + void Register(Device* device) { device_ = device; device->AddStateDefinitionsFromJson(R"({ @@ -51,13 +52,14 @@ } } })"); - device->AddCommandHandler("lock.setConfig", - base::Bind(&LockHandler::OnLockSetConfig, - weak_ptr_factory_.GetWeakPtr())); + device->AddCommandHandler( + "lock.setConfig", + base::Bind(&LockHandler::OnLockSetConfig, + weak_ptr_factory_.GetWeakPtr())); } private: - void OnLockSetConfig(const std::weak_ptr<weave::Command>& command) { + void OnLockSetConfig(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -66,13 +68,13 @@ if (cmd->GetParameters()->GetString("lockedState", &requested_state)) { LOG(INFO) << cmd->GetName() << " state: " << requested_state; - weave::lockstate::LockState new_lock_status; + lockstate::LockState new_lock_status; if (!weave::StringToEnum(requested_state, &new_lock_status)) { // Invalid lock state was specified. - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", - "invalid_parameter_value", "Invalid parameters"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Invalid parameters"); cmd->Abort(error.get(), nullptr); return; } @@ -86,35 +88,26 @@ cmd->Complete({}, nullptr); return; } - weave::ErrorPtr error; - weave::Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", - "Invalid parameters"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Invalid parameters"); cmd->Abort(error.get(), nullptr); } - void UpdateLockState() { + void UpdateLockState(void) { base::DictionaryValue state; std::string updated_state = weave::EnumToString(lock_state_); state.SetString("lock.lockedState", updated_state); device_->SetStateProperties(state, nullptr); } - weave::Device* device_{nullptr}; + Device* device_{nullptr}; // Simulate the state of the light. - weave::lockstate::LockState lock_state_{weave::lockstate::LockState::kLocked}; + lockstate::LockState lock_state_{lockstate::LockState::kLocked}; base::WeakPtrFactory<LockHandler> weak_ptr_factory_{this}; }; -int main(int argc, char** argv) { - Daemon::Options opts; - if (!opts.Parse(argc, argv)) { - Daemon::Options::ShowUsage(argv[0]); - return 1; - } - Daemon daemon{opts}; - LockHandler handler; - handler.Register(daemon.GetDevice()); - daemon.Run(); - return 0; -} +} // namespace daemon +} // namespace examples +} // namespace weave
diff --git a/examples/daemon/main.cc b/examples/daemon/main.cc new file mode 100644 index 0000000..a4ec366 --- /dev/null +++ b/examples/daemon/main.cc
@@ -0,0 +1,145 @@ +// 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/error.h> + +#include <base/bind.h> + +#include "examples/daemon/ledflasher_handler.h" +#include "examples/daemon/light_handler.h" +#include "examples/daemon/lock_handler.h" +#include "examples/daemon/sample_handler.h" + +#include "examples/provider/avahi_client.h" +#include "examples/provider/bluez_client.h" +#include "examples/provider/curl_http_client.h" +#include "examples/provider/event_http_server.h" +#include "examples/provider/event_network.h" +#include "examples/provider/event_task_runner.h" +#include "examples/provider/file_config_store.h" +#include "examples/provider/wifi_manager.h" + +namespace { + +// Supported LED count on this device +const size_t kLedCount = 3; + +void ShowUsage(const std::string& name) { + LOG(ERROR) << "\nUsage: " << name << " <option(s)>" + << "\nOptions:\n" + << "\t-h,--help Show this help message\n" + << "\t--v=LEVEL Logging level\n" + << "\t-b,--bootstrapping Force WiFi bootstrapping\n" + << "\t-d,--disable_security Disable privet security\n" + << "\t--registration_ticket=TICKET Register device with the " + "given ticket\n" + << "\t--disable_privet Disable local privet\n" + << "\t--type=UIDEVICEKIND Create a device with the " + "specified ui device kind\n"; +} + +void OnRegisterDeviceDone(weave::Device* device, weave::ErrorPtr error) { + if (error) + LOG(ERROR) << "Fail to register device: " << error->GetMessage(); + else + LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id; +} + +} // namespace + +int main(int argc, char** argv) { + bool force_bootstrapping = false; + bool disable_security = false; + bool disable_privet = false; + std::string registration_ticket; + std::string ui_device_kind; + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg == "-h" || arg == "--help") { + ShowUsage(argv[0]); + return 0; + } else if (arg == "-b" || arg == "--bootstrapping") { + force_bootstrapping = true; + } else if (arg == "-d" || arg == "--disable_security") { + disable_security = true; + } else if (arg == "--disable_privet") { + disable_privet = true; + } else if (arg.find("--registration_ticket") != std::string::npos) { + auto pos = arg.find("="); + if (pos == std::string::npos) { + ShowUsage(argv[0]); + return 1; + } + registration_ticket = arg.substr(pos + 1); + } else if (arg.find("--v") != std::string::npos) { + auto pos = arg.find("="); + if (pos == std::string::npos) { + ShowUsage(argv[0]); + return 1; + } + logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1))); + } else if (arg.find("--type") != std::string::npos) { + auto pos = arg.find("="); + if (pos == std::string::npos) { + ShowUsage(argv[0]); + return 1; + } + ui_device_kind = arg.substr(pos + 1); + } else { + ShowUsage(argv[0]); + return 1; + } + } + + weave::examples::FileConfigStore config_store{disable_security}; + weave::examples::EventTaskRunner task_runner; + weave::examples::CurlHttpClient http_client{&task_runner}; + weave::examples::EventNetworkImpl network{&task_runner}; + weave::examples::BluetoothImpl bluetooth; + std::unique_ptr<weave::examples::AvahiClient> dns_sd; + std::unique_ptr<weave::examples::HttpServerImpl> http_server; + std::unique_ptr<weave::examples::WifiImpl> wifi; + + if (!disable_privet) { + network.SetSimulateOffline(force_bootstrapping); + + dns_sd.reset(new weave::examples::AvahiClient); + http_server.reset(new weave::examples::HttpServerImpl{&task_runner}); + if (weave::examples::WifiImpl::HasWifiCapability()) + wifi.reset(new weave::examples::WifiImpl{&task_runner, &network}); + } + std::unique_ptr<weave::Device> device{weave::Device::Create( + &config_store, &task_runner, &http_client, &network, dns_sd.get(), + http_server.get(), wifi.get(), &bluetooth)}; + + if (!registration_ticket.empty()) { + device->Register(registration_ticket, + base::Bind(&OnRegisterDeviceDone, device.get())); + } + + weave::examples::daemon::SampleHandler sample{&task_runner}; + weave::examples::daemon::LedFlasherHandler ledFlasher; + sample.Register(device.get()); + ledFlasher.Register(device.get()); + + // If the caller specified a particular ui device kind, register the + // correspoinding device handlers + // TODO: move this to before device registration, as this should also + // cause a particular model manifest to be used. + weave::examples::daemon::LightHandler lightHandler; + weave::examples::daemon::LockHandler lockHandler; + if (!ui_device_kind.empty()) { + if (ui_device_kind == "light") { + lightHandler.Register(device.get()); + } else if (ui_device_kind == "lock") { + lockHandler.Register(device.get()); + } + } + + task_runner.Run(); + + LOG(INFO) << "exit"; + return 0; +}
diff --git a/examples/daemon/sample/daemon.gyp b/examples/daemon/sample/daemon.gyp deleted file mode 100644 index 29d8235..0000000 --- a/examples/daemon/sample/daemon.gyp +++ /dev/null
@@ -1,18 +0,0 @@ -# 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. -{ - 'targets': [ - { - 'target_name': 'weave_daemon_sample', - 'type': 'executable', - 'sources': [ - 'sample.cc', - ], - 'dependencies': [ - '<@(DEPTH)/libweave_standalone.gyp:libweave', - '<@(DEPTH)/examples/provider/provider.gyp:libweave_provider', - ] - } - ] -}
diff --git a/examples/daemon/sample/sample.cc b/examples/daemon/sample_handler.h similarity index 80% rename from examples/daemon/sample/sample.cc rename to examples/daemon/sample_handler.h index 905a977..eca3452 100644 --- a/examples/daemon/sample/sample.cc +++ b/examples/daemon/sample_handler.h
@@ -2,14 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "examples/daemon/common/daemon.h" - #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 { + // SampleHandler is a command handler example. // It implements the following commands: // - _hello: handle a command with an argument and set its results. @@ -17,9 +19,9 @@ // - _countdown: handle long running command and report progress. class SampleHandler { public: - SampleHandler(weave::provider::TaskRunner* task_runner) + SampleHandler(provider::TaskRunner* task_runner) : task_runner_{task_runner} {} - void Register(weave::Device* device) { + void Register(Device* device) { device_ = device; device->AddCommandDefinitionsFromJson(R"({ @@ -67,7 +69,7 @@ } private: - void OnHelloCommand(const std::weak_ptr<weave::Command>& command) { + void OnHelloCommand(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -75,9 +77,9 @@ 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"); + ErrorPtr error; + Error::AddTo(&error, FROM_HERE, "example", "invalid_parameter_value", + "Name is missing"); cmd->Abort(error.get(), nullptr); return; } @@ -88,7 +90,7 @@ LOG(INFO) << cmd->GetName() << " command finished: " << result; } - void OnPingCommand(const std::weak_ptr<weave::Command>& command) { + void OnPingCommand(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -105,7 +107,7 @@ LOG(INFO) << cmd->GetName() << " command finished: " << result; } - void OnCountdownCommand(const std::weak_ptr<weave::Command>& command) { + void OnCountdownCommand(const std::weak_ptr<Command>& command) { auto cmd = command.lock(); if (!cmd) return; @@ -119,7 +121,7 @@ DoTick(cmd, seconds); } - void DoTick(const std::weak_ptr<weave::Command>& command, int seconds) { + void DoTick(const std::weak_ptr<Command>& command, int seconds) { auto cmd = command.lock(); if (!cmd) return; @@ -146,22 +148,13 @@ LOG(INFO) << cmd->GetName() << " command finished: " << result; } - weave::Device* device_{nullptr}; - weave::provider::TaskRunner* task_runner_{nullptr}; + Device* device_{nullptr}; + provider::TaskRunner* task_runner_{nullptr}; int ping_count_{0}; base::WeakPtrFactory<SampleHandler> weak_ptr_factory_{this}; }; -int main(int argc, char** argv) { - Daemon::Options opts; - if (!opts.Parse(argc, argv)) { - Daemon::Options::ShowUsage(argv[0]); - return 1; - } - Daemon daemon{opts}; - SampleHandler handler{daemon.GetTaskRunner()}; - handler.Register(daemon.GetDevice()); - daemon.Run(); - return 0; -} +} // namespace daemon +} // namespace examples +} // namespace weave
diff --git a/src/commands/schema_utils.h b/src/commands/schema_utils.h index 0c1d1b3..826bab8 100644 --- a/src/commands/schema_utils.h +++ b/src/commands/schema_utils.h
@@ -5,7 +5,6 @@ #ifndef LIBWEAVE_SRC_COMMANDS_SCHEMA_UTILS_H_ #define LIBWEAVE_SRC_COMMANDS_SCHEMA_UTILS_H_ -#include <cmath> #include <limits> #include <map> #include <memory>
diff --git a/src/privet/wifi_bootstrap_manager.cc b/src/privet/wifi_bootstrap_manager.cc index 292622d..4f46ea4 100644 --- a/src/privet/wifi_bootstrap_manager.cc +++ b/src/privet/wifi_bootstrap_manager.cc
@@ -20,10 +20,7 @@ namespace { -const int kMonitoringWithSsidTimeoutSeconds = 15; const int kMonitoringTimeoutSeconds = 120; -const int kBootstrapTimeoutSeconds = 600; -const int kConnectingTimeoutSeconds = 180; const EnumToStringMap<WifiBootstrapManager::State>::Map kWifiSetupStateMap[] = { {WifiBootstrapManager::State::kDisabled, "disabled"}, @@ -58,8 +55,7 @@ lifetime_weak_factory_.GetWeakPtr())); if (config_->GetSettings().last_configured_ssid.empty()) { // Give implementation some time to figure out state. - StartMonitoring( - base::TimeDelta::FromSeconds(kMonitoringWithSsidTimeoutSeconds)); + StartMonitoring(base::TimeDelta::FromSeconds(15)); } else { StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds)); } @@ -84,30 +80,28 @@ task_runner_->PostDelayedTask( FROM_HERE, base::Bind(&WifiBootstrapManager::OnBootstrapTimeout, tasks_weak_factory_.GetWeakPtr()), - base::TimeDelta::FromSeconds(kBootstrapTimeoutSeconds)); + base::TimeDelta::FromMinutes(10)); } // TODO(vitalybuka): Add SSID probing. privet_ssid_ = GenerateSsid(); CHECK(!privet_ssid_.empty()); - - VLOG(1) << "Starting AP with SSID: " << privet_ssid_; wifi_->StartAccessPoint(privet_ssid_); } void WifiBootstrapManager::EndBootstrapping() { - VLOG(1) << "Stopping AP"; wifi_->StopAccessPoint(); privet_ssid_.clear(); } void WifiBootstrapManager::StartConnecting(const std::string& ssid, const std::string& passphrase) { - VLOG(1) << "Attempting connect to SSID:" << ssid; + VLOG(1) << "WiFi is attempting to connect. (ssid=" << ssid + << ", pass=" << passphrase << ")."; UpdateState(State::kConnecting); task_runner_->PostDelayedTask( FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout, tasks_weak_factory_.GetWeakPtr()), - base::TimeDelta::FromSeconds(kConnectingTimeoutSeconds)); + base::TimeDelta::FromMinutes(3)); wifi_->Connect(ssid, passphrase, base::Bind(&WifiBootstrapManager::OnConnectDone, tasks_weak_factory_.GetWeakPtr(), ssid)); @@ -116,11 +110,6 @@ void WifiBootstrapManager::EndConnecting() {} void WifiBootstrapManager::StartMonitoring(const base::TimeDelta& timeout) { - monitor_until_ = {}; - ContinueMonitoring(timeout); -} - -void WifiBootstrapManager::ContinueMonitoring(const base::TimeDelta& timeout) { VLOG(1) << "Monitoring connectivity."; // We already have a callback in place with |network_| to update our // connectivity state. See OnConnectivityChange(). @@ -145,8 +134,8 @@ void WifiBootstrapManager::EndMonitoring() {} void WifiBootstrapManager::UpdateState(State new_state) { - VLOG(3) << "Switching state from " << EnumToString(state_) << " to " - << EnumToString(new_state); + VLOG(3) << "Switching state from " << static_cast<int>(state_) << " to " + << static_cast<int>(new_state); // Abort irrelevant tasks. tasks_weak_factory_.InvalidateWeakPtrs(); @@ -238,26 +227,29 @@ } void WifiBootstrapManager::OnConnectivityChange() { + VLOG(3) << "ConnectivityChanged: " + << EnumToString(network_->GetConnectionState()); UpdateConnectionState(); - if (state_ == State::kMonitoring || + if (state_ == State::kMonitoring || // Reset monitoring timeout. (state_ != State::kDisabled && network_->GetConnectionState() == Network::State::kOnline)) { - ContinueMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds)); + StartMonitoring(base::TimeDelta::FromSeconds(kMonitoringTimeoutSeconds)); } } void WifiBootstrapManager::OnMonitorTimeout() { - VLOG(1) << "Spent too long offline. Entering bootstrap mode."; + VLOG(1) << "Spent too long offline. Entering bootstrap mode."; // TODO(wiley) Retrieve relevant errors from shill. StartBootstrapping(); } void WifiBootstrapManager::UpdateConnectionState() { connection_state_ = ConnectionState{ConnectionState::kUnconfigured}; + if (config_->GetSettings().last_configured_ssid.empty()) + return; Network::State service_state{network_->GetConnectionState()}; - VLOG(3) << "New network state: " << EnumToString(service_state); switch (service_state) { case Network::State::kOffline: connection_state_ = ConnectionState{ConnectionState::kOffline};
diff --git a/src/privet/wifi_bootstrap_manager.h b/src/privet/wifi_bootstrap_manager.h index 62a77c2..71dbb49 100644 --- a/src/privet/wifi_bootstrap_manager.h +++ b/src/privet/wifi_bootstrap_manager.h
@@ -74,7 +74,6 @@ void EndConnecting(); void StartMonitoring(const base::TimeDelta& timeout); - void ContinueMonitoring(const base::TimeDelta& timeout); void EndMonitoring(); // Update the current state, post tasks to notify listeners accordingly to
diff --git a/src/weave_unittest.cc b/src/weave_unittest.cc index fb00cc9..6ff3f6d 100644 --- a/src/weave_unittest.cc +++ b/src/weave_unittest.cc
@@ -21,14 +21,13 @@ #include "src/bind_lambda.h" using testing::_; -using testing::AtLeast; using testing::AtMost; using testing::HasSubstr; -using testing::InSequence; using testing::Invoke; using testing::InvokeWithoutArgs; using testing::MatchesRegex; using testing::Mock; +using testing::AtLeast; using testing::Return; using testing::ReturnRefOfCopy; using testing::StartsWith; @@ -267,13 +266,10 @@ void NotifyNetworkChanged(provider::Network::State state, base::TimeDelta delay) { - auto task = [this, state] { - EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state)); - for (const auto& cb : network_callbacks_) - cb.Run(); - }; - - task_runner_.PostDelayedTask(FROM_HERE, base::Bind(task), delay); + EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state)); + for (const auto& cb : network_callbacks_) { + task_runner_.PostDelayedTask(FROM_HERE, cb, delay); + } } std::map<std::string, provider::HttpServer::RequestHandlerCallback> @@ -464,67 +460,4 @@ StartDevice(); } -TEST_F(WeaveWiFiSetupTest, OfflineLongTimeWithNoSsid) { - EXPECT_CALL(network_, GetConnectionState()) - .WillRepeatedly(Return(Network::State::kOffline)); - NotifyNetworkChanged(provider::Network::State::kOnline, - base::TimeDelta::FromHours(15)); - - { - InSequence s; - auto time_stamp = task_runner_.GetClock()->Now(); - - EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv"))) - .WillOnce(InvokeWithoutArgs([this, &time_stamp]() { - EXPECT_LE(task_runner_.GetClock()->Now() - time_stamp, - base::TimeDelta::FromMinutes(1)); - time_stamp = task_runner_.GetClock()->Now(); - })); - - EXPECT_CALL(wifi_, StopAccessPoint()) - .WillOnce(InvokeWithoutArgs([this, &time_stamp]() { - EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp, - base::TimeDelta::FromMinutes(5)); - time_stamp = task_runner_.GetClock()->Now(); - task_runner_.Break(); - })); - } - - StartDevice(); -} - -TEST_F(WeaveWiFiSetupTest, OfflineLongTimeWithSsid) { - EXPECT_CALL(config_store_, LoadSettings()) - .WillRepeatedly(Return(R"({"last_configured_ssid": "TEST_ssid"})")); - EXPECT_CALL(network_, GetConnectionState()) - .WillRepeatedly(Return(Network::State::kOffline)); - NotifyNetworkChanged(provider::Network::State::kOnline, - base::TimeDelta::FromHours(15)); - - { - InSequence s; - auto time_stamp = task_runner_.GetClock()->Now(); - for (size_t i = 0; i < 10; ++i) { - EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv"))) - .WillOnce(InvokeWithoutArgs([this, &time_stamp]() { - EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp, - base::TimeDelta::FromMinutes(1)); - time_stamp = task_runner_.GetClock()->Now(); - })); - - EXPECT_CALL(wifi_, StopAccessPoint()) - .WillOnce(InvokeWithoutArgs([this, &time_stamp]() { - EXPECT_GT(task_runner_.GetClock()->Now() - time_stamp, - base::TimeDelta::FromMinutes(5)); - time_stamp = task_runner_.GetClock()->Now(); - })); - } - - EXPECT_CALL(wifi_, StartAccessPoint(MatchesRegex("TEST_NAME.*prv"))) - .WillOnce(InvokeWithoutArgs([this]() { task_runner_.Break(); })); - } - - StartDevice(); -} - } // namespace weave