return sizeof (struct kdbus_msg) + items_size;
}
+typedef struct
+{
+ GKDBusWorker *worker;
+ GDBusMessage *message;
+} SyntheticReplyData;
+
+static gboolean
+deliver_synthetic_reply (gpointer user_data)
+{
+ SyntheticReplyData *data;
+ GKDBusWorker *worker;
+ GDBusMessage *message;
+
+ data = user_data;
+ worker = data->worker;
+ message = data->message;
+
+ (* worker->message_received_callback) (message, worker->user_data);
+
+ g_object_unref (message);
+ g_free (data);
+
+ return FALSE;
+}
+
+static GDBusMessage*
+create_access_error_reply (GDBusMessage *message,
+ GError *error)
+{
+ GDBusMessage *error_reply;
+ gchar *dbus_error_name;
+ dbus_error_name = g_dbus_error_encode_gerror (error);
+ error_reply = g_dbus_message_new_method_error (message, dbus_error_name, "%s", error->message);
+ g_free (dbus_error_name);
+ return error_reply;
+}
+
+static void
+send_error_message (GKDBusWorker *worker,
+ GDBusMessage *message)
+{
+ SyntheticReplyData *reply_data;
+ reply_data = g_new0 (SyntheticReplyData, 1);
+ reply_data->worker = worker;
+ reply_data->message = message;
+ g_main_context_invoke (worker->context, deliver_synthetic_reply, reply_data);
+}
+
+
/*
* _g_kdbus_send
*/
gsize header_size;
gsize msg_size;
+ GDBusMessage *access_error_message;
+
g_return_val_if_fail (G_IS_KDBUS_WORKER (worker), FALSE);
send = NULL;
break;
}
+
+ access_error_message = create_access_error_reply(message, *error);
+ g_clear_error(error); /* we send back an error reply, so error must be NULL */
+ result = TRUE;
+ if (out_reply != NULL)
+ {
+ *out_reply = access_error_message;
+ }
+ else
+ {
+ send_error_message(worker, access_error_message);
+ }
+
goto out;
}
}
return G_SOURCE_CONTINUE;
}
-typedef struct
-{
- GKDBusWorker *worker;
- GDBusMessage *message;
-} SyntheticReplyData;
-
-static gboolean
-deliver_synthetic_reply (gpointer user_data)
-{
- SyntheticReplyData *data;
- GKDBusWorker *worker;
- GDBusMessage *message;
-
- data = user_data;
- worker = data->worker;
- message = data->message;
-
- (* worker->message_received_callback) (message, worker->user_data);
-
- g_object_unref (message);
- g_free (data);
-
- return FALSE;
-}
-
void
_g_kdbus_worker_unfreeze (GKDBusWorker *worker)
{