[Performance Enhancement] Reduce the socket IPC for create/destroy APIs 50/205850/2
authorjiyong.min <jiyong.min@samsung.com>
Wed, 8 May 2019 08:03:40 +0000 (17:03 +0900)
committerhj kim <backto.kim@samsung.com>
Thu, 9 May 2019 23:03:51 +0000 (23:03 +0000)
 - Reduce the socket IPC, it will be sent just 1 time for create/destroy APIs.

Change-Id: I10d2f7d2a0601e32588299bdf99c84508d570cd3

include/media_controller_db.h
include/media_controller_private.h
src/media_controller_client.c
src/media_controller_db.c
src/media_controller_server.c
svc/include/media_controller_db_util.h
svc/media_controller_db_util.c
svc/media_controller_svc.c

index 874442c9ddd32d4ed7984dc909cd0fdab6abef75..523e7b3664ca9ff92995c0e3905b6a5d132b40dd 100644 (file)
@@ -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);
@@ -47,10 +45,6 @@ int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlis
 gboolean _mc_db_is_playlist_exist(void *handle, const char *server_name, const char *playlist_name);
 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(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 5623361930d7b5ceeecebe24b73d93b84970fe4d..a44a106ad4d41538fafe190081d809707ab659eb 100755 (executable)
@@ -198,9 +198,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*/
@@ -211,10 +208,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 */
index a7844e40582bdd379932141c349c1fd64951a0b0..c09e34f995e319156a60a52759623b451251865d 100644 (file)
@@ -412,7 +412,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);
 
@@ -584,17 +584,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();
@@ -1555,10 +1544,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();
index f2c4f075c4624896bb6cdd4998a1c2163d79dfd7..75a693f48a35fc06ff9fd85c54addcc67fd25d63 100644 (file)
@@ -742,102 +742,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;
index fcdb0ccd526e3ce9b1f75a526d560c98fba505ed..6b69f5b43a05c5180e3f3426aeea6c6c70a03cae 100644 (file)
@@ -115,7 +115,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);
 
@@ -601,25 +601,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;
@@ -1303,8 +1284,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();
 
@@ -1321,57 +1300,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);
@@ -1386,7 +1314,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();
@@ -1397,21 +1324,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 2989036d036522d752f8ef8b5d448a4bfd8abffa..49e4cbea0b62d65d5c75905db604c972df0115fb 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 55ae1591626661258bcf4749649e5fb451489b64..2466821a4c6a2386d6e82e48df5ff9ca36a62329 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
@@ -272,26 +291,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);
@@ -589,42 +618,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, \
-                               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, \
-                               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], 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;
@@ -692,15 +686,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");
@@ -744,6 +729,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 8846121fbeff6067c9ecaf603d3e809fafff6813..be9a7a7b31005f4efe3fe78b5d0e92e2ac7c90b4 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;