diff options
Diffstat (limited to 'sailfish/notificationmonitor.cpp')
-rw-r--r-- | sailfish/notificationmonitor.cpp | 79 |
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; +} |