| Index: device/bluetooth/bluetooth_device_win.cc
|
| diff --git a/device/bluetooth/bluetooth_device_win.cc b/device/bluetooth/bluetooth_device_win.cc
|
| index db79c6aaf3ac3cc831d63fdd302658326d0e6522..67c2aec154c2aaaad1b89c6b3293f4f1c834572a 100644
|
| --- a/device/bluetooth/bluetooth_device_win.cc
|
| +++ b/device/bluetooth/bluetooth_device_win.cc
|
| @@ -7,6 +7,7 @@
|
| #include <string>
|
|
|
| #include "base/basictypes.h"
|
| +#include "base/containers/scoped_ptr_hash_map.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_vector.h"
|
| #include "base/sequenced_task_runner.h"
|
| @@ -26,9 +27,9 @@ const int kSdpBytesBufferSize = 1024;
|
| namespace device {
|
|
|
| BluetoothDeviceWin::BluetoothDeviceWin(
|
| - const BluetoothTaskManagerWin::DeviceState& state,
|
| - scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
|
| - scoped_refptr<BluetoothSocketThread> socket_thread,
|
| + const BluetoothTaskManagerWin::DeviceState& device_state,
|
| + const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner,
|
| + const scoped_refptr<BluetoothSocketThread>& socket_thread,
|
| net::NetLog* net_log,
|
| const net::NetLog::Source& net_log_source)
|
| : BluetoothDevice(),
|
| @@ -36,25 +37,100 @@ BluetoothDeviceWin::BluetoothDeviceWin(
|
| socket_thread_(socket_thread),
|
| net_log_(net_log),
|
| net_log_source_(net_log_source) {
|
| - name_ = state.name;
|
| - address_ = CanonicalizeAddress(state.address);
|
| - bluetooth_class_ = state.bluetooth_class;
|
| - visible_ = state.visible;
|
| - connected_ = state.connected;
|
| - paired_ = state.authenticated;
|
| + Update(device_state);
|
| +}
|
| +
|
| +BluetoothDeviceWin::~BluetoothDeviceWin() {
|
| +}
|
| +
|
| +void BluetoothDeviceWin::Update(
|
| + const BluetoothTaskManagerWin::DeviceState& device_state) {
|
| + address_ = device_state.address;
|
| + // Note: Callers are responsible for providing a canonicalized address.
|
| + DCHECK_EQ(address_, BluetoothDevice::CanonicalizeAddress(address_));
|
| + name_ = device_state.name;
|
| + bluetooth_class_ = device_state.bluetooth_class;
|
| + visible_ = device_state.visible;
|
| + connected_ = device_state.connected;
|
| + paired_ = device_state.authenticated;
|
| + UpdateServices(device_state);
|
| +}
|
| +
|
| +void BluetoothDeviceWin::UpdateServices(
|
| + const BluetoothTaskManagerWin::DeviceState& device_state) {
|
| + uuids_.clear();
|
| + service_record_list_.clear();
|
|
|
| for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator
|
| - iter = state.service_record_states.begin();
|
| - iter != state.service_record_states.end();
|
| + iter = device_state.service_record_states.begin();
|
| + iter != device_state.service_record_states.end();
|
| ++iter) {
|
| - BluetoothServiceRecordWin* service_record = new BluetoothServiceRecordWin(
|
| - state.address, (*iter)->name, (*iter)->sdp_bytes, (*iter)->gatt_uuid);
|
| + BluetoothServiceRecordWin* service_record =
|
| + new BluetoothServiceRecordWin(device_state.address,
|
| + (*iter)->name,
|
| + (*iter)->sdp_bytes,
|
| + (*iter)->gatt_uuid);
|
| service_record_list_.push_back(service_record);
|
| uuids_.push_back(service_record->uuid());
|
| }
|
| }
|
|
|
| -BluetoothDeviceWin::~BluetoothDeviceWin() {
|
| +bool BluetoothDeviceWin::IsEqual(
|
| + const BluetoothTaskManagerWin::DeviceState& device_state) {
|
| + if (address_ != device_state.address || name_ != device_state.name ||
|
| + bluetooth_class_ != device_state.bluetooth_class ||
|
| + visible_ != device_state.visible ||
|
| + connected_ != device_state.connected ||
|
| + paired_ != device_state.authenticated) {
|
| + return false;
|
| + }
|
| +
|
| + // Checks service collection
|
| + typedef std::set<BluetoothUUID> UUIDSet;
|
| + typedef base::ScopedPtrHashMap<std::string, BluetoothServiceRecordWin>
|
| + ServiceRecordMap;
|
| +
|
| + UUIDSet known_services;
|
| + for (UUIDList::const_iterator iter = uuids_.begin(); iter != uuids_.end();
|
| + ++iter) {
|
| + known_services.insert((*iter));
|
| + }
|
| +
|
| + UUIDSet new_services;
|
| + ServiceRecordMap new_service_records;
|
| + for (ScopedVector<BluetoothTaskManagerWin::ServiceRecordState>::const_iterator
|
| + iter = device_state.service_record_states.begin();
|
| + iter != device_state.service_record_states.end();
|
| + ++iter) {
|
| + BluetoothServiceRecordWin* service_record = new BluetoothServiceRecordWin(
|
| + address_, (*iter)->name, (*iter)->sdp_bytes, (*iter)->gatt_uuid);
|
| + new_services.insert(service_record->uuid());
|
| + new_service_records.set(
|
| + service_record->uuid().canonical_value(),
|
| + scoped_ptr<BluetoothServiceRecordWin>(service_record));
|
| + }
|
| +
|
| + UUIDSet removed_services =
|
| + base::STLSetDifference<UUIDSet>(known_services, new_services);
|
| + if (!removed_services.empty()) {
|
| + return false;
|
| + }
|
| + UUIDSet added_devices =
|
| + base::STLSetDifference<UUIDSet>(new_services, known_services);
|
| + if (!added_devices.empty()) {
|
| + return false;
|
| + }
|
| +
|
| + for (ServiceRecordList::const_iterator iter = service_record_list_.begin();
|
| + iter != service_record_list_.end();
|
| + ++iter) {
|
| + BluetoothServiceRecordWin* service_record = (*iter);
|
| + BluetoothServiceRecordWin* new_service_record =
|
| + new_service_records.get((*iter)->uuid().canonical_value());
|
| + if (!service_record->IsEqual(*new_service_record))
|
| + return false;
|
| + }
|
| + return true;
|
| }
|
|
|
| void BluetoothDeviceWin::SetVisible(bool visible) {
|
|
|