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