From: hj kim Date: Thu, 13 Sep 2018 07:33:17 +0000 (+0900) Subject: Add internal APIs to support C# X-Git-Tag: submit/tizen/20180913.084013^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5f42dfb58ce72aaffac4bb26e8e45547dc4887c9;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add internal APIs to support C# Change-Id: I1e26023d66877d5d766c1234c4f6893cfe7f93ca --- diff --git a/include/media_controller_db.h b/include/media_controller_db.h index 8a46dc9..c2a4f98 100755 --- a/include/media_controller_db.h +++ b/include/media_controller_db.h @@ -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 index 0000000..70d001e --- /dev/null +++ b/include/media_controller_internal.h @@ -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 + +#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__ */ diff --git a/include/media_controller_private.h b/include/media_controller_private.h index 7cec3f4..2d7eed0 100755 --- a/include/media_controller_private.h +++ b/include/media_controller_private.h @@ -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 */ diff --git a/packaging/capi-media-controller.spec b/packaging/capi-media-controller.spec index db635e0..bb46adc 100755 --- a/packaging/capi-media-controller.spec +++ b/packaging/capi-media-controller.spec @@ -1,6 +1,6 @@ Name: capi-media-controller Summary: A media controller library in Tizen Native API -Version: 0.1.69 +Version: 0.1.70 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_controller_db.c b/src/media_controller_db.c index 53db6e5..8f8c2a5 100755 --- a/src/media_controller_db.c +++ b/src/media_controller_db.c @@ -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; diff --git a/src/media_controller_playlist.c b/src/media_controller_playlist.c index e152567..4fa0f79 100755 --- a/src/media_controller_playlist.c +++ b/src/media_controller_playlist.c @@ -17,6 +17,230 @@ #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; diff --git a/src/media_controller_server.c b/src/media_controller_server.c index fc52970..1ac33d0 100755 --- a/src/media_controller_server.c +++ b/src/media_controller_server.c @@ -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); +} + diff --git a/test/server_test/media_controller_server_test.c b/test/server_test/media_controller_server_test.c index ef5975c..a80da61 100755 --- a/test/server_test/media_controller_server_test.c +++ b/test/server_test/media_controller_server_test.c @@ -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);