7#include <QtNetwork/private/qnetworkinformation_p.h> 
    8#include <QtNetwork/qnetworkinformation.h> 
   10#include <QtCore/private/qobject_p.h> 
   11#include <QtCore/qcoreapplication.h> 
   12#include <QtCore/qmutex.h> 
   13#include <QtCore/qthread.h> 
   14#include <QtCore/private/qfactoryloader_p.h> 
   33struct QStaticNetworkInformationDataHolder
 
   36    std::unique_ptr<QNetworkInformation, QNetworkInformationDeleter> 
instanceHolder;
 
   43    if (!dataHolder.exists())
 
   55    dataHolder->instanceHolder.reset();
 
   73        return dataHolder->instanceHolder.get();
 
   80    static bool initializeList();
 
   82    std::unique_ptr<QNetworkInformationBackend> backend;
 
   85bool QNetworkInformationPrivate::initializeList()
 
   99    while (qniLoader->instance(
index))
 
  110        return aFeaturesSupported > bFeaturesSupported
 
  111                || (aFeaturesSupported == bFeaturesSupported
 
  114    QMutexLocker instanceLocker(&dataHolder->instanceMutex);
 
  115    std::sort(dataHolder->factories.begin(), dataHolder->factories.end(), featuresNameOrder);
 
  117    return !dataHolder->factories.isEmpty();
 
  126    dataHolder->factories.append(
factory);
 
  132    if (!dataHolder.exists())
 
  135    dataHolder->factories.removeAll(
factory);
 
  142    if (!initializeList())
 
  146    const QList copy = dataHolder->factories;
 
  163    qDebug().nospace() << 
"create() called with name=\"" << 
name 
  164                       << 
"\". instanceHolder initialized? " << !!dataHolder->instanceHolder;
 
  166    if (!initializeList()) {
 
  168        qDebug(
"Failed to initialize list, returning.");
 
  174    if (dataHolder->instanceHolder)
 
  175        return dataHolder->instanceHolder.get();
 
  181    auto it = std::find_if(dataHolder->factories.cbegin(), dataHolder->factories.cend(),
 
  183    if (
it == dataHolder->factories.
cend()) {
 
  185        if (dataHolder->factories.isEmpty()) {
 
  186            qDebug(
"No plugins available");
 
  189            listNames.
reserve(8 * dataHolder->factories.count());
 
  190            for (
const auto *
factory : std::as_const(dataHolder->factories))
 
  193            qDebug().nospace() << 
"Couldn't find " << 
name << 
" in list with names: { " 
  194                                << listNames << 
" }";
 
  200    qDebug() << 
"Creating instance using loader named " << (*it)->name();
 
  208    return dataHolder->instanceHolder.get();
 
  216    qDebug().nospace() << 
"create() called with features=\"" << features
 
  217                       << 
"\". instanceHolder initialized? " << !!dataHolder->instanceHolder;
 
  222    if (!initializeList()) {
 
  224        qDebug(
"Failed to initialize list, returning.");
 
  229    if (dataHolder->instanceHolder)
 
  230        return dataHolder->instanceHolder.get();
 
  233        return factory && (
factory->featuresSupported() & features) == features;
 
  236    for (
auto it = dataHolder->factories.
cbegin(), 
end = dataHolder->factories.cend(); 
it != 
end;
 
  238        it = std::find_if(
it, 
end, supportsRequestedFeatures);
 
  241            if (dataHolder->factories.isEmpty()) {
 
  242                qDebug(
"No plugins available");
 
  245                names.reserve(dataHolder->factories.count());
 
  246                for (
const auto *
factory : std::as_const(dataHolder->factories))
 
  248                qDebug() << 
"None of the following backends has all the requested features:" 
  249                         << 
names << features;
 
  255        qDebug() << 
"Creating instance using loader named" << (*it)->name();
 
  259            Q_ASSERT(dataHolder->instanceHolder->supports(features));
 
  260            return dataHolder->instanceHolder.get();
 
  264            qDebug() << 
"The factory returned a nullptr";
 
  269    qDebug() << 
"Couldn't find/create an appropriate backend.";
 
  518    return d_func()->backend->reachability();
 
  534    return d_func()->backend->behindCaptivePortal();
 
  551    return d_func()->backend->transportMedium();
 
  567    return d_func()->backend->isMetered();
 
  575    return d_func()->backend->name();
 
  584    return (d_func()->backend->featuresSupported() & features) == features;
 
  594    return d_func()->backend->featuresSupported();
 
  636#elif defined(Q_OS_DARWIN) 
  638#elif defined(Q_OS_ANDROID) 
  640#elif defined(Q_OS_LINUX) 
  662    return loadedBackend && loadedBackend->backendName().compare(backend, 
Qt::CaseInsensitive) == 0;
 
  665#if QT_DEPRECATED_SINCE(6,4) 
  689    return loadedBackend && loadedBackend->supports(features);
 
  692#if QT_DEPRECATED_SINCE(6,4) 
  698bool QNetworkInformation::load(Features features)
 
  725#include "moc_qnetworkinformation.cpp" 
  726#include "moc_qnetworkinformation_p.cpp" 
void unlock() noexcept
Unlocks this mutex locker.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QThread * thread() const
Returns the thread in which the object lives.
const_iterator cend() const noexcept
const_iterator cbegin() const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
void reserve(qsizetype size)
Ensures the string has space for at least size characters.
void chop(qsizetype n)
Removes n characters from the end of the string.
static QThread * currentThread()
QSet< QString >::iterator it
Combined button and popup list for selecting options.
Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR uint qPopulationCount(quint32 v) noexcept
static jboolean copy(JNIEnv *, jobject)
void qAddPostRoutine(QtCleanUpFunction p)
#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
#define Q_LOGGING_CATEGORY(name,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
#define QStringLiteral(str)
QFileInfo info(fileName)
[8]
QItemEditorFactory * factory