From 7ffd1c15a6d9f14424c51ab18e81835319fc557a Mon Sep 17 00:00:00 2001 From: Lukasz Mastalerz Date: Mon, 21 Aug 2023 10:28:24 +0200 Subject: [PATCH] [CP-2032] Unplugging the cable during file upload leaves partially sent file Files not completely sent will be deleted after the USB cable is removed from device to not leave any partially sent file --- harmony_changelog.md | 1 + .../service-desktop/ServiceDesktop.cpp | 9 +++++++++ .../endpoints/filesystem/FileOperations.cpp | 17 +++++++++++++++-- .../endpoints/filesystem/FileOperations.hpp | 4 +++- .../include/service-desktop/ServiceDesktop.hpp | 2 ++ pure_changelog.md | 1 + 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/harmony_changelog.md b/harmony_changelog.md index 69eba371aa12a58747a3a8fcfeaded643b54acea..31f42920a21065b3bc1d13ce9bc7857528d250e9 100644 --- a/harmony_changelog.md +++ b/harmony_changelog.md @@ -31,6 +31,7 @@ * Added extended information to log filename * Added Harmony version information in about section * Added system shutdown if there is no user activity for 180 seconds on the language selection screen +* Files not fully transferred via Center will be now removed when USB cable is unplugged ### Changed / Improved diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 897bc08e506d8ec4d5c0edf6a042233b2956cd28..53b9c7cff71c045a8d4c4fd33a160b1baef4ec71 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -10,6 +10,7 @@ #include #include #include +#include ServiceDesktop::ServiceDesktop(const std::filesystem::path &mtpRootPath) : sys::Service(service::name::service_desktop, "", sdesktop::serviceStackSize), @@ -203,12 +204,15 @@ auto ServiceDesktop::usbWorkerDeinit() -> sys::ReturnCodes if (!initialized) { return sys::ReturnCodes::Success; } + LOG_DEBUG("Deinitializing USB worker"); settings->deinit(); desktopWorker->closeWorker(); desktopWorker.reset(); initialized = false; isUsbConfigured = false; + // It must be run after the worker is closed. + cleanFileSystemEndpointUndeliveredTransfers(); return sys::ReturnCodes::Success; } @@ -374,3 +378,8 @@ auto ServiceDesktop::getOnboardingState() const -> sdesktop::endpoints::Onboardi return static_cast(utils::getNumericValue( settings->getValue(settings::SystemProperties::onboardingDone, settings::SettingsScope::Global))); } + +void ServiceDesktop::cleanFileSystemEndpointUndeliveredTransfers() +{ + FileOperations::instance().cleanUpUndeliveredTransfers(); +} diff --git a/module-services/service-desktop/endpoints/filesystem/FileOperations.cpp b/module-services/service-desktop/endpoints/filesystem/FileOperations.cpp index c20493b6bb1134a6c071ff1d410f4b6296c9ac6a..879b11344d50a52c21694a2e94472f5c61586391 100644 --- a/module-services/service-desktop/endpoints/filesystem/FileOperations.cpp +++ b/module-services/service-desktop/endpoints/filesystem/FileOperations.cpp @@ -67,7 +67,7 @@ void FileOperations::cancelTimedOutWriteTransfer() fileCtxEntry->second.reset(); - LOG_DEBUG("Canceling timed out rxID %u", static_cast(timedOutXfer)); + LOG_DEBUG("Canceling timed out txID %u", static_cast(timedOutXfer)); writeTransfers.erase(timedOutXfer); } @@ -175,7 +175,6 @@ auto FileOperations::createTransmitIDForFile(const std::filesystem::path &file, createFileWriteContextFor(file, size, Crc32, txID); fileData = std::make_unique>(SingleChunkSize, 0); - return txID; } @@ -226,3 +225,17 @@ auto FileOperations::sendDataForTransmitID(transfer_id txID, std::uint32_t chunk return returnCode; } + +auto FileOperations::cleanUpUndeliveredTransfers() -> void +{ + if (writeTransfers.empty()) { + return; + } + + LOG_INFO("Clean up after undelivered transfers"); + for (auto &wt : writeTransfers) { + wt.second->removeFile(); + wt.second.reset(); + writeTransfers.erase(wt.first); + } +} diff --git a/module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp b/module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp index 36421b8370332cd4f0c546c9c2d88a03979b687b..01b10bb8fc430bdb12f1fb95c0e1237836964c1e 100644 --- a/module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp +++ b/module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp @@ -5,6 +5,7 @@ #include "FileContext.hpp" +#include #include #include #include @@ -26,7 +27,6 @@ class FileOperations std::atomic runningRxId{0}; std::atomic runningTxId{0}; std::unique_ptr> fileData{}; - auto createFileReadContextFor(const std::filesystem::path &file, std::size_t fileSize, transfer_id xfrId) -> void; auto createFileWriteContextFor(const std::filesystem::path &file, @@ -71,4 +71,6 @@ class FileOperations -> transfer_id; auto sendDataForTransmitID(transfer_id, std::uint32_t chunkNo, const std::string &data) -> sys::ReturnCodes; + + auto cleanUpUndeliveredTransfers() -> void; }; diff --git a/module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp b/module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp index 30cf93ece199d105845b6856c9882973c839ab46..8af01c34cb7331ad656588d3707eb5613dc9ce8b 100644 --- a/module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp +++ b/module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp @@ -120,6 +120,8 @@ class ServiceDesktop : public sys::Service void checkChargingCondition(); + void cleanFileSystemEndpointUndeliveredTransfers(); + template auto connectHandler() -> bool { diff --git a/pure_changelog.md b/pure_changelog.md index a2ee570fd87383ccef80168b089b128187e8aa17..4a378fc46bdb37dfb5f56099ef6736a0d96f608c 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -8,6 +8,7 @@ * Added extended information to crashdump filename * Added extended information to log filename * Added GUI screens informing about failed MMI/USSD request +* Files not fully transferred via Center will be now removed when USB cable is unplugged ### Changed / Improved