HRESULT ServiceFabric_DoX_NoResult()

in sfwrapper/inc/servicefabricdox.h [94:169]


HRESULT ServiceFabric_DoX_NoResult(
    I* client,
    Begin begin,
    End end,
    DWORD timeoutMilliseconds,
    TArgs... targs
)
{
    HRESULT result;
    HANDLE ev;
    if ((ev = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL)
    {
        result = HRESULT_FROM_WIN32(GetLastError());
        LogLastError("failure in CreateEvent");
    }
    else
    {
        IFabricAsyncOperationCallback* callback = IFabricAsyncOperationCallback_do_nothing_create(ev);
        if (callback == NULL)
        {
            LogError("failure in IFabricAsyncOperationCallback_do_nothing_create");
            result = E_FAIL;
        }
        else
        {
            IFabricAsyncOperationContext* context;
            result = (client->*begin)(targs..., timeoutMilliseconds, callback, &context);
            if (FAILED(result))
            {
                LogHRESULTError(result, "failure in begin");
                /*return as is*/
            }
            else
            {
                if (context->CompletedSynchronously())
                {
                    result = (client->*end)(context);
                    if (FAILED(result))
                    {
                        LogHRESULTError(result, "failure in end");
                        /*return as is*/
                    }
                    else
                    {
                        result = S_OK;
                    }
                }
                else
                {
                    if (WaitForSingleObject(ev, INFINITE) != WAIT_OBJECT_0)
                    {
                        LogLastError("failure in WaitForSingleObject");
                        result = MU_FAILURE;
                    }
                    else
                    {
                        result = (client->*end)(context);
                        if (FAILED(result))
                        {
                            LogHRESULTError(result, "failure in end");
                            /*return as is*/
                        }
                        else
                        {
                            result = S_OK;
                        }
                    }
                }
                (void)context->Release();
            }
            (void)callback->Release();
        }
        (void)CloseHandle(ev);
    }
    return result;
}