summaryrefslogtreecommitdiff
path: root/sailfish/notificationmonitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sailfish/notificationmonitor.cpp')
-rw-r--r--sailfish/notificationmonitor.cpp79
1 files changed, 79 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;
+}