static int ParseModuleInfo()

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;
}