Added subsession_unregister_event_callback() 35/274735/6
authorHubert Kowalski <h.kowalski@samsung.com>
Wed, 27 Apr 2022 12:51:53 +0000 (14:51 +0200)
committerArkadiusz Nowak <a.nowak3@samsung.com>
Thu, 12 May 2022 05:45:32 +0000 (07:45 +0200)
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

libsessiond/include/sessiond.h
libsessiond/src/lib.c
libsessiond/target_test/CMakeLists.txt
libsessiond/target_test/test_api_add_remove_user_wait.cpp [deleted file]
libsessiond/target_test/test_api_reg_unreg_add_user_wait.cpp [new file with mode: 0644]

index a135a12..baed703 100644 (file)
@@ -90,6 +90,7 @@ int subsession_get_current_user(int session_uid, int *user);
 
 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
 }
index 39a1dc3..c24312c 100644 (file)
@@ -283,8 +283,11 @@ signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_call
        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);
                }
@@ -419,6 +422,7 @@ static void signal_add_user_started_handler(GDBusConnection *connection,
        GVariant *parameters,
        gpointer client_data)
 {
+
        if (parameters == NULL || client_data == NULL) {
                return;
        }
@@ -552,14 +556,6 @@ static void  signal_switch_user_completion_handler( GDBusConnection *connection,
        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 , \
@@ -567,7 +563,6 @@ static void signal_unsubscribed_callback(void *data) {
                        _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;
@@ -587,7 +582,7 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
                        G_DBUS_SIGNAL_FLAGS_NONE,
                        signal_callback,
                        client_callbacks,
-                       signal_unsubscribed_callback );
+                       NULL);
        }
 
        GVariant *retgv = NULL;
@@ -604,9 +599,9 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
        );
 
        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);
 
@@ -678,9 +673,9 @@ int method_call_no_signal_return(gchar *method, GVariant *params, const GVariant
        );
 
        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;
@@ -709,8 +704,10 @@ void init_callbacks_list(client_callbacks_data_t *callbacks_data, GVariant *para
        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));
@@ -729,7 +726,7 @@ EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_c
                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);
@@ -844,7 +841,7 @@ registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *c
        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, \
@@ -861,7 +858,7 @@ int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignal
        }
 
        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);
 
@@ -902,7 +899,7 @@ int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBusSignal
                        G_DBUS_SIGNAL_FLAGS_NONE,
                        signal_callback,
                        callbacks_data,
-                       signal_unsubscribed_callback);
+                       NULL);
        }
        return SUBSESSION_ERROR_NONE;
 }
@@ -925,7 +922,44 @@ EXPORT_API int subsession_register_event_callback(int session_uid, subsession_ev
        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) {
index 2450d50..fa3bacb 100644 (file)
@@ -19,5 +19,5 @@ add_libsd_target_test(api_switchuser  "")
 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  "")
diff --git a/libsessiond/target_test/test_api_add_remove_user_wait.cpp b/libsessiond/target_test/test_api_add_remove_user_wait.cpp
deleted file mode 100644 (file)
index af080e7..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-#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);
-
-}
diff --git a/libsessiond/target_test/test_api_reg_unreg_add_user_wait.cpp b/libsessiond/target_test/test_api_reg_unreg_add_user_wait.cpp
new file mode 100644 (file)
index 0000000..0d87674
--- /dev/null
@@ -0,0 +1,146 @@
+#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);
+
+}