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;
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) {
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) {
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;
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) &&
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,
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,
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) {
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,
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) {
_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);
}
GVariant *retgv = NULL;
- GError *call_sync_error;
- call_sync_error = NULL;
+ GError *call_sync_error = NULL;
retgv = g_dbus_connection_call_sync(
conn_config_,
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);
}
GVariant *retgv = NULL;
- GError *call_sync_error;
- call_sync_error = NULL;
+ GError *call_sync_error = NULL;
retgv = g_dbus_connection_call_sync(
conn_config_,
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);
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);
&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);
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);
}
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;