Skip to content
  • Linus Jahn's avatar
    Add await functions for handling QFutures (from other threads) · 18a3dd7c
    Linus Jahn authored
    This adds two await functions:
    1. Just attaches a QFutureWatcher to a given QFuture and executes a
       given lambda with the future result.
    2. Executes a lambda on another thread (using a run() function) and
       handles the returned QFuture (from the other thread) on the caller
       thread.
    
    Example for the simple case:
    await(discoveryManager->requestDiscoInfo("groups.kaidan.im"), this,
          [](QXmppDiscoveryManager::InfoResult &&result) {
    	if (const auto info = std::get_if<QXmppDiscoveryIq>(&result)) {
    		qDebug() << info->features();
    	} else {
    		qDebug() << std::get<QXmppStanza::Error>(result).text();
    	}
    });
    
    Example usage for the advanced case:
    await(m_client, [=] {
    	// XMPP thread (m_client)
    	return discoveryManager->requestDiscoInfo("groups.kaidan.im");
    }, this, [](QXmppDiscoveryManager::InfoResult &&result) {
    	// caller thread (this)
    	if (const auto info = std::get_if<QXmppDiscoveryIq>(&result)) {
    		qDebug() << info->features();
    	} else {
    		qDebug() << std::get<QXmppStanza::Error>(result).text();
    	}
    });
    
    m_client needs to have a run(std::function) function, that can be added
    using the RUN_FUNCTION() macro.
    
    Currently this is unused, but we're going to need it as soon as we start
    to use the new QFuture APIs from QXmpp.
    18a3dd7c