/* This file is part of cpp-ethereum. cpp-ethereum is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. cpp-ethereum 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 General Public License for more details. You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ /** @file Common.h * @author Gav Wood * @date 2014 */ #pragma once #include #include #include #include #include #include namespace dev { namespace shh { /* this makes these symbols ambiguous on VS2013 using h256 = dev::h256; using h256s = dev::h256s; using bytes = dev::bytes; using RLPStream = dev::RLPStream; using RLP = dev::RLP; using bytesRef = dev::bytesRef; using bytesConstRef = dev::bytesConstRef; using h256Set = dev::h256Set; */ class WhisperHost; class WhisperPeer; class Whisper; class Envelope; enum WhisperPacket { StatusPacket = 0, MessagesPacket, AddFilterPacket, RemoveFilterPacket, PacketCount }; using AbridgedTopic = FixedHash<4>; using Topic = h256; using AbridgedTopics = std::vector; using Topics = h256s; AbridgedTopic abridge(Topic const& _topic); AbridgedTopics abridge(Topics const& _topics); class BuildTopic { public: BuildTopic() {} template BuildTopic(T const& _t) { shift(_t); } template BuildTopic& shift(T const& _r) { return shiftBytes(RLPStream().append(_r).out()); } template BuildTopic& operator()(T const& _t) { return shift(_t); } BuildTopic& shiftRaw(h256 const& _part) { m_parts.push_back(_part); return *this; } operator AbridgedTopics() const { return toAbridgedTopics(); } operator Topics() const { return toTopics(); } AbridgedTopics toAbridgedTopics() const; Topics toTopics() const { return m_parts; } protected: BuildTopic& shiftBytes(bytes const& _b); h256s m_parts; }; using TopicMask = std::vector>; using TopicMasks = std::vector; class TopicFilter { public: TopicFilter() {} TopicFilter(Topics const& _m) { m_topicMasks.push_back(TopicMask()); for (auto const& h: _m) m_topicMasks.back().push_back(std::make_pair(abridge(h), h ? ~AbridgedTopic() : AbridgedTopic())); } TopicFilter(TopicMask const& _m): m_topicMasks(1, _m) {} TopicFilter(TopicMasks const& _m): m_topicMasks(_m) {} TopicFilter(RLP const& _r)//: m_topicMasks(_r.toVector>()) { for (RLP i: _r) { m_topicMasks.push_back(TopicMask()); for (RLP j: i) m_topicMasks.back().push_back(j.toPair, FixedHash<4>>()); } } void streamRLP(RLPStream& _s) const { _s << m_topicMasks; } h256 sha3() const; bool matches(Envelope const& _m) const; private: TopicMasks m_topicMasks; }; class BuildTopicMask: BuildTopic { public: BuildTopicMask() {} template BuildTopicMask(T const& _t) { shift(_t); } template BuildTopicMask& shift(T const& _r) { BuildTopic::shift(_r); return *this; } BuildTopicMask& shiftRaw(h256 const& _h) { BuildTopic::shiftRaw(_h); return *this; } template BuildTopicMask& operator()(T const& _t) { shift(_t); return *this; } operator TopicMask() const { return toTopicMask(); } operator Topics() const { return toTopics(); } TopicMask toTopicMask() const; Topics toTopics() const { return m_parts; } }; } }