library: Move all of dbus signal subscription logic to register_event_callback 49/278749/3
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Tue, 26 Jul 2022 22:47:31 +0000 (00:47 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 28 Jul 2022 13:28:32 +0000 (15:28 +0200)
Change-Id: I2fa04d1095569e709adbbce6e297a68f6668fb94

libsessiond/src/lib.c

index 96f8e57..1eae423 100644 (file)
@@ -48,6 +48,12 @@ static session_connection_data_t session_connection_data = {
                session_connection_data.objpath, \
                session_connection_data.interface \
 
+#define subscribe_cfg_(_signal_name)           \
+                       session_connection_data.connection,\
+                       session_connection_data.bus_name , \
+                       session_connection_data.interface, \
+                       _signal_name, \
+                       session_connection_data.objpath
 static struct {
        gchar * AddUser;
        gchar * RemoveUser;
@@ -497,52 +503,6 @@ static void signal_switch_user_completion_handler(GDBusConnection *connection,
        signal_switch_user_common_handler(connection, sender_name, object_path, interface_name, signal_name, parameters, client_data, SUBSESSION_SWITCH_USER_COMPLETION);
 }
 
-#define subscribe_cfg_(_signal_name)           \
-                       session_connection_data.connection,\
-                       session_connection_data.bus_name , \
-                       session_connection_data.interface, \
-                       _signal_name, \
-                       session_connection_data.objpath
-
-static int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
-
-       MAKE_SURE_CONNECTION_IS_NOT_NULL();
-
-       if( *signal_subscribed_id == 0 ) {
-                       *signal_subscribed_id = g_dbus_connection_signal_subscribe(
-                       subscribe_cfg_(signal_name),
-                       NULL,
-                       G_DBUS_SIGNAL_FLAGS_NONE,
-                       signal_callback,
-                       client_callbacks,
-                       NULL);
-       }
-
-       GVariant *retgv = NULL;
-       GError *call_sync_error = NULL;
-
-       retgv = g_dbus_connection_call_sync(
-               conn_config_,
-               method, params,
-               NULL,
-               G_DBUS_CALL_FLAGS_NONE,
-               libsessiond_default_timeout,
-               NULL,
-               &call_sync_error
-       );
-
-       if (!retgv || call_sync_error) {
-               LOGE("Dbus error: %s for method: %s" , g_dbus_error_get_remote_error(call_sync_error), method);
-               int err = map_dbus_call_error_to_return_value(call_sync_error);
-               log_if_error_(err);
-               g_error_free(call_sync_error);
-               return err;
-       }
-       g_variant_unref(retgv);
-
-       return SUBSESSION_ERROR_NONE;
-}
-
 static int method_call_sync(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out)
 {
        assert(method);
@@ -733,24 +693,13 @@ static int callbacks_data_push(client_callbacks_data_t *callbacks_data, GVariant
        return SUBSESSION_ERROR_NONE;
 }
 
-#define dbus_data_(callbacks_data_mt, params) \
-       callbacks_data_mt.dbus_method_call, \
-       params, \
-       callbacks_data_mt.dbus_signal, \
-       &callbacks_data_mt.dbus_signal_subscribed
-
-#define dbus_data_ptr_(callbacks_data_mt, params) \
-       callbacks_data_mt->dbus_method_call, \
-       params, \
-       callbacks_data_mt->dbus_signal, \
-       &callbacks_data_mt->dbus_signal_subscribed
-
 static int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void *cb_data)
 {
+       assert(callbacks_data);
+       assert(signal_callback);
+
        return_if(
-               signal_callback_is_null(signal_callback,
-               session_uid_is_not_valid(session_uid,
-               callback_is_null(cb)))
+               session_uid_is_not_valid(session_uid, callback_is_null(cb))
        )
 
        GVariant *params = g_variant_new("(i)", session_uid);
@@ -758,45 +707,15 @@ static int register_event_callback(client_callbacks_data_t *callbacks_data, GDBu
                return_with_log_error_result_(SUBSESSION_ERROR_OUT_OF_MEMORY)
        }
 
-       signal_client_data_t *client_data = NULL;
-       int ret = callbacks_data_push(callbacks_data, params, cb, cb_data, &client_data);
-       if (ret != SUBSESSION_ERROR_NONE) {
-               return_with_log_error_result_(ret);
-       }
-
-       int method_call_result = subscribe_and_call_method(
-                               dbus_data_ptr_(callbacks_data, params),
-                               signal_callback,
-                               (gpointer) callbacks_data);
-
-       if (method_call_result == 0) {
-               return SUBSESSION_ERROR_NONE;
-       }
-       log_if_error_(method_call_result)
-
-       callbacks_data_remove_client_data(callbacks_data, client_data);
-
-       return method_call_result;
-}
-
-static int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void *cb_data)
-{
-       assert(callbacks_data);
-
-       GVariant *params = g_variant_new("(i)", session_uid);
-       if (params == NULL) {
-               return_with_log_error_result_(SUBSESSION_ERROR_OUT_OF_MEMORY);
-       }
+       MAKE_SURE_CONNECTION_IS_NOT_NULL();
 
        signal_client_data_t *client_data = NULL;
        int ret = callbacks_data_push(callbacks_data, params, cb, cb_data, &client_data);
        if (ret != SUBSESSION_ERROR_NONE) {
-               return ret;
+               return_with_log_error_result_(ret);
        }
 
-       MAKE_SURE_CONNECTION_IS_NOT_NULL(
-               callbacks_data_remove_client_data(callbacks_data, client_data);
-       );
+       g_mutex_lock(&callbacks_data->mutex);
 
        if (callbacks_data->dbus_signal_subscribed == 0) {
                callbacks_data->dbus_signal_subscribed = g_dbus_connection_signal_subscribe(
@@ -807,7 +726,19 @@ static int subscribe_only_callback(client_callbacks_data_t *callbacks_data, GDBu
                        callbacks_data,
                        NULL);
        }
-       return SUBSESSION_ERROR_NONE;
+
+       ret = SUBSESSION_ERROR_NONE;
+       if (callbacks_data->dbus_method_call)
+               ret = method_call_sync_simple(callbacks_data->dbus_method_call, params);
+
+       g_mutex_unlock(&callbacks_data->mutex);
+
+       if (ret != SUBSESSION_ERROR_NONE) {
+               log_if_error_(ret)
+               callbacks_data_remove_client_data(callbacks_data, client_data);
+       }
+
+       return ret;
 }
 
 EXPORT_API int subsession_register_event_callback(int session_uid, subsession_event_type_e event_bits, subsession_event_callback cb, void *cb_data) {
@@ -822,7 +753,7 @@ EXPORT_API int subsession_register_event_callback(int session_uid, subsession_ev
                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))
+               ret_if_err_(register_event_callback(&switch_user_completion_callbacks_data_mt, signal_switch_user_completion_handler, session_uid, cb, cb_data))
        }
        return SUBSESSION_ERROR_NONE;
 }