int FinalizeInstance()

in LCM/codec/mof/parser/types.c [3628:3824]


int FinalizeInstance(
    void * mofstate,
    MI_InstanceDecl* id)
{
    const MI_ClassDecl* cd;
    MI_Uint32 i;
    MI_Uint32 j;
    MOF_State * state = (MOF_State *)mofstate;
    MI_Boolean validClassDecl = MI_TRUE;
    MI_Instance *inst = NULL;
    MI_Result r = MI_RESULT_OK;
    MI_Boolean isClassDeclFromBuffer = MI_FALSE;
    /* Find the class declaration for this instance */
    {
        cd = FindClassDecl(state, id->name);
        if (!cd)
        {
            /* Process according to schema check option */
            switch(state->parser->param.schemacheck)
            {
            case SCHEMA_CHECK_DEFAULT:
            case SCHEMA_CHECK_IGNORE_PROPERTYTYPE:
            case SCHEMA_CHECK_STRICT:
            case SCHEMA_CHECK_LOOSE:
                {
                    yyerrorf(state->errhandler, ID_UNDEFINED_CLASS, "", id->name);
                    return -1;
                }
                break;
            case SCHEMA_CHECK_IGNORE:
                {
                    yywarnf(state->errhandler, ID_UNDEFINED_CLASS, "", id->name);
                    validClassDecl = MI_FALSE;
                }
                break;
            }
        }
        isClassDeclFromBuffer = state->internalstate.isClassDeclFromBuffer;
        id->decl = cd;
    }

    if (cd)
    {
        /* For each instance property */
        for (i = 0; i < id->numProperties; i++)
        {
            MI_PropertyDecl* p = id->properties[i];
            MI_PropertyDecl* q = NULL;

            /* Find the class property with the same name */
            {
                for (j = 0; j < cd->numProperties; j++)
                {
                    if (Tcscasecmp(cd->properties[j]->name, p->name) == 0)
                    {
                        q = cd->properties[j];
                        break;
                    }
                }

                if (!q)
                {
                    /* Process according to schema check option */
                    switch(state->parser->param.schemacheck)
                    {
                    case SCHEMA_CHECK_DEFAULT:
                    case SCHEMA_CHECK_IGNORE_PROPERTYTYPE:
                    case SCHEMA_CHECK_STRICT:
                        {
                            yyerrorf(state->errhandler, ID_UNDEFINED_PROPERTY, "", p->name);
                            return -1;
                        }
                        break;
                    case SCHEMA_CHECK_LOOSE:
                    case SCHEMA_CHECK_IGNORE:
                        {
                            yywarnf(state->errhandler, ID_UNDEFINED_PROPERTY, "", p->name);
                            validClassDecl = MI_FALSE;
                        }
                        break;
                    }
                }
            }

            if (q)
            {
                /* Promote instance property (to the type given by class property) */
                MI_Boolean embeddedpropertyError;
                if (_PromoteValue(state, p->type, q, &embeddedpropertyError, &p->value) != 0)
                {
                    // check return value from _PromoteValue
                    if (state->parser->param.schemacheck & SCHEMA_CHECK_IGNORE_PROPERTYTYPE)
                    {
                        yywarnf(state->errhandler, ID_CONVERT_PROPERTY_VALUE_FAILED,
                            "",
                            p->name,
                            _getTypeName_MI((MI_Type)p->type),
                            _getTypeName_MI((MI_Type)q->type));
                        validClassDecl = MI_FALSE;
                    }
                    else
                    {
                        if (MI_TRUE != embeddedpropertyError)
                        {
                            yyerrorf(state->errhandler, ID_CONVERT_PROPERTY_VALUE_FAILED,
                                "",
                                p->name,
                                _getTypeName_MI((MI_Type)p->type),
                                _getTypeName_MI((MI_Type)q->type));
                        }
                        return -1;
                    }
                }
                else
                {
                    /* Assume type of class property if success */
                    p->type = q->type;
                }
            }
        }
    }

    /* create instance base on instance decl */
    if (validClassDecl)
    {
        const MI_ClassDecl *newDecl = id->decl;
        if(isClassDeclFromBuffer)
        {
            r = state->onNewClassDecl(state->onNewClassDeclData,
                id->decl, (MI_ClassDecl**)&newDecl);
        }
        if (r == MI_RESULT_OK)
        {
            if (newDecl != id->decl) id->decl = newDecl;
            r = state->Instance_New(newDecl, &inst);
#ifdef TEST_BUILD
            TASSERT(r == MI_RESULT_OK, L"Ignore out of memory error in unit test fault injection.");
#endif
        }
    }
    else
    {
        r = state->Instance_InitDynamic(id->name, MI_FLAG_CLASS, &inst);
#ifdef TEST_BUILD
        TASSERT(r == MI_RESULT_OK, L"Ignore out of memory error in unit test fault injection.");
#endif
    }

    if (r != MI_RESULT_OK)
    {
        yyerrorf(state->errhandler, ID_MI_CREATEINSTANCE_FAILED,
            "",
            tcs(id->name),
            r);
        return -1;
    }

    /* For each instance property */
    for (i = 0; i < id->numProperties; i++)
    {
        MI_PropertyDecl* p = id->properties[i];
        MI_Value *value = (MI_Value*)(p->value);
        if (validClassDecl)
        {
            r = MI_Instance_SetElement(inst, p->name, value, (MI_Type)p->type, 0);
#ifdef TEST_BUILD
            TASSERT(r == MI_RESULT_OK, L"Ignore out of memory error in unit test fault injection.");
#endif
            if (r != MI_RESULT_OK)
            {
                yyerrorf(state->errhandler, ID_MI_SET_PROPERTY_FAILED,
                    "",
                    tcs(p->name),
                    r);
                return -1;
            }
        }
        else
        {
            r = MI_Instance_AddElement(inst, p->name, value, (MI_Type)p->type, 0);
#ifdef TEST_BUILD
            TASSERT(r == MI_RESULT_OK, L"Ignore out of memory error in unit test fault injection.");
#endif
            if (r != MI_RESULT_OK)
            {
                yyerrorf(state->errhandler, ID_MI_ADD_PROPERTY_FAILED,
                    "",
                    tcs(p->name),
                    r);
                return -1;
            }
        }
    }
    /* create instance successfully */
    id->instance = inst;
    return 0;
}