EXTXMLMETHOD int rtAsn1XmlEncOpenType (OSCTXT *pctxt, const OSOCTET* data, OSUINT32 nocts, const OSUTF8CHAR* elemName, const OSUTF8CHAR* nsPrefix) { OSUTF8CHAR* qname = 0; int stat; if (0 != isBinaryData (data, nocts)) { const OSUTF8CHAR *ename = (elemName == 0 || strcmp ("", elemName) == 0 ) ? OSUTF8("binext") : elemName; qname = rtXmlNewQName (pctxt, ename, nsPrefix); if (0 != qname) { stat = rtXmlEncStartElement (pctxt, qname, 0, 0, TRUE); if (stat != 0) return LOG_RTERR (pctxt, stat); } else return RTERR_NOMEM; if (0 != data && nocts > 0) { stat = rtXmlEncHexStrValue (pctxt, nocts, data); pctxt->state = OSXMLDATA; if (stat != 0) return LOG_RTERR (pctxt, stat); } if (0 != qname) { stat = rtXmlEncEndElement (pctxt, qname, 0); if (stat != 0) return LOG_RTERR (pctxt, stat); rtxMemFreePtr (pctxt, qname); } } else { if (0 != elemName) { qname = rtXmlNewQName (pctxt, elemName, nsPrefix); if (0 != qname) { stat = rtXmlEncStartElement (pctxt, qname, 0, 0, TRUE); if (stat != 0) return LOG_RTERR (pctxt, stat); } else return RTERR_NOMEM; } if (0 != data && nocts > 0) { OSRTSAFEMEMCPY (pctxt, data, nocts); pctxt->state = OSXMLDATA; } if (0 != qname) { stat = rtXmlEncEndElement (pctxt, qname, 0); if (stat != 0) return LOG_RTERR (pctxt, stat); rtxMemFreePtr (pctxt, qname); } } return 0; }
EXTXMLMETHOD int rtXmlEncUnicodeData (OSCTXT* pctxt, const OSUNICHAR* value, OSUINT32 nchars) { int step; OSUINT32 inbufx; OSUNICHAR wc; for (inbufx = 0; inbufx < nchars; inbufx++) { wc = value[inbufx]; if (wc < 0x80) { char c = (char) wc; /* One byte sequence */ OSRTSAFEPUTCHAR (pctxt, c); } else { char outbuf[10]; int sz; for (step = 2; step < 6; ++step) if ((wc & encoding_mask[step - 2]) == 0) break; sz = step; /* Copy multi-byte sequence to output buffer */ outbuf[0] = encoding_byte[step - 2]; --step; do { outbuf[step] = (OSOCTET) (0x80 | (wc & 0x3f)); wc >>= 6; } while (--step > 0); outbuf[0] |= wc; OSRTSAFEMEMCPY (pctxt, (void*)outbuf, sz); } } return 0; }
EXTXMLMETHOD int SAX2XMLStreamEndElement (void *userData, const OSUTF8CHAR* localname, const OSUTF8CHAR* qname) { OSCTXT* pctxt = (OSCTXT*) userData; pctxt->level--; if (pctxt->state == OSXMLSTART) { OSRTSAFEMEMCPY (pctxt, "/>", 2); } else { if (pctxt->state == OSXMLEND) { rtXmlEncIndent (pctxt); } if (0 == rtxCheckBuffer (pctxt, OSUTF8LEN(qname) + 3)) { OSRTPUTCHAR (pctxt, '<'); OSRTPUTCHAR (pctxt, '/'); OSRTMEMCPY (pctxt, qname, OSUTF8LEN(qname)); OSRTPUTCHAR (pctxt, '>'); } } pctxt->state = OSXMLEND; if (0 != localname) {} /* to suppress level 4 warning */ return 0; }
int XmlEnc_Envelope (OSCTXT* pctxt, Envelope* 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 */ if (pvalue->m.encodingStylePresent) { OSRTSAFEMEMCPY (pctxt, OSUTF8(" tns:encodingStyle=\""), 20); stat = XmlEnc_EncodingStyle (pctxt, &pvalue->encodingStyle, 0, 0); if (stat != 0) return LOG_RTERR (pctxt, stat); OSRTSAFEPUTCHAR (pctxt, '"'); } { 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 header */ if (pvalue->m.headerPresent) { stat = XmlEnc_Header (pctxt, &pvalue->header , OSUTF8("Header"), nsPrefix); if (stat != 0) return LOG_RTERR (pctxt, stat); } /* encode body */ stat = XmlEnc_Body (pctxt, &pvalue->body, OSUTF8("Body"), nsPrefix); if (stat != 0) return LOG_RTERR (pctxt, stat); /* 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 rtXmlEncStringValue2 (OSCTXT* pctxt, const OSUTF8CHAR* value, size_t valueLen) { if (0 != value && 0 != *value) { size_t i; if (rtxCtxtTestFlag (pctxt, OSXMLC14N)) { /* C14N text node */ if (pctxt->state == OSXMLDATA) { for (i = 0; i < valueLen; i++) { switch (value[i]) { case '&': OSRTSAFEMEMCPY (pctxt, "&", 5); break; case '<': OSRTSAFEMEMCPY (pctxt, "<", 4); break; case '>': OSRTSAFEMEMCPY (pctxt, ">", 4); break; case 0xD: OSRTSAFEMEMCPY (pctxt, "
", 5); break; default: OSRTSAFEPUTCHAR (pctxt, value[i]); } } } else { /* C14N attribute node */ for (i = 0; i < valueLen; i++) { switch (value[i]) { case '&': OSRTSAFEMEMCPY (pctxt, "&", 5); break; case '"': OSRTSAFEMEMCPY (pctxt, """, 6); break; case 0x9: OSRTSAFEMEMCPY (pctxt, "	", 5); break; case 0xA: OSRTSAFEMEMCPY (pctxt, "
", 5); break; case 0xD: OSRTSAFEMEMCPY (pctxt, "
", 5); break; case '<': OSRTSAFEMEMCPY (pctxt, "<", 4); break; default: OSRTSAFEPUTCHAR (pctxt, value[i]); } } } } else { /* not C14N */ for (i = 0; i < valueLen; i++) { switch (value[i]) { case '<': OSRTSAFEMEMCPY (pctxt, "<", 4); break; case '>': OSRTSAFEMEMCPY (pctxt, ">", 4); break; case '&': OSRTSAFEMEMCPY (pctxt, "&", 5); break; case '\'': OSRTSAFEMEMCPY (pctxt, "'", 6); break; case '"': OSRTSAFEMEMCPY (pctxt, """, 6); break; default: OSRTSAFEPUTCHAR (pctxt, value[i]); } } } } OSRT_CHECK_EVAL_DATE1(pctxt); return 0; }