00001 #ifndef CRYPTOPP_WAIT_H
00002 #define CRYPTOPP_WAIT_H
00003
00004 #include "cryptopp_config.h"
00005
00006 #ifdef SOCKETS_AVAILABLE
00007
00008 #include "cryptlib.h"
00009 #include <vector>
00010
00011 #ifdef USE_WINDOWS_STYLE_SOCKETS
00012 #include <windows.h>
00013 #else
00014 #include <sys/types.h>
00015 #endif
00016
00017 NAMESPACE_BEGIN(CryptoPP)
00018
00019 struct WaitingThreadData;
00020
00021
00022 class WaitObjectContainer
00023 {
00024 public:
00025
00026 class Err : public Exception
00027 {
00028 public:
00029 Err(const std::string& s) : Exception(IO_ERROR, s) {}
00030 };
00031
00032 WaitObjectContainer();
00033
00034 void Clear();
00035 void SetNoWait() {m_noWait = true;}
00036 bool Wait(unsigned long milliseconds);
00037
00038 #ifdef USE_WINDOWS_STYLE_SOCKETS
00039 ~WaitObjectContainer();
00040 void AddHandle(HANDLE handle);
00041 #else
00042 void AddReadFd(int fd);
00043 void AddWriteFd(int fd);
00044 #endif
00045
00046 private:
00047 #ifdef USE_WINDOWS_STYLE_SOCKETS
00048 void CreateThreads(unsigned int count);
00049 std::vector<HANDLE> m_handles;
00050 std::vector<WaitingThreadData *> m_threads;
00051 HANDLE m_startWaiting;
00052 HANDLE m_stopWaiting;
00053 #else
00054 fd_set m_readfds, m_writefds;
00055 int m_maxFd;
00056 #endif
00057 bool m_noWait;
00058 };
00059
00060 NAMESPACE_END
00061
00062 #endif
00063
00064 #endif