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