diff --git a/source/InterDeviceManager/Idm_data.c b/source/InterDeviceManager/Idm_data.c index 0bd926e..bcb8272 100644 --- a/source/InterDeviceManager/Idm_data.c +++ b/source/InterDeviceManager/Idm_data.c @@ -47,6 +47,8 @@ static int IdmMgr_get_IDM_ParametersFromPSM() retPsmGet = IDM_RdkBus_GetParamValuesFromDB(param_name,param_value,sizeof(param_value)); + CcspTraceInfo(("%s %d - Capabilities initial value from PSM %s \n", __FUNCTION__, __LINE__ , param_value)); + if (retPsmGet == CCSP_SUCCESS) { AnscCopyString(pidmDmlInfo->stConnectionInfo.Capabilities, param_value); @@ -124,6 +126,7 @@ int IdmMgr_write_IDM_ParametersToPSM() _ansc_memset(param_value, 0, sizeof(param_value)); _ansc_sprintf(param_name, PSM_DEVICE_CAPABILITIES); _ansc_sprintf(param_value, pidmDmlInfo->stConnectionInfo.Capabilities); + CcspTraceInfo(("%s %d - Setting %s with value %s \n", __FUNCTION__, __LINE__ ,PSM_DEVICE_CAPABILITIES, pidmDmlInfo->stConnectionInfo.Capabilities)); retPsmGet = IDM_RdkBus_SetParamValuesToDB(param_name,param_value); _ansc_memset(param_name, 0, sizeof(param_name)); @@ -220,6 +223,7 @@ ANSC_STATUS IdmMgr_Data_Init(void) gpidmDmlInfo.pidmDmlInfo = (PIDM_DML_INFO)AnscAllocateMemory(sizeof(IDM_DML_INFO)); IdmMgr_SetConfigData_Default(); + CcspTraceInfo(("%s %d: Calling IdmMgr_get_IDM_ParametersFromPSM\n", __FUNCTION__, __LINE__)); IdmMgr_get_IDM_ParametersFromPSM(); pthread_mutex_init(&(gpidmDmlInfo.mDataMutex), &(muttex_attr)); return ANSC_STATUS_SUCCESS; diff --git a/source/InterDeviceManager/Idm_rbus.c b/source/InterDeviceManager/Idm_rbus.c index 4bf70c0..174aa09 100644 --- a/source/InterDeviceManager/Idm_rbus.c +++ b/source/InterDeviceManager/Idm_rbus.c @@ -574,7 +574,31 @@ rbusError_t X_RDK_Remote_MethodHandler(rbusHandle_t handle, char const* methodNa IdmMgrDml_GetConfigData_release(pidmDmlInfo); return RBUS_ERROR_BUS_ERROR; } + CcspTraceInfo(("%s %d - Device.X_RDK_Remote.AddDeviceCapabilities() - %s \n", __FUNCTION__, __LINE__, str)); + CcspTraceInfo(("%s %d - PSM capabilities before addition: %s \n", __FUNCTION__, __LINE__,pidmDmlInfo->stConnectionInfo.Capabilities)); + + CcspTraceInfo(("%s %d - Local device capabilities before addition: %s \n", __FUNCTION__, __LINE__,indexNode->stRemoteDeviceInfo.Capabilities)); + + if(strlen(indexNode->stRemoteDeviceInfo.Capabilities) == 0) + { + CcspTraceInfo(("%s %d - local device capabilities is empty \n", __FUNCTION__, __LINE__)); + if(strlen(pidmDmlInfo->stConnectionInfo.Capabilities) > 0) + { + CcspTraceInfo(("%s %d - Updating local device capabilities from PSM %s \n", __FUNCTION__, __LINE__)); + rc = strcpy_s(indexNode->stRemoteDeviceInfo.Capabilities, sizeof(indexNode->stRemoteDeviceInfo.Capabilities), pidmDmlInfo->stConnectionInfo.Capabilities); + ERR_CHK(rc); + } + else + { + // PSM data structre is also empty. Read it from factory and update local device cap + IdmMgr_GetFactoryDefaultValue(PSM_DEVICE_CAPABILITIES, pidmDmlInfo->stConnectionInfo.Capabilities); + CcspTraceInfo(("%s %d - Updating local device capabilities from factory PSM: %s \n", __FUNCTION__, __LINE__)); + rc = strcpy_s(indexNode->stRemoteDeviceInfo.Capabilities, sizeof(indexNode->stRemoteDeviceInfo.Capabilities), pidmDmlInfo->stConnectionInfo.Capabilities); + ERR_CHK(rc); + } + } + /* Append local device capabilities from rbus value */ char* token = strtok(str, ","); while (token != NULL) { @@ -590,13 +614,18 @@ rbusError_t X_RDK_Remote_MethodHandler(rbusHandle_t handle, char const* methodNa } token = strtok(NULL, ","); } - strncpy(pidmDmlInfo->stConnectionInfo.Capabilities, indexNode->stRemoteDeviceInfo.Capabilities, sizeof(pidmDmlInfo->stConnectionInfo.Capabilities)-1); - CcspTraceInfo(("%s %d: DeviceCapabilities str = %s\n", __FUNCTION__, __LINE__, indexNode->stRemoteDeviceInfo.Capabilities)); - - IdmMgrDml_GetConfigData_release(pidmDmlInfo); + CcspTraceInfo(("%s %d - New local device capabilities after addition: %s \n", __FUNCTION__, __LINE__,indexNode->stRemoteDeviceInfo.Capabilities)); + + CcspTraceInfo(("%s %d - Updating PSM with new local device capabilities: %s \n", __FUNCTION__, __LINE__,indexNode->stRemoteDeviceInfo.Capabilities)); + + rc = strcpy_s(pidmDmlInfo->stConnectionInfo.Capabilities, sizeof(pidmDmlInfo->stConnectionInfo.Capabilities), indexNode->stRemoteDeviceInfo.Capabilities); + ERR_CHK(rc); + IdmMgrDml_GetConfigData_release(pidmDmlInfo); + CcspTraceInfo(("%s %d - Broadcsting local device capabilities \n", __FUNCTION__, __LINE__)); IDM_Broadcast_LocalDeviceInfo(); IdmMgr_write_IDM_ParametersToPSM(); + return RBUS_ERROR_SUCCESS; } else if(strcmp(methodName, "Device.X_RDK_Remote.RemoveDeviceCapabilities()") == 0) @@ -607,17 +636,44 @@ rbusError_t X_RDK_Remote_MethodHandler(rbusHandle_t handle, char const* methodNa uint32_t source_len = 0; char *source = NULL; + CcspTraceInfo(("%s %d - Device.X_RDK_Remote.RemoveDeviceCapabilities() \n", __FUNCTION__, __LINE__)); + rbusValue_t value = rbusObject_GetValue(inParams, NULL ); out = rbusValue_GetString(value, &len); indexNode = getRmDeviceNode(pidmDmlInfo, 1); - if(!indexNode || len == 0) + if(!indexNode || len == 0 || !out) { IdmMgrDml_GetConfigData_release(pidmDmlInfo); return RBUS_ERROR_BUS_ERROR; } + CcspTraceInfo(("%s %d - Device.X_RDK_Remote.RemoveDeviceCapabilities() - %s \n", __FUNCTION__, __LINE__,out)); + + CcspTraceInfo(("%s %d - PSM capabilities before removal: %s \n", __FUNCTION__, __LINE__,pidmDmlInfo->stConnectionInfo.Capabilities)); + + CcspTraceInfo(("%s %d - Local device capabilities before removal: %s \n", __FUNCTION__, __LINE__,indexNode->stRemoteDeviceInfo.Capabilities)); + if(strlen(indexNode->stRemoteDeviceInfo.Capabilities) == 0) + { + CcspTraceInfo(("%s %d - local device capabilities is empty \n", __FUNCTION__, __LINE__)); + if(strlen(pidmDmlInfo->stConnectionInfo.Capabilities) > 0) + { + CcspTraceInfo(("%s %d - Updating local device capabilities from PSM: %s \n", __FUNCTION__, __LINE__)); + rc = strcpy_s(indexNode->stRemoteDeviceInfo.Capabilities, sizeof(indexNode->stRemoteDeviceInfo.Capabilities), pidmDmlInfo->stConnectionInfo.Capabilities); + ERR_CHK(rc); + } + else + { + // PSM data structre is also empty. Read it from factory and update local device cap + IdmMgr_GetFactoryDefaultValue(PSM_DEVICE_CAPABILITIES, pidmDmlInfo->stConnectionInfo.Capabilities); + CcspTraceInfo(("%s %d - Updating local device capabilities from factory PSM: %s \n", __FUNCTION__, __LINE__)); + rc = strcpy_s(indexNode->stRemoteDeviceInfo.Capabilities, sizeof(indexNode->stRemoteDeviceInfo.Capabilities), pidmDmlInfo->stConnectionInfo.Capabilities); + ERR_CHK(rc); + } + } + + /* Remove capability as requested by rbus value */ char * arr = indexNode->stRemoteDeviceInfo.Capabilities; char* token = strtok((char *)out, ","); while (token != NULL) @@ -634,8 +690,8 @@ rbusError_t X_RDK_Remote_MethodHandler(rbusHandle_t handle, char const* methodNa // removing last ; char *(capPos - 1) = '\0'; } - IdmMgrDml_GetConfigData_release(pidmDmlInfo); - return RBUS_ERROR_SUCCESS; + // allow to update PSM and broadcast the capabilites after removal + break; } // Copy remaining strings excluding token and comma source = capPos + (strlen(token) + 1); @@ -650,10 +706,16 @@ rbusError_t X_RDK_Remote_MethodHandler(rbusHandle_t handle, char const* methodNa } token = strtok(NULL, ","); } + + /* Some capabilites might have removed in local device. write back to PSM */ + CcspTraceInfo(("%s %d - New local device capabilities after removal : %s \n", __FUNCTION__, __LINE__, indexNode->stRemoteDeviceInfo.Capabilities)); + + CcspTraceInfo(("%s %d - Updating PSM with new local device capabilities : %s \n", __FUNCTION__, __LINE__, indexNode->stRemoteDeviceInfo.Capabilities)); + rc = strcpy_s(pidmDmlInfo->stConnectionInfo.Capabilities, sizeof(pidmDmlInfo->stConnectionInfo.Capabilities), indexNode->stRemoteDeviceInfo.Capabilities); ERR_CHK(rc); - CcspTraceInfo(("%s %d: DeviceCapabilities str = %s\n", __FUNCTION__, __LINE__, indexNode->stRemoteDeviceInfo.Capabilities)); IdmMgrDml_GetConfigData_release(pidmDmlInfo); + CcspTraceInfo(("%s %d - Publishing local device info \n", __FUNCTION__, __LINE__)); IDM_Broadcast_LocalDeviceInfo(); IdmMgr_write_IDM_ParametersToPSM(); return RBUS_ERROR_SUCCESS;