blob: d82faf62f3900d81cd1b8da28c9cd294d33e1cca [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>
Alex Vakulenko4f7778e2014-09-11 16:57:24 -070012#include <base/json/json_reader.h>
Christopher Wiley2ffa0042014-05-05 16:09:16 -070013#include <base/json/json_writer.h>
Alex Vakulenko24e5f5d2014-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 Wiley2ffa0042014-05-05 16:09:16 -070017#include <dbus/bus.h>
Christopher Wiley54028f92014-04-01 17:33:29 -070018#include <dbus/object_path.h>
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070019#include <dbus/values_util.h>
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070020
Alex Vakulenko4f7778e2014-09-11 16:57:24 -070021#include "buffet/commands/command_instance.h"
Alex Vakulenkocf9c1462014-07-23 10:57:58 -070022#include "buffet/commands/command_manager.h"
Alex Vakulenkob511e562014-09-12 10:27:23 -070023#include "buffet/libbuffet/dbus_constants.h"
Alex Vakulenkoecf961a2014-10-28 13:50:16 -070024#include "buffet/states/state_change_queue.h"
Alex Vakulenko95877b52014-09-19 15:31:09 -070025#include "buffet/states/state_manager.h"
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070026
Christopher Wiley68c07cc2014-07-29 14:07:10 -070027using chromeos::dbus_utils::AsyncEventSequencer;
Christopher Wiley1aa980e2014-08-11 10:51:20 -070028using chromeos::dbus_utils::ExportedObjectManager;
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070029
30namespace buffet {
31
Alex Vakulenkoecf961a2014-10-28 13:50:16 -070032namespace {
33// Max of 100 state update events should be enough in the queue.
34const size_t kMaxStateChangeQueueSize = 100;
35} // anonymous namespace
36
Alex Vakulenkob6351532014-08-15 11:49:35 -070037Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager)
38 : dbus_object_(object_manager.get(),
39 object_manager->GetBus(),
40 dbus::ObjectPath(dbus_constants::kManagerServicePath)) {}
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070041
Alex Vakulenkoecf961a2014-10-28 13:50:16 -070042Manager::~Manager() {}
43
Alex Vakulenko4a8d9de2014-08-24 15:05:06 -070044void Manager::RegisterAsync(const AsyncEventSequencer::CompletionAction& cb) {
Alex Vakulenkob6351532014-08-15 11:49:35 -070045 chromeos::dbus_utils::DBusInterface* itf =
46 dbus_object_.AddOrGetInterface(dbus_constants::kManagerInterface);
Anton Muhin914b1382014-10-01 18:06:54 +040047 itf->AddMethodHandler(dbus_constants::kManagerStartDevice,
48 base::Unretained(this),
49 &Manager::HandleStartDevice);
Alex Vakulenkob6351532014-08-15 11:49:35 -070050 itf->AddMethodHandler(dbus_constants::kManagerCheckDeviceRegistered,
51 base::Unretained(this),
52 &Manager::HandleCheckDeviceRegistered);
53 itf->AddMethodHandler(dbus_constants::kManagerGetDeviceInfo,
54 base::Unretained(this),
55 &Manager::HandleGetDeviceInfo);
Anton Muhin9cc03fd2014-10-16 18:59:57 +040056 itf->AddMethodHandler(dbus_constants::kManagerRegisterDevice,
Alex Vakulenkob6351532014-08-15 11:49:35 -070057 base::Unretained(this),
Anton Muhin9cc03fd2014-10-16 18:59:57 +040058 &Manager::HandleRegisterDevice);
Alex Vakulenkob6351532014-08-15 11:49:35 -070059 itf->AddMethodHandler(dbus_constants::kManagerUpdateStateMethod,
60 base::Unretained(this),
61 &Manager::HandleUpdateState);
Alex Vakulenko4f7778e2014-09-11 16:57:24 -070062 itf->AddMethodHandler(dbus_constants::kManagerAddCommand,
63 base::Unretained(this),
64 &Manager::HandleAddCommand);
Alex Vakulenkob6351532014-08-15 11:49:35 -070065 itf->AddMethodHandler(dbus_constants::kManagerTestMethod,
66 base::Unretained(this),
67 &Manager::HandleTestMethod);
Alex Vakulenkob6351532014-08-15 11:49:35 -070068 dbus_object_.RegisterAsync(cb);
Alex Vakulenko05fa6812014-09-03 16:27:21 -070069 command_manager_ =
70 std::make_shared<CommandManager>(dbus_object_.GetObjectManager());
Alex Vakulenkocf9c1462014-07-23 10:57:58 -070071 command_manager_->Startup();
Alex Vakulenkoecf961a2014-10-28 13:50:16 -070072 state_change_queue_ = std::unique_ptr<StateChangeQueue>(
73 new StateChangeQueue(kMaxStateChangeQueueSize));
74 state_manager_ = std::make_shared<StateManager>(state_change_queue_.get());
Alex Vakulenko95877b52014-09-19 15:31:09 -070075 state_manager_->Startup();
Alex Vakulenko98025c22014-07-23 11:13:15 -070076 device_info_ = std::unique_ptr<DeviceRegistrationInfo>(
Alex Vakulenko95877b52014-09-19 15:31:09 -070077 new DeviceRegistrationInfo(command_manager_, state_manager_));
Alex Vakulenko98025c22014-07-23 11:13:15 -070078 device_info_->Load();
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070079}
80
Anton Muhin914b1382014-10-01 18:06:54 +040081void Manager::HandleStartDevice(chromeos::ErrorPtr* error) {
82 LOG(INFO) << "Received call to Manager.StartDevice()";
Anton Muhindd6d8282014-10-02 20:37:00 +040083
84 device_info_->StartDevice(error);
Anton Muhin914b1382014-10-01 18:06:54 +040085}
86
Alex Vakulenkob6351532014-08-15 11:49:35 -070087std::string Manager::HandleCheckDeviceRegistered(chromeos::ErrorPtr* error) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -070088 LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()";
Alex Vakulenkob6351532014-08-15 11:49:35 -070089 std::string device_id;
90 bool registered = device_info_->CheckRegistration(error);
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070091 // If it fails due to any reason other than 'device not registered',
92 // treat it as a real error and report it to the caller.
93 if (!registered &&
Alex Vakulenkob6351532014-08-15 11:49:35 -070094 !(*error)->HasError(kErrorDomainGCD, "device_not_registered")) {
95 return device_id;
Alex Vakulenko7c3226e2014-05-07 17:35:24 -070096 }
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070097
Alex Vakulenkob6351532014-08-15 11:49:35 -070098 error->reset();
99
100 if (registered)
101 device_id = device_info_->GetDeviceId(error);
102
103 return device_id;
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700104}
105
Alex Vakulenkob6351532014-08-15 11:49:35 -0700106std::string Manager::HandleGetDeviceInfo(chromeos::ErrorPtr* error) {
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700107 LOG(INFO) << "Received call to Manager.GetDeviceInfo()";
108
109 std::string device_info_str;
Alex Vakulenkob6351532014-08-15 11:49:35 -0700110 auto device_info = device_info_->GetDeviceInfo(error);
Alex Vakulenko7c3226e2014-05-07 17:35:24 -0700111 if (!device_info)
Alex Vakulenkob6351532014-08-15 11:49:35 -0700112 return device_info_str;
Alex Vakulenko7c3226e2014-05-07 17:35:24 -0700113
114 base::JSONWriter::Write(device_info.get(), &device_info_str);
Alex Vakulenkob6351532014-08-15 11:49:35 -0700115 return device_info_str;
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700116}
117
Anton Muhin9cc03fd2014-10-16 18:59:57 +0400118std::string Manager::HandleRegisterDevice(
Alex Vakulenkob6351532014-08-15 11:49:35 -0700119 chromeos::ErrorPtr* error,
Alex Vakulenko9f826a62014-08-23 19:31:27 -0700120 const std::map<std::string, std::string>& params) {
Anton Muhin9cc03fd2014-10-16 18:59:57 +0400121 LOG(INFO) << "Received call to Manager.RegisterDevice()";
Alex Vakulenkof3d77e52014-04-15 11:36:32 -0700122
Anton Muhin9cc03fd2014-10-16 18:59:57 +0400123 return device_info_->RegisterDevice(params, error);
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700124}
125
Alex Vakulenkob6351532014-08-15 11:49:35 -0700126void Manager::HandleUpdateState(
Alex Vakulenko95877b52014-09-19 15:31:09 -0700127 chromeos::ErrorPtr* error,
Alex Vakulenkob9d72642014-09-22 16:49:45 -0700128 const chromeos::VariantDictionary& property_set) {
Alex Vakulenko95877b52014-09-19 15:31:09 -0700129 state_manager_->UpdateProperties(property_set, error);
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700130}
131
Alex Vakulenko4f7778e2014-09-11 16:57:24 -0700132void Manager::HandleAddCommand(
133 chromeos::ErrorPtr* error, const std::string& json_command) {
134 std::string error_message;
135 std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
136 json_command, base::JSON_PARSE_RFC, nullptr, &error_message));
137 if (!value) {
138 chromeos::Error::AddTo(error, chromeos::errors::json::kDomain,
139 chromeos::errors::json::kParseError, error_message);
140 return;
141 }
142 auto command_instance = buffet::CommandInstance::FromJson(
143 value.get(), command_manager_->GetCommandDictionary(), error);
144 if (command_instance)
145 command_manager_->AddCommand(std::move(command_instance));
146}
147
Alex Vakulenko35e3bab2014-08-15 11:45:46 -0700148std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error,
149 const std::string& message) {
150 LOG(INFO) << "Received call to test method: " << message;
151 return message;
Christopher Wiley2ffa0042014-05-05 16:09:16 -0700152}
153
Christopher Wiley4b5f04c2014-03-27 14:45:37 -0700154} // namespace buffet