blob: 112474fe666804811a66701f7543fe2dc6cefb6e [file] [log] [blame]
Vitaly Bukaa0305d32015-07-27 16:08:51 -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/dbus_command_proxy.h"
6
Alex Vakulenko41705852015-10-13 10:12:06 -07007#include <brillo/dbus/async_event_sequencer.h>
8#include <brillo/dbus/exported_object_manager.h>
Vitaly Bukae2713ac2015-08-03 13:50:01 -07009#include <weave/enum_to_string.h>
Vitaly Bukaa0305d32015-07-27 16:08:51 -070010
11#include "buffet/dbus_conversion.h"
Vitaly Buka4f771532015-08-14 14:58:39 -070012#include "buffet/weave_error_conversion.h"
Vitaly Bukaa0305d32015-07-27 16:08:51 -070013
Alex Vakulenko41705852015-10-13 10:12:06 -070014using brillo::dbus_utils::AsyncEventSequencer;
15using brillo::dbus_utils::ExportedObjectManager;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070016
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070017namespace errors {
18namespace commands {
19const char kDomain[] = "weaved";
20const char kCommandDestroyed[] = "command_destroyed";
21} // namespace commands
22} // namespace errors
23
Vitaly Bukaa0305d32015-07-27 16:08:51 -070024namespace buffet {
25
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070026namespace {
27
Alex Vakulenko41705852015-10-13 10:12:06 -070028bool ReportDestroyedError(brillo::ErrorPtr* error) {
29 brillo::Error::AddTo(error, FROM_HERE, errors::commands::kDomain,
30 errors::commands::kCommandDestroyed,
31 "Command has been destroyed");
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070032 return false;
33}
34
35} // anonymous namespace
36
Vitaly Bukaa0305d32015-07-27 16:08:51 -070037DBusCommandProxy::DBusCommandProxy(ExportedObjectManager* object_manager,
38 const scoped_refptr<dbus::Bus>& bus,
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070039 const std::weak_ptr<weave::Command>& command,
Vitaly Bukaa0305d32015-07-27 16:08:51 -070040 std::string object_path)
41 : command_{command},
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070042 dbus_object_{object_manager, bus, dbus::ObjectPath{object_path}} {}
Vitaly Bukaa0305d32015-07-27 16:08:51 -070043
44void DBusCommandProxy::RegisterAsync(
45 const AsyncEventSequencer::CompletionAction& completion_callback) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070046 auto command = command_.lock();
47 if (!command)
48 return;
49
Vitaly Bukaa0305d32015-07-27 16:08:51 -070050 dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
51
52 // Set the initial property values before registering the DBus object.
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070053 dbus_adaptor_.SetName(command->GetName());
54 dbus_adaptor_.SetId(command->GetID());
Alex Vakulenkobe39e932015-10-09 08:10:36 -070055 dbus_adaptor_.SetState(EnumToString(command->GetState()));
Vitaly Bukaa0305d32015-07-27 16:08:51 -070056 dbus_adaptor_.SetProgress(
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070057 DictionaryToDBusVariantDictionary(*command->GetProgress()));
58 dbus_adaptor_.SetOrigin(EnumToString(command->GetOrigin()));
Vitaly Bukaa0305d32015-07-27 16:08:51 -070059 dbus_adaptor_.SetParameters(
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070060 DictionaryToDBusVariantDictionary(*command->GetParameters()));
Vitaly Bukaa0305d32015-07-27 16:08:51 -070061 dbus_adaptor_.SetResults(
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070062 DictionaryToDBusVariantDictionary(*command->GetResults()));
Vitaly Bukaa0305d32015-07-27 16:08:51 -070063
64 // Register the command DBus object and expose its methods and properties.
65 dbus_object_.RegisterAsync(completion_callback);
66}
67
Vitaly Bukaa0305d32015-07-27 16:08:51 -070068bool DBusCommandProxy::SetProgress(
Alex Vakulenko41705852015-10-13 10:12:06 -070069 brillo::ErrorPtr* error,
70 const brillo::VariantDictionary& progress) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070071 auto command = command_.lock();
72 if (!command)
73 return ReportDestroyedError(error);
74
75 LOG(INFO) << "Received call to Command<" << command->GetName()
Vitaly Bukaa0305d32015-07-27 16:08:51 -070076 << ">::SetProgress()";
77 auto dictionary = DictionaryFromDBusVariantDictionary(progress, error);
78 if (!dictionary)
79 return false;
Vitaly Buka4f771532015-08-14 14:58:39 -070080 weave::ErrorPtr weave_error;
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070081 if (!command->SetProgress(*dictionary, &weave_error)) {
Vitaly Buka4f771532015-08-14 14:58:39 -070082 ConvertError(*weave_error, error);
83 return false;
84 }
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070085 dbus_adaptor_.SetProgress(
86 DictionaryToDBusVariantDictionary(*command->GetProgress()));
Alex Vakulenkobe39e932015-10-09 08:10:36 -070087 dbus_adaptor_.SetState(EnumToString(command->GetState()));
Vitaly Buka4f771532015-08-14 14:58:39 -070088 return true;
Vitaly Bukaa0305d32015-07-27 16:08:51 -070089}
90
Alex Vakulenko41705852015-10-13 10:12:06 -070091bool DBusCommandProxy::Complete(brillo::ErrorPtr* error,
92 const brillo::VariantDictionary& results) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -070093 auto command = command_.lock();
94 if (!command)
95 return ReportDestroyedError(error);
96
97 LOG(INFO) << "Received call to Command<" << command->GetName()
Alex Vakulenkobe39e932015-10-09 08:10:36 -070098 << ">::Complete()";
Vitaly Bukaa0305d32015-07-27 16:08:51 -070099 auto dictionary = DictionaryFromDBusVariantDictionary(results, error);
100 if (!dictionary)
101 return false;
Vitaly Buka4f771532015-08-14 14:58:39 -0700102 weave::ErrorPtr weave_error;
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700103 if (!command->Complete(*dictionary, &weave_error)) {
Vitaly Buka4f771532015-08-14 14:58:39 -0700104 ConvertError(*weave_error, error);
105 return false;
106 }
Vitaly Bukabaf7a952015-10-10 01:44:45 -0700107 dbus_adaptor_.SetResults(
108 DictionaryToDBusVariantDictionary(*command->GetResults()));
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700109 dbus_adaptor_.SetState(EnumToString(command->GetState()));
Vitaly Buka4f771532015-08-14 14:58:39 -0700110 return true;
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700111}
112
Alex Vakulenko41705852015-10-13 10:12:06 -0700113bool DBusCommandProxy::Abort(brillo::ErrorPtr* error,
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700114 const std::string& code,
115 const std::string& message) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700116 auto command = command_.lock();
117 if (!command)
118 return ReportDestroyedError(error);
119
120 LOG(INFO) << "Received call to Command<" << command->GetName()
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700121 << ">::Abort()";
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700122 weave::ErrorPtr cmd_error;
123 weave::Error::AddTo(&cmd_error, FROM_HERE, "command_error", code, message);
124 weave::ErrorPtr weave_error;
125 if (!command->Abort(cmd_error.get(), &weave_error)) {
126 ConvertError(*weave_error, error);
127 return false;
128 }
129 dbus_adaptor_.SetState(EnumToString(command->GetState()));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700130 return true;
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700131}
132
Alex Vakulenko41705852015-10-13 10:12:06 -0700133bool DBusCommandProxy::Cancel(brillo::ErrorPtr* error) {
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700134 auto command = command_.lock();
135 if (!command)
136 return ReportDestroyedError(error);
137
138 LOG(INFO) << "Received call to Command<" << command->GetName()
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700139 << ">::Cancel()";
Alex Vakulenkobe39e932015-10-09 08:10:36 -0700140 weave::ErrorPtr weave_error;
141 if (!command->Cancel(&weave_error)) {
142 ConvertError(*weave_error, error);
143 return false;
144 }
145 dbus_adaptor_.SetState(EnumToString(command->GetState()));
Alex Vakulenko2915a7b2015-10-07 17:04:00 -0700146 return true;
Vitaly Bukaa0305d32015-07-27 16:08:51 -0700147}
148
149} // namespace buffet