[ACR-1444]Add functions for subtitle, display mode, display rotation, 360 mode 67/210767/36 accepted/tizen/unified/20190918.102311 submit/tizen/20190918.021208
authorhj kim <backto.kim@samsung.com>
Wed, 24 Jul 2019 08:41:57 +0000 (17:41 +0900)
committerhj kim <backto.kim@samsung.com>
Tue, 17 Sep 2019 02:13:44 +0000 (11:13 +0900)
Change-Id: I9fd94669658a0de717445f7571003f46f79f96c6

13 files changed:
include/media_controller_client.h
include/media_controller_db.h
include/media_controller_private.h
include/media_controller_server.h
include/media_controller_type.h
packaging/capi-media-controller.spec
src/media_controller_client.c
src/media_controller_db.c
src/media_controller_server.c
src/media_controller_util.c
svc/media_controller_db_util.c
test/client_test/media_controller_client_test.c
test/server_test/media_controller_server_test.c

index f7bdffb601f65a82bf622b33ad7ace058ebe229d..a7388ebf4a122ce7516d262d92144c34e7935517 100644 (file)
@@ -209,6 +209,23 @@ typedef void (*mc_repeat_ability_updated_cb)(const char *server_name, mc_ability
  */
 typedef void (*mc_ability_support_updated_cb)(const char *server_name, mc_ability_e ability, mc_ability_support_e support, void *user_data);
 
+/**
+ * @brief Called when a media controller server's supported items for an ability is updated.
+ * @since_tizen 5.5
+ *
+ * @remarks The callback is called in the dbus event loop.\n
+ *               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] supported_items The supported items of the updated media controller server
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @see mc_client_set_display_mode_ability_updated_cb()
+ * @see mc_client_set_display_rotation_ability_updated_cb()
+ */
+typedef void (*mc_ability_supported_items_updated_cb)(const char *server_name, unsigned int supported_items, void *user_data);
+
 /**
  * @brief Called when requesting the list of created servers.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -234,8 +251,8 @@ typedef bool (*mc_activated_server_cb)(const char *server_name, void *user_data)
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n @a data should be released using bundle_free().\n
- *              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.
+ *              The @a server_name and @a request_id should not be released by the application. \n
+ *              The @a server_name and @a 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
  * @param[in] request_id     The id of the command request
@@ -316,6 +333,55 @@ typedef void (*mc_playlist_updated_cb)(const char *server_name, mc_playlist_upda
  */
 typedef void (*mc_client_custom_event_received_cb)(const char *server_name, const char *request_id, const char *event, bundle *data, void *user_data);
 
+/**
+ * @brief Called when the status of a media controller server's boolean attribute (subtitles or 360 mode) is updated.
+ * @since_tizen 5.5
+ *
+ * @remarks The callback is called in the dbus event loop.\n
+ *               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] enabled The new status of the attribute
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @see mc_client_set_subtitles_updated_cb()
+ * @see mc_client_set_360_mode_updated_cb()
+ */
+typedef void (*mc_bool_attribute_updated_cb)(const char *server_name, bool enabled, void *user_data);
+
+/**
+ * @brief Called when a media controller server's display mode is updated.
+ * @since_tizen 5.5
+ *
+ * @remarks The callback is called in the dbus event loop.\n
+ *               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 display mode
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @see mc_client_set_display_mode_updated_cb()
+ */
+typedef void (*mc_display_mode_updated_cb)(const char *server_name, mc_display_mode_e mode, void *user_data);
+
+/**
+ * @brief Called when a media controller server's display rotation is updated.
+ * @since_tizen 5.5
+ *
+ * @remarks The callback is called in the dbus event loop.\n
+ *               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] rotation The display rotation
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @see mc_client_set_display_rotation_updated_cb()
+ */
+typedef void (*mc_display_rotation_updated_cb)(const char *server_name, mc_display_rotation_e rotation, void *user_data);
+
 /**
  * @brief Creates a media controller client.
  * @details The media controller client binds the latest media controller server when handlers are created.
@@ -360,6 +426,7 @@ int mc_client_create(mc_client_h *client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_server_updated_cb()
  */
 int mc_client_set_server_updated_cb(mc_client_h client, mc_server_state_updated_cb callback, void *user_data);
 
@@ -380,6 +447,7 @@ int mc_client_set_server_updated_cb(mc_client_h client, mc_server_state_updated_
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_server_updated_cb()
  */
 int mc_client_unset_server_updated_cb(mc_client_h client);
 
@@ -405,6 +473,7 @@ int mc_client_unset_server_updated_cb(mc_client_h client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_playback_updated_cb()
  */
 int mc_client_set_playback_updated_cb(mc_client_h client, mc_playback_updated_cb callback, void *user_data);
 
@@ -426,6 +495,7 @@ int mc_client_set_playback_updated_cb(mc_client_h client, mc_playback_updated_cb
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_playback_updated_cb()
  */
 int mc_client_unset_playback_updated_cb(mc_client_h client);
 
@@ -451,6 +521,7 @@ int mc_client_unset_playback_updated_cb(mc_client_h client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_metadata_updated_cb()
  */
 int mc_client_set_metadata_updated_cb(mc_client_h client, mc_metadata_updated_cb callback, void *user_data);
 
@@ -472,6 +543,7 @@ int mc_client_set_metadata_updated_cb(mc_client_h client, mc_metadata_updated_cb
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_metadata_updated_cb()
  */
 int mc_client_unset_metadata_updated_cb(mc_client_h client);
 
@@ -497,6 +569,7 @@ int mc_client_unset_metadata_updated_cb(mc_client_h client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_shuffle_mode_updated_cb()
  */
 int mc_client_set_shuffle_mode_updated_cb(mc_client_h client, mc_shuffle_mode_updated_cb callback, void *user_data);
 
@@ -518,6 +591,7 @@ int mc_client_set_shuffle_mode_updated_cb(mc_client_h client, mc_shuffle_mode_up
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_shuffle_mode_updated_cb()
  */
 int mc_client_unset_shuffle_mode_updated_cb(mc_client_h client);
 
@@ -543,6 +617,7 @@ int mc_client_unset_shuffle_mode_updated_cb(mc_client_h client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_repeat_mode_updated_cb()
  */
 int mc_client_set_repeat_mode_updated_cb(mc_client_h client, mc_repeat_mode_updated_cb callback, void *user_data);
 
@@ -564,6 +639,7 @@ int mc_client_set_repeat_mode_updated_cb(mc_client_h client, mc_repeat_mode_upda
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_repeat_mode_updated_cb()
  */
 int mc_client_unset_repeat_mode_updated_cb(mc_client_h client);
 
@@ -589,6 +665,7 @@ int mc_client_unset_repeat_mode_updated_cb(mc_client_h client);
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_playback_ability_updated_cb()
  */
 int mc_client_set_playback_ability_updated_cb(mc_client_h client, mc_playback_ability_updated_cb callback, void *user_data);
 
@@ -610,6 +687,7 @@ int mc_client_set_playback_ability_updated_cb(mc_client_h client, mc_playback_ab
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_set_playback_ability_updated_cb()
  */
 int mc_client_unset_playback_ability_updated_cb(mc_client_h client);
 
@@ -719,7 +797,13 @@ int mc_client_unset_repeat_ability_updated_cb(mc_client_h client) TIZEN_DEPRECAT
  *              #MC_ABILITY_PLAYLIST, \n
  *              #MC_ABILITY_CLIENT_CUSTOM, \n
  *              #MC_ABILITY_SEARCH, \n
- *            To monitor the media controller server's support for a playback ability, use mc_client_set_playback_ability_updated_cb().
+ *              #MC_ABILITY_SUBTITLES, \n
+ *              #MC_ABILITY_360_MODE, \n
+ *            To monitor the media controller server's support for other abilities, use corresponding function. \n
+ *            For a playback ability, use mc_client_set_playback_ability_updated_cb(). \n
+ *            For a display mode ability, use mc_client_set_display_mode_ability_updated_cb(). \n
+ *            For a display rotation ability, use mc_client_set_display_rotation_ability_updated_cb(). \n
+ *
  * @since_tizen 5.5
  *
  * @privlevel public
@@ -739,7 +823,10 @@ int mc_client_unset_repeat_ability_updated_cb(mc_client_h client) TIZEN_DEPRECAT
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
+ * @see mc_client_unset_ability_support_updated_cb()
  * @see mc_client_set_playback_ability_updated_cb()
+ * @see mc_client_set_display_mode_ability_updated_cb()
+ * @see mc_client_set_display_rotation_ability_updated_cb()
  */
 int mc_client_set_ability_support_updated_cb(mc_client_h client, mc_ability_support_updated_cb callback, void *user_data);
 
@@ -753,7 +840,13 @@ int mc_client_set_ability_support_updated_cb(mc_client_h client, mc_ability_supp
  *              #MC_ABILITY_PLAYLIST, \n
  *              #MC_ABILITY_CLIENT_CUSTOM, \n
  *              #MC_ABILITY_SEARCH, \n
- *            To stop monitoring the media controller server's support for a playback ability, use mc_client_unset_playback_ability_updated_cb().
+ *              #MC_ABILITY_SUBTITLES, \n
+ *              #MC_ABILITY_360_MODE, \n
+ *            To stop monitoring the media controller server's support for other abilities, use corresponding function. \n
+ *            For a playback ability, use mc_client_unset_playback_ability_updated_cb(). \n
+ *            For a display mode ability, use mc_client_unset_display_mode_ability_updated_cb(). \n
+ *            For a display rotation ability, use mc_client_unset_display_rotation_ability_updated_cb(). \n
+ *
  * @since_tizen 5.5
  *
  * @privlevel public
@@ -770,11 +863,109 @@ int mc_client_set_ability_support_updated_cb(mc_client_h client, mc_ability_supp
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
- * @see mc_client_unset_playback_ability_updated_cb()
  * @see mc_ability_support_updated_cb()
+ * @see mc_client_unset_playback_ability_updated_cb()
+ * @see mc_client_unset_display_mode_ability_updated_cb()
+ * @see mc_client_unset_display_rotation_ability_updated_cb()
  */
 int mc_client_unset_ability_support_updated_cb(mc_client_h client);
 
+/**
+ * @brief Sets the callback for monitoring the display mode ability 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.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the ability 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_display_mode_ability_updated_cb()
+ */
+int mc_client_set_display_mode_ability_updated_cb(mc_client_h client, mc_ability_supported_items_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the display mode ability of the media controller server.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_display_mode_ability_updated_cb()
+ */
+int mc_client_unset_display_mode_ability_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring the display rotation ability 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.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the ability 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_display_rotation_ability_updated_cb()
+ */
+int mc_client_set_display_rotation_ability_updated_cb(mc_client_h client, mc_ability_supported_items_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the display rotation ability of the media controller server.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_display_rotation_ability_updated_cb()
+ */
+int mc_client_unset_display_rotation_ability_updated_cb(mc_client_h client);
+
 /**
  * @brief Sets the callback for receiving the result of the command from the media controller server.
  * @details The media controller client which calls this function will receives the result of the command from all media controller servers.
@@ -857,7 +1048,203 @@ int mc_client_set_playlist_updated_cb(mc_client_h client, mc_playlist_updated_cb
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
- * @param[in] client         The handle of the media controller client
+ * @param[in] client         The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @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 Sets the callback for monitoring the media controller server's subtitles display.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the subtitles 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_subtitles_updated_cb()
+ */
+int mc_client_set_subtitles_updated_cb(mc_client_h client, mc_bool_attribute_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the media controller server's subtitles display.
+ * @details The media controller client which calls this function will not receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_subtitles_updated_cb()
+ */
+int mc_client_unset_subtitles_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring the media controller server's 360 mode display.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the 360 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_360_mode_updated_cb()
+ */
+int mc_client_set_360_mode_updated_cb(mc_client_h client, mc_bool_attribute_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the media controller server's 360 mode display.
+ * @details The media controller client which calls this function will not receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_360_mode_updated_cb()
+ */
+int mc_client_unset_360_mode_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring the media controller server's display mode.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the display 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_display_mode_updated_cb()
+ */
+int mc_client_set_display_mode_updated_cb(mc_client_h client, mc_display_mode_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the media controller server's display mode.
+ * @details The media controller client which calls this function will not receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_set_display_mode_updated_cb()
+ */
+int mc_client_unset_display_mode_updated_cb(mc_client_h client);
+
+/**
+ * @brief Sets the callback for monitoring the media controller server's display rotation.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] callback      The callback to be invoked when the display rotation 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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_unset_display_rotation_updated_cb()
+ */
+int mc_client_set_display_rotation_updated_cb(mc_client_h client, mc_display_rotation_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the media controller server's display rotation.
+ * @details The media controller client which calls this function will not receive notifications from all media controller servers.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
  * @return @c 0 on success,
  *         otherwise a negative error value
  * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
@@ -868,9 +1255,9 @@ int mc_client_set_playlist_updated_cb(mc_client_h client, mc_playlist_updated_cb
  * @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()
+ * @see mc_client_set_display_rotation_updated_cb()
  */
-int mc_client_unset_playlist_updated_cb(mc_client_h client);
+int mc_client_unset_display_rotation_updated_cb(mc_client_h client);
 
 /**
  * @brief Sets the callback for receiving the custom event from a media controller server.
@@ -1338,10 +1725,114 @@ int mc_client_get_server_repeat_mode(mc_client_h client, const char *server_name
  * @pre Create a media controller client handle by calling mc_client_create().
  * @see mc_client_create()
  * @see mc_client_destroy()
- * @see mc_playlist_foreach_playlist()
  */
 int mc_client_get_server_icon(mc_client_h client, const char *server_name, char **uri);
 
+/**
+ * @brief Gets the latest subtitles display status.
+ * @details The media controller client will get the most recently updated information from @a server_name.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] enabled    The status of the latest subtitles display
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_get_server_subtitles_enabled(mc_client_h client, const char *server_name, bool *enabled);
+
+/**
+ * @brief Gets the latest 360 mode display status.
+ * @details The media controller client will get the most recently updated information from @a server_name.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] enabled    The status of the latest 360 mode display
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_get_server_360_mode_enabled(mc_client_h client, const char *server_name, bool *enabled);
+
+/**
+ * @brief Gets the latest display mode.
+ * @details The media controller client will get the most recently updated information from @a server_name.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The default display mode is #MC_DISPLAY_MODE_FULL_SCREEN.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] mode    The info of the latest display mode
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_get_server_display_mode(mc_client_h client, const char *server_name, mc_display_mode_e *mode);
+
+/**
+ * @brief Gets the latest display rotation.
+ * @details The media controller client will get the most recently updated information from @a server_name.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The default display rotation is #MC_DISPLAY_ROTATION_NONE.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] rotation    The info of the latest display rotation
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ */
+int mc_client_get_server_display_rotation(mc_client_h client, const char *server_name, mc_display_rotation_e *rotation);
+
+
 /**
  * @brief Gets the playback ability of the media controller server.
  * @since_tizen 5.0
@@ -1463,9 +1954,76 @@ int mc_client_get_server_repeat_ability_support(mc_client_h client, const char *
  * @see mc_client_destroy()
  * @see mc_client_get_latest_server_info()
  * @see mc_client_foreach_server()
+ * @see mc_client_get_server_playback_ability()
+ * @see mc_client_get_server_display_mode_ability()
+ * @see mc_client_get_server_display_rotation_ability()
  */
 int mc_client_get_server_ability_support(mc_client_h client, const char *server_name, mc_ability_e ability, mc_ability_support_e *support);
 
+/**
+ * @brief Gets the supported display mode of the updated media controller server.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks If a display mode is not present in the @a supported_modes, then the server's support for this mode is #MC_ABILITY_SUPPORTED_NO and you can't send the corresponding command to the server. \n
+ *
+ * @param[in] client The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] supported_modes    The supported display mode, values of #mc_display_mode_e combined with bitwise 'or'.
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @pre Get a server name handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_get_latest_server_info()
+ * @see mc_client_foreach_server()
+ * @see mc_client_get_server_playback_ability()
+ * @see mc_client_get_server_ability_support()
+ * @see mc_client_get_server_display_rotation_ability()
+ */
+int mc_client_get_server_display_mode_ability(mc_client_h client, const char *server_name, unsigned int *supported_modes);
+
+/**
+ * @brief Gets the supported display rotation of the updated media controller server.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks If a display rotation is not present in the @a supported_rotations, then the server's support for this mode is #MC_ABILITY_SUPPORTED_NO and you can't send the corresponding command to the server. \n
+ *
+ * @param[in] client The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[out] supported_rotations    The supported display rotation, values of #mc_display_rotation_e combined with bitwise 'or'
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller client handle by calling mc_client_create().
+ * @pre Get a server name handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_destroy()
+ * @see mc_client_get_latest_server_info()
+ * @see mc_client_foreach_server()
+ * @see mc_client_get_server_playback_ability()
+ * @see mc_client_get_server_ability_support()
+ * @see mc_client_get_server_display_mode_ability()
+ */
+int mc_client_get_server_display_rotation_ability(mc_client_h client, const char *server_name, unsigned int *supported_rotations);
+
 /**
  * @brief Retrieves all created servers.
  * @details This function gets all created media controller servers.
@@ -1747,6 +2305,130 @@ int mc_client_send_custom_cmd(mc_client_h client, const char *server_name, const
  */
 int mc_client_send_search_cmd(mc_client_h client, const char *server_name, mc_search_h search, char **request_id);
 
+/**
+ * @brief Sends the subtitles command to server.
+ * @details If the server sends the result of the command, the media controller client will get the result of the subtitles command by mc_cmd_reply_received_cb() callback.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The @a request_id should be released using free().\n
+ *          If the @a request_id is null, the server will not send the reply of the command.\n
+ *          If the @a server_name application doesn't support the subtitles command, this function will return #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] enable      The request status to send to media controller server
+ * @param[out] request_id   The id of the command request, it will be passed to the mc_cmd_reply_received_cb() function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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
+ * @retval #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP Limited by server application
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_set_cmd_reply_received_cb()
+ */
+int mc_client_send_subtitles_cmd(mc_client_h client, const char *server_name, bool enable, char **request_id);
+
+/**
+ * @brief Sends the 360 mode command to server.
+ * @details If the server sends the result of the command, the media controller client will get the result of the 360 mode command by mc_cmd_reply_received_cb() callback.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The @a request_id should be released using free().\n
+ *          If the @a request_id is null, the server will not send the reply of the command.\n
+ *          If the @a server_name application doesn't support the 360 mode command, this function will return #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] enable      The request status to send to media controller server
+ * @param[out] request_id   The id of the command request, it will be passed to the mc_cmd_reply_received_cb() function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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
+ * @retval #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP Limited by server application
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_set_cmd_reply_received_cb()
+ */
+int mc_client_send_360_mode_cmd(mc_client_h client, const char *server_name, bool enable, char **request_id);
+
+/**
+ * @brief Sends the display mode command to server.
+ * @details If the server sends the result of the command, the media controller client will get the result of the display mode command by mc_cmd_reply_received_cb() callback.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The @a request_id should be released using free().\n
+ *          If the @a request_id is null, the server will not send the reply of the command.\n
+ *          If the @a server_name application doesn't support the display mode command, this function will return #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] mode      The display mode to send to media controller server
+ * @param[out] request_id   The id of the command request, it will be passed to the mc_cmd_reply_received_cb() function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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
+ * @retval #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP Limited by server application
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_set_cmd_reply_received_cb()
+ */
+int mc_client_send_display_mode_cmd(mc_client_h client, const char *server_name, mc_display_mode_e mode, char **request_id);
+
+/**
+ * @brief Sends the display rotation command to server.
+ * @details If the server sends the result of the command, the media controller client will get the result of the display rotation command by mc_cmd_reply_received_cb() callback.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks The @a request_id should be released using free().\n
+ *          If the @a request_id is null, the server will not send the reply of the command.\n
+ *          If the @a server_name application doesn't support the display rotation command, this function will return #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP.
+ *
+ * @param[in] client    The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] rotation      The display rotation to send to media controller server
+ * @param[out] request_id   The id of the command request, it will be passed to the mc_cmd_reply_received_cb() function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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
+ * @retval #MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP Limited by server application
+ *
+ * @pre Create a media controller client handle by calling mc_client_create().
+ * @see mc_client_create()
+ * @see mc_client_set_cmd_reply_received_cb()
+ */
+int mc_client_send_display_rotation_cmd(mc_client_h client, const char *server_name, mc_display_rotation_e rotation, char **request_id);
+
 /**
  * @brief Destroys client.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
index 181f8e443862b00d4026dbe66ae2cb40c71f0fb2..0d8c8356e6b8a353095485d8b8658a3f112683ca 100644 (file)
@@ -28,8 +28,6 @@ int mc_db_update_playback_info(const char *table_name, const media_controller_pl
 int mc_db_update_whole_metadata(const char *server_name,
                                                const char *title, const char *artist, const char *album, const char *author, const char *genre, const char *duration, const char *date,
                                                const char *copyright, const char *description, const char *track_num, const char *picture, const char *season, const char *episode, const char *resolution);
-int mc_db_update_shuffle_mode(const char *table_name, int shuffle_mode);
-int mc_db_update_repeat_mode(const char *table_name, int repeat_mode);
 int mc_db_update_icon_uri(const char *server_name, const char *uri);
 int mc_db_update_ability_supported(const char *server_name, const media_controller_ability_s ability);
 
@@ -42,6 +40,8 @@ int mc_db_get_repeat_mode(sqlite3 *handle, const char *server_name, mc_repeat_mo
 int mc_db_get_icon_uri(sqlite3 *handle, const char *server_name, char **uri);
 int mc_db_get_ability_supported(sqlite3 *handle, const char *server_name, int ability, mc_ability_support_e *supported);
 int mc_db_get_pb_action_ability(sqlite3 *handle, const char *server_name, mc_playback_ability_h *ability);
+int _mc_db_get_display_mode_ability(sqlite3 *handle, const char *server_name, unsigned int *ability);
+int _mc_db_get_display_rotation_ability(sqlite3 *handle, const char *server_name, unsigned int *ability);
 int _mc_db_get_playlist_count(sqlite3 *handle, const char *server_name);
 int mc_db_get_foreach_playlist(sqlite3 *handle, const char *server_name, mc_playlist_cb callback, void *user_data);
 gboolean _mc_db_is_playlist_exist(sqlite3 *handle, const char *server_name, const char *playlist_name);
@@ -55,6 +55,10 @@ int mc_db_update_latest_server_table(const char *server_name);
 int mc_db_remove_playlist(const char *server_name, const char *playlist_name);
 int mc_db_update_playlist(const char *server_name, const char *playlist_name, bundle_raw *bundle_data, int bundle_size);
 int _mc_db_add_playlist(const char *server_name, const char *playlist_name);
-
+int _mc_db_update_server_attribute(const char *server_name, const char *attribute, int value);
+int _mc_db_get_subtitles_enabled(sqlite3 *handle, const char *server_name, bool *enabled);
+int _mc_db_get_360_mode_enabled(sqlite3 *handle, const char *server_name, bool *enabled);
+int _mc_db_get_display_mode(sqlite3 *handle, const char *server_name, mc_display_mode_e *mode);
+int _mc_db_get_display_rotation(sqlite3 *handle, const char *server_name, mc_display_rotation_e *rotation);
 
 #endif /*__TIZEN_MULTIMEDIA_MEDIA_CONTROLLER_DB_H__*/
index 8d5e47a8ffd08fc600cb3216e0c838946d164561..e5a20a485a9a56defd8118e43f4c5d9ea5811dc0 100644 (file)
@@ -189,9 +189,15 @@ extern "C" {
 #define MC_DBUS_SIGNAL_NAME_SHUFFLE_ABILITY                    "shuffle_ability"
 #define MC_DBUS_SIGNAL_NAME_REPEAT_ABILITY                     "repeat_ability"
 #define MC_DBUS_SIGNAL_NAME_ABILITY_SUPPORT                    "ability_support"
+#define MC_DBUS_SIGNAL_NAME_DP_MODE_ABILITY                    "display_mode_ability"
+#define MC_DBUS_SIGNAL_NAME_DP_ROTATION_ABILITY                "display_rotation_ability"
+#define MC_DBUS_SIGNAL_NAME_SEARCH_CMD                         "search_cmd"
+#define MC_DBUS_SIGNAL_NAME_SUBTITLES                          "subtitles"
+#define MC_DBUS_SIGNAL_NAME_DISPLAY_MODE                       "display_mode"
+#define MC_DBUS_SIGNAL_NAME_DISPLAY_ROTATION           "display_rotation"
+#define MC_DBUS_SIGNAL_NAME_360                                                "spherical_mode"
 
 
-#define MC_DBUS_SIGNAL_NAME_SEARCH_CMD                         "search_cmd"
 #ifdef TIZEN_FEATURE_COMPATIBILITY
 #define MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD         "pb_state_cmd"
 #define MC_DBUS_SIGNAL_NAME_CUSTOM_COMMAND                     "custom_command"
@@ -208,6 +214,13 @@ extern "C" {
 #define MC_COMMAND_CUSTOMACTION                        "_custom_action_"
 #define MC_COMMAND_CMDREPLY                            "_cmd_reply_"
 #define MC_COMMAND_SEARCH                              "_search_cmd_"
+#define MC_COMMAND_SUBTITLES                           "_subtitles_cmd_"
+#define MC_COMMAND_DISPLAYMODE                 "_display_mode_cmd_"
+#define MC_COMMAND_DISPLAYROTATION             "_display_rotation_cmd_"
+#define MC_COMMAND_360                                 "360_cmd_"
+
+
+
 #ifdef TIZEN_FEATURE_COMPATIBILITY
 #define MC_COMMAND_PLAYBACKSTATE               "_pb_state_cmd_"
 #define MC_COMMAND_CUSTOM                              "_custom_cmd_"
@@ -217,16 +230,21 @@ extern "C" {
 #define MC_EVENT_REPLY                                 "_event_reply_"
 
 
-#define MC_DB_CMD_UPDATE_PLAYBACK      "DB_CMD_UPDATE_PLAYBACK"                /* Update Server Playback info*/
-#define MC_DB_CMD_UPDATE_META          "DB_CMD_UPDATE_META"                    /* Update Server Meta info*/
-#define MC_DB_CMD_UPDATE_SHUFFLE               "DB_CMD_UPDATE_SHUFFLE"         /* Update Server Shuffle mode*/
-#define MC_DB_CMD_UPDATE_REPEAT                "DB_CMD_UPDATE_REPEAT"                  /* Update Server Repeat mode*/
-#define MC_DB_CMD_UPDATE_LATEST                "DB_CMD_UPDATE_LATEST"                  /* Update Latest Server info*/
-#define MC_DB_CMD_UPDATE_PLAYLIST      "DB_CMD_UPDATE_PLAYLIST"                /* Update Server Playlist*/
-#define MC_DB_CMD_ADD_PLAYLIST         "DB_CMD_ADD_PLAYLIST"                   /* Add new Server Playlist*/
-#define MC_DB_CMD_UPDATE_ICON          "DB_CMD_UPDATE_ICON"                    /* Update Server Icon*/
-#define MC_DB_CMD_UPDATE_ABILITY               "DB_CMD_UPDATE_ABILITY"                 /* Update Server abilities*/
-#define MC_DB_CMD_REMOVE_PLAYLIST      "DB_CMD_REMOVE_PLAYLIST"                /* Remove Playlist*/
+#define MC_DB_CMD_UPDATE_PLAYBACK      "DB_CMD_UPDATE_PLAYBACK"                /* Update Server Playback info */
+#define MC_DB_CMD_UPDATE_META          "DB_CMD_UPDATE_META"                    /* Update Server Meta info */
+#define MC_DB_CMD_UPDATE_SHUFFLE               "DB_CMD_UPDATE_SHUFFLE"         /* Update Server Shuffle mode */
+#define MC_DB_CMD_UPDATE_REPEAT                "DB_CMD_UPDATE_REPEAT"                  /* Update Server Repeat mode */
+#define MC_DB_CMD_UPDATE_LATEST                "DB_CMD_UPDATE_LATEST"                  /* Update Latest Server info */
+#define MC_DB_CMD_UPDATE_PLAYLIST      "DB_CMD_UPDATE_PLAYLIST"                /* Update Server Playlist */
+#define MC_DB_CMD_ADD_PLAYLIST         "DB_CMD_ADD_PLAYLIST"                   /* Add new Server Playlist */
+#define MC_DB_CMD_UPDATE_ICON          "DB_CMD_UPDATE_ICON"                    /* Update Server Icon */
+#define MC_DB_CMD_UPDATE_ABILITY               "DB_CMD_UPDATE_ABILITY"                 /* Update Server abilities */
+#define MC_DB_CMD_REMOVE_PLAYLIST      "DB_CMD_REMOVE_PLAYLIST"                /* Remove Playlist */
+#define MC_DB_CMD_UPDATE_SUBTITLES     "DB_CMD_UPDATE_SUBTITLES"               /* Update subtitles */
+#define MC_DB_CMD_UPDATE_DISPLAY_MODE          "DB_CMD_UPDATE_DISPLAY_MODE"            /* Update display mode */
+#define MC_DB_CMD_UPDATE_DISPLAY_ROTATION      "DB_CMD_UPDATE_DISPLAY_ROTATION"                /* Update display rotation */
+#define MC_DB_CMD_UPDATE_360                                   "DB_CMD_UPDATE_360"             /* Update 360 mode */
+
 
 
 #define DEFAULT_USER_UID 5001  /* owner */
@@ -298,6 +316,12 @@ typedef enum {
        MC_CLIENT_EVENT_SHUFFLE_ABILITY = MC_SUBSCRIPTION_TYPE_SHUFFLE_ABILITY,
        MC_CLIENT_EVENT_REPEAT_ABILITY  = MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY,
        MC_CLIENT_EVENT_ABILITY_SUPPORT = MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT,
+       MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY    = MC_SUBSCRIPTION_TYPE_DISPLAY_MODE_ABILITY,
+       MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY        = MC_SUBSCRIPTION_TYPE_DISPLAY_ROTATION_ABILITY,
+       MC_CLIENT_EVENT_SUBTITLES,
+       MC_CLIENT_EVENT_DISPLAY_MODE,
+       MC_CLIENT_EVENT_DISPLAY_ROTATION,
+       MC_CLIENT_EVENT_360,
        MC_CLIENT_EVENT_CMD_REPLY,
        MC_CLIENT_EVENT_SERVER_CUSTOM,  //receive event from server to client
 #ifdef TIZEN_FEATURE_COMPATIBILITY
@@ -315,6 +339,10 @@ typedef enum {
        MC_SERVER_EVENT_CLIENT_CUSTOM,          //received event from client
        MC_SERVER_EVENT_REPLY_CUSTOM,           //received event reply from client
        MC_SERVER_EVENT_SEARCH,
+       MC_SERVER_EVENT_SUBTITLES,
+       MC_SERVER_EVENT_DISPLAY_MODE,
+       MC_SERVER_EVENT_DISPLAY_ROTATION,
+       MC_SERVER_EVENT_360,
 #ifdef TIZEN_FEATURE_COMPATIBILITY
        MC_SERVER_EVENT_PLAYBACK_STATE,         //deprecated. use action instead of it.
        MC_SERVER_EVENT_CLIENT_CUSTOM_OLD,      //received event from client, deprecated
@@ -322,7 +350,10 @@ typedef enum {
        MC_SERVER_EVENT_MAX,
 } mc_server_receive_event_e;
 
-#define PLAYBACK_ACTION_ABILITY        MC_SERVER_EVENT_PLAYBACK_ACTION + 30
+#define PLAYBACK_ACTION_ABILITY        MC_SERVER_EVENT_PLAYBACK_ACTION + 20
+#define DISPLAY_MODE_ABILITY           MC_SERVER_EVENT_PLAYBACK_ACTION + 35
+#define DISPLAY_ROTATION_ABILITY       MC_SERVER_EVENT_PLAYBACK_ACTION + 50
+
 
 typedef struct {
        char *server_name;
@@ -402,6 +433,7 @@ char *mc_util_generate_uuid(void);
 int mc_util_bundle_to_string(bundle *bundle_data, char **str_data);
 gboolean _mc_util_is_valid_playback_action(mc_playback_action_e action);
 gboolean _mc_util_is_valid_subscription_type(const mc_subscription_type_e subscription_type);
+gboolean _mc_util_is_valid_display_mode(mc_display_mode_e mode);
 void _mc_util_set_bit(int bit_num, gboolean set, unsigned long long *value);
 gboolean _mc_util_is_true_bit(unsigned long long value, int bit_num);
 const char * _mc_util_replace_null(const char *data);
index 2b5bb1552bd45d4cb0446fe0b63eb65551df3ea2..03f56e040908dfaf9deb877bd18941bf39a1d175 100755 (executable)
@@ -44,8 +44,8 @@ extern "C" {
  *
  * @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. \n
- *          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.
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
  * @param[in] request_id    The request_id of the media controller client
@@ -65,8 +65,8 @@ typedef void (*mc_server_playback_action_cmd_received_cb)(const char* client_nam
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.\n
- *          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.
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
  * @param[in] request_id    The request_id of the media controller client
@@ -86,8 +86,8 @@ typedef void (*mc_server_playback_position_cmd_received_cb)(const char* client_n
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.\n
- *          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.
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
  * @param[in] request_id    The request_id of the media controller client
@@ -107,8 +107,8 @@ typedef void (*mc_server_shuffle_mode_cmd_received_cb)(const char* client_name,
  *
  * @remarks The callback is called in the dbus event loop.\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.\n
- *          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.
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
  * @param[in] request_id    The request_id of the media controller client
@@ -128,8 +128,8 @@ typedef void (*mc_server_repeat_mode_cmd_received_cb)(const char* client_name, c
  *
  * @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.\n
- *          The @a client_name, @ request_id, @ playlist_name and @ index 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.
+ *          The @a client_name, @a request_id, @ playlist_name and @ index should not be released by the application. \n
+ *          The @a client_name, @a 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
  * @param[in] request_id    The request_id of the media controller client
@@ -154,8 +154,8 @@ typedef void (*mc_server_playlist_cmd_received_cb)(const char* client_name, cons
  *
  * @remarks The callback is called in the dbus event loop. @a data should be released using bundle_free().\n
  *          If @a request_id is not null, the server should send the reply to the client with the @a request_id.\n
- *          The @a client_name, @ request_id and @ command 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.
+ *          The @a client_name, @a request_id and @ command should not be released by the application. \n
+ *          The @a client_name, @a 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
  * @param[in] request_id     The id of the command request
@@ -240,6 +240,70 @@ typedef void (*mc_server_event_reply_received_cb)(const char *client_name, const
  */
 typedef void (*mc_server_search_cmd_received_cb)(const char *client_name, const char *request_id, mc_search_h search, void *user_data);
 
+/**
+ * @brief Called when the server receives the subtite and 360 mode command from the client.
+ * @since_tizen 5.5
+ *
+ * @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.\n
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
+ * @param[in] request_id    The request_id of the media controller client
+ * @param[in] enabled    The received command
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @pre mc_server_set_subtitles_cmd_received_cb() or mc_server_set_360_mode_cmd_received_cb()
+ *
+ * @see mc_server_set_subtitles_cmd_received_cb()
+ * @see mc_server_set_360_mode_cmd_received_cb()
+ * @see mc_server_send_cmd_reply()
+ */
+typedef void (*mc_server_enable_cmd_received_cb)(const char* client_name, const char *request_id, bool enabled, void *user_data);
+
+/**
+ * @brief Called when the server receives the display mode command from the client.
+ * @since_tizen 5.5
+ *
+ * @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.\n
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
+ * @param[in] request_id    The request_id of the media controller client
+ * @param[in] mode    The received display mode
+ * @param[in] user_data        The user data passed from the mc_server_set_display_mode_cmd_received_cb() function
+ *
+ * @pre mc_server_set_display_mode_cmd_received_cb()
+ *
+ * @see mc_server_set_display_mode_cmd_received_cb()
+ * @see mc_server_send_cmd_reply()
+ */
+typedef void (*mc_server_display_mode_cmd_received_cb)(const char* client_name, const char *request_id, mc_display_mode_e mode, void *user_data);
+
+/**
+ * @brief Called when the server receives the display rotation command from the client.
+ * @since_tizen 5.5
+ *
+ * @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.\n
+ *          The @a client_name and @a request_id should not be released by the application. \n
+ *          The @a client_name and @a 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
+ * @param[in] request_id    The request_id of the media controller client
+ * @param[in] rotation    The received display rotation
+ * @param[in] user_data        The user data passed from the mc_server_set_display_mode_cmd_received_cb() function
+ *
+ * @pre mc_server_set_display_rotation_cmd_received_cb()
+ *
+ * @see mc_server_set_display_rotation_cmd_received_cb()
+ * @see mc_server_send_cmd_reply()
+ */
+typedef void (*mc_server_display_rotation_cmd_received_cb)(const char* client_name, const char *request_id, mc_display_rotation_e rotation, void *user_data);
+
 /**
  * @brief Creates a media controller server.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
@@ -546,6 +610,110 @@ int mc_server_update_shuffle_mode(mc_server_h server, mc_shuffle_mode_e mode);
  */
 int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode);
 
+/**
+ * @brief Updates the modified subtitles display status.
+ * @details If this function is called, the updated subtitles display status will be sent to all clients.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks The default subtitles display is false.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] enabled The subtitles display status to update the latest status
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ */
+int mc_server_update_subtitles_enabled(mc_server_h server, bool enabled);
+
+/**
+ * @brief Updates the modified 360 mode display status.
+ * @details If this function is called, the updated 360 mode display status will be sent to all clients.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks The default 360 mode display is false.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] enabled The 360 mode display status to update the latest status
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ */
+int mc_server_update_360_mode_enabled(mc_server_h server, bool enabled);
+
+/**
+ * @brief Updates the modified display mode.
+ * @details If this function is called, the updated display mode information will be sent to all clients.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks The default display mode is #MC_DISPLAY_MODE_FULL_SCREEN.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] mode The display mode to update the latest status
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ */
+int mc_server_update_display_mode(mc_server_h server, mc_display_mode_e mode);
+
+/**
+ * @brief Updates the modified display rotation.
+ * @details If this function is called, the updated display rotation information will be sent to all clients.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks The default display rotation is #MC_DISPLAY_ROTATION_NONE.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] rotation The display rotation to update the latest status
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ */
+int mc_server_update_display_rotation(mc_server_h server, mc_display_rotation_e rotation);
+
 /**
  * @brief Sets the callback for receiving playback action command from client.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
@@ -864,6 +1032,226 @@ int mc_server_set_custom_cmd_received_cb(mc_server_h server, mc_server_custom_cm
  */
 int mc_server_unset_custom_cmd_received_cb(mc_server_h server);
 
+/**
+ * @brief Sets the callback for receiving subtitles command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_ability_support(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @param[in] callback      The callback to be invoked when media controller server receives subtitles command from client
+ * @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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_unset_subtitles_cmd_received_cb()
+ * @see mc_server_set_ability_support()
+ */
+int mc_server_set_subtitles_cmd_received_cb(mc_server_h server, mc_server_enable_cmd_received_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for receiving subtitles command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_ability_support(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_set_subtitles_cmd_received_cb()
+ * @see mc_server_set_ability_support()
+ */
+int mc_server_unset_subtitles_cmd_received_cb(mc_server_h server);
+
+/**
+ * @brief Sets the callback for receiving 360 mode command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_ability_support(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @param[in] callback      The callback to be invoked when media controller server receives 360 mode command from client
+ * @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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_unset_360_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
+ */
+int mc_server_set_360_mode_cmd_received_cb(mc_server_h server, mc_server_enable_cmd_received_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for receiving 360 mode command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_ability_support(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_set_360_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
+ */
+int mc_server_unset_360_mode_cmd_received_cb(mc_server_h server);
+
+/**
+ * @brief Sets the callback for receiving display mode command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_display_mode_ability(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @param[in] callback      The callback to be invoked when media controller server receives display mode command from client
+ * @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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_unset_display_mode_cmd_received_cb()
+ * @see mc_server_set_display_mode_ability()
+ */
+int mc_server_set_display_mode_cmd_received_cb(mc_server_h server, mc_server_display_mode_cmd_received_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for receiving display mode command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_display_mode_ability(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_set_display_mode_cmd_received_cb()
+ * @see mc_server_set_display_mode_ability()
+ */
+int mc_server_unset_display_mode_cmd_received_cb(mc_server_h server);
+
+/**
+ * @brief Sets the callback for receiving display rotation command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_display_rotation_ability(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @param[in] callback      The callback to be invoked when media controller server receives display rotation command from client
+ * @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_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_unset_display_rotation_cmd_received_cb()
+ * @see mc_server_set_display_rotation_ability()
+ */
+int mc_server_set_display_rotation_cmd_received_cb(mc_server_h server, mc_server_display_rotation_cmd_received_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for receiving display rotation command from client.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks It is mandatory to set the corresponding ability's support using mc_server_set_display_rotation_ability(). \n
+ *              If not, server can't receive command from clients. It will let the client know about the server's abilities and what commands the client can send.
+ *
+ * @param[in] server    The handle to media controller server
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTROLLER_ERROR_INVALID_OPERATION Invalid operation
+ *
+ * @pre Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_set_display_rotation_cmd_received_cb()
+ * @see mc_server_set_display_rotation_ability()
+ */
+int mc_server_unset_display_rotation_cmd_received_cb(mc_server_h server);
+
 /**
  * @brief Replies the result of the requested command to the client.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
@@ -1343,19 +1731,28 @@ int mc_server_set_repeat_ability(mc_server_h server, mc_ability_support_e suppor
 /**
  * @brief Sets the ability's support of the media controller.
  * @details This function allows setting the support for the following abilities:
- *              MC_ABILITY_SHUFFLE, \n
- *              MC_ABILITY_REPEAT, \n
- *              MC_ABILITY_PLAYBACK_POSITION, \n
- *              MC_ABILITY_PLAYLIST, \n
- *              MC_ABILITY_CLIENT_CUSTOM, \n
- *              MC_ABILITY_SEARCH, \n
- *            To set the support for a playback ability, use mc_server_set_playback_ability() and mc_server_update_playback_ability().
+ *              #MC_ABILITY_SHUFFLE, \n
+ *              #MC_ABILITY_REPEAT, \n
+ *              #MC_ABILITY_PLAYBACK_POSITION, \n
+ *              #MC_ABILITY_PLAYLIST, \n
+ *              #MC_ABILITY_CLIENT_CUSTOM, \n
+ *              #MC_ABILITY_SEARCH, \n
+ *              #MC_ABILITY_SUBTITLES, \n
+ *              #MC_ABILITY_360_MODE, \n
+ *            To set the support for other abilities, use corresponding function. \n
+ *            For a playback ability, use mc_server_set_playback_ability() and mc_server_update_playback_ability(). \n
+ *            For a display mode ability, use mc_server_set_display_mode_ability(). \n
+ *            For a display rotation ability, use mc_server_set_display_rotation_ability(). \n
  * @since_tizen 5.5
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
- * @remarks If @a support is #MC_ABILITY_SUPPORTED_UNDECIDED, this function will return #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER.
+ * @remarks If @a support is #MC_ABILITY_SUPPORTED_UNDECIDED, this function will return #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER. \n
+ *              Default value is #MC_ABILITY_SUPPORTED_UNDECIDED. \n
+ *              But for the #MC_ABILITY_SUBTITLES, #MC_ABILITY_360_MODE default value is #MC_ABILITY_SUPPORTED_NO. \n
+ *              Clients can send command to servers when server's ability is #MC_ABILITY_SUPPORTED_YES or #MC_ABILITY_SUPPORTED_UNDECIDED.
+ *              So, it is required that server set the corresponding ability's support to communicate with clients.
  *
  * @param[in] server The handle to media controller server
  * @param[in] ability The ability to set support
@@ -1373,9 +1770,68 @@ int mc_server_set_repeat_ability(mc_server_h server, mc_ability_support_e suppor
  * @see mc_server_destroy()
  * @see mc_server_set_playback_ability()
  * @see mc_server_update_playback_ability()
+ * @see mc_server_set_display_mode_ability()
+ * @see mc_server_set_display_rotation_ability()
  */
 int mc_server_set_ability_support(mc_server_h server, mc_ability_e ability, mc_ability_support_e support);
 
+/**
+ * @brief Sets the display mode ability of the media controller.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks If @a support is #MC_ABILITY_SUPPORTED_UNDECIDED, this function will return #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER.
+ *              The default display mode ability is #MC_ABILITY_SUPPORTED_NO. \n
+ *              It means client can't send the corresponding command to the server, so to receive command from clients, set ability as #MC_ABILITY_SUPPORTED_YES.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] mode The display mode, values of #mc_display_mode_e combined with bitwise 'or'.
+ * @param[in] support    The support value of the ability
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ * @see mc_server_set_display_mode_cmd_received_cb()
+ */
+int mc_server_set_display_mode_ability(mc_server_h server, unsigned int mode, mc_ability_support_e support);
+
+/**
+ * @brief Sets the display rotation ability of the media controller.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.server
+ *
+ * @remarks If @a support is #MC_ABILITY_SUPPORTED_UNDECIDED, this function will return #MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER.
+ *              The default display rotation ability is #MC_ABILITY_SUPPORTED_NO. \n
+ *              It means client can't send the corresponding command to the server, so to receive command from clients, set ability as #MC_ABILITY_SUPPORTED_YES.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] rotation The display rotation, values of #mc_display_rotation_e combined with bitwise 'or'
+ * @param[in] support    The support value of the ability
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #MEDIA_CONTROLLER_ERROR_NONE Successful
+ * @retval #MEDIA_CONTROLLER_ERROR_PERMISSION_DENIED Permission denied
+ * @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 Create a media controller server handle by calling mc_server_create().
+ * @see mc_server_create()
+ * @see mc_server_destroy()
+ */
+int mc_server_set_display_rotation_ability(mc_server_h server, unsigned int rotation, mc_ability_support_e support);
+
 /**
  * @brief Sets the icon URI of media controller server.
  * @since_tizen 5.0
index 6629012ec68269c574da562592a7d8167972fc86..5f55257b0c2cbb062a993075e1259908527f2a7c 100755 (executable)
@@ -187,6 +187,8 @@ typedef enum {
        MC_SUBSCRIPTION_TYPE_SHUFFLE_ABILITY,                                   /**< Shuffle ability (Since 5.0) (Deprecated since 5.5. Use #MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT instead)*/
        MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY,                                    /**< Repeat ability (Since 5.0) (Deprecated since 5.5. Use #MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT instead)*/
        MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT = 9,                               /**< Ability support (Since 5.5) */
+       MC_SUBSCRIPTION_TYPE_DISPLAY_MODE_ABILITY,                      /**< Display mode ability (Since 5.5) */
+       MC_SUBSCRIPTION_TYPE_DISPLAY_ROTATION_ABILITY,          /**< Display rotation ability (Since 5.5) */
 } mc_subscription_type_e;
 
 /**
@@ -258,6 +260,8 @@ typedef enum {
        MC_ABILITY_PLAYLIST,                    /**< Playlist */
        MC_ABILITY_CLIENT_CUSTOM,               /**< Custom command from a client */
        MC_ABILITY_SEARCH,                              /**< Search */
+       MC_ABILITY_SUBTITLES,                   /**< Subtitles display*/
+       MC_ABILITY_360_MODE,                    /**< 360 content mode display*/
 } mc_ability_e;
 
 /**
@@ -273,6 +277,28 @@ typedef enum {
        MC_SEARCH_TPO,          /**< Search by Time Place Occasion */
 } mc_search_category_e;
 
+/**
+ * @brief Enumeration for the display mode.
+ * @since_tizen 5.5
+ */
+typedef enum {
+       MC_DISPLAY_MODE_LETTER_BOX = 1 << 0,            /**< Letter box */
+       MC_DISPLAY_MODE_ORIGIN_SIZE = 1 << 1,           /**< Origin size */
+       MC_DISPLAY_MODE_FULL_SCREEN = 1 << 2,   /**< Full-screen */
+       MC_DISPLAY_MODE_CROPPED_FULL = 1 << 3,  /**< Cropped full-screen */
+} mc_display_mode_e;
+
+/**
+ * @brief Enumeration for the display rotation.
+ * @since_tizen 5.5
+ */
+typedef enum {
+       MC_DISPLAY_ROTATION_NONE = 1 << 0,      /**< Display is not rotated */
+       MC_DISPLAY_ROTATION_90 = 1 << 1,                /**< Display is rotated 90 degrees */
+       MC_DISPLAY_ROTATION_180 = 1 << 2,               /**< Display is rotated 180 degrees */
+       MC_DISPLAY_ROTATION_270 = 1 << 3,               /**< Display is rotated 270 degrees */
+} mc_display_rotation_e;
+
 /**
  * @}
  */
index 1a47cbe674ebaa709f76411d97ff1f815dc42185..0a659a4eb3265dbaec9a5b4a400162349e3a2437 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.2.3
+Version:    0.2.4
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index f214c916114624ddba9dedcbe2649050625efb81..da64b9d8c2c1a4871955336af212f4b03f92eb82 100644 (file)
@@ -31,13 +31,17 @@ static void __client_custom_event_received_cb(const char *interface_name, const
 static void __client_playback_ability_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 static void __client_ability_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 static void __client_ability_support_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __client_display_mode_ability_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __client_display_rotation_ability_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __client_attribute_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __client_display_mode_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __client_display_rotation_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 
 
 #ifdef TIZEN_FEATURE_COMPATIBILITY
 static void __client_reply_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 #endif
 
-
 static mc_cb_event_s cb_event[MC_CLIENT_EVENT_MAX] = {
        {MC_DBUS_SIGNAL_NAME_SERVER_STATE,              __client_server_cb},
        {MC_DBUS_SIGNAL_NAME_PLAY_BACK,                 __client_playback_cb},
@@ -49,6 +53,12 @@ static mc_cb_event_s cb_event[MC_CLIENT_EVENT_MAX] = {
        {MC_DBUS_SIGNAL_NAME_SHUFFLE_ABILITY,           __client_ability_cb},
        {MC_DBUS_SIGNAL_NAME_REPEAT_ABILITY,            __client_ability_cb},
        {MC_DBUS_SIGNAL_NAME_ABILITY_SUPPORT,           __client_ability_support_cb},
+       {MC_DBUS_SIGNAL_NAME_DP_MODE_ABILITY,           __client_display_mode_ability_cb},
+       {MC_DBUS_SIGNAL_NAME_DP_ROTATION_ABILITY,       __client_display_rotation_ability_cb},
+       {MC_DBUS_SIGNAL_NAME_SUBTITLES,                         __client_attribute_cb},
+       {MC_DBUS_SIGNAL_NAME_DISPLAY_MODE,              __client_display_mode_cb},
+       {MC_DBUS_SIGNAL_NAME_DISPLAY_ROTATION,  __client_display_rotation_cb},
+       {MC_DBUS_SIGNAL_NAME_360,                                       __client_attribute_cb},
        {MC_DBUS_SIGNAL_NAME_CMD_REPLY,                 __client_cmd_reply_received_cb},
        {MC_DBUS_SIGNAL_NAME_CUSTOM_EVENT,              __client_custom_event_received_cb},
 #ifdef TIZEN_FEATURE_COMPATIBILITY
@@ -342,6 +352,110 @@ static void __client_ability_support_cb(const char *interface_name, const char *
        g_strfreev(params);
 }
 
+static void __client_display_mode_ability_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;
+       unsigned int ability = 0;
+
+       media_controller_client_s *mc_client = (media_controller_client_s *)user_data;
+       mc_retm_if(!mc_client, "mc_client is NULL");
+
+       mc_ability_supported_items_updated_cb callback = (mc_ability_supported_items_updated_cb)mc_client->updated_cb[MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY].callback;
+       mc_retm_if(!callback , "display_mode_ability_cb is NULL");
+       mc_retm_if(!message, "message is NULL");
+
+       mc_secure_debug("__client_display_mode_ability_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
+
+       ret = _mc_db_get_display_mode_ability(mc_client->db_handle, message, &ability);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to _mc_db_get_display_mode_ability");
+
+       callback(message, ability, mc_client->updated_cb[MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY].user_data);
+
+}
+
+static void __client_display_rotation_ability_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;
+       unsigned int ability = 0;
+
+       media_controller_client_s *mc_client = (media_controller_client_s *)user_data;
+       mc_retm_if(!mc_client, "mc_client is NULL");
+
+       mc_ability_supported_items_updated_cb callback = (mc_ability_supported_items_updated_cb)mc_client->updated_cb[MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY].callback;
+       mc_retm_if(!callback , "display_rotation_ability_cb is NULL");
+       mc_retm_if(!message, "message is NULL");
+
+       mc_secure_debug("__client_display_rotation_ability_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
+
+       ret = _mc_db_get_display_rotation_ability(mc_client->db_handle, message, &ability);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("Fail to _mc_db_get_display_rotation_ability");
+
+       callback(message, ability, mc_client->updated_cb[MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY].user_data);
+
+}
+
+static void __client_attribute_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *reciever = (media_controller_receiver_s *)user_data;
+       mc_retm_if(!reciever, "Invalid reciever");
+
+       mc_bool_attribute_updated_cb callback = (mc_bool_attribute_updated_cb)reciever->callback;
+       mc_retm_if(!callback, "Invalid callback");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_secure_debug("__client_attribute_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 data");
+
+       callback(params[0], atoi(params[1]), reciever->user_data);
+
+       g_strfreev(params);
+}
+
+static void __client_display_mode_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *reciever = (media_controller_receiver_s *)user_data;
+       mc_retm_if(!reciever, "Invalid reciever");
+
+       mc_display_mode_updated_cb callback = (mc_display_mode_updated_cb)reciever->callback;
+       mc_retm_if(!callback, "Invalid callback");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_secure_debug("__client_display_mode_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 data");
+
+       callback(params[0], (mc_display_mode_e)atoi(params[1]), reciever->user_data);
+
+       g_strfreev(params);
+}
+
+static void __client_display_rotation_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *reciever = (media_controller_receiver_s *)user_data;
+       mc_retm_if(!reciever, "Invalid reciever");
+
+       mc_display_rotation_updated_cb callback = (mc_display_rotation_updated_cb)reciever->callback;
+       mc_retm_if(!callback, "Invalid callback");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_secure_debug("__client_display_rotation_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 data");
+
+       callback(params[0], (mc_display_rotation_e)atoi(params[1]), reciever->user_data);
+
+       g_strfreev(params);
+}
+
 static int __mc_client_create(media_controller_client_s **mc_client)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -582,7 +696,8 @@ static int __mc_client_set_updated_cb(mc_client_h client, mc_client_receive_even
 
                MC_SAFE_FREE(interface_name);
 
-       } else if ((event == MC_CLIENT_EVENT_PLAYBACK_INFO) || (event == MC_CLIENT_EVENT_METADATA) || event == MC_CLIENT_EVENT_PLAYBACK_ABILITY) {
+       } else if ((event == MC_CLIENT_EVENT_PLAYBACK_INFO) || (event == MC_CLIENT_EVENT_METADATA) || (event == MC_CLIENT_EVENT_PLAYBACK_ABILITY)
+               || (event == MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY) || (event == MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY)) {
                ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, cb_event[event].signal_name,
                                                cb_event[event].cb_func, (void *)(mc_client));
        } else {
@@ -701,6 +816,46 @@ int mc_client_unset_custom_event_received_cb(mc_client_h client)
        return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_SERVER_CUSTOM);
 }
 
+int mc_client_set_subtitles_updated_cb(mc_client_h client, mc_bool_attribute_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_SUBTITLES, callback, user_data);
+}
+
+int mc_client_unset_subtitles_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_SUBTITLES);
+}
+
+int mc_client_set_display_mode_updated_cb(mc_client_h client, mc_display_mode_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_MODE, callback, user_data);
+}
+
+int mc_client_unset_display_mode_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_MODE);
+}
+
+int mc_client_set_display_rotation_updated_cb(mc_client_h client, mc_display_rotation_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_ROTATION, callback, user_data);
+}
+
+int mc_client_unset_display_rotation_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_ROTATION);
+}
+
+int mc_client_set_360_mode_updated_cb(mc_client_h client, mc_bool_attribute_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_360, callback, user_data);
+}
+
+int mc_client_unset_360_mode_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_360);
+}
+
 int mc_client_set_playback_ability_updated_cb(mc_client_h client, mc_playback_ability_updated_cb callback, void *user_data)
 {
        return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_PLAYBACK_ABILITY, callback, user_data);
@@ -748,6 +903,26 @@ int mc_client_unset_ability_support_updated_cb(mc_client_h client)
        return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_ABILITY_SUPPORT);
 }
 
+int mc_client_set_display_mode_ability_updated_cb(mc_client_h client, mc_ability_supported_items_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY, callback, user_data);
+}
+
+int mc_client_unset_display_mode_ability_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_MODE_ABILITY);
+}
+
+int mc_client_set_display_rotation_ability_updated_cb(mc_client_h client, mc_ability_supported_items_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY, callback, user_data);
+}
+
+int mc_client_unset_display_rotation_ability_updated_cb(mc_client_h client)
+{
+       return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_DISPLAY_ROTATION_ABILITY);
+}
+
 int mc_client_subscribe(mc_client_h client, const mc_subscription_type_e subscription_type, const char *server_name)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -762,7 +937,8 @@ int mc_client_subscribe(mc_client_h client, const mc_subscription_type_e subscri
 
        ret = mc_ipc_unregister_listener(&mc_client->listeners, MC_DBUS_UPDATE_INTERFACE, cb_event[subscription_type].signal_name);
 
-       if (subscription_type == MC_SUBSCRIPTION_TYPE_METADATA || subscription_type == MC_SUBSCRIPTION_TYPE_PLAYBACK_ABILITY) {
+       if (subscription_type == MC_SUBSCRIPTION_TYPE_METADATA || subscription_type == MC_SUBSCRIPTION_TYPE_PLAYBACK_ABILITY
+               || subscription_type == MC_SUBSCRIPTION_TYPE_DISPLAY_MODE_ABILITY || subscription_type == MC_SUBSCRIPTION_TYPE_DISPLAY_ROTATION_ABILITY) {
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->updated_cb[subscription_type].filter_list, server_name, cb_event[subscription_type].signal_name,
                                        cb_event[subscription_type].cb_func,  (void *)(mc_client));
        } else {
@@ -1006,6 +1182,62 @@ int mc_client_get_server_icon(mc_client_h client, const char *server_name, char
        return ret;
 }
 
+int mc_client_get_server_subtitles_enabled(mc_client_h client, const char *server_name, bool *enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!enabled, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid enabled");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       ret = _mc_db_get_subtitles_enabled(mc_client->db_handle, server_name, enabled);
+
+       return ret;
+}
+
+int mc_client_get_server_360_mode_enabled(mc_client_h client, const char *server_name, bool *enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!enabled, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid enabled");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       ret = _mc_db_get_360_mode_enabled(mc_client->db_handle, server_name, enabled);
+
+       return ret;
+}
+
+int mc_client_get_server_display_mode(mc_client_h client, const char *server_name, mc_display_mode_e *mode)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!mode, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid mode");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       ret = _mc_db_get_display_mode(mc_client->db_handle, server_name, mode);
+
+       return ret;
+}
+
+int mc_client_get_server_display_rotation(mc_client_h client, const char *server_name, mc_display_rotation_e *rotation)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!rotation, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid rotation");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       ret = _mc_db_get_display_rotation(mc_client->db_handle, server_name, rotation);
+
+       return ret;
+}
+
 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;
@@ -1042,7 +1274,7 @@ static int __mc_client_verify_ability(mc_client_h client, const char *server_nam
        mc_ability_support_e supported = MC_ABILITY_SUPPORTED_UNDECIDED;
 
        mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
-       mc_retvm_if(!_mc_db_is_activated_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!_mc_db_is_activated_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid not activated server_name");
 
        ret = mc_db_get_ability_supported(mc_client->db_handle, server_name, ability, &supported);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to get ability");
@@ -1095,48 +1327,133 @@ int mc_client_send_playback_position_cmd(mc_client_h client, const char *server_
        return ret;
 }
 
-int mc_client_send_shuffle_mode_cmd(mc_client_h client, const char *server_name, mc_shuffle_mode_e shuffle_mode, char **request_id)
+static int __mc_client_send_cmd(mc_client_h client, const char *server_name, unsigned int value, mc_server_receive_event_e event, char **request_id)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        char *message = NULL;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
        mc_retvm_if(!mc_client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
-       mc_retvm_if(((shuffle_mode < MC_SHUFFLE_MODE_ON) || (shuffle_mode > MC_SHUFFLE_MODE_OFF)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid shuffle mode [%d]", shuffle_mode);
 
-       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_SHUFFLE);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+       message = g_strdup_printf("%s%s%d", mc_client->client_name, MC_STRING_DELIMITER, value);
+       mc_retvm_if(!message, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to make message [%d]", ret);
 
-       message = g_strdup_printf("%s%s%d", mc_client->client_name, MC_STRING_DELIMITER, shuffle_mode);
-       mc_retvm_if(message == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail making message [%d]", ret);
+       switch (event) {
+       case MC_SERVER_EVENT_SHUFFLE:
+               ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_SHUFFLE);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
+
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_SHUFFLE, NULL, MC_DBUS_SIGNAL_NAME_SHUFFLE_CMD, message, request_id);
+               break;
+
+       case MC_SERVER_EVENT_REPEAT:
+               ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_REPEAT);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
+
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_REPEAT, NULL, MC_DBUS_SIGNAL_NAME_REPEAT_CMD, message, request_id);
+               break;
+
+       case MC_SERVER_EVENT_SUBTITLES:
+               ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_SUBTITLES);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
+
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_SUBTITLES, NULL, MC_DBUS_SIGNAL_NAME_SUBTITLES, message, request_id);
+               break;
+
+       case MC_SERVER_EVENT_DISPLAY_MODE:
+               ret = __mc_client_verify_ability(client, server_name, DISPLAY_MODE_ABILITY + value);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
 
-       ret = __mc_client_send_command(client, server_name, MC_COMMAND_SHUFFLE, NULL, MC_DBUS_SIGNAL_NAME_SHUFFLE_CMD, message, request_id);
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_DISPLAYMODE, NULL, MC_DBUS_SIGNAL_NAME_DISPLAY_MODE, message, request_id);
+               break;
+
+       case MC_SERVER_EVENT_DISPLAY_ROTATION:
+               ret = __mc_client_verify_ability(client, server_name, DISPLAY_ROTATION_ABILITY + value);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
+
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_DISPLAYROTATION, NULL, MC_DBUS_SIGNAL_NAME_DISPLAY_ROTATION, message, request_id);
+               break;
+
+       case MC_SERVER_EVENT_360:
+               ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_360_MODE);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("fail to verify ability [%d]", ret);
+                       MC_SAFE_G_FREE(message);
+                       return ret;
+               }
+
+               ret = __mc_client_send_command(client, server_name, MC_COMMAND_360, NULL, MC_DBUS_SIGNAL_NAME_360, message, request_id);
+               break;
+
+       default:
+               mc_error("Not supported event [%d]", event);
+               MC_SAFE_G_FREE(message);
+               return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+       }
 
        MC_SAFE_G_FREE(message);
 
        return ret;
 }
 
-int mc_client_send_repeat_mode_cmd(mc_client_h client, const char *server_name, mc_repeat_mode_e repeat_mode, char **request_id)
+int mc_client_send_shuffle_mode_cmd(mc_client_h client, const char *server_name, mc_shuffle_mode_e shuffle_mode, char **request_id)
 {
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       char *message = NULL;
-       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+       mc_retvm_if(((shuffle_mode < MC_SHUFFLE_MODE_ON) || (shuffle_mode > MC_SHUFFLE_MODE_OFF)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid shuffle mode [%d]", shuffle_mode);
 
-       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+       return __mc_client_send_cmd(client, server_name, shuffle_mode, MC_SERVER_EVENT_SHUFFLE, request_id);
+}
+
+int mc_client_send_repeat_mode_cmd(mc_client_h client, const char *server_name, mc_repeat_mode_e repeat_mode, char **request_id)
+{
        mc_retvm_if(((repeat_mode < MC_REPEAT_MODE_ON) || (repeat_mode > MC_REPEAT_MODE_ONE_MEDIA)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid repeat mode [%d]", repeat_mode);
 
-       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_REPEAT);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+       return __mc_client_send_cmd(client, server_name, repeat_mode, MC_SERVER_EVENT_REPEAT, request_id);
+}
 
-       message = g_strdup_printf("%s%s%d", mc_client->client_name, MC_STRING_DELIMITER, repeat_mode);
-       mc_retvm_if(message == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail making message [%d]", ret);
+int mc_client_send_subtitles_cmd(mc_client_h client, const char *server_name, bool enable, char **request_id)
+{
+       return __mc_client_send_cmd(client, server_name, enable, MC_SERVER_EVENT_SUBTITLES, request_id);
+}
 
-       ret = __mc_client_send_command(client, server_name, MC_COMMAND_REPEAT, NULL, MC_DBUS_SIGNAL_NAME_REPEAT_CMD, message, request_id);
+int mc_client_send_display_mode_cmd(mc_client_h client, const char *server_name, mc_display_mode_e mode, char **request_id)
+{
+       mc_retvm_if((mode != MC_DISPLAY_MODE_LETTER_BOX) && (mode != MC_DISPLAY_MODE_ORIGIN_SIZE) && (mode != MC_DISPLAY_MODE_FULL_SCREEN) && (mode != MC_DISPLAY_MODE_CROPPED_FULL),
+               MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid display mode [%d]", mode);
 
-       MC_SAFE_G_FREE(message);
+       return __mc_client_send_cmd(client, server_name, mode, MC_SERVER_EVENT_DISPLAY_MODE, request_id);
+}
 
-       return ret;
+int mc_client_send_display_rotation_cmd(mc_client_h client, const char *server_name, mc_display_rotation_e rotation, char **request_id)
+{
+       mc_retvm_if((rotation != MC_DISPLAY_ROTATION_NONE) && (rotation != MC_DISPLAY_ROTATION_90) && (rotation != MC_DISPLAY_ROTATION_180) && (rotation != MC_DISPLAY_ROTATION_270),
+               MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid display rotation [%d]", rotation);
+
+       return __mc_client_send_cmd(client, server_name, rotation, MC_SERVER_EVENT_DISPLAY_ROTATION, request_id);
+}
+
+int mc_client_send_360_mode_cmd(mc_client_h client, const char *server_name, bool enable, char **request_id)
+{
+       return __mc_client_send_cmd(client, server_name, enable, MC_SERVER_EVENT_360, request_id);
 }
 
 int mc_client_send_playlist_cmd(mc_client_h client, const char *server_name, const char *playlist_name, const char *index, mc_playback_action_e action, unsigned long long position, char **request_id)
@@ -1362,7 +1679,7 @@ static int __mc_client_get_server_ability(mc_client_h client, const char *server
 
        mc_retvm_if(!client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
        mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
-       mc_retvm_if(((ability < MC_ABILITY_SHUFFLE) || (ability > MC_ABILITY_SEARCH)) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid ability [%d]", ability);
+       mc_retvm_if(((ability < MC_ABILITY_SHUFFLE) || (ability > MC_ABILITY_360_MODE)) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid ability [%d]", ability);
 
        ret = mc_db_get_ability_supported(mc_client->db_handle, server_name, ability, support);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Error mc_db_get_ability_supported [%d]", ret);
@@ -1389,6 +1706,26 @@ int mc_client_get_server_ability_support(mc_client_h client, const char *server_
        return __mc_client_get_server_ability(client, server_name, ability, support);
 }
 
+int mc_client_get_server_display_mode_ability(mc_client_h client, const char *server_name, unsigned int *supported_modes)
+{
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       return _mc_db_get_display_mode_ability(mc_client->db_handle, server_name, supported_modes);
+}
+
+int mc_client_get_server_display_rotation_ability(mc_client_h client, const char *server_name, unsigned int *supported_rotations)
+{
+       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+
+       mc_retvm_if(!client, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid client");
+       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+
+       return _mc_db_get_display_rotation_ability(mc_client->db_handle, server_name, supported_rotations);
+}
+
 int mc_client_destroy(mc_client_h client)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
index 50559743967f2a72e0e809a88b5636e2d28efeac..6450f3eb59796c2dbf0f0fd7308acd90c984d50a 100644 (file)
@@ -124,38 +124,6 @@ int mc_db_update_whole_metadata(const char *server_name,
        return ret;
 }
 
-int mc_db_update_shuffle_mode(const char *server_name, int shuffle_mode)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       char *sql_str = NULL;
-
-       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
-
-       sql_str = g_strdup_printf("%s%s%s%s%d", MC_DB_CMD_UPDATE_SHUFFLE, MC_STRING_DELIMITER, server_name,  MC_STRING_DELIMITER, shuffle_mode);
-
-       ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str);
-
-       MC_SAFE_FREE(sql_str);
-
-       return ret;
-}
-
-int mc_db_update_repeat_mode(const char *server_name, int repeat_mode)
-{
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       char *sql_str = NULL;
-
-       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
-
-       sql_str = g_strdup_printf("%s%s%s%s%d", MC_DB_CMD_UPDATE_REPEAT, MC_STRING_DELIMITER, server_name,  MC_STRING_DELIMITER, repeat_mode);
-
-       ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str);
-
-       MC_SAFE_FREE(sql_str);
-
-       return ret;
-}
-
 int mc_db_update_icon_uri(const char *server_name, const char *uri)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -447,6 +415,64 @@ int mc_db_get_pb_action_ability(sqlite3 *handle, const char *server_name, mc_pla
        return ret;
 }
 
+int _mc_db_get_display_mode_ability(sqlite3 *handle, const char *server_name, unsigned int *ability)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       unsigned long long _decided = 0;
+       unsigned long long _supported = 0;
+       unsigned int _ability = 0;
+
+       mc_retvm_if(!ability, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invliad ability");
+
+       ret = __mc_db_get_ability(handle, server_name, &_decided, &_supported);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "__mc_db_get_ability failed");
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_LETTER_BOX)))
+               _ability |= MC_DISPLAY_MODE_LETTER_BOX;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_ORIGIN_SIZE)))
+               _ability |= MC_DISPLAY_MODE_ORIGIN_SIZE;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_FULL_SCREEN)))
+               _ability |= MC_DISPLAY_MODE_FULL_SCREEN;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_CROPPED_FULL)))
+               _ability |= MC_DISPLAY_MODE_CROPPED_FULL;
+
+       *ability = _ability;
+
+       return ret;
+}
+
+int _mc_db_get_display_rotation_ability(sqlite3 *handle, const char *server_name, unsigned int *ability)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       unsigned long long _decided = 0;
+       unsigned long long _supported = 0;
+       unsigned int _ability = 0;
+
+       mc_retvm_if(!ability, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invliad ability");
+
+       ret = __mc_db_get_ability(handle, server_name, &_decided, &_supported);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "__mc_db_get_ability failed");
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_NONE)))
+               _ability |= MC_DISPLAY_ROTATION_NONE;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_90)))
+               _ability |= MC_DISPLAY_ROTATION_90;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_180)))
+               _ability |= MC_DISPLAY_ROTATION_180;
+
+       if (_mc_util_is_true_bit(_supported, (DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_270)))
+               _ability |= MC_DISPLAY_ROTATION_270;
+
+       *ability = _ability;
+
+       return ret;
+}
+
 int _mc_db_get_playlist_count(sqlite3 *handle, const char *server_name)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -693,8 +719,8 @@ gboolean _mc_db_is_activated_server(sqlite3 *handle, const char *server_name)
        char *sql_str = NULL;
        sqlite3_stmt *stmt = NULL;
 
-       mc_retvm_if(handle == NULL, FALSE, "Handle is NULL");
-       mc_retvm_if(server_name == NULL, FALSE, "server_name is NULL");
+       mc_retvm_if(!handle, FALSE, "Invalid handle");
+       mc_retvm_if(!server_name, FALSE, "Invalid server_name");
 
        mc_secure_debug("server name [%s]", server_name);
 
@@ -901,3 +927,125 @@ int _mc_db_add_playlist(const char *server_name, const char *playlist_name)
 
        return ret;
 }
+
+int _mc_db_update_server_attribute(const char *server_name, const char *attribute, int value)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!MC_STRING_VALID(attribute), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid attribute");
+
+       sql_str = g_strdup_printf("%s%s%s%s%d", attribute, MC_STRING_DELIMITER, server_name,  MC_STRING_DELIMITER, value);
+
+       ret = __mc_db_update_db(MC_PRIV_TYPE_SERVER, sql_str);
+
+       MC_SAFE_FREE(sql_str);
+
+       return ret;
+}
+
+int _mc_db_get_int_value(sqlite3 *handle, const char *server_name, const char *column, int *value)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!value, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid value");
+
+       sql_str = sqlite3_mprintf("SELECT %Q FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, column, server_name);
+
+       ret = __mc_db_get_record(handle, sql_str, &stmt);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
+
+       *value = sqlite3_column_int(stmt, 0);
+       SQLITE3_FINALIZE(stmt);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int _mc_db_get_subtitles_enabled(sqlite3 *handle, const char *server_name, bool *enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!enabled, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid enabled");
+
+       sql_str = sqlite3_mprintf("SELECT subtitles_mode FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
+
+       ret = __mc_db_get_record(handle, sql_str, &stmt);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
+
+       *enabled = sqlite3_column_int(stmt, 0);
+       SQLITE3_FINALIZE(stmt);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int _mc_db_get_360_mode_enabled(sqlite3 *handle, const char *server_name, bool *enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!enabled, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid enabled");
+
+       sql_str = sqlite3_mprintf("SELECT spherical_mode FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
+
+       ret = __mc_db_get_record(handle, sql_str, &stmt);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
+
+       *enabled = sqlite3_column_int(stmt, 0);
+       SQLITE3_FINALIZE(stmt);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int _mc_db_get_display_mode(sqlite3 *handle, const char *server_name, mc_display_mode_e *mode)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!mode, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid mode");
+
+       sql_str = sqlite3_mprintf("SELECT display_mode FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
+
+       ret = __mc_db_get_record(handle, sql_str, &stmt);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
+
+       *mode = sqlite3_column_int(stmt, 0);
+       SQLITE3_FINALIZE(stmt);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int _mc_db_get_display_rotation(sqlite3 *handle, const char *server_name, mc_display_rotation_e *rotation)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       char *sql_str = NULL;
+       sqlite3_stmt *stmt = NULL;
+
+       mc_retvm_if(!handle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid handle");
+       mc_retvm_if(!server_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       mc_retvm_if(!rotation, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid rotation");
+
+       sql_str = sqlite3_mprintf("SELECT display_rotation FROM %q WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, server_name);
+
+       ret = __mc_db_get_record(handle, sql_str, &stmt);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "__mc_db_get_record failed [%d]", ret);
+
+       *rotation = sqlite3_column_int(stmt, 0);
+       SQLITE3_FINALIZE(stmt);
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
index 3ed183acd11bd1708f74728d58bd0d41895f1a01..6764bd338a8de90c07db955efbda11ab6cf0e4b2 100644 (file)
@@ -31,6 +31,9 @@ static void __server_custom_cmd_cb(const char *interface_name, const char *signa
 static void __server_event_reply_received_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 static void __server_search_cmd_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 static int __mc_server_update_ability(mc_server_h server, int support_item, mc_ability_support_e support, gboolean immediate_update);
+static void __server_enable_cmd_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __server_display_mode_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
+static void __server_display_rotation_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 
 #ifdef TIZEN_FEATURE_COMPATIBILITY
 static void __server_playback_state_command_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
@@ -46,6 +49,10 @@ static mc_cb_event_s cb_event[MC_SERVER_EVENT_MAX] = {
        {MC_DBUS_SIGNAL_NAME_CUSTOM_CMD, __server_custom_cmd_cb},
        {MC_DBUS_SIGNAL_NAME_EVENT_REPLY, __server_event_reply_received_cb},
        {MC_DBUS_SIGNAL_NAME_SEARCH_CMD, __server_search_cmd_cb},
+       {MC_DBUS_SIGNAL_NAME_SUBTITLES, __server_enable_cmd_cb},
+       {MC_DBUS_SIGNAL_NAME_DISPLAY_MODE, __server_display_mode_cb},
+       {MC_DBUS_SIGNAL_NAME_DISPLAY_ROTATION, __server_display_rotation_cb},
+       {MC_DBUS_SIGNAL_NAME_360, __server_enable_cmd_cb},
 #ifdef TIZEN_FEATURE_COMPATIBILITY
        {MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD, __server_playback_state_command_cb},
        {MC_DBUS_SIGNAL_NAME_CUSTOM_COMMAND, __server_custom_command_cb},       //deprecated one
@@ -530,6 +537,123 @@ static void __server_search_cmd_cb(const char *interface_name, const char *signa
        mc_search_destroy((mc_search_h)mc_search);
 }
 
+static void __server_enable_cmd_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *receiver = (media_controller_receiver_s *)user_data;
+       int value = 0;
+
+       mc_retm_if(!receiver, "Invalid reciever");
+       mc_retm_if(!signal_name, "Invalid signal_name");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_server_enable_cmd_received_cb callback = receiver->callback;
+       mc_retm_if(!receiver->callback, "mc_server_enable_cmd_received_cb is NULL");
+
+       mc_secure_debug("__server_enable_cmd_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 command");
+
+       if (!strncmp(signal_name, MC_DBUS_SIGNAL_NAME_SUBTITLES, strlen(MC_DBUS_SIGNAL_NAME_SUBTITLES))) {
+               if (mc_util_get_command_available(MC_PRIV_TYPE_SERVER, params[0], MC_COMMAND_SUBTITLES, NULL) != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("Error permission denied for subtitles");
+                       g_strfreev(params);
+                       return;
+               }
+       } else if (!strncmp(signal_name, MC_DBUS_SIGNAL_NAME_360, strlen(MC_DBUS_SIGNAL_NAME_360))) {
+               if (mc_util_get_command_available(MC_PRIV_TYPE_SERVER, params[0], MC_COMMAND_360, NULL) != MEDIA_CONTROLLER_ERROR_NONE) {
+                       mc_error("Error permission denied for 360");
+                       g_strfreev(params);
+                       return;
+               }
+       } else {
+               mc_secure_error("Invalid signal_name [%s]", signal_name);
+               g_strfreev(params);
+               return;
+       }
+
+       if (mc_safe_strtoi(params[1], &value) != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error get recieved value");
+               g_strfreev(params);
+               return;
+       }
+
+       callback(params[0], request_id, value, receiver->user_data);
+
+       g_strfreev(params);
+}
+
+static void __server_display_mode_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *receiver = (media_controller_receiver_s *)user_data;
+       int value = 0;
+
+       mc_retm_if(!receiver, "Invalid reciever");
+       mc_retm_if(!signal_name, "Invalid signal_name");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_server_display_mode_cmd_received_cb callback = receiver->callback;
+       mc_retm_if(!receiver->callback, "mc_server_display_mode_cmd_received_cb is NULL");
+
+       mc_secure_debug("__server_display_mode_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 display mode command");
+
+       if (mc_util_get_command_available(MC_PRIV_TYPE_SERVER, params[0], MC_COMMAND_DISPLAYMODE, NULL) != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error permission denied");
+               g_strfreev(params);
+               return;
+       }
+
+       if (mc_safe_strtoi(params[1], &value) != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error get recieved value");
+               g_strfreev(params);
+               return;
+       }
+
+       callback(params[0], request_id, (mc_display_mode_e)value, receiver->user_data);
+
+       g_strfreev(params);
+}
+
+static void __server_display_rotation_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data)
+{
+       gchar **params = NULL;
+       media_controller_receiver_s *receiver = (media_controller_receiver_s *)user_data;
+       int value = 0;
+
+       mc_retm_if(!receiver, "Invalid reciever");
+       mc_retm_if(!signal_name, "Invalid signal_name");
+       mc_retm_if(!message, "Invalid message");
+
+       mc_server_display_rotation_cmd_received_cb callback = receiver->callback;
+       mc_retm_if(!receiver->callback, "mc_server_display_rotation_cmd_received_cb is NULL");
+
+       mc_secure_debug("__server_display_rotation_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 display rotation command");
+
+       if (mc_util_get_command_available(MC_PRIV_TYPE_SERVER, params[0], MC_COMMAND_DISPLAYROTATION, NULL) != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error permission denied");
+               g_strfreev(params);
+               return;
+       }
+
+       if (mc_safe_strtoi(params[1], &value) != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Error get recieved value");
+               g_strfreev(params);
+               return;
+       }
+
+       callback(params[0], request_id, (mc_display_rotation_e)value, receiver->user_data);
+
+       g_strfreev(params);
+}
+
 static int __mc_server_send_message(media_controller_server_s *mc_server, const char *interface_name, const char *signal_name, const int param1, const int param2, const char* param3)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -542,7 +666,9 @@ static int __mc_server_send_message(media_controller_server_s *mc_server, const
 
        if ((!g_strcmp0(MC_DBUS_SIGNAL_NAME_PLAY_BACK, signal_name))
                || (!g_strcmp0(MC_DBUS_SIGNAL_NAME_METADATA, signal_name))
-               || (!g_strcmp0(MC_DBUS_SIGNAL_NAME_PLAYBACK_ABILITY, signal_name)))
+               || (!g_strcmp0(MC_DBUS_SIGNAL_NAME_PLAYBACK_ABILITY, signal_name))
+               || (!g_strcmp0(MC_DBUS_SIGNAL_NAME_DP_MODE_ABILITY, signal_name))
+               || (!g_strcmp0(MC_DBUS_SIGNAL_NAME_DP_ROTATION_ABILITY, signal_name)))
                message = g_strdup_printf("%s", mc_server->server_name);
        else if (!g_strcmp0(MC_DBUS_SIGNAL_NAME_PLAYLIST, signal_name))
                message = g_strdup_printf("%s%s%d%s%s", mc_server->server_name, MC_STRING_DELIMITER, param1, MC_STRING_DELIMITER, param3);
@@ -754,8 +880,8 @@ int mc_server_update_shuffle_mode(mc_server_h server, mc_shuffle_mode_e mode)
 
        mc_debug("shuffle mode %d", mode);
 
-       ret = mc_db_update_shuffle_mode(mc_server->server_name, mode);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_shuffle_mode");
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_SHUFFLE, mode);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update shuffle mode");
 
        ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE, mode, 0, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
@@ -769,12 +895,12 @@ int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode)
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
 
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
-       mc_retvm_if(((mode < MC_REPEAT_MODE_ON) || (mode > MC_REPEAT_MODE_ONE_MEDIA)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "repeat is invalid [%d]", mode);
+       mc_retvm_if(((mode < MC_REPEAT_MODE_ON) || (mode > MC_REPEAT_MODE_ONE_MEDIA)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid repeat mode [%d]", mode);
 
        mc_debug("repeat mode %d", mode);
 
-       ret = mc_db_update_repeat_mode(mc_server->server_name, mode);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_repeat_mode");
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_REPEAT, mode);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update repeat mode");
 
        ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT, mode, 0, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
@@ -782,6 +908,78 @@ int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode)
        return ret;
 }
 
+int mc_server_update_subtitles_enabled(mc_server_h server, bool enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       mc_debug("enabled [%d]", enabled);
+
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_SUBTITLES, enabled);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update subtitles");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SUBTITLES, enabled, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return ret;
+}
+
+int mc_server_update_display_mode(mc_server_h server, mc_display_mode_e mode)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       mc_debug("mode [%d]", mode);
+
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_DISPLAY_MODE, mode);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update display mode");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_DISPLAY_MODE, mode, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return ret;
+}
+
+int mc_server_update_display_rotation(mc_server_h server, mc_display_rotation_e rotation)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       mc_debug("rotation [%d]", rotation);
+
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_DISPLAY_ROTATION, rotation);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update display rotation");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_DISPLAY_ROTATION, rotation, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return ret;
+}
+
+int mc_server_update_360_mode_enabled(mc_server_h server, bool enabled)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       mc_debug("enabled [%d]", enabled);
+
+       ret = _mc_db_update_server_attribute(mc_server->server_name, MC_DB_CMD_UPDATE_360, enabled);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to update 360 mode");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_360, enabled, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return ret;
+}
+
 int mc_server_set_metadata(mc_server_h server, mc_meta_e attribute, const char *value)
 {
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
@@ -886,7 +1084,7 @@ static int __mc_server_set_ability(mc_server_h server, mc_ability_e ability, mc_
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
 
-       mc_retvm_if(((ability < MC_ABILITY_SHUFFLE) || (ability > MC_ABILITY_SEARCH)) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid ability [%d]", ability);
+       mc_retvm_if(((ability < MC_ABILITY_SHUFFLE) || (ability > MC_ABILITY_360_MODE)) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid ability [%d]", ability);
 
        ret = __mc_server_update_ability(server, ability, support, TRUE);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_update_ability");
@@ -1029,6 +1227,46 @@ int mc_server_unset_search_cmd_received_cb(mc_server_h server)
        return __mc_server_unset_updated_cb(server, MC_SERVER_EVENT_SEARCH);
 }
 
+int mc_server_set_subtitles_cmd_received_cb(mc_server_h server, mc_server_enable_cmd_received_cb callback, void *user_data)
+{
+       return __mc_server_set_updated_cb(server, MC_SERVER_EVENT_SUBTITLES, callback, user_data);
+}
+
+int mc_server_unset_subtitles_cmd_received_cb(mc_server_h server)
+{
+       return __mc_server_unset_updated_cb(server, MC_SERVER_EVENT_SUBTITLES);
+}
+
+int mc_server_set_display_mode_cmd_received_cb(mc_server_h server, mc_server_display_mode_cmd_received_cb callback, void *user_data)
+{
+       return __mc_server_set_updated_cb(server, MC_SERVER_EVENT_DISPLAY_MODE, callback, user_data);
+}
+
+int mc_server_unset_display_mode_cmd_received_cb(mc_server_h server)
+{
+       return __mc_server_unset_updated_cb(server, MC_SERVER_EVENT_DISPLAY_MODE);
+}
+
+int mc_server_set_display_rotation_cmd_received_cb(mc_server_h server, mc_server_display_rotation_cmd_received_cb callback, void *user_data)
+{
+       return __mc_server_set_updated_cb(server, MC_SERVER_EVENT_DISPLAY_ROTATION, callback, user_data);
+}
+
+int mc_server_unset_display_rotation_cmd_received_cb(mc_server_h server)
+{
+       return __mc_server_unset_updated_cb(server, MC_SERVER_EVENT_DISPLAY_ROTATION);
+}
+
+int mc_server_set_360_mode_cmd_received_cb(mc_server_h server, mc_server_enable_cmd_received_cb callback, void *user_data)
+{
+       return __mc_server_set_updated_cb(server, MC_SERVER_EVENT_360, callback, user_data);
+}
+
+int mc_server_unset_360_mode_cmd_received_cb(mc_server_h server)
+{
+       return __mc_server_unset_updated_cb(server, MC_SERVER_EVENT_360);
+}
+
 int mc_server_send_cmd_reply(mc_server_h server, const char *client_name, const char *request_id, int result_code, bundle *data)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -1173,6 +1411,92 @@ int mc_server_set_ability_support(mc_server_h server, mc_ability_e ability, mc_a
        return __mc_server_set_ability(server, ability, support);
 }
 
+int mc_server_set_display_mode_ability(mc_server_h server, mc_display_mode_e mode, mc_ability_support_e support)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       gboolean find = FALSE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       if (mode & MC_DISPLAY_MODE_LETTER_BOX) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_LETTER_BOX, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (mode & MC_DISPLAY_MODE_ORIGIN_SIZE) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_ORIGIN_SIZE, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (mode & MC_DISPLAY_MODE_FULL_SCREEN) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_FULL_SCREEN, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (mode & MC_DISPLAY_MODE_CROPPED_FULL) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_MODE_ABILITY + MC_DISPLAY_MODE_CROPPED_FULL, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       mc_retvm_if(!find, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid mode");
+
+       ret = mc_db_update_ability_supported(mc_server->server_name, mc_server->basic_ability);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_ability_supported");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_DP_MODE_ABILITY, 0, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
+int mc_server_set_display_rotation_ability(mc_server_h server, mc_display_rotation_e rotation, mc_ability_support_e support)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       gboolean find = FALSE;
+       media_controller_server_s *mc_server = (media_controller_server_s *)server;
+
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+
+       if (rotation & MC_DISPLAY_ROTATION_NONE) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_NONE, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (rotation & MC_DISPLAY_ROTATION_90) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_90, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (rotation & MC_DISPLAY_ROTATION_180) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_180, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       if (rotation & MC_DISPLAY_ROTATION_270) {
+               find = TRUE;
+               ret = __mc_server_update_ability(server, DISPLAY_ROTATION_ABILITY + MC_DISPLAY_ROTATION_270, support, FALSE);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Failed to __mc_server_update_ability");
+       }
+
+       mc_retvm_if(!find, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid rotation");
+
+       ret = mc_db_update_ability_supported(mc_server->server_name, mc_server->basic_ability);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_db_update_ability_supported");
+
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_DP_ROTATION_ABILITY, 0, 0, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+
+       return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
 int mc_server_create(mc_server_h *server)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -1193,6 +1517,33 @@ int mc_server_create(mc_server_h *server)
                return ret;
        }
 
+       /* Set default value of a ability to Support No. Only for added from Tizen 5.5*/
+       ret = mc_server_set_ability_support(mc_server, MC_ABILITY_SUBTITLES, MC_ABILITY_SUPPORTED_NO);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to set subtitles ability [%d]", ret);
+       ret = mc_server_set_ability_support(mc_server, MC_ABILITY_360_MODE, MC_ABILITY_SUPPORTED_NO);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to set 360 mode ability [%d]", ret);
+
+       ret = mc_server_set_display_mode_ability(mc_server,
+               MC_DISPLAY_MODE_LETTER_BOX |MC_DISPLAY_MODE_ORIGIN_SIZE | MC_DISPLAY_MODE_FULL_SCREEN | MC_DISPLAY_MODE_CROPPED_FULL, MC_ABILITY_SUPPORTED_NO);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to set display mode ability [%d]", ret);
+
+       ret = mc_server_set_display_rotation_ability(mc_server,
+               MC_DISPLAY_ROTATION_NONE |MC_DISPLAY_ROTATION_90 | MC_DISPLAY_ROTATION_180 | MC_DISPLAY_ROTATION_270, MC_ABILITY_SUPPORTED_NO);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to set display rotation ability [%d]", ret);
+
+       /* Set default value of display*/
+       ret = mc_server_update_display_mode(mc_server, MC_DISPLAY_MODE_FULL_SCREEN);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to mc_server_update_display_mode [%d]", ret);
+
+       ret = mc_server_update_display_rotation(mc_server, MC_DISPLAY_ROTATION_NONE);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               mc_error("fail to mc_server_update_display_rotation [%d]", ret);
+
        ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE, MC_SERVER_STATE_ACTIVATE, 0, NULL);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                mc_error("Error __mc_server_send_message [%d]", ret);
index c929bc2494a4edabf30e393d40287f961c899eec..99736ef29c16c47477d16c726ac43e01e56bae5b 100644 (file)
@@ -231,6 +231,16 @@ gboolean _mc_util_is_valid_playback_action(mc_playback_action_e action)
        return TRUE;
 }
 
+gboolean _mc_util_is_valid_display_mode(mc_display_mode_e mode)
+{
+       if ((mode < MC_DISPLAY_MODE_LETTER_BOX) || (mode > MC_DISPLAY_MODE_CROPPED_FULL)) {
+               mc_error("Invalid mode [%d]", mode);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
 gboolean _mc_util_is_valid_subscription_type(const mc_subscription_type_e subscription_type)
 {
        if ((subscription_type < MC_SUBSCRIPTION_TYPE_SERVER_STATE) || (subscription_type > MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT)) {
index 7eec6ad094bde80d805338b5b3a1ef81a3fb0ebc..8bf18948ef9356e4f8294ac3218fc8f0bcd0a7f8 100644 (file)
@@ -410,10 +410,23 @@ int mc_db_util_create_tables(sqlite3 *handle)
        SQLITE3_SAFE_FREE(sql_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "create app_list table failed [%d]", ret);
 
-       sql_str = sqlite3_mprintf("CREATE TABLE IF NOT EXISTS %s(name TEXT PRIMARY KEY, server_state INTEGER DEFAULT 1,\
-               playback_state INTEGER DEFAULT 0, playback_position INTEGER DEFAULT 0,\
-               playlist_name TEXT, playlist_index TEXT, playback_content_type INTEGER DEFAULT 4, age_rating INTEGER DEFAULT 0,\
-               shuffle_mode INTEGER DEFAULT 1, repeat_mode INTEGER DEFAULT 1, icon_uri TEXT, ability_decided INTEGER DEFAULT 0, ability_supported INTEGER DEFAULT 0)",
+       sql_str = sqlite3_mprintf("CREATE TABLE IF NOT EXISTS %s( \
+               name TEXT PRIMARY KEY, \
+               server_state INTEGER DEFAULT 1, \
+               playback_state INTEGER DEFAULT 0, \
+               playback_position INTEGER DEFAULT 0, \
+               playlist_name TEXT, playlist_index TEXT, \
+               playback_content_type INTEGER DEFAULT 4, \
+               age_rating INTEGER DEFAULT 0, \
+               shuffle_mode INTEGER DEFAULT 1, \
+               repeat_mode INTEGER DEFAULT 1, \
+               icon_uri TEXT, \
+               subtitles_mode INTEGER DEFAULT 0, \
+               display_mode INTEGER DEFAULT 0, \
+               display_rotation INTEGER DEFAULT 0, \
+               spherical_mode INTEGER DEFAULT 0, \
+               ability_decided INTEGER DEFAULT 0, \
+               ability_supported INTEGER DEFAULT 0)",
                MC_DB_TABLE_SERVER_INFO);
 
        ret = mc_db_util_update_db(handle, sql_str);
@@ -743,6 +756,46 @@ int mc_db_parse_and_update_db(uid_t uid, const char *data, int data_size)
 
                sql_str = sqlite3_mprintf("DELETE FROM %q WHERE server_name=%Q and playlist_name=%Q", MC_DB_TABLE_PLAYLIST, params[1], params[2]);
 
+       } else if (strncmp(MC_DB_CMD_UPDATE_SUBTITLES, params[0], strlen(MC_DB_CMD_UPDATE_SUBTITLES)) == 0) {
+               if (!params[2]) {
+                       mc_error("invalid query");
+                       g_strfreev(params);
+                       return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+               }
+
+               mc_safe_strtoi(params[2], &i_value);
+               sql_str = sqlite3_mprintf("UPDATE %q SET subtitles_mode=%d WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, i_value, params[1]);
+
+       } else if (strncmp(MC_DB_CMD_UPDATE_DISPLAY_MODE, params[0], strlen(MC_DB_CMD_UPDATE_DISPLAY_MODE)) == 0) {
+               if (!params[2]) {
+                       mc_error("invalid query");
+                       g_strfreev(params);
+                       return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+               }
+
+               mc_safe_strtoi(params[2], &i_value);
+               sql_str = sqlite3_mprintf("UPDATE %q SET display_mode=%d WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, i_value, params[1]);
+
+       } else if (strncmp(MC_DB_CMD_UPDATE_DISPLAY_ROTATION, params[0], strlen(MC_DB_CMD_UPDATE_DISPLAY_ROTATION)) == 0) {
+               if (!params[2]) {
+                       mc_error("invalid query");
+                       g_strfreev(params);
+                       return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+               }
+
+               mc_safe_strtoi(params[2], &i_value);
+               sql_str = sqlite3_mprintf("UPDATE %q SET display_rotation=%d WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, i_value, params[1]);
+
+       } else if (strncmp(MC_DB_CMD_UPDATE_360, params[0], strlen(MC_DB_CMD_UPDATE_360)) == 0) {
+               if (!params[2]) {
+                       mc_error("invalid query");
+                       g_strfreev(params);
+                       return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+               }
+
+               mc_safe_strtoi(params[2], &i_value);
+               sql_str = sqlite3_mprintf("UPDATE %q SET spherical_mode=%d WHERE name=%Q", MC_DB_TABLE_SERVER_INFO, i_value, params[1]);
+
        } else {
                mc_error("invalid request [%s]", params[0]);
                g_strfreev(params);
index 92df4a2e025d2920653583aac996baedf3b5faaa..801497d5eac48a6f9c25751aa7922e0fffd6d27b 100755 (executable)
@@ -55,6 +55,10 @@ typedef enum {
        TEST_REQ_PLAYLIST_CMD,
        TEST_REQ_CUSTOM_CMD,
        TEST_REQ_SEARCH_CMD,
+       TEST_REQ_SUBTITLES_CMD,
+       TEST_REQ_360_CMD,
+       TEST_REQ_DP_MODE_CMD,
+       TEST_REQ_DP_ROTATION_CMD,
        TEST_REQ_MAX,
 } test_req_e;
 static char *g_request_id[TEST_REQ_MAX];
@@ -340,6 +344,93 @@ static void __mc_ability_updated_cb(const char *server_name, mc_ability_e abilit
        mc_debug("[Client:%s] ability[%d][%d] updated from server[%s]", _client->client_name, ability, support, server_name);
 }
 
+static void __mc_get_display_mode_ability(unsigned int supported_modes)
+{
+       if (supported_modes & MC_DISPLAY_MODE_LETTER_BOX)
+               g_print("MC_DISPLAY_MODE_LETTER_BOX [supported] \n");
+       else
+               g_print("MC_DISPLAY_MODE_LETTER_BOX [not supported] \n");
+
+       if (supported_modes & MC_DISPLAY_MODE_ORIGIN_SIZE)
+               g_print("MC_DISPLAY_MODE_ORIGIN_SIZE [supported] \n");
+       else
+               g_print("MC_DISPLAY_MODE_ORIGIN_SIZE [not supported] \n");
+
+       if (supported_modes & MC_DISPLAY_MODE_FULL_SCREEN)
+               g_print("MC_DISPLAY_MODE_FULL_SCREEN [supported] \n");
+       else
+               g_print("MC_DISPLAY_MODE_FULL_SCREEN [not supported] \n");
+
+       if (supported_modes & MC_DISPLAY_MODE_CROPPED_FULL)
+               g_print("MC_DISPLAY_MODE_CROPPED_FULL [supported] \n");
+       else
+               g_print("MC_DISPLAY_MODE_CROPPED_FULL [not supported] \n");
+}
+
+static void __mc_display_mode_ability_updated_cb(const char *server_name, unsigned int supported_modes, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] display_mode_ability(%x) updated from server[%s]", _client->client_name, supported_modes, server_name);
+
+       __mc_get_display_mode_ability(supported_modes);
+}
+
+static void __mc_get_display_rotation_ability(unsigned int supported_rotations)
+{
+       if (supported_rotations & MC_DISPLAY_ROTATION_NONE)
+               g_print("MC_DISPLAY_ROTATION_NONE [supported] \n");
+       else
+               g_print("MC_DISPLAY_ROTATION_NONE [not supported] \n");
+
+       if (supported_rotations & MC_DISPLAY_ROTATION_90)
+               g_print("MC_DISPLAY_ROTATION_90 [supported] \n");
+       else
+               g_print("MC_DISPLAY_ROTATION_90 [not supported] \n");
+
+       if (supported_rotations & MC_DISPLAY_ROTATION_180)
+               g_print("MC_DISPLAY_ROTATION_180 [supported] \n");
+       else
+               g_print("MC_DISPLAY_ROTATION_180 [not supported] \n");
+
+       if (supported_rotations & MC_DISPLAY_ROTATION_270)
+               g_print("MC_DISPLAY_ROTATION_270 [supported] \n");
+       else
+               g_print("MC_DISPLAY_ROTATION_270 [not supported] \n");
+}
+
+static void __mc_display_rotation_ability_updated_cb(const char *server_name, unsigned int supported_rotations, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] display_rotation_ability(0x%x) updated from server[%s]", _client->client_name, supported_rotations, server_name);
+
+       __mc_get_display_rotation_ability(supported_rotations);
+}
+
+static void __mc_subtitles_updated_cb(const char *server_name, bool enabled, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] subtitles mode(%d) updated from server[%s]", _client->client_name, enabled, server_name);
+}
+
+static void __mc_display_mode_updated_cb(const char *server_name, mc_display_mode_e mode, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] display mode(%d) updated from server[%s]", _client->client_name, mode, server_name);
+}
+
+static void __mc_display_rotation_updated_cb(const char *server_name, mc_display_rotation_e rotation, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] display rotation(%d) updated from server[%s]", _client->client_name, rotation, server_name);
+}
+
+static void __mc_360_mode_updated_cb(const char *server_name, bool enabled, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+       mc_debug("[Client:%s] 360 mode(%d) updated from server[%s]", _client->client_name, enabled, server_name);
+}
+
+
 static gboolean _create()
 {
        g_print("== create \n");
@@ -412,6 +503,24 @@ static gboolean _set_callback()
        ret = mc_client_set_ability_support_updated_cb(g_mc_client, __mc_ability_updated_cb, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_ability_support_updated_cb [%d]", ret);
 
+       ret = mc_client_set_display_mode_ability_updated_cb(g_mc_client, __mc_display_mode_ability_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_display_mode_ability_updated_cb [%d]", ret);
+
+       ret = mc_client_set_display_rotation_ability_updated_cb(g_mc_client, __mc_display_rotation_ability_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_display_rotation_ability_updated_cb [%d]", ret);
+
+       ret = mc_client_set_subtitles_updated_cb(g_mc_client, __mc_subtitles_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_subtitles_updated_cb [%d]", ret);
+
+       ret = mc_client_set_display_mode_updated_cb(g_mc_client, __mc_display_mode_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_display_mode_updated_cb [%d]", ret);
+
+       ret = mc_client_set_display_rotation_updated_cb(g_mc_client, __mc_display_rotation_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_display_rotation_updated_cb [%d]", ret);
+
+       ret = mc_client_set_360_mode_updated_cb(g_mc_client, __mc_360_mode_updated_cb, NULL);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_360_mode_updated_cb [%d]", ret);
+
        mc_debug_fleave();
 
        return ret;
@@ -451,7 +560,13 @@ static gboolean _unset_callback()
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playback_ability_updated_cb [%d]", ret);
 
        ret = mc_client_unset_ability_support_updated_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to unset position ability updated cb [%d]", ret);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_ability_support_updated_cb [%d]", ret);
+
+       ret = mc_client_unset_display_mode_ability_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_display_mode_ability_updated_cb [%d]", ret);
+
+       ret = mc_client_unset_display_rotation_ability_updated_cb(g_mc_client);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_display_rotation_ability_updated_cb [%d]", ret);
 
        mc_debug_fleave();
 
@@ -497,7 +612,9 @@ static gboolean _get_info(int type)
        unsigned long long playback_position;
        mc_metadata_h metadata;
        mc_shuffle_mode_e shuffle_mode;
-       mc_repeat_mode_e repeate_mode;
+       mc_repeat_mode_e repeat_mode;
+       mc_display_mode_e display_mode;
+       mc_display_rotation_e display_rotation;
        char *playlist_name = NULL;
        char *index = NULL;
        mc_content_type_e content_type = MC_CONTENT_TYPE_UNDECIDED;
@@ -506,6 +623,8 @@ static gboolean _get_info(int type)
        mc_ability_support_e support = MC_ABILITY_SUPPORTED_UNDECIDED;
        unsigned int idx = 0;
        int item_cnt = 0;
+       unsigned int display_ability = 0;
+       bool b_value = 0;
 
        mc_debug_fenter();
 
@@ -560,15 +679,14 @@ static gboolean _get_info(int type)
                ret = mc_client_get_server_shuffle_mode(g_mc_client, g_server_name, &shuffle_mode);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_shuffle_mode [%d]", ret);
 
-               g_print("shuffle mode: %d", shuffle_mode);
-               break;
-       case 5:
-               ret = mc_client_get_server_repeat_mode(g_mc_client, g_server_name, &repeate_mode);
+               g_print("shuffle mode: %d \n", shuffle_mode);
+
+               ret = mc_client_get_server_repeat_mode(g_mc_client, g_server_name, &repeat_mode);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_repeat_mode [%d]", ret);
 
-               g_print("repeate mode: %d", repeate_mode);
+               g_print("repeat mode: %d \n", repeat_mode);
                break;
-       case 6:
+       case 5:
                ret = mc_playlist_get_playlist_count(g_server_name, &item_cnt);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_playlist_get_playlist_count [%d]", ret);
 
@@ -578,15 +696,34 @@ static gboolean _get_info(int type)
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_playlist [%d]", ret);
 
                break;
-       case 7:
+       case 6:
                ret = mc_client_get_server_icon(g_mc_client, g_server_name, &icon_url);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_icon [%d]", ret);
 
-               g_print("icon url: %s", icon_url);
+               g_print("icon url: %s \n", icon_url);
+               MC_SAFE_FREE(icon_url);
 
-               MC_SAFE_FREE(index);
+               ret = mc_client_get_server_subtitles_enabled(g_mc_client, g_server_name, &b_value);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_subtitles_enabled [%d]", ret);
+
+               g_print("subtitles enabled: %d \n", b_value);
+
+               ret = mc_client_get_server_360_mode_enabled(g_mc_client, g_server_name, &b_value);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_360_mode_enabled [%d]", ret);
+
+               g_print("360 mode enabled: %d \n", b_value);
+
+               ret = mc_client_get_server_display_mode(g_mc_client, g_server_name, &display_mode);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_display_mode [%d]", ret);
+
+               g_print("display_mode: %d \n", display_mode);
+
+               ret = mc_client_get_server_display_rotation(g_mc_client, g_server_name, &display_rotation);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_display_rotation [%d]", ret);
+
+               g_print("display_rotation: %d \n", display_rotation);
                break;
-       case 8:
+       case 7:
                ret = mc_client_get_server_playback_ability(g_mc_client, g_server_name, &ability);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_playback_ability [%d]", ret);
 
@@ -631,6 +768,27 @@ static gboolean _get_info(int type)
 
                g_print("search_ability: %d \n", support);
 
+               ret = mc_client_get_server_ability_support(g_mc_client, g_server_name, MC_ABILITY_SUBTITLES, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get subtitles ability [%d]", ret);
+
+               g_print("subtitles_ability: %d \n", support);
+
+               ret = mc_client_get_server_ability_support(g_mc_client, g_server_name, MC_ABILITY_360_MODE, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get 360 mode ability [%d]", ret);
+
+               g_print("360_ability: %d \n", support);
+
+               ret = mc_client_get_server_display_mode_ability(g_mc_client, g_server_name, &display_ability);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_display_mode_ability [%d]", ret);
+
+               g_print("display_mode_ability: %x \n", display_ability);
+               __mc_get_display_mode_ability(display_ability);
+
+               ret = mc_client_get_server_display_rotation_ability(g_mc_client, g_server_name, &display_ability);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_display_rotation_ability [%d]", ret);
+
+               g_print("display_rotation_ability: %x \n", display_ability);
+               __mc_get_display_rotation_ability(display_ability);
                break;
        default:
                g_print("== unknown type!\n");
@@ -740,6 +898,30 @@ static gboolean _send()
 
        bundle_free(bundle_data);
 
+       ret = mc_client_send_subtitles_cmd(g_mc_client, g_server_name, TRUE, &g_request_id[TEST_REQ_SUBTITLES_CMD]);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send subtitles command [%d]\n", ret);
+       else
+               g_print("Success in sending subtitles command [%d]\n", ret);
+
+       ret = mc_client_send_360_mode_cmd(g_mc_client, g_server_name, FALSE, &g_request_id[TEST_REQ_360_CMD]);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send 360 mode command [%d]\n", ret);
+       else
+               g_print("Success in sending 360 mode command [%d]\n", ret);
+
+       ret = mc_client_send_display_mode_cmd(g_mc_client, g_server_name, MC_DISPLAY_MODE_ORIGIN_SIZE, &g_request_id[TEST_REQ_DP_MODE_CMD]);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send display mode command [%d]\n", ret);
+       else
+               g_print("Success in sending display mode command [%d]\n", ret);
+
+       ret = mc_client_send_display_rotation_cmd(g_mc_client, g_server_name, MC_DISPLAY_ROTATION_270, &g_request_id[TEST_REQ_DP_ROTATION_CMD]);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send display rotation command [%d]\n", ret);
+       else
+               g_print("Success in sending display rotation command [%d]\n", ret);
+
        ret = mc_search_destroy(mc_search);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                mc_error("Fail to mc_search_destroy [%d]\n", ret);
@@ -889,11 +1071,10 @@ static void display_information_menu(void)
        g_print("1. get latest server info \n");
        g_print("2. get latest server playback \n");
        g_print("3. get latest server metadata \n");
-       g_print("4. get latest server shuffle mode \n");
-       g_print("5. get latest server repeate mode \n");
-       g_print("6. get latest server playlist \n");
-       g_print("7. get latest servericon URL \n");
-       g_print("8. get latest server ability \n");
+       g_print("4. get latest server shuffle / repeat mode \n");
+       g_print("5. get latest server playlist \n");
+       g_print("6. get latest server icon URL / subtitles / 360 mode / display mode / display rotation \n");
+       g_print("7. get latest server ability \n");
        g_print("0. back \n");
        g_print("----------------------------------------------------\n");
        g_print("====================================================\n");
index 172aaa6e28453619d6ec89b6d13c74c288df0fd3..c6b0f814e46dfe92860fe68efc1a7841099f6326 100755 (executable)
@@ -42,6 +42,7 @@ static mc_shuffle_mode_e g_shuffle_mode;
 static mc_repeat_mode_e g_repeat_mode;
 static mc_playlist_update_mode_e g_playlist_mode;
 static mc_ability_support_e g_ability_support;
+static bool g_mode;
 
 
 /* for sending event */
@@ -246,6 +247,54 @@ static void __search_cmd_received_cb(const char *client_name, const char *reques
        }
 }
 
+static void __subtitles_cmd_received_cb(const char *client_name, const char *request_id, bool enable, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       g_print("[%s] recieved subtitles mode:[%d] from [%s]\n", request_id, enable, client_name);
+
+       if (request_id != NULL) {
+               ret = mc_server_send_cmd_reply(g_mc_server, client_name, request_id, 0, NULL);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       g_print("Fail to mc_server_send_cmd_reply\n");
+       }
+}
+
+static void __display_mode_cmd_received_cb(const char *client_name, const char *request_id, mc_display_mode_e display_mode, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       g_print("[%s] recieved display mode:[%d] from [%s]\n", request_id, display_mode, client_name);
+
+       if (request_id != NULL) {
+               ret = mc_server_send_cmd_reply(g_mc_server, client_name, request_id, 0, NULL);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       g_print("Fail to mc_server_send_cmd_reply\n");
+       }
+}
+
+static void __display_rotation_cmd_received_cb(const char *client_name, const char *request_id, mc_display_rotation_e display_rotation, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       g_print("[%s] recieved display rotation:[%d] from [%s]\n", request_id, display_rotation, client_name);
+
+       if (request_id != NULL) {
+               ret = mc_server_send_cmd_reply(g_mc_server, client_name, request_id, 0, NULL);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       g_print("Fail to mc_server_send_cmd_reply\n");
+       }
+}
+
+static void __360_mode_cmd_received_cb(const char *client_name, const char *request_id, bool enable, void *user_data)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       g_print("[%s] recieved 360 mode:[%d] from [%s]\n", request_id, enable, client_name);
+
+       if (request_id != NULL) {
+               ret = mc_server_send_cmd_reply(g_mc_server, client_name, request_id, 0, NULL);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       g_print("Fail to mc_server_send_cmd_reply\n");
+       }
+}
+
 static bool __server_playlist_item_cb(const char *index, mc_metadata_h meta, void *user_data)
 {
        mc_debug("playlist index [%s]", index);
@@ -570,6 +619,30 @@ static gboolean __set_cb()
                return FALSE;
        }
 
+       ret = mc_server_set_subtitles_cmd_received_cb(g_mc_server, __subtitles_cmd_received_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               g_print("Fail to set mc_server_set_subtitles_cmd_received_cb");
+               return FALSE;
+       }
+
+       ret = mc_server_set_display_mode_cmd_received_cb(g_mc_server, __display_mode_cmd_received_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               g_print("Fail to set mc_server_set_display_mode_cmd_received_cb");
+               return FALSE;
+       }
+
+       ret = mc_server_set_display_rotation_cmd_received_cb(g_mc_server, __display_rotation_cmd_received_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               g_print("Fail to set mc_server_set_display_rotation_cmd_received_cb");
+               return FALSE;
+       }
+
+       ret = mc_server_set_360_mode_cmd_received_cb(g_mc_server, __360_mode_cmd_received_cb, NULL);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               g_print("Fail to set mc_server_set_360_mode_cmd_received_cb");
+               return FALSE;
+       }
+
        g_print("== success set default callback \n");
 
        return TRUE;
@@ -691,7 +764,12 @@ static gboolean __set_info(int type, char *cmd)
 static gboolean __update_info(int type)
 {
        g_print(" == update information \n");
-       int ret;
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+
+       if (g_mode == true)
+               g_mode = false;
+       else
+               g_mode = true;
 
        switch (type) {
        case 1:
@@ -749,6 +827,34 @@ static gboolean __update_info(int type)
                        return FALSE;
                }
                break;
+       case 7:
+               ret = mc_server_update_subtitles_enabled(g_mc_server, g_mode);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to mc_server_update_subtitles_enabled. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+       case 8:
+               ret = mc_server_update_display_mode(g_mc_server, MC_DISPLAY_MODE_ORIGIN_SIZE);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to mc_server_update_display_mode. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+       case 9:
+               ret = mc_server_update_display_rotation(g_mc_server, MC_DISPLAY_ROTATION_180);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to mc_server_update_display_rotation. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+       case 10:
+               ret = mc_server_update_360_mode_enabled(g_mc_server, g_mode);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to mc_server_update_360_mode_enabled. err=%d", ret);
+                       return FALSE;
+               }
+               break;
        default:
                g_print(" == unknown type!\n");
                return TRUE;
@@ -882,9 +988,13 @@ static void __display_update_info_menu(void)
        g_print("1. update server playback \n");
        g_print("2. update server metadata \n");
        g_print("3. update server shuffle mode \n");
-       g_print("4. update server repeate mode \n");
+       g_print("4. update server repeat mode \n");
        g_print("5. update playlist \n");
        g_print("6. update icon uri \n");
+       g_print("7. update subtitles \n");
+       g_print("8. update display mode \n");
+       g_print("9. update display rotation \n");
+       g_print("10. update 360 mode \n");
        g_print("0. back \n");
        g_print("----------------------------------------------------\n");
        g_print("====================================================\n");
@@ -938,6 +1048,10 @@ static void __display_ability_menu(void)
        g_print("5. update playlist ability \n");
        g_print("6. update custom ability \n");
        g_print("7. update search ability \n");
+       g_print("8. update subtitles ability \n");
+       g_print("9. update 360 content ability \n");
+       g_print("10. update display mode ability \n");
+       g_print("11. update display rotation ability \n");
        g_print("0. back \n");
        g_print("----------------------------------------------------\n");
        g_print("====================================================\n");
@@ -984,7 +1098,7 @@ static void __interpret_update_info_menu(char *cmd)
 {
        int len = strlen(cmd);
 
-       if (len == 1) {
+       if (len == 1 || len == 2) {
                if (!strncmp(cmd, "1", len))
                        __update_info(1);
                else if (!strncmp(cmd, "2", len))
@@ -997,6 +1111,14 @@ static void __interpret_update_info_menu(char *cmd)
                        __update_info(5);
                else if (!strncmp(cmd, "6", len))
                        __update_info(6);
+               else if (!strncmp(cmd, "7", len))
+                       __update_info(7);
+               else if (!strncmp(cmd, "8", len))
+                       __update_info(8);
+               else if (!strncmp(cmd, "9", len))
+                       __update_info(9);
+               else if (!strncmp(cmd, "10", len))
+                       __update_info(10);
                else if (!strncmp(cmd, "0", len))
                        __reset_current_menu_state();
                else
@@ -1079,6 +1201,39 @@ static gboolean __update_ability(int type)
                        return FALSE;
                }
                break;
+
+       case 8:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_SUBTITLES, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set search ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 9:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_360_MODE, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set search ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 10:
+               ret = mc_server_set_display_mode_ability(g_mc_server, MC_DISPLAY_ROTATION_NONE | MC_DISPLAY_ROTATION_90 | MC_DISPLAY_ROTATION_180 | MC_DISPLAY_ROTATION_270, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set display rotation ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 11:
+               ret = mc_server_set_display_rotation_ability(g_mc_server, MC_DISPLAY_ROTATION_NONE | MC_DISPLAY_ROTATION_90 | MC_DISPLAY_ROTATION_180 | MC_DISPLAY_ROTATION_270, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set display rotation ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
        default:
                g_print(" == unknown type!\n");
                return TRUE;
@@ -1091,30 +1246,10 @@ static gboolean __update_ability(int type)
 
 static void __interpret_update_ability_menu(char *cmd)
 {
-       int len = strlen(cmd);
-
-       if (len == 1) {
-               if (!strncmp(cmd, "1", len))
-                       __update_ability(1);
-               else if (!strncmp(cmd, "2", len))
-                       __update_ability(2);
-               else if (!strncmp(cmd, "3", len))
-                       __update_ability(3);
-               else if (!strncmp(cmd, "4", len))
-                       __update_ability(4);
-               else if (!strncmp(cmd, "5", len))
-                       __update_ability(5);
-               else if (!strncmp(cmd, "6", len))
-                       __update_ability(6);
-               else if (!strncmp(cmd, "7", len))
-                       __update_ability(7);
-               else if (!strncmp(cmd, "0", len))
-                       __reset_current_menu_state();
-               else
-                       g_print("wrong command\n");
-       } else {
-               g_print("wrong command\n");
-       }
+       if (!strncmp(cmd, "0", 1))
+               __reset_current_menu_state();
+       else
+               __update_ability(atoi(cmd));
 }
 
 static void __interpret_set_info_menu(char *cmd)
@@ -1362,6 +1497,7 @@ int main(int argc, char **argv)
        g_repeat_mode = MC_REPEAT_MODE_OFF;
        g_playlist_mode = MC_PLAYLIST_REMOVED;
        g_ability_support = MC_ABILITY_SUPPORTED_UNDECIDED;
+       g_mode = true;
 
        mainloop = g_main_loop_new(NULL, FALSE);