From d423433a22b960a6fb916384b491a087e26a6e45 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sun, 26 May 2024 18:57:36 +0200 Subject: [PATCH] switch over to file2 --- CMakeLists.txt | 1 + .../tox_messages/tox_transfer_manager.cpp | 37 ++++++++++++++----- .../tox_messages/tox_transfer_manager.hpp | 4 +- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bd28ee..498923e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,5 +37,6 @@ target_compile_features(solanaceae_tox_messages PUBLIC cxx_std_17) target_link_libraries(solanaceae_tox_messages PUBLIC solanaceae_tox_contacts solanaceae_message3 + solanaceae_file2 ) diff --git a/solanaceae/tox_messages/tox_transfer_manager.cpp b/solanaceae/tox_messages/tox_transfer_manager.cpp index 9f0fc2b..363771b 100644 --- a/solanaceae/tox_messages/tox_transfer_manager.cpp +++ b/solanaceae/tox_messages/tox_transfer_manager.cpp @@ -3,8 +3,7 @@ #include #include -#include -#include +#include #include #include @@ -19,6 +18,18 @@ // https://youtu.be/4XsL5iYHS6c +static ByteSpan spanFromRead(const std::variant>& data_var) { + if (std::holds_alternative>(data_var)) { + auto& vec = std::get>(data_var); + return {vec.data(), vec.size()}; + } else if (std::holds_alternative(data_var)) { + return std::get(data_var); + } else { + assert(false); + return {}; + } +} + void ToxTransferManager::toxFriendLookupAdd(Message3Handle h) { const auto& comp = h.get(); const uint64_t key {(uint64_t(comp.friend_number) << 32) | comp.transfer_number}; @@ -102,7 +113,7 @@ Message3Handle ToxTransferManager::toxSendFilePath(const Contact3 c, uint32_t fi return {}; } - auto file_impl = std::make_unique(file_path); + auto file_impl = std::make_unique(file_path); if (!file_impl->isGood()) { std::cerr << "TTM error: failed opening file '" << file_path << "'!\n"; return {}; @@ -216,7 +227,7 @@ bool ToxTransferManager::pause(Message3Handle transfer) { return true; } -bool ToxTransferManager::setFileI(Message3Handle transfer, std::unique_ptr&& new_file) { +bool ToxTransferManager::setFileI(Message3Handle transfer, std::unique_ptr&& new_file) { if (!static_cast(transfer)) { std::cerr << "TTM error: setFileI() transfer " << entt::to_integral(transfer.entity()) << " is not a valid transfer\n"; return false; @@ -256,7 +267,7 @@ bool ToxTransferManager::setFilePath(Message3Handle transfer, std::string_view f transfer.emplace(std::vector{full_file_path.u8string()}); - auto file_impl = std::make_unique(full_file_path.u8string(), file_size); + auto file_impl = std::make_unique(full_file_path.u8string(), file_size, true); if (!file_impl->isGood()) { std::cerr << "TTM error: failed opening file '" << file_path << "'!\n"; return false; @@ -301,7 +312,7 @@ bool ToxTransferManager::setFilePathDir(Message3Handle transfer, std::string_vie transfer.emplace(std::vector{full_file_path}); - auto file_impl = std::make_unique(full_file_path, file_size); + auto file_impl = std::make_unique(full_file_path, file_size, true); if (!file_impl->isGood()) { std::cerr << "TTM error: failed opening file '" << file_path << "'!\n"; return false; @@ -602,7 +613,7 @@ bool ToxTransferManager::onToxEvent(const Tox_Event_File_Recv_Chunk* e) { _rmm.throwEventUpdate(transfer); } else { auto* file = transfer.get().get(); - const auto res = file->write(position, std::vector{data, data+data_size}); + const auto res = file->write({data, data_size}, position); transfer.get().total += data_size; // queue? @@ -655,12 +666,18 @@ bool ToxTransferManager::onToxEvent(const Tox_Event_File_Chunk_Request* e) { _rmm.throwEventUpdate(transfer); } else { auto* file = transfer.get().get(); - const auto data = file->read(position, data_size); + const auto data = file->read(data_size, position); + const auto data_span = spanFromRead(data); + if (data_span.empty()) { + std::cerr << "TMM error: failed to read file!!\n"; + return true; + } - const auto err = _t.toxFileSendChunk(friend_number, file_number, position, data); + // TODO: get rid of the data cast and support spans in the tox api + const auto err = _t.toxFileSendChunk(friend_number, file_number, position, static_cast>(data_span)); // TODO: investigate if i need to retry if sendq full if (err == TOX_ERR_FILE_SEND_CHUNK_OK) { - transfer.get().total += data.size(); + transfer.get().total += data_span.size; _rmm.throwEventUpdate(transfer); } } diff --git a/solanaceae/tox_messages/tox_transfer_manager.hpp b/solanaceae/tox_messages/tox_transfer_manager.hpp index 604cfa6..3aa71b5 100644 --- a/solanaceae/tox_messages/tox_transfer_manager.hpp +++ b/solanaceae/tox_messages/tox_transfer_manager.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include @@ -42,7 +42,7 @@ 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 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);