FC_ACTIVATION_CONTEXT_HANDLE fc_activation_context_create()

in src/fc_activation_context.c [31:151]


FC_ACTIVATION_CONTEXT_HANDLE fc_activation_context_create(int argc, char** argv, int* argc_consumed)
{
    FC_ACTIVATION_CONTEXT_HANDLE result;
    if (
        (argv == NULL) ||
        (argc_consumed == NULL)
        )
    {
        LogError("invalid argument int argc=%d, char** argv=%p, int* argc_consumed=%p", argc, argv, argc_consumed);
        result = NULL;
    }
    else
    {
        *argc_consumed = 0;
        result = NULL;
        int c_argc;

        result = malloc(sizeof(struct FC_ACTIVATION_CONTEXT_TAG));
        if (result == NULL)
        {
            LogError("failure in malloc");
        }
        else
        {
            result->nFabricConfigurationPackages = 0;
            result->iFabricConfigurationPackages = NULL;

            FC_PACKAGE_HANDLE fc_package;
            bool done = false;
            bool waserror = false;

            while(!done && !waserror)
            {
                fc_package = fc_package_create(argc - *argc_consumed, argv + *argc_consumed, &c_argc);
                if (fc_package == NULL)
                {
                    /*not an error, just indicates we are done */
                    /*wrong, it is an error. Task 16098536: fc_package_create should differentiate betweene ERROR and "does not start with..." will address it*/
                    /*errr... will assume NULL means "we are done"*/
                    done = true;
                }
                else
                {
                    *argc_consumed += c_argc;

                    bool wasMoved = false;
                    IFabricConfigurationPackage* temp_IFabricConfigurationPackage = COM_WRAPPER_CREATE(FC_PACKAGE_HANDLE, IFabricConfigurationPackage, fc_package, fc_package_destroy);
                    if (temp_IFabricConfigurationPackage == NULL)
                    {
                        LogError("failure in COM_WRAPPER_CREATE");
                        waserror = true;
                    }
                    else
                    {
                        wasMoved = true;


                        IFabricConfigurationPackage** temp = realloc_2(result->iFabricConfigurationPackages, (result->nFabricConfigurationPackages + 1), sizeof(IFabricConfigurationPackage*));
                        if (temp == NULL)
                        {
                            LogError("failure in realloc_2");
                            waserror = true;
                        }
                        else
                        {
                            result->iFabricConfigurationPackages = temp;
                            result->iFabricConfigurationPackages[result->nFabricConfigurationPackages] = temp_IFabricConfigurationPackage;
                            result->nFabricConfigurationPackages++;
                            continue;
                        }

                        temp_IFabricConfigurationPackage->lpVtbl->Release(temp_IFabricConfigurationPackage);
                    }

                    wasMoved ? (void)0: fc_package_destroy(fc_package);
                    
                }
            } /*can only exit when waserrror = true or when done==true*/

            if (waserror)
            {
                free(result);
                result = NULL;
            }
            else
            {
                /*see if there are endpoint resources here...*/
                ARGC_ARGV_DATA_RESULT r;
                r = FABRIC_ENDPOINT_RESOURCE_DESCRIPTION_LIST_from_ARGC_ARGV(argc - *argc_consumed, argv + *argc_consumed, &result->fabric_endpoint_resource_description_list, &c_argc);
                switch (r)
                {
                    case ARGC_ARGV_DATA_OK:
                    {
                        *argc_consumed += c_argc;
                        /*all fine*/
                        break;
                    }
                    case ARGC_ARGV_DATA_INVALID:
                    {
                        /*all fine*/
                        result->fabric_endpoint_resource_description_list.Count = 0;
                        result->fabric_endpoint_resource_description_list.Items = NULL;
                        break;
                    }
                    default:
                    case ARGC_ARGV_DATA_ERROR:
                    {
                        LogError("failure in FABRIC_ENDPOINT_RESOURCE_DESCRIPTION_LIST_from_ARGC_ARGV, it returned %" PRI_MU_ENUM "", MU_ENUM_VALUE(ARGC_ARGV_DATA_RESULT, r));
                        free(result); /*very likely MORE handling is needed here for cleanup*/
                        result = NULL; /*return it*/
                        break;
                    }

                }
                
            }
        }
    }
     
    return result;
}