📄 mqueue_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++: mqueue.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>mqueue.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// mqueue.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "mqueue.h"</span>00008 00009 NAMESPACE_BEGIN(CryptoPP)00010 00011 MessageQueue::MessageQueue(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nodeSize)00012 : m_queue(nodeSize), m_lengths(1, 0U), m_messageCounts(1, 0U)00013 {00014 }00015 00016 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MessageQueue::CopyRangeTo2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &begin, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> end, <span class="keyword">const</span> std::string &channel, <span class="keywordtype">bool</span> blocking)<span class="keyword"> const</span>00017 <span class="keyword"></span>{00018 <span class="keywordflow">if</span> (begin >= <a class="code" href="class_message_queue.html#_message_queuea5">MaxRetrievable</a>())00019 <span class="keywordflow">return</span> 0;00020 00021 <span class="keywordflow">return</span> m_queue.<a class="code" href="class_byte_queue.html#_d_e_r_set_encodera13">CopyRangeTo2</a>(target, begin, STDMIN(<a class="code" href="class_message_queue.html#_message_queuea5">MaxRetrievable</a>(), end), channel, blocking);00022 }00023 <a name="l00024"></a><a class="code" href="class_message_queue.html#_message_queuea7">00024</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_message_queue.html#_message_queuea7">MessageQueue::TransferTo2</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &transferBytes, <span class="keyword">const</span> std::string &channel, <span class="keywordtype">bool</span> blocking)00025 {00026 transferBytes = STDMIN(<a class="code" href="class_message_queue.html#_message_queuea5">MaxRetrievable</a>(), transferBytes);00027 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockedBytes = m_queue.<a class="code" href="class_byte_queue.html#_d_e_r_set_encodera12">TransferTo2</a>(target, transferBytes, channel, blocking);00028 m_lengths.front() -= transferBytes;00029 <span class="keywordflow">return</span> blockedBytes;00030 }00031 <a name="l00032"></a><a class="code" href="class_message_queue.html#_message_queuea11">00032</a> <span class="keywordtype">bool</span> <a class="code" href="class_message_queue.html#_message_queuea11">MessageQueue::GetNextMessage</a>()00033 {00034 <span class="keywordflow">if</span> (<a class="code" href="class_message_queue.html#_message_queuea10">NumberOfMessages</a>() > 0 && !<a class="code" href="class_message_queue.html#_message_queuea6">AnyRetrievable</a>())00035 {00036 m_lengths.pop_front();00037 <span class="keywordflow">if</span> (m_messageCounts[0] == 0 && m_messageCounts.size() > 1)00038 m_messageCounts.pop_front();00039 <span class="keywordflow">return</span> <span class="keyword">true</span>;00040 }00041 <span class="keywordflow">else</span>00042 <span class="keywordflow">return</span> <span class="keyword">false</span>;00043 }00044 00045 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MessageQueue::CopyMessagesTo(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count, <span class="keyword">const</span> std::string &channel)<span class="keyword"> const</span>00046 <span class="keyword"></span>{00047 ByteQueue::Walker walker(m_queue);00048 std::deque<unsigned long>::const_iterator it = m_lengths.begin();00049 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00050 <span class="keywordflow">for</span> (i=0; i<count && it != --m_lengths.end(); ++i, ++it)00051 {00052 walker.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_10">TransferTo</a>(target, *it, channel);00053 <span class="keywordflow">if</span> (GetAutoSignalPropagation())00054 target.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz13_5">ChannelMessageEnd</a>(channel, GetAutoSignalPropagation()-1);00055 }00056 <span class="keywordflow">return</span> i;00057 }00058 00059 <span class="keywordtype">void</span> MessageQueue::swap(<a class="code" href="class_message_queue.html">MessageQueue</a> &rhs)00060 {00061 m_queue.<a class="code" href="class_byte_queue.html#_d_e_r_set_encodera26">swap</a>(rhs.<a class="code" href="class_message_queue.html#_message_queuer0">m_queue</a>);00062 m_lengths.swap(rhs.<a class="code" href="class_message_queue.html#_message_queuer1">m_lengths</a>);00063 }00064 00065 <span class="keyword">const</span> byte * MessageQueue::Spy(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &contiguousSize)<span class="keyword"> const</span>00066 <span class="keyword"></span>{00067 <span class="keyword">const</span> byte *result = m_queue.<a class="code" href="class_byte_queue.html#_d_e_r_set_encodera20">Spy</a>(contiguousSize);00068 contiguousSize = (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)STDMIN((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)contiguousSize, <a class="code" href="class_message_queue.html#_message_queuea5">MaxRetrievable</a>());00069 <span class="keywordflow">return</span> result;00070 }00071 00072 <span class="comment">// *************************************************************</span>00073 00074 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EqualityComparisonFilter::MapChannel(<span class="keyword">const</span> std::string &channel)<span class="keyword"> const</span>00075 <span class="keyword"></span>{00076 <span class="keywordflow">if</span> (channel == m_firstChannel)00077 <span class="keywordflow">return</span> 0;00078 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (channel == m_secondChannel)00079 <span class="keywordflow">return</span> 1;00080 <span class="keywordflow">else</span>00081 <span class="keywordflow">return</span> 2;00082 }00083 00084 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EqualityComparisonFilter::ChannelPut2(<span class="keyword">const</span> std::string &channel, <span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)00085 {00086 <span class="keywordflow">if</span> (!blocking)00087 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"EqualityComparisonFilter"</span>);00088 00089 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = MapChannel(channel);00090 00091 <span class="keywordflow">if</span> (i == 2)00092 <span class="keywordflow">return</span> Output(3, inString, length, messageEnd, blocking, channel);00093 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_mismatchDetected)00094 <span class="keywordflow">return</span> 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -