00001 #ifndef CRYPTOPP_NETWORK_H
00002 #define CRYPTOPP_NETWORK_H
00003
00004 #include "filters.h"
00005 #include "hrtimer.h"
00006
00007 NAMESPACE_BEGIN(CryptoPP)
00008
00009
00010 class NonblockingSource : public AutoSignaling<Source>
00011 {
00012 public:
00013 NonblockingSource(BufferedTransformation *attachment)
00014 : AutoSignaling<Source>(attachment), m_messageEndSent(false) {}
00015
00016
00017
00018
00019
00020
00021 virtual unsigned int GeneralPump2(unsigned long &byteCount, bool blockingOutput=true, unsigned long maxTime=INFINITE_TIME, bool checkDelimiter=false, byte delimiter='\n') =0;
00022
00023 unsigned long GeneralPump(unsigned long maxSize=ULONG_MAX, unsigned long maxTime=INFINITE_TIME, bool checkDelimiter=false, byte delimiter='\n')
00024 {
00025 GeneralPump2(maxSize, true, maxTime, checkDelimiter, delimiter);
00026 return maxSize;
00027 }
00028 unsigned long TimedPump(unsigned long maxTime)
00029 {return GeneralPump(ULONG_MAX, maxTime);}
00030 unsigned long PumpLine(byte delimiter='\n', unsigned long maxSize=1024)
00031 {return GeneralPump(maxSize, INFINITE_TIME, true, delimiter);}
00032
00033 unsigned int Pump2(unsigned long &byteCount, bool blocking=true)
00034 {return GeneralPump2(byteCount, blocking, blocking ? INFINITE_TIME : 0);}
00035 unsigned int PumpMessages2(unsigned int &messageCount, bool blocking=true);
00036
00037
00038 private:
00039 bool m_messageEndSent;
00040 };
00041
00042
00043 class NetworkReceiver : public Waitable
00044 {
00045 public:
00046 virtual bool MustWaitToReceive() {return false;}
00047 virtual bool MustWaitForResult() {return false;}
00048 virtual void Receive(byte* buf, unsigned int bufLen) =0;
00049 virtual unsigned int GetReceiveResult() =0;
00050 virtual bool EofReceived() const =0;
00051 };
00052
00053
00054 class NonblockingSink : public Sink
00055 {
00056 public:
00057 bool IsolatedFlush(bool hardFlush, bool blocking);
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 virtual unsigned int TimedFlush(unsigned long maxTime, unsigned int targetSize = 0) =0;
00070
00071 virtual void SetMaxBufferSize(unsigned int maxBufferSize) =0;
00072 virtual void SetAutoFlush(bool autoFlush = true) =0;
00073
00074 virtual unsigned int GetMaxBufferSize() const =0;
00075 virtual unsigned int GetCurrentBufferSize() const =0;
00076 };
00077
00078
00079 class NetworkSender : public Waitable
00080 {
00081 public:
00082 virtual bool MustWaitToSend() {return false;}
00083 virtual bool MustWaitForResult() {return false;}
00084 virtual void Send(const byte* buf, unsigned int bufLen) =0;
00085 virtual unsigned int GetSendResult() =0;
00086 virtual void SendEof() =0;
00087 };
00088
00089 #ifdef HIGHRES_TIMER_AVAILABLE
00090
00091
00092 class NetworkSource : public NonblockingSource
00093 {
00094 public:
00095 NetworkSource(BufferedTransformation *attachment);
00096
00097 unsigned int GetMaxWaitObjectCount() const
00098 {return GetReceiver().GetMaxWaitObjectCount() + AttachedTransformation()->GetMaxWaitObjectCount();}
00099 void GetWaitObjects(WaitObjectContainer &container)
00100 {AccessReceiver().GetWaitObjects(container); AttachedTransformation()->GetWaitObjects(container);}
00101
00102 unsigned int GeneralPump2(unsigned long &byteCount, bool blockingOutput=true, unsigned long maxTime=INFINITE_TIME, bool checkDelimiter=false, byte delimiter='\n');
00103 bool SourceExhausted() const {return GetReceiver().EofReceived();}
00104
00105 protected:
00106 virtual NetworkReceiver & AccessReceiver() =0;
00107 const NetworkReceiver & GetReceiver() const {return const_cast<NetworkSource *>(this)->AccessReceiver();}
00108
00109 private:
00110 enum {NORMAL, WAITING_FOR_RESULT, OUTPUT_BLOCKED};
00111 SecByteBlock m_buf;
00112 unsigned int m_bufSize, m_putSize, m_state;
00113 };
00114
00115
00116 class NetworkSink : public NonblockingSink
00117 {
00118 public:
00119 NetworkSink(unsigned int maxBufferSize, bool autoFlush)
00120 : m_maxBufferSize(maxBufferSize), m_autoFlush(autoFlush), m_needSendResult(false), m_blockedBytes(0) {}
00121
00122 unsigned int GetMaxWaitObjectCount() const
00123 {return GetSender().GetMaxWaitObjectCount();}
00124 void GetWaitObjects(WaitObjectContainer &container)
00125 {if (m_blockedBytes || !m_buffer.IsEmpty()) AccessSender().GetWaitObjects(container);}
00126
00127 unsigned int Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking);
00128
00129 unsigned int TimedFlush(unsigned long maxTime, unsigned int targetSize = 0);
00130
00131 void SetMaxBufferSize(unsigned int maxBufferSize) {m_maxBufferSize = maxBufferSize;}
00132 void SetAutoFlush(bool autoFlush = true) {m_autoFlush = autoFlush;}
00133
00134 unsigned int GetMaxBufferSize() const {return m_maxBufferSize;}
00135 unsigned int GetCurrentBufferSize() const {return m_buffer.CurrentSize();}
00136
00137 protected:
00138 virtual NetworkSender & AccessSender() =0;
00139 const NetworkSender & GetSender() const {return const_cast<NetworkSink *>(this)->AccessSender();}
00140
00141 private:
00142 unsigned int m_maxBufferSize;
00143 bool m_autoFlush, m_needSendResult;
00144 ByteQueue m_buffer;
00145 unsigned int m_blockedBytes;
00146 };
00147
00148 #endif // #ifdef HIGHRES_TIMER_AVAILABLE
00149
00150 NAMESPACE_END
00151
00152 #endif