Add SetCustomSavePath API to Nearby Connections

PiperOrigin-RevId: 492563503
This commit is contained in:
Aaron Yu
2022-12-02 14:38:55 -08:00
committed by Copybara-Service
parent 2273c87b57
commit 49af1a96b6
20 changed files with 193 additions and 82 deletions
@@ -316,18 +316,26 @@ std::unique_ptr<InternalPayload> CreateOutgoingInternalPayload(
}
std::string make_path(std::string& parent_folder, std::string& file_name) {
if (!parent_folder.empty()) {
return std::string(api::ImplementationPlatform::GetCustomSavePath(
parent_folder, file_name));
}
return std::string(
api::ImplementationPlatform::GetDownloadPath(parent_folder, file_name));
}
std::string make_path(std::string& parent_folder, int64_t id) {
std::string file_name(std::to_string(id));
if (!parent_folder.empty()) {
return std::string(api::ImplementationPlatform::GetCustomSavePath(
parent_folder, file_name));
}
return std::string(
api::ImplementationPlatform::GetDownloadPath(parent_folder, file_name));
}
std::unique_ptr<InternalPayload> CreateIncomingInternalPayload(
const PayloadTransferFrame& frame) {
const PayloadTransferFrame& frame, const std::string& custom_save_path) {
if (frame.packet_type() != PayloadTransferFrame::DATA) {
return {};
}
@@ -351,7 +359,7 @@ std::unique_ptr<InternalPayload> CreateIncomingInternalPayload(
}
case PayloadTransferFrame::PayloadHeader::FILE: {
std::string parent_folder("");
std::string parent_folder(custom_save_path);
std::string file_name("");
std::string file_path("");
@@ -15,6 +15,10 @@
#ifndef CORE_INTERNAL_INTERNAL_PAYLOAD_FACTORY_H_
#define CORE_INTERNAL_INTERNAL_PAYLOAD_FACTORY_H_
#include <string>
#include <memory>
#include "connections/implementation/internal_payload.h"
#include "connections/payload.h"
@@ -28,7 +32,7 @@ std::unique_ptr<InternalPayload> CreateOutgoingInternalPayload(Payload payload);
// Creates an InternalPayload representing an incoming Payload from a remote
// endpoint.
std::unique_ptr<InternalPayload> CreateIncomingInternalPayload(
const PayloadTransferFrame& frame);
const PayloadTransferFrame& frame, const std::string& custom_save_path);
} // namespace connections
} // namespace nearby
@@ -71,6 +71,7 @@ TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromFilePayload) {
TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromByteMessage) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
std::int64_t payload_chunk_offset = 0;
ByteArray data(kText);
@@ -84,7 +85,7 @@ TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromByteMessage) {
header.set_total_size(512);
*frame.mutable_payload_chunk() = std::move(payload_chunk);
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_NE(internal_payload, nullptr);
Payload payload = internal_payload->ReleasePayload();
EXPECT_EQ(payload.AsFile(), nullptr);
@@ -94,13 +95,14 @@ TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromByteMessage) {
TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromStreamMessage) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
auto& header = *frame.mutable_payload_header();
header.set_type(PayloadTransferFrame::PayloadHeader::STREAM);
header.set_id(12345);
header.set_total_size(0);
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_NE(internal_payload, nullptr);
Payload payload = internal_payload->ReleasePayload();
EXPECT_EQ(payload.AsFile(), nullptr);
@@ -111,13 +113,14 @@ TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromStreamMessage) {
TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromFileMessage) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
auto& header = *frame.mutable_payload_header();
header.set_type(PayloadTransferFrame::PayloadHeader::FILE);
header.set_id(12345);
header.set_total_size(512);
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_NE(internal_payload, nullptr);
Payload payload = internal_payload->ReleasePayload();
EXPECT_NE(payload.AsFile(), nullptr);
@@ -129,25 +132,27 @@ TEST(InternalPayloadFactoryTest, CanCreateInternalPayloadFromFileMessage) {
TEST(InternalPayloadFactoryTest,
InternalPayloadFromFileMessageWithoutIdReturnsNullptr) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
auto& header = *frame.mutable_payload_header();
header.set_type(PayloadTransferFrame::PayloadHeader::FILE);
header.set_total_size(512);
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_EQ(internal_payload, nullptr);
}
TEST(InternalPayloadFactoryTest,
CanCreateInternalPayloadFromFileMessageWithFileNameNotSet) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
auto& header = *frame.mutable_payload_header();
header.set_type(PayloadTransferFrame::PayloadHeader::FILE);
header.set_id(12345);
header.set_total_size(512);
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_NE(internal_payload, nullptr);
Payload payload = internal_payload->ReleasePayload();
EXPECT_EQ(payload.GetFileName(), "12345");
@@ -155,6 +160,7 @@ TEST(InternalPayloadFactoryTest,
TEST(InternalPayloadFactoryTest,
CanCreateInternalPayloadFromFileMessageWithFileNameSet) {
PayloadTransferFrame frame;
std::string path = "C:\\Downloads";
frame.set_packet_type(PayloadTransferFrame::DATA);
auto& header = *frame.mutable_payload_header();
header.set_type(PayloadTransferFrame::PayloadHeader::FILE);
@@ -162,7 +168,7 @@ TEST(InternalPayloadFactoryTest,
header.set_total_size(512);
header.set_file_name("test.file.name");
std::unique_ptr<InternalPayload> internal_payload =
CreateIncomingInternalPayload(frame);
CreateIncomingInternalPayload(frame, path);
EXPECT_NE(internal_payload, nullptr);
auto test = internal_payload->GetFileName();
Payload payload = internal_payload->ReleasePayload();
@@ -85,6 +85,9 @@ class MockServiceController : public ServiceController {
(override));
MOCK_METHOD(void, ShutdownBwuManagerExecutors, (), (override));
MOCK_METHOD(void, SetCustomSavePath,
(ClientProxy * client, const std::string& path), (override));
};
} // namespace connections
@@ -92,6 +92,11 @@ class MockServiceControllerRouter : public ServiceControllerRouter {
MOCK_METHOD(void, StopAllEndpoints,
(ClientProxy * client, const ResultCallback& callback),
(override));
MOCK_METHOD(void, SetCustomSavePath,
(ClientProxy * client, absl::string_view path,
const ResultCallback& callback),
(override));
};
} // namespace connections
@@ -15,6 +15,8 @@
#include "connections/implementation/offline_service_controller.h"
#include <string>
#include <utility>
#include <vector>
#include "absl/strings/str_join.h"
@@ -142,6 +144,14 @@ void OfflineServiceController::DisconnectFromEndpoint(
endpoint_manager_.UnregisterEndpoint(client, endpoint_id);
}
void OfflineServiceController::SetCustomSavePath(ClientProxy* client,
const std::string& path) {
if (stop_) return;
NEARBY_LOGS(INFO) << "Client " << client->GetClientId()
<< " requested to set custom save path: " << path;
payload_manager_.SetCustomSavePath(client, path);
}
void OfflineServiceController::ShutdownBwuManagerExecutors() {
bwu_manager_.ShutdownExecutors();
}
@@ -77,6 +77,8 @@ class OfflineServiceController : public ServiceController {
void Stop() override;
void SetCustomSavePath(ClientProxy* client, const std::string& path) override;
void ShutdownBwuManagerExecutors() override;
private:
@@ -282,6 +282,7 @@ Payload::Id PayloadManager::CreateOutgoingPayload(
PayloadManager::PayloadManager(EndpointManager& endpoint_manager)
: endpoint_manager_(&endpoint_manager) {
endpoint_manager_->RegisterFrameProcessor(V1Frame::PAYLOAD_TRANSFER, this);
custom_save_path_ = "";
}
void PayloadManager::CancelAllPayloads() {
@@ -676,7 +677,8 @@ PayloadTransferFrame::PayloadChunk PayloadManager::CreatePayloadChunk(
PayloadManager::PendingPayload* PayloadManager::CreateIncomingPayload(
const PayloadTransferFrame& frame, const std::string& endpoint_id) {
auto internal_payload = CreateIncomingInternalPayload(frame);
auto internal_payload =
CreateIncomingInternalPayload(frame, custom_save_path_);
if (!internal_payload) {
return nullptr;
}
@@ -1191,6 +1193,11 @@ PayloadType PayloadManager::FramePayloadTypeToPayloadType(
}
}
void PayloadManager::SetCustomSavePath(ClientProxy* client,
const std::string& path) {
custom_save_path_ = path;
}
///////////////////////////////// EndpointInfo /////////////////////////////////
PayloadManager::EndpointInfo::Status
@@ -71,6 +71,8 @@ class PayloadManager : public EndpointManager::FrameProcessor {
void DisconnectFromEndpointManager();
void SetCustomSavePath(ClientProxy* client, const std::string& path);
private:
// Information about an endpoint for a particular payload.
struct EndpointInfo {
@@ -310,6 +312,7 @@ class PayloadManager : public EndpointManager::FrameProcessor {
PayloadTransferFrame::PayloadHeader::PayloadType type);
mutable Mutex mutex_;
std::string custom_save_path_;
AtomicBoolean shutdown_{false};
std::unique_ptr<CountDownLatch> shutdown_barrier_;
int send_payload_count_ = 0;
@@ -99,6 +99,9 @@ class ServiceController {
virtual void DisconnectFromEndpoint(ClientProxy* client,
const std::string& endpoint_id) = 0;
virtual void SetCustomSavePath(ClientProxy* client,
const std::string& path) = 0;
};
} // namespace connections
@@ -343,6 +343,19 @@ void ServiceControllerRouter::StopAllEndpoints(ClientProxy* client,
});
}
void ServiceControllerRouter::SetCustomSavePath(
ClientProxy* client, absl::string_view path,
const ResultCallback& callback) {
RouteToServiceController(
"scr-set-custom-save-path", [this, client, path, callback]() {
NEARBY_LOGS(INFO) << "Client " << client->GetClientId()
<< " has requested us to set custom save path to "
<< path;
GetServiceController()->SetCustomSavePath(client, std::string(path));
callback.result_cb({Status::kSuccess});
});
}
void ServiceControllerRouter::SetServiceControllerForTesting(
std::unique_ptr<ServiceController> service_controller) {
service_controller_ = std::move(service_controller);
@@ -108,6 +108,9 @@ class ServiceControllerRouter {
virtual void StopAllEndpoints(ClientProxy* client,
const ResultCallback& callback);
virtual void SetCustomSavePath(ClientProxy* client, absl::string_view path,
const ResultCallback& callback);
void SetServiceControllerForTesting(
std::unique_ptr<ServiceController> service_controller);