From a8de6f0a57fae09c3666eb1d734870f8d8e314c4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Aug 2016 10:29:49 -0700 Subject: [PATCH] Add settings to change local port --- .../dialogs/NetworkingPreferencesDialog.qml | 19 +++++++++++ interface/src/Menu.cpp | 23 +++++++------ interface/src/Menu.h | 1 + interface/src/ui/PreferencesDialog.cpp | 16 ++++++++++ libraries/networking/src/NodeList.cpp | 21 +++++++++++- libraries/networking/src/NodeList.h | 2 ++ libraries/networking/src/udt/Socket.cpp | 6 ++-- libraries/networking/src/udt/Socket.h | 3 +- libraries/shared/src/Preferences.h | 32 +++++++++++++++++++ 9 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml diff --git a/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml b/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml new file mode 100644 index 0000000000..652d3347fc --- /dev/null +++ b/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml @@ -0,0 +1,19 @@ +import QtQuick 2.5 +import Qt.labs.settings 1.0 + +import "../../dialogs" + +PreferencesDialog { + id: root + objectName: "NetworkingPreferencesDialog" + title: "Networking Settings" + showCategories: ["Networking"] + property var settings: Settings { + category: root.objectName + property alias x: root.x + property alias y: root.y + property alias width: root.width + property alias height: root.height + } +} + diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 50dc748461..69ec085188 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -522,21 +522,26 @@ Menu::Menu() { // Developer > Network >>> MenuWrapper* networkMenu = developerMenu->addMenu("Network"); + action = addActionToQMenuAndActionHash(networkMenu, MenuOption::Networking); + connect(action, &QAction::triggered, [] { + DependencyManager::get()->toggle(QUrl("hifi/dialogs/NetworkingPreferencesDialog.qml"), + "NetworkingPreferencesDialog"); + }); addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches())); addCheckableActionToQMenuAndActionHash(networkMenu, - MenuOption::DisableActivityLogger, - 0, - false, - &UserActivityLogger::getInstance(), - SLOT(disable(bool))); + MenuOption::DisableActivityLogger, + 0, + false, + &UserActivityLogger::getInstance(), + SLOT(disable(bool))); addActionToQMenuAndActionHash(networkMenu, MenuOption::CachesSize, 0, - dialogsManager.data(), SLOT(cachesSizeDialog())); + dialogsManager.data(), SLOT(cachesSizeDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::DiskCacheEditor, 0, - dialogsManager.data(), SLOT(toggleDiskCacheEditor())); + dialogsManager.data(), SLOT(toggleDiskCacheEditor())); addActionToQMenuAndActionHash(networkMenu, MenuOption::ShowDSConnectTable, 0, - dialogsManager.data(), SLOT(showDomainConnectionDialog())); + dialogsManager.data(), SLOT(showDomainConnectionDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::BandwidthDetails, 0, - dialogsManager.data(), SLOT(bandwidthDetails())); + dialogsManager.data(), SLOT(bandwidthDetails())); #if (PR_BUILD || DEV_BUILD) addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index ee00644746..b25603caeb 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -129,6 +129,7 @@ namespace MenuOption { const QString MuteEnvironment = "Mute Environment"; const QString MuteFaceTracking = "Mute Face Tracking"; const QString NamesAboveHeads = "Names Above Heads"; + const QString Networking = "Networking..."; const QString NoFaceTracking = "None"; const QString OctreeStats = "Entity Statistics"; const QString OnePointCalibration = "1 Point Calibration"; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 7fdafc9bda..aaecf8ae37 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -332,4 +332,20 @@ void setupPreferences() { preferences->addPreference(preference); } } + { + static const QString RENDER("Networking"); + + auto nodelist = DependencyManager::get(); + { + const int MIN_PORT_NUMBER { 0 }; + const int MAX_PORT_NUMBER { 65535 }; + auto getter = [nodelist] { return nodelist->getSocketLocalPort(); }; + auto setter = [nodelist](quint16 preset) { nodelist->setSocketLocalPort(preset); }; + auto preference = new SpinnerPreference(RENDER, "Listening Port", getter, setter); + preference->setMin(MIN_PORT_NUMBER); + preference->setMax(MAX_PORT_NUMBER); + preference->setStep(1); + preferences->addPreference(preference); + } + } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6269499e28..dd6aa848ba 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -31,10 +31,18 @@ #include "udt/PacketHeaders.h" #include "SharedUtil.h" +#include + const int KEEPALIVE_PING_INTERVAL_MS = 1000; +static Setting::Handle NODELIST_LOCAL_PORT("NodeList.LocalPort", 0); + +quint16 pickPortHelper(quint16 port) { + return (port != 0) ? port : NODELIST_LOCAL_PORT.get(); +} + NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned short dtlsListenPort) : - LimitedNodeList(socketListenPort, dtlsListenPort), + LimitedNodeList(pickPortHelper(socketListenPort), dtlsListenPort), _ownerType(newOwnerType), _nodeTypesOfInterest(), _domainHandler(this), @@ -238,6 +246,17 @@ void NodeList::reset() { } } +void NodeList::setSocketLocalPort(quint16 socketLocalPort) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setSocketLocalPort", Qt::QueuedConnection, + Q_ARG(quint16, socketLocalPort)); + return; + } + _nodeSocket.rebind(socketLocalPort); + reset(); + NODELIST_LOCAL_PORT.set(socketLocalPort); +} + void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) { _nodeTypesOfInterest << nodeTypeToAdd; } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index f3cd5bed0d..936e67c018 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -92,6 +92,8 @@ public slots: void processICEPingPacket(QSharedPointer message); + void setSocketLocalPort(quint16 socketLocalPort); + #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } #endif diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index a39100f8d1..37ededa55c 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -63,10 +63,12 @@ void Socket::bind(const QHostAddress& address, quint16 port) { } void Socket::rebind() { - quint16 oldPort = _udpSocket.localPort(); + rebind(_udpSocket.localPort()); +} +void Socket::rebind(quint16 localPort) { _udpSocket.close(); - bind(QHostAddress::AnyIPv4, oldPort); + bind(QHostAddress::AnyIPv4, localPort); } void Socket::setSystemBufferSizes() { diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index 6b8ccf1fa8..bc4393d4bd 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -61,8 +61,9 @@ public: qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& sockAddr); void bind(const QHostAddress& address, quint16 port = 0); + void rebind(quint16 port); void rebind(); - + void setPacketFilterOperator(PacketFilterOperator filterOperator) { _packetFilterOperator = filterOperator; } void setPacketHandler(PacketHandler handler) { _packetHandler = handler; } void setMessageHandler(MessageHandler handler) { _messageHandler = handler; } diff --git a/libraries/shared/src/Preferences.h b/libraries/shared/src/Preferences.h index abb3f5afbd..94a8f43c4e 100644 --- a/libraries/shared/src/Preferences.h +++ b/libraries/shared/src/Preferences.h @@ -189,6 +189,38 @@ protected: float _step { 0.1f }; }; + +class IntPreference : public TypedPreference { + Q_OBJECT + Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(float min READ getMin CONSTANT) + Q_PROPERTY(float max READ getMax CONSTANT) + Q_PROPERTY(float step READ getStep CONSTANT) + +public: + IntPreference(const QString& category, const QString& name, Getter getter, Setter setter) + : TypedPreference(category, name, getter, setter) { } + + float getMin() const { return _min; } + void setMin(float min) { _min = min; }; + + float getMax() const { return _max; } + void setMax(float max) { _max = max; }; + + float getStep() const { return _step; } + void setStep(float step) { _step = step; }; + +signals: + void valueChanged(); + +protected: + void emitValueChanged() override { emit valueChanged(); } + + int _min { std::numeric_limits::min() }; + int _max { std::numeric_limits::max() }; + int _step { 1 }; +}; + class StringPreference : public TypedPreference { Q_OBJECT Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)