blob: 5562b6c32cdbfa437a5809c8f626256532b0d504 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka72410b22015-05-13 13:48:59 -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/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 {
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080016const char kBaseComponent[] = "base";
Alex Vakulenkod91d6252015-12-05 17:14:39 -080017const char kBaseTrait[] = "base";
Vitaly Buka4c808b22015-08-02 13:44:52 -070018const char kBaseStateFirmwareVersion[] = "base.firmwareVersion";
19const char kBaseStateAnonymousAccessRole[] = "base.localAnonymousAccessMaxRole";
20const char kBaseStateDiscoveryEnabled[] = "base.localDiscoveryEnabled";
21const char kBaseStatePairingEnabled[] = "base.localPairingEnabled";
22} // namespace
23
Vitaly Buka266e88b2015-10-06 11:33:00 -070024BaseApiHandler::BaseApiHandler(DeviceRegistrationInfo* device_info,
25 Device* device)
26 : device_info_{device_info}, device_{device} {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080027 device_->AddTraitDefinitionsFromJson(R"({
Vitaly Buka68af3872015-10-27 16:19:00 -070028 "base": {
Alex Vakulenkod91d6252015-12-05 17:14:39 -080029 "commands": {
30 "updateBaseConfiguration": {
31 "minimalRole": "manager",
32 "parameters": {
33 "localAnonymousAccessMaxRole": {
34 "enum": [ "none", "viewer", "user" ],
35 "type": "string"
36 },
37 "localDiscoveryEnabled": {
38 "type": "boolean"
39 },
40 "localPairingEnabled": {
41 "type": "boolean"
42 }
43 }
44 },
45 "updateDeviceInfo": {
46 "minimalRole": "manager",
47 "parameters": {
48 "description": {
49 "type": "string"
50 },
51 "location": {
52 "type": "string"
53 },
54 "name": {
55 "type": "string"
56 }
57 }
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080058 },
59 "reboot": {
60 "minimalRole": "user",
61 "parameters": {},
62 "errors": ["notEnoughBattery"]
63 },
64 "identify": {
65 "minimalRole": "user",
66 "parameters": {}
Alex Vakulenkod91d6252015-12-05 17:14:39 -080067 }
68 },
69 "state": {
Alex Vakulenko8d0cfef2015-12-15 18:40:05 -080070 "firmwareVersion": {
71 "type": "string",
72 "isRequired": true
73 },
74 "localDiscoveryEnabled": {
75 "type": "boolean",
76 "isRequired": true
77 },
78 "localAnonymousAccessMaxRole": {
79 "type": "string",
80 "enum": [ "none", "viewer", "user" ],
81 "isRequired": true
82 },
83 "localPairingEnabled": {
84 "type": "boolean",
85 "isRequired": true
86 },
87 "connectionStatus": {
88 "type": "string"
89 },
90 "network": {
91 "type": "object",
92 "additionalProperties": false,
93 "properties": {
94 "name": { "type": "string" }
95 }
96 }
Alex Vakulenkod91d6252015-12-05 17:14:39 -080097 }
Vitaly Buka68af3872015-10-27 16:19:00 -070098 }
99 })");
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800100 CHECK(device_->AddComponent(kBaseComponent, {kBaseTrait}, nullptr));
Vitaly Buka68af3872015-10-27 16:19:00 -0700101 OnConfigChanged(device_->GetSettings());
Vitaly Buka4c808b22015-08-02 13:44:52 -0700102
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700103 const auto& settings = device_info_->GetSettings();
Vitaly Buka1eb41562015-08-16 01:29:30 -0700104 base::DictionaryValue state;
Vitaly Buka216e86d2015-10-06 20:23:02 -0700105 state.SetString(kBaseStateFirmwareVersion, settings.firmware_version);
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800106 CHECK(device_->SetStateProperty(kBaseComponent, kBaseStateFirmwareVersion,
107 base::StringValue{settings.firmware_version},
108 nullptr));
Vitaly Buka3110deb2015-10-06 19:54:09 -0700109
Vitaly Buka695a5fb2015-10-06 16:26:08 -0700110 device_->AddCommandHandler(
Vitaly Buka34668e72015-12-15 14:46:47 -0800111 kBaseComponent, "base.updateBaseConfiguration",
Vitaly Buka695a5fb2015-10-06 16:26:08 -0700112 base::Bind(&BaseApiHandler::UpdateBaseConfiguration,
113 weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka72410b22015-05-13 13:48:59 -0700114
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800115 device_->AddCommandHandler(kBaseComponent, "base.updateDeviceInfo",
Vitaly Buka695a5fb2015-10-06 16:26:08 -0700116 base::Bind(&BaseApiHandler::UpdateDeviceInfo,
117 weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka68af3872015-10-27 16:19:00 -0700118
119 device_info_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
120 &BaseApiHandler::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka72410b22015-05-13 13:48:59 -0700121}
122
Vitaly Bukac6029262015-10-07 09:29:13 -0700123void BaseApiHandler::UpdateBaseConfiguration(
124 const std::weak_ptr<Command>& cmd) {
125 auto command = cmd.lock();
126 if (!command)
127 return;
Vitaly Buka0209da42015-10-08 00:07:18 -0700128 CHECK(command->GetState() == Command::State::kQueued)
129 << EnumToString(command->GetState());
Vitaly Buka4f4e2282015-07-23 17:50:07 -0700130 command->SetProgress(base::DictionaryValue{}, nullptr);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700131
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700132 const auto& settings = device_info_->GetSettings();
Vitaly Bukab624bc42015-09-29 19:13:55 -0700133 std::string anonymous_access_role{
134 EnumToString(settings.local_anonymous_access_role)};
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700135 bool discovery_enabled{settings.local_discovery_enabled};
136 bool pairing_enabled{settings.local_pairing_enabled};
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700137
Vitaly Bukac4305602015-11-24 23:33:09 -0800138 const auto& parameters = command->GetParameters();
139 parameters.GetString("localAnonymousAccessMaxRole", &anonymous_access_role);
140 parameters.GetBoolean("localDiscoveryEnabled", &discovery_enabled);
141 parameters.GetBoolean("localPairingEnabled", &pairing_enabled);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700142
Vitaly Bukab624bc42015-09-29 19:13:55 -0700143 AuthScope auth_scope{AuthScope::kNone};
144 if (!StringToEnum(anonymous_access_role, &auth_scope)) {
Vitaly Buka70f77d92015-10-07 15:42:40 -0700145 ErrorPtr error;
146 Error::AddToPrintf(&error, FROM_HERE, errors::commands::kDomain,
147 errors::commands::kInvalidPropValue,
148 "Invalid localAnonymousAccessMaxRole value '%s'",
149 anonymous_access_role.c_str());
Vitaly Buka47a1f6f2015-10-07 18:09:57 -0700150 command->Abort(error.get(), nullptr);
151 return;
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700152 }
153
Vitaly Bukab624bc42015-09-29 19:13:55 -0700154 device_info_->UpdateBaseConfig(auth_scope, discovery_enabled,
155 pairing_enabled);
156
Vitaly Buka2f548972015-10-08 19:34:49 -0700157 command->Complete({}, nullptr);
Vitaly Buka2f7efdb2015-05-27 16:00:21 -0700158}
159
Vitaly Buka4c808b22015-08-02 13:44:52 -0700160void BaseApiHandler::OnConfigChanged(const Settings& settings) {
161 base::DictionaryValue state;
Vitaly Buka216e86d2015-10-06 20:23:02 -0700162 state.SetString(kBaseStateAnonymousAccessRole,
163 EnumToString(settings.local_anonymous_access_role));
164 state.SetBoolean(kBaseStateDiscoveryEnabled,
165 settings.local_discovery_enabled);
166 state.SetBoolean(kBaseStatePairingEnabled, settings.local_pairing_enabled);
Alex Vakulenkod91d6252015-12-05 17:14:39 -0800167 device_->SetStateProperties(kBaseComponent, state, nullptr);
Vitaly Buka4c808b22015-08-02 13:44:52 -0700168}
169
Vitaly Bukac6029262015-10-07 09:29:13 -0700170void BaseApiHandler::UpdateDeviceInfo(const std::weak_ptr<Command>& cmd) {
171 auto command = cmd.lock();
172 if (!command)
173 return;
Vitaly Buka0209da42015-10-08 00:07:18 -0700174 CHECK(command->GetState() == Command::State::kQueued)
175 << EnumToString(command->GetState());
Vitaly Buka4f4e2282015-07-23 17:50:07 -0700176 command->SetProgress(base::DictionaryValue{}, nullptr);
Vitaly Buka72410b22015-05-13 13:48:59 -0700177
Vitaly Buka5cf12a32015-09-15 21:25:48 -0700178 const auto& settings = device_info_->GetSettings();
179 std::string name{settings.name};
180 std::string description{settings.description};
181 std::string location{settings.location};
Vitaly Buka72410b22015-05-13 13:48:59 -0700182
Vitaly Bukac4305602015-11-24 23:33:09 -0800183 const auto& parameters = command->GetParameters();
184 parameters.GetString("name", &name);
185 parameters.GetString("description", &description);
186 parameters.GetString("location", &location);
Vitaly Buka72410b22015-05-13 13:48:59 -0700187
Vitaly Bukab624bc42015-09-29 19:13:55 -0700188 device_info_->UpdateDeviceInfo(name, description, location);
Vitaly Buka2f548972015-10-08 19:34:49 -0700189 command->Complete({}, nullptr);
Vitaly Buka72410b22015-05-13 13:48:59 -0700190}
191
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700192} // namespace weave