Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / device / bluetooth / bluetooth_adapter_win.cc
index 8ef5470..cd673b0 100644 (file)
@@ -163,23 +163,20 @@ void BluetoothAdapterWin::DiscoveryStopped() {
 
 void BluetoothAdapterWin::CreateRfcommService(
     const BluetoothUUID& uuid,
-    int channel,
+    const ServiceOptions& options,
     const CreateServiceCallback& callback,
     const CreateServiceErrorCallback& error_callback) {
   scoped_refptr<BluetoothSocketWin> socket =
       BluetoothSocketWin::CreateBluetoothSocket(
-          ui_task_runner_,
-          socket_thread_,
-          NULL,
-          net::NetLog::Source());
-  socket->Listen(this, uuid, channel,
+          ui_task_runner_, socket_thread_);
+  socket->Listen(this, uuid, options,
                  base::Bind(callback, socket),
                  error_callback);
 }
 
 void BluetoothAdapterWin::CreateL2capService(
     const BluetoothUUID& uuid,
-    int psm,
+    const ServiceOptions& options,
     const CreateServiceCallback& callback,
     const CreateServiceErrorCallback& error_callback) {
   // TODO(keybuk): implement.
@@ -212,33 +209,76 @@ void BluetoothAdapterWin::AdapterStateChanged(
   }
 }
 
-void BluetoothAdapterWin::DevicesDiscovered(
+void BluetoothAdapterWin::DevicesPolled(
     const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) {
   DCHECK(thread_checker_.CalledOnValidThread());
+
+  // We are receiving a new list of all devices known to the system. Merge this
+  // new list with the list we know of (|devices_|) and raise corresponding
+  // DeviceAdded, DeviceRemoved and DeviceChanged events.
+
+  typedef std::set<std::string> DeviceAddressSet;
+  DeviceAddressSet known_devices;
+  for (DevicesMap::const_iterator iter = devices_.begin();
+       iter != devices_.end();
+       ++iter) {
+    known_devices.insert((*iter).first);
+  }
+
+  DeviceAddressSet new_devices;
   for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter =
            devices.begin();
        iter != devices.end();
        ++iter) {
-    if (discovered_devices_.find((*iter)->address) ==
-        discovered_devices_.end()) {
-      BluetoothDeviceWin device_win(
-          **iter, ui_task_runner_, socket_thread_, NULL, net::NetLog::Source());
-      FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_,
-                        DeviceAdded(this, &device_win));
-      discovered_devices_.insert((*iter)->address);
-    }
+    new_devices.insert((*iter)->address);
   }
-}
 
-void BluetoothAdapterWin::DevicesUpdated(
-    const ScopedVector<BluetoothTaskManagerWin::DeviceState>& devices) {
-  STLDeleteValues(&devices_);
+  // Process device removal first
+  DeviceAddressSet removed_devices =
+      base::STLSetDifference<DeviceAddressSet>(known_devices, new_devices);
+  for (DeviceAddressSet::const_iterator iter = removed_devices.begin();
+       iter != removed_devices.end();
+       ++iter) {
+    BluetoothDevice* device_win = devices_[(*iter)];
+    devices_.erase(*iter);
+    FOR_EACH_OBSERVER(BluetoothAdapter::Observer,
+                      observers_,
+                      DeviceRemoved(this, device_win));
+    delete device_win;
+  }
+
+  // Process added and (maybe) changed devices in one pass
+  DeviceAddressSet added_devices =
+      base::STLSetDifference<DeviceAddressSet>(new_devices, known_devices);
+  DeviceAddressSet changed_devices =
+      base::STLSetIntersection<DeviceAddressSet>(known_devices, new_devices);
   for (ScopedVector<BluetoothTaskManagerWin::DeviceState>::const_iterator iter =
            devices.begin();
        iter != devices.end();
        ++iter) {
-    devices_[(*iter)->address] = new BluetoothDeviceWin(
-        **iter, ui_task_runner_, socket_thread_, NULL, net::NetLog::Source());
+    BluetoothTaskManagerWin::DeviceState* device_state = (*iter);
+    if (added_devices.find(device_state->address) != added_devices.end()) {
+      BluetoothDeviceWin* device_win =
+          new BluetoothDeviceWin(*device_state,
+                                 ui_task_runner_,
+                                 socket_thread_,
+                                 NULL,
+                                 net::NetLog::Source());
+      devices_[device_state->address] = device_win;
+      FOR_EACH_OBSERVER(BluetoothAdapter::Observer,
+                        observers_,
+                        DeviceAdded(this, device_win));
+    } else if (changed_devices.find(device_state->address) !=
+               changed_devices.end()) {
+      BluetoothDeviceWin* device_win =
+          static_cast<BluetoothDeviceWin*>(devices_[device_state->address]);
+      if (!device_win->IsEqual(*device_state)) {
+        device_win->Update(*device_state);
+        FOR_EACH_OBSERVER(BluetoothAdapter::Observer,
+                          observers_,
+                          DeviceChanged(this, device_win));
+      }
+    }
   }
 }