int signal_subscribed;
} signal_client_data_t;
-int get_dbus_error_mapping_to_subsession_error(const char *dbus_error)
+static int get_dbus_error_mapping_to_subsession_error(const char *dbus_error)
{
size_t arr_size = sizeof(error_mappings) / sizeof(error_mappings[0]);
return SUBSESSION_ERROR_IO_ERROR;
}
-int map_dbus_call_error_to_return_value(const GError *error) {
+static int map_dbus_call_error_to_return_value(const GError *error) {
g_assert(error);
return SUBSESSION_ERROR_IO_ERROR;
}
-signal_client_data_t *make_new_signal_callback_client_data(void *client_callback, void *client_callback_data, GVariant *params) {
+static signal_client_data_t *make_new_signal_callback_client_data(void *client_callback, void *client_callback_data, GVariant *params) {
+
+ if(params == NULL) {
+ return NULL;
+ }
signal_client_data_t *signal_data = (signal_client_data_t *)malloc(sizeof(signal_client_data_t));
signal_data->client_callback_data = client_callback_data;
signal_data->params = params;
g_variant_ref(signal_data->params);
- g_assert(params != NULL);
return signal_data;
}
return NULL;
}
-gint g_compare_user_params ( gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_user_params ( gconstpointer client_data, gconstpointer parameters) {
signal_client_data_t *signal_client_data = (signal_client_data_t*)client_data;
return COMPARATOR_RESULT_DIFFERENT_;
}
-gint g_compare_session_uid_params ( gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_session_uid_params ( gconstpointer client_data, gconstpointer parameters) {
maybe_not_comparable_if(
client_data_are_null(client_data,
return COMPARATOR_RESULT_DIFFERENT_;
}
-gint g_compare_session_uid_params_switch_wait ( gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_session_uid_params_switch_wait ( gconstpointer client_data, gconstpointer parameters) {
maybe_not_comparable_if(
client_data_are_null(client_data,
return COMPARATOR_RESULT_DIFFERENT_;
}
-gint g_compare_session_uid_params_wait (gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_session_uid_params_wait (gconstpointer client_data, gconstpointer parameters) {
maybe_not_comparable_if(
client_data_are_null(client_data,
return COMPARATOR_RESULT_DIFFERENT_;
}
-signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
+static signal_client_data_t *take_from_callbacks_data_and_remove_from_list( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
signal_client_data_t *signal_data = NULL;
return signal_data;
}
-signal_client_data_t *find_in_callbacks_data( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
+static signal_client_data_t *find_in_callbacks_data( client_callbacks_data_t *client_callbacks_data, gconstpointer parameters, GCompareFunc compare_user_params) {
signal_client_data_t *signal_data = NULL;
const int cb_result_ok = 0;
-void call_reply_callback(signal_client_data_t *signal_data, int ret_status) {
+static void call_reply_callback(signal_client_data_t *signal_data, int ret_status) {
subsession_reply_callback reply_cb = signal_data->client_callback;
void *client_callback_data = signal_data->client_callback_data;
#define signal_add_user_complete_handler signal_user_ops_complete_handler
#define signal_remove_user_complete_handler signal_user_ops_complete_handler
-gint g_compare_switch_user_params ( gconstpointer client_data, gconstpointer parameters) {
+static gint g_compare_switch_user_params ( gconstpointer client_data, gconstpointer parameters) {
maybe_not_comparable_if(
client_data_are_null(client_data,
_signal_name, \
session_connection_data.objpath
-int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
+static int subscribe_and_call_method(gchar *method, GVariant *params, gchar *signal_name, guint *signal_subscribed_id, GDBusSignalCallback signal_callback, gpointer client_callbacks) {
GError *error = NULL;
return SUBSESSION_ERROR_NONE;
}
-int method_call_no_signal(gchar *method, GVariant *params) {
+static int method_call_no_signal(gchar *method, GVariant *params) {
GError *error = NULL;
}
}
if(params == NULL) {
- return SUBSESSION_ERROR_INVALID_PARAMETER;
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
}
GVariant *retgv = NULL;
return SUBSESSION_ERROR_NONE;
}
-int method_call_no_signal_return(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out) {
+static int method_call_no_signal_return(gchar *method, GVariant *params, const GVariantType *out_type, GVariant **out) {
GError *error;
error = NULL;
return SUBSESSION_ERROR_NONE;
}
-void client_data_cleansweep_mt( signal_client_data_t *signal_client_data, client_callbacks_data_t *callbacks_data) {
+static void client_data_cleansweep_mt( signal_client_data_t *signal_client_data, client_callbacks_data_t *callbacks_data) {
g_mutex_lock(&callbacks_data->mutex);
callbacks_data->list = g_list_remove(callbacks_data->list, (gconstpointer) signal_client_data);
free(signal_client_data);
}
-void init_callbacks_list(client_callbacks_data_t *callbacks_data, GVariant *params) {
+static int init_callbacks_list(client_callbacks_data_t *callbacks_data, GVariant *params) {
if(callbacks_data->list == NULL) {
signal_client_data_t *signal_client_empty_data = make_new_signal_callback_client_data(NULL, NULL, params);
+ if(signal_client_empty_data == NULL) {
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
+ }
callbacks_data->list = g_list_append(callbacks_data->list, (gpointer) signal_client_empty_data);
}
+ return SUBSESSION_ERROR_NONE;
}
#define callbacks_data_append_to_list(callback_data, data) \
callback_data.list = g_list_append(callback_data.list, data)
+static int append_to_callbacks_list(client_callbacks_data_t *callbacks_data_mt, GVariant *init_params, signal_client_data_t *signal_client_data, subsession_reply_callback cb, void *cb_data) {
+
+ if(init_params == NULL || signal_client_data == NULL ) {
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
+ }
+
+ g_mutex_lock(&callbacks_data_mt->mutex);
+ int init_callbacks_list_res = init_callbacks_list(callbacks_data_mt, init_params);
+
+ if(init_callbacks_list_res != SUBSESSION_ERROR_NONE) {
+ g_mutex_unlock(&callbacks_data_mt->mutex);
+ return init_callbacks_list_res;
+ }
+ callbacks_data_mt->list = g_list_append(callbacks_data_mt->list, signal_client_data);
+
+ g_mutex_unlock(&callbacks_data_mt->mutex);
+
+ return SUBSESSION_ERROR_NONE;
+}
EXPORT_API int subsession_add_user(int session_uid, int user, subsession_reply_callback cb, void *cb_data) {
callbacks_data_are_null(cb_data))))
)
- g_mutex_lock (&add_user_callbacks_data_mt.mutex);
-
- init_callbacks_list(&add_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
-
- 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, 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);
+ ret_if_err_( append_to_callbacks_list(&add_user_callbacks_data_mt,
+ g_variant_new("(ii)", -1, -1),
+ signal_client_data,
+ cb, cb_data))
- g_mutex_unlock(&add_user_callbacks_data_mt.mutex);
int method_call_result = subscribe_and_call_method(
- dbus_method_call.AddUser, params,
+ dbus_method_call.AddUser, signal_client_data->params,
dbus_signal_name.AddUserCompleted,
&dbus_signal_subscribed.AddUserCompleted,
signal_add_user_complete_handler,
callbacks_data_are_null(cb_data))))
)
- g_mutex_lock (&remove_user_callbacks_data_mt.mutex);
+ signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, g_variant_new("(ii)", session_uid, user));
- init_callbacks_list(&remove_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
-
- 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);
-
- g_mutex_unlock(&remove_user_callbacks_data_mt.mutex);
+ ret_if_err_( append_to_callbacks_list(&remove_user_callbacks_data_mt,
+ g_variant_new("(ii)", -1, -1),
+ signal_client_data,
+ cb, cb_data))
int method_call_result = subscribe_and_call_method(
- dbus_method_call.RemoveUser, params,
+ dbus_method_call.RemoveUser, signal_client_data->params,
dbus_signal_name.RemoveUserCompleted,
&dbus_signal_subscribed.RemoveUserCompleted,
signal_remove_user_complete_handler,
callbacks_data_are_null(cb_data))))
)
- g_mutex_lock (&switch_user_callbacks_data_mt.mutex);
-
- init_callbacks_list(&switch_user_callbacks_data_mt, g_variant_new("(ii)", -1, -1));
-
- GVariant * params;
- params = g_variant_new("(ii)", session_uid, next_user);
+ signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, g_variant_new("(ii)", session_uid, next_user));
- signal_client_data_t *signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
- callbacks_data_append_to_list(switch_user_callbacks_data_mt, signal_client_data);
-
- g_mutex_unlock(&switch_user_callbacks_data_mt.mutex);
+ ret_if_err_( append_to_callbacks_list(&switch_user_callbacks_data_mt,
+ g_variant_new("(ii)", -1, -1),
+ signal_client_data,
+ cb, cb_data))
int method_call_result = subscribe_and_call_method (
- dbus_method_call.SwitchUser, params,
+ dbus_method_call.SwitchUser, signal_client_data->params,
dbus_signal_name.SwitchUserCompleted,
&dbus_signal_subscribed.SwitchUserCompleted,
signal_switch_user_complete_handler,
typedef struct {
signal_client_data_t *signal_client_data;
int is_registered;
+ int error;
} registered_signal_t;
registered_signal_t subsession_register_event_in_list(client_callbacks_data_t *callbacks_data, GVariant *init_params, GVariant *params, subsession_event_callback cb, void *cb_data) {
+ registered_signal_t registered_signal = {0};
g_mutex_lock(&callbacks_data->mutex);
- init_callbacks_list(callbacks_data, init_params);
+ int init_callbacks_res = init_callbacks_list(callbacks_data, init_params);
+
+ if(init_callbacks_res != SUBSESSION_ERROR_NONE) {
+ g_mutex_unlock(&callbacks_data->mutex);
+ registered_signal.error = SUBSESSION_ERROR_OUT_OF_MEMORY;
+ return registered_signal;
+ }
+
signal_client_data_t *signal_client_data = NULL;
- registered_signal_t registered_signal;
GList *found_data = g_list_find_custom( callbacks_data->list , (gconstpointer) params, g_compare_session_uid_params );
if(found_data == NULL) {
registered_signal.is_registered = 0;
signal_client_data = make_new_signal_callback_client_data(cb, cb_data, params);
+
+ if (signal_client_data == NULL) {
+ g_mutex_unlock(&callbacks_data->mutex);
+ registered_signal.error = SUBSESSION_ERROR_OUT_OF_MEMORY;
+ return registered_signal;
+ }
callbacks_data->list = g_list_append(callbacks_data->list, signal_client_data);
} else {
//This will change callback function and data.
signal_client_data->client_callback_data = cb_data;
}
registered_signal.signal_client_data = signal_client_data;
+ registered_signal.error = SUBSESSION_ERROR_NONE;
g_mutex_unlock(&callbacks_data->mutex);
return registered_signal;
int register_event_callback(client_callbacks_data_t *callbacks_data, GDBusSignalCallback signal_callback, int session_uid, subsession_event_callback cb, void * cb_data) {
+ return_if(
+ callbacks_data_are_null(callbacks_data,
+ signal_callback_is_null(signal_callback,
+ session_uid_is_not_valid(session_uid,
+ callback_is_null(cb,
+ callbacks_data_are_null(cb)))))
+ )
+
GVariant * params = g_variant_new("(i)", session_uid);
+ if(params == NULL) {
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
+ }
+
registered_signal_t registered_signal = subsession_register_event_in_list(callbacks_data, default_wait_params_, cb_data_ );
+ if(registered_signal.error != SUBSESSION_ERROR_NONE) {
+ return registered_signal.error;
+ }
+
if(registered_signal.is_registered) {
return SUBSESSION_ERROR_NONE;
}
GVariant * params = g_variant_new("(i)", session_uid);
+ if(params == NULL) {
+ return SUBSESSION_ERROR_OUT_OF_MEMORY;
+ }
+
registered_signal_t registered_signal = subsession_register_event_in_list(callbacks_data, default_wait_params_, cb_data_ );
+
+ if(registered_signal.error != SUBSESSION_ERROR_NONE) {
+ return registered_signal.error;
+ }
+
if(registered_signal.is_registered) {
return SUBSESSION_ERROR_NONE;
}
return SUBSESSION_ERROR_NONE;
}
-#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) {