blob: 4cfa902b63750d0c5fec12c8754b419fe9663586 [file] [log] [blame]
Vitaly Bukacad20f02015-10-16 17:27:15 -07001// Copyright 2015 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070014
15#include "buffet/manager.h"
16
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070017#include <map>
Alex Vakulenkoec41a0c2015-04-17 15:35:34 -070018#include <set>
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070019#include <string>
20
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070021#include <base/bind.h>
22#include <base/bind_helpers.h>
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070023#include <base/files/file_enumerator.h>
24#include <base/files/file_util.h>
Alex Vakulenko4f7778e2014-09-11 16:57:24 -070025#include <base/json/json_reader.h>
Christopher Wiley2ffa0042014-05-05 16:09:16 -070026#include <base/json/json_writer.h>
Alex Vakulenkof7754542015-06-26 12:59:50 -070027#include <base/message_loop/message_loop.h>
Christopher Wiley8994e012015-02-06 17:51:43 -080028#include <base/time/time.h>
Alex Vakulenko790643f2015-11-19 14:38:30 -080029#include <cutils/properties.h>
Alex Vakulenko41705852015-10-13 10:12:06 -070030#include <brillo/bind_lambda.h>
31#include <brillo/dbus/async_event_sequencer.h>
32#include <brillo/dbus/exported_object_manager.h>
33#include <brillo/errors/error.h>
34#include <brillo/http/http_transport.h>
35#include <brillo/http/http_utils.h>
36#include <brillo/key_value_store.h>
37#include <brillo/message_loops/message_loop.h>
38#include <brillo/mime_utils.h>
Christopher Wiley2ffa0042014-05-05 16:09:16 -070039#include <dbus/bus.h>
Christopher Wiley54028f92014-04-01 17:33:29 -070040#include <dbus/object_path.h>
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070041#include <dbus/values_util.h>
Vitaly Bukae2713ac2015-08-03 13:50:01 -070042#include <weave/enum_to_string.h>
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070043
Alex Vakulenko790643f2015-11-19 14:38:30 -080044#include "brillo/weaved_system_properties.h"
Robert Gindaf86123d2015-09-11 16:10:43 -070045#include "buffet/bluetooth_client.h"
Vitaly Buka1175a9b2015-08-15 10:42:17 -070046#include "buffet/buffet_config.h"
Vitaly Bukaa0305d32015-07-27 16:08:51 -070047#include "buffet/dbus_command_dispatcher.h"
48#include "buffet/dbus_conversion.h"
Vitaly Buka00882b72015-08-06 00:32:11 -070049#include "buffet/http_transport_client.h"
Alex Vakulenkof0f55342015-08-18 15:51:40 -070050#include "buffet/mdns_client.h"
Peter Qiu786a9062015-10-02 11:45:01 -070051#include "buffet/shill_client.h"
Vitaly Buka4f771532015-08-14 14:58:39 -070052#include "buffet/weave_error_conversion.h"
Alex Vakulenko1642bec2015-08-19 09:34:58 -070053#include "buffet/webserv_client.h"
Vitaly Buka03319c22015-07-17 14:48:30 -070054
Alex Vakulenko41705852015-10-13 10:12:06 -070055using brillo::dbus_utils::AsyncEventSequencer;
56using brillo::dbus_utils::DBusMethodResponse;
57using brillo::dbus_utils::ExportedObjectManager;
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070058
59namespace buffet {
60
Alex Vakulenkoecf961a2014-10-28 13:50:16 -070061namespace {
Vitaly Buka7b3ba792015-06-09 17:01:54 -070062
Vitaly Buka7b3ba792015-06-09 17:01:54 -070063const char kPairingSessionIdKey[] = "sessionId";
64const char kPairingModeKey[] = "mode";
65const char kPairingCodeKey[] = "code";
66
Vitaly Buka0c6dcd22015-07-10 00:12:25 -070067const char kErrorDomain[] = "buffet";
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070068const char kFileReadError[] = "file_read_error";
69
70bool LoadFile(const base::FilePath& file_path,
71 std::string* data,
Alex Vakulenko41705852015-10-13 10:12:06 -070072 brillo::ErrorPtr* error) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070073 if (!base::ReadFileToString(file_path, data)) {
Alex Vakulenko41705852015-10-13 10:12:06 -070074 brillo::errors::system::AddSystemError(error, FROM_HERE, errno);
75 brillo::Error::AddToPrintf(error, FROM_HERE, kErrorDomain, kFileReadError,
76 "Failed to read file '%s'",
77 file_path.value().c_str());
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070078 return false;
79 }
80 return true;
81}
82
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -080083void LoadTraitDefinitions(const BuffetConfig::Options& options,
84 weave::Device* device) {
85 // Load component-specific device trait definitions.
86 base::FilePath dir{options.definitions.Append("traits")};
87 LOG(INFO) << "Looking for trait definitions in " << dir.value();
88 base::FileEnumerator enumerator(dir, false, base::FileEnumerator::FILES,
89 FILE_PATH_LITERAL("*.json"));
90 std::vector<std::string> result;
91 for (base::FilePath path = enumerator.Next(); !path.empty();
92 path = enumerator.Next()) {
93 LOG(INFO) << "Loading trait definition from " << path.value();
94 std::string json;
95 CHECK(LoadFile(path, &json, nullptr));
96 device->AddTraitDefinitionsFromJson(json);
97 }
98}
99
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700100void LoadCommandDefinitions(const BuffetConfig::Options& options,
101 weave::Device* device) {
102 auto load_packages = [device](const base::FilePath& root,
103 const base::FilePath::StringType& pattern) {
104 base::FilePath dir{root.Append("commands")};
105 LOG(INFO) << "Looking for command schemas in " << dir.value();
106 base::FileEnumerator enumerator(dir, false, base::FileEnumerator::FILES,
107 pattern);
108 for (base::FilePath path = enumerator.Next(); !path.empty();
109 path = enumerator.Next()) {
110 LOG(INFO) << "Loading command schema from " << path.value();
111 std::string json;
112 CHECK(LoadFile(path, &json, nullptr));
113 device->AddCommandDefinitionsFromJson(json);
114 }
115 };
116 load_packages(options.definitions, FILE_PATH_LITERAL("*.json"));
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -0800117 if (!options.test_definitions.empty())
118 load_packages(options.test_definitions, FILE_PATH_LITERAL("*test.json"));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700119}
120
121void LoadStateDefinitions(const BuffetConfig::Options& options,
122 weave::Device* device) {
123 // Load component-specific device state definitions.
124 base::FilePath dir{options.definitions.Append("states")};
125 LOG(INFO) << "Looking for state definitions in " << dir.value();
126 base::FileEnumerator enumerator(dir, false, base::FileEnumerator::FILES,
127 FILE_PATH_LITERAL("*.schema.json"));
128 std::vector<std::string> result;
129 for (base::FilePath path = enumerator.Next(); !path.empty();
130 path = enumerator.Next()) {
131 LOG(INFO) << "Loading state definition from " << path.value();
132 std::string json;
133 CHECK(LoadFile(path, &json, nullptr));
134 device->AddStateDefinitionsFromJson(json);
135 }
136}
137
138void LoadStateDefaults(const BuffetConfig::Options& options,
139 weave::Device* device) {
140 // Load component-specific device state defaults.
141 base::FilePath dir{options.definitions.Append("states")};
142 LOG(INFO) << "Looking for state defaults in " << dir.value();
143 base::FileEnumerator enumerator(dir, false, base::FileEnumerator::FILES,
144 FILE_PATH_LITERAL("*.defaults.json"));
145 std::vector<std::string> result;
146 for (base::FilePath path = enumerator.Next(); !path.empty();
147 path = enumerator.Next()) {
148 LOG(INFO) << "Loading state defaults from " << path.value();
149 std::string json;
150 CHECK(LoadFile(path, &json, nullptr));
151 CHECK(device->SetStatePropertiesFromJson(json, nullptr));
152 }
153}
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700154
Alex Vakulenkoecf961a2014-10-28 13:50:16 -0700155} // anonymous namespace
156
Alex Vakulenkoe32375b2015-09-28 08:55:40 -0700157class Manager::TaskRunner : public weave::provider::TaskRunner {
Vitaly Bukae74c8722015-08-13 00:33:00 -0700158 public:
159 void PostDelayedTask(const tracked_objects::Location& from_here,
160 const base::Closure& task,
161 base::TimeDelta delay) override {
Alex Vakulenko41705852015-10-13 10:12:06 -0700162 brillo::MessageLoop::current()->PostDelayedTask(from_here, task, delay);
Vitaly Bukae74c8722015-08-13 00:33:00 -0700163 }
164};
165
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700166Manager::Manager(const Options& options,
167 const base::WeakPtr<ExportedObjectManager>& object_manager)
168 : options_{options},
169 dbus_object_(object_manager.get(),
Alex Vakulenkob6351532014-08-15 11:49:35 -0700170 object_manager->GetBus(),
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700171 com::android::Weave::ManagerAdaptor::GetObjectPath()) {}
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700172
Vitaly Buka91cc7152015-03-20 09:46:57 -0700173Manager::~Manager() {
174}
Alex Vakulenkoecf961a2014-10-28 13:50:16 -0700175
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700176void Manager::Start(AsyncEventSequencer* sequencer) {
177 RestartWeave(sequencer);
178
179 dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
Alex Vakulenkoc662a242015-10-15 13:04:06 -0700180 dbus_registration_handler_ =
181 sequencer->GetHandler("Manager.RegisterAsync() failed.", true);
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700182}
183
184void Manager::RestartWeave(AsyncEventSequencer* sequencer) {
185 Stop();
186
Vitaly Bukae74c8722015-08-13 00:33:00 -0700187 task_runner_.reset(new TaskRunner{});
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700188 config_.reset(new BuffetConfig{options_.config_options});
Vitaly Buka00882b72015-08-06 00:32:11 -0700189 http_client_.reset(new HttpTransportClient);
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700190 shill_client_.reset(new ShillClient{dbus_object_.GetBus(),
191 options_.device_whitelist,
192 !options_.xmpp_enabled});
Alex Vakulenko0022b752015-10-02 11:09:59 -0700193 weave::provider::HttpServer* http_server{nullptr};
Christopher Wileye925bb32015-08-03 20:09:18 -0700194#ifdef BUFFET_USE_WIFI_BOOTSTRAPPING
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700195 if (!options_.disable_privet) {
Robert Gindacf92c662015-08-20 09:30:11 -0700196 mdns_client_ = MdnsClient::CreateInstance(dbus_object_.GetBus());
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700197 web_serv_client_.reset(new WebServClient{
198 dbus_object_.GetBus(), sequencer,
199 base::Bind(&Manager::CreateDevice, weak_ptr_factory_.GetWeakPtr())});
Robert Gindaf86123d2015-09-11 16:10:43 -0700200 bluetooth_client_ = BluetoothClient::CreateInstance();
Alex Vakulenko0022b752015-10-02 11:09:59 -0700201 http_server = web_serv_client_.get();
202
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700203 if (options_.enable_ping) {
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700204 auto ping_handler = base::Bind(
205 [](std::unique_ptr<weave::provider::HttpServer::Request> request) {
Alex Vakulenko41705852015-10-13 10:12:06 -0700206 request->SendReply(brillo::http::status_code::Ok, "Hello, world!",
207 brillo::mime::text::kPlain);
Alex Vakulenko297114c2015-10-12 13:45:43 -0700208 });
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700209 http_server->AddHttpRequestHandler("/privet/ping", ping_handler);
210 http_server->AddHttpsRequestHandler("/privet/ping", ping_handler);
Alex Vakulenko0022b752015-10-02 11:09:59 -0700211 }
Alex Vakulenkof0f55342015-08-18 15:51:40 -0700212 }
Christopher Wileye925bb32015-08-03 20:09:18 -0700213#endif // BUFFET_USE_WIFI_BOOTSTRAPPING
Vitaly Buka7042c582015-07-30 17:02:14 -0700214
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700215 if (!http_server)
216 CreateDevice();
217}
218
219void Manager::CreateDevice() {
220 if (device_)
221 return;
222
Alex Vakulenko0022b752015-10-02 11:09:59 -0700223 device_ = weave::Device::Create(config_.get(), task_runner_.get(),
224 http_client_.get(), shill_client_.get(),
225 mdns_client_.get(), web_serv_client_.get(),
226 shill_client_.get(), bluetooth_client_.get());
Vitaly Buka1175a9b2015-08-15 10:42:17 -0700227
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -0800228 LoadTraitDefinitions(options_.config_options, device_.get());
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700229 LoadCommandDefinitions(options_.config_options, device_.get());
230 LoadStateDefinitions(options_.config_options, device_.get());
231 LoadStateDefaults(options_.config_options, device_.get());
232
Alex Vakulenko0022b752015-10-02 11:09:59 -0700233 device_->AddSettingsChangedCallback(
234 base::Bind(&Manager::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700235
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700236 command_dispatcher_.reset(
237 new DBusCommandDispacher{dbus_object_.GetObjectManager(), device_.get()});
Vitaly Bukae8c3bab2015-07-29 16:39:34 -0700238
Alex Vakulenko14b3e6e2015-12-10 10:01:36 -0800239 device_->AddTraitDefsChangedCallback(
240 base::Bind(&Manager::OnTraitDefsChanged,
241 weak_ptr_factory_.GetWeakPtr()));
Alex Vakulenko0022b752015-10-02 11:09:59 -0700242 device_->AddStateChangedCallback(
Alex Vakulenko14b3e6e2015-12-10 10:01:36 -0800243 base::Bind(&Manager::OnComponentTreeChanged,
244 weak_ptr_factory_.GetWeakPtr()));
245 device_->AddComponentTreeChangedCallback(
246 base::Bind(&Manager::OnComponentTreeChanged,
247 weak_ptr_factory_.GetWeakPtr()));
Vitaly Bukabf4ba652015-05-14 16:57:23 -0700248
Alex Vakulenko0022b752015-10-02 11:09:59 -0700249 device_->AddGcdStateChangedCallback(
250 base::Bind(&Manager::OnGcdStateChanged, weak_ptr_factory_.GetWeakPtr()));
Vitaly Bukae74fe3c2015-05-13 13:48:59 -0700251
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700252 device_->AddPairingChangedCallbacks(
253 base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()),
254 base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr()));
Alex Vakulenkoc662a242015-10-15 13:04:06 -0700255
256 auto handler = dbus_registration_handler_;
257 if (handler.is_null())
258 handler = AsyncEventSequencer::GetDefaultCompletionAction();
259 dbus_object_.RegisterAsync(handler);
260 dbus_registration_handler_.Reset();
Vitaly Buka84fd6dd2015-06-09 17:22:18 -0700261}
262
263void Manager::Stop() {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700264 command_dispatcher_.reset();
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700265 device_.reset();
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700266#ifdef BUFFET_USE_WIFI_BOOTSTRAPPING
267 web_serv_client_.reset();
268 mdns_client_.reset();
269#endif // BUFFET_USE_WIFI_BOOTSTRAPPING
270 shill_client_.reset();
271 http_client_.reset();
272 config_.reset();
273 task_runner_.reset();
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700274}
275
Alex Vakulenko6c375262015-06-19 11:01:42 -0700276void Manager::RegisterDevice(DBusMethodResponsePtr<std::string> response,
Vitaly Bukacbadabe2015-05-14 23:33:32 -0700277 const std::string& ticket_id) {
Anton Muhin9cc03fd2014-10-16 18:59:57 +0400278 LOG(INFO) << "Received call to Manager.RegisterDevice()";
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700279
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700280 device_->Register(ticket_id, base::Bind(&Manager::RegisterDeviceDone,
281 weak_ptr_factory_.GetWeakPtr(),
282 base::Passed(&response)));
283}
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700284
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700285void Manager::RegisterDeviceDone(DBusMethodResponsePtr<std::string> response,
286 weave::ErrorPtr error) {
287 if (error) {
288 brillo::ErrorPtr brillo_error;
289 ConvertError(*error, &brillo_error);
290 return response->ReplyWithError(brillo_error.get());
291 }
292 LOG(INFO) << "Device registered: " << device_->GetSettings().cloud_id;
293 response->Return(device_->GetSettings().cloud_id);
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700294}
295
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -0800296void Manager::AddComponent(DBusMethodResponsePtr<> response,
297 const std::string& name,
298 const std::vector<std::string>& traits) {
299 brillo::ErrorPtr brillo_error;
300 weave::ErrorPtr error;
301 if (!device_->AddComponent(name, traits, &error)) {
302 ConvertError(*error, &brillo_error);
303 return response->ReplyWithError(brillo_error.get());
304 }
305 response->Return();
306}
307
Alex Vakulenko6c375262015-06-19 11:01:42 -0700308void Manager::UpdateState(DBusMethodResponsePtr<> response,
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -0800309 const std::string& component,
Alex Vakulenko41705852015-10-13 10:12:06 -0700310 const brillo::VariantDictionary& property_set) {
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700311 brillo::ErrorPtr brillo_error;
Vitaly Buka4f771532015-08-14 14:58:39 -0700312 auto properties =
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700313 DictionaryFromDBusVariantDictionary(property_set, &brillo_error);
Vitaly Bukafb2584b2015-07-28 21:39:45 -0700314 if (!properties)
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700315 return response->ReplyWithError(brillo_error.get());
Vitaly Bukafb2584b2015-07-28 21:39:45 -0700316
Vitaly Buka4f771532015-08-14 14:58:39 -0700317 weave::ErrorPtr error;
Alex Vakulenko3bd3ece2015-12-09 12:29:01 -0800318 if (!device_->SetStateProperties(component, *properties, &error)) {
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700319 ConvertError(*error, &brillo_error);
320 return response->ReplyWithError(brillo_error.get());
Vitaly Buka4f771532015-08-14 14:58:39 -0700321 }
322 response->Return();
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700323}
324
Alex Vakulenko6c375262015-06-19 11:01:42 -0700325void Manager::AddCommand(DBusMethodResponsePtr<std::string> response,
Alex Vakulenko0022b752015-10-02 11:09:59 -0700326 const std::string& json_command) {
Alex Vakulenko4f7778e2014-09-11 16:57:24 -0700327 std::string error_message;
Alex Vakulenkoab4e4ff2015-06-15 12:53:22 -0700328 std::unique_ptr<base::Value> value(
329 base::JSONReader::ReadAndReturnError(json_command, base::JSON_PARSE_RFC,
330 nullptr, &error_message)
331 .release());
Vitaly Bukaa4e8d7f2015-06-09 09:46:53 -0700332 const base::DictionaryValue* command{nullptr};
333 if (!value || !value->GetAsDictionary(&command)) {
Alex Vakulenko41705852015-10-13 10:12:06 -0700334 return response->ReplyWithError(FROM_HERE, brillo::errors::json::kDomain,
335 brillo::errors::json::kParseError,
Vitaly Bukaa4e8d7f2015-06-09 09:46:53 -0700336 error_message);
Alex Vakulenko4f7778e2014-09-11 16:57:24 -0700337 }
Vitaly Bukaa4e8d7f2015-06-09 09:46:53 -0700338
Vitaly Bukaa4e8d7f2015-06-09 09:46:53 -0700339 std::string id;
Vitaly Buka4f771532015-08-14 14:58:39 -0700340 weave::ErrorPtr error;
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700341 if (!device_->AddCommand(*command, &id, &error)) {
Alex Vakulenko94f8eba2015-10-14 08:52:45 -0700342 brillo::ErrorPtr brillo_error;
343 ConvertError(*error, &brillo_error);
344 return response->ReplyWithError(brillo_error.get());
Vitaly Buka4f771532015-08-14 14:58:39 -0700345 }
Vitaly Bukac03ec2b2015-05-31 23:32:46 -0700346
Vitaly Buka59af7ac2015-03-24 12:42:24 -0700347 response->Return(id);
Alex Vakulenko4f7778e2014-09-11 16:57:24 -0700348}
349
Alex Vakulenko12e2c1a2014-11-21 08:57:57 -0800350std::string Manager::TestMethod(const std::string& message) {
Alex Vakulenko35e3bab2014-08-15 11:45:46 -0700351 LOG(INFO) << "Received call to test method: " << message;
352 return message;
Christopher Wiley2ffa0042014-05-05 16:09:16 -0700353}
354
Alex Vakulenko14b3e6e2015-12-10 10:01:36 -0800355void Manager::OnTraitDefsChanged() {
356 const base::DictionaryValue& state = device_->GetTraits();
Vitaly Buka2b30e7a2015-05-27 09:27:08 -0700357 std::string json;
358 base::JSONWriter::WriteWithOptions(
Alex Vakulenkobae6c022015-12-08 13:22:07 -0800359 state, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
Alex Vakulenko14b3e6e2015-12-10 10:01:36 -0800360 dbus_adaptor_.SetTraits(json);
361}
362
363void Manager::OnComponentTreeChanged() {
364 const base::DictionaryValue& state = device_->GetComponents();
365 std::string json;
366 base::JSONWriter::WriteWithOptions(
367 state, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
368 dbus_adaptor_.SetComponents(json);
Vitaly Buka2b30e7a2015-05-27 09:27:08 -0700369}
370
Alex Vakulenko0022b752015-10-02 11:09:59 -0700371void Manager::OnGcdStateChanged(weave::GcdState state) {
Alex Vakulenko790643f2015-11-19 14:38:30 -0800372 std::string state_string = weave::EnumToString(state);
373 dbus_adaptor_.SetStatus(state_string);
374 property_set(weaved::system_properties::kState, state_string.c_str());
Vitaly Bukabf4ba652015-05-14 16:57:23 -0700375}
376
Vitaly Buka00b83492015-07-20 00:37:48 -0700377void Manager::OnConfigChanged(const weave::Settings& settings) {
Alex Vakulenkoe4ef2612015-09-29 09:53:39 -0700378 dbus_adaptor_.SetDeviceId(settings.cloud_id);
Vitaly Buka00b83492015-07-20 00:37:48 -0700379 dbus_adaptor_.SetOemName(settings.oem_name);
380 dbus_adaptor_.SetModelName(settings.model_name);
381 dbus_adaptor_.SetModelId(settings.model_id);
382 dbus_adaptor_.SetName(settings.name);
383 dbus_adaptor_.SetDescription(settings.description);
384 dbus_adaptor_.SetLocation(settings.location);
Vitaly Buka7b3ba792015-06-09 17:01:54 -0700385}
386
387void Manager::OnPairingStart(const std::string& session_id,
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700388 weave::PairingType pairing_type,
Vitaly Buka7b3ba792015-06-09 17:01:54 -0700389 const std::vector<uint8_t>& code) {
390 // For now, just overwrite the exposed PairInfo with
391 // the most recent pairing attempt.
Alex Vakulenko41705852015-10-13 10:12:06 -0700392 dbus_adaptor_.SetPairingInfo(brillo::VariantDictionary{
Vitaly Buka7b3ba792015-06-09 17:01:54 -0700393 {kPairingSessionIdKey, session_id},
Vitaly Buka03319c22015-07-17 14:48:30 -0700394 {kPairingModeKey, weave::EnumToString(pairing_type)},
Vitaly Buka7b3ba792015-06-09 17:01:54 -0700395 {kPairingCodeKey, code},
396 });
397}
398
399void Manager::OnPairingEnd(const std::string& session_id) {
400 auto exposed_pairing_attempt = dbus_adaptor_.GetPairingInfo();
401 auto it = exposed_pairing_attempt.find(kPairingSessionIdKey);
402 if (it == exposed_pairing_attempt.end()) {
403 return;
404 }
405 std::string exposed_session{it->second.TryGet<std::string>()};
406 if (exposed_session == session_id) {
Alex Vakulenko41705852015-10-13 10:12:06 -0700407 dbus_adaptor_.SetPairingInfo(brillo::VariantDictionary{});
Vitaly Buka7b3ba792015-06-09 17:01:54 -0700408 }
409}
410
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700411} // namespace buffet