diff --git a/libnymea-networkmanager/networkconnection.cpp b/libnymea-networkmanager/networkconnection.cpp index 31244ea..a81a358 100644 --- a/libnymea-networkmanager/networkconnection.cpp +++ b/libnymea-networkmanager/networkconnection.cpp @@ -30,8 +30,6 @@ NetworkConnection::NetworkConnection(const QDBusObjectPath &objectPath, QObject QObject(parent), m_objectPath(objectPath) { - qDBusRegisterMetaType(); - m_connectionInterface = new QDBusInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::connectionsInterfaceString(), QDBusConnection::systemBus(), this); if(!m_connectionInterface->isValid()) { qCWarning(dcNetworkManager()) << "Invalid connection dbus interface"; @@ -49,6 +47,10 @@ NetworkConnection::NetworkConnection(const QDBusObjectPath &objectPath, QObject const QDBusArgument &argument = query.arguments().at(0).value(); m_connectionSettings = qdbus_cast(argument); + +// foreach (const QVariant &connectionVariant, m_connectionSettings.values()) { +// qCDebug(dcNetworkManager()) << connectionVariant; +// } } /*! Delete this \l{NetworkConnection} in the \l{NetworkManager}. */ @@ -60,6 +62,12 @@ void NetworkConnection::deleteConnection() } +void NetworkConnection::registerTypes() +{ + qRegisterMetaType("ConnectionSettings"); + qDBusRegisterMetaType(); +} + /*! Returns the dbus object path of this \l{NetworkConnection}. */ QDBusObjectPath NetworkConnection::objectPath() const { diff --git a/libnymea-networkmanager/networkconnection.h b/libnymea-networkmanager/networkconnection.h index 70506f0..8da6d84 100644 --- a/libnymea-networkmanager/networkconnection.h +++ b/libnymea-networkmanager/networkconnection.h @@ -38,10 +38,12 @@ class NetworkConnection : public QObject { Q_OBJECT public: - explicit NetworkConnection(const QDBusObjectPath &objectPath, QObject *parent = 0); + explicit NetworkConnection(const QDBusObjectPath &objectPath, QObject *parent = nullptr); void deleteConnection(); + static void registerTypes(); + QDBusObjectPath objectPath() const; ConnectionSettings connectionSettings() const; @@ -60,6 +62,7 @@ private: ConnectionSettings m_connectionSettings; }; +Q_DECLARE_METATYPE(ConnectionSettings) QDebug operator<<(QDebug debug, NetworkConnection *networkConnection); #endif // NETWORKCONNECTION_H diff --git a/libnymea-networkmanager/networkdevice.h b/libnymea-networkmanager/networkdevice.h index 222f069..f381c1b 100644 --- a/libnymea-networkmanager/networkdevice.h +++ b/libnymea-networkmanager/networkdevice.h @@ -147,7 +147,7 @@ public: }; Q_ENUM(NetworkDeviceType) - explicit NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = 0); + explicit NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr); QDBusObjectPath objectPath() const; diff --git a/libnymea-networkmanager/networkmanager.cpp b/libnymea-networkmanager/networkmanager.cpp index 9a8fcce..18d7d1f 100644 --- a/libnymea-networkmanager/networkmanager.cpp +++ b/libnymea-networkmanager/networkmanager.cpp @@ -30,7 +30,12 @@ NetworkManager::NetworkManager(QObject *parent) : QObject(parent) { + NetworkConnection::registerTypes(); + // Get notification when network-manager appears/disappears on DBus + m_serviceWatcher = new QDBusServiceWatcher(NetworkManagerUtils::networkManagerServiceString(), QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration, this); + connect(m_serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &NetworkManager::onServiceRegistered); + connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &NetworkManager::onServiceUnregistered); } NetworkManager::~NetworkManager() @@ -67,7 +72,13 @@ QList NetworkManager::wiredNetworkDevices() const return m_wiredNetworkDevices.values(); } -/*! Returns the \l{NetworkDevice} with the given \a interface from this \l{NetworkManager}. If there is no such \a interface returns Q_NULLPTR. */ +/*! Returns the \l{NetworkSettings} from this \l{NetworkManager}. */ +NetworkSettings *NetworkManager::networkSettings() const +{ + return m_networkSettings; +} + +/*! Returns the \l{NetworkDevice} with the given \a interface from this \l{NetworkManager}. If there is no such \a interface returns nullptr. */ NetworkDevice *NetworkManager::getNetworkDevice(const QString &interface) { foreach (NetworkDevice *device, m_networkDevices.values()) { @@ -109,10 +120,11 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i return NetworkManagerErrorNetworkInterfaceNotFound; // Get wirelessNetworkDevice - WirelessNetworkDevice *wirelessNetworkDevice = 0; + WirelessNetworkDevice *wirelessNetworkDevice = nullptr; foreach (WirelessNetworkDevice *networkDevice, wirelessNetworkDevices()) { - if (networkDevice->interface() == interface) + if (networkDevice->interface() == interface) { wirelessNetworkDevice = networkDevice; + } } if (!wirelessNetworkDevice) @@ -125,6 +137,7 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i // Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html + // Create network settings for this wifi QVariantMap connectionSettings; connectionSettings.insert("autoconnect", true); connectionSettings.insert("id", ssid); @@ -174,7 +187,92 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i // Activate connection QDBusMessage query = m_networkManagerInterface->call("ActivateConnection", QVariant::fromValue(connectionObjectPath), QVariant::fromValue(wirelessNetworkDevice->objectPath()), QVariant::fromValue(accessPoint->objectPath())); - if(query.type() != QDBusMessage::ReplyMessage) { + if (query.type() != QDBusMessage::ReplyMessage) { + qCWarning(dcNetworkManager()) << query.errorName() << query.errorMessage(); + return NetworkManagerErrorWirelessConnectionFailed; + } + + return NetworkManagerErrorNoError; +} + +NetworkManager::NetworkManagerError NetworkManager::startAccessPoint(const QString &interface, const QString &ssid, const QString &password) +{ + qCDebug(dcNetworkManager()) << "Start an access point for" << interface << "SSID:" << ssid << "password:" << password; + + // Check interface + if (!getNetworkDevice(interface)) + return NetworkManagerErrorNetworkInterfaceNotFound; + + // Get wirelessNetworkDevice + WirelessNetworkDevice *wirelessNetworkDevice = nullptr; + foreach (WirelessNetworkDevice *networkDevice, wirelessNetworkDevices()) { + if (networkDevice->interface() == interface) { + wirelessNetworkDevice = networkDevice; + } + } + + if (!wirelessNetworkDevice) + return NetworkManagerErrorInvalidNetworkDeviceType; + + + // Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html + + // Create network settings for access point + QVariantMap connectionSettings; + connectionSettings.insert("id", ssid); + connectionSettings.insert("autoconnect", false); + connectionSettings.insert("uuid", QUuid::createUuid().toString().remove("{").remove("}")); + connectionSettings.insert("type", "802-11-wireless"); + + QVariantMap wirelessSettings; + wirelessSettings.insert("band", "bg"); + wirelessSettings.insert("mode", "ap"); + wirelessSettings.insert("ssid", ssid.toUtf8()); + wirelessSettings.insert("security", "802-11-wireless-security"); + // Note: disable power save mode + wirelessSettings.insert("powersave", 2); + + QVariantMap wirelessSecuritySettings; + wirelessSecuritySettings.insert("key-mgmt", "wpa-psk"); + wirelessSecuritySettings.insert("psk", password); + + QVariantMap ipv4Settings; + ipv4Settings.insert("method", "shared"); + + QVariantMap ipv6Settings; + ipv6Settings.insert("method", "auto"); + + // Build connection object + ConnectionSettings settings; + settings.insert("connection", connectionSettings); + settings.insert("802-11-wireless", wirelessSettings); + settings.insert("ipv4", ipv4Settings); + settings.insert("ipv6", ipv6Settings); + settings.insert("802-11-wireless-security", wirelessSecuritySettings); + + // Remove old configuration (if there is any) + foreach (NetworkConnection *connection, m_networkSettings->connections()) { + if (connection->id() == connectionSettings.value("id")) { + connection->deleteConnection(); + } + } + + // Add connection + QDBusObjectPath connectionObjectPath = m_networkSettings->addConnection(settings); + if (connectionObjectPath.path().isEmpty()) + return NetworkManagerErrorWirelessConnectionFailed; + + + qCDebug(dcNetworkManager()) << "Connection added" << connectionObjectPath.path(); + + // + + // Activate connection + QDBusMessage query = m_networkManagerInterface->call("ActivateConnection", + QVariant::fromValue(connectionObjectPath), + QVariant::fromValue(wirelessNetworkDevice->objectPath()), + QVariant::fromValue(QDBusObjectPath("/"))); + if (query.type() != QDBusMessage::ReplyMessage) { qCWarning(dcNetworkManager()) << query.errorName() << query.errorMessage(); return NetworkManagerErrorWirelessConnectionFailed; } @@ -229,6 +327,83 @@ bool NetworkManager::enableWireless(bool enabled) return m_networkManagerInterface->setProperty("WirelessEnabled", enabled); } +bool NetworkManager::init() +{ + if (!m_enabled) + return false; + + qCDebug(dcNetworkManager()) << "Initialize network manager"; + // Check DBus connection + if (!QDBusConnection::systemBus().isConnected()) { + qCWarning(dcNetworkManager()) << "System DBus not connected. NetworkManagre not available."; + setAvailable(false); + return false; + } + + // Create interface + m_networkManagerInterface = new QDBusInterface(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), QDBusConnection::systemBus(), this); + if(!m_networkManagerInterface->isValid()) { + qCWarning(dcNetworkManager()) << "Invalid DBus network manager interface. NetworkManagre not available."; + m_networkManagerInterface->deleteLater(); + m_networkManagerInterface = nullptr; + setAvailable(false); + return false; + } + + // Init properties + setVersion(m_networkManagerInterface->property("Version").toString()); + setState(static_cast(m_networkManagerInterface->property("State").toUInt())); + setConnectivityState(static_cast(m_networkManagerInterface->property("Connectivity").toUInt())); + setNetworkingEnabled(m_networkManagerInterface->property("NetworkingEnabled").toBool()); + setWirelessEnabled(m_networkManagerInterface->property("WirelessEnabled").toBool()); + + // Load network devices + loadDevices(); + + // Create settings + m_networkSettings = new NetworkSettings(this); + + // Connect signals + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "StateChanged", this, SLOT(onStateChanged(uint))); + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceAdded", this, SLOT(onDeviceAdded(QDBusObjectPath))); + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceRemoved", this, SLOT(onDeviceRemoved(QDBusObjectPath))); + QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); + + setAvailable(true); + qCDebug(dcNetworkManager()) << "Network manager initialized successfully."; + + return true; +} + +void NetworkManager::deinit() +{ + foreach (NetworkDevice *device, m_networkDevices) { + onDeviceRemoved(device->objectPath()); + } + + m_wiredNetworkDevices.clear(); + m_wirelessNetworkDevices.clear(); + + if (m_networkSettings) { + delete m_networkSettings; + m_networkSettings = nullptr; + } + + if (m_networkManagerInterface) { + delete m_networkManagerInterface; + m_networkManagerInterface = nullptr; + } + + setVersion(QString()); + setState(NetworkManagerStateUnknown); + setConnectivityState(NetworkManagerConnectivityStateUnknown); + setNetworkingEnabled(false); + setWirelessEnabled(false); + setAvailable(false); + + qCDebug(dcNetworkManager()) << "Netowkmanager deinitialized successfully."; +} + void NetworkManager::loadDevices() { // Get network devices @@ -271,7 +446,7 @@ void NetworkManager::setAvailable(bool available) if (m_available == available) return; - qCDebug(dcNetworkManager()) << "Service is now" << (available ? "available" : "unavailable"); + qCDebug(dcNetworkManager()) << "The network manager is now" << (available ? "available" : "unavailable"); m_available = available; emit availableChanged(m_available); } @@ -319,13 +494,13 @@ void NetworkManager::setState(const NetworkManager::NetworkManagerState &state) void NetworkManager::onServiceRegistered() { qCDebug(dcNetworkManager()) << "DBus service registered and available."; - // TODO: init stuff + init(); } void NetworkManager::onServiceUnregistered() { qCWarning(dcNetworkManager()) << "DBus service unregistered."; - // TODO: deinit stuff + deinit(); } void NetworkManager::onDeviceAdded(const QDBusObjectPath &deviceObjectPath) @@ -405,7 +580,7 @@ void NetworkManager::onPropertiesChanged(const QVariantMap &properties) setVersion(properties.value("Version").toString()); if (properties.contains("State")) - setState((NetworkManagerState)properties.value("State").toUInt()); + setState(static_cast(properties.value("State").toUInt())); if (properties.contains("Connectivity")) setConnectivityState(NetworkManagerConnectivityState(properties.value("Connectivity").toUInt())); @@ -432,84 +607,29 @@ void NetworkManager::onWiredDeviceChanged() bool NetworkManager::start() { - // Get notification when network-manager appears/disappears on DBus - m_serviceWatcher = new QDBusServiceWatcher(NetworkManagerUtils::networkManagerServiceString(), QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration, this); - connect(m_serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &NetworkManager::onServiceRegistered); - connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &NetworkManager::onServiceUnregistered); + // We want the networkmanager to run, so enable it + m_enabled = true; - // Check DBus connection - if (!QDBusConnection::systemBus().isConnected()) { - qCWarning(dcNetworkManager()) << "System DBus not connected. NetworkManagre not available."; - m_serviceWatcher->deleteLater(); - m_serviceWatcher = nullptr; - return false; + qCDebug(dcNetworkManager()) << "Start the network manager."; + if (m_available) { + qCDebug(dcNetworkManager()) << "Networkmanager already running."; + return true; } - // Create interface - m_networkManagerInterface = new QDBusInterface(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), QDBusConnection::systemBus(), this); - if(!m_networkManagerInterface->isValid()) { - qCWarning(dcNetworkManager()) << "Invalid DBus network manager interface. NetworkManagre not available."; - m_serviceWatcher->deleteLater(); - m_serviceWatcher = nullptr; - - m_networkManagerInterface->deleteLater(); - m_networkManagerInterface = nullptr; - return false; - } - - // Init properties - setVersion(m_networkManagerInterface->property("Version").toString()); - setState((NetworkManagerState)m_networkManagerInterface->property("State").toUInt()); - setConnectivityState((NetworkManagerConnectivityState)m_networkManagerInterface->property("Connectivity").toUInt()); - setNetworkingEnabled(m_networkManagerInterface->property("NetworkingEnabled").toBool()); - setWirelessEnabled(m_networkManagerInterface->property("WirelessEnabled").toBool()); - - // Load network devices - loadDevices(); - - // Create settings - m_networkSettings = new NetworkSettings(this); - - // Connect signals - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "StateChanged", this, SLOT(onStateChanged(uint))); - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceAdded", this, SLOT(onDeviceAdded(QDBusObjectPath))); - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "DeviceRemoved", this, SLOT(onDeviceRemoved(QDBusObjectPath))); - QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), NetworkManagerUtils::networkManagerPathString(), NetworkManagerUtils::networkManagerServiceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); - - setAvailable(true); - return true; + return init(); } void NetworkManager::stop() { - foreach (NetworkDevice *device, m_networkDevices) { - onDeviceRemoved(device->objectPath()); + // We want the networkmanager to stop, so disable it + m_enabled = false; + + qCDebug(dcNetworkManager()) << "Stop the network manager."; + if (!m_available) { + qCDebug(dcNetworkManager()) << "Networkmanager already stopped."; + return; } - m_wiredNetworkDevices.clear(); - m_wirelessNetworkDevices.clear(); - - if (m_networkSettings) { - delete m_networkSettings; - m_networkSettings = nullptr; - } - - if (m_networkManagerInterface) { - delete m_networkManagerInterface; - m_networkManagerInterface = nullptr; - } - - if (m_serviceWatcher) { - delete m_serviceWatcher; - m_serviceWatcher = nullptr; - } - - m_version = QString(); - m_state = NetworkManagerStateUnknown; - m_connectivityState = NetworkManagerConnectivityStateUnknown; - m_networkingEnabled = false; - m_wirelessEnabled = false; - - setAvailable(false); + deinit(); } diff --git a/libnymea-networkmanager/networkmanager.h b/libnymea-networkmanager/networkmanager.h index 351f698..5e21a89 100644 --- a/libnymea-networkmanager/networkmanager.h +++ b/libnymea-networkmanager/networkmanager.h @@ -41,8 +41,8 @@ class NetworkManager : public QObject { Q_OBJECT Q_ENUMS(NetworkManagerState) - Q_ENUMS(NetworkManagerConnectivityState) Q_ENUMS(NetworkManagerError) + Q_ENUMS(NetworkManagerConnectivityState) public: enum NetworkManagerState { @@ -80,7 +80,7 @@ public: }; Q_ENUM(NetworkManagerError) - explicit NetworkManager(QObject *parent = 0); + explicit NetworkManager(QObject *parent = nullptr); ~NetworkManager(); bool available() const; @@ -90,6 +90,7 @@ public: QList wirelessNetworkDevices() const; QList wiredNetworkDevices() const; + NetworkSettings *networkSettings() const; NetworkDevice *getNetworkDevice(const QString &interface); // Properties @@ -99,6 +100,7 @@ public: NetworkManagerConnectivityState connectivityState() const; NetworkManagerError connectWifi(const QString &interface, const QString &ssid, const QString &password, bool hidden = false); + NetworkManagerError startAccessPoint(const QString &interface, const QString &ssid, const QString &password); // Networking bool networkingEnabled() const; @@ -118,12 +120,17 @@ private: QHash m_wiredNetworkDevices; bool m_available = false; + bool m_enabled = false; + QString m_version; NetworkManagerState m_state = NetworkManagerStateUnknown; NetworkManagerConnectivityState m_connectivityState = NetworkManagerConnectivityStateUnknown; bool m_networkingEnabled = false; bool m_wirelessEnabled = false; + bool init(); + void deinit(); + void loadDevices(); static QString networkManagerStateToString(const NetworkManagerState &state); diff --git a/libnymea-networkmanager/networksettings.h b/libnymea-networkmanager/networksettings.h index 05ff477..f1b56ab 100644 --- a/libnymea-networkmanager/networksettings.h +++ b/libnymea-networkmanager/networksettings.h @@ -36,7 +36,7 @@ class NetworkSettings : public QObject { Q_OBJECT public: - explicit NetworkSettings(QObject *parent = 0); + explicit NetworkSettings(QObject *parent = nullptr); QDBusObjectPath addConnection(const ConnectionSettings &settings); QList connections() const; diff --git a/libnymea-networkmanager/wirednetworkdevice.h b/libnymea-networkmanager/wirednetworkdevice.h index 02ce8d9..10d22fd 100644 --- a/libnymea-networkmanager/wirednetworkdevice.h +++ b/libnymea-networkmanager/wirednetworkdevice.h @@ -31,7 +31,7 @@ class WiredNetworkDevice : public NetworkDevice { Q_OBJECT public: - explicit WiredNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = 0); + explicit WiredNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr); QString macAddress() const; int bitRate() const; diff --git a/libnymea-networkmanager/wirelessaccesspoint.cpp b/libnymea-networkmanager/wirelessaccesspoint.cpp index 7d5f2b4..c74e4ac 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.cpp +++ b/libnymea-networkmanager/wirelessaccesspoint.cpp @@ -43,8 +43,7 @@ /*! Constructs a new \l{WirelessAccessPoint} with the given dbus \a objectPath and \a parent. */ WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent) : QObject(parent), - m_objectPath(objectPath), - m_securityFlags(0) + m_objectPath(objectPath) { QDBusInterface accessPointInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), QDBusConnection::systemBus()); if(!accessPointInterface.isValid()) { @@ -56,9 +55,9 @@ WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObj setSsid(accessPointInterface.property("Ssid").toString()); setMacAddress(accessPointInterface.property("HwAddress").toString()); setFrequency(accessPointInterface.property("Frequency").toDouble() / 1000); - setSignalStrength(accessPointInterface.property("Strength").toUInt()); + setSignalStrength(accessPointInterface.property("Strength").toInt()); setSecurityFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("WpaFlags").toUInt())); - setIsProtected((bool)accessPointInterface.property("Flags").toUInt()); + setIsProtected(static_cast(accessPointInterface.property("Flags").toUInt())); QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); } @@ -139,7 +138,7 @@ void WirelessAccessPoint::setSecurityFlags(const WirelessAccessPoint::ApSecurity void WirelessAccessPoint::onPropertiesChanged(const QVariantMap &properties) { if (properties.contains("Strength")) - setSignalStrength(properties.value("Strength").toUInt()); + setSignalStrength(properties.value("Strength").toInt()); } diff --git a/libnymea-networkmanager/wirelessaccesspoint.h b/libnymea-networkmanager/wirelessaccesspoint.h index fd0f735..7f3ce42 100644 --- a/libnymea-networkmanager/wirelessaccesspoint.h +++ b/libnymea-networkmanager/wirelessaccesspoint.h @@ -51,7 +51,7 @@ public: }; Q_DECLARE_FLAGS(ApSecurityModes, ApSecurityMode) - explicit WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent = 0); + explicit WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent = nullptr); QDBusObjectPath objectPath() const; @@ -68,9 +68,9 @@ private: QString m_ssid; QString m_macAddress; double m_frequency; - int m_signalStrength; - bool m_isProtected; - WirelessAccessPoint::ApSecurityModes m_securityFlags; + int m_signalStrength = 0; + bool m_isProtected = false; + WirelessAccessPoint::ApSecurityModes m_securityFlags = ApSecurityModeNone; void setSsid(const QString &ssid); void setMacAddress(const QString &macAddress); diff --git a/libnymea-networkmanager/wirelessnetworkdevice.cpp b/libnymea-networkmanager/wirelessnetworkdevice.cpp index eaa5bbf..693533f 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.cpp +++ b/libnymea-networkmanager/wirelessnetworkdevice.cpp @@ -40,7 +40,7 @@ /*! Constructs a new \l{WirelessNetworkDevice} with the given dbus \a objectPath and \a parent. */ WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent) : NetworkDevice(objectPath, parent), - m_activeAccessPoint(Q_NULLPTR) + m_activeAccessPoint(nullptr) { QDBusConnection systemBus = QDBusConnection::systemBus(); if (!systemBus.isConnected()) { @@ -61,6 +61,7 @@ WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, readAccessPoints(); setMacAddress(m_wirelessInterface->property("HwAddress").toString()); + setMode(static_cast(m_wirelessInterface->property("Mode").toUInt())); setBitrate(m_wirelessInterface->property("Bitrate").toInt()); setActiveAccessPoint(qdbus_cast(m_wirelessInterface->property("ActiveAccessPoint"))); } @@ -77,6 +78,11 @@ int WirelessNetworkDevice::bitRate() const return m_bitRate; } +WirelessNetworkDevice::Mode WirelessNetworkDevice::mode() const +{ + return m_mode; +} + /*! Returns the current active \l{WirelessAccessPoint} of this \l{WirelessNetworkDevice}. */ WirelessAccessPoint *WirelessNetworkDevice::activeAccessPoint() { @@ -100,17 +106,17 @@ QList WirelessNetworkDevice::accessPoints() return m_accessPointsTable.values(); } -/*! Returns the \l{WirelessAccessPoint} with the given \a ssid. If the \l{WirelessAccessPoint} could not be found, return Q_NULLPTR. */ +/*! Returns the \l{WirelessAccessPoint} with the given \a ssid. If the \l{WirelessAccessPoint} could not be found, return nullptr. */ WirelessAccessPoint *WirelessNetworkDevice::getAccessPoint(const QString &ssid) { foreach (WirelessAccessPoint *accessPoint, m_accessPointsTable.values()) { if (accessPoint->ssid() == ssid) return accessPoint; } - return Q_NULLPTR; + return nullptr; } -/*! Returns the \l{WirelessAccessPoint} with the given \a objectPath. If the \l{WirelessAccessPoint} could not be found, return Q_NULLPTR. */ +/*! Returns the \l{WirelessAccessPoint} with the given \a objectPath. If the \l{WirelessAccessPoint} could not be found, return nullptr. */ WirelessAccessPoint *WirelessNetworkDevice::getAccessPoint(const QDBusObjectPath &objectPath) { return m_accessPointsTable.value(objectPath); @@ -141,10 +147,20 @@ void WirelessNetworkDevice::setMacAddress(const QString &macAddress) m_macAddress = macAddress; } -void WirelessNetworkDevice::setBitrate(const int &bitRate) +void WirelessNetworkDevice::setMode(WirelessNetworkDevice::Mode mode) +{ + if (m_mode == mode) + return; + + m_mode = mode; + emit modeChanged(m_mode); +} + +void WirelessNetworkDevice::setBitrate(int bitRate) { if (m_bitRate != bitRate / 1000) { m_bitRate = bitRate / 1000; + emit bitRateChanged(m_bitRate); emit deviceChanged(); } } @@ -162,7 +178,7 @@ void WirelessNetworkDevice::setActiveAccessPoint(const QDBusObjectPath &activeAc // Update the device when the signalstrength changed connect(m_activeAccessPoint, &WirelessAccessPoint::signalStrengthChanged, this, &WirelessNetworkDevice::deviceChanged); } else { - m_activeAccessPoint = Q_NULLPTR; + m_activeAccessPoint = nullptr; } emit deviceChanged(); } @@ -193,7 +209,7 @@ void WirelessNetworkDevice::accessPointRemoved(const QDBusObjectPath &objectPath WirelessAccessPoint *accessPoint = m_accessPointsTable.take(objectPath); if (accessPoint == m_activeAccessPoint) - m_activeAccessPoint = Q_NULLPTR; + m_activeAccessPoint = nullptr; //qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: [-]" << accessPoint; accessPoint->deleteLater(); @@ -208,6 +224,10 @@ void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties) if (properties.contains("ActiveAccessPoint")) setActiveAccessPoint(qdbus_cast(properties.value("ActiveAccessPoint"))); + + if (properties.contains("Mode")) + setMode(static_cast(m_wirelessInterface->property("Mode").toUInt())); + } /*! Writes the given \a device to the given to \a debug. \sa WirelessNetworkDevice, */ @@ -215,6 +235,7 @@ QDebug operator<<(QDebug debug, WirelessNetworkDevice *device) { debug.nospace() << "WirelessNetworkDevice(" << device->interface() << ", "; debug.nospace() << device->macAddress() << ", "; + debug.nospace() << device->mode() << ", "; debug.nospace() << device->bitRate() << " [Mb/s], "; debug.nospace() << device->deviceStateString() << ") "; return debug; diff --git a/libnymea-networkmanager/wirelessnetworkdevice.h b/libnymea-networkmanager/wirelessnetworkdevice.h index ed53380..f406ec8 100644 --- a/libnymea-networkmanager/wirelessnetworkdevice.h +++ b/libnymea-networkmanager/wirelessnetworkdevice.h @@ -37,12 +37,20 @@ class WirelessNetworkDevice : public NetworkDevice { Q_OBJECT public: + enum Mode { + ModeUnknown = 0, + ModeAdhoc = 1, + ModeInfrastructure = 2, + ModeAccessPoint = 3 + }; + Q_ENUM(Mode) - explicit WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = 0); + explicit WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr); // Properties QString macAddress() const; int bitRate() const; + Mode mode() const; WirelessAccessPoint *activeAccessPoint(); // Accesspoints @@ -54,11 +62,12 @@ public: void scanWirelessNetworks(); private: - QDBusInterface *m_wirelessInterface; + QDBusInterface *m_wirelessInterface = nullptr; + WirelessAccessPoint *m_activeAccessPoint = nullptr; - QString m_macAddress; int m_bitRate; - WirelessAccessPoint *m_activeAccessPoint; + QString m_macAddress; + Mode m_mode = ModeUnknown; QDBusObjectPath m_activeAccessPointObjectPath; QHash m_accessPointsTable; @@ -66,7 +75,8 @@ private: void readAccessPoints(); void setMacAddress(const QString &macAddress); - void setBitrate(const int &bitRate); + void setMode(Mode mode); + void setBitrate(int bitRate); void setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath); private slots: @@ -75,7 +85,8 @@ private slots: void propertiesChanged(const QVariantMap &properties); signals: - void bitRateChanged(const int &bitRate); + void bitRateChanged(int bitRate); + void modeChanged(Mode mode); };