blob: c64379cb05deaae176ed1d3c2ef0b3d5c483d8f6 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/nearby_sharing/nearby_connection_impl.h"
#include "chrome/browser/nearby_sharing/nearby_connections_manager.h"
#include "crypto/random.h"
NearbyConnectionImpl::NearbyConnectionImpl(
NearbyConnectionsManager* nearby_connections_manager,
const std::string& endpoint_id)
: nearby_connections_manager_(nearby_connections_manager),
endpoint_id_(endpoint_id) {}
NearbyConnectionImpl::~NearbyConnectionImpl() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (disconnect_listener_)
std::move(disconnect_listener_).Run();
if (read_callback_)
std::move(read_callback_).Run(absl::nullopt);
}
void NearbyConnectionImpl::Read(ReadCallback callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
read_callback_ = std::move(callback);
if (reads_.empty())
return;
std::vector<uint8_t> bytes = std::move(reads_.front());
reads_.pop();
std::move(read_callback_).Run(std::move(bytes));
}
void NearbyConnectionImpl::Write(std::vector<uint8_t> bytes) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
NearbyConnectionsManager::PayloadPtr payload =
NearbyConnectionsManager::Payload::New();
crypto::RandBytes(&payload->id, sizeof(payload->id));
payload->content =
PayloadContent::NewBytes(BytesPayload::New(std::move(bytes)));
nearby_connections_manager_->Send(endpoint_id_, std::move(payload),
/*listener=*/nullptr);
}
void NearbyConnectionImpl::Close() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// As |this| therefore endpoint_id_ will be distroyed in Disconnect, make a
// copy of |endpoint_id| as the parameter is a const ref.
nearby_connections_manager_->Disconnect(std::string(endpoint_id_));
}
void NearbyConnectionImpl::SetDisconnectionListener(
base::OnceClosure listener) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
disconnect_listener_ = std::move(listener);
}
void NearbyConnectionImpl::WriteMessage(std::vector<uint8_t> bytes) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (read_callback_) {
std::move(read_callback_).Run(std::move(bytes));
return;
}
reads_.push(std::move(bytes));
}