diff --git a/daemon/main.c b/daemon/main.c index 14c1393e..ada5e41f 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -189,6 +189,7 @@ static void disconnect_dbus(void) { dbus_object_path_destroy(g_dbus_connection, g_control_object); dbus_connection_unref(g_dbus_connection); + dbus_call_last_error_cleanup(); } void term_signal_handler(int signum) diff --git a/dbus/helpers.c b/dbus/helpers.c index 84e481af..81d1110b 100644 --- a/dbus/helpers.c +++ b/dbus/helpers.c @@ -42,6 +42,8 @@ DBusConnection * g_dbus_connection; DBusError g_dbus_error; +static char * g_dbus_call_last_error_name; +static char * g_dbus_call_last_error_message; struct dbus_signal_hook_descriptor { @@ -62,6 +64,41 @@ struct dbus_service_descriptor LIST_HEAD(g_dbus_services); + +void dbus_call_last_error_cleanup(void) +{ + free(g_dbus_call_last_error_name); + g_dbus_call_last_error_name = NULL; + + free(g_dbus_call_last_error_message); + g_dbus_call_last_error_message = NULL; +} + +bool dbus_call_last_error_is_name(const char * name) +{ + return g_dbus_call_last_error_name != NULL && strcmp(name, g_dbus_call_last_error_name) == 0; +} + +const char * dbus_call_last_error_get_message(void) +{ + return g_dbus_call_last_error_message != NULL ? g_dbus_call_last_error_message : ""; +} + +static void dbus_call_last_error_set(void) +{ + dbus_call_last_error_cleanup(); + + if (g_dbus_error.name != NULL) + { + g_dbus_call_last_error_name = strdup(g_dbus_error.name); + } + + if (g_dbus_error.message != NULL) + { + g_dbus_call_last_error_message = strdup(g_dbus_error.message); + } +} + bool dbus_iter_get_dict_entry(DBusMessageIter * iter_ptr, const char * key, void * value, int * type, int * size) { DBusMessageIter dict_iter; @@ -353,7 +390,7 @@ dbus_call_raw( &g_dbus_error); if (reply_ptr == NULL) { - //log_error("calling method '%s' failed, error is '%s'", method, g_dbus_error.message); + dbus_call_last_error_set(); dbus_error_free(&g_dbus_error); } diff --git a/dbus/helpers.h b/dbus/helpers.h index 48529515..bfb2879e 100644 --- a/dbus/helpers.h +++ b/dbus/helpers.h @@ -111,6 +111,10 @@ dbus_unregister_service_lifetime_hook( DBusConnection * connection, const char * service); +void dbus_call_last_error_cleanup(void); +bool dbus_call_last_error_is_name(const char * name); +const char * dbus_call_last_error_get_message(void); + #include "method.h" #include "signal.h" #include "interface.h" diff --git a/gui/dbus.c b/gui/dbus.c index f88f79af..84f0878f 100644 --- a/gui/dbus.c +++ b/gui/dbus.c @@ -55,4 +55,6 @@ void dbus_uninit(void) { dbus_error_free(&g_dbus_error); } + + dbus_call_last_error_cleanup(); } diff --git a/proxies/studio_proxy.c b/proxies/studio_proxy.c index 6d1efa4e..9760ac92 100644 --- a/proxies/studio_proxy.c +++ b/proxies/studio_proxy.c @@ -298,7 +298,12 @@ studio_proxy_set_room_callbacks( if (!dbus_call(0, SERVICE_NAME, STUDIO_OBJECT_PATH, IFACE_STUDIO, "GetRoomList", "", NULL, &reply_ptr)) { - log_error("Cannot fetch studio room list"); + /* Don't log error if there is no studio loaded */ + if (!dbus_call_last_error_is_name(DBUS_ERROR_UNKNOWN_METHOD)) + { + log_error("Cannot fetch studio room list: %s", dbus_call_last_error_get_message()); + } + return; }