return SUBSESSION_ERROR_NONE;
}
-static int method_call_no_signal(gchar *method, GVariant *params) {
-
- MAKE_SURE_CONNECTION_IS_NOT_NULL();
-
- if(params == NULL) {
- LOGE("params is NULL");
- return_with_log_error_result_(SUBSESSION_ERROR_OUT_OF_MEMORY);
- }
-
- 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 ret = map_dbus_call_error_to_return_value(call_sync_error);
- log_if_error_(ret);
- g_error_free(call_sync_error);
- return ret;
- }
-
- 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);
-static int method_call_no_signal_return(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out) {
+ if (!params)
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
MAKE_SURE_CONNECTION_IS_NOT_NULL();
- GVariant *retgv = NULL;
- GError *call_sync_error;
- call_sync_error = NULL;
-
- retgv = g_dbus_connection_call_sync(
- conn_config_,
- method, params,
- out_type,
- G_DBUS_CALL_FLAGS_NONE,
- libsessiond_default_timeout,
- NULL,
- &call_sync_error
- );
+ GError *call_sync_error = NULL;
+ GVariant *retgv = g_dbus_connection_call_sync(
+ conn_config_,
+ method,
+ params,
+ out_type, // can be 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);
+ LOGE("Error while calling DBus method %s: %s", method, g_dbus_error_get_remote_error(call_sync_error));
int err = map_dbus_call_error_to_return_value(call_sync_error);
log_if_error_(err)
g_error_free(call_sync_error);
return err;
}
- *out = retgv;
+ if (out)
+ *out = retgv; // passed to caller, thus no g_variant_unref(retgv) in this case
+ else
+ g_variant_unref(retgv);
+
return SUBSESSION_ERROR_NONE;
}
+static inline int method_call_sync_simple(gchar *method, GVariant *params)
+{
+ return method_call_sync(method, params, NULL, NULL);
+}
+
static void callbacks_data_remove_client_data(client_callbacks_data_t *callbacks_data, signal_client_data_t *signal_client_data)
{
assert(callbacks_data);
static int subsession_add_user_wait_done(int session_uid, subsession_user_t user) {
GVariant * params = g_variant_new("(is)", session_uid, user);
- return_with_log_error_result_(method_call_no_signal(dbus_method_call.AddUserDone, params));
+ return_with_log_error_result_(method_call_sync_simple(dbus_method_call.AddUserDone, params));
}
static int subsession_remove_user_wait_done(int session_uid,subsession_user_t user) {
GVariant * params = g_variant_new("(is)", session_uid, user);
- return_with_log_error_result_(method_call_no_signal(dbus_method_call.RemoveUserDone, params));
+ return_with_log_error_result_(method_call_sync_simple(dbus_method_call.RemoveUserDone, params));
}
static int subsession_switch_wait_done(int session_uid, uint64_t switch_id) {
GVariant * params = g_variant_new("(ix)", session_uid, (gint64)switch_id);
- return_with_log_error_result_(method_call_no_signal(dbus_method_call.SwitchUserDone, params));
+ return_with_log_error_result_(method_call_sync_simple(dbus_method_call.SwitchUserDone, params));
}
EXPORT_API int subsession_event_wait_done(subsession_event_info info) {
return_with_log_error_result_( SUBSESSION_ERROR_INVALID_PARAMETER)
}
-EXPORT_API int subsession_get_user_list(int session_uid, subsession_user_t **user_list, int *user_count) {
-
+EXPORT_API int subsession_get_user_list(int session_uid, subsession_user_t **user_list, int *user_count)
+{
return_if(session_uid_is_not_valid(session_uid, user_count_ptr_is_null(user_count)))
g_autoptr(GVariant) out = NULL;
- int ret = method_call_no_signal_return(dbus_method_call.GetUserList,
- g_variant_new("(i)", session_uid),
- G_VARIANT_TYPE("(as)"),
- &out);
+ int ret = method_call_sync(dbus_method_call.GetUserList,
+ g_variant_new("(i)", session_uid),
+ G_VARIANT_TYPE("(as)"),
+ &out
+ );
if (ret != SUBSESSION_ERROR_NONE)
return ret;