works
This commit is contained in:
parent
dbcf2777c0
commit
e858f23fc1
@ -87,6 +87,7 @@ struct _GroupKey {
|
|||||||
_GroupKey(void) = default;
|
_GroupKey(void) = default;
|
||||||
_GroupKey(const _GroupKey& other) : data(other.data) {}
|
_GroupKey(const _GroupKey& other) : data(other.data) {}
|
||||||
_GroupKey(_GroupKey&&) = delete;
|
_GroupKey(_GroupKey&&) = delete;
|
||||||
|
_GroupKey& operator=(const _GroupKey& other) { data = other.data; return *this; }
|
||||||
bool operator<(const _GroupKey& rhs) const;
|
bool operator<(const _GroupKey& rhs) const;
|
||||||
bool operator==(const _GroupKey& rhs) const;
|
bool operator==(const _GroupKey& rhs) const;
|
||||||
size_t size(void) const { return data.size(); }
|
size_t size(void) const { return data.size(); }
|
||||||
@ -98,6 +99,7 @@ struct _PeerKey {
|
|||||||
_PeerKey(void) = default;
|
_PeerKey(void) = default;
|
||||||
_PeerKey(const _PeerKey& other) : data(other.data) {}
|
_PeerKey(const _PeerKey& other) : data(other.data) {}
|
||||||
_PeerKey(_PeerKey&&) = delete;
|
_PeerKey(_PeerKey&&) = delete;
|
||||||
|
_PeerKey& operator=(const _PeerKey& other) { data = other.data; return *this; }
|
||||||
bool operator<(const _PeerKey& rhs) const;
|
bool operator<(const _PeerKey& rhs) const;
|
||||||
bool operator==(const _PeerKey& rhs) const;
|
bool operator==(const _PeerKey& rhs) const;
|
||||||
size_t size(void) const { return data.size(); }
|
size_t size(void) const { return data.size(); }
|
||||||
|
@ -365,7 +365,8 @@ bool NGC_FT1_send_init_private(
|
|||||||
uint32_t group_number, uint32_t peer_number,
|
uint32_t group_number, uint32_t peer_number,
|
||||||
NGC_FT1_file_kind file_kind,
|
NGC_FT1_file_kind file_kind,
|
||||||
const uint8_t* file_id, size_t file_id_size,
|
const uint8_t* file_id, size_t file_id_size,
|
||||||
size_t file_size
|
size_t file_size,
|
||||||
|
uint8_t* transfer_id
|
||||||
) {
|
) {
|
||||||
//fprintf(stderr, "TODO: init ft for %08X\n", msg_id);
|
//fprintf(stderr, "TODO: init ft for %08X\n", msg_id);
|
||||||
fprintf(stderr, "FT: init ft\n");
|
fprintf(stderr, "FT: init ft\n");
|
||||||
@ -412,6 +413,10 @@ bool NGC_FT1_send_init_private(
|
|||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (transfer_id != nullptr) {
|
||||||
|
*transfer_id = idx;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,8 @@ bool NGC_FT1_send_init_private(
|
|||||||
uint32_t group_number, uint32_t peer_number,
|
uint32_t group_number, uint32_t peer_number,
|
||||||
NGC_FT1_file_kind file_kind,
|
NGC_FT1_file_kind file_kind,
|
||||||
const uint8_t* file_id, size_t file_id_size,
|
const uint8_t* file_id, size_t file_id_size,
|
||||||
size_t file_size
|
size_t file_size,
|
||||||
|
uint8_t* transfer_id
|
||||||
);
|
);
|
||||||
|
|
||||||
// return true to accept, false to deny
|
// return true to accept, false to deny
|
||||||
|
97
ngc_hs1.cpp
97
ngc_hs1.cpp
@ -147,6 +147,18 @@ static void _iterate_group(Tox *tox, NGC_EXT_CTX* ngc_ext_ctx, uint32_t group_nu
|
|||||||
} else {
|
} else {
|
||||||
auto& group = ngc_hs1_ctx->history[g_id];
|
auto& group = ngc_hs1_ctx->history[g_id];
|
||||||
|
|
||||||
|
// check if transfers have timed out
|
||||||
|
for (auto it = group.transfers.begin(); it != group.transfers.end();) {
|
||||||
|
it->second.time_since_ft_activity += time_delta;
|
||||||
|
if (it->second.time_since_ft_activity >= ngc_hs1_ctx->options.ft_activity_timeout) {
|
||||||
|
// timed out
|
||||||
|
fprintf(stderr, "HS: !!! ft timed out (%08X)\n", it->first.first);
|
||||||
|
it = group.transfers.erase(it);
|
||||||
|
} else {
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// for each peer
|
// for each peer
|
||||||
for (auto& [peer_key, peer] : group.peers) {
|
for (auto& [peer_key, peer] : group.peers) {
|
||||||
//fprintf(stderr, " p: %X%X%X%X\n", key.data.data()[0], key.data.data()[1], key.data.data()[2], key.data.data()[3]);
|
//fprintf(stderr, " p: %X%X%X%X\n", key.data.data()[0], key.data.data()[1], key.data.data()[2], key.data.data()[3]);
|
||||||
@ -311,7 +323,6 @@ bool NGC_HS1_shim_group_send_message(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// record own msg
|
// record own msg
|
||||||
void NGC_HS1_record_own_message(
|
void NGC_HS1_record_own_message(
|
||||||
const Tox *tox,
|
const Tox *tox,
|
||||||
@ -423,13 +434,20 @@ void _handle_HS1_ft_recv_request(
|
|||||||
const auto& msg = peer.dict.at(msg_id);
|
const auto& msg = peer.dict.at(msg_id);
|
||||||
size_t file_size = 1 + msg.text.size();
|
size_t file_size = 1 + msg.text.size();
|
||||||
|
|
||||||
|
uint8_t transfer_id {0};
|
||||||
|
|
||||||
NGC_FT1_send_init_private(
|
NGC_FT1_send_init_private(
|
||||||
tox, ngc_ext_ctx,
|
tox, ngc_ext_ctx,
|
||||||
group_number, peer_number,
|
group_number, peer_number,
|
||||||
NGC_HS1_MESSAGE_BY_ID,
|
NGC_HS1_MESSAGE_BY_ID,
|
||||||
file_id, file_id_size,
|
file_id, file_id_size,
|
||||||
file_size
|
file_size,
|
||||||
|
&transfer_id
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//TODO: can fail
|
||||||
|
|
||||||
|
ngc_ext_ctx->ngc_hs1_ctx->history[group_id].sending[std::make_pair(peer_number, transfer_id)] = {peer_key, msg_id};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _handle_HS1_ft_recv_init(
|
bool _handle_HS1_ft_recv_init(
|
||||||
@ -483,10 +501,19 @@ bool _handle_HS1_ft_recv_init(
|
|||||||
|
|
||||||
// TODO: if allready acked but got init again, they did not get the ack
|
// TODO: if allready acked but got init again, they did not get the ack
|
||||||
|
|
||||||
// TODO: more?
|
// move from pending to transfers
|
||||||
|
group.transfers[std::make_pair(peer_number, transfer_id)] = {
|
||||||
|
peer_key,
|
||||||
|
msg_id,
|
||||||
|
0.f,
|
||||||
|
{}, // empty buffer
|
||||||
|
file_size,
|
||||||
|
};
|
||||||
|
|
||||||
pending.at(msg_id).time_since_ft_activity = 0.f;
|
pending.at(msg_id).time_since_ft_activity = 0.f;
|
||||||
//pending.at(msg_id).transfer_acked;
|
|
||||||
//group.transfers
|
// TODO: keep the pending until later?
|
||||||
|
//pending.erase(msg_id);
|
||||||
|
|
||||||
return true; // accept
|
return true; // accept
|
||||||
}
|
}
|
||||||
@ -507,7 +534,6 @@ void _handle_HS1_ft_recv_data(
|
|||||||
|
|
||||||
auto& group = ngc_ext_ctx->ngc_hs1_ctx->history[g_id];
|
auto& group = ngc_ext_ctx->ngc_hs1_ctx->history[g_id];
|
||||||
|
|
||||||
//auto& pending = group.peers[peer_key].pending;
|
|
||||||
// get based on transfer_id
|
// get based on transfer_id
|
||||||
if (!group.transfers.count(std::make_pair(peer_number, transfer_id))) {
|
if (!group.transfers.count(std::make_pair(peer_number, transfer_id))) {
|
||||||
if (data_offset != 0) {
|
if (data_offset != 0) {
|
||||||
@ -516,11 +542,32 @@ void _handle_HS1_ft_recv_data(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new transfer?
|
// new transfer?
|
||||||
fprintf(stderr, "HS: !! got transfer from %d tid:%d\n", peer_number, transfer_id);
|
fprintf(stderr, "HS: !! got new transfer from %d tid:%d\n", peer_number, transfer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "HS: recv_data from %d tid:%d\n", peer_number, transfer_id);
|
||||||
|
|
||||||
|
auto& transfer = group.transfers.at(std::make_pair(peer_number, transfer_id));
|
||||||
|
transfer.time_since_ft_activity = 0.f;
|
||||||
|
// TODO: also timer for pending?
|
||||||
|
|
||||||
|
// TODO: optimize
|
||||||
|
for (size_t i = 0; i < data_size; i++) {
|
||||||
|
transfer.recv_buffer.push_back(data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add data to tmp buffer
|
|
||||||
// TODO: data done?
|
// TODO: data done?
|
||||||
|
if (data_offset + data_size == transfer.file_size) {
|
||||||
|
fprintf(stderr, "HS: transfer done %d:%d\n", peer_number, transfer_id);
|
||||||
|
transfer.recv_buffer.push_back('\0');
|
||||||
|
fprintf(stderr, " message was %s\n", transfer.recv_buffer.data()+1);
|
||||||
|
|
||||||
|
auto& peer = group.peers[transfer.msg_peer];
|
||||||
|
peer.pending.erase(transfer.msg_id);
|
||||||
|
peer.append(transfer.msg_id, static_cast<Tox_Message_Type>(transfer.recv_buffer.front()), std::string(reinterpret_cast<const char*>(transfer.recv_buffer.data()+1)));
|
||||||
|
|
||||||
|
group.transfers.erase(std::make_pair(peer_number, transfer_id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handle_HS1_ft_send_data(
|
void _handle_HS1_ft_send_data(
|
||||||
@ -532,6 +579,40 @@ void _handle_HS1_ft_send_data(
|
|||||||
|
|
||||||
size_t data_offset, uint8_t* data, size_t data_size
|
size_t data_offset, uint8_t* data, size_t data_size
|
||||||
) {
|
) {
|
||||||
|
// get group id
|
||||||
|
_GroupKey g_id{};
|
||||||
|
{ // TODO: error
|
||||||
|
tox_group_get_chat_id(tox, group_number, g_id.data.data(), nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& group = ngc_ext_ctx->ngc_hs1_ctx->history[g_id];
|
||||||
|
|
||||||
|
if (!group.sending.count(std::make_pair(peer_number, transfer_id))) {
|
||||||
|
fprintf(stderr, "HS: error, unknown sending transfer %d:%d\n", peer_number, transfer_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// map peer_number and transfer_id to peer_key and message_id
|
||||||
|
const auto& [msg_peer, msg_id] = group.sending.at(std::make_pair(peer_number, transfer_id));
|
||||||
|
|
||||||
|
// get msg
|
||||||
|
const auto& message = group.peers.at(msg_peer).dict.at(msg_id);
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
if (data_offset == 0) {
|
||||||
|
// serl type
|
||||||
|
data[i++] = message.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < data_size; i++) {
|
||||||
|
data[i] = message.text.at((data_offset+i)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data_offset + data_size == 1 + message.text.size()) {
|
||||||
|
// done
|
||||||
|
fprintf(stderr, "HS: done %d:%d\n", peer_number, transfer_id);
|
||||||
|
group.sending.erase(std::make_pair(peer_number, transfer_id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define _HS1_HAVE(x, error) if ((length - curser) < (x)) { error; }
|
#define _HS1_HAVE(x, error) if ((length - curser) < (x)) { error; }
|
||||||
|
@ -54,15 +54,20 @@ struct NGC_HS1 {
|
|||||||
std::map<_PeerKey, Peer> peers;
|
std::map<_PeerKey, Peer> peers;
|
||||||
|
|
||||||
struct FileTransfers {
|
struct FileTransfers {
|
||||||
//uint32_t peer_number; // the peer we requested the message from
|
|
||||||
float time_since_ft_activity {0.f};
|
|
||||||
_PeerKey msg_peer;
|
_PeerKey msg_peer;
|
||||||
uint32_t msg_id;
|
uint32_t msg_id;
|
||||||
|
float time_since_ft_activity {0.f};
|
||||||
std::vector<uint8_t> recv_buffer; // message gets dumped into here
|
std::vector<uint8_t> recv_buffer; // message gets dumped into here
|
||||||
|
size_t file_size {0};
|
||||||
};
|
};
|
||||||
// key: peer_number + transfer_id
|
// key: peer_number + transfer_id
|
||||||
std::map<std::pair<uint32_t, uint8_t>, FileTransfers> transfers;
|
std::map<std::pair<uint32_t, uint8_t>, FileTransfers> transfers;
|
||||||
|
|
||||||
|
struct Sending {
|
||||||
|
_PeerKey msg_peer;
|
||||||
|
uint32_t msg_id;
|
||||||
|
};
|
||||||
|
std::map<std::pair<uint32_t, uint8_t>, Sending> sending;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<_GroupKey, Group> history;
|
std::map<_GroupKey, Group> history;
|
||||||
|
Reference in New Issue
Block a user