source: trunk/src-cryptopp/mqueue.h

Last change on this file was e230cb0, checked in by David Stainton <dstainton415@…>, at 2016-10-12T13:27:29Z

Add cryptopp from tag CRYPTOPP_5_6_5

  • Property mode set to 100644
File size: 3.6 KB
Line 
1#ifndef CRYPTOPP_MQUEUE_H
2#define CRYPTOPP_MQUEUE_H
3
4#include "cryptlib.h"
5#include "queue.h"
6#include "filters.h"
7#include "misc.h"
8
9#include <deque>
10
11NAMESPACE_BEGIN(CryptoPP)
12
13//! Message Queue
14class CRYPTOPP_DLL MessageQueue : public AutoSignaling<BufferedTransformation>
15{
16public:
17        MessageQueue(unsigned int nodeSize=256);
18
19        void IsolatedInitialize(const NameValuePairs &parameters)
20                {m_queue.IsolatedInitialize(parameters); m_lengths.assign(1, 0U); m_messageCounts.assign(1, 0U);}
21        size_t Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
22        {
23                CRYPTOPP_UNUSED(blocking);
24                m_queue.Put(begin, length);
25                m_lengths.back() += length;
26                if (messageEnd)
27                {
28                        m_lengths.push_back(0);
29                        m_messageCounts.back()++;
30                }
31                return 0;
32        }
33        bool IsolatedFlush(bool hardFlush, bool blocking)
34                {CRYPTOPP_UNUSED(hardFlush), CRYPTOPP_UNUSED(blocking); return false;}
35        bool IsolatedMessageSeriesEnd(bool blocking)
36                {CRYPTOPP_UNUSED(blocking); m_messageCounts.push_back(0); return false;}
37
38        lword MaxRetrievable() const
39                {return m_lengths.front();}
40        bool AnyRetrievable() const
41                {return m_lengths.front() > 0;}
42
43        size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true);
44        size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
45
46        lword TotalBytesRetrievable() const
47                {return m_queue.MaxRetrievable();}
48        unsigned int NumberOfMessages() const
49                {return (unsigned int)m_lengths.size()-1;}
50        bool GetNextMessage();
51
52        unsigned int NumberOfMessagesInThisSeries() const
53                {return m_messageCounts[0];}
54        unsigned int NumberOfMessageSeries() const
55                {return (unsigned int)m_messageCounts.size()-1;}
56
57        unsigned int CopyMessagesTo(BufferedTransformation &target, unsigned int count=UINT_MAX, const std::string &channel=DEFAULT_CHANNEL) const;
58
59        const byte * Spy(size_t &contiguousSize) const;
60
61        void swap(MessageQueue &rhs);
62
63private:
64        ByteQueue m_queue;
65        std::deque<lword> m_lengths;
66        std::deque<unsigned int> m_messageCounts;
67};
68
69
70//! A filter that checks messages on two channels for equality
71class CRYPTOPP_DLL EqualityComparisonFilter : public Unflushable<Multichannel<Filter> >
72{
73public:
74        struct MismatchDetected : public Exception {MismatchDetected() : Exception(DATA_INTEGRITY_CHECK_FAILED, "EqualityComparisonFilter: did not receive the same data on two channels") {}};
75
76        /*! if throwIfNotEqual is false, this filter will output a '\\0' byte when it detects a mismatch, '\\1' otherwise */
77        EqualityComparisonFilter(BufferedTransformation *attachment=NULL, bool throwIfNotEqual=true, const std::string &firstChannel="0", const std::string &secondChannel="1")
78                : m_throwIfNotEqual(throwIfNotEqual), m_mismatchDetected(false)
79                , m_firstChannel(firstChannel), m_secondChannel(secondChannel)
80                {Detach(attachment);}
81
82        size_t ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking);
83        bool ChannelMessageSeriesEnd(const std::string &channel, int propagation=-1, bool blocking=true);
84
85private:
86        unsigned int MapChannel(const std::string &channel) const;
87        bool HandleMismatchDetected(bool blocking);
88
89        bool m_throwIfNotEqual, m_mismatchDetected;
90        std::string m_firstChannel, m_secondChannel;
91        MessageQueue m_q[2];
92};
93
94NAMESPACE_END
95
96#ifndef __BORLANDC__
97NAMESPACE_BEGIN(std)
98template<> inline void swap(CryptoPP::MessageQueue &a, CryptoPP::MessageQueue &b)
99{
100        a.swap(b);
101}
102NAMESPACE_END
103#endif
104
105#endif
Note: See TracBrowser for help on using the repository browser.