Update to the latest nymea-networkmanager status

This commit is contained in:
Simon Stürz 2019-09-03 15:39:34 +02:00
parent 22428e2897
commit 6baae39719
11 changed files with 277 additions and 108 deletions

View File

@ -30,8 +30,6 @@ NetworkConnection::NetworkConnection(const QDBusObjectPath &objectPath, QObject
QObject(parent), QObject(parent),
m_objectPath(objectPath) m_objectPath(objectPath)
{ {
qDBusRegisterMetaType<ConnectionSettings>();
m_connectionInterface = new QDBusInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::connectionsInterfaceString(), QDBusConnection::systemBus(), this); m_connectionInterface = new QDBusInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::connectionsInterfaceString(), QDBusConnection::systemBus(), this);
if(!m_connectionInterface->isValid()) { if(!m_connectionInterface->isValid()) {
qCWarning(dcNetworkManager()) << "Invalid connection dbus interface"; qCWarning(dcNetworkManager()) << "Invalid connection dbus interface";
@ -49,6 +47,10 @@ NetworkConnection::NetworkConnection(const QDBusObjectPath &objectPath, QObject
const QDBusArgument &argument = query.arguments().at(0).value<QDBusArgument>(); const QDBusArgument &argument = query.arguments().at(0).value<QDBusArgument>();
m_connectionSettings = qdbus_cast<ConnectionSettings>(argument); m_connectionSettings = qdbus_cast<ConnectionSettings>(argument);
// foreach (const QVariant &connectionVariant, m_connectionSettings.values()) {
// qCDebug(dcNetworkManager()) << connectionVariant;
// }
} }
/*! Delete this \l{NetworkConnection} in the \l{NetworkManager}. */ /*! Delete this \l{NetworkConnection} in the \l{NetworkManager}. */
@ -60,6 +62,12 @@ void NetworkConnection::deleteConnection()
} }
void NetworkConnection::registerTypes()
{
qRegisterMetaType<ConnectionSettings>("ConnectionSettings");
qDBusRegisterMetaType<ConnectionSettings>();
}
/*! Returns the dbus object path of this \l{NetworkConnection}. */ /*! Returns the dbus object path of this \l{NetworkConnection}. */
QDBusObjectPath NetworkConnection::objectPath() const QDBusObjectPath NetworkConnection::objectPath() const
{ {

View File

@ -38,10 +38,12 @@ class NetworkConnection : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit NetworkConnection(const QDBusObjectPath &objectPath, QObject *parent = 0); explicit NetworkConnection(const QDBusObjectPath &objectPath, QObject *parent = nullptr);
void deleteConnection(); void deleteConnection();
static void registerTypes();
QDBusObjectPath objectPath() const; QDBusObjectPath objectPath() const;
ConnectionSettings connectionSettings() const; ConnectionSettings connectionSettings() const;
@ -60,6 +62,7 @@ private:
ConnectionSettings m_connectionSettings; ConnectionSettings m_connectionSettings;
}; };
Q_DECLARE_METATYPE(ConnectionSettings)
QDebug operator<<(QDebug debug, NetworkConnection *networkConnection); QDebug operator<<(QDebug debug, NetworkConnection *networkConnection);
#endif // NETWORKCONNECTION_H #endif // NETWORKCONNECTION_H

View File

@ -147,7 +147,7 @@ public:
}; };
Q_ENUM(NetworkDeviceType) Q_ENUM(NetworkDeviceType)
explicit NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = 0); explicit NetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr);
QDBusObjectPath objectPath() const; QDBusObjectPath objectPath() const;

View File

@ -30,7 +30,12 @@
NetworkManager::NetworkManager(QObject *parent) : NetworkManager::NetworkManager(QObject *parent) :
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() NetworkManager::~NetworkManager()
@ -67,7 +72,13 @@ QList<WiredNetworkDevice *> NetworkManager::wiredNetworkDevices() const
return m_wiredNetworkDevices.values(); 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) NetworkDevice *NetworkManager::getNetworkDevice(const QString &interface)
{ {
foreach (NetworkDevice *device, m_networkDevices.values()) { foreach (NetworkDevice *device, m_networkDevices.values()) {
@ -109,10 +120,11 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
return NetworkManagerErrorNetworkInterfaceNotFound; return NetworkManagerErrorNetworkInterfaceNotFound;
// Get wirelessNetworkDevice // Get wirelessNetworkDevice
WirelessNetworkDevice *wirelessNetworkDevice = 0; WirelessNetworkDevice *wirelessNetworkDevice = nullptr;
foreach (WirelessNetworkDevice *networkDevice, wirelessNetworkDevices()) { foreach (WirelessNetworkDevice *networkDevice, wirelessNetworkDevices()) {
if (networkDevice->interface() == interface) if (networkDevice->interface() == interface) {
wirelessNetworkDevice = networkDevice; wirelessNetworkDevice = networkDevice;
}
} }
if (!wirelessNetworkDevice) if (!wirelessNetworkDevice)
@ -125,6 +137,7 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
// Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html // Note: https://developer.gnome.org/NetworkManager/stable/ref-settings.html
// Create network settings for this wifi
QVariantMap connectionSettings; QVariantMap connectionSettings;
connectionSettings.insert("autoconnect", true); connectionSettings.insert("autoconnect", true);
connectionSettings.insert("id", ssid); connectionSettings.insert("id", ssid);
@ -174,7 +187,92 @@ NetworkManager::NetworkManagerError NetworkManager::connectWifi(const QString &i
// Activate connection // Activate connection
QDBusMessage query = m_networkManagerInterface->call("ActivateConnection", QVariant::fromValue(connectionObjectPath), QVariant::fromValue(wirelessNetworkDevice->objectPath()), QVariant::fromValue(accessPoint->objectPath())); 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(); qCWarning(dcNetworkManager()) << query.errorName() << query.errorMessage();
return NetworkManagerErrorWirelessConnectionFailed; return NetworkManagerErrorWirelessConnectionFailed;
} }
@ -229,6 +327,83 @@ bool NetworkManager::enableWireless(bool enabled)
return m_networkManagerInterface->setProperty("WirelessEnabled", 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<NetworkManagerState>(m_networkManagerInterface->property("State").toUInt()));
setConnectivityState(static_cast<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);
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() void NetworkManager::loadDevices()
{ {
// Get network devices // Get network devices
@ -271,7 +446,7 @@ void NetworkManager::setAvailable(bool available)
if (m_available == available) if (m_available == available)
return; return;
qCDebug(dcNetworkManager()) << "Service is now" << (available ? "available" : "unavailable"); qCDebug(dcNetworkManager()) << "The network manager is now" << (available ? "available" : "unavailable");
m_available = available; m_available = available;
emit availableChanged(m_available); emit availableChanged(m_available);
} }
@ -319,13 +494,13 @@ void NetworkManager::setState(const NetworkManager::NetworkManagerState &state)
void NetworkManager::onServiceRegistered() void NetworkManager::onServiceRegistered()
{ {
qCDebug(dcNetworkManager()) << "DBus service registered and available."; qCDebug(dcNetworkManager()) << "DBus service registered and available.";
// TODO: init stuff init();
} }
void NetworkManager::onServiceUnregistered() void NetworkManager::onServiceUnregistered()
{ {
qCWarning(dcNetworkManager()) << "DBus service unregistered."; qCWarning(dcNetworkManager()) << "DBus service unregistered.";
// TODO: deinit stuff deinit();
} }
void NetworkManager::onDeviceAdded(const QDBusObjectPath &deviceObjectPath) void NetworkManager::onDeviceAdded(const QDBusObjectPath &deviceObjectPath)
@ -405,7 +580,7 @@ void NetworkManager::onPropertiesChanged(const QVariantMap &properties)
setVersion(properties.value("Version").toString()); setVersion(properties.value("Version").toString());
if (properties.contains("State")) if (properties.contains("State"))
setState((NetworkManagerState)properties.value("State").toUInt()); setState(static_cast<NetworkManagerState>(properties.value("State").toUInt()));
if (properties.contains("Connectivity")) if (properties.contains("Connectivity"))
setConnectivityState(NetworkManagerConnectivityState(properties.value("Connectivity").toUInt())); setConnectivityState(NetworkManagerConnectivityState(properties.value("Connectivity").toUInt()));
@ -432,84 +607,29 @@ void NetworkManager::onWiredDeviceChanged()
bool NetworkManager::start() bool NetworkManager::start()
{ {
// Get notification when network-manager appears/disappears on DBus // We want the networkmanager to run, so enable it
m_serviceWatcher = new QDBusServiceWatcher(NetworkManagerUtils::networkManagerServiceString(), QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration, this); m_enabled = true;
connect(m_serviceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &NetworkManager::onServiceRegistered);
connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, this, &NetworkManager::onServiceUnregistered);
// Check DBus connection qCDebug(dcNetworkManager()) << "Start the network manager.";
if (!QDBusConnection::systemBus().isConnected()) { if (m_available) {
qCWarning(dcNetworkManager()) << "System DBus not connected. NetworkManagre not available."; qCDebug(dcNetworkManager()) << "Networkmanager already running.";
m_serviceWatcher->deleteLater(); return true;
m_serviceWatcher = nullptr;
return false;
} }
// Create interface return init();
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;
} }
void NetworkManager::stop() void NetworkManager::stop()
{ {
foreach (NetworkDevice *device, m_networkDevices) { // We want the networkmanager to stop, so disable it
onDeviceRemoved(device->objectPath()); m_enabled = false;
qCDebug(dcNetworkManager()) << "Stop the network manager.";
if (!m_available) {
qCDebug(dcNetworkManager()) << "Networkmanager already stopped.";
return;
} }
m_wiredNetworkDevices.clear(); deinit();
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);
} }

View File

@ -41,8 +41,8 @@ class NetworkManager : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_ENUMS(NetworkManagerState) Q_ENUMS(NetworkManagerState)
Q_ENUMS(NetworkManagerConnectivityState)
Q_ENUMS(NetworkManagerError) Q_ENUMS(NetworkManagerError)
Q_ENUMS(NetworkManagerConnectivityState)
public: public:
enum NetworkManagerState { enum NetworkManagerState {
@ -80,7 +80,7 @@ public:
}; };
Q_ENUM(NetworkManagerError) Q_ENUM(NetworkManagerError)
explicit NetworkManager(QObject *parent = 0); explicit NetworkManager(QObject *parent = nullptr);
~NetworkManager(); ~NetworkManager();
bool available() const; bool available() const;
@ -90,6 +90,7 @@ public:
QList<WirelessNetworkDevice *> wirelessNetworkDevices() const; QList<WirelessNetworkDevice *> wirelessNetworkDevices() const;
QList<WiredNetworkDevice *> wiredNetworkDevices() const; QList<WiredNetworkDevice *> wiredNetworkDevices() const;
NetworkSettings *networkSettings() const;
NetworkDevice *getNetworkDevice(const QString &interface); NetworkDevice *getNetworkDevice(const QString &interface);
// Properties // Properties
@ -99,6 +100,7 @@ public:
NetworkManagerConnectivityState connectivityState() const; NetworkManagerConnectivityState connectivityState() const;
NetworkManagerError connectWifi(const QString &interface, const QString &ssid, const QString &password, bool hidden = false); 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 // Networking
bool networkingEnabled() const; bool networkingEnabled() const;
@ -118,12 +120,17 @@ private:
QHash<QDBusObjectPath, WiredNetworkDevice *> m_wiredNetworkDevices; QHash<QDBusObjectPath, WiredNetworkDevice *> m_wiredNetworkDevices;
bool m_available = false; bool m_available = false;
bool m_enabled = false;
QString m_version; QString m_version;
NetworkManagerState m_state = NetworkManagerStateUnknown; NetworkManagerState m_state = NetworkManagerStateUnknown;
NetworkManagerConnectivityState m_connectivityState = NetworkManagerConnectivityStateUnknown; NetworkManagerConnectivityState m_connectivityState = NetworkManagerConnectivityStateUnknown;
bool m_networkingEnabled = false; bool m_networkingEnabled = false;
bool m_wirelessEnabled = false; bool m_wirelessEnabled = false;
bool init();
void deinit();
void loadDevices(); void loadDevices();
static QString networkManagerStateToString(const NetworkManagerState &state); static QString networkManagerStateToString(const NetworkManagerState &state);

View File

@ -36,7 +36,7 @@ class NetworkSettings : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit NetworkSettings(QObject *parent = 0); explicit NetworkSettings(QObject *parent = nullptr);
QDBusObjectPath addConnection(const ConnectionSettings &settings); QDBusObjectPath addConnection(const ConnectionSettings &settings);
QList<NetworkConnection *> connections() const; QList<NetworkConnection *> connections() const;

View File

@ -31,7 +31,7 @@ class WiredNetworkDevice : public NetworkDevice
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit WiredNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = 0); explicit WiredNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent = nullptr);
QString macAddress() const; QString macAddress() const;
int bitRate() const; int bitRate() const;

View File

@ -43,8 +43,7 @@
/*! Constructs a new \l{WirelessAccessPoint} with the given dbus \a objectPath and \a parent. */ /*! Constructs a new \l{WirelessAccessPoint} with the given dbus \a objectPath and \a parent. */
WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent) : WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent) :
QObject(parent), QObject(parent),
m_objectPath(objectPath), m_objectPath(objectPath)
m_securityFlags(0)
{ {
QDBusInterface accessPointInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), QDBusConnection::systemBus()); QDBusInterface accessPointInterface(NetworkManagerUtils::networkManagerServiceString(), m_objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), QDBusConnection::systemBus());
if(!accessPointInterface.isValid()) { if(!accessPointInterface.isValid()) {
@ -56,9 +55,9 @@ WirelessAccessPoint::WirelessAccessPoint(const QDBusObjectPath &objectPath, QObj
setSsid(accessPointInterface.property("Ssid").toString()); setSsid(accessPointInterface.property("Ssid").toString());
setMacAddress(accessPointInterface.property("HwAddress").toString()); setMacAddress(accessPointInterface.property("HwAddress").toString());
setFrequency(accessPointInterface.property("Frequency").toDouble() / 1000); setFrequency(accessPointInterface.property("Frequency").toDouble() / 1000);
setSignalStrength(accessPointInterface.property("Strength").toUInt()); setSignalStrength(accessPointInterface.property("Strength").toInt());
setSecurityFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("WpaFlags").toUInt())); setSecurityFlags(WirelessAccessPoint::ApSecurityModes(accessPointInterface.property("WpaFlags").toUInt()));
setIsProtected((bool)accessPointInterface.property("Flags").toUInt()); setIsProtected(static_cast<bool>(accessPointInterface.property("Flags").toUInt()));
QDBusConnection::systemBus().connect(NetworkManagerUtils::networkManagerServiceString(), objectPath.path(), NetworkManagerUtils::accessPointInterfaceString(), "PropertiesChanged", this, SLOT(onPropertiesChanged(QVariantMap))); 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) void WirelessAccessPoint::onPropertiesChanged(const QVariantMap &properties)
{ {
if (properties.contains("Strength")) if (properties.contains("Strength"))
setSignalStrength(properties.value("Strength").toUInt()); setSignalStrength(properties.value("Strength").toInt());
} }

View File

@ -51,7 +51,7 @@ public:
}; };
Q_DECLARE_FLAGS(ApSecurityModes, ApSecurityMode) Q_DECLARE_FLAGS(ApSecurityModes, ApSecurityMode)
explicit WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent = 0); explicit WirelessAccessPoint(const QDBusObjectPath &objectPath, QObject *parent = nullptr);
QDBusObjectPath objectPath() const; QDBusObjectPath objectPath() const;
@ -68,9 +68,9 @@ private:
QString m_ssid; QString m_ssid;
QString m_macAddress; QString m_macAddress;
double m_frequency; double m_frequency;
int m_signalStrength; int m_signalStrength = 0;
bool m_isProtected; bool m_isProtected = false;
WirelessAccessPoint::ApSecurityModes m_securityFlags; WirelessAccessPoint::ApSecurityModes m_securityFlags = ApSecurityModeNone;
void setSsid(const QString &ssid); void setSsid(const QString &ssid);
void setMacAddress(const QString &macAddress); void setMacAddress(const QString &macAddress);

View File

@ -40,7 +40,7 @@
/*! Constructs a new \l{WirelessNetworkDevice} with the given dbus \a objectPath and \a parent. */ /*! Constructs a new \l{WirelessNetworkDevice} with the given dbus \a objectPath and \a parent. */
WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent) : WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath, QObject *parent) :
NetworkDevice(objectPath, parent), NetworkDevice(objectPath, parent),
m_activeAccessPoint(Q_NULLPTR) m_activeAccessPoint(nullptr)
{ {
QDBusConnection systemBus = QDBusConnection::systemBus(); QDBusConnection systemBus = QDBusConnection::systemBus();
if (!systemBus.isConnected()) { if (!systemBus.isConnected()) {
@ -61,6 +61,7 @@ WirelessNetworkDevice::WirelessNetworkDevice(const QDBusObjectPath &objectPath,
readAccessPoints(); readAccessPoints();
setMacAddress(m_wirelessInterface->property("HwAddress").toString()); setMacAddress(m_wirelessInterface->property("HwAddress").toString());
setMode(static_cast<Mode>(m_wirelessInterface->property("Mode").toUInt()));
setBitrate(m_wirelessInterface->property("Bitrate").toInt()); setBitrate(m_wirelessInterface->property("Bitrate").toInt());
setActiveAccessPoint(qdbus_cast<QDBusObjectPath>(m_wirelessInterface->property("ActiveAccessPoint"))); setActiveAccessPoint(qdbus_cast<QDBusObjectPath>(m_wirelessInterface->property("ActiveAccessPoint")));
} }
@ -77,6 +78,11 @@ int WirelessNetworkDevice::bitRate() const
return m_bitRate; return m_bitRate;
} }
WirelessNetworkDevice::Mode WirelessNetworkDevice::mode() const
{
return m_mode;
}
/*! Returns the current active \l{WirelessAccessPoint} of this \l{WirelessNetworkDevice}. */ /*! Returns the current active \l{WirelessAccessPoint} of this \l{WirelessNetworkDevice}. */
WirelessAccessPoint *WirelessNetworkDevice::activeAccessPoint() WirelessAccessPoint *WirelessNetworkDevice::activeAccessPoint()
{ {
@ -100,17 +106,17 @@ QList<WirelessAccessPoint *> WirelessNetworkDevice::accessPoints()
return m_accessPointsTable.values(); 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) WirelessAccessPoint *WirelessNetworkDevice::getAccessPoint(const QString &ssid)
{ {
foreach (WirelessAccessPoint *accessPoint, m_accessPointsTable.values()) { foreach (WirelessAccessPoint *accessPoint, m_accessPointsTable.values()) {
if (accessPoint->ssid() == ssid) if (accessPoint->ssid() == ssid)
return accessPoint; 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) WirelessAccessPoint *WirelessNetworkDevice::getAccessPoint(const QDBusObjectPath &objectPath)
{ {
return m_accessPointsTable.value(objectPath); return m_accessPointsTable.value(objectPath);
@ -141,10 +147,20 @@ void WirelessNetworkDevice::setMacAddress(const QString &macAddress)
m_macAddress = 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) { if (m_bitRate != bitRate / 1000) {
m_bitRate = bitRate / 1000; m_bitRate = bitRate / 1000;
emit bitRateChanged(m_bitRate);
emit deviceChanged(); emit deviceChanged();
} }
} }
@ -162,7 +178,7 @@ void WirelessNetworkDevice::setActiveAccessPoint(const QDBusObjectPath &activeAc
// Update the device when the signalstrength changed // Update the device when the signalstrength changed
connect(m_activeAccessPoint, &WirelessAccessPoint::signalStrengthChanged, this, &WirelessNetworkDevice::deviceChanged); connect(m_activeAccessPoint, &WirelessAccessPoint::signalStrengthChanged, this, &WirelessNetworkDevice::deviceChanged);
} else { } else {
m_activeAccessPoint = Q_NULLPTR; m_activeAccessPoint = nullptr;
} }
emit deviceChanged(); emit deviceChanged();
} }
@ -193,7 +209,7 @@ void WirelessNetworkDevice::accessPointRemoved(const QDBusObjectPath &objectPath
WirelessAccessPoint *accessPoint = m_accessPointsTable.take(objectPath); WirelessAccessPoint *accessPoint = m_accessPointsTable.take(objectPath);
if (accessPoint == m_activeAccessPoint) if (accessPoint == m_activeAccessPoint)
m_activeAccessPoint = Q_NULLPTR; m_activeAccessPoint = nullptr;
//qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: [-]" << accessPoint; //qCDebug(dcNetworkManager()) << "WirelessNetworkDevice: [-]" << accessPoint;
accessPoint->deleteLater(); accessPoint->deleteLater();
@ -208,6 +224,10 @@ void WirelessNetworkDevice::propertiesChanged(const QVariantMap &properties)
if (properties.contains("ActiveAccessPoint")) if (properties.contains("ActiveAccessPoint"))
setActiveAccessPoint(qdbus_cast<QDBusObjectPath>(properties.value("ActiveAccessPoint"))); setActiveAccessPoint(qdbus_cast<QDBusObjectPath>(properties.value("ActiveAccessPoint")));
if (properties.contains("Mode"))
setMode(static_cast<Mode>(m_wirelessInterface->property("Mode").toUInt()));
} }
/*! Writes the given \a device to the given to \a debug. \sa WirelessNetworkDevice, */ /*! 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() << "WirelessNetworkDevice(" << device->interface() << ", ";
debug.nospace() << device->macAddress() << ", "; debug.nospace() << device->macAddress() << ", ";
debug.nospace() << device->mode() << ", ";
debug.nospace() << device->bitRate() << " [Mb/s], "; debug.nospace() << device->bitRate() << " [Mb/s], ";
debug.nospace() << device->deviceStateString() << ") "; debug.nospace() << device->deviceStateString() << ") ";
return debug; return debug;

View File

@ -37,12 +37,20 @@ class WirelessNetworkDevice : public NetworkDevice
{ {
Q_OBJECT Q_OBJECT
public: 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 // Properties
QString macAddress() const; QString macAddress() const;
int bitRate() const; int bitRate() const;
Mode mode() const;
WirelessAccessPoint *activeAccessPoint(); WirelessAccessPoint *activeAccessPoint();
// Accesspoints // Accesspoints
@ -54,11 +62,12 @@ public:
void scanWirelessNetworks(); void scanWirelessNetworks();
private: private:
QDBusInterface *m_wirelessInterface; QDBusInterface *m_wirelessInterface = nullptr;
WirelessAccessPoint *m_activeAccessPoint = nullptr;
QString m_macAddress;
int m_bitRate; int m_bitRate;
WirelessAccessPoint *m_activeAccessPoint; QString m_macAddress;
Mode m_mode = ModeUnknown;
QDBusObjectPath m_activeAccessPointObjectPath; QDBusObjectPath m_activeAccessPointObjectPath;
QHash<QDBusObjectPath, WirelessAccessPoint *> m_accessPointsTable; QHash<QDBusObjectPath, WirelessAccessPoint *> m_accessPointsTable;
@ -66,7 +75,8 @@ private:
void readAccessPoints(); void readAccessPoints();
void setMacAddress(const QString &macAddress); void setMacAddress(const QString &macAddress);
void setBitrate(const int &bitRate); void setMode(Mode mode);
void setBitrate(int bitRate);
void setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath); void setActiveAccessPoint(const QDBusObjectPath &activeAccessPointObjectPath);
private slots: private slots:
@ -75,7 +85,8 @@ private slots:
void propertiesChanged(const QVariantMap &properties); void propertiesChanged(const QVariantMap &properties);
signals: signals:
void bitRateChanged(const int &bitRate); void bitRateChanged(int bitRate);
void modeChanged(Mode mode);
}; };