[4.0 ACR-1237] Apply 4.0 updated code to 5.0 60/182760/1 accepted/tizen/unified/20180629.061629 submit/tizen/20180628.091114
authorhj kim <backto.kim@samsung.com>
Thu, 28 Jun 2018 00:28:02 +0000 (09:28 +0900)
committerhj kim <backto.kim@samsung.com>
Thu, 28 Jun 2018 00:28:02 +0000 (09:28 +0900)
Change-Id: If373e52223beeb3c90f069374444dfc5a96ba52c

19 files changed:
doc/media_controller_doc.h
include/media_controller_client.h
include/media_controller_db.h
include/media_controller_metadata.h [new file with mode: 0755]
include/media_controller_playlist.h [new file with mode: 0755]
include/media_controller_private.h
include/media_controller_server.h
include/media_controller_type.h
packaging/capi-media-controller.spec
src/media_controller_client.c
src/media_controller_db.c
src/media_controller_metadata.c [new file with mode: 0755]
src/media_controller_playlist.c [new file with mode: 0755]
src/media_controller_server.c
svc/include/media_controller_db_util.h
svc/media_controller_db_util.c
svc/media_controller_svc.c
test/client_test/media_controller_client_test.c
test/server_test/media_controller_server_test.c

index af32a7f101b282a9cb041e47b48022235f887c8d..4642c1f022ba5e71eb6caf050b26781d09b17936 100755 (executable)
@@ -39,7 +39,7 @@
  *
  * @section CAPI_MEDIA_CONTROLLER_OVERVIEW Overview
  * The @ref CAPI_MEDIA_CONTROLLER_MODULE API provides a set of functions to an effective communication between the server and the client for delivering the latest server information. It helps to transfer the information like playback info, shuffle mode, or the metadata of the latest server.  \n
- * To programming the interface, first, create a handler via #mc_client_create() or #mc_server_create(). And then, the client request the necessary information to the server by using #mc_client_set_server_update_cb(), or #mc_client_set_playback_update_cb(). The server provides the requested information to the client by the callback.
+ * To programming the interface, first, create a handler via #mc_client_create() or #mc_server_create(). And then, the client request the necessary information to the server by using #mc_client_set_server_updated_cb(), or #mc_client_set_playback_updated_cb(). The server provides the requested information to the client by the callback.
  *
  */
 
@@ -51,7 +51,8 @@
 *      \#include <media_controller_server.h>
 *
 * @section CAPI_MEDIA_CONTROLLER_SERVER_MODULE_OVERVIEW Overview
-* The @ref CAPI_MEDIA_CONTROLLER_SERVER_MODULE API allows you to send the playback info (#mc_server_set_playback_state(), #mc_server_set_playback_position(), #mc_server_set_playlist_item_index()), or the metadata (#mc_server_set_metadata()). and to receive the custom command (#mc_server_set_custom_command_received_cb()), to update the status information on the latest server (#mc_server_update_playback_info(), #mc_server_update_metadata()), or to create/destroy the handle (#mc_server_create()/#mc_server_destroy()). \n
+* The @ref CAPI_MEDIA_CONTROLLER_SERVER_MODULE API allows you to send the playback info (#mc_server_set_playback_state(), #mc_server_set_playback_position(), #mc_server_set_playlist_item_index()), the metadata (#mc_server_set_metadata() and playlist (#mc_server_set_playlist_item_index(), #mc_server_create_playlist()). and to receive the custom command (#mc_server_set_custom_command_received_cb()), to update the status information on the latest server (#mc_server_update_playback_info(), #mc_server_update_metadata(). \n
+* Before doing those things you should create handle(#mc_server_create()). And if you don't use handle anymore, you have to destroy it(#mc_server_destroy()).
 *
 */
 
 *      \#include <media_controller_client.h>
 *
 * @section CAPI_MEDIA_CONTROLLER_CLIENT_MODULE_OVERVIEW Overview
-* The @ref CAPI_MEDIA_CONTROLLER_CLIENT_MODULE API allows you to check the activated server status (#mc_client_set_server_update_cb()), the playback info (#mc_client_set_playback_update_cb()), or the metadata (#mc_client_set_metadata_update_cb()). to send the custom command (#mc_client_send_custom_command()), to create/destroy the handle (#mc_client_create()/#mc_client_destroy()). \n
+* The @ref CAPI_MEDIA_CONTROLLER_CLIENT_MODULE API allows you to check the activated server status (#mc_client_set_server_updated_cb()), the playback info (#mc_client_set_playback_updated_cb()), the metadata (#mc_client_set_metadata_updated_cb()) or the playlist(#mc_client_set_playlist_updated_cb()). \n
+* And client can send the custom command to server(#mc_client_send_custom_command()). \n
+* Before doing those things you should create handle(#mc_client_create()). And if you don't use handle anymore, you have to destroy it(#mc_client_destroy()).
 * If there is no the activated server, you can get the latest server information by using #mc_client_get_latest_server_info().
 *
 */
 
+/**
+* @ingroup CAPI_MEDIA_CONTROLLER_MODULE
+* @defgroup CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE Media Controller Playlist
+* @brief The @ref CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE API provides functions for playlist of the media.
+* @section CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE_HEADER Required Header
+*      \#include <media_controller_playlist.h>
+*
+* @section CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE_OVERVIEW Overview
+* The @ref CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE API allows you to get playlist name and its items (#mc_playlist_get_name() and #mc_playlist_foreach_item()). \n
+* You can copy the playlist by using #mc_playlist_clone(). And if you don't use handle anymore, you have to destroy it(#mc_playlist_destroy()).
+*
+*/
+
+/**
+* @ingroup CAPI_MEDIA_CONTROLLER_MODULE
+* @defgroup CAPI_MEDIA_CONTROLLER_METADATA_MODULE Media Controller Metadata
+* @brief The @ref CAPI_MEDIA_CONTROLLER_METADATA_MODULE API provides functions for media metadata.
+* @section CAPI_MEDIA_CONTROLLER_METADATA_MODULE_HEADER Required Header
+*      \#include <media_controller_metadata.h>
+*
+* @section CAPI_MEDIA_CONTROLLER_METADAT_MODULE_OVERVIEW Overview
+* The @ref CAPI_MEDIA_CONTROLLER_METADATA_MODULE API allows you to get metadata (#mc_metadata_get()). \n
+* You can copy the metadata by using #mc_metadata_clone(). And if you don't use handle anymore, you have to destroy it(#mc_metadata_destroy()).
+*
+*/
+
 
 #endif /* __TIZEN_MEDIA_CONTROLLER_DOC_H__ */
 
index 9ed86171a424d48d6d5fb7f9fa313457b671db33..ba080a5d5b5444bae855db4bb1d228396d2e2d71 100755 (executable)
@@ -18,6 +18,9 @@
 #define __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_CLIENT_H__
 
 #include <media_controller_type.h>
+#include <media_controller_playlist.h>
+#include <media_controller_metadata.h>
+
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,14 +42,16 @@ extern "C" {
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *              The @a server_name should not be released by the application. \n
+ *              The @a server_name can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] server_name The app_id of the media controller server which sent the notification. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] server_name The app_id of the media controller server which sent the notification.
  * @param[in] state The state of the updated media controller server
- * @param[in] user_data        The user data passed from the mc_client_set_server_update_cb() function
+ * @param[in] user_data        The user data passed from the mc_client_set_server_updated_cb() function
  *
- * @pre mc_client_set_server_update_cb()
+ * @pre mc_client_set_server_updated_cb()
  *
- * @see mc_client_set_server_update_cb()
+ * @see mc_client_set_server_updated_cb()
  */
 typedef void (*mc_server_state_updated_cb)(const char *server_name, mc_server_state_e state, void *user_data);
 
@@ -55,14 +60,17 @@ typedef void (*mc_server_state_updated_cb)(const char *server_name, mc_server_st
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *               The @a server_name and @a playback should not be released by the application. \n
+ *               The @a server_name can be used only in the callback. To use outside, make a copy.
+ *               And @a playback also can be used only in the callback. \n
  *
- * @param[in] server_name The app_id of the media controller server which sent the notification. It can be used only in the callback. To use outside, make a copy.
- * @param[in] playback The playback information of the updated media controller server. It can be used only in the callback.
- * @param[in] user_data        The user data passed from the mc_client_set_playback_update_cb() function
+ * @param[in] server_name The app_id of the media controller server which sent the notification.
+ * @param[in] playback The playback information of the updated media controller server.
+ * @param[in] user_data        The user data passed from the mc_client_set_playback_updated_cb() function
  *
- * @pre mc_client_set_playback_update_cb()
+ * @pre mc_client_set_playback_updated_cb()
  *
- * @see mc_client_set_playback_update_cb()
+ * @see mc_client_set_playback_updated_cb()
  */
 typedef void (*mc_playback_updated_cb)(const char *server_name, mc_playback_h playback, void *user_data);
 
@@ -71,18 +79,22 @@ typedef void (*mc_playback_updated_cb)(const char *server_name, mc_playback_h pl
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *               The @a server_name and @a metadata should not be released by the application. \n
+ *               The @a server_name can be used only in the callback. To use outside, make a copy.
+ *               And @a metadata also can be used only in the callback. To use outside, make a copy using mc_metadata_clone() \n
  *
- * @param[in] server_name The app_id of the media controller server which sent the notification. It can be used only in the callback. To use outside, make a copy.
- * @param[in] metadata the metadata of the updated media controller server. It can be used only in the callback.
- * @param[in] user_data        The user data passed from the mc_client_set_metadata_update_cb() function
+ * @param[in] server_name The app_id of the media controller server which sent the notification.
+ * @param[in] metadata the metadata of the updated media controller server.
+ * @param[in] user_data        The user data passed from the mc_client_set_metadata_updated_cb() function
  *
- * @pre mc_client_set_metadata_update_cb()
+ * @pre mc_client_set_metadata_updated_cb()
  *
- * @see mc_client_set_metadata_update_cb()
+ * @see mc_client_set_metadata_updated_cb()
  */
 typedef void (*mc_metadata_updated_cb)(const char *server_name, mc_metadata_h metadata, void *user_data);
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_shuffle_mode_updated_cb() instead.
  * @brief Called when updating the shuffle mode of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -96,9 +108,10 @@ typedef void (*mc_metadata_updated_cb)(const char *server_name, mc_metadata_h me
  *
  * @see mc_client_set_shuffle_mode_update_cb()
  */
-typedef void (*mc_shuffle_mode_changed_cb)(const char *server_name, mc_shuffle_mode_e mode, void *user_data);
+typedef void (*mc_shuffle_mode_changed_cb)(const char *server_name, mc_shuffle_mode_e mode, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_repeat_mode_updated_cb() instead.
  * @brief Called when updating the repeat mode of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -112,15 +125,53 @@ typedef void (*mc_shuffle_mode_changed_cb)(const char *server_name, mc_shuffle_m
  *
  * @see mc_client_set_repeat_mode_update_cb()
  */
-typedef void (*mc_repeat_mode_changed_cb)(const char *server_name, mc_repeat_mode_e mode, void *user_data);
+typedef void (*mc_repeat_mode_changed_cb)(const char *server_name, mc_repeat_mode_e mode, void *user_data) TIZEN_DEPRECATED_API;
+
+/**
+ * @brief Called when updating the shuffle mode of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @remarks The callback is called in the dbus event loop.
+ *               The @a server_name should not be released by the application. \n
+ *               The @a server_name can be used only in the callback. To use outside, make a copy.
+ *
+ * @param[in] server_name The app_id of the media controller server which sent the notification.
+ * @param[in] mode The shuffle mode of the updated media controller server
+ * @param[in] user_data        The user data passed from the mc_client_set_shuffle_mode_updated_cb() function
+ *
+ * @pre mc_client_set_shuffle_mode_updated_cb()
+ *
+ * @see mc_client_set_shuffle_mode_updated_cb()
+ */
+typedef void (*mc_shuffle_mode_updated_cb)(const char *server_name, mc_shuffle_mode_e mode, void *user_data);
+
+/**
+ * @brief Called when updating the repeat mode of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @remarks The callback is called in the dbus event loop.
+ *               The @a server_name should not be released by the application. \n
+ *               The @a server_name can be used only in the callback. To use outside, make a copy.
+ *
+ * @param[in] server_name The app_id of the media controller server which sent the notification..
+ * @param[in] mode The repeat mode of the updated media controller server
+ * @param[in] user_data        The user data passed from the mc_client_set_repeat_mode_updated_cb() function
+ *
+ * @pre mc_client_set_repeat_mode_updated_cb()
+ *
+ * @see mc_client_set_repeat_mode_updated_cb()
+ */
+typedef void (*mc_repeat_mode_updated_cb)(const char *server_name, mc_repeat_mode_e mode, void *user_data);
 
 /**
  * @brief Called when requesting the list of activated servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *               The @a server_name should not be released by the application. \n
+ *               The @a server_name can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] server_name The app_id of the activated media controller server. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] server_name The app_id of the activated media controller server.
  * @param[in] user_data        The user data passed from the mc_client_foreach_server() function
  *
  * @return @c true to continue with the next iteration of the loop,
@@ -155,12 +206,14 @@ typedef void (*mc_command_reply_received_cb)(const char *server_name, int result
  * @since_tizen 4.0
  *
  * @remarks The callback is called in the dbus event loop. @a data should be released using bundle_free().
+ *              The @a server_name and @ request_id should not be released by the application. \n
+ *              The @a server_name and @ request_id can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] server_name    The app_id of the media controller server which sent the reply, It can be used only in the callback. To use outside, make a copy.
+ * @param[in] server_name    The app_id of the media controller server which sent the reply,
  * @param[in] request_id     The id of the command request
  * @param[in] result_code    The result code of the action
  * @param[in] data The extra data
- * @param[in] user_data        The user data passed from the mc_client_send_custom_command() function
+ * @param[in] user_data        The user data passed from the mc_client_send_custom_cmd() function
  *
  * @pre mc_client_send_custom_cmd()
  * @pre mc_client_set_cmd_reply_cb()
@@ -174,8 +227,10 @@ typedef void (*mc_cmd_reply_received_cb)(const char *server_name, const char *re
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *              The @a server_name should not be released by the application. \n
+ *              The @a server_name can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] server_name The app_id of the subscribed media controller server. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] server_name The app_id of the subscribed media controller server..
  * @param[in] user_data        The user data passed from the mc_client_foreach_server_subscribed() function
  *
  * @return @c true to continue with the next iteration of the loop,
@@ -189,22 +244,25 @@ typedef bool (*mc_subscribed_server_cb)(const char *server_name, void *user_data
 
 /**
  * @brief Called when updating the playlist of the media controller server.
- * @since_tizen 5.0
+ * @since_tizen 4.0
  *
- * @remarks The callback is called in the dbus event loop. @a data is a bundle. A bundle is a set of key-value pairs. "index" is the key and "media metadata" is the value.
+ * @remarks The callback is called in the dbus event loop.
+ *              The @a server_name, @a playlist_name and @a playlist should not be released by the application. \n
+ *              The @a server_name and @ playlist_name can be used only in the callback. To use outside, make a copy.
+ *              And @a playlist also can be used only in the callback. To use outside, make a copy using mc_playlist_clone(). \n
  *
- * @param[in] server_name The app_id of the media controller server which sent the notification. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] server_name The app_id of the media controller server which sent the notification.
  * @param[in] mode The playlist update mode of the updated media controller server
- * @param[in] playlist_name Updated playlist name. It can be used only in the callback. To use outside, make a copy.
- * @param[in] data The playlist of the media controller server. When the playlist has been removed or it has no media after the change, @a data is NULL. It can be used only in the callback. To use outside, make a copy using @c bundle_dup().
- * @param[in] user_data The user data passed from the mc_client_set_playlist_update_cb() function
+ * @param[in] playlist_name Updated playlist name.
+ * @param[in] playlist        The handle to the media controller playlist.
+ * @param[in] user_data The user data passed from the mc_client_set_playlist_updated_cb() function
  *
- * @pre mc_client_set_playlist_update_cb()
+ * @pre mc_client_set_playlist_updated_cb()
  *
- * @see mc_client_set_playlist_update_cb()
- * @see mc_server_update_playlist()
+ * @see mc_client_set_playlist_updated_cb()
+ * @see mc_client_foreach_server_playlist()
  */
-typedef void (*mc_playlist_updated_cb)(const char *server_name, mc_playlist_update_mode_e mode, const char *playlist_name, bundle *data, void *user_data);
+typedef void (*mc_playlist_updated_cb)(const char *server_name, mc_playlist_update_mode_e mode, const char *playlist_name, mc_playlist_h playlist, void *user_data);
 
 /**
  * @brief Creates a media controller client.
@@ -221,13 +279,14 @@ typedef void (*mc_playlist_updated_cb)(const char *server_name, mc_playlist_upda
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Not enough memory is available
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @see mc_client_destroy()
  */
 int mc_client_create(mc_client_h *client);
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_set_server_updated_cb() instead.
  * @brief Sets the callback for monitoring status of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -247,9 +306,10 @@ int mc_client_create(mc_client_h *client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_server_update_cb(mc_client_h client, mc_server_state_updated_cb callback, void *user_data);
+int mc_client_set_server_update_cb(mc_client_h client, mc_server_state_updated_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_unset_server_updated_cb() instead.
  * @brief Unsets the callback for monitoring status of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -266,9 +326,10 @@ int mc_client_set_server_update_cb(mc_client_h client, mc_server_state_updated_c
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_server_update_cb(mc_client_h client);
+int mc_client_unset_server_update_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_set_playback_updated_cb() instead.
  * @brief Sets the callback for monitoring playback status of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers. \n
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -288,9 +349,10 @@ int mc_client_unset_server_update_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_playback_update_cb(mc_client_h client, mc_playback_updated_cb callback, void *user_data);
+int mc_client_set_playback_update_cb(mc_client_h client, mc_playback_updated_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_unset_playback_updated_cb() instead.
  * @brief Unsets the callback for monitoring playback status of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -307,9 +369,10 @@ int mc_client_set_playback_update_cb(mc_client_h client, mc_playback_updated_cb
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_playback_update_cb(mc_client_h client);
+int mc_client_unset_playback_update_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_set_metadata_updated_cb() instead.
  * @brief Sets the callback for monitoring metadata status of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -329,9 +392,10 @@ int mc_client_unset_playback_update_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_metadata_update_cb(mc_client_h client, mc_metadata_updated_cb callback, void *user_data);
+int mc_client_set_metadata_update_cb(mc_client_h client, mc_metadata_updated_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_unset_metadata_updated_cb() instead.
  * @brief Unsets the callback for monitoring metadata status of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -348,9 +412,10 @@ int mc_client_set_metadata_update_cb(mc_client_h client, mc_metadata_updated_cb
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_metadata_update_cb(mc_client_h client);
+int mc_client_unset_metadata_update_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_set_shuffle_mode_updated_cb() instead.
  * @brief Sets the callback for monitoring shuffle mode of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -370,9 +435,10 @@ int mc_client_unset_metadata_update_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_shuffle_mode_update_cb(mc_client_h client, mc_shuffle_mode_changed_cb callback, void *user_data);
+int mc_client_set_shuffle_mode_update_cb(mc_client_h client, mc_shuffle_mode_changed_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_unset_shuffle_mode_updated_cb() instead.
  * @brief Unsets the callback for monitoring shuffle mode of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -389,9 +455,10 @@ int mc_client_set_shuffle_mode_update_cb(mc_client_h client, mc_shuffle_mode_cha
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_shuffle_mode_update_cb(mc_client_h client);
+int mc_client_unset_shuffle_mode_update_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_set_repeat_mode_updated_cb() instead.
  * @brief Sets the callback for monitoring repeat mode of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -411,9 +478,10 @@ int mc_client_unset_shuffle_mode_update_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_repeat_mode_update_cb(mc_client_h client, mc_repeat_mode_changed_cb callback, void *user_data);
+int mc_client_set_repeat_mode_update_cb(mc_client_h client, mc_repeat_mode_changed_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_unset_repeat_mode_updated_cb() instead.
  * @brief Unsets the callback for monitoring repeat mode of the media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -430,18 +498,18 @@ int mc_client_set_repeat_mode_update_cb(mc_client_h client, mc_repeat_mode_chang
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_repeat_mode_update_cb(mc_client_h client);
+int mc_client_unset_repeat_mode_update_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
- * @brief Sets the callback for monitoring playlist status of the media controller server.
+ * @brief Sets the callback for monitoring status of the media controller server.
  * @details The media controller client which calls this function will receive notifications from all media controller servers.
- * @since_tizen 5.0
+ * @since_tizen 4.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
  * @param[in] client         The handle to the media controller client
- * @param[in] callback      The callback to be invoked when the playlist status is changed
+ * @param[in] callback      The callback to be invoked when the media controller server status is changed
  * @param[in] user_data   The user data to be passed to the callback function
  * @return @c 0 on success,
  *         otherwise a negative error value
@@ -452,16 +520,120 @@ int mc_client_unset_repeat_mode_update_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_playlist_update_cb(mc_client_h client, mc_playlist_updated_cb callback, void *user_data);
+int mc_client_set_server_updated_cb(mc_client_h client, mc_server_state_updated_cb callback, void *user_data);
 
 /**
- * @brief Unsets the callback for monitoring playlist status of the media controller server.
- * @since_tizen 5.0
+ * @brief Unsets the callback for monitoring status of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_unset_server_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring playback status of the media controller server.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers. \n
+ * @since_tizen 4.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
  * @param[in] client         The handle to the media controller client
+ * @param[in] callback      The callback to be invoked when the playback status is changed
+ * @param[in] user_data   The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_set_playback_updated_cb(mc_client_h client, mc_playback_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring playback status of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_unset_playback_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring metadata status of the media controller server.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @param[in] callback      The callback to be invoked when the metadata status is changed
+ * @param[in] user_data   The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_set_metadata_updated_cb(mc_client_h client, mc_metadata_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring metadata status of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_unset_metadata_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring shuffle mode of the media controller server.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle to the media controller client
+ * @param[in] callback      The callback to be invoked when the shuffle mode is changed
+ * @param[in] user_data   The user data to be passed to the callback function
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
@@ -471,7 +643,67 @@ int mc_client_set_playlist_update_cb(mc_client_h client, mc_playlist_updated_cb
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_playlist_update_cb(mc_client_h client);
+int mc_client_set_shuffle_mode_updated_cb(mc_client_h client, mc_shuffle_mode_changed_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring shuffle mode of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_unset_shuffle_mode_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring repeat mode of the media controller server.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle to the media controller client
+ * @param[in] callback      The callback to be invoked when the repeat mode is changed
+ * @param[in] user_data   The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_set_repeat_mode_updated_cb(mc_client_h client, mc_repeat_mode_changed_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring repeat mode of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_unset_repeat_mode_updated_cb(mc_client_h client);
 
 /**
  * @brief Sets the callback for receiving the result of the command from the media controller server.
@@ -516,6 +748,52 @@ int mc_client_set_cmd_reply_received_cb(mc_client_h client, mc_cmd_reply_receive
  */
 int mc_client_unset_cmd_reply_received_cb(mc_client_h client);
 
+/**
+ * @brief Sets the callback for monitoring playlist status of the media controller server.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @param[in] callback      The callback to be invoked when the playlist status is changed
+ * @param[in] user_data   The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_playlist_updated_cb()
+ * @see mc_client_unset_playlist_updated_cb()
+ */
+int mc_client_set_playlist_updated_cb(mc_client_h client, mc_playlist_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring playlist status of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client         The handle to the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_playlist_updated_cb()
+ */
+int mc_client_unset_playlist_updated_cb(mc_client_h client);
+
 /**
  * @brief Subscribes media controller server for monitoring status.
  * @details If media controller client subscribe media controller server, \n
@@ -609,8 +887,8 @@ int mc_client_foreach_server_subscribed(mc_client_h client, mc_subscription_type
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
- * @pre The playback update callback should be set with mc_client_set_playback_update_cb().
- * @see mc_client_set_playback_update_cb()
+ * @pre The playback update callback should be set with mc_client_set_playback_updated_cb().
+ * @see mc_client_set_playback_updated_cb()
  */
 int mc_client_get_playback_state(mc_playback_h playback, mc_playback_states_e *state);
 
@@ -628,15 +906,15 @@ int mc_client_get_playback_state(mc_playback_h playback, mc_playback_states_e *s
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
- * @pre The playback update callback should be set with mc_client_set_playback_update_cb().
- * @see mc_client_set_playback_update_cb()
+ * @pre The playback update callback should be set with mc_client_set_playback_updated_cb().
+ * @see mc_client_set_playback_updated_cb()
  */
 int mc_client_get_playback_position(mc_playback_h playback, unsigned long long *position);
 
 /**
  * @brief Gets the index of the media in playlist.
  * @details Gets the index of the current playing media in a playlist. If the media controller server didn't set the index, the value is NULL.
- * @since_tizen 5.0
+ * @since_tizen 4.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
@@ -649,10 +927,12 @@ int mc_client_get_playback_position(mc_playback_h playback, unsigned long long *
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
- * @pre The playback update callback should be set with mc_client_set_playback_update_cb().
- * @see mc_client_set_playback_update_cb()
- * @see mc_client_get_server_playlist()
+ *
+ * @pre The playback update callback should be set with mc_client_set_playback_updated_cb().
+ * @see mc_client_set_playback_updated_cb()
+ * @see mc_client_foreach_server_playlist()
  */
 int mc_client_get_playlist_item_index(mc_playback_h playback, char **index);
 
@@ -665,12 +945,13 @@ int mc_client_get_playlist_item_index(mc_playback_h playback, char **index);
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @pre The playback update callback should be set with mc_client_set_playback_update_cb().
- * @see mc_client_set_playback_update_cb()
+ * @pre The playback update callback should be set with mc_client_set_playback_updated_cb().
+ * @see mc_client_set_playback_updated_cb()
  */
 int mc_client_destroy_playback(mc_playback_h playback);
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_metadata_get() instead.
  * @brief Gets the metadata.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -688,9 +969,10 @@ int mc_client_destroy_playback(mc_playback_h playback);
  * @pre Sets mc_client_set_metadata_update_cb() function to get the metadata
  * @see mc_client_set_metadata_update_cb()
  */
-int mc_client_get_metadata(mc_metadata_h metadata, mc_meta_e attribute, char **value);
+int mc_client_get_metadata(mc_metadata_h metadata, mc_meta_e attribute, char **value) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_metadata_destroy() instead.
  * @brief Destroys metadata.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -702,7 +984,7 @@ int mc_client_get_metadata(mc_metadata_h metadata, mc_meta_e attribute, char **v
  * @pre Sets mc_client_set_metadata_update_cb() function to create metadata
  * @see mc_client_set_metadata_update_cb()
  */
-int mc_client_destroy_metadata(mc_metadata_h metadata);
+int mc_client_destroy_metadata(mc_metadata_h metadata) TIZEN_DEPRECATED_API;
 
 /**
  * @brief Gets the latest media controller server info.
@@ -757,7 +1039,7 @@ int mc_client_get_server_playback_info(mc_client_h client, const char *server_na
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
- * @remarks The @a metadata should be released using @c mc_client_destroy_metadata(). \n
+ * @remarks The @a metadata should be released using @c mc_metadata_destroy(). \n
  *                   If there is no metadata, return value of the metadata is NULL.
  *
  * @param[in] client    The handle to the media controller client
@@ -813,53 +1095,54 @@ int mc_client_get_server_shuffle_mode(mc_client_h client, const char *server_nam
  */
 int mc_client_get_server_repeat_mode(mc_client_h client, const char *server_name, mc_repeat_mode_e *mode);
 
- /**
- * @brief Gets the playlist.
- * @details The media controller client will get the playlist information from @a server_name.
- * @since_tizen 5.0
+/**
+ * @brief Retrieves all activated Server.
+ * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
- * @remarks The @a playlist_name should be released using free(). \n
- *               @a playlist is a bundle. A bundle is a set of key-value pairs. "index" is the key and "media metadata" is the value. \n
- *               And also the @a playlist should be released using @c bundle_free(). \n
- *               If there is no playlist, return value of @a playlist_name and @a playlist is NULL.
- *
  * @param[in] client    The handle to the media controller client
- * @param[in] server_name    The app_id of the media controller server
- * @param[out] playlist_name    The playlist name of the server
- * @param[out] playlist    The item list of the playlist
+ * @param[in] callback      The callback to be invoked when the list of the registered media controller server created completely.
+ * @param[in] user_data   The user data to be passed to the callback function
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
- * @see mc_client_destroy()
- * @see mc_server_update_playlist()
  */
-int mc_client_get_server_playlist(mc_client_h client, const char *server_name, char **playlist_name, bundle **playlist);
+int mc_client_foreach_server(mc_client_h client, mc_activated_server_cb callback, void *user_data);
 
 /**
- * @brief Retrieves all activated Server.
- * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
+ * @brief Retrieves all playlists of the media controller server.
+ * @details This function gets all playlists of the media controller server.
+ *            The callback function will be invoked for every retrieved playlist.
+ *            If there are no playlists, the callback will not be invoked.
+ * @since_tizen 4.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
  * @param[in] client    The handle to the media controller client
- * @param[in] callback      The callback to be invoked when the list of the registered media controller server created completely.
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] callback      The callback function to be invoked.
  * @param[in] user_data   The user data to be passed to the callback function
+ *
  * @return @c 0 on success,
  *         otherwise a negative error value
+ *
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
+ * @see mc_playlist_cb()
  */
-int mc_client_foreach_server(mc_client_h client, mc_activated_server_cb callback, void *user_data);
+int mc_client_foreach_server_playlist(mc_client_h client, const char *server_name, mc_playlist_cb callback, void *user_data);
 
 /**
  * @deprecated Deprecated since 4.0. Use mc_client_send_playback_action_cmd() instead.
@@ -988,6 +1271,7 @@ int mc_client_send_shuffle_mode_cmd(mc_client_h client, const char *server_name,
 int mc_client_send_repeat_mode_cmd(mc_client_h client, const char *server_name, mc_repeat_mode_e repeat_mode, char **request_id);
 
 /**
+ * @deprecated Deprecated since 4.0. Use mc_client_send_custom_cmd() instead.
  * @brief Sends the custom command to server.
  * @details If there is the result for command from server, the media controller client will get the result of the custom command by mc_command_reply_received_cb() callback.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
index 72dbf0af75961464b8f7e2cf933b335a9d8956f3..7863fa26108702ad1d16f5eb28f9e270a8a6bf66 100755 (executable)
@@ -38,16 +38,16 @@ int mc_db_get_playback_info(void *handle, const char *server_name, mc_playback_h
 int mc_db_get_metadata_info(void *handle, const char *server_name, mc_metadata_h *metadata);
 int mc_db_get_shuffle_mode(void *handle, const char *server_name, mc_shuffle_mode_e *mode);
 int mc_db_get_repeat_mode(void *handle, const char *server_name, mc_repeat_mode_e *mode);
-int mc_db_get_playlist(void *handle, const char *server_name, char **playlist_name, bundle **playlist);
-
+int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlist_cb callback, void *user_data);
+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);
 
 int mc_db_foreach_server_list(void *handle, mc_activated_server_cb callback, void *user_data);
 int mc_db_update_server_and_playback_state(void *handle, const char *server_name, mc_server_state_e server_state, mc_playback_states_e playback_state);
 int mc_db_update_latest_server_table(void *handle, const char *server_name);
-int mc_db_remove_playlist(void *handle, const char *server_name);
-int mc_db_update_playlist(void *handle, const char *server_name, const char *playlist_name, bundle *data);
+int mc_db_remove_playlist(void *handle, const char *server_name, const char *playlist_name);
+int mc_db_update_playlist(void *handle, const char *server_name, const char *playlist_name, GList *query_list);
 
 
 #endif /*__TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_DB_H__*/
diff --git a/include/media_controller_metadata.h b/include/media_controller_metadata.h
new file mode 100755 (executable)
index 0000000..5c63c81
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) 2011 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_METADATA_H__
+#define __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_METADATA_H__
+
+#include <media_controller_type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * @addtogroup CAPI_MEDIA_CONTROLLER_METADATA_MODULE
+ * @{
+ */
+
+/**
+ * @file media_controller_metadata.h
+ * @brief This file contains the media controller metadata API and functions related with handling media control.
+ */
+
+/**
+ * @brief Clones a media controller metadata handle.
+ * @details This function copies the media controller metadata handle from a source to
+ *          destination. The mc_metadata_h is created internally and available through media controller metadata functions.
+ *
+ * @since_tizen 4.0
+ *
+ * @remarks The @a dst should be released using @c mc_metadata_destroy().
+ *
+ * @param[in] src The source handle to the media controller metadata
+ * @param[out] dst The destination handle to the media controller metadata
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @see mc_metadata_destroy()
+ */
+int mc_metadata_clone(mc_metadata_h src, mc_metadata_h *dst);
+
+/**
+ * @brief Destroys a media controller metadata handle.
+ * @details This function frees all resources related to the media controller metadata handle. This
+ *          handle no longer can be used to perform any operations. A new handle has to
+ *          be created before next usage.
+ *
+ * @since_tizen 4.0
+ *
+ * @param[in] metadata        The handle to the media controller metadata
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ *
+ * @see mc_metadata_clone()
+ */
+int mc_metadata_destroy(mc_metadata_h metadata);
+
+/**
+ * @brief Gets the metadata.
+ * @since_tizen 4.0
+ *
+ * @remarks The @a value should be released using free(). \n
+ *              If the attribute value of the metadata is empty, return value is NULL.
+ *
+ * @param[in] metadata    The handle to metadata
+ * @param[in] attribute    The key attribute name to get
+ * @param[out] value      The value of the attribute
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @pre Sets mc_client_set_metadata_update_cb() function to get the metadata if you are media controller client. \n
+ *         and also you can use this function when get the metadata when callback function invoked in @c mc_playlist_foreach_item().
+ *
+ * @see mc_client_set_metadata_update_cb()
+ * @see mc_playlist_foreach_item()
+ */
+int mc_metadata_get(mc_metadata_h metadata, mc_meta_e attribute, char **value);
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_METADATA_H__ */
diff --git a/include/media_controller_playlist.h b/include/media_controller_playlist.h
new file mode 100755 (executable)
index 0000000..5610037
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+* Copyright (c) 2011 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_PLAYLIST_H__
+#define __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_PLAYLIST_H__
+
+#include <media_controller_type.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file media_controller_playlist.h
+ * @brief This file contains the media controller playlist API and functions related with handling media control.
+ */
+
+
+/**
+ * @addtogroup CAPI_MEDIA_CONTROLLER_PLAYLIST_MODULE
+ * @{
+ */
+
+/**
+ * @brief Called for every playlist.
+ *
+ * @since_tizen 4.0
+ *
+ * @remarks The @a playlist should not be released by the application. \n
+ *              To use the @a playlist outside this function, copy the handle with the mc_playlist_clone() function. \n
+ *               The callback is called in the main loop.
+ *
+ * @param[in] playlist        The handle to the media controller playlist.
+ * @param[in] user_data The user data passed from the foreach function
+ *
+ * @return @c true to continue with the next iteration of the loop,
+ *         otherwise @c false to break out of the loop
+ *
+ * @pre mc_server_foreach_playlist() and mc_client_foreach_server_playlist() will invoke this function.
+ *
+ * @see mc_playlist_clone()
+ * @see mc_server_foreach_playlist()
+ * @see mc_client_foreach_server_playlist()
+ */
+typedef bool (*mc_playlist_cb)(mc_playlist_h playlist, void *user_data);
+
+/**
+ * @brief Called for every playlist item in the playlist.
+ *
+ * @since_tizen 4.0
+ *
+ * @remarks The @a index and @a metadata should not be released by the application. \n
+ *               The @a index can be used only in the callback. To use outside, make a copy.
+ *               And @a metadata also can be used only in the callback. To use outside, make a copy with the mc_metadata_clone() function. \n
+ *               The callback is called in the main loop.
+ *
+ * @param[in] index The ID of the playlist member.
+ * @param[in] metadata The handle to metadata of the playlist item.
+ * @param[in] user_data The user data passed from the foreach function
+ *
+ * @return @c true to continue with the next iteration of the loop,
+ *         otherwise @c false to break out of the loop
+ *
+ * @pre mc_playlist_foreach_item() will invoke this function.
+ *
+ * @see mc_playlist_foreach_item()
+ * @see mc_metadata_clone()
+ */
+typedef bool (*mc_playlist_item_cb)(const char *index, mc_metadata_h metadata, void *user_data);
+
+/**
+ * @brief Gets the name of the playlist.
+ * @since_tizen 4.0
+ *
+ * @remarks The @a playlist_name should be released using free().
+ *
+ * @param[in] playlist         The handle to the media controller playlist
+ * @param[out] playlist_name      The name of the playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @pre You can get playlist handle using mc_server_foreach_playlist() if you are media controller server, or mc_client_foreach_server_playlist() if you are media controller client.
+ *
+ * @see mc_server_foreach_playlist()
+ * @see mc_client_foreach_server_playlist()
+ * @see mc_playlist_destroy()
+ */
+int mc_playlist_get_name(mc_playlist_h playlist, char **playlist_name);
+
+/**
+ * @brief Iterates through media items in a playlist.
+ * @details This function gets all items in a playlist.
+ *          The callback function will be invoked for every retrieved playlist item.
+ *          If there are no items on the playlist, the callback will not be invoked.
+ * @since_tizen 4.0
+ *
+ * @param[in] playlist        The handle to the media controller playlist
+ * @param[in] callback       The callback function to be invoked
+ * @param[in] user_data     The user data to be passed to the callback function
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @pre You can get playlist handle using mc_server_foreach_playlist() if you are media controller server, or mc_client_foreach_server_playlist() if you are media controller client.
+ * @post This function invokes mc_playlist_item_cb().
+ *
+ * @see mc_server_foreach_playlist()
+ * @see mc_client_foreach_server_playlist()
+ * @see mc_playlist_item_cb()
+ * @see mc_playlist_destroy()
+ */
+int mc_playlist_foreach_item(mc_playlist_h playlist, mc_playlist_item_cb callback, void *user_data);
+
+/**
+ * @brief Clones a media controller playlist handle.
+ * @details This function copies the media controller playlist handle from a source to
+ *          destination. The mc_playlist_h is created internally and available through media controller playlist functions.
+ *
+ * @since_tizen 4.0
+ *
+ * @remarks The @a dst should be released using mc_playlist_destroy().
+ *
+ * @param[in] src The source handle to the media controller playlist
+ * @param[out] dst The destination handle to the media controller playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @see mc_playlist_destroy()
+ */
+int mc_playlist_clone(mc_playlist_h src, mc_playlist_h *dst);
+
+/**
+ * @brief Destroys a media controller playlist handle.
+ * @details This function frees all resources related to the media controller playlist handle. This
+ *          handle no longer can be used to perform any operations. A new handle has to
+ *          be created before next usage.
+ *
+ * @since_tizen 4.0
+ *
+ * @param[in] playlist        The handle to the media controller playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ *
+ * @see mc_playlist_clone()
+ */
+int mc_playlist_destroy(mc_playlist_h playlist);
+
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_PLAYLIST_H__ */
index e4269493baf863c0db8b328a81aea194922eb3bd..2066a367e37da7d851cd71df6ea1264188ac6c44 100755 (executable)
@@ -279,6 +279,27 @@ typedef struct {
        media_controller_receiver_s cmd_reply_cb;
 } media_controller_client_s;
 
+typedef struct {
+       char *server_name;
+       char *playlist_name;
+       GList *item_list;
+} mc_playlist_s;
+
+typedef struct {
+       char *index;
+       char *title;
+       char *artist;
+       char *album;
+       char *author;
+       char *genre;
+       char *duration;
+       char *date;
+       char *copyright;
+       char *description;
+       char *track_num;
+       char *picture;
+} mc_playlist_item_s;
+
 /* formal callback to receive signal */
 typedef void(*mc_signal_received_cb)(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 typedef struct {
index 7a7a5fae99a281d9fac143051d32240ab3b71882..be8d52ad5cb3865d89fa1e149b339bcd891e8ec4 100755 (executable)
@@ -18,6 +18,9 @@
 #define __TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_SERVER_H__
 
 #include <media_controller_type.h>
+#include <media_controller_playlist.h>
+#include <media_controller_metadata.h>
+
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,8 +43,10 @@ extern "C" {
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.
+ *               The @a client_name should not be released by the application. \n
+ *               The @a client_name can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] state    The received playback state
  * @param[in] user_data        The user data passed from the mc_server_set_playback_state_command_received_cb() function
  *
@@ -57,8 +62,10 @@ typedef void (*mc_server_playback_state_command_received_cb)(const char* client_
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name and @ request_id can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id    The request_id of the media controller client.
  * @param[in] action    The received playback action
  * @param[in] user_data        The user data passed from the mc_server_set_playback_action_cmd_received_cb() function
@@ -76,8 +83,10 @@ typedef void (*mc_server_playback_action_cmd_received_cb)(const char* client_nam
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name and @ request_id can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id    The request_id of the media controller client.
  * @param[in] position    The received playback position (milliseconds)
  * @param[in] user_data        The user data passed from the mc_server_set_playback_position_cmd_received_cb() function
@@ -95,8 +104,10 @@ typedef void (*mc_server_playback_position_cmd_received_cb)(const char* client_n
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name and @ request_id can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id    The request_id of the media controller client.
  * @param[in] shuffle_mode    The received shuffle_mode
  * @param[in] user_data        The user data passed from the mc_server_set_shuffle_mode_cmd_received_cb() function
@@ -114,8 +125,10 @@ typedef void (*mc_server_shuffle_mode_cmd_received_cb)(const char* client_name,
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name and @ request_id can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id    The request_id of the media controller client.
  * @param[in] repeat_mode    The received repeat mode
  * @param[in] user_data        The user data passed from the mc_server_set_repeat_mode_cmd_received_cb() function
@@ -135,10 +148,11 @@ typedef void (*mc_server_repeat_mode_cmd_received_cb)(const char* client_name, c
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop. @a data should be released using bundle_free().\n
- *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name and @ command can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
- * @param[in] command    The received command. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
+ * @param[in] command    The received command.
  * @param[in] data    The extra data
  * @param[in] user_data        The user data passed from the mc_server_set_custom_command_received_cb() function
  *
@@ -154,11 +168,13 @@ typedef void (*mc_server_custom_command_received_cb)(const char* client_name, co
  *
  * @remarks The callback is called in the dbus event loop. \n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name, @ request_id, @ playlist_name and @ index can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id    The request_id of the media controller client.
- * @param[in] playlist_name    The name of the server playlist. It can be used only in the callback. To use outside, make a copy.
- * @param[in] index    The index of the media in playlist. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] playlist_name    The name of the server playlist.
+ * @param[in] index    The index of the media in playlist.
  * @param[in] action    The received playback action
  * @param[in] position    The received playback position (milliseconds)
  * @param[in] user_data    The user data passed from the mc_server_set_playlist_cmd_received_cb() function
@@ -178,10 +194,12 @@ typedef void (*mc_server_playlist_cmd_received_cb)(const char* client_name, cons
  *
  * @remarks The callback is called in the dbus event loop. @a data should be released using bundle_free().\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.
+ *          The @a client_name and @ request_id should not be released by the application. \n
+ *          The @a client_name, @ request_id and @ command can be used only in the callback. To use outside, make a copy.
  *
- * @param[in] client_name    The app_id of the media controller client. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] client_name    The app_id of the media controller client.
  * @param[in] request_id     The id of the command request
- * @param[in] command    The received command. It can be used only in the callback. To use outside, make a copy.
+ * @param[in] command    The received command.
  * @param[in] data    The extra data
  * @param[in] user_data        The user data passed from the mc_server_set_custom_cmd_received_cb() function
  *
@@ -207,7 +225,7 @@ typedef void (*mc_server_custom_cmd_received_cb)(const char* client_name, const
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Not enough memory is available
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @see mc_server_destroy()
  */
@@ -216,13 +234,19 @@ int mc_server_create(mc_server_h *server);
 /**
  * @brief Sets the playback state to update the latest state info.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
  * @param[in] server The handle to media controller server
  * @param[in] state The state to set
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
  * @pre Create a media controller server handle by calling mc_server_create().
  * @post Apply the updated playback information by calling mc_server_update_playback_info().
  * @see mc_server_create()
@@ -234,13 +258,19 @@ int mc_server_set_playback_state(mc_server_h server, mc_playback_states_e state)
 /**
  * @brief Sets the playback position to update the latest playback info.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
  * @param[in] server The handle to media controller server
  * @param[in] position The position to set in milliseconds
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
  * @pre Create a media controller server handle by calling mc_server_create().
  * @post Apply the updated playback information by calling mc_server_update_playback_info().
  * @see mc_server_create()
@@ -251,22 +281,28 @@ int mc_server_set_playback_position(mc_server_h server, unsigned long long posit
 
 /**
  * @brief Sets the index of the current playing media in the playlist to update the latest playback info. \n
- * @defails If a media controller server has a playlist, the server can register and share it with media controller client. A playlist is a set of key-value pairs. "index" is the key and "media metadata" is the value.\n
- *            The media controller server can let media controller clients know the index of current playling media by using this function.
- * @since_tizen 5.0
+ * @defails If a media controller server has a playlist, the server can register and share it with media controller client. A playlist is a set of "index" and "media metadata".\n
+ *            The media controller server can let media controller clients know the index of current playing media by using this function.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
  * @param[in] server The handle to media controller server
  * @param[in] index    The index of the current playing media in the playlist
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
  * @pre Create a media controller server handle by calling mc_server_create().
  * @post Apply the updated playback information by calling mc_server_update_playback_info().
  * @see mc_server_create()
  * @see mc_server_destroy()
  * @see mc_server_update_playback_info()
- * @see mc_server_update_playlist()
+ * @see mc_server_create_playlist()
  */
 int mc_server_set_playlist_item_index(mc_server_h server, const char *index);
 
@@ -283,7 +319,7 @@ int mc_server_set_playlist_item_index(mc_server_h server, const char *index);
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
@@ -305,7 +341,7 @@ int mc_server_update_playback_info(mc_server_h server);
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @pre Create a media controller server handle by calling mc_server_create().
  * @post Apply the updated metadata information by calling mc_server_update_metadata().
@@ -328,7 +364,7 @@ int mc_server_set_metadata(mc_server_h server, mc_meta_e attribute, const char *
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
@@ -350,7 +386,7 @@ int mc_server_update_metadata(mc_server_h server);
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
@@ -372,7 +408,7 @@ int mc_server_update_shuffle_mode(mc_server_h server, mc_shuffle_mode_e mode);
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
  * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
  * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
@@ -381,63 +417,7 @@ int mc_server_update_shuffle_mode(mc_server_h server, mc_shuffle_mode_e mode);
 int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode);
 
 /**
- * @brief Updates the modified playlist info.
- * @details If this function is called, the updated playlist will be sent to all clients. \n
- *            The server can register only one playlist. If a new one is registered, the old one is removed. \n
- *            @a data is a bundle. A bundle is a set of key-value pairs. "index" is the key and "media metadata" is the value. \n
- *            Therefore you should fill the metadata order using #mc_meta_e. \n
- *            If there are no playlist items or the server wants to remove the playlist, set @a data to NULL.
- * @since_tizen 5.0
- *
- * @privlevel public
- * @privilege %http://tizen.org/privilege/mediacontroller.server
- *
- * @param[in] server The handle to media controller server
- * @param[in] mode The playlist update status
- * @param[in] playlist_name The name of the server playlist
- * @param[in] data The item list of playlist.
- *
- * @return @c 0 on success,
- *         otherwise a negative error value
- * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
- * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
- * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY File does not exist
- * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
- * @pre Create a media controller server handle by calling mc_server_create().
- * @see mc_server_create()
- * @see mc_server_destroy()
- *
- * @code
- #include <media_controller_server.h>
- #include <bundle.h>
- const char *playlist_item[11];
- bundle * b = NULL;
-
- playlist_item[MC_META_MEDIA_TITLE] = "title";
- playlist_item[MC_META_MEDIA_ARTIST] = "artist";
- playlist_item[MC_META_MEDIA_ALBUM] = "album";
- playlist_item[MC_META_MEDIA_AUTHOR] = "author";
- playlist_item[MC_META_MEDIA_GENRE] = "Rock";
- playlist_item[MC_META_MEDIA_DURATION] = "100";
- playlist_item[MC_META_MEDIA_DATE] = "2018";
- playlist_item[MC_META_MEDIA_COPYRIGHT] = "copyright";
- playlist_item[MC_META_MEDIA_DESCRIPTION] = "description";
- playlist_item[MC_META_MEDIA_TRACK_NUM] = "9";
- playlist_item[MC_META_MEDIA_PICTURE] = "picture_path";
-
- bundle_add_str_array(b, "1", playlist_item, 11);
-
- mc_server_update_playlist(server, MC_PLAYLIST_UPDATED, "playlist_1", b);      //create or update playlist
- mc_server_update_playlist(server, MC_PLAYLIST_REMOVED, "playlist_1", NULL);   //remove playlist
-
- bundle_free(bundle_data);
-
- * @endcode
- */
-int mc_server_update_playlist(mc_server_h server, mc_playlist_update_mode_e mode, const char *playlist_name, bundle *data);
-
-/**
- * @deprecated Deprecated since 5.0. Use mc_server_set_playback_action_received_cb() instead.
+ * @deprecated Deprecated since 4.0. Use mc_server_set_playback_action_cmd_received_cb() instead.
  * @brief Sets the callback for receiving playback state command from client.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
@@ -787,7 +767,7 @@ int mc_server_set_custom_cmd_received_cb(mc_server_h server, mc_server_custom_cm
 int mc_server_unset_custom_cmd_received_cb(mc_server_h server);
 
 /**
- * @brief Replys the result of the requested command to the client.
+ * @brief Replies the result of the requested command to the client.
  * @since_tizen 4.0
  *
  * @privlevel public
@@ -831,6 +811,156 @@ int mc_server_send_cmd_reply(mc_server_h server, const char *client_name, const
  */
 int mc_server_destroy(mc_server_h server);
 
+/**
+ * @brief Creates a new playlist with the given name.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks The @a playlist should be released using mc_playlist_destroy().
+ *              When the server is destroyed, all its playlists will be deleted automatically.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] playlist_name The name of the created playlist. It should not be NULL.
+ * @param[out] playlist  The handle to the media controller playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @post You can call mc_server_add_item_to_playlist() if you have items to add in the playlist and should call @c mc_server_update_playlist_done() to register it.
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_add_item_to_playlist()
+ * @see mc_server_update_playlist_done()
+ * @see mc_server_delete_playlist()
+ * @see mc_playlist_destroy()
+ */
+int mc_server_create_playlist(mc_server_h server, const char *playlist_name, mc_playlist_h *playlist);
+
+/**
+ * @brief Adds a new item to the playlist.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It's possible to add at most 100 items at once. \n
+ *              If you have more items, register the first 100 items by calling mc_server_update_playlist_done(), then add the remaining items.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] playlist  The handle to the media controller playlist
+ * @param[in] index The index of the playlist item. It should not be NULL
+ * @param[in] attribute    The key attribute name to set
+ * @param[in] value      The value of the attribute
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @pre Create a media controller playlist handle by calling mc_server_create_playlist().
+ * @post You should call @c mc_server_update_playlist_done() to register it.
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_create_playlist()
+ * @see mc_server_update_playlist_done()
+ * @see mc_playlist_destroy()
+ */
+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);
+
+/**
+ * @brief Registers items to the playlist.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] playlist  The handle to the media controller playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @pre Create a media controller playlist handle by calling mc_server_create_playlist().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_create_playlist()
+ * @see mc_playlist_destroy()
+ */
+int mc_server_update_playlist_done(mc_server_h server, mc_playlist_h playlist);
+
+/**
+ * @brief Deletes the playlist of the media controller server.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] playlist  The handle to the media controller playlist
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @pre Create a media controller playlist handle by calling mc_server_create_playlist().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_create_playlist()
+ * @see mc_playlist_destroy()
+ */
+int mc_server_delete_playlist(mc_server_h server, mc_playlist_h playlist);
+
+/**
+ * @brief Retrieves all playlists of the media controller server.
+ * @details This function gets all playlists of the media controller server.
+ *            The callback function will be invoked for every retrieved playlist.
+ *            If there are no playlists, callback will not be invoked.
+ * @since_tizen 4.0
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] callback      The callback function to be invoked, will be called for each playlist
+ * @param[in] user_data   The user data to be passed to the callback function
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_playlist_cb()
+ */
+int mc_server_foreach_playlist(mc_server_h server, mc_playlist_cb callback, void *user_data);
 
 /**
  * @}
index d33c65c5f31aad4e9f06e42cf83c9c1393d39116..948f41a9c4b72fd7211a75728f5e5b9192d75da9 100755 (executable)
@@ -59,6 +59,12 @@ typedef void *mc_playback_h;
  */
 typedef void *mc_metadata_h;
 
+/**
+ * @brief The structure type for the media controller playlist handle.
+ * @since_tizen 4.0
+ */
+typedef void *mc_playlist_h;
+
 /**
  * @brief Enumeration for the media controller error.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -163,12 +169,12 @@ typedef enum {
        MC_SUBSCRIPTION_TYPE_METADATA,                                          /**< Metadata */
        MC_SUBSCRIPTION_TYPE_SHUFFLE_MODE,                                      /**< Shuffle mode */
        MC_SUBSCRIPTION_TYPE_REPEAT_MODE,                                       /**< Repeat mode */
-       MC_SUBSCRIPTION_TYPE_PLAYLIST,                                          /**< Playlist (Since 5.0) */
+       MC_SUBSCRIPTION_TYPE_PLAYLIST,                                          /**< Playlist (Since 4.0) */
 } mc_subscription_type_e;
 
 /**
  * @brief Enumeration for the playlist update mode.
- * @since_tizen 5.0
+ * @since_tizen 4.0
  */
 typedef enum {
        MC_PLAYLIST_UPDATED,    /**< Create or Update playlist */
index 570d4522fb26a75c0fac534be23bd5883f3b499d..49a6c7c7eb3ab9d021dfa0ef13c4718b1d7d05b0 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.1.62
+Version:    0.1.63
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index 4129bc73d1d70d8a4e448c304e6c5d27c449f1a3..fb6791beaaff6738f3c2723469b734426604d846 100755 (executable)
@@ -92,7 +92,7 @@ static void __client_metadata_cb(const char *interface_name, const char *signal_
 
        callback(message, metadata, mc_client->metadata_cb.user_data);
 
-       mc_client_destroy_metadata(metadata);
+       mc_metadata_destroy(metadata);
 }
 
 static void __client_shuffle_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
@@ -159,6 +159,44 @@ static void __client_reply_cb(const char *interface_name, const char *signal_nam
        g_strfreev(params);
 }
 
+static void __client_playlist_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       mc_playlist_update_mode_e mode = MC_PLAYLIST_UPDATED;
+       media_controller_client_s *mc_client = (media_controller_client_s *)user_data;
+       mc_retm_if(mc_client == NULL, "mc_client is NULL");
+
+       mc_playlist_updated_cb callback = (mc_playlist_updated_cb)mc_client->playlist_cb.callback;
+       mc_playlist_s *_playlist = NULL;
+
+       mc_retm_if(mc_client->playlist_cb.callback == NULL, "playlist_cb is NULL");
+       mc_retm_if(message == NULL, "message is NULL");
+
+       mc_debug("__client_playlist_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
+
+       params = g_strsplit(message, MC_STRING_DELIMITER, 0);
+       mc_retm_if(params == NULL, "invalid custom data");
+
+       mode = atoi(params[1]);
+
+       _playlist = (mc_playlist_s *)calloc(1, sizeof(mc_playlist_s));
+       if (_playlist == NULL) {
+               mc_error("OUT_OF_MEMORY");
+               g_strfreev(params);
+
+               return;
+       }
+
+       _playlist->server_name = g_strdup(params[0]);
+       _playlist->playlist_name = g_strdup(params[2]);
+
+       callback(params[0], mode, params[2], (mc_playlist_h)_playlist, mc_client->playlist_cb.user_data);
+
+       g_strfreev(params);
+
+       return;
+}
+
 static void __client_cmd_reply_received_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
 {
        gchar **params = NULL;
@@ -191,43 +229,6 @@ static void __client_cmd_reply_received_cb(const char *interface_name, const cha
        g_strfreev(params);
 }
 
-static void __client_playlist_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       gchar **params = NULL;
-       bundle *playlist = NULL;
-       char *playlist_name = NULL;
-       mc_playlist_update_mode_e mode = MC_PLAYLIST_UPDATED;
-       media_controller_client_s *mc_client = (media_controller_client_s *)user_data;
-       mc_retm_if(mc_client == NULL, "mc_client is NULL");
-       mc_playlist_updated_cb callback = (mc_playlist_updated_cb)mc_client->playlist_cb.callback;
-
-       mc_retm_if(mc_client->playlist_cb.callback == NULL, "playlist_cb is NULL");
-       mc_retm_if(message == NULL, "message is NULL");
-
-       mc_debug("__client_playlist_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
-
-       params = g_strsplit(message, MC_STRING_DELIMITER, 0);
-       mc_retm_if(params == NULL, "invalid custom data");
-
-       mode = atoi(params[1]);
-
-       if (mode == MC_PLAYLIST_UPDATED) {
-               ret = mc_db_get_playlist(mc_client->db_handle, params[0], &playlist_name, &playlist);
-               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
-                       mc_error("Fail to mc_db_get_playlist");
-       }
-
-       callback(params[0], mode, params[2], playlist, mc_client->playlist_cb.user_data);
-
-       g_strfreev(params);
-       MC_SAFE_FREE(playlist_name);
-       if (playlist != NULL)
-               bundle_free(playlist);
-
-       return;
-}
-
 static int __mc_client_create(media_controller_client_s **mc_client)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -310,8 +311,16 @@ static int __mc_client_register_filter_listener(media_controller_client_s *mc_cl
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Fail mc_util_make_filter_interface_name");
 
        ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name, callback, user_data);
-       if (ret == MEDIA_CONTROLLER_ERROR_NONE)
-               *filter_list = g_list_append(*filter_list, strdup(filter_interface_name));
+       if (ret == MEDIA_CONTROLLER_ERROR_NONE) {
+               char *filter_data = (char *)g_strdup(server_name);
+               if (filter_data == NULL) {
+                       mc_debug("memeory allocation failed");
+                       mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name);
+                       MC_SAFE_FREE(filter_interface_name);
+                       return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+               }
+               *filter_list = g_list_append(*filter_list, filter_data);
+       }
 
        MC_SAFE_FREE(filter_interface_name);
 
@@ -356,7 +365,7 @@ static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_
                        interface_name = g_list_nth_data(*filter_list, idx);
 
                        if (MC_STRING_VALID(interface_name)) {
-                               if (g_strcmp0(interface_name, filter_interface_name) == 0) {
+                               if (g_strcmp0(interface_name, server_name) == 0) {
                                        mc_debug("Unset subscriber [%d][%s]", idx, interface_name);
                                        *filter_list = g_list_remove(*filter_list, interface_name);
                                        MC_SAFE_FREE(interface_name);
@@ -392,16 +401,6 @@ static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_
        return ret;
 }
 
-static int __mc_parse_server_name(const char *interface_name, char **server_name)
-{
-       mc_retvm_if(interface_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "interface_name is NULL");
-       mc_retvm_if(server_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "server_name is NULL");
-
-       *server_name = strdup(interface_name + strlen(MC_DBUS_UPDATE_INTERFACE) + 1);
-
-       return MEDIA_CONTROLLER_ERROR_NONE;
-}
-
 static int __mc_client_send_command(mc_client_h client, const char *server_name, const char *command_type, const char *command, const char *signal_name, const char *message, char **request_id)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -467,6 +466,8 @@ int mc_client_set_server_update_cb(mc_client_h client, mc_server_state_updated_c
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_set_server_update_cb() is deprecated and will be removed from next release. Use mc_client_set_server_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
        mc_retvm_if(mc_client->server_state_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
@@ -485,6 +486,8 @@ int mc_client_unset_server_update_cb(mc_client_h client)
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_unset_server_update_cb() is deprecated and will be removed from next release. Use mc_client_unset_server_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
@@ -503,6 +506,8 @@ int mc_client_set_playback_update_cb(mc_client_h client, mc_playback_updated_cb
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_set_playback_update_cb() is deprecated and will be removed from next release. Use mc_client_set_playback_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
        mc_retvm_if(mc_client->playback_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
@@ -521,6 +526,8 @@ int mc_client_unset_playback_update_cb(mc_client_h client)
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_unset_playback_update_cb() is deprecated and will be removed from next release. Use mc_client_unset_playback_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
@@ -539,6 +546,8 @@ int mc_client_set_metadata_update_cb(mc_client_h client, mc_metadata_updated_cb
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_set_metadata_update_cb() is deprecated and will be removed from next release. Use mc_client_set_metadata_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
        mc_retvm_if(mc_client->metadata_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
@@ -557,6 +566,8 @@ int mc_client_unset_metadata_update_cb(mc_client_h client)
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_unset_metadata_update_cb() is deprecated and will be removed from next release. Use mc_client_unset_metadata_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
@@ -575,6 +586,8 @@ int mc_client_set_shuffle_mode_update_cb(mc_client_h client, mc_shuffle_mode_cha
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_set_shuffle_mode_update_cb() is deprecated and will be removed from next release. Use mc_client_set_shuffle_mode_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
        mc_retvm_if(mc_client->shuffle_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
@@ -593,6 +606,8 @@ int mc_client_unset_shuffle_mode_update_cb(mc_client_h client)
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_unset_shuffle_mode_update_cb() is deprecated and will be removed from next release. Use mc_client_unset_shuffle_mode_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
@@ -612,6 +627,8 @@ int mc_client_set_repeat_mode_update_cb(mc_client_h client, mc_repeat_mode_chang
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_set_repeat_mode_update_cb() is deprecated and will be removed from next release. Use mc_client_set_repeat_mode_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
        mc_retvm_if(mc_client->repeat_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
@@ -630,6 +647,8 @@ int mc_client_unset_repeat_mode_update_cb(mc_client_h client)
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
+       mc_warning("DEPRECATION WARNING: mc_client_unset_repeat_mode_update_cb() is deprecated and will be removed from next release. Use mc_client_unset_repeat_mode_updated_cb() instead.");
+
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
@@ -643,7 +662,188 @@ int mc_client_unset_repeat_mode_update_cb(mc_client_h client)
        return ret;
 }
 
-int mc_client_set_playlist_update_cb(mc_client_h client, mc_playlist_updated_cb callback, void *user_data)
+int mc_client_set_server_updated_cb(mc_client_h client, mc_server_state_updated_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+       mc_retvm_if(mc_client->server_state_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
+
+       mc_client->server_state_cb.callback = callback;
+       mc_client->server_state_cb.user_data = user_data;
+
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE,
+                                               __client_server_cb, (void *)&(mc_client->server_state_cb));
+
+       return ret;
+}
+
+int mc_client_unset_server_updated_cb(mc_client_h client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
+
+       ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->server_state_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
+
+       mc_client->server_state_cb.callback = NULL;
+       mc_client->server_state_cb.user_data = NULL;
+       mc_client->server_state_cb.filter_list = NULL;
+
+       return ret;
+}
+
+int mc_client_set_playback_updated_cb(mc_client_h client, mc_playback_updated_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+       mc_retvm_if(mc_client->playback_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
+
+       mc_client->playback_cb.callback = callback;
+       mc_client->playback_cb.user_data = user_data;
+
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK,
+                                                       __client_playback_cb, (void *)&(mc_client->playback_cb));
+
+       return ret;
+}
+
+int mc_client_unset_playback_updated_cb(mc_client_h client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
+
+       ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->playback_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
+
+       mc_client->playback_cb.callback = NULL;
+       mc_client->playback_cb.user_data = NULL;
+       mc_client->playback_cb.filter_list = NULL;
+
+       return ret;
+}
+
+int mc_client_set_metadata_updated_cb(mc_client_h client, mc_metadata_updated_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+       mc_retvm_if(mc_client->metadata_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
+
+       mc_client->metadata_cb.callback = callback;
+       mc_client->metadata_cb.user_data = user_data;
+
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA,
+                                                       __client_metadata_cb, (void *)(mc_client));
+
+       return ret;
+}
+
+int mc_client_unset_metadata_updated_cb(mc_client_h client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
+
+       ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->metadata_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_METADATA);
+
+       mc_client->metadata_cb.callback = NULL;
+       mc_client->metadata_cb.user_data = NULL;
+       mc_client->metadata_cb.filter_list = NULL;
+
+       return ret;
+}
+
+int mc_client_set_shuffle_mode_updated_cb(mc_client_h client, mc_shuffle_mode_updated_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+       mc_retvm_if(mc_client->shuffle_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
+
+       mc_client->shuffle_cb.callback = callback;
+       mc_client->shuffle_cb.user_data = user_data;
+
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE,
+                                                       __client_shuffle_cb, (void *)&(mc_client->shuffle_cb));
+
+       return ret;
+}
+
+int mc_client_unset_shuffle_mode_updated_cb(mc_client_h client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
+
+       ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->shuffle_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
+
+       mc_client->shuffle_cb.callback = NULL;
+       mc_client->shuffle_cb.user_data = NULL;
+       mc_client->shuffle_cb.filter_list = NULL;
+
+
+       return ret;
+}
+
+int mc_client_set_repeat_mode_updated_cb(mc_client_h client, mc_repeat_mode_updated_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL");
+       mc_retvm_if(mc_client->repeat_cb.callback != NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is already set");
+
+       mc_client->repeat_cb.callback = callback;
+       mc_client->repeat_cb.user_data = user_data;
+
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT,
+                                                       __client_repeat_cb, (void *)&(mc_client->repeat_cb));
+
+       return ret;
+}
+
+int mc_client_unset_repeat_mode_updated_cb(mc_client_h client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
+
+       ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->repeat_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
+
+       mc_client->repeat_cb.callback = NULL;
+       mc_client->repeat_cb.user_data = NULL;
+       mc_client->repeat_cb.filter_list = NULL;
+
+       return ret;
+}
+
+int mc_client_set_playlist_updated_cb(mc_client_h client, mc_playlist_updated_cb callback, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
@@ -661,7 +861,7 @@ int mc_client_set_playlist_update_cb(mc_client_h client, mc_playlist_updated_cb
        return ret;
 }
 
-int mc_client_unset_playlist_update_cb(mc_client_h client)
+int mc_client_unset_playlist_updated_cb(mc_client_h client)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
@@ -838,7 +1038,6 @@ int mc_client_foreach_server_subscribed(mc_client_h client, const mc_subscriptio
        int idx = 0;
        char *server_name = NULL;
        GList *filter_list = NULL;
-       char *filter_data = NULL;
        int filter_cnt = 0;
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
@@ -876,17 +1075,13 @@ int mc_client_foreach_server_subscribed(mc_client_h client, const mc_subscriptio
        filter_cnt = g_list_length(filter_list);
 
        for (idx = 0; idx < filter_cnt; idx++) {
-               filter_data = (char*)g_list_nth_data(filter_list, idx);
-               ret = __mc_parse_server_name(filter_data, &server_name);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail __mc_parse_server_name");
-
+               server_name = g_strdup((char*)g_list_nth_data(filter_list, idx));
                if (MC_STRING_VALID(server_name)) {
                        if (callback(server_name, user_data) == false) {
                                MC_SAFE_FREE(server_name);
                                break;
                        }
                }
-
                MC_SAFE_FREE(server_name);
        }
 
@@ -934,6 +1129,8 @@ int mc_client_get_metadata(mc_metadata_h metadata, mc_meta_e attribute, char **v
        char *meta_val = NULL;
        media_controller_metadata_s *mc_metadata = (media_controller_metadata_s *)metadata;
 
+       mc_warning("DEPRECATION WARNING: mc_client_get_metadata() is deprecated and will be removed from next release. Use mc_metadata_get() instead.");
+
        mc_retvm_if(mc_metadata == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(value == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "value is NULL");
 
@@ -1014,6 +1211,8 @@ int mc_client_destroy_metadata(mc_metadata_h metadata)
 
        mc_retvm_if(mc_metadata == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
+       mc_warning("DEPRECATION WARNING: mc_client_destroy_metadata() is deprecated and will be removed from next release. Use mc_metadata_destroy() instead.");
+
        MC_SAFE_FREE(mc_metadata->title);
        MC_SAFE_FREE(mc_metadata->artist);
        MC_SAFE_FREE(mc_metadata->album);
@@ -1143,22 +1342,16 @@ int mc_client_get_server_repeat_mode(mc_client_h client, const char *server_name
        return ret;
 }
 
-int mc_client_get_server_playlist(mc_client_h client, const char *server_name, char **playlist_name, bundle **playlist)
+int mc_client_foreach_server_playlist(mc_client_h client, const char *server_name, mc_playlist_cb callback, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
-       bool exist_server = FALSE;
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(!MC_STRING_VALID(server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
-       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");
-
-       ret = mc_db_check_server_table_exist(mc_client->db_handle, server_name, &exist_server);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Error mc_db_check_server_table_exist [%d]", ret);
-       mc_retvm_if(exist_server == FALSE, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Error Invalid server_name");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid callback");
 
-       ret = mc_db_get_playlist(mc_client->db_handle, server_name, playlist_name, playlist);
+       ret = mc_db_get_foreach_playlist(mc_client->db_handle, server_name, callback, user_data);
 
        return ret;
 }
index 13356567cd4a5453145b698dbcfaaecbeca397d8..416e4eb21b861cd6d0d4fc450f3cb7949d899995 100755 (executable)
@@ -109,74 +109,6 @@ static int __mc_db_get_int_value_of_key(void *handle, const char *server_name, c
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
-static int __db_get_playlist(void *handle, const char *server_name, char **playlist_name, bundle **playlist)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       char *sql_str = NULL;
-       sqlite3_stmt *stmt = NULL;
-       sqlite3 *db_handle = (sqlite3 *)handle;
-       char * _name = NULL;
-       bundle * _bundle_data = NULL;
-       bundle_raw *_raw_data = NULL;
-       int _raw_size = 0;
-
-       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(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 * from %s WHERE server_name = %Q", MC_DB_TABLE_PLAYLIST, server_name);
-       mc_retvm_if(!MC_STRING_VALID(sql_str), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
-
-       mc_secure_debug("sql_str [%s]", sql_str);
-
-       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_debug("playlist is not exist [%s]", sqlite3_errmsg(db_handle));
-               SQLITE3_FINALIZE(stmt);
-               SQLITE3_SAFE_FREE(sql_str);
-               return MEDIA_CONTROLLER_ERROR_NONE;
-       }
-
-       while (SQLITE_ROW == ret) {
-               MC_SAFE_FREE(_name);
-               MC_SAFE_FREE(_raw_data);
-
-               _name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
-               _raw_data = (bundle_raw *)g_strdup((const char *)sqlite3_column_text(stmt, 2));
-               _raw_size = (int)sqlite3_column_int(stmt, 3);
-               ret = sqlite3_step(stmt);
-       }
-
-       SQLITE3_FINALIZE(stmt);
-       SQLITE3_SAFE_FREE(sql_str);
-
-       if ((_raw_data != NULL) && (_raw_size > 0)) {
-               _bundle_data = bundle_decode(_raw_data, _raw_size);
-
-               if (_bundle_data == NULL) {
-                       mc_error("fail while decoding bundle");
-                       MC_SAFE_FREE(_name);
-                       MC_SAFE_FREE(_raw_data);
-                       return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
-               }
-       }
-
-       MC_SAFE_FREE(_raw_data);
-
-       *playlist_name = _name;
-       *playlist = _bundle_data;
-
-       return MEDIA_CONTROLLER_ERROR_NONE;
-}
-
 static char* __mc_get_db_name(uid_t uid)
 {
        char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, };
@@ -557,12 +489,125 @@ int mc_db_get_repeat_mode(void *handle, const char *server_name, mc_repeat_mode_
        return ret;
 }
 
-int mc_db_get_playlist(void *handle, const char *server_name, char **playlist_name, bundle **playlist)
+int mc_db_get_foreach_playlist(void *handle, const char *server_name, mc_playlist_cb callback, void *user_data)
 {
-       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");
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       sqlite3 *db_handle = (sqlite3 *)handle;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = 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");
+
+       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("[No-Error] There is no server list [%s]", sqlite3_errmsg(db_handle));
+               SQLITE3_FINALIZE(stmt);
+               SQLITE3_SAFE_FREE(sql_str);
+               return MEDIA_CONTROLLER_ERROR_NONE;
+       }
+
+       while (SQLITE_ROW == ret) {
+               mc_playlist_s *_playlist = (mc_playlist_s *)calloc(1, sizeof(mc_playlist_s));
+               if (_playlist == NULL) {
+                       mc_error("OUT_OF_MEMORY");
+                       SQLITE3_FINALIZE(stmt);
+                       SQLITE3_SAFE_FREE(sql_str);
+                       return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+               }
+
+               _playlist->server_name = g_strdup(server_name);
+               _playlist->playlist_name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
+
+               if (callback((mc_playlist_h)_playlist, user_data) == false) {
+                       mc_playlist_destroy((mc_playlist_h)_playlist);
+                       break;
+               }
 
-       return __db_get_playlist(handle, server_name, playlist_name, playlist);
+               mc_playlist_destroy((mc_playlist_h)_playlist);
+
+               ret = sqlite3_step(stmt);
+       }
+
+       SQLITE3_FINALIZE(stmt);
+       SQLITE3_SAFE_FREE(sql_str);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+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;
+       sqlite3 *db_handle = (sqlite3 *)handle;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       sql_str = sqlite3_mprintf("SELECT * from %s WHERE server_name = %Q and playlist_name = %Q and item_index IS NOT NULL  ORDER BY rowid", MC_DB_TABLE_PLAYLIST, server_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("[No-Error] There is no playlist itemt [%s]", sqlite3_errmsg(db_handle));
+               SQLITE3_FINALIZE(stmt);
+               SQLITE3_SAFE_FREE(sql_str);
+               return MEDIA_CONTROLLER_ERROR_NONE;
+       }
+
+       while (SQLITE_ROW == ret) {
+               char *index = NULL;
+               media_controller_metadata_s *_metadata = NULL;
+
+               _metadata = (media_controller_metadata_s *)calloc(1, sizeof(media_controller_metadata_s));
+               if (_metadata == NULL) {
+                       mc_error("OUT_OF_MEMORY");
+                       SQLITE3_FINALIZE(stmt);
+                       SQLITE3_SAFE_FREE(sql_str);
+                       return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+               }
+
+               index = g_strdup((char *)sqlite3_column_text(stmt, 2)); //0 : server_name, 1 : playlist_name
+               _metadata->title = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_TITLE -2));
+               _metadata->artist = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_ARTIST -2));
+               _metadata->album = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_ALBUM -2));
+               _metadata->author = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_AUTHOR -2));
+               _metadata->genre = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_GENRE -2));
+               _metadata->duration = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_DURATION -2));
+               _metadata->date = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_DATE -2));
+               _metadata->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_COPYRIGHT -2));
+               _metadata->description = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_DESCRIPTION -2));
+               _metadata->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_TRACK_NUM -2));
+               _metadata->picture = g_strdup((const char *)sqlite3_column_text(stmt, MC_SERVER_FIELD_PICTURE -2));
+
+               if (callback(index, (mc_metadata_h)_metadata, user_data) == false) {
+                       MC_SAFE_FREE(index);
+                       mc_metadata_destroy((mc_metadata_h)_metadata);
+                       break;
+               }
+
+               MC_SAFE_FREE(index);
+               mc_metadata_destroy((mc_metadata_h)_metadata);
+
+               ret = sqlite3_step(stmt);
+       }
+
+       SQLITE3_FINALIZE(stmt);
+       SQLITE3_SAFE_FREE(sql_str);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
 int mc_db_insert_server_address_into_server_list(void *handle, const char *address)
@@ -773,15 +818,14 @@ int mc_db_update_latest_server_table(void *handle, const char *server_name)
        return ret;
 }
 
-int mc_db_remove_playlist(void *handle, const char *server_name)
+int mc_db_remove_playlist(void *handle, const char *server_name, const char *playlist_name)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        char *sql_str = 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");
 
-       sql_str = g_strdup_printf("%s%s%s", MC_DB_CMD_REMOVE_PLAYLIST, MC_STRING_DELIMITER, server_name);
+       sql_str = g_strdup_printf("%s%s%s%s%s", MC_DB_CMD_REMOVE_PLAYLIST, MC_STRING_DELIMITER, server_name, MC_STRING_DELIMITER, playlist_name);
 
        ret = __mc_db_update_db(handle, MC_PRIV_TYPE_SERVER, sql_str);
 
@@ -790,28 +834,43 @@ int mc_db_remove_playlist(void *handle, const char *server_name)
        return ret;
 }
 
-int mc_db_update_playlist(void *handle, const char *server_name, const char *playlist_name, bundle *data)
+int mc_db_update_playlist(void *handle, const char *server_name, const char *playlist_name, GList *query_list)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        char *sql_str = NULL;
-       bundle_raw *raw_data = NULL;
-       int size_r = 0;
+       char *temp_buf = NULL;
+       unsigned int list_len = 0;
+       unsigned int query_len = 0;
+       unsigned int idx = 0;
 
-       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(playlist_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "playlist_name is NULL");
+       mc_retvm_if(query_list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "query_list is NULL");
+
+       list_len = g_list_length(query_list);
+
+       for (idx = 0; idx < list_len; idx++) {
+               char *query = NULL;
+               query = g_list_nth_data(query_list, idx);
+               if (query != NULL)
+                       query_len += strlen(query);
+       }
+
+       temp_buf = (char *)calloc(1, query_len + 1);
 
-       if (data != NULL) {
-               ret = bundle_encode(data, &raw_data, &size_r);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail while encoding bundle [%d]", ret);
+       for (idx = 0; idx < list_len; idx++) {
+               char *query = NULL;
+               query = g_list_nth_data(query_list, idx);
+               if (query != NULL)
+                       g_strlcat(temp_buf, query, query_len + 1);
        }
 
-       sql_str = g_strdup_printf("%s%s%s%s%s%s%s%s%d", MC_DB_CMD_UPDATE_PLAYLIST, MC_STRING_DELIMITER, server_name,
-                                               MC_STRING_DELIMITER, playlist_name, MC_STRING_DELIMITER, raw_data, MC_STRING_DELIMITER, size_r);
+       sql_str = g_strdup_printf("%s%s%s%s%s%s%s", MC_DB_CMD_UPDATE_PLAYLIST, MC_STRING_DELIMITER, server_name,
+                                               MC_STRING_DELIMITER, playlist_name, MC_STRING_DELIMITER, temp_buf);
 
        ret = __mc_db_update_db(handle, MC_PRIV_TYPE_SERVER, sql_str);
 
-       MC_SAFE_FREE(raw_data);
+       MC_SAFE_FREE(temp_buf);
        MC_SAFE_FREE(sql_str);
 
        return ret;
diff --git a/src/media_controller_metadata.c b/src/media_controller_metadata.c
new file mode 100755 (executable)
index 0000000..564c8c2
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+* Copyright (c) 2011 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.
+*/
+
+#include "media_controller_private.h"
+#include "media_controller_db.h"
+
+
+int mc_metadata_clone(mc_metadata_h src, mc_metadata_h *dst)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_metadata_s *_src = (media_controller_metadata_s *)src;
+
+       mc_retvm_if(_src == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid metadata");
+
+       media_controller_metadata_s *_dst = (media_controller_metadata_s*)calloc(1, sizeof(media_controller_metadata_s));
+       mc_retvm_if(_dst == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       _dst->title = g_strdup(_src->title);
+       _dst->artist = g_strdup(_src->artist);
+       _dst->album = g_strdup(_src->album);
+       _dst->author = g_strdup(_src->author);
+       _dst->genre = g_strdup(_src->genre);
+       _dst->duration = g_strdup(_src->duration);
+       _dst->date = g_strdup(_src->date);
+       _dst->copyright = g_strdup(_src->copyright);
+       _dst->description = g_strdup(_src->description);
+       _dst->track_num = g_strdup(_src->track_num);
+       _dst->picture = g_strdup(_src->picture);
+
+       *dst = (mc_metadata_h)_dst;
+
+       return ret;
+}
+
+int mc_metadata_destroy(mc_metadata_h metadata)
+{
+       media_controller_metadata_s *mc_metadata = (media_controller_metadata_s *)metadata;
+
+       mc_retvm_if(mc_metadata == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       MC_SAFE_FREE(mc_metadata->title);
+       MC_SAFE_FREE(mc_metadata->artist);
+       MC_SAFE_FREE(mc_metadata->album);
+       MC_SAFE_FREE(mc_metadata->author);
+       MC_SAFE_FREE(mc_metadata->genre);
+       MC_SAFE_FREE(mc_metadata->duration);
+       MC_SAFE_FREE(mc_metadata->date);
+       MC_SAFE_FREE(mc_metadata->copyright);
+       MC_SAFE_FREE(mc_metadata->description);
+       MC_SAFE_FREE(mc_metadata->track_num);
+       MC_SAFE_FREE(mc_metadata->picture);
+
+       MC_SAFE_FREE(mc_metadata);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int mc_metadata_get(mc_metadata_h metadata, mc_meta_e attribute, char **value)
+{
+       char *meta_val = NULL;
+       media_controller_metadata_s *mc_metadata = (media_controller_metadata_s *)metadata;
+
+       mc_retvm_if(mc_metadata == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       mc_retvm_if(value == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "value is NULL");
+
+       *value = NULL;
+
+       //mc_debug("attribute[%d]", attribute);
+
+       switch (attribute) {
+       case MC_META_MEDIA_TITLE:
+               if (mc_metadata->title != NULL)
+                       meta_val = strdup(mc_metadata->title);
+               break;
+       case MC_META_MEDIA_ARTIST:
+               if (mc_metadata->artist != NULL)
+                       meta_val = strdup(mc_metadata->artist);
+               break;
+       case MC_META_MEDIA_ALBUM:
+               if (mc_metadata->album != NULL)
+                       meta_val = strdup(mc_metadata->album);
+               break;
+       case MC_META_MEDIA_AUTHOR:
+               if (mc_metadata->author != NULL)
+                       meta_val = strdup(mc_metadata->author);
+               break;
+       case MC_META_MEDIA_GENRE:
+               if (mc_metadata->genre != NULL)
+                       meta_val = strdup(mc_metadata->genre);
+               break;
+       case MC_META_MEDIA_DURATION:
+               if (mc_metadata->duration != NULL)
+                       meta_val = strdup(mc_metadata->duration);
+               break;
+       case MC_META_MEDIA_DATE:
+               if (mc_metadata->date != NULL)
+                       meta_val = strdup(mc_metadata->date);
+               break;
+       case MC_META_MEDIA_COPYRIGHT:
+               if (mc_metadata->copyright != NULL)
+                       meta_val = strdup(mc_metadata->copyright);
+               break;
+       case MC_META_MEDIA_DESCRIPTION:
+               if (mc_metadata->description != NULL)
+                       meta_val = strdup(mc_metadata->description);
+               break;
+       case MC_META_MEDIA_TRACK_NUM:
+               if (mc_metadata->track_num != NULL)
+                       meta_val = strdup(mc_metadata->track_num);
+               break;
+       case MC_META_MEDIA_PICTURE:
+               if (mc_metadata->picture != NULL)
+                       meta_val = strdup(mc_metadata->picture);
+               break;
+       default:
+               mc_error("Invalid Parameter [%d]", attribute);
+               return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
+       }
+
+       *value = meta_val;
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
diff --git a/src/media_controller_playlist.c b/src/media_controller_playlist.c
new file mode 100755 (executable)
index 0000000..e152567
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+* Copyright (c) 2011 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.
+*/
+
+#include "media_controller_private.h"
+#include "media_controller_db.h"
+
+int mc_playlist_get_name(mc_playlist_h playlist, char **playlist_name)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+
+       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
+
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+       mc_retvm_if(playlist_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist_name");
+
+       *playlist_name = g_strdup(_playlist->playlist_name);
+
+       return ret;
+}
+
+int mc_playlist_foreach_item(mc_playlist_h playlist, mc_playlist_item_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       mc_playlist_s *_playlist = (mc_playlist_s*)playlist;
+       bool exist_server = FALSE;
+       void* db_handle = NULL;
+
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+       mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid callback");
+
+       ret = mc_db_connect(&db_handle);
+       mc_retvm_if(db_handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail mc_db_connect [%d]", ret);
+
+       ret = mc_db_check_server_table_exist(db_handle, _playlist->server_name, &exist_server);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error mc_db_check_server_table_exist [%d]", ret);
+               goto ERROR;
+       }
+
+       if (exist_server == FALSE) {
+               mc_error("Error Invalid server_name");
+               ret = MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
+               goto ERROR;
+       }
+
+       ret = mc_db_get_playlist_item(db_handle, _playlist->server_name, _playlist->playlist_name, callback, user_data);
+
+ERROR:
+       mc_db_disconnect(db_handle);
+
+       return ret;
+}
+
+int mc_playlist_clone(mc_playlist_h src, mc_playlist_h *dst)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       mc_playlist_s *_src = (mc_playlist_s*)src;
+
+       mc_retvm_if(_src == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid src");
+       mc_retvm_if(dst == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid dst");
+
+       mc_playlist_s *_dst = (mc_playlist_s*)calloc(1, sizeof(mc_playlist_s));
+       mc_retvm_if(_dst == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       _dst->server_name = g_strdup(_src->server_name);
+       _dst->playlist_name = g_strdup(_src->playlist_name);
+
+       *dst = (mc_playlist_h)_dst;
+
+       return ret;
+}
+
+int mc_playlist_destroy(mc_playlist_h playlist)
+{
+       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;
+
+       mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist");
+
+       MC_SAFE_FREE(_playlist->server_name);
+       MC_SAFE_FREE(_playlist->playlist_name);
+
+       if (_playlist->item_list != NULL) {
+               length = g_list_length(_playlist->item_list);
+               for (idx = 0; idx < length; idx++) {
+                       playlist_item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
+
+                       if (playlist_item != NULL) {
+                               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);
+                       }
+               }
+       }
+
+       MC_SAFE_FREE(_playlist);
+
+       return ret;
+}
index caa866bbf6b5e340f2f42b5d7814ba3fc2959288..9dfe97e2048c22f19df26f7fc567535c9c5d1f6f 100755 (executable)
@@ -18,6 +18,8 @@
 #include "media_controller_db.h"
 #include <bundle_internal.h>
 
+#define MAX_PLAYLIST_LEN 100
+
 static int __mc_server_create(media_controller_server_s **mc_server)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -95,7 +97,7 @@ static int __mc_server_destoy(media_controller_server_s *mc_server)
        MC_SAFE_FREE(mc_server->server_name);
 
        if (mc_server->metadata != NULL)
-               mc_client_destroy_metadata(mc_server->metadata);
+               mc_metadata_destroy(mc_server->metadata);
 
        MC_SAFE_FREE(mc_server->playback.index);
        MC_SAFE_FREE(mc_server);
@@ -672,29 +674,277 @@ int mc_server_update_metadata(mc_server_h server)
        return ret;
 }
 
-int mc_server_update_playlist(mc_server_h server, mc_playlist_update_mode_e mode, const char *playlist_name, bundle *data)
+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);
 
-       if (mode == MC_PLAYLIST_UPDATED) {
-               ret = mc_db_update_playlist(mc_server->db_handle, mc_server->server_name, playlist_name, data);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_playlist");
-       } else if (mode == MC_PLAYLIST_REMOVED) {
-               ret = mc_db_remove_playlist(mc_server->db_handle, mc_server->server_name);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_remove_playlist");
-       } else {
-               mc_error("Wrong mode [%d]", mode);
                return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
        }
 
-       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYLIST, mode, 0, playlist_name);
+       if (find == FALSE)
+               _playlist->item_list = g_list_append(_playlist->item_list, _playlist_item);
+
+       return ret;
+}
+
+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;
+}
+
+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");
+       }
+
+       ret = mc_db_update_playlist(mc_server->db_handle, mc_server->server_name, _playlist->playlist_name, query_list);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_playlist");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYLIST, MC_PLAYLIST_UPDATED, 0, _playlist->playlist_name);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
 
+       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);
+
+       return ret;
+}
+
+int mc_server_delete_playlist(mc_server_h server, mc_playlist_h playlist)
+{
+       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");
+
+       ret = mc_db_remove_playlist(mc_server->db_handle, mc_server->server_name, _playlist->playlist_name);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_remove_playlist");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYLIST, MC_PLAYLIST_REMOVED, 0, _playlist->playlist_name);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return ret;
+}
+
+int mc_server_foreach_playlist(mc_server_h server, mc_playlist_cb callback, void *user_data)
+{
+       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(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid callback");
+
+       ret = mc_db_get_foreach_playlist(mc_server->db_handle, mc_server->server_name, callback, user_data);
+
        return ret;
 }
 
index 63b7e5430915520b5c5b3b76f488c3498d041de3..24e37119800b7c3b7baa6854d727b1cc6beb8a6d 100755 (executable)
@@ -25,7 +25,7 @@ int mc_db_util_create_tables(void *handle);
 int mc_db_util_update_db(void *handle, const char *sql_str);
 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(const char *data, int data_size, char **result_query);
+int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size);
 
 
 #endif /*__TIZEN_MEDIA_CONTROLLER_DB_UTIL_H__*/
index 70bdb97fd91db74cd050287ea3c74a651af59f15..773fc32b03c05e6cb37833cff71d6e443339b9a8 100755 (executable)
@@ -130,10 +130,20 @@ static int __mc_create_playlist_table(sqlite3 *handle)
        char *sql_str = NULL;
 
        sql_str = sqlite3_mprintf("CREATE TABLE IF NOT EXISTS %s (\
-                               server_name TEXT PRIMARY KEY, \
+                               server_name TEXT NOT NULL, \
                                playlist_name TEXT NOT NULL, \
-                               data TEXT, \
-                               data_size INT);",
+                               item_index TEXT, \
+                               title TEXT, \
+                               artist TEXT, \
+                               album TEXT, \
+                               author TEXT, \
+                               genre TEXT, \
+                               duration TEXT, \
+                               date TEXT, \
+                               copyright TEXT, \
+                               description TEXT, \
+                               track_num TEXT, \
+                               picture TEXT, unique(server_name, playlist_name, item_index));",
                                MC_DB_TABLE_PLAYLIST);
 
        ret = mc_db_util_update_db(handle, sql_str);
@@ -435,7 +445,7 @@ int mc_db_util_init_latest_server_table(void *handle)
        return ret;
 }
 
-int mc_db_parse_and_update_db(const char *data, int data_size, char **result_query)
+int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        char *sql_str = NULL;
@@ -443,6 +453,8 @@ int mc_db_parse_and_update_db(const char *data, int data_size, char **result_que
        int i_value = 0;
        int i_value_1 = 0;
        unsigned long long llu_value = 0;
+       void* _db_handle = NULL;
+       bool is_playlist = FALSE;
 
        mc_retvm_if(data == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "data is NULL");
        mc_retvm_if(data_size <= 0 , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid data_size");
@@ -533,17 +545,13 @@ int mc_db_parse_and_update_db(const char *data, int data_size, char **result_que
                sql_str = sqlite3_mprintf("DELETE FROM '%q'; INSERT INTO '%q' (server_name) VALUES ('%q');", MC_DB_TABLE_LATEST_SERVER, MC_DB_TABLE_LATEST_SERVER, params[1]);
 
        } else if (strncmp(MC_DB_CMD_UPDATE_PLAYLIST, params[0], strlen(MC_DB_CMD_UPDATE_PLAYLIST)) == 0) {
-               if (params[2] == NULL || params[3] == NULL || params[4] == NULL) {
+               if (params[2] == NULL || params[3] == NULL) {
                        mc_error("wrong query");
                        ret = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
                        goto ERROR;
                }
-
-               mc_safe_strtoi(params[4], &i_value);
-
-               sql_str = sqlite3_mprintf("DELETE FROM '%q' WHERE server_name='%q';INSERT INTO '%q' (server_name, playlist_name, data, data_size) VALUES (%Q, %Q, %Q, %d);",
-                       MC_DB_TABLE_PLAYLIST, params[1],
-                       MC_DB_TABLE_PLAYLIST, params[1], params[2], params[3], i_value);
+               sql_str = params[3];
+               is_playlist = TRUE;
 
        } else if (strncmp(MC_DB_CMD_REMOVE_SERVER_LIST, params[0], strlen(MC_DB_CMD_REMOVE_SERVER_LIST)) == 0) {
                sql_str = sqlite3_mprintf("DELETE FROM %q WHERE server_name = '%q';", MC_DB_TABLE_SERVER_LIST, params[1]);
@@ -552,7 +560,13 @@ int mc_db_parse_and_update_db(const char *data, int data_size, char **result_que
                sql_str = sqlite3_mprintf("DROP TABLE IF EXISTS '%q'", params[1]);
 
        } else if (strncmp(MC_DB_CMD_REMOVE_PLAYLIST, params[0], strlen(MC_DB_CMD_REMOVE_PLAYLIST)) == 0) {
-               sql_str = sqlite3_mprintf("DELETE FROM '%q' WHERE server_name='%q';", MC_DB_TABLE_PLAYLIST, params[1]);
+               if (params[2] == NULL) {
+                       mc_error("wrong query");
+                       ret = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+                       goto ERROR;
+               }
+
+               sql_str = sqlite3_mprintf("DELETE FROM '%q' WHERE server_name='%q' and playlist_name=%Q;", MC_DB_TABLE_PLAYLIST, params[1], params[2]);
 
        } else {
                mc_error("wrong request");
@@ -567,12 +581,23 @@ int mc_db_parse_and_update_db(const char *data, int data_size, char **result_que
        }
 
 ERROR:
-       g_strfreev(params);
 
        if (sql_str != NULL) {
-               *result_query = g_strdup(sql_str);
-               SQLITE3_SAFE_FREE(sql_str);
+               ret = mc_db_util_connect(&_db_handle, uid);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("mc_db_util_connect error : %d", ret);
+
+               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);
+
+               mc_db_util_disconnect(_db_handle);
+
+               if (!is_playlist)
+                       SQLITE3_SAFE_FREE(sql_str);
        }
 
+       g_strfreev(params);
+
        return ret;
 }
index 58a0d5bf8c563eb70002cde292b3362b18125d70..6b357ebe883502522a0dd6416ee7cd23e5133920 100755 (executable)
@@ -419,8 +419,6 @@ gboolean _mc_service_process(gpointer data)
 
        if (request_msg->msg_type == MC_MSG_DB_UPDATE) {
                char *query_data = NULL;
-               char *result_query = NULL;
-               void* _db_handle;
 
                if (!MC_STRING_VALID(request_msg->msg) || request_msg->msg_size == 0) {
                        mc_error("wrong msg [%d]", request_msg->msg_size);
@@ -428,25 +426,9 @@ gboolean _mc_service_process(gpointer data)
                } else {
                        query_data = strndup(request_msg->msg, request_msg->msg_size);
                        if (query_data != NULL) {
-                               res = mc_db_parse_and_update_db(query_data, request_msg->msg_size, &result_query);
-                               if ((res == MEDIA_CONTROLLER_ERROR_NONE) && (result_query != NULL)) {
-
-                                       res = mc_db_util_connect(&_db_handle, request_msg->uid);
-                                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
-                                               mc_error("mc_db_util_connect error : %d", res);
-
-                                       res = mc_db_util_update_db(_db_handle, result_query);
-                                       if (res != MEDIA_CONTROLLER_ERROR_NONE)
-                                               mc_error("media_db_update_db error : %d", res);
-
-                                       mc_db_util_disconnect(_db_handle);
-                               } else {
-                                       mc_error("mc_db_parse_and_update_db error : %d", res);
-                               }
-
+                               res = mc_db_parse_and_update_db(request_msg->uid, query_data, request_msg->msg_size);
                                send_msg = res;
                                MC_SAFE_FREE(query_data);
-                               MC_SAFE_FREE(result_query);
                        } else {
                                send_msg = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
                        }
index e31e26f12b688339c0d91372b9740ae89ca00d97..f086a84cdaa16187da48d648082151293fad2760 100755 (executable)
@@ -17,7 +17,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <inttypes.h>
 
 #include <glib.h>
 #include <glib/gprintf.h>
@@ -118,9 +117,9 @@ void _mc_metadata_updated_cb(const char *server_name, mc_metadata_h metadata, vo
        mc_debug("[Client:%s] Metadata updated from server[%s] ", _client->client_name, server_name);
 
        for (idx = 0; idx <= MC_META_MEDIA_PICTURE; idx++) {
-               ret = mc_client_get_metadata(metadata, idx, &str_val);
+               ret = mc_metadata_get(metadata, idx, &str_val);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
-                       mc_error("Fail to mc_client_get_metadata");
+                       mc_error("Fail to mc_metadata_get");
                mc_debug("metadata [%d] val [%s]\n", idx, str_val);
 
                if (str_val)
@@ -140,10 +139,23 @@ void _mc_repeat_mode_updated_cb(const char *server_name, mc_repeat_mode_e mode,
        mc_debug("[Client:%s] Repeat mode(%d) updated from server[%s]", _client->client_name, mode, server_name);
 }
 
-void _mc_playlist_update_cb(const char *server_name, mc_playlist_update_mode_e mode, const char *playlist_name, bundle *data, void *user_data)
+void _mc_playlist_updated_cb(const char *server_name, mc_playlist_update_mode_e mode, const char *playlist_name, mc_playlist_h playlist, void *user_data)
 {
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       char *_name = NULL;
+
        mc_debug("[Client:%s] playlist update mode[%d], playlist_name[%s] updated from server[%s]", _client->client_name, mode, playlist_name, server_name);
+
+       if (mode == MC_PLAYLIST_UPDATED) {
+               ret = mc_playlist_get_name(playlist, &_name);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_playlist_get_name [%d]", ret);
+
+               mc_debug("playlist_name [%s]", _name);
+
+               MC_SAFE_FREE(_name);
+       }
 }
 
 bool _mc_activated_server_cb(const char *server_name, void *user_data)
@@ -228,23 +240,23 @@ static gboolean _set_callback()
 
        mc_debug_fenter();
 
-       ret = mc_client_set_server_update_cb(g_mc_client, _mc_server_state_updated_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_server_update_cb [%d]", ret);
+       ret = mc_client_set_server_updated_cb(g_mc_client, _mc_server_state_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_server_updated_cb [%d]", ret);
 
-       ret = mc_client_set_playback_update_cb(g_mc_client, _mc_playback_updated_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_playback_update_cb [%d]", ret);
+       ret = mc_client_set_playback_updated_cb(g_mc_client, _mc_playback_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_playback_updated_cb [%d]", ret);
 
-       ret = mc_client_set_metadata_update_cb(g_mc_client, _mc_metadata_updated_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_metadata_update_cb [%d]", ret);
+       ret = mc_client_set_metadata_updated_cb(g_mc_client, _mc_metadata_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_metadata_updated_cb [%d]", ret);
 
-       ret = mc_client_set_shuffle_mode_update_cb(g_mc_client, _mc_shuffle_mode_updated_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_shuffle_mode_update_cb [%d]", ret);
+       ret = mc_client_set_shuffle_mode_updated_cb(g_mc_client, _mc_shuffle_mode_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_shuffle_mode_updated_cb [%d]", ret);
 
-       ret = mc_client_set_repeat_mode_update_cb(g_mc_client, _mc_repeat_mode_updated_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_repeat_mode_update_cb [%d]", ret);
+       ret = mc_client_set_repeat_mode_updated_cb(g_mc_client, _mc_repeat_mode_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_repeat_mode_updated_cb [%d]", ret);
 
-       ret = mc_client_set_playlist_update_cb(g_mc_client, _mc_playlist_update_cb, NULL);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_playlist_update_cb [%d]", ret);
+       ret = mc_client_set_playlist_updated_cb(g_mc_client, _mc_playlist_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_playlist_updated_cb [%d]", ret);
 
        ret = mc_client_set_cmd_reply_received_cb(g_mc_client, _mc_cmd_reply_received_cb, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_reply_received_cb [%d]", ret);
@@ -260,23 +272,23 @@ static gboolean _unset_callback()
 
        mc_debug_fenter();
 
-       ret = mc_client_unset_server_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_server_update_cb [%d]", ret);
+       ret = mc_client_unset_server_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_server_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_playback_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playback_update_cb [%d]", ret);
+       ret = mc_client_unset_playback_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playback_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_metadata_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_metadata_update_cb [%d]", ret);
+       ret = mc_client_unset_metadata_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_metadata_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_shuffle_mode_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_shuffle_mode_update_cb [%d]", ret);
+       ret = mc_client_unset_shuffle_mode_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_shuffle_mode_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_repeat_mode_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_repeat_mode_update_cb [%d]", ret);
+       ret = mc_client_unset_repeat_mode_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_repeat_mode_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_playlist_update_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playlist_update_cb [%d]", ret);
+       ret = mc_client_unset_playlist_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playlist_updated_cb [%d]", ret);
 
        ret = mc_client_unset_cmd_reply_received_cb(g_mc_client);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_reply_received_cb [%d]", ret);
@@ -286,31 +298,47 @@ static gboolean _unset_callback()
        return TRUE;
 }
 
-void __playlist_get_info_cb(const char *key, const int type, const bundle_keyval_t *kv, void *user_data)
+bool server_playlist_item_cb(const char *index, mc_metadata_h meta, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       void **array_val = NULL;
-       unsigned int array_len = 0;
-       size_t *array_elem_size = NULL;
-       unsigned int idx = 0;
-
-       printf("Key:%s, Type:%d\n", key, type);
-
-       if (bundle_keyval_type_is_array((bundle_keyval_t *)kv)) {
-               ret = bundle_keyval_get_array_val((bundle_keyval_t *)kv, &array_val, &array_len, &array_elem_size);
-               if (ret != BUNDLE_ERROR_NONE) {
-                       printf("Fail to bundle_keyval_type_is_array [%d]\n", ret);
-                       return;
-               }
+       int idx = 0;
+       char *value = NULL;
 
-               printf("array_len [%d]\n", array_len);
+       for (idx = 0; idx <= MC_META_MEDIA_PICTURE; idx++) {
+               ret = mc_metadata_get(meta, idx, &value);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_metadata_get [%d]", ret);
 
-               for (idx = 0; idx < array_len; idx++) {
-                       printf("[%d] [%s][%zu]\n", idx, (char *)array_val[idx], array_elem_size[idx]);
-               }
-       } else {
-               printf("Wrong Type\n");
+               mc_debug("index [%s] value [%s]", index, value);
+               MC_SAFE_FREE(value);
        }
+
+       return true;
+}
+
+bool server_playlist_list_cb(mc_playlist_h playlist, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *playlist_name = NULL;
+
+       if (playlist == NULL) {
+               mc_error("Invalid playlist handle");
+               return false;
+       }
+
+       ret = mc_playlist_get_name(playlist, &playlist_name);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to mc_playlist_get_name [%d]", ret);
+
+       mc_debug("playlist_name [%s]", playlist_name);
+
+       ret = mc_playlist_foreach_item(playlist, server_playlist_item_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to mc_playlist_foreach_item [%d]", ret);
+
+       MC_SAFE_FREE(playlist_name);
+
+       return true;
 }
 
 static gboolean _get_info(int type)
@@ -324,9 +352,7 @@ static gboolean _get_info(int type)
        char *metadata_value;
        mc_shuffle_mode_e shuffle_mode;
        mc_repeat_mode_e repeate_mode;
-       bundle *playlist = NULL;
        char *index = NULL;
-       int bundle_cnt = 0;
 
        mc_debug_fenter();
 
@@ -366,7 +392,7 @@ static gboolean _get_info(int type)
                ret = mc_client_get_server_metadata(g_mc_client, g_server_name, &metadata);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_metadata [%d]", ret);
 
-               ret = mc_client_get_metadata(metadata, MC_META_MEDIA_TITLE, &metadata_value);
+               ret = mc_metadata_get(metadata, MC_META_MEDIA_TITLE, &metadata_value);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                        g_print("Fail to get infot");
 
@@ -374,8 +400,8 @@ static gboolean _get_info(int type)
 
                free(metadata_value);
 
-               ret = mc_client_destroy_metadata(metadata);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_destroy_metadata [%d]", ret);
+               ret = mc_metadata_destroy(metadata);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_metadata_destroy [%d]", ret);
 
                break;
        case 4:
@@ -391,21 +417,9 @@ static gboolean _get_info(int type)
                g_print("repeate mode: %d", repeate_mode);
                break;
        case 6:
-               ret = mc_client_get_server_playlist(g_mc_client, g_server_name, &g_playlist_name, &playlist);
+               ret = mc_client_foreach_server_playlist(g_mc_client, g_server_name, server_playlist_list_cb, NULL);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_playlist [%d]", ret);
 
-               if (playlist != NULL) {
-                       bundle_cnt = bundle_get_count(playlist);
-
-                       g_print("playlist_name [%s] bundle_cnt [%d] \n", g_playlist_name, bundle_cnt);
-
-                       bundle_foreach(playlist, __playlist_get_info_cb, NULL);
-
-                       bundle_free(playlist);
-               } else {
-                       g_print("There is no playlist \n");
-               }
-
                break;
        default:
                g_print("== unknown type!\n");
@@ -795,17 +809,17 @@ int client_sequential_test(void)
                g_print("Fail to mc_client_get_server_metadata\n");
 
        for (idx = 0; idx <= MC_META_MEDIA_PICTURE; idx++) {
-               ret = mc_client_get_metadata(metadata, idx, &str_val);
+               ret = mc_metadata_get(metadata, idx, &str_val);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
-                       g_print("Fail to mc_client_get_metadata\n");
+                       g_print("Fail to mc_metadata_get\n");
                g_print("metadata [%d] val [%s]\n", idx, str_val);
                if (str_val)
                        g_free(str_val);
        }
 
-       ret = mc_client_destroy_metadata(metadata);
+       ret = mc_metadata_destroy(metadata);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
-               g_print("Fail to mc_client_destroy_metadata\n");
+               g_print("Fail to mc_metadata_destroy\n");
 
        /*Get Shuffle / Repeat mode*/
        ret = mc_client_get_server_shuffle_mode(g_mc_client, server_name, &shuffle_mode);
index 24f0146ae4018ca7163028a8ae86228aa0808f15..9f29425c8d08d361629733cc34921c72e5d52478 100755 (executable)
@@ -21,7 +21,6 @@
 #include <glib.h>
 #include <glib/gprintf.h>
 
-#include <bundle.h>
 #include <media_controller_server.h>
 #include "media_controller_private.h"
 
@@ -77,7 +76,7 @@ int g_menu_set_state = CURRENT_STATE_SET_MODE_NONE;
 
 void __playback_state_command_received_cb(const char *client_name, mc_playback_states_e state, void *user_data)
 {
-       g_print("[%s] recieved playback state:[%d] from [%s]\n", client_name, state, client_name);
+       mc_debug("[%s] recieved playback state:[%d] from [%s]", client_name, state, client_name);
 }
 
 void __playback_action_received_cb(const char *client_name, const char *request_id, mc_playback_action_e action, void *user_data)
@@ -110,6 +109,11 @@ void __shuffle_mode_cmd_received_cb(const char *client_name, const char *request
                g_print("Fail to mc_server_send_command_reply\n");
 }
 
+void __playlist_play_received_cb(const char* client_name, const  char *request_id, const char *playlist_name, const char *index, mc_playback_action_e action, unsigned long long position, void *user_data)
+{
+       mc_debug("[%s]recieved playlist play : playlist_name[%s] index[%s] action[%d] position[%llu] from [%s]", request_id, playlist_name, index, action, position, client_name);
+}
+
 void __repeat_mode_cmd_received_cb(const char *client_name, const char *request_id, mc_repeat_mode_e repeat_mode, void *user_data)
 {
        int ret = 0;
@@ -120,11 +124,6 @@ void __repeat_mode_cmd_received_cb(const char *client_name, const char *request_
                g_print("Fail to mc_server_send_command_reply\n");
 }
 
-void __playlist_play_received_cb(const char* client_name, const char *playlist_name, const char *index, mc_playback_action_e action, unsigned long long position, void *user_data)
-{
-       mc_debug("recieved playlist play : playlist_name[%s] index[%s] action[%d] position[%llu] from [%s]", playlist_name, index, action, position, client_name);
-}
-
 void __custom_command_received_cb(const char *client_name, const char *command, bundle *data, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -162,6 +161,154 @@ void __custom_command_received_cb(const char *client_name, const char *command,
                g_free(bundle_data);
 }
 
+bool server_playlist_item_cb(const char *index, mc_metadata_h meta, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       int idx = 0;
+       char *value = NULL;
+
+       for (idx = 0; idx <= MC_META_MEDIA_PICTURE; idx++) {
+               ret = mc_metadata_get(meta, idx, &value);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_metadata_get [%d]", ret);
+
+               mc_debug("index [%s] value [%s]", index, value);
+               MC_SAFE_FREE(value);
+       }
+
+       return true;
+}
+
+bool server_playlist_list_cb(mc_playlist_h playlist, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *playlist_name = NULL;
+       GList **list = (GList**)user_data;
+       mc_playlist_h copied_playlist;
+
+       if (playlist == NULL) {
+               mc_error("Invalid playlist handle [%d]", ret);
+               return false;
+       }
+
+       ret = mc_playlist_clone(playlist, &copied_playlist);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to mc_playlist_clone [%d]", ret);
+
+       *list = g_list_append(*list, copied_playlist);
+
+       ret = mc_playlist_get_name(playlist, &playlist_name);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to mc_playlist_get_name [%d]", ret);
+
+       mc_debug("playlist_name [%s]", playlist_name);
+
+       ret = mc_playlist_foreach_item(playlist, server_playlist_item_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to mc_playlist_foreach_item [%d]", ret);
+
+       MC_SAFE_FREE(playlist_name);
+
+       return true;
+}
+
+static int __update_playlist(mc_server_h server, mc_playlist_update_mode_e mode)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       mc_playlist_h playlist_1 = NULL;
+       mc_playlist_h playlist_2 = NULL;
+       const char *playlist_name_1 = "test_1";
+       const char *playlist_name_2 = "test_2";
+       unsigned int idx = 0;
+       GList *playlist_list = NULL;
+
+       if (mode == MC_PLAYLIST_UPDATED) {
+               ret = mc_server_create_playlist(server, playlist_name_1, &playlist_1);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_create_playlist [%d]", ret);
+
+               ret = mc_server_create_playlist(server, playlist_name_2, &playlist_2);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_create_playlist [%d]", ret);
+
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_TITLE, "title_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_ARTIST, "artist_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_ALBUM, "album_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_AUTHOR, "author_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_GENRE, "genre_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_DURATION, "duration_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_DATE, "date_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_COPYRIGHT, "copyright_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_DESCRIPTION, "destription_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_TRACK_NUM, "track_num_1");
+               mc_server_add_item_to_playlist(server, playlist_1, "1", MC_META_MEDIA_PICTURE, "picture_1");
+
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_TITLE, "title_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_ARTIST, "artist_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_ALBUM, "album_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_AUTHOR, "author_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_GENRE, "genre_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_DURATION, "duration_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_DATE, "date_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_COPYRIGHT, "copyright_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_DESCRIPTION, "destription_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_TRACK_NUM, "track_num_2");
+               mc_server_add_item_to_playlist(server, playlist_1, "2", MC_META_MEDIA_PICTURE, "picture_2");
+
+               for (idx = 3; idx < 100; idx++) {
+                       char idx_str[255] = {0,};
+                       char title_str[255] = {0,};
+                       snprintf(idx_str, sizeof(idx_str), "%d", idx);
+                       snprintf(title_str, sizeof(idx_str), "title_%d", idx);
+                       mc_server_add_item_to_playlist(server, playlist_1, idx_str, MC_META_MEDIA_TITLE, title_str);
+               }
+
+               ret = mc_server_update_playlist_done(server, playlist_1);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_update_playlist_done [%d]", ret);
+
+               ret = mc_server_update_playlist_done(server, playlist_2);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_update_playlist_done [%d]", ret);
+
+               ret = mc_playlist_destroy(playlist_1);
+               ret = mc_playlist_destroy(playlist_2);
+       } else {
+
+               ret = mc_server_foreach_playlist(server, server_playlist_list_cb, &playlist_list);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       mc_error("Fail to mc_server_foreach_playlist [%d]", ret);
+
+               for (idx = 0; idx < g_list_length(playlist_list); idx++) {
+                       mc_playlist_h playlist = NULL;
+                       char *playlist_name = NULL;
+
+                       playlist = (mc_playlist_h)g_list_nth_data(playlist_list, idx);
+                       ret = mc_playlist_get_name(playlist, &playlist_name);
+                       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("Fail to mc_playlist_get_name [%d]", ret);
+
+                       mc_debug("Remove playlist [%s]", playlist_name);
+
+                       MC_SAFE_FREE(playlist_name);
+
+                       ret = mc_server_delete_playlist(server, playlist);
+                       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("Fail to mc_server_delete_playlist [%d]", ret);
+
+                       ret = mc_playlist_destroy(playlist);
+                       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                               mc_error("Fail to mc_playlist_destroy [%d]", ret);
+               }
+
+               g_list_free(playlist_list);
+       }
+
+       g_print("== Success __update_playlist \n");
+
+       return ret;
+}
+
 void __custom_cmd_received_cb(const char *client_name, const char *request_id, const char *command, bundle *data, void *user_data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -199,74 +346,6 @@ void __custom_cmd_received_cb(const char *client_name, const char *request_id, c
                g_free(bundle_data);
 }
 
-static int __update_playlist(mc_server_h server, mc_playlist_update_mode_e mode)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-
-       const char *playlist_name = "test_playlist";
-       bundle * bundle_data = NULL;
-
-       unsigned int meta_cnt = MC_META_MEDIA_PICTURE + 1;
-       const char *idx_1[meta_cnt];
-       const char *idx_2[meta_cnt];
-       const char *idx_3[meta_cnt];
-
-       memset(idx_1, 0, sizeof(idx_1));
-       memset(idx_2, 0, sizeof(idx_2));
-       memset(idx_3, 0, sizeof(idx_3));
-
-       g_print("== Start __update_playlist [%d] \n", meta_cnt);
-
-       idx_1[MC_META_MEDIA_TITLE] = "title_1";
-       idx_1[MC_META_MEDIA_ARTIST] = "artist_1";
-       idx_1[MC_META_MEDIA_ALBUM] = "album_1";
-       idx_1[MC_META_MEDIA_AUTHOR] = "author_1";
-       idx_1[MC_META_MEDIA_GENRE] = "genre_1";
-       idx_1[MC_META_MEDIA_DURATION] = "duration_1";
-       idx_1[MC_META_MEDIA_DATE] = "date_1";
-       idx_1[MC_META_MEDIA_COPYRIGHT] = "copyright_1";
-       idx_1[MC_META_MEDIA_DESCRIPTION] = "destription_1";
-       idx_1[MC_META_MEDIA_TRACK_NUM] = "track_num_1";
-       idx_1[MC_META_MEDIA_PICTURE] = "picture_1";
-
-       idx_2[MC_META_MEDIA_TITLE] = "title_2";
-       idx_2[MC_META_MEDIA_ARTIST] = "artist_2";
-       idx_2[MC_META_MEDIA_ALBUM] = "album_2";
-       idx_2[MC_META_MEDIA_AUTHOR] = "author_2";
-       idx_2[MC_META_MEDIA_GENRE] = "genre_2";
-       idx_2[MC_META_MEDIA_DURATION] = "duration_2";
-       idx_2[MC_META_MEDIA_DATE] = "date_2";
-       idx_2[MC_META_MEDIA_COPYRIGHT] = "copyright_2";
-//     idx_2[MC_META_MEDIA_DESCRIPTION] = NULL;
-       idx_2[MC_META_MEDIA_TRACK_NUM] = "track_num_2";
-//     idx_2[MC_META_MEDIA_PICTURE] = NULL;
-
-       idx_3[MC_META_MEDIA_TITLE] = "title_3";
-       idx_3[MC_META_MEDIA_ARTIST] = "artist_3";
-       idx_3[MC_META_MEDIA_ALBUM] = "album_3";
-       idx_3[MC_META_MEDIA_AUTHOR] = "author_3";
-       idx_3[MC_META_MEDIA_GENRE] = "genre_3";
-       idx_3[MC_META_MEDIA_DURATION] = "duration_3";
-       idx_3[MC_META_MEDIA_DATE] = NULL;
-       idx_3[MC_META_MEDIA_COPYRIGHT] = "copyright_3";
-       idx_3[MC_META_MEDIA_DESCRIPTION] = NULL;
-       idx_3[MC_META_MEDIA_TRACK_NUM] = "track_num_3";
-       idx_3[MC_META_MEDIA_PICTURE] = NULL;
-
-       bundle_data = bundle_create();
-       bundle_add_str_array(bundle_data, "idx1", idx_1, meta_cnt);
-       bundle_add_str_array(bundle_data, "idx2", idx_2, meta_cnt);
-       bundle_add_str_array(bundle_data, "idx3", idx_3, meta_cnt);
-
-       ret = mc_server_update_playlist(server, mode, playlist_name, bundle_data);
-
-       bundle_free(bundle_data);
-
-       g_print("== Success __update_playlist \n");
-
-       return ret;
-}
-
 static gboolean _create()
 {
        g_print("== create \n");
@@ -323,6 +402,12 @@ static gboolean _set_cb()
                return FALSE;
        }
 
+       ret = mc_server_set_playlist_cmd_received_cb(g_mc_server, __playlist_play_received_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               g_print("Fail to set mc_server_set_playlist_cmd_received_cb");
+               return FALSE;
+       }
+
        ret = mc_server_set_custom_cmd_received_cb(g_mc_server, __custom_cmd_received_cb, NULL);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                g_print("Fail to set mc_server_set_custom_cmd_received_cb");