Add handler for SUBSESSION_SWITCH_USER_WAIT and SUBSESSION_SWITCH_USER_COMPLETION 33/274733/6
authorArkadiusz Nowak <a.nowak3@samsung.com>
Mon, 25 Apr 2022 12:17:49 +0000 (14:17 +0200)
committerArkadiusz Nowak <a.nowak3@samsung.com>
Wed, 11 May 2022 05:39:52 +0000 (07:39 +0200)
Change methods calls in callbacks data  to correct ones.
Remove unused parameter "event_bits" in register_event_callback and subscribe_only_callback

Change-Id: If451d81d5ab193061a0ab46ddd61fa9d3769526d

libsessiond/src/lib.c

index 9e0c42ce54cf4cc8200bc57b00e83dbead20dff4..6cbf900e2b57135691fe56adb615d6e8e938ca50 100644 (file)
@@ -122,22 +122,26 @@ client_callbacks_data_t switch_user_callbacks_data_mt = {
 
 client_callbacks_data_t add_user_wait_callbacks_data_mt = {
        .list = NULL,
-       .dbus_method_call = "AddUserStart",
+       .dbus_method_call = "AddUserWait",
        .dbus_signal = "AddUserStarted"
 };
 
 client_callbacks_data_t remove_user_wait_callbacks_data_mt = {
        .list = NULL,
-       .dbus_method_call = "RemoveUserStart",
+       .dbus_method_call = "RemoveUserWait",
        .dbus_signal = "RemoveUserStarted"
 };
 
-client_callbacks_data_t switch_user_listen_callbacks_data_mt = {
+client_callbacks_data_t switch_user_wait_callbacks_data_mt = {
        .list = NULL,
+       .dbus_method_call = "SwitchUserWait",
+       .dbus_signal = "SwitchUserStarted"
 };
 
-GList *add_user_wait_callbacks_list = NULL;
-GMutex add_user_wait_mutex;
+client_callbacks_data_t switch_user_completion_callbacks_data_mt = {
+       .list = NULL,
+       .dbus_signal = "SwitchUserCompleted"
+};
 
 typedef struct {
        void *client_callback;
@@ -172,20 +176,30 @@ signal_client_data_t *make_new_signal_callback_client_data(void *client_callback
        return NULL;
 }
 
+//use when function return err value
+#define maybe_g_variant_get_int_(var, c_str_, args...) \
+       if (!g_variant_is_of_type(var, G_VARIANT_TYPE(c_str_) )) { return -1; } \
+       g_variant_get(var, c_str_, args)
+
+//use if function return void type
+#define maybe_g_variant_get_void_(var, c_str_, args...) \
+       if (!g_variant_is_of_type(var, G_VARIANT_TYPE(c_str_) )) { return; } \
+       g_variant_get(var, c_str_, args)
+
 gint g_compare_user_params (  gconstpointer client_data,   gconstpointer parameters) {
 
        signal_client_data_t *signal_client_data = (signal_client_data_t*)client_data;
 
        int client_session_uid = 0;
        int client_user = 0;
-       g_variant_get(signal_client_data->params, "(ii)", &client_session_uid, &client_user);
+       maybe_g_variant_get_int_(signal_client_data->params, "(ii)", &client_session_uid, &client_user);
 
        GVariant *params = (GVariant *)parameters;
 
        int params_session_uid = 0;
        int params_user = 0;
 
-       g_variant_get(params, "(ii)", &params_session_uid, &params_user);
+       maybe_g_variant_get_int_(params, "(ii)", &params_session_uid, &params_user);
 
        if( client_session_uid == params_session_uid &&
                client_user == params_user) {
@@ -200,13 +214,13 @@ gint g_compare_session_uid_params (  gconstpointer client_data,   gconstpointer
        signal_client_data_t *signal_client_data = (signal_client_data_t*)client_data;
 
        int client_session_uid = 0;
-       g_variant_get(signal_client_data->params, "(i)", &client_session_uid);
+       maybe_g_variant_get_int_(signal_client_data->params, "(i)", &client_session_uid);
 
        GVariant *params = (GVariant *)parameters;
 
        int params_session_uid = 0;
 
-       g_variant_get(params, "(i)", &params_session_uid);
+       maybe_g_variant_get_int_(params, "(i)", &params_session_uid);
 
        if( client_session_uid == params_session_uid) {
 
@@ -281,7 +295,7 @@ gint g_compare_switch_user_params (  gconstpointer client_data,   gconstpointer
        int client_session_uid = 0;
        int client_prev_user = 0;
        int client_next_user = 0;
-       g_variant_get(signal_client_data->params, "(iii)", &client_session_uid, &client_prev_user, &client_next_user);
+       maybe_g_variant_get_int_(signal_client_data->params, "(iii)", &client_session_uid, &client_prev_user, &client_next_user);
 
        GVariant *params = (GVariant *)parameters;
 
@@ -290,7 +304,7 @@ gint g_compare_switch_user_params (  gconstpointer client_data,   gconstpointer
        int params_prev_user = 0;
        int params_next_user = 0;
 
-       g_variant_get(params, "(ixii)", &params_session_uid, &params_switch_id, &params_prev_user, &params_next_user);
+       maybe_g_variant_get_int_(params, "(ixii)", &params_session_uid, &params_switch_id, &params_prev_user, &params_next_user);
 
        gboolean all_ok = (client_session_uid == params_session_uid) &&
                                         (client_prev_user == params_prev_user) &&
@@ -303,7 +317,7 @@ gint g_compare_switch_user_params (  gconstpointer client_data,   gconstpointer
        return -1;
 }
 
-static void incoming_signal_answer_for_method_switch_user(
+static void signal_switch_user_complete_handler(
        GDBusConnection *connection,
        const gchar *sender_name,
        const gchar *object_path,
@@ -335,26 +349,39 @@ static void incoming_signal_answer_for_method_switch_user(
        return;
 }
 
-static void signal_switch_user_complete_handler(GDBusConnection *connection,
+static void signal_add_user_started_handler(GDBusConnection *connection,
        const gchar *sender_name,
        const gchar *object_path,
        const gchar *interface_name,
        const gchar *signal_name,
        GVariant *parameters,
-       gpointer client_data) {
+       gpointer client_data)
+{
+       if (parameters == NULL) {
+               return;
+       }
+       client_callbacks_data_t *client_callbacks_data = &switch_user_callbacks_data_mt;
 
-       incoming_signal_answer_for_method_switch_user(connection,
-                       sender_name,
-                       object_path,
-                       interface_name,
-                       signal_name,
-                       parameters,
-                       client_data     );
+       if(client_callbacks_data->list == NULL) {
+               return;
+       }
 
-       // function call for signal only here...
+       signal_client_data_t *signal_data = find_in_callbacks_data(client_callbacks_data, parameters, g_compare_session_uid_params);
+
+       if(signal_data == NULL || signal_data->client_callback == NULL) {
+               return ;
+       }
+
+       subsession_event_info event_info;
+
+       event_info.add_user.event = SUBSESSION_ADD_USER_WAIT;
+       maybe_g_variant_get_void_(parameters, "(ii)", &event_info.add_user.session_uid, &event_info.add_user.user);
+
+       subsession_event_callback event_callback = signal_data->client_callback;
+       event_callback(event_info, signal_data->client_callback_data);
 }
 
-static void signal_add_user_started_handler(GDBusConnection *connection,
+static void signal_remove_user_started_handler(GDBusConnection *connection,
        const gchar *sender_name,
        const gchar *object_path,
        const gchar *interface_name,
@@ -362,6 +389,9 @@ static void signal_add_user_started_handler(GDBusConnection *connection,
        GVariant *parameters,
        gpointer client_data)
 {
+       if(parameters == NULL) {
+               return;
+       }
        client_callbacks_data_t *client_callbacks_data = &switch_user_callbacks_data_mt;
 
        if(client_callbacks_data->list == NULL) {
@@ -370,25 +400,21 @@ static void signal_add_user_started_handler(GDBusConnection *connection,
 
        signal_client_data_t *signal_data = find_in_callbacks_data(client_callbacks_data, parameters, g_compare_session_uid_params);
 
-       if(signal_data == NULL) {
-               return;
-       }
-
-       if(signal_data->client_callback == NULL) {
+       if(signal_data == NULL || signal_data->client_callback == NULL) {
                return ;
        }
 
        subsession_event_info event_info;
 
-       event_info.add_user.event = SUBSESSION_ADD_USER_WAIT;
-       g_variant_get(parameters, "(ii)", &event_info.add_user.session_uid, &event_info.add_user.user);
+       event_info.remove_user.event = SUBSESSION_REMOVE_USER_WAIT;
+       maybe_g_variant_get_void_(parameters, "(ii)", &event_info.remove_user.session_uid, &event_info.remove_user.user);
 
        subsession_event_callback event_callback = signal_data->client_callback;
        event_callback(event_info, signal_data->client_callback_data);
        return;
 }
 
-static void signal_remove_user_started_handler(GDBusConnection *connection,
+static void signal_switch_user_started_handler(GDBusConnection *connection,
        const gchar *sender_name,
        const gchar *object_path,
        const gchar *interface_name,
@@ -396,30 +422,71 @@ static void signal_remove_user_started_handler(GDBusConnection *connection,
        GVariant *parameters,
        gpointer client_data)
 {
+       if (parameters == NULL ) {
+               return;
+       }
+
        client_callbacks_data_t *client_callbacks_data = &switch_user_callbacks_data_mt;
 
-       if(client_callbacks_data->list == NULL) {
+       if(client_callbacks_data->list == NULL ) {
                return;
        }
 
        signal_client_data_t *signal_data = find_in_callbacks_data(client_callbacks_data, parameters, g_compare_session_uid_params);
 
-       if(signal_data == NULL) {
+       if(signal_data == NULL || signal_data->client_callback == NULL) {
+               return ;
+       }
+
+       subsession_event_info event_info = {0};
+
+       event_info.switch_user.event = SUBSESSION_SWITCH_USER_WAIT;
+       maybe_g_variant_get_void_(parameters, "(ixii)",
+               &event_info.remove_user.session_uid,
+               &event_info.switch_user.switch_id,
+               &event_info.switch_user.prev_user,
+               &event_info.switch_user.next_user);
+
+       subsession_event_callback event_callback = signal_data->client_callback;
+       event_callback(event_info, signal_data->client_callback_data);
+}
+
+static void  signal_switch_user_completion_handler( GDBusConnection *connection,
+       const gchar *sender_name,
+       const gchar *object_path,
+       const gchar *interface_name,
+       const gchar *signal_name,
+       GVariant *parameters,
+       gpointer client_data)
+{
+       if (parameters == NULL) {
                return;
        }
 
-       if(signal_data->client_callback == NULL) {
+       client_callbacks_data_t *client_callbacks_data = &switch_user_callbacks_data_mt;
+
+       if(client_callbacks_data->list == NULL) {
+               return;
+       }
+
+       signal_client_data_t *signal_data = find_in_callbacks_data(client_callbacks_data, parameters, g_compare_session_uid_params);
+
+       if(signal_data == NULL || signal_data->client_callback == NULL) {
                return ;
        }
 
-       subsession_event_info event_info;
+       subsession_event_info event_info = {0};
 
-       event_info.remove_user.event = SUBSESSION_REMOVE_USER_WAIT;
-       g_variant_get(parameters, "(ii)", &event_info.remove_user.session_uid, &event_info.remove_user.user);
+       event_info.switch_user.event = SUBSESSION_SWITCH_USER_COMPLETION;
+
+       maybe_g_variant_get_void_(parameters, "(ixii)",
+               &event_info.remove_user.session_uid,
+               &event_info.switch_user.switch_id,
+               &event_info.switch_user.prev_user,
+               &event_info.switch_user.next_user);
 
        subsession_event_callback event_callback = signal_data->client_callback;
        event_callback(event_info, signal_data->client_callback_data);
-       return;
 }
 
 static void signal_unsubscribed_callback(void *data) {
@@ -437,11 +504,10 @@ static void signal_unsubscribed_callback(void *data) {
                        _signal_name, \
                        session_connection_data.objpath
 
-//deprecated
 
 int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
-       GError *error;
-       error = NULL;
+
+       GError *error = NULL;
 
        if (session_connection_data.connection == NULL) {
                session_connection_data.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
@@ -462,8 +528,7 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
        }
 
        GVariant *retgv = NULL;
-       GError *call_sync_error;
-       call_sync_error = NULL;
+       GError *call_sync_error = NULL;
 
        retgv = g_dbus_connection_call_sync(
                conn_config_,
@@ -487,8 +552,7 @@ int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_nam
 
 int method_call_no_signal(gchar *method, GVariant *params) {
 
-       GError *error;
-       error = NULL;
+       GError *error = NULL;
 
        if (session_connection_data.connection == NULL) {
                session_connection_data.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
@@ -498,8 +562,7 @@ int method_call_no_signal(gchar *method, GVariant *params) {
        }
 
        GVariant *retgv = NULL;
-       GError *call_sync_error;
-       call_sync_error = NULL;
+       GError *call_sync_error = NULL;
 
        retgv = g_dbus_connection_call_sync(
                conn_config_,
@@ -584,8 +647,7 @@ EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_c
 
        init_callbacks_list(&add_user_callbacks_data_mt,  g_variant_new("(ii)", -1, -1));
 
-       GVariant * params;
-       params = g_variant_new("(ii)", session_uid, user);
+       GVariant * params = g_variant_new("(ii)", session_uid, user);
 
        signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
        callbacks_data_append_to_list(add_user_callbacks_data_mt, signal_client_data);
@@ -613,8 +675,7 @@ EXPORT_API int subsession_remove_user(int session_uid, int user, subsession_repl
 
        init_callbacks_list(&remove_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
 
-       GVariant * params;
-       params = g_variant_new("(ii)", session_uid, user);
+       GVariant * params = g_variant_new("(ii)", session_uid, user);
 
        signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
        callbacks_data_append_to_list(remove_user_callbacks_data_mt, signal_client_data);
@@ -714,7 +775,7 @@ registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *c
        &callbacks_data_mt.dbus_signal_subscribed
 
 
-int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void * cb_data) {
+int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void * cb_data) {
 
        GVariant * params = g_variant_new("(i)", session_uid);
 
@@ -731,43 +792,75 @@ int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignal
 
        if (method_call_result == 0) { return 0;}
 
-       subsession_event_info event_info;
-       event_info.add_user.user = -1;
-       cb(event_info, cb_data);
        client_data_cleansweep_mt(registered_signal.signal_client_data, callbacks_data);
 
        return method_call_result;
 }
 
-EXPORT_API int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data) {
+int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void * cb_data) {
 
-       switch (event_bits) {
-               case SUBSESSION_ADD_USER_WAIT:
-                       return register_event_callback(&add_user_wait_callbacks_data_mt, signal_add_user_started_handler, session_uid, event_bits, cb, cb_data);
-               break;
-               case SUBSESSION_REMOVE_USER_WAIT:
-                       return register_event_callback(&remove_user_wait_callbacks_data_mt, signal_remove_user_started_handler, session_uid, event_bits, cb, cb_data);
-               break;
+       GVariant * params = g_variant_new("(i)", session_uid);
 
-               break;
+       registered_signal_t registered_signal = subsession_register_event_in_list(callbacks_data, default_wait_params_, cb_data_ );
 
+       if(registered_signal.is_registered) {
+               return 0;
+       }
+
+       GError *error = NULL;
+
+       if (session_connection_data.connection == NULL) {
+               session_connection_data.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+               if(error != NULL) {
+                       g_error_free(error);
+                       client_data_cleansweep_mt(registered_signal.signal_client_data, callbacks_data);
+                       return -ENOTCONN;
+               }
+       }
+
+       if (callbacks_data->dbus_signal_subscribed == 0) {
+               callbacks_data->dbus_signal_subscribed = g_dbus_connection_signal_subscribe(
+                       subscribe_cfg_(callbacks_data->dbus_signal),
+                       NULL,
+                       G_DBUS_SIGNAL_FLAGS_NONE,
+                       signal_callback,
+                       callbacks_data,
+                       signal_unsubscribed_callback);
+       }
+       return 0;
+}
+
+#define ret_if_err_(func_) \
+       int err_ = func_; \
+       if(err_) {return err_ ;}
+
+EXPORT_API int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data) {
+
+       if (event_bits & SUBSESSION_ADD_USER_WAIT) {
+               ret_if_err_(register_event_callback(&add_user_wait_callbacks_data_mt, signal_add_user_started_handler, session_uid, cb, cb_data))
+       }
+       if (event_bits & SUBSESSION_REMOVE_USER_WAIT) {
+               ret_if_err_(register_event_callback(&remove_user_wait_callbacks_data_mt, signal_remove_user_started_handler, session_uid, cb, cb_data))
+       }
+       if (event_bits & SUBSESSION_SWITCH_USER_WAIT) {
+               ret_if_err_(register_event_callback(&switch_user_wait_callbacks_data_mt, signal_switch_user_started_handler, session_uid, cb, cb_data))
+       }
+       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;
 }
 
 EXPORT_API int subsession_add_user_wait_done(int session_uid, int user) {
 
-       GVariant * params;
-       params = g_variant_new("(ii)", session_uid, user);
+       GVariant * params = g_variant_new("(ii)", session_uid, user);
 
        return method_call_no_signal(dbus_method_call.AddUserDone, params);
 }
 
-
 EXPORT_API int subsession_remove_user_wait_done(int session_uid, int user) {
 
-       GVariant * params;
-       params = g_variant_new("(ii)", session_uid, user);
+       GVariant * params = g_variant_new("(ii)", session_uid, user);
 
        return method_call_no_signal(dbus_method_call.RemoveUserDone, params);
 }
@@ -777,7 +870,6 @@ EXPORT_API int subsession_switch_wait_done(int session_uid, uint64_t switch_id)
        return TIZEN_ERROR_ACCOUNT;
 }
 
-
 EXPORT_API int subsession_get_user_list(int session_uid, int **user_list, int *user_count) {
 
        g_autoptr(GVariant) out = NULL;