Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chromeos / dbus / permission_broker_client.cc
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
15 using permission_broker::kPermissionBrokerInterface;
16 using permission_broker::kPermissionBrokerServiceName;
17 using permission_broker::kPermissionBrokerServicePath;
18 using permission_broker::kRequestPathAccess;
19 using permission_broker::kRequestUsbAccess;
20
21 namespace chromeos {
22
23 class 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
90 PermissionBrokerClient::PermissionBrokerClient() {}
91
92 PermissionBrokerClient::~PermissionBrokerClient() {}
93
94 PermissionBrokerClient* PermissionBrokerClient::Create() {
95   return new PermissionBrokerClientImpl();
96 }
97
98 }  // namespace chromeos