MI_Result Convert_MIInstance_JSON()

in LCM/dsc/engine/EngineHelper/EngineHelper.c [1344:1681]


MI_Result  Convert_MIInstance_JSON (
        const MI_Instance* p_instance,
        JSON_Value** p_result_root_value
    )
{
    MI_Result result = MI_RESULT_OK;

    *p_result_root_value = json_value_init_object();
    JSON_Object *result_root_object = json_value_get_object(*p_result_root_value);

    if (p_instance == NULL || p_instance->classDecl == NULL)
    {
        return result;
    }

    MI_Uint32 i = 0;
    for(i = 0 ; i < p_instance->classDecl->numProperties; i++)
    {
        MI_Value value;
        MI_Type type;
        MI_Uint32 flags;
        const MI_Char *name;
        MI_Result r = MI_RESULT_OK;
        r = MI_Instance_GetElementAt(p_instance, i, &name, &value, &type, &flags);
        if( r == MI_RESULT_OK)
        {
            if( flags & MI_FLAG_NULL)
            {
                json_object_set_null(result_root_object, p_instance->classDecl->properties[i]->name);
            }
            else
            {
                switch(type) {
                    case MI_BOOLEAN :{
                        json_object_set_boolean(result_root_object, p_instance->classDecl->properties[i]->name, value.boolean);
                        break;
                    }
                    case MI_UINT8 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.uint8);
                        break;
                    }
                    case MI_UINT16 :{
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.uint16);
                        break;
                    }
                    case MI_UINT32 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.uint32);
                        break;
                    }
                    case MI_UINT64 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.uint64);
                        break;
                    }
                    case MI_SINT8 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.sint8);
                        break;
                    }
                    case MI_SINT16 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.sint16);
                        break;
                    }
                    case MI_SINT32 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.sint32);
                        break;
                    }
                    case MI_SINT64 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.sint64);
                        break;
                    }
                    case MI_REAL32 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.real32);
                        break;
                    }
                    case MI_REAL64 : {
                        json_object_set_number(result_root_object, p_instance->classDecl->properties[i]->name, value.real64);
                        break;
                    }
                    case MI_CHAR16 : {
                        json_object_set_string(result_root_object, p_instance->classDecl->properties[i]->name, value.char16);
                        break;
                    }
                    case MI_DATETIME : {
                        MI_Datetime val = value.datetime;
                        char buffer[100]; 
                        if (val.isTimestamp)
                        {
                            sprintf(buffer, "%.4d/%.2d%.2d %.2d:%.2d:%.2d:%.2d - %d",
                                val.u.timestamp.year, val.u.timestamp.month, val.u.timestamp.day,
                                val.u.timestamp.hour, val.u.timestamp.minute, val.u.timestamp.second, val.u.timestamp.microseconds,
                                val.u.timestamp.utc);
                        }
                        else
                        {
                            sprintf(buffer, "%.2d:%.2d:%.2d:%.2d:%.6d",
                                val.u.interval.days,
                                val.u.interval.hours,
                                val.u.interval.minutes,
                                val.u.interval.seconds,
                                val.u.interval.microseconds);
                        }
                        json_object_set_string(result_root_object, p_instance->classDecl->properties[i]->name, buffer);
                        break;
                    }
                    case MI_STRING : {
                        json_object_set_string(result_root_object, p_instance->classDecl->properties[i]->name, value.string);
                        break;
                    }
                    case MI_INSTANCE : {
                        JSON_Value *json_value;
                        Convert_MIInstance_JSON(value.instance, &json_value);
                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_value);
                        break;
                    }
                    case MI_BOOLEANA : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.booleana.size; j++)
                        {
                            json_array_append_boolean(json_array_object, value.booleana.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_UINT8A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.uint8a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.uint8a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_UINT16A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.uint16a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.uint16a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_UINT32A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.uint32a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.uint32a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_UINT64A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.uint64a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.uint64a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_SINT8A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.sint8a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.sint8a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_SINT16A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.sint16a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.sint16a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_SINT32A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.sint32a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.sint32a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_SINT64A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.sint64a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.sint64a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_REAL32A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real32a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.real32a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_REAL64A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real64a.size; j++)
                        {
                            json_array_append_number(json_array_object, value.real64a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_CHAR16A : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real64a.size; j++)
                        {
                            json_array_append_string(json_array_object, value.char16a.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_DATETIMEA : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real64a.size; j++)
                        {
                            MI_Datetime val = value.datetime;
                            char buffer[100]; 
                            if (val.isTimestamp)
                            {
                                sprintf(buffer, "%.4d/%.2d%.2d %.2d:%.2d:%.2d:%.2d - %d",
                                    val.u.timestamp.year, val.u.timestamp.month, val.u.timestamp.day,
                                    val.u.timestamp.hour, val.u.timestamp.minute, val.u.timestamp.second, val.u.timestamp.microseconds,
                                    val.u.timestamp.utc);
                            }
                            else
                            {
                                sprintf(buffer, "%.2d:%.2d:%.2d:%.2d:%.6d",
                                    val.u.interval.days,
                                    val.u.interval.hours,
                                    val.u.interval.minutes,
                                    val.u.interval.seconds,
                                    val.u.interval.microseconds);
                            }
                            json_array_append_string(json_array_object, buffer);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;

                        
                        break;
                    }
                    case MI_STRINGA : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real64a.size; j++)
                        {
                            json_array_append_string(json_array_object, value.stringa.data[j]);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                    case MI_INSTANCEA : {
                        MI_Uint32 j = 0;
                        JSON_Value *json_array_value = json_value_init_array();
                        JSON_Object *json_array_object = json_value_get_object(json_array_value);
                        
                        for(j = 0; j < value.real64a.size; j++)
                        {
                            JSON_Value *json_val;
                            Convert_MIInstance_JSON(value.instancea.data[j], &json_val);
                            json_array_append_value(json_array_object, json_val);
                        }

                        json_object_set_value(result_root_object, p_instance->classDecl->properties[i]->name, json_array_value);
                        break;
                    }
                }
            }
        }
    }

    return result;
}