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;
37 QList<QNetworkInformationBackendFactory *> factories;
43 if (!dataHolder.exists())
50 dataHolder->instanceHolder.reset();
81 return dataHolder->instanceHolder.get();
88 static bool initializeList();
90 std::unique_ptr<QNetworkInformationBackend> backend;
93bool QNetworkInformationPrivate::initializeList()
102#if QT_CONFIG(library)
107 while (qniLoader->instance(
index))
118 return aFeaturesSupported > bFeaturesSupported
119 || (aFeaturesSupported == bFeaturesSupported
122 QMutexLocker instanceLocker(&dataHolder->instanceMutex);
123 std::sort(dataHolder->factories.begin(), dataHolder->factories.end(), featuresNameOrder);
125 return !dataHolder->factories.isEmpty();
134 dataHolder->factories.append(
factory);
140 if (!dataHolder.exists())
143 dataHolder->factories.removeAll(
factory);
150 if (!initializeList())
154 const QList copy = dataHolder->factories;
171 qDebug().nospace() <<
"create() called with name=\"" <<
name
172 <<
"\". instanceHolder initialized? " << !!dataHolder->instanceHolder;
174 if (!initializeList()) {
176 qDebug(
"Failed to initialize list, returning.");
182 if (dataHolder->instanceHolder)
183 return dataHolder->instanceHolder.get();
189 auto it = std::find_if(dataHolder->factories.cbegin(), dataHolder->factories.cend(),
191 if (
it == dataHolder->factories.
cend()) {
193 if (dataHolder->factories.isEmpty()) {
194 qDebug(
"No plugins available");
197 listNames.
reserve(8 * dataHolder->factories.count());
198 for (
const auto *
factory : std::as_const(dataHolder->factories))
199 listNames +=
factory->name() +
", "_L1;
201 qDebug().nospace() <<
"Couldn't find " <<
name <<
" in list with names: { "
202 << listNames <<
" }";
208 qDebug() <<
"Creating instance using loader named " << (*it)->name();
216 return dataHolder->instanceHolder.get();
224 qDebug().nospace() <<
"create() called with features=\"" << features
225 <<
"\". instanceHolder initialized? " << !!dataHolder->instanceHolder;
230 if (!initializeList()) {
232 qDebug(
"Failed to initialize list, returning.");
237 if (dataHolder->instanceHolder)
238 return dataHolder->instanceHolder.get();
241 return factory &&
factory->featuresSupported().testFlags(features);
244 for (
auto it = dataHolder->factories.
cbegin(),
end = dataHolder->factories.cend();
it !=
end;
246 it = std::find_if(
it,
end, supportsRequestedFeatures);
249 if (dataHolder->factories.isEmpty()) {
250 qDebug(
"No plugins available");
253 names.reserve(dataHolder->factories.count());
254 for (
const auto *
factory : std::as_const(dataHolder->factories))
256 qDebug() <<
"None of the following backends has all the requested features:"
257 <<
names << features;
263 qDebug() <<
"Creating instance using loader named" << (*it)->name();
267 Q_ASSERT(dataHolder->instanceHolder->supports(features));
268 return dataHolder->instanceHolder.get();
272 qDebug() <<
"The factory returned a nullptr";
277 qDebug() <<
"Couldn't find/create an appropriate backend.";
288 if (dataHolder->instanceHolder)
289 return dataHolder->instanceHolder.get();
293 return dataHolder->instanceHolder.get();
548 return d_func()->backend->reachability();
564 return d_func()->backend->behindCaptivePortal();
581 return d_func()->backend->transportMedium();
597 return d_func()->backend->isMetered();
605 return d_func()->backend->name();
624 return d_func()->backend->featuresSupported();
674#elif defined(Q_OS_DARWIN)
676#elif defined(Q_OS_ANDROID)
678#elif defined(Q_OS_LINUX)
705 if (backend == u
"dummy")
709 return loadedBackend && loadedBackend->backendName().compare(backend,
Qt::CaseInsensitive) == 0;
712#if QT_DEPRECATED_SINCE(6,4)
736 return loadedBackend && loadedBackend->supports(features);
739#if QT_DEPRECATED_SINCE(6,4)
745bool QNetworkInformation::load(Features features)
772#include "moc_qnetworkinformation.cpp"
773#include "moc_qnetworkinformation_p.cpp"
774#include "qnetworkinformation.moc"
static QCoreApplication * instance() noexcept
Returns a pointer to the application's QCoreApplication (or QGuiApplication/QApplication) instance.
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.
bool moveToThread(QThread *thread QT6_DECL_NEW_OVERLOAD_TAIL)
Changes the thread affinity for this object and its children and returns true on success.
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.
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)
QItemEditorFactory * factory