EXTRTMETHOD int rtxUTF8StrToNamedBits (OSCTXT* pctxt, const OSUTF8CHAR* utf8str, const OSBitMapItem* pBitMap, OSOCTET* pvalue, OSUINT32* pnbits, OSUINT32 bufsize) { OSUINT32 numbits = bufsize * 8; size_t nbytes = rtxUTF8LenBytes(utf8str); int stat = 0; size_t i; OSUINT32 maxbit = 0; OSOCTET buffer[BUFF_SZ]; OSRTMEMBUF memBuf; size_t buffPos = 0; size_t buffSz = BUFF_SZ; if (!pvalue || !pnbits || !pBitMap) return LOG_RTERRNEW (pctxt, RTERR_INVPARAM); rtxMemBufInitBuffer (pctxt, &memBuf, buffer, BUFF_SZ, 1); *pnbits = 0; if (bufsize) OSCRTLMEMSET (pvalue, 0, bufsize); for (i = 0; i < nbytes; i++) { OSOCTET c = (OSOCTET) utf8str[i]; if (c == ' ') { OSUINT32 bitno = FindBitMapItem (pBitMap, OSMEMBUFPTR(&memBuf), buffPos); if (bitno == ~0u) RTDIAG3 (pctxt, "rtXmlpDecNamedBits: BitMapItem = '%*s' not found\n", OSMEMBUFPTR(&memBuf), buffPos); else { rtxSetBit (pvalue, numbits, bitno); if (bitno > maxbit) maxbit = bitno; } rtxMemBufReset (&memBuf); buffPos = 0; } else { if (buffPos == buffSz) { /* enlarge buffer */ buffSz *= 2; stat = rtxMemBufPreAllocate (&memBuf, buffSz); /* memBuf.usedcnt always 0; memRealloc save buffer content*/ if (stat < 0) LOG_RTERR (pctxt, stat); } OSMEMBUFPTR(&memBuf)[buffPos++] = c; } } if (stat >= 0 && buffPos > 0) { OSUINT32 bitno = FindBitMapItem (pBitMap, OSMEMBUFPTR(&memBuf), buffPos); if (bitno == ~0u) { RTDIAG3 (pctxt, "rtxUTF8StrToNamedBits: BitMapItem = '%*s' not found\n", OSMEMBUFPTR(&memBuf), buffPos); } else { rtxSetBit (pvalue, numbits, bitno); if (bitno > maxbit) maxbit = bitno; } } if (stat > 0) { stat = 0; *pnbits = maxbit + 1; } rtxMemBufFree (&memBuf); return stat; }
EXTRTMETHOD int rtUTF8StrToASN1DynBitStr (OSCTXT* pctxt, const OSUTF8CHAR* utf8str, ASN1DynBitStr* pvalue) { return rtUTF8StrnToASN1DynBitStr (pctxt, utf8str, rtxUTF8LenBytes(utf8str), pvalue); }
int XmlEnc_Detail (OSCTXT* pctxt, Detail* pvalue, const OSUTF8CHAR* elemName, const OSUTF8CHAR* nsPrefix) { int stat = 0; if (0 != elemName) { stat = rtXmlEncStartElement (pctxt, elemName, nsPrefix, FALSE); if (stat != 0) return LOG_RTERR (pctxt, stat); } /* add attributes */ { OSRTDListNode* pnode = pvalue->attr.head; size_t len; while (0 != pnode) { len = rtxUTF8LenBytes (pnode->data); stat = rtxCheckBuffer (pctxt, len + 1); if (stat != 0) return LOG_RTERR (pctxt, stat); OSRTPUTCHAR (pctxt, ' '); OSRTMEMCPY (pctxt, pnode->data, len); pnode = pnode->next; }} OSRTSAFEPUTCHAR (pctxt, '>'); pctxt->flags &= ~OSTERMSTART; pctxt->state = OSXMLSTART; { const OSUTF8CHAR* savedPrefix = nsPrefix; nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8( "http://schemas.xmlsoap.org/soap/envelope/")); /* encode elem_list */ { const OSUTF8CHAR* savedPrefix = nsPrefix; nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8( "http://schemas.xmlsoap.org/soap/envelope/")); { OSRTDListNode* pnode = pvalue->elem_list.head; while (0 != pnode) { if (((OSXSDAny*)pnode->data)->t == OSXSDAny_xmlText) { stat = rtXmlEncAnyStr (pctxt, ((OSXSDAny*)pnode->data)->u.xmlText , OSUTF8(""), 0); if (stat != 0) return LOG_RTERR (pctxt, stat); } else { char buf[40]; os_snprintf (buf, 40, "%d", ((OSXSDAny*)pnode->data)->t); rtxErrAddStrParm (pctxt, buf); return LOG_RTERR (pctxt, RTERR_INVOPT); } pnode = pnode->next; }} nsPrefix = savedPrefix; } nsPrefix = savedPrefix; } stat = rtXmlEncEndElement (pctxt, elemName, nsPrefix); if (stat != 0) return LOG_RTERR (pctxt, stat); return (stat); }
EXTXMLMETHOD int rtXmlEncStartElement (OSCTXT* pctxt, const OSUTF8CHAR* elemName, OSXMLNamespace* pNS, OSRTDList* pNSAttrs, OSBOOL terminate) { int stat = 0; if (0 != elemName && 0 != *elemName) { size_t elemLen = rtxUTF8LenBytes (elemName); size_t nsPrefixLen; size_t specChars; /* Push null entry onto namespace stack */ stat = rtXmlNSPush (pctxt); if (stat != 0) return LOG_RTERR (pctxt, stat); /* Set namespace URI/prefix links */ stat = rtXmlSetNSPrefixLinks (pctxt, pNSAttrs); if (stat != 0) return LOG_RTERR (pctxt, stat); /* Set namespace prefix in passed namespace structure */ if (0 != pNS) { if (0 == pNS->prefix) { pNS->prefix = rtXmlNSGetPrefix (pctxt, pNS->uri); } nsPrefixLen = OSUTF8LEN (pNS->prefix); } else nsPrefixLen = 0; specChars = (0 != nsPrefixLen) ? 3 : 2; /* Terminate previous element if still open */ stat = rtXmlEncTermStartElement (pctxt); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = rtXmlEncIndent (pctxt); if (stat != 0) return LOG_RTERR (pctxt, stat); pctxt->level++; pctxt->state = OSXMLSTART; /* Verify element will fit in encode buffer */ stat = rtxCheckBuffer (pctxt, elemLen + nsPrefixLen + specChars); if (stat != 0) return LOG_RTERR (pctxt, stat); /* Copy data to buffer */ OSRTPUTCHAR (pctxt, '<'); if (0 != nsPrefixLen) { OSRTMEMCPY (pctxt, pNS->prefix, nsPrefixLen); OSRTPUTCHAR (pctxt, ':'); } OSRTMEMCPY (pctxt, elemName, elemLen); if (terminate) { OSRTPUTCHAR (pctxt, '>'); pctxt->flags &= ~OSTERMSTART; } else /* set flag in context indicating terminator needed */ pctxt->flags |= OSTERMSTART; #ifndef _COMPACT /* Add name to element name stack in context */ rtxDListAppend (pctxt, &pctxt->elemNameStack, (void*)elemName); #endif if (!terminate && rtxCtxtTestFlag (pctxt, OSXMLC14N)) stat = rtXmlEncStartAttrC14N (pctxt); } else if (terminate) { stat = rtXmlEncTermStartElement (pctxt); } if (stat < 0) return LOG_RTERR (pctxt, stat); return 0; }