#include <systemd/sd-login.h>
#include <gio/gio.h>
#include <sys/stat.h>
+#include <aul.h>
#include "media_controller_svc.h"
#include "media_controller_private.h"
}
}
+static int __mc_list_get_index(GList *list, int pid, mc_priv_type_e priv_type)
+{
+ unsigned int length_of_list = 0;
+ unsigned int i;
+ mc_list_data_set_t *ptr = NULL;
+
+ mc_retvm_if(list == NULL, -1, "list is null");
+
+ length_of_list = (unsigned int)g_list_length(list);
+ for (i = 0; i < length_of_list; i++) {
+ ptr = g_list_nth_data(list, i);
+ if (ptr == NULL)
+ continue;
+ if (ptr->pid == pid) {
+ if (ptr->priv_type == priv_type)
+ return i;
+ }
+ }
+ return -1;
+}
+
+static int __mc_list_remove_item(GList **list, int index)
+{
+ mc_retvm_if(list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid list");
+ mc_retvm_if(index < 0 || index >= (int)g_list_length(*list), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index");
+
+ mc_secure_error("[No-error] index : %d", index);
+
+ mc_list_data_set_t *app_data = g_list_nth_data(*list, index);
+ if (app_data != NULL) {
+ *list = g_list_remove(*list, app_data);
+ MC_SAFE_FREE(app_data->app_id);
+ if (app_data->s_data != NULL) {
+ mc_secure_error("[No-error] sub_data length [%u]", g_list_length(app_data->s_data));
+ g_list_free_full(app_data->s_data, __mc_destroy_data_list);
+ }
+ MC_SAFE_FREE(app_data);
+ mc_secure_error("[No-error] data has been removed");
+ }
+
+ return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
static int _mc_service_init(mc_service_t **data)
{
int res = MEDIA_CONTROLLER_ERROR_NONE;
return TRUE;
}
-static int _mc_service_get_list_index(GList *list, int pid, mc_priv_type_e priv_type)
-{
- unsigned int length_of_list = 0;
- unsigned int i;
- mc_list_data_set_t *ptr = NULL;
-
- if (list == NULL)
- return -1;
-
- length_of_list = (unsigned int)g_list_length(list);
- for (i = 0; i < length_of_list; i++) {
- ptr = g_list_nth_data(list, i);
- if (ptr == NULL)
- return -1;
- if (ptr->pid == pid) {
- if (ptr->priv_type == priv_type)
- return i;
- }
- }
- return -1;
-}
-
static gboolean _mc_service_is_exist_pid(GList *list, int pid, mc_priv_type_e priv_type)
{
- int res = _mc_service_get_list_index(list, pid, priv_type);
+ int res = __mc_list_get_index(list, pid, priv_type);
return (res == -1) ? FALSE : TRUE;
}
{
mc_debug_fenter();
- int idx = _mc_service_get_list_index(*connected_list, request_msg->pid, request_msg->priv_type);
- if (idx == -1) {
- mc_error("node is null, it is already disconnected!");
- return MEDIA_CONTROLLER_ERROR_NONE;
- }
- mc_error("[No-error] idx [%d]", idx);
-
- mc_list_data_set_t *data = g_list_nth_data(*connected_list, idx);
- if (data != NULL) {
- mc_error("[No-error] data [%p]", data);
-
- *connected_list = g_list_remove(*connected_list, data);
+ int idx = __mc_list_get_index(*connected_list, request_msg->pid, request_msg->priv_type);
+ mc_retvm_if(idx == -1, MEDIA_CONTROLLER_ERROR_NONE, "node is null, it has been already disconnected!");
- MC_SAFE_FREE(data->app_id);
-
- if (data->s_data != NULL) {
- mc_error("[No-error] s_data [%p], length [%d]", data->s_data, g_list_length(data->s_data));
- g_list_free_full(data->s_data, __mc_destroy_data_list);
- }
- mc_error("[No-error] data set will be free");
- MC_SAFE_FREE(data);
- }
+ if (MEDIA_CONTROLLER_ERROR_NONE != __mc_list_remove_item(connected_list, idx))
+ mc_error("Fail to remove connection from list");
g_connection_cnt--;
mc_error("[No-error] decreased connection count [%d]", g_connection_cnt);
}
}
+static int _mc_service_app_dead_handler(int pid, void *data)
+{
+ mc_service_t *_service_data = (mc_service_t *)data;
+ unsigned int length_of_list = 0;
+ int i = 0;
+
+ mc_secure_debug("Received app_dead signal (pid : %d)", pid);
+ mc_retvm_if((_service_data == NULL), AUL_R_ERROR, "data is null!");
+ mc_retvm_if((_service_data->connected == NULL), AUL_R_OK, "No connected application!");
+
+ length_of_list = g_list_length(_service_data->connected);
+ for (i = (int)(length_of_list - 1); i >= 0; i--) {
+ mc_list_data_set_t *app_data = NULL;
+
+ app_data = g_list_nth_data(_service_data->connected, i);
+ if (app_data == NULL)
+ continue;
+
+ if (app_data->pid == pid) {
+ mc_secure_debug("app_dead(appid) : %s", app_data->app_id);
+
+ /* TODO: Delete application from database and
+ * send notifiaction to deactivation message via dbus
+ */
+
+ if (MEDIA_CONTROLLER_ERROR_NONE == __mc_list_remove_item(&_service_data->connected, i)) {
+ g_connection_cnt--;
+ mc_secure_error("[No-error] decreased connection count [%d]", g_connection_cnt);
+ }
+ }
+ }
+
+ return AUL_R_OK;
+}
+
gboolean _mc_service_process(gpointer data)
{
int res = MEDIA_CONTROLLER_ERROR_NONE;
} else if (request_msg->msg_type == MC_MSG_CLIENT_GET) {
send_msg = _mc_service_get_data(&(_service_data->connected), request_msg);
} else if (request_msg->msg_type == MC_MSG_SERVER_CONNECTION) {
- if(MC_STRING_VALID(request_msg->msg)) {
+ if (MC_STRING_VALID(request_msg->msg)) {
send_msg = _mc_service_add_connection(&(_service_data->connected), request_msg);
} else {
mc_error("Wrong message!");
return FALSE;
}
+ /* Register app_dead signal handler */
+ if (aul_listen_app_dead_signal(_mc_service_app_dead_handler, mc_service_data) != AUL_R_OK) {
+ mc_error("Failed to register app_dead signal");
+ _mc_service_deinit(mc_service_data);
+ close(sockfd);
+ return FALSE;
+ }
+
context = g_main_context_new();
if (context == NULL)
mc_error("g_main_context_new failed");
mc_debug("*** Media Controller Service thread will be closed ***");
+ /* Unregister app_dead signal handler */
+ if (aul_listen_app_dead_signal(NULL, NULL) != AUL_R_OK)
+ mc_error("Failed to unregister app_dead signal");
+
_mc_service_deinit(mc_service_data);
/* Free resources */