|
|
// specification file for an unlimited queue for storing bytes
#ifndef CRYPTOPP_QUEUE_H
#define CRYPTOPP_QUEUE_H
#include "simple.h"
//#include <algorithm>
NAMESPACE_BEGIN(CryptoPP)
/** The queue is implemented as a linked list of byte arrays, but you don't need to
know about that. So just ignore this next line. :) */ class ByteQueueNode;
//! Byte Queue
class CRYPTOPP_DLL ByteQueue : public Bufferless<BufferedTransformation> { public: ByteQueue(size_t nodeSize=0); ByteQueue(const ByteQueue ©); ~ByteQueue();
lword MaxRetrievable() const {return CurrentSize();} bool AnyRetrievable() const {return !IsEmpty();}
void IsolatedInitialize(const NameValuePairs ¶meters); byte * CreatePutSpace(size_t &size); size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking);
size_t Get(byte &outByte); size_t Get(byte *outString, size_t getMax);
size_t Peek(byte &outByte) const; size_t Peek(byte *outString, size_t peekMax) const;
size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true); size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
// these member functions are not inherited
void SetNodeSize(size_t nodeSize);
lword CurrentSize() const; bool IsEmpty() const;
void Clear();
void Unget(byte inByte); void Unget(const byte *inString, size_t length);
const byte * Spy(size_t &contiguousSize) const;
void LazyPut(const byte *inString, size_t size); void LazyPutModifiable(byte *inString, size_t size); void UndoLazyPut(size_t size); void FinalizeLazyPut();
ByteQueue & operator=(const ByteQueue &rhs); bool operator==(const ByteQueue &rhs) const; byte operator[](lword i) const; void swap(ByteQueue &rhs);
class Walker : public InputRejecting<BufferedTransformation> { public: Walker(const ByteQueue &queue) : m_queue(queue) {Initialize();}
lword GetCurrentPosition() {return m_position;}
lword MaxRetrievable() const {return m_queue.CurrentSize() - m_position;}
void IsolatedInitialize(const NameValuePairs ¶meters);
size_t Get(byte &outByte); size_t Get(byte *outString, size_t getMax);
size_t Peek(byte &outByte) const; size_t Peek(byte *outString, size_t peekMax) const;
size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true); size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
private: const ByteQueue &m_queue; const ByteQueueNode *m_node; lword m_position; size_t m_offset; const byte *m_lazyString; size_t m_lazyLength; };
friend class Walker;
private: void CleanupUsedNodes(); void CopyFrom(const ByteQueue ©); void Destroy();
bool m_autoNodeSize; size_t m_nodeSize; ByteQueueNode *m_head, *m_tail; byte *m_lazyString; size_t m_lazyLength; bool m_lazyStringModifiable; };
//! use this to make sure LazyPut is finalized in event of exception
class CRYPTOPP_DLL LazyPutter { public: LazyPutter(ByteQueue &bq, const byte *inString, size_t size) : m_bq(bq) {bq.LazyPut(inString, size);} ~LazyPutter() {try {m_bq.FinalizeLazyPut();} catch(...) {}} protected: LazyPutter(ByteQueue &bq) : m_bq(bq) {} private: ByteQueue &m_bq; };
//! like LazyPutter, but does a LazyPutModifiable instead
class LazyPutterModifiable : public LazyPutter { public: LazyPutterModifiable(ByteQueue &bq, byte *inString, size_t size) : LazyPutter(bq) {bq.LazyPutModifiable(inString, size);} };
NAMESPACE_END
#ifndef __BORLANDC__
NAMESPACE_BEGIN(std) template<> inline void swap(CryptoPP::ByteQueue &a, CryptoPP::ByteQueue &b) { a.swap(b); } NAMESPACE_END #endif
#endif
|