From 820b2cda5209014f0a44d01d3dc7c4f74b21a4a0 Mon Sep 17 00:00:00 2001 From: "jiyong.min" Date: Thu, 5 Sep 2019 11:22:42 +0900 Subject: [PATCH] Improve '__mc_client_unregister_filter_listener' function to fix issue - Issue After filter_listener were unregistered, listener callback was still invoked. - Cause When all filters were unregistered, filter_interface should be unregistered, but normal_interface was used. - Solution When filter is unregistered, it is changed to use 'mc_ipc_unregister_filter_listener'. After that, unregistering filter will use filter_interface(interface + server_name). Change-Id: I356c1c0d96fd3297e6f3f61e3b906980d3e2f2ef --- include/media_controller_private.h | 1 + src/media_controller_client.c | 79 ++++++++++++++------------------------ src/media_controller_ipc.c | 19 +++++++++ 3 files changed, 49 insertions(+), 50 deletions(-) diff --git a/include/media_controller_private.h b/include/media_controller_private.h index 2fc36fd..8d5e47a 100644 --- a/include/media_controller_private.h +++ b/include/media_controller_private.h @@ -412,6 +412,7 @@ int mc_ipc_unref_dbus_connection(GDBusConnection *conn, int *dref_count); int mc_ipc_register_listener(GList **manage_list, GDBusConnection *connection, const char *interface_name, const char *signal_name, mc_signal_received_cb callback, void *user_data); int mc_ipc_unregister_listener(GList **manage_list, const char *interface_name, const char *signal_name); int mc_ipc_unregister_all_listener(GList **manage_list); +int mc_ipc_unregister_filter_listener(GList **listener_list, const char *server_name, const char *signal_name); int mc_ipc_send_message(GDBusConnection *connection, const char *dbus_name, const char *interface_name, const char* signal_name, const char* message, char **request_id); int mc_ipc_send_reply(GDBusConnection *connection, const char *dbus_name, const char *interface_name, const char *signal_name, const char *message, const char *request_id); int mc_ipc_send_message_to_server(mc_msg_type_e msg_type, mc_priv_type_e priv_type, const char *request_msg); diff --git a/src/media_controller_client.c b/src/media_controller_client.c index e3ab171..f214c91 100644 --- a/src/media_controller_client.c +++ b/src/media_controller_client.c @@ -442,75 +442,54 @@ static int __mc_client_register_filter_listener(media_controller_client_s *mc_cl return ret; } +static gint __compare_filter(gconstpointer data, gconstpointer user_data) +{ + return (gint)g_strcmp0((const char *)data, (const char *)user_data); +} + static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_client, GList **filter_list, const char *server_name, const char *signal_name) { int ret = MEDIA_CONTROLLER_ERROR_NONE; - int idx = 0; - int filter_cnt = 0; + GList *element = NULL; + char *_server_name = NULL; + unsigned int idx, filter_cnt = 0; mc_retvm_if(filter_list == NULL, MEDIA_CONTROLLER_ERROR_NONE, "[No-Error] No filter list to unset"); mc_retvm_if(!MC_STRING_VALID(signal_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid signal_name"); filter_cnt = g_list_length(*filter_list); - mc_debug("signal [%s] cnt [%d]", signal_name, filter_cnt); if (MC_STRING_VALID(server_name)) { + /* Unregister filter */ + ret = mc_ipc_unregister_filter_listener(&mc_client->listeners, server_name, signal_name); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("Fail mc_ipc_unregister_filter_listener"); - char *filter_interface_name = NULL; - - ret = mc_util_make_filter_interface_name(MC_DBUS_UPDATE_INTERFACE, server_name, &filter_interface_name); - mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Fail mc_util_make_filter_interface_name"); - if (!MC_STRING_VALID(filter_interface_name)) { - mc_error("filter_interface_name is NULL"); - MC_SAFE_FREE(filter_interface_name); - return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; - } - - /*Unregister listener*/ - ret = mc_ipc_unregister_listener(&mc_client->listeners, filter_interface_name, signal_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - MC_SAFE_FREE(filter_interface_name); - return ret; - } - - /*Remove from filter_list*/ - for (idx = 0; idx < filter_cnt; idx++) { - char * interface_name = NULL; - interface_name = g_list_nth_data(*filter_list, idx); - - if (MC_STRING_VALID(interface_name)) { - if (g_strcmp0(interface_name, server_name) == 0) { - mc_debug("Unset subscriber [%d][%s]", idx, interface_name); - *filter_list = g_list_remove(*filter_list, interface_name); - MC_SAFE_FREE(interface_name); - } - } + /* Remove from filter_list */ + element = g_list_find_custom(*filter_list, server_name, __compare_filter); + if (element) { + (*filter_list) = g_list_remove_link(*filter_list, element); + g_list_free_full(element, g_free); } - MC_SAFE_FREE(filter_interface_name); + mc_debug("filter[%s.%s] is unregistered. Remaining filters: [%d]", server_name, signal_name, g_list_length(*filter_list)); } else { - - /*Remove All filter listener*/ + /* Unregister all filters */ for (idx = 0; idx < filter_cnt; idx++) { - char * interface_name = NULL; - interface_name = g_list_nth_data(*filter_list, idx); - - if (MC_STRING_VALID(interface_name)) { - mc_debug("[%d][%s]", idx, interface_name); - - /*Unregister listener*/ - ret = mc_ipc_unregister_listener(&mc_client->listeners, interface_name, signal_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("Fail mc_ipc_unregister_listener"); + _server_name = g_list_nth_data(*filter_list, idx); + mc_debug("[%d][%s]", idx, _server_name); - /*Remove from filter_list*/ - *filter_list = g_list_remove(*filter_list, interface_name); - MC_SAFE_FREE(interface_name); - } + ret = mc_ipc_unregister_filter_listener(&mc_client->listeners, _server_name, signal_name); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("Fail mc_ipc_unregister_filter_listener"); } - g_list_free(*filter_list); + /* Remove all filters */ + g_list_free_full(*filter_list, g_free); + *filter_list = NULL; + + mc_debug("All filters are unregistered."); } return ret; diff --git a/src/media_controller_ipc.c b/src/media_controller_ipc.c index 7c2192b..c45ad0e 100644 --- a/src/media_controller_ipc.c +++ b/src/media_controller_ipc.c @@ -280,6 +280,25 @@ int mc_ipc_unregister_all_listener(GList **listener_list) return MEDIA_CONTROLLER_ERROR_NONE; } +int mc_ipc_unregister_filter_listener(GList **listener_list, const char *server_name, const char *signal_name) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *filter_interface = NULL; + + mc_retvm_if(!listener_list, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL"); + mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is NULL"); + mc_retvm_if(!signal_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "signal_name is NULL"); + + ret = mc_util_make_filter_interface_name(MC_DBUS_UPDATE_INTERFACE, server_name, &filter_interface); + mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Fail mc_util_make_filter_interface_name"); + + ret = mc_ipc_unregister_listener(listener_list, filter_interface, signal_name); + + MC_SAFE_G_FREE(filter_interface); + + return MEDIA_CONTROLLER_ERROR_NONE; +} + int mc_ipc_send_message(GDBusConnection *connection, const char *dbus_name, const char *interface_name, const char *signal_name, const char *message, char **request_id) { GError *error = NULL; -- 2.7.4