EXTXMLMETHOD int rtSaxReportUnexpAttrs (OSCTXT* pctxt, 
    const OSUTF8CHAR* const* attrs, 
    const char* typeName)
{
   size_t i = 0;
   int stat = 0;
   
   if (attrs == 0) return 0;

   for (;attrs[i] != 0; i += 2) {

      if (rtXmlStrCmpAsc  (attrs[i], "xsi:nil") ||
          rtXmlStrCmpAsc  (attrs[i], "xsi:type") ||
          rtXmlStrnCmpAsc (attrs[i], "xmlns", 5) ||
          rtXmlStrnCmpAsc (attrs[i], "SOAP-ENV:", 9))
      {
         /* just ignore for now */
         continue;
      }

      stat = RTERR_INVATTR;

      if (LOG_SAXERRNEW2(pctxt, stat,
         rtxErrAddStrParm (pctxt, typeName),
         rtxErrAddStrParm (pctxt, (const char*)attrs[i])) != stat)
         break;

   }
   return stat;
}
Exemple #2
0
int berDecStrmUInt64 (OSCTXT *pctxt, OSUINT64 *object_p, 
                      ASN1TagType tagging, int length) 
{ 
   register int stat = 0;
   OSOCTET  tmpbuf[16];
   OSUINT32 bufidx = 0;
   OSOCTET  ub;     /* unsigned */
   OSBOOL   negative;

   if (tagging == ASN1EXPL) {
      stat = berDecStrmMatchTag (pctxt, ASN_ID_INT, &length, TRUE);
      /* RTERR_IDNOTFOU will be logged later, by the generated code, 
         or reset by rtxErrReset (for optional seq elements). */
      if (stat != 0) 
         return (stat == RTERR_IDNOTFOU) ? stat : LOG_RTERR (pctxt, stat);
   }

   /* Make sure integer will fit in target variable (ED, 4/22/02) */

   if (length > (sizeof(OSUINT64) + 1)) 
      return LOG_RTERR (pctxt, RTERR_TOOBIG);
   else if (length < 0)
      return LOG_RTERR (pctxt, ASN_E_INVLEN); /* note: indef len not allowed */

   /* Read encoded integer contents into memory */

   stat = rtxStreamRead (pctxt, tmpbuf, length);
   if (stat < 0) return LOG_RTERR (pctxt, stat);

   if (length == (sizeof(OSUINT64) + 1)) {
      /* first byte must be zero */
      if (0 != tmpbuf[0]) 
         return LOG_RTERR (pctxt, RTERR_TOOBIG);
   }

   /* Check for negative value */

   negative = ((tmpbuf[0] & 0x80) != 0);
   
   /* Now use unsigned bytes to add in the rest of the integer */

   *object_p = 0;

   while (length > 0) {
      ub = tmpbuf[bufidx++];
      *object_p = (*object_p * 256) + ub;
      length--;
   } 

   if (negative) {
      OSINT64 signedValue = (OSINT64) *object_p;
      if (signedValue >= 0) signedValue = -signedValue;
      rtxErrAddStrParm (pctxt, "_uint64");
      rtxErrAddInt64Parm (pctxt, signedValue);
      return LOG_RTERRNEW (pctxt, RTERR_CONSVIO);
   }

   return 0;
} 
Exemple #3
0
int XmlEnc_InvoiceType (OSCTXT* pctxt, InvoiceType* pvalue, 
   const OSUTF8CHAR* elemName, const OSUTF8CHAR* nsPrefix)
{
   int stat = 0;

   if (0 != elemName) {
      stat = rtXmlEncStartElement (pctxt, elemName, nsPrefix, TRUE);
      if (stat != 0) return LOG_RTERR (pctxt, stat);
   }

   { const OSUTF8CHAR* savedPrefix = nsPrefix;
   nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8(
      "http://www.sun.com/schema/spidermarkexpress/sm-inv"));

   /* encode header */

   stat = XmlEnc_InvoiceHeaderType (pctxt, &pvalue->header
      , OSUTF8("Header"), 0);
   if (stat != 0) return LOG_RTERR (pctxt, stat);

   /* encode lineItem_list */

   if (!(pvalue->lineItem_list.count >= 1U)) {
      rtxErrAddStrParm (pctxt, "InvoiceType.lineItem_list.count");
      rtxErrAddIntParm (pctxt, (int)pvalue->lineItem_list.count);
      return LOG_RTERR (pctxt, RTERR_CONSVIO);
   }

   { const OSUTF8CHAR* savedPrefix = nsPrefix;
   nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8(
      "http://www.sun.com/schema/spidermarkexpress/sm-inv"));

   { OSRTDListNode* pnode = pvalue->lineItem_list.head;
   while (0 != pnode) {
      stat = XmlEnc_InvoiceLineItemType (pctxt, 
         ((InvoiceLineItemType*)pnode->data), OSUTF8("LineItem"), 0);
      if (stat != 0) return LOG_RTERR (pctxt, stat);
      pnode = pnode->next;
   }}
   nsPrefix = savedPrefix;
   }

   /* encode summary */

   stat = XmlEnc_InvoiceSummaryType (pctxt, &pvalue->summary
      , OSUTF8("Summary"), 0);
   if (stat != 0) return LOG_RTERR (pctxt, stat);

   nsPrefix = savedPrefix;
   }

   stat = rtXmlEncEndElement (pctxt, elemName, nsPrefix);
   if (stat != 0) return LOG_RTERR (pctxt, stat);

   return (stat);
}
Exemple #4
0
int berDecStrmMatchEOC (OSCTXT* pctxt)
{
   int stat;
   OSOCTET lbuf[2];

   stat = rtxStreamDirectBufCheck (pctxt);
   if (stat < 0) return LOG_RTERR (pctxt, stat);

   stat = rtxStreamMark (pctxt, 8);
   if (stat < 0) return LOG_RTERR (pctxt, stat);

   stat = rtxStreamRead (pctxt, lbuf, 2);
   if (stat < 0) return LOG_RTERR (pctxt, stat);

   if (!(lbuf[0] == 0 && lbuf[1] == 0)) {
      rtxStreamReset (pctxt);
      rtxErrAddStrParm (pctxt, "EOC");
      rtxErrAddStrParm (pctxt, "non-EOC");
      return LOG_RTERR (pctxt, RTERR_IDNOTFOU);
   }
   return 0;
}
Exemple #5
0
EXTERN int asn1E_InvoiceType (OSCTXT* pctxt,
   InvoiceType *pvalue, ASN1TagType tagging)
{
   int ll;
   int ll0 = 0;
   int ll1 = 0;
   OSRTDListNode* pnode2;
   int ll2 = 0;

   /* encode summary */

   ll = xe_tag_len (pctxt, TM_CTXT|TM_CONS|2,
      asn1E_InvoiceSummaryType (pctxt, &pvalue->summary, ASN1IMPL));
   if (ll < 0) return LOG_RTERR (pctxt, ll);
   ll1 += ll;

   /* encode lineItem_list */

   if (!(pvalue->lineItem_list.count >= 1U)) {
      rtxErrAddStrParm (pctxt, "InvoiceType.lineItem_list.count");
      rtxErrAddIntParm (pctxt, (int)pvalue->lineItem_list.count);
      return LOG_RTERR (pctxt, RTERR_CONSVIO);
   }

   pnode2 = pvalue->lineItem_list.tail;
   while (0 != pnode2) {
      ll = asn1E_InvoiceLineItemType (pctxt, ((InvoiceLineItemType*)pnode2->data), ASN1EXPL);
      if (ll < 0) return LOG_RTERR (pctxt, ll);
      ll2 += ll;

      pnode2 = pnode2->prev;
   }
   ll = xe_tag_len (pctxt, TM_CTXT|TM_CONS|1, ll2);
   if (ll < 0) return LOG_RTERR (pctxt, ll);
   else { ll1 += ll; ll2 = 0; }

   /* encode header */

   ll = xe_tag_len (pctxt, TM_CTXT|TM_CONS|0,
      asn1E_InvoiceHeaderType (pctxt, &pvalue->header, ASN1IMPL));
   if (ll < 0) return LOG_RTERR (pctxt, ll);
   ll1 += ll;

   ll0 += ll1;

   if (tagging == ASN1EXPL)
      ll0 = xe_tag_len (pctxt, TM_UNIV|TM_CONS|16, ll0);

   return (ll0);
}
Exemple #6
0
int Ns11_Additive_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, Ns11_Additive* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, Ns11_Additive_ENUMTAB, 
      Ns11_Additive_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (Ns11_Additive)Ns11_Additive_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #7
0
int Registration_Cause_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, Registration_Cause* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, Registration_Cause_ENUMTAB, 
      Registration_Cause_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (Registration_Cause)Registration_Cause_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #8
0
int CN_DomainIndicator_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, CN_DomainIndicator* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, CN_DomainIndicator_ENUMTAB, 
      CN_DomainIndicator_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (CN_DomainIndicator)CN_DomainIndicator_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #9
0
int CauseRadioNetwork_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, CauseRadioNetwork* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, CauseRadioNetwork_ENUMTAB, 
      CauseRadioNetwork_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (CauseRadioNetwork)CauseRadioNetwork_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #10
0
int Values_format_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, Values_format* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, Values_format_ENUMTAB, 
      Values_format_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (Values_format)Values_format_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #11
0
int XmlEnc_Ns1_Min_width (OSCTXT* pctxt, Ns1_Min_width* pvalue, 
   const OSUTF8CHAR* elemName, const OSUTF8CHAR* nsPrefix)
{
   int stat = 0;

   if (0 != elemName) {
      stat = rtXmlEncStartElement (pctxt, elemName, nsPrefix, TRUE);
      if (stat != 0) return LOG_RTERR (pctxt, stat);
   }

   { const OSUTF8CHAR* savedPrefix = nsPrefix;
   nsPrefix = rtXmlNSGetPrefix (pctxt, OSUTF8(
      "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"));

   switch (pvalue->t)
   {
      case 1:
         /* encode alt */

         stat = rtXmlEncUTF8Str (pctxt, pvalue->u.alt, 0, 0);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         break;

      case 2:
         /* encode alt_1 */

         stat = rtXmlEncUTF8Str (pctxt, pvalue->u.alt_1, 0, 0);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         break;

      default: {
         char buf[40];
         os_snprintf (buf, 40, "%d", pvalue->t);
         return LOG_RTERRNEW1 (pctxt, RTERR_INVOPT, 
            rtxErrAddStrParm (pctxt, buf));
      }
   }
   nsPrefix = savedPrefix;
   }

   stat = rtXmlEncEndElement (pctxt, elemName, nsPrefix);
   if (stat != 0) return LOG_RTERR (pctxt, stat);

   return (stat);
}
Exemple #12
0
int GAML_integrity_algorithm_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, GAML_integrity_algorithm* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, 
      GAML_integrity_algorithm_ENUMTAB, GAML_integrity_algorithm_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (GAML_integrity_algorithm)
         GAML_integrity_algorithm_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #13
0
int AnimateColor_color_interpolation_direction_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, AnimateColor_color_interpolation_direction* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, 
      AnimateColor_color_interpolation_direction_ENUMTAB, 
      AnimateColor_color_interpolation_direction_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (AnimateColor_color_interpolation_direction)
         AnimateColor_color_interpolation_direction_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #14
0
int GeographicalCoordinates_latitudeSign_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, GeographicalCoordinates_latitudeSign* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, 
      GeographicalCoordinates_latitudeSign_ENUMTAB, 
      GeographicalCoordinates_latitudeSign_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (GeographicalCoordinates_latitudeSign)
         GeographicalCoordinates_latitudeSign_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #15
0
int AltitudeAndDirection_directionOfAltitude_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, AltitudeAndDirection_directionOfAltitude* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, 
      AltitudeAndDirection_directionOfAltitude_ENUMTAB, 
      AltitudeAndDirection_directionOfAltitude_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (AltitudeAndDirection_directionOfAltitude)
         AltitudeAndDirection_directionOfAltitude_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #16
0
int Access_stratum_release_indicator_ToEnum (OSCTXT* pctxt,
   const OSUTF8CHAR* value, Access_stratum_release_indicator* pvalue)
{
   OSUINT32 valueLen = rtxUTF8LenBytes (value);
   OSINT32 idx = rtxLookupEnum (value, valueLen, 
      Access_stratum_release_indicator_ENUMTAB, 
      Access_stratum_release_indicator_ENUMTABSIZE);

   if (idx >= 0) {
      *pvalue = (Access_stratum_release_indicator)
         Access_stratum_release_indicator_ENUMTAB[idx].value;
      return 0;
   }
   else {
      rtxErrAddStrParm (pctxt, (const char*)value);
      return LOG_RTERR (pctxt, RTERR_INVENUM);
   }
}
Exemple #17
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);
}
Exemple #18
0
EXTERN int asn1D_InvoiceType (OSCTXT* pctxt, InvoiceType *pvalue, 
   ASN1TagType tagging, int length)
{
   int stat = 0;
   int reqcnt = 0;
   ASN1CCB ccb;

   if (tagging == ASN1EXPL) {
      stat = xd_match1 (pctxt, 0x10, &length);
      if (stat != 0) return LOG_RTERR (pctxt, stat);
   }

   /* decode SEQUENCE */

   ccb.len = length;
   ccb.ptr = OSRTBUFPTR(pctxt);
   ccb.seqx = 0;

   while (!XD_CHKEND (pctxt, &ccb)) {
      switch (ccb.seqx) {
      case 0:
         /* decode header */
         if (XD_PEEKTAG (pctxt, 0x80)) {
            stat = xd_Tag1AndLen (pctxt, &length);
            if (stat != 0) return LOG_RTERR (pctxt, stat);

            stat = asn1D_InvoiceHeaderType (pctxt, 
               &pvalue->header, ASN1IMPL, length);
            if (stat == 0) {
               if (length == ASN_K_INDEFLEN) {
                  if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2);
                  else return LOG_RTERR (pctxt, ASN_E_INVLEN);
               }
            }
            else return LOG_RTERR (pctxt, stat);

            reqcnt++;
         }
         break;

      case 1:
         /* decode lineItem_list */
         if (XD_PEEKTAG (pctxt, 0x81)) {
            stat = xd_Tag1AndLen (pctxt, &length);
            if (stat != 0) return LOG_RTERR (pctxt, stat);

            /* decode inline SEQUENCE OF type */
            {
               int stat = 0;
               InvoiceLineItemType* pdata2;
               OSRTDListNode* pnode;
               ASN1CCB ccb;

               /* decode SEQUENCE OF or SET OF */

               rtxDListInit (&pvalue->lineItem_list);

               ccb.len = length;
               ccb.ptr = OSRTBUFPTR(pctxt);

               while (!XD_CHKEND (pctxt, &ccb))
               {
                  rtxDListAllocNodeAndData (pctxt, InvoiceLineItemType, &pnode, &pdata2);

                  if (pnode == NULL)
                     return LOG_RTERR (pctxt, RTERR_NOMEM);

                  asn1Init_InvoiceLineItemType (pdata2);

                  stat = asn1D_InvoiceLineItemType (pctxt, 
                     pdata2, ASN1EXPL, length);
                  if (stat != 0) return LOG_RTERR (pctxt, stat);

                  rtxDListAppendNode (&pvalue->lineItem_list, pnode);
               }

               if (!(pvalue->lineItem_list.count >= 1U)) {
                  rtxErrAddStrParm (pctxt, "InvoiceType.lineItem_list.count");
                  rtxErrAddIntParm (pctxt, (int)pvalue->lineItem_list.count);
                  return LOG_RTERR (pctxt, RTERR_CONSVIO);
               }

            }
            if (stat == 0) {
               if (length == ASN_K_INDEFLEN) {
                  if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2);
                  else return LOG_RTERR (pctxt, ASN_E_INVLEN);
               }
            }
            else return LOG_RTERR (pctxt, stat);

            reqcnt++;
         }
         break;

      case 2:
         /* decode summary */
         if (XD_PEEKTAG (pctxt, 0x82)) {
            stat = xd_Tag1AndLen (pctxt, &length);
            if (stat != 0) return LOG_RTERR (pctxt, stat);

            stat = asn1D_InvoiceSummaryType (pctxt, 
               &pvalue->summary, ASN1IMPL, length);
            if (stat == 0) {
               if (length == ASN_K_INDEFLEN) {
                  if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2);
                  else return LOG_RTERR (pctxt, ASN_E_INVLEN);
               }
            }
            else return LOG_RTERR (pctxt, stat);

            reqcnt++;
         }
         break;

      default:
         { ASN1TAG tag;
         int len;
         stat = xd_tag_len (pctxt, &tag, &len, 0);
         if (stat != 0) return LOG_RTERR (pctxt, stat);
         switch (tag) {
         case (TM_CTXT|TM_CONS|0):
         case (TM_CTXT|TM_CONS|1):
         case (TM_CTXT|TM_CONS|2):
            stat = RTERR_SEQORDER;
            break;
         default:
            stat = RTERR_SEQOVFLW;
            break;
         }}
      }

      if (stat != 0) return LOG_RTERR (pctxt, stat);
      else ccb.seqx++;
   }

   if (reqcnt < 3) {
      return LOG_RTERR (pctxt, RTERR_SETMISRQ);
   }
   if (tagging == ASN1EXPL && ccb.len == ASN_K_INDEFLEN) {
      if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2);
      else return LOG_RTERR (pctxt, ASN_E_INVLEN);
   }
   return (stat);
}
Exemple #19
0
/*
 * Starts parsing. The XML data being parsed should be set either set as 
 * a buffer in OSCTXT (pctxt->buffer) or read from its stream (pctxt->pStream).
 */
int rtSaxCParse (OSXMLREADER* pReader)
{
   long len;
   enum XML_Status stat = XML_STATUS_OK;
   struct OSRTSTREAM* pStream;
   XMLReaderImpl* readerImpl = (XMLReaderImpl*)(void*)pReader;
   OSCTXT* pctxt;
   OSSAXHandlerBase* pSaxBase;

   if (pReader == 0 || pReader->pctxt == 0 || readerImpl->parser == 0)
      return RTERR_NOTINIT;

   pctxt = pReader->pctxt;
   pStream = pctxt->pStream;
   rtxErrReset (pctxt);
   pSaxBase = (OSSAXHandlerBase*)readerImpl->userData;

   if (pStream == 0) {
      
      /* stream is not set - parse just a buffer */

      stat = XML_Parse (readerImpl->parser, (char*)OSRTBUFPTR(pctxt),
                        (int)pctxt->buffer.size, TRUE);
      return (stat == XML_STATUS_ERROR) ? RTERR_XMLPARSE : 0;
   }
   else { /* read from stream and parse */
      do {
         void* pbuf;
         XML_Bool isFinal;
         
         /* get the buffer to read in */
         pbuf = XML_GetBuffer (readerImpl->parser, XML_BUF_SIZE);

         /* read data to the buffer */
         len = rtxStreamRead (pctxt, (OSOCTET*)pbuf, XML_BUF_SIZE);
         if (len < 0)
            break;
         isFinal = (XML_Bool)(!len);

         /* parse the data in the buffer */
         if ((stat = XML_ParseBuffer (readerImpl->parser, len, isFinal)) == 0) 
            break;

         /* the following code is necessary only if it is necessary to 
          * decode several XML documents consequently from one stream. */
         if (pSaxBase->mState == OS_SAX_FINAL_STATE) {
            /* if parsing is finished, but buffer is not empty we need
             * to find the beginning of the next XML message and set
             * this piece of data as pre-read buffer for BufferedStream.*/
            XML_ParsingStatus status;

            XML_GetParsingStatus(readerImpl->parser, &status);
            if (status.parsing == XML_SUSPENDED) {
               int offset, lenn;

               /* Get buffer pointer, offset and length of remaining data.
                  Note, that patching of Expat is necessary to fix two problems:
                  1) even if parser is stopped by XML_StopParser, it will return
                     error "junk after end-of-document" if buffer is not empty;
                  2) XML_GetInputContext worked only if macro XML_CONTEXT_BYTES
                     was defined. But it could work even without it. */
               const char * _pbuf = 
                  XML_GetInputContext(readerImpl->parser, &offset, &lenn);

               if (offset > 0 && lenn - offset > 0) {
                  int stat = 0;
                  const OSUTF8CHAR* prereadBuf = (const OSUTF8CHAR*)_pbuf + offset;
                  size_t prereadBufLen = (size_t)(lenn - offset), i;

                  /* check, is the buffer just whitespaces or not. If yes,
                     discard it */
                  for (i = 0; i < prereadBufLen; i++) {
                     if (!OS_ISSPACE (prereadBuf[i])) {
                  
                        if (OSRTSTREAM_ID (pctxt) != OSRTSTRMID_DIRECTBUF) {
                           stat = rtxStreamBufferedCreate (pctxt, 
                              OSRTSTRMCM_RESTORE_UNDERLAYING_AFTER_RESET);
                           if (stat < 0) len = stat;
                        }
                        if (stat == 0) {
                           stat = rtxStreamBufferedSetPreReadBuf (pctxt, 
                             (const OSOCTET*)prereadBuf + i, prereadBufLen - i);
                           if (stat < 0) len = stat;
                        }
                        break;
                     }
                  }
               }
               stat = XML_STATUS_OK;
            }
            break;
         }
      } while (len > 0);
   }

   if (len < 0) {
      return LOG_RTERR (pctxt, len);
   }
   else if (stat != XML_STATUS_OK) {
      XML_LChar str[256];
      len = RTERR_XMLPARSE;

      EXML_ErrorString (readerImpl->parser, 
                        XML_GetErrorCode (readerImpl->parser), str, 
                        sizeof(str)/sizeof(str[0]));
      LOG_RTERRNEW (pctxt, len);
      rtxErrAddStrParm (pctxt, LSTRX (pctxt, str));
      return len;
   }

   return 0;
}
Exemple #20
0
int DOMTest_Ns7_Scene_element (OSCTXT* pctxt, Ns7_Scene_element* pvalue, 
   xmlNodePtr pXmlNode, OSBOOL setChild)
{
   if (setChild)
      pXmlNode = pXmlNode->children;

   for ( ; 0 != pXmlNode; pXmlNode = pXmlNode->next) {
      if (pXmlNode->type == XML_ELEMENT_NODE) {
         if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("scene"))) {
            pvalue->t = 1;
            pvalue->u.scene = rtxMemAllocType (pctxt, Ns7_Scene);

            if (pvalue->u.scene == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Ns7_Scene ((Ns7_Scene*)pvalue->u.scene);
            DOMTest_Ns7_Scene (pctxt, (Ns7_Scene*)pvalue->u.scene, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("extrude"))) {
            pvalue->t = 2;
            pvalue->u.extrude = rtxMemAllocType (pctxt, Ns7_Extrude);

            if (pvalue->u.extrude == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Ns7_Extrude (pvalue->u.extrude);
            DOMTest_Ns7_Extrude (pctxt, pvalue->u.extrude, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("sphere"))) {
            pvalue->t = 3;
            pvalue->u.sphere = rtxMemAllocType (pctxt, Ns7_Sphere);

            if (pvalue->u.sphere == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Ns7_Sphere (pvalue->u.sphere);
            DOMTest_Ns7_Sphere (pctxt, pvalue->u.sphere, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("rotate"))) {
            pvalue->t = 4;
            pvalue->u.rotate = rtxMemAllocType (pctxt, Ns7_Rotate);

            if (pvalue->u.rotate == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Ns7_Rotate (pvalue->u.rotate);
            DOMTest_Ns7_Rotate (pctxt, pvalue->u.rotate, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("cube"))) {
            pvalue->t = 5;
            pvalue->u.cube = rtxMemAllocType (pctxt, Ns7_Cube);

            if (pvalue->u.cube == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Ns7_Cube (pvalue->u.cube);
            DOMTest_Ns7_Cube (pctxt, pvalue->u.cube, pXmlNode, TRUE);
            break;
         }
         else {
            LOG_RTERR1 (pctxt, RTERR_INVOPT,
               rtxErrAddStrParm (pctxt, (const char*)pXmlNode->name));
         }
      }
   }

   return 0;
}
Exemple #21
0
int DOMTest_Config_item_map_entry_element (OSCTXT* pctxt, 
   Config_item_map_entry_element* pvalue, xmlNodePtr pXmlNode, OSBOOL setChild)
{
   if (setChild)
      pXmlNode = pXmlNode->children;

   for ( ; 0 != pXmlNode; pXmlNode = pXmlNode->next) {
      if (pXmlNode->type == XML_ELEMENT_NODE) {
         if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("config-item"))) {
            pvalue->t = 1;
            pvalue->u.config_item = rtxMemAllocType (pctxt, Config_item);

            if (pvalue->u.config_item == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Config_item (pvalue->u.config_item);
            DOMTest_Config_item (pctxt, pvalue->u.config_item, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("config-item-set"))) {
            pvalue->t = 2;
            pvalue->u.config_item_set
                = rtxMemAllocType (pctxt, Config_item_set);

            if (pvalue->u.config_item_set == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Config_item_set ((Config_item_set*)pvalue->u.config_item_set);
            DOMTest_Config_item_set (pctxt, (Config_item_set*)pvalue->u.config_item_set, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("config-item-map-named"))) {
            pvalue->t = 3;
            pvalue->u.config_item_map_named
                = rtxMemAllocType (pctxt, Config_item_map_named);

            if (pvalue->u.config_item_map_named == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Config_item_map_named ((Config_item_map_named*)pvalue->u.config_item_map_named);
            DOMTest_Config_item_map_named (pctxt, (Config_item_map_named*)pvalue->u.config_item_map_named, pXmlNode, TRUE);
            break;
         }
         else if (rtxUTF8StrEqual (pXmlNode->name, OSUTF8("config-item-map-indexed"))) {
            pvalue->t = 4;
            pvalue->u.config_item_map_indexed
                = rtxMemAllocType (pctxt, Config_item_map_indexed);

            if (pvalue->u.config_item_map_indexed == NULL)
               return LOG_RTERR (pctxt, RTERR_NOMEM);

            asn1Init_Config_item_map_indexed (pvalue->u.config_item_map_indexed);
            DOMTest_Config_item_map_indexed (pctxt, pvalue->u.config_item_map_indexed, pXmlNode, TRUE);
            break;
         }
         else {
            LOG_RTERR1 (pctxt, RTERR_INVOPT,
               rtxErrAddStrParm (pctxt, (const char*)pXmlNode->name));
         }
      }
   }

   return 0;
}