EXTXMLMETHOD int OSXMLEncodeBuffer::addXMLHeader ( const OSUTF8CHAR* version, const OSUTF8CHAR* encoding, OSBOOL newLine) { if (0 != version && 0 != encoding) { size_t len = OSUTF8LEN(version) + OSUTF8LEN(encoding) + 32; OSCTXT* pctxt = getCtxtPtr(); /* Encode Unicode BOM */ int stat = rtXmlEncBOM (pctxt); if (stat != 0) return LOG_RTERR (pctxt, stat); // Verify text will fit in encode buffer stat = rtxCheckBuffer (pctxt, len+1); if (stat != 0) return LOG_RTERR (pctxt, stat); OSRTMEMCPY (pctxt, "<?xml version=\"", 15); OSRTMEMCPY (pctxt, version, OSUTF8LEN(version)); OSRTMEMCPY (pctxt, "\" encoding=\"", 12); OSRTMEMCPY (pctxt, encoding, OSUTF8LEN(encoding)); OSRTMEMCPY (pctxt, "\"?>", 3); if (newLine) OSRTPUTCHAR (pctxt, '\n'); // Indicate XML message shouls be encoded as a fragment since // header had already been added manually.. setFragment (); } return 0; }
/* Encode CDATA value. Check for "]]>" in string wrapped in CDATA, which is illegal. */ EXTXMLMETHOD int rtXmlEncCDATAStringValue (OSCTXT* pctxt, const OSUTF8CHAR* value, size_t valueLen) { size_t i; enum { OSXMLCDATA_CHARS, OSXMLCDATA_ONE_BRACKET, OSXMLCDATA_TWO_BRACKETS } state = OSXMLCDATA_CHARS; for (i = 0; i < valueLen; i++) { /* Caller must ensure buffer is big enough. */ OSRTPUTCHAR (pctxt, value[i]); switch (state) { case OSXMLCDATA_CHARS: if (value[i] == ']') state = OSXMLCDATA_ONE_BRACKET; break; case OSXMLCDATA_ONE_BRACKET: if (value[i] == ']') state = OSXMLCDATA_TWO_BRACKETS; else state = OSXMLCDATA_CHARS; break; case OSXMLCDATA_TWO_BRACKETS: if (value[i] == '>') return LOG_RTERRNEW (pctxt, RTERR_INVPARAM); else if (value[i] != ']') state = OSXMLCDATA_CHARS; break; } } return 0; }
int XmlEnc_Model (OSCTXT* pctxt, Model* 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://www.w3.org/2002/xforms")); /* encode element14_list */ { const OSUTF8CHAR* savedPrefix = nsPrefix; nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8( "http://www.w3.org/2002/xforms")); { OSRTDListNode* pnode = pvalue->element14_list.head; while (0 != pnode) { stat = XmlEnc_Odf_Element14 (pctxt, *((Odf_Element14*)pnode->data) , 0, nsPrefix); if (stat != 0) return LOG_RTERR (pctxt, stat); pnode = pnode->next; }} nsPrefix = savedPrefix; } nsPrefix = savedPrefix; } stat = rtXmlEncEndElement (pctxt, elemName, nsPrefix); if (stat != 0) return LOG_RTERR (pctxt, stat); return (stat); }
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; }
EXTXMLMETHOD int SAX2XMLStreamStartElement (void *userData, const OSUTF8CHAR* localname, const OSUTF8CHAR* qname, const OSUTF8CHAR* const* attrs) { OSCTXT* pctxt = (OSCTXT*) userData; if (pctxt->state == OSXMLINIT) { rtXmlEncStartDocument (pctxt); } else if (pctxt->state == OSXMLSTART) { OSRTSAFEPUTCHAR (pctxt, '>'); } if (pctxt->state != OSXMLDATA) { rtXmlEncIndent (pctxt); } pctxt->level++; pctxt->state = OSXMLSTART; /* Verify element will fit in encode buffer */ if (0 == rtxCheckBuffer (pctxt, OSUTF8LEN(qname) + 1)) { /* Copy element QName to buffer */ OSRTPUTCHAR (pctxt, '<'); OSRTMEMCPY (pctxt, qname, OSUTF8LEN(qname)); if (0 != attrs && 0 != attrs[0]) { OSUINT32 i = 0; while (0 != attrs[i]) { rtXmlEncUTF8Attr (pctxt, attrs[i], attrs[i+1]); i += 2; } } } if (0 != localname) {} /* to suppress level 4 warning */ return 0; }
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; }