1 /***************************************************************************
4 * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
20 ***************************************************************************/
22 #include "dbusnotification.h"
23 #include "dbusnotificationprotocol.h"
25 #include <KConfigGroup>
28 #include <plasma/dataenginemanager.h>
29 #include <plasma/service.h>
35 static const char *engineName
= "notifications";
37 DBusNotificationProtocol::DBusNotificationProtocol(QObject
*parent
)
44 DBusNotificationProtocol::~DBusNotificationProtocol()
47 Plasma::DataEngineManager::self()->unloadEngine(engineName
);
52 void DBusNotificationProtocol::init()
54 m_engine
= Plasma::DataEngineManager::self()->loadEngine(engineName
);
56 if (!m_engine
->isValid()) {
61 connect(m_engine
, SIGNAL(sourceAdded(const QString
&)),
62 this, SLOT(prepareNotification(const QString
&)));
63 connect(m_engine
, SIGNAL(sourceRemoved(const QString
&)),
64 this, SLOT(removeNotification(const QString
&)));
68 void DBusNotificationProtocol::prepareNotification(const QString
&source
)
70 m_engine
->connectSource(source
, this);
74 void DBusNotificationProtocol::dataUpdated(const QString
&source
, const Plasma::DataEngine::Data
&data
)
76 bool isNew
= !m_notifications
.contains(source
);
79 m_notifications
[source
] = new DBusNotification(source
, this);
80 connect(m_notifications
[source
], SIGNAL(notificationDeleted(const QString
&)),
81 this, SLOT(removeNotification(const QString
&)));
82 connect(m_notifications
[source
], SIGNAL(actionTriggered(const QString
&, const QString
&)),
83 this, SLOT(relayAction(const QString
&, const QString
&)));
86 DBusNotification
* notification
= m_notifications
[source
];
87 notification
->setApplicationName(data
.value("appName").toString());
88 notification
->setApplicationIcon(KIcon(data
.value("appIcon").toString()));
89 notification
->setEventId(data
.value("eventId").toString());
90 notification
->setSummary(data
.value("summary").toString());
91 notification
->setMessage(data
.value("body").toString());
92 notification
->setTimeout(data
.value("expireTimeout").toInt());
94 QStringList codedActions
= data
.value("actions").toStringList();
95 if (codedActions
.count() % 2 != 0) {
96 kDebug() << "Invalid actions" << codedActions
<< "from" << notification
->applicationName();
100 QHash
<QString
, QString
> actions
;
101 QStringList actionOrder
;
103 while (!codedActions
.isEmpty()) {
104 QString actionId
= codedActions
.takeFirst();
105 QString actionName
= codedActions
.takeFirst();
106 actions
.insert(actionId
, actionName
);
107 actionOrder
.append(actionId
);
110 notification
->setActions(actions
);
111 notification
->setActionOrder(actionOrder
);
114 emit
notificationCreated(notification
);
116 emit notification
->changed(notification
);
121 void DBusNotificationProtocol::relayAction(const QString
&source
, const QString
&actionId
)
123 Plasma::Service
*service
= m_engine
->serviceForSource(source
);
124 KConfigGroup op
= service
->operationDescription("invokeAction");
127 op
.writeEntry("actionId", actionId
);
128 service
->startOperationCall(op
);
130 kDebug() << "invalid operation";
135 void DBusNotificationProtocol::removeNotification(const QString
&source
)
137 if (m_notifications
.contains(source
)) {
138 m_notifications
.take(source
)->deleteLater();
144 #include "dbusnotificationprotocol.moc"