• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

channels.h

00001 #ifndef CRYPTOPP_CHANNELS_H
00002 #define CRYPTOPP_CHANNELS_H
00003 
00004 #include "simple.h"
00005 #include "smartptr.h"
00006 #include <map>
00007 #include <list>
00008 
00009 NAMESPACE_BEGIN(CryptoPP)
00010 
00011 #if 0
00012 //! Route input on default channel to different and/or multiple channels based on message sequence number
00013 class MessageSwitch : public Sink
00014 {
00015 public:
00016     void AddDefaultRoute(BufferedTransformation &destination, const std::string &channel);
00017     void AddRoute(unsigned int begin, unsigned int end, BufferedTransformation &destination, const std::string &channel);
00018 
00019     void Put(byte inByte);
00020     void Put(const byte *inString, unsigned int length);
00021 
00022     void Flush(bool completeFlush, int propagation=-1);
00023     void MessageEnd(int propagation=-1);
00024     void PutMessageEnd(const byte *inString, unsigned int length, int propagation=-1);
00025     void MessageSeriesEnd(int propagation=-1);
00026 
00027 private:
00028     typedef std::pair<BufferedTransformation *, std::string> Route;
00029     struct RangeRoute
00030     {
00031         RangeRoute(unsigned int begin, unsigned int end, const Route &route)
00032             : begin(begin), end(end), route(route) {}
00033         bool operator<(const RangeRoute &rhs) const {return begin < rhs.begin;}
00034         unsigned int begin, end;
00035         Route route;
00036     };
00037 
00038     typedef std::list<RangeRoute> RouteList;
00039     typedef std::list<Route> DefaultRouteList;
00040 
00041     RouteList m_routes;
00042     DefaultRouteList m_defaultRoutes;
00043     unsigned int m_nCurrentMessage;
00044 };
00045 #endif
00046 
00047 class ChannelSwitchTypedefs
00048 {
00049 public:
00050     typedef std::pair<BufferedTransformation *, std::string> Route;
00051     typedef std::multimap<std::string, Route> RouteMap;
00052 
00053     typedef std::pair<BufferedTransformation *, value_ptr<std::string> > DefaultRoute;
00054     typedef std::list<DefaultRoute> DefaultRouteList;
00055 
00056     // SunCC workaround: can't use const_iterator here
00057     typedef RouteMap::iterator MapIterator;
00058     typedef DefaultRouteList::iterator ListIterator;
00059 };
00060 
00061 class ChannelSwitch;
00062 
00063 class ChannelRouteIterator : public ChannelSwitchTypedefs
00064 {
00065 public:
00066     ChannelSwitch& m_cs;
00067     std::string m_channel;
00068     bool m_useDefault;
00069     MapIterator m_itMapCurrent, m_itMapEnd;
00070     ListIterator m_itListCurrent, m_itListEnd;
00071 
00072     ChannelRouteIterator(ChannelSwitch &cs) : m_cs(cs) {}
00073     void Reset(const std::string &channel);
00074     bool End() const;
00075     void Next();
00076     BufferedTransformation & Destination();
00077     const std::string & Channel();
00078 };
00079 
00080 //! Route input to different and/or multiple channels based on channel ID
00081 class CRYPTOPP_DLL ChannelSwitch : public Multichannel<Sink>, public ChannelSwitchTypedefs
00082 {
00083 public:
00084     ChannelSwitch() : m_it(*this), m_blocked(false) {}
00085     ChannelSwitch(BufferedTransformation &destination) : m_it(*this), m_blocked(false)
00086     {
00087         AddDefaultRoute(destination);
00088     }
00089     ChannelSwitch(BufferedTransformation &destination, const std::string &outChannel) : m_it(*this), m_blocked(false)
00090     {
00091         AddDefaultRoute(destination, outChannel);
00092     }
00093 
00094     void IsolatedInitialize(const NameValuePairs &parameters=g_nullNameValuePairs);
00095 
00096     size_t ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking);
00097     size_t ChannelPutModifiable2(const std::string &channel, byte *begin, size_t length, int messageEnd, bool blocking);
00098 
00099     bool ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1, bool blocking=true);
00100     bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true);
00101 
00102     byte * ChannelCreatePutSpace(const std::string &channel, size_t &size);
00103     
00104     void AddDefaultRoute(BufferedTransformation &destination);
00105     void RemoveDefaultRoute(BufferedTransformation &destination);
00106     void AddDefaultRoute(BufferedTransformation &destination, const std::string &outChannel);
00107     void RemoveDefaultRoute(BufferedTransformation &destination, const std::string &outChannel);
00108     void AddRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel);
00109     void RemoveRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel);
00110 
00111 private:
00112     RouteMap m_routeMap;
00113     DefaultRouteList m_defaultRoutes;
00114 
00115     ChannelRouteIterator m_it;
00116     bool m_blocked;
00117 
00118     friend class ChannelRouteIterator;
00119 };
00120 
00121 NAMESPACE_END
00122 
00123 #endif

Generated on Sun Oct 17 2010 02:13:04 for Crypto++ by  doxygen 1.7.1