This function unsibscribes event callback by uid and removing it from list.
removed unused unsubscribe handler
API function change:
from subsession_remove_event_callback
to subsession_unregister_event_callback
Change-Id: If58381dfa17c27ce2764aeabf8d698212561ab17
typedef int (*subsession_event_callback) (subsession_event_info info, void *cb_data);
int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data);
+int subsession_unregister_event_callback(int session_uid, subsession_event_type_e event_bits);
#ifdef __cplusplus
}
signal_client_data_t *signal_data = NULL;
g_mutex_lock(&client_callbacks_data->mutex);
+ if (client_callbacks_data->list == NULL) {
+ return NULL;
+ }
GList *found_data = g_list_find_custom( client_callbacks_data->list, (gconstpointer) parameters, compare_user_params );
- if (found_data != NULL) {
+ if (found_data != NULL && found_data->data != NULL) {
signal_data = (signal_client_data_t*)found_data->data;
client_callbacks_data->list = g_list_remove(client_callbacks_data->list, found_data->data);
}
GVariant *parameters,
gpointer client_data)
{
+
if (parameters == NULL || client_data == NULL) {
return;
}
event_callback(event_info, signal_data->client_callback_data);
}
-static void signal_unsubscribed_callback(void *data) {
- if(data == NULL) {
- return;
- }
- signal_client_data_t *signal_data = (signal_client_data_t *)data;
- free(signal_data);
-}
-
#define subscribe_cfg_(_signal_name) \
session_connection_data.connection,\
session_connection_data.bus_name , \
_signal_name, \
session_connection_data.objpath
-
int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
GError *error = NULL;
G_DBUS_SIGNAL_FLAGS_NONE,
signal_callback,
client_callbacks,
- signal_unsubscribed_callback );
+ NULL);
}
GVariant *retgv = NULL;
);
if (!retgv || call_sync_error) {
- int ret = map_dbus_call_error_to_return_value(call_sync_error);
+ int err = map_dbus_call_error_to_return_value(call_sync_error);
g_error_free(call_sync_error);
- return ret;
+ return err;
}
g_variant_unref(retgv);
);
if (!retgv || call_sync_error) {
- int ret = map_dbus_call_error_to_return_value(call_sync_error);
+ int err = map_dbus_call_error_to_return_value(call_sync_error);
g_error_free(call_sync_error);
- return ret;
+ return err;
}
*out = retgv;
callback_data.list = g_list_append(callback_data.list, data)
+
EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_callback cb, void *cb_data) {
+
g_mutex_lock (&add_user_callbacks_data_mt.mutex);
init_callbacks_list(&add_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
signal_add_user_complete_handler,
(gpointer) &add_user_callbacks_data_mt);
- if (method_call_result == 0) { return 0; }
+ if (method_call_result == 0) { return SUBSESSION_ERROR_NONE; }
cb(method_call_result, cb_data);
client_data_cleansweep_mt(signal_client_data, &add_user_callbacks_data_mt);
callbacks_data_mt.dbus_signal, \
&callbacks_data_mt.dbus_signal_subscribed
-#define dbus_data_ptr(callbacks_data_mt, params) \
+#define dbus_data_ptr_(callbacks_data_mt, params) \
callbacks_data_mt->dbus_method_call, \
params, \
callbacks_data_mt->dbus_signal, \
}
int method_call_result = subscribe_and_call_method(
- dbus_data_ptr(callbacks_data, params),
+ dbus_data_ptr_(callbacks_data, params),
signal_callback,
(gpointer) callbacks_data);
G_DBUS_SIGNAL_FLAGS_NONE,
signal_callback,
callbacks_data,
- signal_unsubscribed_callback);
+ NULL);
}
return SUBSESSION_ERROR_NONE;
}
if (event_bits & SUBSESSION_SWITCH_USER_COMPLETION) {
ret_if_err_(subscribe_only_callback(&switch_user_completion_callbacks_data_mt, signal_switch_user_completion_handler, session_uid, cb, cb_data))
}
- return 0;
+ return SUBSESSION_ERROR_NONE;
+}
+
+int unregister_event_callback(client_callbacks_data_t *callbacks_data, int session_uid) {
+
+ GVariant * gv_session_uid = g_variant_new("(i)", session_uid);
+
+ signal_client_data_t *signal_data = take_from_callbacks_data_and_remove_from_list(callbacks_data, gv_session_uid, g_compare_session_uid_params);
+ if (signal_data != NULL) {
+ free(signal_data);
+ }
+
+ g_mutex_lock(&callbacks_data->mutex);
+ if(g_list_length(callbacks_data->list) <= 1) {
+ g_dbus_connection_signal_unsubscribe(session_connection_data.connection, callbacks_data->dbus_signal_subscribed);
+ callbacks_data->dbus_signal_subscribed = 0;
+ }
+ g_mutex_unlock(&callbacks_data->mutex);
+
+ return SUBSESSION_ERROR_NONE;
+}
+
+EXPORT_API int subsession_unregister_event_callback(int session_uid, subsession_event_type_e event_bits){
+
+ /* update pointer according to event bits */
+ if (event_bits & SUBSESSION_ADD_USER_WAIT) {
+ ret_if_err_( unregister_event_callback(&add_user_wait_callbacks_data_mt, session_uid))
+ }
+ if (event_bits & SUBSESSION_REMOVE_USER_WAIT) {
+ ret_if_err_(unregister_event_callback(&remove_user_wait_callbacks_data_mt, session_uid))
+ }
+ if (event_bits & SUBSESSION_SWITCH_USER_WAIT) {
+ ret_if_err_(unregister_event_callback(&switch_user_wait_callbacks_data_mt, session_uid))
+ }
+ if (event_bits & SUBSESSION_SWITCH_USER_COMPLETION) {
+ ret_if_err_(unregister_event_callback(&switch_user_completion_callbacks_data_mt, session_uid))
+ }
+ return SUBSESSION_ERROR_NONE;
}
EXPORT_API int subsession_add_user_wait_done(int session_uid, int user) {
add_libsd_target_test(api_adduserwait "")
add_libsd_target_test(api_removeuserwait "")
add_libsd_target_test(api_switch_user_wait "")
-#add_libsd_target_test(api_add_remove_user_wait "")
+add_libsd_target_test(api_reg_unreg_add_user_wait "")
add_libsd_target_test(api_get_user_list "")
+++ /dev/null
-#include<iostream>
-#include <gtest/gtest.h>
-#include <gio/gio.h>
-#include <pthread.h>
-#include "sessiond.h"
-
-// Test
-
-typedef struct {
- int callback_result;
- int session_id;
- int user_id;
-} test_user_data;
-
-typedef struct {
- int user;
- int session_id;
-} test_user_wait_data;
-
-typedef struct {
- GMainLoop * loop;
- test_user_data *user_data;
-}ud_ctrl;
-
-
-int callback_adduser_reference;
-int callback_removeuser_reference;
-int callback_adduserstarted_reference;
-int callback_removeuserstarted_reference;
-
-gboolean callback_pending(gpointer data) {
-
- ud_ctrl *ud = (ud_ctrl*)data;
- gboolean is_pending = g_main_context_pending(NULL);
- gint callback_adduser_calls = g_atomic_int_get(&callback_adduser_reference);
- gint callback_removeuser_calls = g_atomic_int_get(&callback_removeuser_reference);
- gint callback_adduserstarted_calls = g_atomic_int_get(&callback_adduserstarted_reference);
- gint callback_removeuserstarted_calls = g_atomic_int_get(&callback_removeuserstarted_reference);
-
- if(is_pending == TRUE) {
- return TRUE;
- }
-
- bool loop_quit_ready =
- (callback_adduser_calls >= 1) &&
- (callback_removeuser_calls >= 1) &&
- (callback_adduserstarted_calls >= 1) &&
- (callback_removeuserstarted_calls >=1 );
-
- if(loop_quit_ready) {
- g_main_loop_quit((GMainLoop*)ud->loop);
- }
- return TRUE;
-}
-
-int test_reply_adduser_callback (int result, void *cb_data) {
-
- g_atomic_int_inc(&callback_adduser_reference);
-
- if (cb_data == NULL) {
- return -EBADR;
- }
-
- test_user_data *user_data = (test_user_data *)cb_data;
- user_data->callback_result = result;
-
- if (result < 0) {
- return result;
- }
-
- return 0;
-}
-
-int test_reply_removeuser_callback (int result, void *cb_data) {
-
- g_atomic_int_inc(&callback_removeuser_reference);
-
- if (cb_data == NULL) {
- return -EBADR;
- }
-
- test_user_data *user_data = (test_user_data *)cb_data;
- user_data->callback_result = result;
-
- if (result < 0) {
- return result;
- }
-
- return 0;
-}
-typedef int (*subsession_add_user_wait_callback) (int session_uid, int user, void *cb_data);
-
-int test_subsession_add_user_wait_callback(int session_uid, int user, void *cb_data) {
-
- g_atomic_int_inc(&callback_adduserstarted_reference);
-
- test_user_data *user_data = (test_user_data *)cb_data;
-
- int result = 0;
-
- if(session_uid < 0) {
- user_data->callback_result = session_uid;
- result = session_uid;
- return result;
- }
-
- if(user < 0) {
- user_data->callback_result = user;
- result = user;
- return result;
- }
-
- if (user_data->session_id != session_uid) {
- result = session_uid;
- user_data->callback_result = result;
- return result;
- }
- user_data->user_id = user;
- user_data->callback_result =subsession_add_user_wait_done(session_uid, user);
-
- return result;
-}
-
-
-int test_subsession_remove_user_wait_callback(int session_uid, int user, void *cb_data) {
-
- g_atomic_int_inc(&callback_removeuserstarted_reference);
-
- test_user_data *user_data = (test_user_data *)cb_data;
-
- int result = 0;
-
- if(session_uid < 0) {
- user_data->callback_result = session_uid;
- result = session_uid;
- return result;
- }
-
- if(user < 0) {
- user_data->callback_result = user;
- result = user;
- return result;
- }
-
- if (user_data->session_id != session_uid) {
- result = session_uid;
- user_data->callback_result = result;
- return result;
- }
- user_data->user_id = user;
- user_data->callback_result =subsession_remove_user_wait_done(session_uid, user);
-
- return result;
-}
-
-TEST(subsession_add_remove_user_wait_test, APIAddRemoveUserWaitTest) {
-
- GMainLoop* loop = NULL;
- loop = g_main_loop_new (NULL, FALSE);
-
- g_atomic_int_set(&callback_adduser_reference, 0);
- g_atomic_int_set(&callback_adduserstarted_reference, 0);
- g_atomic_int_set(&callback_removeuser_reference, 0);
- g_atomic_int_set(&callback_removeuserstarted_reference, 0);
-
- test_user_data test_add_wait_1_2;
- test_add_wait_1_2.session_id = 5001;
- test_add_wait_1_2.user_id = -3;
- test_add_wait_1_2.callback_result = -1;
- int add_user_wait_res_1_2 = subsession_add_user_wait(test_add_wait_1_2.session_id,
- test_subsession_add_user_wait_callback, (void *)&test_add_wait_1_2);
-
- test_user_data test_add_1_2;
- test_add_1_2.session_id = 5001;
- test_add_1_2.user_id = 2;
- test_add_1_2.callback_result = -1;
- int add_user_res_1_2 = subsession_add_user(test_add_1_2.session_id, test_add_1_2.user_id,
- test_reply_adduser_callback, (void *)&test_add_1_2);
-
-
- test_user_data test_remove_wait_1_2;
- test_remove_wait_1_2.session_id = 5001;
- test_remove_wait_1_2.user_id = -3;
- test_remove_wait_1_2.callback_result = -1;
- int remove_user_wait_res_1_2 = subsession_remove_user_wait(test_add_wait_1_2.session_id,
- test_subsession_remove_user_wait_callback, (void *)&test_remove_wait_1_2);
-
- test_user_data test_remove_1_2;
- test_remove_1_2.session_id = 5001;
- test_remove_1_2.user_id = 2;
- test_remove_1_2.callback_result = -1;
- int remove_user_res_1_2 = subsession_remove_user(test_remove_1_2.session_id, test_remove_1_2.user_id,
- test_reply_removeuser_callback, (void *)&test_remove_1_2);
-
- ud_ctrl ud;
- ud.loop = loop;
-
- g_idle_add(callback_pending,(gpointer*)&ud);
- g_main_loop_run(loop);
-
- EXPECT_EQ(add_user_wait_res_1_2, 0);
- EXPECT_EQ(add_user_res_1_2, 0);
-
- EXPECT_EQ(remove_user_wait_res_1_2, 0);
- EXPECT_EQ(remove_user_res_1_2, 0);
-
-
- EXPECT_EQ(0, test_add_wait_1_2.callback_result);
- EXPECT_EQ(2, test_add_wait_1_2.user_id);
-
-
- EXPECT_EQ(0, test_remove_wait_1_2.callback_result);
- EXPECT_EQ(2, test_remove_wait_1_2.user_id);
-
- EXPECT_EQ(0, test_add_1_2.callback_result);
- EXPECT_EQ(0, test_remove_1_2.callback_result);
-
-}
--- /dev/null
+#include<iostream>
+#include <gtest/gtest.h>
+#include <gio/gio.h>
+#include <pthread.h>
+
+#include <tuple>
+#include <utility>
+#include <iostream>
+#include "sessiond.h"
+
+#include "test_hlp.hpp"
+
+// Test
+
+typedef struct {
+ int session_uid;
+ int user_id;
+ int callback_result;
+} test_user_data_t;
+
+typedef struct {
+ int user;
+ int session_uid;
+} test_user_wait_data_t;
+
+template <typename... Args>
+bool all_true(Args... args)
+{
+ return (... && args);
+}
+
+int callback_adduser_reference;
+
+int test_reply_adduser_callback (int result, void *cb_data) {
+
+ g_atomic_int_inc(&callback_adduser_reference);
+
+ if (cb_data == NULL) {
+ return -EBADR;
+ }
+
+ test_user_data_t *user_data = (test_user_data_t *)cb_data;
+ user_data->callback_result = result;
+
+ if (result < 0) {
+ return result;
+ }
+
+ return 0;
+}
+
+int callback_removeuser_reference;
+
+int test_reply_removeuser_callback (int result, void *cb_data) {
+
+ g_atomic_int_inc(&callback_removeuser_reference);
+
+ if (cb_data == NULL) {
+ return -EBADR;
+ }
+
+ test_user_data_t *user_data = (test_user_data_t *)cb_data;
+ user_data->callback_result = result;
+
+ return result;
+}
+
+//typedef int (*subsession_event_callback) (subsession_event_info info, void *cb_data);
+int callback_adduserstarted_reference;
+
+int test_subsession_add_user_wait_callback(subsession_event_info info, void *cb_data) {
+
+
+ test_user_data_t *user_data = (test_user_data_t *)cb_data;
+
+ if(cb_data == NULL) return -1;
+
+ user_data->user_id = info.add_user.user;
+ user_data->session_uid = info.add_user.session_uid;
+
+ user_data->callback_result = subsession_add_user_wait_done(test_subsession_uid, 2);
+ g_atomic_int_inc(&callback_adduserstarted_reference);
+
+ return 0;
+}
+
+using ud_ = struct ud_ctrl_t<int*, int*, int*>;
+
+TEST(subsession_register_and_remove_user_wait_test, APIRegisterAndRemoveAddUserWaitTest) {
+
+ ud_ ud = { .loop = g_main_loop_new (NULL, FALSE),
+ .t = {
+ &callback_adduser_reference,
+ &callback_removeuser_reference,
+ &callback_adduserstarted_reference,
+ }
+ };
+
+ std::apply([](auto... args){( (_set_0(args) ), ...); }, ud.t );
+
+ test_user_data_t test_add_wait_1_2 = {
+ .session_uid = -1,
+ .user_id = -3,
+ .callback_result = -1
+ };
+
+ //int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data);
+
+ int reg_add_user_wait_res_1_2 = subsession_register_event_callback(test_subsession_uid, SUBSESSION_ADD_USER_WAIT ,test_subsession_add_user_wait_callback, (void*)&test_add_wait_1_2);
+
+ test_user_data_t test_add_1_2 = {
+ .session_uid = test_subsession_uid,
+ .user_id = 2,
+ .callback_result = -1,
+ };
+
+ int add_user_res_1_2 = subsession_add_user(test_add_1_2.session_uid, test_add_1_2.user_id,
+ test_reply_adduser_callback, (void *)&test_add_1_2);
+
+ test_user_data_t test_remove_1_2 = {
+ .session_uid = test_subsession_uid,
+ .user_id = 2,
+ .callback_result = -1,
+ };
+ int remove_user_res_1_2 = subsession_remove_user(test_remove_1_2.session_uid, test_remove_1_2.user_id,
+ test_reply_removeuser_callback, (void *)&test_remove_1_2);
+
+ g_atomic_int_inc(&callback_adduserstarted_reference);
+ int rem_add_user_wait_res_1_2 = subsession_unregister_event_callback(test_subsession_uid, SUBSESSION_ADD_USER_WAIT);
+
+ g_idle_add(callback_pending<ud_>,(gpointer*)&ud);
+ g_main_loop_run(ud.loop);
+
+ EXPECT_EQ(reg_add_user_wait_res_1_2, 0);
+ EXPECT_EQ(add_user_res_1_2, 0);
+ EXPECT_EQ(remove_user_res_1_2, 0);
+
+ EXPECT_EQ(-1, test_add_wait_1_2.callback_result);
+ EXPECT_EQ(-3, test_add_wait_1_2.user_id);
+ EXPECT_EQ(-1, test_add_wait_1_2.session_uid);
+
+ EXPECT_EQ(0, test_add_1_2.callback_result);
+ EXPECT_EQ(0, test_remove_1_2.callback_result);
+ EXPECT_EQ(rem_add_user_wait_res_1_2, 0);
+
+}