⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winpipes_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &amp;&amp; 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&amp; 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(&amp;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 &amp;&amp; !m_eofReceived);00092 00093         HANDLE h = GetHandle();00094         <span class="keywordflow">if</span> (ReadFile(h, buf, bufLen, &amp;m_lastResult, &amp;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> &amp;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, &amp;m_overlapped, &amp;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(&amp;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, &amp;written, &amp;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> &amp;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, &amp;m_overlapped, &amp;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 + -