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;
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);
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);
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(
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) {
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;
}