📄 xltdec.c
字号:
case TN_CMDREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->cmdRef); break; case TN_CMD: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->cmd); cmd++; break; case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->data); data++; break; case TN_CHAL: rc = buildChal(pDecoder, (VoidPtr_t)&pStatus->chal); break; case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pStatus->cred); break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, (VoidPtr_t)&pStatus->itemList); break; case TN_TARGETREF: rc = appendTargetRefList(pDecoder, (VoidPtr_t)&pStatus->targetRefList); break; case TN_SOURCEREF: rc = appendSourceRefList(pDecoder, (VoidPtr_t)&pStatus->sourceRefList); break; default: rc = SML_ERR_XLT_INVAL_SYNCML_DOC; } if (rc != SML_ERR_OK) { smlFreeStatus(pStatus); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeStatus(pStatus); return rc; } } if ((cmd == 0) || (data == 0) || (cmdid == 0)) { smlFreeStatus(pStatus); return SML_ERR_XLT_INVAL_SYNCML_DOC; } *ppElem = pStatus; return SML_ERR_OK;}#ifdef RESULT_RECEIVERet_tbuildResults(XltDecoderPtr_t pDecoder, VoidPtr_t *ppResults){ XltDecScannerPtr_t pScanner; SmlResultsPtr_t pResults; Ret_t rc; Long_t cmdref = 0, items = 0, cmdid = 0; if (*ppResults != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; pScanner = pDecoder->scanner; if ((pResults = (SmlResultsPtr_t)smlLibMalloc(sizeof(SmlResults_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pResults, 0, sizeof(SmlResults_t)); /* initialize the element type field */ pResults->elementType = SML_PE_RESULTS; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pResults); return SML_ERR_XLT_INVAL_SYNCML_DOC; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pResults); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->cmdID); cmdid++; break; case TN_MSGREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->msgRef); break; case TN_CMDREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->cmdRef); cmdref++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->meta); break; case TN_TARGETREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->targetRef); break; case TN_SOURCEREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->sourceRef); break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, &pResults->itemList); items++; break; default: rc = SML_ERR_XLT_INVAL_SYNCML_DOC; } if (rc != SML_ERR_OK) { smlFreeResults(pResults); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeResults(pResults); return rc; } } if ((cmdref == 0) || (items == 0) || (cmdid == 0)) { smlFreeResults(pResults); return SML_ERR_XLT_INVAL_SYNCML_DOC; } *ppResults = pResults; return SML_ERR_OK;}#endifRet_tbuildPCData(XltDecoderPtr_t pDecoder, VoidPtr_t *ppPCData){ XltDecScannerPtr_t pScanner; SmlPcdataPtr_t pPCData = 0; SmlPcdataExtension_t ext; Ret_t rc; pScanner = pDecoder->scanner; if (*ppPCData != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; if (IS_EMPTY(pScanner->curtok)) { if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); *ppPCData = pPCData; return SML_ERR_OK; } pPCData = NULL; if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { if (rc == SML_ERR_XLT_INVAL_SYNCML_DOC) { /* leaks if dtd failed */ pPCData = pScanner->curtok->pcdata; *ppPCData = pPCData; } return rc; } if (IS_CONTENT(pScanner->curtok)) { /* PCData element has a regular string or opaque content */ while (pScanner->curtok->type == TOK_CONT) { if (pPCData == NULL) pPCData = pScanner->curtok->pcdata; else { pPCData = concatPCData(pPCData, pScanner->curtok->pcdata); smlLibFree(pScanner->curtok->pcdata->content); smlLibFree(pScanner->curtok->pcdata); if (pPCData == NULL) return SML_ERR_XLT_INVAL_PCDATA; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { *ppPCData = pPCData; return rc; } } } else if (IS_START_OR_EMPTY(pScanner->curtok)) { /* PCData element contains an XML dokument that is handled by an extension mechanism */ ext = pScanner->curtok->ext; if ((rc = discardToken(pDecoder)) != SML_ERR_OK) return rc; if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); pPCData->contentType = SML_PCDATA_EXTENSION; pPCData->extension = ext; switch (ext) {#ifdef __USE_METINF__ case SML_EXT_METINF: if ((rc = buildMetInfMetInfCmd(pDecoder, (VoidPtr_t)&pPCData->content)) != SML_ERR_OK) { smlLibFree(pPCData); return rc; } break;#endif#ifdef __USE_DEVINF__ case SML_EXT_DEVINF: if ((rc = buildDevInfDevInfCmd(pDecoder, (VoidPtr_t)&pPCData->content)) != SML_ERR_OK) { smlLibFree(pPCData); return rc; } /* the scanner must point to the closing PCDATA tag */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pPCData); return rc; } break;#endif default: smlFreePcdata(pPCData); return SML_ERR_XLT_INVAL_EXT; } } else if (IS_END(pScanner->curtok)) { /* PCData element is empty */ } else { return SML_ERR_XLT_INVAL_PCDATA; } if (pScanner->curtok->type != TOK_TAG_END) return SML_ERR_XLT_INVAL_PCDATA; if (pPCData == NULL) { if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); } *ppPCData = pPCData; return SML_ERR_OK;}Ret_tbuildPCDataList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppPCData){ SmlPcdataListPtr_t pPCDataList = NULL, pPrev = NULL; pPCDataList = (SmlPcdataListPtr_t) *ppPCData; /* advance to the end of the list, and create ther an empty list element */ while (pPCDataList != NULL) { pPrev = pPCDataList; pPCDataList = pPrev->next; } if ((pPCDataList = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCDataList, 0, sizeof(SmlPcdataList_t)); if (pPrev != NULL) /* we already had some entries in the list */ pPrev->next = pPCDataList; else /* nope we created a new list */ *ppPCData = pPCDataList; pPCDataList->data = NULL; /* at this point pPCDataList should point to an valid list element */ return buildPCData(pDecoder, (VoidPtr_t)&pPCDataList->data);}static Ret_tappendItemList(XltDecoderPtr_t pDecoder, SmlItemListPtr_t *ppItemList){ SmlItemListPtr_t pNewItemList; SmlItemListPtr_t pItemList; Ret_t rc; pItemList = *ppItemList; if (pItemList != NULL) while (pItemList->next != NULL) pItemList = pItemList->next; if ((pNewItemList = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewItemList, 0, sizeof(SmlItemList_t)); if ((rc = buildItem(pDecoder, (VoidPtr_t)&pNewItemList->item)) != SML_ERR_OK) { smlLibFree(pNewItemList); return rc; } if (pItemList == NULL) *ppItemList = pNewItemList; else pItemList->next = pNewItemList; return SML_ERR_OK;}static Ret_tappendSourceList(XltDecoderPtr_t pDecoder, SmlSourceListPtr_t *ppSourceList){ SmlSourceListPtr_t pNewSourceList; SmlSourceListPtr_t pSourceList; Ret_t rc; pSourceList = *ppSourceList; if (pSourceList != NULL) while (pSourceList->next != NULL) pSourceList = pSourceList->next; if ((pNewSourceList = (SmlSourceListPtr_t)smlLibMalloc(sizeof(SmlSourceList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewSourceList, 0, sizeof(SmlSourceList_t)); if ((rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pNewSourceList->source)) != SML_ERR_OK) { smlLibFree(pNewSourceList); return rc; } if (pSourceList == NULL) *ppSourceList = pNewSourceList; else pSourceList->next = pNewSourceList; return SML_ERR_OK;}#ifdef MAPITEM_RECEIVEstatic Ret_tappendMapItemList(XltDecoderPtr_t pDecoder, SmlMapItemListPtr_t *ppMapItemList){ SmlMapItemListPtr_t pNewMapItemList; SmlMapItemListPtr_t pMapItemList; Ret_t rc; pMapItemList = *ppMapItemList; if (pMapItemList != NULL) while (pMapItemList->next != NULL) pMapItemList = pMapItemList->next; if ((pNewMapItemList = (SmlMapItemListPtr_t)smlLibMalloc(sizeof(SmlMapItemList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewMapItemList, 0, sizeof(SmlMapItemList_t)); if ((rc = buildMapItem(pDecoder, (VoidPtr_t)&pNewMapItemList->mapItem)) != SML_ERR_OK) { smlLibFree(pNewMapItemList); return rc; } if (pMapItemList == NULL) *ppMapItemList = pNewMapItemList; else pMapItemList->next = pNewMapItemList; return SML_ERR_OK;}#endifstatic Ret_tappendTargetRefList(XltDecoderPtr_t pDecoder, SmlTargetRefListPtr_t *ppTargetRefList){ SmlTargetRefListPtr_t pNewTargetRefList; SmlTargetRefListPtr_t pTargetRefList; Ret_t rc; pTargetRefList = *ppTargetRefList; if (pTargetRefList != NULL) while (pTargetRefList->next != NULL) pTargetRefList = pTargetRefList->next; if ((pNewTargetRefList = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewTargetRefList, 0, sizeof(SmlTargetRefList_t)); if ((rc = buildPCData(pDecoder, (VoidPtr_t)&pNewTargetRefList->targetRef)) != SML_ERR_OK) { smlFreePcdata(pNewTargetRefList->targetRef); smlLibFree(pNewTargetRefList); return rc; } if (pTargetRefList == NULL) *ppTargetRefList = pNewTargetRefList; else pTargetRefList->next = pNewTargetRefList; return SML_ERR_OK;}static Ret_tappendSourceRefList(XltDecoderPtr_t pDecoder, SmlSourceRefListPtr_t *ppSourceRefList){ SmlSourceRefListPtr_t pNewSourceRefList; SmlSourceRefListPtr_t pSourceRefList; Ret_t rc; pSourceRefList = *ppSourceRefList; if (pSourceRefList != NULL) while (pSourceRefList->next != NULL) pSourceRefList = pSourceRefList->next; if ((pNewSourceRefList = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewSourceRefList, 0, sizeof(SmlSourceRefList_t)); if ((rc = buildPCData(pDecoder, (VoidPtr_t)&pNewSourceRefList->sourceRef)) != SML_ERR_OK) { smlFreePcdata(pNewSourceRefList->sourceRef); smlLibFree(pNewSourceRefList); return rc; } if (pSourceRefList == NULL) *ppSourceRefList = pNewSourceRefList; else pSourceRefList->next = pNewSourceRefList; return SML_ERR_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -