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