ofs | hex dump | ascii |
---|
0000 | 42 42 33 44 ab 86 00 00 01 00 00 00 42 52 55 53 2e 00 00 00 01 00 00 00 42 72 75 73 68 2e 30 30 | BB3D........BRUS........Brush.00 |
0020 | 31 00 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 00 00 01 00 00 00 00 00 00 00 ff ff | 1....?...?...?...?.............. |
0040 | ff ff 4e 4f 44 45 69 86 00 00 64 74 72 61 63 6b 5f 63 72 5f 36 30 00 00 00 00 00 00 00 00 bf 00 | ..NODEi...dtrack_cr_60.......... |
0060 | 00 00 00 00 00 80 3f 00 00 80 3f 00 00 80 3f f6 b5 06 3f 00 00 00 00 ae b0 59 bf 00 00 00 00 4d | ......?...?...?...?......Y.....M |
0080 | 45 53 48 2c 86 00 00 ff ff ff ff 56 52 54 53 8c 71 00 00 01 00 00 00 01 00 00 00 02 00 00 00 d4 | ESH,.......VRTS.q............... |
00a0 | f3 10 3e 18 85 eb 3d f0 8b 12 3f b6 05 db 3e 4e cd 26 bf 41 5d 20 3f 5d aa 04 3f de 2b 06 3f 3c | ..>...=...?...>N.&.A].?]..?.+.?< |
00c0 | ff 10 3e 26 5c 0f 3e 1c 91 12 3f 98 41 cc 3e 6a f3 34 3f 2b 87 15 3f 0a a9 00 3f de 2b 06 3f 64 | ..>&\.>...?.A.>j.4?+..?...?.+.?d |
00e0 | 90 70 3e 26 5c 0f 3e c6 8d 02 3f 85 6d c2 3e 6a 0b 35 3f 31 a9 18 3f 06 a9 00 3f 6e 91 de 3e 34 | .p>&\.>...?.m.>j.5?1..?...?n..>4 |
0100 | 5b 70 3e 1c 85 eb 3d a2 77 02 3f 9e fd ce 3e 51 8f 28 bf 45 83 22 3f 5a aa 04 3f 6e 91 de 3e 10 | [p>...=.w.?...>Q.(.E."?Z..?n..>. |
0120 | 02 b6 bd 18 85 eb 3d 23 4e 3b 3f f5 a1 fa bd 0d a9 06 bf af 73 57 3f 64 aa 04 3f 2a f2 33 3f fc | ......=#N;?.........sW?d..?*.3?. |
0140 | 01 b6 bd 24 5c 0f 3e 3a 4e 3b 3f 1b 71 0d be 28 29 14 3f 9b bf 4d 3f 14 a9 00 3f 2a f2 33 3f 50 | ...$\.>:N;?.q..().?..M?...?*.3?P |
0160 | ad 31 3d 26 5c 0f 3e 34 00 24 3f 9c 09 ce 3e 6a d5 34 3f 2a 0f 15 3f 0f a9 00 3f 04 0f 1d 3f 00 | .1=&\.>4.$?...>j.4?*..?...?...?. |
0180 | ad 31 3d 18 85 eb 3d 00 00 24 3f bb a5 dd 3e 4c f1 25 bf 41 5b 20 3f 60 aa 04 3f 04 0f 1d 3f 34 | .1=...=..$?...>L.%.A[.?`..?...?4 |
01a0 | 5b 70 3e 1c 85 eb 3d a2 77 02 3f 9e fd ce 3e 51 8f 28 bf 45 83 22 3f 5a aa 04 3f 6e 91 de 3e 64 | [p>...=.w.?...>Q.(.E."?Z..?n..>d |
01c0 | 90 70 3e 26 5c 0f 3e c6 8d 02 3f 85 6d c2 3e 6a 0b 35 3f 31 a9 18 3f 06 a9 00 3f 6e 91 de 3e 96 | .p>&\.>...?.m.>j.5?1..?...?n..>. |
01e0 | b4 b1 3e 28 5c 0f 3e 54 99 e2 3e 52 0d a9 3e 6c 01 36 3f 3e f1 1e 3f 01 a9 00 3f 20 cb b0 3e 04 | ..>(\.>T..>R..>l.6?>..?...?...>. |
0200 | 87 b1 3e 1c 85 eb 3d 00 4c e2 3e 66 25 b3 3e 56 c5 2a bf 51 5d 28 3f 56 aa 04 3f 20 cb b0 3e 00 | ..>...=.L.>f%.>V.*.Q](?V..?...>. |
0220 | ad 31 3d 18 85 eb 3d 00 00 24 3f bb a5 dd 3e 4c f1 25 bf 41 5b 20 3f 60 aa 04 3f 04 0f 1d 3f 50 | .1=...=..$?...>L.%.A[.?`..?...?P |
0240 | ad 31 3d 26 5c 0f/*
Minetest
Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "modchannels.h"
#include <algorithm>
#include <cassert>
#include "util/basic_macros.h"
bool ModChannel::registerConsumer(session_t peer_id)
{
// ignore if peer_id already joined
if (CONTAINS(m_client_consumers, peer_id))
return false;
m_client_consumers.push_back(peer_id);
return true;
}
bool ModChannel::removeConsumer(session_t peer_id)
{
bool found = false;
auto peer_removal_fct = [peer_id, &found](u16 p) {
if (p == peer_id)
found = true;
return p == peer_id;
};
m_client_consumers.erase(
std::remove_if(m_client_consumers.begin(),
m_client_consumers.end(), peer_removal_fct),
m_client_consumers.end());
return found;
}
bool ModChannel::canWrite() const
{
return m_state == MODCHANNEL_STATE_READ_WRITE;
}
void ModChannel::setState(ModChannelState state)
{
assert(state != MODCHANNEL_STATE_INIT);
m_state = state;
}
bool ModChannelMgr::channelRegistered(const std::string &channel) const
{
return m_registered_channels.find(channel) != m_registered_channels.end();
}
ModChannel *ModChannelMgr::getModChannel(const std::string &channel)
{
if (!channelRegistered(channel))
return nullptr;
return m_registered_channels[channel].get();
}
bool ModChannelMgr::canWriteOnChannel(const std::string &channel) const
{
const auto channel_it = m_registered_channels.find(channel);
if (channel_it == m_registered_channels.end()) {
return false;
}
return channel_it->second->canWrite();
}
void ModChannelMgr::registerChannel(const std::string &channel)
{
m_registered_channels[channel] =
std::unique_ptr<ModChannel>(new ModChannel(channel));
}
bool ModChannelMgr::setChannelState(const std::string &channel, ModChannelState state)
{
if (!channelRegistered(channel))
return false;
auto channel_it = m_registered_channels.find(channel);
channel_it->second->setState(state);
return true;
}
bool ModChannelMgr::removeChannel(const std::string &channel)
{
if (!channelRegistered(channel))
return false;
m_registered_channels.erase(channel);
return true;
}
bool ModChannelMgr::joinChannel(const std::string &channel, session_t peer_id)
{
if (!channelRegistered(channel))
registerChannel(channel);
return m_registered_channels[channel]->registerConsumer(peer_id);
}
bool ModChannelMgr::leaveChannel(const std::string &channel, session_t peer_id)
{
if (!channelRegistered(channel))
return false;
// Remove consumer from channel
bool consumerRemoved = m_registered_channels[channel]->removeConsumer(peer_id);
// If channel is empty, remove it
if (m_registered_channels[channel]->getChannelPeers().empty()) {
removeChannel(channel);
}
return consumerRemoved;
}
void ModChannelMgr::leaveAllChannels(session_t peer_id)
{
for (auto &channel_it : m_registered_channels)
channel_it.second->removeConsumer(peer_id);
}
static std::vector<u16> empty_channel_list;
const std::vector<u16> &ModChannelMgr::getChannelPeers(const std::string &channel) const
{
const auto &channel_it = m_registered_channels.find(channel);
if (channel_it == m_registered_channels.end())
return empty_channel_list;
return channel_it->second->getChannelPeers();
}
|