int decode_appHandExiDocument(bitstream_t* stream, struct appHandEXIDocument* exiDoc) { errn = readEXIHeader(stream); if(errn == 0) { /* DocContent[START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC] */ init_appHandEXIDocument(exiDoc); errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if(errn == 0) { switch(eventCode) { case 0: /* START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq) */ errn = decode_appHandAnonType_supportedAppProtocolReq(stream, &exiDoc->supportedAppProtocolReq); exiDoc->supportedAppProtocolReq_isUsed = 1u; break; case 1: /* START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes) */ errn = decode_appHandAnonType_supportedAppProtocolRes(stream, &exiDoc->supportedAppProtocolRes); exiDoc->supportedAppProtocolRes_isUsed = 1u; break; default: errn = EXI_ERROR_UNEXPECTED_EVENT_LEVEL1; break; } } } return errn;
errorCode processNextProduction(EXIStream* strm, SmallIndex* nonTermID_out, ContentHandler* handler, void* app_data) { errorCode tmp_err_code = UNEXPECTED_ERROR; unsigned int tmp_bits_val = 0; unsigned char b = 0; GrammarRule* currentRule; DEBUG_MSG(INFO, DEBUG_GRAMMAR, (">Next production non-term-id: %u\n", (unsigned int) strm->context.currNonTermID)); if(strm->context.currNonTermID >= strm->gStack->grammar->count) return INCONSISTENT_PROC_STATE; if(IS_BUILT_IN_ELEM(strm->gStack->grammar->props)) // If the current grammar is build-in Element grammar ... currentRule = (GrammarRule*) &((DynGrammarRule*) strm->gStack->grammar->rule)[strm->context.currNonTermID]; else currentRule = &strm->gStack->grammar->rule[strm->context.currNonTermID]; #if DEBUG_GRAMMAR == ON { tmp_err_code = printGrammarRule(strm->context.currNonTermID, currentRule, strm->schema); if(tmp_err_code != ERR_OK) { DEBUG_MSG(INFO, DEBUG_GRAMMAR, (">Error printing grammar rule\n")); } } #endif for(b = 0; b < 3; b++) { if(currentRule->part[b].count == 0) // No productions available with this length code continue; if(currentRule->part[b].bits == 0) // encoded with zero bits return handleProduction(strm, currentRule, ¤tRule->part[b].prod[0], nonTermID_out, handler, app_data, b + 1); tmp_err_code = decodeNBitUnsignedInteger(strm, currentRule->part[b].bits, &tmp_bits_val); if(tmp_err_code != ERR_OK) return tmp_err_code; if(tmp_bits_val == currentRule->part[b].count) // The code has more parts continue; return handleProduction(strm, currentRule, ¤tRule->part[b].prod[currentRule->part[b].count - 1 - tmp_bits_val], nonTermID_out, handler, app_data, b + 1); } return tmp_err_code; }
static errorCode ops_startElement(QName qname, void* app_data) { struct ops_AppData* o_appD = (struct ops_AppData*) app_data; if(o_appD->o_strm->context.currElem.uriId == 4) // URI == http://www.w3.org/2009/exi { o_appD->prevElementUriID = 4; switch(o_appD->o_strm->context.currElem.lnId) { case 33: // strict SET_STRICT(o_appD->parsed_ops->enumOpt); o_appD->prevElementLnID = 33; break; case 31: // schemaId o_appD->prevElementLnID = 31; o_appD->parsed_ops->schemaIDMode = SCHEMA_ID_EMPTY; break; case 7: // compression SET_COMPRESSION(o_appD->parsed_ops->enumOpt); o_appD->prevElementLnID = 7; break; case 14: // fragment SET_FRAGMENT(o_appD->parsed_ops->enumOpt); o_appD->prevElementLnID = 14; break; case 13: // dtd SET_PRESERVED(o_appD->parsed_ops->preserve, PRESERVE_DTD); o_appD->prevElementLnID = 13; break; case 29: // prefixes SET_PRESERVED(o_appD->parsed_ops->preserve, PRESERVE_PREFIXES); o_appD->prevElementLnID = 29; break; case 26: // lexicalValues SET_PRESERVED(o_appD->parsed_ops->preserve, PRESERVE_LEXVALUES); o_appD->prevElementLnID = 26; break; case 5: // comments SET_PRESERVED(o_appD->parsed_ops->preserve, PRESERVE_COMMENTS); o_appD->prevElementLnID = 5; break; case 27: // pis SET_PRESERVED(o_appD->parsed_ops->preserve, PRESERVE_PIS); o_appD->prevElementLnID = 27; break; case 4: // alignment->byte SET_ALIGNMENT(o_appD->parsed_ops->enumOpt, BYTE_ALIGNMENT); o_appD->prevElementLnID = 4; break; case 28: // alignment->pre-compress SET_ALIGNMENT(o_appD->parsed_ops->enumOpt, PRE_COMPRESSION); o_appD->prevElementLnID = 28; break; case 32: // selfContained SET_SELF_CONTAINED(o_appD->parsed_ops->enumOpt); o_appD->prevElementLnID = 32; break; case 8: // datatypeRepresentationMap o_appD->prevElementLnID = 8; break; case 36: // uncommon o_appD->prevElementLnID = 36; #if EXI_PROFILE_DEFAULT { // If the EXI Profile default behaviour is followed, then we expect // SE(*) <p/> indicating default EXI Profile parameters // If this is not the case rise an error // SE(*) has event code 5 in the uncommon grammar unsigned int tmp_bits_val; UnsignedInteger lnLen = 0; errorCode tmp_err_code = UNEXPECTED_ERROR; String lnStr; QNameID qnameId = {URI_MAX, LN_MAX}; // Next event code must be SE(*) TRY(decodeNBitUnsignedInteger(o_appD->o_strm, 3, &tmp_bits_val)); if(tmp_bits_val != 5) { DEBUG_MSG(ERROR, DEBUG_CONTENT_IO, (">EXI Profile default active but <p> element missing\n")); return INVALID_EXIP_CONFIGURATION; } // The <p> element QName must be "http://www.w3.org/2009/exi:p" TRY(decodeUri(o_appD->o_strm, &qnameId.uriId)); TRY(decodeUnsignedInteger(o_appD->o_strm, &lnLen)); if(lnLen == 0) // local-name table hit -> should not be the case to have "p" in the local string table return INVALID_EXIP_CONFIGURATION; TRY(allocateStringMemoryManaged(&(lnStr.str),(Index) (lnLen - 1), &o_appD->o_strm->memList)); TRY(decodeStringOnly(o_appD->o_strm, (Index)lnLen - 1, &lnStr)); // NOTE: the "p" local name is in purpose not added to the // local name table of the http://www.w3.org/2009/exi uri, although it should be. // If there are more strings (24 or more) added there in the future // or the <p> element is encoded more than once - both are highly unlikely, // then there will be a problem with the encoding. if(qnameId.uriId != 4 || !stringEqualToAscii(lnStr, "p")) { DEBUG_MSG(ERROR, DEBUG_CONTENT_IO, (">EXI Profile default active but <p> element missing\n")); return INVALID_EXIP_CONFIGURATION; } // The next event code must be EE -> 0.0 TRY(decodeNBitUnsignedInteger(o_appD->o_strm, 2, &tmp_bits_val)); if(tmp_bits_val != 0) { DEBUG_MSG(ERROR, DEBUG_CONTENT_IO, (">EXI Profile default active but <p> element is not empty\n")); return INVALID_EXIP_CONFIGURATION; } } #endif break; } } else // URI != http://www.w3.org/2009/exi { // The previous element should be either uncommon or datatypeRepresentationMap otherwise it is an error // These are the only places where <any> element is allowed if(o_appD->prevElementUriID != 4 || o_appD->prevElementLnID != 36 || o_appD->prevElementLnID != 8) { DEBUG_MSG(ERROR, DEBUG_CONTENT_IO, (">Wrong namespace in the EXI Options\n")); return EXIP_HANDLER_STOP; } // Handle here the user defined meta-data that follows! http://www.w3.org/TR/2011/REC-exi-20110310/#key-userMetaData } return ERR_OK; }
/* Complex type name='urn:iso:15118:2:2010:AppProtocol,#AnonType_supportedAppProtocolRes', base type name='anyType', content type='ELEMENT', isAbstract='false', hasTypeId='false', final='0', block='0', particle='(ResponseCode,SchemaID{0-1})', derivedBy='RESTRICTION'. */ static int decode_appHandAnonType_supportedAppProtocolRes(bitstream_t* stream, struct appHandAnonType_supportedAppProtocolRes* appHandAnonType_supportedAppProtocolRes) { int grammarID = 27; int done = 0; init_appHandAnonType_supportedAppProtocolRes(appHandAnonType_supportedAppProtocolRes); while(!done) { switch(grammarID) { case 27: /* FirstStartTag[START_ELEMENT(ResponseCode)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* FirstStartTag[CHARACTERS[ENUMERATION]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeNBitUnsignedInteger(stream, 2, &uint32); appHandAnonType_supportedAppProtocolRes->ResponseCode = (appHandresponseCodeType) uint32; } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(ResponseCode) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 28; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 28: /* Element[START_ELEMENT(SchemaID), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeNBitUnsignedInteger(stream, 8, &(uint32)); appHandAnonType_supportedAppProtocolRes->SchemaID = (uint8_t)(uint32 + 0); appHandAnonType_supportedAppProtocolRes->SchemaID_isUsed = 1u; } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(SchemaID) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 5; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 5: /* Element[END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; default: errn = EXI_ERROR_UNKOWN_GRAMMAR_ID; break; } if(errn) { done = 1; } } return errn;
/* Complex type name='urn:iso:15118:2:2010:AppProtocol,AppProtocolType', base type name='anyType', content type='ELEMENT', isAbstract='false', hasTypeId='false', final='0', block='0', particle='(ProtocolNamespace,VersionNumberMajor,VersionNumberMinor,SchemaID,Priority)', derivedBy='RESTRICTION'. */ static int decode_appHandAppProtocolType(bitstream_t* stream, struct appHandAppProtocolType* appHandAppProtocolType) { int grammarID = 0; int done = 0; init_appHandAppProtocolType(appHandAppProtocolType); while(!done) { switch(grammarID) { case 0: /* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* FirstStartTag[CHARACTERS[STRING]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeUnsignedInteger16(stream, &appHandAppProtocolType->ProtocolNamespace.charactersLen); if (errn == 0) { errn = (appHandAppProtocolType->ProtocolNamespace.charactersLen - 2) <= appHandAppProtocolType_ProtocolNamespace_CHARACTERS_SIZE ? 0 : EXI_ERROR_STRINGVALUES_OUT_OF_BOUND; } if (errn == 0) { if (appHandAppProtocolType->ProtocolNamespace.charactersLen >= 2) { appHandAppProtocolType->ProtocolNamespace.charactersLen = (uint16_t)(appHandAppProtocolType->ProtocolNamespace.charactersLen - 2); /* string table miss */ errn = decodeCharacters(stream, appHandAppProtocolType->ProtocolNamespace.charactersLen, appHandAppProtocolType->ProtocolNamespace.characters); } else { /* string table hit */ errn = EXI_ERROR_STRINGVALUES_NOT_SUPPORTED; } } } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(ProtocolNamespace) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 1; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 1: /* Element[START_ELEMENT(VersionNumberMajor)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeUnsignedInteger32(stream, &appHandAppProtocolType->VersionNumberMajor); } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(VersionNumberMajor) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 2; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 2: /* Element[START_ELEMENT(VersionNumberMinor)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeUnsignedInteger32(stream, &appHandAppProtocolType->VersionNumberMinor); } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(VersionNumberMinor) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 3; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 3: /* Element[START_ELEMENT(SchemaID)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeNBitUnsignedInteger(stream, 8, &(uint32)); appHandAppProtocolType->SchemaID = (uint8_t)(uint32 + 0); } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(SchemaID) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 4; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 4: /* Element[START_ELEMENT(Priority)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(errn == 0) { if(eventCode == 0) { errn = decodeNBitUnsignedInteger(stream, 5, &(uint32)); appHandAppProtocolType->Priority = (uint8_t)(uint32 + 1); } else { /* Second level event (e.g., xsi:type, xsi:nil, ...) */ errn = EXI_UNSUPPORTED_EVENT_CODE_CHARACTERISTICS; } } if(errn == 0) { /* valid EE for simple element START_ELEMENT(Priority) ? */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if(eventCode == 0) { grammarID = 5; } else { errn = EXI_DEVIANT_SUPPORT_NOT_DEPLOYED; /* or also typecast and nillable */ } } break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 5: /* Element[END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; default: errn = EXI_ERROR_UNKOWN_GRAMMAR_ID; break; } if(errn) { done = 1; } } return errn;
/* Complex type name='urn:iso:15118:2:2010:AppProtocol,#AnonType_supportedAppProtocolReq', base type name='anyType', content type='ELEMENT', isAbstract='false', hasTypeId='false', final='0', block='0', particle='(AppProtocol{1-20})', derivedBy='RESTRICTION'. */ static int decode_appHandAnonType_supportedAppProtocolReq(bitstream_t* stream, struct appHandAnonType_supportedAppProtocolReq* appHandAnonType_supportedAppProtocolReq) { int grammarID = 7; int done = 0; init_appHandAnonType_supportedAppProtocolReq(appHandAnonType_supportedAppProtocolReq); while(!done) { switch(grammarID) { case 7: /* FirstStartTag[START_ELEMENT(AppProtocol)] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 8; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 8: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 9; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 9: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 10; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 10: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 11; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 11: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 12; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 12: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 13; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 13: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 14; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 14: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 15; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 15: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 16; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 16: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 17; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 17: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 18; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 18: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 19; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 19: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 20; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 20: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 21; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 21: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 22; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 22: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 23; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 23: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 24; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 24: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 25; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 25: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 26; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 26: /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 2, &eventCode); if (errn == 0) { switch(eventCode) { case 0: if (appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen < appHandAnonType_supportedAppProtocolReq_AppProtocol_ARRAY_SIZE) { errn = decode_appHandAppProtocolType(stream, &appHandAnonType_supportedAppProtocolReq->AppProtocol.array[appHandAnonType_supportedAppProtocolReq->AppProtocol.arrayLen++]); } else { errn = EXI_ERROR_OUT_OF_BOUNDS; } grammarID = 5; break; case 1: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; case 5: /* Element[END_ELEMENT] */ errn = decodeNBitUnsignedInteger(stream, 1, &eventCode); if (errn == 0) { switch(eventCode) { case 0: done = 1; grammarID = 6; break; default: errn = EXI_ERROR_UNKOWN_EVENT_CODE; break; } } break; default: errn = EXI_ERROR_UNKOWN_GRAMMAR_ID; break; } if(errn) { done = 1; } } return errn;
errorCode decodeBoolean(EXIStream* strm, boolean* bool_val) { //TODO: when pattern facets are available in the schema datatype - handle it differently DEBUG_MSG(INFO, DEBUG_STREAM_IO, (">> (bool)")); return decodeNBitUnsignedInteger(strm, 1, bool_val); }
errorCode decodeDateTimeValue(EXIStream* strm, EXIType dtType, EXIPDateTime* dt_val) { errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR; Integer year; unsigned int monDay = 0; unsigned int timeVal = 0; boolean presence = FALSE; dt_val->presenceMask = 0; DEBUG_MSG(INFO, DEBUG_STREAM_IO, (">> (dateTime)")); if(dtType == VALUE_TYPE_DATE_TIME || dtType == VALUE_TYPE_DATE || dtType == VALUE_TYPE_YEAR) { /* Year component */ TRY(decodeIntegerValue(strm, &year)); dt_val->dateTime.tm_year = (int)year - 100; } else { dt_val->dateTime.tm_year = INT_MIN; } if(dtType == VALUE_TYPE_DATE_TIME || dtType == VALUE_TYPE_DATE || dtType == VALUE_TYPE_MONTH) { /* MonthDay component */ TRY(decodeNBitUnsignedInteger(strm, 9, &monDay)); dt_val->dateTime.tm_mon = monDay / 32 - 1; dt_val->dateTime.tm_mday = monDay % 32; } else { dt_val->dateTime.tm_mon = INT_MIN; dt_val->dateTime.tm_mday = INT_MIN; } if(dtType == VALUE_TYPE_DATE_TIME || dtType == VALUE_TYPE_TIME) { /* Time component */ TRY(decodeNBitUnsignedInteger(strm, 17, &timeVal)); dt_val->dateTime.tm_hour = (timeVal / 64) / 64; dt_val->dateTime.tm_min = (timeVal / 64) % 64; dt_val->dateTime.tm_sec = timeVal % 64; /* FractionalSecs presence component */ TRY(decodeBoolean(strm, &presence)); if(presence) { UnsignedInteger fSecs = 0; unsigned int tmp = 0; dt_val->presenceMask = dt_val->presenceMask | FRACT_PRESENCE; dt_val->fSecs.offset = 0; dt_val->fSecs.value = 0; /* FractionalSecs component */ TRY(decodeUnsignedInteger(strm, &fSecs)); while(fSecs != 0) { tmp = fSecs % 10; dt_val->fSecs.offset++; if(tmp != 0) { dt_val->fSecs.value = dt_val->fSecs.value*10 + tmp; } fSecs = fSecs / 10; } dt_val->fSecs.offset -= 1; } } else { dt_val->dateTime.tm_hour = INT_MIN; dt_val->dateTime.tm_min = INT_MIN; dt_val->dateTime.tm_sec = INT_MIN; } /* TimeZone presence component */ TRY(decodeBoolean(strm, &presence)); if(presence) { unsigned int tzone = 0; dt_val->presenceMask = dt_val->presenceMask | TZONE_PRESENCE; TRY(decodeNBitUnsignedInteger(strm, 11, &tzone)); dt_val->TimeZone = tzone; } return EXIP_OK; }