static void InitMandatoryPropertiesInRAM() { char* machineIdValue = propertyStoreRuntimeValues[AJSVC_PROPERTY_STORE_APP_ID].value[AJSVC_PROPERTY_STORE_NO_LANGUAGE_INDEX]; const char* currentAppIdValue = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_APP_ID); const char* currentDeviceIdValue = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_DEVICE_ID); const char* currentDeviceNameValue; int8_t langIndex; size_t serialIdLen = 0; size_t machineIdLen = 0; AJ_GUID theAJ_GUID; AJ_Status status; char deviceName[DEVICE_NAME_VALUE_LENGTH + 1] = { 0 }; if (currentAppIdValue == NULL || currentAppIdValue[0] == '\0') { status = AJ_GetLocalGUID(&theAJ_GUID); if (status == AJ_OK) { AJ_GUID_ToString(&theAJ_GUID, machineIdValue, propertyStoreRuntimeValues[AJSVC_PROPERTY_STORE_APP_ID].size); } } if (currentDeviceIdValue == NULL || currentDeviceIdValue[0] == '\0') { AJSVC_PropertyStore_SetValue(AJSVC_PROPERTY_STORE_DEVICE_ID, machineIdValue); } for (langIndex = 0; langIndex < AJSVC_PROPERTY_STORE_NUMBER_OF_LANGUAGES; langIndex++) { currentDeviceNameValue = AJSVC_PropertyStore_GetValueForLang(AJSVC_PROPERTY_STORE_DEVICE_NAME, langIndex); if (currentDeviceNameValue == NULL || currentDeviceNameValue[0] == '\0') { if (deviceName[0] == '\0') { #ifdef ONBOARDING_SERVICE serialIdLen = AJOBS_DEVICE_SERIAL_ID_LEN; #else serialIdLen = 7; #endif machineIdLen = strlen(machineIdValue); #ifdef _WIN32 _snprintf(deviceName, DEVICE_NAME_VALUE_LENGTH + 1, "%s %s %s", deviceManufactureName, deviceProductName, &machineIdValue[machineIdLen - min(serialIdLen, machineIdLen)]); #else snprintf(deviceName, DEVICE_NAME_VALUE_LENGTH + 1, "%s %s %s", deviceManufactureName, deviceProductName, &machineIdValue[machineIdLen - min(serialIdLen, machineIdLen)]); #endif } AJSVC_PropertyStore_SetValueForLang(AJSVC_PROPERTY_STORE_DEVICE_NAME, langIndex, deviceName); } } }
AJ_Status AJSVC_PropertyStore_ReadAll(AJ_Message* msg, AJSVC_PropertyStoreCategoryFilter filter, int8_t langIndex) { AJ_Status status = AJ_OK; AJ_Arg array; AJ_Arg array2; AJ_Arg dict; const char* value; AJ_Arg arg; uint8_t rawValue[16]; uint8_t index; const char* ajVersion; AJ_InfoPrintf(("PropertyStore_ReadAll()\n")); status = AJ_MarshalContainer(msg, &array, AJ_ARG_ARRAY); if (status != AJ_OK) { return status; } //AJSVC_PropertyStoreFieldIndices fieldIndex = 0; int fieldIndex = 0; for (; fieldIndex < AJSVC_PROPERTY_STORE_NUMBER_OF_KEYS; fieldIndex++) { #ifdef CONFIG_SERVICE if (propertyStoreProperties[fieldIndex].mode7Public && (filter.bit0About || (filter.bit1Config && propertyStoreProperties[fieldIndex].mode0Write) || (filter.bit2Announce && propertyStoreProperties[fieldIndex].mode1Announce))) { #else if (propertyStoreProperties[fieldIndex].mode7Public && (filter.bit0About || (filter.bit2Announce && propertyStoreProperties[fieldIndex].mode1Announce))) { #endif value = AJSVC_PropertyStore_GetValueForLang((AJSVC_PropertyStoreFieldIndices)fieldIndex, langIndex); if (value == NULL && fieldIndex >= AJSVC_PROPERTY_STORE_NUMBER_OF_MANDATORY_KEYS) { // Non existing values are skipped! AJ_WarnPrintf(("PropertyStore_ReadAll - Failed to get value for field=(name=%s, index=%d) and language=(name=%s, index=%d), skipping.\n", AJSVC_PropertyStore_GetFieldName((AJSVC_PropertyStoreFieldIndices)fieldIndex), (int)fieldIndex, AJSVC_PropertyStore_GetLanguageName(langIndex), (int)langIndex)); } else { if (fieldIndex == AJSVC_PROPERTY_STORE_APP_ID) { if (value == NULL) { AJ_ErrPrintf(("PropertyStore_ReadAll - Failed to get value for mandatory field=(name=%s, index=%d) and language=(name=%s, index=%d), aborting.\n", AJSVC_PropertyStore_GetFieldName((AJSVC_PropertyStoreFieldIndices)fieldIndex), (int)fieldIndex, AJSVC_PropertyStore_GetLanguageName(langIndex), (int)langIndex)); return AJ_ERR_NULL; } status = AJ_MarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", propertyStoreProperties[fieldIndex].keyName); if (status != AJ_OK) { return status; } status = AJ_MarshalVariant(msg, "ay"); if (status != AJ_OK) { return status; } status = AJ_HexToRaw(value, 0, rawValue, (size_t)sizeof(rawValue)); if (status != AJ_OK) { return status; } status = AJ_MarshalArg(msg, AJ_InitArg(&arg, AJ_ARG_BYTE, AJ_ARRAY_FLAG, rawValue, sizeof(rawValue))); if (status != AJ_OK) { return status; } status = AJ_MarshalCloseContainer(msg, &dict); if (status != AJ_OK) { return status; } #ifdef CONFIG_SERVICE } else if (fieldIndex == AJSVC_PROPERTY_STORE_MAX_LENGTH) { status = AJ_MarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", propertyStoreProperties[fieldIndex].keyName); if (status != AJ_OK) { return status; } status = AJ_MarshalVariant(msg, "q"); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "q", DEVICE_NAME_VALUE_LENGTH); if (status != AJ_OK) { return status; } status = AJ_MarshalCloseContainer(msg, &dict); if (status != AJ_OK) { return status; } AJ_InfoPrintf(("Has key [%s] runtime Value [%d]\n", propertyStoreProperties[AJSVC_PROPERTY_STORE_MAX_LENGTH].keyName, DEVICE_NAME_VALUE_LENGTH)); #endif } else if (fieldIndex == AJSVC_PROPERTY_STORE_AJ_SOFTWARE_VERSION) { ajVersion = AJ_GetVersion(); if (ajVersion == NULL) { AJ_ErrPrintf(("PropertyStore_ReadAll - Failed to get value for mandatory field=(name=%s, index=%d) and language=(name=%s, index=%d), aborting.\n", AJSVC_PropertyStore_GetFieldName((AJSVC_PropertyStoreFieldIndices)fieldIndex), (int)fieldIndex, AJSVC_PropertyStore_GetLanguageName(langIndex), (int)langIndex)); return AJ_ERR_NULL; } status = AJ_MarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", propertyStoreProperties[fieldIndex].keyName); if (status != AJ_OK) { return status; } status = AJ_MarshalVariant(msg, "s"); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", ajVersion); if (status != AJ_OK) { return status; } status = AJ_MarshalCloseContainer(msg, &dict); if (status != AJ_OK) { return status; } AJ_InfoPrintf(("Has key [%s] runtime Value [%s]\n", propertyStoreProperties[AJSVC_PROPERTY_STORE_AJ_SOFTWARE_VERSION].keyName, ajVersion)); } else { if (value == NULL) { AJ_ErrPrintf(("PropertyStore_ReadAll - Failed to get value for mandatory field=(name=%s, index=%d) and language=(name=%s, index=%d), aborting.\n", AJSVC_PropertyStore_GetFieldName((AJSVC_PropertyStoreFieldIndices)fieldIndex), (int)fieldIndex, AJSVC_PropertyStore_GetLanguageName(langIndex), (int)langIndex)); return AJ_ERR_NULL; } status = AJ_MarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", propertyStoreProperties[fieldIndex].keyName); if (status != AJ_OK) { return status; } status = AJ_MarshalVariant(msg, "s"); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", value); if (status != AJ_OK) { return status; } status = AJ_MarshalCloseContainer(msg, &dict); if (status != AJ_OK) { return status; } } } } } if (filter.bit0About) { // Add supported languages status = AJ_MarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { return status; } status = AJ_MarshalArgs(msg, "s", defaultLanguagesKeyName); if (status != AJ_OK) { return status; } status = AJ_MarshalVariant(msg, "as"); if (status != AJ_OK) { return status; } status = AJ_MarshalContainer(msg, &array2, AJ_ARG_ARRAY); if (status != AJ_OK) { return status; } index = AJSVC_PROPERTY_STORE_NO_LANGUAGE_INDEX; for (; index < AJSVC_PROPERTY_STORE_NUMBER_OF_LANGUAGES; index++) { status = AJ_MarshalArgs(msg, "s", propertyStoreDefaultLanguages[index]); if (status != AJ_OK) { return status; } } status = AJ_MarshalCloseContainer(msg, &array2); if (status != AJ_OK) { return status; } status = AJ_MarshalCloseContainer(msg, &dict); if (status != AJ_OK) { return status; } } status = AJ_MarshalCloseContainer(msg, &array); if (status != AJ_OK) { return status; } return status; } #ifdef CONFIG_SERVICE AJ_Status AJSVC_PropertyStore_Update(const char* key, int8_t langIndex, const char* value) { AJSVC_PropertyStoreFieldIndices fieldIndex = AJSVC_PropertyStore_GetFieldIndex(key); if (fieldIndex == AJSVC_PROPERTY_STORE_ERROR_FIELD_INDEX || fieldIndex >= AJSVC_PROPERTY_STORE_NUMBER_OF_CONFIG_KEYS) { return AJ_ERR_INVALID; } if (!UpdateFieldInRAM(fieldIndex, langIndex, value)) { return AJ_ERR_FAILURE; } return AJ_OK; }
const char* AJSVC_PropertyStore_GetValue(AJSVC_PropertyStoreFieldIndices fieldIndex) { return AJSVC_PropertyStore_GetValueForLang(fieldIndex, AJSVC_PROPERTY_STORE_NO_LANGUAGE_INDEX); }
/** * Send Notification - see notes in h file */ AJ_Status AJNS_Producer_SendNotification(AJ_BusAttachment* busAttachment, AJNS_NotificationContent* content, uint16_t messageType, uint32_t ttl, uint32_t* messageSerialNumber) { AJ_Status status; AJNS_Notification notification; uint32_t serialNumber; // AJ_InfoPrintf(("In SendNotification\n")); notification.version = AJNS_NotificationVersion; if (messageType >= AJNS_NUM_MESSAGE_TYPES) { AJ_ErrPrintf(("Could not Send Notification - MessageType is not valid\n")); return AJ_ERR_DISALLOWED; } notification.messageType = messageType; if ((ttl < AJNS_NOTIFICATION_TTL_MIN) || (ttl > AJNS_NOTIFICATION_TTL_MAX)) { //ttl is mandatory and must be in range AJ_ErrPrintf(("TTL '%u' is not a valid TTL value\n", ttl)); return AJ_ERR_DISALLOWED; } notification.deviceId = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_DEVICE_ID); notification.deviceName = AJSVC_PropertyStore_GetValueForLang(AJSVC_PROPERTY_STORE_DEVICE_NAME, AJSVC_PropertyStore_GetLanguageIndex("")); notification.appId = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_APP_ID); notification.appName = AJSVC_PropertyStore_GetValue(AJSVC_PROPERTY_STORE_APP_NAME); if ((notification.deviceId == 0) || (notification.deviceName == 0) || (notification.appId == 0) || (notification.appName == 0)) { AJ_ErrPrintf(("DeviceId/DeviceName/AppId/AppName can not be NULL\n")); return AJ_ERR_DISALLOWED; } if ((strlen(notification.deviceId) == 0) || (strlen(notification.deviceName) == 0) || (strlen(notification.appId) == 0) || (strlen(notification.appName) == 0)) { AJ_ErrPrintf(("DeviceId/DeviceName/AppId/AppName can not be empty\n")); return AJ_ERR_DISALLOWED; } if (notification.version > 1) { notification.originalSenderName = AJ_GetUniqueName(busAttachment); if (notification.originalSenderName == 0) { AJ_ErrPrintf(("OriginalSender can not be NULL\n")); return AJ_ERR_DISALLOWED; } if (strlen(notification.originalSenderName) == 0) { AJ_ErrPrintf(("OriginalSender can not be empty\n")); return AJ_ERR_DISALLOWED; } } else { notification.originalSenderName = NULL; } if (!notificationId) { // AJ_InfoPrintf(("Generating random number for notification id\n")); AJ_RandBytes((uint8_t*)¬ificationId, 4); } notification.notificationId = notificationId; notification.content = content; status = AJNS_Producer_SendNotifySignal(busAttachment, ¬ification, ttl, &serialNumber); if (status == AJ_OK) { lastSentNotifications[messageType].notificationId = notificationId++; lastSentNotifications[messageType].serialNum = serialNumber; if (messageSerialNumber != NULL) { *messageSerialNumber = serialNumber; } } return status; }
static const char* DescriptionLookup(uint32_t descId, const char* lang) { const char* actualLanguage; int8_t langIndex = AJSVC_PropertyStore_GetLanguageIndex(lang); char deviceName[DEVICE_NAME_VALUE_LENGTH] = { '\0' }; uint8_t i; const char* deviceNamePerLanguage; AJ_InfoPrintf(("Looking up description for o:%u i:%u m:%u a:%u\n", (descId >> 24) & 0xFF, (descId >> 16) & 0xFF, (descId >> 8) & 0xFF, (descId >> 0) & 0xFF)); if (langIndex != AJSVC_PROPERTY_STORE_ERROR_LANGUAGE_INDEX) { actualLanguage = AJSVC_PropertyStore_GetLanguageName(langIndex); AJ_InfoPrintf((" language=%s\n", actualLanguage)); deviceNamePerLanguage = AJSVC_PropertyStore_GetValueForLang(AJSVC_PROPERTY_STORE_DEVICE_NAME, langIndex); if (deviceNamePerLanguage == NULL) { deviceNamePerLanguage = AJSVC_PropertyStore_GetValueForLang(AJSVC_PROPERTY_STORE_DEVICE_NAME, AJSVC_PropertyStore_GetCurrentDefaultLanguageIndex()); if (deviceNamePerLanguage == NULL) { AJ_ErrPrintf(("DeviceName for language=%s does not exist!\n", actualLanguage)); } } if (deviceNamePerLanguage != NULL) { strncpy(deviceName, deviceNamePerLanguage, DEVICE_NAME_VALUE_LENGTH); } for (i = 0; i < DEVICE_NAME_VALUE_LENGTH; i++) { // Replace any illegal/escaped XML characters with '_' if (deviceName[i] == '>' || deviceName[i] == '<' || deviceName[i] == '"' || deviceName[i] == '\'' || deviceName[i] == '&') { deviceName[i] = '_'; } } switch (descId) { case (EVENTSANDACTIONS_OBJECT_DESC): #ifdef _WIN32 _snprintf(description, DESCRIPTION_LENGTH, "%s Events and Actions [%s]", deviceName, actualLanguage); #else snprintf(description, DESCRIPTION_LENGTH, "%s Events and Actions [%s]", deviceName, actualLanguage); #endif return description; case (EVENTS_INTERFACE_DESC): #ifdef _WIN32 _snprintf(description, DESCRIPTION_LENGTH, "%s Events [%s]", deviceName, actualLanguage); #else snprintf(description, DESCRIPTION_LENGTH, "%s Events [%s]", deviceName, actualLanguage); #endif return description; case (EVENTS_TEMPERATURE80FREACHED_SLS_DESC): return "Triggerred when extreme temperature of 80F is reached while heating"; case (EVENTS_TEMPERATURE60FREACHED_SLS_DESC): return "Triggerred when extreme temperature of 60F is reached while cooling"; case (EVENTS_TURNEDOFF_SLS_DESC): return "Triggerred when the AC is turned OFF"; case (EVENTS_TURNEDON_SLS_DESC): return "Triggerred when the AC is turned ON"; case (ACTIONS_INTERFACE_DESC): #ifdef _WIN32 _snprintf(description, DESCRIPTION_LENGTH, "%s Actions [%s]", deviceName, actualLanguage); #else snprintf(description, DESCRIPTION_LENGTH, "%s Actions [%s]", deviceName, actualLanguage); #endif return description; case (ACTIONS_SETMODETOAUTO_DESC): return "Set AC mode to Auto"; case (ACTIONS_SETMODETOCOOL_DESC): return "Set AC mode to Cool"; case (ACTIONS_SETMODETOHEAT_DESC): return "Set AC mode to Heat"; case (ACTIONS_SETMODETOFAN_DESC): return "Set AC mode to Fan"; case (ACTIONS_SETMODETOOFF_DESC): return "Set AC mode to Off"; default: return NULL; } } AJ_WarnPrintf(("\nError: Unsupported language=%s\n", lang == NULL ? "NULL" : lang)); return NULL; }