From: Arkadiusz Nowak Date: Mon, 25 Apr 2022 12:17:49 +0000 (+0200) Subject: Add handler for SUBSESSION_SWITCH_USER_WAIT and SUBSESSION_SWITCH_USER_COMPLETION X-Git-Tag: submit/tizen/20220603.143851~1^2~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1a8b40fd861e4a3b3344ec2e5edeb860d2c0686b;p=platform%2Fcore%2Fsystem%2Fsessiond.git Add handler for SUBSESSION_SWITCH_USER_WAIT and SUBSESSION_SWITCH_USER_COMPLETION 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 --- diff --git a/libsessiond/src/lib.c b/libsessiond/src/lib.c index 9e0c42c..6cbf900 100644 --- a/libsessiond/src/lib.c +++ b/libsessiond/src/lib.c @@ -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)", ¶ms_session_uid, ¶ms_user); + maybe_g_variant_get_int_(params, "(ii)", ¶ms_session_uid, ¶ms_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)", ¶ms_session_uid); + maybe_g_variant_get_int_(params, "(i)", ¶ms_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)", ¶ms_session_uid, ¶ms_switch_id, ¶ms_prev_user, ¶ms_next_user); + maybe_g_variant_get_int_(params, "(ixii)", ¶ms_session_uid, ¶ms_switch_id, ¶ms_prev_user, ¶ms_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;