⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xltdec.c

📁 SyncML ToolKits,学习syncml的参考工具包.非常好用.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -