示例#1
0
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;
}
示例#2
0
EXTRTMETHOD int rtUTF8StrToASN1DynBitStr 
   (OSCTXT* pctxt, const OSUTF8CHAR* utf8str, ASN1DynBitStr* pvalue)
{
   return rtUTF8StrnToASN1DynBitStr (pctxt, utf8str, rtxUTF8LenBytes(utf8str),
      pvalue);
}
示例#3
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);
}
示例#4
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;
}