blob: 53a8d187ee0573e7c3b3e7a3fd72a7f0a025e01e [file] [log] [blame]
// 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 "src/device_manager.h"
#include <string>
#include <base/bind.h>
#include "src/access_api_handler.h"
#include "src/access_revocation_manager_impl.h"
#include "src/base_api_handler.h"
#include "src/commands/schema_constants.h"
#include "src/component_manager_impl.h"
#include "src/config.h"
#include "src/device_registration_info.h"
#include "src/privet/auth_manager.h"
#include "src/privet/privet_manager.h"
#include "src/string_utils.h"
#include "src/utils.h"
namespace weave {
DeviceManager::DeviceManager(provider::ConfigStore* config_store,
provider::TaskRunner* task_runner,
provider::HttpClient* http_client,
provider::Network* network,
provider::DnsServiceDiscovery* dns_sd,
provider::HttpServer* http_server,
provider::Wifi* wifi,
provider::Bluetooth* bluetooth)
: task_runner_{task_runner},
network_{network},
dns_sd_{dns_sd},
http_server_{http_server},
wifi_{wifi},
config_{new Config{config_store}},
component_manager_{new ComponentManagerImpl{task_runner}} {
if (http_server) {
access_revocation_manager_.reset(
new AccessRevocationManagerImpl{config_store});
auth_manager_.reset(
new privet::AuthManager(config_.get(), access_revocation_manager_.get(),
http_server->GetHttpsCertificateFingerprint()));
access_api_handler_.reset(
new AccessApiHandler{this, access_revocation_manager_.get()});
}
device_info_.reset(new DeviceRegistrationInfo(
config_.get(), component_manager_.get(), task_runner, http_client,
network, auth_manager_.get()));
base_api_handler_.reset(new BaseApiHandler{device_info_.get(), this});
device_info_->Start();
if (http_server) {
StartPrivet();
AddSettingsChangedCallback(base::Bind(&DeviceManager::OnSettingsChanged,
weak_ptr_factory_.GetWeakPtr()));
} else {
CHECK(!dns_sd);
}
}
DeviceManager::~DeviceManager() {}
const Settings& DeviceManager::GetSettings() const {
return device_info_->GetSettings();
}
void DeviceManager::AddSettingsChangedCallback(
const SettingsChangedCallback& callback) {
device_info_->GetMutableConfig()->AddOnChangedCallback(callback);
}
Config* DeviceManager::GetConfig() {
return device_info_->GetMutableConfig();
}
void DeviceManager::StartPrivet() {
if (privet_)
return;
privet_.reset(new privet::Manager{task_runner_});
privet_->Start(network_, dns_sd_, http_server_, wifi_, auth_manager_.get(),
device_info_.get(), component_manager_.get());
}
void DeviceManager::StopPrivet() {
privet_.reset();
}
GcdState DeviceManager::GetGcdState() const {
return device_info_->GetGcdState();
}
void DeviceManager::AddGcdStateChangedCallback(
const GcdStateChangedCallback& callback) {
device_info_->AddGcdStateChangedCallback(callback);
}
void DeviceManager::AddTraitDefinitionsFromJson(const std::string& json) {
CHECK(component_manager_->LoadTraits(json, nullptr));
}
void DeviceManager::AddTraitDefinitions(const base::DictionaryValue& dict) {
CHECK(component_manager_->LoadTraits(dict, nullptr));
}
const base::DictionaryValue& DeviceManager::GetTraits() const {
return component_manager_->GetTraits();
}
void DeviceManager::AddTraitDefsChangedCallback(const base::Closure& callback) {
component_manager_->AddTraitDefChangedCallback(callback);
}
bool DeviceManager::AddComponent(const std::string& name,
const std::vector<std::string>& traits,
ErrorPtr* error) {
return component_manager_->AddComponent("", name, traits, error);
}
bool DeviceManager::RemoveComponent(const std::string& name, ErrorPtr* error) {
return component_manager_->RemoveComponent("", name, error);
}
void DeviceManager::AddComponentTreeChangedCallback(
const base::Closure& callback) {
component_manager_->AddComponentTreeChangedCallback(callback);
}
const base::DictionaryValue& DeviceManager::GetComponents() const {
return component_manager_->GetComponents();
}
bool DeviceManager::SetStatePropertiesFromJson(const std::string& component,
const std::string& json,
ErrorPtr* error) {
return component_manager_->SetStatePropertiesFromJson(component, json, error);
}
bool DeviceManager::SetStateProperties(const std::string& component,
const base::DictionaryValue& dict,
ErrorPtr* error) {
return component_manager_->SetStateProperties(component, dict, error);
}
const base::Value* DeviceManager::GetStateProperty(const std::string& component,
const std::string& name,
ErrorPtr* error) const {
return component_manager_->GetStateProperty(component, name, error);
}
bool DeviceManager::SetStateProperty(const std::string& component,
const std::string& name,
const base::Value& value,
ErrorPtr* error) {
return component_manager_->SetStateProperty(component, name, value, error);
}
void DeviceManager::AddCommandHandler(const std::string& component,
const std::string& command_name,
const CommandHandlerCallback& callback) {
component_manager_->AddCommandHandler(component, command_name, callback);
}
bool DeviceManager::AddCommand(const base::DictionaryValue& command,
std::string* id,
ErrorPtr* error) {
auto command_instance = component_manager_->ParseCommandInstance(
command, Command::Origin::kLocal, UserRole::kOwner, id, error);
if (!command_instance)
return false;
component_manager_->AddCommand(std::move(command_instance));
return true;
}
Command* DeviceManager::FindCommand(const std::string& id) {
return component_manager_->FindCommand(id);
}
void DeviceManager::AddStateChangedCallback(const base::Closure& callback) {
component_manager_->AddStateChangedCallback(callback);
}
void DeviceManager::Register(const RegistrationData& registration_data,
const DoneCallback& callback) {
device_info_->RegisterDevice(registration_data, callback);
}
void DeviceManager::AddPairingChangedCallbacks(
const PairingBeginCallback& begin_callback,
const PairingEndCallback& end_callback) {
if (privet_)
privet_->AddOnPairingChangedCallbacks(begin_callback, end_callback);
}
void DeviceManager::OnSettingsChanged(const Settings& settings) {
if (settings.local_access_enabled && http_server_) {
StartPrivet();
} else {
StopPrivet();
}
}
std::unique_ptr<Device> Device::Create(provider::ConfigStore* config_store,
provider::TaskRunner* task_runner,
provider::HttpClient* http_client,
provider::Network* network,
provider::DnsServiceDiscovery* dns_sd,
provider::HttpServer* http_server,
provider::Wifi* wifi,
provider::Bluetooth* bluetooth) {
return std::unique_ptr<Device>{
new DeviceManager{config_store, task_runner, http_client, network, dns_sd,
http_server, wifi, bluetooth}};
}
} // namespace weave