/** * Returns the codepage which belongs to a certain tag ID * * @pre valid tag ID * @post the code page is returned * @param tagID (IN) * the ID of the tag * @param pExt (IN) * the codepage/extention of the tag * @return 0, if OK */ Ret_t getExtById(XltTagID_t tagID, SmlPcdataExtension_t *pExt) { int i = 0; SmlPcdataExtension_t ext; /* Iterate over all defined extensions to find the corresponding TAG. * Empty extensions, e.g. not defined numbers will be skipped. */ for (ext = SML_EXT_UNDEFINED; ext < SML_EXT_LAST; ext++) { TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { continue; /* skip empty codepage */ } i = 0; while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID){ *pExt = ext; return SML_ERR_OK; } i++; } } /* tag not found in any extension */ *pExt = (SmlPcdataExtension_t)255; return SML_ERR_XLT_INVAL_PROTO_ELEM; }
Ret_t getTagString(XltTagID_t tagID, String_t tagString, SmlPcdataExtension_t ext) { // %%% luz 2005-11-11 : added retry loop to try MetInf as a fallback (workaround for ill-formed xml like in sync4j pda clients) do { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { tagString[0] = '\0'; return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID) { String_t _tmp = (pTags+i)->xml; smlLibStrcpy(tagString, _tmp); return SML_ERR_OK; } i++; } // tag not found if (ext==SML_EXT_METINF) break; // already tried with implicit or explicit metinf // try metinf implicitly for ill-formed xml like sync4j clients ext=SML_EXT_METINF; } while(TRUE); tagString[0] = '\0'; return SML_ERR_XLT_INVAL_PROTO_ELEM; }
/** * Returns the tag ID which belongs to a tag string in a certain codepage * * @pre valid tag string, valid code page * @post tag id is returned * @param tag (IN) * the string representation of the tag * @param ext (IN) * code page group for the tag * @param pTagID (IN) * the tag id of the tag * @return 0, if OK */ Ret_t getTagIDByStringAndExt(String_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } for (i=0;((pTags+i)->id) != TN_UNDEF; i++) { if (*(pTags+i)->xml != *tag) continue; // if the first char doesn't match we skip the strcmp to speed things up if (smlLibStrcmp(((pTags+i)->xml), tag) == 0) { *pTagID = (pTags+i)->id; return SML_ERR_OK; } } *pTagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; }
/** * Returns the tag ID which belongs to a tag string in a certain namespace * * @pre valid tag string, valid namespace * @post tag id is returned * @param tag (IN) * the string representation of the tag * @param ns (IN) * namespace group for the tag * @param pTagID (IN) * the tag id of the tag * @return 0, if OK */ Ret_t getTagIDByStringAndNamespace(String_t tag, String_t ns, XltTagID_t *pTagID) { int i = 0; TagPtr_t pTags = getTagTable(getExtByName(ns)); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if ((smlLibStrcmp(((pTags+i)->xml), tag) == 0)) { *pTagID = (pTags+i)->id; return SML_ERR_OK; } i++; } *pTagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; }
/** * Returns a WBXML byte which belongs to a tag ID in a defined codepage. * This function is needed for the WBXML encoding * * @pre valid tag ID, valid code page * @post tag byte is returned * @param tagID (IN) * the ID for the tag * @param ext (IN) * code page group for the tag * @param pTagByte (IN) * the byte representation of the tag * @return 0, if OK */ Ret_t getTagByte(XltTagID_t tagID, SmlPcdataExtension_t ext, Byte_t *pTagByte) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID) { *pTagByte = (pTags+i)->wbxml; return SML_ERR_OK; } i++; } *pTagByte = 0; return SML_ERR_XLT_INVAL_PROTO_ELEM; }
Ret_t getTagString(XltTagID_t tagID, String_t tagString, SmlPcdataExtension_t ext) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { tagString[0] = '\0'; return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if ((((pTags+i)->id) == tagID)) { String_t _tmp = (pTags+i)->xml; smlLibStrcpy(tagString, _tmp); return SML_ERR_OK; } i++; } //smlLibStrcpy(tagString, '\0'); tagString[0] = '\0'; return SML_ERR_XLT_INVAL_PROTO_ELEM; }