17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chromeos/dbus/bluetooth_profile_manager_client.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/bus.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/message.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/object_path.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/object_proxy.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char BluetoothProfileManagerClient::kNoResponseError[] =
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "org.chromium.Error.NoResponse";
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BluetoothProfileManagerClient::Options::Options() {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BluetoothProfileManagerClient::Options::~Options() {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The BluetoothProfileManagerClient implementation used in production.
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class BluetoothProfileManagerClientImpl
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public BluetoothProfileManagerClient {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  BluetoothProfileManagerClientImpl() : weak_ptr_factory_(this) {}
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~BluetoothProfileManagerClientImpl() {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // BluetoothProfileManagerClient override.
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void RegisterProfile(const dbus::ObjectPath& profile_path,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const std::string& uuid,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const Options& options,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const base::Closure& callback,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const ErrorCallback& error_callback) OVERRIDE {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MethodCall method_call(
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bluetooth_profile_manager::kBluetoothProfileManagerInterface,
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bluetooth_profile_manager::kRegisterProfile);
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MessageWriter writer(&method_call);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    writer.AppendObjectPath(profile_path);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    writer.AppendString(uuid);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MessageWriter array_writer(NULL);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    writer.OpenArray("{sv}", &array_writer);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MessageWriter dict_writer(NULL);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Name if provided.
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.name.get() != NULL) {
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kNameOption);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfString(*(options.name));
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Service if provided.
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.service.get() != NULL) {
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kServiceOption);
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfString(*(options.service));
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Role if not the default value.
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (options.role != SYMMETRIC) {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kRoleOption);
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (options.role == CLIENT)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dict_writer.AppendVariantOfString(
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            bluetooth_profile_manager::kClientRoleOption);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      else if (options.role == SERVER)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dict_writer.AppendVariantOfString(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            bluetooth_profile_manager::kServerRoleOption);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      else
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dict_writer.AppendVariantOfString("");
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Channel if provided.
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.channel.get() != NULL) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kChannelOption);
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfUint16(*(options.channel));
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send PSM if provided.
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.psm.get() != NULL) {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kPSMOption);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfUint16(*(options.psm));
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send RequireAuthentication if provided.
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.require_authentication.get() != NULL) {
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendString(
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          bluetooth_profile_manager::kRequireAuthenticationOption);
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfBool(*(options.require_authentication));
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send RequireAuthorization if provided.
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.require_authorization.get() != NULL) {
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendString(
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          bluetooth_profile_manager::kRequireAuthorizationOption);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfBool(*(options.require_authorization));
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send AutoConnect if provided.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.auto_connect.get() != NULL) {
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendString(
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          bluetooth_profile_manager::kAutoConnectOption);
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfBool(*(options.auto_connect));
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send ServiceRecord if provided.
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.service_record.get() != NULL) {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kServiceRecordOption);
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfString(*(options.service_record));
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Version if provided.
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.version.get() != NULL) {
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kVersionOption);
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfUint16(*(options.version));
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Send Features if provided.
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (options.features.get() != NULL) {
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageWriter dict_writer(NULL);
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.OpenDictEntry(&dict_writer);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict_writer.AppendString(bluetooth_profile_manager::kFeaturesOption);
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dict_writer.AppendVariantOfUint16(*(options.features));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      array_writer.CloseContainer(&dict_writer);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    writer.CloseContainer(&array_writer);
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    object_proxy_->CallMethodWithErrorCallback(
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &method_call,
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&BluetoothProfileManagerClientImpl::OnSuccess,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(), callback),
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&BluetoothProfileManagerClientImpl::OnError,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(), error_callback));
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // BluetoothProfileManagerClient override.
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void UnregisterProfile(const dbus::ObjectPath& profile_path,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const base::Closure& callback,
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const ErrorCallback& error_callback) OVERRIDE {
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MethodCall method_call(
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bluetooth_profile_manager::kBluetoothProfileManagerInterface,
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bluetooth_profile_manager::kUnregisterProfile);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dbus::MessageWriter writer(&method_call);
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    writer.AppendObjectPath(profile_path);
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    object_proxy_->CallMethodWithErrorCallback(
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &method_call,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&BluetoothProfileManagerClientImpl::OnSuccess,
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(), callback),
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Bind(&BluetoothProfileManagerClientImpl::OnError,
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr(), error_callback));
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) protected:
192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void Init(dbus::Bus* bus) OVERRIDE {
193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    DCHECK(bus);
194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    object_proxy_ = bus->GetObjectProxy(
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        bluetooth_profile_manager::kBluetoothProfileManagerServiceName,
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        dbus::ObjectPath(
197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            bluetooth_profile_manager::kBluetoothProfileManagerServicePath));
198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called when a response for successful method call is received.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnSuccess(const base::Closure& callback,
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 dbus::Response* response) {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(response);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    callback.Run();
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called when a response for a failed method call is received.
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnError(const ErrorCallback& error_callback,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               dbus::ErrorResponse* response) {
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Error response has optional error message argument.
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string error_name;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string error_message;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (response) {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dbus::MessageReader reader(response);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_name = response->GetErrorName();
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reader.PopString(&error_message);
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_name = kNoResponseError;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_message = "";
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_callback.Run(error_name, error_message);
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  dbus::ObjectProxy* object_proxy_;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Weak pointer factory for generating 'this' pointers that might live longer
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // than we do.
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note: This should remain the last member so it'll be destroyed and
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // invalidate its weak pointers before any other members are destroyed.
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::WeakPtrFactory<BluetoothProfileManagerClientImpl> weak_ptr_factory_;
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothProfileManagerClientImpl);
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BluetoothProfileManagerClient::BluetoothProfileManagerClient() {
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BluetoothProfileManagerClient::~BluetoothProfileManagerClient() {
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)BluetoothProfileManagerClient* BluetoothProfileManagerClient::Create() {
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return new BluetoothProfileManagerClientImpl();
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
247