示例#1
0
EXTXMLMETHOD int rtXmlpGetNextSeqElemID 
(OSCTXT* pctxt, const OSXMLElemIDRec* tab, const OSXMLGroupDesc* ppGroup, 
 int curID, int lastMandatoryID, OSBOOL groupMode)
{
   int fromrow = ppGroup[curID].row;
   int rows = ppGroup[curID].num;
   int anyCase = ppGroup[curID].anyCase;
   int elemID;
   OSBOOL skipUnknown = TRUE;

   /* Decoding sequence in group and in base must be breaked on first unknown 
      element in optional tail. Decoding sequence in type skips unknown 
      elements */
   if (anyCase >= 0 || (curID > lastMandatoryID && groupMode))
      skipUnknown = FALSE;
      
   elemID = rtXmlpGetNextElemID (pctxt, tab + fromrow, rows, -1, skipUnknown);

   /* if group has any element use it */
   if (elemID == RTERR_UNEXPELEM && anyCase >= 0) {
      elemID = anyCase;
   }
   else if (elemID == RTERR_UNEXPELEM && curID > lastMandatoryID) {
      elemID = XML_OK_EOB;
   }
   else if (elemID < 0) {
      if (elemID == RTERR_UNEXPELEM) {
         OSXMLStrFragment localName;
         struct OSXMLReader* pXmlReader;

         OSRTASSERT (0 != pctxt->pXMLInfo);
         pXmlReader = ((OSXMLCtxtInfo*)pctxt->pXMLInfo)->pXmlPPReader;
         OSRTASSERT (0 != pXmlReader);

         rtXmlRdGetTagName (pXmlReader, &localName, 0);

         rtxErrAddStrnParm 
            (pctxt, (const char*)localName.value, localName.length);
         rtXmlRdErrAddSrcPos (pXmlReader, FALSE);
      }
      
      return LOG_RTERR (pctxt, elemID);
   }   
   else if (elemID == XML_OK_EOB) {
      /* if not all mandatory elements decoded */
      if (curID <= lastMandatoryID) 
         return LOG_RTERR (pctxt, XML_E_ELEMSMISRQ);
   }

   return elemID;
}
示例#2
0
EXTXMLMETHOD int rtXmlpGetNextAllElemID16 
(OSCTXT* pctxt, const OSXMLElemIDRec* tab, size_t nrows, 
 const OSUINT16* pOrder, OSUINT32 nOrder, OSUINT32 maxOrder, int anyID)
{
   int elemID = rtXmlpGetNextElemID 
      (pctxt, tab, nrows, -1, (OSBOOL)(anyID < 0));
   
   if (nOrder == maxOrder && elemID >= 0 && elemID != XML_OK_EOB)
      elemID = RTERR_UNEXPELEM;
      
   if (elemID == RTERR_UNEXPELEM) {
      if (anyID >= 0) elemID = anyID;
   }
   
   if (elemID == XML_OK_EOB) {
      return elemID;
   }
   
   /* check duplicate elements */
   if (elemID >= 0) {
      const OSUINT16* p = pOrder;
      const OSUINT16* pEnd = pOrder + nOrder;
      
      while (p != pEnd) {
         if (*p++ == (OSUINT16)elemID) return LOG_RTERR (pctxt, RTERR_SETDUPL);
      }
   }
     
   if (elemID < 0) {
      if (elemID == RTERR_UNEXPELEM) {
         OSXMLStrFragment localName;
         struct OSXMLReader* pXmlReader;

         OSRTASSERT (0 != pctxt->pXMLInfo);
         pXmlReader = ((OSXMLCtxtInfo*)pctxt->pXMLInfo)->pXmlPPReader;
         OSRTASSERT (0 != pXmlReader);

         rtXmlRdGetTagName (pXmlReader, &localName, 0);

         rtxErrAddStrnParm 
            (pctxt, (const char*)localName.value, localName.length);
         rtXmlRdErrAddSrcPos (pXmlReader, FALSE);
      }
      return LOG_RTERR (pctxt, elemID);
   }

   return elemID;
}
示例#3
0
int XmlDec_InvoiceLineItemType (OSCTXT* pctxt, InvoiceLineItemType* pvalue)
{
   int stat = 0;

   memset (&pvalue->m, 0, sizeof(pvalue->m));

   { int elemID;

   static const OSXMLElemIDRec elemtab[] = {
      {{{OSUTF8("LineID"), 6}, 0}, 0 },
      {{{OSUTF8("Item"), 4}, 0}, 1 },
      {{{OSUTF8("OrderStatus"), 11}, 0}, 2 },
      {{{OSUTF8("Pricing"), 7}, 0}, 3 },
      {{{OSUTF8("PricingVariation"), 16}, 0}, 4 },
      {{{OSUTF8("ItemTax"), 7}, 0}, 5 },
      {{{OSUTF8("TotalAmount"), 11}, 0}, 6 }
   } ;
   static const struct {
      int row;
      int num;
      int anyCase;
   } groupDesc[] = { {0, 1, -1}, {1, 1, -1}, {2, 2, -1}, {4, 3, -1}, {7, 0, -1}
      };

   int group = 0;
   int i;
   for (i = 0; i < 7; i++) {
      int fromrow = groupDesc[group].row;
      int rows = groupDesc[group].num;
      int anyCase = groupDesc[group].anyCase;

      elemID = rtXmlpGetNextElemID (pctxt, 
         elemtab + fromrow, rows, -1, FALSE);
      if (elemID == RTERR_UNEXPELEM && anyCase >= 0 && i == anyCase)
         elemID = anyCase;
      else if (elemID < 0) return LOG_RTERR (pctxt, elemID);
      else if (elemID == XML_OK_EOB) break;
      else if (elemID == elemtab[fromrow + rows - 1].id) group++;

      switch (elemID) {
      case 0: { /* LineID */
         stat = XmlDec_CCT_IdentifierType (pctxt, &pvalue->lineID);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 1: { /* Item */
         stat = XmlDec_ItemType (pctxt, &pvalue->item);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 2: { /* OrderStatus */
         stat = XmlDec_CCT_CodeType (pctxt, &pvalue->orderStatus);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.orderStatusPresent = TRUE;
         break;
      }
      case 3: { /* Pricing */
         stat = XmlDec_PricingType (pctxt, &pvalue->pricing);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 4: { /* PricingVariation */
         stat = XmlDec_PricingVariationType (pctxt, &pvalue->pricingVariation
            );
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.pricingVariationPresent = TRUE;
         break;
      }
      case 5: { /* ItemTax */
         stat = XmlDec_CCT_AmountType (pctxt, &pvalue->itemTax);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.itemTaxPresent = TRUE;
         break;
      }
      case 6: { /* TotalAmount */
         stat = XmlDec_CCT_AmountType (pctxt, &pvalue->totalAmount);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      }
      i = elemID;
   }
   }

   return (stat);
}
示例#4
0
int XmlDec_InvoiceHeaderType (OSCTXT* pctxt, InvoiceHeaderType* pvalue)
{
   int stat = 0;

   memset (&pvalue->m, 0, sizeof(pvalue->m));

   { int elemID;

   static const OSXMLElemIDRec elemtab[] = {
      {{{OSUTF8("IssueDateTime"), 13}, 0}, 0 },
      {{{OSUTF8("Identifier"), 10}, 0}, 1 },
      {{{OSUTF8("POIdentifier"), 12}, 0}, 2 },
      {{{OSUTF8("CurrencyCode"), 12}, 0}, 3 },
      {{{OSUTF8("Language"), 8}, 0}, 4 },
      {{{OSUTF8("BuyerParty"), 10}, 0}, 5 },
      {{{OSUTF8("SellerParty"), 11}, 0}, 6 },
      {{{OSUTF8("ConsigneeParty"), 14}, 0}, 7 },
      {{{OSUTF8("DespatchParty"), 13}, 0}, 8 },
      {{{OSUTF8("Shipment"), 8}, 0}, 9 },
      {{{OSUTF8("PaymentMeans"), 12}, 0}, 10 },
      {{{OSUTF8("LineItemCountValue"), 18}, 0}, 11 }
   } ;
   static const struct {
      int row;
      int num;
      int anyCase;
   } groupDesc[] = { {0, 1, -1}, {1, 1, -1}, {2, 1, -1}, {3, 3, -1}, {6, 1, -1}
      , {7, 4, -1}, {11, 1, -1}};

   int group = 0;
   int i;
   for (i = 0; i < 12; i++) {
      int fromrow = groupDesc[group].row;
      int rows = groupDesc[group].num;
      int anyCase = groupDesc[group].anyCase;

      elemID = rtXmlpGetNextElemID (pctxt, 
         elemtab + fromrow, rows, -1, FALSE);
      if (elemID == RTERR_UNEXPELEM && anyCase >= 0 && i == anyCase)
         elemID = anyCase;
      else if (elemID < 0) return LOG_RTERR (pctxt, elemID);
      else if (elemID == XML_OK_EOB) break;
      else if (elemID == elemtab[fromrow + rows - 1].id) group++;

      switch (elemID) {
      case 0: { /* IssueDateTime */
         stat = XmlDec_CCT_DateTimeType (pctxt, &pvalue->issueDateTime);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 1: { /* Identifier */
         stat = XmlDec_CCT_IdentifierType (pctxt, &pvalue->identifier);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 2: { /* POIdentifier */
         stat = XmlDec_CCT_IdentifierType (pctxt, &pvalue->pOIdentifier);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 3: { /* CurrencyCode */
         stat = XmlDec_CCT_CodeType (pctxt, &pvalue->currencyCode);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.currencyCodePresent = TRUE;
         break;
      }
      case 4: { /* Language */
         stat = XmlDec_LanguageType (pctxt, &pvalue->language);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.languagePresent = TRUE;
         break;
      }
      case 5: { /* BuyerParty */
         stat = XmlDec_PartyType (pctxt, &pvalue->buyerParty);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 6: { /* SellerParty */
         stat = XmlDec_PartyType (pctxt, &pvalue->sellerParty);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 7: { /* ConsigneeParty */
         stat = XmlDec_PartyType (pctxt, &pvalue->consigneeParty);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.consigneePartyPresent = TRUE;
         break;
      }
      case 8: { /* DespatchParty */
         stat = XmlDec_PartyType (pctxt, &pvalue->despatchParty);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.despatchPartyPresent = TRUE;
         break;
      }
      case 9: { /* Shipment */
         stat = XmlDec_ShipmentType (pctxt, &pvalue->shipment);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.shipmentPresent = TRUE;
         break;
      }
      case 10: { /* PaymentMeans */
         stat = XmlDec_PaymentMeansType (pctxt, &pvalue->paymentMeans);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 11: { /* LineItemCountValue */
         stat = XmlDec_CCT_NumericType (pctxt, &pvalue->lineItemCountValue);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.lineItemCountValuePresent = TRUE;
         break;
      }
      }
      i = elemID;
   }
   }

   return (stat);
}
示例#5
0
int XmlDec_InvoiceType (OSCTXT* pctxt, InvoiceType* pvalue)
{
   int stat = 0;

   { int elemID;

   static const OSXMLElemIDRec elemtab[] = {
      {{{OSUTF8("Header"), 6}, 0}, 0 },
      {{{OSUTF8("LineItem"), 8}, 0}, 1 },
      {{{OSUTF8("Summary"), 7}, 0}, 2 }
   } ;
   static const struct {
      int row;
      int num;
      int anyCase;
   } groupDesc[] = { {0, 1, -1}, {1, 2, -1}, {3, 0, -1}};

   int group = 0;
   int i;
   for (i = 0; i < 3; i++) {
      int fromrow = groupDesc[group].row;
      int rows = groupDesc[group].num;
      int anyCase = groupDesc[group].anyCase;

      elemID = rtXmlpGetNextElemID (pctxt, 
         elemtab + fromrow, rows, -1, FALSE);
      if (elemID == RTERR_UNEXPELEM && anyCase >= 0 && i == anyCase)
         elemID = anyCase;
      else if (elemID < 0) return LOG_RTERR (pctxt, elemID);
      else if (elemID == XML_OK_EOB) break;
      else if (elemID == elemtab[fromrow + rows - 1].id) group++;

      switch (elemID) {
      case 0: { /* Header */
         stat = XmlDec_InvoiceHeaderType (pctxt, &pvalue->header);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 1: {
         InvoiceLineItemType* pdata1;
         do {
            pdata1 = rtxMemAllocType (pctxt, InvoiceLineItemType);

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

            asn1Init_InvoiceLineItemType (pdata1);

            stat = XmlDec_InvoiceLineItemType (pctxt, pdata1);
            if (stat != 0) return LOG_RTERR (pctxt, stat);

            stat = rtXmlpMatchEndTag (pctxt, -1);
            if (stat < 0) return LOG_RTERR (pctxt, stat);

            rtxDListAppend (pctxt, &pvalue->lineItem_list, (void*)pdata1);

            stat = rtXmlpGetNextElemID (pctxt, elemtab + 1, 1, -1, FALSE);
            if (stat < 0 && stat != RTERR_UNEXPELEM)
               return LOG_RTERR (pctxt, stat);
         }
         while (stat == 1);

         rtXmlpMarkLastEventActive (pctxt);
         stat = 0;
         break;
      }
      case 2: { /* Summary */
         stat = XmlDec_InvoiceSummaryType (pctxt, &pvalue->summary);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      }
      i = elemID;
   }
   }

   return (stat);
}
示例#6
0
int XmlDec_InvoiceSummaryType (OSCTXT* pctxt, InvoiceSummaryType* pvalue)
{
   int stat = 0;

   memset (&pvalue->m, 0, sizeof(pvalue->m));

   { int elemID;

   static const OSXMLElemIDRec elemtab[] = {
      {{{OSUTF8("LineItemCountValue"), 18}, 0}, 0 },
      {{{OSUTF8("SubtotalAmount"), 14}, 0}, 1 },
      {{{OSUTF8("PricingVariation"), 16}, 0}, 2 },
      {{{OSUTF8("TotalTax"), 8}, 0}, 3 },
      {{{OSUTF8("PriceAmount"), 11}, 0}, 4 },
      {{{OSUTF8("PackingSlipIdentifier"), 21}, 0}, 5 },
      {{{OSUTF8("SummaryNote"), 11}, 0}, 6 }
   } ;
   static const struct {
      int row;
      int num;
      int anyCase;
   } groupDesc[] = { {0, 2, -1}, {2, 3, -1}, {5, 2, -1}};

   int group = 0;
   int i;
   for (i = 0; i < 7; i++) {
      int fromrow = groupDesc[group].row;
      int rows = groupDesc[group].num;
      int anyCase = groupDesc[group].anyCase;

      elemID = rtXmlpGetNextElemID (pctxt, 
         elemtab + fromrow, rows, -1, FALSE);
      if (elemID == RTERR_UNEXPELEM && anyCase >= 0 && i == anyCase)
         elemID = anyCase;
      else if (elemID < 0) return LOG_RTERR (pctxt, elemID);
      else if (elemID == XML_OK_EOB) break;
      else if (elemID == elemtab[fromrow + rows - 1].id) group++;

      switch (elemID) {
      case 0: { /* LineItemCountValue */
         stat = XmlDec_CCT_NumericType (pctxt, &pvalue->lineItemCountValue);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.lineItemCountValuePresent = TRUE;
         break;
      }
      case 1: { /* SubtotalAmount */
         stat = XmlDec_CCT_AmountType (pctxt, &pvalue->subtotalAmount);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 2: {
         PricingVariationType* pdata1;
         do {
            pdata1 = rtxMemAllocType (pctxt, PricingVariationType);

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

            asn1Init_PricingVariationType (pdata1);

            stat = XmlDec_PricingVariationType (pctxt, pdata1);
            if (stat != 0) return LOG_RTERR (pctxt, stat);

            stat = rtXmlpMatchEndTag (pctxt, -1);
            if (stat < 0) return LOG_RTERR (pctxt, stat);

            rtxDListAppend (pctxt, &pvalue->pricingVariation_list
               , (void*)pdata1);

            stat = rtXmlpGetNextElemID (pctxt, elemtab + 2, 1, -1, FALSE);
            if (stat < 0 && stat != RTERR_UNEXPELEM)
               return LOG_RTERR (pctxt, stat);
         }
         while (stat == 2);

         rtXmlpMarkLastEventActive (pctxt);
         stat = 0;
         break;
      }
      case 3: { /* TotalTax */
         stat = XmlDec_TaxType (pctxt, &pvalue->totalTax);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.totalTaxPresent = TRUE;
         break;
      }
      case 4: { /* PriceAmount */
         stat = XmlDec_CCT_AmountType (pctxt, &pvalue->priceAmount);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         break;
      }
      case 5: { /* PackingSlipIdentifier */
         stat = XmlDec_CCT_IdentifierType (pctxt, &pvalue->
            packingSlipIdentifier);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.packingSlipIdentifierPresent = TRUE;
         break;
      }
      case 6: { /* SummaryNote */
         stat = XmlDec_NoteType (pctxt, &pvalue->summaryNote);
         if (stat != 0) return LOG_RTERR (pctxt, stat);

         stat = rtXmlpMatchEndTag (pctxt, -1);
         if (stat < 0) return LOG_RTERR (pctxt, stat);

         pvalue->m.summaryNotePresent = TRUE;
         break;
      }
      }
      i = elemID;
   }
   }

   return (stat);
}