20 #include "dbusinterface.h"
21 #include "launchermodel.h"
22 #include "launcheritem.h"
24 #include <QDBusArgument>
25 #include <QDBusConnection>
26 #include <QDBusMessage>
29 DBusInterface::DBusInterface(LauncherModel *parent):
30 UnityDBusVirtualObject(
"/com/canonical/Unity/Launcher",
"com.canonical.Unity.Launcher", true, parent),
31 m_launcherModel(parent)
35 DBusInterface::~DBusInterface()
39 QString DBusInterface::introspect(
const QString &path)
const
42 if (path ==
"/com/canonical/Unity/Launcher/" || path ==
"/com/canonical/Unity/Launcher") {
46 nodes =
"<interface name=\"com.canonical.Unity.Launcher\">"
47 "<method name=\"Refresh\"/>"
51 for (
int i = 0; i < m_launcherModel->rowCount(); i++) {
52 nodes.append(
"<node name=\"");
53 nodes.append(encodeAppId(m_launcherModel->get(i)->appId()));
54 nodes.append(
"\"/>\n");
60 if (!path.startsWith(
"/com/canonical/Unity/Launcher")) {
66 "<interface name=\"com.canonical.Unity.Launcher.Item\">"
67 "<property name=\"count\" type=\"i\" access=\"readwrite\" />"
68 "<property name=\"countVisible\" type=\"b\" access=\"readwrite\" />"
74 QString DBusInterface::decodeAppId(
const QString& path)
76 QByteArray bytes = path.toUtf8();
79 for (
int i = 0; i < bytes.size(); ++i) {
80 char chr = bytes.at(i);
84 number.append(bytes.at(i+1));
85 number.append(bytes.at(i+2));
88 char newchar = number.toUInt(&okay, 16);
90 decoded.append(newchar);
98 return QString::fromUtf8(decoded);
101 QString DBusInterface::encodeAppId(
const QString& appId)
103 QByteArray bytes = appId.toUtf8();
106 for (
int i = 0; i < bytes.size(); ++i) {
107 uchar chr = bytes.at(i);
109 if ((chr >=
'a' && chr <=
'z') ||
110 (chr >=
'A' && chr <=
'Z') ||
111 (chr >=
'0' && chr <=
'9'&& i != 0)) {
114 QString hexval = QString(
"_%1").arg(chr, 2, 16, QChar(
'0'));
115 encoded.append(hexval.toUpper());
122 bool DBusInterface::handleMessage(
const QDBusMessage& message,
const QDBusConnection& connection)
125 if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
130 if (message.interface() ==
"com.canonical.Unity.Launcher") {
131 if (message.member() ==
"Refresh") {
132 QDBusMessage reply = message.createReply();
133 Q_EMIT refreshCalled();
134 return connection.send(reply);
139 if (message.interface() !=
"org.freedesktop.DBus.Properties") {
143 if (message.member() !=
"GetAll" && message.arguments()[0].toString() !=
"com.canonical.Unity.Launcher.Item") {
148 QString pathtemp = message.path();
149 if (!pathtemp.startsWith(
"/com/canonical/Unity/Launcher/")) {
152 pathtemp.remove(
"/com/canonical/Unity/Launcher/");
153 if (pathtemp.indexOf(
'/') >= 0) {
158 QString appid = decodeAppId(pathtemp);
159 int index = m_launcherModel->findApplication(appid);
160 LauncherItem *item =
static_cast<LauncherItem*
>(m_launcherModel->get(index));
163 if (message.member() ==
"Get") {
167 if (message.arguments()[1].toString() ==
"count") {
168 retval.append(QVariant::fromValue(QDBusVariant(item->count())));
169 }
else if (message.arguments()[1].toString() ==
"countVisible") {
170 retval.append(QVariant::fromValue(QDBusVariant(item->countVisible())));
172 }
else if (message.member() ==
"Set") {
173 if (message.arguments()[1].toString() ==
"count") {
174 int newCount = message.arguments()[2].value<QDBusVariant>().variant().toInt();
175 if (!item || newCount != item->count()) {
176 Q_EMIT countChanged(appid, newCount);
177 notifyPropertyChanged(
"com.canonical.Unity.Launcher.Item", encodeAppId(appid),
"count", QVariant(newCount));
179 }
else if (message.arguments()[1].toString() ==
"countVisible") {
180 bool newVisible = message.arguments()[2].value<QDBusVariant>().variant().toBool();
181 if (!item || newVisible != item->countVisible()) {
182 Q_EMIT countVisibleChanged(appid, newVisible);
183 notifyPropertyChanged(
"com.canonical.Unity.Launcher.Item", encodeAppId(appid),
"countVisible", newVisible);
186 }
else if (message.member() ==
"GetAll") {
189 all.insert(
"count", item->count());
190 all.insert(
"countVisible", item->countVisible());
197 QDBusMessage reply = message.createReply(retval);
198 return connection.send(reply);