gdbus: Add g_dbus_set_debug
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 29 Oct 2024 21:26:17 +0000 (17:26 -0400)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 20 Feb 2025 07:43:24 +0000 (16:43 +0900)
This adds g_dbus_set_debug which can be used to set a debug function to
be invoked on incoming/outgoing message.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
gdbus/gdbus.h
gdbus/object.c

index 1281103dca29e7c5b7cc788f8e078151c81b7fed..0dc8adffb0eef595b4ce7cc39caf3ec297370254 100755 (executable)
@@ -234,6 +234,12 @@ struct GDBusSecurityTable {
 void g_dbus_set_flags(int flags);
 int g_dbus_get_flags(void);
 
+typedef void (*g_dbus_destroy_func_t)(void *user_data);
+typedef void (*g_dbus_debug_func_t)(const char *str, void *user_data);
+
+void g_dbus_set_debug(g_dbus_debug_func_t cb, void *user_data,
+                               g_dbus_destroy_func_t destroy);
+
 gboolean g_dbus_register_interface(DBusConnection *connection,
                                        const char *path, const char *name,
                                        const GDBusMethodTable *methods,
index a303a7a9dcef5b9eb7f61b667834a969c02f187f..20287a0c01ee2f7d25db8bad65701390e79c857c 100755 (executable)
@@ -20,6 +20,7 @@
 #include <dbus/dbus.h>
 
 #include "gdbus.h"
+#include "src/shared/util.h"
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
 #if 0
@@ -89,9 +90,16 @@ struct property_data {
        DBusMessage *message;
 };
 
+struct debug_data {
+       g_dbus_debug_func_t func;
+       g_dbus_destroy_func_t destroy;
+       void *data;
+};
+
 static int global_flags = 0;
 static struct generic_data *root;
 static GSList *pending = NULL;
+static struct debug_data debug = { NULL, NULL, NULL };
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
 #define ADAPTER_INTERFACE      "org.bluez.Adapter1"
@@ -147,6 +155,20 @@ static bool check_testing(int flags, int flag)
        return !(global_flags & G_DBUS_FLAG_ENABLE_TESTING);
 }
 
+static void g_dbus_debug(const char *format, ...)
+{
+       va_list va;
+       char str[MAX_INPUT];
+
+       if (!format || !debug.func)
+               return;
+
+       va_start(va, format);
+       vsnprintf(str, sizeof(str), format, va);
+       debug.func(str, debug.data);
+       va_end(va);
+}
+
 static void generate_interface_xml(GString *gstr, struct interface_data *iface)
 {
        const GDBusMethodTable *method;
@@ -605,6 +627,22 @@ static void append_interface(gpointer data, gpointer user_data)
        dbus_message_iter_close_container(array, &entry);
 }
 
+static const char *dbus_message_type_string(DBusMessage *msg)
+{
+       return dbus_message_type_to_string(dbus_message_get_type(msg));
+}
+
+static void g_dbus_send_unref(DBusConnection *conn, DBusMessage *msg)
+{
+       g_dbus_debug("[%s] %s.%s",
+                       dbus_message_type_string(msg),
+                       dbus_message_get_interface(msg),
+                       dbus_message_get_member(msg));
+
+       dbus_connection_send(conn, msg, NULL);
+       dbus_message_unref(msg);
+}
+
 static void emit_interfaces_added(struct generic_data *data)
 {
        DBusMessage *signal;
@@ -645,9 +683,8 @@ static void emit_interfaces_added(struct generic_data *data)
 
        dbus_message_iter_close_container(&iter, &array);
 
-       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
-       dbus_connection_send(data->conn, signal, NULL);
-       dbus_message_unref(signal);
+       /* Use g_dbus_send_unref to avoid recursive calls to g_dbus_flush */
+       g_dbus_send_unref(data->conn, signal);
 }
 
 static struct interface_data *find_interface(GSList *interfaces,
@@ -1056,9 +1093,8 @@ static void emit_interfaces_removed(struct generic_data *data)
 
        dbus_message_iter_close_container(&iter, &array);
 
-       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
-       dbus_connection_send(data->conn, signal, NULL);
-       dbus_message_unref(signal);
+       /* Use g_dbus_send_unref to avoid recursive calls to g_dbus_flush */
+       g_dbus_send_unref(data->conn, signal);
 }
 
 static void remove_pending(struct generic_data *data)
@@ -1123,6 +1159,13 @@ static DBusHandlerResult generic_message(DBusConnection *connection,
        const GDBusMethodTable *method;
        const char *interface;
 
+       g_dbus_debug("[%s:%s] > %s.%s [#%d]",
+                       dbus_message_get_sender(message),
+                       dbus_message_type_string(message),
+                       dbus_message_get_interface(message),
+                       dbus_message_get_member(message),
+                       dbus_message_get_serial(message));
+
        interface = dbus_message_get_interface(message);
 
        iface = find_interface(data->interfaces, interface);
@@ -1650,6 +1693,35 @@ gboolean g_dbus_send_message(DBusConnection *connection, DBusMessage *message)
        /* Flush pending signal to guarantee message order */
        g_dbus_flush(connection);
 
+       switch (dbus_message_get_type(message)) {
+       case DBUS_MESSAGE_TYPE_METHOD_RETURN:
+               g_dbus_debug("[%s:%s] < [#%d]",
+                               dbus_message_get_destination(message),
+                               dbus_message_type_string(message),
+                               dbus_message_get_reply_serial(message));
+               break;
+       case DBUS_MESSAGE_TYPE_ERROR:
+               g_dbus_debug("[%s:%s] < %s [#%d]",
+                               dbus_message_get_destination(message),
+                               dbus_message_type_string(message),
+                               dbus_message_get_error_name(message),
+                               dbus_message_get_reply_serial(message));
+               break;
+       case DBUS_MESSAGE_TYPE_SIGNAL:
+               g_dbus_debug("[%s] %s.%s",
+                               dbus_message_type_string(message),
+                               dbus_message_get_interface(message),
+                               dbus_message_get_member(message));
+               break;
+       default:
+               g_dbus_debug("[%s:%s] < %s.%s",
+                               dbus_message_get_destination(message),
+                               dbus_message_type_string(message),
+                               dbus_message_get_interface(message),
+                               dbus_message_get_member(message));
+               break;
+       }
+
        result = dbus_connection_send(connection, message, NULL);
 
 out:
@@ -1675,6 +1747,12 @@ gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
                return FALSE;
        }
 
+       g_dbus_debug("[%s:%s] < %s.%s",
+                       dbus_message_get_destination(message),
+                       dbus_message_type_string(message),
+                       dbus_message_get_interface(message),
+                       dbus_message_get_member(message));
+
        return ret;
 }
 
@@ -1906,9 +1984,8 @@ static void process_properties_from_interface(struct generic_data *data,
        g_slist_free(iface->pending_prop);
        iface->pending_prop = NULL;
 
-       /* Use dbus_connection_send to avoid recursive calls to g_dbus_flush */
-       dbus_connection_send(data->conn, signal, NULL);
-       dbus_message_unref(signal);
+       /* Use g_dbus_send_unref to avoid recursive calls to g_dbus_flush */
+       g_dbus_send_unref(data->conn, signal);
 }
 
 static void process_property_changes(struct generic_data *data)
@@ -2035,3 +2112,14 @@ int g_dbus_get_flags(void)
 {
        return global_flags;
 }
+
+void g_dbus_set_debug(g_dbus_debug_func_t cb, void *user_data,
+                               g_dbus_destroy_func_t destroy)
+{
+       if (debug.destroy)
+               debug.destroy(debug.data);
+
+       debug.func = cb;
+       debug.destroy = destroy;
+       debug.data = user_data;
+}