Improve '__mc_client_unregister_filter_listener' function to fix issue 97/213397/5 accepted/tizen/unified/20190909.010902 submit/tizen/20190905.232826
authorjiyong.min <jiyong.min@samsung.com>
Thu, 5 Sep 2019 02:22:42 +0000 (11:22 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Thu, 5 Sep 2019 23:25:29 +0000 (08:25 +0900)
 - 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
src/media_controller_client.c
src/media_controller_ipc.c

index 2fc36fd..8d5e47a 100644 (file)
@@ -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);
index e3ab171..f214c91 100644 (file)
@@ -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;
index 7c2192b..c45ad0e 100644 (file)
@@ -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;