[ACR-1428] Add functions for ability 50/210450/27 accepted/tizen/unified/20190813.082345 submit/tizen/20190813.013835
authorhj kim <backto.kim@samsung.com>
Fri, 19 Jul 2019 07:08:33 +0000 (16:08 +0900)
committerhj kim <backto.kim@samsung.com>
Fri, 9 Aug 2019 02:26:13 +0000 (02:26 +0000)
Change-Id: Ice6c525465f6e741ceb483a39f9c78585c4d3903

12 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
test/client_test/media_controller_client_test.c
test/server_test/media_controller_server_test.c

index c45f680..15dd1f2 100644 (file)
@@ -39,7 +39,7 @@ extern "C" {
  */
 
 /**
- * @brief Called when updating status of the media controller server.
+ * @brief Called when the status of the media controller server is updated.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -57,7 +57,7 @@ extern "C" {
 typedef void (*mc_server_state_updated_cb)(const char *server_name, mc_server_state_e state, void *user_data);
 
 /**
- * @brief Called when updating the playback information of the media controller server.
+ * @brief Called when the playback information of the media controller server is updated.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -79,7 +79,7 @@ typedef void (*mc_server_state_updated_cb)(const char *server_name, mc_server_st
 typedef void (*mc_playback_updated_cb)(const char *server_name, mc_playback_h playback, void *user_data);
 
 /**
- * @brief Called when updating the metadata of the media controller server.
+ * @brief Called when the metadata of the media controller server is updated.
  * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -99,7 +99,7 @@ typedef void (*mc_playback_updated_cb)(const char *server_name, mc_playback_h pl
 typedef void (*mc_metadata_updated_cb)(const char *server_name, mc_metadata_h metadata, void *user_data);
 
 /**
- * @brief Called when updating the shuffle mode of the media controller server.
+ * @brief Called when the shuffle mode of the media controller server is updated.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -117,7 +117,7 @@ typedef void (*mc_metadata_updated_cb)(const char *server_name, mc_metadata_h me
 typedef void (*mc_shuffle_mode_updated_cb)(const char *server_name, mc_shuffle_mode_e mode, void *user_data);
 
 /**
- * @brief Called when updating the repeat mode of the media controller server.
+ * @brief Called when the repeat mode of the media controller server is updated.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -135,7 +135,7 @@ typedef void (*mc_shuffle_mode_updated_cb)(const char *server_name, mc_shuffle_m
 typedef void (*mc_repeat_mode_updated_cb)(const char *server_name, mc_repeat_mode_e mode, void *user_data);
 
 /**
- * @brief Called when updating the playback ability of the media controller server.
+ * @brief Called when the playback ability support of the media controller server is updated.
  * @since_tizen 5.0
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -155,7 +155,8 @@ typedef void (*mc_repeat_mode_updated_cb)(const char *server_name, mc_repeat_mod
 typedef void (*mc_playback_ability_updated_cb)(const char *server_name, mc_playback_ability_h ability, void *user_data);
 
 /**
- * @brief Called when updating the shuffle ability of the media controller server.
+ * @deprecated Deprecated since 5.5. Use mc_ability_support_updated_cb() instead.
+ * @brief Called when the shuffle ability support of the media controller server is updated.
  * @since_tizen 5.0
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -170,10 +171,11 @@ typedef void (*mc_playback_ability_updated_cb)(const char *server_name, mc_playb
  *
  * @see mc_client_set_shuffle_ability_updated_cb()
  */
-typedef void (*mc_shuffle_ability_updated_cb)(const char *server_name, mc_ability_support_e support, void *user_data);
+typedef void (*mc_shuffle_ability_updated_cb)(const char *server_name, mc_ability_support_e support, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
- * @brief Called when updating the repeat ability of the media controller server.
+ * @deprecated Deprecated since 5.5. Use mc_ability_support_updated_cb() instead.
+ * @brief Called when the repeat ability of the media controller server is updated.
  * @since_tizen 5.0
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -188,9 +190,24 @@ typedef void (*mc_shuffle_ability_updated_cb)(const char *server_name, mc_abilit
  *
  * @see mc_client_set_repeat_ability_updated_cb()
  */
+typedef void (*mc_repeat_ability_updated_cb)(const char *server_name, mc_ability_support_e support, void *user_data) TIZEN_DEPRECATED_API;
 
-typedef void (*mc_repeat_ability_updated_cb)(const char *server_name, mc_ability_support_e support, void *user_data);
-
+/**
+ * @brief Called when a media controller server's support 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] ability The ability
+ * @param[in] support The support value of the ability of the updated media controller server
+ * @param[in] user_data        The user data passed from the callback function
+ *
+ * @see mc_client_set_ability_support_updated_cb()
+ */
+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 requesting the list of created servers.
@@ -254,7 +271,7 @@ typedef void (*mc_cmd_reply_received_cb)(const char *server_name, const char *re
 typedef bool (*mc_subscribed_server_cb)(const char *server_name, void *user_data);
 
 /**
- * @brief Called when updating the playlist of the media controller server.
+ * @brief Called when the playlist of the media controller server is updated.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
  *
  * @remarks The callback is called in the dbus event loop.\n
@@ -597,6 +614,7 @@ int mc_client_set_playback_ability_updated_cb(mc_client_h client, mc_playback_ab
 int mc_client_unset_playback_ability_updated_cb(mc_client_h client);
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_set_ability_support_updated_cb() instead.
  * @brief Sets the callback for monitoring the shuffle 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.0
@@ -619,9 +637,10 @@ int mc_client_unset_playback_ability_updated_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_shuffle_ability_updated_cb(mc_client_h client, mc_shuffle_ability_updated_cb callback, void *user_data);
+int mc_client_set_shuffle_ability_updated_cb(mc_client_h client, mc_shuffle_ability_updated_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_unset_ability_support_updated_cb() instead.
  * @brief Unsets the callback for monitoring the shuffle ability of the media controller server.
  * @since_tizen 5.0
  *
@@ -640,9 +659,10 @@ int mc_client_set_shuffle_ability_updated_cb(mc_client_h client, mc_shuffle_abil
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_shuffle_ability_updated_cb(mc_client_h client);
+int mc_client_unset_shuffle_ability_updated_cb(mc_client_h client) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_set_ability_support_updated_cb() instead.
  * @brief Sets the callback for monitoring the repeat 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.0
@@ -665,9 +685,10 @@ int mc_client_unset_shuffle_ability_updated_cb(mc_client_h client);
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_set_repeat_ability_updated_cb(mc_client_h client, mc_repeat_ability_updated_cb callback, void *user_data);
+int mc_client_set_repeat_ability_updated_cb(mc_client_h client, mc_repeat_ability_updated_cb callback, void *user_data) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_unset_ability_support_updated_cb() instead.
  * @brief Unsets the callback for monitoring the repeat ability of the media controller server.
  * @since_tizen 5.0
  *
@@ -686,7 +707,73 @@ int mc_client_set_repeat_ability_updated_cb(mc_client_h client, mc_repeat_abilit
  * @see mc_client_create()
  * @see mc_client_destroy()
  */
-int mc_client_unset_repeat_ability_updated_cb(mc_client_h client);
+int mc_client_unset_repeat_ability_updated_cb(mc_client_h client) TIZEN_DEPRECATED_API;
+
+/**
+ * @brief Sets the callback for monitoring the media controller server's support for an ability.
+ * @details The media controller client which calls this function will receive notifications from all media controller servers.
+ *            This function can be used to monitor the following abilities:\n
+ *              #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 monitor the media controller server's support for a playback ability, use mc_client_set_playback_ability_updated_cb().
+ * @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_set_playback_ability_updated_cb()
+ */
+int mc_client_set_ability_support_updated_cb(mc_client_h client, mc_ability_support_updated_cb callback, void *user_data);
+
+/**
+ * @brief Unsets the callback for monitoring the media controller server's support for an ability.
+ * @details The media controller client which calls this function will not receive notifications from all media controller servers.
+ *            This function can be used for the following abilities:\n
+ *              #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 stop monitoring the media controller server's support for a playback ability, use mc_client_unset_playback_ability_updated_cb().
+ * @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_unset_playback_ability_updated_cb()
+ * @see mc_ability_support_updated_cb()
+ */
+int mc_client_unset_ability_support_updated_cb(mc_client_h client);
 
 /**
  * @brief Sets the callback for receiving the result of the command from the media controller server.
@@ -1286,13 +1373,15 @@ int mc_client_get_server_icon(mc_client_h client, const char *server_name, char
 int mc_client_get_server_playback_ability(mc_client_h client, const char *server_name, mc_playback_ability_h *ability);
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_get_ability_support() instead.
  * @brief Gets the support value of the shuffle ability of the updated media controller server.
  * @since_tizen 5.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
- * @remarks If the ability's support is not set, the result value is #MC_ABILITY_SUPPORTED_UNDECIDED.
+ * @remarks If the server's ability support is not set, the result value is #MC_ABILITY_SUPPORTED_UNDECIDED. \n
+ *              It means you can send the corresponding command to the server, but it's not guaranteed that the server can handle it.
  *
  * @param[in] client The handle of the media controller client
  * @param[in] server_name    The app_id of the media controller server
@@ -1312,16 +1401,18 @@ int mc_client_get_server_playback_ability(mc_client_h client, const char *server
  * @see mc_client_get_latest_server_info()
  * @see mc_client_foreach_server()
  */
-int mc_client_get_server_shuffle_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support);
+int mc_client_get_server_shuffle_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_client_get_ability_support() instead.
  * @brief Gets the support value of the repeat ability of the updated media controller server.
  * @since_tizen 5.0
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.client
  *
- * @remarks If the ability's support is not set, the result value is #MC_ABILITY_SUPPORTED_UNDECIDED.
+ * @remarks If the server's ability support is not set, the result value is #MC_ABILITY_SUPPORTED_UNDECIDED. \n
+ *              It means you can send the corresponding command to the server, but it's not guaranteed that the server can handle it.
  *
  * @param[in] client The handle of the media controller client
  * @param[in] server_name    The app_id of the media controller server
@@ -1340,8 +1431,40 @@ int mc_client_get_server_shuffle_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()
+ */
+int mc_client_get_server_repeat_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support) TIZEN_DEPRECATED_API;
+
+/**
+ * @brief Gets the ability support of the media controller server.
+ * @since_tizen 5.5
+ *
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/mediacontroller.client
+ *
+ * @remarks If the server's ability support is not set, the result value is #MC_ABILITY_SUPPORTED_UNDECIDED. \n
+ *              It means you can send the corresponding command to the server, but it's not guaranteed that the server can handle it.
+ *
+ * @param[in] client The handle of the media controller client
+ * @param[in] server_name    The app_id of the media controller server
+ * @param[in] ability The ability
+ * @param[out] 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 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()
  */
-int mc_client_get_server_repeat_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support);
+int mc_client_get_ability_support(mc_client_h client, const char *server_name, mc_ability_e ability, mc_ability_support_e *support);
 
 /**
  * @brief Retrieves all created servers.
index b302f0f..181f8e4 100644 (file)
@@ -40,7 +40,7 @@ int mc_db_get_metadata_info(sqlite3 *handle, const char *server_name, mc_metadat
 int mc_db_get_shuffle_mode(sqlite3 *handle, const char *server_name, mc_shuffle_mode_e *mode);
 int mc_db_get_repeat_mode(sqlite3 *handle, const char *server_name, mc_repeat_mode_e *mode);
 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, mc_server_receive_event_e ability, mc_ability_support_e *supported);
+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_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);
index a20743b..2fc36fd 100644 (file)
@@ -188,6 +188,9 @@ extern "C" {
 #define MC_DBUS_SIGNAL_NAME_PLAYBACK_ABILITY                   "playback_ability"
 #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_SEARCH_CMD                         "search_cmd"
 #ifdef TIZEN_FEATURE_COMPATIBILITY
 #define MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD         "pb_state_cmd"
@@ -294,6 +297,7 @@ typedef enum {
        MC_CLIENT_EVENT_PLAYBACK_ABILITY        = MC_SUBSCRIPTION_TYPE_PLAYBACK_ABILITY,
        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_CMD_REPLY,
        MC_CLIENT_EVENT_SERVER_CUSTOM,  //receive event from server to client
 #ifdef TIZEN_FEATURE_COMPATIBILITY
index 476b691..2b5bb15 100755 (executable)
@@ -553,6 +553,8 @@ int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_playback_ability(). 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 playback action from client.
  * @param[in] user_data   The user data to be passed to the callback function
@@ -567,6 +569,8 @@ int mc_server_update_repeat_mode(mc_server_h server, mc_repeat_mode_e mode);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_playback_action_cmd_received_cb()
+ * @see mc_server_set_playback_ability()
  */
 int mc_server_set_playback_action_cmd_received_cb(mc_server_h server, mc_server_playback_action_cmd_received_cb callback, void *user_data);
 
@@ -577,6 +581,8 @@ int mc_server_set_playback_action_cmd_received_cb(mc_server_h server, mc_server_
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_playback_ability(). 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
@@ -588,6 +594,8 @@ int mc_server_set_playback_action_cmd_received_cb(mc_server_h server, mc_server_
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_playback_action_cmd_received_cb()
+ * @see mc_server_set_playback_ability()
  */
 int mc_server_unset_playback_action_cmd_received_cb(mc_server_h server);
 
@@ -598,6 +606,8 @@ int mc_server_unset_playback_action_cmd_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 position command from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -612,6 +622,8 @@ int mc_server_unset_playback_action_cmd_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_playback_position_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_playback_position_cmd_received_cb(mc_server_h server, mc_server_playback_position_cmd_received_cb callback, void *user_data);
 
@@ -622,6 +634,8 @@ int mc_server_set_playback_position_cmd_received_cb(mc_server_h server, mc_serve
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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
@@ -633,6 +647,8 @@ int mc_server_set_playback_position_cmd_received_cb(mc_server_h server, mc_serve
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_playback_position_cmd_received_cb()
+ * @see mc_server_set_playback_ability()
  */
 int mc_server_unset_playback_position_cmd_received_cb(mc_server_h server);
 
@@ -643,6 +659,8 @@ int mc_server_unset_playback_position_cmd_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 shuffle mode from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -657,6 +675,8 @@ int mc_server_unset_playback_position_cmd_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_shuffle_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_shuffle_mode_cmd_received_cb(mc_server_h server, mc_server_shuffle_mode_cmd_received_cb callback, void *user_data);
 
@@ -667,6 +687,8 @@ int mc_server_set_shuffle_mode_cmd_received_cb(mc_server_h server, mc_server_shu
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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
@@ -678,6 +700,8 @@ int mc_server_set_shuffle_mode_cmd_received_cb(mc_server_h server, mc_server_shu
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_shuffle_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_unset_shuffle_mode_cmd_received_cb(mc_server_h server);
 
@@ -688,6 +712,8 @@ int mc_server_unset_shuffle_mode_cmd_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 repeat mode from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -702,6 +728,8 @@ int mc_server_unset_shuffle_mode_cmd_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_repeat_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_repeat_mode_cmd_received_cb(mc_server_h server, mc_server_repeat_mode_cmd_received_cb callback, void *user_data);
 
@@ -712,6 +740,8 @@ int mc_server_set_repeat_mode_cmd_received_cb(mc_server_h server, mc_server_repe
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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
@@ -723,6 +753,8 @@ int mc_server_set_repeat_mode_cmd_received_cb(mc_server_h server, mc_server_repe
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_repeat_mode_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_unset_repeat_mode_cmd_received_cb(mc_server_h server);
 
@@ -733,6 +765,8 @@ int mc_server_unset_repeat_mode_cmd_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 playlist command from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -747,6 +781,8 @@ int mc_server_unset_repeat_mode_cmd_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_playlist_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_playlist_cmd_received_cb(mc_server_h server, mc_server_playlist_cmd_received_cb callback, void *user_data);
 
@@ -757,6 +793,8 @@ int mc_server_set_playlist_cmd_received_cb(mc_server_h server, mc_server_playlis
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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
@@ -768,6 +806,8 @@ int mc_server_set_playlist_cmd_received_cb(mc_server_h server, mc_server_playlis
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_playlist_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_unset_playlist_cmd_received_cb(mc_server_h server);
 
@@ -778,6 +818,8 @@ int mc_server_unset_playlist_cmd_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 custom command from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -792,6 +834,8 @@ int mc_server_unset_playlist_cmd_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_custom_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_custom_cmd_received_cb(mc_server_h server, mc_server_custom_cmd_received_cb callback, void *user_data);
 
@@ -799,6 +843,8 @@ int mc_server_set_custom_cmd_received_cb(mc_server_h server, mc_server_custom_cm
  * @brief Unsets the callback for receiving custom command from client.
  * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). It will let the client know about the server's abilities and what commands the client can send.
+ *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
@@ -813,6 +859,8 @@ int mc_server_set_custom_cmd_received_cb(mc_server_h server, mc_server_custom_cm
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_custom_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_unset_custom_cmd_received_cb(mc_server_h server);
 
@@ -968,6 +1016,8 @@ int mc_server_unset_event_reply_received_cb(mc_server_h server);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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 search command from client
  * @param[in] user_data   The user data to be passed to the callback function
@@ -982,6 +1032,8 @@ int mc_server_unset_event_reply_received_cb(mc_server_h server);
  * @pre Create a media controller server handle by calling mc_server_create().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_unset_search_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_set_search_cmd_received_cb(mc_server_h server, mc_server_search_cmd_received_cb callback, void *user_data);
 
@@ -992,6 +1044,8 @@ int mc_server_set_search_cmd_received_cb(mc_server_h server, mc_server_search_cm
  * @privlevel public
  * @privilege %http://tizen.org/privilege/mediacontroller.server
  *
+ * @remarks It is recommended to set the corresponding ability's support using mc_server_set_ability_support(). 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
@@ -1004,6 +1058,7 @@ int mc_server_set_search_cmd_received_cb(mc_server_h server, mc_server_search_cm
  * @see mc_server_create()
  * @see mc_server_destroy()
  * @see mc_server_set_search_cmd_received_cb()
+ * @see mc_server_set_ability_support()
  */
 int mc_server_unset_search_cmd_received_cb(mc_server_h server);
 
@@ -1187,6 +1242,7 @@ int mc_server_foreach_playlist(mc_server_h server, mc_playlist_cb callback, void
  * @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.
+ *              To notify all clients about the changes of the playback's ability support, use mc_server_update_playback_ability().
  *
  * @param[in] server The handle to media controller server
  * @param[in] action   The playback action
@@ -1203,6 +1259,7 @@ int mc_server_foreach_playlist(mc_server_h server, mc_playlist_cb callback, void
  * @post Update abilities of a media controller server by calling mc_server_update_playback_ability().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_update_playback_ability()
  */
 int mc_server_set_playback_ability(mc_server_h server, mc_playback_action_e action, mc_ability_support_e support);
 
@@ -1227,10 +1284,12 @@ int mc_server_set_playback_ability(mc_server_h server, mc_playback_action_e acti
  * @pre Set abilities of a media controller server by calling mc_server_set_playback_ability().
  * @see mc_server_create()
  * @see mc_server_destroy()
+ * @see mc_server_set_playback_ability()
  */
 int mc_server_update_playback_ability(mc_server_h server);
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_server_set_ability_support() instead.
  * @brief Sets the shuffle ability's support of the media controller.
  * @since_tizen 5.0
  *
@@ -1253,9 +1312,10 @@ int mc_server_update_playback_ability(mc_server_h server);
  * @see mc_server_create()
  * @see mc_server_destroy()
  */
-int mc_server_set_shuffle_ability(mc_server_h server, mc_ability_support_e support);
+int mc_server_set_shuffle_ability(mc_server_h server, mc_ability_support_e support) TIZEN_DEPRECATED_API;
 
 /**
+ * @deprecated Deprecated since 5.5. Use mc_server_set_ability_support() instead.
  * @brief Sets the repeat ability's support of the media controller.
  * @since_tizen 5.0
  *
@@ -1278,7 +1338,43 @@ int mc_server_set_shuffle_ability(mc_server_h server, mc_ability_support_e suppo
  * @see mc_server_create()
  * @see mc_server_destroy()
  */
-int mc_server_set_repeat_ability(mc_server_h server, mc_ability_support_e support);
+int mc_server_set_repeat_ability(mc_server_h server, mc_ability_support_e support) TIZEN_DEPRECATED_API;
+
+/**
+ * @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().
+ * @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.
+ *
+ * @param[in] server The handle to media controller server
+ * @param[in] ability The ability to set support
+ * @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_playback_ability()
+ * @see mc_server_update_playback_ability()
+ */
+int mc_server_set_ability_support(mc_server_h server, mc_ability_e ability, mc_ability_support_e support);
 
 /**
  * @brief Sets the icon URI of media controller server.
index 40f0c30..6629012 100755 (executable)
@@ -184,8 +184,9 @@ typedef enum {
        MC_SUBSCRIPTION_TYPE_REPEAT_MODE,                                       /**< Repeat mode */
        MC_SUBSCRIPTION_TYPE_PLAYLIST,                                          /**< Playlist (Since @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif) */
        MC_SUBSCRIPTION_TYPE_PLAYBACK_ABILITY,                          /**< Playback ability (Since 5.0) */
-       MC_SUBSCRIPTION_TYPE_SHUFFLE_ABILITY,                                   /**< Shuffle ability (Since 5.0) */
-       MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY,                                    /**< Repeat ability (Since 5.0) */
+       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_e;
 
 /**
@@ -247,6 +248,19 @@ typedef enum {
 } mc_ability_support_e;
 
 /**
+ * @brief Enumeration for the ability.
+ * @since_tizen 5.5
+ */
+typedef enum {
+       MC_ABILITY_SHUFFLE,                             /**< Shuffle */
+       MC_ABILITY_REPEAT,                              /**< Repeat */
+       MC_ABILITY_PLAYBACK_POSITION,   /**< Playback Position */
+       MC_ABILITY_PLAYLIST,                    /**< Playlist */
+       MC_ABILITY_CLIENT_CUSTOM,               /**< Custom command from a client */
+       MC_ABILITY_SEARCH,                              /**< Search */
+} mc_ability_e;
+
+/**
  * @brief Enumeration for the search category.
  * @since_tizen 5.0
  */
index 90fced7..1a47cbe 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.2.1
+Version:    0.2.3
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index e9295da..4fbbc75 100644 (file)
@@ -29,8 +29,9 @@ static void __client_playlist_cb(const char *interface_name, const char *signal_
 static void __client_cmd_reply_received_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 static void __client_custom_event_received_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
 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_repeat_ability_cb(const char *interface_name, const char *signal_name, const char *message, const char *request_id, void *user_data);
-static void __client_shuffle_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);
+
 
 #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);
@@ -45,8 +46,9 @@ static mc_cb_event_s cb_event[MC_CLIENT_EVENT_MAX] = {
        {MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT,   __client_repeat_cb},
        {MC_DBUS_SIGNAL_NAME_PLAYLIST,                          __client_playlist_cb},
        {MC_DBUS_SIGNAL_NAME_PLAYBACK_ABILITY,  __client_playback_ability_cb},
-       {MC_DBUS_SIGNAL_NAME_SHUFFLE_ABILITY,           __client_shuffle_ability_cb},
-       {MC_DBUS_SIGNAL_NAME_REPEAT_ABILITY,            __client_repeat_ability_cb},
+       {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_CMD_REPLY,                 __client_cmd_reply_received_cb},
        {MC_DBUS_SIGNAL_NAME_CUSTOM_EVENT,              __client_custom_event_received_cb},
 #ifdef TIZEN_FEATURE_COMPATIBILITY
@@ -300,42 +302,42 @@ static void __client_playback_ability_cb(const char *interface_name, const char
        mc_playback_ability_destroy(ability);
 }
 
-static void __client_shuffle_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)
 {
        gchar **params = NULL;
        media_controller_receiver_s *reciever = (media_controller_receiver_s *)user_data;
        mc_retm_if(reciever == NULL, "reciever is NULL");
 
        mc_shuffle_ability_updated_cb callback = (mc_shuffle_ability_updated_cb)reciever->callback;
-       mc_retm_if(callback == NULL, "shuffle_ability_cb is NULL");
+       mc_retm_if(callback == NULL, "callback is NULL");
        mc_retm_if(message == NULL, "message is NULL");
 
-       mc_secure_debug("__client_shuffle_ability_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
+       mc_secure_debug("__client_ability_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 shuffle ability data");
+       mc_retm_if(params == NULL, "invalid ability data");
 
        callback(params[0], (mc_ability_support_e)atoi(params[1]), reciever->user_data);
 
        g_strfreev(params);
 }
 
-static void __client_repeat_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)
 {
        gchar **params = NULL;
        media_controller_receiver_s *reciever = (media_controller_receiver_s *)user_data;
        mc_retm_if(reciever == NULL, "reciever is NULL");
 
-       mc_repeat_ability_updated_cb callback = (mc_repeat_ability_updated_cb)reciever->callback;
-       mc_retm_if(callback == NULL, "repeat_ability_cb is NULL");
+       mc_ability_support_updated_cb callback = (mc_ability_support_updated_cb)reciever->callback;
+       mc_retm_if(callback == NULL, "callback is NULL");
        mc_retm_if(message == NULL, "message is NULL");
 
-       mc_secure_debug("__client_repeat_ability_cb(%s, %s, %s, %s, %p)", interface_name, signal_name, message, request_id, user_data);
+       mc_secure_debug("__client_ability_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 repeat ability data");
+       mc_retm_if(params == NULL, "invalid ability data");
 
-       callback(params[0], (mc_ability_support_e)atoi(params[1]), reciever->user_data);
+       callback(params[0], (mc_ability_e)atoi(params[1]), (mc_ability_support_e)atoi(params[2]), reciever->user_data);
 
        g_strfreev(params);
 }
@@ -731,24 +733,42 @@ int mc_client_unset_playback_ability_updated_cb(mc_client_h client)
 
 int mc_client_set_shuffle_ability_updated_cb(mc_client_h client, mc_shuffle_ability_updated_cb callback, void *user_data)
 {
+       mc_warning("DEPRECATION WARNING: mc_client_set_shuffle_ability_updated_cb() is deprecated and will be removed from next release. Use mc_client_set_ability_support_updated_cb() instead.");
+
        return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_SHUFFLE_ABILITY, callback, user_data);
 }
 
 int mc_client_unset_shuffle_ability_updated_cb(mc_client_h client)
 {
+       mc_warning("DEPRECATION WARNING: mc_client_unset_shuffle_ability_updated_cb() is deprecated and will be removed from next release. Use mc_client_unset_ability_support_updated_cb() instead.");
+
        return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_SHUFFLE_ABILITY);
 }
 
 int mc_client_set_repeat_ability_updated_cb(mc_client_h client, mc_repeat_ability_updated_cb callback, void *user_data)
 {
+       mc_warning("DEPRECATION WARNING: mc_client_set_repeat_ability_updated_cb() is deprecated and will be removed from next release. Use mc_client_set_ability_support_updated_cb() instead.");
+
        return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_REPEAT_ABILITY, callback, user_data);
 }
 
 int mc_client_unset_repeat_ability_updated_cb(mc_client_h client)
 {
+       mc_warning("DEPRECATION WARNING: mc_client_unset_repeat_ability_updated_cb() is deprecated and will be removed from next release. Use mc_client_unset_ability_support_updated_cb() instead.");
+
        return __mc_client_unset_updated_cb(client, MC_CLIENT_EVENT_REPEAT_ABILITY);
 }
 
+int mc_client_set_ability_support_updated_cb(mc_client_h client, mc_ability_support_updated_cb callback, void *user_data)
+{
+       return __mc_client_set_updated_cb(client, MC_CLIENT_EVENT_ABILITY_SUPPORT, callback, user_data);
+}
+
+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_subscribe(mc_client_h client, const mc_subscription_type_e subscription_type, const char *server_name)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -1047,7 +1067,7 @@ static int __mc_client_verify_ability(mc_client_h client, const char *server_nam
 
        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");
-       mc_retvm_if(supported == MC_ABILITY_SUPPORTED_NO, MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP, "Not Supported ability");
+       mc_retvm_if(supported == MC_ABILITY_SUPPORTED_NO, MEDIA_CONTROLLER_ERROR_ABILITY_LIMITED_BY_SERVER_APP, "Not Supported ability [%d]", ability);
 
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
@@ -1083,6 +1103,9 @@ int mc_client_send_playback_position_cmd(mc_client_h client, const char *server_
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(!MC_STRING_VALID(server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
 
+       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_PLAYBACK_POSITION);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+
        message = g_strdup_printf("%s%s%llu", mc_client->client_name, MC_STRING_DELIMITER, position);
        mc_retvm_if(message == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail making message [%d]", ret);
 
@@ -1102,7 +1125,7 @@ int mc_client_send_shuffle_mode_cmd(mc_client_h client, const char *server_name,
        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_SERVER_EVENT_SHUFFLE);
+       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, shuffle_mode);
@@ -1124,7 +1147,7 @@ int mc_client_send_repeat_mode_cmd(mc_client_h client, const char *server_name,
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        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_SERVER_EVENT_REPEAT);
+       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_REPEAT);
        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, repeat_mode);
@@ -1149,6 +1172,9 @@ int mc_client_send_playlist_cmd(mc_client_h client, const char *server_name, con
        mc_retvm_if(!MC_STRING_VALID(index), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid index");
        mc_retvm_if(!_mc_util_is_valid_playback_action(action), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid action");
 
+       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_PLAYLIST);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+
        message = g_strdup_printf("%s%s%s%s%s%s%d%s%llu", mc_client->client_name, MC_STRING_DELIMITER, playlist_name, MC_STRING_DELIMITER, index, MC_STRING_DELIMITER, action, MC_STRING_DELIMITER, position);
        mc_retvm_if(message == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail making message [%d]", ret);
 
@@ -1169,6 +1195,9 @@ int mc_client_send_custom_cmd(mc_client_h client, const char *server_name, const
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
        mc_retvm_if(!MC_STRING_VALID(server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
 
+       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_CLIENT_CUSTOM);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+
        ret = mc_util_bundle_to_string(data, &bundle_str);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Error when make string from bundle");
 
@@ -1282,6 +1311,9 @@ int mc_client_send_search_cmd(mc_client_h client, const char *server_name, mc_se
        mc_retvm_if(!MC_STRING_VALID(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 server_name");
 
+       ret = __mc_client_verify_ability(client, server_name, MC_ABILITY_SEARCH);
+       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to verify ability");
+
        ret = __mc_client_get_bundle_from_search(search, &bundle_data);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Error __mc_client_get_bundle_from_search [%d]", ret);
 
@@ -1344,34 +1376,38 @@ int mc_client_get_server_playback_ability(mc_client_h client, const char *server
        return ret;
 }
 
-int mc_client_get_server_shuffle_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support)
+static int __mc_client_get_server_ability(mc_client_h client, const char *server_name, mc_ability_e ability, mc_ability_support_e *support)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_client_s *mc_client = (media_controller_client_s *)client;
 
-       mc_retvm_if(client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "client is NULL");
-       mc_retvm_if(support == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "supported is NULL");
+       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);
 
-       ret = mc_db_get_ability_supported(mc_client->db_handle, server_name, MC_SERVER_EVENT_SHUFFLE, support);
+       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);
 
        return ret;
 }
 
-int mc_client_get_server_repeat_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support)
+int mc_client_get_server_shuffle_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support)
 {
-       int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       media_controller_client_s *mc_client = (media_controller_client_s *)client;
+       mc_warning("DEPRECATION WARNING: mc_client_get_server_shuffle_ability_support() is removed from 5.5. Use mc_client_get_ability_support() instead.");
 
-       mc_retvm_if(client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "client is NULL");
-       mc_retvm_if(support == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "supported is NULL");
-       mc_retvm_if(!mc_db_is_exist_server(mc_client->db_handle, server_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server_name");
+       return __mc_client_get_server_ability(client, server_name, MC_ABILITY_SHUFFLE, support);
+}
 
-       ret = mc_db_get_ability_supported(mc_client->db_handle, server_name, MC_SERVER_EVENT_REPEAT, support);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Error mc_db_get_ability_supported [%d]", ret);
+int mc_client_get_server_repeat_ability_support(mc_client_h client, const char *server_name, mc_ability_support_e *support)
+{
+       mc_warning("DEPRECATION WARNING: mc_client_get_server_repeat_ability_support() is removed from 5.5. Use mc_client_get_ability_support() instead.");
 
-       return ret;
+       return __mc_client_get_server_ability(client, server_name, MC_ABILITY_REPEAT, support);
+}
+
+int mc_client_get_ability_support(mc_client_h client, const char *server_name, mc_ability_e ability, mc_ability_support_e *support)
+{
+       return __mc_client_get_server_ability(client, server_name, ability, support);
 }
 
 int mc_client_destroy(mc_client_h client)
@@ -1385,7 +1421,7 @@ int mc_client_destroy(mc_client_h client)
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        /*Unregister all filter listener*/
-       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY; idx++) {
+       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT; idx++) {
                ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->updated_cb[idx].filter_list, NULL, cb_event[idx].signal_name);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                        mc_error("Error __mc_client_unregister_filter_listener [%d]", ret);
index 0289172..5055974 100644 (file)
@@ -396,12 +396,14 @@ static int __mc_db_get_ability(sqlite3 *handle, const char *server_name, unsigne
 
 }
 
-int mc_db_get_ability_supported(sqlite3 *handle, const char *server_name, mc_server_receive_event_e ability, mc_ability_support_e *supported)
+int mc_db_get_ability_supported(sqlite3 *handle, const char *server_name, int ability, mc_ability_support_e *supported)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        unsigned long long _decided = 0;
        unsigned long long _supported = 0;
 
+       mc_retvm_if(!supported, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid supported");
+
        ret = __mc_db_get_ability(handle, server_name, &_decided, &_supported);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "__mc_db_get_ability failed");
 
index 216538d..3ed183a 100644 (file)
@@ -530,7 +530,7 @@ static void __server_search_cmd_cb(const char *interface_name, const char *signa
        mc_search_destroy((mc_search_h)mc_search);
 }
 
-static int __mc_server_send_message(media_controller_server_s *mc_server, const char *interface_name, const char *signal_name, const int param1, const unsigned long long param2, const char* param3)
+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;
        char *message = NULL;
@@ -546,6 +546,8 @@ static int __mc_server_send_message(media_controller_server_s *mc_server, const
                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);
+       else if (!g_strcmp0(MC_DBUS_SIGNAL_NAME_ABILITY_SUPPORT, signal_name))
+               message = g_strdup_printf("%s%s%d%s%d", mc_server->server_name, MC_STRING_DELIMITER, param1, MC_STRING_DELIMITER, param2);
        else
                message = g_strdup_printf("%s%s%d", mc_server->server_name, MC_STRING_DELIMITER, param1);
 
@@ -879,32 +881,28 @@ int mc_server_foreach_playlist(mc_server_h server, mc_playlist_cb callback, void
        return ret;
 }
 
-static int __mc_server_set_ability(mc_server_h server, mc_server_receive_event_e event, mc_ability_support_e support)
+static int __mc_server_set_ability(mc_server_h server, mc_ability_e ability, mc_ability_support_e support)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_server_s *mc_server = (media_controller_server_s *)server;
-       char *ability_signal = NULL;
 
-       switch (event) {
-       case MC_SERVER_EVENT_SHUFFLE:
-               ability_signal = (char *)MC_DBUS_SIGNAL_NAME_SHUFFLE_ABILITY;
-               break;
+       mc_retvm_if(((ability < MC_ABILITY_SHUFFLE) || (ability > MC_ABILITY_SEARCH)) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid ability [%d]", ability);
 
-       case MC_SERVER_EVENT_REPEAT:
-               ability_signal = (char *)MC_DBUS_SIGNAL_NAME_REPEAT_ABILITY;
-               break;
-
-       default:
-               mc_error("Not supported event [%d]", event);
-               return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
-       }
-
-       ret = __mc_server_update_ability(server, event, support, TRUE);
+       ret = __mc_server_update_ability(server, ability, support, TRUE);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_update_ability");
 
-       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, ability_signal, support, 0, NULL);
+       ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_ABILITY_SUPPORT, ability, support, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
 
+       /*To Support Deprecated ability for shuffle and repeat*/
+       if (ability == MC_ABILITY_SHUFFLE) {
+               ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SHUFFLE_ABILITY, support, 0, NULL);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+       } else if (ability == MC_ABILITY_REPEAT) {
+               ret = __mc_server_send_message(mc_server, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_REPEAT_ABILITY, support, 0, NULL);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to __mc_server_send_message");
+       }
+
        return ret;
 }
 
@@ -1117,8 +1115,8 @@ static int __mc_server_update_ability(mc_server_h server, int support_item, mc_a
 {
        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(((support != MC_ABILITY_SUPPORTED_YES) && (support != MC_ABILITY_SUPPORTED_NO)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "support is invalid [%d]", support);
+       mc_retvm_if(!mc_server, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid server");
+       mc_retvm_if(((support != MC_ABILITY_SUPPORTED_YES) && (support != MC_ABILITY_SUPPORTED_NO)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid suupport [%d]", support);
 
        /* Change decided bit to 1(set) */
        _mc_util_set_bit(support_item, TRUE, &mc_server->basic_ability.decided);
@@ -1160,12 +1158,19 @@ int mc_server_update_playback_ability(mc_server_h server)
 
 int mc_server_set_shuffle_ability(mc_server_h server, mc_ability_support_e support)
 {
-       return __mc_server_set_ability(server, MC_SERVER_EVENT_SHUFFLE, support);
+       mc_warning("DEPRECATION WARNING: mc_server_set_shuffle_ability() is removed from 5.5. Use mc_server_set_ability_support() instead.");
+       return __mc_server_set_ability(server, MC_ABILITY_SHUFFLE, support);
 }
 
 int mc_server_set_repeat_ability(mc_server_h server, mc_ability_support_e support)
 {
-       return __mc_server_set_ability(server, MC_SERVER_EVENT_REPEAT, support);
+       mc_warning("DEPRECATION WARNING: mc_server_set_repeat_ability() is removed from 5.5. Use mc_server_set_ability_support() instead.");
+       return __mc_server_set_ability(server, MC_ABILITY_REPEAT, support);
+}
+
+int mc_server_set_ability_support(mc_server_h server, mc_ability_e ability, mc_ability_support_e support)
+{
+       return __mc_server_set_ability(server, ability, support);
 }
 
 int mc_server_create(mc_server_h *server)
index 1d9a395..c929bc2 100644 (file)
@@ -233,7 +233,7 @@ 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)
 {
-       if ((subscription_type < MC_SUBSCRIPTION_TYPE_SERVER_STATE) || (subscription_type > MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY)) {
+       if ((subscription_type < MC_SUBSCRIPTION_TYPE_SERVER_STATE) || (subscription_type > MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT)) {
                mc_error("Invalid subscription_type [%d]", subscription_type);
                return FALSE;
        }
index 09ceaf4..305ef94 100755 (executable)
@@ -230,19 +230,11 @@ void _mc_playlist_updated_cb(const char *server_name, mc_playlist_update_mode_e
        }
 }
 
-bool _mc_activated_server_cb(const char *server_name, void *user_data)
+static bool __mc_activated_server_cb(const char *server_name, void *user_data)
 {
        media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
        mc_debug("[Client:%s] Activated server_name: %s", _client->client_name, server_name);
 
-       mc_ability_support_e supported = MC_ABILITY_SUPPORTED_UNDECIDED;
-
-       mc_client_get_server_shuffle_ability_support(g_mc_client, server_name, &supported);
-       g_print("== shuffle ability %d \n", supported);
-
-       mc_client_get_server_repeat_ability_support(g_mc_client, server_name, &supported);
-       g_print("== repeat ability %d \n", supported);
-
        return TRUE;
 }
 
@@ -329,18 +321,25 @@ void _mc_playback_ability_updated_cb(const char *server_name, mc_playback_abilit
        }
 }
 
-void _mc_shuffle_ability_updated_cb(const char *server_name, mc_ability_support_e support, void *user_data)
+static void __mc_shuffle_ability_updated_cb(const char *server_name, mc_ability_support_e support, void *user_data)
 {
        media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
        mc_debug("[Client:%s] shuffle_ability(%d) updated from server[%s]", _client->client_name, support, server_name);
 }
 
-void _mc_repeat_ability_updated_cb(const char *server_name, mc_ability_support_e support, void *user_data)
+static void __mc_repeat_ability_updated_cb(const char *server_name, mc_ability_support_e support, void *user_data)
 {
        media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
        mc_debug("[Client:%s] repeat_ability(%d) updated from server[%s]", _client->client_name, support, server_name);
 }
 
+static void __mc_ability_updated_cb(const char *server_name, mc_ability_e ability, mc_ability_support_e support, void *user_data)
+{
+       media_controller_client_s *_client = (media_controller_client_s *)g_mc_client;
+
+       mc_debug("[Client:%s] ability[%d][%d] updated from server[%s]", _client->client_name, ability, support, server_name);
+}
+
 static gboolean _create()
 {
        g_print("== create \n");
@@ -361,7 +360,7 @@ static gboolean _foreach()
        g_print("== create \n");
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
 
-       ret = mc_client_foreach_server(g_mc_client, _mc_activated_server_cb, NULL);
+       ret = mc_client_foreach_server(g_mc_client, __mc_activated_server_cb, NULL);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                g_print("Fail to foreach media contoller client");
                return FALSE;
@@ -404,12 +403,15 @@ static gboolean _set_callback()
        ret = mc_client_set_playback_ability_updated_cb(g_mc_client, _mc_playback_ability_updated_cb, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_playback_ability_updated_cb [%d]", ret);
 
-       ret = mc_client_set_shuffle_ability_updated_cb(g_mc_client, _mc_shuffle_ability_updated_cb, NULL);
+       ret = mc_client_set_shuffle_ability_updated_cb(g_mc_client, __mc_shuffle_ability_updated_cb, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_shuffle_ability_updated_cb [%d]", ret);
 
-       ret = mc_client_set_repeat_ability_updated_cb(g_mc_client, _mc_repeat_ability_updated_cb, NULL);
+       ret = mc_client_set_repeat_ability_updated_cb(g_mc_client, __mc_repeat_ability_updated_cb, NULL);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_set_repeat_ability_updated_cb [%d]", ret);
 
+       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);
+
        mc_debug_fleave();
 
        return ret;
@@ -448,11 +450,8 @@ static gboolean _unset_callback()
        ret = mc_client_unset_playback_ability_updated_cb(g_mc_client);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_playback_ability_updated_cb [%d]", ret);
 
-       ret = mc_client_unset_shuffle_ability_updated_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_shuffle_ability_updated_cb [%d]", ret);
-
-       ret = mc_client_unset_repeat_ability_updated_cb(g_mc_client);
-       mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_unset_repeat_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_debug_fleave();
 
@@ -602,16 +601,36 @@ static gboolean _get_info(int type)
                ret = mc_playback_ability_destroy(ability);
                mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_playback_ability_destroy [%d]", ret);
 
-               ret = mc_client_get_server_shuffle_ability_support(g_mc_client, g_server_name, &support);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_shuffle_ability_support [%d]", ret);
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_SHUFFLE, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get shuffle ability [%d]", ret);
 
                g_print("shuffle_ability: %d \n", support);
 
-               ret = mc_client_get_server_repeat_ability_support(g_mc_client, g_server_name, &support);
-               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to mc_client_get_server_repeat_ability_support [%d]", ret);
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_REPEAT, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get repeat ability [%d]", ret);
 
                g_print("repeat_ability: %d \n", support);
 
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_PLAYBACK_POSITION, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get playback position ability [%d]", ret);
+
+               g_print("position_ability: %d \n", support);
+
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_PLAYLIST, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get playlist ability [%d]", ret);
+
+               g_print("playlist_ability: %d \n", support);
+
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_CLIENT_CUSTOM, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get client custom ability [%d]", ret);
+
+               g_print("custom_ability: %d \n", support);
+
+               ret = mc_client_get_ability_support(g_mc_client, g_server_name, MC_ABILITY_SEARCH, &support);
+               mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, FALSE, "Fail to get search ability [%d]", ret);
+
+               g_print("search_ability: %d \n", support);
+
                break;
        default:
                g_print("== unknown type!\n");
@@ -628,34 +647,36 @@ static gboolean _send()
        g_print("== send command to latest server \n");
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        bundle *bundle_data = NULL;
+       unsigned int i = 0;
 
        if (g_playback_action == MC_PLAYBACK_ACTION_PLAY)
-               g_playback_action = MC_PLAYBACK_ACTION_STOP;
+               g_playback_action = MC_PLAYBACK_ACTION_PAUSE;
        else
                g_playback_action = MC_PLAYBACK_ACTION_PLAY;
 
        ret = mc_client_send_playback_action_cmd(g_mc_client, g_server_name, g_playback_action, &g_request_id[TEST_REQ_PB_ACT_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               g_print("Fail to send playback action command [%d]", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send playback action command [%d]\n", ret);
+       else
+               g_print("Success in sending playback action command [%d]\n", ret);
 
        g_playback_position += 1000;
        ret = mc_client_send_playback_position_cmd(g_mc_client, g_server_name, g_playback_position, &g_request_id[TEST_REQ_PB_POS_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               g_print("Fail to send playback position command [%d]", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send playback position command [%d]\n", ret);
+       else
+               g_print("Success in sending playback position command [%d]\n", ret);
+
 
        if (g_shuffle_mode == MC_SHUFFLE_MODE_OFF)
                g_shuffle_mode = MC_SHUFFLE_MODE_ON;
        else
                g_shuffle_mode = MC_SHUFFLE_MODE_OFF;
        ret = mc_client_send_shuffle_mode_cmd(g_mc_client, g_server_name, g_shuffle_mode, &g_request_id[TEST_REQ_SHUFFLE_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               g_print("Fail to send shuffle mode command [%d]", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send shuffle mode command [%d]\n", ret);
+       else
+               g_print("Success in sending shuffle mode command [%d]\n", ret);
 
        if (g_repeat_mode == MC_REPEAT_MODE_OFF)
                g_repeat_mode = MC_REPEAT_MODE_ON;
@@ -663,17 +684,17 @@ static gboolean _send()
                g_repeat_mode = MC_REPEAT_MODE_OFF;
 
        ret = mc_client_send_repeat_mode_cmd(g_mc_client, g_server_name, g_repeat_mode, &g_request_id[TEST_REQ_REPEAT_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               g_print("Fail to send shuffle mode command [%d]", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send repeat mode command [%d]\n", ret);
+       else
+               g_print("Success in sending repeat mode command [%d]\n", ret);
 
        if (g_playlist_name != NULL) {
                ret = mc_client_send_playlist_cmd(g_mc_client, g_server_name, g_playlist_name, "1", MC_PLAYBACK_ACTION_PLAY, 300, &g_request_id[TEST_REQ_PLAYLIST_CMD]);
-               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-                       g_print("Fail to send play playlist item [%d]", ret);
-                       return FALSE;
-               }
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+                       g_print("Fail to send playlist command [%d]\n", ret);
+               else
+                       g_print("Success in sending playlist command [%d]\n", ret);
        }
 
        struct timespec reqtime;
@@ -688,11 +709,11 @@ static gboolean _send()
        bundle_add_str(bundle_data, "key4", "val4_2");
 
        ret = mc_client_send_custom_cmd(g_mc_client, g_server_name, "Custom Command2", bundle_data, &g_request_id[TEST_REQ_CUSTOM_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               bundle_free(bundle_data);
-               mc_error("Fail to send custom command %d", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send custom command [%d]\n", ret);
+       else
+               g_print("Success in sending custom command [%d]\n", ret);
+
        bundle_free(bundle_data);
 
        /*Send Search Command*/
@@ -703,7 +724,7 @@ static gboolean _send()
 
        ret = mc_search_create(&mc_search);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Fail mc_search_create [%d]", ret);
+               mc_error("Fail mc_search_create [%d]\n", ret);
                bundle_free(bundle_data);
                return FALSE;
        }
@@ -712,22 +733,19 @@ static gboolean _send()
        ret = mc_search_set_condition(mc_search, MC_CONTENT_TYPE_VIDEO, MC_SEARCH_GENRE, "search genre 4", bundle_data);
 
        ret = mc_client_send_search_cmd(g_mc_client, g_server_name, mc_search, &g_request_id[TEST_REQ_SEARCH_CMD]);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               bundle_free(bundle_data);
-               mc_search_destroy(mc_search);
-               mc_error("Fail to send search command %d", ret);
-               return FALSE;
-       }
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE)
+               g_print("Fail to send search command [%d]\n", ret);
+       else
+               g_print("Success in sending search command [%d]\n", ret);
 
        bundle_free(bundle_data);
 
        ret = mc_search_destroy(mc_search);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Fail to mc_search_destroy [%d]", ret);
+               mc_error("Fail to mc_search_destroy [%d]\n", ret);
                return FALSE;
        }
 
-       unsigned int i = 0;
        for (i = 0; i < TEST_REQ_MAX; i++)
                mc_error("[No-Errror][%02u][Id:%s]", i, g_request_id[i]);
 
@@ -743,7 +761,7 @@ static gboolean _subscribe()
 
        mc_debug_fenter();
 
-       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY; idx++) {
+       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT; idx++) {
                ret = mc_client_subscribe(g_mc_client, idx, g_server_name);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                        g_print("Fail to mc_client_subscribe");
@@ -763,7 +781,7 @@ static gboolean _unsubscribe()
 
        mc_debug_fenter();
 
-       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_REPEAT_ABILITY; idx++) {
+       for (idx = 0; idx <= MC_SUBSCRIPTION_TYPE_ABILITY_SUPPORT; idx++) {
                ret = mc_client_unsubscribe(g_mc_client, idx, g_server_name);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                        g_print("Fail to mc_client_unsubscribe");
@@ -1037,7 +1055,7 @@ int client_sequential_test(void)
                return MEDIA_CONTROLLER_ERROR_NONE;
 
        /*Get Foreach server*/
-       ret = mc_client_foreach_server(g_mc_client, _mc_activated_server_cb, NULL);
+       ret = mc_client_foreach_server(g_mc_client, __mc_activated_server_cb, NULL);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                g_print("Fail to mc_client_foreach_server\n");
 
index e832d92..172aaa6 100755 (executable)
@@ -63,6 +63,7 @@ enum {
        CURRENT_STATE_MAIN_MENU,
        CURRENT_STATE_INFORMATION_SET_MENU,
        CURRENT_STATE_INFORMATION_UPDATE_MENU,
+       CURRENT_STATE_ABILITY_UPDATE_MENU,
        CURRENT_STATE_SEND_EVENT_MENU,
 };
 
@@ -748,45 +749,6 @@ static gboolean __update_info(int type)
                        return FALSE;
                }
                break;
-       case 7:
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PLAY, MC_ABILITY_SUPPORTED_YES);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PAUSE, MC_ABILITY_SUPPORTED_NO);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_STOP, MC_ABILITY_SUPPORTED_YES);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_NEXT, MC_ABILITY_SUPPORTED_NO);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PREV, MC_ABILITY_SUPPORTED_YES);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_FAST_FORWARD, MC_ABILITY_SUPPORTED_NO);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_REWIND, MC_ABILITY_SUPPORTED_YES);
-               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_TOGGLE_PLAY_PAUSE, MC_ABILITY_SUPPORTED_NO);
-               ret = mc_server_update_playback_ability(g_mc_server);
-               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-                       g_print("Fail to mc_server_update_playback_ability. err=%d", ret);
-                       return FALSE;
-               }
-               break;
-       case 8:
-               if (g_ability_support != MC_ABILITY_SUPPORTED_YES)
-                       g_ability_support = MC_ABILITY_SUPPORTED_YES;
-               else
-                       g_ability_support = MC_ABILITY_SUPPORTED_NO;
-
-               ret = mc_server_set_shuffle_ability(g_mc_server, g_ability_support);
-               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-                       g_print("Fail to mc_server_set_shuffle_ability. err=%d", ret);
-                       return FALSE;
-               }
-               break;
-       case 9:
-               if (g_ability_support != MC_ABILITY_SUPPORTED_YES)
-                       g_ability_support = MC_ABILITY_SUPPORTED_YES;
-               else
-                       g_ability_support = MC_ABILITY_SUPPORTED_NO;
-
-               ret = mc_server_set_repeat_ability(g_mc_server, g_ability_support);
-               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-                       g_print("Fail to mc_server_set_repeat_ability. err=%d", ret);
-                       return FALSE;
-               }
-               break;
        default:
                g_print(" == unknown type!\n");
                return TRUE;
@@ -923,9 +885,6 @@ static void __display_update_info_menu(void)
        g_print("4. update server repeate mode \n");
        g_print("5. update playlist \n");
        g_print("6. update icon uri \n");
-       g_print("7. update playback ability \n");
-       g_print("8. update shuffle ability \n");
-       g_print("9. update repeat ability \n");
        g_print("0. back \n");
        g_print("----------------------------------------------------\n");
        g_print("====================================================\n");
@@ -966,6 +925,25 @@ static void __display_send_menu(void)
 
 }
 
+static void __display_ability_menu(void)
+{
+       g_print("\n");
+       g_print("====================================================\n");
+       g_print("    media controller test(server): Update ability menu\n");
+       g_print("----------------------------------------------------\n");
+       g_print("1. update playback ability \n");
+       g_print("2. update shuffle ability \n");
+       g_print("3. update repeat ability \n");
+       g_print("4. update position support\n");
+       g_print("5. update playlist ability \n");
+       g_print("6. update custom ability \n");
+       g_print("7. update search ability \n");
+       g_print("0. back \n");
+       g_print("----------------------------------------------------\n");
+       g_print("====================================================\n");
+
+}
+
 static void __display_main_menu(void)
 {
        g_print("\n");
@@ -976,6 +954,7 @@ static void __display_main_menu(void)
        g_print("2. set default command callback \n");
        g_print("3. set information to client \n");
        g_print("4. update information to client \n");
+       g_print("5. update ability to client \n");
        g_print("6. send event to client \n");
        g_print("9. destroy media controller server \n");
        g_print("0. quit \n");
@@ -992,6 +971,8 @@ static void __display_menu(void)
                __display_set_info_menu();
        else if (g_menu_state == CURRENT_STATE_INFORMATION_UPDATE_MENU)
                __display_update_info_menu();
+       else if (g_menu_state == CURRENT_STATE_ABILITY_UPDATE_MENU)
+               __display_ability_menu();
        else if (g_menu_state == CURRENT_STATE_SEND_EVENT_MENU)
                __display_send_menu();
        else
@@ -1016,14 +997,121 @@ static void __interpret_update_info_menu(char *cmd)
                        __update_info(5);
                else if (!strncmp(cmd, "6", len))
                        __update_info(6);
+               else if (!strncmp(cmd, "0", len))
+                       __reset_current_menu_state();
+               else
+                       g_print("wrong command\n");
+       } else {
+               g_print("wrong command\n");
+       }
+}
+
+static gboolean __update_ability(int type)
+{
+       g_print(" == update ability \n");
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+
+       if (g_ability_support != MC_ABILITY_SUPPORTED_YES)
+               g_ability_support = MC_ABILITY_SUPPORTED_YES;
+       else
+               g_ability_support = MC_ABILITY_SUPPORTED_NO;
+
+       switch (type) {
+       case 1:
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PLAY, MC_ABILITY_SUPPORTED_YES);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PAUSE, MC_ABILITY_SUPPORTED_NO);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_STOP, MC_ABILITY_SUPPORTED_YES);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_NEXT, MC_ABILITY_SUPPORTED_NO);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_PREV, MC_ABILITY_SUPPORTED_YES);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_FAST_FORWARD, MC_ABILITY_SUPPORTED_NO);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_REWIND, MC_ABILITY_SUPPORTED_YES);
+               ret = mc_server_set_playback_ability(g_mc_server, MC_PLAYBACK_ACTION_TOGGLE_PLAY_PAUSE, MC_ABILITY_SUPPORTED_NO);
+               ret = mc_server_update_playback_ability(g_mc_server);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to mc_server_update_playback_ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+       case 2:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_SHUFFLE, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set shuffle ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 3:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_REPEAT, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set repeat ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 4:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_PLAYBACK_POSITION, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set position ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 5:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_PLAYLIST, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set playlist ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 6:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_CLIENT_CUSTOM, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set custom ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+
+       case 7:
+               ret = mc_server_set_ability_support(g_mc_server, MC_ABILITY_SEARCH, g_ability_support);
+               if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+                       g_print("Fail to set search ability. err=%d", ret);
+                       return FALSE;
+               }
+               break;
+       default:
+               g_print(" == unknown type!\n");
+               return TRUE;
+       }
+
+       g_print(" == success update ability \n");
+
+       return TRUE;
+}
+
+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_info(7);
-               else if (!strncmp(cmd, "8", len))
-                       __update_info(8);
-               else if (!strncmp(cmd, "9", len))
-                       __update_info(9);
+                       __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");
        }
@@ -1051,13 +1139,17 @@ static void __interpret_set_info_menu(char *cmd)
                else if (!strncmp(cmd, "0", len)) {
                        __reset_current_menu_state();
                        __display_menu();
+               } else {
+                       g_print("wrong command\n");
+                       __display_menu();
                }
        } else {
                g_print("wrong command\n");
+               __display_menu();
        }
 }
 
-static void __interpret_send_menu(char *cmd)
+static void __interpret_send_event_menu(char *cmd)
 {
        int len = strlen(cmd);
 
@@ -1075,9 +1167,13 @@ static void __interpret_send_menu(char *cmd)
                } else if (!strncmp(cmd, "0", len)) {
                        __reset_current_menu_state();
                        __display_menu();
+               } else {
+                       g_print("wrong command\n");
+                       __display_menu();
                }
        } else {
                g_print("wrong command\n");
+               __display_menu();
        }
 }
 
@@ -1094,6 +1190,8 @@ static void __interpret_main_menu(char *cmd)
                        g_menu_state = CURRENT_STATE_INFORMATION_SET_MENU;
                else if (!strncmp(cmd, "4", len))
                        g_menu_state = CURRENT_STATE_INFORMATION_UPDATE_MENU;
+               else if (!strncmp(cmd, "5", len))
+                       g_menu_state = CURRENT_STATE_ABILITY_UPDATE_MENU;
                else if (!strncmp(cmd, "6", len))
                        g_menu_state = CURRENT_STATE_SEND_EVENT_MENU;
                else if (!strncmp(cmd, "9", len))
@@ -1129,7 +1227,9 @@ static void __interpret_cmd(char *cmd)
                        __set_info(g_menu_set_state, cmd);
                        __reset_current_set_menu_state();
                        __display_menu();
+                       break;
                default:
+                       __display_menu();
                        break;
                }
                break;
@@ -1137,10 +1237,14 @@ static void __interpret_cmd(char *cmd)
                __interpret_update_info_menu(cmd);
                __display_menu();
                break;
+       case CURRENT_STATE_ABILITY_UPDATE_MENU:
+               __interpret_update_ability_menu(cmd);
+               __display_menu();
+               break;
        case CURRENT_STATE_SEND_EVENT_MENU:
                switch (g_menu_send_event) {
                case 0:
-                       __interpret_send_menu(cmd);
+                       __interpret_send_event_menu(cmd);
                        break;
                case 2:
                        __send_event(g_menu_send_event, cmd);