Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/channels.h
Line
Count
Source (jump to first uncovered line)
1
// channels.h - originally written and placed in the public domain by Wei Dai
2
3
/// \file channels.h
4
/// \brief Classes for multiple named channels
5
6
#ifndef CRYPTOPP_CHANNELS_H
7
#define CRYPTOPP_CHANNELS_H
8
9
#include "cryptlib.h"
10
#include "simple.h"
11
#include "smartptr.h"
12
#include "stdcpp.h"
13
14
#if CRYPTOPP_MSC_VERSION
15
# pragma warning(push)
16
# pragma warning(disable: 4355)
17
#endif
18
19
NAMESPACE_BEGIN(CryptoPP)
20
21
#if 0
22
/// Route input on default channel to different and/or multiple channels based on message sequence number
23
class MessageSwitch : public Sink
24
{
25
public:
26
  void AddDefaultRoute(BufferedTransformation &destination, const std::string &channel);
27
  void AddRoute(unsigned int begin, unsigned int end, BufferedTransformation &destination, const std::string &channel);
28
29
  void Put(byte inByte);
30
  void Put(const byte *inString, unsigned int length);
31
32
  void Flush(bool completeFlush, int propagation=-1);
33
  void MessageEnd(int propagation=-1);
34
  void PutMessageEnd(const byte *inString, unsigned int length, int propagation=-1);
35
  void MessageSeriesEnd(int propagation=-1);
36
37
private:
38
  typedef std::pair<BufferedTransformation *, std::string> Route;
39
  struct RangeRoute
40
  {
41
    RangeRoute(unsigned int begin, unsigned int end, const Route &route)
42
      : begin(begin), end(end), route(route) {}
43
    bool operator<(const RangeRoute &rhs) const {return begin < rhs.begin;}
44
    unsigned int begin, end;
45
    Route route;
46
  };
47
48
  typedef std::list<RangeRoute> RouteList;
49
  typedef std::list<Route> DefaultRouteList;
50
51
  RouteList m_routes;
52
  DefaultRouteList m_defaultRoutes;
53
  unsigned int m_nCurrentMessage;
54
};
55
#endif
56
57
class ChannelSwitchTypedefs
58
{
59
public:
60
  typedef std::pair<BufferedTransformation *, std::string> Route;
61
  typedef std::multimap<std::string, Route> RouteMap;
62
63
  typedef std::pair<BufferedTransformation *, value_ptr<std::string> > DefaultRoute;
64
  typedef std::list<DefaultRoute> DefaultRouteList;
65
66
  // SunCC workaround: can't use const_iterator here
67
  typedef RouteMap::iterator MapIterator;
68
  typedef DefaultRouteList::iterator ListIterator;
69
};
70
71
class ChannelSwitch;
72
73
class ChannelRouteIterator : public ChannelSwitchTypedefs
74
{
75
public:
76
0
  ChannelRouteIterator(ChannelSwitch &cs) : m_cs(cs), m_useDefault(false) {}
77
78
  void Reset(const std::string &channel);
79
  bool End() const;
80
  void Next();
81
  BufferedTransformation & Destination();
82
  const std::string & Channel();
83
84
  ChannelSwitch& m_cs;
85
  std::string m_channel;
86
  bool m_useDefault;
87
  MapIterator m_itMapCurrent, m_itMapEnd;
88
  ListIterator m_itListCurrent, m_itListEnd;
89
90
protected:
91
  // Hide this to see if we break something...
92
  ChannelRouteIterator();
93
};
94
95
/// Route input to different and/or multiple channels based on channel ID
96
class CRYPTOPP_DLL ChannelSwitch : public Multichannel<Sink>, public ChannelSwitchTypedefs
97
{
98
public:
99
0
  ChannelSwitch() : m_it(*this), m_blocked(false) {}
100
  ChannelSwitch(BufferedTransformation &destination) : m_it(*this), m_blocked(false)
101
0
  {
102
0
    AddDefaultRoute(destination);
103
0
  }
104
  ChannelSwitch(BufferedTransformation &destination, const std::string &outChannel) : m_it(*this), m_blocked(false)
105
0
  {
106
0
    AddDefaultRoute(destination, outChannel);
107
0
  }
108
109
  void IsolatedInitialize(const NameValuePairs &parameters=g_nullNameValuePairs);
110
111
  size_t ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking);
112
  size_t ChannelPutModifiable2(const std::string &channel, byte *begin, size_t length, int messageEnd, bool blocking);
113
114
  bool ChannelFlush(const std::string &channel, bool completeFlush, int propagation=-1, bool blocking=true);
115
  bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true);
116
117
  byte * ChannelCreatePutSpace(const std::string &channel, size_t &size);
118
119
  void AddDefaultRoute(BufferedTransformation &destination);
120
  void RemoveDefaultRoute(BufferedTransformation &destination);
121
  void AddDefaultRoute(BufferedTransformation &destination, const std::string &outChannel);
122
  void RemoveDefaultRoute(BufferedTransformation &destination, const std::string &outChannel);
123
  void AddRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel);
124
  void RemoveRoute(const std::string &inChannel, BufferedTransformation &destination, const std::string &outChannel);
125
126
private:
127
  RouteMap m_routeMap;
128
  DefaultRouteList m_defaultRoutes;
129
130
  ChannelRouteIterator m_it;
131
  bool m_blocked;
132
133
  friend class ChannelRouteIterator;
134
};
135
136
NAMESPACE_END
137
138
#if CRYPTOPP_MSC_VERSION
139
# pragma warning(pop)
140
#endif
141
142
#endif