*
* @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.
*
*/
* \#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__ */
#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" {
* @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);
* @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);
* @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
*
*
* @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
*
*
* @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,
* @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()
* @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,
/**
* @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.
* 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
* @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
*
* @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
* @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
*
* @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
* @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
*
* @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
* @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
*
* @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
* @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
*
* @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
* @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
* @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.
*/
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
* @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);
* @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
* 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);
* 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
*
* @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
*
* @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.
* @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
*/
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.
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
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__*/
--- /dev/null
+/*
+* 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__ */
--- /dev/null
+/*
+* 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__ */
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 {
#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" {
* @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
*
*
* @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
*
* @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
*
* @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
*
* @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
* @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
*
*
* @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
*
* @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
*
* 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()
*/
/**
* @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()
/**
* @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()
/**
* @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);
* 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()
* 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().
* 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()
* 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()
* 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()
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
*
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
*/
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);
/**
* @}
*/
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
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 */
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
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)
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;
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;
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);
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);
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;
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");
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);
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");
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);
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");
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);
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");
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);
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");
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);
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;
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;
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");
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);
}
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");
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);
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;
}
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, };
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)
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);
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;
--- /dev/null
+/*
+* 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;
+}
--- /dev/null
+/*
+* 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;
+}
#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;
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);
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;
}
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__*/
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);
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;
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");
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]);
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");
}
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;
}
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);
} 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;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <inttypes.h>
#include <glib.h>
#include <glib/gprintf.h>
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)
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)
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);
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);
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)
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();
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");
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:
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");
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);
#include <glib.h>
#include <glib/gprintf.h>
-#include <bundle.h>
#include <media_controller_server.h>
#include "media_controller_private.h"
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)
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;
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;
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;
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");
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");