示例#1
0
static GDBusMessage *
on_filter_func (GDBusConnection *connection,
                GDBusMessage *message,
                gboolean incoming,
                gpointer user_data)
{
  GError *error = NULL;
  GDBusMessage *reply;

  if (incoming &&
      g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL &&
      g_str_equal (g_dbus_message_get_path (message), "/bork") &&
      g_str_equal (g_dbus_message_get_interface (message), "borkety.Bork") &&
      g_str_equal (g_dbus_message_get_member (message), "Echo"))
    {
      reply = g_dbus_message_new_method_reply (message);
      g_dbus_message_set_body (reply, g_dbus_message_get_body (message));
      g_dbus_connection_send_message (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error);
      if (error != NULL)
        {
          g_warning ("Couldn't send DBus message: %s", error->message);
          g_error_free (error);
        }
      g_object_unref (reply);
      g_object_unref (message);
      return NULL;
    }

  return message;
}
static GDBusMessage *
notification_filter_func (GDBusConnection *connection,
                          GDBusMessage    *message,
                          gboolean        *incoming,
                          gpointer         user_data)
{
    GDBusMessage *ret = NULL;
    gboolean transient = FALSE;
    gchar *sender_str = NULL;

    CsNotificationWatcher *watcher = CS_NOTIFICATION_WATCHER (user_data);

    if (incoming &&
        g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL &&
        g_strcmp0 (g_dbus_message_get_interface (message), NOTIFICATIONS_INTERFACE) == 0 &&
        g_strcmp0 (g_dbus_message_get_member (message), NOTIFY_METHOD) == 0)
    {
        GVariant *body = g_dbus_message_get_body (message);

        if (body != NULL &&
            g_variant_is_of_type (body, G_VARIANT_TYPE_TUPLE) &&
            g_variant_n_children (body) >= 7)
        {
            GVariant *hints, *sender;

            if (debug_mode)
            {
                GVariant *dbg_var = NULL;
                const gchar *dbg_str;

                g_printerr ("Notification received...\n");

                dbg_var = g_variant_get_child_value (body, 0);

                if (dbg_var != NULL && g_variant_is_of_type (dbg_var, G_VARIANT_TYPE_STRING))
                {
                    dbg_str = g_variant_get_string (dbg_var, NULL);

                    if (dbg_str != NULL)
                    {
                        g_printerr ("Sender: %s\n", dbg_str);
                    }
                }

                g_clear_pointer (&dbg_var, g_variant_unref);

                dbg_var = g_variant_get_child_value (body, 3);

                if (dbg_var != NULL && g_variant_is_of_type (dbg_var, G_VARIANT_TYPE_STRING))
                {
                    dbg_str = g_variant_get_string (dbg_var, NULL);

                    if (dbg_str != NULL)
                    {
                        g_printerr ("Summary: %s\n", dbg_str);
                    }
                }

                g_clear_pointer (&dbg_var, g_variant_unref);

                dbg_var = g_variant_get_child_value (body, 4);

                if (dbg_var != NULL && g_variant_is_of_type (dbg_var, G_VARIANT_TYPE_STRING))
                {
                    dbg_str = g_variant_get_string (dbg_var, NULL);

                    if (dbg_str != NULL)
                    {
                        g_printerr ("Body: %s\n", dbg_str);
                    }
                }

                g_clear_pointer (&dbg_var, g_variant_unref);
            }

            hints = g_variant_get_child_value (body, 6);

            if (hints != NULL && g_variant_is_of_type (hints, G_VARIANT_TYPE_DICTIONARY))
            {
                GVariant *transient_hint;

                transient_hint = g_variant_lookup_value (hints, "transient", NULL);

                if (transient_hint)
                {
                    transient = g_variant_get_boolean (transient_hint);
                }

                g_clear_pointer (&transient_hint, g_variant_unref);
            }

            g_clear_pointer (&hints, g_variant_unref);

            sender = g_variant_get_child_value (body, 0);

            if (sender)
            {
                sender_str = g_variant_dup_string (sender, NULL);
            }

            g_clear_pointer (&sender, g_variant_unref);
        }
    }
    else
    {
        ret = message;
    }

    if (ret == NULL && !transient)
    {
        NotificationIdleData *data = g_slice_new0 (NotificationIdleData);

        data->watcher = watcher;
        data->sender = sender_str;

        g_idle_add (idle_notify_received, data);
    }

    return ret;
}