From bd9d01ec29b4697794a4e91b1271b5f9d85c9dd7 Mon Sep 17 00:00:00 2001 From: jfcarroll Date: Tue, 28 Jun 2022 17:39:36 -0700 Subject: [PATCH] Fix for outgoing file names being truncated, and renaming input files should not occur, only output files. PiperOrigin-RevId: 457857046 --- connections/payload.cc | 43 +++---------------- connections/payload_test.cc | 23 ++++++++++ internal/platform/implementation/platform.h | 2 + .../implementation/windows/platform.cc | 9 +++- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/connections/payload.cc b/connections/payload.cc index 9b05384d..61e45493 100644 --- a/connections/payload.cc +++ b/connections/payload.cc @@ -14,6 +14,7 @@ #include "connections/payload.h" +#include #include namespace location { @@ -21,46 +22,16 @@ namespace nearby { namespace connections { namespace { -std::string SepFinder(std::string s, size_t index) { - std::string filename = s.substr(index + 1, s.length() - index); - size_t lastindex = filename.find_last_of('.'); - std::string rawname = filename.substr(0, lastindex); - return rawname; -} std::string getFileName(const std::string& s) { - char forwardSep = '/'; - char backwardSep = '\\'; + std::string s_copy(s); + std::replace(s_copy.begin(), s_copy.end(), '\\', + '/'); // replace all '\\' to '/' - size_t lastForwardSepIndex = s.rfind(forwardSep, s.length()); - size_t lastBackwardSepIndex = s.rfind(backwardSep, s.length()); + size_t lastForwardSepIndex = s_copy.rfind('/', s.length()); - if (lastForwardSepIndex == std::string::npos && - lastBackwardSepIndex == std::string::npos) { - // no file name found - return (""); - } - - // If we have a forward sep - if (lastForwardSepIndex != std::string::npos) { - // and if backward sep doesn't exist - if (lastBackwardSepIndex == std::string::npos) { - // Construct filename from forward sep - std::string rawname = SepFinder(s, lastForwardSepIndex); - return (rawname); - } - // backward sep also exists - if (lastForwardSepIndex > lastBackwardSepIndex) { - // the forward sep is the last - std::string rawname = SepFinder(s, lastForwardSepIndex); - return (rawname); - } - // The backward sep is the last - std::string rawname = SepFinder(s, lastBackwardSepIndex); - return (rawname); - } - std::string rawname = SepFinder(s, lastBackwardSepIndex); - return (rawname); + return s_copy.substr(lastForwardSepIndex + 1, + s_copy.length() - lastForwardSepIndex); } } // namespace diff --git a/connections/payload_test.cc b/connections/payload_test.cc index b6228cb5..e49d48a7 100644 --- a/connections/payload_test.cc +++ b/connections/payload_test.cc @@ -52,6 +52,7 @@ TEST(PayloadTest, SupportsFileType) { Payload payload(payload_id, std::move(file)); payload.SetOffset(kOffset); + EXPECT_EQ(payload.GetFileName(), std::to_string(payload_id)); EXPECT_EQ(payload.GetType(), PayloadType::kFile); EXPECT_EQ(payload.AsStream(), nullptr); EXPECT_EQ(&payload.AsFile()->GetInputStream(), &stream); @@ -59,6 +60,28 @@ TEST(PayloadTest, SupportsFileType) { EXPECT_EQ(payload.GetOffset(), kOffset); } +TEST(PayloadTest, SupportsMultiDotNamedFileType) { + constexpr char expected[] = "this.is.a.multidot.file"; + InputFile file(expected, 0); + + Payload payload(std::move(file)); + + EXPECT_EQ(payload.GetFileName(), expected); +} + +TEST(PayloadTest, + SupportsBackSlashFolderSeparatorsByExtractingFileNameBeforeStoring) { + constexpr char file_name[] = + "test_folder.here\\this.is.a.multidot.backslash.folder.separated.file"; + constexpr char expected[] = + "this.is.a.multidot.backslash.folder.separated.file"; + InputFile file(file_name, 0); + + Payload payload(std::move(file)); + + EXPECT_EQ(payload.GetFileName(), expected); +} + TEST(PayloadTest, SupportsStreamType) { constexpr size_t kOffset = 1234456; auto pipe = std::make_shared(); diff --git a/internal/platform/implementation/platform.h b/internal/platform/implementation/platform.h index 5d013310..f599859d 100644 --- a/internal/platform/implementation/platform.h +++ b/internal/platform/implementation/platform.h @@ -67,6 +67,8 @@ class ImplementationPlatform { static std::string GetDownloadPath(std::string& parent_folder, std::string& file_name); + static std::string GetDownloadPath(std::string& file_name); + static OSName GetCurrentOS(); // Atomics: diff --git a/internal/platform/implementation/windows/platform.cc b/internal/platform/implementation/windows/platform.cc index d966fae2..4d9dea6b 100644 --- a/internal/platform/implementation/windows/platform.cc +++ b/internal/platform/implementation/windows/platform.cc @@ -173,6 +173,11 @@ std::string ImplementationPlatform::GetDownloadPath(std::string& parent_folder, GetDownloadPathInternal(parent_folder, file_name)); } +std::string ImplementationPlatform::GetDownloadPath(std::string& file_name) { + std::string fake_parent_path; + return GetDownloadPathInternal(fake_parent_path, file_name); +} + OSName ImplementationPlatform::GetCurrentOS() { return OSName::kWindows; } std::unique_ptr ImplementationPlatform::CreateAtomicBoolean( @@ -204,8 +209,8 @@ std::unique_ptr ImplementationPlatform::CreateInputFile( PayloadId payload_id, std::int64_t total_size) { std::string parent_folder(""); std::string file_name(std::to_string(payload_id)); - return shared::IOFile::CreateInputFile( - GetDownloadPath(parent_folder, file_name), total_size); + return shared::IOFile::CreateInputFile(GetDownloadPath(file_name), + total_size); } std::unique_ptr ImplementationPlatform::CreateInputFile(