35 const CNamespaceDescriptor *apNamespaceDescriptor[MAX_NS];
36 int nNamespaceDescriptor;
38 typedef struct NamespaceList tNamespaceList;
43 const CElement * pElement,
47 CXMLTextEncoder::CXMLTextEncoder (
57 CXMLTextEncoder::~CXMLTextEncoder (
void)
62 CXMLTextEncoder::encodeElement (
63 const CElement * pElement)
65 CXMLTextEncoderStream MyEncoderStream(
this);
67 MyEncoderStream.putElement(pElement);
71 CXMLTextEncoderStream::putRequiredSubParameter (
72 const CParameter * pParameter,
73 const CTypeDescriptor * pRefType)
75 if(NULL == pParameter)
77 appendFormat(
"warning: missing %s\n",
78 (NULL == pRefType) ?
"<something>" : pRefType->m_pName);
82 CXMLTextEncoderStream NestEncoderStream(
this);
84 NestEncoderStream.putElement(pParameter);
88 CXMLTextEncoderStream::putOptionalSubParameter (
89 const CParameter * pParameter,
90 const CTypeDescriptor * pRefType)
92 if(NULL == pParameter)
97 CXMLTextEncoderStream NestEncoderStream(
this);
99 NestEncoderStream.putElement(pParameter);
103 CXMLTextEncoderStream::putRequiredSubParameterList (
104 const tListOfParameters * pParameterList,
105 const CTypeDescriptor * pRefType)
107 if(pParameterList->empty())
109 appendFormat(
"warning: missing list of %s\n",
110 (NULL == pRefType) ?
"<something>" : pRefType->m_pName);
115 tListOfParameters::const_iterator Cur = pParameterList->begin();
116 Cur != pParameterList->end();
119 putRequiredSubParameter(*Cur, pRefType);
124 CXMLTextEncoderStream::putOptionalSubParameterList (
125 const tListOfParameters * pParameterList,
126 const CTypeDescriptor * pRefType)
129 tListOfParameters::const_iterator Cur = pParameterList->begin();
130 Cur != pParameterList->end();
133 putRequiredSubParameter(*Cur, pRefType);
143 CXMLTextEncoderStream::put_u8 (
145 const CFieldDescriptor * pFieldDescriptor)
147 const char * pFieldName = pFieldDescriptor->m_pName;
149 appendOpenTag(pFieldName);
150 switch(pFieldDescriptor->m_eFieldFormat)
152 case CFieldDescriptor::FMT_NORMAL:
153 case CFieldDescriptor::FMT_DEC:
155 appendFormat(
"%u", Value);
158 case CFieldDescriptor::FMT_HEX:
159 appendFormat(
"%02X", Value);
162 appendCloseTag(pFieldName);
166 CXMLTextEncoderStream::put_s8 (
168 const CFieldDescriptor * pFieldDescriptor)
170 const char * pFieldName = pFieldDescriptor->m_pName;
172 appendOpenTag(pFieldName);
173 switch(pFieldDescriptor->m_eFieldFormat)
175 case CFieldDescriptor::FMT_NORMAL:
176 case CFieldDescriptor::FMT_DEC:
178 appendFormat(
"%d", Value);
181 case CFieldDescriptor::FMT_HEX:
182 appendFormat(
"%02X", 0xFF & Value);
185 appendCloseTag(pFieldName);
189 CXMLTextEncoderStream::put_u8v (
191 const CFieldDescriptor * pFieldDescriptor)
193 const char * pFieldName = pFieldDescriptor->m_pName;
195 appendOpenTag(pFieldName);
196 for(
int i = 0; i < Value.m_nValue; i++)
198 switch(pFieldDescriptor->m_eFieldFormat)
200 case CFieldDescriptor::FMT_NORMAL:
201 case CFieldDescriptor::FMT_DEC:
207 appendFormat(
"%u", Value.m_pValue[i]);
210 case CFieldDescriptor::FMT_HEX:
211 appendFormat(
"%02X", 0xFF & Value.m_pValue[i]);
215 appendCloseTag(pFieldName);
219 CXMLTextEncoderStream::put_s8v (
221 const CFieldDescriptor * pFieldDescriptor)
223 const char * pFieldName = pFieldDescriptor->m_pName;
225 appendOpenTag(pFieldName);
226 for(
int i = 0; i < Value.m_nValue; i++)
228 switch(pFieldDescriptor->m_eFieldFormat)
230 case CFieldDescriptor::FMT_NORMAL:
231 case CFieldDescriptor::FMT_DEC:
237 appendFormat(
"%d", Value.m_pValue[i]);
240 case CFieldDescriptor::FMT_HEX:
241 appendFormat(
"%02X", 0xFF & Value.m_pValue[i]);
245 appendCloseTag(pFieldName);
253 CXMLTextEncoderStream::put_u16 (
255 const CFieldDescriptor * pFieldDescriptor)
257 const char * pFieldName = pFieldDescriptor->m_pName;
259 appendOpenTag(pFieldName);
260 switch(pFieldDescriptor->m_eFieldFormat)
262 case CFieldDescriptor::FMT_NORMAL:
263 case CFieldDescriptor::FMT_DEC:
265 appendFormat(
"%u", Value);
268 case CFieldDescriptor::FMT_HEX:
269 appendFormat(
"%04X", Value);
272 appendCloseTag(pFieldName);
276 CXMLTextEncoderStream::put_s16 (
278 const CFieldDescriptor * pFieldDescriptor)
280 const char * pFieldName = pFieldDescriptor->m_pName;
282 appendOpenTag(pFieldName);
283 switch(pFieldDescriptor->m_eFieldFormat)
285 case CFieldDescriptor::FMT_NORMAL:
286 case CFieldDescriptor::FMT_DEC:
288 appendFormat(
"%d", Value);
291 case CFieldDescriptor::FMT_HEX:
292 appendFormat(
"%04X", 0xFFFF & Value);
295 appendCloseTag(pFieldName);
299 CXMLTextEncoderStream::put_u16v (
301 const CFieldDescriptor * pFieldDescriptor)
303 const char * pFieldName = pFieldDescriptor->m_pName;
305 appendOpenTag(pFieldName);
306 for(
int i = 0; i < Value.m_nValue; i++)
312 switch(pFieldDescriptor->m_eFieldFormat)
314 case CFieldDescriptor::FMT_NORMAL:
315 case CFieldDescriptor::FMT_DEC:
317 appendFormat(
"%u", Value.m_pValue[i]);
320 case CFieldDescriptor::FMT_HEX:
321 appendFormat(
"%04X", 0xFFFF & Value.m_pValue[i]);
325 appendCloseTag(pFieldName);
329 CXMLTextEncoderStream::put_s16v (
331 const CFieldDescriptor * pFieldDescriptor)
333 const char * pFieldName = pFieldDescriptor->m_pName;
335 appendOpenTag(pFieldName);
336 for(
int i = 0; i < Value.m_nValue; i++)
342 switch(pFieldDescriptor->m_eFieldFormat)
344 case CFieldDescriptor::FMT_NORMAL:
345 case CFieldDescriptor::FMT_DEC:
347 appendFormat(
"%d", Value.m_pValue[i]);
350 case CFieldDescriptor::FMT_HEX:
351 appendFormat(
"%04X", 0xFFFF & Value.m_pValue[i]);
355 appendCloseTag(pFieldName);
363 CXMLTextEncoderStream::put_u32 (
365 const CFieldDescriptor * pFieldDescriptor)
367 const char * pFieldName = pFieldDescriptor->m_pName;
369 appendOpenTag(pFieldName);
370 switch(pFieldDescriptor->m_eFieldFormat)
372 case CFieldDescriptor::FMT_NORMAL:
373 case CFieldDescriptor::FMT_DEC:
375 appendFormat(
"%u", Value);
378 case CFieldDescriptor::FMT_HEX:
379 appendFormat(
"%08X", Value);
382 appendCloseTag(pFieldName);
386 CXMLTextEncoderStream::put_s32 (
388 const CFieldDescriptor * pFieldDescriptor)
390 const char * pFieldName = pFieldDescriptor->m_pName;
392 appendOpenTag(pFieldName);
393 switch(pFieldDescriptor->m_eFieldFormat)
395 case CFieldDescriptor::FMT_NORMAL:
396 case CFieldDescriptor::FMT_DEC:
398 appendFormat(
"%d", Value);
401 case CFieldDescriptor::FMT_HEX:
402 appendFormat(
"%08X", Value);
405 appendCloseTag(pFieldName);
409 CXMLTextEncoderStream::put_u32v (
411 const CFieldDescriptor * pFieldDescriptor)
413 const char * pFieldName = pFieldDescriptor->m_pName;
415 appendOpenTag(pFieldName);
416 for(
int i = 0; i < Value.m_nValue; i++)
422 switch(pFieldDescriptor->m_eFieldFormat)
424 case CFieldDescriptor::FMT_NORMAL:
425 case CFieldDescriptor::FMT_DEC:
427 appendFormat(
"%u", Value.m_pValue[i]);
430 case CFieldDescriptor::FMT_HEX:
431 appendFormat(
"%08X", Value.m_pValue[i]);
435 appendCloseTag(pFieldName);
439 CXMLTextEncoderStream::put_s32v (
441 const CFieldDescriptor * pFieldDescriptor)
443 const char * pFieldName = pFieldDescriptor->m_pName;
445 appendOpenTag(pFieldName);
446 for(
int i = 0; i < Value.m_nValue; i++)
452 switch(pFieldDescriptor->m_eFieldFormat)
454 case CFieldDescriptor::FMT_NORMAL:
455 case CFieldDescriptor::FMT_DEC:
457 appendFormat(
"%d", Value.m_pValue[i]);
460 case CFieldDescriptor::FMT_HEX:
461 appendFormat(
"%08X", Value.m_pValue[i]);
465 appendCloseTag(pFieldName);
473 CXMLTextEncoderStream::put_u64 (
475 const CFieldDescriptor * pFieldDescriptor)
477 const char * pFieldName = pFieldDescriptor->m_pName;
479 appendOpenTag(pFieldName);
480 switch(pFieldDescriptor->m_eFieldFormat)
482 case CFieldDescriptor::FMT_NORMAL:
483 case CFieldDescriptor::FMT_DEC:
486 appendFormat(
"%I64u", Value);
488 appendFormat(
"%llu", Value);
492 case CFieldDescriptor::FMT_HEX:
494 appendFormat(
"%016I64X", Value);
496 appendFormat(
"%016llX", Value);
500 case CFieldDescriptor::FMT_DATETIME:
503 time_t CurSec = (time_t)(Value / 1000000u);
504 llrp_u32_t CurUSec = (llrp_u32_t)(Value % 1000000u);
507 pGMTime = gmtime(&CurSec);
508 strftime(aBuf,
sizeof aBuf,
"%Y-%m-%dT%H:%M:%S", pGMTime);
509 appendFormat(
"%s.%06dZ", aBuf, CurUSec);
513 appendCloseTag(pFieldName);
517 CXMLTextEncoderStream::put_s64 (
519 const CFieldDescriptor * pFieldDescriptor)
521 const char * pFieldName = pFieldDescriptor->m_pName;
523 appendOpenTag(pFieldName);
524 switch(pFieldDescriptor->m_eFieldFormat)
526 case CFieldDescriptor::FMT_NORMAL:
527 case CFieldDescriptor::FMT_DEC:
530 appendFormat(
"%I64d", Value);
532 appendFormat(
"%lld", Value);
536 case CFieldDescriptor::FMT_HEX:
538 appendFormat(
"%016I64X", Value);
540 appendFormat(
"%016llX", Value);
544 appendCloseTag(pFieldName);
548 CXMLTextEncoderStream::put_u64v (
550 const CFieldDescriptor * pFieldDescriptor)
552 const char * pFieldName = pFieldDescriptor->m_pName;
554 appendOpenTag(pFieldName);
555 for(
int i = 0; i < Value.m_nValue; i++)
561 switch(pFieldDescriptor->m_eFieldFormat)
563 case CFieldDescriptor::FMT_NORMAL:
564 case CFieldDescriptor::FMT_DEC:
567 appendFormat(
"%I64u", Value.m_pValue[i]);
569 appendFormat(
"%llu", Value.m_pValue[i]);
573 case CFieldDescriptor::FMT_HEX:
575 appendFormat(
"%016I64X", Value.m_pValue[i]);
577 appendFormat(
"%016llX", Value.m_pValue[i]);
582 appendCloseTag(pFieldName);
586 CXMLTextEncoderStream::put_s64v (
588 const CFieldDescriptor * pFieldDescriptor)
590 const char * pFieldName = pFieldDescriptor->m_pName;
592 appendOpenTag(pFieldName);
593 for(
int i = 0; i < Value.m_nValue; i++)
599 switch(pFieldDescriptor->m_eFieldFormat)
601 case CFieldDescriptor::FMT_NORMAL:
602 case CFieldDescriptor::FMT_DEC:
605 appendFormat(
"%I64d", Value.m_pValue[i]);
607 appendFormat(
"%lld", Value.m_pValue[i]);
611 case CFieldDescriptor::FMT_HEX:
613 appendFormat(
"%016I64X", Value.m_pValue[i]);
615 appendFormat(
"%016llX", Value.m_pValue[i]);
620 appendCloseTag(pFieldName);
628 CXMLTextEncoderStream::put_u1 (
630 const CFieldDescriptor * pFieldDescriptor)
632 const char * pFieldName = pFieldDescriptor->m_pName;
634 appendOpenTag(pFieldName);
635 switch(pFieldDescriptor->m_eFieldFormat)
637 case CFieldDescriptor::FMT_NORMAL:
639 appendFormat(
"%s", (Value & 1) ?
"true" :
"false");
642 case CFieldDescriptor::FMT_DEC:
643 case CFieldDescriptor::FMT_HEX:
644 appendFormat(
"%d", Value & 1);
647 appendCloseTag(pFieldName);
651 CXMLTextEncoderStream::put_u1v (
653 const CFieldDescriptor * pFieldDescriptor)
655 const char * pFieldName = pFieldDescriptor->m_pName;
658 nByte = (Value.m_nBit + 7u) / 8u;
662 appendPrefixedTagName(pFieldName);
663 appendFormat(
" Count='%d'>", Value.m_nBit);
665 for(
int i = 0; i < nByte; i++)
667 appendFormat(
"%02X", Value.m_pValue[i]);
670 appendCloseTag(pFieldName);
674 CXMLTextEncoderStream::put_u2 (
676 const CFieldDescriptor * pFieldDescriptor)
678 const char * pFieldName = pFieldDescriptor->m_pName;
680 appendOpenTag(pFieldName);
681 appendFormat(
"%d", Value & 3);
682 appendCloseTag(pFieldName);
686 CXMLTextEncoderStream::put_u96 (
688 const CFieldDescriptor * pFieldDescriptor)
690 const char * pFieldName = pFieldDescriptor->m_pName;
692 appendOpenTag(pFieldName);
693 for(
int i = 0; i < 12; i++)
695 appendFormat(
"%02X", Value.m_aValue[i]);
697 appendCloseTag(pFieldName);
701 CXMLTextEncoderStream::put_utf8v (
703 const CFieldDescriptor * pFieldDescriptor)
705 const char * pFieldName = pFieldDescriptor->m_pName;
707 appendOpenTag(pFieldName);
708 for(
int i = 0; i < Value.m_nValue; i++)
710 int c = Value.m_pValue[i];
712 if(0 == c && i+1 == Value.m_nValue)
716 if(
' ' <= c && c < 0x7F)
718 appendFormat(
"%c", c);
722 appendFormat(
"\\%03o", c);
725 appendCloseTag(pFieldName);
729 CXMLTextEncoderStream::put_bytesToEnd (
730 llrp_bytesToEnd_t Value,
731 const CFieldDescriptor * pFieldDescriptor)
733 const char * pFieldName = pFieldDescriptor->m_pName;
735 appendOpenTag(pFieldName);
736 for(
int i = 0; i < Value.m_nValue; i++)
738 appendFormat(
"%02X", Value.m_pValue[i]);
740 appendCloseTag(pFieldName);
748 CXMLTextEncoderStream::put_e1 (
750 const CFieldDescriptor * pFieldDescriptor)
752 put_enum(eValue, pFieldDescriptor);
756 CXMLTextEncoderStream::put_e2 (
758 const CFieldDescriptor * pFieldDescriptor)
760 put_enum(eValue, pFieldDescriptor);
764 CXMLTextEncoderStream::put_e8 (
766 const CFieldDescriptor * pFieldDescriptor)
768 put_enum(eValue, pFieldDescriptor);
772 CXMLTextEncoderStream::put_e16 (
774 const CFieldDescriptor * pFieldDescriptor)
776 put_enum(eValue, pFieldDescriptor);
780 CXMLTextEncoderStream::put_e32 (
782 const CFieldDescriptor * pFieldDescriptor)
784 put_enum(eValue, pFieldDescriptor);
788 CXMLTextEncoderStream::put_e8v (
790 const CFieldDescriptor * pFieldDescriptor)
792 const char * pFieldName = pFieldDescriptor->m_pName;
794 appendOpenTag(pFieldName);
795 for(
int i = 0; i < Value.m_nValue; i++)
797 int eValue = Value.m_pValue[i];
798 const SEnumTableEntry * pEntry;
800 for(pEntry = pFieldDescriptor->m_pEnumTable;
801 NULL != pEntry->pName;
804 if(pEntry->Value == eValue)
815 if(NULL != pEntry->pName)
817 appendFormat(
"%s", pEntry->pName);
821 appendFormat(
"%d", eValue);
824 appendCloseTag(pFieldName);
832 CXMLTextEncoderStream::put_reserved (
836 appendFormat(
"<!-- reserved %d bits -->\n", nBits);
840 CXMLTextEncoderStream::CXMLTextEncoderStream (
841 CXMLTextEncoder * pEncoder)
843 m_pEncoder = pEncoder;
844 m_pEnclosingEncoderStream = NULL;
849 CXMLTextEncoderStream::CXMLTextEncoderStream (
850 CXMLTextEncoderStream * pEnclosingEncoderStream)
852 m_pEncoder = pEnclosingEncoderStream->m_pEncoder;
853 m_pEnclosingEncoderStream = pEnclosingEncoderStream;
855 m_nDepth = pEnclosingEncoderStream->m_nDepth+1;
859 CXMLTextEncoderStream::putElement (
860 const CElement * pElement)
862 m_pRefType = pElement->m_pType;
866 appendPrefixedTagName(m_pRefType->m_pName);
867 if(m_pRefType->m_bIsMessage)
869 appendFormat(
" MessageID='%u'",
870 ((
const CMessage *)pElement)->getMessageID());
873 if(NULL == m_pEnclosingEncoderStream)
875 tNamespaceList NamespaceList;
876 const CNamespaceDescriptor *pNamespaceDescriptor;
879 memset(&NamespaceList, 0,
sizeof NamespaceList);
881 pElement->walk(discoverNamespaces, (
void*)&NamespaceList,
885 for(iNSD = 0; iNSD < NamespaceList.nNamespaceDescriptor; iNSD++)
887 pNamespaceDescriptor = NamespaceList.apNamespaceDescriptor[iNSD];
891 appendFormat(
"xmlns:%s='%s'",
892 pNamespaceDescriptor->m_pPrefix,
893 pNamespaceDescriptor->m_pURI);
897 if(0 == strcmp(pNamespaceDescriptor->m_pPrefix,
"llrp"))
901 appendFormat(
"xmlns='%s'", pNamespaceDescriptor->m_pURI);
907 pElement->encode(
this);
910 appendCloseTag(m_pRefType->m_pName);
915 const CElement * pElement,
918 tNamespaceList * pNSL = (tNamespaceList *) pArg;
919 const CNamespaceDescriptor *pNamespaceDescriptor;
922 pNamespaceDescriptor = pElement->m_pType->m_pNamespaceDescriptor;
924 for(iNSD = 0; iNSD < pNSL->nNamespaceDescriptor; iNSD++)
926 if(pNSL->apNamespaceDescriptor[iNSD] == pNamespaceDescriptor)
934 if(MAX_NS > pNSL->nNamespaceDescriptor)
936 iNSD = pNSL->nNamespaceDescriptor++;
937 pNSL->apNamespaceDescriptor[iNSD] = pNamespaceDescriptor;
945 CXMLTextEncoderStream::put_enum (
947 const CFieldDescriptor * pFieldDescriptor)
949 const char * pFieldName = pFieldDescriptor->m_pName;
950 const SEnumTableEntry * pEntry;
952 appendOpenTag(pFieldName);
954 for(pEntry = pFieldDescriptor->m_pEnumTable;
955 NULL != pEntry->pName;
958 if(pEntry->Value == eValue)
964 if(NULL != pEntry->pName)
966 appendFormat(
"%s", pEntry->pName);
970 appendFormat(
"%d", eValue);
973 appendCloseTag(pFieldName);
977 CXMLTextEncoderStream::indent (
980 int n = m_nDepth + adjust;
982 for(
int i = 0; i < n; i++)
989 CXMLTextEncoderStream::appendOpenTag (
994 appendPrefixedTagName(pName);
999 CXMLTextEncoderStream::appendCloseTag (
1003 appendPrefixedTagName(pName);
1004 appendFormat(
">\n");
1008 CXMLTextEncoderStream::appendPrefixedTagName (
1011 const CTypeDescriptor * pRefType = m_pRefType;
1012 const char * pPrefix =
1013 pRefType->m_pNamespaceDescriptor->m_pPrefix;
1015 if(0 != strcmp(
"llrp", pPrefix))
1017 appendFormat(
"%s:%s", pPrefix, pName);
1021 appendFormat(
"%s", pName);
1026 CXMLTextEncoderStream::appendFormat (
1030 char aHoldBuf[256u];
1035 if(m_pEncoder->m_bOverflow)
1040 va_start(ap, pFmtStr);
1042 _vsnprintf(aHoldBuf,
sizeof aHoldBuf, pFmtStr, ap);
1044 vsnprintf(aHoldBuf,
sizeof aHoldBuf, pFmtStr, ap);
1048 nHoldBuf = (int)strlen(aHoldBuf);
1050 if(m_pEncoder->m_iNext + nHoldBuf >= m_pEncoder->m_nBuffer)
1052 m_pEncoder->m_bOverflow = 1;
1056 strcpy(&m_pEncoder->m_pBuffer[m_pEncoder->m_iNext], aHoldBuf);
1058 m_pEncoder->m_iNext += nHoldBuf;
1083 return LLRP::toXMLString(
this, pBuffer, nBuffer);
1092 CXMLTextEncoder * pXMLEncoder;
1098 if(NULL == pElement)
1100 strcpy(pBuffer,
"ERROR: NULL pMessage to printXMLMessage\n");
1107 pXMLEncoder =
new CXMLTextEncoder(pBuffer, nBuffer);
1108 if(NULL == pXMLEncoder)
1110 printf(
"ERROR: XMLTextEncoder_construct failed\n");
1117 pXMLEncoder->encodeElement(pElement);
1124 pError = &pXMLEncoder->m_ErrorDetails;
1128 sprintf(pBuffer,
"ERROR: %s XML text failed, %s\n",
1140 if(pXMLEncoder->m_bOverflow)
1142 strcpy(pBuffer,
"ERROR: Buffer overflow\n");
This is the base class for all parameter and message types.
const CTypeDescriptor * m_pType
The type descriptor desribing this element.
EResultCode m_eResultCode
Result code from operation.
Based type descriptions for the LTKCPP library.
const char * m_pWhatStr
Descriptive printable error string.
EResultCode toXMLString(char *pBuffer, int nBuffer)
A wrapper around LLRP::toXMLString()
EResultCode
Error result codes for LTK operations.
Class to return error details in LTKCPP operations.
char * m_pName
String name of parameter/message type (e.g. "ROSpec")
Classes to encode and decode LTK-XML.