27 CFrameEncoder::CFrameEncoder (
28 unsigned char * pBuffer,
40 CFrameEncoder::~CFrameEncoder (
void)
45 CFrameEncoder::encodeElement (
46 const CElement * pElement)
48 CFrameEncoderStream MyEncoderStream(
this);
50 MyEncoderStream.putElement(pElement);
54 CFrameEncoder::getLength(
void)
60 CFrameEncoderStream::putRequiredSubParameter (
61 const CParameter * pParameter,
62 const CTypeDescriptor * pRefType)
64 if(NULL == pParameter)
68 pError->missingParameter(pRefType);
73 CFrameEncoderStream NestEncoderStream(
this);
75 NestEncoderStream.putElement(pParameter);
79 CFrameEncoderStream::putOptionalSubParameter (
80 const CParameter * pParameter,
81 const CTypeDescriptor * pRefType)
83 if(NULL == pParameter)
88 CFrameEncoderStream NestEncoderStream(
this);
90 NestEncoderStream.putElement(pParameter);
94 CFrameEncoderStream::putRequiredSubParameterList (
95 const tListOfParameters * pParameterList,
96 const CTypeDescriptor * pRefType)
98 if(pParameterList->empty())
102 pError->missingParameter(pRefType);
108 tListOfParameters::const_iterator Cur = pParameterList->begin();
109 Cur != pParameterList->end();
112 putRequiredSubParameter(*Cur, pRefType);
117 CFrameEncoderStream::putOptionalSubParameterList (
118 const tListOfParameters * pParameterList,
119 const CTypeDescriptor * pRefType)
122 tListOfParameters::const_iterator Cur = pParameterList->begin();
123 Cur != pParameterList->end();
126 putRequiredSubParameter(*Cur, pRefType);
132 CFrameEncoder::next_u8 (
135 assert(m_iNext + 1u <= m_nBuffer);
137 m_pBuffer[m_iNext++] = Value;
141 CFrameEncoder::next_u16 (
144 assert(m_iNext + 2u <= m_nBuffer);
146 m_pBuffer[m_iNext++] = Value >> 8u;
147 m_pBuffer[m_iNext++] = Value >> 0u;
151 CFrameEncoder::next_u32 (
154 assert(m_iNext + 4u <= m_nBuffer);
156 m_pBuffer[m_iNext++] = Value >> 24u;
157 m_pBuffer[m_iNext++] = Value >> 16u;
158 m_pBuffer[m_iNext++] = Value >> 8u;
159 m_pBuffer[m_iNext++] = Value >> 0u;
163 CFrameEncoder::next_u64 (
166 assert(m_iNext + 8u <= m_nBuffer);
168 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 56u);
169 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 48u);
170 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 40u);
171 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 32u);
172 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 24u);
173 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 16u);
174 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 8u);
175 m_pBuffer[m_iNext++] = (llrp_byte_t)(Value >> 0u);
183 CFrameEncoderStream::put_u8 (
185 const CFieldDescriptor * pFieldDescriptor)
187 if(checkAvailable(1u, pFieldDescriptor))
189 m_pEncoder->next_u8(Value);
194 CFrameEncoderStream::put_s8 (
196 const CFieldDescriptor * pFieldDescriptor)
198 if(checkAvailable(1u, pFieldDescriptor))
200 m_pEncoder->next_u8(Value);
205 CFrameEncoderStream::put_u8v (
207 const CFieldDescriptor * pFieldDescriptor)
211 nByte = 2u + Value.m_nValue * 1u;
213 if(checkAvailable(nByte, pFieldDescriptor))
217 m_pEncoder->next_u16(Value.m_nValue);
218 for(i = 0; i < Value.m_nValue; i++)
220 m_pEncoder->next_u8(Value.m_pValue[i]);
226 CFrameEncoderStream::put_s8v (
228 const CFieldDescriptor * pFieldDescriptor)
232 nByte = 2u + Value.m_nValue * 1u;
234 if(checkAvailable(nByte, pFieldDescriptor))
238 m_pEncoder->next_u16(Value.m_nValue);
239 for(i = 0; i < Value.m_nValue; i++)
241 m_pEncoder->next_u8(Value.m_pValue[i]);
251 CFrameEncoderStream::put_u16 (
253 const CFieldDescriptor * pFieldDescriptor)
255 if(checkAvailable(2u, pFieldDescriptor))
257 m_pEncoder->next_u16(Value);
262 CFrameEncoderStream::put_s16 (
264 const CFieldDescriptor * pFieldDescriptor)
266 if(checkAvailable(2u, pFieldDescriptor))
268 m_pEncoder->next_u16(Value);
273 CFrameEncoderStream::put_u16v (
275 const CFieldDescriptor * pFieldDescriptor)
279 nByte = 2u + Value.m_nValue * 2u;
281 if(checkAvailable(nByte, pFieldDescriptor))
285 m_pEncoder->next_u16(Value.m_nValue);
286 for(i = 0; i < Value.m_nValue; i++)
288 m_pEncoder->next_u16(Value.m_pValue[i]);
294 CFrameEncoderStream::put_s16v (
296 const CFieldDescriptor * pFieldDescriptor)
300 nByte = 2u + Value.m_nValue * 2u;
302 if(checkAvailable(nByte, pFieldDescriptor))
306 m_pEncoder->next_u16(Value.m_nValue);
307 for(i = 0; i < Value.m_nValue; i++)
309 m_pEncoder->next_u16(Value.m_pValue[i]);
319 CFrameEncoderStream::put_u32 (
321 const CFieldDescriptor * pFieldDescriptor)
323 if(checkAvailable(4u, pFieldDescriptor))
325 m_pEncoder->next_u32(Value);
330 CFrameEncoderStream::put_s32 (
332 const CFieldDescriptor * pFieldDescriptor)
334 if(checkAvailable(4u, pFieldDescriptor))
336 m_pEncoder->next_u32(Value);
341 CFrameEncoderStream::put_u32v (
343 const CFieldDescriptor * pFieldDescriptor)
347 nByte = 2u + Value.m_nValue * 4u;
349 if(checkAvailable(nByte, pFieldDescriptor))
353 m_pEncoder->next_u16(Value.m_nValue);
354 for(i = 0; i < Value.m_nValue; i++)
356 m_pEncoder->next_u32(Value.m_pValue[i]);
362 CFrameEncoderStream::put_s32v (
364 const CFieldDescriptor * pFieldDescriptor)
368 nByte = 2u + Value.m_nValue * 4u;
370 if(checkAvailable(nByte, pFieldDescriptor))
374 m_pEncoder->next_u16(Value.m_nValue);
375 for(i = 0; i < Value.m_nValue; i++)
377 m_pEncoder->next_u32(Value.m_pValue[i]);
387 CFrameEncoderStream::put_u64 (
389 const CFieldDescriptor * pFieldDescriptor)
391 if(checkAvailable(8u, pFieldDescriptor))
393 m_pEncoder->next_u64(Value);
398 CFrameEncoderStream::put_s64 (
400 const CFieldDescriptor * pFieldDescriptor)
402 if(checkAvailable(8u, pFieldDescriptor))
404 m_pEncoder->next_u64(Value);
409 CFrameEncoderStream::put_u64v (
411 const CFieldDescriptor * pFieldDescriptor)
415 nByte = 2u + Value.m_nValue * 8u;
417 if(checkAvailable(nByte, pFieldDescriptor))
421 m_pEncoder->next_u16(Value.m_nValue);
422 for(i = 0; i < Value.m_nValue; i++)
424 m_pEncoder->next_u64(Value.m_pValue[i]);
430 CFrameEncoderStream::put_s64v (
432 const CFieldDescriptor * pFieldDescriptor)
436 nByte = 2u + Value.m_nValue * 8u;
438 if(checkAvailable(nByte, pFieldDescriptor))
442 m_pEncoder->next_u16(Value.m_nValue);
443 for(i = 0; i < Value.m_nValue; i++)
445 m_pEncoder->next_u64(Value.m_pValue[i]);
455 CFrameEncoderStream::put_u1 (
457 const CFieldDescriptor * pFieldDescriptor)
459 putBitField(1u, Value, pFieldDescriptor);
463 CFrameEncoderStream::put_u1v (
465 const CFieldDescriptor * pFieldDescriptor)
469 nByte = (Value.m_nBit + 7u) / 8u;
471 if(checkAvailable(2u + nByte, pFieldDescriptor))
475 m_pEncoder->next_u16(Value.m_nBit);
476 for(i = 0; i < nByte; i++)
478 m_pEncoder->next_u8(Value.m_pValue[i]);
484 CFrameEncoderStream::put_u2 (
486 const CFieldDescriptor * pFieldDescriptor)
488 putBitField(2u, Value, pFieldDescriptor);
492 CFrameEncoderStream::put_u96 (
494 const CFieldDescriptor * pFieldDescriptor)
496 if(checkAvailable(12u, pFieldDescriptor))
500 for(i = 0; i < 12u; i++)
502 m_pEncoder->next_u8(Value.m_aValue[i]);
508 CFrameEncoderStream::put_utf8v (
510 const CFieldDescriptor * pFieldDescriptor)
514 nByte = 2u + Value.m_nValue * 1u;
516 if(checkAvailable(nByte, pFieldDescriptor))
520 m_pEncoder->next_u16(Value.m_nValue);
521 for(i = 0; i < Value.m_nValue; i++)
523 m_pEncoder->next_u8(Value.m_pValue[i]);
529 CFrameEncoderStream::put_bytesToEnd (
530 llrp_bytesToEnd_t Value,
531 const CFieldDescriptor * pFieldDescriptor)
535 nByte = Value.m_nValue * 1u;
537 if(checkAvailable(nByte, pFieldDescriptor))
541 for(i = 0; i < Value.m_nValue; i++)
543 m_pEncoder->next_u8(Value.m_pValue[i]);
553 CFrameEncoderStream::put_e1 (
555 const CFieldDescriptor * pFieldDescriptor)
557 put_u1((llrp_u1_t)eValue, pFieldDescriptor);
561 CFrameEncoderStream::put_e2 (
563 const CFieldDescriptor * pFieldDescriptor)
565 put_u2((llrp_u2_t)eValue, pFieldDescriptor);
569 CFrameEncoderStream::put_e8 (
571 const CFieldDescriptor * pFieldDescriptor)
573 put_u8((llrp_u8_t)eValue, pFieldDescriptor);
577 CFrameEncoderStream::put_e16 (
579 const CFieldDescriptor * pFieldDescriptor)
581 put_u16((llrp_u16_t)eValue, pFieldDescriptor);
585 CFrameEncoderStream::put_e32 (
587 const CFieldDescriptor * pFieldDescriptor)
589 put_u32((llrp_u32_t)eValue, pFieldDescriptor);
593 CFrameEncoderStream::put_e8v (
595 const CFieldDescriptor * pFieldDescriptor)
597 put_u8v(Value, pFieldDescriptor);
605 CFrameEncoderStream::put_reserved (
610 if(
RC_OK != pError->m_eResultCode)
617 unsigned int Step = 7u & nBits;
619 if(0 != m_pEncoder->m_nBitFieldResid)
621 if(Step != m_pEncoder->m_nBitFieldResid)
624 pError->m_pWhatStr =
"unaligned reserved bits";
626 pError->m_pRefField = NULL;
627 pError->m_OtherDetail = m_pEncoder->m_iNext;
631 m_pEncoder->next_u8(m_pEncoder->m_BitFieldBuffer);
633 m_pEncoder->m_BitFieldBuffer = 0;
634 m_pEncoder->m_nBitFieldResid = 0;
641 pError->m_pWhatStr =
"unaligned reserved bits";
643 pError->m_pRefField = NULL;
644 pError->m_OtherDetail = m_pEncoder->m_iNext;
648 if(m_pEncoder->m_iNext >= m_pEncoder->m_nBuffer)
651 pError->m_pWhatStr =
"overrun at reserved bits";
653 pError->m_pRefField = NULL;
654 pError->m_OtherDetail = m_pEncoder->m_iNext;
658 m_pEncoder->next_u8(0);
664 CFrameEncoderStream::CFrameEncoderStream (
665 CFrameEncoder * pEncoder)
667 m_pEncoder = pEncoder;
668 m_pEnclosingEncoderStream = NULL;
669 m_iBegin = m_pEncoder->m_iNext;
673 CFrameEncoderStream::CFrameEncoderStream (
674 CFrameEncoderStream * pEnclosingEncoderStream)
676 m_pEncoder = pEnclosingEncoderStream->m_pEncoder;
677 m_pEnclosingEncoderStream = pEnclosingEncoderStream;
678 m_iBegin = m_pEncoder->m_iNext;
683 CFrameEncoderStream::putElement (
684 const CElement * pElement)
687 enum { MSG, TLV, TV, CUST_MSG, CUST_TLV } eFormat;
689 if(
RC_OK != pError->m_eResultCode)
727 put_u16(VersType, &g_fdMessageHeader_Type);
728 put_u32(0, &g_fdMessageHeader_Length);
729 put_u32(((
const CMessage *)pElement)->getMessageID(),
730 &g_fdMessageHeader_MessageID);
739 VersType = (1u << 10u) | 1023u;
741 &g_fdMessageHeader_Type);
743 put_u32(0, &g_fdMessageHeader_Length);
744 put_u32(((
const CMessage *)pElement)->getMessageID(),
745 &g_fdMessageHeader_MessageID);
748 &g_fdMessageHeader_VendorPEN);
760 put_u16(0, &g_fdParameterHeader_TLVLength);
765 put_u16(1023u, &g_fdParameterHeader_TLVType);
766 put_u16(0, &g_fdParameterHeader_TLVLength);
769 &g_fdParameterHeader_VendorPEN);
774 if(
RC_OK != pError->m_eResultCode)
779 pElement->encode(
this);
781 unsigned int nLength;
782 unsigned char * pLen;
784 nLength = m_pEncoder->m_iNext - m_iBegin;
785 pLen = &m_pEncoder->m_pBuffer[m_iBegin];
795 assert(nLength >= 10);
797 pLen[0] = nLength >> 24u;
798 pLen[1] = nLength >> 16u;
799 pLen[2] = nLength >> 8u;
800 pLen[3] = nLength >> 0u;
808 assert(nLength >= 4);
810 pLen[0] = nLength >> 8u;
811 pLen[1] = nLength >> 0u;
817 CFrameEncoderStream::checkAvailable (
819 const CFieldDescriptor * pFieldDescriptor)
823 if(
RC_OK != pError->m_eResultCode)
828 if(m_pEncoder->m_iNext + nByte > m_pEncoder->m_nBuffer)
831 pError->m_pRefField = pFieldDescriptor;
833 pError->m_pWhatStr =
"overrun at field";
834 pError->m_OtherDetail = m_pEncoder->m_iNext;
839 if(0 != m_pEncoder->m_nBitFieldResid)
842 pError->m_pRefField = pFieldDescriptor;
844 pError->m_pWhatStr =
"unalign/incomplete bit field";
845 pError->m_OtherDetail = m_pEncoder->m_iNext;
854 CFrameEncoderStream::putBitField (
857 const CFieldDescriptor * pFieldDescriptor)
861 if(0 == m_pEncoder->m_nBitFieldResid)
863 if(!checkAvailable(1u, pFieldDescriptor))
867 m_pEncoder->m_BitFieldBuffer = 0;
868 m_pEncoder->m_nBitFieldResid = 8u;
871 if(m_pEncoder->m_nBitFieldResid < nBit)
874 pError->m_pWhatStr =
"unalign/incomplete bit field";
876 pError->m_pRefField = pFieldDescriptor;
877 pError->m_OtherDetail = m_pEncoder->m_iNext;
881 m_pEncoder->m_nBitFieldResid -= nBit;
883 Value &= (1u << nBit) - 1u;
885 m_pEncoder->m_BitFieldBuffer |= Value << m_pEncoder->m_nBitFieldResid;
888 if(0 == m_pEncoder->m_nBitFieldResid)
890 m_pEncoder->next_u8(m_pEncoder->m_BitFieldBuffer);
891 m_pEncoder->m_BitFieldBuffer = 0;
892 m_pEncoder->m_nBitFieldResid = 0;
const CTypeDescriptor * m_pRefType
If non-NULL this is the type descriptors for the errored type.
Based type descriptions for the LTKCPP library.
llrp_u32_t m_TypeNum
Type number or, for custom, subtype number.
Classes to encode and decod LLRP binary frames.
CErrorDetails(void)
Default Constructor.
const CVendorDescriptor * m_pVendorDescriptor
NULL=>standard LLRP, !NULL=>Vendor (PEN) of custom message or parameter.
llrp_u32_t m_VendorID
Vendor PEN of a custom message or parameter.
llrp_bool_t m_bIsMessage
TRUE for a message type, FALSE for a parameter type.