std::string DeviceGlue::WaitForC2dMessage()

in docker_images/c/wrapper/glue/DeviceGlue.cpp [33:66]


std::string DeviceGlue::WaitForC2dMessage(std::string connectionId)
{
    IOTHUB_CLIENT_RESULT ret;

    std::cout << "DeviceGlue::WaitForC2dMessage for " << connectionId << std::endl;
    IOTHUB_DEVICE_CLIENT_HANDLE client = (IOTHUB_DEVICE_CLIENT_HANDLE)this->clientMap[connectionId];
    if (!client)
    {
        throw new std::runtime_error("client is not opened");
    }

    message_response_struct resp;
    ret = IoTHubDeviceClient_SetMessageCallback(client, receiveMessageCallback, &resp);
    ThrowIfFailed(ret, "IoTHubDeviceClient_SetMessageCallback");

    std::cout << "waiting for message" << std::endl;
    try
    {
        std::unique_lock<std::mutex> lk(resp.m);
        resp.cv.wait(lk);
    }
    catch (...)
    {
        ret = IoTHubDeviceClient_SetMessageCallback(client, NULL, NULL);
        ThrowIfFailed(ret, "IoTHubDeviceClient_SetMessageCallback(NULL)");
        throw;
    }

    std::cout << "message received" << std::endl;
    ret = IoTHubDeviceClient_SetMessageCallback(client, NULL, NULL);
    ThrowIfFailed(ret, "IoTHubDeviceClient_SetMessageCallback(NULL)");

    return addJsonWrapperObject(resp.response_string, "body");
}