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 
     42 /* extern */
     43 extern SML_API void smlFreeDmTndFormat(SmlDmTndFormatPtr_t data);
     44 extern SML_API void smlFreeDmTndType(SmlDmTndTypePtr_t data);
     45 extern SML_API void smlFreeDmTndDFElement(SmlDmTndDFElementPtr_t data);
     46 extern SML_API void smlFreeDmTndRTProps(SmlDmTndRTPropsPtr_t data);
     47 extern SML_API void smlFreeDmTndDFProps(SmlDmTndDFPropsPtr_t data);
     48 extern SML_API void smlFreeDmTndNode(SmlDmTndNodePtr_t data);
     49 extern SML_API void smlFreeDmTndNodeList(SmlDmTndNodeListPtr_t data);
     50 extern SML_API void smlFreeDmTnd(SmlDmTndPtr_t data);
     51 
     52 Ret_t buildDmTndNodeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem);
     53 
     54 /* decoder callbacks */
     55 Ret_t buildDmTndFormatCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
     56 {
     57     XltDecScannerPtr_t pScanner;
     58     SmlDmTndFormatPtr_t pDmTndFormat;
     59     Ret_t rc;
     60 
     61     KCDBG("buildDmTndFormatCmd: Enter");
     62 
     63     pScanner = pDecoder->scanner;
     64 
     65     if (*ppElem != NULL)
     66         return SML_ERR_XLT_INVAL_SYNCML_DOC;
     67 
     68     if ((pDmTndFormat = (SmlDmTndFormatPtr_t)smlLibMalloc(sizeof(SmlDmTndFormat_t))) == NULL)
     69         return SML_ERR_NOT_ENOUGH_SPACE;
     70     smlLibMemset(pDmTndFormat, 0, sizeof(SmlDmTndFormat_t));
     71 
     72     if (IS_EMPTY(pScanner->curtok)) {
     73         *ppElem = pDmTndFormat;
     74         return SML_ERR_OK;
     75     }
     76 
     77     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
     78         smlFreeDmTndFormat(pDmTndFormat);
     79         return rc;
     80     }
     81 
     82     while (pScanner->curtok->type != TOK_TAG_END) {
     83         VoidPtr_t pContent = smlLibMalloc(6);
     84         if ( pContent == NULL )
     85         {
     86             smlFreeDmTndFormat(pDmTndFormat);
     87             return SML_ERR_NOT_ENOUGH_SPACE;
     88         }
     89         smlLibMemset(pContent, 0, 6);
     90 
     91         switch (pScanner->curtok->tagid) {
     92           case TN_DMTND_b64:
     93              KCDBG("buildDmTndFormatCmd: b64");
     94              smlLibStrcpy(pContent, "b64");
     95              break;
     96           case TN_DMTND_bin:
     97              KCDBG("buildDmTndFormatCmd: bin");
     98              smlLibStrcpy(pContent, "bin");
     99              break;
    100           case TN_DMTND_bool:
    101              KCDBG("buildDmTndFormatCmd: bool");
    102              smlLibStrcpy(pContent, "bool");
    103              break;
    104           case TN_DMTND_chr:
    105              KCDBG("buildDmTndFormatCmd: chr");
    106              smlLibStrcpy(pContent, "chr");
    107              break;
    108           case TN_DMTND_int:
    109              KCDBG("buildDmTndFormatCmd: int");
    110              smlLibStrcpy(pContent, "int");
    111              break;
    112           case TN_DMTND_node:
    113              KCDBG("buildDmTndFormatCmd: node");
    114              smlLibStrcpy(pContent, "node");
    115              break;
    116           case TN_DMTND_null:
    117              KCDBG("buildDmTndFormatCmd: null");
    118              smlLibStrcpy(pContent, "null");
    119              break;
    120           case TN_DMTND_xml:
    121              KCDBG("buildDmTndFormatCmd: xml");
    122              smlLibStrcpy(pContent, "xml");
    123              break;
    124           case TN_DMTND_date:
    125              KCDBG("buildDmTndFormatCmd: date");
    126              smlLibStrcpy(pContent, "date");
    127              break;
    128           case TN_DMTND_time:
    129              KCDBG("buildDmTndFormatCmd: time");
    130              smlLibStrcpy(pContent, "time");
    131              break;
    132           case TN_DMTND_float:
    133              KCDBG("buildDmTndFormatCmd: float");
    134              smlLibStrcpy(pContent, "float");
    135             break;
    136           default:
    137               KCDBG(">>>>>  Unkown token: %d <<<<<", pScanner->curtok->tagid);
    138               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    139         }
    140 
    141         if (rc != SML_ERR_OK) {
    142             smlLibFree(pContent);
    143             smlFreeDmTndFormat(pDmTndFormat);
    144             return rc;
    145         }
    146 
    147         rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndFormat->value);
    148         if (rc != SML_ERR_OK) {
    149             smlLibFree(pContent);
    150             smlFreeDmTndFormat(pDmTndFormat);
    151             return rc;
    152         }
    153         pDmTndFormat->value->content = pContent;
    154         pDmTndFormat->value->length = smlLibStrlen(pContent);
    155 
    156         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    157             smlLibFree(pContent);
    158             smlFreeDmTndFormat(pDmTndFormat);
    159             return rc;
    160         }
    161         if (pScanner->curtok->type != TOK_TAG_END) {
    162             smlLibFree(pContent);
    163             smlFreeDmTndFormat(pDmTndFormat);
    164             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    165         }
    166     }
    167 
    168     *ppElem = pDmTndFormat;
    169 
    170     return SML_ERR_OK;
    171 }
    172 
    173 /* decoder callbacks */
    174 Ret_t buildDmTndTypeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    175 {
    176     XltDecScannerPtr_t pScanner = NULL;
    177     SmlDmTndTypePtr_t pDmTndType = NULL;
    178     SmlPcdataPtr_t pPCData = NULL;
    179     Ret_t rc = SML_ERR_OK;
    180 
    181     KCDBG("buildDmTndTypeCmd: Enter");
    182 
    183     pScanner = pDecoder->scanner;
    184 
    185     if (*ppElem != NULL)
    186         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    187 
    188     if ((pDmTndType = (SmlDmTndTypePtr_t)smlLibMalloc(sizeof(SmlDmTndType_t))) == NULL)
    189         return SML_ERR_NOT_ENOUGH_SPACE;
    190     smlLibMemset(pDmTndType, 0, sizeof(SmlDmTndType_t));
    191 
    192     if (IS_EMPTY(pScanner->curtok)) {
    193         *ppElem = pDmTndType;
    194         return SML_ERR_OK;
    195     }
    196 
    197     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    198         smlFreeDmTndType(pDmTndType);
    199         return rc;
    200     }
    201 
    202     while (pScanner->curtok->type != TOK_TAG_END) {
    203         if (IS_CONTENT(pScanner->curtok)) {
    204             // detected PCDATA instead of <MIME> or <DDFName> tags
    205             // need to copy it to pDmTndType->mime
    206             if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) != NULL) {
    207                 smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t));
    208                 if ((pPCData->content = (VoidPtr_t)smlLibMalloc(pScanner->curtok->pcdata->length)) != NULL) {
    209                     smlLibMemmove(((Byte_t*)pPCData->content), pScanner->curtok->pcdata->content, pScanner->curtok->pcdata->length);
    210                     pPCData->length = pScanner->curtok->pcdata->length;
    211                     pDmTndType->mime = pPCData;
    212                 } else {
    213                     smlLibFree(pPCData);
    214                     pPCData = NULL;
    215                     rc = SML_ERR_NOT_ENOUGH_SPACE;
    216                 }
    217             } else {
    218                 rc = SML_ERR_NOT_ENOUGH_SPACE;
    219             }
    220             if (rc == SML_ERR_OK) {
    221                 KCDBG("buildDmTndTypeCmd:        %s", pDmTndType->mime->content);
    222             }
    223         } else {
    224             switch (pScanner->curtok->tagid) {
    225                 case TN_DMTND_MIME:
    226                     KCDBG("buildDmTndTypeCmd:    MIME");
    227                     rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->mime);
    228                     if (rc == SML_ERR_OK) {
    229                         KCDBG("buildDmTndTypeCmd:        %s", pDmTndType->mime->content);
    230                     }
    231                     break;
    232                 case TN_DMTND_DDFName:
    233                     KCDBG("buildDmTndTypeCmd:    DDFName");
    234                     rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndType->ddfname);
    235                     if (rc == SML_ERR_OK) {
    236                         KCDBG("buildDmTndTypeCmd:        %s", pDmTndType->ddfname->content);
    237                     }
    238                     break;
    239                 default:
    240                     KCDBG("buildDmTndTypeCmd: Error: Unkown token: %d", pScanner->curtok->tagid);
    241                     rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    242             }
    243         }
    244         if (rc != SML_ERR_OK) {
    245             smlFreeDmTndType(pDmTndType);
    246             return rc;
    247         }
    248         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    249             smlFreeDmTndType(pDmTndType);
    250             return rc;
    251         }
    252         if (pScanner->curtok->type != TOK_TAG_END) {
    253             smlFreeDmTndType(pDmTndType);
    254             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    255         }
    256     }
    257 
    258     *ppElem = pDmTndType;
    259 
    260     return SML_ERR_OK;
    261 }
    262 
    263 /* decoder callbacks */
    264 Ret_t buildDmTndDFElementCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    265 {
    266     XltDecScannerPtr_t pScanner;
    267     SmlDmTndDFElementPtr_t pDmTndDFElement;
    268     Ret_t rc;
    269 
    270     KCDBG("buildDmTndDFElementCmd: Enter");
    271 
    272     pScanner = pDecoder->scanner;
    273 
    274     if (*ppElem != NULL)
    275         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    276 
    277     if ((pDmTndDFElement = (SmlDmTndDFElementPtr_t)smlLibMalloc(sizeof(SmlDmTndDFElement_t))) == NULL)
    278         return SML_ERR_NOT_ENOUGH_SPACE;
    279     smlLibMemset(pDmTndDFElement, 0, sizeof(SmlDmTndDFElement_t));
    280 
    281     if (IS_EMPTY(pScanner->curtok)) {
    282         *ppElem = pDmTndDFElement;
    283         return SML_ERR_OK;
    284     }
    285 
    286     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    287         smlFreeDmTndDFElement(pDmTndDFElement);
    288         return rc;
    289     }
    290 
    291     while (pScanner->curtok->type != TOK_TAG_END) {
    292         VoidPtr_t pContent = smlLibMalloc(12);
    293         if ( pContent == NULL )
    294         {
    295             smlFreeDmTndDFElement(pDmTndDFElement);
    296             return SML_ERR_NOT_ENOUGH_SPACE;
    297         }
    298         smlLibMemset(pContent, 0, 12);
    299 
    300         switch (pScanner->curtok->tagid) {
    301           /* AccessType Elements */
    302           case TN_DMTND_Add:
    303              smlLibStrcpy(pContent, "Add");
    304              break;
    305           case TN_DMTND_Copy:
    306              smlLibStrcpy(pContent, "Copy");
    307              break;
    308           case TN_DMTND_Delete:
    309              smlLibStrcpy(pContent, "Delete");
    310              break;
    311           case TN_DMTND_Exec:
    312              smlLibStrcpy(pContent, "Exec");
    313              break;
    314           case TN_DMTND_Get:
    315              smlLibStrcpy(pContent, "Get");
    316              break;
    317           case TN_DMTND_Replace:
    318              smlLibStrcpy(pContent, "Replace");
    319              break;
    320           /* Occurrence Elements */
    321           case TN_DMTND_One:
    322              smlLibStrcpy(pContent, "One");
    323              break;
    324           case TN_DMTND_ZeroOrOne:
    325              smlLibStrcpy(pContent, "ZeroOrOne");
    326              break;
    327           case TN_DMTND_ZeroOrMore:
    328              smlLibStrcpy(pContent, "ZeroOrMore");
    329              break;
    330           case TN_DMTND_OneOrMore:
    331              smlLibStrcpy(pContent, "OneOrMore");
    332              break;
    333           case TN_DMTND_ZeroOrN:
    334              smlLibStrcpy(pContent, "ZeroOrN");
    335              break;
    336           case TN_DMTND_OneOrN:
    337              smlLibStrcpy(pContent, "OneOrN");
    338              break;
    339           /* Scope Elements */
    340           case TN_DMTND_Permanent:
    341              smlLibStrcpy(pContent, "Permanent");
    342              break;
    343           case TN_DMTND_Dynamic:
    344              smlLibStrcpy(pContent, "Dynamic");
    345              break;
    346           /* CaseSense Elements */
    347           case TN_DMTND_CS:
    348              smlLibStrcpy(pContent, "CS");
    349              break;
    350           case TN_DMTND_CIS:
    351              smlLibStrcpy(pContent, "CIS");
    352              break;
    353           default:
    354               KCDBG(">>>>> buildDmTndDFElementCmd: Unkown token: %d <<<<<", pScanner->curtok->tagid);
    355               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    356         }
    357         if (rc != SML_ERR_OK) {
    358             smlFreeDmTndDFElement(pDmTndDFElement);
    359             return rc;
    360         }
    361         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    362             smlFreeDmTndDFElement(pDmTndDFElement);
    363             return rc;
    364         }
    365         if (pScanner->curtok->type != TOK_TAG_END) {
    366             smlFreeDmTndDFElement(pDmTndDFElement);
    367             return SML_ERR_XLT_INVAL_SYNCML_DOC;
    368         }
    369     }
    370 
    371     *ppElem = pDmTndDFElement;
    372 
    373     return SML_ERR_OK;
    374 }
    375 
    376 /* decoder callbacks */
    377 Ret_t buildDmTndRTPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    378 {
    379     XltDecScannerPtr_t pScanner;
    380     SmlDmTndRTPropsPtr_t pDmTndRTProps;
    381     Ret_t rc;
    382 
    383     KCDBG("buildDmTndRTPropsCmd: Enter");
    384 
    385     pScanner = pDecoder->scanner;
    386 
    387     if (*ppElem != NULL)
    388         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    389 
    390     if ((pDmTndRTProps = (SmlDmTndRTPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndRTProps_t))) == NULL)
    391         return SML_ERR_NOT_ENOUGH_SPACE;
    392     smlLibMemset(pDmTndRTProps, 0, sizeof(SmlDmTndRTProps_t));
    393 
    394     if (IS_EMPTY(pScanner->curtok)) {
    395         *ppElem = pDmTndRTProps;
    396         return SML_ERR_OK;
    397     }
    398 
    399     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    400         smlFreeDmTndRTProps(pDmTndRTProps);
    401         return rc;
    402     }
    403 
    404     while (pScanner->curtok->type != TOK_TAG_END) {
    405         switch (pScanner->curtok->tagid) {
    406           case TN_DMTND_ACL:
    407             KCDBG("buildDmTndRTPropsCmd: ACL");
    408             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->acl);
    409             if (rc == SML_ERR_OK) {
    410                 KCDBG("buildDmTndRTPropsCmd:    ACL = %s", pDmTndRTProps->acl->content);
    411             }
    412             break;
    413           case TN_DMTND_Format:
    414             KCDBG("buildDmTndRTPropsCmd: Format");
    415             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->format);
    416             break;
    417           case TN_DMTND_Name:
    418             KCDBG("buildDmTndRTPropsCmd: Name");
    419             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->name);
    420             if (rc == SML_ERR_OK) {
    421               KCDBG("buildDmTndRTPropsCmd:    Name = %s", pDmTndRTProps->name->content);
    422             }
    423             break;
    424           case TN_DMTND_Size:
    425             KCDBG("buildDmTndRTPropsCmd: Size");
    426             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->size);
    427             if (rc == SML_ERR_OK) {
    428                 KCDBG("buildDmTndRTPropsCmd:    Size = %s", pDmTndRTProps->size->content);
    429             }
    430             break;
    431           case TN_DMTND_Title:
    432             KCDBG("buildDmTndRTPropsCmd: Title");
    433             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->title);
    434             if (rc == SML_ERR_OK) {
    435                 KCDBG("buildDmTndRTPropsCmd:    Title = %s", pDmTndRTProps->title->content);
    436             }
    437             break;
    438           case TN_DMTND_TStamp:
    439             KCDBG("buildDmTndRTPropsCmd: TStampt");
    440             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->tstamp);
    441             if (rc == SML_ERR_OK) {
    442                 KCDBG("buildDmTndRTPropsCmd:    TStampt = %s", pDmTndRTProps->tstamp->content);
    443             }
    444             break;
    445           case TN_DMTND_Type:
    446             KCDBG("buildDmTndRTPropsCmd: Type");
    447             rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndRTProps->type);
    448             break;
    449           case TN_DMTND_VerNo:
    450             KCDBG("buildDmTndRTPropsCmd: VerNo");
    451             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndRTProps->verno);
    452             if (rc == SML_ERR_OK) {
    453                 KCDBG("buildDmTndRTPropsCmd:    VerNo = %s", pDmTndRTProps->verno->content);
    454             }
    455             break;
    456           default:
    457               KCDBG("buildDmTndRTPropsCmd: Error: Unkown token: %d", pScanner->curtok->tagid);
    458               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    459         }
    460         if (rc != SML_ERR_OK) {
    461             smlFreeDmTndRTProps(pDmTndRTProps);
    462             return rc;
    463         }
    464         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    465             smlFreeDmTndRTProps(pDmTndRTProps);
    466             return rc;
    467         }
    468     }
    469 
    470     *ppElem = pDmTndRTProps;
    471 
    472     return SML_ERR_OK;
    473 }
    474 
    475 /* decoder callbacks */
    476 Ret_t buildDmTndDFPropsCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    477 {
    478     XltDecScannerPtr_t pScanner;
    479     SmlDmTndDFPropsPtr_t pDmTndDFProps;
    480     Ret_t rc = SML_ERR_OK;
    481 
    482     KCDBG("buildDmTndDFPropsCmd: Enter");
    483 
    484     pScanner = pDecoder->scanner;
    485 
    486     if (*ppElem != NULL)
    487         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    488 
    489     if ((pDmTndDFProps = (SmlDmTndDFPropsPtr_t)smlLibMalloc(sizeof(SmlDmTndDFProps_t))) == NULL)
    490         return SML_ERR_NOT_ENOUGH_SPACE;
    491     smlLibMemset(pDmTndDFProps, 0, sizeof(SmlDmTndDFProps_t));
    492 
    493     if (IS_EMPTY(pScanner->curtok)) {
    494         *ppElem = pDmTndDFProps;
    495         return SML_ERR_OK;
    496     }
    497 
    498     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    499         smlFreeDmTndDFProps(pDmTndDFProps);
    500         return rc;
    501     }
    502 
    503     while (pScanner->curtok->type != TOK_TAG_END) {
    504         switch (pScanner->curtok->tagid) {
    505           case TN_DMTND_AccessType:
    506             KCDBG("buildDmTndDFPropsCmd: AccessType");
    507             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->accesstype);
    508             break;
    509           case TN_DMTND_DefaultValue:
    510             KCDBG("buildDmTndDFPropsCmd: DefaultValue");
    511             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->defaultvalue);
    512             break;
    513           case TN_DMTND_Description:
    514             KCDBG("buildDmTndDFPropsCmd: Description");
    515             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->description);
    516             break;
    517           case TN_DMTND_DFFormat:
    518             KCDBG("buildDmTndDFPropsCmd: DFFormat");
    519             rc = buildDmTndFormatCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dfformat);
    520             break;
    521           case TN_DMTND_Occurrence:
    522             KCDBG("buildDmTndDFPropsCmd: Occurrence");
    523             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->occurrence);
    524             break;
    525           case TN_DMTND_Scope:
    526             KCDBG("buildDmTndDFPropsCmd: Scope");
    527             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->scope);
    528             break;
    529           case TN_DMTND_DFTitle:
    530             KCDBG("buildDmTndDFPropsCmd: DFTitle");
    531             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftitle);
    532             break;
    533           case TN_DMTND_DFType:
    534             KCDBG("buildDmTndDFPropsCmd: DFType");
    535             rc = buildDmTndTypeCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->dftype);
    536             break;
    537           case TN_DMTND_CaseSense:
    538             KCDBG("buildDmTndDFPropsCmd: CaseSense");
    539             rc = buildDmTndDFElementCmd(pDecoder, (VoidPtr_t)&pDmTndDFProps->casesense);
    540             break;
    541           default:
    542               KCDBG("buildDmTndDFPropsCmd: Error: Unkown token: %d", pScanner->curtok->tagid);
    543               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    544         }
    545         if (rc != SML_ERR_OK) {
    546             smlFreeDmTndDFProps(pDmTndDFProps);
    547             return rc;
    548         }
    549         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    550             smlFreeDmTndDFProps(pDmTndDFProps);
    551             return rc;
    552         }
    553     }
    554 
    555     *ppElem = pDmTndDFProps;
    556 
    557     return SML_ERR_OK;
    558 }
    559 
    560 Ret_t buildDmTndNodeList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    561 {
    562     SmlDmTndNodeListPtr_t pElem = NULL, pPrev = NULL;
    563 
    564     KCDBG("buildDmTndNodeList: Enter");
    565 
    566     pElem = (SmlDmTndNodeListPtr_t) *ppElem;
    567     /* advance to the end of the list, and create ther an empty list element */
    568     while (pElem != NULL) {
    569         pPrev = pElem;
    570         pElem = pPrev->next;
    571     }
    572     if ((pElem = (SmlDmTndNodeListPtr_t)smlLibMalloc(sizeof(SmlDmTndNodeListPtr_t))) == NULL)
    573         return SML_ERR_NOT_ENOUGH_SPACE;
    574     smlLibMemset(pElem, 0, sizeof(SmlDmTndNodeListPtr_t));
    575     pElem->next = NULL;
    576     if (pPrev != NULL) /* we already had some entries in the list */
    577         pPrev->next = pElem;
    578     else /* nope we created a new list */
    579         *ppElem = pElem;
    580     pElem->node = NULL;
    581     /* at this point pElem should point to an valid list element */
    582     return buildDmTndNodeCmd(pDecoder, (VoidPtr_t)&pElem->node);
    583 }
    584 
    585 /* decoder callbacks */
    586 Ret_t buildDmTndNodeCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    587 {
    588     XltDecScannerPtr_t pScanner;
    589     SmlDmTndNodePtr_t pDmTndNode;
    590     Ret_t rc;
    591 
    592     KCDBG("buildDmTndNodeCmd: Enter");
    593 
    594     pScanner = pDecoder->scanner;
    595 
    596     if (*ppElem != NULL)
    597         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    598 
    599     if ((pDmTndNode = (SmlDmTndNodePtr_t)smlLibMalloc(sizeof(SmlDmTndNode_t))) == NULL)
    600         return SML_ERR_NOT_ENOUGH_SPACE;
    601     smlLibMemset(pDmTndNode, 0, sizeof(SmlDmTndNode_t));
    602 
    603     if (IS_EMPTY(pScanner->curtok)) {
    604         *ppElem = pDmTndNode;
    605         return SML_ERR_OK;
    606     }
    607 
    608     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    609         smlFreeDmTndNode(pDmTndNode);
    610         return rc;
    611     }
    612 
    613     while (pScanner->curtok->type != TOK_TAG_END) {
    614         switch (pScanner->curtok->tagid) {
    615           case TN_DMTND_NodeName:
    616             KCDBG("buildDmTndNodeCmd: NodeName");
    617             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->nodename);
    618             if (rc == SML_ERR_OK) {
    619                 KCDBG("buildDmTndNodeCmd:    Node name =  %s", pDmTndNode->nodename->content);
    620             }
    621             break;
    622           case TN_DMTND_Path:
    623             KCDBG("buildDmTndNodeCmd: Path\n");
    624             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->path);
    625             if (rc == SML_ERR_OK) {
    626                 KCDBG("buildDmTndNodeCmd:    path =  %s", pDmTndNode->path->content);
    627             }
    628             break;
    629           case TN_DMTND_RTProperties:
    630             KCDBG("buildDmTndNodeCmd: RTProperties");
    631             rc = buildDmTndRTPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->rtprops);
    632             break;
    633           case TN_DMTND_DFProperties:
    634             KCDBG("buildDmTndNodeCmd: DFProperties");
    635             rc = buildDmTndDFPropsCmd(pDecoder, (VoidPtr_t)&pDmTndNode->dfprops);
    636             break;
    637           case TN_DMTND_Value:
    638             KCDBG("buildDmTndNodeCmd: Value");
    639             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTndNode->value);
    640             if (rc == SML_ERR_OK) {
    641                 KCDBG("buildDmTndNodeCmd:    Value = %s", pDmTndNode->value->content);
    642             }
    643             break;
    644           case TN_DMTND_Node:
    645             KCDBG("buildDmTndNodeCmd: Node");
    646             rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTndNode->nodelist);
    647             break;
    648           default:
    649               KCDBG("buildDmTndNodeCmd: Unkown token: %d", pScanner->curtok->tagid);
    650               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    651         }
    652         if (rc != SML_ERR_OK) {
    653             if ( NULL != pDmTndNode->nodename && NULL != pDmTndNode->nodename->content )
    654             {
    655               KCDBG("buildDmTndNodeCmd: Error: Node %s corrupted", (char *)pDmTndNode->nodename->content);
    656             }
    657             smlFreeDmTndNode(pDmTndNode);
    658             return rc;
    659         }
    660         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    661             smlFreeDmTndNode(pDmTndNode);
    662             return rc;
    663         }
    664     }
    665 
    666     *ppElem = pDmTndNode;
    667 
    668     return SML_ERR_OK;
    669 }
    670 
    671 /* decoder callbacks */
    672 Ret_t buildDmTndCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem)
    673 {
    674     XltDecScannerPtr_t pScanner;
    675     SmlDmTndPtr_t pDmTnd;
    676     Ret_t rc;
    677 
    678     KCDBG("buildDmTndCmd: Enter");
    679 
    680     pScanner = pDecoder->scanner;
    681 
    682     if (*ppElem != NULL)
    683         return SML_ERR_XLT_INVAL_SYNCML_DOC;
    684 
    685     if ((pDmTnd = (SmlDmTndPtr_t)smlLibMalloc(sizeof(SmlDmTnd_t))) == NULL)
    686         return SML_ERR_NOT_ENOUGH_SPACE;
    687     smlLibMemset(pDmTnd, 0, sizeof(SmlDmTnd_t));
    688 
    689     if (IS_EMPTY(pScanner->curtok)) {
    690         *ppElem = pDmTnd;
    691         return SML_ERR_OK;
    692     }
    693 
    694     if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    695         smlFreeDmTnd(pDmTnd);
    696         return rc;
    697     }
    698 
    699     while (pScanner->curtok->type != TOK_TAG_END) {
    700         switch (pScanner->curtok->tagid) {
    701           case TN_DMTND_MgmtTree:
    702             KCDBG("buildDmTndCmd: MgmtTree tag");
    703             break;
    704           case TN_DMTND_VerDTD:
    705             KCDBG("buildDmTndCmd: VerDTD tag");
    706             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->verdtd);
    707             break;
    708           case TN_DMTND_Man:
    709             KCDBG("buildDmTndCmd: Man tag");
    710             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->man);
    711             break;
    712           case TN_DMTND_Mod:
    713             KCDBG("buildDmTndCmd: Mod tag");
    714             rc = buildPCData(pDecoder, (VoidPtr_t)&pDmTnd->mod);
    715             break;
    716           case TN_DMTND_Node:
    717             KCDBG("buildDmTndCmd: Node tag");
    718             rc = buildDmTndNodeList(pDecoder, (VoidPtr_t)&pDmTnd->nodelist);
    719             break;
    720           default:
    721               KCDBG(">>>>> buildDmTndDFPropsCmd: Unkown token: %d <<<<<", pScanner->curtok->tagid);
    722               rc = SML_ERR_XLT_INVAL_SYNCML_DOC;
    723         }
    724         if (rc != SML_ERR_OK) {
    725             smlFreeDmTnd(pDmTnd);
    726             return rc;
    727         }
    728         if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) {
    729             smlFreeDmTnd(pDmTnd);
    730             return rc;
    731         }
    732     }
    733 
    734     *ppElem = pDmTnd;
    735 
    736     return SML_ERR_OK;
    737 }
    738 
    739 /* see xltenc.c:XltEncBlock for description of parameters */
    740 Ret_t dmtndEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag)
    741 {
    742     if ((reqOptFlag == REQUIRED) && (pContent == NULL))
    743     {
    744         KCDBG(">>>>> TNDS required tag: %d missed ! <<<<<", tagId);
    745         return SML_ERR_XLT_MISSING_CONT;
    746     }
    747     //Check if pContent of a optional field is missing -> if yes we are done
    748     else if (pContent == NULL)
    749         return SML_ERR_OK;
    750 
    751     Ret_t _err;
    752     SmlDmTndNodeListPtr_t nodeList = NULL;
    753 
    754     //Generate the commands -> see DTD
    755     switch (tagId)
    756     {
    757         case TN_DMTND_MgmtTree:
    758             if ((_err = xltGenerateTag(TN_DMTND_MgmtTree, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    759             if ((_err = dmtndEncBlock(TN_DMTND_VerDTD, REQUIRED, ((SmlDmTndPtr_t) pContent)->verdtd, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    760             if ((_err = dmtndEncBlock(TN_DMTND_Man, OPTIONAL, ((SmlDmTndPtr_t) pContent)->man, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    761             if ((_err = dmtndEncBlock(TN_DMTND_Mod, OPTIONAL, ((SmlDmTndPtr_t) pContent)->mod, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    762             nodeList = ((SmlDmTndPtr_t)pContent)->nodelist;
    763             while (nodeList != NULL)
    764             {
    765                if ((_err = dmtndEncBlock(TN_DMTND_Node, OPTIONAL, nodeList->node, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    766                nodeList = nodeList->next;
    767             };
    768             if ((_err = xltGenerateTag(TN_DMTND_MgmtTree, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    769             break;
    770         case TN_DMTND_Node:
    771             if ((_err = xltGenerateTag(TN_DMTND_Node, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    772             if ((_err = dmtndEncBlock(TN_DMTND_NodeName, REQUIRED, ((SmlDmTndNodePtr_t) pContent)->nodename, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    773             if ((_err = dmtndEncBlock(TN_DMTND_Path, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->path, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    774             if ((_err = dmtndEncBlock(TN_DMTND_RTProperties, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->rtprops, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    775             if ((_err = dmtndEncBlock(TN_DMTND_Value, OPTIONAL, ((SmlDmTndNodePtr_t) pContent)->value, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    776             nodeList = ((SmlDmTndNodePtr_t)pContent)->nodelist;
    777             while (nodeList != NULL)
    778             {
    779                if ((_err = dmtndEncBlock(TN_DMTND_Node, OPTIONAL, nodeList->node, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    780                nodeList = nodeList->next;
    781             };
    782             if ((_err = xltGenerateTag(TN_DMTND_Node, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    783             break;
    784         case TN_DMTND_RTProperties:
    785             if ((_err = xltGenerateTag(TN_DMTND_RTProperties, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    786             if ((_err = dmtndEncBlock(TN_DMTND_ACL, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->acl, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    787             if ((_err = dmtndEncBlock(TN_DMTND_Format, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->format, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    788             if ((_err = dmtndEncBlock(TN_DMTND_Name, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->name, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    789             if ((_err = dmtndEncBlock(TN_DMTND_Size, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->size, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    790             if ((_err = dmtndEncBlock(TN_DMTND_Title, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->title, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    791             if ((_err = dmtndEncBlock(TN_DMTND_TStamp, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->tstamp, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    792             if ((_err = dmtndEncBlock(TN_DMTND_Type, REQUIRED, ((SmlDmTndRTPropsPtr_t) pContent)->type, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    793             if ((_err = dmtndEncBlock(TN_DMTND_VerNo, OPTIONAL, ((SmlDmTndRTPropsPtr_t) pContent)->verno, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    794             if ((_err = xltGenerateTag(TN_DMTND_RTProperties, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    795             break;
    796         case TN_DMTND_Format:
    797             if ( NULL == pContent || NULL == ((SmlDmTndFormatPtr_t) pContent)->value || NULL == ((SmlDmTndFormatPtr_t) pContent)->value->content )
    798                 break;
    799             if ((_err = xltGenerateTag(TN_DMTND_Format, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    800             if ( !strcmp("b64", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    801             {
    802                if ((_err = xltGenerateTag(TN_DMTND_b64, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    803             }
    804             else if ( !strcmp("bin", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    805             {
    806                if ((_err = xltGenerateTag(TN_DMTND_bin, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    807             }
    808             else if ( !strcmp("bool", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    809             {
    810                if ((_err = xltGenerateTag(TN_DMTND_bool, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    811             }
    812             else if ( !strcmp("chr", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    813             {
    814                if ((_err = xltGenerateTag(TN_DMTND_chr, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    815             }
    816             else if ( !strcmp("int", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    817             {
    818                if ((_err = xltGenerateTag(TN_DMTND_int, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    819             }
    820             else if ( !strcmp("node", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    821             {
    822                if ((_err = xltGenerateTag(TN_DMTND_node, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    823             }
    824             else if ( !strcmp("null", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    825             {
    826                if ((_err = xltGenerateTag(TN_DMTND_null, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    827             }
    828             else if ( !strcmp("xml", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    829             {
    830                if ((_err = xltGenerateTag(TN_DMTND_xml, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    831             }
    832             else if ( !strcmp("date", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    833             {
    834                if ((_err = xltGenerateTag(TN_DMTND_date, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    835             }
    836             else if ( !strcmp("time", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    837             {
    838                if ((_err = xltGenerateTag(TN_DMTND_time, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    839             }
    840             else if ( !strcmp("float", (char *)(((SmlDmTndFormatPtr_t) pContent)->value->content)) )
    841             {
    842                if ((_err = xltGenerateTag(TN_DMTND_float, TT_ALL, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    843             }
    844             else
    845             {
    846               KCDBG(">>>>>  Unkown format: %s <<<<<\n",  (char *)(((SmlDmTndFormatPtr_t)pContent)->value->content));
    847               return SML_ERR_XLT_INVAL_SYNCML_DOC;
    848             }
    849             if ((_err = xltGenerateTag(TN_DMTND_Format, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    850             break;
    851         case TN_DMTND_Type:
    852             if ((_err = xltGenerateTag(TN_DMTND_Type, TT_BEG, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    853             if ( ((SmlDmTndTypePtr_t) pContent)->mime )
    854             {
    855               if ((_err = dmtndEncBlock(TN_DMTND_MIME, OPTIONAL, ((SmlDmTndTypePtr_t) pContent)->mime, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    856             }
    857             else if ( ((SmlDmTndTypePtr_t) pContent)->ddfname )
    858             {
    859               if ((_err = dmtndEncBlock(TN_DMTND_DDFName, OPTIONAL, ((SmlDmTndTypePtr_t) pContent)->ddfname, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    860             }
    861             if ((_err = xltGenerateTag(TN_DMTND_Type, TT_END, enc, pBufMgr, SML_EXT_DMTND)) != SML_ERR_OK) return _err;
    862             break;
    863          default: // all leaf nodes (PCDATA#)
    864             return xltEncPcdata(tagId, reqOptFlag, pContent, enc, pBufMgr, attFlag);
    865     } /* eof switch tagid */
    866     return SML_ERR_OK;
    867 }
    868 
    869 #endif /* __USE_DMTND__ */
    870