6 #ifdef WINDOWS_PIPES_AVAILABLE
10 NAMESPACE_BEGIN(CryptoPP)
17 WindowsHandle::~WindowsHandle()
31 bool WindowsHandle::HandleValid()
const
33 return m_h && m_h != INVALID_HANDLE_VALUE;
36 void WindowsHandle::AttachHandle(HANDLE h,
bool own)
46 HANDLE WindowsHandle::DetachHandle()
49 m_h = INVALID_HANDLE_VALUE;
54 void WindowsHandle::CloseHandle()
56 if (m_h != INVALID_HANDLE_VALUE)
59 m_h = INVALID_HANDLE_VALUE;
66 void WindowsPipe::HandleError(
const char *operation)
const
68 DWORD err = GetLastError();
69 throw Err(GetHandle(), operation, err);
72 WindowsPipe::Err::Err(HANDLE s,
const std::string& operation,
int error)
73 :
OS_Error(IO_ERROR,
"WindowsPipe: " + operation +
" operation failed with error 0x" + IntToString(error, 16), operation, error)
80 WindowsPipeReceiver::WindowsPipeReceiver()
81 : m_resultPending(false), m_eofReceived(false)
83 m_event.AttachHandle(CreateEvent(NULL,
true,
false, NULL),
true);
84 CheckAndHandleError(
"CreateEvent", m_event.HandleValid());
85 memset(&m_overlapped, 0,
sizeof(m_overlapped));
86 m_overlapped.hEvent = m_event;
91 assert(!m_resultPending && !m_eofReceived);
93 HANDLE h = GetHandle();
95 if (ReadFile(h, buf, UnsignedMin((DWORD)128*1024, bufLen), &m_lastResult, &m_overlapped))
97 if (m_lastResult == 0)
102 switch (GetLastError())
105 CheckAndHandleError(
"ReadFile",
false);
106 case ERROR_BROKEN_PIPE:
107 case ERROR_HANDLE_EOF:
109 m_eofReceived =
true;
111 case ERROR_IO_PENDING:
112 m_resultPending =
true;
115 return !m_resultPending;
121 container.AddHandle(m_event,
CallStack(
"WindowsPipeReceiver::GetWaitObjects() - result pending", &callStack));
122 else if (!m_eofReceived)
123 container.SetNoWait(
CallStack(
"WindowsPipeReceiver::GetWaitObjects() - result ready", &callStack));
126 unsigned int WindowsPipeReceiver::GetReceiveResult()
130 HANDLE h = GetHandle();
131 if (GetOverlappedResult(h, &m_overlapped, &m_lastResult,
false))
133 if (m_lastResult == 0)
134 m_eofReceived =
true;
138 switch (GetLastError())
141 CheckAndHandleError(
"GetOverlappedResult",
false);
142 case ERROR_BROKEN_PIPE:
143 case ERROR_HANDLE_EOF:
145 m_eofReceived =
true;
148 m_resultPending =
false;
155 WindowsPipeSender::WindowsPipeSender()
156 : m_resultPending(false), m_lastResult(0)
158 m_event.AttachHandle(CreateEvent(NULL,
true,
false, NULL),
true);
159 CheckAndHandleError(
"CreateEvent", m_event.HandleValid());
160 memset(&m_overlapped, 0,
sizeof(m_overlapped));
161 m_overlapped.hEvent = m_event;
164 void WindowsPipeSender::Send(
const byte* buf,
size_t bufLen)
167 HANDLE h = GetHandle();
169 if (WriteFile(h, buf, UnsignedMin((DWORD)128*1024, bufLen), &written, &m_overlapped))
171 m_resultPending =
false;
172 m_lastResult = written;
176 if (GetLastError() != ERROR_IO_PENDING)
177 CheckAndHandleError(
"WriteFile",
false);
179 m_resultPending =
true;
186 container.AddHandle(m_event,
CallStack(
"WindowsPipeSender::GetWaitObjects() - result pending", &callStack));
188 container.SetNoWait(
CallStack(
"WindowsPipeSender::GetWaitObjects() - result ready", &callStack));
191 unsigned int WindowsPipeSender::GetSendResult()
195 HANDLE h = GetHandle();
196 BOOL result = GetOverlappedResult(h, &m_overlapped, &m_lastResult,
false);
197 CheckAndHandleError(
"GetOverlappedResult", result);
198 m_resultPending =
false;