| // 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_; | 
 |     std::string model_id_{"AAAAA"}; | 
 |  | 
 |     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_, opts.model_id_)}, | 
 |         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_; | 
 | }; |