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; }