/*
* Copyright (C) 2015 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include
#include
#include "Status.h"
Status::Status()
{
initNM();
initUPower();
}
void Status::initNM()
{
m_nmIface = new QDBusInterface("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager",
QDBusConnection::systemBus(), this);
QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager", "PropertiesChanged",
this, SLOT(onNMPropertiesChanged(QVariantMap)));
}
void Status::onNMPropertiesChanged(const QVariantMap &changedProps)
{
if (changedProps.contains("State") || changedProps.contains("Connectivity")) {
Q_EMIT onlineChanged();
Q_EMIT networkIconChanged();
}
if (changedProps.contains("PrimaryConnection") || changedProps.contains("SpecificObject") || changedProps.contains("Strength")) {
Q_EMIT networkIconChanged();
}
}
bool Status::online() const
{
if (!m_nmIface->isValid())
return false;
return m_nmIface->property("State").toUInt() == 70;
}
QString Status::networkIcon()
{
QString iconName = QStringLiteral("nm-no-connection");
if (!online()) {
return iconName;
}
const QString primaryConn = m_nmIface->property("PrimaryConnection").value().path();
const QString primaryConnType = m_nmIface->property("PrimaryConnectionType").toString();
if (primaryConn.isEmpty()) {
qWarning() << "Empty primary connection";
return iconName;
}
if (primaryConnType == "802-11-wireless") {
QDBusInterface activeConn("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", QDBusConnection::systemBus());
if (activeConn.isValid()) {
const QString apPath = activeConn.property("SpecificObject").value().path();
if (apPath.isEmpty()) {
qWarning() << "No AP path";
return iconName;
}
QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", "PropertiesChanged",
this, SLOT(onNMPropertiesChanged(QVariantMap)));
QDBusInterface ap("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", QDBusConnection::systemBus());
if (!ap.isValid()) {
qWarning() << "Invalid AP";
return iconName;
}
QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", "PropertiesChanged",
this, SLOT(onNMPropertiesChanged(QVariantMap)));
const uint strength = ap.property("Strength").toUInt();
const uint flags = ap.property("Flags").toUInt();
if (strength == 0) {
iconName = "nm-signal-00";
} else if (strength <= 25) {
iconName = "nm-signal-25";
} else if (strength <= 50) {
iconName = "nm-signal-50";
} else if (strength <= 75) {
iconName = "nm-signal-75";
} else if (strength <= 100) {
iconName = "nm-signal-100";
}
if (flags >= 1) {
iconName += "-secure";
}
}
}
return iconName;
}
void Status::initUPower()
{
m_upowerIface = new QDBusInterface("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.UPower.Device",
QDBusConnection::systemBus(), this);
QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.DBus.Properties",
"PropertiesChanged", this, SLOT(onUPowerPropertiesChanged(QString,QVariantMap,QStringList)));
}
void Status::onUPowerPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
{
Q_UNUSED(iface)
Q_UNUSED(invalidatedProps)
if (changedProps.contains("IconName")) {
Q_EMIT batteryIconChanged();
}
}
QString Status::batteryIcon() const
{
const QString iconName = m_upowerIface->property("IconName").toString();
return iconName;
}