@@ -0,0 +1,147 @@
1+/*
2+ * Copyright (C) 2015 Canonical Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it
5+ * under the terms of the GNU General Public License version 3, as published
6+ * by the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but
9+ * WITHOUT ANY WARRANTY; without even the implied warranties of
10+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11+ * PURPOSE. See the GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License along
14+ * with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QDebug>
18+#include <QDBusConnection>
19+
20+#include "Status.h"
21+
22+Status::Status()
23+{
24+ initNM();
25+ initUPower();
26+}
27+
28+void Status::initNM()
29+{
30+ m_nmIface = new QDBusInterface("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager",
31+ QDBusConnection::systemBus(), this);
32+
33+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager", "PropertiesChanged",
34+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
35+}
36+
37+void Status::onNMPropertiesChanged(const QVariantMap &changedProps)
38+{
39+ if (changedProps.contains("State") || changedProps.contains("Connectivity")) {
40+ Q_EMIT onlineChanged();
41+ Q_EMIT networkIconChanged();
42+ }
43+
44+ if (changedProps.contains("PrimaryConnection") || changedProps.contains("SpecificObject") || changedProps.contains("Strength")) {
45+ Q_EMIT networkIconChanged();
46+ }
47+}
48+
49+bool Status::online() const
50+{
51+ if (!m_nmIface->isValid())
52+ return false;
53+
54+ return m_nmIface->property("State").toUInt() == 70;
55+}
56+
57+QString Status::networkIcon()
58+{
59+ QString iconName = QStringLiteral("nm-no-connection");
60+
61+ if (!online()) {
62+ return iconName;
63+ }
64+
65+ const QString primaryConn = m_nmIface->property("PrimaryConnection").value<QDBusObjectPath>().path();
66+ const QString primaryConnType = m_nmIface->property("PrimaryConnectionType").toString();
67+
68+ qDebug() << "NM init, primary connection type:" << primaryConnType << ", connection:" << primaryConn;
69+
70+ if (primaryConn.isEmpty()) {
71+ qWarning() << "Empty primary connection";
72+ return iconName;
73+ }
74+
75+ if (primaryConnType == "802-11-wireless") {
76+ QDBusInterface activeConn("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", QDBusConnection::systemBus());
77+
78+ if (activeConn.isValid()) {
79+ const QString apPath = activeConn.property("SpecificObject").value<QDBusObjectPath>().path();
80+ qDebug() << "AP path:" << apPath;
81+
82+ if (apPath.isEmpty()) {
83+ qWarning() << "No AP path";
84+ return iconName;
85+ }
86+
87+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", primaryConn, "org.freedesktop.NetworkManager.Connection.Active", "PropertiesChanged",
88+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
89+
90+ QDBusInterface ap("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", QDBusConnection::systemBus());
91+
92+ if (!ap.isValid()) {
93+ qWarning() << "Invalid AP";
94+ return iconName;
95+ }
96+
97+ QDBusConnection::systemBus().connect("org.freedesktop.NetworkManager", apPath, "org.freedesktop.NetworkManager.AccessPoint", "PropertiesChanged",
98+ this, SLOT(onNMPropertiesChanged(QVariantMap)));
99+
100+ const uint strength = ap.property("Strength").toUInt();
101+ const uint flags = ap.property("Flags").toUInt();
102+ qDebug() << "Strength:" << strength;
103+ qDebug() << "Flags:" << flags;
104+
105+ if (strength == 0) {
106+ iconName = "nm-signal-00";
107+ } else if (strength <= 25) {
108+ iconName = "nm-signal-25";
109+ } else if (strength <= 50) {
110+ iconName = "nm-signal-50";
111+ } else if (strength <= 75) {
112+ iconName = "nm-signal-75";
113+ }
114+
115+ if (flags >= 1) {
116+ iconName += "-secure";
117+ }
118+ }
119+ }
120+
121+ return iconName;
122+}
123+
124+void Status::initUPower()
125+{
126+ m_upowerIface = new QDBusInterface("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.UPower.Device",
127+ QDBusConnection::systemBus(), this);
128+ QDBusConnection::systemBus().connect("org.freedesktop.UPower", "/org/freedesktop/UPower/devices/DisplayDevice", "org.freedesktop.DBus.Properties",
129+ "PropertiesChanged", this, SLOT(onUPowerPropertiesChanged(QString,QVariantMap,QStringList)));
130+}
131+
132+void Status::onUPowerPropertiesChanged(const QString &iface, const QVariantMap &changedProps, const QStringList &invalidatedProps)
133+{
134+ Q_UNUSED(iface)
135+ Q_UNUSED(invalidatedProps)
136+
137+ if (changedProps.contains("IconName")) {
138+ Q_EMIT batteryIconChanged();
139+ }
140+}
141+
142+QString Status::batteryIcon() const
143+{
144+ const QString iconName = m_upowerIface->property("IconName").toString();
145+ qDebug() << "UPower icon name:" << iconName;
146+ return iconName;
147+}