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

Unified Diff: device/bluetooth/bluetooth_remote_gatt_characteristic.cc

Issue 2241263005: Revert of Implement BluetoothGattNotifySession::Stop on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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: device/bluetooth/bluetooth_remote_gatt_characteristic.cc
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 1eb318676320f459ef2ff4ee823bb7d1bccba695..fa96a9b984152d6c57ad23a0b17cd390ce434e7c 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -4,27 +4,17 @@
#include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "device/bluetooth/bluetooth_gatt_notify_session.h"
#include "device/bluetooth/bluetooth_remote_gatt_descriptor.h"
namespace device {
-BluetoothRemoteGattCharacteristic::BluetoothRemoteGattCharacteristic()
- : weak_ptr_factory_(this) {}
+BluetoothRemoteGattCharacteristic::BluetoothRemoteGattCharacteristic() {}
-BluetoothRemoteGattCharacteristic::~BluetoothRemoteGattCharacteristic() {
- while (!pending_notify_commands_.empty()) {
- pending_notify_commands_.front()->Cancel();
- }
-}
+BluetoothRemoteGattCharacteristic::~BluetoothRemoteGattCharacteristic() {}
std::vector<BluetoothRemoteGattDescriptor*>
BluetoothRemoteGattCharacteristic::GetDescriptorsByUUID(
- const BluetoothUUID& uuid) const {
+ const BluetoothUUID& uuid) {
std::vector<BluetoothRemoteGattDescriptor*> descriptors;
for (BluetoothRemoteGattDescriptor* descriptor : GetDescriptors()) {
if (descriptor->GetUUID() == uuid) {
@@ -34,338 +24,4 @@
return descriptors;
}
-base::WeakPtr<device::BluetoothRemoteGattCharacteristic>
-BluetoothRemoteGattCharacteristic::GetWeakPtr() {
- return weak_ptr_factory_.GetWeakPtr();
-}
-
-bool BluetoothRemoteGattCharacteristic::IsNotifying() const {
- return !notify_sessions_.empty();
-}
-
-BluetoothRemoteGattCharacteristic::NotifySessionCommand::NotifySessionCommand(
- const ExecuteCallback& execute_callback,
- const base::Closure& cancel_callback)
- : execute_callback_(execute_callback), cancel_callback_(cancel_callback) {}
-
-BluetoothRemoteGattCharacteristic::NotifySessionCommand::
- ~NotifySessionCommand() {}
-
-void BluetoothRemoteGattCharacteristic::NotifySessionCommand::Execute() {
- execute_callback_.Run(COMMAND_NONE, RESULT_SUCCESS,
- BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
-}
-
-void BluetoothRemoteGattCharacteristic::NotifySessionCommand::Execute(
- Type previous_command_type,
- Result previous_command_result,
- BluetoothRemoteGattService::GattErrorCode previous_command_error_code) {
- execute_callback_.Run(previous_command_type, previous_command_result,
- previous_command_error_code);
-}
-
-void BluetoothRemoteGattCharacteristic::NotifySessionCommand::Cancel() {
- cancel_callback_.Run();
-}
-
-void BluetoothRemoteGattCharacteristic::StartNotifySession(
- const NotifySessionCallback& callback,
- const ErrorCallback& error_callback) {
- NotifySessionCommand* command = new NotifySessionCommand(
- base::Bind(&BluetoothRemoteGattCharacteristic::ExecuteStartNotifySession,
- GetWeakPtr(), callback, error_callback),
- base::Bind(&BluetoothRemoteGattCharacteristic::CancelStartNotifySession,
- GetWeakPtr(),
- base::Bind(error_callback,
- BluetoothRemoteGattService::GATT_ERROR_FAILED)));
-
- pending_notify_commands_.push(std::unique_ptr<NotifySessionCommand>(command));
- if (pending_notify_commands_.size() == 1) {
- command->Execute();
- }
-}
-
-void BluetoothRemoteGattCharacteristic::ExecuteStartNotifySession(
- NotifySessionCallback callback,
- ErrorCallback error_callback,
- NotifySessionCommand::Type previous_command_type,
- NotifySessionCommand::Result previous_command_result,
- BluetoothRemoteGattService::GattErrorCode previous_command_error_code) {
- // If the command that was resolved immediately before this command was run,
- // this command should be resolved with the same result.
- if (previous_command_type == NotifySessionCommand::COMMAND_START) {
- if (previous_command_result == NotifySessionCommand::RESULT_SUCCESS) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionSuccess,
- GetWeakPtr(), callback));
- return;
- } else {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionError,
- GetWeakPtr(), error_callback, previous_command_error_code));
- return;
- }
- }
-
- // Check that the characteristic supports either notifications or
- // indications.
- Properties properties = GetProperties();
- bool hasNotify = (properties & PROPERTY_NOTIFY) != 0;
- bool hasIndicate = (properties & PROPERTY_INDICATE) != 0;
-
- if (!hasNotify && !hasIndicate) {
- LOG(ERROR) << "Characteristic needs NOTIFY or INDICATE";
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionError,
- GetWeakPtr(), error_callback,
- BluetoothRemoteGattService::GATT_ERROR_NOT_SUPPORTED));
- return;
- }
-
- // If the characteristic is already notifying, then we don't need to
- // subscribe again. All we need to do is call the success callback, which
- // will create and return a session object to the caller.
- if (IsNotifying()) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionSuccess,
- GetWeakPtr(), callback));
- return;
- }
-
-// After we migrate each platform to the new way of starting and stopping
-// notifications, we can remove them from this #if check. The goal is to get
-// rid of the entire check, and run SubscribeToNotifications on all
-// platforms.
-//
-// TODO(http://crbug.com/633191): Remove OS_MACOSX from this check.
-// TODO(http://crbug.com/636270): Remove OS_WIN from this check.
-// TODO(http://crbug.com/636275): Remove OS_CHROMEOS and OS_LINUX from this
-// check.
-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) || \
- defined(OS_WIN)
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStartNotifySessionError,
- GetWeakPtr(), error_callback,
- BluetoothRemoteGattService::GATT_ERROR_NOT_SUPPORTED));
-#else // !(defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) ||
- // defined(OS_WIN))
- // Find the Client Characteristic Configuration descriptor.
- std::vector<BluetoothRemoteGattDescriptor*> ccc_descriptor =
- GetDescriptorsByUUID(BluetoothRemoteGattDescriptor::
- ClientCharacteristicConfigurationUuid());
-
- if (ccc_descriptor.size() != 1u) {
- LOG(ERROR) << "Found " << ccc_descriptor.size()
- << " client characteristic configuration descriptors.";
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionError,
- GetWeakPtr(), error_callback,
- (ccc_descriptor.size() == 0)
- ? BluetoothRemoteGattService::GATT_ERROR_NOT_SUPPORTED
- : BluetoothRemoteGattService::GATT_ERROR_FAILED));
- return;
- }
-
- // Pass the Client Characteristic Configuration descriptor to
- // SubscribetoNotifications, which will write the correct value to it, and
- // do whatever else is needed to get the notifications flowing.
- SubscribeToNotifications(
- ccc_descriptor[0],
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStartNotifySessionSuccess,
- GetWeakPtr(), callback),
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStartNotifySessionError,
- GetWeakPtr(), error_callback));
-#endif // defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) ||
- // defined(OS_WIN)
-}
-
-void BluetoothRemoteGattCharacteristic::CancelStartNotifySession(
- base::Closure callback) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
- pending_notify_commands_.pop();
- callback.Run();
-}
-
-void BluetoothRemoteGattCharacteristic::OnStartNotifySessionSuccess(
- NotifySessionCallback callback) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
-
- std::unique_ptr<device::BluetoothGattNotifySession> notify_session(
- new BluetoothGattNotifySession(weak_ptr_factory_.GetWeakPtr()));
- notify_sessions_.insert(notify_session.get());
- callback.Run(std::move(notify_session));
-
- pending_notify_commands_.pop();
- if (!pending_notify_commands_.empty()) {
- pending_notify_commands_.front()->Execute(
- NotifySessionCommand::COMMAND_START,
- NotifySessionCommand::RESULT_SUCCESS,
- BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
- }
-}
-
-void BluetoothRemoteGattCharacteristic::OnStartNotifySessionError(
- ErrorCallback error_callback,
- BluetoothRemoteGattService::GattErrorCode error) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
-
- error_callback.Run(error);
-
- pending_notify_commands_.pop();
- if (!pending_notify_commands_.empty()) {
- pending_notify_commands_.front()->Execute(
- NotifySessionCommand::COMMAND_START, NotifySessionCommand::RESULT_ERROR,
- error);
- }
-}
-
-void BluetoothRemoteGattCharacteristic::StopNotifySession(
- BluetoothGattNotifySession* session,
- const base::Closure& callback) {
- NotifySessionCommand* command = new NotifySessionCommand(
- base::Bind(&BluetoothRemoteGattCharacteristic::ExecuteStopNotifySession,
- GetWeakPtr(), session, callback),
- callback /* cancel_callback */);
-
- pending_notify_commands_.push(std::unique_ptr<NotifySessionCommand>(command));
- if (pending_notify_commands_.size() == 1) {
- command->Execute();
- }
-}
-
-void BluetoothRemoteGattCharacteristic::ExecuteStopNotifySession(
- BluetoothGattNotifySession* session,
- base::Closure callback,
- NotifySessionCommand::Type previous_command_type,
- NotifySessionCommand::Result previous_command_result,
- BluetoothRemoteGattService::GattErrorCode previous_command_error_code) {
- std::set<BluetoothGattNotifySession*>::iterator session_iterator =
- notify_sessions_.find(session);
-
- // If the session does not even belong to this characteristic, we return an
- // error right away.
- if (session_iterator == notify_sessions_.end()) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStopNotifySessionError,
- GetWeakPtr(), session, callback,
- BluetoothRemoteGattService::GATT_ERROR_FAILED));
- return;
- }
-
- // If there are more active sessions, then we return right away.
- if (notify_sessions_.size() > 1) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(
- &BluetoothRemoteGattCharacteristic::OnStopNotifySessionSuccess,
- GetWeakPtr(), session, callback));
- return;
- }
-
-// After we migrate each platform to the new way of starting and stopping
-// notifications, we can remove them from this #if check. The goal is to get
-// rid of the entire check, and run SubscribeToNotifications on all
-// platforms.
-//
-// TODO(http://crbug.com/633191): Remove OS_MACOSX from this check.
-// TODO(http://crbug.com/636270): Remove OS_WIN from this check.
-// TODO(http://crbug.com/636275): Remove OS_CHROMEOS and OS_LINUX from this
-// check.
-#if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) || \
- defined(OS_WIN)
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStopNotifySessionError,
- GetWeakPtr(), session, callback,
- BluetoothRemoteGattService::GATT_ERROR_NOT_SUPPORTED));
-#else // !(defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) ||
- // defined(OS_WIN))
- // Find the Client Characteristic Configuration descriptor.
- std::vector<BluetoothRemoteGattDescriptor*> ccc_descriptor =
- GetDescriptorsByUUID(BluetoothRemoteGattDescriptor::
- ClientCharacteristicConfigurationUuid());
-
- if (ccc_descriptor.size() != 1u) {
- LOG(ERROR) << "Found " << ccc_descriptor.size()
- << " client characteristic configuration descriptors.";
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStopNotifySessionError,
- GetWeakPtr(), session, callback,
- BluetoothRemoteGattService::GATT_ERROR_FAILED));
- return;
- }
-
- UnsubscribeFromNotifications(
- ccc_descriptor[0],
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStopNotifySessionSuccess,
- GetWeakPtr(), session, callback),
- base::Bind(&BluetoothRemoteGattCharacteristic::OnStopNotifySessionError,
- GetWeakPtr(), session, callback));
-#endif // defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_MACOSX) ||
- // defined(OS_WIN)
-}
-
-void BluetoothRemoteGattCharacteristic::CancelStopNotifySession(
- base::Closure callback) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
- pending_notify_commands_.pop();
- callback.Run();
-}
-
-void BluetoothRemoteGattCharacteristic::OnStopNotifySessionSuccess(
- BluetoothGattNotifySession* session,
- base::Closure callback) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
-
- notify_sessions_.erase(session);
-
- callback.Run();
-
- pending_notify_commands_.pop();
- if (!pending_notify_commands_.empty()) {
- pending_notify_commands_.front()->Execute(
- NotifySessionCommand::COMMAND_STOP,
- NotifySessionCommand::RESULT_SUCCESS,
- BluetoothRemoteGattService::GATT_ERROR_UNKNOWN);
- }
-}
-
-void BluetoothRemoteGattCharacteristic::OnStopNotifySessionError(
- BluetoothGattNotifySession* session,
- base::Closure callback,
- BluetoothRemoteGattService::GattErrorCode error) {
- std::unique_ptr<NotifySessionCommand> command =
- std::move(pending_notify_commands_.front());
-
- notify_sessions_.erase(session);
-
- callback.Run();
-
- pending_notify_commands_.pop();
- if (!pending_notify_commands_.empty()) {
- pending_notify_commands_.front()->Execute(
- NotifySessionCommand::COMMAND_STOP, NotifySessionCommand::RESULT_ERROR,
- error);
- }
-}
-
} // namespace device

Powered by Google App Engine
This is Rietveld 408576698