Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
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);
}
Esempio n. 4
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;
}
Esempio n. 5
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;
}
Esempio n. 6
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);
}
Esempio n. 7
0
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;
}