int IFabricCodePackageActivationContext_to_ARGC_ARGV()

in src/fc_activation_context.c [496:620]


int IFabricCodePackageActivationContext_to_ARGC_ARGV(IFabricCodePackageActivationContext* iFabricCodePackageActivationContext, int* argc, char*** argv)
{
    int result;
    if (
        (iFabricCodePackageActivationContext == NULL) ||
        (argc == NULL) ||
        (argv == NULL)
        )
    {
        LogError("invalid argument IFabricCodePackageActivationContext* iFabricCodePackageActivationContext=%p, int* argc=%p, char*** argv=%p",
            iFabricCodePackageActivationContext, argc, argv);
        result = MU_FAILURE;
    }
    else
    {
        HRESULT hr;

        *argc = 0;
        *argv = NULL;
        IFabricStringListResult* fabricStringListResult;

        hr = iFabricCodePackageActivationContext->lpVtbl->GetConfigurationPackageNames(iFabricCodePackageActivationContext, &fabricStringListResult);
        if (FAILED(hr))
        {
            LogHRESULTError(hr, "failure in GetConfigurationPackageNames");
            result = MU_FAILURE;
        }
        else
        {
            ULONG nStrings;
            const wchar_t** strings;

            hr = fabricStringListResult->lpVtbl->GetStrings(fabricStringListResult, &nStrings, &strings);
            if (FAILED(hr))
            {
                LogHRESULTError(hr, "failure in GetStrings");
                result = MU_FAILURE;
            }
            else
            {
                ULONG i;
                bool wasError = false;
                for (i = 0; !wasError && i < nStrings; i++)
                {
                    IFabricConfigurationPackage* configPackage;
                    hr = iFabricCodePackageActivationContext->lpVtbl->GetConfigurationPackage(iFabricCodePackageActivationContext, strings[i], &configPackage);
                    if (FAILED(hr))
                    {
                        wasError = true;
                        LogHRESULTError(hr, "failure in GetConfigurationPackage");
                    }
                    else
                    {
                        int p_argc;
                        char** p_argv;
                        if (IFabricConfigurationPackage_to_ARGC_ARGV(configPackage, &p_argc, &p_argv) != 0)
                        {
                            wasError = true;
                            LogError("failure in IFabricConfigurationPackage_to_ARGC_ARGV");
                        }
                        else
                        {
                            if (ARGC_ARGV_concat(argc, argv, p_argc, p_argv) != 0)
                            {
                                wasError = true;
                                LogError("Failure in ARGC_ARGV_concat");
                            }
                            else
                            {
                                /*all nice keep going*/
                            }

                            ARGC_ARGV_free(p_argc, p_argv);
                        }

                        configPackage->lpVtbl->Release(configPackage);
                    }
                }
                if (wasError)
                {
                    ARGC_ARGV_free(*argc, *argv);
                    LogError("failing because of previous logged error");
                    result = MU_FAILURE;
                }
                else
                {
                    /*add the rest of the serviceEndpointDescriptions*/
                    const FABRIC_ENDPOINT_RESOURCE_DESCRIPTION_LIST* list = iFabricCodePackageActivationContext->lpVtbl->get_ServiceEndpointResources(iFabricCodePackageActivationContext);
                    if (list == NULL)
                    {
                        LogError("failure in get_ServiceEndpointResources");
                        result = MU_FAILURE;
                    }
                    else
                    {
                        int p_argc;
                        char** p_argv;
                        if (FABRIC_ENDPOINT_RESOURCE_DESCRIPTION_LIST_to_ARGC_ARGV(list, &p_argc, &p_argv) != 0)
                        {
                            LogError("failure in FABRIC_ENDPOINT_RESOURCE_DESCRIPTION_LIST_to_ARGC_ARGV");
                            result = MU_FAILURE;
                        }
                        else
                        {
                            if (ARGC_ARGV_concat(argc, argv, p_argc, p_argv) != 0)
                            {
                                LogError("failure in ARGC_ARGV_concat");
                                ARGC_ARGV_free(p_argc, p_argv);
                                result = MU_FAILURE;
                            }
                            else
                            {
                                ARGC_ARGV_free(p_argc, p_argv);
                                result = 0;
                            }
                        }
                    }
                    result != 0 ? ARGC_ARGV_free(*argc, *argv) : (void)0;
                }
            }
            fabricStringListResult->lpVtbl->Release(fabricStringListResult);
        }
    }
    return result;
}