Commit 1b6a3edc authored by Michael Hansen's avatar Michael Hansen Committed by Commit Bot

[Nearby] Fix method ordering in NearbySharingServiceImpl.

This fixes the method ordering in nearby_sharing_service_impl.cc to
match the order they are declared in nearby_sharing_service_impl.h.

Change-Id: I9063aceb60ed831598dd9adbed7893ace0b7f110
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2405558
Commit-Queue: Michael Hansen <hansenmichael@google.com>
Reviewed-by: default avatarRyan Hansberry <hansberry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807231}
parent 37e4ba77
...@@ -445,20 +445,6 @@ NearbySharingServiceImpl::UnregisterSendSurface( ...@@ -445,20 +445,6 @@ NearbySharingServiceImpl::UnregisterSendSurface(
return StatusCodes::kOk; return StatusCodes::kOk;
} }
base::ObserverList<TransferUpdateCallback>&
NearbySharingServiceImpl::GetReceiveCallbacksFromState(
ReceiveSurfaceState state) {
switch (state) {
case ReceiveSurfaceState::kForeground:
return foreground_receive_callbacks_;
case ReceiveSurfaceState::kBackground:
return background_receive_callbacks_;
case ReceiveSurfaceState::kUnknown:
NOTREACHED();
return foreground_receive_callbacks_;
}
}
NearbySharingService::StatusCodes NearbySharingService::StatusCodes
NearbySharingServiceImpl::RegisterReceiveSurface( NearbySharingServiceImpl::RegisterReceiveSurface(
TransferUpdateCallback* transfer_callback, TransferUpdateCallback* transfer_callback,
...@@ -561,6 +547,72 @@ bool NearbySharingServiceImpl::IsInHighVisibility() { ...@@ -561,6 +547,72 @@ bool NearbySharingServiceImpl::IsInHighVisibility() {
return in_high_visibility; return in_high_visibility;
} }
NearbySharingService::StatusCodes NearbySharingServiceImpl::SendAttachments(
const ShareTarget& share_target,
std::vector<std::unique_ptr<Attachment>> attachments) {
if (!is_scanning_) {
NS_LOG(WARNING) << __func__
<< ": Failed to send attachments. Not scanning.";
return StatusCodes::kError;
}
// |is_scanning_| means at least one send transfer callback.
DCHECK(foreground_send_transfer_callbacks_.might_have_observers() ||
background_send_transfer_callbacks_.might_have_observers());
// |is_scanning_| and |is_transferring_| are mutually exclusive.
DCHECK(!is_transferring_);
ShareTargetInfo* info = GetShareTargetInfo(share_target);
if (!info || !info->endpoint_id()) {
// TODO(crbug.com/1119276): Support scanning for unknown share targets.
NS_LOG(WARNING) << __func__
<< ": Failed to send attachments. Unknown ShareTarget.";
return StatusCodes::kError;
}
ShareTarget share_target_copy = share_target;
for (std::unique_ptr<Attachment>& attachment : attachments) {
DCHECK(attachment);
attachment->MoveToShareTarget(share_target_copy);
}
if (!share_target_copy.has_attachments()) {
NS_LOG(WARNING) << __func__ << ": No attachments to send.";
return StatusCodes::kError;
}
// For sending advertisement from scanner, the request advertisement should
// always be visible to everyone.
base::Optional<std::vector<uint8_t>> endpoint_info =
CreateEndpointInfo(local_device_data_manager_->GetDeviceName());
if (!endpoint_info) {
NS_LOG(WARNING) << __func__ << ": Could not create local endpoint info.";
return StatusCodes::kError;
}
info->set_transfer_update_callback(std::make_unique<TransferUpdateDecorator>(
base::BindRepeating(&NearbySharingServiceImpl::OnOutgoingTransferUpdate,
weak_ptr_factory_.GetWeakPtr())));
OnTransferStarted(/*is_incoming=*/false);
is_connecting_ = true;
InvalidateSendSurfaceState();
// Send process initialized successfully, from now on status updated will be
// sent out via OnOutgoingTransferUpdate().
info->transfer_update_callback()->OnTransferUpdate(
share_target_copy, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kConnecting)
.build());
CreatePayloads(std::move(share_target_copy),
base::BindOnce(&NearbySharingServiceImpl::OnCreatePayloads,
weak_ptr_factory_.GetWeakPtr(),
std::move(*endpoint_info)));
return StatusCodes::kOk;
}
void NearbySharingServiceImpl::Accept( void NearbySharingServiceImpl::Accept(
const ShareTarget& share_target, const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) { StatusCodesCallback status_codes_callback) {
...@@ -646,6 +698,24 @@ NearbyShareSettings* NearbySharingServiceImpl::GetSettings() { ...@@ -646,6 +698,24 @@ NearbyShareSettings* NearbySharingServiceImpl::GetSettings() {
return &settings_; return &settings_;
} }
NearbyShareHttpNotifier* NearbySharingServiceImpl::GetHttpNotifier() {
return &nearby_share_http_notifier_;
}
NearbyShareLocalDeviceDataManager*
NearbySharingServiceImpl::GetLocalDeviceDataManager() {
return local_device_data_manager_.get();
}
NearbyShareContactManager* NearbySharingServiceImpl::GetContactManager() {
return contact_manager_.get();
}
NearbyShareCertificateManager*
NearbySharingServiceImpl::GetCertificateManager() {
return certificate_manager_.get();
}
void NearbySharingServiceImpl::OnNearbyProfileChanged(Profile* profile) { void NearbySharingServiceImpl::OnNearbyProfileChanged(Profile* profile) {
// TODO(crbug.com/1084576): Notify UI about the new active profile. // TODO(crbug.com/1084576): Notify UI about the new active profile.
if (profile) { if (profile) {
...@@ -700,6 +770,65 @@ void NearbySharingServiceImpl::OnIncomingConnection( ...@@ -700,6 +770,65 @@ void NearbySharingServiceImpl::OnIncomingConnection(
std::move(placeholder_share_target))); std::move(placeholder_share_target)));
} }
void NearbySharingServiceImpl::FlushMojoForTesting() {
settings_receiver_.FlushForTesting();
}
void NearbySharingServiceImpl::OnEnabledChanged(bool enabled) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (enabled) {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing enabled!";
local_device_data_manager_->Start();
contact_manager_->Start();
certificate_manager_->Start();
} else {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing disabled!";
StopAdvertising();
StopScanning();
nearby_connections_manager_->Shutdown();
local_device_data_manager_->Stop();
contact_manager_->Stop();
certificate_manager_->Stop();
}
InvalidateSurfaceState();
}
void NearbySharingServiceImpl::OnDeviceNameChanged(
const std::string& device_name) {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing device name changed to "
<< device_name;
// TODO(vecore): handle device name change
SetDefaultDeviceNameIfEmpty();
}
void NearbySharingServiceImpl::OnDataUsageChanged(DataUsage data_usage) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing data usage changed to "
<< data_usage;
if (advertising_power_level_ != PowerLevel::kUnknown)
StopAdvertising();
InvalidateSurfaceState();
}
void NearbySharingServiceImpl::OnVisibilityChanged(Visibility new_visibility) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing visibility changed to "
<< new_visibility;
if (advertising_power_level_ != PowerLevel::kUnknown)
StopAdvertising();
InvalidateSurfaceState();
}
void NearbySharingServiceImpl::OnAllowedContactsChanged(
const std::vector<std::string>& allowed_contacts) {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing visible contacts changed";
// TODO(vecore): handle visible contacts change
}
void NearbySharingServiceImpl::OnEndpointDiscovered( void NearbySharingServiceImpl::OnEndpointDiscovered(
const std::string& endpoint_id, const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info) { const std::vector<uint8_t>& endpoint_info) {
...@@ -720,81 +849,6 @@ void NearbySharingServiceImpl::OnEndpointDiscovered( ...@@ -720,81 +849,6 @@ void NearbySharingServiceImpl::OnEndpointDiscovered(
weak_ptr_factory_.GetWeakPtr(), endpoint_id)); weak_ptr_factory_.GetWeakPtr(), endpoint_id));
} }
void NearbySharingServiceImpl::OnOutgoingAdvertisementDecoded(
const std::string& endpoint_id,
sharing::mojom::AdvertisementPtr advertisement) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!advertisement) {
NS_LOG(VERBOSE) << __func__
<< ": Failed to parse discovered advertisement.";
return;
}
// Now we will report endpoints met before in NearbyConnectionsManager.
// Check outgoingShareTargetInfoMap first and pass the same shareTarget if we
// found one.
// Looking for the ShareTarget based on endpoint id.
if (outgoing_share_target_map_.find(endpoint_id) !=
outgoing_share_target_map_.end()) {
return;
}
// Once we get the advertisement, the first thing to do is decrypt the
// certificate.
NearbyShareEncryptedMetadataKey encrypted_metadata_key(
advertisement->salt, advertisement->encrypted_metadata_key);
GetCertificateManager()->GetDecryptedPublicCertificate(
std::move(encrypted_metadata_key),
base::BindOnce(&NearbySharingServiceImpl::OnOutgoingDecryptedCertificate,
weak_ptr_factory_.GetWeakPtr(), endpoint_id,
std::move(advertisement)));
}
void NearbySharingServiceImpl::OnOutgoingDecryptedCertificate(
const std::string& endpoint_id,
sharing::mojom::AdvertisementPtr advertisement,
base::Optional<NearbyShareDecryptedPublicCertificate> certificate) {
// Check again for this endpoint id, to avoid race conditions.
if (outgoing_share_target_map_.find(endpoint_id) !=
outgoing_share_target_map_.end()) {
return;
}
// The certificate provides the device name, in order to create a ShareTarget
// to represent this remote device.
base::Optional<ShareTarget> share_target = CreateShareTarget(
endpoint_id, std::move(advertisement), std::move(certificate),
/*is_incoming=*/false);
if (!share_target) {
NS_LOG(VERBOSE) << __func__
<< ": Failed to convert advertisement to share target from "
"discovered advertisement. Ignoring endpoint.";
return;
}
// Update the endpoint id for the share target.
NS_LOG(VERBOSE) << __func__
<< ": An endpoint has been discovered, with an advertisement "
"containing a valid share target.";
// Notifies the user that we discovered a device.
for (ShareTargetDiscoveredCallback& discovery_callback :
foreground_send_discovery_callbacks_) {
discovery_callback.OnShareTargetDiscovered(*share_target);
}
for (ShareTargetDiscoveredCallback& discovery_callback :
background_send_discovery_callbacks_) {
discovery_callback.OnShareTargetDiscovered(*share_target);
}
NS_LOG(VERBOSE) << __func__ << ": Reported OnShareTargetDiscovered "
<< (base::Time::Now() - scanning_start_timestamp_);
// TODO(crbug/1108348) CachingManager should cache known and non-external
// share targets.
}
void NearbySharingServiceImpl::OnEndpointLost(const std::string& endpoint_id) { void NearbySharingServiceImpl::OnEndpointLost(const std::string& endpoint_id) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!is_scanning_) { if (!is_scanning_) {
...@@ -841,45 +895,36 @@ void NearbySharingServiceImpl::OnLockStateChanged(bool locked) { ...@@ -841,45 +895,36 @@ void NearbySharingServiceImpl::OnLockStateChanged(bool locked) {
InvalidateSurfaceState(); InvalidateSurfaceState();
} }
void NearbySharingServiceImpl::OnEnabledChanged(bool enabled) { void NearbySharingServiceImpl::AdapterPresentChanged(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); device::BluetoothAdapter* adapter,
if (enabled) { bool present) {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing enabled!"; NS_LOG(VERBOSE) << "Bluetooth present changed: " << present;
local_device_data_manager_->Start();
contact_manager_->Start();
certificate_manager_->Start();
} else {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing disabled!";
StopAdvertising();
StopScanning();
nearby_connections_manager_->Shutdown();
local_device_data_manager_->Stop();
contact_manager_->Stop();
certificate_manager_->Stop();
}
InvalidateSurfaceState(); InvalidateSurfaceState();
if (!present)
StopFastInitiationAdvertising();
} }
void NearbySharingServiceImpl::FlushMojoForTesting() { void NearbySharingServiceImpl::AdapterPoweredChanged(
settings_receiver_.FlushForTesting(); device::BluetoothAdapter* adapter,
} bool powered) {
NS_LOG(VERBOSE) << "Bluetooth powered changed: " << powered;
NearbyShareHttpNotifier* NearbySharingServiceImpl::GetHttpNotifier() { InvalidateSurfaceState();
return &nearby_share_http_notifier_; if (!powered)
} StopFastInitiationAdvertising();
NearbyShareLocalDeviceDataManager*
NearbySharingServiceImpl::GetLocalDeviceDataManager() {
return local_device_data_manager_.get();
}
NearbyShareContactManager* NearbySharingServiceImpl::GetContactManager() {
return contact_manager_.get();
} }
NearbyShareCertificateManager* base::ObserverList<TransferUpdateCallback>&
NearbySharingServiceImpl::GetCertificateManager() { NearbySharingServiceImpl::GetReceiveCallbacksFromState(
return certificate_manager_.get(); ReceiveSurfaceState state) {
switch (state) {
case ReceiveSurfaceState::kForeground:
return foreground_receive_callbacks_;
case ReceiveSurfaceState::kBackground:
return background_receive_callbacks_;
case ReceiveSurfaceState::kUnknown:
NOTREACHED();
return foreground_receive_callbacks_;
}
} }
bool NearbySharingServiceImpl::IsVisibleInBackground(Visibility visibility) { bool NearbySharingServiceImpl::IsVisibleInBackground(Visibility visibility) {
...@@ -887,27 +932,6 @@ bool NearbySharingServiceImpl::IsVisibleInBackground(Visibility visibility) { ...@@ -887,27 +932,6 @@ bool NearbySharingServiceImpl::IsVisibleInBackground(Visibility visibility) {
visibility == Visibility::kSelectedContacts; visibility == Visibility::kSelectedContacts;
} }
void NearbySharingServiceImpl::OnVisibilityChanged(Visibility new_visibility) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing visibility changed to "
<< new_visibility;
if (advertising_power_level_ != PowerLevel::kUnknown)
StopAdvertising();
InvalidateSurfaceState();
}
void NearbySharingServiceImpl::OnDataUsageChanged(DataUsage data_usage) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing data usage changed to "
<< data_usage;
if (advertising_power_level_ != PowerLevel::kUnknown)
StopAdvertising();
InvalidateSurfaceState();
}
const base::Optional<std::vector<uint8_t>> const base::Optional<std::vector<uint8_t>>
NearbySharingServiceImpl::CreateEndpointInfo( NearbySharingServiceImpl::CreateEndpointInfo(
const base::Optional<std::string>& device_name) { const base::Optional<std::string>& device_name) {
...@@ -946,19 +970,27 @@ NearbySharingServiceImpl::CreateEndpointInfo( ...@@ -946,19 +970,27 @@ NearbySharingServiceImpl::CreateEndpointInfo(
} }
} }
void NearbySharingServiceImpl::OnDeviceNameChanged( void NearbySharingServiceImpl::GetBluetoothAdapter() {
const std::string& device_name) { auto* adapter_factory = device::BluetoothAdapterFactory::Get();
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing device name changed to " if (!adapter_factory->IsBluetoothSupported())
<< device_name; return;
// TODO(vecore): handle device name change
SetDefaultDeviceNameIfEmpty(); // Because this will be called from the constructor, GetAdapter() may call
// OnGetBluetoothAdapter() immediately which can cause problems during tests
// since the class is not fully constructed yet.
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(
&device::BluetoothAdapterFactory::GetAdapter,
base::Unretained(adapter_factory),
base::BindOnce(&NearbySharingServiceImpl::OnGetBluetoothAdapter,
weak_ptr_factory_.GetWeakPtr())));
} }
void NearbySharingServiceImpl::OnAllowedContactsChanged( void NearbySharingServiceImpl::OnGetBluetoothAdapter(
const std::vector<std::string>& allowed_contacts) { scoped_refptr<device::BluetoothAdapter> adapter) {
NS_LOG(VERBOSE) << __func__ << ": Nearby sharing visible contacts changed"; bluetooth_adapter_ = adapter;
// TODO(vecore): handle visible contacts change bluetooth_adapter_->AddObserver(this);
} }
void NearbySharingServiceImpl::StartFastInitiationAdvertising() { void NearbySharingServiceImpl::StartFastInitiationAdvertising() {
...@@ -994,6 +1026,18 @@ void NearbySharingServiceImpl::StartFastInitiationAdvertising() { ...@@ -994,6 +1026,18 @@ void NearbySharingServiceImpl::StartFastInitiationAdvertising() {
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void NearbySharingServiceImpl::OnStartFastInitiationAdvertising() {
// TODO(hansenmichael): Do not invoke
// |register_send_surface_callback_| until Nearby Connections
// scanning is kicked off.
NS_LOG(VERBOSE) << "Started advertising FastInitiation.";
}
void NearbySharingServiceImpl::OnStartFastInitiationAdvertisingError() {
fast_initiation_manager_.reset();
NS_LOG(ERROR) << "Failed to start FastInitiation advertising.";
}
void NearbySharingServiceImpl::StopFastInitiationAdvertising() { void NearbySharingServiceImpl::StopFastInitiationAdvertising() {
if (!fast_initiation_manager_) { if (!fast_initiation_manager_) {
NS_LOG(INFO) << "Can't stop advertising FastInitiation. Not advertising."; NS_LOG(INFO) << "Can't stop advertising FastInitiation. Not advertising.";
...@@ -1005,44 +1049,84 @@ void NearbySharingServiceImpl::StopFastInitiationAdvertising() { ...@@ -1005,44 +1049,84 @@ void NearbySharingServiceImpl::StopFastInitiationAdvertising() {
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void NearbySharingServiceImpl::GetBluetoothAdapter() { void NearbySharingServiceImpl::OnStopFastInitiationAdvertising() {
auto* adapter_factory = device::BluetoothAdapterFactory::Get(); fast_initiation_manager_.reset();
if (!adapter_factory->IsBluetoothSupported()) NS_LOG(VERBOSE) << "Stopped advertising FastInitiation";
}
void NearbySharingServiceImpl::OnOutgoingAdvertisementDecoded(
const std::string& endpoint_id,
sharing::mojom::AdvertisementPtr advertisement) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!advertisement) {
NS_LOG(VERBOSE) << __func__
<< ": Failed to parse discovered advertisement.";
return; return;
}
// Because this will be called from the constructor, GetAdapter() may call // Now we will report endpoints met before in NearbyConnectionsManager.
// OnGetBluetoothAdapter() immediately which can cause problems during tests // Check outgoingShareTargetInfoMap first and pass the same shareTarget if we
// since the class is not fully constructed yet. // found one.
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(
&device::BluetoothAdapterFactory::GetAdapter,
base::Unretained(adapter_factory),
base::BindOnce(&NearbySharingServiceImpl::OnGetBluetoothAdapter,
weak_ptr_factory_.GetWeakPtr())));
}
void NearbySharingServiceImpl::OnGetBluetoothAdapter( // Looking for the ShareTarget based on endpoint id.
scoped_refptr<device::BluetoothAdapter> adapter) { if (outgoing_share_target_map_.find(endpoint_id) !=
bluetooth_adapter_ = adapter; outgoing_share_target_map_.end()) {
bluetooth_adapter_->AddObserver(this); return;
} }
void NearbySharingServiceImpl::OnStartFastInitiationAdvertising() { // Once we get the advertisement, the first thing to do is decrypt the
// TODO(hansenmichael): Do not invoke // certificate.
// |register_send_surface_callback_| until Nearby Connections NearbyShareEncryptedMetadataKey encrypted_metadata_key(
// scanning is kicked off. advertisement->salt, advertisement->encrypted_metadata_key);
NS_LOG(VERBOSE) << "Started advertising FastInitiation."; GetCertificateManager()->GetDecryptedPublicCertificate(
std::move(encrypted_metadata_key),
base::BindOnce(&NearbySharingServiceImpl::OnOutgoingDecryptedCertificate,
weak_ptr_factory_.GetWeakPtr(), endpoint_id,
std::move(advertisement)));
} }
void NearbySharingServiceImpl::OnStartFastInitiationAdvertisingError() { void NearbySharingServiceImpl::OnOutgoingDecryptedCertificate(
fast_initiation_manager_.reset(); const std::string& endpoint_id,
NS_LOG(ERROR) << "Failed to start FastInitiation advertising."; sharing::mojom::AdvertisementPtr advertisement,
} base::Optional<NearbyShareDecryptedPublicCertificate> certificate) {
// Check again for this endpoint id, to avoid race conditions.
if (outgoing_share_target_map_.find(endpoint_id) !=
outgoing_share_target_map_.end()) {
return;
}
void NearbySharingServiceImpl::OnStopFastInitiationAdvertising() { // The certificate provides the device name, in order to create a ShareTarget
fast_initiation_manager_.reset(); // to represent this remote device.
NS_LOG(VERBOSE) << "Stopped advertising FastInitiation"; base::Optional<ShareTarget> share_target = CreateShareTarget(
endpoint_id, std::move(advertisement), std::move(certificate),
/*is_incoming=*/false);
if (!share_target) {
NS_LOG(VERBOSE) << __func__
<< ": Failed to convert advertisement to share target from "
"discovered advertisement. Ignoring endpoint.";
return;
}
// Update the endpoint id for the share target.
NS_LOG(VERBOSE) << __func__
<< ": An endpoint has been discovered, with an advertisement "
"containing a valid share target.";
// Notifies the user that we discovered a device.
for (ShareTargetDiscoveredCallback& discovery_callback :
foreground_send_discovery_callbacks_) {
discovery_callback.OnShareTargetDiscovered(*share_target);
}
for (ShareTargetDiscoveredCallback& discovery_callback :
background_send_discovery_callbacks_) {
discovery_callback.OnShareTargetDiscovered(*share_target);
}
NS_LOG(VERBOSE) << __func__ << ": Reported OnShareTargetDiscovered "
<< (base::Time::Now() - scanning_start_timestamp_);
// TODO(crbug/1108348) CachingManager should cache known and non-external
// share targets.
} }
bool NearbySharingServiceImpl::IsBluetoothPresent() const { bool NearbySharingServiceImpl::IsBluetoothPresent() const {
...@@ -1066,24 +1150,6 @@ bool NearbySharingServiceImpl::HasAvailableConnectionMediums() { ...@@ -1066,24 +1150,6 @@ bool NearbySharingServiceImpl::HasAvailableConnectionMediums() {
net::NetworkChangeNotifier::ConnectionType::CONNECTION_ETHERNET); net::NetworkChangeNotifier::ConnectionType::CONNECTION_ETHERNET);
} }
void NearbySharingServiceImpl::AdapterPresentChanged(
device::BluetoothAdapter* adapter,
bool present) {
NS_LOG(VERBOSE) << "Bluetooth present changed: " << present;
InvalidateSurfaceState();
if (!present)
StopFastInitiationAdvertising();
}
void NearbySharingServiceImpl::AdapterPoweredChanged(
device::BluetoothAdapter* adapter,
bool powered) {
NS_LOG(VERBOSE) << "Bluetooth powered changed: " << powered;
InvalidateSurfaceState();
if (!powered)
StopFastInitiationAdvertising();
}
void NearbySharingServiceImpl::InvalidateSurfaceState() { void NearbySharingServiceImpl::InvalidateSurfaceState() {
InvalidateSendSurfaceState(); InvalidateSendSurfaceState();
InvalidateReceiveSurfaceState(); InvalidateReceiveSurfaceState();
...@@ -1122,6 +1188,73 @@ bool NearbySharingServiceImpl::ShouldStopNearbyProcess() { ...@@ -1122,6 +1188,73 @@ bool NearbySharingServiceImpl::ShouldStopNearbyProcess() {
return true; return true;
} }
void NearbySharingServiceImpl::InvalidateSendSurfaceState() {
InvalidateScanningState();
// TODO(b/161889067) InvalidateFastInitAdvertisement();
}
void NearbySharingServiceImpl::InvalidateScanningState() {
// Nothing to do if we're shutting down the profile.
if (!profile_)
return;
if (!process_manager_->IsActiveProfile(profile_)) {
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because profile was not active: "
<< profile_->GetProfileUserName();
StopScanning();
return;
}
// Screen is off. Do no work.
if (is_screen_locked_) {
StopScanning();
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because the screen is locked.";
return;
}
if (!HasAvailableConnectionMediums()) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping scanning because both bluetooth and wifi LAN are "
"disabled.";
return;
}
// Nearby Sharing is disabled. Don't advertise.
if (!settings_.GetEnabled()) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping discovery because Nearby Sharing is disabled.";
return;
}
if (is_transferring_ || is_connecting_) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping discovery because we're currently in the midst of a "
"transfer.";
return;
}
if (!foreground_send_transfer_callbacks_.might_have_observers()) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping discovery because no scanning surface has been "
"registered.";
return;
}
// Screen is on, Bluetooth is enabled, and Nearby Sharing is enabled! Start
// discovery.
StartScanning();
}
void NearbySharingServiceImpl::InvalidateReceiveSurfaceState() { void NearbySharingServiceImpl::InvalidateReceiveSurfaceState() {
InvalidateAdvertisingState(); InvalidateAdvertisingState();
// TODO(b/161889067) InvalidateFastInitScan(); // TODO(b/161889067) InvalidateFastInitScan();
...@@ -1240,122 +1373,40 @@ void NearbySharingServiceImpl::InvalidateAdvertisingState() { ...@@ -1240,122 +1373,40 @@ void NearbySharingServiceImpl::InvalidateAdvertisingState() {
base::Optional<std::vector<uint8_t>> endpoint_info = base::Optional<std::vector<uint8_t>> endpoint_info =
CreateEndpointInfo(device_name); CreateEndpointInfo(device_name);
if (!endpoint_info) { if (!endpoint_info) {
NS_LOG(VERBOSE) << __func__ NS_LOG(VERBOSE) << __func__
<< ": Unable to advertise since could not parse the " << ": Unable to advertise since could not parse the "
"endpoint info from the advertisement."; "endpoint info from the advertisement.";
return;
}
nearby_connections_manager_->StartAdvertising(
*endpoint_info,
/* listener= */ this, power_level, data_usage,
base::BindOnce(&NearbySharingServiceImpl::OnStartAdvertisingResult,
weak_ptr_factory_.GetWeakPtr(), device_name.has_value()));
advertising_power_level_ = power_level;
NS_LOG(VERBOSE) << __func__
<< ": StartAdvertising requested over Nearby Connections: "
<< " power level: " << PowerLevelToString(power_level)
<< " visibility: " << settings_.GetVisibility()
<< " data usage: " << data_usage << " device name: "
<< device_name.value_or("** no device name **");
return;
}
void NearbySharingServiceImpl::OnStartAdvertisingResult(
bool used_device_name,
NearbyConnectionsManager::ConnectionsStatus status) {
if (status == NearbyConnectionsManager::ConnectionsStatus::kSuccess) {
NS_LOG(VERBOSE)
<< "StartAdvertising over Nearby Connections was successful.";
SetInHighVisibility(used_device_name);
} else {
NS_LOG(ERROR) << "StartAdvertising over Nearby Connections failed: "
<< NearbyConnectionsManager::ConnectionsStatusToString(
status);
SetInHighVisibility(false);
}
}
void NearbySharingServiceImpl::StopAdvertising() {
SetInHighVisibility(false);
if (advertising_power_level_ == PowerLevel::kUnknown) {
NS_LOG(VERBOSE)
<< __func__
<< ": Failed to stop advertising because we weren't advertising";
return;
}
nearby_connections_manager_->StopAdvertising();
advertising_power_level_ = PowerLevel::kUnknown;
NS_LOG(VERBOSE) << __func__ << ": Advertising has stopped";
}
void NearbySharingServiceImpl::InvalidateSendSurfaceState() {
InvalidateScanningState();
// TODO(b/161889067) InvalidateFastInitAdvertisement();
}
void NearbySharingServiceImpl::InvalidateScanningState() {
// Nothing to do if we're shutting down the profile.
if (!profile_)
return;
if (!process_manager_->IsActiveProfile(profile_)) {
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because profile was not active: "
<< profile_->GetProfileUserName();
StopScanning();
return;
}
// Screen is off. Do no work.
if (is_screen_locked_) {
StopScanning();
NS_LOG(VERBOSE) << __func__
<< ": Stopping discovery because the screen is locked.";
return;
}
if (!HasAvailableConnectionMediums()) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping scanning because both bluetooth and wifi LAN are "
"disabled.";
return;
}
// Nearby Sharing is disabled. Don't advertise.
if (!settings_.GetEnabled()) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping discovery because Nearby Sharing is disabled.";
return;
}
if (is_transferring_ || is_connecting_) {
StopScanning();
NS_LOG(VERBOSE)
<< __func__
<< ": Stopping discovery because we're currently in the midst of a "
"transfer.";
return; return;
} }
if (!foreground_send_transfer_callbacks_.might_have_observers()) { nearby_connections_manager_->StartAdvertising(
StopScanning(); *endpoint_info,
/* listener= */ this, power_level, data_usage,
base::BindOnce(&NearbySharingServiceImpl::OnStartAdvertisingResult,
weak_ptr_factory_.GetWeakPtr(), device_name.has_value()));
advertising_power_level_ = power_level;
NS_LOG(VERBOSE) << __func__
<< ": StartAdvertising requested over Nearby Connections: "
<< " power level: " << PowerLevelToString(power_level)
<< " visibility: " << settings_.GetVisibility()
<< " data usage: " << data_usage << " device name: "
<< device_name.value_or("** no device name **");
return;
}
void NearbySharingServiceImpl::StopAdvertising() {
SetInHighVisibility(false);
if (advertising_power_level_ == PowerLevel::kUnknown) {
NS_LOG(VERBOSE) NS_LOG(VERBOSE)
<< __func__ << __func__
<< ": Stopping discovery because no scanning surface has been " << ": Failed to stop advertising because we weren't advertising";
"registered.";
return; return;
} }
// Screen is on, Bluetooth is enabled, and Nearby Sharing is enabled! Start nearby_connections_manager_->StopAdvertising();
// discovery. advertising_power_level_ = PowerLevel::kUnknown;
StartScanning(); NS_LOG(VERBOSE) << __func__ << ": Advertising has stopped";
} }
void NearbySharingServiceImpl::StartScanning() { void NearbySharingServiceImpl::StartScanning() {
...@@ -1434,68 +1485,6 @@ NearbySharingService::StatusCodes NearbySharingServiceImpl::StopScanning() { ...@@ -1434,68 +1485,6 @@ NearbySharingService::StatusCodes NearbySharingServiceImpl::StopScanning() {
return StatusCodes::kOk; return StatusCodes::kOk;
} }
void NearbySharingServiceImpl::OnIncomingTransferUpdate(
const ShareTarget& share_target,
const TransferMetadata& metadata) {
if (metadata.status() != TransferMetadata::Status::kCancelled &&
metadata.status() != TransferMetadata::Status::kRejected) {
last_incoming_metadata_ =
std::make_pair(share_target, TransferMetadataBuilder::Clone(metadata)
.set_is_original(false)
.build());
} else {
last_incoming_metadata_ = base::nullopt;
}
if (metadata.is_final_status()) {
OnTransferComplete();
} else if (metadata.status() ==
TransferMetadata::Status::kAwaitingLocalConfirmation) {
OnTransferStarted(/*is_incoming=*/true);
}
base::ObserverList<TransferUpdateCallback>& transfer_callbacks =
foreground_receive_callbacks_.might_have_observers()
? foreground_receive_callbacks_
: background_receive_callbacks_;
for (TransferUpdateCallback& callback : transfer_callbacks) {
callback.OnTransferUpdate(share_target, metadata);
}
}
void NearbySharingServiceImpl::OnOutgoingTransferUpdate(
const ShareTarget& share_target,
const TransferMetadata& metadata) {
if (metadata.is_final_status()) {
is_connecting_ = false;
OnTransferComplete();
} else if (metadata.status() == TransferMetadata::Status::kMediaDownloading ||
metadata.status() ==
TransferMetadata::Status::kAwaitingLocalConfirmation) {
is_connecting_ = false;
OnTransferStarted(/*is_incoming=*/false);
}
bool has_foreground_send_surface =
foreground_send_transfer_callbacks_.might_have_observers();
base::ObserverList<TransferUpdateCallback>& transfer_callbacks =
has_foreground_send_surface ? foreground_send_transfer_callbacks_
: background_send_transfer_callbacks_;
for (TransferUpdateCallback& callback : transfer_callbacks)
callback.OnTransferUpdate(share_target, metadata);
if (has_foreground_send_surface && metadata.is_final_status()) {
last_outgoing_metadata_ = base::nullopt;
} else {
last_outgoing_metadata_ =
std::make_pair(share_target, TransferMetadataBuilder::Clone(metadata)
.set_is_original(false)
.build());
}
}
void NearbySharingServiceImpl::OnTransferComplete() { void NearbySharingServiceImpl::OnTransferComplete() {
is_receiving_files_ = false; is_receiving_files_ = false;
is_transferring_ = false; is_transferring_ = false;
...@@ -1583,6 +1572,43 @@ void NearbySharingServiceImpl::ReceivePayloads( ...@@ -1583,6 +1572,43 @@ void NearbySharingServiceImpl::ReceivePayloads(
} }
} }
NearbySharingService::StatusCodes NearbySharingServiceImpl::SendPayloads(
const ShareTarget& share_target) {
NS_LOG(VERBOSE) << __func__ << ": Preparing to send payloads to "
<< share_target.device_name;
ShareTargetInfo* info = GetShareTargetInfo(share_target);
if (!info || !info->connection()) {
NS_LOG(WARNING) << "Failed to send payload due to missing connection.";
return StatusCodes::kOutOfOrderApiCall;
}
if (!info->transfer_update_callback()) {
NS_LOG(WARNING) << "Failed to send payload due to missing transfer update "
"callback. Disconnecting.";
info->connection()->Close();
return StatusCodes::kOutOfOrderApiCall;
}
info->transfer_update_callback()->OnTransferUpdate(
share_target,
TransferMetadataBuilder()
.set_token(info->token())
.set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance)
.build());
if (!info->endpoint_id()) {
info->transfer_update_callback()->OnTransferUpdate(
share_target, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kFailed)
.build());
info->connection()->Close();
NS_LOG(WARNING) << "Failed to send payload due to missing endpoint id.";
return StatusCodes::kOutOfOrderApiCall;
}
ReceiveConnectionResponse(share_target);
return StatusCodes::kOk;
}
void NearbySharingServiceImpl::OnUniquePathFetched( void NearbySharingServiceImpl::OnUniquePathFetched(
int64_t attachment_id, int64_t attachment_id,
int64_t payload_id, int64_t payload_id,
...@@ -1647,179 +1673,41 @@ void NearbySharingServiceImpl::OnPayloadPathsRegistered( ...@@ -1647,179 +1673,41 @@ void NearbySharingServiceImpl::OnPayloadPathsRegistered(
continue; continue;
} }
NS_LOG(VERBOSE) << __func__ NS_LOG(VERBOSE) << __func__
<< ": Started listening for progress on payload - " << ": Started listening for progress on payload - "
<< *payload_id; << *payload_id;
nearby_connections_manager_->RegisterPayloadStatusListener(
*payload_id, info->payload_tracker());
NS_LOG(VERBOSE) << __func__
<< ": Accepted incoming files from share target - "
<< share_target.device_name;
}
WriteResponse(*connection, sharing::nearby::ConnectionResponseFrame::ACCEPT);
NS_LOG(VERBOSE) << __func__ << ": Successfully wrote response frame";
info->transfer_update_callback()->OnTransferUpdate(
share_target,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance)
.set_token(info->token())
.build());
base::Optional<std::string> endpoint_id = info->endpoint_id();
if (endpoint_id) {
nearby_connections_manager_->UpgradeBandwidth(*endpoint_id);
} else {
NS_LOG(WARNING) << __func__
<< ": Failed to initiate bandwidth upgrade. No endpoint_id "
"found for target - "
<< share_target.device_name;
std::move(status_codes_callback).Run(StatusCodes::kOutOfOrderApiCall);
return;
}
std::move(status_codes_callback).Run(StatusCodes::kOk);
}
NearbySharingService::StatusCodes NearbySharingServiceImpl::SendPayloads(
const ShareTarget& share_target) {
NS_LOG(VERBOSE) << __func__ << ": Preparing to send payloads to "
<< share_target.device_name;
ShareTargetInfo* info = GetShareTargetInfo(share_target);
if (!info || !info->connection()) {
NS_LOG(WARNING) << "Failed to send payload due to missing connection.";
return StatusCodes::kOutOfOrderApiCall;
}
if (!info->transfer_update_callback()) {
NS_LOG(WARNING) << "Failed to send payload due to missing transfer update "
"callback. Disconnecting.";
info->connection()->Close();
return StatusCodes::kOutOfOrderApiCall;
}
info->transfer_update_callback()->OnTransferUpdate(
share_target,
TransferMetadataBuilder()
.set_token(info->token())
.set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance)
.build());
if (!info->endpoint_id()) {
info->transfer_update_callback()->OnTransferUpdate(
share_target, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kFailed)
.build());
info->connection()->Close();
NS_LOG(WARNING) << "Failed to send payload due to missing endpoint id.";
return StatusCodes::kOutOfOrderApiCall;
}
ReceiveConnectionResponse(share_target);
return StatusCodes::kOk;
}
NearbySharingService::StatusCodes NearbySharingServiceImpl::SendAttachments(
const ShareTarget& share_target,
std::vector<std::unique_ptr<Attachment>> attachments) {
if (!is_scanning_) {
NS_LOG(WARNING) << __func__
<< ": Failed to send attachments. Not scanning.";
return StatusCodes::kError;
}
// |is_scanning_| means at least one send transfer callback.
DCHECK(foreground_send_transfer_callbacks_.might_have_observers() ||
background_send_transfer_callbacks_.might_have_observers());
// |is_scanning_| and |is_transferring_| are mutually exclusive.
DCHECK(!is_transferring_);
ShareTargetInfo* info = GetShareTargetInfo(share_target);
if (!info || !info->endpoint_id()) {
// TODO(crbug.com/1119276): Support scanning for unknown share targets.
NS_LOG(WARNING) << __func__
<< ": Failed to send attachments. Unknown ShareTarget.";
return StatusCodes::kError;
}
ShareTarget share_target_copy = share_target;
for (std::unique_ptr<Attachment>& attachment : attachments) {
DCHECK(attachment);
attachment->MoveToShareTarget(share_target_copy);
}
if (!share_target_copy.has_attachments()) {
NS_LOG(WARNING) << __func__ << ": No attachments to send.";
return StatusCodes::kError;
}
// For sending advertisement from scanner, the request advertisement should
// always be visible to everyone.
base::Optional<std::vector<uint8_t>> endpoint_info =
CreateEndpointInfo(local_device_data_manager_->GetDeviceName());
if (!endpoint_info) {
NS_LOG(WARNING) << __func__ << ": Could not create local endpoint info.";
return StatusCodes::kError;
}
info->set_transfer_update_callback(std::make_unique<TransferUpdateDecorator>(
base::BindRepeating(&NearbySharingServiceImpl::OnOutgoingTransferUpdate,
weak_ptr_factory_.GetWeakPtr())));
OnTransferStarted(/*is_incoming=*/false);
is_connecting_ = true;
InvalidateSendSurfaceState();
// Send process initialized successfully, from now on status updated will be nearby_connections_manager_->RegisterPayloadStatusListener(
// sent out via OnOutgoingTransferUpdate(). *payload_id, info->payload_tracker());
info->transfer_update_callback()->OnTransferUpdate(
share_target_copy, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kConnecting)
.build());
CreatePayloads(std::move(share_target_copy), NS_LOG(VERBOSE) << __func__
base::BindOnce(&NearbySharingServiceImpl::OnCreatePayloads, << ": Accepted incoming files from share target - "
weak_ptr_factory_.GetWeakPtr(), << share_target.device_name;
std::move(*endpoint_info))); }
return StatusCodes::kOk; WriteResponse(*connection, sharing::nearby::ConnectionResponseFrame::ACCEPT);
} NS_LOG(VERBOSE) << __func__ << ": Successfully wrote response frame";
void NearbySharingServiceImpl::OnCreatePayloads(
std::vector<uint8_t> endpoint_info,
ShareTarget share_target,
bool success) {
OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target);
bool has_payloads = info && (!info->text_payloads().empty() ||
!info->file_payloads().empty());
if (!success || !has_payloads || !info->endpoint_id()) {
NS_LOG(WARNING) << __func__
<< ": Failed to send file to remote ShareTarget. Failed to "
"create payloads.";
if (info && info->transfer_update_callback()) {
info->transfer_update_callback()->OnTransferUpdate( info->transfer_update_callback()->OnTransferUpdate(
share_target, share_target,
TransferMetadataBuilder() TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kMediaUnavailable) .set_status(TransferMetadata::Status::kAwaitingRemoteAcceptance)
.set_token(info->token())
.build()); .build());
}
base::Optional<std::string> endpoint_id = info->endpoint_id();
if (endpoint_id) {
nearby_connections_manager_->UpgradeBandwidth(*endpoint_id);
} else {
NS_LOG(WARNING) << __func__
<< ": Failed to initiate bandwidth upgrade. No endpoint_id "
"found for target - "
<< share_target.device_name;
std::move(status_codes_callback).Run(StatusCodes::kOutOfOrderApiCall);
return; return;
} }
base::Optional<std::vector<uint8_t>> bluetooth_mac_address = std::move(status_codes_callback).Run(StatusCodes::kOk);
GetBluetoothMacAddress(share_target);
DataUsage adjusted_data_usage = CheckFileSizeForDataUsagePreference(
settings_.GetDataUsage(), share_target);
// TODO(crbug.com/1111458): Add preferred transfer type.
nearby_connections_manager_->Connect(
std::move(endpoint_info), *info->endpoint_id(),
std::move(bluetooth_mac_address), adjusted_data_usage,
base::BindOnce(&NearbySharingServiceImpl::OnOutgoingConnection,
weak_ptr_factory_.GetWeakPtr(), share_target));
} }
void NearbySharingServiceImpl::OnOutgoingConnection( void NearbySharingServiceImpl::OnOutgoingConnection(
...@@ -2007,6 +1895,41 @@ void NearbySharingServiceImpl::CreatePayloads( ...@@ -2007,6 +1895,41 @@ void NearbySharingServiceImpl::CreatePayloads(
std::move(callback))); std::move(callback)));
} }
void NearbySharingServiceImpl::OnCreatePayloads(
std::vector<uint8_t> endpoint_info,
ShareTarget share_target,
bool success) {
OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target);
bool has_payloads = info && (!info->text_payloads().empty() ||
!info->file_payloads().empty());
if (!success || !has_payloads || !info->endpoint_id()) {
NS_LOG(WARNING) << __func__
<< ": Failed to send file to remote ShareTarget. Failed to "
"create payloads.";
if (info && info->transfer_update_callback()) {
info->transfer_update_callback()->OnTransferUpdate(
share_target,
TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kMediaUnavailable)
.build());
}
return;
}
base::Optional<std::vector<uint8_t>> bluetooth_mac_address =
GetBluetoothMacAddress(share_target);
DataUsage adjusted_data_usage = CheckFileSizeForDataUsagePreference(
settings_.GetDataUsage(), share_target);
// TODO(crbug.com/1111458): Add preferred transfer type.
nearby_connections_manager_->Connect(
std::move(endpoint_info), *info->endpoint_id(),
std::move(bluetooth_mac_address), adjusted_data_usage,
base::BindOnce(&NearbySharingServiceImpl::OnOutgoingConnection,
weak_ptr_factory_.GetWeakPtr(), share_target));
}
void NearbySharingServiceImpl::OnOpenFiles( void NearbySharingServiceImpl::OnOpenFiles(
ShareTarget share_target, ShareTarget share_target,
base::OnceCallback<void(ShareTarget, bool)> callback, base::OnceCallback<void(ShareTarget, bool)> callback,
...@@ -2121,17 +2044,6 @@ void NearbySharingServiceImpl::Fail(const ShareTarget& share_target, ...@@ -2121,17 +2044,6 @@ void NearbySharingServiceImpl::Fail(const ShareTarget& share_target,
} }
} }
void NearbySharingServiceImpl::CloseConnection(
const ShareTarget& share_target) {
NearbyConnection* connection = GetConnection(share_target);
if (!connection) {
NS_LOG(WARNING) << __func__ << ": Invalid connection for target - "
<< share_target.device_name;
return;
}
connection->Close();
}
void NearbySharingServiceImpl::OnIncomingAdvertisementDecoded( void NearbySharingServiceImpl::OnIncomingAdvertisementDecoded(
const std::string& endpoint_id, const std::string& endpoint_id,
ShareTarget placeholder_share_target, ShareTarget placeholder_share_target,
...@@ -2161,6 +2073,79 @@ void NearbySharingServiceImpl::OnIncomingAdvertisementDecoded( ...@@ -2161,6 +2073,79 @@ void NearbySharingServiceImpl::OnIncomingAdvertisementDecoded(
std::move(placeholder_share_target))); std::move(placeholder_share_target)));
} }
void NearbySharingServiceImpl::OnIncomingTransferUpdate(
const ShareTarget& share_target,
const TransferMetadata& metadata) {
if (metadata.status() != TransferMetadata::Status::kCancelled &&
metadata.status() != TransferMetadata::Status::kRejected) {
last_incoming_metadata_ =
std::make_pair(share_target, TransferMetadataBuilder::Clone(metadata)
.set_is_original(false)
.build());
} else {
last_incoming_metadata_ = base::nullopt;
}
if (metadata.is_final_status()) {
OnTransferComplete();
} else if (metadata.status() ==
TransferMetadata::Status::kAwaitingLocalConfirmation) {
OnTransferStarted(/*is_incoming=*/true);
}
base::ObserverList<TransferUpdateCallback>& transfer_callbacks =
foreground_receive_callbacks_.might_have_observers()
? foreground_receive_callbacks_
: background_receive_callbacks_;
for (TransferUpdateCallback& callback : transfer_callbacks) {
callback.OnTransferUpdate(share_target, metadata);
}
}
void NearbySharingServiceImpl::OnOutgoingTransferUpdate(
const ShareTarget& share_target,
const TransferMetadata& metadata) {
if (metadata.is_final_status()) {
is_connecting_ = false;
OnTransferComplete();
} else if (metadata.status() == TransferMetadata::Status::kMediaDownloading ||
metadata.status() ==
TransferMetadata::Status::kAwaitingLocalConfirmation) {
is_connecting_ = false;
OnTransferStarted(/*is_incoming=*/false);
}
bool has_foreground_send_surface =
foreground_send_transfer_callbacks_.might_have_observers();
base::ObserverList<TransferUpdateCallback>& transfer_callbacks =
has_foreground_send_surface ? foreground_send_transfer_callbacks_
: background_send_transfer_callbacks_;
for (TransferUpdateCallback& callback : transfer_callbacks)
callback.OnTransferUpdate(share_target, metadata);
if (has_foreground_send_surface && metadata.is_final_status()) {
last_outgoing_metadata_ = base::nullopt;
} else {
last_outgoing_metadata_ =
std::make_pair(share_target, TransferMetadataBuilder::Clone(metadata)
.set_is_original(false)
.build());
}
}
void NearbySharingServiceImpl::CloseConnection(
const ShareTarget& share_target) {
NearbyConnection* connection = GetConnection(share_target);
if (!connection) {
NS_LOG(WARNING) << __func__ << ": Invalid connection for target - "
<< share_target.device_name;
return;
}
connection->Close();
}
void NearbySharingServiceImpl::OnIncomingDecryptedCertificate( void NearbySharingServiceImpl::OnIncomingDecryptedCertificate(
const std::string& endpoint_id, const std::string& endpoint_id,
sharing::mojom::AdvertisementPtr advertisement, sharing::mojom::AdvertisementPtr advertisement,
...@@ -2893,23 +2878,6 @@ void NearbySharingServiceImpl::OnPayloadTransferUpdate( ...@@ -2893,23 +2878,6 @@ void NearbySharingServiceImpl::OnPayloadTransferUpdate(
info->transfer_update_callback()->OnTransferUpdate(share_target, metadata); info->transfer_update_callback()->OnTransferUpdate(share_target, metadata);
} }
void NearbySharingServiceImpl::OnPayloadsFailed(ShareTarget share_target) {
if (!share_target.is_incoming)
return;
nearby_connections_manager_->ClearIncomingPayloads();
std::vector<base::FilePath> files_for_deletion;
for (const auto& file : share_target.file_attachments) {
auto it = attachment_info_map_.find(file.id());
if (it == attachment_info_map_.end())
continue;
files_for_deletion.push_back(it->second.file_path);
}
file_handler_.DeleteFilesFromDisk(std::move(files_for_deletion));
}
bool NearbySharingServiceImpl::OnIncomingPayloadsComplete( bool NearbySharingServiceImpl::OnIncomingPayloadsComplete(
ShareTarget& share_target) { ShareTarget& share_target) {
DCHECK(share_target.is_incoming); DCHECK(share_target.is_incoming);
...@@ -2983,6 +2951,23 @@ bool NearbySharingServiceImpl::OnIncomingPayloadsComplete( ...@@ -2983,6 +2951,23 @@ bool NearbySharingServiceImpl::OnIncomingPayloadsComplete(
return true; return true;
} }
void NearbySharingServiceImpl::OnPayloadsFailed(ShareTarget share_target) {
if (!share_target.is_incoming)
return;
nearby_connections_manager_->ClearIncomingPayloads();
std::vector<base::FilePath> files_for_deletion;
for (const auto& file : share_target.file_attachments) {
auto it = attachment_info_map_.find(file.id());
if (it == attachment_info_map_.end())
continue;
files_for_deletion.push_back(it->second.file_path);
}
file_handler_.DeleteFilesFromDisk(std::move(files_for_deletion));
}
void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target, void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target,
TransferMetadata metadata) { TransferMetadata metadata) {
ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target); ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target);
...@@ -3122,6 +3107,21 @@ void NearbySharingServiceImpl::ClearOutgoingShareTargetInfoMap() { ...@@ -3122,6 +3107,21 @@ void NearbySharingServiceImpl::ClearOutgoingShareTargetInfoMap() {
outgoing_share_target_map_.clear(); outgoing_share_target_map_.clear();
} }
void NearbySharingServiceImpl::SetAttachmentPayloadId(
const Attachment& attachment,
int64_t payload_id) {
attachment_info_map_[attachment.id()].payload_id = payload_id;
}
base::Optional<int64_t> NearbySharingServiceImpl::GetAttachmentPayloadId(
int64_t attachment_id) {
auto it = attachment_info_map_.find(attachment_id);
if (it == attachment_info_map_.end())
return base::nullopt;
return it->second.payload_id;
}
void NearbySharingServiceImpl::UnregisterShareTarget( void NearbySharingServiceImpl::UnregisterShareTarget(
const ShareTarget& share_target) { const ShareTarget& share_target) {
NS_LOG(VERBOSE) << __func__ << ": Unregistering share target - " NS_LOG(VERBOSE) << __func__ << ": Unregistering share target - "
...@@ -3155,19 +3155,19 @@ void NearbySharingServiceImpl::UnregisterShareTarget( ...@@ -3155,19 +3155,19 @@ void NearbySharingServiceImpl::UnregisterShareTarget(
mutual_acceptance_timeout_alarm_.Cancel(); mutual_acceptance_timeout_alarm_.Cancel();
} }
void NearbySharingServiceImpl::SetAttachmentPayloadId( void NearbySharingServiceImpl::OnStartAdvertisingResult(
const Attachment& attachment, bool used_device_name,
int64_t payload_id) { NearbyConnectionsManager::ConnectionsStatus status) {
attachment_info_map_[attachment.id()].payload_id = payload_id; if (status == NearbyConnectionsManager::ConnectionsStatus::kSuccess) {
} NS_LOG(VERBOSE)
<< "StartAdvertising over Nearby Connections was successful.";
base::Optional<int64_t> NearbySharingServiceImpl::GetAttachmentPayloadId( SetInHighVisibility(used_device_name);
int64_t attachment_id) { } else {
auto it = attachment_info_map_.find(attachment_id); NS_LOG(ERROR) << "StartAdvertising over Nearby Connections failed: "
if (it == attachment_info_map_.end()) << NearbyConnectionsManager::ConnectionsStatusToString(
return base::nullopt; status);
SetInHighVisibility(false);
return it->second.payload_id; }
} }
void NearbySharingServiceImpl::SetInHighVisibility( void NearbySharingServiceImpl::SetInHighVisibility(
......
...@@ -99,14 +99,10 @@ class NearbySharingServiceImpl ...@@ -99,14 +99,10 @@ class NearbySharingServiceImpl
NearbyNotificationDelegate* GetNotificationDelegate( NearbyNotificationDelegate* GetNotificationDelegate(
const std::string& notification_id) override; const std::string& notification_id) override;
NearbyShareSettings* GetSettings() override; NearbyShareSettings* GetSettings() override;
NearbyShareHttpNotifier* GetHttpNotifier() override;
// nearby_share::mojom::NearbyShareSettingsObserver: NearbyShareLocalDeviceDataManager* GetLocalDeviceDataManager() override;
void OnEnabledChanged(bool enabled) override; NearbyShareContactManager* GetContactManager() override;
void OnDeviceNameChanged(const std::string& device_name) override; NearbyShareCertificateManager* GetCertificateManager() override;
void OnDataUsageChanged(nearby_share::mojom::DataUsage data_usage) override;
void OnVisibilityChanged(nearby_share::mojom::Visibility visibility) override;
void OnAllowedContactsChanged(
const std::vector<std::string>& allowed_contacts) override;
// NearbyProcessManager::Observer: // NearbyProcessManager::Observer:
void OnNearbyProfileChanged(Profile* profile) override; void OnNearbyProfileChanged(Profile* profile) override;
...@@ -120,34 +116,44 @@ class NearbySharingServiceImpl ...@@ -120,34 +116,44 @@ class NearbySharingServiceImpl
// Test methods // Test methods
void FlushMojoForTesting(); void FlushMojoForTesting();
NearbyShareHttpNotifier* GetHttpNotifier() override;
NearbyShareLocalDeviceDataManager* GetLocalDeviceDataManager() override;
NearbyShareContactManager* GetContactManager() override;
NearbyShareCertificateManager* GetCertificateManager() override;
void set_free_disk_space_for_testing(int64_t free_disk_space) { void set_free_disk_space_for_testing(int64_t free_disk_space) {
free_disk_space_for_testing_ = free_disk_space; free_disk_space_for_testing_ = free_disk_space;
} }
private:
// nearby_share::mojom::NearbyShareSettingsObserver:
void OnEnabledChanged(bool enabled) override;
void OnDeviceNameChanged(const std::string& device_name) override;
void OnDataUsageChanged(nearby_share::mojom::DataUsage data_usage) override;
void OnVisibilityChanged(nearby_share::mojom::Visibility visibility) override;
void OnAllowedContactsChanged(
const std::vector<std::string>& allowed_contacts) override;
// NearbyConnectionsManager::DiscoveryListener: // NearbyConnectionsManager::DiscoveryListener:
void OnEndpointDiscovered(const std::string& endpoint_id, void OnEndpointDiscovered(const std::string& endpoint_id,
const std::vector<uint8_t>& endpoint_info) override; const std::vector<uint8_t>& endpoint_info) override;
void OnEndpointLost(const std::string& endpoint_id) override; void OnEndpointLost(const std::string& endpoint_id) override;
private:
// ash::SessionObserver: // ash::SessionObserver:
void OnLockStateChanged(bool locked) override; void OnLockStateChanged(bool locked) override;
// BluetoothAdapter::Observer:
void AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) override;
void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
bool powered) override;
base::ObserverList<TransferUpdateCallback>& GetReceiveCallbacksFromState( base::ObserverList<TransferUpdateCallback>& GetReceiveCallbacksFromState(
ReceiveSurfaceState state); ReceiveSurfaceState state);
bool IsVisibleInBackground(Visibility visibility); bool IsVisibleInBackground(Visibility visibility);
const base::Optional<std::vector<uint8_t>> CreateEndpointInfo( const base::Optional<std::vector<uint8_t>> CreateEndpointInfo(
const base::Optional<std::string>& device_name); const base::Optional<std::string>& device_name);
void StartFastInitiationAdvertising();
void StopFastInitiationAdvertising();
void GetBluetoothAdapter(); void GetBluetoothAdapter();
void OnGetBluetoothAdapter(scoped_refptr<device::BluetoothAdapter> adapter); void OnGetBluetoothAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
void StartFastInitiationAdvertising();
void OnStartFastInitiationAdvertising(); void OnStartFastInitiationAdvertising();
void OnStartFastInitiationAdvertisingError(); void OnStartFastInitiationAdvertisingError();
void StopFastInitiationAdvertising();
void OnStopFastInitiationAdvertising(); void OnStopFastInitiationAdvertising();
void OnOutgoingAdvertisementDecoded( void OnOutgoingAdvertisementDecoded(
const std::string& endpoint_id, const std::string& endpoint_id,
...@@ -159,10 +165,6 @@ class NearbySharingServiceImpl ...@@ -159,10 +165,6 @@ class NearbySharingServiceImpl
bool IsBluetoothPresent() const; bool IsBluetoothPresent() const;
bool IsBluetoothPowered() const; bool IsBluetoothPowered() const;
bool HasAvailableConnectionMediums(); bool HasAvailableConnectionMediums();
void AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) override;
void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
bool powered) override;
void InvalidateSurfaceState(); void InvalidateSurfaceState();
bool ShouldStopNearbyProcess(); bool ShouldStopNearbyProcess();
void InvalidateSendSurfaceState(); void InvalidateSendSurfaceState();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment