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 #include "dmtAsyncData.h" 18 #include "dm_tree_util.h" 19 #include "dmt.hpp" 20 #include "dmMemory.h" 21 #include "xpl_Logger.h" 22 23 static SYNCML_DM_RET_STATUS_T dmtBuildData(const DMT_DATA_T * pData, DmtData & oDmtData) 24 { 25 26 SYNCML_DM_RET_STATUS_T res = SYNCML_DM_SUCCESS; 27 if ( pData == NULL ) 28 { 29 oDmtData = DmtData(); 30 } 31 else 32 switch ( pData->meta_format ) 33 { 34 case SYNCML_DM_DATAFORMAT_STRING: 35 case SYNCML_DM_DATAFORMAT_FLOAT: 36 case SYNCML_DM_DATAFORMAT_TIME: 37 case SYNCML_DM_DATAFORMAT_DATE: 38 res = oDmtData.SetString(pData->data.str_value, pData->meta_format); 39 break; 40 41 case SYNCML_DM_DATAFORMAT_INT: 42 res = oDmtData.SetInt(pData->data.int_value); 43 break; 44 45 case SYNCML_DM_DATAFORMAT_BOOL: 46 res = oDmtData.SetBoolean((BOOLEAN)pData->data.int_value); 47 break; 48 49 case SYNCML_DM_DATAFORMAT_BIN: 50 res = oDmtData.SetBinary(pData->data.bin.bin_value,pData->data.bin.len_bin_data); 51 break; 52 53 default: 54 oDmtData = DmtData(); 55 break; 56 } 57 return res; 58 59 } 60 61 62 static SYNCML_DM_RET_STATUS_T dmtBuildMap(const DMT_LEAF_CHILDREN_DATA_T* pData, DMMap<DMString, DmtData> & oMapNodes) 63 { 64 SYNCML_DM_RET_STATUS_T res = SYNCML_DM_SUCCESS; 65 66 if ( pData ) 67 { 68 for (int index = 0; index<pData->num_children; index++) 69 { 70 DmtData oData; 71 res = dmtBuildData((DMT_DATA_T*)&pData->pData[index],oData); 72 if ( res == SYNCML_DM_SUCCESS ) 73 oMapNodes.put(DMString(pData->ppChildren[index]),oData); 74 else 75 break; 76 } 77 } 78 else 79 return SYNCML_DM_FAIL; 80 81 return res; 82 } 83 84 85 86 static void dmtFreeCharPtr(CPCHAR str) 87 { 88 char * ptr = (char*)str; 89 if ( ptr ) 90 DmFreeMem(ptr); 91 } 92 93 94 static void dmtFreeBytePtr(const UINT8 * byte) 95 { 96 UINT8 * ptr = (UINT8*)byte; 97 if ( ptr ) 98 DmFreeMem(ptr); 99 } 100 101 static void dmtFreeDataStruct(DMT_DATA_T * pData) 102 { 103 if ( pData == NULL ) 104 return; 105 106 switch ( pData->meta_format ) 107 { 108 case SYNCML_DM_DATAFORMAT_STRING: 109 case SYNCML_DM_DATAFORMAT_FLOAT: 110 case SYNCML_DM_DATAFORMAT_TIME: 111 case SYNCML_DM_DATAFORMAT_DATE: 112 dmtFreeCharPtr(pData->data.str_value); 113 break; 114 115 case SYNCML_DM_DATAFORMAT_BIN: 116 dmtFreeBytePtr(pData->data.bin.bin_value); 117 break; 118 } 119 memset(pData,0,sizeof(DMT_DATA_T)); 120 } 121 122 123 SYNCML_DM_RET_STATUS_T DMPrincipalMessage::set(CPCHAR szPrincipal, 124 UINT32 messageID, 125 UINT32 pUserData) 126 { 127 DMAsyncMessage::set(messageID,pUserData); 128 principal.assign(szPrincipal); 129 if ( principal.getName() == NULL ) 130 { 131 return SYNCML_DM_DEVICE_FULL; 132 } 133 return SYNCML_DM_SUCCESS; 134 } 135 136 137 138 SYNCML_DM_RET_STATUS_T DMGetSubTreeMessage::set(CPCHAR szPrincipal, 139 CPCHAR subtreeRoot, 140 SYNCML_DM_TREE_LOCK_TYPE_T nLockType, 141 DMT_CallbackGetTree callback, 142 UINT32 messageID, 143 UINT32 pUserData) 144 { 145 SYNCML_DM_RET_STATUS_T res; 146 res = DMPrincipalMessage::set(szPrincipal,messageID,pUserData); 147 if ( res == SYNCML_DM_SUCCESS ) 148 { 149 if ( subtreeRoot ) 150 { 151 this->subtreeRoot = subtreeRoot; 152 if ( subtreeRoot[0] && this->subtreeRoot == NULL ) 153 { 154 return SYNCML_DM_DEVICE_FULL; 155 } 156 } 157 } 158 this->nLockType = nLockType; 159 this->callback = callback; 160 return res; 161 } 162 163 164 165 SYNCML_DM_RET_STATUS_T DMScriptMessage::set(CPCHAR szPrincipal, 166 const UINT8 * buf, 167 INT32 len, 168 BOOLEAN isWBXML, 169 UINT32 messageID, 170 UINT32 pUserData) 171 { 172 SYNCML_DM_RET_STATUS_T res; 173 res = DMPrincipalMessage::set(szPrincipal,messageID,pUserData); 174 if ( res == SYNCML_DM_SUCCESS ) 175 { 176 this->buf.assign(buf,len); 177 if ( this->buf.getBuffer() == NULL ) 178 { 179 return SYNCML_DM_DEVICE_FULL; 180 } 181 } 182 this->isWBXML = isWBXML; 183 return res; 184 } 185 186 187 SYNCML_DM_RET_STATUS_T DMProcessScriptMessage::set(CPCHAR szPrincipal, 188 const UINT8 * buf, 189 INT32 len, 190 BOOLEAN isWBXML, 191 DMT_CallbackProcessScript callback, 192 UINT32 messageID, 193 UINT32 pUserData) 194 { 195 this->callback = callback; 196 return DMScriptMessage::set(szPrincipal,buf,len,isWBXML,messageID,pUserData); 197 } 198 199 200 SYNCML_DM_RET_STATUS_T DMBootstrapMessage::set(CPCHAR szPrincipal, 201 const UINT8 * buf, 202 INT32 len, 203 BOOLEAN isWBXML, 204 BOOLEAN isProcess, 205 DMT_CallbackBootstrap callback, 206 UINT32 messageID, 207 UINT32 pUserData) 208 { 209 this->callback = callback; 210 this->isProcess = isProcess; 211 return DMScriptMessage::set(szPrincipal,buf,len,isWBXML,messageID,pUserData); 212 } 213 214 215 216 SYNCML_DM_RET_STATUS_T DMStartServerSessionMessage::set(CPCHAR szPrincipal, 217 const DMT_SESSION_PROP_T * pSessionProp, 218 DMT_CallbackStatusCode callback, 219 UINT32 messageID, 220 UINT32 pUserData) 221 { 222 sessionProp.setWBXML(pSessionProp->isWBXML); 223 224 if ( pSessionProp->direction == SYNCML_DM_SERVER_INITIATED_SESSION ) 225 sessionProp.setSessionID(pSessionProp->sessionID); 226 if ( pSessionProp->num_alerts ) 227 { 228 if ( !pSessionProp->alerts ) 229 return SYNCML_DM_INVALID_PARAMETER; 230 for (INT32 i=0; i<pSessionProp->num_alerts; i++) 231 { 232 DmtFirmAlert alert; 233 SYNCML_DM_RET_STATUS_T res; 234 INT32 count; 235 236 res = alert.setAlertType(((pSessionProp->alerts)+i)->strAlertType); 237 if ( res != SYNCML_DM_SUCCESS ) 238 return res; 239 240 res = alert.setAlertFormat(((pSessionProp->alerts)+i)->strAlertFormat); 241 if ( res != SYNCML_DM_SUCCESS ) 242 return res; 243 244 res = alert.setAlertMark(((pSessionProp->alerts)+i)->strAlertMark); 245 if ( res != SYNCML_DM_SUCCESS ) 246 return res; 247 248 res = alert.setResultData(((pSessionProp->alerts)+i)->strResultData); 249 if ( res != SYNCML_DM_SUCCESS ) 250 return res; 251 252 res = alert.setCorrelator(((pSessionProp->alerts)+i)->strCorrelator); 253 if ( res != SYNCML_DM_SUCCESS ) 254 return res; 255 256 if ( ((pSessionProp->alerts)+i)->strPackageURI != NULL ) 257 { 258 res = alert.setPackageURI(((pSessionProp->alerts)+i)->strPackageURI); 259 if ( res != SYNCML_DM_SUCCESS ) 260 return res; 261 } 262 263 count = sessionProp.addFirmAlert(alert); 264 if ( count != i+1 ) 265 return SYNCML_DM_DEVICE_FULL; 266 } 267 } 268 this->callback = callback; 269 return DMPrincipalMessage::set(szPrincipal,messageID,pUserData); 270 } 271 272 273 274 275 SYNCML_DM_RET_STATUS_T DMProcessNotificationMessage::set(CPCHAR szPrincipal, 276 const UINT8 * buf, 277 INT32 len, 278 DMT_CallbackProcessNotification callback, 279 UINT32 messageID, 280 UINT32 pUserData) 281 { 282 SYNCML_DM_RET_STATUS_T res; 283 res = DMPrincipalMessage::set(szPrincipal,messageID,pUserData); 284 if ( res == SYNCML_DM_SUCCESS ) 285 { 286 this->buf.assign(buf,len); 287 if ( this->buf.getBuffer() == NULL ) 288 { 289 return SYNCML_DM_DEVICE_FULL; 290 } 291 } 292 this->callback = callback; 293 return res; 294 } 295 296 297 SYNCML_DM_RET_STATUS_T DMTreeMessage::set(DMT_H_TREE htree, 298 CPCHAR path, 299 UINT32 messageID, 300 UINT32 pUserData) 301 { 302 DMAsyncMessage::set(messageID,pUserData); 303 if ( path ) 304 { 305 this->path = path; 306 if ( path[0] && this->path == NULL ) 307 { 308 return SYNCML_DM_DEVICE_FULL; 309 } 310 } 311 this->htree = htree; 312 return SYNCML_DM_SUCCESS; 313 } 314 315 316 317 SYNCML_DM_RET_STATUS_T DMGetNodeMessage::set(DMT_H_TREE htree, 318 CPCHAR path, 319 DMT_CallbackGetNode callback, 320 UINT32 messageID, 321 UINT32 pUserData) 322 { 323 this->callback = callback; 324 return DMTreeMessage::set(htree,path,messageID,pUserData); 325 } 326 327 328 SYNCML_DM_RET_STATUS_T DMTreeNodeMessage::set(DMT_H_TREE htree, 329 CPCHAR path, 330 CPCHAR str, 331 DMT_CallbackStatusCode callback, 332 UINT32 messageID, 333 UINT32 pUserData) 334 { 335 SYNCML_DM_RET_STATUS_T res; 336 res = DMTreeMessage::set(htree,path,messageID,pUserData); 337 if ( res == SYNCML_DM_SUCCESS ) 338 { 339 if ( str ) 340 { 341 this->str = str; 342 if ( str[0] && this->str == NULL ) 343 { 344 return SYNCML_DM_DEVICE_FULL; 345 } 346 } 347 this->callback = callback; 348 } 349 return res; 350 } 351 352 353 354 SYNCML_DM_RET_STATUS_T DMCreateLeafNodeMessage::set(DMT_H_TREE htree, 355 CPCHAR path, 356 const DMT_DATA_T* data, 357 DMT_CallbackStatusCode callback, 358 UINT32 messageID, 359 UINT32 pUserData) 360 { 361 SYNCML_DM_RET_STATUS_T res; 362 this->callback = callback; 363 res = DMTreeMessage::set(htree,path,messageID,pUserData); 364 if ( res == SYNCML_DM_SUCCESS ) 365 res = dmtBuildData(data, this->data); 366 return res; 367 } 368 369 370 SYNCML_DM_RET_STATUS_T DMGetChildNodeNamesMessage::set(DMT_H_TREE htree, 371 CPCHAR path, 372 DMT_CallbackGetChildNodeNames callback, 373 UINT32 messageID, 374 UINT32 pUserData) 375 { 376 this->callback = callback; 377 return DMTreeMessage::set(htree,path,messageID,pUserData); 378 } 379 380 381 SYNCML_DM_RET_STATUS_T DMGetChildValuesMapMessage::set(DMT_H_TREE htree, 382 CPCHAR path, 383 DMT_CallbackGetChildValuesMap callback, 384 UINT32 messageID, 385 UINT32 pUserData) 386 { 387 this->callback = callback; 388 return DMTreeMessage::set(htree,path,messageID,pUserData); 389 } 390 391 392 SYNCML_DM_RET_STATUS_T DMSetChildValuesMapMessage::set(DMT_H_TREE htree, 393 CPCHAR path, 394 const DMT_LEAF_CHILDREN_DATA_T* data, 395 DMT_CallbackStatusCode callback, 396 UINT32 messageID, 397 UINT32 pUserData) 398 { 399 SYNCML_DM_RET_STATUS_T res; 400 this->callback = callback; 401 res = DMTreeMessage::set(htree,path,messageID,pUserData); 402 if ( res == SYNCML_DM_SUCCESS ) 403 res = dmtBuildMap(data, this->data); 404 return res; 405 } 406 407 408 SYNCML_DM_RET_STATUS_T DMSetValueMessage::set(DMT_H_NODE hnode, 409 const DMT_DATA_T* data, 410 DMT_CallbackStatusCode callback, 411 UINT32 messageID, 412 UINT32 pUserData) 413 { 414 DMAsyncMessage::set(messageID,pUserData); 415 this->hnode = hnode; 416 this->callback = callback; 417 return dmtBuildData(data, this->data); 418 } 419 420 421 422 SYNCML_DM_RET_STATUS_T DMNodeMessage::set(DMT_H_NODE hnode, 423 CPCHAR str, 424 DMT_CallbackStatusCode callback, 425 UINT32 messageID, 426 UINT32 pUserData) 427 { 428 DMAsyncMessage::set(messageID,pUserData); 429 this->hnode = hnode; 430 this->callback = callback; 431 if ( str ) 432 { 433 this->str = str; 434 if ( str[0] && this->str == NULL ) 435 { 436 return SYNCML_DM_DEVICE_FULL; 437 } 438 } 439 return SYNCML_DM_SUCCESS; 440 } 441 442 443 SYNCML_DM_RET_STATUS_T DMExecuteMessage::set(DMT_H_NODE hnode, 444 CPCHAR params, 445 DMT_CallbackExecute callback, 446 UINT32 messageID, 447 UINT32 pUserData) 448 { 449 DMAsyncMessage::set(messageID,pUserData); 450 this->hnode = hnode; 451 this->callback = callback; 452 this->params = params; 453 if ( params ) 454 { 455 if ( params[0] && this->params == NULL ) 456 { 457 return SYNCML_DM_DEVICE_FULL; 458 } 459 } 460 return SYNCML_DM_SUCCESS; 461 } 462 463 464 void DMT_Free_GetChildNodeNamesStruct(DMT_CALLBACK_STRUCT_GET_CHILDNODE_NAMES_T *pStruct) 465 { 466 if ( pStruct == NULL ) 467 return; 468 469 if ( pStruct->ppChildren ) 470 { 471 for (INT32 index=0; index<pStruct->num_children; index++) 472 { 473 if ( pStruct->ppChildren[index] ) 474 dmtFreeCharPtr(pStruct->ppChildren[index]); 475 } 476 char ** ptr = (char**)pStruct->ppChildren; 477 DmFreeMem(ptr); 478 } 479 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_GET_CHILDNODE_NAMES_T)); 480 } 481 482 483 void DMT_Free_GetChildValuesStruct(DMT_CALLBACK_STRUCT_GET_CHILDVALUES_MAP_T *pStruct) 484 { 485 486 if ( pStruct == NULL ) 487 return; 488 489 if ( pStruct->data.ppChildren ) 490 { 491 for (INT32 index=0; index<pStruct->data.num_children; index++) 492 { 493 if ( pStruct->data.ppChildren[index] ) 494 dmtFreeCharPtr(pStruct->data.ppChildren[index]); 495 } 496 char ** ptr = (char**)pStruct->data.ppChildren; 497 DmFreeMem(ptr); 498 } 499 500 if ( pStruct->data.pData ) 501 { 502 for (INT32 index=0; index<pStruct->data.num_children; index++) 503 { 504 dmtFreeDataStruct((DMT_DATA_T*)&pStruct->data.pData[index]); 505 } 506 DMT_DATA_T * ptr = (DMT_DATA_T*)(pStruct->data.pData); 507 DmFreeMem(ptr); 508 } 509 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_GET_CHILDVALUES_MAP_T)); 510 511 512 } 513 514 void DMT_Free_GetAttributesStruct(DMT_CALLBACK_STRUCT_GET_ATTRIBUTES_T *pStruct) 515 { 516 if ( pStruct == NULL ) 517 return; 518 519 dmtFreeCharPtr(pStruct->attributes.name); 520 dmtFreeCharPtr(pStruct->attributes.format); 521 dmtFreeCharPtr(pStruct->attributes.title); 522 dmtFreeCharPtr(pStruct->attributes.type); 523 dmtFreeCharPtr(pStruct->attributes.acl); 524 525 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_GET_ATTRIBUTES_T)); 526 } 527 528 529 void DMT_Free_GetValueStruct(DMT_CALLBACK_STRUCT_GET_VALUE_T *pStruct) 530 { 531 if ( pStruct == NULL ) 532 return; 533 534 dmtFreeDataStruct(&pStruct->data); 535 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_GET_VALUE_T)); 536 537 } 538 539 void DMT_Free_ExecuteStruct(DMT_CALLBACK_STRUCT_EXECUTE_T *pStruct) 540 { 541 if ( pStruct == NULL ) 542 return; 543 544 dmtFreeCharPtr(pStruct->result); 545 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_EXECUTE_T)); 546 547 } 548 549 550 void DMT_Free_ProcessScriptStruct(DMT_CALLBACK_STRUCT_PROCESS_SCRIPT_T *pStruct) 551 { 552 if ( pStruct == NULL ) 553 return; 554 555 dmtFreeCharPtr(pStruct->result); 556 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_PROCESS_SCRIPT_T)); 557 558 } 559 560 void DMT_Free_BootstrapStruct(DMT_CALLBACK_STRUCT_BOOTSTRAP_T *pStruct) 561 { 562 if ( pStruct == NULL ) 563 return; 564 565 dmtFreeCharPtr(pStruct->serverID); 566 memset(pStruct,0,sizeof(DMT_CALLBACK_STRUCT_BOOTSTRAP_T)); 567 568 } 569 570 void DMT_Free_ProcessNotificationStruct(DMT_CALLBACK_STRUCT_PROCESS_NOTIFICATION_T *pStruct) 571 { 572 if ( pStruct == NULL ) 573 return; 574 575 dmtFreeCharPtr(pStruct->notification.serverID); 576 memset(pStruct,0,sizeof(DMT_NOTIFICATION_T)); 577 } 578