diff options
-rw-r--r-- | src/network/socket/qlocalserver.cpp | 6 | ||||
-rw-r--r-- | src/network/socket/qlocalserver.h | 5 | ||||
-rw-r--r-- | src/network/socket/qlocalserver_p.h | 3 | ||||
-rw-r--r-- | src/network/socket/qlocalserver_unix.cpp | 13 | ||||
-rw-r--r-- | src/network/socket/qlocalserver_win.cpp | 8 | ||||
-rw-r--r-- | tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp | 16 |
6 files changed, 39 insertions, 12 deletions
diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp index bce5b9a1a4..16dc907149 100644 --- a/src/network/socket/qlocalserver.cpp +++ b/src/network/socket/qlocalserver.cpp @@ -185,6 +185,12 @@ QLocalServer::SocketOptions QLocalServer::socketOptions() const return d->socketOptions; } +QBindable<QLocalServer::SocketOptions> QLocalServer::bindableSocketOptions() +{ + Q_D(QLocalServer); + return &d->socketOptions; +} + /*! \since 5.10 Returns the native socket descriptor the server uses to listen diff --git a/src/network/socket/qlocalserver.h b/src/network/socket/qlocalserver.h index 211aa94d85..22b99d3e67 100644 --- a/src/network/socket/qlocalserver.h +++ b/src/network/socket/qlocalserver.h @@ -43,6 +43,8 @@ #include <QtNetwork/qtnetworkglobal.h> #include <QtNetwork/qabstractsocket.h> +#include <QtCore/qproperty.h> + QT_REQUIRE_CONFIG(localserver); QT_BEGIN_NAMESPACE @@ -54,7 +56,7 @@ class Q_NETWORK_EXPORT QLocalServer : public QObject { Q_OBJECT Q_DECLARE_PRIVATE(QLocalServer) - Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions) + Q_PROPERTY(SocketOptions socketOptions READ socketOptions WRITE setSocketOptions BINDABLE bindableSocketOptions) Q_SIGNALS: void newConnection(); @@ -91,6 +93,7 @@ public: void setSocketOptions(SocketOptions options); SocketOptions socketOptions() const; + QBindable<SocketOptions> bindableSocketOptions(); qintptr socketDescriptor() const; diff --git a/src/network/socket/qlocalserver_p.h b/src/network/socket/qlocalserver_p.h index f331a3f10d..5907874b60 100644 --- a/src/network/socket/qlocalserver_p.h +++ b/src/network/socket/qlocalserver_p.h @@ -126,7 +126,8 @@ public: QQueue<QLocalSocket*> pendingConnections; QString errorString; QAbstractSocket::SocketError error; - QLocalServer::SocketOptions socketOptions; + + Q_OBJECT_BINDABLE_PROPERTY(QLocalServerPrivate, QLocalServer::SocketOptions, socketOptions) }; QT_END_NAMESPACE diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index ea7e8e1e0e..45fdc6dd74 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -94,7 +94,8 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) QScopedPointer<QTemporaryDir> tempDir; // Check any of the flags - if (socketOptions & QLocalServer::WorldAccessOption) { + const auto options = socketOptions.value(); + if (options & QLocalServer::WorldAccessOption) { QFileInfo serverNameFileInfo(fullServerName); tempDir.reset(new QTemporaryDir(serverNameFileInfo.absolutePath() + QLatin1Char('/'))); if (!tempDir->isValid()) { @@ -121,7 +122,7 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) return false; } - if (socketOptions & QLocalServer::WorldAccessOption) { + if (options & QLocalServer::WorldAccessOption) { if (sizeof(addr.sun_path) < (uint)encodedTempPath.size() + 1) { setError(QLatin1String("QLocalServer::listen")); closeServer(); @@ -157,16 +158,16 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) return false; } - if (socketOptions & QLocalServer::WorldAccessOption) { + if (options & QLocalServer::WorldAccessOption) { mode_t mode = 000; - if (socketOptions & QLocalServer::UserAccessOption) + if (options & QLocalServer::UserAccessOption) mode |= S_IRWXU; - if (socketOptions & QLocalServer::GroupAccessOption) + if (options & QLocalServer::GroupAccessOption) mode |= S_IRWXG; - if (socketOptions & QLocalServer::OtherAccessOption) + if (options & QLocalServer::OtherAccessOption) mode |= S_IRWXO; if (::chmod(encodedTempPath.constData(), mode) == -1) { diff --git a/src/network/socket/qlocalserver_win.cpp b/src/network/socket/qlocalserver_win.cpp index 6d92ebe93a..a05722987c 100644 --- a/src/network/socket/qlocalserver_win.cpp +++ b/src/network/socket/qlocalserver_win.cpp @@ -77,7 +77,7 @@ bool QLocalServerPrivate::addListener() QByteArray tokenGroupBuffer; // create security descriptor if access options were specified - if ((socketOptions & QLocalServer::WorldAccessOption)) { + if ((socketOptions.value() & QLocalServer::WorldAccessOption)) { pSD.reset(new SECURITY_DESCRIPTOR); if (!InitializeSecurityDescriptor(pSD.data(), SECURITY_DESCRIPTOR_REVISION)) { setError(QLatin1String("QLocalServerPrivate::addListener")); @@ -143,21 +143,21 @@ bool QLocalServerPrivate::addListener() auto acl = reinterpret_cast<PACL>(aclBuffer.data()); InitializeAcl(acl, aclSize, ACL_REVISION_DS); - if (socketOptions & QLocalServer::UserAccessOption) { + if (socketOptions.value() & QLocalServer::UserAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, pTokenUser->User.Sid)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); return false; } } - if (socketOptions & QLocalServer::GroupAccessOption) { + if (socketOptions.value() & QLocalServer::GroupAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, pTokenGroup->PrimaryGroup)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); return false; } } - if (socketOptions & QLocalServer::OtherAccessOption) { + if (socketOptions.value() & QLocalServer::OtherAccessOption) { if (!AddAccessAllowedAce(acl, ACL_REVISION, FILE_ALL_ACCESS, worldSID)) { setError(QLatin1String("QLocalServerPrivate::addListener")); FreeSid(worldSID); diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 4a0f0a27ed..a5559cab70 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -38,6 +38,7 @@ #include <qtextstream.h> #include <qdatastream.h> #include <qelapsedtimer.h> +#include <qproperty.h> #include <QtNetwork/qlocalsocket.h> #include <QtNetwork/qlocalserver.h> @@ -126,6 +127,7 @@ private slots: void verifyListenWithDescriptor(); void verifyListenWithDescriptor_data(); + void serverBindingsAndProperties(); }; tst_QLocalSocket::tst_QLocalSocket() @@ -1426,6 +1428,20 @@ void tst_QLocalSocket::verifyListenWithDescriptor_data() } +void tst_QLocalSocket::serverBindingsAndProperties() +{ + QLocalServer server; + + QProperty<QLocalServer::SocketOptions> sockOpts; + server.bindableSocketOptions().setBinding(Qt::makePropertyBinding(sockOpts)); + sockOpts = QLocalServer::GroupAccessOption | QLocalServer::UserAccessOption; + QCOMPARE(server.socketOptions(), sockOpts.value()); + + sockOpts.setBinding(server.bindableSocketOptions().makeBinding()); + server.setSocketOptions(QLocalServer::OtherAccessOption); + QCOMPARE(sockOpts.value(), QLocalServer::OtherAccessOption); +} + QTEST_MAIN(tst_QLocalSocket) #include "tst_qlocalsocket.moc" |