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(
unsigned int nodeSize=0);
00020
ByteQueue(
const ByteQueue ©);
00021 ~
ByteQueue();
00022
00023 unsigned long MaxRetrievable()
const
00024
{
return CurrentSize();}
00025 bool AnyRetrievable()
const
00026
{
return !IsEmpty();}
00027
00028
void IsolatedInitialize(
const NameValuePairs ¶meters);
00029 byte * CreatePutSpace(
unsigned int &size);
00030
unsigned int Put2(
const byte *inString,
unsigned int length,
int messageEnd,
bool blocking);
00031
00032
unsigned int Get(byte &outByte);
00033
unsigned int Get(byte *outString,
unsigned int getMax);
00034
00035
unsigned int Peek(byte &outByte)
const;
00036
unsigned int Peek(byte *outString,
unsigned int peekMax)
const;
00037
00038
unsigned int TransferTo2(BufferedTransformation &target,
unsigned long &transferBytes,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true);
00039
unsigned int CopyRangeTo2(BufferedTransformation &target,
unsigned long &begin,
unsigned long end=ULONG_MAX,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true)
const;
00040
00041
00042
void SetNodeSize(
unsigned int nodeSize);
00043
00044
unsigned long CurrentSize() const;
00045
bool IsEmpty() const;
00046
00047
void Clear();
00048
00049
void Unget(byte inByte);
00050
void Unget(const byte *inString,
unsigned int length);
00051
00052 const byte * Spy(
unsigned int &contiguousSize) const;
00053
00054
void LazyPut(const byte *inString,
unsigned int size);
00055
void LazyPutModifiable(byte *inString,
unsigned int size);
00056
void UndoLazyPut(
unsigned int size);
00057
void FinalizeLazyPut();
00058
00059
ByteQueue & operator=(const
ByteQueue &rhs);
00060
bool operator==(const
ByteQueue &rhs) const;
00061 byte operator[](
unsigned long 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
unsigned long GetCurrentPosition() {
return m_position;}
00071
00072
unsigned long MaxRetrievable()
const
00073
{
return m_queue.CurrentSize() - m_position;}
00074
00075
void IsolatedInitialize(
const NameValuePairs ¶meters);
00076
00077
unsigned int Get(byte &outByte);
00078
unsigned int Get(byte *outString,
unsigned int getMax);
00079
00080
unsigned int Peek(byte &outByte)
const;
00081
unsigned int Peek(byte *outString,
unsigned int peekMax)
const;
00082
00083
unsigned int TransferTo2(BufferedTransformation &target,
unsigned long &transferBytes,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true);
00084
unsigned int CopyRangeTo2(BufferedTransformation &target,
unsigned long &begin,
unsigned long end=ULONG_MAX,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true)
const;
00085
00086
private:
00087
const ByteQueue &m_queue;
00088
const ByteQueueNode *m_node;
00089
unsigned long m_position;
00090
unsigned int m_offset;
00091
const byte *m_lazyString;
00092
unsigned int 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
unsigned int m_nodeSize;
00104 ByteQueueNode *m_head, *m_tail;
00105 byte *m_lazyString;
00106
unsigned int m_lazyLength;
00107
bool m_lazyStringModifiable;
00108 };
00109
00110
00111 class CRYPTOPP_DLL LazyPutter
00112 {
00113
public:
00114 LazyPutter(
ByteQueue &bq,
const byte *inString,
unsigned int 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,
unsigned int size)
00129 : LazyPutter(bq) {bq.
LazyPutModifiable(inString, size);}
00130 };
00131
00132 NAMESPACE_END
00133
00134 NAMESPACE_BEGIN(std)
00135 template<> inline
void swap(CryptoPP::
ByteQueue &a, CryptoPP::
ByteQueue &b)
00136 {
00137 a.swap(b);
00138 }
00139 NAMESPACE_END
00140
00141
#endif