📄 asn_8cpp-source.html
字号:
<a name="l00334"></a>00334 <span class="keywordflow">if</span> (!definiteLength)<a name="l00335"></a>00335 {<a name="l00336"></a>00336 <span class="keywordflow">if</span> (!(m_id & CONSTRUCTED))<a name="l00337"></a>00337 BERDecodeError();<a name="l00338"></a>00338 m_level++;<a name="l00339"></a>00339 m_state = IDENTIFIER;<a name="l00340"></a>00340 <span class="keywordflow">break</span>;<a name="l00341"></a>00341 }<a name="l00342"></a>00342 m_state = BODY; <span class="comment">// fall through</span><a name="l00343"></a>00343 }<a name="l00344"></a>00344 <span class="keywordflow">case</span> BODY:<a name="l00345"></a>00345 m_lengthRemaining -= m_queue.<a class="code" href="class_buffered_transformation.html#91c4526148274ae9cb68803bb2d2a2aa" title="move transferMax bytes of the buffered output to target as input">TransferTo</a>(CurrentTarget(), m_lengthRemaining);<a name="l00346"></a>00346 <a name="l00347"></a>00347 <span class="keywordflow">if</span> (m_lengthRemaining == 0)<a name="l00348"></a>00348 m_state = IDENTIFIER;<a name="l00349"></a>00349 }<a name="l00350"></a>00350 <a name="l00351"></a>00351 <span class="keywordflow">if</span> (m_state == IDENTIFIER && m_level == 0)<a name="l00352"></a>00352 {<a name="l00353"></a>00353 <span class="comment">// just finished processing a level 0 object</span><a name="l00354"></a>00354 ++m_nCurrentObject;<a name="l00355"></a>00355 <a name="l00356"></a>00356 <span class="keywordflow">if</span> (m_flags & <a class="code" href="class_encoded_object_filter.html#79e83aa124d042a26fba07ca3ede9d083cc81ef4dcdc4e0fc8122acd230ece7b">PUT_MESSANGE_END_AFTER_EACH_OBJECT</a>)<a name="l00357"></a>00357 <a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#20ae0ef2e4ff338b43849e541e9b940f">MessageEnd</a>();<a name="l00358"></a>00358 <a name="l00359"></a>00359 <span class="keywordflow">if</span> (m_nCurrentObject == m_nObjects)<a name="l00360"></a>00360 {<a name="l00361"></a>00361 <span class="keywordflow">if</span> (m_flags & <a class="code" href="class_encoded_object_filter.html#79e83aa124d042a26fba07ca3ede9d0850e27220e4156443726d4610a5caa716">PUT_MESSANGE_END_AFTER_ALL_OBJECTS</a>)<a name="l00362"></a>00362 <a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#20ae0ef2e4ff338b43849e541e9b940f">MessageEnd</a>();<a name="l00363"></a>00363 <a name="l00364"></a>00364 <span class="keywordflow">if</span> (m_flags & <a class="code" href="class_encoded_object_filter.html#79e83aa124d042a26fba07ca3ede9d08c2d3a09df4cff483a6867d5056aa1264">PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS</a>)<a name="l00365"></a>00365 <a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>()-><a class="code" href="class_buffered_transformation.html#ae4c5ae024419e31bfa0c24eb35b24c2" title="mark end of a series of messages">MessageSeriesEnd</a>();<a name="l00366"></a>00366 <a name="l00367"></a>00367 m_queue.<a class="code" href="class_buffered_transformation.html#80b60bff9f62976c15effdbc45cbc5f1">TransferAllTo</a>(*<a class="code" href="class_filter.html#c8fc888888b2dad88bf64fc703044a93" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>());<a name="l00368"></a>00368 <span class="keywordflow">return</span>;<a name="l00369"></a>00369 }<a name="l00370"></a>00370 }<a name="l00371"></a>00371 }<a name="l00372"></a>00372 }<a name="l00373"></a>00373 <a name="l00374"></a><a class="code" href="class_b_e_r_general_decoder.html#4044a915e770a703520a2349730ace38">00374</a> <a class="code" href="class_b_e_r_general_decoder.html#4044a915e770a703520a2349730ace38">BERGeneralDecoder::BERGeneralDecoder</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &inQueue, byte asnTag)<a name="l00375"></a>00375 : m_inQueue(inQueue), m_finished(false)<a name="l00376"></a>00376 {<a name="l00377"></a>00377 Init(asnTag);<a name="l00378"></a>00378 }<a name="l00379"></a>00379 <a name="l00380"></a><a class="code" href="class_b_e_r_general_decoder.html#a95f58ca2fb775aa5f3f355e6bfb43ee">00380</a> <a class="code" href="class_b_e_r_general_decoder.html#4044a915e770a703520a2349730ace38">BERGeneralDecoder::BERGeneralDecoder</a>(<a class="code" href="class_b_e_r_general_decoder.html" title="BER General Decoder.">BERGeneralDecoder</a> &inQueue, byte asnTag)<a name="l00381"></a>00381 : <a class="code" href="class_b_e_r_general_decoder.html#29c44ea3a6c6cdf63c58046d8ab22266">m_inQueue</a>(inQueue), <a class="code" href="class_b_e_r_general_decoder.html#5eb4279b5ed2b47bc9811d4bff81b532">m_finished</a>(false)<a name="l00382"></a>00382 {<a name="l00383"></a>00383 Init(asnTag);<a name="l00384"></a>00384 }<a name="l00385"></a>00385 <a name="l00386"></a>00386 <span class="keywordtype">void</span> BERGeneralDecoder::Init(byte asnTag)<a name="l00387"></a>00387 {<a name="l00388"></a>00388 byte b;<a name="l00389"></a>00389 <span class="keywordflow">if</span> (!<a class="code" href="class_b_e_r_general_decoder.html#29c44ea3a6c6cdf63c58046d8ab22266">m_inQueue</a>.<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(b) || b != asnTag)<a name="l00390"></a>00390 BERDecodeError();<a name="l00391"></a>00391 <a name="l00392"></a>00392 <span class="keywordflow">if</span> (!BERLengthDecode(<a class="code" href="class_b_e_r_general_decoder.html#29c44ea3a6c6cdf63c58046d8ab22266">m_inQueue</a>, <a class="code" href="class_b_e_r_general_decoder.html#11096d3b64df9f0b3ff3d8d74be9b3c3">m_length</a>, <a class="code" href="class_b_e_r_general_decoder.html#a9337ce30f65285a708bcb91b12524c8">m_definiteLength</a>))<a name="l00393"></a>00393 BERDecodeError();<a name="l00394"></a>00394 <a name="l00395"></a>00395 <span class="keywordflow">if</span> (!<a class="code" href="class_b_e_r_general_decoder.html#a9337ce30f65285a708bcb91b12524c8">m_definiteLength</a> && !(asnTag & CONSTRUCTED))<a name="l00396"></a>00396 BERDecodeError(); <span class="comment">// cannot be primitive and have indefinite length</span><a name="l00397"></a>00397 }<a name="l00398"></a>00398 <a name="l00399"></a><a class="code" href="class_b_e_r_general_decoder.html#8cebe14033da47fefc83396bfd463f4f">00399</a> <a class="code" href="class_b_e_r_general_decoder.html#8cebe14033da47fefc83396bfd463f4f">BERGeneralDecoder::~BERGeneralDecoder</a>()<a name="l00400"></a>00400 {<a name="l00401"></a>00401 <span class="keywordflow">try</span> <span class="comment">// avoid throwing in constructor</span><a name="l00402"></a>00402 {<a name="l00403"></a>00403 <span class="keywordflow">if</span> (!<a class="code" href="class_b_e_r_general_decoder.html#5eb4279b5ed2b47bc9811d4bff81b532">m_finished</a>)<a name="l00404"></a>00404 <a class="code" href="class_b_e_r_general_decoder.html#40b14625c98ac7febb8ca218d02358ad">MessageEnd</a>();<a name="l00405"></a>00405 }<a name="l00406"></a>00406 <span class="keywordflow">catch</span> (...)<a name="l00407"></a>00407 {<a name="l00408"></a>00408 }<a name="l00409"></a>00409 }<a name="l00410"></a>00410 <a name="l00411"></a><a class="code" href="class_b_e_r_general_decoder.html#04f4fe90e88584b1cebffd32e149bfbc">00411</a> <span class="keywordtype">bool</span> <a class="code" href="class_b_e_r_general_decoder.html#04f4fe90e88584b1cebffd32e149bfbc">BERGeneralDecoder::EndReached</a>()<span class="keyword"> const</span><a name="l00412"></a>00412 <span class="keyword"></span>{<a name="l00413"></a>00413 <span class="keywordflow">if</span> (<a class="code" href="class_b_e_r_general_decoder.html#a9337ce30f65285a708bcb91b12524c8">m_definiteLength</a>)<a name="l00414"></a>00414 <span class="keywordflow">return</span> <a class="code" href="class_b_e_r_general_decoder.html#11096d3b64df9f0b3ff3d8d74be9b3c3">m_length</a> == 0;<a name="l00415"></a>00415 <span class="keywordflow">else</span><a name="l00416"></a>00416 { <span class="comment">// check end-of-content octets</span><a name="l00417"></a>00417 word16 i;<a name="l00418"></a>00418 <span class="keywordflow">return</span> (<a class="code" href="class_b_e_r_general_decoder.html#29c44ea3a6c6cdf63c58046d8ab22266">m_inQueue</a>.<a class="code" href="class_buffered_transformation.html#452057f0d887ba0f2b6ec5373e290e91" title="try to peek at a 16-bit word">PeekWord16</a>(i)==2 && i==0);<a name="l00419"></a>00419 }<a name="l00420"></a>00420 }<a name="l00421"></a>00421 <a name="l00422"></a><a class="code" href="class_b_e_r_general_decoder.html#9caeadfb99cf38c16c0aec9d50b6cdf5">00422</a> byte <a class="code" href="class_b_e_r_general_decoder.html#9caeadfb99cf38c16c0aec9d50b6cdf5">BERGeneralDecoder::PeekByte</a>()<span class="keyword"> const</span><a name="l00423"></a>00423 <span class="keyword"></span>{<a name="l00424"></a>00424 byte b;<a name="l00425"></a>00425 <span class="keywordflow">if</span> (!<a class="code" href="class_buffered_transformation.html#5fa048faf8c043ad57ae0a8911070090" title="peek at the next byte without removing it from the output buffer">Peek</a>(b))<a name="l00426"></a>00426 BERDecodeError();<a name="l00427"></a>00427 <span class="keywordflow">return</span> b;<a name="l00428"></a>00428 }<a name="l00429"></a>00429 <a name="l00430"></a><a class="code" href="class_b_e_r_general_decoder.html#f420c75709d4e5d8a5a1253ce458d882">00430</a> <span class="keywordtype">void</span> <a class="code" href="class_b_e_r_general_decoder.html#f420c75709d4e5d8a5a1253ce458d882">BERGeneralDecoder::CheckByte</a>(byte check)<a name="l00431"></a>00431 {<a name="l00432"></a>00432 byte b;<a name="l00433"></a>00433 <span class="keywordflow">if</span> (!<a class="code" href="class_buffered_transformation.html#9e1ad913c8fe697d269f408a7d5928fc" title="try to retrieve a single byte">Get</a>(b) || b != check)<a name="l00434"></a>00434 BERDecodeError();<a name="l00435"></a>00435 }<a name="l00436"></a>00436 <a name="l00437"></a><a class="code" href="class_b_e_r_general_decoder.html#40b14625c98ac7febb8ca218d02358ad">00437</a> <span class="keywordtype">void</span> <a class="code" href="class_b_e_r_general_decoder.html#40b14625c98ac7febb8ca218d02358ad">BERGeneralDecoder::MessageEnd</a>()<a name="l00438"></a>00438 {<a name="l00439"></a>00439 <a class="code" href="class_b_e_r_general_decoder.html#5eb4279b5ed2b47bc9811d4bff81b532">m_finished</a> = <span class="keyword">true</span>;<a name="l00440"></a>00440 <span class="keywordflow">if</span> (<a class="code" href="class_b_e_r_general_decoder.html#a9337ce30f65285a708bcb91b12524c8">m_definiteLength</a>)<a name="l00441"></a>00441 {<a name="l00442"></a>00442 <span class="keywordflow">if</span> (<a class="code" href="class_b_e_r_general_decoder.html#11096d3b64df9f0b3ff3d8d74be9b3c3">m_length</a> != 0)<a name="l00443"></a>00443 BERDecodeError();<a name="l00444"></a>00444 }<a name="l00445"></a>00445 <span class="keywordflow">else</span><a name="l00446"></a>00446 { <span class="comment">// remove end-of-content octets</span><a name="l00447"></a>00447 word16 i;<a name="l00448"></a>00448 <span class="keywordflow">if</span> (<a class="code" href="class_b_e_r_general_decoder.html#29c44ea3a6c6cdf63c58046d8ab22266">m_inQueue</a>.<a class="code" href="class_buffered_transformation.html#1ac50bcb2d279c3c6aef6858dab3eeb7" title="try to retrieve a 16-bit word">GetWord16</a>(i) != 2 || i != 0)<a name="l00449"></a>00449 BERDecodeError();<a name="l00450"></a>00450 }<a name="l00451"></a>00451 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -