Ejemplo n.º 1
0
/* decoder callbacks */
Ret_t buildDmTndCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndPtr_t pDmTnd;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTnd = (SmlDmTndPtr_t)smlLibMalloc(sizeof(SmlDmTnd_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTnd, 0, sizeof(SmlDmTnd_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTnd;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTnd(pDmTnd);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_DMTND_MgmtTree: 
            break;
          case TN_DMTND_VerDTD:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->verdtd);
            break;
          case TN_DMTND_Man:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->man);
            break;
          case TN_DMTND_Mod:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->mod);
            break;
          case TN_DMTND_Node:
            rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTnd->nodelist);
            break;
          default:
              KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeDmTnd(pDmTnd);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeDmTnd(pDmTnd);
            return rc;
        }
    }

    *ppElem = pDmTnd;

    return SML_ERR_OK;
}
Ejemplo n.º 2
0
/* decoder callbacks */
Ret_t buildDmTndTypeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndTypePtr_t pDmTndType;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTndType = (SmlDmTndTypePtr_t)smlLibMalloc(sizeof(SmlDmTndType_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTndType, 0, sizeof(SmlDmTndType_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTndType;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTndType(pDmTndType);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_DMTND_MIME:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->mime);
            break;
          case TN_DMTND_DDFName:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->ddfname);
            break;
          default:
              KCDBG(">>>>>  Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeDmTndType(pDmTndType);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeDmTndType(pDmTndType);
            return rc;
        }
        if (pScanner->curtok->type != TOK_TAG_END) {
            smlFreeDmTndType(pDmTndType);
            return SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
    }

    *ppElem = pDmTndType;

    return SML_ERR_OK;
}
Ejemplo n.º 3
0
Ret_t buildMetInfMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlMetInfMemPtr_t pMem;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pMem = (SmlMetInfMemPtr_t)smlLibMalloc(sizeof(SmlMetInfMem_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pMem, 0, sizeof(SmlMetInfMem_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pMem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeMetinfMem(pMem);
        //smlLibFree(pMem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
				    /* PCDATA elements */
            case TN_METINF_SHAREDMEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->shared);
                break;
            case TN_METINF_FREEMEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->free);
                break;
            case TN_METINF_FREEID:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->freeid);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeMetinfMem(pMem);
            //smlLibFree(pMem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeMetinfMem(pMem);
            //smlLibFree(pMem);
            return rc;
        }
    }
    *ppElem = pMem;

    return SML_ERR_OK;
}
Ejemplo n.º 4
0
Ret_t buildDevInfDSMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlDevInfDSMemPtr_t pElem;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pElem = (SmlDevInfDSMemPtr_t)smlLibMalloc(sizeof(SmlDevInfDSMem_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pElem, 0, sizeof(SmlDevInfDSMem_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pElem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pElem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
    		    /* PCDATA elements */
            case TN_DEVINF_SHAREDMEM:
                // %%% luz:2003-04-28: made work as a flag
                pElem->flags |= SmlDevInfSharedMem_f;
                // rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->shared);
                break;
            case TN_DEVINF_MAXMEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxmem);
                break;
            case TN_DEVINF_MAXID:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxid);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pElem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pElem);
            return rc;
        }
    }
    *ppElem = pElem;

    return SML_ERR_OK;
}
Ejemplo n.º 5
0
/* decoder callbacks */
Ret_t buildMetInfAnchorCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlMetInfAnchorPtr_t pAnchor;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pAnchor = (SmlMetInfAnchorPtr_t)smlLibMalloc(sizeof(SmlMetInfAnchor_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pAnchor, 0, sizeof(SmlMetInfAnchor_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pAnchor;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeMetinfAnchor(pAnchor);
        //smlLibFree(pAnchor);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
            /* PCDATA elements */
            case TN_METINF_LAST:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pAnchor->last);
                break;
            case TN_METINF_NEXT:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pAnchor->next);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeMetinfAnchor(pAnchor);
            //smlLibFree(pAnchor);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeMetinfAnchor(pAnchor);
            //smlLibFree(pAnchor);
            return rc;
        }
    }
    *ppElem = pAnchor;

    return SML_ERR_OK;
}
Ejemplo n.º 6
0
Ret_t buildDevInfXmitCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlDevInfXmitPtr_t pXmit;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pXmit = (SmlDevInfXmitPtr_t)smlLibMalloc(sizeof(SmlDevInfXmit_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pXmit, 0, sizeof(SmlDevInfXmit_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pXmit;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pXmit);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
		    /* PCDATA elements */
            case TN_DEVINF_CTTYPE:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pXmit->cttype);
                break;
            case TN_DEVINF_VERCT:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pXmit->verct);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pXmit);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pXmit);
            return rc;
        }
    }
    *ppElem = pXmit;

    return SML_ERR_OK;
}
Ejemplo n.º 7
0
Ret_t buildDevInfExtCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlDevInfExtPtr_t pElem;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pElem = (SmlDevInfExtPtr_t)smlLibMalloc(sizeof(SmlDevInfExt_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pElem, 0, sizeof(SmlDevInfExt_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pElem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pElem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
            case TN_DEVINF_XNAM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->xnam);
                break;
            case TN_DEVINF_XVAL:
                rc = buildPCDataList(pDecoder, (VoidPtr_t)&pElem->xval);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pElem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pElem);
            return rc;
        }
    }
    *ppElem = pElem;

    return SML_ERR_OK;
}
Ejemplo n.º 8
0
Ret_t buildMetInfMetInfCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlMetInfMetInfPtr_t pMeta;
    Ret_t rc;
    int foundWrapper = 0;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pMeta = (SmlMetInfMetInfPtr_t)smlLibMalloc(sizeof(SmlMetInfMetInf_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pMeta, 0, sizeof(SmlMetInfMetInf_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pMeta;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeMetinfMetinf(pMeta);
        //smlLibFree(pMeta);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_METINF_METINF: /* ignore - it's just the wrapper tag */
            foundWrapper = 1;
            break;
          case TN_METINF_FORMAT:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->format);
            break;
          case TN_METINF_TYPE:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->type);
            break;
          case TN_METINF_MARK:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->mark);
            break;
          case TN_METINF_SIZE:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->size);
            break;
          case TN_METINF_VERSION:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->version);
            break;
          case TN_METINF_NEXTNONCE:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->nextnonce);
            break;
          case TN_METINF_ANCHOR:
            rc = buildMetInfAnchorCmd(pDecoder, (VoidPtr_t)&pMeta->anchor);
            break;
          case TN_METINF_MAXMSGSIZE:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->maxmsgsize);
            break;
          /* SCTSTK - 18/03/2002 S.H. 2002-04-05: SyncML 1.1 */
          case TN_METINF_MAXOBJSIZE:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->maxobjsize);
            break;
          case TN_METINF_MEM:
            rc = buildMetInfMemCmd(pDecoder, (VoidPtr_t)&pMeta->mem);
            break;
          case TN_METINF_EMI:
            rc = buildPCDataList(pDecoder, (VoidPtr_t)&pMeta->emi);
            break;

          /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */
          case TN_METINF_FIELDLEVEL:
            pMeta->flags |= SmlMetInfFieldLevel_f;
            rc = buildEmptyTag(pDecoder); // allow for <tag></tag> instead of <tag/>
            break;

          default:
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeMetinfMetinf(pMeta);
            //smlLibFree(pMeta);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeMetinfMetinf(pMeta);
            //smlLibFree(pMeta);
            return rc;
        }
    }

  if (foundWrapper) {
    /* Optional Metinf root tag was used in this message.
     * The actual token is the closing root tag.
     * It is required that the scanner points to the first tag _after_
     * <MetInf>...</MetInf>, so we just skip to the next token and continue.
     */
      if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeMetinfMetinf(pMeta);
        //smlLibFree(pMeta);
        return rc;
      }
  }
    *ppElem = pMeta;

    return SML_ERR_OK;
}
Ejemplo n.º 9
0
Ret_t buildMetInfMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlMetInfMemPtr_t pMem;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pMem = (SmlMetInfMemPtr_t)smlLibMalloc(sizeof(SmlMetInfMem_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pMem, 0, sizeof(SmlMetInfMem_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pMem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeMetinfMem(pMem);
        //smlLibFree(pMem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
            /* %%% luz 2005-08-24 :this definition was plain wrong - shared is a flag, not Pcdata!
            case TN_METINF_SHAREDMEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->shared);
                break; */

            /* PCDATA elements */
            case TN_METINF_FREEMEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->free);
                break;
            case TN_METINF_FREEID:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->freeid);
                break;

            /* flags */
            case TN_METINF_SHAREDMEM:
                pMem->flags |= SmlMetInfSharedMem_f;
                rc = buildEmptyTag(pDecoder); // allow for <tag></tag> instead of <tag/>
                break;

            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeMetinfMem(pMem);
            //smlLibFree(pMem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeMetinfMem(pMem);
            //smlLibFree(pMem);
            return rc;
        }
    }
    *ppElem = pMem;

    return SML_ERR_OK;
}
Ejemplo n.º 10
0
/* decoder callbacks */
Ret_t buildDmTndFormatCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndFormatPtr_t pDmTndFormat;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTndFormat = (SmlDmTndFormatPtr_t)smlLibMalloc(sizeof(SmlDmTndFormat_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTndFormat, 0, sizeof(SmlDmTndFormat_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTndFormat;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTndFormat(pDmTndFormat);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        VoidPtr_t pContent = smlLibMalloc(6);
        if ( pContent == NULL )
        {
            smlFreeDmTndFormat(pDmTndFormat);
            return SML_ERR_NOT_ENOUGH_SPACE;
        }
        smlLibMemset(pContent, 0, 6);

        switch (pScanner->curtok->tagid) {
          case TN_DMTND_b64:
             smlLibStrcpy(pContent, "b64");
             break;
          case TN_DMTND_bin:
             smlLibStrcpy(pContent, "bin");
             break;
          case TN_DMTND_bool:
             smlLibStrcpy(pContent, "bool");
             break;
          case TN_DMTND_chr:
             smlLibStrcpy(pContent, "chr");
             break;
          case TN_DMTND_int:
             smlLibStrcpy(pContent, "int");
             break;
          case TN_DMTND_node:
             smlLibStrcpy(pContent, "node");
             break;
          case TN_DMTND_null:
             smlLibStrcpy(pContent, "null");
             break;
          case TN_DMTND_xml:
             smlLibStrcpy(pContent, "xml");
             break;
          case TN_DMTND_date:
             smlLibStrcpy(pContent, "date");
             break;
          case TN_DMTND_time:
             smlLibStrcpy(pContent, "time");
             break;
          case TN_DMTND_float:
             smlLibStrcpy(pContent, "float");
            break;
          default:
              KCDBG(">>>>>  Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }

        if (rc != SML_ERR_OK) {
            smlLibFree(pContent);
            smlFreeDmTndFormat(pDmTndFormat);
            return rc;
        }

        rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndFormat->value);
        if (rc != SML_ERR_OK) {
            smlLibFree(pContent);
            smlFreeDmTndFormat(pDmTndFormat);
            return rc;
        }
        pDmTndFormat->value->content = pContent;
        pDmTndFormat->value->length = smlLibStrlen(pContent);

        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pContent);
            smlFreeDmTndFormat(pDmTndFormat);
            return rc;
        }
        if (pScanner->curtok->type != TOK_TAG_END) {
            smlLibFree(pContent);
            smlFreeDmTndFormat(pDmTndFormat);
            return SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
    }

    *ppElem = pDmTndFormat;

    return SML_ERR_OK;
}
Ejemplo n.º 11
0
/* decoder callbacks */
Ret_t buildDmTndNodeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndNodePtr_t pDmTndNode;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTndNode = (SmlDmTndNodePtr_t)smlLibMalloc(sizeof(SmlDmTndNode_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTndNode, 0, sizeof(SmlDmTndNode_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTndNode;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTndNode(pDmTndNode);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_DMTND_NodeName:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->nodename);
            break;
          case TN_DMTND_Path:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->path);
            break;
          case TN_DMTND_RTProperties:
            rc = buildDmTndRTPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->rtprops);
            break;
          case TN_DMTND_DFProperties:
            rc = buildDmTndDFPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->dfprops);
            break;
          case TN_DMTND_Value:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->value);
            break;
          case TN_DMTND_Node:
            rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTndNode->nodelist);
            break;
          default:
              KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            if ( NULL != pDmTndNode->nodename && NULL != pDmTndNode->nodename->content )
            {
              KCDBG(">>>>> buildDmTndDFPropsCmd: Node %s corrupted <<<<<\n", (char *)pDmTndNode->nodename->content);
            }
            smlFreeDmTndNode(pDmTndNode);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeDmTndNode(pDmTndNode);
            return rc;
        }
    }

    *ppElem = pDmTndNode;

    return SML_ERR_OK;
}
Ejemplo n.º 12
0
/* decoder callbacks */
Ret_t buildDmTndDFPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndDFPropsPtr_t pDmTndDFProps;
    Ret_t rc = SML_ERR_OK;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTndDFProps = (SmlDmTndDFPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndDFProps_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTndDFProps, 0, sizeof(SmlDmTndDFProps_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTndDFProps;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTndDFProps(pDmTndDFProps);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_DMTND_AccessType:
            rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->accesstype);
            break;
          case TN_DMTND_DefaultValue:
            rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->defaultvalue);
            break;
          case TN_DMTND_Description:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->description);
            break;
          case TN_DMTND_DFFormat:
            rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dfformat);
            break;
          case TN_DMTND_Occurrence:
            rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->occurrence);
            break;
          case TN_DMTND_Scope:
            rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->scope);
            break;
          case TN_DMTND_DFTitle:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftitle);
            break;
          case TN_DMTND_DFType:
            rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftype);
            break;
          case TN_DMTND_CaseSense:
            rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->casesense);
            break;
          default:
              KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeDmTndDFProps(pDmTndDFProps);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeDmTndDFProps(pDmTndDFProps);
            return rc;
        }
    }

    *ppElem = pDmTndDFProps;

    return SML_ERR_OK;
}
Ejemplo n.º 13
0
/* decoder callbacks */
Ret_t buildDmTndRTPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
{
    XltDecScannerPtr_t pScanner;
    SmlDmTndRTPropsPtr_t pDmTndRTProps;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pDmTndRTProps = (SmlDmTndRTPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndRTProps_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pDmTndRTProps, 0, sizeof(SmlDmTndRTProps_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pDmTndRTProps;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlFreeDmTndRTProps(pDmTndRTProps);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
          case TN_DMTND_ACL:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->acl);
            break;
          case TN_DMTND_Format:
            rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->format);
            break;
          case TN_DMTND_Name:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->name);
            break;
          case TN_DMTND_Size:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->size);
            break;
          case TN_DMTND_Title:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->title);
            break;
          case TN_DMTND_TStamp:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->tstamp);
            break;
          case TN_DMTND_Type:
            rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->type);
            break;
          case TN_DMTND_VerNo:
            rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->verno);
            break;
          default:
              KCDBG(">>>>> buildDmTndRTPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
              rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlFreeDmTndRTProps(pDmTndRTProps);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlFreeDmTndRTProps(pDmTndRTProps);
            return rc;
        }
    }

    *ppElem = pDmTndRTProps;

    return SML_ERR_OK;
}
Ejemplo n.º 14
0
Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    SmlDevInfCtcapListPtr_t       pCtcap        = NULL, pPrev = NULL;
    SmlDevInfCTDataPropListPtr_t  pOldProp      = NULL, pProp = NULL;
    SmlDevInfCTDataListPtr_t      pOldParam     = NULL, pParam = NULL;
    SmlDevInfCtcapListPtr_t       pElem         = NULL;
    XltDecScannerPtr_t            pScanner;
    Ret_t rc;

    pElem = (SmlDevInfCtcapListPtr_t) *ppElem;
    pScanner = pDecoder->scanner;

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pElem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pElem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
        case TN_DEVINF_CTTYPE:        
            pCtcap = (SmlDevInfCtcapListPtr_t) *ppElem;
            /* advance to the end of the list, and create ther an empty list element */
            while (pCtcap != NULL) {
	            pPrev = pCtcap;
	            pCtcap = pPrev->next;
            }
            if ((pCtcap = (SmlDevInfCtcapListPtr_t)smlLibMalloc(sizeof(SmlDevInfCtcapList_t))) == NULL)
                return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pCtcap, 0, sizeof(SmlDevInfCtcapList_t));
            if (pPrev != NULL) /* we already had some entries in the list */
	            pPrev->next = pCtcap;
            else /* nope we created a new list */
	            *ppElem = pCtcap;
            pCtcap->data = (SmlDevInfCTCapPtr_t)smlLibMalloc(sizeof(SmlDevInfCTCap_t));
            if (pCtcap->data == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pCtcap->data, 0, sizeof(SmlDevInfCTCap_t));
            rc = buildPCData(pDecoder, (VoidPtr_t)&pCtcap->data->cttype);
            break;
        case TN_DEVINF_PROPNAME:
            pCtcap = (SmlDevInfCtcapListPtr_t) *ppElem;
            if (pCtcap == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            while (pCtcap->next != NULL) {
                pPrev = pCtcap;
                pCtcap = pCtcap->next;
            }
            /* here we are at the latest defined DevInfCTCapPtr_t */
            /* now we need to create a new DevInfCTDataPtr_t element, tostore the properties name */
            pOldProp = NULL;
            pProp    = pCtcap->data->prop;
            while (pProp != NULL) {
                pOldProp = pProp;
                pProp = pProp->next;
            }
            pProp = (SmlDevInfCTDataPropListPtr_t) smlLibMalloc(sizeof(SmlDevInfCTDataPropList_t));
            if (pProp == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pProp, 0, sizeof(SmlDevInfCTDataPropList_t));
            if (pOldProp != NULL)
                pOldProp->next = pProp;
            else 
                pCtcap->data->prop = pProp;
            pProp->data = (SmlDevInfCTDataPropPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataProp_t));
            if (pProp->data == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pProp->data, 0, sizeof(SmlDevInfCTDataProp_t));
            pProp->data->prop = (SmlDevInfCTDataPtr_t)smlLibMalloc(sizeof(SmlDevInfCTData_t));
            if (pProp->data->prop == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pProp->data->prop, 0, sizeof(SmlDevInfCTData_t));
            rc = buildPCData(pDecoder, (VoidPtr_t)&pProp->data->prop->name);
            break;
        case TN_DEVINF_PARAMNAME:
            pCtcap = (SmlDevInfCtcapListPtr_t) *ppElem;
            if (pCtcap == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            while (pCtcap->next != NULL) {
                pPrev = pCtcap;
                pCtcap = pCtcap->next;
            }
            /* here we are at the latest defined DevInfCTCapPtr_t */
            pProp    = pCtcap->data->prop;
            if (pProp == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            while (pProp->next != NULL) {
                pProp = pProp->next;
            }
            /* here we are at the latest defined PropList Element in the latest defined CTCap element */
            /* now lets insert a new Param element into this property */
            pOldParam = NULL;
            pParam = pProp->data->param;
            while (pParam != NULL) {
                pOldParam = pParam;
                pParam    = pParam->next;
            }
            pParam = (SmlDevInfCTDataListPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataList_t));
            if (pParam == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pParam, 0, sizeof(SmlDevInfCTDataList_t));
            if (pOldParam != NULL)
                pOldParam->next = pParam;
            else
                pProp->data->param = pParam;
            pParam->data = (SmlDevInfCTDataPtr_t)smlLibMalloc(sizeof(SmlDevInfCTData_t));
            if (pParam->data == NULL) return SML_ERR_NOT_ENOUGH_SPACE;
            smlLibMemset(pParam->data, 0, sizeof(SmlDevInfCTData_t));
            rc = buildPCData(pDecoder, (VoidPtr_t)&pParam->data->name);
            break;
        case TN_DEVINF_DISPLAYNAME:
        case TN_DEVINF_VALENUM:
        case TN_DEVINF_DATATYPE:
        case TN_DEVINF_SIZE:
            /* The code for the above 4 is basically the same.
             * The hardpart is finding the right SmlDevInfCTDataPtr_t
             * struct, as it can be either within a Property or an Parameter.
             */
            pCtcap = (SmlDevInfCtcapListPtr_t) *ppElem;
            if (pCtcap == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            while (pCtcap->next != NULL) {
                pCtcap = pCtcap->next;
            }
            /* here we are at the latest defined DevInfCTCapPtr_t */
            pProp    = pCtcap->data->prop;
            if (pProp == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            while (pProp->next != NULL) {
                pProp = pProp->next;
            }

            if (pProp->data == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            if (pProp->data->prop == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
            if (pProp->data->param == NULL) {
                /* No Param's yet so we have Property fields to fill */
                switch(pScanner->curtok->tagid) {
                case TN_DEVINF_DISPLAYNAME:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pProp->data->prop->dname);
                    break;
                case TN_DEVINF_VALENUM:
                    rc = buildPCDataList(pDecoder, (VoidPtr_t)&pProp->data->prop->valenum);
                    break;
                case TN_DEVINF_DATATYPE:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pProp->data->prop->datatype);
                    break;
                case TN_DEVINF_SIZE:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pProp->data->prop->size);
                    break;
                default:
                    break;
                }
            } else {
                pParam = pProp->data->param;
                while (pParam->next != NULL) {
                    pParam = pParam->next;
                }
                if (pParam->data == NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC;
                switch(pScanner->curtok->tagid) {
                case TN_DEVINF_DISPLAYNAME:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pParam->data->dname);
                    break;
                case TN_DEVINF_VALENUM:
                    rc = buildPCDataList(pDecoder, (VoidPtr_t)&pParam->data->valenum);
                    break;
                case TN_DEVINF_DATATYPE:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pParam->data->datatype);
                    break;
                case TN_DEVINF_SIZE:
                    rc = buildPCData(pDecoder, (VoidPtr_t)&pParam->data->size);
                    break;
                default:
                    break;
                }
            }
            break;
        default:
            rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pElem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pElem);
            return rc;
        }
    } /* eof while */
    pElem = *ppElem;
    return SML_ERR_OK;
}
Ejemplo n.º 15
0
Ret_t buildDevInfDataStoreCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlDevInfDatastorePtr_t pElem;
    Ret_t rc;

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pElem = (SmlDevInfDatastorePtr_t)smlLibMalloc(sizeof(SmlDevInfDatastore_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pElem, 0, sizeof(SmlDevInfDatastore_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pElem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pElem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
		    /* PCDATA elements */
            case TN_DEVINF_SOURCEREF:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->sourceref);
                break;
            case TN_DEVINF_DISPLAYNAME:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->displayname);
                break;
            case TN_DEVINF_MAXGUIDSIZE:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxguidsize);
                break;
            case TN_DEVINF_RXPREF:
                rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&pElem->rxpref);
                break;
            case TN_DEVINF_TXPREF:
                rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&pElem->txpref);
                break;
            case TN_DEVINF_RX:
                rc = buildDevInfXmitList(pDecoder, (VoidPtr_t)&pElem->rx);
                break;
            case TN_DEVINF_TX:
                rc = buildDevInfXmitList(pDecoder, (VoidPtr_t)&pElem->tx);
                break;
            case TN_DEVINF_DSMEM:
                rc = buildDevInfDSMemCmd(pDecoder, (VoidPtr_t)&pElem->dsmem);
                break;
            case TN_DEVINF_SYNCCAP:
                rc = buildDevInfSyncCapCmd(pDecoder, (VoidPtr_t)&pElem->synccap);
                break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pElem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pElem);
            return rc;
        }
    }
    *ppElem = pElem;

    return SML_ERR_OK;
}
Ejemplo n.º 16
0
Ret_t buildDevInfDevInfContent(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) {
    XltDecScannerPtr_t pScanner;
    SmlDevInfDevInfPtr_t pElem;
    Ret_t rc;
	/* Modified by Tomy to allow <UTC></UTC>, <SupportNumberOfChanges></SupportNumberOfChanges> and <SupportLargeObjs></SupportLargeObjs> */
	SmlPcdataPtr_t tmp_ptr;
	/* End modified by Tomy */

    pScanner = pDecoder->scanner;

    if (*ppElem != NULL)
        return SML_ERR_XLT_INVAL_SYNCML_DOC;

    if ((pElem = (SmlDevInfDevInfPtr_t)smlLibMalloc(sizeof(SmlDevInfDevInf_t))) == NULL)
        return SML_ERR_NOT_ENOUGH_SPACE;
    smlLibMemset(pElem, 0, sizeof(SmlDevInfDevInf_t));

    if (IS_EMPTY(pScanner->curtok)) {
        *ppElem = pElem;
        return SML_ERR_OK;
    }

    if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
        smlLibFree(pElem);
        return rc;
    }

    while (pScanner->curtok->type != TOK_TAG_END) {
        switch (pScanner->curtok->tagid) {
            case TN_DEVINF_VERDTD:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->verdtd);
                break;
            case TN_DEVINF_MAN:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->man);
                break;
            case TN_DEVINF_MOD:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->mod);
                break;
            case TN_DEVINF_OEM:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->oem);
                break;
            case TN_DEVINF_FWV:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->fwv);
                break;
            case TN_DEVINF_SWV:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->swv);
                break;
            case TN_DEVINF_HWV:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->hwv);
                break;
            case TN_DEVINF_DEVID:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->devid);
                break;
            case TN_DEVINF_DEVTYP:
                rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->devtyp);
                break;
            case TN_DEVINF_DATASTORE:
                rc = buildDevInfDataStoreList(pDecoder, (VoidPtr_t)&pElem->datastore);
                break;
            case TN_DEVINF_CTCAP:
                rc = buildDevInfCtcap(pDecoder, (VoidPtr_t)&pElem->ctcap);
                break;
            case TN_DEVINF_EXT:
                rc = buildDevInfExtList(pDecoder, (VoidPtr_t)&pElem->ext);
                break;
            /* SCTSTK - 18/03/2002 S.H. 2002-04-05 : SyncML 1.1 */
            case TN_DEVINF_UTC:
                pElem->flags |= SmlDevInfUTC_f;
				/* Modified by Tomy to allow <UTC></UTC> */
				tmp_ptr = NULL;
				rc = buildPCData(pDecoder, (VoidPtr_t)&tmp_ptr);
				if (tmp_ptr->contentType != SML_PCDATA_UNDEFINED && tmp_ptr->extension != SML_EXT_UNDEFINED && tmp_ptr->length != 0 && tmp_ptr->content != NULL) rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
				/* End modified by Tomy */
                break;
            case TN_DEVINF_NOFM:
                pElem->flags |= SmlDevInfNOfM_f;
				/* Modified by Tomy to allow <SupportNumberOfChanges></SupportNumberOfChanges> */
				tmp_ptr = NULL;
				rc = buildPCData(pDecoder, (VoidPtr_t)&tmp_ptr);
				if (tmp_ptr->contentType != SML_PCDATA_UNDEFINED && tmp_ptr->extension != SML_EXT_UNDEFINED && tmp_ptr->length != 0 && tmp_ptr->content != NULL) rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
				/* End modified by Tomy */
               break;
            case TN_DEVINF_LARGEOBJECT:
                pElem->flags |= SmlDevInfLargeObject_f;
				/* Modified by Tomy to allow <SupportLargeObjs></SupportLargeObjs> */
				tmp_ptr = NULL;
				rc = buildPCData(pDecoder, (VoidPtr_t)&tmp_ptr);
				if (tmp_ptr->contentType != SML_PCDATA_UNDEFINED && tmp_ptr->extension != SML_EXT_UNDEFINED && tmp_ptr->length != 0 && tmp_ptr->content != NULL) rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
				/* End modified by Tomy */
               break;
            default:
                rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
        }
        if (rc != SML_ERR_OK) {
            smlLibFree(pElem);
            return rc;
        }
        if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
            smlLibFree(pElem);
            return rc;
        }
    }
    *ppElem = pElem;

    return SML_ERR_OK;
}