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