1//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include "apmanager/dbus/service_dbus_adaptor.h"
18
19#include <base/bind.h>
20#include <base/strings/stringprintf.h>
21#include <dbus_bindings/org.chromium.apmanager.Manager.h>
22
23#include "apmanager/service.h"
24
25using brillo::dbus_utils::ExportedObjectManager;
26using brillo::dbus_utils::DBusMethodResponse;
27using brillo::dbus_utils::DBusObject;
28using org::chromium::apmanager::ManagerAdaptor;
29using std::string;
30
31namespace apmanager {
32
33ServiceDBusAdaptor::ServiceDBusAdaptor(
34    const scoped_refptr<dbus::Bus>& bus,
35    ExportedObjectManager* object_manager,
36    Service* service)
37    : adaptor_(this),
38      object_path_(
39          base::StringPrintf("%s/services/%d",
40                             ManagerAdaptor::GetObjectPath().value().c_str(),
41                             service->identifier())),
42      dbus_object_(object_manager, bus, object_path_),
43      service_(service) {
44  // Need to initialize Config property with a valid path before registering
45  // to the bus.
46  SetConfig(service_->config());
47  // Register D-Bus object.
48  adaptor_.RegisterWithDBusObject(&dbus_object_);
49  dbus_object_.RegisterAndBlock();
50}
51
52ServiceDBusAdaptor::~ServiceDBusAdaptor() {}
53
54void ServiceDBusAdaptor::Start(
55    std::unique_ptr<DBusMethodResponse<>> response) {
56  service_->Start(
57      base::Bind(&ServiceDBusAdaptor::OnStartCompleted,
58                 base::Unretained(this),
59                 base::Passed(&response)));
60}
61
62bool ServiceDBusAdaptor::Stop(brillo::ErrorPtr* dbus_error) {
63  Error error;
64  service_->Stop(&error);
65  return !error.ToDBusError(dbus_error);
66}
67
68RPCObjectIdentifier ServiceDBusAdaptor::GetRpcObjectIdentifier() {
69  return object_path_;
70}
71
72void ServiceDBusAdaptor::SetConfig(Config* config) {
73  adaptor_.SetConfig(config->adaptor()->GetRpcObjectIdentifier());
74}
75
76void ServiceDBusAdaptor::SetState(const string& state) {
77  adaptor_.SetState(state);
78}
79
80void ServiceDBusAdaptor::OnStartCompleted(
81    std::unique_ptr<DBusMethodResponse<>> response, const Error& error) {
82  brillo::ErrorPtr dbus_error;
83  if (error.ToDBusError(&dbus_error)) {
84    response->ReplyWithError(dbus_error.get());
85  } else {
86    response->Return();
87  }
88}
89
90}  // namespace apmanager
91