📄 filters_8cpp-source.html
字号:
00156 m_currentMessageBytes = 0;00157 m_currentSeriesMessages = 0;00158 m_totalMessageSeries++;00159 <span class="keywordflow">return</span> <span class="keyword">false</span>;00160 }00161 00162 <span class="comment">// *************************************************************</span>00163 00164 <span class="keywordtype">void</span> FilterWithBufferedInput::BlockQueue::ResetQueue(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxBlocks)00165 {00166 m_buffer.New(blockSize * maxBlocks);00167 m_blockSize = blockSize;00168 m_maxBlocks = maxBlocks;00169 m_size = 0;00170 m_begin = m_buffer;00171 }00172 00173 byte *FilterWithBufferedInput::BlockQueue::GetBlock()00174 {00175 <span class="keywordflow">if</span> (m_size >= m_blockSize)00176 {00177 byte *ptr = m_begin;00178 <span class="keywordflow">if</span> ((m_begin+=m_blockSize) == m_buffer.end())00179 m_begin = m_buffer;00180 m_size -= m_blockSize;00181 <span class="keywordflow">return</span> ptr;00182 }00183 <span class="keywordflow">else</span>00184 <span class="keywordflow">return</span> NULL;00185 }00186 00187 byte *FilterWithBufferedInput::BlockQueue::GetContigousBlocks(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &numberOfBytes)00188 {00189 numberOfBytes = STDMIN(numberOfBytes, STDMIN((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)(m_buffer.end()-m_begin), m_size));00190 byte *ptr = m_begin;00191 m_begin += numberOfBytes;00192 m_size -= numberOfBytes;00193 <span class="keywordflow">if</span> (m_size == 0 || m_begin == m_buffer.end())00194 m_begin = m_buffer;00195 <span class="keywordflow">return</span> ptr;00196 }00197 00198 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> FilterWithBufferedInput::BlockQueue::GetAll(byte *outString)00199 {00200 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size = m_size;00201 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numberOfBytes = m_maxBlocks*m_blockSize;00202 <span class="keyword">const</span> byte *ptr = GetContigousBlocks(numberOfBytes);00203 memcpy(outString, ptr, numberOfBytes);00204 memcpy(outString+numberOfBytes, m_begin, m_size);00205 m_size = 0;00206 <span class="keywordflow">return</span> size;00207 }00208 00209 <span class="keywordtype">void</span> <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">FilterWithBufferedInput::BlockQueue::Put</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00210 {00211 assert(m_size + length <= m_buffer.size());00212 byte *end = (m_size < (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)(m_buffer.end()-m_begin)) ? m_begin + m_size : m_begin + m_size - m_buffer.size();00213 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = STDMIN(length, (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)(m_buffer.end()-end));00214 memcpy(end, inString, len);00215 <span class="keywordflow">if</span> (len < length)00216 memcpy(m_buffer, inString+len, length-len);00217 m_size += length;00218 }00219 00220 <a class="code" href="class_filter_with_buffered_input.html#_filter_with_buffered_inputa1">FilterWithBufferedInput::FilterWithBufferedInput</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> *attachment)00221 : <a class="code" href="class_filter.html">Filter</a>(attachment)00222 {00223 }00224 <a name="l00225"></a><a class="code" href="class_filter_with_buffered_input.html#_filter_with_buffered_inputa1">00225</a> <a class="code" href="class_filter_with_buffered_input.html#_filter_with_buffered_inputa1">FilterWithBufferedInput::FilterWithBufferedInput</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> firstSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lastSize, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> *attachment)00226 : <a class="code" href="class_filter.html">Filter</a>(attachment), m_firstSize(firstSize), m_blockSize(blockSize), m_lastSize(lastSize)00227 , m_firstInputDone(false)00228 {00229 <span class="keywordflow">if</span> (m_firstSize < 0 || m_blockSize < 1 || m_lastSize < 0)00230 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"FilterWithBufferedInput: invalid buffer size"</span>);00231 00232 m_queue.ResetQueue(1, m_firstSize);00233 }00234 00235 <span class="keywordtype">void</span> FilterWithBufferedInput::IsolatedInitialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &parameters)00236 {00237 InitializeDerivedAndReturnNewSizes(parameters, m_firstSize, m_blockSize, m_lastSize);00238 <span class="keywordflow">if</span> (m_firstSize < 0 || m_blockSize < 1 || m_lastSize < 0)00239 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"FilterWithBufferedInput: invalid buffer size"</span>);00240 m_queue.ResetQueue(1, m_firstSize);00241 m_firstInputDone = <span class="keyword">false</span>;00242 }00243 <a name="l00244"></a><a class="code" href="class_filter_with_buffered_input.html#_stream_transformation_filtera8">00244</a> <span class="keywordtype">bool</span> <a class="code" href="class_filter_with_buffered_input.html#_stream_transformation_filtera8">FilterWithBufferedInput::IsolatedFlush</a>(<span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">bool</span> blocking)00245 {00246 <span class="keywordflow">if</span> (!blocking)00247 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"FilterWithBufferedInput"</span>);00248 00249 <span class="keywordflow">if</span> (hardFlush)00250 <a class="code" href="class_filter_with_buffered_input.html#_stream_transformation_filtera9">ForceNextPut</a>();00251 FlushDerived();00252 00253 <span class="keywordflow">return</span> <span class="keyword">false</span>;00254 }00255 00256 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> FilterWithBufferedInput::PutMaybeModifiable(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, <span class="keywordtype">bool</span> modifiable)00257 {00258 <span class="keywordflow">if</span> (!blocking)00259 <span class="keywordflow">throw</span> BlockingInputOnly(<span class="stringliteral">"FilterWithBufferedInput"</span>);00260 00261 <span class="keywordflow">if</span> (length != 0)00262 {00263 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> newLength = m_queue.CurrentSize() + length;00264 00265 <span class="keywordflow">if</span> (!m_firstInputDone && newLength >= m_firstSize)00266 {00267 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_firstSize - m_queue.CurrentSize();00268 m_queue.Put(inString, len);00269 FirstPut(m_queue.GetContigousBlocks(m_firstSize));00270 assert(m_queue.CurrentSize() == 0);00271 m_queue.ResetQueue(m_blockSize, (2*m_blockSize+m_lastSize-2)/m_blockSize);00272 00273 inString += len;00274 newLength -= m_firstSize;00275 m_firstInputDone = <span class="keyword">true</span>;00276 }00277 00278 <span class="keywordflow">if</span> (m_firstInputDone)00279 {00280 <span class="keywordflow">if</span> (m_blockSize == 1)00281 {00282 <span class="keywordflow">while</span> (newLength > m_lastSize && m_queue.CurrentSize() > 0)00283 {00284 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = newLength - m_lastSize;00285 byte *ptr = m_queue.GetContigousBlocks(len);00286 NextPutModifiable(ptr, len);00287 newLength -= len;00288 }00289 00290 <span class="keywordflow">if</span> (newLength > m_lastSize)00291 {00292 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = newLength - m_lastSize;00293 NextPutMaybeModifiable(inString, len, modifiable);00294 inString += len;00295 newLength -= len;00296 }00297 }00298 <span class="keywordflow">else</span>00299 {00300 <span class="keywordflow">while</span> (newLength >= m_blockSize + m_lastSize && m_queue.CurrentSize() >= m_blockSize)00301 {00302 NextPutModifiable(m_queue.GetBlock(), m_blockSize);00303 newLength -= m_blockSize;00304 }00305 00306 <span class="keywordflow">if</span> (newLength >= m_blockSize + m_lastSize && m_queue.CurrentSize() > 0)00307 {00308 assert(m_queue.CurrentSize() < m_blockSize);00309 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_blockSize - m_queue.CurrentSize();00310 m_queue.Put(inString, len);00311 inString += len;00312 NextPutModifiable(m_queue.GetBlock(), m_blockSize);00313 newLength -= m_blockSize;00314 }00315 00316 <span class="keywordflow">if</span> (newLength >= m_blockSize + m_lastSize)00317 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -