diff --git a/libnymea-app/configuration/networkmanager.cpp b/libnymea-app/configuration/networkmanager.cpp index 5109e390..9efc23b2 100644 --- a/libnymea-app/configuration/networkmanager.cpp +++ b/libnymea-app/configuration/networkmanager.cpp @@ -275,6 +275,18 @@ void NetworkManager::getDevicesResponse(int /*commandId*/, const QVariantMap &pa QMetaEnum modeEnum = QMetaEnum::fromType(); device->setWirelessMode(static_cast(modeEnum.keyToValue(deviceMap.value("mode").toString().toUtf8()))); + // Note: capabilities have been aaded in API 8.2 + if (m_engine->jsonRpcClient()->jsonRpcVersion() >= "8.2") { + QMetaEnum capabilityEnum = QMetaEnum::fromType(); + WirelessNetworkDevice::WirelessCapabilities wirelessCapabilities; + foreach (const QVariant &capabilityVariant, deviceMap.value("capabilities").toList()) { + QString capabilityString = capabilityVariant.toString(); + wirelessCapabilities.setFlag(static_cast(capabilityEnum.keyToValue(capabilityString.toUtf8()))); + } + device->setWirelessCapabilities(wirelessCapabilities); + } + + QVariantMap currentApMap = deviceMap.value("currentAccessPoint").toMap(); device->currentAccessPoint()->setSsid(currentApMap.value("ssid").toString()); device->currentAccessPoint()->setMacAddress(currentApMap.value("macAddress").toString()); diff --git a/libnymea-app/configuration/networkmanager.h b/libnymea-app/configuration/networkmanager.h index 1e77d202..d2bc1aab 100644 --- a/libnymea-app/configuration/networkmanager.h +++ b/libnymea-app/configuration/networkmanager.h @@ -51,8 +51,8 @@ class NetworkManager : public QObject Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged) Q_PROPERTY(bool wirelessNetworkingEnabled READ wirelessNetworkingEnabled NOTIFY wirelessNetworkingEnabledChanged) - Q_PROPERTY(WiredNetworkDevices* wiredNetworkDevices READ wiredNetworkDevices CONSTANT) - Q_PROPERTY(WirelessNetworkDevices* wirelessNetworkDevices READ wirelessNetworkDevices CONSTANT) + Q_PROPERTY(WiredNetworkDevices *wiredNetworkDevices READ wiredNetworkDevices CONSTANT) + Q_PROPERTY(WirelessNetworkDevices *wirelessNetworkDevices READ wirelessNetworkDevices CONSTANT) public: enum NetworkManagerState { @@ -80,8 +80,8 @@ public: bool networkingEnabled() const; bool wirelessNetworkingEnabled() const; - WiredNetworkDevices* wiredNetworkDevices() const; - WirelessNetworkDevices* wirelessNetworkDevices() const; + WiredNetworkDevices *wiredNetworkDevices() const; + WirelessNetworkDevices *wirelessNetworkDevices() const; Q_INVOKABLE int enableNetworking(bool enable); Q_INVOKABLE int enableWirelessNetworking(bool enable); @@ -137,8 +137,8 @@ private: bool m_networkingEnabled = false; bool m_wirelessNetworkingEnabled = false; - WiredNetworkDevices* m_wiredNetworkDevices = nullptr; - WirelessNetworkDevices* m_wirelessNetworkDevices = nullptr; + WiredNetworkDevices *m_wiredNetworkDevices = nullptr; + WirelessNetworkDevices *m_wirelessNetworkDevices = nullptr; QHash m_apRequests; // requestId, interface }; diff --git a/libnymea-app/connection/discovery/upnpdiscovery.cpp b/libnymea-app/connection/discovery/upnpdiscovery.cpp index b4f1fa74..e4ad6560 100644 --- a/libnymea-app/connection/discovery/upnpdiscovery.cpp +++ b/libnymea-app/connection/discovery/upnpdiscovery.cpp @@ -158,7 +158,7 @@ void UpnpDiscovery::writeDiscoveryPacket() void UpnpDiscovery::error(QAbstractSocket::SocketError error) { QUdpSocket* socket = static_cast(sender()); - qWarning() << "UPnP: Socket error:" << error << socket->errorString(); + qCDebug(dcUPnP()) << "UPnP: Socket error:" << error << socket->errorString(); } void UpnpDiscovery::readData() diff --git a/libnymea-app/types/networkdevice.cpp b/libnymea-app/types/networkdevice.cpp index d4f79341..f723a352 100644 --- a/libnymea-app/types/networkdevice.cpp +++ b/libnymea-app/types/networkdevice.cpp @@ -129,6 +129,11 @@ WirelessNetworkDevice::WirelessNetworkDevice(const QString &macAddress, const QS m_currentAccessPoint = new WirelessAccessPoint(this); } +WirelessNetworkDevice::WirelessCapabilities WirelessNetworkDevice::wirelessCapabilities() const +{ + return m_wirelessCapabilities; +} + WirelessNetworkDevice::WirelessMode WirelessNetworkDevice::wirelessMode() const { return m_wirelessMode; @@ -144,6 +149,14 @@ WirelessAccessPoint *WirelessNetworkDevice::currentAccessPoint() const return m_currentAccessPoint; } +void WirelessNetworkDevice::setWirelessCapabilities(WirelessCapabilities wirelessCapabilities) +{ + if (m_wirelessCapabilities != wirelessCapabilities) { + m_wirelessCapabilities = wirelessCapabilities; + emit wirelessCapabilitiesChanged(); + } +} + void WirelessNetworkDevice::setWirelessMode(WirelessNetworkDevice::WirelessMode wirelessMode) { if (m_wirelessMode != wirelessMode) { diff --git a/libnymea-app/types/networkdevice.h b/libnymea-app/types/networkdevice.h index 01ced778..5bbaee19 100644 --- a/libnymea-app/types/networkdevice.h +++ b/libnymea-app/types/networkdevice.h @@ -116,6 +116,7 @@ private: class WirelessNetworkDevice: public NetworkDevice { Q_OBJECT + Q_PROPERTY(WirelessCapabilities wirelessCapabilities READ wirelessCapabilities NOTIFY wirelessCapabilitiesChanged) Q_PROPERTY(WirelessMode wirelessMode READ wirelessMode NOTIFY wirelessModeChanged) Q_PROPERTY(WirelessAccessPoints* accessPoints READ accessPoints CONSTANT) Q_PROPERTY(WirelessAccessPoint* currentAccessPoint READ currentAccessPoint CONSTANT) @@ -128,20 +129,44 @@ public: WirelessModeAccessPoint = 3 }; Q_ENUM(WirelessMode) + + enum WirelessCapability { + WirelessCapabilityNone = 0x0000, + WirelessCapabilityCipherWEP40 = 0x0001, + WirelessCapabilityCipherWEP104 = 0x0002, + WirelessCapabilityCipherTKIP = 0x0004, + WirelessCapabilityCipherCCMP = 0x0008, + WirelessCapabilityWPA = 0x0010, + WirelessCapabilityRSN = 0x0020, + WirelessCapabilityAP = 0x0040, + WirelessCapabilityAdHoc = 0x0080, + WirelessCapabilityFreqValid = 0x0100, + WirelessCapability2Ghz = 0x0200, + WirelessCapability5Ghz = 0x0400, + }; + Q_ENUM(WirelessCapability) + Q_DECLARE_FLAGS(WirelessCapabilities, WirelessCapability) + Q_FLAG(WirelessCapabilities) + explicit WirelessNetworkDevice(const QString &macAddress, const QString &interface, QObject *parent = nullptr); + WirelessCapabilities wirelessCapabilities() const; WirelessMode wirelessMode() const; WirelessAccessPoints* accessPoints() const; WirelessAccessPoint* currentAccessPoint() const; + void setWirelessCapabilities(WirelessCapabilities wirelessCapabilities); void setWirelessMode(WirelessMode wirelessMode); signals: + void wirelessCapabilitiesChanged(); void wirelessModeChanged(); private: + WirelessCapabilities m_wirelessCapabilities = WirelessCapabilityNone; WirelessMode m_wirelessMode = WirelessModeUnknown; WirelessAccessPoints *m_accessPoints = nullptr; WirelessAccessPoint *m_currentAccessPoint = nullptr; + }; #endif // NETWORKDEVICE_H diff --git a/nymea-app/ui/system/NetworkSettingsPage.qml b/nymea-app/ui/system/NetworkSettingsPage.qml index 411a6c1f..e41fa42c 100644 --- a/nymea-app/ui/system/NetworkSettingsPage.qml +++ b/nymea-app/ui/system/NetworkSettingsPage.qml @@ -58,6 +58,7 @@ SettingsPageBase { if (id === d.pendingCallId) { d.pendingCallId = -1 } + var errorMessage; switch (status) { case "NetworkManagerErrorNoError": @@ -86,10 +87,15 @@ SettingsPageBase { case "NetworkManagerErrorNetworkManagerNotAvailable": errorMessage = qsTr("The network manager is not available.") break; + case "NetworkManagerErrorInvalidConfiguration": + errorMessage = qsTr("The network configuration is not valid.") + break; + case "NetworkManagerErrorUnsupportedFeature": + errorMessage = qsTr("This feature is not supported on this platform.") + break; case "NetworkManagerErrorUnknownError": errorMessage = qsTr("An unexpected error happened.") break; - } print("network config reply:", status, errorMessage) @@ -400,8 +406,13 @@ SettingsPageBase { property WirelessNetworkDevice wirelessNetworkDevice: null + property bool apFeatureAvailable: wirelessNetworkDevice && + wirelessNetworkDevice.wirelessCapabilities !== WirelessNetworkDevice.WirelessCapabilityNone && + wirelessNetworkDevice.wirelessCapabilities | WirelessNetworkDevice.WirelessCapabilityAP + SettingsPageSectionHeader { text: qsTr("Access Point") + visible: apFeatureAvailable } TextField { @@ -411,6 +422,7 @@ SettingsPageBase { Layout.leftMargin: app.margins Layout.rightMargin: app.margins placeholderText: qsTr("SSID") + visible: apFeatureAvailable } PasswordTextField { @@ -424,6 +436,7 @@ SettingsPageBase { requireNumber: false requireSpecialChar: false signup: false + visible: apFeatureAvailable } Button { @@ -433,6 +446,7 @@ SettingsPageBase { Layout.rightMargin: app.margins text: qsTr("Create Access Point") enabled: ssidTextField.displayText.length > 0 && passwordTextField.isValidPassword + visible: apFeatureAvailable onClicked: { d.pendingCallId = networkManager.startAccessPoint(wirelessAccessPointsPage.wirelessNetworkDevice.interface, ssidTextField.text, passwordTextField.password) pageStack.pop(root);