From 0df937d3fdcc845473dbb7521655f08f8c904265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Ortega=20Froysa?= Date: Thu, 21 Sep 2017 09:14:31 +0200 Subject: [PATCH] Should now be able to join channels. --- src/channel.cpp | 36 +++++++++++++++++++++++++----------- src/globals.hpp | 13 ++++++++++++- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/channel.cpp b/src/channel.cpp index 609351e..c10da80 100644 --- a/src/channel.cpp +++ b/src/channel.cpp @@ -21,10 +21,7 @@ #include "error.hpp" #include "globals.hpp" -#include - -dht::DhtRunner node; -std::unordered_map chans; +std::unordered_map channels; int NeoComm_join_channel(const char *channel_name) { if(not node.isRunning()) @@ -40,21 +37,38 @@ int NeoComm_join_channel(const char *channel_name) { return 0; } - // If it already exists then just exit - if(chans.find(s_chan_name) == chans.end()) + // if it already exists then just exit + if(channels.find(s_chan_name) == channels.end()) return 1; - dht::InfoHash chan(s_chan_name); + dht::InfoHash chan_hash(s_chan_name); { static constexpr dht::InfoHash INVALID_ID {}; - if(chan == INVALID_ID) - chan = dht::InfoHash::get(s_chan_name); + if(chan_hash == INVALID_ID) + chan_hash = dht::InfoHash::get(s_chan_name); } - chans[s_chan_name] = chan; + channels[s_chan_name] = { + /*.hash =*/ chan_hash, + /*.token =*/ node.listen(chan_hash, + [=](dht::ImMessage &&msg) { + if(msg.from not_eq node.getId()) + channels[s_chan_name].msgs.push_back(msg); + return true; + }), + /*.msgs = */ std::vector() + }; + return 1; } void NeoComm_leave_channel(const char *channel_name) { - chans.erase(std::string(channel_name)); + const std::string s_chan_name(channel_name); + if(channels.find(s_chan_name) == channels.end()) + return; + + struct channel_info *channel = &channels[s_chan_name]; + channel->token.wait(); + node.cancelListen(channel->hash, channel->token.get()); + channels.erase(s_chan_name); } diff --git a/src/globals.hpp b/src/globals.hpp index 93a8b19..19c4c4f 100644 --- a/src/globals.hpp +++ b/src/globals.hpp @@ -20,7 +20,18 @@ #include #include +#include #include +#include +#include + +struct channel_info { + dht::InfoHash hash; + std::future token; + std::vector msgs; +}; extern dht::DhtRunner node; -extern std::unordered_map chans; + +// the key element is the name of the channel +extern std::unordered_map channels;