int xd_OpenTypeExt (OSCTXT* pctxt, ASN1CCB* ccb_p, ASN1TAG tag, OSRTDList *pElemList) { int length, stat; if (tag == ASN_K_NOTAG) { /* Loop through remaining elements in SEQUENCE */ while (!XD_CHKEND (pctxt, ccb_p)) { stat = xd_OpenTypeAppend (pctxt, pElemList); /*!AB 11/06/02 */ if (stat != 0) return LOG_RTERR (pctxt, stat); } } else { /* Loop through elements until matching tag found or some other */ /* error occurs.. */ while ((stat = xd_match (pctxt, tag, &length, 0)) == RTERR_IDNOTFOU) { rtxErrReset (pctxt); if (XD_CHKEND (pctxt, ccb_p)) { return LOG_RTERR (pctxt, RTERR_ENDOFBUF); } else { stat = xd_OpenTypeAppend (pctxt, pElemList); /*!AB 11/06/02 */ if (stat != 0) return LOG_RTERR (pctxt, stat); } } if (stat != 0) return LOG_RTERR (pctxt, stat); } return 0; }
int xd_chkend (OSCTXT* pctxt, ASN1CCB* ccb_p) { int len; ASN1TAG tag; register int eoc, stat, usedBytes; if (ccb_p->len == ASN_K_INDEFLEN) { stat = xd_tag_len (pctxt, &tag, &len, 0); if (stat == RTERR_ENDOFBUF) { rtxErrReset (pctxt); eoc = TRUE; } else if (tag == 0 && len == 0) { /* Advance cursor past EOC only if enveloping context */ /* parsed the indefinite length marker.. */ /* if (ccb_p->tagging == ASN1EXPL) { xd_tag_len (pctxt, &tag, &len, XM_ADVANCE); } */ eoc = TRUE; } else eoc = FALSE; } else { usedBytes = (int)(OSRTBUFPTR(pctxt) - ccb_p->ptr); eoc = ((usedBytes >= ccb_p->len) || (pctxt->buffer.byteIndex >= pctxt->buffer.size)); /*!AB 09/19/02 */ } return (eoc); }
EXTERN int asn1D_OrderResponseType (OSCTXT* pctxt, OrderResponseType *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 */ memset (&pvalue->m, 0, sizeof(pvalue->m)); ccb.len = length; ccb.ptr = OSRTBUFPTR(pctxt); ccb.seqx = 0; while (!XD_CHKEND (pctxt, &ccb)) { switch (ccb.seqx) { case 0: /* decode buyersID */ if (XD_PEEKTAG (pctxt, 0x80)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_UnspecializedDatatypes_1_0_IdentifierType (pctxt, &pvalue->buyersID, ASN1IMPL, length); if (stat == 0) { pvalue->m.buyersIDPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 1: /* decode sellersID */ if (XD_PEEKTAG (pctxt, 0x81)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_UnspecializedDatatypes_1_0_IdentifierType (pctxt, &pvalue->sellersID, ASN1IMPL, length); if (stat == 0) { pvalue->m.sellersIDPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 2: /* decode copyIndicator */ if (XD_PEEKTAG (pctxt, 0x82)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_CopyIndicator (pctxt, &pvalue->copyIndicator, ASN1IMPL, length); if (stat == 0) { pvalue->m.copyIndicatorPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 3: /* decode gUID */ if (XD_PEEKTAG (pctxt, 0x83)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_UnspecializedDatatypes_1_0_IdentifierType (pctxt, &pvalue->gUID, ASN1IMPL, length); if (stat == 0) { pvalue->m.gUIDPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 4: /* decode issueDate */ if (XD_PEEKTAG (pctxt, 0x84)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_IssueDate (pctxt, &pvalue->issueDate, 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 5: /* decode documentStatusCode */ if (XD_PEEKTAG (pctxt, 0x85)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_DocumentStatusCodeType (pctxt, &pvalue->documentStatusCode, ASN1IMPL, length); if (stat == 0) { pvalue->m.documentStatusCodePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 6: /* decode note */ if (XD_PEEKTAG (pctxt, 0x86)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_Note (pctxt, &pvalue->note, ASN1IMPL, length); if (stat == 0) { pvalue->m.notePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 7: /* decode transactionCurrencyCode */ if (XD_PEEKTAG (pctxt, 0x87)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_CurrencyCodeType (pctxt, &pvalue->transactionCurrencyCode, ASN1IMPL, length); if (stat == 0) { pvalue->m.transactionCurrencyCodePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 8: /* decode pricingCurrencyCode */ if (XD_PEEKTAG (pctxt, 0x88)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_CurrencyCodeType (pctxt, &pvalue->pricingCurrencyCode, ASN1IMPL, length); if (stat == 0) { pvalue->m.pricingCurrencyCodePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 9: /* decode earliestDate */ if (XD_PEEKTAG (pctxt, 0x89)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_EarliestDate (pctxt, &pvalue->earliestDate, ASN1IMPL, length); if (stat == 0) { pvalue->m.earliestDatePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 10: /* decode expiryDate */ if (XD_PEEKTAG (pctxt, 0x8a)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_ExpiryDate (pctxt, &pvalue->expiryDate, ASN1IMPL, length); if (stat == 0) { pvalue->m.expiryDatePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 11: /* decode validityDurationMeasure */ if (XD_PEEKTAG (pctxt, 0x8b)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_ValidityDurationMeasure (pctxt, &pvalue->validityDurationMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.validityDurationMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 12: /* decode taxTotalAmount */ if (XD_PEEKTAG (pctxt, 0x8c)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_TaxTotalAmount (pctxt, &pvalue->taxTotalAmount, ASN1IMPL, length); if (stat == 0) { pvalue->m.taxTotalAmountPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 13: /* decode lineExtensionTotalAmount */ if (XD_PEEKTAG (pctxt, 0x8d)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_LineExtensionTotalAmount (pctxt, &pvalue->lineExtensionTotalAmount, ASN1IMPL, length); if (stat == 0) { pvalue->m.lineExtensionTotalAmountPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 14: /* decode totalPackagesCountQuantity */ if (XD_PEEKTAG (pctxt, 0x8e)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_TotalPackagesCountQuantity (pctxt, &pvalue->totalPackagesCountQuantity, ASN1IMPL, length); if (stat == 0) { pvalue->m.totalPackagesCountQuantityPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 15: /* decode grossWeightMeasure */ if (XD_PEEKTAG (pctxt, 0x8f)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_GrossWeightMeasure (pctxt, &pvalue->grossWeightMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.grossWeightMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 16: /* decode netWeightMeasure */ if (XD_PEEKTAG (pctxt, 0x90)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_NetWeightMeasure (pctxt, &pvalue->netWeightMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.netWeightMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 17: /* decode netNetWeightMeasure */ if (XD_PEEKTAG (pctxt, 0x91)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_NetNetWeightMeasure (pctxt, &pvalue->netNetWeightMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.netNetWeightMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 18: /* decode grossVolumeMeasure */ if (XD_PEEKTAG (pctxt, 0x92)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_GrossVolumeMeasure (pctxt, &pvalue->grossVolumeMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.grossVolumeMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 19: /* decode netVolumeMeasure */ if (XD_PEEKTAG (pctxt, 0x93)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_NetVolumeMeasure (pctxt, &pvalue->netVolumeMeasure, ASN1IMPL, length); if (stat == 0) { pvalue->m.netVolumeMeasurePresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 20: /* decode lineItemCountNumeric */ if (XD_PEEKTAG (pctxt, 0x94)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_LineItemCountNumeric (pctxt, &pvalue->lineItemCountNumeric, ASN1IMPL, length); if (stat == 0) { pvalue->m.lineItemCountNumericPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 21: /* decode orderReference_list */ if (XD_PEEKTAG (pctxt, 0x95)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_OrderResponseType_orderReference_list (pctxt, &pvalue->orderReference_list, 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 22: /* decode buyerParty */ if (XD_PEEKTAG (pctxt, 0x96)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_BuyerParty (pctxt, &pvalue->buyerParty, 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 23: /* decode sellerParty */ if (XD_PEEKTAG (pctxt, 0x97)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_SellerParty (pctxt, &pvalue->sellerParty, 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 24: /* decode originatorParty */ if (XD_PEEKTAG (pctxt, 0x98)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_OriginatorParty (pctxt, &pvalue->originatorParty, ASN1IMPL, length); if (stat == 0) { pvalue->m.originatorPartyPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 25: /* decode freightForwarderParty */ if (XD_PEEKTAG (pctxt, 0x99)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_FreightForwarderParty (pctxt, &pvalue->freightForwarderParty, ASN1IMPL, length); if (stat == 0) { pvalue->m.freightForwarderPartyPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 26: /* decode delivery_list */ if (XD_PEEKTAG (pctxt, 0x9a)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D__SeqOfDelivery (pctxt, &pvalue->delivery_list, 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 27: /* decode deliveryTerms */ if (XD_PEEKTAG (pctxt, 0x9b)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_DeliveryTerms (pctxt, &pvalue->deliveryTerms, ASN1IMPL, length); if (stat == 0) { pvalue->m.deliveryTermsPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 28: /* decode allowanceCharge_list */ if (XD_PEEKTAG (pctxt, 0x9c)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D__SeqOfAllowanceCharge (pctxt, &pvalue->allowanceCharge_list, 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 29: /* decode salesConditions */ if (XD_PEEKTAG (pctxt, 0x9d)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_SalesConditions (pctxt, &pvalue->salesConditions, ASN1IMPL, length); if (stat == 0) { pvalue->m.salesConditionsPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 30: /* decode destinationCountry */ if (XD_PEEKTAG (pctxt, 0x9e)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = asn1D_UBL_OrderResponse_1_0_DestinationCountry (pctxt, &pvalue->destinationCountry, ASN1IMPL, length); if (stat == 0) { pvalue->m.destinationCountryPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } break; case 31: /* decode respondedOrderLine_list */ if ((stat = xd_match (pctxt, TM_CTXT|TM_CONS|31, &length, XM_ADVANCE)) == 0) { stat = asn1D_OrderResponseType_respondedOrderLine_list (pctxt, &pvalue->respondedOrderLine_list, 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 32: /* decode paymentMeans */ if ((stat = xd_match (pctxt, TM_CTXT|TM_CONS|32, &length, XM_ADVANCE)) == 0) { stat = asn1D_PaymentMeans (pctxt, &pvalue->paymentMeans, ASN1IMPL, length); if (stat == 0) { pvalue->m.paymentMeansPresent = TRUE; if (length == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } } } else if (stat == RTERR_IDNOTFOU) { stat = rtxErrReset (pctxt); } 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): case (TM_CTXT|TM_CONS|3): case (TM_CTXT|TM_CONS|4): case (TM_CTXT|TM_CONS|5): case (TM_CTXT|TM_CONS|6): case (TM_CTXT|TM_CONS|7): case (TM_CTXT|TM_CONS|8): case (TM_CTXT|TM_CONS|9): case (TM_CTXT|TM_CONS|10): case (TM_CTXT|TM_CONS|11): case (TM_CTXT|TM_CONS|12): case (TM_CTXT|TM_CONS|13): case (TM_CTXT|TM_CONS|14): case (TM_CTXT|TM_CONS|15): case (TM_CTXT|TM_CONS|16): case (TM_CTXT|TM_CONS|17): case (TM_CTXT|TM_CONS|18): case (TM_CTXT|TM_CONS|19): case (TM_CTXT|TM_CONS|20): case (TM_CTXT|TM_CONS|21): case (TM_CTXT|TM_CONS|22): case (TM_CTXT|TM_CONS|23): case (TM_CTXT|TM_CONS|24): case (TM_CTXT|TM_CONS|25): case (TM_CTXT|TM_CONS|26): case (TM_CTXT|TM_CONS|27): case (TM_CTXT|TM_CONS|28): case (TM_CTXT|TM_CONS|29): case (TM_CTXT|TM_CONS|30): case (TM_CTXT|TM_CONS|31): case (TM_CTXT|TM_CONS|32): stat = RTERR_SEQORDER; break; default: stat = RTERR_SEQOVFLW; break; }} } if (stat != 0) return LOG_RTERR (pctxt, stat); else ccb.seqx++; } if (reqcnt < 7) { 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); }
/* * 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; }