📄 winpipes_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: winpipes.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>winpipes.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// winpipes.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 <span class="preprocessor">#include "winpipes.h"</span>00005 00006 <span class="preprocessor">#ifdef WINDOWS_PIPES_AVAILABLE</span>00007 <span class="preprocessor"></span>00008 <span class="preprocessor">#include "wait.h"</span>00009 00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 WindowsHandle::WindowsHandle(HANDLE h, <span class="keywordtype">bool</span> own)00013 : m_h(h), m_own(own)00014 {00015 }00016 00017 WindowsHandle::~WindowsHandle()00018 {00019 <span class="keywordflow">if</span> (m_own)00020 {00021 <span class="keywordflow">try</span>00022 {00023 CloseHandle();00024 }00025 <span class="keywordflow">catch</span> (...)00026 {00027 }00028 }00029 }00030 00031 <span class="keywordtype">bool</span> WindowsHandle::HandleValid()<span class="keyword"> const</span>00032 <span class="keyword"></span>{00033 <span class="keywordflow">return</span> m_h && m_h != INVALID_HANDLE_VALUE;00034 }00035 00036 <span class="keywordtype">void</span> WindowsHandle::AttachHandle(HANDLE h, <span class="keywordtype">bool</span> own)00037 {00038 <span class="keywordflow">if</span> (m_own)00039 CloseHandle();00040 00041 m_h = h;00042 m_own = own;00043 HandleChanged();00044 }00045 00046 HANDLE WindowsHandle::DetachHandle()00047 {00048 HANDLE h = m_h;00049 m_h = INVALID_HANDLE_VALUE;00050 HandleChanged();00051 <span class="keywordflow">return</span> h;00052 }00053 00054 <span class="keywordtype">void</span> WindowsHandle::CloseHandle()00055 {00056 <span class="keywordflow">if</span> (m_h != INVALID_HANDLE_VALUE)00057 {00058 ::CloseHandle(m_h);00059 m_h = INVALID_HANDLE_VALUE;00060 HandleChanged();00061 }00062 }00063 00064 <span class="comment">// ********************************************************</span>00065 00066 <span class="keywordtype">void</span> WindowsPipe::HandleError(<span class="keyword">const</span> <span class="keywordtype">char</span> *operation)<span class="keyword"> const</span>00067 <span class="keyword"></span>{00068 DWORD err = GetLastError();00069 <span class="keywordflow">throw</span> Err(GetHandle(), operation, err);00070 }00071 00072 WindowsPipe::Err::Err(HANDLE s, <span class="keyword">const</span> std::string& operation, <span class="keywordtype">int</span> error)00073 : <a class="code" href="class_o_s___error.html">OS_Error</a>(IO_ERROR, "<a class="code" href="class_windows_pipe.html">WindowsPipe</a>: " + operation + " operation failed with error 0x" + IntToString(error, 16), operation, error)00074 , m_h(s)00075 {00076 }00077 00078 <span class="comment">// *************************************************************</span>00079 00080 WindowsPipeReceiver::WindowsPipeReceiver()00081 : m_resultPending(false), m_eofReceived(false)00082 {00083 m_event.AttachHandle(CreateEvent(NULL, <span class="keyword">true</span>, <span class="keyword">false</span>, NULL), <span class="keyword">true</span>);00084 CheckAndHandleError(<span class="stringliteral">"CreateEvent"</span>, m_event.HandleValid());00085 memset(&m_overlapped, 0, <span class="keyword">sizeof</span>(m_overlapped));00086 m_overlapped.hEvent = m_event;00087 }00088 00089 <span class="keywordtype">void</span> WindowsPipeReceiver::Receive(byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00090 {00091 assert(!m_resultPending && !m_eofReceived);00092 00093 HANDLE h = GetHandle();00094 <span class="keywordflow">if</span> (ReadFile(h, buf, bufLen, &m_lastResult, &m_overlapped))00095 {00096 <span class="keywordflow">if</span> (m_lastResult == 0)00097 m_eofReceived = <span class="keyword">true</span>;00098 }00099 <span class="keywordflow">else</span>00100 {00101 <span class="keywordflow">switch</span> (GetLastError())00102 {00103 <span class="keywordflow">default</span>:00104 CheckAndHandleError(<span class="stringliteral">"ReadFile"</span>, <span class="keyword">false</span>);00105 <span class="keywordflow">case</span> ERROR_BROKEN_PIPE:00106 <span class="keywordflow">case</span> ERROR_HANDLE_EOF:00107 m_lastResult = 0;00108 m_eofReceived = <span class="keyword">true</span>;00109 <span class="keywordflow">break</span>;00110 <span class="keywordflow">case</span> ERROR_IO_PENDING:00111 m_resultPending = <span class="keyword">true</span>;00112 }00113 }00114 }00115 <a name="l00116"></a><a class="code" href="class_windows_pipe_receiver.html#_windows_pipe_sourcea36">00116</a> <span class="keywordtype">void</span> <a class="code" href="class_windows_pipe_receiver.html#_windows_pipe_sourcea36">WindowsPipeReceiver::GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &container)00117 {00118 <span class="keywordflow">if</span> (m_resultPending)00119 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera4">AddHandle</a>(m_event);00120 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m_eofReceived)00121 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera2">SetNoWait</a>();00122 }00123 00124 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> WindowsPipeReceiver::GetReceiveResult()00125 {00126 <span class="keywordflow">if</span> (m_resultPending)00127 {00128 HANDLE h = GetHandle();00129 <span class="keywordflow">if</span> (GetOverlappedResult(h, &m_overlapped, &m_lastResult, <span class="keyword">false</span>))00130 {00131 <span class="keywordflow">if</span> (m_lastResult == 0)00132 m_eofReceived = <span class="keyword">true</span>;00133 }00134 <span class="keywordflow">else</span>00135 {00136 <span class="keywordflow">switch</span> (GetLastError())00137 {00138 <span class="keywordflow">default</span>:00139 CheckAndHandleError(<span class="stringliteral">"GetOverlappedResult"</span>, <span class="keyword">false</span>);00140 <span class="keywordflow">case</span> ERROR_BROKEN_PIPE:00141 <span class="keywordflow">case</span> ERROR_HANDLE_EOF:00142 m_lastResult = 0;00143 m_eofReceived = <span class="keyword">true</span>;00144 }00145 }00146 m_resultPending = <span class="keyword">false</span>;00147 }00148 <span class="keywordflow">return</span> m_lastResult;00149 }00150 00151 <span class="comment">// *************************************************************</span>00152 00153 WindowsPipeSender::WindowsPipeSender()00154 : m_resultPending(false), m_lastResult(0)00155 {00156 m_event.<a class="code" href="class_windows_handle.html#_windows_pipe_sourcea5">AttachHandle</a>(CreateEvent(NULL, <span class="keyword">true</span>, <span class="keyword">false</span>, NULL), <span class="keyword">true</span>);00157 CheckAndHandleError(<span class="stringliteral">"CreateEvent"</span>, m_event.<a class="code" href="class_windows_handle.html#_windows_pipe_sourcea4">HandleValid</a>());00158 memset(&m_overlapped, 0, <span class="keyword">sizeof</span>(m_overlapped));00159 m_overlapped.hEvent = m_event;00160 }00161 00162 <span class="keywordtype">void</span> WindowsPipeSender::Send(<span class="keyword">const</span> byte* buf, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufLen)00163 {00164 DWORD written = 0;00165 HANDLE h = GetHandle();00166 <span class="keywordflow">if</span> (WriteFile(h, buf, bufLen, &written, &m_overlapped))00167 {00168 m_resultPending = <span class="keyword">false</span>;00169 m_lastResult = written;00170 }00171 <span class="keywordflow">else</span>00172 {00173 <span class="keywordflow">if</span> (GetLastError() != ERROR_IO_PENDING)00174 CheckAndHandleError(<span class="stringliteral">"WriteFile"</span>, <span class="keyword">false</span>);00175 00176 m_resultPending = <span class="keyword">true</span>;00177 }00178 }00179 <a name="l00180"></a><a class="code" href="class_windows_pipe_sender.html#_windows_pipe_sinka26">00180</a> <span class="keywordtype">void</span> <a class="code" href="class_windows_pipe_sender.html#_windows_pipe_sinka26">WindowsPipeSender::GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html">WaitObjectContainer</a> &container)00181 {00182 <span class="keywordflow">if</span> (m_resultPending)00183 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera4">AddHandle</a>(m_event);00184 <span class="keywordflow">else</span>00185 container.<a class="code" href="class_wait_object_container.html#_wait_object_containera2">SetNoWait</a>();00186 }00187 00188 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> WindowsPipeSender::GetSendResult()00189 {00190 <span class="keywordflow">if</span> (m_resultPending)00191 {00192 HANDLE h = GetHandle();00193 BOOL result = GetOverlappedResult(h, &m_overlapped, &m_lastResult, <span class="keyword">false</span>);00194 CheckAndHandleError(<span class="stringliteral">"GetOverlappedResult"</span>, result);00195 m_resultPending = <span class="keyword">false</span>;00196 }00197 <span class="keywordflow">return</span> m_lastResult;00198 }00199 00200 NAMESPACE_END00201 00202 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:28 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -