summaryrefslogtreecommitdiff
path: root/sailfish
diff options
context:
space:
mode:
Diffstat (limited to 'sailfish')
-rw-r--r--sailfish/notificationmonitor.cpp79
-rw-r--r--sailfish/notificationmonitor.h28
-rw-r--r--sailfish/org.freedesktop.Notifications.xml17
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>