blob: 52b28822c187645c8f896f84051056c2b18a6e84 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka0fa51e52015-07-10 00:12:25 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/device_manager.h"
Vitaly Buka0fa51e52015-07-10 00:12:25 -07006
7#include <string>
8
Vitaly Buka0d501072015-08-18 18:09:46 -07009#include <base/bind.h>
10
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020011#include "src/base_api_handler.h"
12#include "src/commands/command_manager.h"
13#include "src/config.h"
14#include "src/device_registration_info.h"
15#include "src/privet/privet_manager.h"
16#include "src/states/state_change_queue.h"
17#include "src/states/state_manager.h"
Vitaly Buka0fa51e52015-07-10 00:12:25 -070018
19namespace weave {
20
21namespace {
22
23// Max of 100 state update events should be enough in the queue.
24const size_t kMaxStateChangeQueueSize = 100;
Vitaly Buka0fa51e52015-07-10 00:12:25 -070025
26} // namespace
27
Vitaly Bukac5bdd172015-10-01 19:48:51 -070028DeviceManager::DeviceManager(provider::ConfigStore* config_store,
29 provider::TaskRunner* task_runner,
30 provider::HttpClient* http_client,
31 provider::Network* network,
32 provider::DnsServiceDiscovery* dns_sd,
33 provider::HttpServer* http_server,
34 provider::Wifi* wifi,
35 provider::Bluetooth* bluetooth) {
Vitaly Bukaff0b7c02015-07-29 16:39:34 -070036 command_manager_ = std::make_shared<CommandManager>();
Vitaly Buka0fa51e52015-07-10 00:12:25 -070037 state_change_queue_.reset(new StateChangeQueue(kMaxStateChangeQueueSize));
38 state_manager_ = std::make_shared<StateManager>(state_change_queue_.get());
Vitaly Buka0fa51e52015-07-10 00:12:25 -070039
Vitaly Bukac11a17d2015-08-15 10:36:10 -070040 std::unique_ptr<Config> config{new Config{config_store}};
41 config->Load();
Vitaly Buka0fa51e52015-07-10 00:12:25 -070042
Vitaly Buka0fa51e52015-07-10 00:12:25 -070043 device_info_.reset(new DeviceRegistrationInfo(
Vitaly Buka41a90d62015-09-29 16:58:39 -070044 command_manager_, state_manager_, std::move(config), task_runner,
45 http_client, network));
Vitaly Buka266e88b2015-10-06 11:33:00 -070046 base_api_handler_.reset(new BaseApiHandler{device_info_.get(), this});
Vitaly Buka0fa51e52015-07-10 00:12:25 -070047
48 device_info_->Start();
49
Vitaly Buka41a90d62015-09-29 16:58:39 -070050 if (http_server) {
Vitaly Buka41a90d62015-09-29 16:58:39 -070051 StartPrivet(task_runner, network, dns_sd, http_server, wifi, bluetooth);
Vitaly Buka2ad97342015-08-02 20:57:43 -070052 } else {
Vitaly Bukabeddc602015-09-24 15:28:03 -070053 CHECK(!dns_sd);
Vitaly Buka2ad97342015-08-02 20:57:43 -070054 }
Vitaly Buka0fa51e52015-07-10 00:12:25 -070055}
56
Vitaly Bukac5bdd172015-10-01 19:48:51 -070057DeviceManager::~DeviceManager() {}
58
Vitaly Bukaa8ece8f2015-10-05 13:30:23 -070059const Settings& DeviceManager::GetSettings() const {
Vitaly Bukaae6b35d2015-09-29 23:16:54 -070060 return device_info_->GetSettings();
61}
62
63void DeviceManager::AddSettingsChangedCallback(
64 const SettingsChangedCallback& callback) {
65 device_info_->GetMutableConfig()->AddOnChangedCallback(callback);
66}
67
Vitaly Buka8b4ab962015-07-14 19:19:39 -070068Config* DeviceManager::GetConfig() {
Vitaly Buka0fa51e52015-07-10 00:12:25 -070069 return device_info_->GetMutableConfig();
70}
71
Vitaly Buka41a90d62015-09-29 16:58:39 -070072void DeviceManager::StartPrivet(provider::TaskRunner* task_runner,
Vitaly Buka1e363672015-09-25 14:01:16 -070073 provider::Network* network,
74 provider::DnsServiceDiscovery* dns_sd,
75 provider::HttpServer* http_server,
76 provider::Wifi* wifi,
77 provider::Bluetooth* bluetooth) {
Vitaly Buka5fe76092015-10-08 13:37:53 -070078 privet_.reset(new privet::Manager{task_runner});
79 privet_->Start(network, dns_sd, http_server, wifi, device_info_.get(),
80 command_manager_.get(), state_manager_.get());
Vitaly Buka0fa51e52015-07-10 00:12:25 -070081}
82
Vitaly Bukac3c6dab2015-10-01 19:41:02 -070083GcdState DeviceManager::GetGcdState() const {
84 return device_info_->GetGcdState();
85}
86
87void DeviceManager::AddGcdStateChangedCallback(
88 const GcdStateChangedCallback& callback) {
89 device_info_->AddGcdStateChangedCallback(callback);
90}
91
Vitaly Buka3110deb2015-10-06 19:54:09 -070092void DeviceManager::AddCommandDefinitionsFromJson(const std::string& json) {
Vitaly Buka77c2bff2015-10-06 18:31:20 -070093 CHECK(command_manager_->LoadCommands(json, nullptr));
94}
95
96void DeviceManager::AddCommandDefinitions(const base::DictionaryValue& dict) {
97 CHECK(command_manager_->LoadCommands(dict, nullptr));
Vitaly Buka4c981352015-10-01 23:04:24 -070098}
99
Vitaly Bukaa8ece8f2015-10-05 13:30:23 -0700100bool DeviceManager::AddCommand(const base::DictionaryValue& command,
101 std::string* id,
102 ErrorPtr* error) {
103 return command_manager_->AddCommand(command, id, error);
104}
105
106Command* DeviceManager::FindCommand(const std::string& id) {
107 return command_manager_->FindCommand(id);
108}
109
Vitaly Buka695a5fb2015-10-06 16:26:08 -0700110void DeviceManager::AddCommandHandler(const std::string& command_name,
111 const CommandHandlerCallback& callback) {
112 return command_manager_->AddCommandHandler(command_name, callback);
Vitaly Bukaa8ece8f2015-10-05 13:30:23 -0700113}
114
Vitaly Buka77c2bff2015-10-06 18:31:20 -0700115void DeviceManager::AddStateChangedCallback(const base::Closure& callback) {
116 state_manager_->AddChangedCallback(callback);
117}
118
Vitaly Buka3110deb2015-10-06 19:54:09 -0700119void DeviceManager::AddStateDefinitionsFromJson(const std::string& json) {
Vitaly Buka216e86d2015-10-06 20:23:02 -0700120 CHECK(state_manager_->LoadStateDefinitionFromJson(json, nullptr));
Vitaly Buka77c2bff2015-10-06 18:31:20 -0700121}
122
123void DeviceManager::AddStateDefinitions(const base::DictionaryValue& dict) {
124 CHECK(state_manager_->LoadStateDefinition(dict, nullptr));
125}
126
Vitaly Buka216e86d2015-10-06 20:23:02 -0700127bool DeviceManager::SetStatePropertiesFromJson(const std::string& json,
128 ErrorPtr* error) {
129 return state_manager_->SetPropertiesFromJson(json, error);
Vitaly Buka77c2bff2015-10-06 18:31:20 -0700130}
131
Vitaly Buka216e86d2015-10-06 20:23:02 -0700132bool DeviceManager::SetStateProperties(const base::DictionaryValue& dict,
133 ErrorPtr* error) {
134 return state_manager_->SetProperties(dict, error);
Vitaly Buka4c981352015-10-01 23:04:24 -0700135}
136
Vitaly Bukac4305602015-11-24 23:33:09 -0800137const base::Value* DeviceManager::GetStateProperty(
Vitaly Buka4c981352015-10-01 23:04:24 -0700138 const std::string& name) const {
139 return state_manager_->GetProperty(name);
140}
141
142bool DeviceManager::SetStateProperty(const std::string& name,
143 const base::Value& value,
144 ErrorPtr* error) {
145 return state_manager_->SetProperty(name, value, error);
146}
147
Vitaly Bukac4305602015-11-24 23:33:09 -0800148const base::DictionaryValue& DeviceManager::GetState() const {
Vitaly Buka4c981352015-10-01 23:04:24 -0700149 return state_manager_->GetState();
150}
151
Vitaly Buka12870bd2015-10-08 23:49:39 -0700152void DeviceManager::Register(const std::string& ticket_id,
Vitaly Buka74763422015-10-11 00:39:52 -0700153 const DoneCallback& callback) {
154 device_info_->RegisterDevice(ticket_id, callback);
Vitaly Bukac3c6dab2015-10-01 19:41:02 -0700155}
156
Vitaly Bukae6073612015-10-01 17:58:52 -0700157void DeviceManager::AddPairingChangedCallbacks(
Vitaly Buka9aa15c72015-10-01 19:14:44 -0700158 const PairingBeginCallback& begin_callback,
159 const PairingEndCallback& end_callback) {
160 if (privet_)
161 privet_->AddOnPairingChangedCallbacks(begin_callback, end_callback);
Vitaly Bukae6073612015-10-01 17:58:52 -0700162}
163
Vitaly Bukac5bdd172015-10-01 19:48:51 -0700164std::unique_ptr<Device> Device::Create(provider::ConfigStore* config_store,
165 provider::TaskRunner* task_runner,
166 provider::HttpClient* http_client,
167 provider::Network* network,
168 provider::DnsServiceDiscovery* dns_sd,
169 provider::HttpServer* http_server,
170 provider::Wifi* wifi,
171 provider::Bluetooth* bluetooth) {
172 return std::unique_ptr<Device>{
173 new DeviceManager{config_store, task_runner, http_client, network, dns_sd,
174 http_server, wifi, bluetooth}};
Vitaly Buka0fa51e52015-07-10 00:12:25 -0700175}
176
177} // namespace weave