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 #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