📄 xltdec.c
字号:
if ((rc = pDecoder->scanner->nextTok(pDecoder->scanner)) != SML_ERR_OK) return rc; pToken = pDecoder->scanner->curtok; pTagStack = pDecoder->tagstack; if (IS_START(pToken)) { if (pTagStack->push(pTagStack, pToken->tagid)) return SML_ERR_UNSPECIFIC; } else if (IS_END(pToken)) { XltTagID_t lastopen; if (pTagStack->pop(pTagStack, &lastopen)) return SML_ERR_UNSPECIFIC; if (pToken->tagid != lastopen) return SML_ERR_XLT_INVAL_SYNCML_DOC; } return SML_ERR_OK;}Ret_t discardToken(XltDecoderPtr_t pDecoder){ Ret_t rc; XltTagID_t tmp; if ((rc = pDecoder->scanner->pushTok(pDecoder->scanner)) != SML_ERR_OK) return rc; if ((rc = pDecoder->tagstack->pop(pDecoder->tagstack, &tmp)) != SML_ERR_OK) return rc; return SML_ERR_OK;}/*************************************************************************//* Internal Functions *//*************************************************************************/static SmlPcdataPtr_tconcatPCData(SmlPcdataPtr_t pDat1, const SmlPcdataPtr_t pDat2){ if (pDat1->contentType != pDat2->contentType) return NULL; switch (pDat1->contentType) { case SML_PCDATA_STRING: pDat1->content = (VoidPtr_t)smlLibStrcat(pDat1->content, pDat2->content); pDat1->length += pDat2->length; break; case SML_PCDATA_OPAQUE: if ((pDat1->content = smlLibRealloc(pDat1->content, pDat1->length + pDat2->length)) == NULL) return NULL; smlLibMemmove(((Byte_t*)pDat1->content) + pDat1->length, pDat2->content, pDat2->length); pDat1->length += pDat2->length; break; default: return NULL; } return pDat1;}Ret_tbuildSyncHdr(XltDecoderPtr_t pDecoder, VoidPtr_t *ppSyncHdr){ XltDecScannerPtr_t pScanner; SmlSyncHdrPtr_t pSyncHdr; Ret_t rc; Long_t sessionid = 0, msgid = 0, source = 0, target = 0, version = 0, proto = 0; /* shortcut to the scanner object */ pScanner = pDecoder->scanner; /* if ppSyncHdr is not NULL we've already found a SyncHdr before! */ if (*ppSyncHdr != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; /* initialize new SmlSyncHdr */ if ((pSyncHdr = (SmlSyncHdrPtr_t)smlLibMalloc(sizeof(SmlSyncHdr_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pSyncHdr, 0, sizeof(SmlSyncHdr_t)); /* initialize the element type field */ pSyncHdr->elementType = SML_PE_HEADER; /* empty SmlSyncHdr is possible */ if (IS_EMPTY(pScanner->curtok)) { *ppSyncHdr = pSyncHdr; return SML_ERR_OK; } /* get next Token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pSyncHdr); return rc; } /* parse child elements until we find a matching end tag */ while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_VERSION: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->version); version++; break; case TN_PROTO: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->proto); proto++; break; case TN_SESSIONID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->sessionID); sessionid++; break; case TN_MSGID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->msgID); msgid++; break; case TN_RESPURI: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->respURI); break; /* child tags */ case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSyncHdr->target); target++; break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSyncHdr->source); source++; break; case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pSyncHdr->cred); break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->meta); break; /* flags (empty tags) */ case TN_NORESP: pSyncHdr->flags |= SmlNoResp_f; break; default: rc = SML_ERR_XLT_INVAL_SYNCML_DOC; } /* decoding of child element went ok? */ if (rc != SML_ERR_OK) { smlFreeSyncHdr(pSyncHdr); return rc; } /* get next token */ if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeSyncHdr(pSyncHdr); return rc; } } if ((sessionid == 0) || (msgid == 0) || (target == 0) || (source == 0) || (version == 0) || (proto == 0)) { smlFreeSyncHdr(pSyncHdr); return SML_ERR_XLT_INVAL_SYNCML_DOC; } *ppSyncHdr = pSyncHdr; return SML_ERR_OK;}Ret_tbuildSync(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem){ XltDecScannerPtr_t pScanner; SmlSyncPtr_t pSync; Ret_t rc; Long_t cmdid = 0; /* stop decoding the Sync when we find a SyncML command */ Byte_t break_sync = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; /* initialize a new Sync */ if ((pSync = (SmlSyncPtr_t)smlLibMalloc(sizeof(SmlSync_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pSync, 0, sizeof(SmlSync_t)); /* initialize the element type field */ pSync->elementType = SML_PE_SYNC_START; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pSync); return SML_ERR_OK; } /* get next token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pSync); return rc; } /* parse child elements until we find a matching end tag or until we find a TN_ADD, TN_ATOMIC, etc. start tag */ while ((pScanner->curtok->type != TOK_TAG_END) && !break_sync) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->meta); break; case TN_NUMBEROFCHANGES: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->noc); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pSync->cred); break; case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSync->target); break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSync->source); break; /* flags */ case TN_NORESP: pSync->flags |= SmlNoResp_f; break; /* quit if we find an Add, Atomic, etc. element */ case TN_ADD: case TN_ATOMIC: case TN_COPY: case TN_DELETE: case TN_SEQUENCE: case TN_REPLACE: break_sync = 1; break; default: rc = SML_ERR_XLT_INVAL_SYNCML_DOC; } if (rc != SML_ERR_OK) { smlFreeSync(pSync); return rc; } if (!break_sync) { /* get next token and continue as usual */ if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } else { /* we've found a SyncML command - we need to go back one token and correct the tagstack */ if ((rc = discardToken(pDecoder)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } } if (!break_sync) { if ((pScanner->curtok->tagid) != TN_SYNC) { smlFreeSync(pSync); return SML_ERR_XLT_INVAL_SYNCML_DOC; } else { if (pDecoder->tagstack->push(pDecoder->tagstack, pScanner->curtok->tagid)) { smlFreeSync(pSync); return SML_ERR_UNSPECIFIC; } if ((rc = pDecoder->scanner->pushTok(pDecoder->scanner)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } } *ppElem = pSync; return SML_ERR_OK;}#if (defined ATOMIC_RECEIVE || defined SEQUENCE_RECEIVE) Ret_tbuildAtomOrSeq(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem){ XltDecScannerPtr_t pScanner; SmlAtomicPtr_t pAoS; /* SmlAtomicPtr_t and SequencePtr_t are pointer to the same structure! */ Ret_t rc; Byte_t break_aos = 0; /* stop decoding the Atomic when we find a SyncML command */ Long_t cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; if ((pAoS = (SmlAtomicPtr_t)smlLibMalloc(sizeof(SmlAtomic_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pAoS, 0, sizeof(SmlAtomic_t)); /* initialize the element type field */ pAoS->elementType = SML_PE_CMD_GROUP; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pAoS); return SML_ERR_XLT_INVAL_SYNCML_DOC; } /* get next token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree (pAoS); return rc; } /* parse child elements until we find a matching end tag or until we find a TN_ADD, TN_ATOMIC, etc. start tag */ while ((pScanner->curtok->type != TOK_TAG_END) && !break_aos) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pAoS->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pAoS->meta); break; /* flags */ case TN_NORESP: pAoS->flags |= SmlNoResp_f; break; /* quit if we find an Add, Atomic, etc. element */ case TN_ADD: case TN_REPLACE: case TN_DELETE: case TN_COPY: case TN_ATOMIC: case TN_MAP: case TN_SYNC: case TN_GET: case TN_ALERT: case TN_EXEC: break_aos = 1; break; default: rc = SML_ERR_XLT_INVAL_SYNCML_DOC; } if (rc != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } if (!break_aos) { if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } } else { /* we've found a SyncML command - we need to go back one token and correct the tagstack */ if ((rc = discardToken(pDecoder)) != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } } } if (!break_aos) { /* Atomic/Sequence must contain at least one SyncML command */ smlFreeAtomic(pAoS); return SML_ERR_XLT_INVAL_SYNCML_DOC; } if (cmdid == 0) { smlFreeAtomic(pAoS); return SML_ERR_XLT_INVAL_SYNCML_DOC; } *ppElem = pAoS; return SML_ERR_OK;}#endif#ifdef EXEC_RECEIVERet_tbuildExec(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem){ XltDecScannerPtr_t pScanner; SmlExecPtr_t pExec; Ret_t rc; Long_t items = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; if ((pExec = (SmlExecPtr_t)smlLibMalloc(sizeof(SmlExec_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pExec, 0, sizeof(SmlExec_t)); /* initialize the element type field */ pExec->elementType = SML_PE_EXEC; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pExec); return SML_ERR_XLT_INVAL_SYNCML_DOC; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -