00001
00002
00003 #ifndef CRYPTOPP_QUEUE_H
00004 #define CRYPTOPP_QUEUE_H
00005
00006 #include "simple.h"
00007
00008
00009 NAMESPACE_BEGIN(CryptoPP)
00010
00011
00012
00013 class ByteQueueNode;
00014
00015
00016 class CRYPTOPP_DLL ByteQueue : public Bufferless<BufferedTransformation>
00017 {
00018 public:
00019 ByteQueue(size_t nodeSize=0);
00020 ByteQueue(const ByteQueue ©);
00021 ~ByteQueue();
00022
00023 lword MaxRetrievable() const
00024 {return CurrentSize();}
00025 bool AnyRetrievable() const
00026 {return !IsEmpty();}
00027
00028 void IsolatedInitialize(const NameValuePairs ¶meters);
00029 byte * CreatePutSpace(size_t &size);
00030 size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking);
00031
00032 size_t Get(byte &outByte);
00033 size_t Get(byte *outString, size_t getMax);
00034
00035 size_t Peek(byte &outByte) const;
00036 size_t Peek(byte *outString, size_t peekMax) const;
00037
00038 size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true);
00039 size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
00040
00041
00042 void SetNodeSize(size_t nodeSize);
00043
00044 lword CurrentSize() const;
00045 bool IsEmpty() const;
00046
00047 void Clear();
00048
00049 void Unget(byte inByte);
00050 void Unget(const byte *inString, size_t length);
00051
00052 const byte * Spy(size_t &contiguousSize) const;
00053
00054 void LazyPut(const byte *inString, size_t size);
00055 void LazyPutModifiable(byte *inString, size_t size);
00056 void UndoLazyPut(size_t size);
00057 void FinalizeLazyPut();
00058
00059 ByteQueue & operator=(const ByteQueue &rhs);
00060 bool operator==(const ByteQueue &rhs) const;
00061 byte operator[](lword i) const;
00062 void swap(ByteQueue &rhs);
00063
00064 class Walker : public InputRejecting<BufferedTransformation>
00065 {
00066 public:
00067 Walker(const ByteQueue &queue)
00068 : m_queue(queue) {Initialize();}
00069
00070 lword GetCurrentPosition() {return m_position;}
00071
00072 lword MaxRetrievable() const
00073 {return m_queue.CurrentSize() - m_position;}
00074
00075 void IsolatedInitialize(const NameValuePairs ¶meters);
00076
00077 size_t Get(byte &outByte);
00078 size_t Get(byte *outString, size_t getMax);
00079
00080 size_t Peek(byte &outByte) const;
00081 size_t Peek(byte *outString, size_t peekMax) const;
00082
00083 size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true);
00084 size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
00085
00086 private:
00087 const ByteQueue &m_queue;
00088 const ByteQueueNode *m_node;
00089 lword m_position;
00090 size_t m_offset;
00091 const byte *m_lazyString;
00092 size_t m_lazyLength;
00093 };
00094
00095 friend class Walker;
00096
00097 private:
00098 void CleanupUsedNodes();
00099 void CopyFrom(const ByteQueue ©);
00100 void Destroy();
00101
00102 bool m_autoNodeSize;
00103 size_t m_nodeSize;
00104 ByteQueueNode *m_head, *m_tail;
00105 byte *m_lazyString;
00106 size_t m_lazyLength;
00107 bool m_lazyStringModifiable;
00108 };
00109
00110
00111 class CRYPTOPP_DLL LazyPutter
00112 {
00113 public:
00114 LazyPutter(ByteQueue &bq, const byte *inString, size_t size)
00115 : m_bq(bq) {bq.LazyPut(inString, size);}
00116 ~LazyPutter()
00117 {try {m_bq.FinalizeLazyPut();} catch(...) {}}
00118 protected:
00119 LazyPutter(ByteQueue &bq) : m_bq(bq) {}
00120 private:
00121 ByteQueue &m_bq;
00122 };
00123
00124
00125 class LazyPutterModifiable : public LazyPutter
00126 {
00127 public:
00128 LazyPutterModifiable(ByteQueue &bq, byte *inString, size_t size)
00129 : LazyPutter(bq) {bq.LazyPutModifiable(inString, size);}
00130 };
00131
00132 NAMESPACE_END
00133
00134 #ifndef __BORLANDC__
00135 NAMESPACE_BEGIN(std)
00136 template<> inline void swap(CryptoPP::ByteQueue &a, CryptoPP::ByteQueue &b)
00137 {
00138 a.swap(b);
00139 }
00140 NAMESPACE_END
00141 #endif
00142
00143 #endif