From: jiyong.min Date: Tue, 12 Feb 2019 00:57:40 +0000 (+0900) Subject: Add to remove and update information for dead application on database X-Git-Tag: submit/tizen_4.0/20190701.070443^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2af927c85eb465ccb0f3784ca54cf86345f07feb;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add to remove and update information for dead application on database Change-Id: I0dfe7eef25ae2552d87dd3dd5a1aeea926071065 --- diff --git a/packaging/capi-media-controller.spec b/packaging/capi-media-controller.spec index 617f0e4..78a7819 100755 --- a/packaging/capi-media-controller.spec +++ b/packaging/capi-media-controller.spec @@ -1,6 +1,6 @@ Name: capi-media-controller Summary: A media controller library in Tizen Native API -Version: 0.1.59 +Version: 0.1.60 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/svc/include/media_controller_db_util.h b/svc/include/media_controller_db_util.h index 24e3711..0090c40 100755 --- a/svc/include/media_controller_db_util.h +++ b/svc/include/media_controller_db_util.h @@ -26,6 +26,7 @@ int mc_db_util_update_db(void *handle, const char *sql_str); int mc_db_util_delete_whole_server_tables(void *handle); int mc_db_util_init_latest_server_table(void *handle); int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size); +int mc_db_util_remove_dead_application(uid_t uid, const char *app_id, mc_priv_type_e priv_type); #endif /*__TIZEN_MEDIA_CONTROLLER_DB_UTIL_H__*/ diff --git a/svc/media_controller_db_util.c b/svc/media_controller_db_util.c index ddcaf50..1e06589 100755 --- a/svc/media_controller_db_util.c +++ b/svc/media_controller_db_util.c @@ -28,6 +28,10 @@ #define MC_DB_TRIGGER_PLAYLIST "cleanup_playlist" #define DB_SELECT_ALL_SERVER_LIST_EXCEPT_LATEST "SELECT name FROM SQLITE_MASTER WHERE type='table' AND (name != '%q') AND (name NOT IN (SELECT server_name FROM "MC_DB_TABLE_LATEST_SERVER"));" +#define DB_DELETE_FROM_SERVER_LIST "DELETE FROM "MC_DB_TABLE_SERVER_LIST" WHERE (server_name = '%q');" +#define DB_DELETE_FROM_CLIENT_LIST "DELETE FROM "MC_DB_TABLE_CLIENT_LIST" WHERE (client_name = '%q');" +#define DB_UPDATE_STATE_PLAYBACK "UPDATE '%q' SET server_state=%d, playback_state=%d;" +#define DB_DROP_TABLE "DROP TABLE IF EXISTS '%q';" static int __mc_db_util_busy_handler(void *pData, int count) { @@ -86,7 +90,7 @@ static int __mc_db_util_delete_server_table(void *handle, const char *server_nam mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); mc_retvm_if(server_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is NULL"); - sql_str = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", server_name); + sql_str = sqlite3_mprintf(DB_DROP_TABLE, server_name); ret = mc_db_util_update_db(handle, sql_str); if (MEDIA_CONTROLLER_ERROR_NONE != ret) @@ -173,6 +177,63 @@ static int __mc_create_playlist_table(sqlite3 *handle) return ret; } +static int __mc_update_dead_server(void *handle, const char *server_name) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + sqlite3 *db_handle = (sqlite3 *)handle; + char *sql_str = NULL; + sqlite3_stmt *stmt = NULL; + gboolean is_latest_server = FALSE; + const char *latest_server_name; + + mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + mc_retvm_if(!MC_STRING_VALID(server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is invalid"); + + /* Get latest server */ + sql_str = sqlite3_mprintf("SELECT server_name FROM '%q';", MC_DB_TABLE_LATEST_SERVER); + mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null"); + + ret = sqlite3_prepare_v2(db_handle, sql_str, strlen(sql_str), &stmt, NULL); + if (SQLITE_OK != ret) { + mc_secure_error("prepare error [%s]", sqlite3_errmsg(db_handle)); + SQLITE3_SAFE_FREE(sql_str); + return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; + } + + ret = sqlite3_step(stmt); + if (SQLITE_ROW == ret) { + /* Get latest server name */ + latest_server_name = (const char *)sqlite3_column_text(stmt, 0); + if (MC_STRING_VALID(latest_server_name)) { + mc_secure_debug("latest_server_name: %s", latest_server_name); + if (strcmp(server_name, latest_server_name) == 0) + is_latest_server = TRUE; + } else { + mc_secure_warning("invalid latest_server_name: %s", latest_server_name); + } + } + + SQLITE3_FINALIZE(stmt); + SQLITE3_SAFE_FREE(sql_str); + + /* Update server_state to deactivated, if the server is latest. + * Drop the table of server_name, if it is not latest. + */ + if (is_latest_server) + sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED); + else + sql_str = sqlite3_mprintf(DB_DROP_TABLE, server_name); + mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null"); + + ret = mc_db_util_update_db(handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_secure_error("Error mc_db_util_update_db %d", ret); + + SQLITE3_SAFE_FREE(sql_str); + + return ret; +} + static char* __mc_get_db_name(uid_t uid) { char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, }; @@ -415,7 +476,7 @@ int mc_db_util_init_latest_server_table(void *handle) mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); /* Get latest server name */ - sql_str = sqlite3_mprintf("SELECT COUNT(*), server_name FROM '%q';", MC_DB_TABLE_LATEST_SERVER); + sql_str = sqlite3_mprintf("SELECT server_name FROM '%q';", MC_DB_TABLE_LATEST_SERVER); mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null"); ret = sqlite3_prepare_v2(db_handle, sql_str, strlen(sql_str), &stmt, NULL); @@ -426,27 +487,26 @@ int mc_db_util_init_latest_server_table(void *handle) } ret = sqlite3_step(stmt); - while (SQLITE_ROW == ret) { - if (sqlite3_column_int(stmt, 0) == 0) { - mc_debug("latest_server table does not exist"); - SQLITE3_FINALIZE(stmt); - SQLITE3_SAFE_FREE(sql_str); - return MEDIA_CONTROLLER_ERROR_NONE; - } - if (MC_STRING_VALID((const char *)sqlite3_column_text(stmt, 1))) { - latest_server_name = strdup((const char *)sqlite3_column_text(stmt, 1)); - mc_debug("latest_server_name: %s", latest_server_name); - } - ret = sqlite3_step(stmt); + if (SQLITE_ROW != ret) { + mc_debug("[no record] latest_server does not exist"); + SQLITE3_FINALIZE(stmt); + SQLITE3_SAFE_FREE(sql_str); + return MEDIA_CONTROLLER_ERROR_NONE; + } + + if (MC_STRING_VALID((const char *)sqlite3_column_text(stmt, 0))) { + latest_server_name = strdup((const char *)sqlite3_column_text(stmt, 0)); + mc_secure_debug("latest_server_name: %s", latest_server_name); } SQLITE3_FINALIZE(stmt); SQLITE3_SAFE_FREE(sql_str); - mc_retvm_if(latest_server_name == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "latest_server is not exist"); + mc_retvm_if(latest_server_name == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "latest_server is null"); /* Update server_state and playback_state to 0 */ - sql_str = sqlite3_mprintf("UPDATE '%q' SET server_state=%d, playback_state=%d;", latest_server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED); + sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, latest_server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED); + MC_SAFE_FREE(latest_server_name); mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null"); ret = mc_db_util_update_db(handle, sql_str); @@ -523,7 +583,7 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size) mc_safe_strtoi(params[2], &i_value); mc_safe_strtoi(params[3], &i_value_1); - sql_str = sqlite3_mprintf("UPDATE '%q' SET server_state=%d, playback_state=%d;", params[1], i_value, i_value_1); + sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, params[1], i_value, i_value_1); } else if (strncmp(MC_DB_CMD_UPDATE_PLAYBACK, params[0], strlen(MC_DB_CMD_UPDATE_PLAYBACK)) == 0) { if (params[2] == NULL || params[3] == NULL || params[4] == NULL) { @@ -573,13 +633,13 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size) is_playlist = TRUE; } else if (strncmp(MC_DB_CMD_REMOVE_SERVER_LIST, params[0], strlen(MC_DB_CMD_REMOVE_SERVER_LIST)) == 0) { - sql_str = sqlite3_mprintf("DELETE FROM %q WHERE server_name = '%q';", MC_DB_TABLE_SERVER_LIST, params[1]); + sql_str = sqlite3_mprintf(DB_DELETE_FROM_SERVER_LIST, params[1]); } else if (strncmp(MC_DB_CMD_REMOVE_CLIENT_LIST, params[0], strlen(MC_DB_CMD_REMOVE_CLIENT_LIST)) == 0) { - sql_str = sqlite3_mprintf("DELETE FROM %q WHERE client_name = '%q';", MC_DB_TABLE_CLIENT_LIST, params[1]); + sql_str = sqlite3_mprintf(DB_DELETE_FROM_CLIENT_LIST, params[1]); } else if (strncmp(MC_DB_CMD_REMOVE_SERVER, params[0], strlen(MC_DB_CMD_REMOVE_SERVER)) == 0) { - sql_str = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", params[1]); + sql_str = sqlite3_mprintf(DB_DROP_TABLE, params[1]); } else if (strncmp(MC_DB_CMD_REMOVE_PLAYLIST, params[0], strlen(MC_DB_CMD_REMOVE_PLAYLIST)) == 0) { if (params[2] == NULL) { @@ -623,3 +683,38 @@ ERROR: return ret; } + +int mc_db_util_remove_dead_application(uid_t uid, const char *app_id, const mc_priv_type_e priv_type) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *sql_str = NULL; + void* db_handle = NULL; + + mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "app_id is NULL"); + + ret = mc_db_util_connect(&db_handle, uid); + mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_connect error : %d", ret); + + /* Delete application from server/client list */ + if (priv_type == MC_PRIV_TYPE_SERVER) + sql_str = sqlite3_mprintf(DB_DELETE_FROM_SERVER_LIST, app_id); + else + sql_str = sqlite3_mprintf(DB_DELETE_FROM_CLIENT_LIST, app_id); + + ret = mc_db_util_update_db(db_handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_secure_error("media_db_update_db error : %d", ret); + + /* Drop server table to remove application information if it is not latest. + * Update application information if it is latest. + */ + if (priv_type == MC_PRIV_TYPE_SERVER) { + ret = __mc_update_dead_server(db_handle, app_id); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_secure_error("__mc_drop_server_table error : %d", ret); + } + + mc_db_util_disconnect(db_handle); + + return ret; +} diff --git a/svc/media_controller_svc.c b/svc/media_controller_svc.c index 55384a6..a0d6320 100755 --- a/svc/media_controller_svc.c +++ b/svc/media_controller_svc.c @@ -42,6 +42,7 @@ typedef struct { } mc_list_user_data; typedef struct { + uid_t uid; int pid; mc_priv_type_e priv_type; char *app_id; @@ -337,6 +338,7 @@ static int _mc_service_add_connection(GList **connected_list, mc_comm_msg_s *req return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY; } + data->uid = request_msg->uid; data->pid = request_msg->pid; data->priv_type = request_msg->priv_type; data->app_id = g_strdup(request_msg->msg); @@ -470,7 +472,9 @@ static int _mc_service_app_dead_handler(int pid, void *data) if (app_data->pid == pid) { mc_secure_debug("app_dead(appid) : %s", app_data->app_id); - /* TODO: Delete application from database */ + /* Delete and update information of dead application on database */ + if (MEDIA_CONTROLLER_ERROR_NONE != mc_db_util_remove_dead_application(app_data->uid, app_data->app_id, app_data->priv_type)) + mc_secure_error("Fail to remove dead application"); /* Sends notification for deactivated server via dbus */ if (app_data->priv_type == MC_PRIV_TYPE_SERVER) {