From af3f8e488ef0e2dacab5f8e952e54259b91d0541 Mon Sep 17 00:00:00 2001 From: Francis Tsui Date: Fri, 15 Mar 2024 18:03:54 -0700 Subject: [PATCH] Switch to using share target id in sharing service. PiperOrigin-RevId: 616293087 --- sharing/incoming_share_target_info.h | 2 + sharing/nearby_sharing_service_impl.cc | 225 ++++++++++++++----------- sharing/nearby_sharing_service_impl.h | 20 +-- sharing/outgoing_share_target_info.h | 2 + sharing/share_target_info.h | 1 + 5 files changed, 136 insertions(+), 114 deletions(-) diff --git a/sharing/incoming_share_target_info.h b/sharing/incoming_share_target_info.h index 605a312f..03955fe9 100644 --- a/sharing/incoming_share_target_info.h +++ b/sharing/incoming_share_target_info.h @@ -26,6 +26,8 @@ class IncomingShareTargetInfo : public ShareTargetInfo { IncomingShareTargetInfo(IncomingShareTargetInfo&&); IncomingShareTargetInfo& operator=(IncomingShareTargetInfo&&); ~IncomingShareTargetInfo() override; + + bool IsIncoming() const override { return true; } }; } // namespace sharing diff --git a/sharing/nearby_sharing_service_impl.cc b/sharing/nearby_sharing_service_impl.cc index 285a4f08..a41d0255 100644 --- a/sharing/nearby_sharing_service_impl.cc +++ b/sharing/nearby_sharing_service_impl.cc @@ -686,7 +686,7 @@ void NearbySharingServiceImpl::SendAttachments( // |is_scanning_| and |is_transferring_| are mutually exclusive. NL_DCHECK(!is_transferring_); - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->endpoint_id()) { NL_LOG(WARNING) << __func__ @@ -764,11 +764,12 @@ void NearbySharingServiceImpl::Accept( "api_accept", [&, share_target, status_codes_callback = std::move(status_codes_callback)]() { + int64_t share_target_id = share_target.id; // Log analytics event of responding to introduction. analytics_recorder_->NewRespondToIntroduction( ResponseToIntroduction::ACCEPT_INTRODUCTION, receiving_session_id_); - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Accept invoked for unknown share target"; @@ -776,9 +777,9 @@ void NearbySharingServiceImpl::Accept( return; } + bool is_incoming = info->IsIncoming(); std::optional> metadata = - share_target.is_incoming ? last_incoming_metadata_ - : last_outgoing_metadata_; + is_incoming ? last_incoming_metadata_ : last_outgoing_metadata_; if (!ReadyToAccept(share_target, metadata.has_value() ? metadata->second.status() @@ -788,9 +789,8 @@ void NearbySharingServiceImpl::Accept( return; } - is_waiting_to_record_accept_to_transfer_start_metric_ = - share_target.is_incoming; - if (share_target.is_incoming) { + is_waiting_to_record_accept_to_transfer_start_metric_ = is_incoming; + if (is_incoming) { incoming_share_accepted_timestamp_ = context_->GetClock()->Now(); ReceivePayloads(share_target, std::move(status_codes_callback)); return; @@ -811,7 +811,8 @@ void NearbySharingServiceImpl::Reject( analytics_recorder_->NewRespondToIntroduction( ResponseToIntroduction::REJECT_INTRODUCTION, receiving_session_id_); - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Reject invoked for unknown share target"; @@ -820,15 +821,18 @@ void NearbySharingServiceImpl::Reject( } NearbyConnection* connection = info->connection(); + bool is_incoming = info->IsIncoming(); RunOnNearbySharingServiceThreadDelayed( "incoming_rejection_delay", kIncomingRejectionDelay, - [&, share_target]() { CloseConnection(share_target); }); + [this, share_target_id]() { CloseConnection(share_target_id); }); - connection->SetDisconnectionListener([&, share_target]() { + connection->SetDisconnectionListener([this, is_incoming, + share_target_id]() { RunOnNearbySharingServiceThread( - "disconnection_listener", - [&, share_target]() { UnregisterShareTarget(share_target); }); + "disconnection_listener", [this, is_incoming, share_target_id]() { + UnregisterShareTarget(is_incoming, share_target_id); + }); }); WriteResponseFrame( @@ -873,7 +877,8 @@ void NearbySharingServiceImpl::DoCancel( ShareTarget share_target, std::function status_codes_callback, bool is_initiator_of_cancellation) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info || !info->endpoint_id()) { NL_LOG(ERROR) << __func__ << ": Cancel invoked for unknown share target, returning " @@ -888,7 +893,7 @@ void NearbySharingServiceImpl::DoCancel( } // For metrics. - all_cancelled_share_target_ids_.insert(share_target.id); + all_cancelled_share_target_ids_.insert(share_target_id); // Cancel all ongoing payload transfers before invoking the transfer update // callback. Invoking the transfer update callback first could result in @@ -929,20 +934,23 @@ void NearbySharingServiceImpl::DoCancel( << *info->endpoint_id(); if (is_initiator_of_cancellation) { info->connection()->SetDisconnectionListener( - [&, share_target, info]() { + [&, share_target_id, info]() { info->set_connection(nullptr); + bool is_incoming = info->IsIncoming(); RunOnNearbySharingServiceThread( - "api_unregister_share_target", [&, share_target]() { + "api_unregister_share_target", + [&, is_incoming, share_target_id]() { NL_LOG(INFO) << "Unregister share target in disconnection listener."; - UnregisterShareTarget(std::move(share_target)); + UnregisterShareTarget(is_incoming, share_target_id); }); }); RunOnNearbySharingServiceThreadDelayed( - "initiator_cancel_delay", kInitiatorCancelDelay, [&, share_target]() { + "initiator_cancel_delay", kInitiatorCancelDelay, + [&, share_target_id]() { NL_LOG(INFO) << "Close connection after cancellation delay."; - CloseConnection(share_target); + CloseConnection(share_target_id); }); WriteCancelFrame(*info->connection()); @@ -952,7 +960,7 @@ void NearbySharingServiceImpl::DoCancel( } else { NL_LOG(INFO) << "Disconnect endpoint id:" << *info->endpoint_id(); nearby_connections_manager_->Disconnect(*info->endpoint_id()); - UnregisterShareTarget(share_target); + UnregisterShareTarget(info->IsIncoming(), share_target_id); } std::move(status_codes_callback)(StatusCodes::kOk); @@ -974,7 +982,7 @@ void NearbySharingServiceImpl::Open( << share_target.ToString(); // Log analytics event of opening received attachments. - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); analytics_recorder_->NewOpenReceivedAttachments( share_target.GetAttachments(), info != nullptr ? info->session_id() : 0); @@ -2568,7 +2576,7 @@ NearbySharingService::StatusCodes NearbySharingServiceImpl::SendPayloads( const ShareTarget& share_target) { NL_VLOG(1) << __func__ << ": Preparing to send payloads to " << share_target.id; - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Failed to send payload due to missing connection."; @@ -2644,7 +2652,7 @@ void NearbySharingServiceImpl::OnPayloadPathsRegistered( return; } - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Accept invoked for unknown share target"; std::move(status_codes_callback)(StatusCodes::kOutOfOrderApiCall); @@ -2730,13 +2738,14 @@ void NearbySharingServiceImpl::OnPayloadPathsRegistered( void NearbySharingServiceImpl::OnOutgoingConnection( const ShareTarget& share_target, absl::Time connect_start_time, NearbyConnection* connection) { - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target_id); bool success = info && info->endpoint_id() && connection; if (!success) { NL_LOG(WARNING) << __func__ << ": Failed to initiate connection to share target " - << share_target.id; + << share_target_id; TransferMetadata::Status transfer_status = TransferMetadata::Status::kFailedToInitiateOutgoingConnection; if (info != nullptr && @@ -2793,7 +2802,7 @@ void NearbySharingServiceImpl::SendIntroduction( NL_VLOG(1) << __func__ << ": Preparing to send introduction to " << share_target.id; - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": No NearbyConnection tied to " << share_target.id; @@ -2920,7 +2929,7 @@ void NearbySharingServiceImpl::SendIntroduction( void NearbySharingServiceImpl::CreatePayloads( ShareTarget share_target, std::function callback) { - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id); if (!info || !share_target.has_attachments()) { std::move(callback)(std::move(share_target), /*success=*/false); return; @@ -2965,7 +2974,7 @@ void NearbySharingServiceImpl::CreatePayloads( void NearbySharingServiceImpl::OnCreatePayloads( std::vector endpoint_info, ShareTarget share_target, bool success) { - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id); bool has_payloads = info && (!info->text_payloads().empty() || !info->file_payloads().empty()); if (!success || !has_payloads || !info->endpoint_id()) { @@ -2983,7 +2992,7 @@ void NearbySharingServiceImpl::OnCreatePayloads( } std::optional> bluetooth_mac_address = - GetBluetoothMacAddressForShareTarget(share_target); + GetBluetoothMacAddressForShareTarget(share_target.id); // For metrics. all_cancelled_share_target_ids_.clear(); @@ -3019,7 +3028,7 @@ void NearbySharingServiceImpl::OnCreatePayloads( void NearbySharingServiceImpl::OnOpenFiles( ShareTarget share_target, std::function callback, std::vector files) { - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id); if (!info || files.size() != share_target.file_attachments.size()) { std::move(callback)(std::move(share_target), /*success=*/false); return; @@ -3135,7 +3144,8 @@ void NearbySharingServiceImpl::WriteProgressUpdateFrame( void NearbySharingServiceImpl::Fail(const ShareTarget& share_target, TransferMetadata::Status status) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Fail invoked for unknown share target."; return; @@ -3144,7 +3154,7 @@ void NearbySharingServiceImpl::Fail(const ShareTarget& share_target, RunOnNearbySharingServiceThreadDelayed( "incoming_rejection_delay", kIncomingRejectionDelay, - [&, share_target]() { CloseConnection(share_target); }); + [&, share_target_id]() { CloseConnection(share_target_id); }); connection->SetDisconnectionListener([&, share_target]() { RunOnNearbySharingServiceThread( @@ -3188,7 +3198,7 @@ void NearbySharingServiceImpl::Fail(const ShareTarget& share_target, void NearbySharingServiceImpl::OnIncomingAdvertisementDecoded( absl::string_view endpoint_id, ShareTarget placeholder_share_target, std::unique_ptr advertisement) { - NearbyConnection* connection = GetConnection(placeholder_share_target); + NearbyConnection* connection = GetConnection(placeholder_share_target.id); if (!connection) { NL_LOG(WARNING) << __func__ << ": Invalid connection for endpoint id - " << endpoint_id; @@ -3288,7 +3298,7 @@ void NearbySharingServiceImpl::OnOutgoingTransferUpdate( << TransferMetadata::StatusToString(metadata.status()); } - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id); if (metadata.is_final_status()) { // Log analytics event of sending attachment end. int64_t sent_bytes = @@ -3365,12 +3375,11 @@ void NearbySharingServiceImpl::OnOutgoingTransferUpdate( } } -void NearbySharingServiceImpl::CloseConnection( - const ShareTarget& share_target) { - NearbyConnection* connection = GetConnection(share_target); +void NearbySharingServiceImpl::CloseConnection(int64_t share_target_id) { + NearbyConnection* connection = GetConnection(share_target_id); if (!connection) { NL_LOG(WARNING) << __func__ << ": Invalid connection for target - " - << share_target.id; + << share_target_id; return; } connection->Close(); @@ -3380,7 +3389,7 @@ void NearbySharingServiceImpl::OnIncomingDecryptedCertificate( absl::string_view endpoint_id, std::unique_ptr advertisement, ShareTarget placeholder_share_target, std::optional certificate) { - NearbyConnection* connection = GetConnection(placeholder_share_target); + NearbyConnection* connection = GetConnection(placeholder_share_target.id); if (!connection) { NL_VLOG(1) << __func__ << ": Invalid connection for endpoint id - " << endpoint_id; @@ -3408,7 +3417,7 @@ void NearbySharingServiceImpl::OnIncomingDecryptedCertificate( NL_VLOG(1) << __func__ << ": Received incoming connection from " << share_target->id; - ShareTargetInfo* share_target_info = GetShareTargetInfo(*share_target); + ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target->id); NL_DCHECK(share_target_info); share_target_info->set_connection(connection); @@ -3458,7 +3467,7 @@ void NearbySharingServiceImpl::RunPairedKeyVerification( return; } - ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target); + ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target.id); NL_DCHECK(share_target_info); share_target_info->set_frames_reader(std::make_shared( @@ -3483,7 +3492,7 @@ void NearbySharingServiceImpl::OnIncomingConnectionKeyVerificationDone( ShareTarget share_target, std::optional four_digit_token, PairedKeyVerificationRunner::PairedKeyVerificationResult result, OSType share_target_os_type) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection() || !info->endpoint_id()) { NL_VLOG(1) << __func__ << ": Invalid connection or endpoint id"; return; @@ -3530,7 +3539,7 @@ void NearbySharingServiceImpl::OnOutgoingConnectionKeyVerificationDone( std::optional four_digit_token, PairedKeyVerificationRunner::PairedKeyVerificationResult result, OSType share_target_os_type) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { return; } @@ -3595,7 +3604,8 @@ void NearbySharingServiceImpl::OnOutgoingConnectionKeyVerificationDone( void NearbySharingServiceImpl::RefreshUIOnDisconnection( ShareTarget share_target) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (info && info->transfer_update_callback()) { info->transfer_update_callback()->OnTransferUpdate( share_target, @@ -3605,14 +3615,14 @@ void NearbySharingServiceImpl::RefreshUIOnDisconnection( .build()); } - UnregisterShareTarget(share_target); + UnregisterShareTarget(info->IsIncoming(), share_target_id); } void NearbySharingServiceImpl::ReceiveIntroduction( ShareTarget share_target, std::optional four_digit_token) { NL_LOG(INFO) << __func__ << ": Receiving introduction from " << share_target.id; - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); NL_DCHECK(info && info->connection()); info->frames_reader()->ReadFrame( @@ -3629,7 +3639,7 @@ void NearbySharingServiceImpl::ReceiveIntroduction( void NearbySharingServiceImpl::OnReceivedIntroduction( ShareTarget share_target, std::optional four_digit_token, std::optional frame) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ @@ -3766,7 +3776,7 @@ void NearbySharingServiceImpl::ReceiveConnectionResponse( ShareTarget share_target) { NL_VLOG(1) << __func__ << ": Receiving response frame from " << share_target.id; - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); NL_DCHECK(info && info->connection()); info->frames_reader()->ReadFrame( @@ -3781,7 +3791,7 @@ void NearbySharingServiceImpl::ReceiveConnectionResponse( void NearbySharingServiceImpl::OnReceiveConnectionResponse( ShareTarget share_target, std::optional frame) { - OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target); + OutgoingShareTargetInfo* info = GetOutgoingShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Ignore received connection response, due to no " @@ -3918,7 +3928,7 @@ void NearbySharingServiceImpl::OnStorageCheckCompleted( return; } - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->connection()) { NL_LOG(WARNING) << __func__ << ": Invalid connection for share target - " << share_target.id; @@ -4030,7 +4040,7 @@ void NearbySharingServiceImpl::OnFrameRead( break; } - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (!info || !info->frames_reader()) { NL_LOG(WARNING) << __func__ << ": Stopped reading further frames, due to no connection " @@ -4060,7 +4070,7 @@ void NearbySharingServiceImpl::HandleProgressUpdateFrame( progress_update_frame) { if (progress_update_frame.has_start_transfer() && progress_update_frame.start_transfer()) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (info != nullptr && info->endpoint_id().has_value() && share_target.GetTotalAttachmentsSize() >= @@ -4083,7 +4093,8 @@ void NearbySharingServiceImpl::HandleProgressUpdateFrame( void NearbySharingServiceImpl::OnIncomingConnectionDisconnected( const ShareTarget& share_target) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (info && info->transfer_update_callback()) { info->transfer_update_callback()->OnTransferUpdate( share_target, @@ -4091,12 +4102,13 @@ void NearbySharingServiceImpl::OnIncomingConnectionDisconnected( .set_status(TransferMetadata::Status::kUnexpectedDisconnection) .build()); } - UnregisterShareTarget(share_target); + UnregisterShareTarget(info->IsIncoming(), share_target_id); } void NearbySharingServiceImpl::OnOutgoingConnectionDisconnected( const ShareTarget& share_target) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (info && info->transfer_update_callback()) { info->transfer_update_callback()->OnTransferUpdate( share_target, @@ -4104,7 +4116,7 @@ void NearbySharingServiceImpl::OnOutgoingConnectionDisconnected( .set_status(TransferMetadata::Status::kUnexpectedDisconnection) .build()); } - UnregisterShareTarget(share_target); + UnregisterShareTarget(info->IsIncoming(), share_target_id); } void NearbySharingServiceImpl::OnIncomingMutualAcceptanceTimeout( @@ -4253,7 +4265,7 @@ void NearbySharingServiceImpl::OnPayloadTransferUpdate( // Make sure to call this before calling Disconnect, or we risk losing some // transfer updates in the receive case due to the Disconnect call cleaning up // share targets. - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target.id); if (info && info->transfer_update_callback()) info->transfer_update_callback()->OnTransferUpdate(share_target, metadata); @@ -4262,7 +4274,7 @@ void NearbySharingServiceImpl::OnPayloadTransferUpdate( // cancellation. if (TransferMetadata::IsFinalStatus(metadata.status()) && metadata.status() != TransferMetadata::Status::kCancelled) { - Disconnect(share_target, metadata); + Disconnect(share_target.id, metadata); } } @@ -4270,19 +4282,21 @@ bool NearbySharingServiceImpl::OnIncomingPayloadsComplete( ShareTarget& share_target) { NL_DCHECK(share_target.is_incoming); - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id = share_target.id; + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info || !info->connection()) { NL_VLOG(1) << __func__ << ": Connection not found for target - " - << share_target.id; + << share_target_id; return false; } NearbyConnection* connection = info->connection(); - connection->SetDisconnectionListener([&, share_target]() { + connection->SetDisconnectionListener([&, share_target_id]() { RunOnNearbySharingServiceThread( - "disconnection_listener", - [&, share_target]() { UnregisterShareTarget(share_target); }); + "disconnection_listener", [&, share_target_id]() { + UnregisterShareTarget(/*is_incoming=*/true, share_target_id); + }); }); if (!update_file_paths_in_progress_) { @@ -4419,14 +4433,14 @@ void NearbySharingServiceImpl::RemoveIncomingPayloads( file_handler_.DeleteFilesFromDisk(std::move(files_for_deletion), []() {}); } -void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target, +void NearbySharingServiceImpl::Disconnect(int64_t share_target_id, TransferMetadata metadata) { - ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target); + ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target_id); if (!share_target_info) { NL_LOG(WARNING) << __func__ << ": Failed to disconnect. No share target info found for target - " - << share_target.id; + << share_target_id; return; } @@ -4435,7 +4449,7 @@ void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target, NL_LOG(WARNING) << __func__ << ": Failed to disconnect. No endpoint id found for share target - " - << share_target.id; + << share_target_id; return; } @@ -4451,7 +4465,7 @@ void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target, } // Files received successfully. Receivers can immediately cancel. - if (share_target.is_incoming) { + if (share_target_info->IsIncoming()) { if (share_target_info->connection()) { share_target_info->connection()->Close(); } else { @@ -4482,11 +4496,11 @@ void NearbySharingServiceImpl::Disconnect(const ShareTarget& share_target, // with std::string() so that it captures the string by value correctly. if (share_target_info->connection()) { share_target_info->connection()->SetDisconnectionListener( - [&, share_target, share_target_info, endpoint_id = *endpoint_id]() { + [&, share_target_id, share_target_info, endpoint_id = *endpoint_id]() { share_target_info->set_connection(nullptr); RunOnNearbySharingServiceThread( - "disconnection_listener", [&, share_target, endpoint_id]() { - OnDisconnectingConnectionDisconnected(share_target, + "disconnection_listener", [&, share_target_id, endpoint_id]() { + OnDisconnectingConnectionDisconnected(share_target_id, endpoint_id); }); }); @@ -4504,9 +4518,9 @@ void NearbySharingServiceImpl::OnDisconnectingConnectionTimeout( } void NearbySharingServiceImpl::OnDisconnectingConnectionDisconnected( - const ShareTarget& share_target, absl::string_view endpoint_id) { + int64_t share_target_id, absl::string_view endpoint_id) { disconnection_timeout_alarms_.erase(endpoint_id); - UnregisterShareTarget(share_target); + UnregisterShareTarget(/*is_incoming=*/false, share_target_id); } ShareTargetInfo& NearbySharingServiceImpl::GetOrCreateShareTargetInfo( @@ -4537,16 +4551,17 @@ ShareTargetInfo& NearbySharingServiceImpl::GetOrCreateShareTargetInfo( } ShareTargetInfo* NearbySharingServiceImpl::GetShareTargetInfo( - const ShareTarget& share_target) { - if (share_target.is_incoming) - return GetIncomingShareTargetInfo(share_target); - else - return GetOutgoingShareTargetInfo(share_target); + int64_t share_target_id) { + ShareTargetInfo* result = GetIncomingShareTargetInfo(share_target_id); + if (result != nullptr) { + return result; + } + return GetOutgoingShareTargetInfo(share_target_id); } IncomingShareTargetInfo* NearbySharingServiceImpl::GetIncomingShareTargetInfo( - const ShareTarget& share_target) { - auto it = incoming_share_target_info_map_.find(share_target.id); + int64_t share_target_id) { + auto it = incoming_share_target_info_map_.find(share_target_id); if (it == incoming_share_target_info_map_.end()) { return nullptr; } @@ -4555,8 +4570,8 @@ IncomingShareTargetInfo* NearbySharingServiceImpl::GetIncomingShareTargetInfo( } OutgoingShareTargetInfo* NearbySharingServiceImpl::GetOutgoingShareTargetInfo( - const ShareTarget& share_target) { - auto it = outgoing_share_target_info_map_.find(share_target.id); + int64_t share_target_id) { + auto it = outgoing_share_target_info_map_.find(share_target_id); if (it == outgoing_share_target_info_map_.end()) { return nullptr; } @@ -4565,18 +4580,18 @@ OutgoingShareTargetInfo* NearbySharingServiceImpl::GetOutgoingShareTargetInfo( } NearbyConnection* NearbySharingServiceImpl::GetConnection( - const ShareTarget& share_target) { - ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target); + int64_t share_target_id) { + ShareTargetInfo* share_target_info = GetShareTargetInfo(share_target_id); return share_target_info ? share_target_info->connection() : nullptr; } std::optional> NearbySharingServiceImpl::GetBluetoothMacAddressForShareTarget( - const ShareTarget& share_target) { - ShareTargetInfo* info = GetShareTargetInfo(share_target); + int64_t share_target_id) { + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (!info) { NL_LOG(ERROR) << __func__ << ": No ShareTargetInfo found for " - << "share target id: " << share_target.id; + << "share target id: " << share_target_id; return std::nullopt; } @@ -4584,7 +4599,7 @@ NearbySharingServiceImpl::GetBluetoothMacAddressForShareTarget( info->certificate(); if (!certificate) { NL_LOG(ERROR) << __func__ << ": No decrypted public certificate found for " - << "share target id: " << share_target.id; + << "share target id: " << share_target_id; return std::nullopt; } @@ -4615,30 +4630,30 @@ std::optional NearbySharingServiceImpl::GetAttachmentPayloadId( } void NearbySharingServiceImpl::UnregisterShareTarget( - const ShareTarget& share_target) { + bool is_incoming, int64_t share_target_id) { NL_VLOG(1) << __func__ << ": Unregistering share target - " - << share_target.id; + << share_target_id; // For metrics. - all_cancelled_share_target_ids_.erase(share_target.id); + all_cancelled_share_target_ids_.erase(share_target_id); - if (share_target.is_incoming) { + if (is_incoming) { if (last_incoming_metadata_ && - last_incoming_metadata_->first.id == share_target.id) { + last_incoming_metadata_->first.id == share_target_id) { last_incoming_metadata_.reset(); } // Clear legacy incoming payloads to release resources. nearby_connections_manager_->ClearIncomingPayloads(); - incoming_share_target_info_map_.erase(share_target.id); + incoming_share_target_info_map_.erase(share_target_id); } else { if (last_outgoing_metadata_ && - last_outgoing_metadata_->first.id == share_target.id) { + last_outgoing_metadata_->first.id == share_target_id) { last_outgoing_metadata_.reset(); } // Find the endpoint id that matches the given share target. std::optional endpoint_id; - auto it = outgoing_share_target_info_map_.find(share_target.id); + auto it = outgoing_share_target_info_map_.find(share_target_id); if (it != outgoing_share_target_info_map_.end()) endpoint_id = it->second.endpoint_id(); @@ -4654,7 +4669,7 @@ void NearbySharingServiceImpl::UnregisterShareTarget( ClearOutgoingShareTargetInfoMap(); } - NL_VLOG(1) << __func__ << ": Unregister share target: " << share_target.id; + NL_VLOG(1) << __func__ << ": Unregister share target: " << share_target_id; } mutual_acceptance_timeout_alarm_->Stop(); } @@ -4734,21 +4749,23 @@ void NearbySharingServiceImpl::AbortAndCloseConnectionIfNecessary( TransferMetadata::Status status, const ShareTarget& share_target) { RunOnNearbySharingServiceThread( "abort_and_close_connection_if_necessary", [&, status, share_target]() { + int64_t share_target_id = share_target.id; TransferMetadata metadata = TransferMetadataBuilder().set_status(status).build(); - ShareTargetInfo* info = GetShareTargetInfo(share_target); + ShareTargetInfo* info = GetShareTargetInfo(share_target_id); if (info == nullptr) { - NL_LOG(WARNING) << ": Share target " << share_target.id << " lost"; + NL_LOG(WARNING) << ": Share target " << share_target_id << " lost"; return; } + bool is_incoming = info->IsIncoming(); // First invoke the appropriate transfer callback with the final // |status|. if (info && info->transfer_update_callback()) { info->transfer_update_callback()->OnTransferUpdate(share_target, metadata); - } else if (share_target.is_incoming) { + } else if (is_incoming) { OnIncomingTransferUpdate(share_target, metadata); } else { OnOutgoingTransferUpdate(share_target, metadata); @@ -4759,10 +4776,12 @@ void NearbySharingServiceImpl::AbortAndCloseConnectionIfNecessary( // Ensure that the disconnect listener is set to UnregisterShareTarget // because the other listeners also try to record a final status // metric. - info->connection()->SetDisconnectionListener([&, share_target]() { + info->connection()->SetDisconnectionListener([&, is_incoming, + share_target_id]() { RunOnNearbySharingServiceThread( - "disconnection_listener", - [&, share_target]() { UnregisterShareTarget(share_target); }); + "disconnection_listener", [&, is_incoming, share_target_id]() { + UnregisterShareTarget(is_incoming, share_target_id); + }); }); info->connection()->Close(); diff --git a/sharing/nearby_sharing_service_impl.h b/sharing/nearby_sharing_service_impl.h index 3d6e3d00..871e36ed 100644 --- a/sharing/nearby_sharing_service_impl.h +++ b/sharing/nearby_sharing_service_impl.h @@ -343,7 +343,7 @@ class NearbySharingServiceImpl const TransferMetadata& metadata); void OnOutgoingTransferUpdate(const ShareTarget& share_target, const TransferMetadata& metadata); - void CloseConnection(const ShareTarget& share_target); + void CloseConnection(int64_t share_target_id); void OnIncomingDecryptedCertificate( absl::string_view endpoint_id, std::unique_ptr advertisement, @@ -406,28 +406,26 @@ class NearbySharingServiceImpl TransferMetadata metadata); bool OnIncomingPayloadsComplete(ShareTarget& share_target); void RemoveIncomingPayloads(ShareTarget share_target); - void Disconnect(const ShareTarget& share_target, TransferMetadata metadata); + void Disconnect(int64_t share_target_id, TransferMetadata metadata); void OnDisconnectingConnectionTimeout(absl::string_view endpoint_id); - void OnDisconnectingConnectionDisconnected(const ShareTarget& share_target, + void OnDisconnectingConnectionDisconnected(int64_t share_target_id, absl::string_view endpoint_id); ShareTargetInfo& GetOrCreateShareTargetInfo(const ShareTarget& share_target, absl::string_view endpoint_id); - ShareTargetInfo* GetShareTargetInfo(const ShareTarget& share_target); - IncomingShareTargetInfo* GetIncomingShareTargetInfo( - const ShareTarget& share_target); - OutgoingShareTargetInfo* GetOutgoingShareTargetInfo( - const ShareTarget& share_target); + ShareTargetInfo* GetShareTargetInfo(int64_t share_target_id); + IncomingShareTargetInfo* GetIncomingShareTargetInfo(int64_t share_target_id); + OutgoingShareTargetInfo* GetOutgoingShareTargetInfo(int64_t share_target_id); - NearbyConnection* GetConnection(const ShareTarget& share_target); + NearbyConnection* GetConnection(int64_t share_target_id); std::optional> GetBluetoothMacAddressForShareTarget( - const ShareTarget& share_target); + int64_t share_target_id); void ClearOutgoingShareTargetInfoMap(); void SetAttachmentPayloadId(const Attachment& attachment, int64_t payload_id); std::optional GetAttachmentPayloadId(int64_t attachment_id); - void UnregisterShareTarget(const ShareTarget& share_target); + void UnregisterShareTarget(bool is_incoming, int64_t share_target_id); void OnStartAdvertisingResult(bool used_device_name, Status status); void OnStopAdvertisingResult(Status status); diff --git a/sharing/outgoing_share_target_info.h b/sharing/outgoing_share_target_info.h index 1b6ee1f4..8992a83b 100644 --- a/sharing/outgoing_share_target_info.h +++ b/sharing/outgoing_share_target_info.h @@ -34,6 +34,8 @@ class OutgoingShareTargetInfo : public ShareTargetInfo { OutgoingShareTargetInfo& operator=(OutgoingShareTargetInfo&&); ~OutgoingShareTargetInfo() override; + bool IsIncoming() const override { return false; } + const std::optional& obfuscated_gaia_id() const { return obfuscated_gaia_id_; } diff --git a/sharing/share_target_info.h b/sharing/share_target_info.h index ee844c26..af1e1714 100644 --- a/sharing/share_target_info.h +++ b/sharing/share_target_info.h @@ -42,6 +42,7 @@ class ShareTargetInfo { ShareTargetInfo& operator=(ShareTargetInfo&&); virtual ~ShareTargetInfo(); + virtual bool IsIncoming() const = 0; const std::optional& endpoint_id() const { return endpoint_id_; } void set_endpoint_id(std::string endpoint_id) {