Add internal APIs to support C# 73/189073/5 accepted/tizen/unified/20180914.073206 submit/tizen/20180913.084013
authorhj kim <backto.kim@samsung.com>
Thu, 13 Sep 2018 07:33:17 +0000 (16:33 +0900)
committerhj kim <backto.kim@samsung.com>
Thu, 13 Sep 2018 08:21:18 +0000 (17:21 +0900)
Change-Id: I1e26023d66877d5d766c1234c4f6893cfe7f93ca

include/media_controller_db.h
include/media_controller_internal.h [new file with mode: 0755]
include/media_controller_private.h
packaging/capi-media-controller.spec
src/media_controller_db.c
src/media_controller_playlist.c
src/media_controller_server.c
test/server_test/media_controller_server_test.c

index 8a46dc943c24a61e2ba48fce133fc9d395bdf39d..c2a4f984182ad848cc5b316c84e561a2f4689f54 100755 (executable)
@@ -46,6 +46,7 @@ int mc_db_get_icon_uri(void *handle, const char *server_name, char **uri);
 int mc_db_get_ability_supported(void *handle, const char *server_name, mc_ability_e ability, mc_ability_support_e *supported);
 int mc_db_get_pb_action_ability(void *handle, const char *server_name, mc_playback_ability_h *ability);
 int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlist_cb callback, void *user_data);
+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(void *db_handle, const char *address);
 int mc_db_delete_server_address_from_server_list(void *db_handle, const char *address);
diff --git a/include/media_controller_internal.h b/include/media_controller_internal.h
new file mode 100755 (executable)
index 0000000..70d001e
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_INTERNAL_H__
+#define __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_INTERNAL_H__
+
+#include <media_controller_type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @internal
+ * @file media_controller_internal.h
+ */
+
+/*To Support C#*/
+int mc_playlist_create(const char *playlist_name, mc_playlist_h *playlist);
+int mc_playlist_update_item(mc_playlist_h playlist, const char *index, mc_meta_e attribute, const char *value);
+int mc_server_get_playlist(mc_server_h server, const char *playlist_name, mc_playlist_h *playlist);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_INTERNAL_H__ */
index 7cec3f436581e4f0736a42289a1fbca0c4e65262..2d7eed0ebd67289fd3b0b9f6ba12a09c220f08d3 100755 (executable)
@@ -31,6 +31,8 @@ extern "C" {
 #include "media_controller_server.h"
 #include "media_controller_client.h"
 #include "media_controller_socket.h"
+#include "media_controller_internal.h"
+
 
 #ifdef LOG_TAG
 #undef LOG_TAG
@@ -337,6 +339,7 @@ typedef struct {
 } media_controller_client_s;
 
 typedef struct {
+       mc_priv_type_e type;    //server or client
        char *server_name;
        char *playlist_name;
        GList *item_list;
@@ -404,6 +407,8 @@ int mc_ipc_send_reply(GDBusConnection *connection, const char *dbus_name, const
 int mc_ipc_send_message_to_server(mc_msg_type_e msg_type, mc_priv_type_e priv_type, const char *request_msg);
 int mc_ipc_service_connect(mc_priv_type_e type);
 
+int _mc_playlist_update(mc_priv_type_e type, void *handle, const char *controller_name, mc_playlist_h playlist);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index db635e08f76cd24b9b0652e987a31623d543677e..bb46adcfa2a916d6e1020584adae26665f4cbe71 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.1.69
+Version:    0.1.70
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index 53db6e5fadc75617266253996200a05eecc124d4..8f8c2a502183836cee4e3b5cb49da7bfd64cebad 100755 (executable)
@@ -691,6 +691,10 @@ int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlis
        char *sql_str = NULL;
        sqlite3_stmt *stmt = NULL;
 
+       mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(server_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+
        sql_str = sqlite3_mprintf("SELECT playlist_name from %s WHERE server_name = %Q GROUP BY playlist_name", MC_DB_TABLE_PLAYLIST, server_name);
        mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
 
@@ -737,6 +741,64 @@ int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlis
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
+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 ret = MEDIA_CONTROLLER_ERROR_NONE;
+       sqlite3 *db_handle = (sqlite3 *)handle;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+       int count = 0;
+
+       mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(controller_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "server_name is NULL");
+       mc_retvm_if(playlist_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "playlist_name is NULL");
+       mc_retvm_if(playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "playlist is NULL");
+
+       sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM '%q' WHERE server_name = %Q AND playlist_name = %Q", MC_DB_TABLE_PLAYLIST, controller_name, playlist_name);
+       mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
+
+       ret = sqlite3_prepare_v2(db_handle, sql_str, strlen(sql_str), &stmt, NULL);
+       if (SQLITE_OK != ret) {
+               mc_error("prepare error [%s]", sqlite3_errmsg(db_handle));
+               SQLITE3_SAFE_FREE(sql_str);
+               return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+       }
+
+       ret = sqlite3_step(stmt);
+       if (SQLITE_ROW != ret) {
+               mc_error("end of row [%s]", sqlite3_errmsg(db_handle));
+               SQLITE3_FINALIZE(stmt);
+               SQLITE3_SAFE_FREE(sql_str);
+               return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+       }
+
+       count = sqlite3_column_int(stmt, 0);
+
+       if (count > 0) {
+               mc_playlist_s *_playlist = (mc_playlist_s *)calloc(1, sizeof(mc_playlist_s));
+               if (_playlist != NULL) {
+                       _playlist->type = type;
+                       _playlist->server_name = g_strdup(controller_name);
+                       _playlist->playlist_name = g_strdup(playlist_name);
+
+                       *playlist = (mc_playlist_h)_playlist;
+
+                       ret = MEDIA_CONTROLLER_ERROR_NONE;
+               } else {
+                       mc_error("OUT_OF_MEMORY");
+                       ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+               }
+       } else {
+               mc_error("playlist is not exist");
+               ret = MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
+       }
+
+       SQLITE3_FINALIZE(stmt);
+       SQLITE3_SAFE_FREE(sql_str);
+
+       return ret;
+}
+
 int mc_db_get_playlist_item(void *handle, const char *server_name, char *playlist_name, mc_playlist_item_cb callback, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -929,6 +991,7 @@ int mc_db_delete_server_table(void *handle, const char *server_name)
 int mc_db_check_server_table_exist(void *handle, const char *server_name, bool *exist)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       sqlite3 *db_handle = (sqlite3 *)handle;
        char *sql_str = NULL;
        sqlite3_stmt *stmt = NULL;
        int count = 0;
@@ -939,16 +1002,16 @@ int mc_db_check_server_table_exist(void *handle, const char *server_name, bool *
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM SQLITE_MASTER WHERE type='table' and name='%q'", server_name);
        mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
 
-       ret = sqlite3_prepare_v2(handle, sql_str, strlen(sql_str), &stmt, NULL);
+       ret = sqlite3_prepare_v2(db_handle, sql_str, strlen(sql_str), &stmt, NULL);
        if (SQLITE_OK != ret) {
-               mc_error("prepare error [%s]", sqlite3_errmsg(handle));
+               mc_error("prepare error [%s]", sqlite3_errmsg(db_handle));
                SQLITE3_SAFE_FREE(sql_str);
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }
 
        ret = sqlite3_step(stmt);
        if (SQLITE_ROW != ret) {
-               mc_error("end of row [%s]", sqlite3_errmsg(handle));
+               mc_error("end of row [%s]", sqlite3_errmsg(db_handle));
                SQLITE3_FINALIZE(stmt);
                SQLITE3_SAFE_FREE(sql_str);
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
@@ -972,6 +1035,7 @@ int mc_db_check_server_table_exist(void *handle, const char *server_name, bool *
 int mc_db_check_client_table_exist(void *handle, const char *client_name, bool *exist)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       sqlite3 *db_handle = (sqlite3 *)handle;
        char *sql_str = NULL;
        sqlite3_stmt *stmt = NULL;
        int count = 0;
@@ -982,16 +1046,16 @@ int mc_db_check_client_table_exist(void *handle, const char *client_name, bool *
        sql_str = sqlite3_mprintf("SELECT COUNT(*) FROM '%q' WHERE client_name='%q'", MC_DB_TABLE_CLIENT_LIST, client_name);
        mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
 
-       ret = sqlite3_prepare_v2(handle, sql_str, strlen(sql_str), &stmt, NULL);
+       ret = sqlite3_prepare_v2(db_handle, sql_str, strlen(sql_str), &stmt, NULL);
        if (SQLITE_OK != ret) {
-               mc_error("prepare error [%s]", sqlite3_errmsg(handle));
+               mc_error("prepare error [%s]", sqlite3_errmsg(db_handle));
                SQLITE3_SAFE_FREE(sql_str);
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }
 
        ret = sqlite3_step(stmt);
        if (SQLITE_ROW != ret) {
-               mc_error("end of row [%s]", sqlite3_errmsg(handle));
+               mc_error("end of row [%s]", sqlite3_errmsg(db_handle));
                SQLITE3_FINALIZE(stmt);
                SQLITE3_SAFE_FREE(sql_str);
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
index e1525677fa891192472a5d34ad33caddee2de675..4fa0f79abfc9f4ab7ab96b7218f55bb0f65a516f 100755 (executable)
 #include "media_controller_private.h"
 #include "media_controller_db.h"
 
+#define MAX_PLAYLIST_LEN 100
+
+int mc_playlist_create(const char *playlist_name, mc_playlist_h *playlist)
+{
+       mc_retvm_if(!MC_STRING_VALID(playlist_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
+       mc_retvm_if(playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+
+       mc_playlist_s *_playlist = (mc_playlist_s*)calloc(1, sizeof(mc_playlist_s));
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       _playlist->playlist_name = g_strdup(playlist_name);
+
+       *playlist = (mc_playlist_h)_playlist;
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+static int __mc_playlist_item_release(mc_playlist_item_s *playlist_item)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+
+       mc_retvm_if(playlist_item == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_item");
+
+       MC_SAFE_FREE(playlist_item->index);
+       MC_SAFE_FREE(playlist_item->title);
+       MC_SAFE_FREE(playlist_item->artist);
+       MC_SAFE_FREE(playlist_item->album);
+       MC_SAFE_FREE(playlist_item->author);
+       MC_SAFE_FREE(playlist_item->genre);
+       MC_SAFE_FREE(playlist_item->duration);
+       MC_SAFE_FREE(playlist_item->date);
+       MC_SAFE_FREE(playlist_item->copyright);
+       MC_SAFE_FREE(playlist_item->description);
+       MC_SAFE_FREE(playlist_item->track_num);
+       MC_SAFE_FREE(playlist_item->picture);
+       MC_SAFE_FREE(playlist_item);
+
+       return ret ;
+}
+
+int _mc_playlist_update(mc_priv_type_e type, void *handle, const char *controller_name, mc_playlist_h playlist)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       GList *query_list = NULL;
+       int length = 0;
+       int idx = 0;
+       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
+
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+       mc_retvm_if(_playlist->playlist_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
+
+       _playlist->type = type;
+       _playlist->server_name = g_strdup(controller_name);
+
+       if (_playlist->item_list != NULL) {
+               length = g_list_length(_playlist->item_list);
+
+               for (idx = 0; idx < length; idx++) {
+                       mc_playlist_item_s *_item = NULL;
+                       _item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
+
+
+                       if (_item != NULL && _item->index != NULL) {
+                               char *sql_str = NULL;
+
+                               sql_str = sqlite3_mprintf("INSERT INTO '%q' (server_name, playlist_name, item_index, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture) VALUES (%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q);",
+                                       MC_DB_TABLE_PLAYLIST, _playlist->server_name, _playlist->playlist_name, _item->index, _item->title, _item->artist, _item->album, _item->author, _item->genre, _item->duration, _item->date, _item->copyright, _item->description, _item->track_num, _item->picture);
+
+                               if (sql_str != NULL)
+                                       query_list = g_list_append(query_list, sql_str);
+                               else
+                                       mc_error("wrong playlist query");
+                       } else {
+                               mc_error("wrong playlist item");
+                       }
+               }
+       } else {
+               char *sql_str = NULL;
+
+               sql_str = sqlite3_mprintf("INSERT INTO '%q' (server_name, playlist_name, item_index, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture) VALUES (%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q);",
+                       MC_DB_TABLE_PLAYLIST, _playlist->server_name, _playlist->playlist_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+               if (sql_str != NULL)
+                       query_list = g_list_append(query_list, sql_str);
+               else
+                       mc_error("wrong playlist query");
+       }
+
+       ret = mc_db_update_playlist(handle, controller_name, _playlist->playlist_name, query_list);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("fail to mc_db_update_playlist");
+               goto RELEASE;
+       }
+
+RELEASE:
+       for (idx = 0; idx < length; idx++) {
+               __mc_playlist_item_release((mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx));
+       }
+
+       if (_playlist->item_list != NULL) {
+               g_list_free(_playlist->item_list);
+               _playlist->item_list = NULL;
+       }
+
+       length = g_list_length(query_list);
+
+       for (idx = 0; idx < length; idx++) {
+               char *query_str = g_list_nth_data(query_list, idx);
+               SQLITE3_SAFE_FREE(query_str);
+       }
+
+       g_list_free(query_list);
+
+       return ret;
+}
+
+int mc_playlist_update_item(mc_playlist_h playlist, const char *index, mc_meta_e attribute, const char *value)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
+       mc_playlist_item_s *_playlist_item = NULL;
+       int length = 0;
+       int idx = 0;
+       bool find = FALSE;
+
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+       mc_retvm_if(!MC_STRING_VALID(index), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index");
+
+       if (_playlist->item_list != NULL) {
+               length = g_list_length(_playlist->item_list);
+
+               mc_retvm_if((length > MAX_PLAYLIST_LEN), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Exceeding max playlist item [%d]", MAX_PLAYLIST_LEN);
+
+               for (idx = 0; idx < length; idx++) {
+                       mc_playlist_item_s *_item = NULL;
+                       _item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
+                       if (_item != NULL) {
+                               if (g_strcmp0(_item->index, index) == 0) {
+                                       _playlist_item = _item;
+                                       find = TRUE;
+
+                               }
+                       }
+               }
+       }
+
+       if (find == FALSE) {
+               _playlist_item = (mc_playlist_item_s*)calloc(1, sizeof(mc_playlist_item_s));
+               mc_retvm_if(_playlist_item == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "memory alloc fail");
+
+               _playlist_item->index = g_strdup(index);
+       }
+
+       switch (attribute) {
+       case MC_META_MEDIA_TITLE:
+               MC_SAFE_FREE(_playlist_item->title);
+               if (value != NULL)
+                       _playlist_item->title = strdup(value);
+               break;
+       case MC_META_MEDIA_ARTIST:
+               MC_SAFE_FREE(_playlist_item->artist);
+               if (value != NULL)
+                       _playlist_item->artist = strdup(value);
+               break;
+       case MC_META_MEDIA_ALBUM:
+               MC_SAFE_FREE(_playlist_item->album);
+               if (value != NULL)
+                       _playlist_item->album = strdup(value);
+               break;
+       case MC_META_MEDIA_AUTHOR:
+               MC_SAFE_FREE(_playlist_item->author);
+               if (value != NULL)
+                       _playlist_item->author = strdup(value);
+               break;
+       case MC_META_MEDIA_GENRE:
+               MC_SAFE_FREE(_playlist_item->genre);
+               if (value != NULL)
+                       _playlist_item->genre = strdup(value);
+               break;
+       case MC_META_MEDIA_DURATION:
+               MC_SAFE_FREE(_playlist_item->duration);
+               if (value != NULL)
+                       _playlist_item->duration = strdup(value);
+               break;
+       case MC_META_MEDIA_DATE:
+               MC_SAFE_FREE(_playlist_item->date);
+               if (value != NULL)
+                       _playlist_item->date = strdup(value);
+               break;
+       case MC_META_MEDIA_COPYRIGHT:
+               MC_SAFE_FREE(_playlist_item->copyright);
+               if (value != NULL)
+                       _playlist_item->copyright = strdup(value);
+               break;
+       case MC_META_MEDIA_DESCRIPTION:
+               MC_SAFE_FREE(_playlist_item->description);
+               if (value != NULL)
+                       _playlist_item->description = strdup(value);
+               break;
+       case MC_META_MEDIA_TRACK_NUM:
+               MC_SAFE_FREE(_playlist_item->track_num);
+               if (value != NULL)
+                       _playlist_item->track_num = strdup(value);
+               break;
+       case MC_META_MEDIA_PICTURE:
+               MC_SAFE_FREE(_playlist_item->picture);
+               if (value != NULL)
+                       _playlist_item->picture = strdup(value);
+               break;
+       default:
+               mc_error("Invalid Parameter [%d]", attribute);
+
+               if (find == FALSE)
+                       __mc_playlist_item_release(_playlist_item);
+
+               return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
+       }
+
+       if (find == FALSE)
+               _playlist->item_list = g_list_append(_playlist->item_list, _playlist_item);
+
+       return ret;
+}
+
 int mc_playlist_get_name(mc_playlist_h playlist, char **playlist_name)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
index fc52970399c64e281e22f3cb49979e5bf5d1754c..1ac33d021bf750c212be5687a69c098fc896aacf 100755 (executable)
@@ -820,248 +820,36 @@ int mc_server_update_metadata(mc_server_h server)
 
 int mc_server_create_playlist(mc_server_h server, const char *playlist_name, mc_playlist_h *playlist)
 {
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
 
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid server");
-       mc_retvm_if(!MC_STRING_VALID(playlist_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
-       mc_retvm_if(playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
-
-       mc_playlist_s *_playlist = (mc_playlist_s*)calloc(1, sizeof(mc_playlist_s));
-       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
-       _playlist->server_name = g_strdup(mc_server->server_name);
-       _playlist->playlist_name = g_strdup(playlist_name);
-
-       *playlist = (mc_playlist_h)_playlist;
-
-       return ret;
-}
-
-static int __mc_server_playlist_item_release(mc_playlist_item_s *playlist_item)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-
-       mc_retvm_if(playlist_item == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_item");
-
-       MC_SAFE_FREE(playlist_item->index);
-       MC_SAFE_FREE(playlist_item->title);
-       MC_SAFE_FREE(playlist_item->artist);
-       MC_SAFE_FREE(playlist_item->album);
-       MC_SAFE_FREE(playlist_item->author);
-       MC_SAFE_FREE(playlist_item->genre);
-       MC_SAFE_FREE(playlist_item->duration);
-       MC_SAFE_FREE(playlist_item->date);
-       MC_SAFE_FREE(playlist_item->copyright);
-       MC_SAFE_FREE(playlist_item->description);
-       MC_SAFE_FREE(playlist_item->track_num);
-       MC_SAFE_FREE(playlist_item->picture);
-       MC_SAFE_FREE(playlist_item->picture);
-       MC_SAFE_FREE(playlist_item);
-
-       return ret ;
-}
-
-int __mc_server_append_item(mc_playlist_h playlist, const char *index, mc_meta_e attribute, const char *value)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
-       mc_playlist_item_s *_playlist_item = NULL;
-       int length = 0;
-       int idx = 0;
-       bool find = FALSE;
-
-       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
-       mc_retvm_if(!MC_STRING_VALID(index), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index");
-
-       if (_playlist->item_list != NULL) {
-               length = g_list_length(_playlist->item_list);
-
-               mc_retvm_if((length > MAX_PLAYLIST_LEN), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Exceeding max playlist item [%d]", MAX_PLAYLIST_LEN);
-
-               for (idx = 0; idx < length; idx++) {
-                       mc_playlist_item_s *_item = NULL;
-                       _item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
-                       if (_item != NULL) {
-                               if (g_strcmp0(_item->index, index) == 0) {
-                                       _playlist_item = _item;
-                                       find = TRUE;
-
-                               }
-                       }
-               }
-       }
-
-       if (find == FALSE) {
-               _playlist_item = (mc_playlist_item_s*)calloc(1, sizeof(mc_playlist_item_s));
-               mc_retvm_if(_playlist_item == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "memory alloc fail");
-
-               _playlist_item->index = g_strdup(index);
-       }
-
-       switch (attribute) {
-       case MC_META_MEDIA_TITLE:
-               MC_SAFE_FREE(_playlist_item->title);
-               if (value != NULL)
-                       _playlist_item->title = strdup(value);
-               break;
-       case MC_META_MEDIA_ARTIST:
-               MC_SAFE_FREE(_playlist_item->artist);
-               if (value != NULL)
-                       _playlist_item->artist = strdup(value);
-               break;
-       case MC_META_MEDIA_ALBUM:
-               MC_SAFE_FREE(_playlist_item->album);
-               if (value != NULL)
-                       _playlist_item->album = strdup(value);
-               break;
-       case MC_META_MEDIA_AUTHOR:
-               MC_SAFE_FREE(_playlist_item->author);
-               if (value != NULL)
-                       _playlist_item->author = strdup(value);
-               break;
-       case MC_META_MEDIA_GENRE:
-               MC_SAFE_FREE(_playlist_item->genre);
-               if (value != NULL)
-                       _playlist_item->genre = strdup(value);
-               break;
-       case MC_META_MEDIA_DURATION:
-               MC_SAFE_FREE(_playlist_item->duration);
-               if (value != NULL)
-                       _playlist_item->duration = strdup(value);
-               break;
-       case MC_META_MEDIA_DATE:
-               MC_SAFE_FREE(_playlist_item->date);
-               if (value != NULL)
-                       _playlist_item->date = strdup(value);
-               break;
-       case MC_META_MEDIA_COPYRIGHT:
-               MC_SAFE_FREE(_playlist_item->copyright);
-               if (value != NULL)
-                       _playlist_item->copyright = strdup(value);
-               break;
-       case MC_META_MEDIA_DESCRIPTION:
-               MC_SAFE_FREE(_playlist_item->description);
-               if (value != NULL)
-                       _playlist_item->description = strdup(value);
-               break;
-       case MC_META_MEDIA_TRACK_NUM:
-               MC_SAFE_FREE(_playlist_item->track_num);
-               if (value != NULL)
-                       _playlist_item->track_num = strdup(value);
-               break;
-       case MC_META_MEDIA_PICTURE:
-               MC_SAFE_FREE(_playlist_item->picture);
-               if (value != NULL)
-                       _playlist_item->picture = strdup(value);
-               break;
-       default:
-               mc_error("Invalid Parameter [%d]", attribute);
-
-               if (find == FALSE)
-                       __mc_server_playlist_item_release(_playlist_item);
-
-               return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
-       }
-
-       if (find == FALSE)
-               _playlist->item_list = g_list_append(_playlist->item_list, _playlist_item);
-
-       return ret;
+       return mc_playlist_create(playlist_name, playlist);
 }
 
 int mc_server_add_item_to_playlist(mc_server_h server, mc_playlist_h playlist, const char *index, mc_meta_e attribute, const char *value)
 {
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
-       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
 
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid server");
-       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
-       mc_retvm_if(!MC_STRING_VALID(index), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index");
 
-       ret = __mc_server_append_item(playlist, index, attribute, value);
-
-       return ret;
+       return mc_playlist_update_item(playlist, index, attribute, value);
 }
 
 int mc_server_update_playlist_done(mc_server_h server, mc_playlist_h playlist)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       GList *query_list = NULL;
-       int length = 0;
-       int idx = 0;
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
        mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
-
-       mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid server");
        mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
-       mc_retvm_if(_playlist->playlist_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
-
-       if (_playlist->item_list != NULL) {
-               length = g_list_length(_playlist->item_list);
-
-               for (idx = 0; idx < length; idx++) {
-                       mc_playlist_item_s *_item = NULL;
-                       _item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
-
-
-                       if (_item != NULL && _item->index != NULL) {
-                               char *sql_str = NULL;
-
-                               sql_str = sqlite3_mprintf("INSERT INTO '%q' (server_name, playlist_name, item_index, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture) VALUES (%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q);",
-                                       MC_DB_TABLE_PLAYLIST, _playlist->server_name, _playlist->playlist_name, _item->index, _item->title, _item->artist, _item->album, _item->author, _item->genre, _item->duration, _item->date, _item->copyright, _item->description, _item->track_num, _item->picture);
-
-                               if (sql_str != NULL)
-                                       query_list = g_list_append(query_list, sql_str);
-                               else
-                                       mc_error("wrong playlist query");
-                       } else {
-                               mc_error("wrong playlist item");
-                       }
-               }
-       } else {
-               char *sql_str = NULL;
 
-               sql_str = sqlite3_mprintf("INSERT INTO '%q' (server_name, playlist_name, item_index, title, artist, album, author, genre, duration, date, copyright, description, track_num, picture) VALUES (%Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q, %Q);",
-                       MC_DB_TABLE_PLAYLIST, _playlist->server_name, _playlist->playlist_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-               if (sql_str != NULL)
-                       query_list = g_list_append(query_list, sql_str);
-               else
-                       mc_error("wrong playlist query");
-       }
+       mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid server");
 
-       ret = mc_db_update_playlist(mc_server->db_handle, mc_server->server_name, _playlist->playlist_name, query_list);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("fail to mc_db_update_playlist");
-               goto RELEASE;
-       }
+       ret = _mc_playlist_update(MC_PRIV_TYPE_SERVER, mc_server->db_handle, mc_server->server_name, playlist);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to _mc_playlist_update");
 
        ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYLIST, MC_PLAYLIST_UPDATED, 0, _playlist->playlist_name, 0);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("fail to __mc_server_send_message");
-               goto RELEASE;
-       }
-
-RELEASE:
-       for (idx = 0; idx < length; idx++) {
-               __mc_server_playlist_item_release((mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx));
-       }
-
-       if (_playlist->item_list != NULL) {
-               g_list_free(_playlist->item_list);
-               _playlist->item_list = NULL;
-       }
-
-       length = g_list_length(query_list);
-
-       for (idx = 0; idx < length; idx++) {
-               char *query_str = g_list_nth_data(query_list, idx);
-               SQLITE3_SAFE_FREE(query_str);
-       }
-
-       g_list_free(query_list);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
 
        return ret;
 }
@@ -1550,3 +1338,16 @@ int mc_server_destroy(mc_server_h server)
 
        return ret;
 }
+
+/* Internal API */
+int mc_server_get_playlist(mc_server_h server, const char *playlist_name, mc_playlist_h *playlist)
+{
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid server");
+       mc_retvm_if(!MC_STRING_VALID(playlist_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
+       mc_retvm_if(playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+
+       return mc_db_get_playlist_by_name(mc_server->db_handle, MC_PRIV_TYPE_SERVER, mc_server->server_name, playlist_name, playlist);
+}
+
index ef5975c5f9edbd76e89acae7b1e94d318e2e3656..a80da61467ce478a453d790228ee64ac2159d896 100755 (executable)
@@ -298,6 +298,22 @@ static int __update_playlist(mc_server_h server, mc_playlist_update_mode_e mode)
 
                ret = mc_playlist_destroy(playlist_1);
                ret = mc_playlist_destroy(playlist_2);
+
+               ret = mc_server_get_playlist(server, playlist_name_1, &playlist_2);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_get_playlist [%d]", ret);
+
+               if (playlist_2 != NULL) {
+                       char *playlist_name = NULL;
+                       ret = mc_playlist_get_name(playlist_2, &playlist_name);
+                       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("Fail to mc_playlist_get_name [%d]", ret);
+
+                       mc_debug("Get playlist [%s]", playlist_name);
+
+                       MC_SAFE_FREE(playlist_name);
+               }
+
        } else {
 
                ret = mc_server_foreach_playlist(server, server_playlist_list_cb, &playlist_list);