[Performance Enhancement] Reduce the socket IPC for create/destroy APIs 56/205656/8
authorjiyong.min <jiyong.min@samsung.com>
Wed, 8 May 2019 08:03:40 +0000 (17:03 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Thu, 9 May 2019 01:51:34 +0000 (10:51 +0900)
 - Reduce the socket IPC, it will be sent just 1 time for create/destroy APIs.

Change-Id: I10d2f7d2a0601e32588299bdf99c84508d570cd3

include/media_controller_db.h [changed mode: 0755->0644]
include/media_controller_private.h
src/media_controller_client.c [changed mode: 0755->0644]
src/media_controller_db.c [changed mode: 0755->0644]
src/media_controller_server.c [changed mode: 0755->0644]
svc/include/media_controller_db_util.h
svc/media_controller_db_util.c
svc/media_controller_svc.c

old mode 100755 (executable)
new mode 100644 (file)
index 1f53e3f..a67486e
@@ -20,8 +20,6 @@
 #include <bundle.h>
 #include <media_controller_db_util.h>
 
-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);
index b10eb45..ac68729 100644 (file)
@@ -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 */
old mode 100755 (executable)
new mode 100644 (file)
index a833870..bb85cd1
@@ -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();
old mode 100755 (executable)
new mode 100644 (file)
index 94aa9b9..632ac4d
@@ -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;
old mode 100755 (executable)
new mode 100644 (file)
index 4295228..8430ebd
@@ -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);
index 2989036..49e4cbe 100644 (file)
@@ -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__*/
index d743152..302112d 100644 (file)
 
 #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;
index 8846121..be9a7a7 100644 (file)
@@ -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;