blob: 5d69b58510d8f22b900e3a7af3be4a1e27411e8c [file] [log] [blame]
Vitaly Buka72410b22015-05-13 13:48:59 -07001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// 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/base_api_handler.h"
Vitaly Buka72410b22015-05-13 13:48:59 -07006
Vitaly Buka0d501072015-08-18 18:09:46 -07007#include <base/bind.h>
Vitaly Buka266e88b2015-10-06 11:33:00 -07008#include <weave/device.h>
Vitaly Buka0d501072015-08-18 18:09:46 -07009
Vitaly Buka70f77d92015-10-07 15:42:40 -070010#include "src/commands/schema_constants.h"
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020011#include "src/device_registration_info.h"
Vitaly Buka72410b22015-05-13 13:48:59 -070012
Vitaly Bukab6f015a2015-07-09 14:59:23 -070013namespace weave {
Vitaly Buka72410b22015-05-13 13:48:59 -070014
Vitaly Buka4c808b22015-08-02 13:44:52 -070015namespace {
16const char kBaseStateFirmwareVersion[] = "base.firmwareVersion";
17const char kBaseStateAnonymousAccessRole[] = "base.localAnonymousAccessMaxRole";
18const char kBaseStateDiscoveryEnabled[] = "base.localDiscoveryEnabled";
19const char kBaseStatePairingEnabled[] = "base.localPairingEnabled";
20} // namespace
21
Vitaly Buka266e88b2015-10-06 11:33:00 -070022BaseApiHandler::BaseApiHandler(DeviceRegistrationInfo* device_info,
23 Device* device)
24 : device_info_{device_info}, device_{device} {
Vitaly Bukaae6b35d2015-09-29 23:16:54 -070025 device_info_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
Vitaly Buka4c808b22015-08-02 13:44:52 -070026 &BaseApiHandler::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
27
Vitaly Buka5cf12a32015-09-15 21:25:48 -070028 const auto& settings = device_info_->GetSettings();
Vitaly Buka1eb41562015-08-16 01:29:30 -070029 base::DictionaryValue state;
Vitaly Buka216e86d2015-10-06 20:23:02 -070030 state.SetString(kBaseStateFirmwareVersion, settings.firmware_version);
Vitaly Buka266e88b2015-10-06 11:33:00 -070031 CHECK(device_->SetStateProperties(state, nullptr));
Vitaly Buka4c808b22015-08-02 13:44:52 -070032
Vitaly Buka3110deb2015-10-06 19:54:09 -070033 device->AddCommandDefinitionsFromJson(R"({
34 "base": {
35 "updateBaseConfiguration": {},
36 "updateDeviceInfo": {}
37 }
38 })");
39
Vitaly Buka695a5fb2015-10-06 16:26:08 -070040 device_->AddCommandHandler(
41 "base.updateBaseConfiguration",
42 base::Bind(&BaseApiHandler::UpdateBaseConfiguration,
43 weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka72410b22015-05-13 13:48:59 -070044
Vitaly Buka695a5fb2015-10-06 16:26:08 -070045 device_->AddCommandHandler("base.updateDeviceInfo",
46 base::Bind(&BaseApiHandler::UpdateDeviceInfo,
47 weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka72410b22015-05-13 13:48:59 -070048}
49
Vitaly Bukac6029262015-10-07 09:29:13 -070050void BaseApiHandler::UpdateBaseConfiguration(
51 const std::weak_ptr<Command>& cmd) {
52 auto command = cmd.lock();
53 if (!command)
54 return;
Vitaly Buka0209da42015-10-08 00:07:18 -070055 CHECK(command->GetState() == Command::State::kQueued)
56 << EnumToString(command->GetState());
Vitaly Buka4f4e2282015-07-23 17:50:07 -070057 command->SetProgress(base::DictionaryValue{}, nullptr);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -070058
Vitaly Buka5cf12a32015-09-15 21:25:48 -070059 const auto& settings = device_info_->GetSettings();
Vitaly Bukab624bc42015-09-29 19:13:55 -070060 std::string anonymous_access_role{
61 EnumToString(settings.local_anonymous_access_role)};
Vitaly Buka5cf12a32015-09-15 21:25:48 -070062 bool discovery_enabled{settings.local_discovery_enabled};
63 bool pairing_enabled{settings.local_pairing_enabled};
Vitaly Buka2f7efdb2015-05-27 16:00:21 -070064
Vitaly Buka8d8d2192015-07-21 22:25:09 -070065 auto parameters = command->GetParameters();
66 parameters->GetString("localAnonymousAccessMaxRole", &anonymous_access_role);
67 parameters->GetBoolean("localDiscoveryEnabled", &discovery_enabled);
68 parameters->GetBoolean("localPairingEnabled", &pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -070069
Vitaly Bukab624bc42015-09-29 19:13:55 -070070 AuthScope auth_scope{AuthScope::kNone};
71 if (!StringToEnum(anonymous_access_role, &auth_scope)) {
Vitaly Buka70f77d92015-10-07 15:42:40 -070072 ErrorPtr error;
73 Error::AddToPrintf(&error, FROM_HERE, errors::commands::kDomain,
74 errors::commands::kInvalidPropValue,
75 "Invalid localAnonymousAccessMaxRole value '%s'",
76 anonymous_access_role.c_str());
Vitaly Buka47a1f6f2015-10-07 18:09:57 -070077 command->Abort(error.get(), nullptr);
78 return;
Vitaly Buka2f7efdb2015-05-27 16:00:21 -070079 }
80
Vitaly Bukab624bc42015-09-29 19:13:55 -070081 device_info_->UpdateBaseConfig(auth_scope, discovery_enabled,
82 pairing_enabled);
83
Vitaly Buka47a1f6f2015-10-07 18:09:57 -070084 command->SetResults({}, nullptr);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -070085}
86
Vitaly Buka4c808b22015-08-02 13:44:52 -070087void BaseApiHandler::OnConfigChanged(const Settings& settings) {
88 base::DictionaryValue state;
Vitaly Buka216e86d2015-10-06 20:23:02 -070089 state.SetString(kBaseStateAnonymousAccessRole,
90 EnumToString(settings.local_anonymous_access_role));
91 state.SetBoolean(kBaseStateDiscoveryEnabled,
92 settings.local_discovery_enabled);
93 state.SetBoolean(kBaseStatePairingEnabled, settings.local_pairing_enabled);
Vitaly Buka266e88b2015-10-06 11:33:00 -070094 device_->SetStateProperties(state, nullptr);
Vitaly Buka4c808b22015-08-02 13:44:52 -070095}
96
Vitaly Bukac6029262015-10-07 09:29:13 -070097void BaseApiHandler::UpdateDeviceInfo(const std::weak_ptr<Command>& cmd) {
98 auto command = cmd.lock();
99 if (!command)
100 return;
Vitaly Buka0209da42015-10-08 00:07:18 -0700101 CHECK(command->GetState() == Command::State::kQueued)
102 << EnumToString(command->GetState());
Vitaly Buka4f4e2282015-07-23 17:50:07 -0700103 command->SetProgress(base::DictionaryValue{}, nullptr);
Vitaly Buka72410b22015-05-13 13:48:59 -0700104
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700105 const auto& settings = device_info_->GetSettings();
106 std::string name{settings.name};
107 std::string description{settings.description};
108 std::string location{settings.location};
Vitaly Buka72410b22015-05-13 13:48:59 -0700109
Vitaly Buka8d8d2192015-07-21 22:25:09 -0700110 auto parameters = command->GetParameters();
111 parameters->GetString("name", &name);
112 parameters->GetString("description", &description);
113 parameters->GetString("location", &location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700114
Vitaly Bukab624bc42015-09-29 19:13:55 -0700115 device_info_->UpdateDeviceInfo(name, description, location);
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700116 command->SetResults({}, nullptr);
Vitaly Buka72410b22015-05-13 13:48:59 -0700117}
118
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700119} // namespace weave