(root)/
glib-2.79.0/
gio/
ggtknotificationbackend.c
       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  
      31  typedef struct _GGtkNotificationBackend GGtkNotificationBackend;
      32  typedef GNotificationBackendClass       GGtkNotificationBackendClass;
      33  
      34  struct _GGtkNotificationBackend
      35  {
      36    GNotificationBackend parent;
      37  };
      38  
      39  GType g_gtk_notification_backend_get_type (void);
      40  
      41  G_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  
      46  static gboolean
      47  g_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 async
      54     * backend verification. This is only run once and only contacts the
      55     * dbus daemon. */
      56  
      57    session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
      58    if (session_bus == NULL)
      59      return FALSE;
      60  
      61    reply = g_dbus_connection_call_sync (session_bus, "org.freedesktop.DBus", "/org/freedesktop/DBus",
      62                                         "org.freedesktop.DBus",
      63                                         "GetNameOwner", g_variant_new ("(s)", "org.gtk.Notifications"),
      64                                         G_VARIANT_TYPE ("(s)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
      65  
      66    g_object_unref (session_bus);
      67  
      68    if (reply)
      69      {
      70        g_variant_unref (reply);
      71        return TRUE;
      72      }
      73    else
      74      return FALSE;
      75  }
      76  
      77  static void
      78  g_gtk_notification_backend_send_notification (GNotificationBackend *backend,
      79                                                const gchar          *id,
      80                                                GNotification        *notification)
      81  {
      82    GVariant *params;
      83  
      84    params = g_variant_new ("(ss@a{sv})", g_application_get_application_id (backend->application),
      85                                          id,
      86                                          g_notification_serialize (notification));
      87  
      88    g_dbus_connection_call (backend->dbus_connection,
      89                            "org.gtk.Notifications", "/org/gtk/Notifications",
      90                            "org.gtk.Notifications", "AddNotification", params,
      91                            G_VARIANT_TYPE_UNIT,
      92                            G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
      93  }
      94  
      95  static void
      96  g_gtk_notification_backend_withdraw_notification (GNotificationBackend *backend,
      97                                                    const gchar          *id)
      98  {
      99    GVariant *params;
     100  
     101    params = g_variant_new ("(ss)", g_application_get_application_id (backend->application), id);
     102  
     103    g_dbus_connection_call (backend->dbus_connection, "org.gtk.Notifications",
     104                            "/org/gtk/Notifications", "org.gtk.Notifications",
     105                            "RemoveNotification", params, G_VARIANT_TYPE_UNIT,
     106                            G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
     107  }
     108  
     109  static void
     110  g_gtk_notification_backend_init (GGtkNotificationBackend *backend)
     111  {
     112  }
     113  
     114  static void
     115  g_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  }