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);
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;
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;