blob: 74278fec434f7e27210bdd10d18ad4a037fc71db [file] [log] [blame]
// 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/dbus/async_event_sequencer.h>
#include <chromeos/dbus/exported_object_manager.h>
#include "buffet/commands/command_definition.h"
#include "buffet/commands/command_instance.h"
#include "buffet/commands/object_schema.h"
#include "buffet/commands/prop_constraints.h"
#include "buffet/commands/prop_types.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,
std::string object_path)
: command_instance_{command_instance},
dbus_object_{object_manager, bus, dbus::ObjectPath{object_path}} {
}
void DBusCommandProxy::RegisterAsync(
const AsyncEventSequencer::CompletionAction& completion_callback) {
dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
// Set the initial property values before registering the DBus object.
dbus_adaptor_.SetName(command_instance_->GetName());
dbus_adaptor_.SetCategory(command_instance_->GetCategory());
dbus_adaptor_.SetId(command_instance_->GetID());
dbus_adaptor_.SetStatus(command_instance_->GetStatus());
dbus_adaptor_.SetProgress(
ObjectToDBusVariant(command_instance_->GetProgress()));
dbus_adaptor_.SetOrigin(command_instance_->GetOrigin());
dbus_adaptor_.SetParameters(ObjectToDBusVariant(
command_instance_->GetParameters()));
dbus_adaptor_.SetResults(ObjectToDBusVariant(
command_instance_->GetResults()));
// Register the command DBus object and expose its methods and properties.
dbus_object_.RegisterAsync(completion_callback);
}
void DBusCommandProxy::OnResultsChanged() {
dbus_adaptor_.SetResults(
ObjectToDBusVariant(command_instance_->GetResults()));
}
void DBusCommandProxy::OnStatusChanged() {
dbus_adaptor_.SetStatus(command_instance_->GetStatus());
}
void DBusCommandProxy::OnProgressChanged() {
dbus_adaptor_.SetProgress(
ObjectToDBusVariant(command_instance_->GetProgress()));
}
bool DBusCommandProxy::SetProgress(
chromeos::ErrorPtr* error,
const chromeos::VariantDictionary& progress) {
LOG(INFO) << "Received call to Command<" << command_instance_->GetName()
<< ">::SetProgress()";
auto progress_schema =
command_instance_->GetCommandDefinition()->GetProgress();
native_types::Object obj;
if (!ObjectFromDBusVariant(progress_schema, progress, &obj, error))
return false;
command_instance_->SetProgress(obj);
return true;
}
bool DBusCommandProxy::SetResults(chromeos::ErrorPtr* error,
const chromeos::VariantDictionary& results) {
LOG(INFO) << "Received call to Command<"
<< command_instance_->GetName() << ">::SetResults()";
auto results_schema = command_instance_->GetCommandDefinition()->GetResults();
native_types::Object obj;
if (!ObjectFromDBusVariant(results_schema, results, &obj, error))
return false;
command_instance_->SetResults(obj);
return true;
}
void DBusCommandProxy::Abort() {
LOG(INFO) << "Received call to Command<"
<< command_instance_->GetName() << ">::Abort()";
command_instance_->Abort();
}
void DBusCommandProxy::Cancel() {
LOG(INFO) << "Received call to Command<"
<< command_instance_->GetName() << ">::Cancel()";
command_instance_->Cancel();
}
void DBusCommandProxy::Done() {
LOG(INFO) << "Received call to Command<"
<< command_instance_->GetName() << ">::Done()";
command_instance_->Done();
}
} // namespace buffet