#ifndef CRYPTOPP_CHANNELS_H #define CRYPTOPP_CHANNELS_H #include "simple.h" #include "smartptr.h" #include #include NAMESPACE_BEGIN(CryptoPP) #if 0 //! Route input on default channel to different and/or multiple channels based on message sequence number class MessageSwitch : public Sink { public: void AddDefaultRoute(BufferedTransformation &destination, const std::string &channel); void AddRoute(unsigned int begin, unsigned int end, BufferedTransformation &destination, const std::string &channel); void Put(byte inByte); void Put(const byte *inString, unsigned int length); void Flush(bool completeFlush, int propagation=-1); void MessageEnd(int propagation=-1); void PutMessageEnd(const byte *inString, unsigned int length, int propagation=-1); void MessageSeriesEnd(int propagation=-1); private: typedef std::pair Route; struct RangeRoute { RangeRoute(unsigned int begin, unsigned int end, const Route &route) : begin(begin), end(end), route(route) {} bool operator<(const RangeRoute &rhs) const {return begin < rhs.begin;} unsigned int begin, end; Route route; }; typedef std::list RouteList; typedef std::list DefaultRouteList; RouteList m_routes; DefaultRouteList m_defaultRoutes; unsigned int m_nCurrentMessage; }; #endif class ChannelSwitchTypedefs { public: typedef std::pair Route; typedef std::multimap RouteMap; typedef std::pair > DefaultRoute; typedef std::list DefaultRouteList; // SunCC workaround: can't use const_iterator here typedef RouteMap::iterator MapIterator; typedef DefaultRouteList::iterator ListIterator; }; class ChannelSwitch; class ChannelRouteIterator : public ChannelSwitchTypedefs { public: ChannelSwitch& m_cs; std::string m_channel; bool m_useDefault; MapIterator m_itMapCurrent, m_itMapEnd; ListIterator m_itListCurrent, m_itListEnd; ChannelRouteIterator(ChannelSwitch &cs) : m_cs(cs) {} void Reset(const std::string &channel); bool End() const; void Next(); BufferedTransformation & Destination(); const std::string & Channel(); }; //! Route input to different and/or multiple channels based on channel ID class CRYPTOPP_DLL ChannelSwitch : public Multichannel, public ChannelSwitchTypedefs { public: ChannelSwitch() : m_it(*this), m_blocked(false) {} ChannelSwitch(BufferedTransformation &destination) : m_it(*this), m_blocked(false) { AddDefaultRoute(destination); } ChannelSwitch(BufferedTransformation &destination, const std::string &outChannel) : m_it(*this), m_blocked(false) { AddDefaultRoute(destination, outChannel); } void IsolatedInitialize(const NameValuePairs ¶meters=g_nullNameValuePairs); size_t ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking); size_t ChannelPutModifiable2(const std::string &channel, byte *begin, size_t length, int messageEnd, bool blocking); bool ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1, bool blocking=true); bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true); byte * ChannelCreatePutSpace(const std::string &channel, size_t &size); void AddDefaultRoute(BufferedTransformation &destination); void RemoveDefaultRoute(BufferedTransformation &destination); void AddDefaultRoute(BufferedTransformation &destination, const std::string &outChannel); void RemoveDefaultRoute(BufferedTransformation &destination, const std::string &outChannel); void AddRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel); void RemoveRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel); private: RouteMap m_routeMap; DefaultRouteList m_defaultRoutes; ChannelRouteIterator m_it; bool m_blocked; friend class ChannelRouteIterator; }; NAMESPACE_END #endif