Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: src/gui/text/qfontdatabase.cpp Change-Id: I6ac1f55faa22b8e7b591386fb67f0333d0ea443d
This commit is contained in:
commit
2eb26c1709
12
dist/changes-5.4.0
vendored
12
dist/changes-5.4.0
vendored
@ -31,3 +31,15 @@ QtSql
|
|||||||
|
|
||||||
- qsql ibase: fix memory corruption due to LONG being 4 bytes in firebird.
|
- qsql ibase: fix memory corruption due to LONG being 4 bytes in firebird.
|
||||||
- QSqlDriver::dbmsType(): New method reports DBMS type. Especially useful when using ODBC.
|
- QSqlDriver::dbmsType(): New method reports DBMS type. Especially useful when using ODBC.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Platform Specific Changes *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
OS X
|
||||||
|
----
|
||||||
|
|
||||||
|
- OS X 10.6 is no longer supported.
|
||||||
|
- OS X 10.10 is now supported.
|
||||||
|
- QMacStyle has been updated with better OS 10.10 support.
|
||||||
|
- The Qt binary packages are now configured with C++11 enabled.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the examples of the Qt Toolkit.
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
@ -46,6 +46,7 @@
|
|||||||
#include <QtWidgets/QScrollBar>
|
#include <QtWidgets/QScrollBar>
|
||||||
#include <QtWidgets/QStyle>
|
#include <QtWidgets/QStyle>
|
||||||
#include <QtWidgets/QToolButton>
|
#include <QtWidgets/QToolButton>
|
||||||
|
#include <QtWidgets/QMessageBox>
|
||||||
#include <QtNetwork/QSslCipher>
|
#include <QtNetwork/QSslCipher>
|
||||||
|
|
||||||
SslClient::SslClient(QWidget *parent)
|
SslClient::SslClient(QWidget *parent)
|
||||||
@ -96,6 +97,8 @@ void SslClient::secureConnect()
|
|||||||
this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
|
this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
|
||||||
connect(socket, SIGNAL(encrypted()),
|
connect(socket, SIGNAL(encrypted()),
|
||||||
this, SLOT(socketEncrypted()));
|
this, SLOT(socketEncrypted()));
|
||||||
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),
|
||||||
|
this, SLOT(socketError(QAbstractSocket::SocketError)));
|
||||||
connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
|
connect(socket, SIGNAL(sslErrors(QList<QSslError>)),
|
||||||
this, SLOT(sslErrors(QList<QSslError>)));
|
this, SLOT(sslErrors(QList<QSslError>)));
|
||||||
connect(socket, SIGNAL(readyRead()),
|
connect(socket, SIGNAL(readyRead()),
|
||||||
@ -118,8 +121,6 @@ void SslClient::socketStateChanged(QAbstractSocket::SocketState state)
|
|||||||
form->cipherLabel->setText(tr("<none>"));
|
form->cipherLabel->setText(tr("<none>"));
|
||||||
if (padLock)
|
if (padLock)
|
||||||
padLock->hide();
|
padLock->hide();
|
||||||
socket->deleteLater();
|
|
||||||
socket = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +181,11 @@ void SslClient::sendData()
|
|||||||
form->sessionInput->clear();
|
form->sessionInput->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SslClient::socketError(QAbstractSocket::SocketError error)
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this, tr("Connection error"), socket->errorString());
|
||||||
|
}
|
||||||
|
|
||||||
void SslClient::sslErrors(const QList<QSslError> &errors)
|
void SslClient::sslErrors(const QList<QSslError> &errors)
|
||||||
{
|
{
|
||||||
QDialog errorDialog(this);
|
QDialog errorDialog(this);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the examples of the Qt Toolkit.
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
@ -65,6 +65,7 @@ private slots:
|
|||||||
void socketEncrypted();
|
void socketEncrypted();
|
||||||
void socketReadyRead();
|
void socketReadyRead();
|
||||||
void sendData();
|
void sendData();
|
||||||
|
void socketError(QAbstractSocket::SocketError error);
|
||||||
void sslErrors(const QList<QSslError> &errors);
|
void sslErrors(const QList<QSslError> &errors);
|
||||||
void displayCertificateInfo();
|
void displayCertificateInfo();
|
||||||
|
|
||||||
|
@ -75,26 +75,31 @@ int main( int argc, char ** argv )
|
|||||||
+ QLatin1Char('/') + getGlString(topLevelGlWidget.context()->functions(), GL_RENDERER);
|
+ QLatin1Char('/') + getGlString(topLevelGlWidget.context()->functions(), GL_RENDERER);
|
||||||
|
|
||||||
const bool supportsThreading = !glInfo.contains(QLatin1String("nouveau"), Qt::CaseInsensitive)
|
const bool supportsThreading = !glInfo.contains(QLatin1String("nouveau"), Qt::CaseInsensitive)
|
||||||
&& !glInfo.contains(QLatin1String("ANGLE"), Qt::CaseInsensitive);
|
&& !glInfo.contains(QLatin1String("ANGLE"), Qt::CaseInsensitive)
|
||||||
|
&& !glInfo.contains(QLatin1String("llvmpipe"), Qt::CaseInsensitive);
|
||||||
|
|
||||||
const QString toolTip = supportsThreading ? glInfo : glInfo + QStringLiteral("\ndoes not support threaded OpenGL.");
|
const QString toolTip = supportsThreading ? glInfo : glInfo + QStringLiteral("\ndoes not support threaded OpenGL.");
|
||||||
topLevelGlWidget.setToolTip(toolTip);
|
topLevelGlWidget.setToolTip(toolTip);
|
||||||
|
|
||||||
QScopedPointer<MainWindow> mw1;
|
QScopedPointer<MainWindow> mw1;
|
||||||
QScopedPointer<MainWindow> mw2;
|
QScopedPointer<MainWindow> mw2;
|
||||||
if (supportsThreading && !QApplication::arguments().contains(QStringLiteral("--single"))) {
|
if (!QApplication::arguments().contains(QStringLiteral("--single"))) {
|
||||||
pos += QPoint(100, 100);
|
if (supportsThreading) {
|
||||||
mw1.reset(new MainWindow);
|
pos += QPoint(100, 100);
|
||||||
mw1->setToolTip(toolTip);
|
mw1.reset(new MainWindow);
|
||||||
mw1->move(pos);
|
mw1->setToolTip(toolTip);
|
||||||
mw1->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #1"));
|
mw1->move(pos);
|
||||||
mw1->show();
|
mw1->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #1"));
|
||||||
pos += QPoint(100, 100);
|
mw1->show();
|
||||||
mw2.reset(new MainWindow);
|
pos += QPoint(100, 100);
|
||||||
mw2->setToolTip(toolTip);
|
mw2.reset(new MainWindow);
|
||||||
mw2->move(pos);
|
mw2->setToolTip(toolTip);
|
||||||
mw2->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #2"));
|
mw2->move(pos);
|
||||||
mw2->show();
|
mw2->setWindowTitle(QStringLiteral("Threaded QOpenGLWidget example #2"));
|
||||||
|
mw2->show();
|
||||||
|
} else {
|
||||||
|
qWarning() << toolTip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
|
@ -474,7 +474,11 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProjectSingleConfig &tool)
|
|||||||
<< attrTag("Condition", condition)
|
<< attrTag("Condition", condition)
|
||||||
<< valueTag(tool.Configuration.PrimaryOutput);
|
<< valueTag(tool.Configuration.PrimaryOutput);
|
||||||
}
|
}
|
||||||
|
if (!tool.Configuration.PrimaryOutputExtension.isEmpty()) {
|
||||||
|
xml<< tag("TargetExt")
|
||||||
|
<< attrTag("Condition", condition)
|
||||||
|
<< valueTag(tool.Configuration.PrimaryOutputExtension);
|
||||||
|
}
|
||||||
if ( tool.Configuration.linker.IgnoreImportLibrary != unset) {
|
if ( tool.Configuration.linker.IgnoreImportLibrary != unset) {
|
||||||
xml<< tag("IgnoreImportLibrary")
|
xml<< tag("IgnoreImportLibrary")
|
||||||
<< attrTag("Condition", condition)
|
<< attrTag("Condition", condition)
|
||||||
@ -696,7 +700,11 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProject &tool)
|
|||||||
<< attrTag("Condition", condition)
|
<< attrTag("Condition", condition)
|
||||||
<< valueTag(config.PrimaryOutput);
|
<< valueTag(config.PrimaryOutput);
|
||||||
}
|
}
|
||||||
|
if (!config.PrimaryOutputExtension.isEmpty()) {
|
||||||
|
xml << tag("TargetExt")
|
||||||
|
<< attrTag("Condition", condition)
|
||||||
|
<< valueTag(config.PrimaryOutputExtension);
|
||||||
|
}
|
||||||
if (config.linker.IgnoreImportLibrary != unset) {
|
if (config.linker.IgnoreImportLibrary != unset) {
|
||||||
xml << tag("IgnoreImportLibrary")
|
xml << tag("IgnoreImportLibrary")
|
||||||
<< attrTag("Condition", condition)
|
<< attrTag("Condition", condition)
|
||||||
|
@ -2398,7 +2398,11 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info)
|
|||||||
if (!CustomBuildTool.Description.isEmpty())
|
if (!CustomBuildTool.Description.isEmpty())
|
||||||
CustomBuildTool.Description += ", ";
|
CustomBuildTool.Description += ", ";
|
||||||
CustomBuildTool.Description += cmd_name;
|
CustomBuildTool.Description += cmd_name;
|
||||||
|
// Execute custom build steps in an environment variable scope to prevent unwanted
|
||||||
|
// side effects for downstream build steps
|
||||||
|
CustomBuildTool.CommandLine += QLatin1String("setlocal");
|
||||||
CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed());
|
CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed());
|
||||||
|
CustomBuildTool.CommandLine += QLatin1String("endlocal");
|
||||||
int space = cmd.indexOf(' ');
|
int space = cmd.indexOf(' ');
|
||||||
QFileInfo finf(cmd.left(space));
|
QFileInfo finf(cmd.left(space));
|
||||||
if (CustomBuildTool.ToolPath.isEmpty())
|
if (CustomBuildTool.ToolPath.isEmpty())
|
||||||
|
@ -887,6 +887,7 @@ public:
|
|||||||
QString ConfigurationName;
|
QString ConfigurationName;
|
||||||
QString OutputDirectory;
|
QString OutputDirectory;
|
||||||
QString PrimaryOutput;
|
QString PrimaryOutput;
|
||||||
|
QString PrimaryOutputExtension;
|
||||||
QString ProgramDatabase;
|
QString ProgramDatabase;
|
||||||
QString PlatformToolSet;
|
QString PlatformToolSet;
|
||||||
triState RegisterOutput;
|
triState RegisterOutput;
|
||||||
|
@ -405,6 +405,21 @@ QString VcprojGenerator::retrievePlatformToolSet() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VcprojGenerator::isStandardSuffix(const QString &suffix) const
|
||||||
|
{
|
||||||
|
if (!project->values("QMAKE_APP_FLAG").isEmpty()) {
|
||||||
|
if (suffix.compare("exe", Qt::CaseInsensitive) == 0)
|
||||||
|
return true;
|
||||||
|
} else if (project->isActiveConfig("shared")) {
|
||||||
|
if (suffix.compare("dll", Qt::CaseInsensitive) == 0)
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (suffix.compare("lib", Qt::CaseInsensitive) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QString, QString> &projLookup,
|
ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QString, QString> &projLookup,
|
||||||
QHash<QString, QString> &projGuids,
|
QHash<QString, QString> &projGuids,
|
||||||
QHash<VcsolutionDepend *, QStringList> &extraSubdirs,
|
QHash<VcsolutionDepend *, QStringList> &extraSubdirs,
|
||||||
@ -993,12 +1008,12 @@ void VcprojGenerator::initConfiguration()
|
|||||||
if (conf.CompilerVersion >= NET2010) {
|
if (conf.CompilerVersion >= NET2010) {
|
||||||
conf.PlatformToolSet = retrievePlatformToolSet();
|
conf.PlatformToolSet = retrievePlatformToolSet();
|
||||||
|
|
||||||
// The target name could have been changed.
|
const QFileInfo targetInfo = fileInfo(project->first("MSVCPROJ_TARGET").toQString());
|
||||||
conf.PrimaryOutput = project->first("TARGET").toQString();
|
conf.PrimaryOutput = targetInfo.completeBaseName();
|
||||||
if (!conf.PrimaryOutput.isEmpty() && project->first("TEMPLATE") == "vclib"
|
|
||||||
&& project->isActiveConfig("shared")) {
|
const QString targetSuffix = targetInfo.suffix();
|
||||||
conf.PrimaryOutput.append(project->first("TARGET_VERSION_EXT").toQString());
|
if (!isStandardSuffix(targetSuffix))
|
||||||
}
|
conf.PrimaryOutputExtension = '.' + targetSuffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conf.CompilerVersion >= NET2012) {
|
if (conf.CompilerVersion >= NET2012) {
|
||||||
|
@ -137,6 +137,7 @@ private:
|
|||||||
const ProStringList &allDependencies = ProStringList());
|
const ProStringList &allDependencies = ProStringList());
|
||||||
QUuid increaseUUID(const QUuid &id);
|
QUuid increaseUUID(const QUuid &id);
|
||||||
QString retrievePlatformToolSet() const;
|
QString retrievePlatformToolSet() const;
|
||||||
|
bool isStandardSuffix(const QString &suffix) const;
|
||||||
friend class VCFilter;
|
friend class VCFilter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ import android.os.Bundle;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.ResultReceiver;
|
import android.os.ResultReceiver;
|
||||||
import android.text.method.MetaKeyKeyListener;
|
import android.text.method.MetaKeyKeyListener;
|
||||||
|
import android.util.Base64;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
@ -660,6 +661,22 @@ public class QtActivityDelegate
|
|||||||
m_applicationParameters += "\t-qmljsdebugger=" + qmljsdebugger;
|
m_applicationParameters += "\t-qmljsdebugger=" + qmljsdebugger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (extras.containsKey("extraenvvars")) {
|
||||||
|
try {
|
||||||
|
m_environmentVariables += "\t" + new String(Base64.decode(extras.getString("extraenvvars"), Base64.DEFAULT), "UTF-8");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extras.containsKey("extraappparams")) {
|
||||||
|
try {
|
||||||
|
m_applicationParameters += "\t" + new String(Base64.decode(extras.getString("extraappparams"), Base64.DEFAULT), "UTF-8");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (null == m_surfaces)
|
if (null == m_surfaces)
|
||||||
onCreate(null);
|
onCreate(null);
|
||||||
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
|
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
|
||||||
|
@ -445,6 +445,8 @@ QTextCodec *QIcuCodec::codecForNameUnlocked(const char *name)
|
|||||||
// backwards compatibility with Qt 4.x
|
// backwards compatibility with Qt 4.x
|
||||||
if (!qstrcmp(name, "CP949"))
|
if (!qstrcmp(name, "CP949"))
|
||||||
name = "windows-949";
|
name = "windows-949";
|
||||||
|
else if (!qstrcmp(name, "Apple Roman"))
|
||||||
|
name = "macintosh";
|
||||||
// these are broken data in ICU 4.4, and can't be resolved even though they are aliases to tis-620
|
// these are broken data in ICU 4.4, and can't be resolved even though they are aliases to tis-620
|
||||||
if (!qstrcmp(name, "windows-874-2000")
|
if (!qstrcmp(name, "windows-874-2000")
|
||||||
|| !qstrcmp(name, "windows-874")
|
|| !qstrcmp(name, "windows-874")
|
||||||
|
@ -346,13 +346,13 @@ QTextCodec::ConverterState::~ConverterState()
|
|||||||
The supported encodings are:
|
The supported encodings are:
|
||||||
|
|
||||||
\list
|
\list
|
||||||
\li Apple Roman
|
|
||||||
\li \l{Big5 Text Codec}{Big5}
|
\li \l{Big5 Text Codec}{Big5}
|
||||||
\li \l{Big5-HKSCS Text Codec}{Big5-HKSCS}
|
\li \l{Big5-HKSCS Text Codec}{Big5-HKSCS}
|
||||||
\li CP949
|
\li CP949
|
||||||
\li \l{EUC-JP Text Codec}{EUC-JP}
|
\li \l{EUC-JP Text Codec}{EUC-JP}
|
||||||
\li \l{EUC-KR Text Codec}{EUC-KR}
|
\li \l{EUC-KR Text Codec}{EUC-KR}
|
||||||
\li \l{GBK Text Codec}{GB18030-0}
|
\li \l{GBK Text Codec}{GB18030}
|
||||||
|
\li HP-ROMAN8
|
||||||
\li IBM 850
|
\li IBM 850
|
||||||
\li IBM 866
|
\li IBM 866
|
||||||
\li IBM 874
|
\li IBM 874
|
||||||
@ -360,10 +360,9 @@ QTextCodec::ConverterState::~ConverterState()
|
|||||||
\li ISO 8859-1 to 10
|
\li ISO 8859-1 to 10
|
||||||
\li ISO 8859-13 to 16
|
\li ISO 8859-13 to 16
|
||||||
\li Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
|
\li Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
|
||||||
\li JIS X 0201
|
|
||||||
\li JIS X 0208
|
|
||||||
\li KOI8-R
|
\li KOI8-R
|
||||||
\li KOI8-U
|
\li KOI8-U
|
||||||
|
\li Macintosh
|
||||||
\li \l{Shift-JIS Text Codec}{Shift-JIS}
|
\li \l{Shift-JIS Text Codec}{Shift-JIS}
|
||||||
\li TIS-620
|
\li TIS-620
|
||||||
\li \l{TSCII Text Codec}{TSCII}
|
\li \l{TSCII Text Codec}{TSCII}
|
||||||
|
@ -159,11 +159,10 @@
|
|||||||
|
|
||||||
\value AA_UseHighDpiPixmaps Make QIcon::pixmap() generate high-dpi pixmaps
|
\value AA_UseHighDpiPixmaps Make QIcon::pixmap() generate high-dpi pixmaps
|
||||||
that can be larger than the requested size. Such pixmaps will have
|
that can be larger than the requested size. Such pixmaps will have
|
||||||
devicePixelRatio set to a value higher than 1.
|
devicePixelRatio set to a value higher than 1. After setting this
|
||||||
|
attribute application code that uses pixmap sizes in layout geometry
|
||||||
After setting this attribute application code that uses pixmap
|
calculations should typically divide by QPixmap::devicePixelRatio()
|
||||||
sizes in layout geometry calculations should typically divide by
|
to get device-independent layout geometry.
|
||||||
QPixmap::devicePixelRatio() to get device-independent layout geometry.
|
|
||||||
|
|
||||||
\value AA_ForceRasterWidgets Make top-level widgets use pure raster surfaces,
|
\value AA_ForceRasterWidgets Make top-level widgets use pure raster surfaces,
|
||||||
and do not support non-native GL-based child widgets.
|
and do not support non-native GL-based child widgets.
|
||||||
@ -183,7 +182,7 @@
|
|||||||
\l{http://www.mesa3d.org/llvmpipe.html}{Mesa llvmpipe}, providing
|
\l{http://www.mesa3d.org/llvmpipe.html}{Mesa llvmpipe}, providing
|
||||||
OpenGL 2.1. The value may have no effect if no such OpenGL
|
OpenGL 2.1. The value may have no effect if no such OpenGL
|
||||||
implementation is available. The default name of this library is
|
implementation is available. The default name of this library is
|
||||||
QtSoftwareOpenGL.dll and can be overridden by setting the environment
|
opengl32sw.dll and can be overridden by setting the environment
|
||||||
variable \e QT_OPENGL_DLL. See the platform-specific pages, for
|
variable \e QT_OPENGL_DLL. See the platform-specific pages, for
|
||||||
instance \l{Qt for Windows}, for more information. This value has
|
instance \l{Qt for Windows}, for more information. This value has
|
||||||
been added in Qt 5.4.
|
been added in Qt 5.4.
|
||||||
@ -191,7 +190,8 @@
|
|||||||
\value AA_ShareOpenGLContexts Enables resource sharing between the OpenGL
|
\value AA_ShareOpenGLContexts Enables resource sharing between the OpenGL
|
||||||
contexts used by classes like QOpenGLWidget and QQuickWidget. This
|
contexts used by classes like QOpenGLWidget and QQuickWidget. This
|
||||||
allows sharing OpenGL resources, like textures, between QOpenGLWidget
|
allows sharing OpenGL resources, like textures, between QOpenGLWidget
|
||||||
instances that belong to different top-level windows.
|
instances that belong to different top-level windows. This value has
|
||||||
|
been added in Qt 5.4.
|
||||||
|
|
||||||
The following values are obsolete:
|
The following values are obsolete:
|
||||||
|
|
||||||
|
@ -206,6 +206,13 @@ QAbstractFileEngine *QFilePrivate::engine() const
|
|||||||
directory usually is not writable, but it is still possible to
|
directory usually is not writable, but it is still possible to
|
||||||
create files in it.
|
create files in it.
|
||||||
|
|
||||||
|
Qt's understanding of file permissions is limited, which affects especially
|
||||||
|
the \l QFile::setPermissions() function. On Windows, Qt will set only the
|
||||||
|
legacy read-only flag, and that only when none of the Write* flags are
|
||||||
|
passed. Qt does not manipulate access control lists (ACLs), which makes this
|
||||||
|
function mostly useless for NTFS volumes. It may still be of use for USB
|
||||||
|
sticks that use VFAT file systems. POSIX ACLs are not manipulated, either.
|
||||||
|
|
||||||
\sa QTextStream, QDataStream, QFileInfo, QDir, {The Qt Resource System}
|
\sa QTextStream, QDataStream, QFileInfo, QDir, {The Qt Resource System}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -1063,9 +1070,12 @@ QFile::permissions(const QString &fileName)
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the permissions for the file to the \a permissions specified.
|
Sets the permissions for the file to the \a permissions specified.
|
||||||
Returns \c true if successful, or false if the permissions cannot be
|
Returns \c true if successful, or \c false if the permissions cannot be
|
||||||
modified.
|
modified.
|
||||||
|
|
||||||
|
\warning This function does not manipulate ACLs, which may limit its
|
||||||
|
effectiveness.
|
||||||
|
|
||||||
\sa permissions(), setFileName()
|
\sa permissions(), setFileName()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -648,9 +648,12 @@ QFile::Permissions QFileDevice::permissions() const
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the permissions for the file to the \a permissions specified.
|
Sets the permissions for the file to the \a permissions specified.
|
||||||
Returns \c true if successful, or false if the permissions cannot be
|
Returns \c true if successful, or \c false if the permissions cannot be
|
||||||
modified.
|
modified.
|
||||||
|
|
||||||
|
\warning This function does not manipulate ACLs, which may limit its
|
||||||
|
effectiveness.
|
||||||
|
|
||||||
\sa permissions()
|
\sa permissions()
|
||||||
*/
|
*/
|
||||||
bool QFileDevice::setPermissions(Permissions permissions)
|
bool QFileDevice::setPermissions(Permissions permissions)
|
||||||
|
@ -61,13 +61,15 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
|
|||||||
\brief The QLoggingCategory class represents a category, or 'area' in the
|
\brief The QLoggingCategory class represents a category, or 'area' in the
|
||||||
logging infrastructure.
|
logging infrastructure.
|
||||||
|
|
||||||
QLoggingCategory represents a certain logging category - identified
|
QLoggingCategory represents a certain logging category - identified by a
|
||||||
by a string - at runtime. Whether a category should be actually logged or
|
string - at runtime. A category can be configured to enable or disable
|
||||||
not can be checked with the \l isEnabled() methods.
|
logging of messages per message type. Whether a message type is enabled or
|
||||||
|
not can be checked with the \l isDebugEnabled(), \l isWarningEnabled(), and
|
||||||
|
\l isCriticalEnabled() methods.
|
||||||
|
|
||||||
All objects are meant to be configured by a common registry (see also
|
All objects are meant to be configured by a common registry (see also
|
||||||
\l{Configuring Categories}). Different objects can also represent the same
|
\l{Configuring Categories}). Different objects can also represent the same
|
||||||
category. It's therefore not recommended to export objects across module
|
category. It is therefore not recommended to export objects across module
|
||||||
boundaries, nor to manipulate the objects directly, nor to inherit from
|
boundaries, nor to manipulate the objects directly, nor to inherit from
|
||||||
QLoggingCategory.
|
QLoggingCategory.
|
||||||
|
|
||||||
@ -110,8 +112,9 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
|
|||||||
|
|
||||||
\section2 Logging Rules
|
\section2 Logging Rules
|
||||||
|
|
||||||
Logging rules allow to enable or disable logging for categories in a flexible
|
Logging rules allow logging for categories to be enabled or disabled in a
|
||||||
way. Rules are specified in text, where every line must have the format
|
flexible way. Rules are specified in text, where every line must have the
|
||||||
|
format
|
||||||
|
|
||||||
\code
|
\code
|
||||||
<category>[.<type>] = true|false
|
<category>[.<type>] = true|false
|
||||||
@ -120,12 +123,12 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
|
|||||||
\c <category> is the name of the category, potentially with \c{*} as a
|
\c <category> is the name of the category, potentially with \c{*} as a
|
||||||
wildcard symbol as the first or last character (or at both positions).
|
wildcard symbol as the first or last character (or at both positions).
|
||||||
The optional \c <type> must be either \c debug, \c warning, or \c critical.
|
The optional \c <type> must be either \c debug, \c warning, or \c critical.
|
||||||
Lines that do not fit to his scheme are ignored.
|
Lines that do not fit this scheme are ignored.
|
||||||
|
|
||||||
Rules are evaluated in text order, from first to last. That is, if two rules
|
Rules are evaluated in text order, from first to last. That is, if two rules
|
||||||
apply to a category/type, the rule that comes later is applied.
|
apply to a category/type, the rule that comes later is applied.
|
||||||
|
|
||||||
Rules can be set via \l setFilterRules(). Since Qt 5.3 logging rules can also
|
Rules can be set via \l setFilterRules(). Since Qt 5.3, logging rules can also
|
||||||
be set in the \c QT_LOGGING_RULES environment variable, and
|
be set in the \c QT_LOGGING_RULES environment variable, and
|
||||||
are automatically loaded from the \c [Rules] section of a logging
|
are automatically loaded from the \c [Rules] section of a logging
|
||||||
configuration file. Such configuration files are looked up in the QtProject
|
configuration file. Such configuration files are looked up in the QtProject
|
||||||
@ -168,13 +171,13 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
|
|||||||
|
|
||||||
\section2 Installing a Custom Filter
|
\section2 Installing a Custom Filter
|
||||||
|
|
||||||
As a lower-level alternative to the text rules you can also implement a
|
As a lower-level alternative to the text rules, you can also implement a
|
||||||
custom filter via \l installFilter(). All filter rules are ignored in this
|
custom filter via \l installFilter(). All filter rules are ignored in this
|
||||||
case.
|
case.
|
||||||
|
|
||||||
\section1 Printing the Category
|
\section1 Printing the Category
|
||||||
|
|
||||||
Use the \c %{category} place holder to print the category in the default
|
Use the \c %{category} placeholder to print the category in the default
|
||||||
message handler:
|
message handler:
|
||||||
|
|
||||||
\snippet qloggingcategory/main.cpp 3
|
\snippet qloggingcategory/main.cpp 3
|
||||||
|
@ -2112,6 +2112,21 @@ namespace QtPrivate {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace QtMetaTypePrivate {
|
||||||
|
inline Q_DECL_CONSTEXPR bool isBuiltinSequentialType(int typeId)
|
||||||
|
{
|
||||||
|
return typeId == qMetaTypeId<QStringList>()
|
||||||
|
|| typeId == qMetaTypeId<QByteArrayList>()
|
||||||
|
|| typeId == qMetaTypeId<QVariantList>();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Q_DECL_CONSTEXPR bool isBuiltinAssociativeType(int typeId)
|
||||||
|
{
|
||||||
|
return typeId == qMetaTypeId<QVariantHash>()
|
||||||
|
|| typeId == qMetaTypeId<QVariantMap>();
|
||||||
|
}
|
||||||
|
} // QtMetaTypePrivate
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QMETATYPE_H
|
#endif // QMETATYPE_H
|
||||||
|
@ -1086,6 +1086,11 @@ void QTranslatorPrivate::clear()
|
|||||||
\a disambiguation). If none is found, also tries (\a context, \a
|
\a disambiguation). If none is found, also tries (\a context, \a
|
||||||
sourceText, ""). If that still fails, returns a null string.
|
sourceText, ""). If that still fails, returns a null string.
|
||||||
|
|
||||||
|
\note Incomplete translations may result in unexpected behavior:
|
||||||
|
If no translation for (\a context, \a sourceText, "")
|
||||||
|
is provided, the method might in this case actually return a
|
||||||
|
translation for a different \a disambiguation.
|
||||||
|
|
||||||
If \a n is not -1, it is used to choose an appropriate form for
|
If \a n is not -1, it is used to choose an appropriate form for
|
||||||
the translation (e.g. "%n file found" vs. "%n files found").
|
the translation (e.g. "%n file found" vs. "%n files found").
|
||||||
|
|
||||||
|
@ -3632,11 +3632,13 @@ QSequentialIterable::const_iterator::const_iterator(const const_iterator &other)
|
|||||||
QSequentialIterable::const_iterator&
|
QSequentialIterable::const_iterator&
|
||||||
QSequentialIterable::const_iterator::operator=(const const_iterator &other)
|
QSequentialIterable::const_iterator::operator=(const const_iterator &other)
|
||||||
{
|
{
|
||||||
if (!m_impl.equal(other.m_impl)) {
|
other.ref->ref();
|
||||||
m_impl = other.m_impl;
|
if (!ref->deref()) {
|
||||||
ref = other.ref;
|
m_impl.destroyIter();
|
||||||
|
delete ref;
|
||||||
}
|
}
|
||||||
ref->ref();
|
m_impl = other.m_impl;
|
||||||
|
ref = other.ref;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3941,11 +3943,13 @@ QAssociativeIterable::const_iterator::const_iterator(const const_iterator &other
|
|||||||
QAssociativeIterable::const_iterator&
|
QAssociativeIterable::const_iterator&
|
||||||
QAssociativeIterable::const_iterator::operator=(const const_iterator &other)
|
QAssociativeIterable::const_iterator::operator=(const const_iterator &other)
|
||||||
{
|
{
|
||||||
if (!m_impl.equal(other.m_impl)) {
|
other.ref->ref();
|
||||||
m_impl = other.m_impl;
|
if (!ref->deref()) {
|
||||||
ref = other.ref;
|
m_impl.destroyIter();
|
||||||
|
delete ref;
|
||||||
}
|
}
|
||||||
ref->ref();
|
m_impl = other.m_impl;
|
||||||
|
ref = other.ref;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -736,7 +736,7 @@ namespace QtPrivate {
|
|||||||
{
|
{
|
||||||
static QVariantList invoke(const QVariant &v)
|
static QVariantList invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
if (v.userType() == qMetaTypeId<QStringList>() || v.userType() == qMetaTypeId<QByteArrayList>() || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
|
if (QtMetaTypePrivate::isBuiltinSequentialType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
|
||||||
QSequentialIterable iter = QVariantValueHelperInterface<QSequentialIterable>::invoke(v);
|
QSequentialIterable iter = QVariantValueHelperInterface<QSequentialIterable>::invoke(v);
|
||||||
QVariantList l;
|
QVariantList l;
|
||||||
l.reserve(iter.size());
|
l.reserve(iter.size());
|
||||||
@ -752,7 +752,7 @@ namespace QtPrivate {
|
|||||||
{
|
{
|
||||||
static QVariantHash invoke(const QVariant &v)
|
static QVariantHash invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
if (QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
if (QtMetaTypePrivate::isBuiltinAssociativeType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
||||||
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
||||||
QVariantHash l;
|
QVariantHash l;
|
||||||
l.reserve(iter.size());
|
l.reserve(iter.size());
|
||||||
@ -768,7 +768,7 @@ namespace QtPrivate {
|
|||||||
{
|
{
|
||||||
static QVariantMap invoke(const QVariant &v)
|
static QVariantMap invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
if (QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
if (QtMetaTypePrivate::isBuiltinAssociativeType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
||||||
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
||||||
QVariantMap l;
|
QVariantMap l;
|
||||||
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
|
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
|
||||||
|
@ -166,6 +166,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
\value playsSound The object produces sound when interacted with.
|
\value playsSound The object produces sound when interacted with.
|
||||||
\value pressed The object is pressed.
|
\value pressed The object is pressed.
|
||||||
\value readOnly The object can usually be edited, but is explicitly set to read-only.
|
\value readOnly The object can usually be edited, but is explicitly set to read-only.
|
||||||
|
\value searchEdit The object is a line edit that is the input for search queries.
|
||||||
\value selectable The object is selectable.
|
\value selectable The object is selectable.
|
||||||
\value selectableText The object has text which can be selected. This is different from selectable which refers to the object's children.
|
\value selectableText The object has text which can be selected. This is different from selectable which refers to the object's children.
|
||||||
\value selected The object is selected, this is independent of text selection.
|
\value selected The object is selected, this is independent of text selection.
|
||||||
|
@ -185,6 +185,8 @@ public:
|
|||||||
quint64 selectableText : 1;
|
quint64 selectableText : 1;
|
||||||
quint64 supportsAutoCompletion : 1;
|
quint64 supportsAutoCompletion : 1;
|
||||||
|
|
||||||
|
quint64 searchEdit : 1;
|
||||||
|
|
||||||
// quint64 horizontal : 1;
|
// quint64 horizontal : 1;
|
||||||
// quint64 vertical : 1;
|
// quint64 vertical : 1;
|
||||||
// quint64 invalidEntry : 1;
|
// quint64 invalidEntry : 1;
|
||||||
|
@ -223,6 +223,7 @@ QIconTheme::QIconTheme(const QString &themeName)
|
|||||||
// Parent themes provide fallbacks for missing icons
|
// Parent themes provide fallbacks for missing icons
|
||||||
m_parents = indexReader.value(
|
m_parents = indexReader.value(
|
||||||
QLatin1String("Icon Theme/Inherits")).toStringList();
|
QLatin1String("Icon Theme/Inherits")).toStringList();
|
||||||
|
m_parents.removeAll(QString());
|
||||||
|
|
||||||
// Ensure a default platform fallback for all themes
|
// Ensure a default platform fallback for all themes
|
||||||
if (m_parents.isEmpty()) {
|
if (m_parents.isEmpty()) {
|
||||||
|
@ -877,15 +877,22 @@ QString QImageReader::fileName() const
|
|||||||
/*!
|
/*!
|
||||||
\since 4.2
|
\since 4.2
|
||||||
|
|
||||||
This is an image format specific function that sets the quality
|
Sets the quality setting of the image format to \a quality.
|
||||||
level of the image to \a quality. For image formats that do not
|
|
||||||
support setting the quality, this value is ignored.
|
|
||||||
|
|
||||||
The value range of \a quality depends on the image format. For
|
Some image formats, in particular lossy ones, entail a tradeoff between a)
|
||||||
example, the "jpeg" format supports a quality range from 0 (low
|
visual quality of the resulting image, and b) decoding execution time.
|
||||||
quality, high compression) to 100 (high quality, low compression).
|
This function sets the level of that tradeoff for image formats that
|
||||||
|
support it.
|
||||||
|
|
||||||
\sa quality()
|
In case of scaled image reading, the quality setting may also influence the
|
||||||
|
tradeoff level between visual quality and execution speed of the scaling
|
||||||
|
algorithm.
|
||||||
|
|
||||||
|
The value range of \a quality depends on the image format. For example,
|
||||||
|
the "jpeg" format supports a quality range from 0 (low visual quality) to
|
||||||
|
100 (high visual quality).
|
||||||
|
|
||||||
|
\sa quality() setScaledSize()
|
||||||
*/
|
*/
|
||||||
void QImageReader::setQuality(int quality)
|
void QImageReader::setQuality(int quality)
|
||||||
{
|
{
|
||||||
@ -895,7 +902,7 @@ void QImageReader::setQuality(int quality)
|
|||||||
/*!
|
/*!
|
||||||
\since 4.2
|
\since 4.2
|
||||||
|
|
||||||
Returns the quality level of the image.
|
Returns the quality setting of the image format.
|
||||||
|
|
||||||
\sa setQuality()
|
\sa setQuality()
|
||||||
*/
|
*/
|
||||||
|
@ -434,13 +434,16 @@ QString QImageWriter::fileName() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
This is an image format specific function that sets the quality
|
Sets the quality setting of the image format to \a quality.
|
||||||
level of the image to \a quality. For image formats that do not
|
|
||||||
support setting the quality, this value is ignored.
|
|
||||||
|
|
||||||
The value range of \a quality depends on the image format. For
|
Some image formats, in particular lossy ones, entail a tradeoff between a)
|
||||||
example, the "jpeg" format supports a quality range from 0 (low
|
visual quality of the resulting image, and b) encoding execution time and
|
||||||
quality, high compression) to 100 (high quality, low compression).
|
compression level. This function sets the level of that tradeoff for image
|
||||||
|
formats that support it. For other formats, this value is ignored.
|
||||||
|
|
||||||
|
The value range of \a quality depends on the image format. For example,
|
||||||
|
the "jpeg" format supports a quality range from 0 (low visual quality, high
|
||||||
|
compression) to 100 (high visual quality, low compression).
|
||||||
|
|
||||||
\sa quality()
|
\sa quality()
|
||||||
*/
|
*/
|
||||||
@ -450,7 +453,7 @@ void QImageWriter::setQuality(int quality)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the quality level of the image.
|
Returns the quality setting of the image format.
|
||||||
|
|
||||||
\sa setQuality()
|
\sa setQuality()
|
||||||
*/
|
*/
|
||||||
|
@ -1630,8 +1630,9 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
|
|||||||
QWindowSystemInterfacePrivate::ApplicationStateChangedEvent * changeEvent = static_cast<QWindowSystemInterfacePrivate::ApplicationStateChangedEvent *>(e);
|
QWindowSystemInterfacePrivate::ApplicationStateChangedEvent * changeEvent = static_cast<QWindowSystemInterfacePrivate::ApplicationStateChangedEvent *>(e);
|
||||||
QGuiApplicationPrivate::setApplicationState(changeEvent->newState, changeEvent->forcePropagate); }
|
QGuiApplicationPrivate::setApplicationState(changeEvent->newState, changeEvent->forcePropagate); }
|
||||||
break;
|
break;
|
||||||
case QWindowSystemInterfacePrivate::FlushEvents:
|
case QWindowSystemInterfacePrivate::FlushEvents: {
|
||||||
QWindowSystemInterface::deferredFlushWindowSystemEvents();
|
QWindowSystemInterfacePrivate::FlushEventsEvent *flushEventsEvent = static_cast<QWindowSystemInterfacePrivate::FlushEventsEvent *>(e);
|
||||||
|
QWindowSystemInterface::deferredFlushWindowSystemEvents(flushEventsEvent->flags); }
|
||||||
break;
|
break;
|
||||||
case QWindowSystemInterfacePrivate::Close:
|
case QWindowSystemInterfacePrivate::Close:
|
||||||
QGuiApplicationPrivate::processCloseEvent(
|
QGuiApplicationPrivate::processCloseEvent(
|
||||||
|
@ -526,16 +526,16 @@ void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion ®i
|
|||||||
QWindowSystemInterfacePrivate::handleWindowSystemEvent(e);
|
QWindowSystemInterfacePrivate::handleWindowSystemEvent(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowSystemInterface::deferredFlushWindowSystemEvents()
|
void QWindowSystemInterface::deferredFlushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags)
|
||||||
{
|
{
|
||||||
Q_ASSERT(QThread::currentThread() == QGuiApplication::instance()->thread());
|
Q_ASSERT(QThread::currentThread() == QGuiApplication::instance()->thread());
|
||||||
|
|
||||||
QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex);
|
QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex);
|
||||||
flushWindowSystemEvents();
|
flushWindowSystemEvents(flags);
|
||||||
QWindowSystemInterfacePrivate::eventsFlushed.wakeOne();
|
QWindowSystemInterfacePrivate::eventsFlushed.wakeOne();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowSystemInterface::flushWindowSystemEvents()
|
void QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags)
|
||||||
{
|
{
|
||||||
const int count = QWindowSystemInterfacePrivate::windowSystemEventQueue.count();
|
const int count = QWindowSystemInterfacePrivate::windowSystemEventQueue.count();
|
||||||
if (!count)
|
if (!count)
|
||||||
@ -549,11 +549,11 @@ void QWindowSystemInterface::flushWindowSystemEvents()
|
|||||||
}
|
}
|
||||||
if (QThread::currentThread() != QGuiApplication::instance()->thread()) {
|
if (QThread::currentThread() != QGuiApplication::instance()->thread()) {
|
||||||
QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex);
|
QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex);
|
||||||
QWindowSystemInterfacePrivate::FlushEventsEvent *e = new QWindowSystemInterfacePrivate::FlushEventsEvent();
|
QWindowSystemInterfacePrivate::FlushEventsEvent *e = new QWindowSystemInterfacePrivate::FlushEventsEvent(flags);
|
||||||
QWindowSystemInterfacePrivate::handleWindowSystemEvent(e);
|
QWindowSystemInterfacePrivate::handleWindowSystemEvent(e);
|
||||||
QWindowSystemInterfacePrivate::eventsFlushed.wait(&QWindowSystemInterfacePrivate::flushEventMutex);
|
QWindowSystemInterfacePrivate::eventsFlushed.wait(&QWindowSystemInterfacePrivate::flushEventMutex);
|
||||||
} else {
|
} else {
|
||||||
sendWindowSystemEvents(QEventLoop::AllEvents);
|
sendWindowSystemEvents(flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,8 +208,8 @@ public:
|
|||||||
// For event dispatcher implementations
|
// For event dispatcher implementations
|
||||||
static bool sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags);
|
static bool sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags);
|
||||||
static void setSynchronousWindowsSystemEvents(bool enable);
|
static void setSynchronousWindowsSystemEvents(bool enable);
|
||||||
static void flushWindowSystemEvents();
|
static void flushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents);
|
||||||
static void deferredFlushWindowSystemEvents();
|
static void deferredFlushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags);
|
||||||
static int windowSystemEventsQueued();
|
static int windowSystemEventsQueued();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -187,9 +187,11 @@ public:
|
|||||||
|
|
||||||
class FlushEventsEvent : public WindowSystemEvent {
|
class FlushEventsEvent : public WindowSystemEvent {
|
||||||
public:
|
public:
|
||||||
FlushEventsEvent()
|
FlushEventsEvent(QEventLoop::ProcessEventsFlags f = QEventLoop::AllEvents)
|
||||||
: WindowSystemEvent(FlushEvents)
|
: WindowSystemEvent(FlushEvents)
|
||||||
|
, flags(f)
|
||||||
{ }
|
{ }
|
||||||
|
QEventLoop::ProcessEventsFlags flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserEvent : public WindowSystemEvent {
|
class UserEvent : public WindowSystemEvent {
|
||||||
|
@ -36,6 +36,23 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \class QOpenGLPixelTransferOptions
|
||||||
|
*
|
||||||
|
* \brief The QOpenGLPixelTransferOptions class describes the pixel storage
|
||||||
|
* modes that affect the unpacking of pixels during texture upload.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \fn QOpenGLPixelTransferOptions & QOpenGLPixelTransferOptions::operator=(QOpenGLPixelTransferOptions &&other)
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \fn void QOpenGLPixelTransferOptions::swap(QOpenGLPixelTransferOptions &other)
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
|
|
||||||
class QOpenGLPixelTransferOptionsData : public QSharedData
|
class QOpenGLPixelTransferOptionsData : public QSharedData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -60,16 +77,25 @@ public:
|
|||||||
bool swapBytes;
|
bool swapBytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Constructs a new QOpenGLPixelTransferOptions instance with the default settings.
|
||||||
|
*/
|
||||||
QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions()
|
QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions()
|
||||||
: data(new QOpenGLPixelTransferOptionsData)
|
: data(new QOpenGLPixelTransferOptionsData)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &rhs)
|
QOpenGLPixelTransferOptions::QOpenGLPixelTransferOptions(const QOpenGLPixelTransferOptions &rhs)
|
||||||
: data(rhs.data)
|
: data(rhs.data)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
QOpenGLPixelTransferOptions &QOpenGLPixelTransferOptions::operator=(const QOpenGLPixelTransferOptions &rhs)
|
QOpenGLPixelTransferOptions &QOpenGLPixelTransferOptions::operator=(const QOpenGLPixelTransferOptions &rhs)
|
||||||
{
|
{
|
||||||
if (this != &rhs)
|
if (this != &rhs)
|
||||||
@ -77,85 +103,152 @@ QOpenGLPixelTransferOptions &QOpenGLPixelTransferOptions::operator=(const QOpenG
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Destructor.
|
||||||
|
*/
|
||||||
QOpenGLPixelTransferOptions::~QOpenGLPixelTransferOptions()
|
QOpenGLPixelTransferOptions::~QOpenGLPixelTransferOptions()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the \a alignment requirements for each pixel row. Corresponds to \c GL_UNPACK_ALIGNMENT.
|
||||||
|
* The default value is 4, as specified by OpenGL.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setAlignment(int alignment)
|
void QOpenGLPixelTransferOptions::setAlignment(int alignment)
|
||||||
{
|
{
|
||||||
data->alignment = alignment;
|
data->alignment = alignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the current alignment requirement for each pixel row.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::alignment() const
|
int QOpenGLPixelTransferOptions::alignment() const
|
||||||
{
|
{
|
||||||
return data->alignment;
|
return data->alignment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the number of images that are skipped to \a skipImages.
|
||||||
|
* Corresponds to \c GL_UNPACK_SKIP_IMAGES. Equivalent to incrementing the pointer
|
||||||
|
* passed to QOpenGLTexture::setData(). The default value is 0.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setSkipImages(int skipImages)
|
void QOpenGLPixelTransferOptions::setSkipImages(int skipImages)
|
||||||
{
|
{
|
||||||
data->skipImages = skipImages;
|
data->skipImages = skipImages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the number of images that are skipped.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::skipImages() const
|
int QOpenGLPixelTransferOptions::skipImages() const
|
||||||
{
|
{
|
||||||
return data->skipImages;
|
return data->skipImages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the number of rows that are skipped to \a skipRows.
|
||||||
|
* Corresponds to \c GL_UNPACK_SKIP_ROWS. Equivalent to incrementing the pointer
|
||||||
|
* passed to QOpenGLTexture::setData(). The default value is 0.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setSkipRows(int skipRows)
|
void QOpenGLPixelTransferOptions::setSkipRows(int skipRows)
|
||||||
{
|
{
|
||||||
data->skipRows = skipRows;
|
data->skipRows = skipRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the number of rows that are skipped.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::skipRows() const
|
int QOpenGLPixelTransferOptions::skipRows() const
|
||||||
{
|
{
|
||||||
return data->skipRows;
|
return data->skipRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the number of pixels that are skipped to \a skipPixels.
|
||||||
|
* Corresponds to \c GL_UNPACK_SKIP_PIXELS. Equivalent to incrementing the pointer
|
||||||
|
* passed to QOpenGLTexture::setData(). The default value is 0.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setSkipPixels(int skipPixels)
|
void QOpenGLPixelTransferOptions::setSkipPixels(int skipPixels)
|
||||||
{
|
{
|
||||||
data->skipPixels = skipPixels;
|
data->skipPixels = skipPixels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the number of pixels that are skipped.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::skipPixels() const
|
int QOpenGLPixelTransferOptions::skipPixels() const
|
||||||
{
|
{
|
||||||
return data->skipPixels;
|
return data->skipPixels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the image height for 3D textures to \a imageHeight.
|
||||||
|
* Corresponds to \c GL_UNPACK_IMAGE_HEIGHT.
|
||||||
|
* The default value is 0.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setImageHeight(int imageHeight)
|
void QOpenGLPixelTransferOptions::setImageHeight(int imageHeight)
|
||||||
{
|
{
|
||||||
data->imageHeight = imageHeight;
|
data->imageHeight = imageHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the currently set image height.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::imageHeight() const
|
int QOpenGLPixelTransferOptions::imageHeight() const
|
||||||
{
|
{
|
||||||
return data->imageHeight;
|
return data->imageHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the number of pixels in a row to \a rowLength.
|
||||||
|
* Corresponds to \c GL_UNPACK_ROW_LENGTH.
|
||||||
|
* The default value is 0.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setRowLength(int rowLength)
|
void QOpenGLPixelTransferOptions::setRowLength(int rowLength)
|
||||||
{
|
{
|
||||||
data->rowLength = rowLength;
|
data->rowLength = rowLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return the currently set row length.
|
||||||
|
*/
|
||||||
int QOpenGLPixelTransferOptions::rowLength() const
|
int QOpenGLPixelTransferOptions::rowLength() const
|
||||||
{
|
{
|
||||||
return data->rowLength;
|
return data->rowLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \a lsbFirst specifies if bits within a byte are ordered from least to most significat.
|
||||||
|
* The default value is \c false, meaning that the first bit in each byte is the
|
||||||
|
* most significant one. This is significant for bitmap data only.
|
||||||
|
* Corresponds to \c GL_UNPACK_LSB_FIRST.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setLeastSignificantByteFirst(bool lsbFirst)
|
void QOpenGLPixelTransferOptions::setLeastSignificantByteFirst(bool lsbFirst)
|
||||||
{
|
{
|
||||||
data->lsbFirst = lsbFirst;
|
data->lsbFirst = lsbFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return \c true if bits within a byte are ordered from least to most significant.
|
||||||
|
*/
|
||||||
bool QOpenGLPixelTransferOptions::isLeastSignificantBitFirst() const
|
bool QOpenGLPixelTransferOptions::isLeastSignificantBitFirst() const
|
||||||
{
|
{
|
||||||
return data->lsbFirst;
|
return data->lsbFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \a swapBytes specifies if the byte ordering for multibyte components is reversed.
|
||||||
|
* The default value is \c false.
|
||||||
|
* Corresponds to \c GL_UNPACK_SWAP_BYTES.
|
||||||
|
*/
|
||||||
void QOpenGLPixelTransferOptions::setSwapBytesEnabled(bool swapBytes)
|
void QOpenGLPixelTransferOptions::setSwapBytesEnabled(bool swapBytes)
|
||||||
{
|
{
|
||||||
data->swapBytes = swapBytes;
|
data->swapBytes = swapBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \return \c true if the byte ordering for multibyte components is reversed.
|
||||||
|
*/
|
||||||
bool QOpenGLPixelTransferOptions::isSwapBytesEnabled() const
|
bool QOpenGLPixelTransferOptions::isSwapBytesEnabled() const
|
||||||
{
|
{
|
||||||
return data->swapBytes;
|
return data->swapBytes;
|
||||||
|
@ -240,7 +240,7 @@ void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
|
|||||||
QOpenGLShaderProgram *blitProgram = 0;
|
QOpenGLShaderProgram *blitProgram = 0;
|
||||||
if (pex == 0) {
|
if (pex == 0) {
|
||||||
if (m_blitProgram == 0) {
|
if (m_blitProgram == 0) {
|
||||||
m_blitProgram = new QOpenGLShaderProgram(ctx);
|
m_blitProgram = new QOpenGLShaderProgram;
|
||||||
const bool isCoreProfile = ctx->format().profile() == QSurfaceFormat::CoreProfile;
|
const bool isCoreProfile = ctx->format().profile() == QSurfaceFormat::CoreProfile;
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -444,6 +444,9 @@ void QOpenGLTextureGlyphCache::clear()
|
|||||||
m_textureResource->free();
|
m_textureResource->free();
|
||||||
m_textureResource = 0;
|
m_textureResource = 0;
|
||||||
|
|
||||||
|
delete m_blitProgram;
|
||||||
|
m_blitProgram = 0;
|
||||||
|
|
||||||
m_w = 0;
|
m_w = 0;
|
||||||
m_h = 0;
|
m_h = 0;
|
||||||
m_cx = 0;
|
m_cx = 0;
|
||||||
|
@ -1347,6 +1347,8 @@ void QPdfEngine::setPen()
|
|||||||
int pdfJoinStyle = 0;
|
int pdfJoinStyle = 0;
|
||||||
switch(d->pen.joinStyle()) {
|
switch(d->pen.joinStyle()) {
|
||||||
case Qt::MiterJoin:
|
case Qt::MiterJoin:
|
||||||
|
case Qt::SvgMiterJoin:
|
||||||
|
*d->currentPage << d->pen.miterLimit() << "M ";
|
||||||
pdfJoinStyle = 0;
|
pdfJoinStyle = 0;
|
||||||
break;
|
break;
|
||||||
case Qt::BevelJoin:
|
case Qt::BevelJoin:
|
||||||
@ -2081,8 +2083,10 @@ int QPdfEnginePrivate::writeImage(const QByteArray &data, int width, int height,
|
|||||||
}
|
}
|
||||||
if (maskObject > 0)
|
if (maskObject > 0)
|
||||||
xprintf("/Mask %d 0 R\n", maskObject);
|
xprintf("/Mask %d 0 R\n", maskObject);
|
||||||
if (softMaskObject > 0)
|
if (softMaskObject > 0) {
|
||||||
xprintf("/SMask %d 0 R\n", softMaskObject);
|
xprintf("/SMask %d 0 R\n", softMaskObject);
|
||||||
|
xprintf("/Decode [1 0 1 0 1 0]\n");
|
||||||
|
}
|
||||||
|
|
||||||
int lenobj = requestObject();
|
int lenobj = requestObject();
|
||||||
xprintf("/Length %d 0 R\n", lenobj);
|
xprintf("/Length %d 0 R\n", lenobj);
|
||||||
|
@ -1014,8 +1014,8 @@ void QFont::setStyle(Style style)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the weight of the font which is one of the enumerated
|
Returns the weight of the font, using the same scale as the
|
||||||
values from \l{QFont::Weight}.
|
\l{QFont::Weight} enumeration.
|
||||||
|
|
||||||
\sa setWeight(), Weight, QFontInfo
|
\sa setWeight(), Weight, QFontInfo
|
||||||
*/
|
*/
|
||||||
@ -1028,8 +1028,8 @@ int QFont::weight() const
|
|||||||
\enum QFont::Weight
|
\enum QFont::Weight
|
||||||
|
|
||||||
Qt uses a weighting scale from 0 to 99 similar to, but not the
|
Qt uses a weighting scale from 0 to 99 similar to, but not the
|
||||||
same as, the scales used in Windows or CSS. A weight of 0 is
|
same as, the scales used in Windows or CSS. A weight of 0 will be
|
||||||
ultralight, whilst 99 will be extremely black.
|
thin, whilst 99 will be extremely black.
|
||||||
|
|
||||||
This enum contains the predefined font weights:
|
This enum contains the predefined font weights:
|
||||||
|
|
||||||
@ -1041,8 +1041,8 @@ int QFont::weight() const
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the weight the font to \a weight, which should be a value
|
Sets the weight of the font to \a weight, using the scale defined by
|
||||||
from the \l QFont::Weight enumeration.
|
\l QFont::Weight enumeration.
|
||||||
|
|
||||||
\sa weight(), QFontInfo
|
\sa weight(), QFontInfo
|
||||||
*/
|
*/
|
||||||
|
@ -91,9 +91,10 @@ static int getFontWeight(const QString &weightString)
|
|||||||
// order of "expense".
|
// order of "expense".
|
||||||
//
|
//
|
||||||
// A simple string test is the cheapest, so let's do that first.
|
// A simple string test is the cheapest, so let's do that first.
|
||||||
if (s == QLatin1String("medium") ||
|
if (s == QLatin1String("normal"))
|
||||||
s == QLatin1String("normal"))
|
|
||||||
return QFont::Normal;
|
return QFont::Normal;
|
||||||
|
if (s == QLatin1String("medium"))
|
||||||
|
return qt_mediumFontWeight;
|
||||||
if (s == QLatin1String("bold"))
|
if (s == QLatin1String("bold"))
|
||||||
return QFont::Bold;
|
return QFont::Bold;
|
||||||
if (s == QLatin1String("demibold") || s == QLatin1String("demi bold"))
|
if (s == QLatin1String("demibold") || s == QLatin1String("demi bold"))
|
||||||
@ -102,6 +103,10 @@ static int getFontWeight(const QString &weightString)
|
|||||||
return QFont::Black;
|
return QFont::Black;
|
||||||
if (s == QLatin1String("light"))
|
if (s == QLatin1String("light"))
|
||||||
return QFont::Light;
|
return QFont::Light;
|
||||||
|
if (s == QLatin1String("thin"))
|
||||||
|
return qt_thinFontWeight;
|
||||||
|
if (s == QLatin1String("extralight"))
|
||||||
|
return qt_extralightFontWeight;
|
||||||
|
|
||||||
// Next up, let's see if contains() matches: slightly more expensive, but
|
// Next up, let's see if contains() matches: slightly more expensive, but
|
||||||
// still fast enough.
|
// still fast enough.
|
||||||
|
@ -1062,6 +1062,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph,
|
|||||||
(format == Format_A8 ? (info.width + 3) & ~3 : info.width * 4));
|
(format == Format_A8 ? (info.width + 3) & ~3 : info.width * 4));
|
||||||
glyph_buffer_size = pitch * info.height;
|
glyph_buffer_size = pitch * info.height;
|
||||||
glyph_buffer = new uchar[glyph_buffer_size];
|
glyph_buffer = new uchar[glyph_buffer_size];
|
||||||
|
memset(glyph_buffer, 0, glyph_buffer_size);
|
||||||
|
|
||||||
if (slot->format == FT_GLYPH_FORMAT_OUTLINE) {
|
if (slot->format == FT_GLYPH_FORMAT_OUTLINE) {
|
||||||
FT_Bitmap bitmap;
|
FT_Bitmap bitmap;
|
||||||
|
@ -78,6 +78,10 @@ enum HB_Compat_Error {
|
|||||||
typedef void (*qt_destroy_func_t) (void *user_data);
|
typedef void (*qt_destroy_func_t) (void *user_data);
|
||||||
typedef bool (*qt_get_font_table_func_t) (void *user_data, uint tag, uchar *buffer, uint *length);
|
typedef bool (*qt_get_font_table_func_t) (void *user_data, uint tag, uchar *buffer, uint *length);
|
||||||
|
|
||||||
|
const QFont::Weight qt_mediumFontWeight = static_cast<QFont::Weight>(57);
|
||||||
|
const QFont::Weight qt_extralightFontWeight = static_cast<QFont::Weight>(12);
|
||||||
|
const QFont::Weight qt_thinFontWeight = static_cast<QFont::Weight>(0);
|
||||||
|
|
||||||
class Q_GUI_EXPORT QFontEngine
|
class Q_GUI_EXPORT QFontEngine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -1289,7 +1289,7 @@ void QGridLayoutEngine::fillRowData(QGridLayoutRowData *rowData,
|
|||||||
if (rowIsIdenticalToPrevious && item != itemAt(row - 1, column, orientation))
|
if (rowIsIdenticalToPrevious && item != itemAt(row - 1, column, orientation))
|
||||||
rowIsIdenticalToPrevious = false;
|
rowIsIdenticalToPrevious = false;
|
||||||
|
|
||||||
if (item)
|
if (item && !item->isIgnored())
|
||||||
rowIsEmpty = false;
|
rowIsEmpty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,6 +295,7 @@ public:
|
|||||||
|
|
||||||
virtual QLayoutPolicy::Policy sizePolicy(Qt::Orientation orientation) const = 0;
|
virtual QLayoutPolicy::Policy sizePolicy(Qt::Orientation orientation) const = 0;
|
||||||
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const = 0;
|
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const = 0;
|
||||||
|
virtual bool isIgnored() const { return false; }
|
||||||
|
|
||||||
virtual void setGeometry(const QRectF &rect) = 0;
|
virtual void setGeometry(const QRectF &rect) = 0;
|
||||||
/*
|
/*
|
||||||
|
@ -1169,7 +1169,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData
|
|||||||
setCachingEnabled(true);
|
setCachingEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
metaDataChanged();
|
_q_metaDataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkReplyHttpImplPrivate::replyDownloadProgressSlot(qint64 bytesReceived, qint64 bytesTotal)
|
void QNetworkReplyHttpImplPrivate::replyDownloadProgressSlot(qint64 bytesReceived, qint64 bytesTotal)
|
||||||
@ -1362,7 +1362,7 @@ bool QNetworkReplyHttpImplPrivate::sendCacheContents(const QNetworkCacheMetaData
|
|||||||
// This needs to be emitted in the event loop because it can be reached at
|
// This needs to be emitted in the event loop because it can be reached at
|
||||||
// the direct code path of qnam.get(...) before the user has a chance
|
// the direct code path of qnam.get(...) before the user has a chance
|
||||||
// to connect any signals.
|
// to connect any signals.
|
||||||
QMetaObject::invokeMethod(q, "metaDataChanged", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(q, "_q_metaDataChanged", Qt::QueuedConnection);
|
||||||
QMetaObject::invokeMethod(q, "_q_cacheLoadReadyRead", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(q, "_q_cacheLoadReadyRead", Qt::QueuedConnection);
|
||||||
|
|
||||||
|
|
||||||
@ -1991,7 +1991,7 @@ void QNetworkReplyHttpImplPrivate::error(QNetworkReplyImpl::NetworkError code, c
|
|||||||
emit q->error(code);
|
emit q->error(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkReplyHttpImplPrivate::metaDataChanged()
|
void QNetworkReplyHttpImplPrivate::_q_metaDataChanged()
|
||||||
{
|
{
|
||||||
// FIXME merge this with replyDownloadMetaData(); ?
|
// FIXME merge this with replyDownloadMetaData(); ?
|
||||||
|
|
||||||
|
@ -124,6 +124,7 @@ public:
|
|||||||
Q_PRIVATE_SLOT(d_func(), void uploadByteDeviceReadyReadSlot())
|
Q_PRIVATE_SLOT(d_func(), void uploadByteDeviceReadyReadSlot())
|
||||||
Q_PRIVATE_SLOT(d_func(), void emitReplyUploadProgress(qint64, qint64))
|
Q_PRIVATE_SLOT(d_func(), void emitReplyUploadProgress(qint64, qint64))
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_cacheSaveDeviceAboutToClose())
|
Q_PRIVATE_SLOT(d_func(), void _q_cacheSaveDeviceAboutToClose())
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_metaDataChanged())
|
||||||
|
|
||||||
|
|
||||||
#ifndef QT_NO_SSL
|
#ifndef QT_NO_SSL
|
||||||
@ -175,7 +176,7 @@ public:
|
|||||||
void finished();
|
void finished();
|
||||||
void error(QNetworkReply::NetworkError code, const QString &errorString);
|
void error(QNetworkReply::NetworkError code, const QString &errorString);
|
||||||
void _q_error(QNetworkReply::NetworkError code, const QString &errorString);
|
void _q_error(QNetworkReply::NetworkError code, const QString &errorString);
|
||||||
void metaDataChanged();
|
void _q_metaDataChanged();
|
||||||
|
|
||||||
void checkForRedirect(const int statusCode);
|
void checkForRedirect(const int statusCode);
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ void QNetworkReplyNSURLConnectionImpl::readyReadOutgoingData()
|
|||||||
Q_UNUSED(connection)
|
Q_UNUSED(connection)
|
||||||
|
|
||||||
QNetworkReply::NetworkError qtError = QNetworkReply::UnknownNetworkError;
|
QNetworkReply::NetworkError qtError = QNetworkReply::UnknownNetworkError;
|
||||||
if ([error domain] == NSURLErrorDomain) {
|
if ([[error domain] isEqualToString:NSURLErrorDomain]) {
|
||||||
switch ([error code]) {
|
switch ([error code]) {
|
||||||
case NSURLErrorTimedOut: qtError = QNetworkReply::TimeoutError; break;
|
case NSURLErrorTimedOut: qtError = QNetworkReply::TimeoutError; break;
|
||||||
case NSURLErrorUnsupportedURL: qtError = QNetworkReply::ProtocolUnknownError; break;
|
case NSURLErrorUnsupportedURL: qtError = QNetworkReply::ProtocolUnknownError; break;
|
||||||
@ -260,6 +260,7 @@ void QNetworkReplyNSURLConnectionImpl::readyReadOutgoingData()
|
|||||||
}
|
}
|
||||||
|
|
||||||
replyprivate->setError(qtError, QString::fromNSString([error localizedDescription]));
|
replyprivate->setError(qtError, QString::fromNSString([error localizedDescription]));
|
||||||
|
replyprivate->setFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)aResponse
|
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)aResponse
|
||||||
|
@ -248,7 +248,7 @@ determining the feature support:
|
|||||||
\li Linux uses the \l {http://projects.gnome.org/NetworkManager}{NetworkManager}
|
\li Linux uses the \l {http://projects.gnome.org/NetworkManager}{NetworkManager}
|
||||||
and \l {http://connman.net/}{ConnMan} / \l {http://ofono.org/}{oFono} APIs
|
and \l {http://connman.net/}{ConnMan} / \l {http://ofono.org/}{oFono} APIs
|
||||||
which support interface notifications and starting and stopping of network
|
which support interface notifications and starting and stopping of network
|
||||||
interfaces.
|
interfaces. Network Manager version 0.9 and above is supported.
|
||||||
\row
|
\row
|
||||||
\li Windows\unicode{0xAE} XP
|
\li Windows\unicode{0xAE} XP
|
||||||
\li This platform supports interface notifications without active polling.
|
\li This platform supports interface notifications without active polling.
|
||||||
|
@ -1140,7 +1140,7 @@ bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const
|
|||||||
int err = WSAGetLastError();
|
int err = WSAGetLastError();
|
||||||
if (ret == SOCKET_ERROR && err != WSAEMSGSIZE) {
|
if (ret == SOCKET_ERROR && err != WSAEMSGSIZE) {
|
||||||
WS_ERROR_DEBUG(err);
|
WS_ERROR_DEBUG(err);
|
||||||
if (err == WSAECONNRESET) {
|
if (err == WSAECONNRESET || err == WSAENETRESET) {
|
||||||
// Discard error message to prevent QAbstractSocket from
|
// Discard error message to prevent QAbstractSocket from
|
||||||
// getting this message repeatedly after reenabling the
|
// getting this message repeatedly after reenabling the
|
||||||
// notifiers.
|
// notifiers.
|
||||||
|
@ -119,12 +119,12 @@ QT_BEGIN_NAMESPACE
|
|||||||
a TLS 1.0 Client Hello, enabling TLSv1_0 and SSLv3 connections.
|
a TLS 1.0 Client Hello, enabling TLSv1_0 and SSLv3 connections.
|
||||||
On the server side, this will enable both SSLv3 and TLSv1_0 connections.
|
On the server side, this will enable both SSLv3 and TLSv1_0 connections.
|
||||||
\value SecureProtocols The default option, using protocols known to be secure;
|
\value SecureProtocols The default option, using protocols known to be secure;
|
||||||
currently behaves like TlsV1SslV3.
|
currently behaves similar to TlsV1Ssl3 except denying SSLv3 connections that does
|
||||||
|
not upgrade to TLS.
|
||||||
|
|
||||||
\note most servers using SSL understand both versions (2 and 3),
|
\note most servers understand both SSL and TLS, but it is recommended to use
|
||||||
but it is recommended to use the latest version only for security
|
TLS only for security reasons. However, SSL and TLS are not compatible with
|
||||||
reasons. However, SSL and TLS are not compatible with each other:
|
each other: if you get unexpected handshake failures, verify that you chose
|
||||||
if you get unexpected handshake failures, verify that you chose
|
|
||||||
the correct setting for your protocol.
|
the correct setting for your protocol.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -139,8 +139,11 @@ init_context:
|
|||||||
case QSsl::SslV3:
|
case QSsl::SslV3:
|
||||||
sslContext->ctx = q_SSL_CTX_new(client ? q_SSLv3_client_method() : q_SSLv3_server_method());
|
sslContext->ctx = q_SSL_CTX_new(client ? q_SSLv3_client_method() : q_SSLv3_server_method());
|
||||||
break;
|
break;
|
||||||
case QSsl::SecureProtocols: // SslV2 will be disabled below
|
case QSsl::SecureProtocols:
|
||||||
case QSsl::TlsV1SslV3: // SslV2 will be disabled below
|
// SSLv2 and SSLv3 will be disabled by SSL options
|
||||||
|
// But we need q_SSLv23_server_method() otherwise AnyProtocol will be unable to connect on Win32.
|
||||||
|
case QSsl::TlsV1SslV3:
|
||||||
|
// SSLv2 will will be disabled by SSL options
|
||||||
case QSsl::AnyProtocol:
|
case QSsl::AnyProtocol:
|
||||||
default:
|
default:
|
||||||
sslContext->ctx = q_SSL_CTX_new(client ? q_SSLv23_client_method() : q_SSLv23_server_method());
|
sslContext->ctx = q_SSL_CTX_new(client ? q_SSLv23_client_method() : q_SSLv23_server_method());
|
||||||
|
@ -280,8 +280,10 @@ int q_X509Callback(int ok, X509_STORE_CTX *ctx)
|
|||||||
long QSslSocketBackendPrivate::setupOpenSslOptions(QSsl::SslProtocol protocol, QSsl::SslOptions sslOptions)
|
long QSslSocketBackendPrivate::setupOpenSslOptions(QSsl::SslProtocol protocol, QSsl::SslOptions sslOptions)
|
||||||
{
|
{
|
||||||
long options;
|
long options;
|
||||||
if (protocol == QSsl::TlsV1SslV3 || protocol == QSsl::SecureProtocols)
|
if (protocol == QSsl::TlsV1SslV3)
|
||||||
options = SSL_OP_ALL|SSL_OP_NO_SSLv2;
|
options = SSL_OP_ALL|SSL_OP_NO_SSLv2;
|
||||||
|
else if (protocol == QSsl::SecureProtocols)
|
||||||
|
options = SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
|
||||||
else
|
else
|
||||||
options = SSL_OP_ALL;
|
options = SSL_OP_ALL;
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ void QEGLPlatformCursorUpdater::update(const QPoint &pos, const QRegion &rgn)
|
|||||||
{
|
{
|
||||||
m_active = false;
|
m_active = false;
|
||||||
QWindowSystemInterface::handleExposeEvent(m_screen->topLevelAt(pos), rgn);
|
QWindowSystemInterface::handleExposeEvent(m_screen->topLevelAt(pos), rgn);
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QEGLPlatformCursorUpdater::scheduleUpdate(const QPoint &pos, const QRegion &rgn)
|
void QEGLPlatformCursorUpdater::scheduleUpdate(const QPoint &pos, const QRegion &rgn)
|
||||||
|
@ -277,10 +277,16 @@ QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByt
|
|||||||
|
|
||||||
if (os2->usWeightClass == 0)
|
if (os2->usWeightClass == 0)
|
||||||
;
|
;
|
||||||
|
else if (os2->usWeightClass < 150)
|
||||||
|
weight = qt_thinFontWeight;
|
||||||
|
else if (os2->usWeightClass < 250)
|
||||||
|
weight = qt_extralightFontWeight;
|
||||||
else if (os2->usWeightClass < 350)
|
else if (os2->usWeightClass < 350)
|
||||||
weight = QFont::Light;
|
weight = QFont::Light;
|
||||||
else if (os2->usWeightClass < 450)
|
else if (os2->usWeightClass < 450)
|
||||||
weight = QFont::Normal;
|
weight = QFont::Normal;
|
||||||
|
else if (os2->usWeightClass < 550)
|
||||||
|
weight = qt_mediumFontWeight;
|
||||||
else if (os2->usWeightClass < 650)
|
else if (os2->usWeightClass < 650)
|
||||||
weight = QFont::DemiBold;
|
weight = QFont::DemiBold;
|
||||||
else if (os2->usWeightClass < 750)
|
else if (os2->usWeightClass < 750)
|
||||||
@ -290,10 +296,16 @@ QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByt
|
|||||||
|
|
||||||
if (os2->panose[2] >= 2) {
|
if (os2->panose[2] >= 2) {
|
||||||
int w = os2->panose[2];
|
int w = os2->panose[2];
|
||||||
if (w <= 3)
|
if (w <= 1)
|
||||||
|
weight = qt_thinFontWeight;
|
||||||
|
else if (w <= 2)
|
||||||
|
weight = qt_extralightFontWeight;
|
||||||
|
else if (w <= 3)
|
||||||
weight = QFont::Light;
|
weight = QFont::Light;
|
||||||
else if (w <= 5)
|
else if (w <= 5)
|
||||||
weight = QFont::Normal;
|
weight = QFont::Normal;
|
||||||
|
else if (w <= 6)
|
||||||
|
weight = qt_mediumFontWeight;
|
||||||
else if (w <= 7)
|
else if (w <= 7)
|
||||||
weight = QFont::DemiBold;
|
weight = QFont::DemiBold;
|
||||||
else if (w <= 8)
|
else if (w <= 8)
|
||||||
|
@ -294,10 +294,16 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd)
|
|||||||
fd->weight = QFont::Bold;
|
fd->weight = QFont::Bold;
|
||||||
else if (normalizedWeight >= 0.3)
|
else if (normalizedWeight >= 0.3)
|
||||||
fd->weight = QFont::DemiBold;
|
fd->weight = QFont::DemiBold;
|
||||||
|
else if (normalizedWeight >= 0.2)
|
||||||
|
fd->weight = qt_mediumFontWeight;
|
||||||
else if (normalizedWeight == 0.0)
|
else if (normalizedWeight == 0.0)
|
||||||
fd->weight = QFont::Normal;
|
fd->weight = QFont::Normal;
|
||||||
else if (normalizedWeight <= -0.4)
|
else if (normalizedWeight <= -0.4)
|
||||||
fd->weight = QFont::Light;
|
fd->weight = QFont::Light;
|
||||||
|
else if (normalizedWeight <= -0.6)
|
||||||
|
fd->weight = qt_extralightFontWeight;
|
||||||
|
else if (normalizedWeight <= -0.8)
|
||||||
|
fd->weight = qt_thinFontWeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CFNumberRef italic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSlantTrait)) {
|
if (CFNumberRef italic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSlantTrait)) {
|
||||||
|
@ -577,9 +577,10 @@ QImage QCoreTextFontEngine::imageForGlyph(glyph_t glyph, QFixed subPixelPosition
|
|||||||
cgflags);
|
cgflags);
|
||||||
Q_ASSERT(ctx);
|
Q_ASSERT(ctx);
|
||||||
CGContextSetFontSize(ctx, fontDef.pixelSize);
|
CGContextSetFontSize(ctx, fontDef.pixelSize);
|
||||||
CGContextSetShouldAntialias(ctx, (aa || fontDef.pointSize > antialiasingThreshold)
|
const bool antialias = (aa || fontDef.pointSize > antialiasingThreshold) && !(fontDef.styleStrategy & QFont::NoAntialias);
|
||||||
&& !(fontDef.styleStrategy & QFont::NoAntialias));
|
CGContextSetShouldAntialias(ctx, antialias);
|
||||||
CGContextSetShouldSmoothFonts(ctx, aa);
|
const bool smoothing = antialias && !(fontDef.styleStrategy & QFont::NoSubpixelAntialias);
|
||||||
|
CGContextSetShouldSmoothFonts(ctx, smoothing);
|
||||||
|
|
||||||
CGAffineTransform cgMatrix = CGAffineTransformIdentity;
|
CGAffineTransform cgMatrix = CGAffineTransformIdentity;
|
||||||
|
|
||||||
|
@ -166,10 +166,7 @@ QNetworkSession::State QAndroidBearerEngine::sessionStateForId(const QString &id
|
|||||||
const QMutexLocker configLocker(&ptr->mutex);
|
const QMutexLocker configLocker(&ptr->mutex);
|
||||||
// Don't re-order...
|
// Don't re-order...
|
||||||
if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
||||||
return (m_connectivityManager->isActiveNetworkMetered()
|
return QNetworkSession::Connected;
|
||||||
|| m_connectivityManager->getActiveNetworkInfo().isRoaming())
|
|
||||||
? QNetworkSession::Roaming
|
|
||||||
: QNetworkSession::Connected;
|
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
|
} else if ((ptr->state & QNetworkConfiguration::Discovered) == QNetworkConfiguration::Discovered) {
|
||||||
return QNetworkSession::Disconnected;
|
return QNetworkSession::Disconnected;
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
|
} else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
|
||||||
@ -267,6 +264,10 @@ void QAndroidBearerEngine::updateConfigurations()
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
QStringList oldKeys = accessPointConfigurations.keys();
|
QStringList oldKeys = accessPointConfigurations.keys();
|
||||||
|
|
||||||
|
QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
|
||||||
|
if (interfaces.isEmpty())
|
||||||
|
interfaces = QNetworkInterface::allInterfaces();
|
||||||
|
|
||||||
// Create a configuration for each of the main types (WiFi, Mobile, Bluetooth, WiMax, Ethernet)
|
// Create a configuration for each of the main types (WiFi, Mobile, Bluetooth, WiMax, Ethernet)
|
||||||
foreach (const AndroidNetworkInfo &netInfo, m_connectivityManager->getAllNetworkInfo()) {
|
foreach (const AndroidNetworkInfo &netInfo, m_connectivityManager->getAllNetworkInfo()) {
|
||||||
|
|
||||||
@ -279,14 +280,13 @@ void QAndroidBearerEngine::updateConfigurations()
|
|||||||
|
|
||||||
QNetworkConfiguration::BearerType bearerType = getBearerType(netInfo);
|
QNetworkConfiguration::BearerType bearerType = getBearerType(netInfo);
|
||||||
|
|
||||||
QNetworkConfiguration::StateFlag state;
|
|
||||||
QString interfaceName;
|
QString interfaceName;
|
||||||
|
QNetworkConfiguration::StateFlag state = QNetworkConfiguration::Defined;
|
||||||
if (netInfo.isAvailable()) {
|
if (netInfo.isAvailable()) {
|
||||||
if (netInfo.isConnected()) {
|
if (netInfo.isConnected()) {
|
||||||
state = QNetworkConfiguration::Active;
|
|
||||||
// Attempt to map an interface to this configuration
|
// Attempt to map an interface to this configuration
|
||||||
const QList<QNetworkInterface> &interfaces = QNetworkInterface::allInterfaces();
|
while (!interfaces.isEmpty()) {
|
||||||
foreach (const QNetworkInterface &interface, interfaces) {
|
QNetworkInterface interface = interfaces.takeFirst();
|
||||||
// ignore loopback interface
|
// ignore loopback interface
|
||||||
if (!interface.isValid())
|
if (!interface.isValid())
|
||||||
continue;
|
continue;
|
||||||
@ -297,22 +297,17 @@ void QAndroidBearerEngine::updateConfigurations()
|
|||||||
// look for an active interface...
|
// look for an active interface...
|
||||||
if (interface.flags() & QNetworkInterface::IsRunning
|
if (interface.flags() & QNetworkInterface::IsRunning
|
||||||
&& !interface.addressEntries().isEmpty()) {
|
&& !interface.addressEntries().isEmpty()) {
|
||||||
interfaceName = interface.humanReadableName();
|
state = QNetworkConfiguration::Active;
|
||||||
if (interfaceName.isEmpty())
|
interfaceName = interface.name();
|
||||||
interfaceName = interface.name();
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (netInfo.isConnectedOrConnecting()) {
|
|
||||||
state = QNetworkConfiguration::Undefined;
|
|
||||||
} else {
|
|
||||||
state = QNetworkConfiguration::Discovered;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
state = QNetworkConfiguration::Defined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint identifier = qHash(QLatin1String("android:") + name);
|
const QString key = QString(QLatin1String("android:%1:%2")).arg(name).arg(interfaceName);
|
||||||
const QString id = QString::number(identifier);
|
const QString id = QString::number(qHash(key));
|
||||||
|
m_configurationInterface[id] = interfaceName;
|
||||||
|
|
||||||
oldKeys.removeAll(id);
|
oldKeys.removeAll(id);
|
||||||
if (accessPointConfigurations.contains(id)) {
|
if (accessPointConfigurations.contains(id)) {
|
||||||
@ -347,12 +342,6 @@ void QAndroidBearerEngine::updateConfigurations()
|
|||||||
ptr->state = state;
|
ptr->state = state;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &oldIfName = m_configurationInterface[id];
|
|
||||||
if (oldIfName != interfaceName) {
|
|
||||||
oldIfName = interfaceName;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
} // Unlock configuration
|
} // Unlock configuration
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
@ -369,8 +358,6 @@ void QAndroidBearerEngine::updateConfigurations()
|
|||||||
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
||||||
ptr->bearerType = bearerType;
|
ptr->bearerType = bearerType;
|
||||||
accessPointConfigurations.insert(id, ptr);
|
accessPointConfigurations.insert(id, ptr);
|
||||||
m_configurationInterface.insert(id, interfaceName);
|
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
Q_EMIT configurationAdded(ptr);
|
Q_EMIT configurationAdded(ptr);
|
||||||
locker.relock();
|
locker.relock();
|
||||||
|
@ -83,6 +83,7 @@ public:
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void doRequestUpdate();
|
void doRequestUpdate();
|
||||||
void networksChanged();
|
void networksChanged();
|
||||||
|
void checkDisconnect();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool isWifiReady(const QString &dev);
|
bool isWifiReady(const QString &dev);
|
||||||
@ -95,6 +96,7 @@ private:
|
|||||||
QScanThread *scanThread;
|
QScanThread *scanThread;
|
||||||
|
|
||||||
quint64 getBytes(const QString &interfaceName,bool b);
|
quint64 getBytes(const QString &interfaceName,bool b);
|
||||||
|
QString disconnectedInterfaceString;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void startNetworkChangeLoop();
|
void startNetworkChangeLoop();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
** This file is part of the plugins of the Qt Toolkit.
|
||||||
@ -62,8 +62,6 @@ extern "C" { // Otherwise it won't find CWKeychain* symbols at link time
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
|
|
||||||
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_NA)
|
|
||||||
|
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
|
@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
|
||||||
{
|
{
|
||||||
NSNotificationCenter *notificationCenter;
|
NSNotificationCenter *notificationCenter;
|
||||||
@ -544,20 +542,44 @@ void QCoreWlanEngine::disconnectFromId(const QString &id)
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
QString interfaceString = getInterfaceFromId(id);
|
QString interfaceString = getInterfaceFromId(id);
|
||||||
|
if (interfaceString.isEmpty()) {
|
||||||
|
locker.unlock();
|
||||||
|
emit connectionError(id, DisconnectionError);
|
||||||
|
return;
|
||||||
|
}
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
CWInterface *wifiInterface =
|
CWInterface *wifiInterface =
|
||||||
[CWInterface interfaceWithName: QCFString::toNSString(interfaceString)];
|
[CWInterface interfaceWithName: QCFString::toNSString(interfaceString)];
|
||||||
|
disconnectedInterfaceString = interfaceString;
|
||||||
|
|
||||||
[wifiInterface disassociate];
|
[wifiInterface disassociate];
|
||||||
if (wifiInterface.serviceActive) {
|
|
||||||
locker.unlock();
|
QTimer::singleShot(1000, this,SLOT(checkDisconnect()));
|
||||||
emit connectionError(id, DisconnectionError);
|
|
||||||
locker.relock();
|
|
||||||
}
|
|
||||||
[autoreleasepool release];
|
[autoreleasepool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QCoreWlanEngine::checkDisconnect()
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&mutex);
|
||||||
|
if (!disconnectedInterfaceString.isEmpty()) {
|
||||||
|
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
|
CWInterface *wifiInterface =
|
||||||
|
[CWInterface interfaceWithName: QCFString::toNSString(disconnectedInterfaceString)];
|
||||||
|
|
||||||
|
const QString networkSsid = QCFString::toQString([wifiInterface ssid]);
|
||||||
|
if (!networkSsid.isEmpty()) {
|
||||||
|
const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
|
||||||
|
locker.unlock();
|
||||||
|
emit connectionError(id, DisconnectionError);
|
||||||
|
locker.relock();
|
||||||
|
}
|
||||||
|
[autoreleasepool release];
|
||||||
|
disconnectedInterfaceString.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QCoreWlanEngine::requestUpdate()
|
void QCoreWlanEngine::requestUpdate()
|
||||||
{
|
{
|
||||||
scanThread->getUserConfigurations();
|
scanThread->getUserConfigurations();
|
||||||
@ -862,7 +884,3 @@ quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#else // QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE
|
|
||||||
#include "qcorewlanengine_10_6.mm"
|
|
||||||
#endif
|
|
||||||
|
@ -1,922 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
|
||||||
** Contact: http://www.qt-project.org/legal
|
|
||||||
**
|
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and Digia. For licensing terms and
|
|
||||||
** conditions see http://qt.digia.com/licensing. For further information
|
|
||||||
** use the contact form at http://qt.digia.com/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** In addition, as a special exception, Digia gives you certain additional
|
|
||||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
||||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3.0 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <SystemConfiguration/SCNetworkConfiguration.h>
|
|
||||||
|
|
||||||
@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject
|
|
||||||
{
|
|
||||||
NSNotificationCenter *notificationCenter;
|
|
||||||
CWInterface *currentInterface;
|
|
||||||
QCoreWlanEngine *engine;
|
|
||||||
NSLock *locker;
|
|
||||||
}
|
|
||||||
- (void)notificationHandler:(NSNotification *)notification;
|
|
||||||
- (void)remove;
|
|
||||||
- (void)setEngine:(QCoreWlanEngine *)coreEngine;
|
|
||||||
- (QCoreWlanEngine *)engine;
|
|
||||||
- (void)dealloc;
|
|
||||||
|
|
||||||
@property (assign) QCoreWlanEngine* engine;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation QT_MANGLE_NAMESPACE(QNSListener)
|
|
||||||
|
|
||||||
- (id) init
|
|
||||||
{
|
|
||||||
[locker lock];
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
notificationCenter = [NSNotificationCenter defaultCenter];
|
|
||||||
currentInterface = [CWInterface interfaceWithName:nil];
|
|
||||||
[notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil];
|
|
||||||
[locker unlock];
|
|
||||||
[autoreleasepool release];
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void)dealloc
|
|
||||||
{
|
|
||||||
[super dealloc];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void)setEngine:(QCoreWlanEngine *)coreEngine
|
|
||||||
{
|
|
||||||
[locker lock];
|
|
||||||
if(!engine)
|
|
||||||
engine = coreEngine;
|
|
||||||
[locker unlock];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(QCoreWlanEngine *)engine
|
|
||||||
{
|
|
||||||
return engine;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void)remove
|
|
||||||
{
|
|
||||||
[locker lock];
|
|
||||||
[notificationCenter removeObserver:self];
|
|
||||||
[locker unlock];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)notificationHandler:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
Q_UNUSED(notification);
|
|
||||||
engine->requestUpdate();
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
static QT_MANGLE_NAMESPACE(QNSListener) *listener = 0;
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, void *info)
|
|
||||||
{
|
|
||||||
for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) {
|
|
||||||
|
|
||||||
QString changed = QCFString::toQString((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i));
|
|
||||||
if( changed.contains("/Network/Global/IPv4")) {
|
|
||||||
QCoreWlanEngine* wlanEngine = static_cast<QCoreWlanEngine*>(info);
|
|
||||||
wlanEngine->requestUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QScanThread::QScanThread(QObject *parent)
|
|
||||||
:QThread(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
QScanThread::~QScanThread()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScanThread::quit()
|
|
||||||
{
|
|
||||||
wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScanThread::run()
|
|
||||||
{
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
QStringList found;
|
|
||||||
mutex.lock();
|
|
||||||
CWInterface *currentInterface = [CWInterface interfaceWithName: QCFString::toNSString(interfaceName)];
|
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
if([currentInterface power]) {
|
|
||||||
NSError *err = nil;
|
|
||||||
NSDictionary *parametersDict = [NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
[NSNumber numberWithBool:YES], kCWScanKeyMerge,
|
|
||||||
[NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
|
|
||||||
[NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil];
|
|
||||||
|
|
||||||
NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err];
|
|
||||||
CWNetwork *apNetwork;
|
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
|
|
||||||
for(uint row=0; row < [apArray count]; row++ ) {
|
|
||||||
apNetwork = [apArray objectAtIndex:row];
|
|
||||||
|
|
||||||
const QString networkSsid = QCFString::toQString([apNetwork ssid]);
|
|
||||||
const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
|
|
||||||
found.append(id);
|
|
||||||
|
|
||||||
QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
|
|
||||||
bool known = isKnownSsid(networkSsid);
|
|
||||||
if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
|
|
||||||
if( networkSsid == QCFString::toQString( [currentInterface ssid])) {
|
|
||||||
state = QNetworkConfiguration::Active;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(state == QNetworkConfiguration::Undefined) {
|
|
||||||
if(known) {
|
|
||||||
state = QNetworkConfiguration::Discovered;
|
|
||||||
} else {
|
|
||||||
state = QNetworkConfiguration::Undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose;
|
|
||||||
if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) {
|
|
||||||
purpose = QNetworkConfiguration::PublicPurpose;
|
|
||||||
} else {
|
|
||||||
purpose = QNetworkConfiguration::PrivatePurpose;
|
|
||||||
}
|
|
||||||
|
|
||||||
found.append(foundNetwork(id, networkSsid, state, interfaceName, purpose));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// add known configurations that are not around.
|
|
||||||
QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
|
|
||||||
QString networkName = i.key();
|
|
||||||
const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkName));
|
|
||||||
|
|
||||||
if(!found.contains(id)) {
|
|
||||||
QString networkSsid = getSsidFromNetworkName(networkName);
|
|
||||||
const QString ssidId = QString::number(qHash(QLatin1String("corewlan:") + networkSsid));
|
|
||||||
QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined;
|
|
||||||
QString interfaceName;
|
|
||||||
QMapIterator<QString, QString> ij(i.value());
|
|
||||||
while (ij.hasNext()) {
|
|
||||||
ij.next();
|
|
||||||
interfaceName = ij.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) {
|
|
||||||
if( networkSsid == QCFString::toQString([currentInterface ssid])) {
|
|
||||||
state = QNetworkConfiguration::Active;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(state == QNetworkConfiguration::Undefined) {
|
|
||||||
if( userProfiles.contains(networkName)
|
|
||||||
&& found.contains(ssidId)) {
|
|
||||||
state = QNetworkConfiguration::Discovered;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(state == QNetworkConfiguration::Undefined) {
|
|
||||||
state = QNetworkConfiguration::Defined;
|
|
||||||
}
|
|
||||||
|
|
||||||
found.append(foundNetwork(id, networkName, state, interfaceName, QNetworkConfiguration::UnknownPurpose));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
emit networksChanged();
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose)
|
|
||||||
{
|
|
||||||
QStringList found;
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
QNetworkConfigurationPrivate *ptr = new QNetworkConfigurationPrivate;
|
|
||||||
|
|
||||||
ptr->name = name;
|
|
||||||
ptr->isValid = true;
|
|
||||||
ptr->id = id;
|
|
||||||
ptr->state = state;
|
|
||||||
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
|
||||||
ptr->bearerType = QNetworkConfiguration::BearerWLAN;
|
|
||||||
ptr->purpose = purpose;
|
|
||||||
|
|
||||||
fetchedConfigurations.append( ptr);
|
|
||||||
configurationInterface.insert(ptr->id, interfaceName);
|
|
||||||
|
|
||||||
locker.unlock();
|
|
||||||
locker.relock();
|
|
||||||
found.append(id);
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QNetworkConfigurationPrivate *> QScanThread::getConfigurations()
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QList<QNetworkConfigurationPrivate *> foundConfigurations = fetchedConfigurations;
|
|
||||||
fetchedConfigurations.clear();
|
|
||||||
|
|
||||||
return foundConfigurations;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QScanThread::getUserConfigurations()
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
userProfiles.clear();
|
|
||||||
|
|
||||||
NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
|
|
||||||
for(uint row=0; row < [wifiInterfaces count]; row++ ) {
|
|
||||||
|
|
||||||
CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]];
|
|
||||||
if ( ![wifiInterface power] )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
NSString *nsInterfaceName = [wifiInterface name];
|
|
||||||
// add user configured system networks
|
|
||||||
SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil);
|
|
||||||
NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]);
|
|
||||||
CFRelease(dynRef);
|
|
||||||
if(airportPlist != nil) {
|
|
||||||
NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"];
|
|
||||||
|
|
||||||
NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"];
|
|
||||||
for(NSString *ssidkey in thisSsidarray) {
|
|
||||||
QString thisSsid = QCFString::toQString(ssidkey);
|
|
||||||
if(!userProfiles.contains(thisSsid)) {
|
|
||||||
QMap <QString,QString> map;
|
|
||||||
map.insert(thisSsid, QCFString::toQString(nsInterfaceName));
|
|
||||||
userProfiles.insert(thisSsid, map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CFRelease(airportPlist);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 802.1X user profiles
|
|
||||||
QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist";
|
|
||||||
NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile: QCFString::toNSString(userProfilePath)] autorelease];
|
|
||||||
if(eapDict != nil) {
|
|
||||||
NSString *profileStr= @"Profiles";
|
|
||||||
NSString *nameStr = @"UserDefinedName";
|
|
||||||
NSString *networkSsidStr = @"Wireless Network";
|
|
||||||
for (id profileKey in eapDict) {
|
|
||||||
if ([profileStr isEqualToString:profileKey]) {
|
|
||||||
NSDictionary *itemDict = [eapDict objectForKey:profileKey];
|
|
||||||
for (id itemKey in itemDict) {
|
|
||||||
|
|
||||||
NSInteger dictSize = [itemKey count];
|
|
||||||
id objects[dictSize];
|
|
||||||
id keys[dictSize];
|
|
||||||
|
|
||||||
[itemKey getObjects:objects andKeys:keys];
|
|
||||||
QString networkName;
|
|
||||||
QString ssid;
|
|
||||||
for(int i = 0; i < dictSize; i++) {
|
|
||||||
if([nameStr isEqualToString:keys[i]]) {
|
|
||||||
networkName = QCFString::toQString(objects[i]);
|
|
||||||
}
|
|
||||||
if([networkSsidStr isEqualToString:keys[i]]) {
|
|
||||||
ssid = QCFString::toQString(objects[i]);
|
|
||||||
}
|
|
||||||
if(!userProfiles.contains(networkName)
|
|
||||||
&& !ssid.isEmpty()) {
|
|
||||||
QMap<QString,QString> map;
|
|
||||||
map.insert(ssid, QCFString::toQString(nsInterfaceName));
|
|
||||||
userProfiles.insert(networkName, map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScanThread::getSsidFromNetworkName(const QString &name)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
QMap<QString,QString> map = i.value();
|
|
||||||
QMapIterator<QString, QString> ij(i.value());
|
|
||||||
while (ij.hasNext()) {
|
|
||||||
ij.next();
|
|
||||||
const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") +i.key()));
|
|
||||||
if(name == i.key() || name == networkNameHash) {
|
|
||||||
return ij.key();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QScanThread::getNetworkNameFromSsid(const QString &ssid)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
QMap<QString,QString> map = i.value();
|
|
||||||
QMapIterator<QString, QString> ij(i.value());
|
|
||||||
while (ij.hasNext()) {
|
|
||||||
ij.next();
|
|
||||||
if(ij.key() == ssid) {
|
|
||||||
return i.key();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QScanThread::isKnownSsid(const QString &ssid)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QMapIterator<QString, QMap<QString,QString> > i(userProfiles);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
QMap<QString,QString> map = i.value();
|
|
||||||
if(map.keys().contains(ssid)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QCoreWlanEngine::QCoreWlanEngine(QObject *parent)
|
|
||||||
: QBearerEngineImpl(parent), scanThread(0)
|
|
||||||
{
|
|
||||||
scanThread = new QScanThread(this);
|
|
||||||
connect(scanThread, SIGNAL(networksChanged()),
|
|
||||||
this, SLOT(networksChanged()));
|
|
||||||
}
|
|
||||||
|
|
||||||
QCoreWlanEngine::~QCoreWlanEngine()
|
|
||||||
{
|
|
||||||
scanThread->terminate();
|
|
||||||
scanThread->wait();
|
|
||||||
|
|
||||||
while (!foundConfigurations.isEmpty())
|
|
||||||
delete foundConfigurations.takeFirst();
|
|
||||||
[listener remove];
|
|
||||||
[listener release];
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::initialize()
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
|
|
||||||
if([[CWInterface supportedInterfaces] count] > 0 && !listener) {
|
|
||||||
listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init];
|
|
||||||
listener.engine = this;
|
|
||||||
hasWifi = true;
|
|
||||||
} else {
|
|
||||||
hasWifi = false;
|
|
||||||
}
|
|
||||||
storeSession = NULL;
|
|
||||||
|
|
||||||
startNetworkChangeLoop();
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString QCoreWlanEngine::getInterfaceFromId(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
return scanThread->configurationInterface.value(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QCoreWlanEngine::hasIdentifier(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
return scanThread->configurationInterface.contains(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::connectToId(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
QString interfaceString = getInterfaceFromId(id);
|
|
||||||
|
|
||||||
CWInterface *wifiInterface =
|
|
||||||
[CWInterface interfaceWithName: QCFString::toNSString(interfaceString)];
|
|
||||||
|
|
||||||
if ([wifiInterface power]) {
|
|
||||||
NSError *err = nil;
|
|
||||||
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
|
|
||||||
|
|
||||||
QString wantedSsid;
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
|
||||||
|
|
||||||
const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name));
|
|
||||||
const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name)));
|
|
||||||
|
|
||||||
bool using8021X = false;
|
|
||||||
if (idHash2 != id) {
|
|
||||||
NSArray *array = [CW8021XProfile allUser8021XProfiles];
|
|
||||||
|
|
||||||
for (NSUInteger i = 0; i < [array count]; ++i) {
|
|
||||||
const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] userDefinedName])));
|
|
||||||
|
|
||||||
const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] ssid])));
|
|
||||||
|
|
||||||
if (id == networkNameHashCheck || id == ssidHash) {
|
|
||||||
const QString thisName = scanThread->getSsidFromNetworkName(id);
|
|
||||||
if (thisName.isEmpty())
|
|
||||||
wantedSsid = id;
|
|
||||||
else
|
|
||||||
wantedSsid = thisName;
|
|
||||||
|
|
||||||
[params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile];
|
|
||||||
using8021X = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!using8021X) {
|
|
||||||
QString wantedNetwork;
|
|
||||||
QMapIterator<QString, QMap<QString,QString> > i(scanThread->userProfiles);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
wantedNetwork = i.key();
|
|
||||||
const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork));
|
|
||||||
if (id == networkNameHash) {
|
|
||||||
wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
[NSNumber numberWithBool:YES], kCWScanKeyMerge,
|
|
||||||
[NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType,
|
|
||||||
[NSNumber numberWithInteger:100], kCWScanKeyRestTime,
|
|
||||||
QCFString::toNSString(wantedSsid), kCWScanKeySSID,
|
|
||||||
nil];
|
|
||||||
|
|
||||||
NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err];
|
|
||||||
|
|
||||||
if(!err) {
|
|
||||||
for(uint row=0; row < [scanArray count]; row++ ) {
|
|
||||||
CWNetwork *apNetwork = [scanArray objectAtIndex:row];
|
|
||||||
|
|
||||||
if(wantedSsid == QCFString::toQString([apNetwork ssid])) {
|
|
||||||
|
|
||||||
if(!using8021X) {
|
|
||||||
SecKeychainAttribute attributes[3];
|
|
||||||
|
|
||||||
NSString *account = [apNetwork ssid];
|
|
||||||
NSString *keyKind = @"AirPort network password";
|
|
||||||
NSString *keyName = account;
|
|
||||||
|
|
||||||
attributes[0].tag = kSecAccountItemAttr;
|
|
||||||
attributes[0].data = (void *)[account UTF8String];
|
|
||||||
attributes[0].length = [account length];
|
|
||||||
|
|
||||||
attributes[1].tag = kSecDescriptionItemAttr;
|
|
||||||
attributes[1].data = (void *)[keyKind UTF8String];
|
|
||||||
attributes[1].length = [keyKind length];
|
|
||||||
|
|
||||||
attributes[2].tag = kSecLabelItemAttr;
|
|
||||||
attributes[2].data = (void *)[keyName UTF8String];
|
|
||||||
attributes[2].length = [keyName length];
|
|
||||||
|
|
||||||
SecKeychainAttributeList attributeList = {3,attributes};
|
|
||||||
|
|
||||||
SecKeychainSearchRef searchRef;
|
|
||||||
SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef);
|
|
||||||
|
|
||||||
NSString *password = @"";
|
|
||||||
SecKeychainItemRef searchItem;
|
|
||||||
|
|
||||||
if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) {
|
|
||||||
UInt32 realPasswordLength;
|
|
||||||
SecKeychainAttribute attributesW[8];
|
|
||||||
attributesW[0].tag = kSecAccountItemAttr;
|
|
||||||
SecKeychainAttributeList listW = {1,attributesW};
|
|
||||||
char *realPassword;
|
|
||||||
OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword);
|
|
||||||
|
|
||||||
if (status == noErr) {
|
|
||||||
if (realPassword != NULL) {
|
|
||||||
|
|
||||||
QByteArray pBuf;
|
|
||||||
pBuf.resize(realPasswordLength);
|
|
||||||
pBuf.prepend(realPassword);
|
|
||||||
pBuf.insert(realPasswordLength,'\0');
|
|
||||||
|
|
||||||
password = [NSString stringWithUTF8String:pBuf];
|
|
||||||
}
|
|
||||||
SecKeychainItemFreeContent(&listW, realPassword);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFRelease(searchItem);
|
|
||||||
} else {
|
|
||||||
qDebug() << "SecKeychainSearchCopyNext error";
|
|
||||||
}
|
|
||||||
[params setValue: password forKey: kCWAssocKeyPassphrase];
|
|
||||||
} // end using8021X
|
|
||||||
|
|
||||||
|
|
||||||
bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err];
|
|
||||||
|
|
||||||
if(!err) {
|
|
||||||
if(!result) {
|
|
||||||
emit connectionError(id, ConnectError);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qDebug() <<"associate ERROR"<< QCFString::toQString([err localizedDescription ]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} //end scan network
|
|
||||||
} else {
|
|
||||||
qDebug() <<"scan ERROR"<< QCFString::toQString([err localizedDescription ]);
|
|
||||||
}
|
|
||||||
emit connectionError(id, InterfaceLookupError);
|
|
||||||
}
|
|
||||||
|
|
||||||
locker.unlock();
|
|
||||||
emit connectionError(id, InterfaceLookupError);
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::disconnectFromId(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QString interfaceString = getInterfaceFromId(id);
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
|
|
||||||
CWInterface *wifiInterface =
|
|
||||||
[CWInterface interfaceWithName: QCFString::toNSString(interfaceString)];
|
|
||||||
|
|
||||||
[wifiInterface disassociate];
|
|
||||||
if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) {
|
|
||||||
locker.unlock();
|
|
||||||
emit connectionError(id, DisconnectionError);
|
|
||||||
locker.relock();
|
|
||||||
}
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::requestUpdate()
|
|
||||||
{
|
|
||||||
scanThread->getUserConfigurations();
|
|
||||||
doRequestUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::doRequestUpdate()
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
|
|
||||||
NSArray *wifiInterfaces = [CWInterface supportedInterfaces];
|
|
||||||
for (uint row = 0; row < [wifiInterfaces count]; ++row) {
|
|
||||||
scanThread->interfaceName = QCFString::toQString([wifiInterfaces objectAtIndex:row]);
|
|
||||||
scanThread->start();
|
|
||||||
}
|
|
||||||
locker.unlock();
|
|
||||||
if ([wifiInterfaces count] == 0)
|
|
||||||
networksChanged();
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
bool haswifi = false;
|
|
||||||
if(hasWifi) {
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
CWInterface *defaultInterface = [CWInterface interfaceWithName: QCFString::toNSString(wifiDeviceName)];
|
|
||||||
if([defaultInterface power]) {
|
|
||||||
haswifi = true;
|
|
||||||
}
|
|
||||||
[autoreleasepool release];
|
|
||||||
}
|
|
||||||
return haswifi;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QNetworkSession::State QCoreWlanEngine::sessionStateForId(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
|
||||||
|
|
||||||
if (!ptr)
|
|
||||||
return QNetworkSession::Invalid;
|
|
||||||
|
|
||||||
if (!ptr->isValid) {
|
|
||||||
return QNetworkSession::Invalid;
|
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
|
||||||
return QNetworkSession::Connected;
|
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Discovered) ==
|
|
||||||
QNetworkConfiguration::Discovered) {
|
|
||||||
return QNetworkSession::Disconnected;
|
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) {
|
|
||||||
return QNetworkSession::NotAvailable;
|
|
||||||
} else if ((ptr->state & QNetworkConfiguration::Undefined) ==
|
|
||||||
QNetworkConfiguration::Undefined) {
|
|
||||||
return QNetworkSession::NotAvailable;
|
|
||||||
}
|
|
||||||
|
|
||||||
return QNetworkSession::Invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkConfigurationManager::Capabilities QCoreWlanEngine::capabilities() const
|
|
||||||
{
|
|
||||||
return QNetworkConfigurationManager::ForcedRoaming;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::startNetworkChangeLoop()
|
|
||||||
{
|
|
||||||
|
|
||||||
SCDynamicStoreContext dynStoreContext = { 0, this/*(void *)storeSession*/, NULL, NULL, NULL };
|
|
||||||
storeSession = SCDynamicStoreCreate(NULL,
|
|
||||||
CFSTR("networkChangeCallback"),
|
|
||||||
networkChangeCallback,
|
|
||||||
&dynStoreContext);
|
|
||||||
if (!storeSession ) {
|
|
||||||
qWarning() << "could not open dynamic store: error:" << SCErrorString(SCError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFMutableArrayRef notificationKeys;
|
|
||||||
notificationKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
|
|
||||||
CFMutableArrayRef patternsArray;
|
|
||||||
patternsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
|
|
||||||
|
|
||||||
CFStringRef storeKey;
|
|
||||||
storeKey = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
|
|
||||||
kSCDynamicStoreDomainState,
|
|
||||||
kSCEntNetIPv4);
|
|
||||||
CFArrayAppendValue(notificationKeys, storeKey);
|
|
||||||
CFRelease(storeKey);
|
|
||||||
|
|
||||||
storeKey = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL,
|
|
||||||
kSCDynamicStoreDomainState,
|
|
||||||
kSCCompAnyRegex,
|
|
||||||
kSCEntNetIPv4);
|
|
||||||
CFArrayAppendValue(patternsArray, storeKey);
|
|
||||||
CFRelease(storeKey);
|
|
||||||
|
|
||||||
if (!SCDynamicStoreSetNotificationKeys(storeSession , notificationKeys, patternsArray)) {
|
|
||||||
qWarning() << "register notification error:"<< SCErrorString(SCError());
|
|
||||||
CFRelease(storeSession );
|
|
||||||
CFRelease(notificationKeys);
|
|
||||||
CFRelease(patternsArray);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CFRelease(notificationKeys);
|
|
||||||
CFRelease(patternsArray);
|
|
||||||
|
|
||||||
runloopSource = SCDynamicStoreCreateRunLoopSource(NULL, storeSession , 0);
|
|
||||||
if (!runloopSource) {
|
|
||||||
qWarning() << "runloop source error:"<< SCErrorString(SCError());
|
|
||||||
CFRelease(storeSession );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkSessionPrivate *QCoreWlanEngine::createSessionBackend()
|
|
||||||
{
|
|
||||||
return new QNetworkSessionPrivateImpl;
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration()
|
|
||||||
{
|
|
||||||
return QNetworkConfigurationPrivatePointer();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QCoreWlanEngine::requiresPolling() const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCoreWlanEngine::networksChanged()
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
QStringList previous = accessPointConfigurations.keys();
|
|
||||||
|
|
||||||
QList<QNetworkConfigurationPrivate *> foundConfigurations = scanThread->getConfigurations();
|
|
||||||
while (!foundConfigurations.isEmpty()) {
|
|
||||||
QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst();
|
|
||||||
|
|
||||||
previous.removeAll(cpPriv->id);
|
|
||||||
|
|
||||||
if (accessPointConfigurations.contains(cpPriv->id)) {
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id);
|
|
||||||
|
|
||||||
bool changed = false;
|
|
||||||
|
|
||||||
ptr->mutex.lock();
|
|
||||||
|
|
||||||
if (ptr->isValid != cpPriv->isValid) {
|
|
||||||
ptr->isValid = cpPriv->isValid;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ptr->name != cpPriv->name) {
|
|
||||||
ptr->name = cpPriv->name;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ptr->bearerType != cpPriv->bearerType) {
|
|
||||||
ptr->bearerType = cpPriv->bearerType;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ptr->state != cpPriv->state) {
|
|
||||||
ptr->state = cpPriv->state;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr->mutex.unlock();
|
|
||||||
|
|
||||||
if (changed) {
|
|
||||||
locker.unlock();
|
|
||||||
emit configurationChanged(ptr);
|
|
||||||
locker.relock();
|
|
||||||
}
|
|
||||||
|
|
||||||
delete cpPriv;
|
|
||||||
} else {
|
|
||||||
QNetworkConfigurationPrivatePointer ptr(cpPriv);
|
|
||||||
|
|
||||||
accessPointConfigurations.insert(ptr->id, ptr);
|
|
||||||
|
|
||||||
locker.unlock();
|
|
||||||
emit configurationAdded(ptr);
|
|
||||||
locker.relock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!previous.isEmpty()) {
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
|
||||||
accessPointConfigurations.take(previous.takeFirst());
|
|
||||||
|
|
||||||
locker.unlock();
|
|
||||||
emit configurationRemoved(ptr);
|
|
||||||
locker.relock();
|
|
||||||
}
|
|
||||||
|
|
||||||
locker.unlock();
|
|
||||||
emit updateCompleted();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 QCoreWlanEngine::bytesWritten(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
const QString interfaceStr = getInterfaceFromId(id);
|
|
||||||
return getBytes(interfaceStr,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 QCoreWlanEngine::bytesReceived(const QString &id)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
const QString interfaceStr = getInterfaceFromId(id);
|
|
||||||
return getBytes(interfaceStr,true);
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 QCoreWlanEngine::startTime(const QString &identifier)
|
|
||||||
{
|
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
|
|
||||||
quint64 timestamp = 0;
|
|
||||||
|
|
||||||
NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist";
|
|
||||||
NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease];
|
|
||||||
if(plistDict == nil)
|
|
||||||
return timestamp;
|
|
||||||
NSString *input = @"KnownNetworks";
|
|
||||||
NSString *timeStampStr = @"_timeStamp";
|
|
||||||
|
|
||||||
NSString *ssidStr = @"SSID_STR";
|
|
||||||
|
|
||||||
for (id key in plistDict) {
|
|
||||||
if ([input isEqualToString:key]) {
|
|
||||||
|
|
||||||
NSDictionary *knownNetworksDict = [plistDict objectForKey:key];
|
|
||||||
if(knownNetworksDict == nil)
|
|
||||||
return timestamp;
|
|
||||||
for (id networkKey in knownNetworksDict) {
|
|
||||||
bool isFound = false;
|
|
||||||
NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey];
|
|
||||||
if(itemDict == nil)
|
|
||||||
return timestamp;
|
|
||||||
NSInteger dictSize = [itemDict count];
|
|
||||||
id objects[dictSize];
|
|
||||||
id keys[dictSize];
|
|
||||||
|
|
||||||
[itemDict getObjects:objects andKeys:keys];
|
|
||||||
bool ok = false;
|
|
||||||
for(int i = 0; i < dictSize; i++) {
|
|
||||||
if([ssidStr isEqualToString:keys[i]]) {
|
|
||||||
const QString ident = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(objects[i])));
|
|
||||||
if(ident == identifier) {
|
|
||||||
ok = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(ok && [timeStampStr isEqualToString:keys[i]]) {
|
|
||||||
timestamp = (quint64)[objects[i] timeIntervalSince1970];
|
|
||||||
isFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(isFound)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[autoreleasepool release];
|
|
||||||
return timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b)
|
|
||||||
{
|
|
||||||
struct ifaddrs *ifAddressList, *ifAddress;
|
|
||||||
struct if_data *if_data;
|
|
||||||
|
|
||||||
quint64 bytes = 0;
|
|
||||||
ifAddressList = nil;
|
|
||||||
if(getifaddrs(&ifAddressList) == 0) {
|
|
||||||
for(ifAddress = ifAddressList; ifAddress; ifAddress = ifAddress->ifa_next) {
|
|
||||||
if(interfaceName == ifAddress->ifa_name) {
|
|
||||||
if_data = (struct if_data*)ifAddress->ifa_data;
|
|
||||||
if(b) {
|
|
||||||
bytes = if_data->ifi_ibytes;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
bytes = if_data->ifi_obytes;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
freeifaddrs(ifAddressList);
|
|
||||||
}
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
@ -55,25 +55,21 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
|
QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
|
||||||
: QBearerEngineImpl(parent),
|
: QBearerEngineImpl(parent),
|
||||||
interface(new QNetworkManagerInterface(this)),
|
managerInterface(new QNetworkManagerInterface(this)),
|
||||||
systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_SYSTEM_SETTINGS, this)),
|
systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
|
||||||
userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE_USER_SETTINGS, this))
|
userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this))
|
||||||
{
|
{
|
||||||
if (!interface->isValid())
|
if (!managerInterface->isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
interface->setConnections();
|
managerInterface->setConnections();
|
||||||
connect(interface, SIGNAL(deviceAdded(QDBusObjectPath)),
|
connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)),
|
||||||
this, SLOT(deviceAdded(QDBusObjectPath)));
|
this, SLOT(deviceAdded(QDBusObjectPath)));
|
||||||
connect(interface, SIGNAL(deviceRemoved(QDBusObjectPath)),
|
connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)),
|
||||||
this, SLOT(deviceRemoved(QDBusObjectPath)));
|
this, SLOT(deviceRemoved(QDBusObjectPath)));
|
||||||
#if 0
|
connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
|
||||||
connect(interface, SIGNAL(stateChanged(QString,quint32)),
|
|
||||||
this, SIGNAL(configurationsChanged()));
|
|
||||||
#endif
|
|
||||||
connect(interface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
|
|
||||||
this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
|
this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
|
||||||
connect(interface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(managerInterface, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
this, SLOT(interfacePropertiesChanged(QString,QMap<QString,QVariant>)));
|
this, SLOT(interfacePropertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
|
|
||||||
qDBusRegisterMetaType<QNmSettingsMap>();
|
qDBusRegisterMetaType<QNmSettingsMap>();
|
||||||
@ -100,52 +96,56 @@ void QNetworkManagerEngine::initialize()
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
// Get current list of access points.
|
// Get current list of access points.
|
||||||
foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
|
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
deviceAdded(devicePath);
|
deviceAdded(devicePath); //add all accesspoints
|
||||||
locker.relock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get connections.
|
// Get connections.
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
|
foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
newConnection(settingsPath, systemSettings);
|
if (!hasIdentifier(settingsPath.path()))
|
||||||
|
newConnection(settingsPath, systemSettings); //add system connection configs
|
||||||
locker.relock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) {
|
foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) {
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
newConnection(settingsPath, userSettings);
|
if (!hasIdentifier(settingsPath.path()))
|
||||||
|
newConnection(settingsPath, userSettings);
|
||||||
locker.relock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get active connections.
|
// Get active connections.
|
||||||
foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
|
foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
|
||||||
QNetworkManagerConnectionActive *activeConnection =
|
QNetworkManagerConnectionActive *activeConnection =
|
||||||
new QNetworkManagerConnectionActive(acPath.path());
|
new QNetworkManagerConnectionActive(acPath.path(),this);
|
||||||
activeConnections.insert(acPath.path(), activeConnection);
|
activeConnections.insert(acPath.path(), activeConnection);
|
||||||
|
|
||||||
activeConnection->setConnections();
|
activeConnection->setConnections();
|
||||||
connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
|
this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
}
|
}
|
||||||
|
Q_EMIT updateCompleted();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QNetworkManagerEngine::networkManagerAvailable() const
|
bool QNetworkManagerEngine::networkManagerAvailable() const
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
return interface->isValid();
|
return managerInterface->isValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
|
QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
|
foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
|
||||||
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
||||||
|
|
||||||
const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' +
|
const QString identifier = activeConnection.connection().path();
|
||||||
activeConnection.connection().path()));
|
|
||||||
|
|
||||||
if (id == identifier) {
|
if (id == identifier) {
|
||||||
QList<QDBusObjectPath> devices = activeConnection.devices();
|
QList<QDBusObjectPath> devices = activeConnection.devices();
|
||||||
@ -161,24 +161,11 @@ QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
|
|||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool QNetworkManagerEngine::hasIdentifier(const QString &id)
|
bool QNetworkManagerEngine::hasIdentifier(const QString &id)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
return accessPointConfigurations.contains(id);
|
||||||
if (connectionFromId(id))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
for (int i = 0; i < accessPoints.count(); ++i) {
|
|
||||||
QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
|
|
||||||
|
|
||||||
const QString identifier =
|
|
||||||
QString::number(qHash(accessPoint->connectionInterface()->path()));
|
|
||||||
|
|
||||||
if (id == identifier)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::connectToId(const QString &id)
|
void QNetworkManagerEngine::connectToId(const QString &id)
|
||||||
@ -194,18 +181,17 @@ void QNetworkManagerEngine::connectToId(const QString &id)
|
|||||||
const QString connectionType = map.value("connection").value("type").toString();
|
const QString connectionType = map.value("connection").value("type").toString();
|
||||||
|
|
||||||
QString dbusDevicePath;
|
QString dbusDevicePath;
|
||||||
foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
|
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
|
||||||
QNetworkManagerInterfaceDevice device(devicePath.path());
|
QNetworkManagerInterfaceDevice device(devicePath.path());
|
||||||
if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET &&
|
if (device.deviceType() == DEVICE_TYPE_ETHERNET &&
|
||||||
connectionType == QLatin1String("802-3-ethernet")) {
|
connectionType == QLatin1String("802-3-ethernet")) {
|
||||||
dbusDevicePath = devicePath.path();
|
dbusDevicePath = devicePath.path();
|
||||||
break;
|
break;
|
||||||
} else if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS &&
|
} else if (device.deviceType() == DEVICE_TYPE_WIFI &&
|
||||||
connectionType == QLatin1String("802-11-wireless")) {
|
connectionType == QLatin1String("802-11-wireless")) {
|
||||||
dbusDevicePath = devicePath.path();
|
dbusDevicePath = devicePath.path();
|
||||||
break;
|
break;
|
||||||
}
|
} else if (device.deviceType() == DEVICE_TYPE_MODEM &&
|
||||||
else if (device.deviceType() == DEVICE_TYPE_GSM &&
|
|
||||||
connectionType == QLatin1String("gsm")) {
|
connectionType == QLatin1String("gsm")) {
|
||||||
dbusDevicePath = devicePath.path();
|
dbusDevicePath = devicePath.path();
|
||||||
break;
|
break;
|
||||||
@ -214,29 +200,52 @@ void QNetworkManagerEngine::connectToId(const QString &id)
|
|||||||
|
|
||||||
const QString service = connection->connectionInterface()->service();
|
const QString service = connection->connectionInterface()->service();
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
|
QString specificPath = configuredAccessPoints.key(settingsPath);
|
||||||
|
|
||||||
interface->activateConnection(service, QDBusObjectPath(settingsPath),
|
if (specificPath.isEmpty())
|
||||||
QDBusObjectPath(dbusDevicePath), QDBusObjectPath("/"));
|
specificPath = "/";
|
||||||
|
|
||||||
|
managerInterface->activateConnection(service, QDBusObjectPath(settingsPath),
|
||||||
|
QDBusObjectPath(dbusDevicePath), QDBusObjectPath(specificPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::disconnectFromId(const QString &id)
|
void QNetworkManagerEngine::disconnectFromId(const QString &id)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
|
QNetworkManagerSettingsConnection *connection = connectionFromId(id);
|
||||||
|
QNmSettingsMap map = connection->getSettings();
|
||||||
|
bool connectionAutoconnect = map.value("connection").value("autoconnect",true).toBool(); //if not present is true !!
|
||||||
|
if (connectionAutoconnect) { //autoconnect connections will simply be reconnected by nm
|
||||||
|
emit connectionError(id, QBearerEngineImpl::OperationNotSupported);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
|
||||||
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
||||||
|
|
||||||
const QString identifier = QString::number(qHash(activeConnection.serviceName() + ' ' +
|
const QString identifier = activeConnection.connection().path();
|
||||||
activeConnection.connection().path()));
|
|
||||||
|
|
||||||
if (id == identifier && accessPointConfigurations.contains(id)) {
|
if (id == identifier && accessPointConfigurations.contains(id)) {
|
||||||
interface->deactivateConnection(acPath);
|
managerInterface->deactivateConnection(acPath);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::requestUpdate()
|
void QNetworkManagerEngine::requestUpdate()
|
||||||
|
{
|
||||||
|
if (managerInterface->wirelessEnabled()) {
|
||||||
|
QHashIterator<QString, QNetworkManagerInterfaceDeviceWireless *> i(wirelessDevices);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
i.value()->requestScan();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QNetworkManagerEngine::scanFinished()
|
||||||
{
|
{
|
||||||
QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
@ -244,9 +253,8 @@ void QNetworkManagerEngine::requestUpdate()
|
|||||||
void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
|
void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
|
||||||
const QMap<QString, QVariant> &properties)
|
const QMap<QString, QVariant> &properties)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
|
||||||
|
|
||||||
Q_UNUSED(path)
|
Q_UNUSED(path)
|
||||||
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
QMapIterator<QString, QVariant> i(properties);
|
QMapIterator<QString, QVariant> i(properties);
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
@ -269,7 +277,7 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
|
|||||||
QNetworkManagerConnectionActive *activeConnection =
|
QNetworkManagerConnectionActive *activeConnection =
|
||||||
this->activeConnections.value(acPath.path());
|
this->activeConnections.value(acPath.path());
|
||||||
if (!activeConnection) {
|
if (!activeConnection) {
|
||||||
activeConnection = new QNetworkManagerConnectionActive(acPath.path());
|
activeConnection = new QNetworkManagerConnectionActive(acPath.path(),this);
|
||||||
this->activeConnections.insert(acPath.path(), activeConnection);
|
this->activeConnections.insert(acPath.path(), activeConnection);
|
||||||
|
|
||||||
activeConnection->setConnections();
|
activeConnection->setConnections();
|
||||||
@ -277,15 +285,14 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
|
|||||||
this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
|
this, SLOT(activeConnectionPropertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' +
|
const QString id = activeConnection->connection().path();
|
||||||
activeConnection->connection().path()));
|
|
||||||
|
|
||||||
identifiers.removeOne(id);
|
identifiers.removeOne(id);
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
if (activeConnection->state() == 2 &&
|
if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
|
||||||
ptr->state != QNetworkConfiguration::Active) {
|
ptr->state != QNetworkConfiguration::Active) {
|
||||||
ptr->state = QNetworkConfiguration::Active;
|
ptr->state = QNetworkConfiguration::Active;
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
@ -303,13 +310,13 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
|
|||||||
delete this->activeConnections.take(priorActiveConnections.takeFirst());
|
delete this->activeConnections.take(priorActiveConnections.takeFirst());
|
||||||
|
|
||||||
while (!identifiers.isEmpty()) {
|
while (!identifiers.isEmpty()) {
|
||||||
// These configurations are not active
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.value(identifiers.takeFirst());
|
accessPointConfigurations.value(identifiers.takeFirst());
|
||||||
|
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
|
||||||
ptr->state = QNetworkConfiguration::Discovered;
|
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||||
|
ptr->state = (flag | QNetworkConfiguration::Discovered);
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -335,15 +342,14 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
|
|||||||
if (!activeConnection)
|
if (!activeConnection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QString id = QString::number(qHash(activeConnection->serviceName() + ' ' +
|
const QString id = activeConnection->connection().path();
|
||||||
activeConnection->connection().path()));
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
if (activeConnection->state() == 2 &&
|
if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
|
||||||
ptr->state != QNetworkConfiguration::Active) {
|
ptr->state != QNetworkConfiguration::Active) {
|
||||||
ptr->state = QNetworkConfiguration::Active;
|
ptr->state |= QNetworkConfiguration::Active;
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -355,34 +361,63 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::devicePropertiesChanged(const QString &path,
|
void QNetworkManagerEngine::devicePropertiesChanged(const QString &/*path*/,quint32 /*state*/)
|
||||||
const QMap<QString, QVariant> &properties)
|
|
||||||
{
|
{
|
||||||
Q_UNUSED(path);
|
// Q_UNUSED(path);
|
||||||
Q_UNUSED(properties);
|
// Q_UNUSED(state)
|
||||||
|
}
|
||||||
|
|
||||||
|
void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeConnectionsList)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&mutex);
|
||||||
|
for (int i = 0; i < connections.count(); ++i) {
|
||||||
|
if (activeConnectionsList.contains(connections.at(i)->connectionInterface()->path()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const QString settingsPath = connections.at(i)->connectionInterface()->path();
|
||||||
|
|
||||||
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
|
accessPointConfigurations.value(settingsPath);
|
||||||
|
ptr->mutex.lock();
|
||||||
|
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||||
|
ptr->state = (flag | QNetworkConfiguration::Discovered);
|
||||||
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
|
locker.unlock();
|
||||||
|
emit configurationChanged(ptr);
|
||||||
|
locker.relock();
|
||||||
|
Q_EMIT updateCompleted();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
|
void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
|
||||||
{
|
{
|
||||||
QNetworkManagerInterfaceDevice device(path.path());
|
QMutexLocker locker(&mutex);
|
||||||
if (device.deviceType() == DEVICE_TYPE_802_11_WIRELESS) {
|
QNetworkManagerInterfaceDevice *iDevice;
|
||||||
|
iDevice = new QNetworkManagerInterfaceDevice(path.path(),this);
|
||||||
|
connect(iDevice,SIGNAL(connectionsChanged(QStringList)),
|
||||||
|
this,SLOT(deviceConnectionsChanged(QStringList)));
|
||||||
|
|
||||||
|
connect(iDevice,SIGNAL(stateChanged(QString,quint32)),
|
||||||
|
this,SLOT(devicePropertiesChanged(QString,quint32)));
|
||||||
|
iDevice->setConnections();
|
||||||
|
interfaceDevices.insert(path.path(),iDevice);
|
||||||
|
|
||||||
|
if (iDevice->deviceType() == DEVICE_TYPE_WIFI) {
|
||||||
QNetworkManagerInterfaceDeviceWireless *wirelessDevice =
|
QNetworkManagerInterfaceDeviceWireless *wirelessDevice =
|
||||||
new QNetworkManagerInterfaceDeviceWireless(device.connectionInterface()->path());
|
new QNetworkManagerInterfaceDeviceWireless(iDevice->connectionInterface()->path(),this);
|
||||||
|
|
||||||
wirelessDevice->setConnections();
|
wirelessDevice->setConnections();
|
||||||
connect(wirelessDevice, SIGNAL(accessPointAdded(QString,QDBusObjectPath)),
|
connect(wirelessDevice, SIGNAL(accessPointAdded(QString)),
|
||||||
this, SLOT(newAccessPoint(QString,QDBusObjectPath)));
|
this, SLOT(newAccessPoint(QString)));
|
||||||
connect(wirelessDevice, SIGNAL(accessPointRemoved(QString,QDBusObjectPath)),
|
connect(wirelessDevice, SIGNAL(accessPointRemoved(QString)),
|
||||||
this, SLOT(removeAccessPoint(QString,QDBusObjectPath)));
|
this, SLOT(removeAccessPoint(QString)));
|
||||||
connect(wirelessDevice, SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(wirelessDevice,SIGNAL(scanDone()),this,SLOT(scanFinished()));
|
||||||
this, SLOT(devicePropertiesChanged(QString,QMap<QString,QVariant>)));
|
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
|
foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
|
||||||
newAccessPoint(QString(), apPath);
|
newAccessPoint(apPath.path());
|
||||||
|
|
||||||
mutex.lock();
|
|
||||||
wirelessDevices.insert(path.path(), wirelessDevice);
|
wirelessDevices.insert(path.path(), wirelessDevice);
|
||||||
mutex.unlock();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,47 +425,73 @@ void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
|
|||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
delete wirelessDevices.take(path.path());
|
if (interfaceDevices.contains(path.path())) {
|
||||||
|
locker.unlock();
|
||||||
|
delete interfaceDevices.take(path.path());
|
||||||
|
locker.relock();
|
||||||
|
}
|
||||||
|
if (wirelessDevices.contains(path.path())) {
|
||||||
|
locker.unlock();
|
||||||
|
delete wirelessDevices.take(path.path());
|
||||||
|
locker.relock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
|
void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
|
||||||
QNetworkManagerSettings *settings)
|
QNetworkManagerSettings *settings)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
if (!settings)
|
if (!settings)
|
||||||
settings = qobject_cast<QNetworkManagerSettings *>(sender());
|
settings = qobject_cast<QNetworkManagerSettings *>(sender());
|
||||||
|
|
||||||
if (!settings)
|
if (!settings)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
settings->deleteLater();
|
||||||
QNetworkManagerSettingsConnection *connection =
|
QNetworkManagerSettingsConnection *connection =
|
||||||
new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(),
|
new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(),
|
||||||
path.path());
|
path.path(),this);
|
||||||
|
QString apPath;
|
||||||
|
for (int i = 0; i < accessPoints.count(); ++i) {
|
||||||
|
if (connection->getSsid() == accessPoints.at(i)->ssid()) {
|
||||||
|
// remove the corresponding accesspoint from configurations
|
||||||
|
apPath = accessPoints.at(i)->connectionInterface()->path();
|
||||||
|
|
||||||
|
QNetworkConfigurationPrivatePointer ptr
|
||||||
|
= accessPointConfigurations.take(apPath);
|
||||||
|
if (ptr) {
|
||||||
|
locker.unlock();
|
||||||
|
emit configurationRemoved(ptr);
|
||||||
|
locker.relock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
connections.append(connection);
|
connections.append(connection);
|
||||||
|
|
||||||
connect(connection, SIGNAL(removed(QString)), this, SLOT(removeConnection(QString)));
|
connect(connection,SIGNAL(removed(QString)),this,SLOT(removeConnection(QString)));
|
||||||
connect(connection, SIGNAL(updated(QNmSettingsMap)),
|
connect(connection,SIGNAL(updated()),this,SLOT(updateConnection()));
|
||||||
this, SLOT(updateConnection(QNmSettingsMap)));
|
connection->setConnections();
|
||||||
|
|
||||||
const QString service = connection->connectionInterface()->service();
|
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
|
|
||||||
|
if (connection->getType() == DEVICE_TYPE_WIFI
|
||||||
|
&& !configuredAccessPoints.contains(settingsPath))
|
||||||
|
configuredAccessPoints.insert(apPath,settingsPath);
|
||||||
|
|
||||||
QNetworkConfigurationPrivate *cpPriv =
|
QNetworkConfigurationPrivate *cpPriv =
|
||||||
parseConnection(service, settingsPath, connection->getSettings());
|
parseConnection(settingsPath, connection->getSettings());
|
||||||
|
|
||||||
// Check if connection is active.
|
// Check if connection is active.
|
||||||
foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
|
foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
|
||||||
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
||||||
|
|
||||||
if (activeConnection.serviceName() == service &&
|
if (activeConnection.defaultRoute() &&
|
||||||
activeConnection.connection().path() == settingsPath &&
|
activeConnection.connection().path() == settingsPath &&
|
||||||
activeConnection.state() == 2) {
|
activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
|
||||||
cpPriv->state |= QNetworkConfiguration::Active;
|
cpPriv->state |= QNetworkConfiguration::Active;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr(cpPriv);
|
QNetworkConfigurationPrivatePointer ptr(cpPriv);
|
||||||
accessPointConfigurations.insert(ptr->id, ptr);
|
accessPointConfigurations.insert(ptr->id, ptr);
|
||||||
|
|
||||||
@ -442,27 +503,34 @@ void QNetworkManagerEngine::removeConnection(const QString &path)
|
|||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
Q_UNUSED(path)
|
|
||||||
|
|
||||||
QNetworkManagerSettingsConnection *connection =
|
QNetworkManagerSettingsConnection *connection =
|
||||||
qobject_cast<QNetworkManagerSettingsConnection *>(sender());
|
qobject_cast<QNetworkManagerSettingsConnection *>(sender());
|
||||||
if (!connection)
|
if (!connection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
connection->deleteLater();
|
||||||
connections.removeAll(connection);
|
connections.removeAll(connection);
|
||||||
|
|
||||||
const QString id = QString::number(qHash(connection->connectionInterface()->service() + ' ' +
|
const QString id = path;
|
||||||
connection->connectionInterface()->path()));
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
|
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(id);
|
||||||
|
|
||||||
connection->deleteLater();
|
if (ptr) {
|
||||||
|
locker.unlock();
|
||||||
locker.unlock();
|
emit configurationRemoved(ptr);
|
||||||
emit configurationRemoved(ptr);
|
locker.relock();
|
||||||
|
}
|
||||||
|
// add base AP back into configurations
|
||||||
|
QMapIterator<QString, QString> i(configuredAccessPoints);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
if (i.value() == path) {
|
||||||
|
newAccessPoint(i.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings)
|
void QNetworkManagerEngine::updateConnection()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
@ -471,17 +539,16 @@ void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings)
|
|||||||
if (!connection)
|
if (!connection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QString service = connection->connectionInterface()->service();
|
connection->deleteLater();
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
|
|
||||||
QNetworkConfigurationPrivate *cpPriv = parseConnection(service, settingsPath, settings);
|
QNetworkConfigurationPrivate *cpPriv = parseConnection(settingsPath, connection->getSettings());
|
||||||
|
|
||||||
// Check if connection is active.
|
// Check if connection is active.
|
||||||
foreach (const QDBusObjectPath &acPath, interface->activeConnections()) {
|
foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
|
||||||
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
QNetworkManagerConnectionActive activeConnection(acPath.path());
|
||||||
|
|
||||||
if (activeConnection.serviceName() == service &&
|
if (activeConnection.connection().path() == settingsPath &&
|
||||||
activeConnection.connection().path() == settingsPath &&
|
|
||||||
activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
|
activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
|
||||||
cpPriv->state |= QNetworkConfiguration::Active;
|
cpPriv->state |= QNetworkConfiguration::Active;
|
||||||
break;
|
break;
|
||||||
@ -501,6 +568,7 @@ void QNetworkManagerEngine::updateConnection(const QNmSettingsMap &settings)
|
|||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
emit configurationChanged(ptr);
|
emit configurationChanged(ptr);
|
||||||
|
locker.relock();
|
||||||
delete cpPriv;
|
delete cpPriv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,21 +576,22 @@ void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
|
|||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
|
watcher->deleteLater();
|
||||||
|
|
||||||
QDBusPendingReply<QDBusObjectPath> reply(*watcher);
|
QDBusPendingReply<QDBusObjectPath> reply(*watcher);
|
||||||
if (!reply.isError()) {
|
if (!reply.isError()) {
|
||||||
QDBusObjectPath result = reply.value();
|
QDBusObjectPath result = reply.value();
|
||||||
|
|
||||||
QNetworkManagerConnectionActive activeConnection(result.path());
|
QNetworkManagerConnectionActive activeConnection(result.path());
|
||||||
|
|
||||||
const QString id = QString::number(qHash(activeConnection.serviceName() + ' ' +
|
const QString id = activeConnection.connection().path();
|
||||||
activeConnection.connection().path()));
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
if (activeConnection.state() == 2 &&
|
if (activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
|
||||||
ptr->state != QNetworkConfiguration::Active) {
|
ptr->state != QNetworkConfiguration::Active) {
|
||||||
ptr->state = QNetworkConfiguration::Active;
|
ptr->state |= QNetworkConfiguration::Active;
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -535,42 +604,41 @@ void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjectPath &objectPath)
|
void QNetworkManagerEngine::newAccessPoint(const QString &path)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
Q_UNUSED(path)
|
|
||||||
|
|
||||||
QNetworkManagerInterfaceAccessPoint *accessPoint =
|
QNetworkManagerInterfaceAccessPoint *accessPoint =
|
||||||
new QNetworkManagerInterfaceAccessPoint(objectPath.path());
|
new QNetworkManagerInterfaceAccessPoint(path,this);
|
||||||
accessPoints.append(accessPoint);
|
|
||||||
|
|
||||||
accessPoint->setConnections();
|
bool okToAdd = true;
|
||||||
connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
|
|
||||||
this, SLOT(updateAccessPoint(QMap<QString,QVariant>)));
|
|
||||||
|
|
||||||
// Check if configuration for this SSID already exists.
|
|
||||||
for (int i = 0; i < accessPoints.count(); ++i) {
|
for (int i = 0; i < accessPoints.count(); ++i) {
|
||||||
if (accessPoint != accessPoints.at(i) &&
|
if (accessPoints.at(i)->connectionInterface()->path() == path) {
|
||||||
accessPoint->ssid() == accessPoints.at(i)->ssid()) {
|
okToAdd = false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (okToAdd) {
|
||||||
|
accessPoints.append(accessPoint);
|
||||||
|
accessPoint->setConnections();
|
||||||
|
connect(accessPoint, SIGNAL(propertiesChanged(QMap<QString,QVariant>)),
|
||||||
|
this, SLOT(updateAccessPoint(QMap<QString,QVariant>)));
|
||||||
|
}
|
||||||
|
|
||||||
// Check if configuration exists for connection.
|
// Check if configuration exists for connection.
|
||||||
if (!accessPoint->ssid().isEmpty()) {
|
if (!accessPoint->ssid().isEmpty()) {
|
||||||
for (int i = 0; i < connections.count(); ++i) {
|
for (int i = 0; i < connections.count(); ++i) {
|
||||||
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
||||||
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
if (accessPoint->ssid() == connection->getSsid()) {
|
if (accessPoint->ssid() == connection->getSsid()) {
|
||||||
const QString service = connection->connectionInterface()->service();
|
if (!configuredAccessPoints.contains(path)) {
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
configuredAccessPoints.insert(path,settingsPath);
|
||||||
const QString connectionId = QString::number(qHash(service + ' ' + settingsPath));
|
}
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.value(connectionId);
|
accessPointConfigurations.value(settingsPath);
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
ptr->state = QNetworkConfiguration::Discovered;
|
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||||
|
ptr->state = (flag | QNetworkConfiguration::Discovered);
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -585,9 +653,9 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjec
|
|||||||
|
|
||||||
ptr->name = accessPoint->ssid();
|
ptr->name = accessPoint->ssid();
|
||||||
ptr->isValid = true;
|
ptr->isValid = true;
|
||||||
ptr->id = QString::number(qHash(objectPath.path()));
|
ptr->id = path;
|
||||||
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
ptr->type = QNetworkConfiguration::InternetAccessPoint;
|
||||||
if(accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) {
|
if (accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) {
|
||||||
ptr->purpose = QNetworkConfiguration::PrivatePurpose;
|
ptr->purpose = QNetworkConfiguration::PrivatePurpose;
|
||||||
} else {
|
} else {
|
||||||
ptr->purpose = QNetworkConfiguration::PublicPurpose;
|
ptr->purpose = QNetworkConfiguration::PublicPurpose;
|
||||||
@ -601,30 +669,24 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path, const QDBusObjec
|
|||||||
emit configurationAdded(ptr);
|
emit configurationAdded(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerEngine::removeAccessPoint(const QString &path,
|
void QNetworkManagerEngine::removeAccessPoint(const QString &path)
|
||||||
const QDBusObjectPath &objectPath)
|
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
|
|
||||||
Q_UNUSED(path)
|
|
||||||
|
|
||||||
for (int i = 0; i < accessPoints.count(); ++i) {
|
for (int i = 0; i < accessPoints.count(); ++i) {
|
||||||
QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
|
QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
|
||||||
|
|
||||||
if (accessPoint->connectionInterface()->path() == objectPath.path()) {
|
if (accessPoint->connectionInterface()->path() == path) {
|
||||||
accessPoints.removeOne(accessPoint);
|
accessPoints.removeOne(accessPoint);
|
||||||
|
|
||||||
if (configuredAccessPoints.contains(accessPoint)) {
|
if (configuredAccessPoints.contains(accessPoint->connectionInterface()->path())) {
|
||||||
// find connection and change state to Defined
|
// find connection and change state to Defined
|
||||||
configuredAccessPoints.removeOne(accessPoint);
|
configuredAccessPoints.remove(accessPoint->connectionInterface()->path());
|
||||||
for (int i = 0; i < connections.count(); ++i) {
|
for (int i = 0; i < connections.count(); ++i) {
|
||||||
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
||||||
|
|
||||||
if (accessPoint->ssid() == connection->getSsid()) {
|
if (accessPoint->ssid() == connection->getSsid()) {//might not have bssid yet
|
||||||
const QString service = connection->connectionInterface()->service();
|
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
const QString connectionId =
|
const QString connectionId = settingsPath;
|
||||||
QString::number(qHash(service + ' ' + settingsPath));
|
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.value(connectionId);
|
accessPointConfigurations.value(connectionId);
|
||||||
@ -640,17 +702,17 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.take(QString::number(qHash(objectPath.path())));
|
accessPointConfigurations.take(path);
|
||||||
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
|
locker.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
emit configurationRemoved(ptr);
|
emit configurationRemoved(ptr);
|
||||||
locker.relock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete accessPoint;
|
delete accessPoint;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -666,19 +728,19 @@ void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map
|
|||||||
qobject_cast<QNetworkManagerInterfaceAccessPoint *>(sender());
|
qobject_cast<QNetworkManagerInterfaceAccessPoint *>(sender());
|
||||||
if (!accessPoint)
|
if (!accessPoint)
|
||||||
return;
|
return;
|
||||||
|
accessPoint->deleteLater();
|
||||||
for (int i = 0; i < connections.count(); ++i) {
|
for (int i = 0; i < connections.count(); ++i) {
|
||||||
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
||||||
|
|
||||||
if (accessPoint->ssid() == connection->getSsid()) {
|
if (accessPoint->ssid() == connection->getSsid()) {
|
||||||
const QString service = connection->connectionInterface()->service();
|
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
const QString settingsPath = connection->connectionInterface()->path();
|
||||||
const QString connectionId = QString::number(qHash(service + ' ' + settingsPath));
|
const QString connectionId = settingsPath;
|
||||||
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.value(connectionId);
|
accessPointConfigurations.value(connectionId);
|
||||||
ptr->mutex.lock();
|
ptr->mutex.lock();
|
||||||
ptr->state = QNetworkConfiguration::Discovered;
|
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||||
|
ptr->state = (flag | QNetworkConfiguration::Discovered);
|
||||||
ptr->mutex.unlock();
|
ptr->mutex.unlock();
|
||||||
|
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
@ -688,14 +750,16 @@ void QNetworkManagerEngine::updateAccessPoint(const QMap<QString, QVariant> &map
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &service,
|
QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &settingsPath,
|
||||||
const QString &settingsPath,
|
|
||||||
const QNmSettingsMap &map)
|
const QNmSettingsMap &map)
|
||||||
{
|
{
|
||||||
|
// Q_UNUSED(service);
|
||||||
|
QMutexLocker locker(&mutex);
|
||||||
QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
|
QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
|
||||||
cpPriv->name = map.value("connection").value("id").toString();
|
cpPriv->name = map.value("connection").value("id").toString();
|
||||||
|
|
||||||
cpPriv->isValid = true;
|
cpPriv->isValid = true;
|
||||||
cpPriv->id = QString::number(qHash(service + ' ' + settingsPath));
|
cpPriv->id = settingsPath;
|
||||||
cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
|
cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
|
||||||
|
|
||||||
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
||||||
@ -708,15 +772,14 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
|
|||||||
cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
|
cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
|
||||||
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
||||||
|
|
||||||
foreach (const QDBusObjectPath &devicePath, interface->getDevices()) {
|
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
|
||||||
QNetworkManagerInterfaceDevice device(devicePath.path());
|
QNetworkManagerInterfaceDevice device(devicePath.path());
|
||||||
if (device.deviceType() == DEVICE_TYPE_802_3_ETHERNET) {
|
if (device.deviceType() == DEVICE_TYPE_ETHERNET) {
|
||||||
QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path());
|
QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path());
|
||||||
if (wiredDevice.carrier()) {
|
if (wiredDevice.carrier()) {
|
||||||
cpPriv->state |= QNetworkConfiguration::Discovered;
|
cpPriv->state |= QNetworkConfiguration::Discovered;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (connectionType == QLatin1String("802-11-wireless")) {
|
} else if (connectionType == QLatin1String("802-11-wireless")) {
|
||||||
@ -724,35 +787,57 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
|
|||||||
|
|
||||||
const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
|
const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
|
||||||
const QString connectionSecurity = map.value("802-11-wireless").value("security").toString();
|
const QString connectionSecurity = map.value("802-11-wireless").value("security").toString();
|
||||||
if(!connectionSecurity.isEmpty()) {
|
if (!connectionSecurity.isEmpty()) {
|
||||||
cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
|
cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
|
||||||
} else {
|
} else {
|
||||||
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < accessPoints.count(); ++i) {
|
for (int i = 0; i < accessPoints.count(); ++i) {
|
||||||
if (connectionSsid == accessPoints.at(i)->ssid()) {
|
if (connectionSsid == accessPoints.at(i)->ssid()
|
||||||
|
&& map.value("802-11-wireless").value("seen-bssids").toStringList().contains(accessPoints.at(i)->hwAddress())) {
|
||||||
cpPriv->state |= QNetworkConfiguration::Discovered;
|
cpPriv->state |= QNetworkConfiguration::Discovered;
|
||||||
if (!configuredAccessPoints.contains(accessPoints.at(i))) {
|
if (!configuredAccessPoints.contains(accessPoints.at(i)->connectionInterface()->path())) {
|
||||||
configuredAccessPoints.append(accessPoints.at(i));
|
configuredAccessPoints.insert(accessPoints.at(i)->connectionInterface()->path(),settingsPath);
|
||||||
|
|
||||||
const QString accessPointId =
|
const QString accessPointId = accessPoints.at(i)->connectionInterface()->path();
|
||||||
QString::number(qHash(accessPoints.at(i)->connectionInterface()->path()));
|
|
||||||
QNetworkConfigurationPrivatePointer ptr =
|
QNetworkConfigurationPrivatePointer ptr =
|
||||||
accessPointConfigurations.take(accessPointId);
|
accessPointConfigurations.take(accessPointId);
|
||||||
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
mutex.unlock();
|
locker.unlock();
|
||||||
emit configurationRemoved(ptr);
|
emit configurationRemoved(ptr);
|
||||||
mutex.lock();
|
locker.relock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (connectionType == "gsm") {
|
} else if (connectionType == QLatin1String("gsm")) {
|
||||||
cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
|
|
||||||
} else if (connectionType == "cdma") {
|
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
|
||||||
cpPriv->bearerType = QNetworkConfiguration::BearerCDMA2000;
|
QNetworkManagerInterfaceDevice device(devicePath.path());
|
||||||
|
|
||||||
|
if (device.deviceType() == DEVICE_TYPE_MODEM) {
|
||||||
|
QNetworkManagerInterfaceDeviceModem deviceModem(device.connectionInterface()->path(),this);
|
||||||
|
switch (deviceModem.currentCapabilities()) {
|
||||||
|
case 2:
|
||||||
|
cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
cpPriv->bearerType = QNetworkConfiguration::Bearer3G;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
cpPriv->bearerType = QNetworkConfiguration::Bearer4G;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
|
||||||
|
cpPriv->state |= QNetworkConfiguration::Discovered;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpPriv;
|
return cpPriv;
|
||||||
@ -762,12 +847,7 @@ QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < connections.count(); ++i) {
|
for (int i = 0; i < connections.count(); ++i) {
|
||||||
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
QNetworkManagerSettingsConnection *connection = connections.at(i);
|
||||||
const QString service = connection->connectionInterface()->service();
|
if (id == connection->connectionInterface()->path())
|
||||||
const QString settingsPath = connection->connectionInterface()->path();
|
|
||||||
|
|
||||||
const QString identifier = QString::number(qHash(service + ' ' + settingsPath));
|
|
||||||
|
|
||||||
if (id == identifier)
|
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -789,8 +869,7 @@ QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &i
|
|||||||
foreach (const QString &acPath, activeConnections.keys()) {
|
foreach (const QString &acPath, activeConnections.keys()) {
|
||||||
QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath);
|
QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath);
|
||||||
|
|
||||||
const QString identifier = QString::number(qHash(activeConnection->serviceName() + ' ' +
|
const QString identifier = activeConnection->connection().path();
|
||||||
activeConnection->connection().path()));
|
|
||||||
|
|
||||||
if (id == identifier) {
|
if (id == identifier) {
|
||||||
switch (activeConnection->state()) {
|
switch (activeConnection->state()) {
|
||||||
@ -884,7 +963,8 @@ quint64 QNetworkManagerEngine::startTime(const QString &id)
|
|||||||
QNetworkConfigurationManager::Capabilities QNetworkManagerEngine::capabilities() const
|
QNetworkConfigurationManager::Capabilities QNetworkManagerEngine::capabilities() const
|
||||||
{
|
{
|
||||||
return QNetworkConfigurationManager::ForcedRoaming |
|
return QNetworkConfigurationManager::ForcedRoaming |
|
||||||
QNetworkConfigurationManager::CanStartAndStopInterfaces;
|
QNetworkConfigurationManager::DataStatistics |
|
||||||
|
QNetworkConfigurationManager::CanStartAndStopInterfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
|
QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
|
||||||
|
@ -93,36 +93,37 @@ private Q_SLOTS:
|
|||||||
const QMap<QString, QVariant> &properties);
|
const QMap<QString, QVariant> &properties);
|
||||||
void activeConnectionPropertiesChanged(const QString &path,
|
void activeConnectionPropertiesChanged(const QString &path,
|
||||||
const QMap<QString, QVariant> &properties);
|
const QMap<QString, QVariant> &properties);
|
||||||
void devicePropertiesChanged(const QString &path,
|
void devicePropertiesChanged(const QString &path, quint32);
|
||||||
const QMap<QString, QVariant> &properties);
|
|
||||||
|
|
||||||
void deviceAdded(const QDBusObjectPath &path);
|
void deviceAdded(const QDBusObjectPath &path);
|
||||||
void deviceRemoved(const QDBusObjectPath &path);
|
void deviceRemoved(const QDBusObjectPath &path);
|
||||||
|
|
||||||
void newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings = 0);
|
void newConnection(const QDBusObjectPath &path, QNetworkManagerSettings *settings = 0);
|
||||||
void removeConnection(const QString &path);
|
void removeConnection(const QString &path);
|
||||||
void updateConnection(const QNmSettingsMap &settings);
|
void updateConnection();
|
||||||
void activationFinished(QDBusPendingCallWatcher *watcher);
|
void activationFinished(QDBusPendingCallWatcher *watcher);
|
||||||
|
void deviceConnectionsChanged(const QStringList &activeConnectionsList);
|
||||||
|
|
||||||
void newAccessPoint(const QString &path, const QDBusObjectPath &objectPath);
|
void newAccessPoint(const QString &path);
|
||||||
void removeAccessPoint(const QString &path, const QDBusObjectPath &objectPath);
|
void removeAccessPoint(const QString &path);
|
||||||
void updateAccessPoint(const QMap<QString, QVariant> &map);
|
void updateAccessPoint(const QMap<QString, QVariant> &map);
|
||||||
|
void scanFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QNetworkConfigurationPrivate *parseConnection(const QString &service,
|
QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
|
||||||
const QString &settingsPath,
|
|
||||||
const QNmSettingsMap &map);
|
const QNmSettingsMap &map);
|
||||||
QNetworkManagerSettingsConnection *connectionFromId(const QString &id) const;
|
QNetworkManagerSettingsConnection *connectionFromId(const QString &id) const;
|
||||||
|
|
||||||
private:
|
QNetworkManagerInterface *managerInterface;
|
||||||
QNetworkManagerInterface *interface;
|
|
||||||
QNetworkManagerSettings *systemSettings;
|
QNetworkManagerSettings *systemSettings;
|
||||||
QNetworkManagerSettings *userSettings;
|
QNetworkManagerSettings *userSettings;
|
||||||
QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices;
|
QHash<QString, QNetworkManagerInterfaceDeviceWireless *> wirelessDevices;
|
||||||
QHash<QString, QNetworkManagerConnectionActive *> activeConnections;
|
QHash<QString, QNetworkManagerConnectionActive *> activeConnections;
|
||||||
QList<QNetworkManagerSettingsConnection *> connections;
|
QList<QNetworkManagerSettingsConnection *> connections;
|
||||||
QList<QNetworkManagerInterfaceAccessPoint *> accessPoints;
|
QList<QNetworkManagerInterfaceAccessPoint *> accessPoints;
|
||||||
QList<QNetworkManagerInterfaceAccessPoint *> configuredAccessPoints;
|
QHash<QString, QNetworkManagerInterfaceDevice *> interfaceDevices;
|
||||||
|
|
||||||
|
QMap<QString,QString> configuredAccessPoints; //ap, settings path
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -97,21 +97,21 @@ bool QNetworkManagerInterface::setConnections()
|
|||||||
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
||||||
|
|
||||||
bool allOk = false;
|
bool allOk = false;
|
||||||
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
QLatin1String(NM_DBUS_PATH),
|
QLatin1String(NM_DBUS_PATH),
|
||||||
QLatin1String(NM_DBUS_INTERFACE),
|
QLatin1String(NM_DBUS_INTERFACE),
|
||||||
QLatin1String("PropertiesChanged"),
|
QLatin1String("PropertiesChanged"),
|
||||||
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
|
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
|
||||||
allOk = true;
|
allOk = true;
|
||||||
}
|
}
|
||||||
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
QLatin1String(NM_DBUS_PATH),
|
QLatin1String(NM_DBUS_PATH),
|
||||||
QLatin1String(NM_DBUS_INTERFACE),
|
QLatin1String(NM_DBUS_INTERFACE),
|
||||||
QLatin1String("DeviceAdded"),
|
QLatin1String("DeviceAdded"),
|
||||||
this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
|
this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
|
||||||
allOk = true;
|
allOk = true;
|
||||||
}
|
}
|
||||||
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
QLatin1String(NM_DBUS_PATH),
|
QLatin1String(NM_DBUS_PATH),
|
||||||
QLatin1String(NM_DBUS_INTERFACE),
|
QLatin1String(NM_DBUS_INTERFACE),
|
||||||
QLatin1String("DeviceRemoved"),
|
QLatin1String("DeviceRemoved"),
|
||||||
@ -133,18 +133,17 @@ QList <QDBusObjectPath> QNetworkManagerInterface::getDevices() const
|
|||||||
return reply.value();
|
return reply.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNetworkManagerInterface::activateConnection( const QString &serviceName,
|
void QNetworkManagerInterface::activateConnection( const QString &,
|
||||||
QDBusObjectPath connectionPath,
|
QDBusObjectPath connectionPath,
|
||||||
QDBusObjectPath devicePath,
|
QDBusObjectPath devicePath,
|
||||||
QDBusObjectPath specificObject)
|
QDBusObjectPath specificObject)
|
||||||
{
|
{
|
||||||
QDBusPendingCall pendingCall = d->connectionInterface->asyncCall(QLatin1String("ActivateConnection"),
|
QDBusPendingCall pendingCall = d->connectionInterface->asyncCall(QLatin1String("ActivateConnection"),
|
||||||
QVariant(serviceName),
|
|
||||||
QVariant::fromValue(connectionPath),
|
QVariant::fromValue(connectionPath),
|
||||||
QVariant::fromValue(devicePath),
|
QVariant::fromValue(devicePath),
|
||||||
QVariant::fromValue(specificObject));
|
QVariant::fromValue(specificObject));
|
||||||
|
|
||||||
QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall, this);
|
QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(pendingCall);
|
||||||
connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
|
connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
|
||||||
this, SIGNAL(activationFinished(QDBusPendingCallWatcher*)));
|
this, SIGNAL(activationFinished(QDBusPendingCallWatcher*)));
|
||||||
}
|
}
|
||||||
@ -323,18 +322,31 @@ bool QNetworkManagerInterfaceDevice::setConnections()
|
|||||||
if(!isValid() )
|
if(!isValid() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
delete nmDBusHelper;
|
delete nmDBusHelper;
|
||||||
nmDBusHelper = new QNmDBusHelper(this);
|
nmDBusHelper = new QNmDBusHelper(this);
|
||||||
connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
|
connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
|
||||||
this, SIGNAL(stateChanged(QString,quint32)));
|
this, SIGNAL(stateChanged(QString,quint32)));
|
||||||
|
|
||||||
if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_DEVICE),
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE),
|
||||||
QLatin1String("StateChanged"),
|
QLatin1String("StateChanged"),
|
||||||
nmDBusHelper,SLOT(deviceStateChanged(quint32)))) {
|
nmDBusHelper,SLOT(deviceStateChanged(quint32)))) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(nmDBusHelper, SIGNAL(pathForConnectionsChanged(QStringList)),
|
||||||
|
this,SIGNAL(connectionsChanged(QStringList)));
|
||||||
|
|
||||||
|
if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
|
d->path,
|
||||||
|
QLatin1String(NM_DBUS_INTERFACE_ACCESS_POINT),
|
||||||
|
QLatin1String("PropertiesChanged"),
|
||||||
|
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
|
||||||
|
allOk = false;
|
||||||
|
}
|
||||||
|
|
||||||
return allOk;
|
return allOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,18 +427,18 @@ bool QNetworkManagerInterfaceDeviceWired::setConnections()
|
|||||||
if(!isValid() )
|
if(!isValid() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
|
|
||||||
delete nmDBusHelper;
|
delete nmDBusHelper;
|
||||||
nmDBusHelper = new QNmDBusHelper(this);
|
nmDBusHelper = new QNmDBusHelper(this);
|
||||||
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRED),
|
||||||
QLatin1String("PropertiesChanged"),
|
QLatin1String("PropertiesChanged"),
|
||||||
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
|
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
}
|
}
|
||||||
return allOk;
|
return allOk;
|
||||||
}
|
}
|
||||||
@ -492,44 +504,50 @@ bool QNetworkManagerInterfaceDeviceWireless::setConnections()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
delete nmDBusHelper;
|
delete nmDBusHelper;
|
||||||
nmDBusHelper = new QNmDBusHelper(this);
|
nmDBusHelper = new QNmDBusHelper(this);
|
||||||
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
|
|
||||||
connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString,QDBusObjectPath)),
|
connect(nmDBusHelper, SIGNAL(pathForAccessPointAdded(QString)),
|
||||||
this,SIGNAL(accessPointAdded(QString,QDBusObjectPath)));
|
this,SIGNAL(accessPointAdded(QString)));
|
||||||
|
|
||||||
connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString,QDBusObjectPath)),
|
connect(nmDBusHelper, SIGNAL(pathForAccessPointRemoved(QString)),
|
||||||
this,SIGNAL(accessPointRemoved(QString,QDBusObjectPath)));
|
this,SIGNAL(accessPointRemoved(QString)));
|
||||||
|
|
||||||
if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
||||||
QLatin1String("AccessPointAdded"),
|
QLatin1String("AccessPointAdded"),
|
||||||
nmDBusHelper, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
|
nmDBusHelper, SLOT(slotAccessPointAdded(QDBusObjectPath)))) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
||||||
QLatin1String("AccessPointRemoved"),
|
QLatin1String("AccessPointRemoved"),
|
||||||
nmDBusHelper, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
|
nmDBusHelper, SLOT(slotAccessPointRemoved(QDBusObjectPath)))) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
||||||
QLatin1String("PropertiesChanged"),
|
QLatin1String("PropertiesChanged"),
|
||||||
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
|
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>)))) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
|
}
|
||||||
|
if (!dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
|
d->path,
|
||||||
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_WIRELESS),
|
||||||
|
QLatin1String("ScanDone"),
|
||||||
|
this, SLOT(scanIsDone()))) {
|
||||||
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return allOk;
|
return allOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -569,6 +587,89 @@ quint32 QNetworkManagerInterfaceDeviceWireless::wirelessCapabilities() const
|
|||||||
return d->connectionInterface->property("WirelelessCapabilities").toUInt();
|
return d->connectionInterface->property("WirelelessCapabilities").toUInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QNetworkManagerInterfaceDeviceWireless::scanIsDone()
|
||||||
|
{
|
||||||
|
Q_EMIT scanDone();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QNetworkManagerInterfaceDeviceWireless::requestScan()
|
||||||
|
{
|
||||||
|
d->connectionInterface->asyncCall(QLatin1String("RequestScan"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class QNetworkManagerInterfaceDeviceModemPrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QDBusInterface *connectionInterface;
|
||||||
|
QString path;
|
||||||
|
bool valid;
|
||||||
|
};
|
||||||
|
|
||||||
|
QNetworkManagerInterfaceDeviceModem::QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath, QObject *parent)
|
||||||
|
: QObject(parent), nmDBusHelper(0)
|
||||||
|
{
|
||||||
|
d = new QNetworkManagerInterfaceDeviceModemPrivate();
|
||||||
|
d->path = ifaceDevicePath;
|
||||||
|
d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
|
||||||
|
d->path,
|
||||||
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
|
||||||
|
QDBusConnection::systemBus(), parent);
|
||||||
|
if (!d->connectionInterface->isValid()) {
|
||||||
|
d->valid = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d->valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QNetworkManagerInterfaceDeviceModem::~QNetworkManagerInterfaceDeviceModem()
|
||||||
|
{
|
||||||
|
delete d->connectionInterface;
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QNetworkManagerInterfaceDeviceModem::isValid()
|
||||||
|
{
|
||||||
|
|
||||||
|
return d->valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QNetworkManagerInterfaceDeviceModem::setConnections()
|
||||||
|
{
|
||||||
|
if (!isValid() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool allOk = true;
|
||||||
|
|
||||||
|
delete nmDBusHelper;
|
||||||
|
nmDBusHelper = new QNmDBusHelper(this);
|
||||||
|
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
|
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
|
if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
|
d->path,
|
||||||
|
QLatin1String(NM_DBUS_INTERFACE_DEVICE_MODEM),
|
||||||
|
QLatin1String("PropertiesChanged"),
|
||||||
|
nmDBusHelper,SLOT(slotDevicePropertiesChanged(QMap<QString,QVariant>))) ) {
|
||||||
|
allOk = false;
|
||||||
|
}
|
||||||
|
return allOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDBusInterface *QNetworkManagerInterfaceDeviceModem::connectionInterface() const
|
||||||
|
{
|
||||||
|
return d->connectionInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
quint32 QNetworkManagerInterfaceDeviceModem::modemCapabilities() const
|
||||||
|
{
|
||||||
|
return d->connectionInterface->property("ModemCapabilities").toUInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
quint32 QNetworkManagerInterfaceDeviceModem::currentCapabilities() const
|
||||||
|
{
|
||||||
|
return d->connectionInterface->property("CurrentCapabilities").toUInt();
|
||||||
|
}
|
||||||
|
|
||||||
class QNetworkManagerSettingsPrivate
|
class QNetworkManagerSettingsPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -606,12 +707,14 @@ bool QNetworkManagerSettings::isValid()
|
|||||||
|
|
||||||
bool QNetworkManagerSettings::setConnections()
|
bool QNetworkManagerSettings::setConnections()
|
||||||
{
|
{
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
|
|
||||||
if (!QDBusConnection::systemBus().connect(d->path, QLatin1String(NM_DBUS_PATH_SETTINGS),
|
if (!QDBusConnection::systemBus().connect(d->path,
|
||||||
QLatin1String(NM_DBUS_IFACE_SETTINGS), QLatin1String("NewConnection"),
|
QLatin1String(NM_DBUS_PATH_SETTINGS),
|
||||||
this, SIGNAL(newConnection(QDBusObjectPath)))) {
|
QLatin1String(NM_DBUS_IFACE_SETTINGS),
|
||||||
allOk = true;
|
QLatin1String("NewConnection"),
|
||||||
|
this, SIGNAL(newConnection(QDBusObjectPath)))) {
|
||||||
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return allOk;
|
return allOk;
|
||||||
@ -623,6 +726,14 @@ QList <QDBusObjectPath> QNetworkManagerSettings::listConnections()
|
|||||||
return reply.value();
|
return reply.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString QNetworkManagerSettings::getConnectionByUuid(const QString &uuid)
|
||||||
|
{
|
||||||
|
QList<QVariant> argumentList;
|
||||||
|
argumentList << QVariant::fromValue(uuid);
|
||||||
|
QDBusReply<QDBusObjectPath > reply = d->connectionInterface->callWithArgumentList(QDBus::Block,QLatin1String("GetConnectionByUuid"), argumentList);
|
||||||
|
return reply.value().path();
|
||||||
|
}
|
||||||
|
|
||||||
QDBusInterface *QNetworkManagerSettings::connectionInterface() const
|
QDBusInterface *QNetworkManagerSettings::connectionInterface() const
|
||||||
{
|
{
|
||||||
return d->connectionInterface;
|
return d->connectionInterface;
|
||||||
@ -676,13 +787,13 @@ bool QNetworkManagerSettingsConnection::setConnections()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
QDBusConnection dbusConnection = QDBusConnection::systemBus();
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
if(!dbusConnection.connect(d->service, d->path,
|
if (!dbusConnection.connect(d->service,
|
||||||
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Updated"),
|
d->path,
|
||||||
this, SIGNAL(updated(QNmSettingsMap)))) {
|
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
|
||||||
allOk = true;
|
QLatin1String("Updated"),
|
||||||
} else {
|
this, SIGNAL(updated()))) {
|
||||||
QDBusError error = dbusConnection.lastError();
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete nmDBusHelper;
|
delete nmDBusHelper;
|
||||||
@ -690,12 +801,13 @@ bool QNetworkManagerSettingsConnection::setConnections()
|
|||||||
connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(QString)),
|
connect(nmDBusHelper, SIGNAL(pathForSettingsRemoved(QString)),
|
||||||
this,SIGNAL(removed(QString)));
|
this,SIGNAL(removed(QString)));
|
||||||
|
|
||||||
if (!dbusConnection.connect(d->service, d->path,
|
if (!dbusConnection.connect(d->service,
|
||||||
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), QLatin1String("Removed"),
|
d->path,
|
||||||
nmDBusHelper, SIGNAL(slotSettingsRemoved()))) {
|
QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION),
|
||||||
allOk = true;
|
QLatin1String("Removed"),
|
||||||
|
nmDBusHelper, SIGNAL(slotSettingsRemoved()))) {
|
||||||
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return allOk;
|
return allOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -717,9 +829,9 @@ NMDeviceType QNetworkManagerSettingsConnection::getType()
|
|||||||
d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString();
|
d->settingsMap.value(QLatin1String("connection")).value(QLatin1String("type")).toString();
|
||||||
|
|
||||||
if (devType == QLatin1String("802-3-ethernet"))
|
if (devType == QLatin1String("802-3-ethernet"))
|
||||||
return DEVICE_TYPE_802_3_ETHERNET;
|
return DEVICE_TYPE_ETHERNET;
|
||||||
else if (devType == QLatin1String("802-11-wireless"))
|
else if (devType == QLatin1String("802-11-wireless"))
|
||||||
return DEVICE_TYPE_802_11_WIRELESS;
|
return DEVICE_TYPE_WIFI;
|
||||||
else
|
else
|
||||||
return DEVICE_TYPE_UNKNOWN;
|
return DEVICE_TYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -766,10 +878,10 @@ QString QNetworkManagerSettingsConnection::getMacAddress()
|
|||||||
{
|
{
|
||||||
NMDeviceType type = getType();
|
NMDeviceType type = getType();
|
||||||
|
|
||||||
if (type == DEVICE_TYPE_802_3_ETHERNET) {
|
if (type == DEVICE_TYPE_ETHERNET) {
|
||||||
return d->settingsMap.value(QLatin1String("802-3-ethernet"))
|
return d->settingsMap.value(QLatin1String("802-3-ethernet"))
|
||||||
.value(QLatin1String("mac-address")).toString();
|
.value(QLatin1String("mac-address")).toString();
|
||||||
} else if (type == DEVICE_TYPE_802_11_WIRELESS) {
|
} else if (type == DEVICE_TYPE_WIFI) {
|
||||||
return d->settingsMap.value(QLatin1String("802-11-wireless"))
|
return d->settingsMap.value(QLatin1String("802-11-wireless"))
|
||||||
.value(QLatin1String("mac-address")).toString();
|
.value(QLatin1String("mac-address")).toString();
|
||||||
} else {
|
} else {
|
||||||
@ -779,7 +891,7 @@ QString QNetworkManagerSettingsConnection::getMacAddress()
|
|||||||
|
|
||||||
QStringList QNetworkManagerSettingsConnection::getSeenBssids()
|
QStringList QNetworkManagerSettingsConnection::getSeenBssids()
|
||||||
{
|
{
|
||||||
if (getType() == DEVICE_TYPE_802_11_WIRELESS) {
|
if (getType() == DEVICE_TYPE_WIFI) {
|
||||||
return d->settingsMap.value(QLatin1String("802-11-wireless"))
|
return d->settingsMap.value(QLatin1String("802-11-wireless"))
|
||||||
.value(QLatin1String("seen-bssids")).toStringList();
|
.value(QLatin1String("seen-bssids")).toStringList();
|
||||||
} else {
|
} else {
|
||||||
@ -795,7 +907,7 @@ public:
|
|||||||
bool valid;
|
bool valid;
|
||||||
};
|
};
|
||||||
|
|
||||||
QNetworkManagerConnectionActive::QNetworkManagerConnectionActive( const QString &activeConnectionObjectPath, QObject *parent)
|
QNetworkManagerConnectionActive::QNetworkManagerConnectionActive(const QString &activeConnectionObjectPath, QObject *parent)
|
||||||
: QObject(parent), nmDBusHelper(0)
|
: QObject(parent), nmDBusHelper(0)
|
||||||
{
|
{
|
||||||
d = new QNetworkManagerConnectionActivePrivate();
|
d = new QNetworkManagerConnectionActivePrivate();
|
||||||
@ -827,17 +939,18 @@ bool QNetworkManagerConnectionActive::setConnections()
|
|||||||
if(!isValid() )
|
if(!isValid() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool allOk = false;
|
bool allOk = true;
|
||||||
delete nmDBusHelper;
|
delete nmDBusHelper;
|
||||||
nmDBusHelper = new QNmDBusHelper(this);
|
nmDBusHelper = new QNmDBusHelper(this);
|
||||||
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap<QString,QVariant>)),
|
||||||
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
this,SIGNAL(propertiesChanged(QString,QMap<QString,QVariant>)));
|
||||||
if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
|
||||||
|
if (!QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
|
||||||
d->path,
|
d->path,
|
||||||
QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
|
QLatin1String(NM_DBUS_INTERFACE_ACTIVE_CONNECTION),
|
||||||
QLatin1String("PropertiesChanged"),
|
QLatin1String("PropertiesChanged"),
|
||||||
nmDBusHelper,SLOT(slotPropertiesChanged(QMap<QString,QVariant>))) ) {
|
nmDBusHelper,SLOT(activeConnectionPropertiesChanged(QMap<QString,QVariant>))) ) {
|
||||||
allOk = true;
|
allOk = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return allOk;
|
return allOk;
|
||||||
@ -848,11 +961,6 @@ QDBusInterface *QNetworkManagerConnectionActive::connectionInterface() const
|
|||||||
return d->connectionInterface;
|
return d->connectionInterface;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString QNetworkManagerConnectionActive::serviceName() const
|
|
||||||
{
|
|
||||||
return d->connectionInterface->property("ServiceName").toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
QDBusObjectPath QNetworkManagerConnectionActive::connection() const
|
QDBusObjectPath QNetworkManagerConnectionActive::connection() const
|
||||||
{
|
{
|
||||||
QVariant prop = d->connectionInterface->property("Connection");
|
QVariant prop = d->connectionInterface->property("Connection");
|
||||||
|
@ -64,31 +64,32 @@
|
|||||||
typedef enum NMDeviceType
|
typedef enum NMDeviceType
|
||||||
{
|
{
|
||||||
DEVICE_TYPE_UNKNOWN = 0,
|
DEVICE_TYPE_UNKNOWN = 0,
|
||||||
DEVICE_TYPE_802_3_ETHERNET,
|
DEVICE_TYPE_ETHERNET,
|
||||||
DEVICE_TYPE_802_11_WIRELESS,
|
DEVICE_TYPE_WIFI,
|
||||||
DEVICE_TYPE_GSM,
|
DEVICE_TYPE_MODEM = 8
|
||||||
DEVICE_TYPE_CDMA
|
|
||||||
} NMDeviceType;
|
} NMDeviceType;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
NM_DEVICE_STATE_UNKNOWN = 0,
|
NM_DEVICE_STATE_UNKNOWN = 0,
|
||||||
NM_DEVICE_STATE_UNMANAGED,
|
NM_DEVICE_STATE_UNMANAGED = 10,
|
||||||
NM_DEVICE_STATE_UNAVAILABLE,
|
NM_DEVICE_STATE_UNAVAILABLE = 20,
|
||||||
NM_DEVICE_STATE_DISCONNECTED,
|
NM_DEVICE_STATE_DISCONNECTED = 30,
|
||||||
NM_DEVICE_STATE_PREPARE,
|
NM_DEVICE_STATE_PREPARE = 40,
|
||||||
NM_DEVICE_STATE_CONFIG,
|
NM_DEVICE_STATE_CONFIG = 50,
|
||||||
NM_DEVICE_STATE_NEED_AUTH,
|
NM_DEVICE_STATE_NEED_AUTH = 60,
|
||||||
NM_DEVICE_STATE_IP_CONFIG,
|
NM_DEVICE_STATE_IP_CONFIG = 70,
|
||||||
NM_DEVICE_STATE_ACTIVATED,
|
NM_DEVICE_STATE_ACTIVATED = 100,
|
||||||
NM_DEVICE_STATE_FAILED
|
NM_DEVICE_STATE_DEACTIVATING = 110,
|
||||||
|
NM_DEVICE_STATE_FAILED = 120
|
||||||
} NMDeviceState;
|
} NMDeviceState;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
|
NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
|
||||||
NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
|
NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
|
||||||
NM_ACTIVE_CONNECTION_STATE_ACTIVATED
|
NM_ACTIVE_CONNECTION_STATE_ACTIVATED,
|
||||||
|
NM_ACTIVE_CONNECTION_STATE_DEACTIVATED
|
||||||
} NMActiveConnectionState;
|
} NMActiveConnectionState;
|
||||||
|
|
||||||
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
|
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
|
||||||
@ -98,13 +99,14 @@ typedef enum
|
|||||||
#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
|
#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
|
||||||
#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
|
#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
|
||||||
#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
|
#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
|
||||||
|
#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem"
|
||||||
#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
|
#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
|
||||||
#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
|
#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
|
||||||
|
|
||||||
#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManagerSettings"
|
#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings"
|
||||||
|
|
||||||
#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManagerSettings.Connection"
|
#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection"
|
||||||
#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManagerSettings"
|
#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
|
||||||
#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
|
#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
|
||||||
#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
|
#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
|
||||||
|
|
||||||
@ -256,7 +258,8 @@ public:
|
|||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void stateChanged(const QString &, quint32);
|
void stateChanged(const QString &, quint32);
|
||||||
|
void propertiesChanged(const QString &, QMap<QString,QVariant>);
|
||||||
|
void connectionsChanged(QStringList);
|
||||||
private:
|
private:
|
||||||
QNetworkManagerInterfaceDevicePrivate *d;
|
QNetworkManagerInterfaceDevicePrivate *d;
|
||||||
QNmDBusHelper *nmDBusHelper;
|
QNmDBusHelper *nmDBusHelper;
|
||||||
@ -320,15 +323,55 @@ public:
|
|||||||
bool setConnections();
|
bool setConnections();
|
||||||
bool isValid();
|
bool isValid();
|
||||||
|
|
||||||
|
void requestScan();
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void propertiesChanged( const QString &, QMap<QString,QVariant>);
|
void propertiesChanged( const QString &, QMap<QString,QVariant>);
|
||||||
void accessPointAdded(const QString &,QDBusObjectPath);
|
void accessPointAdded(const QString &);
|
||||||
void accessPointRemoved(const QString &,QDBusObjectPath);
|
void accessPointRemoved(const QString &);
|
||||||
|
void scanDone();
|
||||||
|
private Q_SLOTS:
|
||||||
|
void scanIsDone();
|
||||||
private:
|
private:
|
||||||
QNetworkManagerInterfaceDeviceWirelessPrivate *d;
|
QNetworkManagerInterfaceDeviceWirelessPrivate *d;
|
||||||
QNmDBusHelper *nmDBusHelper;
|
QNmDBusHelper *nmDBusHelper;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QNetworkManagerInterfaceDeviceModemPrivate;
|
||||||
|
class QNetworkManagerInterfaceDeviceModem : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum ModemCapability {
|
||||||
|
None = 0x0,
|
||||||
|
Pots = 0x1,
|
||||||
|
Cmda_Edvo = 0x2,
|
||||||
|
Gsm_Umts = 0x4,
|
||||||
|
Lte = 0x08
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath,
|
||||||
|
QObject *parent = 0);
|
||||||
|
~QNetworkManagerInterfaceDeviceModem();
|
||||||
|
|
||||||
|
QDBusObjectPath path() const;
|
||||||
|
QDBusInterface *connectionInterface() const;
|
||||||
|
|
||||||
|
bool setConnections();
|
||||||
|
bool isValid();
|
||||||
|
|
||||||
|
quint32 modemCapabilities() const;
|
||||||
|
quint32 currentCapabilities() const;
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void propertiesChanged( const QString &, QMap<QString,QVariant>);
|
||||||
|
private:
|
||||||
|
QNetworkManagerInterfaceDeviceModemPrivate *d;
|
||||||
|
QNmDBusHelper *nmDBusHelper;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class QNetworkManagerSettingsPrivate;
|
class QNetworkManagerSettingsPrivate;
|
||||||
class QNetworkManagerSettings : public QObject
|
class QNetworkManagerSettings : public QObject
|
||||||
{
|
{
|
||||||
@ -341,6 +384,7 @@ public:
|
|||||||
|
|
||||||
QDBusInterface *connectionInterface() const;
|
QDBusInterface *connectionInterface() const;
|
||||||
QList <QDBusObjectPath> listConnections();
|
QList <QDBusObjectPath> listConnections();
|
||||||
|
QString getConnectionByUuid(const QString &uuid);
|
||||||
bool setConnections();
|
bool setConnections();
|
||||||
bool isValid();
|
bool isValid();
|
||||||
|
|
||||||
@ -375,7 +419,7 @@ public:
|
|||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
|
|
||||||
void updated(const QNmSettingsMap &settings);
|
void updated();
|
||||||
void removed(const QString &path);
|
void removed(const QString &path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -60,7 +60,7 @@ QNmDBusHelper::~QNmDBusHelper()
|
|||||||
void QNmDBusHelper::deviceStateChanged(quint32 state)
|
void QNmDBusHelper::deviceStateChanged(quint32 state)
|
||||||
{
|
{
|
||||||
QDBusMessage msg = this->message();
|
QDBusMessage msg = this->message();
|
||||||
if(state == NM_DEVICE_STATE_ACTIVATED
|
if (state == NM_DEVICE_STATE_ACTIVATED
|
||||||
|| state == NM_DEVICE_STATE_DISCONNECTED
|
|| state == NM_DEVICE_STATE_DISCONNECTED
|
||||||
|| state == NM_DEVICE_STATE_UNAVAILABLE
|
|| state == NM_DEVICE_STATE_UNAVAILABLE
|
||||||
|| state == NM_DEVICE_STATE_FAILED) {
|
|| state == NM_DEVICE_STATE_FAILED) {
|
||||||
@ -70,18 +70,14 @@ void QNmDBusHelper::deviceStateChanged(quint32 state)
|
|||||||
|
|
||||||
void QNmDBusHelper::slotAccessPointAdded(QDBusObjectPath path)
|
void QNmDBusHelper::slotAccessPointAdded(QDBusObjectPath path)
|
||||||
{
|
{
|
||||||
if(path.path().length() > 2) {
|
if (path.path().length() > 2)
|
||||||
QDBusMessage msg = this->message();
|
emit pathForAccessPointAdded(path.path());
|
||||||
emit pathForAccessPointAdded(msg.path(), path);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNmDBusHelper::slotAccessPointRemoved(QDBusObjectPath path)
|
void QNmDBusHelper::slotAccessPointRemoved(QDBusObjectPath path)
|
||||||
{
|
{
|
||||||
if(path.path().length() > 2) {
|
if (path.path().length() > 2)
|
||||||
QDBusMessage msg = this->message();
|
emit pathForAccessPointRemoved(path.path());
|
||||||
emit pathForAccessPointRemoved(msg.path(), path);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map)
|
void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map)
|
||||||
@ -90,23 +86,29 @@ void QNmDBusHelper::slotPropertiesChanged(QMap<QString,QVariant> map)
|
|||||||
QMapIterator<QString, QVariant> i(map);
|
QMapIterator<QString, QVariant> i(map);
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
i.next();
|
i.next();
|
||||||
if( i.key() == "State") { //state only applies to device interfaces
|
if (i.key() == QStringLiteral("State")) {
|
||||||
quint32 state = i.value().toUInt();
|
quint32 state = i.value().toUInt();
|
||||||
if( state == NM_DEVICE_STATE_ACTIVATED
|
if (state == NM_DEVICE_STATE_ACTIVATED
|
||||||
|| state == NM_DEVICE_STATE_DISCONNECTED
|
|| state == NM_DEVICE_STATE_DISCONNECTED
|
||||||
|| state == NM_DEVICE_STATE_UNAVAILABLE
|
|| state == NM_DEVICE_STATE_UNAVAILABLE
|
||||||
|| state == NM_DEVICE_STATE_FAILED) {
|
|| state == NM_DEVICE_STATE_FAILED) {
|
||||||
emit pathForPropertiesChanged( msg.path(), map);
|
emit pathForPropertiesChanged(msg.path(), map);
|
||||||
}
|
}
|
||||||
} else if( i.key() == "ActiveAccessPoint") {
|
} else if (i.key() == QStringLiteral("ActiveAccessPoint")) {
|
||||||
emit pathForPropertiesChanged(msg.path(), map);
|
emit pathForPropertiesChanged(msg.path(), map);
|
||||||
// qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().value<QDBusObjectPath>().path();
|
} else if (i.key() == QStringLiteral("ActiveConnections")) {
|
||||||
// } else if( i.key() == "Strength")
|
|
||||||
// qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value().toUInt();
|
|
||||||
// else
|
|
||||||
// qWarning() << __PRETTY_FUNCTION__ << i.key() << ": " << i.value();
|
|
||||||
} else if (i.key() == "ActiveConnections") {
|
|
||||||
emit pathForPropertiesChanged(msg.path(), map);
|
emit pathForPropertiesChanged(msg.path(), map);
|
||||||
|
} else if (i.key() == QStringLiteral("AvailableConnections")) {
|
||||||
|
const QDBusArgument &dbusArgs = i.value().value<QDBusArgument>();
|
||||||
|
QDBusObjectPath path;
|
||||||
|
QStringList paths;
|
||||||
|
dbusArgs.beginArray();
|
||||||
|
while (!dbusArgs.atEnd()) {
|
||||||
|
dbusArgs >> path;
|
||||||
|
paths << path.path();
|
||||||
|
}
|
||||||
|
dbusArgs.endArray();
|
||||||
|
emit pathForConnectionsChanged(paths);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,6 +119,22 @@ void QNmDBusHelper::slotSettingsRemoved()
|
|||||||
emit pathForSettingsRemoved(msg.path());
|
emit pathForSettingsRemoved(msg.path());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QNmDBusHelper::activeConnectionPropertiesChanged(QMap<QString,QVariant> map)
|
||||||
|
{
|
||||||
|
QDBusMessage msg = this->message();
|
||||||
|
QMapIterator<QString, QVariant> i(map);
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
if (i.key() == QStringLiteral("State")) {
|
||||||
|
quint32 state = i.value().toUInt();
|
||||||
|
if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED
|
||||||
|
|| state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
|
||||||
|
emit pathForPropertiesChanged(msg.path(), map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QT_NO_DBUS
|
#endif // QT_NO_DBUS
|
||||||
|
@ -51,17 +51,19 @@ class QNmDBusHelper: public QObject, protected QDBusContext
|
|||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void deviceStateChanged(quint32);
|
void deviceStateChanged(quint32);
|
||||||
void slotAccessPointAdded( QDBusObjectPath );
|
void slotAccessPointAdded(QDBusObjectPath);
|
||||||
void slotAccessPointRemoved( QDBusObjectPath );
|
void slotAccessPointRemoved(QDBusObjectPath);
|
||||||
void slotPropertiesChanged( QMap<QString,QVariant>);
|
void slotPropertiesChanged(QMap<QString,QVariant>);
|
||||||
void slotSettingsRemoved();
|
void slotSettingsRemoved();
|
||||||
|
void activeConnectionPropertiesChanged(QMap<QString,QVariant>);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void pathForStateChanged(const QString &, quint32);
|
void pathForStateChanged(const QString &, quint32);
|
||||||
void pathForAccessPointAdded(const QString &, QDBusObjectPath );
|
void pathForAccessPointAdded(const QString &);
|
||||||
void pathForAccessPointRemoved(const QString &, QDBusObjectPath );
|
void pathForAccessPointRemoved(const QString &);
|
||||||
void pathForPropertiesChanged(const QString &, QMap<QString,QVariant>);
|
void pathForPropertiesChanged(const QString &, QMap<QString,QVariant>);
|
||||||
void pathForSettingsRemoved(const QString &);
|
void pathForSettingsRemoved(const QString &);
|
||||||
|
void pathForConnectionsChanged(const QStringList &pathsList);
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -70,6 +70,7 @@ namespace QCocoaAccessible {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
NSString *macRole(QAccessibleInterface *interface);
|
NSString *macRole(QAccessibleInterface *interface);
|
||||||
|
NSString *macSubrole(QAccessibleInterface *interface);
|
||||||
bool shouldBeIgnored(QAccessibleInterface *interface);
|
bool shouldBeIgnored(QAccessibleInterface *interface);
|
||||||
NSArray *unignoredChildren(QAccessibleInterface *interface);
|
NSArray *unignoredChildren(QAccessibleInterface *interface);
|
||||||
NSString *getTranslatedAction(const QString &qtAction);
|
NSString *getTranslatedAction(const QString &qtAction);
|
||||||
|
@ -162,7 +162,7 @@ static void populateRoleMap()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns a Mac accessibility role for the given interface, or
|
Returns a Cocoa accessibility role for the given interface, or
|
||||||
NSAccessibilityUnknownRole if no role mapping is found.
|
NSAccessibilityUnknownRole if no role mapping is found.
|
||||||
*/
|
*/
|
||||||
NSString *macRole(QAccessibleInterface *interface)
|
NSString *macRole(QAccessibleInterface *interface)
|
||||||
@ -190,13 +190,24 @@ NSString *macRole(QAccessibleInterface *interface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Mac accessibility supports ignoring elements, which means that
|
Returns a Cocoa sub role for the given interface.
|
||||||
|
*/
|
||||||
|
NSString *macSubrole(QAccessibleInterface *interface)
|
||||||
|
{
|
||||||
|
QAccessible::State s = interface->state();
|
||||||
|
if (s.searchEdit)
|
||||||
|
return NSAccessibilitySearchFieldSubrole;
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Cocoa accessibility supports ignoring elements, which means that
|
||||||
the elements are still present in the accessibility tree but is
|
the elements are still present in the accessibility tree but is
|
||||||
not used by the screen reader.
|
not used by the screen reader.
|
||||||
*/
|
*/
|
||||||
bool shouldBeIgnored(QAccessibleInterface *interface)
|
bool shouldBeIgnored(QAccessibleInterface *interface)
|
||||||
{
|
{
|
||||||
// Mac accessibility does not have an attribute that corresponds to the Invisible/Offscreen
|
// Cocoa accessibility does not have an attribute that corresponds to the Invisible/Offscreen
|
||||||
// state. Ignore interfaces with those flags set.
|
// state. Ignore interfaces with those flags set.
|
||||||
const QAccessible::State state = interface->state();
|
const QAccessible::State state = interface->state();
|
||||||
if (state.invisible ||
|
if (state.invisible ||
|
||||||
|
@ -135,6 +135,7 @@
|
|||||||
defaultAttributes = [[NSArray alloc] initWithObjects:
|
defaultAttributes = [[NSArray alloc] initWithObjects:
|
||||||
NSAccessibilityRoleAttribute,
|
NSAccessibilityRoleAttribute,
|
||||||
NSAccessibilityRoleDescriptionAttribute,
|
NSAccessibilityRoleDescriptionAttribute,
|
||||||
|
NSAccessibilitySubroleAttribute,
|
||||||
NSAccessibilityChildrenAttribute,
|
NSAccessibilityChildrenAttribute,
|
||||||
NSAccessibilityFocusedAttribute,
|
NSAccessibilityFocusedAttribute,
|
||||||
NSAccessibilityParentAttribute,
|
NSAccessibilityParentAttribute,
|
||||||
@ -221,6 +222,8 @@
|
|||||||
|
|
||||||
if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
|
if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) {
|
||||||
return role;
|
return role;
|
||||||
|
} else if ([attribute isEqualToString:NSAccessibilitySubroleAttribute]) {
|
||||||
|
return QCocoaAccessible::macSubrole(iface);
|
||||||
} else if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
|
} else if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
|
||||||
return NSAccessibilityRoleDescription(role, nil);
|
return NSAccessibilityRoleDescription(role, nil);
|
||||||
} else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
|
} else if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
|
||||||
|
@ -396,7 +396,7 @@ static void cleanupCocoaApplicationDelegate()
|
|||||||
*/
|
*/
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true /*forcePropagate*/);
|
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true /*forcePropagate*/);
|
||||||
|
|
||||||
return NO;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setReflectionDelegate:(NSObject <NSApplicationDelegate> *)oldDelegate
|
- (void)setReflectionDelegate:(NSObject <NSApplicationDelegate> *)oldDelegate
|
||||||
|
@ -132,7 +132,7 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o)
|
|||||||
|
|
||||||
QMacPasteboard dragBoard((CFStringRef) NSDragPboard, QMacInternalPasteboardMime::MIME_DND);
|
QMacPasteboard dragBoard((CFStringRef) NSDragPboard, QMacInternalPasteboardMime::MIME_DND);
|
||||||
m_drag->mimeData()->setData(QLatin1String("application/x-qt-mime-type-name"), QByteArray("dummy"));
|
m_drag->mimeData()->setData(QLatin1String("application/x-qt-mime-type-name"), QByteArray("dummy"));
|
||||||
dragBoard.setMimeData(m_drag->mimeData());
|
dragBoard.setMimeData(m_drag->mimeData(), QMacPasteboard::LazyRequest);
|
||||||
|
|
||||||
NSPoint event_location = [m_lastEvent locationInWindow];
|
NSPoint event_location = [m_lastEvent locationInWindow];
|
||||||
NSPoint local_point = [m_lastView convertPoint:event_location fromView:nil];
|
NSPoint local_point = [m_lastView convertPoint:event_location fromView:nil];
|
||||||
|
@ -391,6 +391,9 @@ void QCocoaPrintDevice::loadDuplexModes() const
|
|||||||
// If still no result, or not added in PPD, then add None
|
// If still no result, or not added in PPD, then add None
|
||||||
if (m_duplexModes.size() == 0 || !m_duplexModes.contains(QPrint::DuplexNone))
|
if (m_duplexModes.size() == 0 || !m_duplexModes.contains(QPrint::DuplexNone))
|
||||||
m_duplexModes.append(QPrint::DuplexNone);
|
m_duplexModes.append(QPrint::DuplexNone);
|
||||||
|
// If have both modes, then can support DuplexAuto
|
||||||
|
if (m_duplexModes.contains(QPrint::DuplexLongSide) && m_duplexModes.contains(QPrint::DuplexShortSide))
|
||||||
|
m_duplexModes.append(QPrint::DuplexAuto);
|
||||||
m_haveDuplexModes = true;
|
m_haveDuplexModes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +187,14 @@ void QCocoaSystemTrayIcon::cleanup()
|
|||||||
m_sys = 0;
|
m_sys = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool heightCompareFunction (QSize a, QSize b) { return (a.height() < b.height()); }
|
||||||
|
static QList<QSize> sortByHeight(const QList<QSize> sizes)
|
||||||
|
{
|
||||||
|
QList<QSize> sorted = sizes;
|
||||||
|
std::sort(sorted.begin(), sorted.end(), heightCompareFunction);
|
||||||
|
return sorted;
|
||||||
|
}
|
||||||
|
|
||||||
void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
||||||
{
|
{
|
||||||
if (!m_sys)
|
if (!m_sys)
|
||||||
@ -196,16 +204,62 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon)
|
|||||||
|
|
||||||
const bool menuVisible = m_sys->item->menu && m_sys->item->menuVisible;
|
const bool menuVisible = m_sys->item->menu && m_sys->item->menuVisible;
|
||||||
|
|
||||||
CGFloat hgt = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
|
// The reccomended maximum title bar icon height is 18 points
|
||||||
const short scale = hgt - 4;
|
// (device independent pixels). The menu height on past and
|
||||||
|
// current OS X versions is 22 points. Provide some future-proofing
|
||||||
|
// by deriving the icon height from the menu height.
|
||||||
|
const int padding = 4;
|
||||||
|
const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
|
||||||
|
const int maxImageHeight = menuHeight - padding;
|
||||||
|
|
||||||
QPixmap pm = m_sys->item->icon.pixmap(QSize(scale, scale),
|
// Select pixmap based on the device pixel height. Ideally we would use
|
||||||
menuVisible ? QIcon::Selected : QIcon::Normal);
|
// the devicePixelRatio of the target screen, but that value is not
|
||||||
if (pm.isNull()) {
|
// known until draw time. Use qApp->devicePixelRatio, which returns the
|
||||||
pm = QPixmap(scale, scale);
|
// devicePixelRatio for the "best" screen on the system.
|
||||||
pm.fill(Qt::transparent);
|
qreal devicePixelRatio = qApp->devicePixelRatio();
|
||||||
|
const int maxPixmapHeight = maxImageHeight * devicePixelRatio;
|
||||||
|
const QIcon::Mode mode = menuVisible ? QIcon::Selected : QIcon::Normal;
|
||||||
|
QSize selectedSize;
|
||||||
|
Q_FOREACH (const QSize& size, sortByHeight(icon.availableSizes(mode))) {
|
||||||
|
// Select a pixmap based on the height. We want the largest pixmap
|
||||||
|
// with a height smaller or equal to maxPixmapHeight. The pixmap
|
||||||
|
// may rectangular; assume it has a reasonable size. If there is
|
||||||
|
// not suitable pixmap use the smallest one the icon can provide.
|
||||||
|
if (size.height() <= maxPixmapHeight) {
|
||||||
|
selectedSize = size;
|
||||||
|
} else {
|
||||||
|
if (!selectedSize.isValid())
|
||||||
|
selectedSize = size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
NSImage *nsimage = static_cast<NSImage *>(qt_mac_create_nsimage(pm));
|
|
||||||
|
QPixmap pixmap = icon.pixmap(selectedSize, mode);
|
||||||
|
|
||||||
|
// Draw a low-resolution icon if there is not enough pixels for a retina
|
||||||
|
// icon. This prevents showing a small icon on retina displays.
|
||||||
|
if (devicePixelRatio > 1.0 && selectedSize.height() < maxPixmapHeight / 2)
|
||||||
|
devicePixelRatio = 1.0;
|
||||||
|
|
||||||
|
// Scale large pixmaps to fit the available menu bar area.
|
||||||
|
if (pixmap.height() > maxPixmapHeight)
|
||||||
|
pixmap = pixmap.scaledToHeight(maxPixmapHeight, Qt::SmoothTransformation);
|
||||||
|
|
||||||
|
// The icon will be stretched over the full height of the menu bar
|
||||||
|
// therefore we create a second pixmap which has the full height
|
||||||
|
QSize fullHeightSize(!pixmap.isNull() ? pixmap.width():
|
||||||
|
menuHeight * devicePixelRatio,
|
||||||
|
menuHeight * devicePixelRatio);
|
||||||
|
QPixmap fullHeightPixmap(fullHeightSize);
|
||||||
|
fullHeightPixmap.fill(Qt::transparent);
|
||||||
|
if (!pixmap.isNull()) {
|
||||||
|
QPainter p(&fullHeightPixmap);
|
||||||
|
QRect r = pixmap.rect();
|
||||||
|
r.moveCenter(fullHeightPixmap.rect().center());
|
||||||
|
p.drawPixmap(r, pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
NSImage *nsimage = static_cast<NSImage *>(qt_mac_create_nsimage(fullHeightPixmap));
|
||||||
[(NSImageView*)[[m_sys->item item] view] setImage: nsimage];
|
[(NSImageView*)[[m_sys->item item] view] setImage: nsimage];
|
||||||
[nsimage release];
|
[nsimage release];
|
||||||
}
|
}
|
||||||
@ -327,18 +381,7 @@ QT_END_NAMESPACE
|
|||||||
Q_UNUSED(notification);
|
Q_UNUSED(notification);
|
||||||
down = NO;
|
down = NO;
|
||||||
|
|
||||||
CGFloat hgt = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
|
parent->systray->updateIcon(parent->icon);
|
||||||
const short scale = hgt - 4;
|
|
||||||
|
|
||||||
QPixmap pm = parent->icon.pixmap(QSize(scale, scale), QIcon::Normal);
|
|
||||||
if (pm.isNull()) {
|
|
||||||
pm = QPixmap(scale, scale);
|
|
||||||
pm.fill(Qt::transparent);
|
|
||||||
}
|
|
||||||
NSImage *nsaltimage = static_cast<NSImage *>(qt_mac_create_nsimage(pm));
|
|
||||||
[self setImage: nsaltimage];
|
|
||||||
[nsaltimage release];
|
|
||||||
|
|
||||||
parent->menuVisible = false;
|
parent->menuVisible = false;
|
||||||
|
|
||||||
[self setNeedsDisplay:YES];
|
[self setNeedsDisplay:YES];
|
||||||
@ -350,18 +393,7 @@ QT_END_NAMESPACE
|
|||||||
int clickCount = [mouseEvent clickCount];
|
int clickCount = [mouseEvent clickCount];
|
||||||
[self setNeedsDisplay:YES];
|
[self setNeedsDisplay:YES];
|
||||||
|
|
||||||
CGFloat hgt = [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
|
parent->systray->updateIcon(parent->icon);
|
||||||
const short scale = hgt - 4;
|
|
||||||
|
|
||||||
QPixmap pm = parent->icon.pixmap(QSize(scale, scale),
|
|
||||||
parent->menuVisible ? QIcon::Selected : QIcon::Normal);
|
|
||||||
if (pm.isNull()) {
|
|
||||||
pm = QPixmap(scale, scale);
|
|
||||||
pm.fill(Qt::transparent);
|
|
||||||
}
|
|
||||||
NSImage *nsaltimage = static_cast<NSImage *>(qt_mac_create_nsimage(pm));
|
|
||||||
[self setImage: nsaltimage];
|
|
||||||
[nsaltimage release];
|
|
||||||
|
|
||||||
if (clickCount == 2) {
|
if (clickCount == 2) {
|
||||||
[self menuTrackingDone:nil];
|
[self menuTrackingDone:nil];
|
||||||
|
@ -699,7 +699,7 @@ void QCocoaWindow::setVisible(bool visible)
|
|||||||
exposeWindow();
|
exposeWindow();
|
||||||
|
|
||||||
if (m_nsWindow) {
|
if (m_nsWindow) {
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
|
|
||||||
// setWindowState might have been called while the window was hidden and
|
// setWindowState might have been called while the window was hidden and
|
||||||
// will not change the NSWindow state in that case. Sync up here:
|
// will not change the NSWindow state in that case. Sync up here:
|
||||||
@ -1009,9 +1009,12 @@ void QCocoaWindow::raise()
|
|||||||
[parentNSWindow addChildWindow:m_nsWindow ordered:NSWindowAbove];
|
[parentNSWindow addChildWindow:m_nsWindow ordered:NSWindowAbove];
|
||||||
} else {
|
} else {
|
||||||
[m_nsWindow orderFront: m_nsWindow];
|
[m_nsWindow orderFront: m_nsWindow];
|
||||||
ProcessSerialNumber psn;
|
static bool raiseProcess = qt_mac_resolveOption(true, "QT_MAC_SET_RAISE_PROCESS");
|
||||||
GetCurrentProcess(&psn);
|
if (raiseProcess) {
|
||||||
SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);
|
ProcessSerialNumber psn;
|
||||||
|
GetCurrentProcess(&psn);
|
||||||
|
SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,15 +43,25 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class QMacMimeData;
|
||||||
class QMacPasteboard
|
class QMacPasteboard
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
enum DataRequestType { EagerRequest, LazyRequest };
|
||||||
|
private:
|
||||||
struct Promise {
|
struct Promise {
|
||||||
Promise() : itemId(0), convertor(0) { }
|
Promise() : itemId(0), convertor(0) { }
|
||||||
Promise(int itemId, QMacInternalPasteboardMime *c, QString m, QVariant d, int o=0) : itemId(itemId), offset(o), convertor(c), mime(m), data(d) { }
|
|
||||||
|
static Promise eagerPromise(int itemId, QMacInternalPasteboardMime *c, QString m, QMacMimeData *d, int o = 0);
|
||||||
|
static Promise lazyPromise(int itemId, QMacInternalPasteboardMime *c, QString m, QMacMimeData *d, int o = 0);
|
||||||
|
Promise(int itemId, QMacInternalPasteboardMime *c, QString m, QMacMimeData *md, int o, DataRequestType drt);
|
||||||
|
|
||||||
int itemId, offset;
|
int itemId, offset;
|
||||||
QMacInternalPasteboardMime *convertor;
|
QMacInternalPasteboardMime *convertor;
|
||||||
QString mime;
|
QString mime;
|
||||||
QVariant data;
|
QPointer<QMacMimeData> mimeData;
|
||||||
|
QVariant variantData;
|
||||||
|
DataRequestType dataRequestType;
|
||||||
};
|
};
|
||||||
QList<Promise> promises;
|
QList<Promise> promises;
|
||||||
|
|
||||||
@ -72,7 +82,8 @@ public:
|
|||||||
|
|
||||||
PasteboardRef pasteBoard() const;
|
PasteboardRef pasteBoard() const;
|
||||||
QMimeData *mimeData() const;
|
QMimeData *mimeData() const;
|
||||||
void setMimeData(QMimeData *mime);
|
|
||||||
|
void setMimeData(QMimeData *mime, DataRequestType dataRequestType = EagerRequest);
|
||||||
|
|
||||||
QStringList formats() const;
|
QStringList formats() const;
|
||||||
bool hasFormat(const QString &format) const;
|
bool hasFormat(const QString &format) const;
|
||||||
|
@ -64,6 +64,26 @@ QT_BEGIN_NAMESPACE
|
|||||||
QMacPasteboard code
|
QMacPasteboard code
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
class QMacMimeData : public QMimeData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QVariant variantData(const QString &mime) { return retrieveData(mime, QVariant::Invalid); }
|
||||||
|
private:
|
||||||
|
QMacMimeData();
|
||||||
|
};
|
||||||
|
|
||||||
|
QMacPasteboard::Promise::Promise(int itemId, QMacInternalPasteboardMime *c, QString m, QMacMimeData *md, int o, DataRequestType drt)
|
||||||
|
: itemId(itemId), offset(o), convertor(c), mime(m), dataRequestType(drt)
|
||||||
|
{
|
||||||
|
// Request the data from the application immediately for eager requests.
|
||||||
|
if (dataRequestType == QMacPasteboard::EagerRequest) {
|
||||||
|
variantData = md->variantData(m);
|
||||||
|
mimeData = 0;
|
||||||
|
} else {
|
||||||
|
mimeData = md;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QMacPasteboard::QMacPasteboard(PasteboardRef p, uchar mt)
|
QMacPasteboard::QMacPasteboard(PasteboardRef p, uchar mt)
|
||||||
{
|
{
|
||||||
mac_mime_source = false;
|
mac_mime_source = false;
|
||||||
@ -103,6 +123,11 @@ QMacPasteboard::~QMacPasteboard()
|
|||||||
// commit all promises for paste after exit close
|
// commit all promises for paste after exit close
|
||||||
for (int i = 0; i < promises.count(); ++i) {
|
for (int i = 0; i < promises.count(); ++i) {
|
||||||
const Promise &promise = promises.at(i);
|
const Promise &promise = promises.at(i);
|
||||||
|
// At this point app teardown has started and control is somewhere in the Q[Core]Application
|
||||||
|
// destructor. Skip "lazy" promises where the application has not provided data;
|
||||||
|
// the application will generally not be in a state to provide it.
|
||||||
|
if (promise.dataRequestType == LazyRequest)
|
||||||
|
continue;
|
||||||
QCFString flavor = QCFString(promise.convertor->flavorFor(promise.mime));
|
QCFString flavor = QCFString(promise.convertor->flavorFor(promise.mime));
|
||||||
NSInteger pbItemId = promise.itemId;
|
NSInteger pbItemId = promise.itemId;
|
||||||
promiseKeeper(paste, reinterpret_cast<PasteboardItemID>(pbItemId), flavor, this);
|
promiseKeeper(paste, reinterpret_cast<PasteboardItemID>(pbItemId), flavor, this);
|
||||||
@ -155,7 +180,17 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id,
|
|||||||
qPrintable(flavorAsQString), qPrintable(promise.convertor->convertorName()), promise.offset);
|
qPrintable(flavorAsQString), qPrintable(promise.convertor->convertorName()), promise.offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QList<QByteArray> md = promise.convertor->convertFromMime(promise.mime, promise.data, flavorAsQString);
|
// Get the promise data. If this is a "lazy" promise call variantData()
|
||||||
|
// to request the data from the application.
|
||||||
|
QVariant promiseData;
|
||||||
|
if (promise.dataRequestType == LazyRequest) {
|
||||||
|
if (!promise.mimeData.isNull())
|
||||||
|
promiseData = promise.mimeData->variantData(promise.mime);
|
||||||
|
} else {
|
||||||
|
promiseData = promise.variantData;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QByteArray> md = promise.convertor->convertFromMime(promise.mime, promiseData, flavorAsQString);
|
||||||
if (md.size() <= promise.offset)
|
if (md.size() <= promise.offset)
|
||||||
return cantGetFlavorErr;
|
return cantGetFlavorErr;
|
||||||
const QByteArray &ba = md[promise.offset];
|
const QByteArray &ba = md[promise.offset];
|
||||||
@ -266,16 +301,8 @@ QMimeData
|
|||||||
return mime;
|
return mime;
|
||||||
}
|
}
|
||||||
|
|
||||||
class QMacMimeData : public QMimeData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QVariant variantData(const QString &mime) { return retrieveData(mime, QVariant::Invalid); }
|
|
||||||
private:
|
|
||||||
QMacMimeData();
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
void
|
||||||
QMacPasteboard::setMimeData(QMimeData *mime_src)
|
QMacPasteboard::setMimeData(QMimeData *mime_src, DataRequestType dataRequestType)
|
||||||
{
|
{
|
||||||
if (!paste)
|
if (!paste)
|
||||||
return;
|
return;
|
||||||
@ -312,12 +339,17 @@ QMacPasteboard::setMimeData(QMimeData *mime_src)
|
|||||||
continue;
|
continue;
|
||||||
QString flavor(c->flavorFor(mimeType));
|
QString flavor(c->flavorFor(mimeType));
|
||||||
if (!flavor.isEmpty()) {
|
if (!flavor.isEmpty()) {
|
||||||
QVariant mimeData = static_cast<QMacMimeData*>(mime_src)->variantData(mimeType);
|
QMacMimeData *mimeData = static_cast<QMacMimeData*>(mime_src);
|
||||||
|
|
||||||
int numItems = c->count(mime_src);
|
int numItems = c->count(mime_src);
|
||||||
for (int item = 0; item < numItems; ++item) {
|
for (int item = 0; item < numItems; ++item) {
|
||||||
const NSInteger itemID = item+1; //id starts at 1
|
const NSInteger itemID = item+1; //id starts at 1
|
||||||
promises.append(QMacPasteboard::Promise(itemID, c, mimeType, mimeData, item));
|
//QMacPasteboard::Promise promise = (dataRequestType == QMacPasteboard::EagerRequest) ?
|
||||||
|
// QMacPasteboard::Promise::eagerPromise(itemID, c, mimeType, mimeData, item) :
|
||||||
|
// QMacPasteboard::Promise::lazyPromise(itemID, c, mimeType, mimeData, item);
|
||||||
|
|
||||||
|
QMacPasteboard::Promise promise(itemID, c, mimeType, mimeData, item, dataRequestType);
|
||||||
|
promises.append(promise);
|
||||||
PasteboardPutItemFlavor(paste, reinterpret_cast<PasteboardItemID>(itemID), QCFString(flavor), 0, kPasteboardFlavorNoFlags);
|
PasteboardPutItemFlavor(paste, reinterpret_cast<PasteboardItemID>(itemID), QCFString(flavor), 0, kPasteboardFlavorNoFlags);
|
||||||
#ifdef DEBUG_PASTEBOARD
|
#ifdef DEBUG_PASTEBOARD
|
||||||
qDebug(" - adding %d %s [%s] <%s> [%d]",
|
qDebug(" - adding %d %s [%s] <%s> [%d]",
|
||||||
|
@ -361,8 +361,12 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
|
|||||||
// Send a geometry change event to Qt, if it's ready to handle events
|
// Send a geometry change event to Qt, if it's ready to handle events
|
||||||
if (!m_platformWindow->m_inConstructor) {
|
if (!m_platformWindow->m_inConstructor) {
|
||||||
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
|
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
|
||||||
m_platformWindow->updateExposedGeometry();
|
// Do not send incorrect exposes in case the window is not even visible yet.
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
// We might get here as a result of a resize() from QWidget's show(), for instance.
|
||||||
|
if (m_platformWindow->window()->isVisible()) {
|
||||||
|
m_platformWindow->updateExposedGeometry();
|
||||||
|
QWindowSystemInterface::flushWindowSystemEvents();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,10 +424,12 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
|
|||||||
#pragma clang diagnostic ignored "-Wobjc-method-access"
|
#pragma clang diagnostic ignored "-Wobjc-method-access"
|
||||||
enum { NSWindowOcclusionStateVisible = 1UL << 1 };
|
enum { NSWindowOcclusionStateVisible = 1UL << 1 };
|
||||||
#endif
|
#endif
|
||||||
|
// Older versions managed in -[QNSView viewDidMoveToWindow].
|
||||||
|
// Support QWidgetAction in NSMenu. Mavericks only sends this notification.
|
||||||
|
// Ideally we should support this in Qt as well, in order to disable animations
|
||||||
|
// when the window is occluded.
|
||||||
if ((NSUInteger)[self.window occlusionState] & NSWindowOcclusionStateVisible)
|
if ((NSUInteger)[self.window occlusionState] & NSWindowOcclusionStateVisible)
|
||||||
m_platformWindow->exposeWindow();
|
m_platformWindow->exposeWindow();
|
||||||
else
|
|
||||||
m_platformWindow->obscureWindow();
|
|
||||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
|
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
@ -686,7 +692,23 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
|
|||||||
m_platformWindow->m_forwardWindow = 0;
|
m_platformWindow->m_forwardWindow = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[targetView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&qtWindowPoint andScreenPoint:&qtScreenPoint];
|
NSPoint globalPos = [NSEvent mouseLocation];
|
||||||
|
|
||||||
|
if ([self.window parentWindow]
|
||||||
|
&& (theEvent.type == NSLeftMouseDragged || theEvent.type == NSLeftMouseUp)) {
|
||||||
|
// QToolBar can be implemented as a child window on top of its main window
|
||||||
|
// (with a borderless NSWindow). If an option "unified toolbar" set on the main window,
|
||||||
|
// it's possible to drag such a window using this toolbar.
|
||||||
|
// While handling mouse drag events, QToolBar moves the window (QWidget::move).
|
||||||
|
// In such a combination [NSEvent mouseLocation] is very different from the
|
||||||
|
// real event location and as a result a window will move chaotically.
|
||||||
|
NSPoint winPoint = [theEvent locationInWindow];
|
||||||
|
NSRect tmpRect = NSMakeRect(winPoint.x, winPoint.y, 1., 1.);
|
||||||
|
tmpRect = [[theEvent window] convertRectToScreen:tmpRect];
|
||||||
|
globalPos = tmpRect.origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
[targetView convertFromScreen:globalPos toWindowPoint:&qtWindowPoint andScreenPoint:&qtScreenPoint];
|
||||||
ulong timestamp = [theEvent timestamp] * 1000;
|
ulong timestamp = [theEvent timestamp] * 1000;
|
||||||
|
|
||||||
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
||||||
@ -699,6 +721,10 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
|
|||||||
- (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent
|
- (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
// get m_buttons in sync
|
// get m_buttons in sync
|
||||||
|
// Don't send frme strut events if we are in the middle of a mouse drag.
|
||||||
|
if (m_buttons != Qt::NoButton)
|
||||||
|
return;
|
||||||
|
|
||||||
NSEventType ty = [theEvent type];
|
NSEventType ty = [theEvent type];
|
||||||
switch (ty) {
|
switch (ty) {
|
||||||
case NSLeftMouseDown:
|
case NSLeftMouseDown:
|
||||||
@ -710,6 +736,12 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil;
|
|||||||
case NSRightMouseDown:
|
case NSRightMouseDown:
|
||||||
m_frameStrutButtons |= Qt::RightButton;
|
m_frameStrutButtons |= Qt::RightButton;
|
||||||
break;
|
break;
|
||||||
|
case NSLeftMouseDragged:
|
||||||
|
m_frameStrutButtons |= Qt::LeftButton;
|
||||||
|
break;
|
||||||
|
case NSRightMouseDragged:
|
||||||
|
m_frameStrutButtons |= Qt::RightButton;
|
||||||
|
break;
|
||||||
case NSRightMouseUp:
|
case NSRightMouseUp:
|
||||||
m_frameStrutButtons &= ~Qt::RightButton;
|
m_frameStrutButtons &= ~Qt::RightButton;
|
||||||
break;
|
break;
|
||||||
@ -1337,10 +1369,6 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers, ph);
|
QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers, ph);
|
||||||
|
|
||||||
if (momentumPhase == NSEventPhaseEnded || momentumPhase == NSEventPhaseCancelled || momentumPhase == NSEventPhaseNone) {
|
|
||||||
currentWheelModifiers = Qt::NoModifier;
|
|
||||||
}
|
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -1806,6 +1834,19 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)wantsPeriodicDraggingUpdates
|
||||||
|
{
|
||||||
|
// From the documentation:
|
||||||
|
//
|
||||||
|
// "If the destination returns NO, these messages are sent only when the mouse moves
|
||||||
|
// or a modifier flag changes. Otherwise the destination gets the default behavior,
|
||||||
|
// where it receives periodic dragging-updated messages even if nothing changes."
|
||||||
|
//
|
||||||
|
// We do not want these constant drag update events while mouse is stationary,
|
||||||
|
// since we do all animations (autoscroll) with timers.
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
|
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
|
||||||
{
|
{
|
||||||
return [self handleDrag : sender];
|
return [self handleDrag : sender];
|
||||||
|
@ -457,9 +457,6 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
|
|||||||
break;
|
break;
|
||||||
case PPK_CustomBase:
|
case PPK_CustomBase:
|
||||||
break;
|
break;
|
||||||
case PPK_Duplex:
|
|
||||||
// TODO Add support using PMSetDuplex / PMGetDuplex
|
|
||||||
break;
|
|
||||||
case PPK_FontEmbedding:
|
case PPK_FontEmbedding:
|
||||||
break;
|
break;
|
||||||
case PPK_PageOrder:
|
case PPK_PageOrder:
|
||||||
@ -503,6 +500,29 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
|
|||||||
case PPK_DocumentName:
|
case PPK_DocumentName:
|
||||||
PMPrintSettingsSetJobName(d->settings(), QCFString(value.toString()));
|
PMPrintSettingsSetJobName(d->settings(), QCFString(value.toString()));
|
||||||
break;
|
break;
|
||||||
|
case PPK_Duplex: {
|
||||||
|
QPrint::DuplexMode mode = QPrint::DuplexMode(value.toInt());
|
||||||
|
if (mode == property(PPK_Duplex).toInt() || !d->m_printDevice->supportedDuplexModes().contains(mode))
|
||||||
|
break;
|
||||||
|
switch (mode) {
|
||||||
|
case QPrinter::DuplexNone:
|
||||||
|
PMSetDuplex(d->settings(), kPMDuplexNone);
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexAuto:
|
||||||
|
PMSetDuplex(d->settings(), d->m_pageLayout.orientation() == QPageLayout::Landscape ? kPMDuplexTumble : kPMDuplexNoTumble);
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexLongSide:
|
||||||
|
PMSetDuplex(d->settings(), kPMDuplexNoTumble);
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexShortSide:
|
||||||
|
PMSetDuplex(d->settings(), kPMDuplexTumble);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Don't change
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PPK_FullPage:
|
case PPK_FullPage:
|
||||||
if (value.toBool())
|
if (value.toBool())
|
||||||
d->m_pageLayout.setMode(QPageLayout::FullPageMode);
|
d->m_pageLayout.setMode(QPageLayout::FullPageMode);
|
||||||
@ -602,10 +622,6 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
|
|||||||
case PPK_CustomBase:
|
case PPK_CustomBase:
|
||||||
// Special case, leave null
|
// Special case, leave null
|
||||||
break;
|
break;
|
||||||
case PPK_Duplex:
|
|
||||||
// TODO Add support using PMSetDuplex / PMGetDuplex
|
|
||||||
ret = QPrinter::DuplexNone;
|
|
||||||
break;
|
|
||||||
case PPK_FontEmbedding:
|
case PPK_FontEmbedding:
|
||||||
ret = false;
|
ret = false;
|
||||||
break;
|
break;
|
||||||
@ -647,6 +663,23 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
|
|||||||
ret = QCFString::toQString(name);
|
ret = QCFString::toQString(name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PPK_Duplex: {
|
||||||
|
PMDuplexMode mode = kPMDuplexNone;
|
||||||
|
PMGetDuplex(d->settings(), &mode);
|
||||||
|
switch (mode) {
|
||||||
|
case kPMDuplexNoTumble:
|
||||||
|
ret = QPrinter::DuplexLongSide;
|
||||||
|
break;
|
||||||
|
case kPMDuplexTumble:
|
||||||
|
ret = QPrinter::DuplexShortSide;
|
||||||
|
break;
|
||||||
|
case kPMDuplexNone:
|
||||||
|
default:
|
||||||
|
ret = QPrinter::DuplexNone;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PPK_FullPage:
|
case PPK_FullPage:
|
||||||
ret = d->m_pageLayout.mode() == QPageLayout::FullPageMode;
|
ret = d->m_pageLayout.mode() == QPageLayout::FullPageMode;
|
||||||
break;
|
break;
|
||||||
|
@ -259,10 +259,16 @@ static void __attribute__((noinline, noreturn)) user_main_trampoline()
|
|||||||
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
|
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
|
||||||
int argc = arguments.count;
|
int argc = arguments.count;
|
||||||
char **argv = new char*[argc];
|
char **argv = new char*[argc];
|
||||||
|
|
||||||
for (int i = 0; i < argc; ++i) {
|
for (int i = 0; i < argc; ++i) {
|
||||||
NSString *arg = [arguments objectAtIndex:i];
|
NSString *arg = [arguments objectAtIndex:i];
|
||||||
argv[i] = reinterpret_cast<char *>(malloc([arg lengthOfBytesUsingEncoding:[NSString defaultCStringEncoding]]));
|
|
||||||
strcpy(argv[i], [arg cStringUsingEncoding:[NSString defaultCStringEncoding]]);
|
NSStringEncoding cStringEncoding = [NSString defaultCStringEncoding];
|
||||||
|
unsigned int bufferSize = [arg lengthOfBytesUsingEncoding:cStringEncoding] + 1;
|
||||||
|
argv[i] = reinterpret_cast<char *>(malloc(bufferSize));
|
||||||
|
|
||||||
|
if (![arg getCString:argv[i] maxLength:bufferSize encoding:cStringEncoding])
|
||||||
|
qFatal("Could not convert argv[%d] to C string", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
int exitCode = qtmn(argc, argv);
|
int exitCode = qtmn(argc, argv);
|
||||||
|
@ -152,6 +152,9 @@
|
|||||||
if (state.disabled)
|
if (state.disabled)
|
||||||
traits |= UIAccessibilityTraitNotEnabled;
|
traits |= UIAccessibilityTraitNotEnabled;
|
||||||
|
|
||||||
|
if (state.searchEdit)
|
||||||
|
traits |= UIAccessibilityTraitSearchField;
|
||||||
|
|
||||||
if (iface->role() == QAccessible::Button)
|
if (iface->role() == QAccessible::Button)
|
||||||
traits |= UIAccessibilityTraitButton;
|
traits |= UIAccessibilityTraitButton;
|
||||||
|
|
||||||
|
@ -48,6 +48,13 @@
|
|||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
#include <QtCore/QScopedArrayPointer>
|
#include <QtCore/QScopedArrayPointer>
|
||||||
|
|
||||||
|
static void initResources()
|
||||||
|
{
|
||||||
|
#if !defined (Q_OS_WINCE) && !defined (QT_NO_IMAGEFORMAT_PNG)
|
||||||
|
Q_INIT_RESOURCE(cursors);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0);
|
Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0);
|
||||||
@ -568,6 +575,11 @@ QWindowsWindowCursor QWindowsCursor::pixmapWindowCursor(const QCursor &c)
|
|||||||
return it.value();
|
return it.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QWindowsCursor::QWindowsCursor()
|
||||||
|
{
|
||||||
|
initResources();
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Set a cursor on a window.
|
\brief Set a cursor on a window.
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ public:
|
|||||||
CursorSuppressed // Cursor suppressed by touch interaction (Windows 8).
|
CursorSuppressed // Cursor suppressed by touch interaction (Windows 8).
|
||||||
};
|
};
|
||||||
|
|
||||||
QWindowsCursor() {}
|
QWindowsCursor();
|
||||||
|
|
||||||
void changeCursor(QCursor * widgetCursor, QWindow * widget) Q_DECL_OVERRIDE;
|
void changeCursor(QCursor * widgetCursor, QWindow * widget) Q_DECL_OVERRIDE;
|
||||||
QPoint pos() const Q_DECL_OVERRIDE;
|
QPoint pos() const Q_DECL_OVERRIDE;
|
||||||
|
@ -1149,6 +1149,13 @@ void QWindowsWindow::updateTransientParent() const
|
|||||||
#endif // !Q_OS_WINCE
|
#endif // !Q_OS_WINCE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool testShowWithoutActivating(const QWindow *window)
|
||||||
|
{
|
||||||
|
// QWidget-attribute Qt::WA_ShowWithoutActivating .
|
||||||
|
const QVariant showWithoutActivating = window->property("_q_showWithoutActivating");
|
||||||
|
return showWithoutActivating.isValid() && showWithoutActivating.toBool();
|
||||||
|
}
|
||||||
|
|
||||||
// partially from QWidgetPrivate::show_sys()
|
// partially from QWidgetPrivate::show_sys()
|
||||||
void QWindowsWindow::show_sys() const
|
void QWindowsWindow::show_sys() const
|
||||||
{
|
{
|
||||||
@ -1180,7 +1187,7 @@ void QWindowsWindow::show_sys() const
|
|||||||
} // Qt::WindowMaximized
|
} // Qt::WindowMaximized
|
||||||
} // !Qt::WindowMinimized
|
} // !Qt::WindowMinimized
|
||||||
}
|
}
|
||||||
if (type == Qt::Popup || type == Qt::ToolTip || type == Qt::Tool)
|
if (type == Qt::Popup || type == Qt::ToolTip || type == Qt::Tool || testShowWithoutActivating(w))
|
||||||
sm = SW_SHOWNOACTIVATE;
|
sm = SW_SHOWNOACTIVATE;
|
||||||
|
|
||||||
if (w->windowState() & Qt::WindowMaximized)
|
if (w->windowState() & Qt::WindowMaximized)
|
||||||
|
@ -910,6 +910,18 @@ QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const
|
|||||||
if (qtKey == baseQtKey || qtKey == 0)
|
if (qtKey == baseQtKey || qtKey == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// catch only more specific shortcuts, i.e. Ctrl+Shift+= also generates Ctrl++ and +,
|
||||||
|
// but Ctrl++ is more specific than +, so we should skip the last one
|
||||||
|
bool ambiguous = false;
|
||||||
|
foreach (int shortcut, result) {
|
||||||
|
if (int(shortcut & ~Qt::KeyboardModifierMask) == qtKey && (shortcut & mods) == mods) {
|
||||||
|
ambiguous = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ambiguous)
|
||||||
|
continue;
|
||||||
|
|
||||||
result += (qtKey + mods);
|
result += (qtKey + mods);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,12 @@ void QCupsPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &v
|
|||||||
// Get the named page size from the printer if supported
|
// Get the named page size from the printer if supported
|
||||||
d->setPageSize(d->m_printDevice.supportedPageSize(value.toString()));
|
d->setPageSize(d->m_printDevice.supportedPageSize(value.toString()));
|
||||||
break;
|
break;
|
||||||
|
case PPK_Duplex: {
|
||||||
|
QPrint::DuplexMode mode = QPrint::DuplexMode(value.toInt());
|
||||||
|
if (mode != d->duplex && d->m_printDevice.supportedDuplexModes().contains(mode))
|
||||||
|
d->duplex = mode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PPK_PrinterName:
|
case PPK_PrinterName:
|
||||||
d->changePrinter(value.toString());
|
d->changePrinter(value.toString());
|
||||||
break;
|
break;
|
||||||
|
@ -387,6 +387,9 @@ void QPpdPrintDevice::loadDuplexModes() const
|
|||||||
// If still no result, or not added in PPD, then add None
|
// If still no result, or not added in PPD, then add None
|
||||||
if (m_duplexModes.size() == 0 || !m_duplexModes.contains(QPrint::DuplexNone))
|
if (m_duplexModes.size() == 0 || !m_duplexModes.contains(QPrint::DuplexNone))
|
||||||
m_duplexModes.append(QPrint::DuplexNone);
|
m_duplexModes.append(QPrint::DuplexNone);
|
||||||
|
// If have both modes, then can support DuplexAuto
|
||||||
|
if (m_duplexModes.contains(QPrint::DuplexLongSide) && m_duplexModes.contains(QPrint::DuplexShortSide))
|
||||||
|
m_duplexModes.append(QPrint::DuplexAuto);
|
||||||
m_haveDuplexModes = true;
|
m_haveDuplexModes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ QMarginsF QWindowsPrintDevice::printableMargins(const QPageSize &pageSize,
|
|||||||
const qreal rightMargin = physicalWidth - leftMargin - printableWidth;
|
const qreal rightMargin = physicalWidth - leftMargin - printableWidth;
|
||||||
const qreal bottomMargin = physicalHeight - topMargin - printableHeight;
|
const qreal bottomMargin = physicalHeight - topMargin - printableHeight;
|
||||||
margins = QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin);
|
margins = QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin);
|
||||||
ReleaseDC(NULL, pDC);
|
DeleteDC(pDC);
|
||||||
}
|
}
|
||||||
return margins;
|
return margins;
|
||||||
}
|
}
|
||||||
@ -280,11 +280,11 @@ void QWindowsPrintDevice::loadResolutions() const
|
|||||||
{
|
{
|
||||||
DWORD resCount = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, NULL, NULL);
|
DWORD resCount = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, NULL, NULL);
|
||||||
if (int(resCount) > 0) {
|
if (int(resCount) > 0) {
|
||||||
QScopedArrayPointer<LONG> resolutions(new LONG[resCount*sizeof(LONG)]);
|
QScopedArrayPointer<LONG> resolutions(new LONG[resCount*2]);
|
||||||
// Get the details and match the default paper size
|
// Get the details and match the default paper size
|
||||||
if (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, (LPWSTR)resolutions.data(), NULL) == resCount) {
|
if (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, (LPWSTR)resolutions.data(), NULL) == resCount) {
|
||||||
for (int i = 0; i < int(resCount); ++i)
|
for (int i = 0; i < int(resCount * 2); i += 2)
|
||||||
m_resolutions.append(resolutions[i]);
|
m_resolutions.append(resolutions[i+1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_haveResolutions = true;
|
m_haveResolutions = true;
|
||||||
@ -378,6 +378,7 @@ void QWindowsPrintDevice::loadDuplexModes() const
|
|||||||
DWORD duplex = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_DUPLEX, NULL, NULL);
|
DWORD duplex = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_DUPLEX, NULL, NULL);
|
||||||
if (int(duplex) == 1) {
|
if (int(duplex) == 1) {
|
||||||
// TODO Assume if duplex flag supports both modes
|
// TODO Assume if duplex flag supports both modes
|
||||||
|
m_duplexModes.append(QPrint::DuplexAuto);
|
||||||
m_duplexModes.append(QPrint::DuplexLongSide);
|
m_duplexModes.append(QPrint::DuplexLongSide);
|
||||||
m_duplexModes.append(QPrint::DuplexShortSide);
|
m_duplexModes.append(QPrint::DuplexShortSide);
|
||||||
}
|
}
|
||||||
|
@ -734,10 +734,7 @@ void QWin32PrintEnginePrivate::strokePath_dev(const QPainterPath &path, const QC
|
|||||||
else if (pen.joinStyle() == Qt::RoundJoin)
|
else if (pen.joinStyle() == Qt::RoundJoin)
|
||||||
joinStyle = PS_JOIN_ROUND;
|
joinStyle = PS_JOIN_ROUND;
|
||||||
|
|
||||||
bool cosmetic = qt_pen_is_cosmetic(pen, q->state->renderHints());
|
HPEN pen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID | capStyle | joinStyle,
|
||||||
|
|
||||||
HPEN pen = ExtCreatePen((cosmetic ? PS_COSMETIC : PS_GEOMETRIC)
|
|
||||||
| PS_SOLID | capStyle | joinStyle,
|
|
||||||
(penWidth == 0) ? 1 : penWidth, &brush, 0, 0);
|
(penWidth == 0) ? 1 : penWidth, &brush, 0, 0);
|
||||||
|
|
||||||
HGDIOBJ old_pen = SelectObject(hdc, pen);
|
HGDIOBJ old_pen = SelectObject(hdc, pen);
|
||||||
@ -1006,9 +1003,6 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
|
|||||||
// The following keys are settings that are unsupported by the Windows PrintEngine
|
// The following keys are settings that are unsupported by the Windows PrintEngine
|
||||||
case PPK_CustomBase:
|
case PPK_CustomBase:
|
||||||
break;
|
break;
|
||||||
case PPK_Duplex:
|
|
||||||
// TODO Add support using DEVMODE.dmDuplex
|
|
||||||
break;
|
|
||||||
case PPK_FontEmbedding:
|
case PPK_FontEmbedding:
|
||||||
break;
|
break;
|
||||||
case PPK_PageOrder:
|
case PPK_PageOrder:
|
||||||
@ -1049,6 +1043,33 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
|
|||||||
d->docName = value.toString();
|
d->docName = value.toString();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PPK_Duplex: {
|
||||||
|
if (!d->devMode)
|
||||||
|
break;
|
||||||
|
QPrint::DuplexMode mode = QPrint::DuplexMode(value.toInt());
|
||||||
|
if (mode == property(PPK_Duplex).toInt() || !d->m_printDevice.supportedDuplexModes().contains(mode))
|
||||||
|
break;
|
||||||
|
switch (mode) {
|
||||||
|
case QPrinter::DuplexNone:
|
||||||
|
d->devMode->dmDuplex = DMDUP_SIMPLEX;
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexAuto:
|
||||||
|
d->devMode->dmDuplex = d->m_pageLayout.orientation() == QPageLayout::Landscape ? DMDUP_HORIZONTAL : DMDUP_VERTICAL;
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexLongSide:
|
||||||
|
d->devMode->dmDuplex = DMDUP_VERTICAL;
|
||||||
|
break;
|
||||||
|
case QPrinter::DuplexShortSide:
|
||||||
|
d->devMode->dmDuplex = DMDUP_HORIZONTAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Don't change
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
d->doReinit();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case PPK_FullPage:
|
case PPK_FullPage:
|
||||||
if (value.toBool())
|
if (value.toBool())
|
||||||
d->m_pageLayout.setMode(QPageLayout::FullPageMode);
|
d->m_pageLayout.setMode(QPageLayout::FullPageMode);
|
||||||
@ -1263,10 +1284,6 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
|
|||||||
|
|
||||||
// The following keys are settings that are unsupported by the Windows PrintEngine
|
// The following keys are settings that are unsupported by the Windows PrintEngine
|
||||||
// Return sensible default values to ensure consistent behavior across platforms
|
// Return sensible default values to ensure consistent behavior across platforms
|
||||||
case PPK_Duplex:
|
|
||||||
// TODO Add support using DEVMODE.dmDuplex
|
|
||||||
value = QPrinter::DuplexNone;
|
|
||||||
break;
|
|
||||||
case PPK_FontEmbedding:
|
case PPK_FontEmbedding:
|
||||||
value = false;
|
value = false;
|
||||||
break;
|
break;
|
||||||
@ -1303,6 +1320,26 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
|
|||||||
value = d->docName;
|
value = d->docName;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PPK_Duplex: {
|
||||||
|
if (!d->devMode) {
|
||||||
|
value = QPrinter::DuplexNone;
|
||||||
|
} else {
|
||||||
|
switch (d->devMode->dmDuplex) {
|
||||||
|
case DMDUP_VERTICAL:
|
||||||
|
value = QPrinter::DuplexLongSide;
|
||||||
|
break;
|
||||||
|
case DMDUP_HORIZONTAL:
|
||||||
|
value = QPrinter::DuplexShortSide;
|
||||||
|
break;
|
||||||
|
case DMDUP_SIMPLEX:
|
||||||
|
default:
|
||||||
|
value = QPrinter::DuplexNone;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case PPK_FullPage:
|
case PPK_FullPage:
|
||||||
value = d->m_pageLayout.mode() == QPageLayout::FullPageMode;
|
value = d->m_pageLayout.mode() == QPageLayout::FullPageMode;
|
||||||
break;
|
break;
|
||||||
|
@ -1678,9 +1678,11 @@ bool QPrinter::fontEmbeddingEnabled() const
|
|||||||
/*!
|
/*!
|
||||||
\since 4.2
|
\since 4.2
|
||||||
|
|
||||||
|
\obsolete Use setDuplex() instead.
|
||||||
|
|
||||||
Enables double sided printing if \a doubleSided is true; otherwise disables it.
|
Enables double sided printing if \a doubleSided is true; otherwise disables it.
|
||||||
|
|
||||||
Currently this option is only supported on X11.
|
\sa setDuplex()
|
||||||
*/
|
*/
|
||||||
void QPrinter::setDoubleSidedPrinting(bool doubleSided)
|
void QPrinter::setDoubleSidedPrinting(bool doubleSided)
|
||||||
{
|
{
|
||||||
@ -1691,9 +1693,11 @@ void QPrinter::setDoubleSidedPrinting(bool doubleSided)
|
|||||||
/*!
|
/*!
|
||||||
\since 4.2
|
\since 4.2
|
||||||
|
|
||||||
|
\obsolete Use duplex() instead.
|
||||||
|
|
||||||
Returns \c true if double side printing is enabled.
|
Returns \c true if double side printing is enabled.
|
||||||
|
|
||||||
Currently this option is only supported on X11.
|
\sa duplex()
|
||||||
*/
|
*/
|
||||||
bool QPrinter::doubleSidedPrinting() const
|
bool QPrinter::doubleSidedPrinting() const
|
||||||
{
|
{
|
||||||
@ -1705,7 +1709,7 @@ bool QPrinter::doubleSidedPrinting() const
|
|||||||
|
|
||||||
Enables double sided printing based on the \a duplex mode.
|
Enables double sided printing based on the \a duplex mode.
|
||||||
|
|
||||||
Currently this option is only supported on X11.
|
\sa duplex()
|
||||||
*/
|
*/
|
||||||
void QPrinter::setDuplex(DuplexMode duplex)
|
void QPrinter::setDuplex(DuplexMode duplex)
|
||||||
{
|
{
|
||||||
@ -1718,7 +1722,7 @@ void QPrinter::setDuplex(DuplexMode duplex)
|
|||||||
|
|
||||||
Returns the current duplex mode.
|
Returns the current duplex mode.
|
||||||
|
|
||||||
Currently this option is only supported on X11.
|
\sa setDuplex()
|
||||||
*/
|
*/
|
||||||
QPrinter::DuplexMode QPrinter::duplex() const
|
QPrinter::DuplexMode QPrinter::duplex() const
|
||||||
{
|
{
|
||||||
|
@ -352,6 +352,33 @@ QList<int> QPrinterInfo::supportedResolutions() const
|
|||||||
return d->m_printDevice.supportedResolutions();
|
return d->m_printDevice.supportedResolutions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the default duplex mode of this printer.
|
||||||
|
|
||||||
|
\since 5.4
|
||||||
|
*/
|
||||||
|
|
||||||
|
QPrinter::DuplexMode QPrinterInfo::defaultDuplexMode() const
|
||||||
|
{
|
||||||
|
Q_D(const QPrinterInfo);
|
||||||
|
return QPrinter::DuplexMode(d->m_printDevice.defaultDuplexMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns a list of duplex modes supported by this printer.
|
||||||
|
|
||||||
|
\since 5.4
|
||||||
|
*/
|
||||||
|
|
||||||
|
QList<QPrinter::DuplexMode> QPrinterInfo::supportedDuplexModes() const
|
||||||
|
{
|
||||||
|
Q_D(const QPrinterInfo);
|
||||||
|
QList<QPrinter::DuplexMode> list;
|
||||||
|
foreach (QPrint::DuplexMode mode, d->m_printDevice.supportedDuplexModes())
|
||||||
|
list << QPrinter::DuplexMode(mode);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns a list of all the available Printer Names on this system.
|
Returns a list of all the available Printer Names on this system.
|
||||||
|
|
||||||
|
@ -82,6 +82,9 @@ public:
|
|||||||
|
|
||||||
QList<int> supportedResolutions() const;
|
QList<int> supportedResolutions() const;
|
||||||
|
|
||||||
|
QPrinter::DuplexMode defaultDuplexMode() const;
|
||||||
|
QList<QPrinter::DuplexMode> supportedDuplexModes() const;
|
||||||
|
|
||||||
static QStringList availablePrinterNames();
|
static QStringList availablePrinterNames();
|
||||||
static QList<QPrinterInfo> availablePrinters();
|
static QList<QPrinterInfo> availablePrinters();
|
||||||
|
|
||||||
|
@ -1503,15 +1503,18 @@ QSql::NumericalPrecisionPolicy QSqlDatabase::numericalPrecisionPolicy() const
|
|||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const QSqlDatabase &d)
|
QDebug operator<<(QDebug dbg, const QSqlDatabase &d)
|
||||||
{
|
{
|
||||||
|
QDebugStateSaver saver(dbg);
|
||||||
|
dbg.nospace();
|
||||||
|
dbg.noquote();
|
||||||
if (!d.isValid()) {
|
if (!d.isValid()) {
|
||||||
dbg.nospace() << "QSqlDatabase(invalid)";
|
dbg << "QSqlDatabase(invalid)";
|
||||||
return dbg.space();
|
return dbg;
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg.nospace() << "QSqlDatabase(driver=\"" << d.driverName() << "\", database=\""
|
dbg << "QSqlDatabase(driver=\"" << d.driverName() << "\", database=\""
|
||||||
<< d.databaseName() << "\", host=\"" << d.hostName() << "\", port=" << d.port()
|
<< d.databaseName() << "\", host=\"" << d.hostName() << "\", port=" << d.port()
|
||||||
<< ", user=\"" << d.userName() << "\", open=" << d.isOpen() << ")";
|
<< ", user=\"" << d.userName() << "\", open=" << d.isOpen() << ')';
|
||||||
return dbg.space();
|
return dbg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -39,9 +39,11 @@ QT_BEGIN_NAMESPACE
|
|||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const QSqlError &s)
|
QDebug operator<<(QDebug dbg, const QSqlError &s)
|
||||||
{
|
{
|
||||||
dbg.nospace() << "QSqlError(" << s.nativeErrorCode() << ", " << s.driverText() <<
|
QDebugStateSaver saver(dbg);
|
||||||
", " << s.databaseText() << ')';
|
dbg.nospace();
|
||||||
return dbg.space();
|
dbg << "QSqlError(" << s.nativeErrorCode() << ", " << s.driverText()
|
||||||
|
<< ", " << s.databaseText() << ')';
|
||||||
|
return dbg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -509,21 +509,24 @@ bool QSqlField::isValid() const
|
|||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const QSqlField &f)
|
QDebug operator<<(QDebug dbg, const QSqlField &f)
|
||||||
{
|
{
|
||||||
dbg.nospace() << "QSqlField(" << f.name() << ", " << QMetaType::typeName(f.type());
|
QDebugStateSaver saver(dbg);
|
||||||
|
dbg.nospace();
|
||||||
|
dbg << "QSqlField(" << f.name() << ", " << QMetaType::typeName(f.type());
|
||||||
if (f.length() >= 0)
|
if (f.length() >= 0)
|
||||||
dbg.nospace() << ", length: " << f.length();
|
dbg << ", length: " << f.length();
|
||||||
if (f.precision() >= 0)
|
if (f.precision() >= 0)
|
||||||
dbg.nospace() << ", precision: " << f.precision();
|
dbg << ", precision: " << f.precision();
|
||||||
if (f.requiredStatus() != QSqlField::Unknown)
|
if (f.requiredStatus() != QSqlField::Unknown)
|
||||||
dbg.nospace() << ", required: "
|
dbg << ", required: "
|
||||||
<< (f.requiredStatus() == QSqlField::Required ? "yes" : "no");
|
<< (f.requiredStatus() == QSqlField::Required ? "yes" : "no");
|
||||||
dbg.nospace() << ", generated: " << (f.isGenerated() ? "yes" : "no");
|
dbg << ", generated: " << (f.isGenerated() ? "yes" : "no");
|
||||||
if (f.typeID() >= 0)
|
if (f.typeID() >= 0)
|
||||||
dbg.nospace() << ", typeID: " << f.typeID();
|
dbg << ", typeID: " << f.typeID();
|
||||||
if (!f.defaultValue().isNull())
|
if (!f.defaultValue().isNull())
|
||||||
dbg.nospace() << ", auto-value: \"" << f.defaultValue() << '\"';
|
dbg << ", defaultValue: \"" << f.defaultValue() << '\"';
|
||||||
dbg.nospace() << ')';
|
dbg << ", autoValue: " << f.isAutoValue()
|
||||||
return dbg.space();
|
<< ", readOnly: " << f.isReadOnly() << ')';
|
||||||
|
return dbg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -509,9 +509,16 @@ void QSqlRecord::detach()
|
|||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
QDebug operator<<(QDebug dbg, const QSqlRecord &r)
|
QDebug operator<<(QDebug dbg, const QSqlRecord &r)
|
||||||
{
|
{
|
||||||
dbg << "QSqlRecord(" << r.count() << ')';
|
QDebugStateSaver saver(dbg);
|
||||||
for (int i = 0; i < r.count(); ++i)
|
dbg.nospace();
|
||||||
dbg << '\n' << QString::fromLatin1("%1:").arg(i, 2) << r.field(i) << r.value(i).toString();
|
const int count = r.count();
|
||||||
|
dbg << "QSqlRecord(" << count << ')';
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
dbg.nospace();
|
||||||
|
dbg << '\n' << qSetFieldWidth(2) << right << i << left << qSetFieldWidth(0) << ':';
|
||||||
|
dbg.space();
|
||||||
|
dbg << r.field(i) << r.value(i).toString();
|
||||||
|
}
|
||||||
return dbg;
|
return dbg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2367,6 +2367,7 @@ static LONG WINAPI windowsFaultHandler(struct _EXCEPTION_POINTERS *exInfo)
|
|||||||
static void initEnvironment()
|
static void initEnvironment()
|
||||||
{
|
{
|
||||||
qputenv("QT_LOGGING_TO_CONSOLE", "1");
|
qputenv("QT_LOGGING_TO_CONSOLE", "1");
|
||||||
|
qputenv("QT_QTESTLIB_RUNNING", "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -1057,6 +1057,12 @@ bool RCCResourceLibrary::writeInitializer()
|
|||||||
|
|
||||||
QByteArray initResources = "qInitResources";
|
QByteArray initResources = "qInitResources";
|
||||||
initResources += initName;
|
initResources += initName;
|
||||||
|
|
||||||
|
// Work around -Wmissing-declarations warnings.
|
||||||
|
writeString("int ");
|
||||||
|
writeMangleNamespaceFunction(initResources);
|
||||||
|
writeString("();\n");
|
||||||
|
|
||||||
writeString("int ");
|
writeString("int ");
|
||||||
writeMangleNamespaceFunction(initResources);
|
writeMangleNamespaceFunction(initResources);
|
||||||
writeString("()\n{\n");
|
writeString("()\n{\n");
|
||||||
@ -1073,6 +1079,12 @@ bool RCCResourceLibrary::writeInitializer()
|
|||||||
//cleanup
|
//cleanup
|
||||||
QByteArray cleanResources = "qCleanupResources";
|
QByteArray cleanResources = "qCleanupResources";
|
||||||
cleanResources += initName;
|
cleanResources += initName;
|
||||||
|
|
||||||
|
// Work around -Wmissing-declarations warnings.
|
||||||
|
writeString("int ");
|
||||||
|
writeMangleNamespaceFunction(cleanResources);
|
||||||
|
writeString("();\n");
|
||||||
|
|
||||||
writeString("int ");
|
writeString("int ");
|
||||||
writeMangleNamespaceFunction(cleanResources);
|
writeMangleNamespaceFunction(cleanResources);
|
||||||
writeString("()\n{\n");
|
writeString("()\n{\n");
|
||||||
|
@ -322,6 +322,7 @@ void QFontDialogPrivate::init()
|
|||||||
|
|
||||||
familyList->setFocus();
|
familyList->setFocus();
|
||||||
retranslateStrings();
|
retranslateStrings();
|
||||||
|
sampleEdit->setObjectName(QLatin1String("qt_fontDialog_sampleEdit"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -653,10 +653,7 @@ HFONT QVistaHelper::getCaptionFont(HANDLE hTheme)
|
|||||||
{
|
{
|
||||||
LOGFONT lf = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 } };
|
LOGFONT lf = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 } };
|
||||||
|
|
||||||
if (!hTheme)
|
if (!hTheme || FAILED(pGetThemeSysFont(hTheme, WIZ_TMT_CAPTIONFONT, &lf))) {
|
||||||
pGetThemeSysFont(hTheme, WIZ_TMT_CAPTIONFONT, &lf);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NONCLIENTMETRICS ncm;
|
NONCLIENTMETRICS ncm;
|
||||||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||||||
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, false);
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, false);
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
CustomStyle::CustomStyle()
|
CustomStyle::CustomStyle()
|
||||||
{
|
{
|
||||||
//! [0]
|
//! [0]
|
||||||
QSpinBox *spinBox = qobject_cast<QSpinBox *>(widget);
|
const QSpinBox *spinBox = qobject_cast<const QSpinBox *>(widget);
|
||||||
if (spinBox) {
|
if (spinBox) {
|
||||||
//! [0] //! [1]
|
//! [0] //! [1]
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ class CustomStyle : public QProxyStyle
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CustomStyle()
|
CustomStyle();
|
||||||
~CustomStyle() {}
|
~CustomStyle() {}
|
||||||
|
|
||||||
void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
|
void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
|
QT += widgets
|
||||||
HEADERS += customstyle.h
|
HEADERS += customstyle.h
|
||||||
SOURCES += customstyle.cpp main.cpp
|
SOURCES += customstyle.cpp main.cpp
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
//! [using a custom style]
|
//! [using a custom style]
|
||||||
#include <QtGui>
|
#include <QtWidgets>
|
||||||
|
|
||||||
#include "customstyle.h"
|
#include "customstyle.h"
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <QtGui>
|
#include <QtWidgets>
|
||||||
|
|
||||||
#include "customviewstyle.h"
|
#include "customviewstyle.h"
|
||||||
|
|
||||||
|
@ -38,9 +38,29 @@
|
|||||||
#include "qgraphicslayoutitem_p.h"
|
#include "qgraphicslayoutitem_p.h"
|
||||||
#include "qgraphicslayout_p.h"
|
#include "qgraphicslayout_p.h"
|
||||||
#include "qgraphicswidget.h"
|
#include "qgraphicswidget.h"
|
||||||
|
#include <private/qgraphicswidget_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
bool QGraphicsGridLayoutEngineItem::isHidden() const
|
||||||
|
{
|
||||||
|
if (QGraphicsItem *item = q_layoutItem->graphicsItem())
|
||||||
|
return QGraphicsItemPrivate::get(item)->explicitlyHidden;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
|
||||||
|
If this returns true, the layout will arrange just as if the item was never added to the layout.
|
||||||
|
(Note that this shouldn't lead to a "double spacing" where the item was hidden)
|
||||||
|
### Qt6: Move to QGraphicsLayoutItem and make virtual
|
||||||
|
*/
|
||||||
|
bool QGraphicsGridLayoutEngineItem::isIgnored() const
|
||||||
|
{
|
||||||
|
return isHidden() && !q_layoutItem->sizePolicy().retainSizeWhenHidden();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
returns \c true if the size policy returns \c true for either hasHeightForWidth()
|
returns \c true if the size policy returns \c true for either hasHeightForWidth()
|
||||||
or hasWidthForHeight()
|
or hasWidthForHeight()
|
||||||
|
@ -82,6 +82,10 @@ public:
|
|||||||
return q_layoutItem->effectiveSizeHint(which, constraint);
|
return q_layoutItem->effectiveSizeHint(which, constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isHidden() const;
|
||||||
|
|
||||||
|
virtual bool isIgnored() const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
virtual void setGeometry(const QRectF &rect) Q_DECL_OVERRIDE
|
virtual void setGeometry(const QRectF &rect) Q_DECL_OVERRIDE
|
||||||
{
|
{
|
||||||
q_layoutItem->setGeometry(rect);
|
q_layoutItem->setGeometry(rect);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user