blob: 4648c83b20abf2db67371df7ff91ca1f75201f52 [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>
Alex Vakulenko665c8852014-09-11 16:57:24 -070012#include <base/json/json_reader.h>
Christopher Wileyb76eb292014-05-05 16:09:16 -070013#include <base/json/json_writer.h>
Alex Vakulenkoa8b95bc2014-08-27 11:00:57 -070014#include <chromeos/dbus/async_event_sequencer.h>
15#include <chromeos/dbus/exported_object_manager.h>
16#include <chromeos/errors/error.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 Vakulenko665c8852014-09-11 16:57:24 -070021#include "buffet/commands/command_instance.h"
Alex Vakulenkoc2bc9a42014-07-23 10:57:58 -070022#include "buffet/commands/command_manager.h"
Alex Vakulenko89d9d5e2014-09-12 10:27:23 -070023#include "buffet/libbuffet/dbus_constants.h"
Alex Vakulenko07216fe2014-09-19 15:31:09 -070024#include "buffet/states/state_manager.h"
Christopher Wileya4915c42014-03-27 14:45:37 -070025
Christopher Wiley2d2d92b2014-07-29 14:07:10 -070026using chromeos::dbus_utils::AsyncEventSequencer;
Christopher Wileyb5dd5ea2014-08-11 10:51:20 -070027using chromeos::dbus_utils::ExportedObjectManager;
Christopher Wileya4915c42014-03-27 14:45:37 -070028
29namespace buffet {
30
Alex Vakulenkof2784de2014-08-15 11:49:35 -070031Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
32 : dbus_object_(object_manager.get(),
33 object_manager->GetBus(),
34 dbus::ObjectPath(dbus_constants::kManagerServicePath)) {}
Christopher Wileya4915c42014-03-27 14:45:37 -070035
Alex Vakulenkobe9c3832014-08-24 15:05:06 -070036void Manager::RegisterAsync(const AsyncEventSequencer::CompletionAction& cb) {
Alex Vakulenkof2784de2014-08-15 11:49:35 -070037 chromeos::dbus_utils::DBusInterface* itf =
38 dbus_object_.AddOrGetInterface(dbus_constants::kManagerInterface);
Anton Muhin86d67fe2014-10-01 18:06:54 +040039 itf->AddMethodHandler(dbus_constants::kManagerStartDevice,
40 base::Unretained(this),
41 &Manager::HandleStartDevice);
Alex Vakulenkof2784de2014-08-15 11:49:35 -070042 itf->AddMethodHandler(dbus_constants::kManagerCheckDeviceRegistered,
43 base::Unretained(this),
44 &Manager::HandleCheckDeviceRegistered);
45 itf->AddMethodHandler(dbus_constants::kManagerGetDeviceInfo,
46 base::Unretained(this),
47 &Manager::HandleGetDeviceInfo);
Anton Muhinbeb1c5b2014-10-16 18:59:57 +040048 itf->AddMethodHandler(dbus_constants::kManagerRegisterDevice,
Alex Vakulenkof2784de2014-08-15 11:49:35 -070049 base::Unretained(this),
Anton Muhinbeb1c5b2014-10-16 18:59:57 +040050 &Manager::HandleRegisterDevice);
Alex Vakulenkof2784de2014-08-15 11:49:35 -070051 itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
52 base::Unretained(this),
53 &Manager::HandleUpdateState);
Alex Vakulenko665c8852014-09-11 16:57:24 -070054 itf->AddMethodHandler(dbus_constants::kManagerAddCommand,
55 base::Unretained(this),
56 &Manager::HandleAddCommand);
Alex Vakulenkof2784de2014-08-15 11:49:35 -070057 itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
58 base::Unretained(this),
59 &Manager::HandleTestMethod);
Alex Vakulenkof2784de2014-08-15 11:49:35 -070060 dbus_object_.RegisterAsync(cb);
Alex Vakulenko95110752014-09-03 16:27:21 -070061 command_manager_ =
62 std::make_shared<CommandManager>(dbus_object_.GetObjectManager());
Alex Vakulenkoc2bc9a42014-07-23 10:57:58 -070063 command_manager_->Startup();
Alex Vakulenko07216fe2014-09-19 15:31:09 -070064 state_manager_ = std::make_shared<StateManager>();
65 state_manager_->Startup();
Alex Vakulenko1f30a622014-07-23 11:13:15 -070066 device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
Alex Vakulenko07216fe2014-09-19 15:31:09 -070067 new DeviceRegistrationInfo(command_manager_, state_manager_));
Alex Vakulenko1f30a622014-07-23 11:13:15 -070068 device_info_->Load();
Christopher Wileya4915c42014-03-27 14:45:37 -070069}
70
Anton Muhin86d67fe2014-10-01 18:06:54 +040071void Manager::HandleStartDevice(chromeos::ErrorPtr* error) {
72 LOG(INFO) << "Received call to Manager.StartDevice()";
Anton Muhind8d32162014-10-02 20:37:00 +040073
74 device_info_->StartDevice(error);
Anton Muhin86d67fe2014-10-01 18:06:54 +040075}
76
Alex Vakulenkof2784de2014-08-15 11:49:35 -070077std::string Manager::HandleCheckDeviceRegistered(chromeos::ErrorPtr* error) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070078 LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
Alex Vakulenkof2784de2014-08-15 11:49:35 -070079 std::string device_id;
80 bool registered = device_info_->CheckRegistration(error);
Alex Vakulenkob3aac252014-05-07 17:35:24 -070081 // If it fails due to any reason other than 'device not registered',
82 // treat it as a real error and report it to the caller.
83 if (!registered &&
Alex Vakulenkof2784de2014-08-15 11:49:35 -070084 !(*error)->HasError(kErrorDomainGCD, "device_not_registered")) {
85 return device_id;
Alex Vakulenkob3aac252014-05-07 17:35:24 -070086 }
Christopher Wileya4915c42014-03-27 14:45:37 -070087
Alex Vakulenkof2784de2014-08-15 11:49:35 -070088 error->reset();
89
90 if (registered)
91 device_id = device_info_->GetDeviceId(error);
92
93 return device_id;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070094}
95
Alex Vakulenkof2784de2014-08-15 11:49:35 -070096std::string Manager::HandleGetDeviceInfo(chromeos::ErrorPtr* error) {
Alex Vakulenko3cb466c2014-04-15 11:36:32 -070097 LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
98
99 std::string device_info_str;
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700100 auto device_info = device_info_->GetDeviceInfo(error);
Alex Vakulenkob3aac252014-05-07 17:35:24 -0700101 if (!device_info)
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700102 return device_info_str;
Alex Vakulenkob3aac252014-05-07 17:35:24 -0700103
104 base::JSONWriter::Write(device_info.get(), &device_info_str);
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700105 return device_info_str;
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700106}
107
Anton Muhinbeb1c5b2014-10-16 18:59:57 +0400108std::string Manager::HandleRegisterDevice(
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700109 chromeos::ErrorPtr* error,
Alex Vakulenkoa9044342014-08-23 19:31:27 -0700110 const std::map<std::string, std::string>& params) {
Anton Muhinbeb1c5b2014-10-16 18:59:57 +0400111 LOG(INFO) << "Received call to Manager.RegisterDevice()";
Alex Vakulenko3cb466c2014-04-15 11:36:32 -0700112
Anton Muhinbeb1c5b2014-10-16 18:59:57 +0400113 return device_info_->RegisterDevice(params, error);
Christopher Wileya4915c42014-03-27 14:45:37 -0700114}
115
Alex Vakulenkof2784de2014-08-15 11:49:35 -0700116void Manager::HandleUpdateState(
Alex Vakulenko07216fe2014-09-19 15:31:09 -0700117 chromeos::ErrorPtr* error,
Alex Vakulenko576c9792014-09-22 16:49:45 -0700118 const chromeos::VariantDictionary& property_set) {
Alex Vakulenko07216fe2014-09-19 15:31:09 -0700119 state_manager_->UpdateProperties(property_set, error);
Christopher Wileya4915c42014-03-27 14:45:37 -0700120}
121
Alex Vakulenko665c8852014-09-11 16:57:24 -0700122void Manager::HandleAddCommand(
123 chromeos::ErrorPtr* error, const std::string& json_command) {
124 std::string error_message;
125 std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
126 json_command, base::JSON_PARSE_RFC, nullptr, &error_message));
127 if (!value) {
128 chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
129 chromeos::errors::json::kParseError, error_message);
130 return;
131 }
132 auto command_instance = buffet::CommandInstance::FromJson(
133 value.get(), command_manager_->GetCommandDictionary(), error);
134 if (command_instance)
135 command_manager_->AddCommand(std::move(command_instance));
136}
137
Alex Vakulenko7a1dc0b2014-08-15 11:45:46 -0700138std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error,
139 const std::string& message) {
140 LOG(INFO) << "Received call to test method: " << message;
141 return message;
Christopher Wileyb76eb292014-05-05 16:09:16 -0700142}
143
Christopher Wileya4915c42014-03-27 14:45:37 -0700144} // namespace buffet