1// Copyright (c) 2012 The Chromium 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 "chromeos/dbus/permission_broker_client.h"
6
7#include "base/bind.h"
8#include "base/callback.h"
9#include "base/memory/weak_ptr.h"
10#include "dbus/bus.h"
11#include "dbus/message.h"
12#include "dbus/object_proxy.h"
13#include "third_party/cros_system_api/dbus/service_constants.h"
14
15using permission_broker::kPermissionBrokerInterface;
16using permission_broker::kPermissionBrokerServiceName;
17using permission_broker::kPermissionBrokerServicePath;
18using permission_broker::kRequestPathAccess;
19using permission_broker::kRequestUsbAccess;
20
21namespace chromeos {
22
23class PermissionBrokerClientImpl : public PermissionBrokerClient {
24 public:
25  PermissionBrokerClientImpl() : proxy_(NULL), weak_ptr_factory_(this) {}
26
27  virtual void RequestPathAccess(const std::string& path,
28                                 const int interface_id,
29                                 const ResultCallback& callback) OVERRIDE {
30    dbus::MethodCall method_call(kPermissionBrokerInterface,
31                                 kRequestPathAccess);
32    dbus::MessageWriter writer(&method_call);
33    writer.AppendString(path);
34    writer.AppendInt32(interface_id);
35    proxy_->CallMethod(&method_call,
36                       dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
37                       base::Bind(&PermissionBrokerClientImpl::OnResponse,
38                                  weak_ptr_factory_.GetWeakPtr(), callback));
39  }
40
41  virtual void RequestUsbAccess(const uint16_t vendor_id,
42                                const uint16_t product_id,
43                                const int interface_id,
44                                const ResultCallback& callback) OVERRIDE {
45    dbus::MethodCall method_call(kPermissionBrokerInterface, kRequestUsbAccess);
46    dbus::MessageWriter writer(&method_call);
47    writer.AppendUint16(vendor_id);
48    writer.AppendUint16(product_id);
49    writer.AppendInt32(interface_id);
50    proxy_->CallMethod(&method_call,
51                       dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
52                       base::Bind(&PermissionBrokerClientImpl::OnResponse,
53                                  weak_ptr_factory_.GetWeakPtr(), callback));
54  }
55
56 protected:
57  virtual void Init(dbus::Bus* bus) OVERRIDE {
58    proxy_ =
59        bus->GetObjectProxy(kPermissionBrokerServiceName,
60                            dbus::ObjectPath(kPermissionBrokerServicePath));
61  }
62
63 private:
64  // Handle a DBus response from the permission broker, invoking the callback
65  // that the method was originally called with with the success response.
66  void OnResponse(const ResultCallback& callback, dbus::Response* response) {
67    if (!response) {
68      LOG(WARNING) << "Access request method call failed.";
69      callback.Run(false);
70      return;
71    }
72
73    bool result = false;
74    dbus::MessageReader reader(response);
75    if (!reader.PopBool(&result))
76      LOG(WARNING) << "Could not parse response: " << response->ToString();
77    callback.Run(result);
78  }
79
80  dbus::ObjectProxy* proxy_;
81
82  // Note: This should remain the last member so that it will be destroyed
83  // first, invalidating its weak pointers, before the other members are
84  // destroyed.
85  base::WeakPtrFactory<PermissionBrokerClientImpl> weak_ptr_factory_;
86
87  DISALLOW_COPY_AND_ASSIGN(PermissionBrokerClientImpl);
88};
89
90PermissionBrokerClient::PermissionBrokerClient() {}
91
92PermissionBrokerClient::~PermissionBrokerClient() {}
93
94PermissionBrokerClient* PermissionBrokerClient::Create() {
95  return new PermissionBrokerClientImpl();
96}
97
98}  // namespace chromeos
99