Commit 7ee258b7 authored by James Vecore's avatar James Vecore Committed by Commit Bot

[Nearby] Implement missing cancel functionality

Follow up bug for unit-tests: https://crbug.com/1148598

Fixed: 1145752
Change-Id: Ie9ee724f03498264b75b9f2ff31e5f4517ceb9d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2534293
Commit-Queue: James Vecore <vecore@google.com>
Reviewed-by: default avatarJosh Nohle <nohle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827174}
parent 5d870eb9
...@@ -28,6 +28,12 @@ constexpr base::TimeDelta kOutgoingDisconnectionDelay = ...@@ -28,6 +28,12 @@ constexpr base::TimeDelta kOutgoingDisconnectionDelay =
constexpr base::TimeDelta kIncomingRejectionDelay = constexpr base::TimeDelta kIncomingRejectionDelay =
base::TimeDelta::FromSeconds(2); base::TimeDelta::FromSeconds(2);
// The delay before the receiver will disconnect from the sender after canceling
// an in progress share. The sender is expected to disconnect immediately after
// reading the rejection frame.
constexpr base::TimeDelta kIncomingCancelDelay =
base::TimeDelta::FromSeconds(5);
// Timeout for reading a frame from remote device. // Timeout for reading a frame from remote device.
constexpr base::TimeDelta kReadFramesTimeout = base::TimeDelta::FromSeconds(15); constexpr base::TimeDelta kReadFramesTimeout = base::TimeDelta::FromSeconds(15);
......
...@@ -748,6 +748,43 @@ void NearbySharingServiceImpl::Reject( ...@@ -748,6 +748,43 @@ void NearbySharingServiceImpl::Reject(
void NearbySharingServiceImpl::Cancel( void NearbySharingServiceImpl::Cancel(
const ShareTarget& share_target, const ShareTarget& share_target,
StatusCodesCallback status_codes_callback) { StatusCodesCallback status_codes_callback) {
ShareTargetInfo* info = GetShareTargetInfo(share_target);
if (!info || !info->connection() || !info->endpoint_id()) {
NS_LOG(ERROR) << __func__
<< ": Cancel invoked for unknown share target, returning "
"kOutOfOrderApiCall";
// Make sure to clean up files just in case.
OnPayloadsFailed(share_target);
std::move(status_codes_callback).Run(StatusCodes::kOutOfOrderApiCall);
return;
}
base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&NearbySharingServiceImpl::CloseConnection,
weak_ptr_factory_.GetWeakPtr(), share_target),
kIncomingCancelDelay);
info->connection()->SetDisconnectionListener(
base::BindOnce(&NearbySharingServiceImpl::UnregisterShareTarget,
weak_ptr_factory_.GetWeakPtr(), share_target));
NS_LOG(INFO) << __func__
<< ": User canceled transfer, write cancel frame and generating "
"local status update.";
WriteCancel(*info->connection());
if (info->transfer_update_callback()) {
info->transfer_update_callback()->OnTransferUpdate(
share_target, TransferMetadataBuilder()
.set_status(TransferMetadata::Status::kCancelled)
.build());
}
// Make sure to clean up files if necessary
OnPayloadsFailed(share_target);
std::move(status_codes_callback).Run(StatusCodes::kOk); std::move(status_codes_callback).Run(StatusCodes::kOk);
} }
...@@ -2194,6 +2231,18 @@ void NearbySharingServiceImpl::WriteResponse( ...@@ -2194,6 +2231,18 @@ void NearbySharingServiceImpl::WriteResponse(
connection.Write(std::move(data)); connection.Write(std::move(data));
} }
void NearbySharingServiceImpl::WriteCancel(NearbyConnection& connection) {
sharing::nearby::Frame frame;
frame.set_version(sharing::nearby::Frame::V1);
sharing::nearby::V1Frame* v1_frame = frame.mutable_v1();
v1_frame->set_type(sharing::nearby::V1Frame::CANCEL);
std::vector<uint8_t> data(frame.ByteSize());
frame.SerializeToArray(data.data(), frame.ByteSize());
connection.Write(std::move(data));
}
void NearbySharingServiceImpl::Fail(const ShareTarget& share_target, void NearbySharingServiceImpl::Fail(const ShareTarget& share_target,
TransferMetadata::Status status) { TransferMetadata::Status status) {
ShareTargetInfo* info = GetShareTargetInfo(share_target); ShareTargetInfo* info = GetShareTargetInfo(share_target);
......
...@@ -228,6 +228,7 @@ class NearbySharingServiceImpl ...@@ -228,6 +228,7 @@ class NearbySharingServiceImpl
void WriteResponse( void WriteResponse(
NearbyConnection& connection, NearbyConnection& connection,
sharing::nearby::ConnectionResponseFrame::Status reponse_status); sharing::nearby::ConnectionResponseFrame::Status reponse_status);
void WriteCancel(NearbyConnection& connection);
void Fail(const ShareTarget& share_target, TransferMetadata::Status status); void Fail(const ShareTarget& share_target, TransferMetadata::Status status);
void OnIncomingAdvertisementDecoded( void OnIncomingAdvertisementDecoded(
const std::string& endpoint_id, const std::string& endpoint_id,
......
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