blob: 9a11040ff3a252ad1601231172468cd1cfced99f [file] [log] [blame]
Christopher Wileya4915c42014-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 Vakulenkob3aac252014-05-07 17:35:24 -07007#include <map>
8#include <string>
9
Christopher Wileya4915c42014-03-27 14:45:37 -070010#include <base/bind.h>
11#include <base/bind_helpers.h>
Christopher Wileyb76eb292014-05-05 16:09:16 -070012#include <base/json/json_writer.h>
Christopher Wiley2d2d92b2014-07-29 14:07:10 -070013#include <chromeos/async_event_sequencer.h>
Christopher Wiley94d65972014-08-07 15:47:24 -070014#include <chromeos/dbus_utils.h>
Alex Vakulenko5f472062014-08-14 17:54:04 -070015#include <chromeos/error.h>
Christopher Wileyb5dd5ea2014-08-11 10:51:20 -070016#include <chromeos/exported_object_manager.h>
Christopher Wileyb76eb292014-05-05 16:09:16 -070017#include <dbus/bus.h>
Christopher Wiley90016242014-04-01 17:33:29 -070018#include <dbus/object_path.h>
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070019#include <dbus/values_util.h>
Christopher Wileya4915c42014-03-27 14:45:37 -070020
Alex Vakulenkoc2bc9a42014-07-23 10:57:58 -070021#include "buffet/commands/command_manager.h"
Christopher Wileya4915c42014-03-27 14:45:37 -070022#include "buffet/dbus_constants.h"
Christopher Wileya4915c42014-03-27 14:45:37 -070023
Christopher Wiley2d2d92b2014-07-29 14:07:10 -070024using chromeos::dbus_utils::AsyncEventSequencer;
Christopher Wileyb5dd5ea2014-08-11 10:51:20 -070025using chromeos::dbus_utils::ExportedObjectManager;
Christopher Wileya4915c42014-03-27 14:45:37 -070026
27namespace buffet {
28
Alex Vakulenkof2784de2014-08-15 11:49:35 -070029Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
30 : dbus_object_(object_manager.get(),
31 object_manager->GetBus(),
32 dbus::ObjectPath(dbus_constants::kManagerServicePath)) {}
Christopher Wileya4915c42014-03-27 14:45:37 -070033
Alex Vakulenkof2784de2014-08-15 11:49:35 -070034void Manager::Init(const AsyncEventSequencer::CompletionAction& cb) {
35 chromeos::dbus_utils::DBusInterface* itf =
36 dbus_object_.AddOrGetInterface(dbus_constants::kManagerInterface);
37 itf->AddMethodHandler(dbus_constants::kManagerCheckDeviceRegistered,
38 base::Unretained(this),
39 &Manager::HandleCheckDeviceRegistered);
40 itf->AddMethodHandler(dbus_constants::kManagerGetDeviceInfo,
41 base::Unretained(this),
42 &Manager::HandleGetDeviceInfo);
43 itf->AddMethodHandler(dbus_constants::kManagerStartRegisterDevice,
44 base::Unretained(this),
45 &Manager::HandleStartRegisterDevice);
46 itf->AddMethodHandler(dbus_constants::kManagerFinishRegisterDevice,
47 base::Unretained(this),
48 &Manager::HandleFinishRegisterDevice);
49 itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
50 base::Unretained(this),
51 &Manager::HandleUpdateState);
52 itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
53 base::Unretained(this),
54 &Manager::HandleTestMethod);
55 itf->AddProperty("State", &state_);
Christopher Wiley90016242014-04-01 17:33:29 -070056 // TODO(wiley): Initialize all properties appropriately before claiming
57 // the properties interface.
Alex Vakulenkof2784de2014-08-15 11:49:35 -070058 state_.SetValue("{}");
59 dbus_object_.RegisterAsync(cb);
Alex Vakulenkoc2bc9a42014-07-23 10:57:58 -070060 command_manager_ = std::make_shared<CommandManager>();
61 command_manager_->Startup();
Alex Vakulenko1f30a622014-07-23 11:13:15 -070062 device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
63 new DeviceRegistrationInfo(command_manager_));
64 device_info_->Load();
Christopher Wileya4915c42014-03-27 14:45:37 -070065}
66
Alex Vakulenkof2784de2014-08-15 11:49:35 -070067std::string Manager::HandleCheckDeviceRegistered(chromeos::ErrorPtr* error) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070068 LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
Alex Vakulenkof2784de2014-08-15 11:49:35 -070069 std::string device_id;
70 bool registered = device_info_->CheckRegistration(error);
Alex Vakulenkob3aac252014-05-07 17:35:24 -070071 // If it fails due to any reason other than 'device not registered',
72 // treat it as a real error and report it to the caller.
73 if (!registered &&
Alex Vakulenkof2784de2014-08-15 11:49:35 -070074 !(*error)->HasError(kErrorDomainGCD, "device_not_registered")) {
75 return device_id;
Alex Vakulenkob3aac252014-05-07 17:35:24 -070076 }
Christopher Wileya4915c42014-03-27 14:45:37 -070077
Alex Vakulenkof2784de2014-08-15 11:49:35 -070078 error->reset();
79
80 if (registered)
81 device_id = device_info_->GetDeviceId(error);
82
83 return device_id;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070084}
85
Alex Vakulenkof2784de2014-08-15 11:49:35 -070086std::string Manager::HandleGetDeviceInfo(chromeos::ErrorPtr* error) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070087 LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
88
89 std::string device_info_str;
Alex Vakulenkof2784de2014-08-15 11:49:35 -070090 auto device_info = device_info_->GetDeviceInfo(error);
Alex Vakulenkob3aac252014-05-07 17:35:24 -070091 if (!device_info)
Alex Vakulenkof2784de2014-08-15 11:49:35 -070092 return device_info_str;
Alex Vakulenkob3aac252014-05-07 17:35:24 -070093
94 base::JSONWriter::Write(device_info.get(), &device_info_str);
Alex Vakulenkof2784de2014-08-15 11:49:35 -070095 return device_info_str;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070096}
97
Alex Vakulenkof2784de2014-08-15 11:49:35 -070098std::string Manager::HandleStartRegisterDevice(
99 chromeos::ErrorPtr* error,
100 const std::map<std::string,
101 std::unique_ptr<base::Value>>& params) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700102 LOG(INFO) << "Received call to Manager.StartRegisterDevice()";
103
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700104 return device_info_->StartRegistration(params, error);
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700105}
106
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700107std::string Manager::HandleFinishRegisterDevice(
108 chromeos::ErrorPtr* error, const std::string& user_auth_code) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700109 LOG(INFO) << "Received call to Manager.FinishRegisterDevice()";
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700110 if (!device_info_->FinishRegistration(user_auth_code, error))
111 return std::string();
Alex Vakulenkob3aac252014-05-07 17:35:24 -0700112
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700113 return device_info_->GetDeviceId(error);
Christopher Wileya4915c42014-03-27 14:45:37 -0700114}
115
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700116void Manager::HandleUpdateState(
117 chromeos::ErrorPtr* error, const std::string& json_state_fragment) {
Christopher Wileyaa3f29c2014-03-27 14:51:26 -0700118 // TODO(wiley): Merge json state blobs intelligently.
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700119 state_.SetValue(json_state_fragment);
Christopher Wileya4915c42014-03-27 14:45:37 -0700120}
121
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -0700122std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error,
123 const std::string& message) {
124 LOG(INFO) << "Received call to test method: " << message;
125 return message;
Christopher Wileyb76eb292014-05-05 16:09:16 -0700126}
127
Christopher Wileya4915c42014-03-27 14:45:37 -0700128} // namespace buffet