return g_strdup_printf("%s.%s", main_key, sub_key);
}
+static gint __find_listener_by_key(gconstpointer data, gconstpointer user_data)
+{
+ mc_ipc_listener_s *listener = (mc_ipc_listener_s *)data;
+ char *key = (char *)user_data;
+
+ return (!listener || g_strcmp0(listener->key, key)) ? 1 : 0;
+}
+
static void __mc_ipc_signal_cb(GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
int mc_ipc_unregister_listener(GList **listener_list, const char *interface_name, const char *signal_name)
{
- int i = 0;
- int list_len = 0;
+ GList *element = NULL;
char *key = NULL;
- mc_retvm_if(listener_list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
- mc_retvm_if(interface_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "interface_name is NULL");
- mc_retvm_if(signal_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "signal_name is NULL");
+ mc_retvm_if(!listener_list, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
+ mc_retvm_if(!interface_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "interface_name is NULL");
+ mc_retvm_if(!signal_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "signal_name is NULL");
key = __make_key_for_map(interface_name, signal_name);
- mc_retvm_if(key == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to get key");
+ mc_retvm_if(!key, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to get key");
- list_len = g_list_length(*listener_list) - 1;
- for (i = list_len; i >= 0; i--) {
- mc_ipc_listener_s *listener = (mc_ipc_listener_s *)g_list_nth_data(*listener_list, i);
- if (listener && !g_strcmp0(listener->key, key)) {
- _mc_ipc_signal_unsubscribe(listener->dbus_conn, listener->handler);
- MC_SAFE_FREE(listener->interface_name);
- MC_SAFE_FREE(listener->signal_name);
- MC_SAFE_G_FREE(listener->key);
- (*listener_list) = g_list_remove(*listener_list, listener);
- MC_SAFE_FREE(listener);
- mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list));
- break;
- }
+ element = g_list_find_custom(*listener_list, (gconstpointer)key, __find_listener_by_key);
+ if (element) {
+ (*listener_list) = g_list_remove_link(*listener_list, element);
+ __mc_destroy_listener(element->data);
+ g_list_free (element);
+
+ mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list));
}
MC_SAFE_G_FREE(key);