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; }
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; }
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); }
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); }
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); }
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); }