From: jiyong.min Date: Wed, 8 May 2019 08:03:40 +0000 (+0900) Subject: [Performance Enhancement] Reduce the socket IPC for create/destroy APIs X-Git-Tag: accepted/tizen/unified/20190513.082541~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=961fa63fe23d83aec3595f99ccefc3abc6711986;p=platform%2Fcore%2Fapi%2Fmedia-controller.git [Performance Enhancement] Reduce the socket IPC for create/destroy APIs - Reduce the socket IPC, it will be sent just 1 time for create/destroy APIs. Change-Id: I10d2f7d2a0601e32588299bdf99c84508d570cd3 --- diff --git a/include/media_controller_db.h b/include/media_controller_db.h old mode 100755 new mode 100644 index 1f53e3f..a67486e --- a/include/media_controller_db.h +++ b/include/media_controller_db.h @@ -20,8 +20,6 @@ #include #include -int mc_db_create_server_table(const char *server_name); -int mc_db_delete_server_table(const char *server_name); gboolean mc_db_is_server_table_exist(void *handle, const char *server_name); gboolean _mc_db_is_activated_client(void *handle, const char *client_name); gboolean _mc_db_is_activated_server(void *handle, const char *server_name); @@ -49,10 +47,6 @@ gboolean _mc_db_is_playlist_exist(void *handle, const char *server_name, const c int mc_db_get_playlist_by_name(void *handle, mc_priv_type_e type, const char *controller_name, const char *playlist_name, mc_playlist_h *playlist); int _mc_db_get_playlist_item_count(void *handle, const char *server_name, char *playlist_name); int mc_db_get_playlist_item(void *handle, const char *server_name, char *playlist_name, mc_playlist_item_cb callback, void *user_data); -int mc_db_insert_server_address_into_server_list(const char *address); -int mc_db_delete_server_address_from_server_list(const char *address); -int mc_db_insert_client_address_into_client_list(const char *address); -int mc_db_delete_client_address_from_client_list(const char *address); int mc_db_foreach_server_list(void *handle, mc_activated_server_cb callback, void *user_data); int mc_db_foreach_client_list(void *handle, mc_activated_client_cb callback, void *user_data); diff --git a/include/media_controller_private.h b/include/media_controller_private.h index b10eb45..ac68729 100644 --- a/include/media_controller_private.h +++ b/include/media_controller_private.h @@ -195,9 +195,6 @@ extern "C" { #define MC_EVENT_REPLY "_event_reply_" -#define MC_DB_CMD_CREATE_SERVER "DB_CMD_CREATE_SERVER" /* Create New Server Table*/ -#define MC_DB_CMD_UPDATE_SERVER_LIST "DB_CMD_UPDATE_SERVER_LIST" /* Update Server Name*/ -#define MC_DB_CMD_UPDATE_CLIENT_LIST "DB_CMD_UPDATE_CLIENT_LIST" /* Update Client Name*/ #define MC_DB_CMD_UPDATE_PLAYBACK "DB_CMD_UPDATE_PLAYBACK" /* Update Server Playback info*/ #define MC_DB_CMD_UPDATE_STATE_PLAYBACK "DB_CMD_UPDATE_STATE_PLAYBACK" /* Update Server State and Playback state*/ #define MC_DB_CMD_UPDATE_META "DB_CMD_UPDATE_META" /* Update Server Meta info*/ @@ -208,10 +205,7 @@ extern "C" { #define MC_DB_CMD_UPDATE_ICON "DB_CMD_UPDATE_ICON" /* Update Server Icon*/ #define MC_DB_CMD_UPDATE_ABILITY "DB_CMD_UPDATE_ABILITY" /* Update Server abilities*/ -#define MC_DB_CMD_REMOVE_SERVER "DB_CMD_REMOVE_SERVER" /* Remove Server info*/ #define MC_DB_CMD_REMOVE_PLAYLIST "DB_CMD_REMOVE_PLAYLIST" /* Remove Server State*/ -#define MC_DB_CMD_REMOVE_SERVER_LIST "DB_CMD_REMOVE_SERVER_LIST" /* Remove Server from Server List*/ -#define MC_DB_CMD_REMOVE_CLIENT_LIST "DB_CMD_REMOVE_CLIENT_LIST" /* Remove Client from Client List*/ #define DEFAULT_USER_UID 5001 /* owner */ diff --git a/src/media_controller_client.c b/src/media_controller_client.c old mode 100755 new mode 100644 index a833870..bb85cd1 --- a/src/media_controller_client.c +++ b/src/media_controller_client.c @@ -384,7 +384,7 @@ static int __mc_client_destroy(media_controller_client_s *mc_client) mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); /*Send Disconnection Msg to Server*/ - ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_DISCONNECTION, MC_PRIV_TYPE_CLIENT, MC_SERVER_DISCONNECTION_MSG); + ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_DISCONNECTION, MC_PRIV_TYPE_CLIENT, mc_client->client_name); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Failed to mc_ipc_send_message_to_server [%d]", ret); @@ -556,17 +556,6 @@ int mc_client_create(mc_client_h *client) return ret; } - ret = mc_db_delete_client_address_from_client_list(mc_client->client_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("mc_db_delete_client_address_from_client_list failed [%d]", ret); - - ret = mc_db_insert_client_address_into_client_list(mc_client->client_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("fail mc_db_insert_server_address_into_table [%d]", ret); - __mc_client_destroy(mc_client); - return ret; - } - *client = (mc_client_h)mc_client; mc_debug_fleave(); @@ -1378,10 +1367,6 @@ int mc_client_destroy(mc_client_h client) if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Error mc_ipc_unregister_all_listener [%d]", ret); - ret = mc_db_delete_client_address_from_client_list(mc_client->client_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("fail mc_db_delete_client_address_from_client_list [%d]", ret); - ret = __mc_client_destroy(mc_client); mc_debug_fleave(); diff --git a/src/media_controller_db.c b/src/media_controller_db.c old mode 100755 new mode 100644 index 94aa9b9..632ac4d --- a/src/media_controller_db.c +++ b/src/media_controller_db.c @@ -783,102 +783,6 @@ int mc_db_get_playlist_item(void *handle, const char *server_name, char *playlis return MEDIA_CONTROLLER_ERROR_NONE; } -int mc_db_insert_server_address_into_server_list(const char *address) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!MC_STRING_VALID(address), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid address"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_UPDATE_SERVER_LIST, MC_STRING_DELIMITER, address); - - ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - -int mc_db_delete_server_address_from_server_list(const char *address) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!MC_STRING_VALID(address), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid address"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_REMOVE_SERVER_LIST, MC_STRING_DELIMITER, address); - - ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - -int mc_db_insert_client_address_into_client_list(const char *address) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!MC_STRING_VALID(address), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid address"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_UPDATE_CLIENT_LIST, MC_STRING_DELIMITER, address); - - ret = __mc_db_update_db(MC_PRIV_TYPE_CLIENT, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - -int mc_db_delete_client_address_from_client_list(const char *address) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!MC_STRING_VALID(address), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid address"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_REMOVE_CLIENT_LIST, MC_STRING_DELIMITER, address); - - ret = __mc_db_update_db(MC_PRIV_TYPE_CLIENT, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - -int mc_db_create_server_table(const char *server_name) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_CREATE_SERVER, MC_STRING_DELIMITER, server_name); - - ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - -int mc_db_delete_server_table(const char *server_name) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *sql_str = NULL; - - mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name"); - - sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_REMOVE_SERVER, MC_STRING_DELIMITER, server_name); - - ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str); - - MC_SAFE_FREE(sql_str); - - return ret; -} - gboolean mc_db_is_server_table_exist(void *handle, const char *server_name) { char *sql_str = NULL; diff --git a/src/media_controller_server.c b/src/media_controller_server.c old mode 100755 new mode 100644 index 4295228..8430ebd --- a/src/media_controller_server.c +++ b/src/media_controller_server.c @@ -112,7 +112,7 @@ static int __mc_server_destoy(media_controller_server_s *mc_server) mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); /*Send Disconnection Msg to Server*/ - ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_DISCONNECTION, MC_PRIV_TYPE_SERVER, MC_SERVER_DISCONNECTION_MSG); + ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_DISCONNECTION, MC_PRIV_TYPE_SERVER, mc_server->server_name); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Failed to mc_ipc_send_message_to_server [%d]", ret); @@ -521,25 +521,6 @@ static void __server_search_cmd_cb(const char *interface_name, const char *signa mc_search_destroy((mc_search_h)mc_search); } -static int __mc_server_current_is_latest(media_controller_server_s *mc_server, bool *is_latest) -{ - int ret = MEDIA_CONTROLLER_ERROR_NONE; - char *latest_server_name = NULL; - - *is_latest = FALSE; - - ret = mc_db_get_latest_server_name(mc_server->db_handle, &latest_server_name); - mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail mc_db_get_latest_server_name"); - - if ((latest_server_name != NULL) && (mc_server->server_name != NULL)) { - if (!g_strcmp0(latest_server_name, mc_server->server_name)) - *is_latest = TRUE; - } - - MC_SAFE_FREE(latest_server_name); - return MEDIA_CONTROLLER_ERROR_NONE; -} - static int __mc_server_send_message(media_controller_server_s *mc_server, const char *interface_name, const char *signal_name, const int param1, const unsigned long long param2, const char* param3) { int ret = MEDIA_CONTROLLER_ERROR_NONE; @@ -1169,8 +1150,6 @@ int mc_server_create(mc_server_h *server) { int ret = MEDIA_CONTROLLER_ERROR_NONE; media_controller_server_s *mc_server = NULL; - bool table_exist = FALSE; - bool is_latest = FALSE; mc_debug_fenter(); @@ -1187,57 +1166,6 @@ int mc_server_create(mc_server_h *server) return ret; } - table_exist = mc_db_is_server_table_exist(mc_server->db_handle, mc_server->server_name); - - ret = __mc_server_current_is_latest(mc_server, &is_latest); - - if (table_exist && is_latest) { - //To keep latest server's metadata - ret = mc_db_delete_server_address_from_server_list(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("mc_db_delete_server_address_from_server_list failed [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - - ret = mc_db_update_server_and_playback_state(mc_server->server_name, MC_SERVER_STATE_ACTIVATE, MC_PLAYBACK_STATE_STOPPED); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("mc_db_update_server_and_playback_state failed [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - - } else if (table_exist) { - ret = mc_db_delete_server_table(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("mc_db_delete_server_table failed [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - ret = mc_db_delete_server_address_from_server_list(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("mc_db_delete_server_address_from_server_list failed [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - } - - if (!(table_exist && is_latest)) { - ret = mc_db_create_server_table(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("fail mc_db_clear_table [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - } - - ret = mc_db_insert_server_address_into_server_list(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("fail mc_db_insert_server_address_into_table [%d]", ret); - __mc_server_destoy(mc_server); - return ret; - } - ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE, MC_SERVER_STATE_ACTIVATE, 0, NULL); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Error __mc_server_send_message [%d]", ret); @@ -1252,7 +1180,6 @@ int mc_server_create(mc_server_h *server) int mc_server_destroy(mc_server_h server) { int ret = MEDIA_CONTROLLER_ERROR_NONE; - bool is_latest = FALSE; media_controller_server_s *mc_server = (media_controller_server_s *)server; mc_debug_fenter(); @@ -1263,21 +1190,6 @@ int mc_server_destroy(mc_server_h server) if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("fail mc_ipc_unregister_all_listener [%d]", ret); - ret = mc_db_delete_server_address_from_server_list(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("fail mc_db_delete_server_address_from_server_list [%d]", ret); - - ret = __mc_server_current_is_latest(mc_server, &is_latest); - if (is_latest) { - ret = mc_db_update_server_and_playback_state(mc_server->server_name, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("mc_db_update_server_and_playback_state failed [%d]", ret); - } else { - ret = mc_db_delete_server_table(mc_server->server_name); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) - mc_error("fail mc_db_delete_server_table [%d]", ret); - } - ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE, MC_SERVER_STATE_DEACTIVATE, 0, NULL); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Error __mc_server_send_message [%d]", ret); diff --git a/svc/include/media_controller_db_util.h b/svc/include/media_controller_db_util.h index 2989036..49e4cbe 100644 --- a/svc/include/media_controller_db_util.h +++ b/svc/include/media_controller_db_util.h @@ -31,6 +31,10 @@ 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); +int mc_db_util_activate_server_table(uid_t uid, const char *app_id); +int mc_db_util_deactivate_server_table(uid_t uid, const char *app_id); +int mc_db_util_insert_to_list(uid_t uid, const char *app_id, mc_priv_type_e priv_type); +int mc_db_util_delete_from_list(uid_t uid, const char *app_id, mc_priv_type_e priv_type); #endif /*__TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_DB_UTIL_H__*/ diff --git a/svc/media_controller_db_util.c b/svc/media_controller_db_util.c index d743152..302112d 100644 --- a/svc/media_controller_db_util.c +++ b/svc/media_controller_db_util.c @@ -27,11 +27,29 @@ #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_INSERT_TO_SERVER_LIST "INSERT OR IGNORE INTO "MC_DB_TABLE_SERVER_LIST" (server_name) VALUES ('%q');" +#define DB_INSERT_TO_CLIENT_LIST "INSERT OR IGNORE INTO "MC_DB_TABLE_CLIENT_LIST" (client_name) VALUES ('%q');" #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';" #define DB_META_FIELD "title TEXT, artist TEXT, album TEXT, author TEXT, genre TEXT, duration INTEGER DEFAULT 0, date TEXT, copyright TEXT, description TEXT, track_num TEXT, picture TEXT, season TEXT, episode TEXT, resolution TEXT, " +#define DB_CREATE_SERVER_TABLE "DROP TABLE IF EXISTS '%q'; CREATE TABLE IF NOT EXISTS '%q' (\ + server_name TEXT PRIMARY KEY, \ + server_state INTEGER DEFAULT 1, \ + playback_state INTEGER DEFAULT 0, \ + playback_position INTEGER DEFAULT 0, \ + playlist_name TEXT, \ + playlist_index TEXT, \ + playback_content_type INTEGER DEFAULT 4, \ + age_rating INTEGER DEFAULT 0, \ + %s \ + shuffle_mode INTEGER DEFAULT 1, \ + repeat_mode INTEGER DEFAULT 1, \ + icon_uri TEXT, \ + ability_decided INTEGER DEFAULT 0, \ + ability_supported INTEGER DEFAULT 0 \ + );INSERT INTO '%q' (server_name) VALUES ('%q');" #define MC_DB_NAME ".media_controller.db" #define REGULAR_USER 5000 @@ -265,26 +283,36 @@ static char * __mc_db_get_latest_server_name(void *handle) return server_name; } +static gboolean __mc_db_is_latest(void *handle, const char *server_name) +{ + gboolean is_latest = FALSE; + char *latest_server_name = NULL; + + latest_server_name = __mc_db_get_latest_server_name(handle); + if (g_strcmp0(server_name, latest_server_name) == 0) + is_latest = TRUE; + + MC_SAFE_G_FREE(latest_server_name); + + return is_latest; +} + static int __mc_update_dead_server(void *handle, const char *server_name) { int ret = MEDIA_CONTROLLER_ERROR_NONE; char *sql_str = NULL; - char *latest_server_name = NULL; 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"); - latest_server_name = __mc_db_get_latest_server_name(handle); - /* Update server_state to deactivated, if the server is latest. * Drop the table of server_name, if it is not latest. */ - if (g_strcmp0(server_name, latest_server_name) == 0) + if (__mc_db_is_latest(handle, server_name)) 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_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); @@ -546,32 +574,7 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size) goto ERROR; } - if (strncmp(MC_DB_CMD_CREATE_SERVER, params[0], strlen(MC_DB_CMD_CREATE_SERVER)) == 0) { - sql_str = sqlite3_mprintf("CREATE TABLE IF NOT EXISTS '%q' (\ - server_name TEXT PRIMARY KEY, \ - server_state INTEGER DEFAULT 1, \ - playback_state INTEGER DEFAULT 0, \ - playback_position INTEGER DEFAULT 0, \ - playlist_name TEXT, \ - playlist_index TEXT, \ - playback_content_type INTEGER DEFAULT 4, \ - age_rating INTEGER DEFAULT 0, \ - %s \ - shuffle_mode INTEGER DEFAULT 1, \ - repeat_mode INTEGER DEFAULT 1, \ - icon_uri TEXT, \ - ability_decided INTEGER DEFAULT 0, \ - ability_supported INTEGER DEFAULT 0 \ - );INSERT INTO '%q' (server_name) VALUES ('%q');", - params[1], DB_META_FIELD, params[1], params[1]); - - } else if (strncmp(MC_DB_CMD_UPDATE_SERVER_LIST, params[0], strlen(MC_DB_CMD_UPDATE_SERVER_LIST)) == 0) { - sql_str = sqlite3_mprintf("INSERT INTO '%q' (server_name) VALUES ('%q');", MC_DB_TABLE_SERVER_LIST, params[1]); - - } else if (strncmp(MC_DB_CMD_UPDATE_CLIENT_LIST, params[0], strlen(MC_DB_CMD_UPDATE_CLIENT_LIST)) == 0) { - sql_str = sqlite3_mprintf("INSERT INTO '%q' (client_name) VALUES ('%q');", MC_DB_TABLE_CLIENT_LIST, params[1]); - - } else if (strncmp(MC_DB_CMD_UPDATE_STATE_PLAYBACK, params[0], strlen(MC_DB_CMD_UPDATE_STATE_PLAYBACK)) == 0) { + if (strncmp(MC_DB_CMD_UPDATE_STATE_PLAYBACK, params[0], strlen(MC_DB_CMD_UPDATE_STATE_PLAYBACK)) == 0) { if (params[2] == NULL || params[3] == NULL) { mc_error("wrong query"); ret = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; @@ -639,15 +642,6 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size) sql_str = sqlite3_mprintf("UPDATE '%q' SET ability_decided=%llu, ability_supported=%llu;", params[1], llu_value, llu_value2); - } else if (strncmp(MC_DB_CMD_REMOVE_SERVER_LIST, params[0], strlen(MC_DB_CMD_REMOVE_SERVER_LIST)) == 0) { - 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(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(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) { mc_error("wrong query"); @@ -691,6 +685,170 @@ ERROR: return ret; } +int mc_db_util_activate_server_table(uid_t uid, const char *app_id) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *sql_str = NULL; + void* _db_handle = NULL; + + mc_debug_fenter(); + + mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "message is NULL"); + + ret = mc_db_connect(&_db_handle, uid, TRUE); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_error("mc_db_connect error : %d", ret); + goto ERROR; + } + + if (__mc_db_is_latest(_db_handle, app_id)) + sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, app_id, MC_SERVER_STATE_ACTIVATE, MC_PLAYBACK_STATE_STOPPED); + else + sql_str = sqlite3_mprintf(DB_CREATE_SERVER_TABLE, app_id, app_id, DB_META_FIELD, app_id, app_id); + + if (sql_str == NULL) { + mc_error("sql_str is NULL"); + ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY; + goto ERROR; + } + + ret = mc_db_util_update_db(_db_handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("media_db_update_db error : %d", ret); + +ERROR: + SQLITE3_SAFE_FREE(sql_str); + mc_db_disconnect(_db_handle); + + mc_debug_fleave(); + + return ret; +} + +int mc_db_util_deactivate_server_table(uid_t uid, const char *app_id) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *sql_str = NULL; + void* _db_handle = NULL; + + mc_debug_fenter(); + + mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "message is NULL"); + + ret = mc_db_connect(&_db_handle, uid, TRUE); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_error("mc_db_connect error : %d", ret); + goto ERROR; + } + + if (__mc_db_is_latest(_db_handle, app_id)) + sql_str = sqlite3_mprintf(DB_UPDATE_STATE_PLAYBACK, app_id, MC_SERVER_STATE_DEACTIVATE, MC_PLAYBACK_STATE_STOPPED); + else + sql_str = sqlite3_mprintf(DB_DROP_TABLE, app_id); + + if (sql_str == NULL) { + mc_error("sql_str is NULL"); + ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY; + goto ERROR; + } + + ret = mc_db_util_update_db(_db_handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("media_db_update_db error : %d", ret); + +ERROR: + SQLITE3_SAFE_FREE(sql_str); + mc_db_disconnect(_db_handle); + + mc_debug_fleave(); + + return ret; +} + +int mc_db_util_insert_to_list(uid_t uid, const char *app_id, mc_priv_type_e priv_type) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *sql_str = NULL; + void* _db_handle = NULL; + + mc_debug_fenter(); + + mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "message is NULL"); + + mc_secure_debug("[uid: %d] app_id: %s, priv_type: %d", uid, app_id, priv_type); + + if (priv_type == MC_PRIV_TYPE_SERVER) { + sql_str = sqlite3_mprintf(DB_INSERT_TO_SERVER_LIST, app_id, app_id); + } else if (priv_type == MC_PRIV_TYPE_CLIENT) { + sql_str = sqlite3_mprintf(DB_INSERT_TO_CLIENT_LIST, app_id, app_id); + } else { + mc_error("invalid priv_type (%d)", priv_type); + mc_debug_fleave(); + return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER; + } + mc_retvm_if(sql_str == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "sql_str is NULL"); + + ret = mc_db_connect(&_db_handle, uid, TRUE); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_error("mc_db_connect error : %d", ret); + goto ERROR; + } + + ret = mc_db_util_update_db(_db_handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("media_db_update_db error : %d", ret); + +ERROR: + SQLITE3_SAFE_FREE(sql_str); + mc_db_disconnect(_db_handle); + + mc_debug_fleave(); + + return ret; +} + +int mc_db_util_delete_from_list(uid_t uid, const char *app_id, mc_priv_type_e priv_type) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + char *sql_str = NULL; + void* _db_handle = NULL; + + mc_debug_fenter(); + + mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "message is NULL"); + + mc_secure_debug("[uid: %d] app_id: %s, priv_type: %d", uid, app_id, priv_type); + + if (priv_type == MC_PRIV_TYPE_SERVER) { + sql_str = sqlite3_mprintf(DB_DELETE_FROM_SERVER_LIST, app_id); + } else if (priv_type == MC_PRIV_TYPE_CLIENT) { + sql_str = sqlite3_mprintf(DB_DELETE_FROM_CLIENT_LIST, app_id); + } else { + mc_error("invalid priv_type (%d)", priv_type); + mc_debug_fleave(); + return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER; + } + mc_retvm_if(sql_str == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "sql_str is NULL"); + + ret = mc_db_connect(&_db_handle, uid, TRUE); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_error("mc_db_connect error : %d", ret); + goto ERROR; + } + + ret = mc_db_util_update_db(_db_handle, sql_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_error("media_db_update_db error : %d", ret); + +ERROR: + SQLITE3_SAFE_FREE(sql_str); + mc_db_disconnect(_db_handle); + + mc_debug_fleave(); + + 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; diff --git a/svc/media_controller_svc.c b/svc/media_controller_svc.c index 8846121..be9a7a7 100644 --- a/svc/media_controller_svc.c +++ b/svc/media_controller_svc.c @@ -441,6 +441,54 @@ static int _mc_service_get_data(GList **connected_list, mc_comm_msg_s *request_m } } +static int __mc_service_add_to_db(mc_comm_msg_s *request_msg) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + mc_debug_fenter(); + + mc_retvm_if(!request_msg, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid request message"); + mc_retvm_if(!request_msg->msg, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid message"); + mc_retvm_if(((request_msg->priv_type != MC_PRIV_TYPE_SERVER) && (request_msg->priv_type != MC_PRIV_TYPE_CLIENT)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid priv_type[%d]", request_msg->priv_type); + + ret = mc_db_util_insert_to_list(request_msg->uid, request_msg->msg, request_msg->priv_type); + mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_insert_to_list failed (%d)", ret); + + if (request_msg->priv_type == MC_PRIV_TYPE_SERVER) { + ret = mc_db_util_activate_server_table(request_msg->uid, request_msg->msg); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_secure_error("mc_db_util_activate_server_table failed (%d)", ret); + mc_db_util_delete_from_list(request_msg->uid, request_msg->msg, request_msg->priv_type); + } + } + + mc_debug_fleave(); + + return ret; +} + +static int __mc_service_remove_from_db(mc_comm_msg_s *request_msg) +{ + int ret = MEDIA_CONTROLLER_ERROR_NONE; + mc_debug_fenter(); + + mc_retvm_if(!request_msg, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid request message"); + mc_retvm_if(!request_msg->msg, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid message"); + mc_retvm_if(((request_msg->priv_type != MC_PRIV_TYPE_SERVER) && (request_msg->priv_type != MC_PRIV_TYPE_CLIENT)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid priv_type[%d]", request_msg->priv_type); + + ret = mc_db_util_delete_from_list(request_msg->uid, request_msg->msg, request_msg->priv_type); + mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_insert_to_list failed (%d)", ret); + + if (request_msg->priv_type == MC_PRIV_TYPE_SERVER) { + ret = mc_db_util_deactivate_server_table(request_msg->uid, request_msg->msg); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) + mc_secure_error("mc_db_util_deactivate_server_table failed (%d)", ret); + } + + mc_debug_fleave(); + + return ret; +} + static int __mc_notify_server_updated(const char *server_name, mc_server_state_e state) { char *message = NULL; @@ -591,18 +639,17 @@ gboolean _mc_service_process(gpointer data) } else if (request_msg->msg_type == MC_MSG_SERVER_CONNECTION) { if (MC_STRING_VALID(request_msg->msg)) { send_msg = _mc_service_add_connection(&(_service_data->connected), request_msg); + if (send_msg == MEDIA_CONTROLLER_ERROR_NONE) + send_msg = __mc_service_add_to_db(request_msg); } else { mc_error("Wrong message!"); send_msg = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; } } else if (request_msg->msg_type == MC_MSG_SERVER_DISCONNECTION) { - if (request_msg->msg_size < strlen(MC_SERVER_DISCONNECTION_MSG)) { - mc_error("Wrong message!"); - send_msg = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; - goto ERROR; - } - if (strncmp(request_msg->msg, MC_SERVER_DISCONNECTION_MSG, request_msg->msg_size) == 0) { + if (MC_STRING_VALID(request_msg->msg)) { send_msg = _mc_service_remove_connection(&(_service_data->connected), request_msg); + if (send_msg == MEDIA_CONTROLLER_ERROR_NONE) + send_msg = __mc_service_remove_from_db(request_msg); } else { mc_error("Wrong message!"); send_msg = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;