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
ByteQueue : public Bufferless<
BufferedTransformation>
00017 {
00018
public:
00019
ByteQueue(
unsigned int m_nodeSize=256);
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) {m_nodeSize = 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 UndoLazyPut(
unsigned int size);
00056
void FinalizeLazyPut();
00057
00058
ByteQueue & operator=(
const ByteQueue &rhs);
00059
bool operator==(
const ByteQueue &rhs)
const;
00060 byte operator[](
unsigned long i)
const;
00061
void swap(
ByteQueue &rhs);
00062
00063
class Walker :
public InputRejecting<BufferedTransformation>
00064 {
00065
public:
00066 Walker(
const ByteQueue &queue)
00067 : m_queue(queue) {Initialize();}
00068
00069
unsigned long GetCurrentPosition() {
return m_position;}
00070
00071
unsigned long MaxRetrievable()
const
00072
{
return m_queue.CurrentSize() - m_position;}
00073
00074
void IsolatedInitialize(
const NameValuePairs ¶meters);
00075
00076
unsigned int Get(byte &outByte);
00077
unsigned int Get(byte *outString,
unsigned int getMax);
00078
00079
unsigned int Peek(byte &outByte)
const;
00080
unsigned int Peek(byte *outString,
unsigned int peekMax)
const;
00081
00082
unsigned int TransferTo2(BufferedTransformation &target,
unsigned long &transferBytes,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true);
00083
unsigned int CopyRangeTo2(BufferedTransformation &target,
unsigned long &begin,
unsigned long end=ULONG_MAX,
const std::string &channel=NULL_CHANNEL,
bool blocking=
true)
const;
00084
00085
private:
00086
const ByteQueue &m_queue;
00087
const ByteQueueNode *m_node;
00088
unsigned long m_position;
00089
unsigned int m_offset;
00090
const byte *m_lazyString;
00091
unsigned int m_lazyLength;
00092 };
00093
00094
friend class Walker;
00095
00096
private:
00097
void CleanupUsedNodes();
00098
void CopyFrom(
const ByteQueue ©);
00099
void Destroy();
00100
00101
unsigned int m_nodeSize;
00102 ByteQueueNode *m_head, *m_tail;
00103
const byte *m_lazyString;
00104
unsigned int m_lazyLength;
00105 };
00106
00107
00108 class LazyPutter
00109 {
00110
public:
00111
LazyPutter(
ByteQueue &bq,
const byte *inString,
unsigned int size)
00112 : m_bq(bq) {bq.
LazyPut(inString, size);}
00113 ~
LazyPutter()
00114 {
try {m_bq.
FinalizeLazyPut();}
catch(...) {}}
00115
private:
00116
ByteQueue &m_bq;
00117 };
00118
00119 NAMESPACE_END
00120
00121 NAMESPACE_BEGIN(std)
00122 template<> inline
void swap(CryptoPP::
ByteQueue &a, CryptoPP::
ByteQueue &b)
00123 {
00124 a.swap(b);
00125 }
00126 NAMESPACE_END
00127
00128
#endif