diff options
Diffstat (limited to 'sailfish')
-rw-r--r-- | sailfish/notificationmonitor.cpp | 79 | ||||
-rw-r--r-- | sailfish/notificationmonitor.h | 28 | ||||
-rw-r--r-- | sailfish/org.freedesktop.Notifications.xml | 17 |
3 files changed, 124 insertions, 0 deletions
diff --git a/sailfish/notificationmonitor.cpp b/sailfish/notificationmonitor.cpp new file mode 100644 index 0000000..f22ce02 --- /dev/null +++ b/sailfish/notificationmonitor.cpp @@ -0,0 +1,79 @@ +#include <QtCore/QDebug> +#include <QtGui/QIcon> +#include <QtDBus/QDBusConnection> +#include <QtDBus/QDBusConnectionInterface> + +#include "notificationmonitor.h" +#include "notifications_adaptor.h" + +static NotificationMonitor *global_monitor = 0; + +NotificationMonitor::NotificationMonitor(QObject *parent) : + QObject(parent) +{ + QDBusConnection bus = QDBusConnection::sessionBus(); + QDBusConnectionInterface *dbus = bus.interface(); + dbus->call("AddMatch", + "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); + new NotificationsAdaptor(this); + bus.registerObject("/org/freedesktop/Notifications", this); +} + +NotificationMonitor::~NotificationMonitor() +{ + QDBusConnection bus = QDBusConnection::sessionBus(); + QDBusConnectionInterface *dbus = bus.interface(); + dbus->call("RemoveMatch", + "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); +} + +NotificationMonitor *NotificationMonitor::instance() +{ + if (!global_monitor) { + global_monitor = new NotificationMonitor; + } + return global_monitor; +} + +uint NotificationMonitor::Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, const QString &body, const QStringList &actions, const QVariantHash &hints, int expire_timeout) +{ + QIcon icon; + + qDebug() << "Got notification" << app_name << app_icon << summary << body; + + // Avoid sending a reply for this method call, since we've received it + // because we're eavesdropping. + // The actual target of the method call will send the proper reply, not us. + Q_ASSERT(calledFromDBus()); + setDelayedReply(true); + + // If the notification mentions a specific icon, then use it. + // But otherwise let's prefer our builtin icons. + if (app_icon.startsWith("/")) { + icon = QIcon(app_icon); + } else if (app_icon.startsWith("file:")) { + QUrl url(app_icon); + icon = QIcon(url.toLocalFile()); + } else { + QString category = hints.value("category").toString(); + // Let's hardcode a few categories for now.. + if (!category.isEmpty()) { + qDebug() << "TODO: Category icons"; + } + } + + int count = hints.value("x-nemo-item-count").toInt(); + QDateTime dateTime = hints.value("x-nemo-timestamp").toDateTime(); + if (!dateTime.isValid()) { + dateTime = QDateTime::currentDateTime(); + } + + if (summary.isEmpty() && body.isEmpty()) { + // Avoid sending empty notifications to watch. + return 0; + } + + emit incomingNotification(app_name, icon, summary, count, body, dateTime); + + return 0; +} diff --git a/sailfish/notificationmonitor.h b/sailfish/notificationmonitor.h new file mode 100644 index 0000000..c0f7691 --- /dev/null +++ b/sailfish/notificationmonitor.h @@ -0,0 +1,28 @@ +#ifndef NOTIFICATIONMONITOR_H +#define NOTIFICATIONMONITOR_H + +#include <QtCore/QObject> +#include <QtCore/QDateTime> +#include <QtDBus/QDBusContext> + +class NotificationMonitor : public QObject, protected QDBusContext +{ + Q_OBJECT + +public: + ~NotificationMonitor(); + + static NotificationMonitor *instance(); + +signals: + void incomingNotification(const QString &sender, const QIcon &icon, const QString &summary, int count, const QString &body, const QDateTime &dateTime); + +private: + explicit NotificationMonitor(QObject *parent = 0); + +private slots: + friend class NotificationsAdaptor; + uint Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, const QString &body, const QStringList &actions, const QVariantHash &hints, int expire_timeout); +}; + +#endif // NOTIFICATIONMONITOR_H diff --git a/sailfish/org.freedesktop.Notifications.xml b/sailfish/org.freedesktop.Notifications.xml new file mode 100644 index 0000000..d3f8bef --- /dev/null +++ b/sailfish/org.freedesktop.Notifications.xml @@ -0,0 +1,17 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node> + <interface name="org.freedesktop.Notifications"> + <!-- (Partial) Desktop Notification Specification interface --> + <method name="Notify"> + <arg name="app_name" type="s" direction="in"/> + <arg name="replaces_id" type="u" direction="in"/> + <arg name="app_icon" type="s" direction="in"/> + <arg name="summary" type="s" direction="in"/> + <arg name="body" type="s" direction="in"/> + <arg name="actions" type="as" direction="in"/> + <arg name="hints" type="a{sv}" direction="in"/> + <arg name="expire_timeout" type="i" direction="in"/> + <arg name="id" type="u" direction="out"/> + <annotation name="org.qtproject.QtDBus.QtTypeName.In6" value="QVariantHash"/> + </method> +</node> |