6 #ifdef WINDOWS_PIPES_AVAILABLE 12 WindowsHandle::WindowsHandle(HANDLE h,
bool own)
17 WindowsHandle::~WindowsHandle()
32 bool WindowsHandle::HandleValid()
const 34 return m_h && m_h != INVALID_HANDLE_VALUE;
37 void WindowsHandle::AttachHandle(HANDLE h,
bool own)
47 HANDLE WindowsHandle::DetachHandle()
50 m_h = INVALID_HANDLE_VALUE;
55 void WindowsHandle::CloseHandle()
57 if (m_h != INVALID_HANDLE_VALUE)
60 m_h = INVALID_HANDLE_VALUE;
67 void WindowsPipe::HandleError(
const char *operation)
const 69 DWORD err = GetLastError();
70 throw Err(GetHandle(), operation, err);
73 WindowsPipe::Err::Err(HANDLE s,
const std::string& operation,
int error)
74 :
OS_Error(IO_ERROR,
"WindowsPipe: " + operation +
" operation failed with error 0x" +
IntToString(error, 16), operation, error)
81 WindowsPipeReceiver::WindowsPipeReceiver()
82 : m_resultPending(false), m_eofReceived(false)
84 m_event.AttachHandle(CreateEvent(NULL,
true,
false, NULL),
true);
85 CheckAndHandleError(
"CreateEvent", m_event.HandleValid());
86 memset(&m_overlapped, 0,
sizeof(m_overlapped));
87 m_overlapped.hEvent = m_event;
90 bool WindowsPipeReceiver::Receive(byte* buf,
size_t bufLen)
92 assert(!m_resultPending && !m_eofReceived);
94 const HANDLE h = GetHandle();
96 if (ReadFile(h, buf,
UnsignedMin((DWORD)128*1024, bufLen), &m_lastResult, &m_overlapped))
98 if (m_lastResult == 0)
103 switch (GetLastError())
106 CheckAndHandleError(
"ReadFile",
false);
107 case ERROR_BROKEN_PIPE:
108 case ERROR_HANDLE_EOF:
110 m_eofReceived =
true;
112 case ERROR_IO_PENDING:
113 m_resultPending =
true;
116 return !m_resultPending;
122 container.AddHandle(m_event,
CallStack(
"WindowsPipeReceiver::GetWaitObjects() - result pending", &callStack));
123 else if (!m_eofReceived)
124 container.SetNoWait(
CallStack(
"WindowsPipeReceiver::GetWaitObjects() - result ready", &callStack));
127 unsigned int WindowsPipeReceiver::GetReceiveResult()
131 const HANDLE h = GetHandle();
132 if (GetOverlappedResult(h, &m_overlapped, &m_lastResult,
false))
134 if (m_lastResult == 0)
135 m_eofReceived =
true;
139 switch (GetLastError())
142 CheckAndHandleError(
"GetOverlappedResult",
false);
143 case ERROR_BROKEN_PIPE:
144 case ERROR_HANDLE_EOF:
146 m_eofReceived =
true;
149 m_resultPending =
false;
156 WindowsPipeSender::WindowsPipeSender()
157 : m_resultPending(false), m_lastResult(0)
159 m_event.AttachHandle(CreateEvent(NULL,
true,
false, NULL),
true);
160 CheckAndHandleError(
"CreateEvent", m_event.HandleValid());
161 memset(&m_overlapped, 0,
sizeof(m_overlapped));
162 m_overlapped.hEvent = m_event;
165 void WindowsPipeSender::Send(
const byte* buf,
size_t bufLen)
168 const HANDLE h = GetHandle();
170 if (WriteFile(h, buf,
UnsignedMin((DWORD)128*1024, bufLen), &written, &m_overlapped))
172 m_resultPending =
false;
173 m_lastResult = written;
177 if (GetLastError() != ERROR_IO_PENDING)
178 CheckAndHandleError(
"WriteFile",
false);
180 m_resultPending =
true;
187 container.AddHandle(m_event,
CallStack(
"WindowsPipeSender::GetWaitObjects() - result pending", &callStack));
189 container.SetNoWait(
CallStack(
"WindowsPipeSender::GetWaitObjects() - result ready", &callStack));
192 unsigned int WindowsPipeSender::GetSendResult()
196 const HANDLE h = GetHandle();
197 BOOL result = GetOverlappedResult(h, &m_overlapped, &m_lastResult,
false);
198 CheckAndHandleError(
"GetOverlappedResult", result);
199 m_resultPending =
false;
Base class for all exceptions thrown by Crypto++.
container of wait objects
The operating system reported an error.
const T1 UnsignedMin(const T1 &a, const T2 &b)
Safe comparison of values that could be neagtive and incorrectly promoted.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
Crypto++ library namespace.