mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
Add SetCustomSavePath API to Nearby Connections
PiperOrigin-RevId: 492563503
This commit is contained in:
committed by
Copybara-Service
parent
2273c87b57
commit
49af1a96b6
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user