Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*--------------------------------------------------------------------------------------------------
     18 
     19    Header Name: xltdmtnd.c
     20 
     21    General Description: XLT DM TND related functions
     22 
     23 --------------------------------------------------------------------------------------------------*/
     24 
     25 #include "define.h"
     26 
     27 #ifdef __USE_DMTND__
     28 #include "smldmtnddtd.h"
     29 
     30 #include "xlttags.h"
     31 #include "xltdmtnd.h"
     32 #include "xlttagtbl.h"
     33 #include "xltenc.h"
     34 #include "xltencwbxml.h"
     35 
     36 #include <define.h>
     37 #include <libstr.h>
     38 #include <smlerr.h>
     39 #include <libmem.h>
     40 #include <libutil.h>
     41 /* extern */
     42 extern SML_API void smlFreeDmTndFormat(SmlDmTndFormatPtr_t data);
     43 extern SML_API void smlFreeDmTndType(SmlDmTndTypePtr_t data);
     44 extern SML_API void smlFreeDmTndDFElement(SmlDmTndDFElementPtr_t data);
     45 extern SML_API void smlFreeDmTndRTProps(SmlDmTndRTPropsPtr_t data);
     46 extern SML_API void smlFreeDmTndDFProps(SmlDmTndDFPropsPtr_t data);
     47 extern SML_API void smlFreeDmTndNode(SmlDmTndNodePtr_t data);
     48 extern SML_API void smlFreeDmTndNodeList(SmlDmTndNodeListPtr_t data);
     49 extern SML_API void smlFreeDmTnd(SmlDmTndPtr_t data);
     50 
     51 Ret_t buildDmTndNodeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem);
     52 
     53 /* decoder callbacks */
     54 Ret_t buildDmTndFormatCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
     55 {
     56     XltDecScannerPtr_t pScanner;
     57     SmlDmTndFormatPtr_t pDmTndFormat;
     58     Ret_t rc;
     59 
     60     pScanner = pDecoder->scanner;
     61 
     62     if (*ppElem != NULL)
     63         return SML_ERR_XLT_INVAL_SYNCML_DOC;
     64 
     65     if ((pDmTndFormat = (SmlDmTndFormatPtr_t)smlLibMalloc(sizeof(SmlDmTndFormat_t))) == NULL)
     66         return SML_ERR_NOT_ENOUGH_SPACE;
     67     smlLibMemset(pDmTndFormat, 0, sizeof(SmlDmTndFormat_t));
     68 
     69     if (IS_EMPTY(pScanner->curtok)) {
     70         *ppElem = pDmTndFormat;
     71         return SML_ERR_OK;
     72     }
     73 
     74     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
     75         smlFreeDmTndFormat(pDmTndFormat);
     76         return rc;
     77     }
     78 
     79     while (pScanner->curtok->type != TOK_TAG_END) {
     80         VoidPtr_t pContent = smlLibMalloc(6);
     81         if ( pContent == NULL )
     82         {
     83             smlFreeDmTndFormat(pDmTndFormat);
     84             return SML_ERR_NOT_ENOUGH_SPACE;
     85         }
     86         smlLibMemset(pContent, 0, 6);
     87 
     88         switch (pScanner->curtok->tagid) {
     89           case TN_DMTND_b64:
     90              smlLibStrcpy(pContent, "b64");
     91              break;
     92           case TN_DMTND_bin:
     93              smlLibStrcpy(pContent, "bin");
     94              break;
     95           case TN_DMTND_bool:
     96              smlLibStrcpy(pContent, "bool");
     97              break;
     98           case TN_DMTND_chr:
     99              smlLibStrcpy(pContent, "chr");
    100              break;
    101           case TN_DMTND_int:
    102              smlLibStrcpy(pContent, "int");
    103              break;
    104           case TN_DMTND_node:
    105              smlLibStrcpy(pContent, "node");
    106              break;
    107           case TN_DMTND_null:
    108              smlLibStrcpy(pContent, "null");
    109              break;
    110           case TN_DMTND_xml:
    111              smlLibStrcpy(pContent, "xml");
    112              break;
    113           case TN_DMTND_date:
    114              smlLibStrcpy(pContent, "date");
    115              break;
    116           case TN_DMTND_time:
    117              smlLibStrcpy(pContent, "time");
    118              break;
    119           case TN_DMTND_float:
    120              smlLibStrcpy(pContent, "float");
    121             break;
    122           default:
    123               KCDBG(">>>>>  Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    124               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    125         }
    126 
    127         if (rc != SML_ERR_OK) {
    128             smlLibFree(pContent);
    129             smlFreeDmTndFormat(pDmTndFormat);
    130             return rc;
    131         }
    132 
    133         rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndFormat->value);
    134         if (rc != SML_ERR_OK) {
    135             smlLibFree(pContent);
    136             smlFreeDmTndFormat(pDmTndFormat);
    137             return rc;
    138         }
    139         pDmTndFormat->value->content = pContent;
    140         pDmTndFormat->value->length = smlLibStrlen(pContent);
    141 
    142         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    143             smlLibFree(pContent);
    144             smlFreeDmTndFormat(pDmTndFormat);
    145             return rc;
    146         }
    147         if (pScanner->curtok->type != TOK_TAG_END) {
    148             smlLibFree(pContent);
    149             smlFreeDmTndFormat(pDmTndFormat);
    150             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    151         }
    152     }
    153 
    154     *ppElem = pDmTndFormat;
    155 
    156     return SML_ERR_OK;
    157 }
    158 
    159 /* decoder callbacks */
    160 Ret_t buildDmTndTypeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    161 {
    162     XltDecScannerPtr_t pScanner;
    163     SmlDmTndTypePtr_t pDmTndType;
    164     Ret_t rc;
    165 
    166     pScanner = pDecoder->scanner;
    167 
    168     if (*ppElem != NULL)
    169         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    170 
    171     if ((pDmTndType = (SmlDmTndTypePtr_t)smlLibMalloc(sizeof(SmlDmTndType_t))) == NULL)
    172         return SML_ERR_NOT_ENOUGH_SPACE;
    173     smlLibMemset(pDmTndType, 0, sizeof(SmlDmTndType_t));
    174 
    175     if (IS_EMPTY(pScanner->curtok)) {
    176         *ppElem = pDmTndType;
    177         return SML_ERR_OK;
    178     }
    179 
    180     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    181         smlFreeDmTndType(pDmTndType);
    182         return rc;
    183     }
    184 
    185     while (pScanner->curtok->type != TOK_TAG_END) {
    186         switch (pScanner->curtok->tagid) {
    187           case TN_DMTND_MIME:
    188             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->mime);
    189             break;
    190           case TN_DMTND_DDFName:
    191             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->ddfname);
    192             break;
    193           default:
    194               KCDBG(">>>>>  Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    195               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    196         }
    197         if (rc != SML_ERR_OK) {
    198             smlFreeDmTndType(pDmTndType);
    199             return rc;
    200         }
    201         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    202             smlFreeDmTndType(pDmTndType);
    203             return rc;
    204         }
    205         if (pScanner->curtok->type != TOK_TAG_END) {
    206             smlFreeDmTndType(pDmTndType);
    207             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    208         }
    209     }
    210 
    211     *ppElem = pDmTndType;
    212 
    213     return SML_ERR_OK;
    214 }
    215 
    216 /* decoder callbacks */
    217 Ret_t buildDmTndDFElementCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    218 {
    219     XltDecScannerPtr_t pScanner;
    220     SmlDmTndDFElementPtr_t pDmTndDFElement;
    221     Ret_t rc;
    222 
    223     pScanner = pDecoder->scanner;
    224 
    225     if (*ppElem != NULL)
    226         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    227 
    228     if ((pDmTndDFElement = (SmlDmTndDFElementPtr_t)smlLibMalloc(sizeof(SmlDmTndDFElement_t))) == NULL)
    229         return SML_ERR_NOT_ENOUGH_SPACE;
    230     smlLibMemset(pDmTndDFElement, 0, sizeof(SmlDmTndDFElement_t));
    231 
    232     if (IS_EMPTY(pScanner->curtok)) {
    233         *ppElem = pDmTndDFElement;
    234         return SML_ERR_OK;
    235     }
    236 
    237     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    238         smlFreeDmTndDFElement(pDmTndDFElement);
    239         return rc;
    240     }
    241 
    242     while (pScanner->curtok->type != TOK_TAG_END) {
    243         VoidPtr_t pContent = smlLibMalloc(10);
    244         if ( pContent == NULL )
    245         {
    246             smlFreeDmTndDFElement(pDmTndDFElement);
    247             return SML_ERR_NOT_ENOUGH_SPACE;
    248         }
    249         smlLibMemset(pContent, 0, 10);
    250 
    251         switch (pScanner->curtok->tagid) {
    252           /* AccessType Elements */
    253           case TN_DMTND_Add:
    254              smlLibStrcpy(pContent, "Add");
    255              break;
    256           case TN_DMTND_Copy:
    257              smlLibStrcpy(pContent, "Copy");
    258              break;
    259           case TN_DMTND_Delete:
    260              smlLibStrcpy(pContent, "Delete");
    261              break;
    262           case TN_DMTND_Exec:
    263              smlLibStrcpy(pContent, "Exec");
    264              break;
    265           case TN_DMTND_Get:
    266              smlLibStrcpy(pContent, "Get");
    267              break;
    268           case TN_DMTND_Replace:
    269              smlLibStrcpy(pContent, "Replace");
    270              break;
    271           /* Occurrence Elements */
    272           case TN_DMTND_One:
    273              smlLibStrcpy(pContent, "One");
    274              break;
    275           case TN_DMTND_ZeroOrOne:
    276              smlLibStrcpy(pContent, "ZeroOrOne");
    277              break;
    278           case TN_DMTND_ZeroOrMore:
    279              smlLibStrcpy(pContent, "ZeroOrMore");
    280              break;
    281           case TN_DMTND_OneOrMore:
    282              smlLibStrcpy(pContent, "OneOrMore");
    283              break;
    284           case TN_DMTND_ZeroOrN:
    285              smlLibStrcpy(pContent, "ZeroOrN");
    286              break;
    287           case TN_DMTND_OneOrN:
    288              smlLibStrcpy(pContent, "OneOrN");
    289              break;
    290           /* Scope Elements */
    291           case TN_DMTND_Permanent:
    292              smlLibStrcpy(pContent, "Permanent");
    293              break;
    294           case TN_DMTND_Dynamic:
    295              smlLibStrcpy(pContent, "Dynamic");
    296              break;
    297           /* CaseSense Elements */
    298           case TN_DMTND_CS:
    299              smlLibStrcpy(pContent, "CS");
    300              break;
    301           case TN_DMTND_CIS:
    302              smlLibStrcpy(pContent, "CIS");
    303              break;
    304           default:
    305               KCDBG(">>>>> buildDmTndDFElementCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    306               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    307         }
    308         if (rc != SML_ERR_OK) {
    309             smlFreeDmTndDFElement(pDmTndDFElement);
    310             return rc;
    311         }
    312         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    313             smlFreeDmTndDFElement(pDmTndDFElement);
    314             return rc;
    315         }
    316         if (pScanner->curtok->type != TOK_TAG_END) {
    317             smlFreeDmTndDFElement(pDmTndDFElement);
    318             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    319         }
    320     }
    321 
    322     *ppElem = pDmTndDFElement;
    323 
    324     return SML_ERR_OK;
    325 }
    326 
    327 /* decoder callbacks */
    328 Ret_t buildDmTndRTPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    329 {
    330     XltDecScannerPtr_t pScanner;
    331     SmlDmTndRTPropsPtr_t pDmTndRTProps;
    332     Ret_t rc;
    333 
    334     pScanner = pDecoder->scanner;
    335 
    336     if (*ppElem != NULL)
    337         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    338 
    339     if ((pDmTndRTProps = (SmlDmTndRTPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndRTProps_t))) == NULL)
    340         return SML_ERR_NOT_ENOUGH_SPACE;
    341     smlLibMemset(pDmTndRTProps, 0, sizeof(SmlDmTndRTProps_t));
    342 
    343     if (IS_EMPTY(pScanner->curtok)) {
    344         *ppElem = pDmTndRTProps;
    345         return SML_ERR_OK;
    346     }
    347 
    348     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    349         smlFreeDmTndRTProps(pDmTndRTProps);
    350         return rc;
    351     }
    352 
    353     while (pScanner->curtok->type != TOK_TAG_END) {
    354         switch (pScanner->curtok->tagid) {
    355           case TN_DMTND_ACL:
    356             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->acl);
    357             break;
    358           case TN_DMTND_Format:
    359             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->format);
    360             break;
    361           case TN_DMTND_Name:
    362             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->name);
    363             break;
    364           case TN_DMTND_Size:
    365             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->size);
    366             break;
    367           case TN_DMTND_Title:
    368             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->title);
    369             break;
    370           case TN_DMTND_TStamp:
    371             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->tstamp);
    372             break;
    373           case TN_DMTND_Type:
    374             rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->type);
    375             break;
    376           case TN_DMTND_VerNo:
    377             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->verno);
    378             break;
    379           default:
    380               KCDBG(">>>>> buildDmTndRTPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    381               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    382         }
    383         if (rc != SML_ERR_OK) {
    384             smlFreeDmTndRTProps(pDmTndRTProps);
    385             return rc;
    386         }
    387         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    388             smlFreeDmTndRTProps(pDmTndRTProps);
    389             return rc;
    390         }
    391     }
    392 
    393     *ppElem = pDmTndRTProps;
    394 
    395     return SML_ERR_OK;
    396 }
    397 
    398 /* decoder callbacks */
    399 Ret_t buildDmTndDFPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    400 {
    401     XltDecScannerPtr_t pScanner;
    402     SmlDmTndDFPropsPtr_t pDmTndDFProps;
    403     Ret_t rc = SML_ERR_OK;
    404 
    405     pScanner = pDecoder->scanner;
    406 
    407     if (*ppElem != NULL)
    408         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    409 
    410     if ((pDmTndDFProps = (SmlDmTndDFPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndDFProps_t))) == NULL)
    411         return SML_ERR_NOT_ENOUGH_SPACE;
    412     smlLibMemset(pDmTndDFProps, 0, sizeof(SmlDmTndDFProps_t));
    413 
    414     if (IS_EMPTY(pScanner->curtok)) {
    415         *ppElem = pDmTndDFProps;
    416         return SML_ERR_OK;
    417     }
    418 
    419     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    420         smlFreeDmTndDFProps(pDmTndDFProps);
    421         return rc;
    422     }
    423 
    424     while (pScanner->curtok->type != TOK_TAG_END) {
    425         switch (pScanner->curtok->tagid) {
    426           case TN_DMTND_AccessType:
    427             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->accesstype);
    428             break;
    429           case TN_DMTND_DefaultValue:
    430             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->defaultvalue);
    431             break;
    432           case TN_DMTND_Description:
    433             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->description);
    434             break;
    435           case TN_DMTND_DFFormat:
    436             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dfformat);
    437             break;
    438           case TN_DMTND_Occurrence:
    439             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->occurrence);
    440             break;
    441           case TN_DMTND_Scope:
    442             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->scope);
    443             break;
    444           case TN_DMTND_DFTitle:
    445             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftitle);
    446             break;
    447           case TN_DMTND_DFType:
    448             rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftype);
    449             break;
    450           case TN_DMTND_CaseSense:
    451             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->casesense);
    452             break;
    453           default:
    454               KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    455               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    456         }
    457         if (rc != SML_ERR_OK) {
    458             smlFreeDmTndDFProps(pDmTndDFProps);
    459             return rc;
    460         }
    461         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    462             smlFreeDmTndDFProps(pDmTndDFProps);
    463             return rc;
    464         }
    465     }
    466 
    467     *ppElem = pDmTndDFProps;
    468 
    469     return SML_ERR_OK;
    470 }
    471 
    472 Ret_t buildDmTndNodeList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    473 {
    474     SmlDmTndNodeListPtr_t pElem = NULL, pPrev = NULL;
    475 
    476     pElem = (SmlDmTndNodeListPtr_t) *ppElem;
    477     /* advance to the end of the list, and create ther an empty list element */
    478     while (pElem != NULL) {
    479         pPrev = pElem;
    480         pElem = pPrev->next;
    481     }
    482     if ((pElem = (SmlDmTndNodeListPtr_t)smlLibMalloc(sizeof(SmlDmTndNodeListPtr_t))) == NULL)
    483         return SML_ERR_NOT_ENOUGH_SPACE;
    484     smlLibMemset(pElem, 0, sizeof(SmlDmTndNodeListPtr_t));
    485     pElem->next = NULL;
    486     if (pPrev != NULL) /* we already had some entries in the list */
    487         pPrev->next = pElem;
    488     else /* nope we created a new list */
    489         *ppElem = pElem;
    490     pElem->node = NULL;
    491     /* at this point pElem should point to an valid list element */
    492     return buildDmTndNodeCmd(pDecoder, (VoidPtr_t)&pElem->node);
    493 }
    494 
    495 /* decoder callbacks */
    496 Ret_t buildDmTndNodeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    497 {
    498     XltDecScannerPtr_t pScanner;
    499     SmlDmTndNodePtr_t pDmTndNode;
    500     Ret_t rc;
    501 
    502     pScanner = pDecoder->scanner;
    503 
    504     if (*ppElem != NULL)
    505         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    506 
    507     if ((pDmTndNode = (SmlDmTndNodePtr_t)smlLibMalloc(sizeof(SmlDmTndNode_t))) == NULL)
    508         return SML_ERR_NOT_ENOUGH_SPACE;
    509     smlLibMemset(pDmTndNode, 0, sizeof(SmlDmTndNode_t));
    510 
    511     if (IS_EMPTY(pScanner->curtok)) {
    512         *ppElem = pDmTndNode;
    513         return SML_ERR_OK;
    514     }
    515 
    516     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    517         smlFreeDmTndNode(pDmTndNode);
    518         return rc;
    519     }
    520 
    521     while (pScanner->curtok->type != TOK_TAG_END) {
    522         switch (pScanner->curtok->tagid) {
    523           case TN_DMTND_NodeName:
    524             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->nodename);
    525             break;
    526           case TN_DMTND_Path:
    527             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->path);
    528             break;
    529           case TN_DMTND_RTProperties:
    530             rc = buildDmTndRTPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->rtprops);
    531             break;
    532           case TN_DMTND_DFProperties:
    533             rc = buildDmTndDFPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->dfprops);
    534             break;
    535           case TN_DMTND_Value:
    536             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->value);
    537             break;
    538           case TN_DMTND_Node:
    539             rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTndNode->nodelist);
    540             break;
    541           default:
    542               KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    543               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    544         }
    545         if (rc != SML_ERR_OK) {
    546             if ( NULL != pDmTndNode->nodename && NULL != pDmTndNode->nodename->content )
    547             {
    548               KCDBG(">>>>> buildDmTndDFPropsCmd: Node %s corrupted <<<<<\n", (char *)pDmTndNode->nodename->content);
    549             }
    550             smlFreeDmTndNode(pDmTndNode);
    551             return rc;
    552         }
    553         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    554             smlFreeDmTndNode(pDmTndNode);
    555             return rc;
    556         }
    557     }
    558 
    559     *ppElem = pDmTndNode;
    560 
    561     return SML_ERR_OK;
    562 }
    563 
    564 /* decoder callbacks */
    565 Ret_t buildDmTndCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    566 {
    567     XltDecScannerPtr_t pScanner;
    568     SmlDmTndPtr_t pDmTnd;
    569     Ret_t rc;
    570 
    571     pScanner = pDecoder->scanner;
    572 
    573     if (*ppElem != NULL)
    574         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    575 
    576     if ((pDmTnd = (SmlDmTndPtr_t)smlLibMalloc(sizeof(SmlDmTnd_t))) == NULL)
    577         return SML_ERR_NOT_ENOUGH_SPACE;
    578     smlLibMemset(pDmTnd, 0, sizeof(SmlDmTnd_t));
    579 
    580     if (IS_EMPTY(pScanner->curtok)) {
    581         *ppElem = pDmTnd;
    582         return SML_ERR_OK;
    583     }
    584 
    585     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    586         smlFreeDmTnd(pDmTnd);
    587         return rc;
    588     }
    589 
    590     while (pScanner->curtok->type != TOK_TAG_END) {
    591         switch (pScanner->curtok->tagid) {
    592           case TN_DMTND_MgmtTree:
    593             break;
    594           case TN_DMTND_VerDTD:
    595             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->verdtd);
    596             break;
    597           case TN_DMTND_Man:
    598             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->man);
    599             break;
    600           case TN_DMTND_Mod:
    601             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->mod);
    602             break;
    603           case TN_DMTND_Node:
    604             rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTnd->nodelist);
    605             break;
    606           default:
    607               KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<\n", pScanner->curtok->tagid);
    608               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    609         }
    610         if (rc != SML_ERR_OK) {
    611             smlFreeDmTnd(pDmTnd);
    612             return rc;
    613         }
    614         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    615             smlFreeDmTnd(pDmTnd);
    616             return rc;
    617         }
    618     }
    619 
    620     *ppElem = pDmTnd;
    621 
    622     return SML_ERR_OK;
    623 }
    624 
    625 /* see xltenc.c:XltEncBlock for description of parameters */
    626 Ret_t dmtndEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag)
    627 {
    628     if ((reqOptFlag == REQUIRED) && (pContent == NULL))
    629     {
    630         KCDBG(">>>>> TNDS required tag: %d missed ! <<<<<\n", tagId);
    631         return SML_ERR_XLT_MISSING_CONT;
    632     }
    633     //Check if pContent of a optional field is missing -> if yes we are done
    634     else if (pContent == NULL)
    635         return SML_ERR_OK;
    636 
    637     Ret_t _err;
    638     SmlDmTndNodeListPtr_t nodeList = NULL;
    639 
    640     //Generate the commands -> see DTD
    641     switch (tagId)
    642     {
    643         case TN_DMTND_MgmtTree:
    644             if ((_err = xltGenerateTag(TN_DMTND_MgmtTree, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    645             if ((_err = dmtndEncBlock(TN_DMTND_VerDTD, REQUIRED, ((SmlDmTndPtr_t) pContent)->verdtd, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    646             if ((_err = dmtndEncBlock(TN_DMTND_Man, OPTIONAL, ((SmlDmTndPtr_t) pContent)->man, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    647             if ((_err = dmtndEncBlock(TN_DMTND_Mod, OPTIONAL, ((SmlDmTndPtr_t) pContent)->mod, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    648             nodeList = ((SmlDmTndPtr_t)pContent)->nodelist;
    649             while (nodeList != NULL)
    650             {
    651                if ((_err = dmtndEncBlock(TN_DMTND_Node, OPTIONAL, nodeList->node, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    652                nodeList = nodeList->next;
    653             };
    654             if ((_err = xltGenerateTag(TN_DMTND_MgmtTree, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    655             break;
    656         case TN_DMTND_Node:
    657             if ((_err = xltGenerateTag(TN_DMTND_Node, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    658             if ((_err = dmtndEncBlock(TN_DMTND_NodeName, REQUIRED, ((SmlDmTndNodePtr_t) pContent)->nodename, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    659             if ((_err = dmtndEncBlock(TN_DMTND_Path, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->path, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    660             if ((_err = dmtndEncBlock(TN_DMTND_RTProperties, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->rtprops, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    661             if ((_err = dmtndEncBlock(TN_DMTND_Value, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->value, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    662             nodeList = ((SmlDmTndNodePtr_t)pContent)->nodelist;
    663             while (nodeList != NULL)
    664             {
    665                if ((_err = dmtndEncBlock(TN_DMTND_Node, OPTIONAL, nodeList->node, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    666                nodeList = nodeList->next;
    667             };
    668             if ((_err = xltGenerateTag(TN_DMTND_Node, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    669             break;
    670         case TN_DMTND_RTProperties:
    671             if ((_err = xltGenerateTag(TN_DMTND_RTProperties, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    672             if ((_err = dmtndEncBlock(TN_DMTND_ACL, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->acl, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    673             if ((_err = dmtndEncBlock(TN_DMTND_Format, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->format, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    674             if ((_err = dmtndEncBlock(TN_DMTND_Name, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->name, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    675             if ((_err = dmtndEncBlock(TN_DMTND_Size, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->size, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    676             if ((_err = dmtndEncBlock(TN_DMTND_Title, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->title, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    677             if ((_err = dmtndEncBlock(TN_DMTND_TStamp, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->tstamp, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    678             if ((_err = dmtndEncBlock(TN_DMTND_Type, REQUIRED, ((SmlDmTndRTPropsPtr_t) pContent)->type, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    679             if ((_err = dmtndEncBlock(TN_DMTND_VerNo, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->verno, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    680             if ((_err = xltGenerateTag(TN_DMTND_RTProperties, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    681             break;
    682         case TN_DMTND_Format:
    683             if ( NULL == pContent || NULL == ((SmlDmTndFormatPtr_t) pContent)->value || NULL == ((SmlDmTndFormatPtr_t) pContent)->value->content )
    684                 break;
    685             if ((_err = xltGenerateTag(TN_DMTND_Format, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    686             if ( !strcmp("b64", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    687             {
    688                if ((_err = xltGenerateTag(TN_DMTND_b64, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    689             }
    690             else if ( !strcmp("bin", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    691             {
    692                if ((_err = xltGenerateTag(TN_DMTND_bin, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    693             }
    694             else if ( !strcmp("bool", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    695             {
    696                if ((_err = xltGenerateTag(TN_DMTND_bool, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    697             }
    698             else if ( !strcmp("chr", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    699             {
    700                if ((_err = xltGenerateTag(TN_DMTND_chr, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    701             }
    702             else if ( !strcmp("int", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    703             {
    704                if ((_err = xltGenerateTag(TN_DMTND_int, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    705             }
    706             else if ( !strcmp("node", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    707             {
    708                if ((_err = xltGenerateTag(TN_DMTND_node, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    709             }
    710             else if ( !strcmp("null", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    711             {
    712                if ((_err = xltGenerateTag(TN_DMTND_null, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    713             }
    714             else if ( !strcmp("xml", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    715             {
    716                if ((_err = xltGenerateTag(TN_DMTND_xml, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    717             }
    718             else if ( !strcmp("date", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    719             {
    720                if ((_err = xltGenerateTag(TN_DMTND_date, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    721             }
    722             else if ( !strcmp("time", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    723             {
    724                if ((_err = xltGenerateTag(TN_DMTND_time, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    725             }
    726             else if ( !strcmp("float", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    727             {
    728                if ((_err = xltGenerateTag(TN_DMTND_float, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    729             }
    730             else
    731             {
    732               KCDBG(">>>>>  Unkown format: %s <<<<<\n",  (char *)(((SmlDmTndFormatPtr_t)pContent)->value->content));
    733               return SML_ERR_XLT_INVAL_SYNCML_DOC;
    734             }
    735             if ((_err = xltGenerateTag(TN_DMTND_Format, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    736             break;
    737         case TN_DMTND_Type:
    738             if ((_err = xltGenerateTag(TN_DMTND_Type, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    739             if ( ((SmlDmTndTypePtr_t) pContent)->mime )
    740             {
    741               if ((_err = dmtndEncBlock(TN_DMTND_MIME, OPTIONAL, ((SmlDmTndTypePtr_t) pContent)->mime, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    742             }
    743             else if ( ((SmlDmTndTypePtr_t) pContent)->ddfname )
    744             {
    745               if ((_err = dmtndEncBlock(TN_DMTND_DDFName, OPTIONAL, ((SmlDmTndTypePtr_t) pContent)->ddfname, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    746             }
    747             if ((_err = xltGenerateTag(TN_DMTND_Type, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    748             break;
    749          default: // all leaf nodes (PCDATA#)
    750             return xltEncPcdata(tagId, reqOptFlag, pContent, enc, pBufMgr, attFlag);
    751     } /* eof switch tagid */
    752     return SML_ERR_OK;
    753 }
    754 
    755 #endif /* __USE_DMTND__ */
    756