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; }
EXTXMLMETHOD int rtXmlEncString (OSCTXT* pctxt, OSXMLSTRING* pxmlstr, const OSUTF8CHAR* elemName, OSXMLNamespace* pNS) { int stat = 0; if (0 != elemName) { stat = rtXmlEncStartElement (pctxt, elemName, pNS, 0, TRUE); if (stat != 0) return LOG_RTERR (pctxt, stat); } else if (pctxt->state != OSXMLATTR) { stat = rtXmlEncTermStartElement (pctxt); if (stat != 0) return LOG_RTERR (pctxt, stat); } /* Encode string content */ if (0 != pxmlstr) { /* Do not change state if encoding attr */ if (!(pctxt->state == OSXMLATTR && 0 == elemName)) pctxt->state = OSXMLDATA; /* C14N specifies CDATA sections are to be replaced with their character content. Disregard CDATA in C14N mode. */ if (pxmlstr->cdata && !rtxCtxtTestFlag (pctxt, OSXMLC14N)) { /* Encode CDATA section */ size_t len = rtxUTF8LenBytes (pxmlstr->value); /* Verify string will fit in encode buffer */ stat = rtxCheckBuffer (pctxt, len + 12); if (stat != 0) return LOG_RTERR (pctxt, stat); /* Copy data to buffer or stream */ OSRTMEMCPY (pctxt, "<![CDATA[", 9); stat = rtXmlEncCDATAStringValue (pctxt, pxmlstr->value, len); if (stat != 0) return LOG_RTERR (pctxt, stat); OSRTMEMCPY (pctxt, "]]>", 3); } else { stat = rtXmlEncStringValue (pctxt, pxmlstr->value); if (stat != 0) return LOG_RTERR (pctxt, stat); } } if (0 != elemName) { stat = rtXmlEncEndElement (pctxt, elemName, pNS); if (stat != 0) return LOG_RTERR (pctxt, stat); } 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 OSXMLEncodeBuffer::addXMLText (const OSUTF8CHAR* text) { if (0 != text) { size_t len = rtxUTF8LenBytes (text); OSCTXT* pctxt = getCtxtPtr(); // Verify text will fit in encode buffer int stat = rtxCheckBuffer (pctxt, len+1); if (stat != 0) return LOG_RTERR (pctxt, stat); OSRTMEMCPY (pctxt, text, len); } 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; }
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_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; }