Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: content/browser/bluetooth/frame_connected_bluetooth_devices.cc

Issue 1902153003: bluetooth: Move connect/disconnect to mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bluetooth-separate-connection-tests
Patch Set: Fix gypi Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/bluetooth/frame_connected_bluetooth_devices.cc
diff --git a/content/browser/bluetooth/frame_connected_bluetooth_devices.cc b/content/browser/bluetooth/frame_connected_bluetooth_devices.cc
new file mode 100644
index 0000000000000000000000000000000000000000..164579237b6effafeca34e8bc7e1296ca12b4133
--- /dev/null
+++ b/content/browser/bluetooth/frame_connected_bluetooth_devices.cc
@@ -0,0 +1,109 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/bluetooth/frame_connected_bluetooth_devices.h"
+
+#include "base/strings/string_util.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/browser/web_contents.h"
+#include "device/bluetooth/bluetooth_gatt_connection.h"
+
+namespace content {
+
+FrameConnectedBluetoothDevices::FrameConnectedBluetoothDevices(
+ RenderFrameHost* rfh)
+ : web_contents_impl_(static_cast<WebContentsImpl*>(
+ WebContents::FromRenderFrameHost(rfh))) {}
+
+FrameConnectedBluetoothDevices::~FrameConnectedBluetoothDevices() {
+ for (size_t i = 0; i < device_id_to_connection_map_.size(); i++) {
+ DecrementDevicesConnectedCount();
+ }
+}
+
+bool FrameConnectedBluetoothDevices::IsConnectedToDeviceWithId(
+ const std::string& device_id) {
+ auto connection_iter = device_id_to_connection_map_.find(device_id);
+ if (connection_iter == device_id_to_connection_map_.end()) {
+ return false;
+ }
+ // Owners of FrameConnectedBluetoothDevices should notify it when a device
+ // disconnects but currently Android and Mac don't notify of disconnection,
+ // so the map could get into a state where it's holding a stale connection.
+ // For this reason we return the value of IsConnected for the connection.
+ // TODO(ortuno): Always return true once Android and Mac notify of
+ // disconnection.
+ // http://crbug.com/607273
+ return connection_iter->second->IsConnected();
+}
+
+void FrameConnectedBluetoothDevices::Insert(
+ const std::string& device_id,
+ std::unique_ptr<device::BluetoothGattConnection> connection) {
+ auto connection_iter = device_id_to_connection_map_.find(device_id);
+ if (connection_iter != device_id_to_connection_map_.end()) {
+ // Owners of FrameConnectedBluetoothDevices should notify it when a device
+ // disconnects but currently Android and Mac don't notify of disconnection,
+ // so the map could get into a state where it's holding a stale connection.
+ // For this reason we check if the current connection is active and if
+ // not we remove it.
+ // TODO(ortuno): Remove once Android and Mac notify of disconnection.
+ // http://crbug.com/607273
+ if (!connection_iter->second->IsConnected()) {
+ device_address_to_id_map_.erase(
+ connection_iter->second->GetDeviceAddress());
+ device_id_to_connection_map_.erase(connection_iter);
+ DecrementDevicesConnectedCount();
+ } else {
+ // It's possible for WebBluetoothServiceImpl to issue two successive
+ // connection requests for which it would get two successive responses
+ // and consequently try to insert two BluetoothGattConnections for the
+ // same device. WebBluetoothServiceImpl should reject or queue connection
+ // requests if there is a pending connection already, but the platform
+ // abstraction doesn't currently support checking for pending connections.
+ // TODO(ortuno): CHECK that this never happens once the platform
+ // abstraction allows to check for pending connections.
+ // http://crbug.com/583544
+ return;
+ }
+ }
+ device_address_to_id_map_[connection->GetDeviceAddress()] = device_id;
+ device_id_to_connection_map_[device_id] = std::move(connection);
+ IncrementDevicesConnectedCount();
+}
+
+void FrameConnectedBluetoothDevices::CloseConnectionToDeviceWithId(
+ const std::string& device_id) {
+ auto connection_iter = device_id_to_connection_map_.find(device_id);
+ if (connection_iter == device_id_to_connection_map_.end()) {
+ return;
+ }
+ CHECK(device_address_to_id_map_.erase(
+ connection_iter->second->GetDeviceAddress()));
+ device_id_to_connection_map_.erase(connection_iter);
+ DecrementDevicesConnectedCount();
+}
+
+std::string FrameConnectedBluetoothDevices::CloseConnectionToDeviceWithAddress(
+ const std::string& device_address) {
+ auto device_address_iter = device_address_to_id_map_.find(device_address);
+ if (device_address_iter == device_address_to_id_map_.end()) {
+ return std::string();
+ }
+ std::string device_id = device_address_iter->second;
+ CHECK(device_address_to_id_map_.erase(device_address));
+ CHECK(device_id_to_connection_map_.erase(device_id));
+ DecrementDevicesConnectedCount();
+ return device_id;
+}
+
+void FrameConnectedBluetoothDevices::IncrementDevicesConnectedCount() {
+ web_contents_impl_->IncrementBluetoothConnectedDeviceCount();
+}
+
+void FrameConnectedBluetoothDevices::DecrementDevicesConnectedCount() {
+ web_contents_impl_->DecrementBluetoothConnectedDeviceCount();
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698