OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/dbus/bluetooth_adapter_client.h" | 5 #include "chromeos/dbus/bluetooth_adapter_client.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
| 8 #include <utility> |
8 | 9 |
9 #include "base/bind.h" | 10 #include "base/bind.h" |
10 #include "base/logging.h" | 11 #include "base/logging.h" |
11 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
12 #include "chromeos/dbus/bluetooth_device_client.h" | 13 #include "chromeos/dbus/bluetooth_device_client.h" |
13 #include "chromeos/dbus/bluetooth_manager_client.h" | 14 #include "chromeos/dbus/bluetooth_manager_client.h" |
| 15 #include "chromeos/dbus/bluetooth_out_of_band_pairing_data.h" |
14 #include "chromeos/dbus/bluetooth_property.h" | 16 #include "chromeos/dbus/bluetooth_property.h" |
15 #include "dbus/bus.h" | 17 #include "dbus/bus.h" |
16 #include "dbus/message.h" | 18 #include "dbus/message.h" |
17 #include "dbus/object_path.h" | 19 #include "dbus/object_path.h" |
18 #include "dbus/object_proxy.h" | 20 #include "dbus/object_proxy.h" |
19 #include "third_party/cros_system_api/dbus/service_constants.h" | 21 #include "third_party/cros_system_api/dbus/service_constants.h" |
20 | 22 |
21 namespace chromeos { | 23 namespace chromeos { |
22 | 24 |
23 BluetoothAdapterClient::Properties::Properties(dbus::ObjectProxy* object_proxy, | 25 BluetoothAdapterClient::Properties::Properties(dbus::ObjectProxy* object_proxy, |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 | 293 |
292 dbus::ObjectProxy* object_proxy = GetObjectProxy(object_path); | 294 dbus::ObjectProxy* object_proxy = GetObjectProxy(object_path); |
293 | 295 |
294 object_proxy->CallMethod( | 296 object_proxy->CallMethod( |
295 &method_call, | 297 &method_call, |
296 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 298 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
297 base::Bind(&BluetoothAdapterClientImpl::OnCreateDevice, | 299 base::Bind(&BluetoothAdapterClientImpl::OnCreateDevice, |
298 weak_ptr_factory_.GetWeakPtr(), object_path, callback)); | 300 weak_ptr_factory_.GetWeakPtr(), object_path, callback)); |
299 } | 301 } |
300 | 302 |
| 303 // BluetoothAdapterClient override. |
| 304 virtual void ReadLocalOutOfBandPairingData( |
| 305 const dbus::ObjectPath& object_path, |
| 306 const OutOfBandPairingDataCallback& callback) { |
| 307 dbus::MethodCall method_call( |
| 308 bluetooth_outofband::kBluetoothOutOfBandInterface, |
| 309 bluetooth_outofband::kReadLocalData); |
| 310 |
| 311 dbus::ObjectProxy* object_proxy = GetObjectProxy(object_path); |
| 312 |
| 313 object_proxy->CallMethod( |
| 314 &method_call, |
| 315 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 316 base::Bind(&BluetoothAdapterClientImpl::OnReadLocalData, |
| 317 weak_ptr_factory_.GetWeakPtr(), object_path, callback)); |
| 318 } |
| 319 |
| 320 // BluetoothAdapterClient override. |
| 321 virtual void AddRemoteOutOfBandPairingData( |
| 322 const dbus::ObjectPath& object_path, |
| 323 const std::string& address, |
| 324 const OutOfBandPairingData& data, |
| 325 const AdapterCallback& callback) { |
| 326 dbus::MethodCall method_call( |
| 327 bluetooth_outofband::kBluetoothOutOfBandInterface, |
| 328 bluetooth_outofband::kAddRemoteData); |
| 329 |
| 330 dbus::MessageWriter writer(&method_call); |
| 331 writer.AppendString(address); |
| 332 writer.AppendArrayOfBytes(data.hash, kOutOfBandPairingDataSize); |
| 333 writer.AppendArrayOfBytes(data.randomizer, kOutOfBandPairingDataSize); |
| 334 |
| 335 dbus::ObjectProxy* object_proxy = GetObjectProxy(object_path); |
| 336 |
| 337 object_proxy->CallMethod( |
| 338 &method_call, |
| 339 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 340 base::Bind(&BluetoothAdapterClientImpl::ResponseToAdapterCallback, |
| 341 weak_ptr_factory_.GetWeakPtr(), object_path, callback)); |
| 342 } |
| 343 |
| 344 virtual void RemoveRemoteOutOfBandPairingData( |
| 345 const dbus::ObjectPath& object_path, |
| 346 const std::string& address, |
| 347 const AdapterCallback& callback) { |
| 348 dbus::MethodCall method_call( |
| 349 bluetooth_outofband::kBluetoothOutOfBandInterface, |
| 350 bluetooth_outofband::kRemoveRemoteData); |
| 351 |
| 352 dbus::MessageWriter writer(&method_call); |
| 353 writer.AppendString(address); |
| 354 |
| 355 dbus::ObjectProxy* object_proxy = GetObjectProxy(object_path); |
| 356 |
| 357 object_proxy->CallMethod( |
| 358 &method_call, |
| 359 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 360 base::Bind(&BluetoothAdapterClientImpl::ResponseToAdapterCallback, |
| 361 weak_ptr_factory_.GetWeakPtr(), object_path, callback)); |
| 362 } |
| 363 |
301 private: | 364 private: |
302 // We maintain a collection of dbus object proxies and properties structures | 365 // We maintain a collection of dbus object proxies and properties structures |
303 // for each adapter. | 366 // for each adapter. |
304 typedef std::pair<dbus::ObjectProxy*, Properties*> Object; | 367 typedef std::pair<dbus::ObjectProxy*, Properties*> Object; |
305 typedef std::map<const dbus::ObjectPath, Object> ObjectMap; | 368 typedef std::map<const dbus::ObjectPath, Object> ObjectMap; |
306 ObjectMap object_map_; | 369 ObjectMap object_map_; |
307 | 370 |
308 // BluetoothManagerClient::Observer override. | 371 // BluetoothManagerClient::Observer override. |
309 virtual void AdapterAdded(const dbus::ObjectPath& object_path) OVERRIDE { | 372 virtual void AdapterAdded(const dbus::ObjectPath& object_path) OVERRIDE { |
310 } | 373 } |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 success = true; | 663 success = true; |
601 } | 664 } |
602 } else { | 665 } else { |
603 LOG(WARNING) << "Failed to create device."; | 666 LOG(WARNING) << "Failed to create device."; |
604 } | 667 } |
605 | 668 |
606 // Notify client. | 669 // Notify client. |
607 callback.Run(device_path, success); | 670 callback.Run(device_path, success); |
608 } | 671 } |
609 | 672 |
| 673 // Called when a response from ReadLocalOutOfBandPairingData() is received. |
| 674 void OnReadLocalData(const dbus::ObjectPath& object_path, |
| 675 const OutOfBandPairingDataCallback& callback, |
| 676 dbus::Response* response) { |
| 677 bool success = false; |
| 678 OutOfBandPairingData data; |
| 679 if (response != NULL) { |
| 680 dbus::MessageReader reader(response); |
| 681 uint8_t* bytes; |
| 682 size_t length = kOutOfBandPairingDataSize; |
| 683 if (reader.PopArrayOfBytes(&bytes, &length)) { |
| 684 if (length == kOutOfBandPairingDataSize) { |
| 685 memcpy(&data.hash, bytes, length); |
| 686 if (reader.PopArrayOfBytes(&bytes, &length)) { |
| 687 if (length == kOutOfBandPairingDataSize) { |
| 688 memcpy(&data.randomizer, bytes, length); |
| 689 success = true; |
| 690 } |
| 691 } |
| 692 } |
| 693 } |
| 694 } |
| 695 callback.Run(data, success); |
| 696 } |
| 697 |
| 698 // Translates a dbus::Response to an AdapterCallback by calling |callback| |
| 699 // with |object_path| and assuming success if |response| is not NULL. |
| 700 void ResponseToAdapterCallback(const dbus::ObjectPath& object_path, |
| 701 const AdapterCallback& callback, |
| 702 dbus::Response* response) { |
| 703 callback.Run(object_path, response != NULL); |
| 704 } |
| 705 |
610 // Called when a response for CreatePairedDevice() is received. | 706 // Called when a response for CreatePairedDevice() is received. |
611 void OnCreatePairedDevice(const dbus::ObjectPath& object_path, | 707 void OnCreatePairedDevice(const dbus::ObjectPath& object_path, |
612 const DeviceCallback& callback, | 708 const DeviceCallback& callback, |
613 dbus::Response* response) { | 709 dbus::Response* response) { |
614 // Parse response. | 710 // Parse response. |
615 bool success = false; | 711 bool success = false; |
616 dbus::ObjectPath device_path; | 712 dbus::ObjectPath device_path; |
617 if (response != NULL) { | 713 if (response != NULL) { |
618 dbus::MessageReader reader(response); | 714 dbus::MessageReader reader(response); |
619 if (!reader.PopObjectPath(&device_path)) { | 715 if (!reader.PopObjectPath(&device_path)) { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 } | 877 } |
782 | 878 |
783 // BluetoothAdapterClient override. | 879 // BluetoothAdapterClient override. |
784 virtual void UnregisterAgent(const dbus::ObjectPath& object_path, | 880 virtual void UnregisterAgent(const dbus::ObjectPath& object_path, |
785 const dbus::ObjectPath& agent_path, | 881 const dbus::ObjectPath& agent_path, |
786 const AdapterCallback& callback) OVERRIDE { | 882 const AdapterCallback& callback) OVERRIDE { |
787 VLOG(1) << "UnregisterAgent: " << object_path.value() | 883 VLOG(1) << "UnregisterAgent: " << object_path.value() |
788 << " " << agent_path.value(); | 884 << " " << agent_path.value(); |
789 callback.Run(object_path, false); | 885 callback.Run(object_path, false); |
790 } | 886 } |
| 887 |
| 888 virtual void ReadLocalOutOfBandPairingData( |
| 889 const dbus::ObjectPath& object_path, |
| 890 const OutOfBandPairingDataCallback& callback) { |
| 891 VLOG(1) << "ReadLocalOutOfBandPairingData: " << object_path.value(); |
| 892 OutOfBandPairingData data; |
| 893 callback.Run(data, false); |
| 894 } |
| 895 |
| 896 virtual void AddRemoteOutOfBandPairingData( |
| 897 const dbus::ObjectPath& object_path, |
| 898 const std::string& address, |
| 899 const OutOfBandPairingData& data, |
| 900 const AdapterCallback& callback) { |
| 901 VLOG(1) << "AddRemoteData: " << object_path.value(); |
| 902 callback.Run(object_path, false); |
| 903 } |
| 904 |
| 905 virtual void RemoveRemoteOutOfBandPairingData( |
| 906 const dbus::ObjectPath& object_path, |
| 907 const std::string& address, |
| 908 const AdapterCallback& callback) { |
| 909 VLOG(1) << "RemoveRemoteData: " << object_path.value(); |
| 910 callback.Run(object_path, false); |
| 911 } |
791 }; | 912 }; |
792 | 913 |
793 BluetoothAdapterClient::BluetoothAdapterClient() { | 914 BluetoothAdapterClient::BluetoothAdapterClient() { |
794 } | 915 } |
795 | 916 |
796 BluetoothAdapterClient::~BluetoothAdapterClient() { | 917 BluetoothAdapterClient::~BluetoothAdapterClient() { |
797 } | 918 } |
798 | 919 |
799 BluetoothAdapterClient* BluetoothAdapterClient::Create( | 920 BluetoothAdapterClient* BluetoothAdapterClient::Create( |
800 DBusClientImplementationType type, | 921 DBusClientImplementationType type, |
801 dbus::Bus* bus, | 922 dbus::Bus* bus, |
802 BluetoothManagerClient* manager_client) { | 923 BluetoothManagerClient* manager_client) { |
803 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) | 924 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
804 return new BluetoothAdapterClientImpl(bus, manager_client); | 925 return new BluetoothAdapterClientImpl(bus, manager_client); |
805 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 926 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
806 return new BluetoothAdapterClientStubImpl(); | 927 return new BluetoothAdapterClientStubImpl(); |
807 } | 928 } |
808 | 929 |
809 } // namespace chromeos | 930 } // namespace chromeos |
OLD | NEW |