accept save to and open file (truncated)
This commit is contained in:
parent
8237f902c9
commit
100f4f68c0
2
external/solanaceae_message3
vendored
2
external/solanaceae_message3
vendored
@ -1 +1 @@
|
|||||||
Subproject commit c73e429df138ce32f5cdb5588a3af8257a946680
|
Subproject commit 53d65a06855129135e5884f50d9983676290ac24
|
2
external/solanaceae_tox
vendored
2
external/solanaceae_tox
vendored
@ -1 +1 @@
|
|||||||
Subproject commit de332421f783a94877b7b529a698e0752273e7a4
|
Subproject commit 70a234cdae751141f48b7a53a4e1cbedd84f31b2
|
@ -8,6 +8,7 @@
|
|||||||
#include <solanaceae/tox_messages/components.hpp>
|
#include <solanaceae/tox_messages/components.hpp>
|
||||||
|
|
||||||
#include <solanaceae/message3/file_r_file.hpp>
|
#include <solanaceae/message3/file_r_file.hpp>
|
||||||
|
#include <solanaceae/message3/file_rw_file.hpp>
|
||||||
|
|
||||||
#include "./ft1_sha1_info.hpp"
|
#include "./ft1_sha1_info.hpp"
|
||||||
#include "./hash_utils.hpp"
|
#include "./hash_utils.hpp"
|
||||||
@ -18,6 +19,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
namespace Message::Components {
|
namespace Message::Components {
|
||||||
|
|
||||||
@ -60,6 +62,14 @@ namespace Components {
|
|||||||
float timer {0.f};
|
float timer {0.f};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ReadHeadHint {
|
||||||
|
// points to the first byte we want
|
||||||
|
// this is just a hint, that can be set from outside
|
||||||
|
// to guide the sequential "piece picker" strategy
|
||||||
|
// the strategy *should* set this to the first byte we dont yet have
|
||||||
|
uint64_t offset_into_file {0u};
|
||||||
|
};
|
||||||
|
|
||||||
} // Components
|
} // Components
|
||||||
|
|
||||||
std::optional<size_t> Components::FT1ChunkSHA1Cache::chunkIndex(const SHA1Digest& hash) const {
|
std::optional<size_t> Components::FT1ChunkSHA1Cache::chunkIndex(const SHA1Digest& hash) const {
|
||||||
@ -207,6 +217,9 @@ SHA1_NGCFT1::SHA1_NGCFT1(
|
|||||||
_nft(nft),
|
_nft(nft),
|
||||||
_tcm(tcm)
|
_tcm(tcm)
|
||||||
{
|
{
|
||||||
|
// TODO: also create and destroy
|
||||||
|
_rmm.subscribe(this, RegistryMessageModel_Event::message_updated);
|
||||||
|
|
||||||
_nft.subscribe(this, NGCFT1_Event::recv_request);
|
_nft.subscribe(this, NGCFT1_Event::recv_request);
|
||||||
_nft.subscribe(this, NGCFT1_Event::recv_init);
|
_nft.subscribe(this, NGCFT1_Event::recv_init);
|
||||||
_nft.subscribe(this, NGCFT1_Event::recv_data);
|
_nft.subscribe(this, NGCFT1_Event::recv_data);
|
||||||
@ -378,6 +391,7 @@ void SHA1_NGCFT1::iterate(float delta) {
|
|||||||
auto selected_peer_opt = selectPeerForRequest(ce);
|
auto selected_peer_opt = selectPeerForRequest(ce);
|
||||||
if (selected_peer_opt.has_value()) {
|
if (selected_peer_opt.has_value()) {
|
||||||
const auto [group_number, peer_number] = selected_peer_opt.value();
|
const auto [group_number, peer_number] = selected_peer_opt.value();
|
||||||
|
std::cout << "SHA1_NGCFT1: should ask " << group_number << ":" << peer_number << " for content here\n";
|
||||||
|
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
@ -387,6 +401,60 @@ void SHA1_NGCFT1::iterate(float delta) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHA1_NGCFT1::onEvent(const Message::Events::MessageUpdated& e) {
|
||||||
|
// see tox_transfer_manager.cpp for reference
|
||||||
|
if (!e.e.all_of<Message::Components::Transfer::ActionAccept, Message::Components::Content>()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//accept(e.e, e.e.get<Message::Components::Transfer::ActionAccept>().save_to_path);
|
||||||
|
auto ce = e.e.get<Message::Components::Content>();
|
||||||
|
|
||||||
|
//if (!ce.all_of<Components::FT1InfoSHA1, Components::FT1ChunkSHA1Cache>()) {
|
||||||
|
if (!ce.all_of<Components::FT1InfoSHA1>()) {
|
||||||
|
// not ready to load yet, skip
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
assert(!ce.all_of<Components::FT1ChunkSHA1Cache>());
|
||||||
|
assert(!ce.all_of<Message::Components::Transfer::File>());
|
||||||
|
|
||||||
|
// first, open file for write(+readback)
|
||||||
|
std::string full_file_path{e.e.get<Message::Components::Transfer::ActionAccept>().save_to_path};
|
||||||
|
// TODO: replace with filesystem or something
|
||||||
|
// TODO: ensure dir exists
|
||||||
|
if (full_file_path.back() != '/') {
|
||||||
|
full_file_path += "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::filesystem::create_directories(full_file_path);
|
||||||
|
|
||||||
|
const auto& info = ce.get<Components::FT1InfoSHA1>();
|
||||||
|
full_file_path += info.file_name;
|
||||||
|
|
||||||
|
ce.emplace<Message::Components::Transfer::FileInfoLocal>(std::vector{full_file_path});
|
||||||
|
|
||||||
|
// HACK truncate
|
||||||
|
auto file_impl = std::make_unique<FileRWFile>(full_file_path, info.file_size, true);
|
||||||
|
if (!file_impl->isGood()) {
|
||||||
|
std::cerr << "SHA1_NGCFT1 error: failed opening file '" << full_file_path << "'!\n";
|
||||||
|
//e.e.remove<Message::Components::Transfer::ActionAccept>(); // stop
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ce.emplace<Message::Components::Transfer::File>(std::move(file_impl));
|
||||||
|
|
||||||
|
// next, create chuck cache and check for existing data
|
||||||
|
|
||||||
|
// now, enque
|
||||||
|
_queue_content_want_chunk.push_back(ce);
|
||||||
|
|
||||||
|
// should?
|
||||||
|
e.e.remove<Message::Components::Transfer::ActionAccept>();
|
||||||
|
|
||||||
|
updateMessages(ce);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_request& e) {
|
bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_request& e) {
|
||||||
// only interested in sha1
|
// only interested in sha1
|
||||||
if (e.file_kind != NGCFT1_file_kind::HASH_SHA1_INFO && e.file_kind != NGCFT1_file_kind::HASH_SHA1_CHUNK) {
|
if (e.file_kind != NGCFT1_file_kind::HASH_SHA1_INFO && e.file_kind != NGCFT1_file_kind::HASH_SHA1_CHUNK) {
|
||||||
@ -769,6 +837,7 @@ bool SHA1_NGCFT1::onEvent(const Events::NGCFT1_recv_message& e) {
|
|||||||
//ce.emplace<Message::Components::Transfer::File>(std::move(file_impl));
|
//ce.emplace<Message::Components::Transfer::File>(std::move(file_impl));
|
||||||
}
|
}
|
||||||
ce.get_or_emplace<Components::Messages>().messages.push_back({reg, new_msg_e});
|
ce.get_or_emplace<Components::Messages>().messages.push_back({reg, new_msg_e});
|
||||||
|
reg_ptr->emplace<Message::Components::Content>(new_msg_e, ce);
|
||||||
|
|
||||||
ce.get_or_emplace<Components::SuspectedParticipants>().participants.emplace(c);
|
ce.get_or_emplace<Components::SuspectedParticipants>().participants.emplace(c);
|
||||||
|
|
||||||
|
@ -113,6 +113,9 @@ class SHA1_NGCFT1 : public RegistryMessageModelEventI, public NGCFT1EventI {
|
|||||||
|
|
||||||
void iterate(float delta);
|
void iterate(float delta);
|
||||||
|
|
||||||
|
protected: // rmm events (actions)
|
||||||
|
bool onEvent(const Message::Events::MessageUpdated&) override;
|
||||||
|
|
||||||
protected: // events
|
protected: // events
|
||||||
bool onEvent(const Events::NGCFT1_recv_request&) override;
|
bool onEvent(const Events::NGCFT1_recv_request&) override;
|
||||||
bool onEvent(const Events::NGCFT1_recv_init&) override;
|
bool onEvent(const Events::NGCFT1_recv_init&) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user