mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-27 17:52:58 +02:00
Bug 624546 – Modification of GDBusMessage in filter function
Rework filter functions as per https://bugzilla.gnome.org/show_bug.cgi?id=624546#c8 This commit breaks ABI. However, this ABI break affects only applications using filter functions. The only known user of is dconf. Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
@@ -468,14 +468,15 @@ _g_dbus_worker_emit_message_received (GDBusWorker *worker,
|
||||
worker->message_received_callback (worker, message, worker->user_data);
|
||||
}
|
||||
|
||||
static GDBusMessageFilterResult
|
||||
static GDBusMessage *
|
||||
_g_dbus_worker_emit_message_about_to_be_sent (GDBusWorker *worker,
|
||||
GDBusMessage *message)
|
||||
{
|
||||
GDBusMessageFilterResult ret;
|
||||
ret = G_DBUS_MESSAGE_FILTER_RESULT_NO_EFFECT;
|
||||
GDBusMessage *ret;
|
||||
if (!worker->stopped)
|
||||
ret = worker->message_about_to_be_sent_callback (worker, message, worker->user_data);
|
||||
else
|
||||
ret = message;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1243,28 +1244,35 @@ maybe_write_next_message (GDBusWorker *worker)
|
||||
*/
|
||||
if (data != NULL)
|
||||
{
|
||||
GDBusMessageFilterResult filter_result;
|
||||
guint32 old_serial;
|
||||
GDBusMessage *old_message;
|
||||
guchar *new_blob;
|
||||
gsize new_blob_size;
|
||||
GError *error;
|
||||
|
||||
filter_result = _g_dbus_worker_emit_message_about_to_be_sent (worker, data->message);
|
||||
switch (filter_result)
|
||||
old_message = data->message;
|
||||
old_serial = g_dbus_message_get_serial (old_message);
|
||||
data->message = _g_dbus_worker_emit_message_about_to_be_sent (worker, data->message);
|
||||
if (data->message == old_message)
|
||||
{
|
||||
case G_DBUS_MESSAGE_FILTER_RESULT_NO_EFFECT:
|
||||
/* do nothing */
|
||||
break;
|
||||
|
||||
case G_DBUS_MESSAGE_FILTER_RESULT_MESSAGE_CONSUMED:
|
||||
/* drop message */
|
||||
/* filters had no effect - do nothing */
|
||||
}
|
||||
else if (data->message == NULL)
|
||||
{
|
||||
/* filters dropped message */
|
||||
g_mutex_lock (worker->write_lock);
|
||||
worker->num_writes_pending -= 1;
|
||||
g_mutex_unlock (worker->write_lock);
|
||||
message_to_write_data_free (data);
|
||||
goto write_next;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* filters altered the message -> reencode */
|
||||
|
||||
if (g_dbus_message_get_serial (data->message) == 0)
|
||||
g_dbus_message_set_serial (data->message, old_serial);
|
||||
|
||||
case G_DBUS_MESSAGE_FILTER_RESULT_MESSAGE_ALTERED:
|
||||
/* reencode altered message */
|
||||
error = NULL;
|
||||
new_blob = g_dbus_message_to_blob (data->message,
|
||||
&new_blob_size,
|
||||
@@ -1286,7 +1294,6 @@ maybe_write_next_message (GDBusWorker *worker)
|
||||
data->blob = (gchar *) new_blob;
|
||||
data->blob_size = new_blob_size;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
write_message_async (worker,
|
||||
|
Reference in New Issue
Block a user