blob: ac693f1376a09e99cc904ddd2cf65cf0ecddbb0b [file] [log] [blame]
Christopher Wiley4b5f04c2014-03-27 14:45:37 -07001// Copyright 2014 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
5#include "buffet/manager.h"
6
Alex Vakulenko7c3226e2014-05-07 17:35:24 -07007#include <map>
8#include <string>
9
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070010#include <base/bind.h>
11#include <base/bind_helpers.h>
Christopher Wiley2ffa0042014-05-05 16:09:16 -070012#include <base/json/json_writer.h>
Alex Vakulenko24e5f5d2014-08-27 11:00:57 -070013#include <chromeos/dbus/async_event_sequencer.h>
14#include <chromeos/dbus/exported_object_manager.h>
15#include <chromeos/errors/error.h>
Christopher Wiley2ffa0042014-05-05 16:09:16 -070016#include <dbus/bus.h>
Christopher Wiley54028f92014-04-01 17:33:29 -070017#include <dbus/object_path.h>
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070018#include <dbus/values_util.h>
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070019
Alex Vakulenkocf9c1462014-07-23 10:57:58 -070020#include "buffet/commands/command_manager.h"
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070021#include "buffet/dbus_constants.h"
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070022
Christopher Wiley68c07cc2014-07-29 14:07:10 -070023using chromeos::dbus_utils::AsyncEventSequencer;
Christopher Wiley1aa980e2014-08-11 10:51:20 -070024using chromeos::dbus_utils::ExportedObjectManager;
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070025
26namespace buffet {
27
Alex Vakulenkob6351532014-08-15 11:49:35 -070028Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
29 : dbus_object_(object_manager.get(),
30 object_manager->GetBus(),
31 dbus::ObjectPath(dbus_constants::kManagerServicePath)) {}
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070032
Alex Vakulenko4a8d9de2014-08-24 15:05:06 -070033void Manager::RegisterAsync(const AsyncEventSequencer::CompletionAction& cb) {
Alex Vakulenkob6351532014-08-15 11:49:35 -070034 chromeos::dbus_utils::DBusInterface* itf =
35 dbus_object_.AddOrGetInterface(dbus_constants::kManagerInterface);
36 itf->AddMethodHandler(dbus_constants::kManagerCheckDeviceRegistered,
37 base::Unretained(this),
38 &Manager::HandleCheckDeviceRegistered);
39 itf->AddMethodHandler(dbus_constants::kManagerGetDeviceInfo,
40 base::Unretained(this),
41 &Manager::HandleGetDeviceInfo);
42 itf->AddMethodHandler(dbus_constants::kManagerStartRegisterDevice,
43 base::Unretained(this),
44 &Manager::HandleStartRegisterDevice);
45 itf->AddMethodHandler(dbus_constants::kManagerFinishRegisterDevice,
46 base::Unretained(this),
47 &Manager::HandleFinishRegisterDevice);
48 itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
49 base::Unretained(this),
50 &Manager::HandleUpdateState);
51 itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
52 base::Unretained(this),
53 &Manager::HandleTestMethod);
54 itf->AddProperty("State", &state_);
Christopher Wiley54028f92014-04-01 17:33:29 -070055 // TODO(wiley): Initialize all properties appropriately before claiming
56 // the properties interface.
Alex Vakulenkob6351532014-08-15 11:49:35 -070057 state_.SetValue("{}");
58 dbus_object_.RegisterAsync(cb);
Alex Vakulenkocf9c1462014-07-23 10:57:58 -070059 command_manager_ = std::make_shared<CommandManager>();
60 command_manager_->Startup();
Alex Vakulenko98025c22014-07-23 11:13:15 -070061 device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
62 new DeviceRegistrationInfo(command_manager_));
63 device_info_->Load();
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070064}
65
Alex Vakulenkob6351532014-08-15 11:49:35 -070066std::string Manager::HandleCheckDeviceRegistered(chromeos::ErrorPtr* error) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070067 LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
Alex Vakulenkob6351532014-08-15 11:49:35 -070068 std::string device_id;
69 bool registered = device_info_->CheckRegistration(error);
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070070 // If it fails due to any reason other than 'device not registered',
71 // treat it as a real error and report it to the caller.
72 if (!registered &&
Alex Vakulenkob6351532014-08-15 11:49:35 -070073 !(*error)->HasError(kErrorDomainGCD, "device_not_registered")) {
74 return device_id;
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070075 }
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070076
Alex Vakulenkob6351532014-08-15 11:49:35 -070077 error->reset();
78
79 if (registered)
80 device_id = device_info_->GetDeviceId(error);
81
82 return device_id;
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070083}
84
Alex Vakulenkob6351532014-08-15 11:49:35 -070085std::string Manager::HandleGetDeviceInfo(chromeos::ErrorPtr* error) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070086 LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
87
88 std::string device_info_str;
Alex Vakulenkob6351532014-08-15 11:49:35 -070089 auto device_info = device_info_->GetDeviceInfo(error);
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070090 if (!device_info)
Alex Vakulenkob6351532014-08-15 11:49:35 -070091 return device_info_str;
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070092
93 base::JSONWriter::Write(device_info.get(), &device_info_str);
Alex Vakulenkob6351532014-08-15 11:49:35 -070094 return device_info_str;
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070095}
96
Alex Vakulenkob6351532014-08-15 11:49:35 -070097std::string Manager::HandleStartRegisterDevice(
98 chromeos::ErrorPtr* error,
Alex Vakulenko9f826a62014-08-23 19:31:27 -070099 const std::map<std::string, std::string>& params) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700100 LOG(INFO) << "Received call to Manager.StartRegisterDevice()";
101
Alex Vakulenkob6351532014-08-15 11:49:35 -0700102 return device_info_->StartRegistration(params, error);
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700103}
104
Alex Vakulenkob6351532014-08-15 11:49:35 -0700105std::string Manager::HandleFinishRegisterDevice(
106 chromeos::ErrorPtr* error, const std::string& user_auth_code) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700107 LOG(INFO) << "Received call to Manager.FinishRegisterDevice()";
Alex Vakulenkob6351532014-08-15 11:49:35 -0700108 if (!device_info_->FinishRegistration(user_auth_code, error))
109 return std::string();
Alex Vakulenko7c3226e2014-05-07 17:35:24 -0700110
Alex Vakulenkob6351532014-08-15 11:49:35 -0700111 return device_info_->GetDeviceId(error);
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700112}
113
Alex Vakulenkob6351532014-08-15 11:49:35 -0700114void Manager::HandleUpdateState(
115 chromeos::ErrorPtr* error, const std::string& json_state_fragment) {
Christopher Wiley106686a2014-03-27 14:51:26 -0700116 // TODO(wiley): Merge json state blobs intelligently.
Alex Vakulenkob6351532014-08-15 11:49:35 -0700117 state_.SetValue(json_state_fragment);
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700118}
119
Alex Vakulenko35e3bab2014-08-15 11:45:46 -0700120std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error,
121 const std::string& message) {
122 LOG(INFO) << "Received call to test method: " << message;
123 return message;
Christopher Wiley2ffa0042014-05-05 16:09:16 -0700124}
125
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700126} // namespace buffet