From f904b321bc152fcd505f19b27654e10d8723434a Mon Sep 17 00:00:00 2001 From: Green Sky Date: Fri, 13 Oct 2023 20:39:40 +0200 Subject: [PATCH] allow setting the file path directly (not just dir) --- .../tox_messages/tox_transfer_manager.cpp | 55 +++++++++++++++++-- .../tox_messages/tox_transfer_manager.hpp | 3 +- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/solanaceae/tox_messages/tox_transfer_manager.cpp b/solanaceae/tox_messages/tox_transfer_manager.cpp index e58a5e6..b17d430 100644 --- a/solanaceae/tox_messages/tox_transfer_manager.cpp +++ b/solanaceae/tox_messages/tox_transfer_manager.cpp @@ -233,6 +233,40 @@ bool ToxTransferManager::setFileI(Message3Handle transfer, std::unique_ptr(transfer)) { + std::cerr << "TTM error: setFilePath() transfer " << entt::to_integral(transfer.entity()) << " is not a valid transfer\n"; + return false; + } + + uint64_t file_size {0}; + std::filesystem::path full_file_path{file_path}; + std::filesystem::create_directories(full_file_path.parent_path()); + + // TODO: read file name(s) from comp + if (transfer.all_of()) { + const auto& file_info = transfer.get(); + file_size = file_info.total_size; // hack + // HACK: use fist enty + assert(file_info.file_list.size() == 1); + } + + transfer.emplace(std::vector{full_file_path.u8string()}); + + auto file_impl = std::make_unique(full_file_path.u8string(), file_size); + if (!file_impl->isGood()) { + std::cerr << "TTM error: failed opening file '" << file_path << "'!\n"; + return false; + } + + transfer.emplace_or_replace(std::move(file_impl)); + + // TODO: is this a good idea???? + _rmm.throwEventUpdate(transfer); + + return true; +} + bool ToxTransferManager::setFilePathDir(Message3Handle transfer, std::string_view file_path) { if (!static_cast(transfer)) { std::cerr << "TTM error: setFilePathDir() transfer " << entt::to_integral(transfer.entity()) << " is not a valid transfer\n"; @@ -278,7 +312,7 @@ bool ToxTransferManager::setFilePathDir(Message3Handle transfer, std::string_vie return true; } -bool ToxTransferManager::accept(Message3Handle transfer, std::string_view file_path) { +bool ToxTransferManager::accept(Message3Handle transfer, std::string_view file_path, bool is_file_path) { if (!static_cast(transfer)) { std::cerr << "TTM error: accepted transfer " << entt::to_integral(transfer.entity()) << " is not a valid transfer\n"; return false; @@ -293,9 +327,16 @@ bool ToxTransferManager::accept(Message3Handle transfer, std::string_view file_p std::cerr << "TTM warning: overwriting existing file_impl " << entt::to_integral(transfer.entity()) << "\n"; } - if (!setFilePathDir(transfer, file_path)) { - std::cerr << "TTM error: accepted transfer " << entt::to_integral(transfer.entity()) << " failed setting path\n"; - return false; + if (is_file_path) { + if (!setFilePath(transfer, file_path)) { + std::cerr << "TTM error: accepted transfer " << entt::to_integral(transfer.entity()) << " failed setting path\n"; + return false; + } + } else { + if (!setFilePathDir(transfer, file_path)) { + std::cerr << "TTM error: accepted transfer " << entt::to_integral(transfer.entity()) << " failed setting path dir\n"; + return false; + } } if (!resume(transfer)) { @@ -316,7 +357,11 @@ bool ToxTransferManager::onEvent(const Message::Events::MessageConstruct&) { bool ToxTransferManager::onEvent(const Message::Events::MessageUpdated& e) { if (e.e.all_of()) { - accept(e.e, e.e.get().save_to_path); + accept( + e.e, + e.e.get().save_to_path, + e.e.get().path_is_file + ); // should? e.e.remove(); diff --git a/solanaceae/tox_messages/tox_transfer_manager.hpp b/solanaceae/tox_messages/tox_transfer_manager.hpp index ec29e74..604cfa6 100644 --- a/solanaceae/tox_messages/tox_transfer_manager.hpp +++ b/solanaceae/tox_messages/tox_transfer_manager.hpp @@ -43,10 +43,11 @@ class ToxTransferManager : public RegistryMessageModelEventI, public ToxEventI { bool resume(Message3Handle transfer); bool pause(Message3Handle transfer); bool setFileI(Message3Handle transfer, std::unique_ptr&& new_file); // note, does not emplace FileInfoLocal + bool setFilePath(Message3Handle transfer, std::string_view file_path); bool setFilePathDir(Message3Handle transfer, std::string_view file_path); // calls setFileI() and resume() - bool accept(Message3Handle transfer, std::string_view file_path); + bool accept(Message3Handle transfer, std::string_view file_path, bool is_file_path); protected: bool onEvent(const Message::Events::MessageConstruct&) override;