20#include "dbusinterface.h"
21#include "launchermodel.h"
22#include "launcheritem.h"
24#include <QDBusArgument>
25#include <QDBusConnection>
26#include <QDBusMessage>
29DBusInterface::DBusInterface(LauncherModel *parent):
30 LomiriDBusVirtualObject(QStringLiteral(
"/com/lomiri/Shell/Launcher"), QStringLiteral(
"com.lomiri.Shell.Launcher"), true, parent),
31 m_launcherModel(parent)
35QString DBusInterface::introspect(
const QString &path)
const
38 if (path == QLatin1String(
"/com/lomiri/Shell/Launcher/") || path == QLatin1String(
"/com/lomiri/Shell/Launcher")) {
42 nodes = QStringLiteral(
"<interface name=\"com.lomiri.Shell.Launcher\">"
43 "<method name=\"Refresh\"/>"
47 for (
int i = 0; i < m_launcherModel->rowCount(); i++) {
48 nodes.append(
"<node name=\"");
49 nodes.append(encodeAppId(m_launcherModel->get(i)->appId()));
50 nodes.append(
"\"/>\n");
56 if (!path.startsWith(QLatin1String(
"/com/lomiri/Shell/Launcher"))) {
57 return QLatin1String(
"");
62 QStringLiteral(
"<interface name=\"com.lomiri.Shell.Launcher.Item\">"
63 "<property name=\"count\" type=\"i\" access=\"readwrite\" />"
64 "<property name=\"countVisible\" type=\"b\" access=\"readwrite\" />"
65 "<property name=\"progress\" type=\"i\" access=\"readwrite\" />"
66 "<method name=\"Alert\" />"
72QString DBusInterface::decodeAppId(
const QString& path)
74 QByteArray bytes = path.toUtf8();
77 for (
int i = 0; i < bytes.size(); ++i) {
78 char chr = bytes.at(i);
82 number.append(bytes.at(i+1));
83 number.append(bytes.at(i+2));
86 char newchar = number.toUInt(&okay, 16);
88 decoded.append(newchar);
96 return QString::fromUtf8(decoded);
99QString DBusInterface::encodeAppId(
const QString& appId)
101 QByteArray bytes = appId.toUtf8();
104 for (
int i = 0; i < bytes.size(); ++i) {
105 uchar chr = bytes.at(i);
107 if ((chr >=
'a' && chr <=
'z') ||
108 (chr >=
'A' && chr <=
'Z') ||
109 (chr >=
'0' && chr <=
'9'&& i != 0)) {
112 QString hexval = QStringLiteral(
"_%1").arg(chr, 2, 16, QChar(
'0'));
113 encoded.append(hexval.toUpper());
120bool DBusInterface::handleMessage(
const QDBusMessage& message,
const QDBusConnection& connection)
123 if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
128 bool validpath =
true;
129 QString pathtemp = message.path();
130 if (!pathtemp.startsWith(QLatin1String(
"/com/lomiri/Shell/Launcher/"))) {
133 pathtemp.remove(QStringLiteral(
"/com/lomiri/Shell/Launcher/"));
134 if (pathtemp.indexOf(
'/') >= 0) {
139 QString appid = decodeAppId(pathtemp);
142 if (message.interface() == QLatin1String(
"com.lomiri.Shell.Launcher")) {
143 if (message.member() == QLatin1String(
"Refresh")) {
144 QDBusMessage reply = message.createReply();
145 Q_EMIT refreshCalled();
146 return connection.send(reply);
148 }
else if (message.interface() == QLatin1String(
"com.lomiri.Shell.Launcher.Item")) {
150 if (message.member() == QLatin1String(
"Alert") && validpath) {
151 QDBusMessage reply = message.createReply();
152 Q_EMIT alertCalled(appid);
153 return connection.send(reply);
158 if (message.interface() != QLatin1String(
"org.freedesktop.DBus.Properties")) {
162 const QList<QVariant> messageArguments = message.arguments();
163 if (message.member() == QLatin1String(
"Get") && (messageArguments.count() != 2 || messageArguments[0].toString() != QLatin1String(
"com.lomiri.Shell.Launcher.Item"))) {
167 if (message.member() == QLatin1String(
"Set") && (messageArguments.count() != 3 || messageArguments[0].toString() != QLatin1String(
"com.lomiri.Shell.Launcher.Item"))) {
175 int index = m_launcherModel->findApplication(appid);
176 LauncherItem *item =
static_cast<LauncherItem*
>(m_launcherModel->get(index));
179 if (message.member() == QLatin1String(
"Get")) {
180 QString cachedString = messageArguments[1].toString();
184 if (cachedString == QLatin1String(
"count")) {
185 retval.append(QVariant::fromValue(QDBusVariant(item->count())));
186 }
else if (cachedString == QLatin1String(
"countVisible")) {
187 retval.append(QVariant::fromValue(QDBusVariant(item->countVisible())));
188 }
else if (cachedString == QLatin1String(
"progress")) {
189 retval.append(QVariant::fromValue(QDBusVariant(item->progress())));
191 }
else if (message.member() == QLatin1String(
"Set")) {
192 QString cachedString = messageArguments[1].toString();
193 if (cachedString == QLatin1String(
"count")) {
194 int newCount = messageArguments[2].value<QDBusVariant>().variant().toInt();
195 if (!item || newCount != item->count()) {
196 Q_EMIT countChanged(appid, newCount);
197 notifyPropertyChanged(QStringLiteral(
"com.lomiri.Shell.Launcher.Item"), encodeAppId(appid), QStringLiteral(
"count"), QVariant(newCount));
199 }
else if (cachedString == QLatin1String(
"countVisible")) {
200 bool newVisible = messageArguments[2].value<QDBusVariant>().variant().toBool();
201 if (!item || newVisible != item->countVisible()) {
202 Q_EMIT countVisibleChanged(appid, newVisible);
203 notifyPropertyChanged(QStringLiteral(
"com.lomiri.Shell.Launcher.Item"), encodeAppId(appid), QStringLiteral(
"countVisible"), newVisible);
205 }
else if (cachedString == QLatin1String(
"progress")) {
206 int newProgress = messageArguments[2].value<QDBusVariant>().variant().toInt();
207 if (!item || newProgress != item->progress()) {
208 Q_EMIT progressChanged(appid, newProgress);
209 notifyPropertyChanged(QStringLiteral(
"com.lomiri.Shell.Launcher.Item"), encodeAppId(appid), QStringLiteral(
"progress"), QVariant(newProgress));
212 }
else if (message.member() == QLatin1String(
"GetAll")) {
215 all.insert(QStringLiteral(
"count"), item->count());
216 all.insert(QStringLiteral(
"countVisible"), item->countVisible());
217 all.insert(QStringLiteral(
"progress"), item->progress());
224 QDBusMessage reply = message.createReply(retval);
225 return connection.send(reply);