have_chunk + refactor

This commit is contained in:
2023-01-15 03:16:43 +01:00
parent 0606db457b
commit 707bfc7fd6
6 changed files with 145 additions and 50 deletions

View File

@ -12,6 +12,7 @@
#include <iostream>
#include <cassert>
#include <vector>
namespace States {
@ -61,13 +62,15 @@ bool SendStartSHA1::iterate(void) {
std::unique_ptr<StateI> SendStartSHA1::nextState(void) {
std::cout << "SendStartSHA1 switching state to SHA1\n";
std::vector<bool> have_chunk(_sha1_info.chunks.size(), true);
// we are done setting up
return std::make_unique<SHA1>(
_tcl,
std::move(_file_map),
std::move(_sha1_info),
std::move(_sha1_info_data),
std::move(_sha1_info_hash)
std::move(_sha1_info_hash),
std::move(have_chunk)
);
}

View File

@ -1,5 +1,7 @@
#include "./sha1.hpp"
#include <iostream>
namespace States {
SHA1::SHA1(
@ -7,17 +9,28 @@ SHA1::SHA1(
mio::mmap_source&& file_map,
const FTInfoSHA1&& sha1_info,
const std::vector<uint8_t>&& sha1_info_data,
const std::vector<uint8_t>&& sha1_info_hash
const std::vector<uint8_t>&& sha1_info_hash,
std::vector<bool>&& have_chunk
) :
StateI(tcl),
_file_map(std::move(file_map)),
_sha1_info(std::move(sha1_info)),
_sha1_info_data(std::move(sha1_info_data)),
_sha1_info_hash(std::move(sha1_info_hash))
_sha1_info_hash(std::move(sha1_info_hash)),
_have_chunk(std::move(have_chunk))
{
_have_all = true;
for (const bool it : _have_chunk) {
if (!it) {
_have_all = false;
break;
}
}
}
bool SHA1::iterate(void) {
// TODO: unmap and remap the file every couple of minutes to keep ram usage down?
// TODO: when to stop?
return false;
}
@ -27,20 +40,53 @@ std::unique_ptr<StateI> SHA1::nextState(void) {
// sha1_info
void SHA1::onFT1ReceiveRequestSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size) {
// start tf (init) for sha1_info
if (file_id_size != _sha1_info_hash.size()) {
std::cerr << "SHA1 got request for sha1_info of wrong size!!\n";
return;
}
SHA1Digest requested_hash(file_id, file_id_size);
if (requested_hash != _sha1_info_hash) {
std::cout << "SHA1 ignoring diffenrent info request " << requested_hash << "\n";
}
// same hash, should respond
// prio higher then chunks?
}
bool SHA1::onFT1ReceiveInitSHA1Info(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size) {
bool SHA1::onFT1ReceiveInitSHA1Info(uint32_t, uint32_t, const uint8_t*, size_t, const uint8_t, const size_t) {
// no, in this state we have init
return false;
}
void SHA1::onFT1ReceiveDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, const uint8_t* data, size_t data_size) {
void SHA1::onFT1ReceiveDataSHA1Info(uint32_t, uint32_t, uint8_t, size_t, const uint8_t*, size_t) {
// no, in this state we have init
}
void SHA1::onFT1SendDataSHA1Info(uint32_t group_number, uint32_t peer_number, uint8_t transfer_id, size_t data_offset, uint8_t* data, size_t data_size) {
// should all be fine
(void)group_number;
(void)peer_number;
(void)transfer_id;
for (size_t i = 0; i < data_size; i++) {
data[i] = _sha1_info_data.at(data_offset+i);
}
// knowing when to end might be important
}
// sha1_chunk
void SHA1::onFT1ReceiveRequestSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size) {
#if 0
bool have {false};
if (_have_all) {
have = _have_all;
} else if (haveChunk(xxx)) {
have = true;
}
#endif
}
bool SHA1::onFT1ReceiveInitSHA1Chunk(uint32_t group_number, uint32_t peer_number, const uint8_t* file_id, size_t file_id_size, const uint8_t transfer_id, const size_t file_size) {

View File

@ -5,6 +5,7 @@
#include "../ft_sha1_info.hpp"
#include <mio/mio.hpp>
#include <unordered_map>
namespace States {
@ -17,7 +18,8 @@ struct SHA1 final : public StateI {
mio::mmap_source&& file_map,
const FTInfoSHA1&& sha1_info,
const std::vector<uint8_t>&& sha1_info_data,
const std::vector<uint8_t>&& sha1_info_hash
const std::vector<uint8_t>&& sha1_info_hash,
std::vector<bool>&& have_chunk = {}
);
~SHA1(void) override = default;
@ -41,7 +43,11 @@ struct SHA1 final : public StateI {
mio::mmap_source _file_map;
const FTInfoSHA1 _sha1_info;
const std::vector<uint8_t> _sha1_info_data;
const std::vector<uint8_t> _sha1_info_hash;
const SHA1Digest _sha1_info_hash;
// index is the same as for info
std::vector<bool> _have_chunk;
bool _have_all {false};
};
} // States