1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/bluetooth/bluetooth_discovery_session.h"
#include <memory>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/logging.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_discovery_filter.h"
namespace device {
BluetoothDiscoverySession::BluetoothDiscoverySession(
scoped_refptr<BluetoothAdapter> adapter,
std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter)
: status_(SessionStatus::PENDING_START),
is_stop_in_progress_(false),
adapter_(adapter),
discovery_filter_(discovery_filter.release()) {
DCHECK(adapter_.get());
}
BluetoothDiscoverySession::~BluetoothDiscoverySession() {
if (IsActive())
Stop();
}
bool BluetoothDiscoverySession::IsActive() const {
return status_ != SessionStatus::INACTIVE;
}
void BluetoothDiscoverySession::PendingSessionsStarting() {
if (status_ == SessionStatus::PENDING_START)
status_ = SessionStatus::STARTING;
}
void BluetoothDiscoverySession::StartingSessionsScanning() {
if (status_ == SessionStatus::STARTING)
status_ = SessionStatus::SCANNING;
}
void BluetoothDiscoverySession::Stop(base::OnceClosure success_callback,
ErrorCallback error_callback) {
if (!IsActive()) {
DVLOG(1) << "Discovery session not active. Cannot stop.";
std::move(error_callback).Run();
return;
}
if (is_stop_in_progress_) {
LOG(WARNING) << "Discovery session Stop in progress.";
std::move(error_callback).Run();
return;
}
is_stop_in_progress_ = true;
DVLOG(1) << "Stopping device discovery session.";
base::OnceClosure deactive_discovery_session =
base::BindOnce(&BluetoothDiscoverySession::DeactivateDiscoverySession,
weak_ptr_factory_.GetWeakPtr());
MarkAsInactive();
// Create a callback that runs
// BluetoothDiscoverySession::DeactivateDiscoverySession if the session
// still exists, but always runs success_callback.
base::OnceClosure discovery_session_removed_callback = base::BindOnce(
&BluetoothDiscoverySession::OnDiscoverySessionRemoved,
weak_ptr_factory_.GetWeakPtr(), std::move(deactive_discovery_session),
std::move(success_callback));
adapter_->RemoveDiscoverySession(
this, std::move(discovery_session_removed_callback),
base::BindOnce(
&BluetoothDiscoverySession::OnDiscoverySessionRemovalFailed,
weak_ptr_factory_.GetWeakPtr(), std::move(error_callback)));
}
// static
void BluetoothDiscoverySession::OnDiscoverySessionRemoved(
base::WeakPtr<BluetoothDiscoverySession> session,
base::OnceClosure deactivate_discovery_session,
base::OnceClosure success_callback) {
if (session)
session->is_stop_in_progress_ = false;
std::move(deactivate_discovery_session).Run();
std::move(success_callback).Run();
}
// static
void BluetoothDiscoverySession::OnDiscoverySessionRemovalFailed(
base::WeakPtr<BluetoothDiscoverySession> session,
base::OnceClosure error_callback,
UMABluetoothDiscoverySessionOutcome outcome) {
if (session)
session->is_stop_in_progress_ = false;
std::move(error_callback).Run();
}
void BluetoothDiscoverySession::DeactivateDiscoverySession() {
MarkAsInactive();
discovery_filter_.reset();
}
void BluetoothDiscoverySession::MarkAsInactive() {
status_ = SessionStatus::INACTIVE;
}
const BluetoothDiscoveryFilter* BluetoothDiscoverySession::GetDiscoveryFilter()
const {
return discovery_filter_.get();
}
base::WeakPtr<BluetoothDiscoverySession>
BluetoothDiscoverySession::GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
} // namespace device
|