in src/platform/MmiClient.c [61:219]
static int ParseModuleInfo(const JSON_Value* value, MODULE_INFO** moduleInfo)
{
MODULE_INFO* info = NULL;
JSON_Object* object = NULL;
JSON_Array* components = NULL;
int componentsCount = 0;
int status = 0;
char* component = NULL;
int i = 0;
if ((NULL == value) || (NULL == moduleInfo))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo(%p, %p) called with invalid arguments", value, moduleInfo);
status = EINVAL;
}
else if (NULL == (object = json_value_get_object(value)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: JSON value is not an object");
status = EINVAL;
}
else if (NULL == (info = (MODULE_INFO*)malloc(sizeof(MODULE_INFO))))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for module info");
status = ENOMEM;
}
else
{
memset(info, 0, sizeof(MODULE_INFO));
if (NULL == (info->name = (char*)json_object_get_string(object, g_infoName)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info is missing required field '%s'", g_infoName);
status = EINVAL;
}
else if (NULL == (info->name = strdup(info->name)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for module name");
status = errno;
}
else if (NULL == (info->description = (char*)json_object_get_string(object, g_infoDescription)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info is missing required field '%s'", g_infoDescription);
status = EINVAL;
}
else if (NULL == (info->description = strdup(info->description)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for module description");
status = errno;
}
else if (NULL == (info->manufacturer = (char*)json_object_get_string(object, g_infoManufacturer)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info is missing required field '%s'", g_infoManufacturer);
status = EINVAL;
}
else if (NULL == (info->manufacturer = strdup(info->manufacturer)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for module manufacturer");
status = errno;
}
else if (NULL == (info->versionInfo = (char*)json_object_get_string(object, g_infoVersionInfo)))
{
OsConfigLogError(GetPlatformLog(), "Module info is missing required field '%s'", g_infoVersionInfo);
status = EINVAL;
}
else if (NULL == (info->versionInfo = strdup(info->versionInfo)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for module version info");
status = errno;
}
else if (NULL == (components = json_object_get_array(object, g_infoComponents)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info is missing required field '%s'", g_infoComponents);
status = EINVAL;
}
else if (0 == (componentsCount = json_array_get_count(components)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info has no components");
status = EINVAL;
}
else if (json_value_get_type(json_object_get_value(object, g_infoLifetime)) != JSONNumber)
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info has invalid lifetime type");
status = EINVAL;
}
else
{
info->licenseUri = (char*)json_object_get_string(object, g_infoLicenseUri);
info->projectUri = (char*)json_object_get_string(object, g_infoProjectUri);
info->userAccount = json_object_get_number(object, g_infoUserAccount);
info->version.major = json_object_get_number(object, g_infoVersionMajor);
info->version.minor = json_object_get_number(object, g_infoVersionMinor);
info->version.patch = json_object_get_number(object, g_infoVersionPatch);
info->version.tweak = json_object_get_number(object, g_infoVersionTweak);
if (json_object_has_value_of_type(object, g_infoLifetime, JSONNumber))
{
info->lifetime = json_object_get_number(object, g_infoLifetime);
if ((info->lifetime < 0) || (2 < info->lifetime))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info has invalid lifetime (%d)", info->lifetime);
status = EINVAL;
}
}
else
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: module info is missing required field '%s'", g_infoLifetime);
}
if ((NULL != info->licenseUri) && (NULL == (info->licenseUri = strdup(info->licenseUri))))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for license URI");
status = errno;
}
if ((NULL != info->projectUri) && (NULL == (info->projectUri = strdup(info->projectUri))))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for project URI");
status = errno;
}
if (NULL == (info->components = (char**)malloc(componentsCount * sizeof(char*))))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to allocate memory for components");
status = ENOMEM;
}
else
{
info->componentCount = componentsCount;
for (i = 0; i < componentsCount; i++)
{
if (NULL == (component = (char*)json_array_get_string(components, i)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to get component name at index %d", i);
status = EINVAL;
break;
}
else if (NULL == (info->components[i] = strdup(component)))
{
OsConfigLogError(GetPlatformLog(), "ParseModuleInfo: failed to copy component name at index %d", i);
status = errno;
break;
}
}
}
}
if (0 == status)
{
*moduleInfo = info;
}
else
{
FreeModuleInfo(info);
}
}
return status;
}