1/*
2* Copyright © 2013 Lars Uebernickel
3*
4* This library is free software; you can redistribute it and/or
5* modify it under the terms of the GNU Lesser General Public
6* License as published by the Free Software Foundation; either
7* version 2.1 of the License, or (at your option) any later version.
8*
9* This library is distributed in the hope that it will be useful,
10* but WITHOUT ANY WARRANTY; without even the implied warranty of
11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12* Lesser General Public License for more details.
13*
14* You should have received a copy of the GNU Lesser General
15* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
16*
17* Authors: Lars Uebernickel <lars@uebernic.de>
18*/
19
20#include "config.h"
21#include "gnotificationbackend.h"
22
23#include "giomodule-priv.h"
24#include "gdbusconnection.h"
25#include "gapplication.h"
26#include "gnotification-private.h"
27
28#define G_TYPE_GTK_NOTIFICATION_BACKEND (g_gtk_notification_backend_get_type ())
29#define G_GTK_NOTIFICATION_BACKEND(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_GTK_NOTIFICATION_BACKEND, GGtkNotificationBackend))
30
31typedef struct _GGtkNotificationBackend GGtkNotificationBackend;
32typedef GNotificationBackendClass GGtkNotificationBackendClass;
33
34struct _GGtkNotificationBackend
35{
36 GNotificationBackend parent;
37};
38
39GType g_gtk_notification_backend_get_type (void);
40
41G_DEFINE_TYPE_WITH_CODE (GGtkNotificationBackend, g_gtk_notification_backend, G_TYPE_NOTIFICATION_BACKEND,
42 _g_io_modules_ensure_extension_points_registered ();
43 g_io_extension_point_implement (G_NOTIFICATION_BACKEND_EXTENSION_POINT_NAME,
44 g_define_type_id, "gtk", 100))
45
46static gboolean
47g_gtk_notification_backend_is_supported (void)
48{
49 GDBusConnection *session_bus;
50 GVariant *reply;
51
52 /* Find out if the notification server is running. This is a
53 * synchronous call because gio extension points don't support asnyc
54 * backend verification. This is only run once and only contacts the
55 * dbus daemon. */
56
57 session_bus = g_bus_get_sync (bus_type: G_BUS_TYPE_SESSION, NULL, NULL);
58 if (session_bus == NULL)
59 return FALSE;
60
61 reply = g_dbus_connection_call_sync (connection: session_bus, bus_name: "org.freedesktop.DBus", object_path: "/org/freedesktop/DBus",
62 interface_name: "org.freedesktop.DBus",
63 method_name: "GetNameOwner", parameters: g_variant_new (format_string: "(s)", "org.gtk.Notifications"),
64 G_VARIANT_TYPE ("(s)"), flags: G_DBUS_CALL_FLAGS_NONE, timeout_msec: -1, NULL, NULL);
65
66 g_object_unref (object: session_bus);
67
68 if (reply)
69 {
70 g_variant_unref (value: reply);
71 return TRUE;
72 }
73 else
74 return FALSE;
75}
76
77static void
78g_gtk_notification_backend_send_notification (GNotificationBackend *backend,
79 const gchar *id,
80 GNotification *notification)
81{
82 GVariant *params;
83
84 params = g_variant_new (format_string: "(ss@a{sv})", g_application_get_application_id (application: backend->application),
85 id,
86 g_notification_serialize (notification));
87
88 g_dbus_connection_call (connection: backend->dbus_connection,
89 bus_name: "org.gtk.Notifications", object_path: "/org/gtk/Notifications",
90 interface_name: "org.gtk.Notifications", method_name: "AddNotification", parameters: params,
91 G_VARIANT_TYPE_UNIT,
92 flags: G_DBUS_CALL_FLAGS_NONE, timeout_msec: -1, NULL, NULL, NULL);
93}
94
95static void
96g_gtk_notification_backend_withdraw_notification (GNotificationBackend *backend,
97 const gchar *id)
98{
99 GVariant *params;
100
101 params = g_variant_new (format_string: "(ss)", g_application_get_application_id (application: backend->application), id);
102
103 g_dbus_connection_call (connection: backend->dbus_connection, bus_name: "org.gtk.Notifications",
104 object_path: "/org/gtk/Notifications", interface_name: "org.gtk.Notifications",
105 method_name: "RemoveNotification", parameters: params, G_VARIANT_TYPE_UNIT,
106 flags: G_DBUS_CALL_FLAGS_NONE, timeout_msec: -1, NULL, NULL, NULL);
107}
108
109static void
110g_gtk_notification_backend_init (GGtkNotificationBackend *backend)
111{
112}
113
114static void
115g_gtk_notification_backend_class_init (GGtkNotificationBackendClass *class)
116{
117 GNotificationBackendClass *backend_class = G_NOTIFICATION_BACKEND_CLASS (class);
118
119 backend_class->is_supported = g_gtk_notification_backend_is_supported;
120 backend_class->send_notification = g_gtk_notification_backend_send_notification;
121 backend_class->withdraw_notification = g_gtk_notification_backend_withdraw_notification;
122}
123

source code of gtk/subprojects/glib/gio/ggtknotificationbackend.c