| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "buffet/commands/dbus_command_proxy.h" |
| |
| #include <chromeos/async_event_sequencer.h> |
| #include <chromeos/dbus_utils.h> |
| #include <chromeos/exported_object_manager.h> |
| |
| #include "buffet/commands/command_instance.h" |
| #include "buffet/commands/prop_constraints.h" |
| #include "buffet/commands/prop_types.h" |
| #include "buffet/dbus_constants.h" |
| |
| using chromeos::dbus_utils::AsyncEventSequencer; |
| using chromeos::dbus_utils::ExportedObjectManager; |
| |
| namespace buffet { |
| |
| DBusCommandProxy::DBusCommandProxy(ExportedObjectManager* object_manager, |
| const scoped_refptr<dbus::Bus>& bus, |
| CommandInstance* command_instance) |
| : object_path_(dbus_constants::kCommandServicePathPrefix + |
| command_instance->GetID()), |
| command_instance_(command_instance), |
| dbus_object_(object_manager, bus, object_path_) { |
| } |
| |
| void DBusCommandProxy::RegisterAsync( |
| const AsyncEventSequencer::CompletionAction& completion_callback) { |
| chromeos::dbus_utils::DBusInterface* itf = |
| dbus_object_.AddOrGetInterface(dbus_constants::kCommandInterface); |
| |
| // DBus methods. |
| itf->AddMethodHandler(dbus_constants::kCommandSetProgress, |
| base::Unretained(this), |
| &DBusCommandProxy::HandleSetProgress); |
| itf->AddMethodHandler(dbus_constants::kCommandAbort, |
| base::Unretained(this), |
| &DBusCommandProxy::HandleAbort); |
| itf->AddMethodHandler(dbus_constants::kCommandCancel, |
| base::Unretained(this), |
| &DBusCommandProxy::HandleCancel); |
| itf->AddMethodHandler(dbus_constants::kCommandDone, |
| base::Unretained(this), |
| &DBusCommandProxy::HandleDone); |
| |
| // DBus properties. |
| itf->AddProperty(dbus_constants::kCommandName, &name_); |
| itf->AddProperty(dbus_constants::kCommandCategory, &category_); |
| itf->AddProperty(dbus_constants::kCommandId, &id_); |
| itf->AddProperty(dbus_constants::kCommandStatus, &status_); |
| itf->AddProperty(dbus_constants::kCommandProgress, &progress_); |
| |
| // Set the initial property values before registering the DBus object. |
| name_.SetValue(command_instance_->GetName()); |
| category_.SetValue(command_instance_->GetCategory()); |
| id_.SetValue(command_instance_->GetID()); |
| status_.SetValue(dbus_constants::kCommandStatusQueued); |
| progress_.SetValue(0); |
| |
| // Register the command DBus object and expose its methods and properties. |
| dbus_object_.RegisterAsync(completion_callback); |
| } |
| |
| void DBusCommandProxy::HandleSetProgress(chromeos::ErrorPtr* error, |
| int32_t progress) { |
| LOG(INFO) << "Received call to Command<" |
| << command_instance_->GetName() << ">::SetProgress(" |
| << progress << ")"; |
| |
| // Validate |progress| parameter. Its value must be between 0 and 100. |
| IntPropType progress_type; |
| progress_type.AddMinMaxConstraint(0, 100); |
| if (progress_type.ValidateValue(progress, error)) { |
| status_.SetValue(dbus_constants::kCommandStatusInProgress); |
| progress_.SetValue(progress); |
| } |
| } |
| |
| void DBusCommandProxy::HandleAbort(chromeos::ErrorPtr* error) { |
| LOG(INFO) << "Received call to Command<" |
| << command_instance_->GetName() << ">::Abort()"; |
| status_.SetValue(dbus_constants::kCommandStatusAborted); |
| } |
| |
| void DBusCommandProxy::HandleCancel(chromeos::ErrorPtr* error) { |
| LOG(INFO) << "Received call to Command<" |
| << command_instance_->GetName() << ">::Cancel()"; |
| status_.SetValue(dbus_constants::kCommandStatusCanceled); |
| } |
| |
| void DBusCommandProxy::HandleDone(chromeos::ErrorPtr* error) { |
| LOG(INFO) << "Received call to Command<" |
| << command_instance_->GetName() << ">::Done()"; |
| status_.SetValue(dbus_constants::kCommandStatusDone); |
| progress_.SetValue(100); |
| } |
| |
| |
| } // namespace buffet |