Modify external storage scan 12/47412/2 accepted/tizen/mobile/20150904.064323 accepted/tizen/tv/20150904.064337 accepted/tizen/wearable/20150904.064349 submit/tizen/20150904.055949
authorMinje Ahn <minje.ahn@samsung.com>
Thu, 3 Sep 2015 07:25:29 +0000 (16:25 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Thu, 3 Sep 2015 13:11:24 +0000 (22:11 +0900)
Change-Id: I4f21c56647d716fc2b7ccfe233c29c507b954d1e
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
30 files changed:
CMakeLists.txt
include/media_audio.h
include/media_bookmark.h
include/media_content.h
include/media_content_internal.h
include/media_content_type.h
include/media_filter.h
include/media_folder.h
include/media_group.h
include/media_image.h
include/media_info.h
include/media_info_private.h
include/media_playlist.h
include/media_storage.h
include/media_tag.h
include/media_util_private.h
include/media_video.h
packaging/capi-content-media-content.spec
src/media_audio.c
src/media_bookmark.c
src/media_content.c
src/media_db.c
src/media_folder.c
src/media_image.c
src/media_info.c
src/media_playlist.c
src/media_storage.c
src/media_tag.c
src/media_util_private.c
src/media_video.c

index 2f8d8f6..3f2bf0d 100755 (executable)
@@ -9,7 +9,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(dependents "dlog libmedia-service media-thumbnail libmedia-utils capi-base-common")
+SET(dependents "dlog libmedia-service media-thumbnail libmedia-utils capi-base-common vconf")
 SET(pc_dependents "dlog capi-base-common")
 
 INCLUDE(FindPkgConfig)
index 16164c4..2766578 100755 (executable)
@@ -40,7 +40,7 @@ extern "C" {
 
 /**
  * @brief Destroys the audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] audio The audio metadata handle
  *
@@ -61,7 +61,7 @@ int audio_meta_destroy(audio_meta_h audio);
  * @brief Clones the audio metadata.
  * @details This function copies the audio metadata handle from source to destination.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks The destination handle must be released using audio_meta_destroy().
  *
@@ -82,7 +82,7 @@ int audio_meta_clone(audio_meta_h *dst, audio_meta_h src);
 
 /**
  * @brief Gets the audio ID of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a media_id using free().
  *
@@ -103,7 +103,7 @@ int audio_meta_get_media_id(audio_meta_h audio, char **media_id);
  * @brief Gets the album name of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album_name using free().
  *
@@ -124,7 +124,7 @@ int audio_meta_get_album(audio_meta_h audio, char **album_name);
  * @brief Gets the artist name of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a artist_name using free().
  *
@@ -145,7 +145,7 @@ int audio_meta_get_artist(audio_meta_h audio, char **artist_name);
  * @brief Gets the album artist name of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album_artist_name using free().
  *
@@ -166,7 +166,7 @@ int audio_meta_get_album_artist(audio_meta_h audio, char **album_artist_name);
  * @brief Gets the genre name of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a genre_name using free().
  *
@@ -187,7 +187,7 @@ int audio_meta_get_genre(audio_meta_h audio, char **genre_name);
  * @brief Gets the composer name of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a author_name using free().
  *
@@ -208,7 +208,7 @@ int audio_meta_get_composer(audio_meta_h audio, char **composer_name);
  * @brief Gets the year of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a year using free().
  *
@@ -227,7 +227,7 @@ int audio_meta_get_year(audio_meta_h audio, char **year);
 
 /**
  * @brief Gets the recorded date of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a recorded_date using free().
  *
@@ -246,7 +246,7 @@ int audio_meta_get_recorded_date(audio_meta_h audio, char **recorded_date);
 
 /**
  * @brief Gets the copyright notice of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a copyright using free().
  *
@@ -267,7 +267,7 @@ int audio_meta_get_copyright(audio_meta_h audio, char **copyright);
  * @brief Gets the track number of the given audio metadata.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio     The audio metadata handle
  * @param[out] track_num The audio track number
@@ -283,7 +283,7 @@ int audio_meta_get_track_num(audio_meta_h audio, char **track_num);
 
 /**
  * @brief Gets the bitrate of the given audio metadata in bitrate per second.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio    The audio metadata handle
  * @param[out] bit_rate The audio bitrate in bit per second [bps]
@@ -299,7 +299,7 @@ int audio_meta_get_bit_rate(audio_meta_h audio, int *bit_rate);
 
 /**
  * @brief Gets bit per sample of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param [in]  audio        The handle to the audio metadata
  * @param [out] bitpersample The audio bit per sample
@@ -316,7 +316,7 @@ int audio_meta_get_bitpersample(audio_meta_h audio, int *bitpersample);
 
 /**
  * @brief Gets the sample rate of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio       The audio metadata handle
  * @param[out] sample_rate The audio sample rate[hz]
@@ -332,7 +332,7 @@ int audio_meta_get_sample_rate(audio_meta_h audio, int *sample_rate);
 
 /**
  * @brief Gets the channel of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio   The audio metadata handle
  * @param[out] channel The channel of the audio
@@ -348,7 +348,7 @@ int audio_meta_get_channel(audio_meta_h audio, int *channel);
 
 /**
  * @brief Gets the track duration of the given audio metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio    The audio metadata handle
  * @param[out] duration The audio file duration
@@ -365,7 +365,7 @@ int audio_meta_get_duration(audio_meta_h audio, int *duration);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_get_played_count() instead]
  * @brief Gets the number of times the given audio has been played.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio        The audio metadata handle
  * @param[out] played_count The counter of the audio played
@@ -385,7 +385,7 @@ int audio_meta_get_played_count(audio_meta_h audio, int *played_count);
  * @details This function returns audio's elapsed playback time parameter as a period
  *          starting from the beginning of the track.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio       The audio metadata handle
  * @param[out] played_time The elapsed time of the audio
@@ -405,7 +405,7 @@ int audio_meta_get_played_time(audio_meta_h audio, time_t *played_time);
  * @details This function returns audio's elapsed playback position parameter as a period
  *          starting from the beginning of the track.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  audio           The audio metadata handle
  * @param[out] played_position The elapsed time of the audio
@@ -422,7 +422,7 @@ int audio_meta_get_played_position(audio_meta_h audio, int *played_position);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_increase_played_count() instead]
  * @brief Sets the played count to an audio meta handle.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] audio        The audio metadata handle
  * @param[in] played_count The played count of the audio
@@ -441,7 +441,7 @@ int audio_meta_set_played_count(audio_meta_h audio, int played_count);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_set_played_time() instead]
  * @brief Sets the played time to an audio meta handle.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] audio       The audio metadata handle
  * @param[in] played_time The played time of the audio
@@ -460,7 +460,7 @@ int audio_meta_set_played_time(audio_meta_h audio, time_t played_time);
 /**
  * @deprecated Deprecated since 2.4.
  * @brief Sets the played position to an audio meta handle.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks  It is NOT recommended to use this attribute for your application-specific purpose because this attribute can be overwritten by other applications (even 0).
  *
@@ -482,7 +482,7 @@ int audio_meta_set_played_position(audio_meta_h audio, int played_position);
  * @brief Updates an audio metadata with modified attributes in the media database.
  * @details The function updates the given audio meta in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
  *
index d83092b..c5b4009 100755 (executable)
@@ -39,7 +39,7 @@ extern "C" {
 
 /**
  * @brief Inserts a new bookmark in media on the specified time offset to the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -69,7 +69,7 @@ int media_bookmark_insert_to_db(const char *media_id, time_t time, const char *t
 
 /**
  * @brief Removes a media bookmark from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -96,7 +96,7 @@ int media_bookmark_delete_from_db(int bookmark_id);
 
 /**
  * @brief Gets the number of bookmarks with an optional filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter         The handle to the media filter
  * @param[out] bookmark_count The count of the media bookmark
@@ -122,7 +122,7 @@ int media_bookmark_get_bookmark_count_from_db(filter_h filter, int *bookmark_cou
  *          The media_bookmark_h is created internally and available through media bookmark foreach function such as media_info_foreach_bookmark_from_db().
  *          To use this handle outside of these foreach functions, use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks The destination handle must be released using media_bookmark_destroy().
  *
@@ -148,7 +148,7 @@ int media_bookmark_clone(media_bookmark_h *dst, media_bookmark_h src);
  *          no longer can be used to perform any operation. A new handle has to
  *          be created before the next use.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] bookmark The handle to media bookmark
  *
@@ -167,7 +167,7 @@ int media_bookmark_destroy(media_bookmark_h bookmark);
 
 /**
  * @brief Gets the bookmark ID.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  bookmark    The handle to media bookmark
  * @param[out] bookmark_id The media bookmark ID
@@ -186,7 +186,7 @@ int media_bookmark_get_bookmark_id(media_bookmark_h bookmark, int *bookmark_id);
  * @details This function returns time offset in milliseconds from beginning of the movie on which bookmark
  *          was placed.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  bookmark    The handle to media bookmark
  * @param[out] marked_time The bookmark time offset (in milliseconds)
@@ -202,7 +202,7 @@ int media_bookmark_get_marked_time(media_bookmark_h bookmark, time_t *marked_tim
 
 /**
  * @brief Gets the media bookmark thumbnail.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a path using free().
  *
index 6423e5f..800e4f6 100755 (executable)
@@ -50,7 +50,7 @@ extern "C" {
  * @brief Connects to the media content service.
  * @details Any media content related function call should be invoked after this function call.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @return @c 0 on success, 
  *         otherwise a negative error value
@@ -70,7 +70,7 @@ int media_content_connect(void);
  * @details This function closes connection to the media content service. Any further media content related operation
  *          cannot be performed after this function is called.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @return @c 0 on success, 
  *         otherwise a negative error value
@@ -92,7 +92,7 @@ int media_content_disconnect(void);
  *          If media file is not registered to DB yet, that media file information will be added to the media DB. If it is already registered to the DB, then this tries to refresh information.
  *          If requested file does not exist on file system, information of the media file will be removed from the media DB.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -124,7 +124,7 @@ int media_content_scan_file(const char *path);
  *          The sub folders are also scanned, if there are sub folders in that folder. \n
  *          If any folder must not be scanned, a blank file ".scan_ignore" has to be created in that folder.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -173,7 +173,7 @@ int media_content_cancel_scan_folder(const char *path);
  * @details This function subscribes notifications of the media DB change which are published by the media server or other apps.
  *          media_content_db_update_cb() function will be called when notification of the media DB change is subscribed.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] callback  The callback to be invoked when the scanning is finished
  * @param[in] user_data The user data to be passed to the callback function
@@ -196,7 +196,7 @@ int media_content_set_db_updated_cb(media_content_db_update_cb callback, void *u
  * @brief Unsubscribes notifications of the media DB change.
  * @details This function unsubscribes notifications of the media DB change which are published by the media server or other apps.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @return @c 0 on success, 
  *         otherwise a negative error value
index 6e0accf..4e47cdf 100755 (executable)
@@ -33,6 +33,22 @@ extern "C" {
  */
 
 /**
+ * @ingroup CAPI_MEDIA_CONTENT_MODULE
+ * @brief Enumeration for a media storage scan status.
+ * @since_tizen 2.4
+ */
+typedef enum{
+       MEDIA_STORAGE_SCAN_NONE = 0,                            /**< Media Scanner not detect storage yet*/
+       MEDIA_STORAGE_SCAN_PREPARE,                             /**< Media Scanner detect storage but not scanning yet*/
+       MEDIA_STORAGE_SCAN_PROCESSING,                  /**< Media Scanner Start Scanning storage*/
+       MEDIA_STORAGE_SCAN_STOP,                                        /**< Media Scanner Stop Scanning storage. Not scanning items can be exist*/
+       MEDIA_STORAGE_SCAN_DONE,                                        /**< Scanning Done but need to extract metadata*/
+       MEDIA_STORAGE_SCAN_META_PROCESSING,             /**< Scanning Done and start to extract metadata*/
+       MEDIA_STORAGE_SCAN_META_STOP,                   /**< Stop extract metadata*/
+       MEDIA_STORAGE_SCAN_COMPLETE     ,                       /**< Complete scanning*/
+}media_storage_scan_status_e;
+
+/**
 * @internal
 * @brief Insert media storage to database.
 * @since_tizen 2.4
@@ -464,6 +480,21 @@ int media_info_set_storage_type(media_info_h media, media_content_storage_e stor
 */
 int media_info_set_storage_id(media_info_h media, const char *storage_id);
 
+/**
+ * @brief Gets the storage scan status of media storage.
+ * @since_tizen 2.4
+ *
+ * @param[in]  storage The media storage handle
+ * @param[out] scan_status  The storage type of the media storage
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTENT_ERROR_NONE              Successful
+ * @retval #MEDIA_CONTENT_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+int media_storage_get_scan_status(const char *storage_uuid, media_storage_scan_status_e *scan_status);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 64cb4d2..0059189 100755 (executable)
@@ -46,6 +46,7 @@ extern "C" {
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for the media file format.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum
 {
@@ -57,19 +58,23 @@ typedef enum
 } media_content_type_e;
 
 /**
- * @ingroup CAPI_CONTENT_MEDIA_FOLDER_MODULE
+ * @ingroup CAPI_CONTENT_MEDIA_CONTENT_MODULE
  * @brief Enumeration for the storage type.
  * @details This information is used to establish where the folder is.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum
 {
        MEDIA_CONTENT_STORAGE_INTERNAL  = 0,  /**< The device's internal storage */
-       MEDIA_CONTENT_STORAGE_EXTERNAL  = 1,  /**< The device's external storage */
+       MEDIA_CONTENT_STORAGE_EXTERNAL  = 1,  /**< The device's external storage like sd card*/
+       MEDIA_CONTENT_STORAGE_EXTERNAL_USB = 2, /**< The external USB storage (Since 2.4) */
+       MEDIA_CONTENT_STORAGE_CLOUD     = 100,  /**< The Cloud storage (Since 2.4) */
 } media_content_storage_e;
 
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for media content DB update items.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
     MEDIA_ITEM_FILE       = 0,              /**< File type, an item updated to DB */
@@ -79,6 +84,7 @@ typedef enum {
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for media content DB update types.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
     MEDIA_CONTENT_INSERT  = 0,              /**< Insert, the type of DB update */
@@ -89,6 +95,7 @@ typedef enum {
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief Enumeration for orientation types.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
     MEDIA_CONTENT_ORIENTATION_NOT_AVAILABLE  = 0,       /**< Not available*/
@@ -105,6 +112,7 @@ typedef enum {
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for ordering.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum
 {
@@ -115,6 +123,7 @@ typedef enum
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for collations.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum
 {
@@ -129,6 +138,7 @@ typedef enum
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for a media content error.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
  typedef enum
 {
@@ -147,6 +157,7 @@ typedef enum
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Enumeration for a media group.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef enum {
     MEDIA_CONTENT_GROUP_DISPLAY_NAME = 0,    /**< Media group ID for display name */
@@ -178,66 +189,76 @@ typedef enum {
     MEDIA_CONTENT_GROUP_AGE_RATING,          /**< Media group ID for an age rating*/
     MEDIA_CONTENT_GROUP_KEYWORD,             /**< Media group ID for a keyword*/
     MEDIA_CONTENT_GROUP_WEATHER,             /**< Media group ID for the weather*/
-    MEDIA_CONTENT_GROUP_MAX                  /**< Max count of the media group ID */
+    MEDIA_CONTENT_GROUP_MAX                  /**< Invalid media group ID*/
 } media_group_e;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief The structure type for the Media info handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_info_s *media_info_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_FOLDER_MODULE
  * @brief The structure type for the Media folder handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_folder_s *media_folder_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_PLAYLIST_MODULE
  * @brief The structure type for the Media playlist handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_playlist_s *media_playlist_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_TAG_MODULE
  * @brief The structure type for the Media tag handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_tag_s *media_tag_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_BOOKMARK_MODULE
  * @brief The structure type for the Media bookmark handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_bookmark_s *media_bookmark_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_ALBUM_MODULE
  * @brief The structure type for the Media album handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct media_album_s *media_album_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_IMAGE_MODULE
  * @brief The structure type for the Image metadata handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct image_meta_s *image_meta_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_VIDEO_META_MODULE
  * @brief The structure type for the Video metadata handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct video_meta_s *video_meta_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_AUDIO_META_MODULE
  * @brief The structure type for the Audio metadata handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct audio_meta_s *audio_meta_h;
 
 /**
  * @ingroup CAPI_CONTENT_MEDIA_FILTER_MODULE
  * @brief The structure type for the Media filter handle.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 typedef struct filter_s *filter_h;
 
@@ -251,6 +272,7 @@ typedef void *media_storage_h;
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Called when the media scanning is finished.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] error     The error code
  * @param[in] user_data The user data passed from the foreach function
@@ -265,6 +287,7 @@ typedef void (*media_scan_completed_cb)(media_content_error_e error, void * user
 /**
  * @ingroup CAPI_MEDIA_CONTENT_MODULE
  * @brief Called when the notification of the media DB change is subscribed.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] error       The error code
  * @param[in] pid         The PID which publishes notification
@@ -294,6 +317,7 @@ typedef void (*media_content_db_update_cb)(
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief Called for every available media info.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a list of media info.
  *
@@ -321,6 +345,7 @@ typedef bool (*media_info_cb)(media_info_h media, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief Called when media items are inserted completely.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media     The handle to the media info
  * @param[in] user_data The user data passed from the foreach function
@@ -335,6 +360,7 @@ typedef void (*media_insert_completed_cb)(media_content_error_e error, void * us
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief Called when the burst shot is inserted completely.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media     The handle to the media info
  * @param[in] user_data The user data passed from the foreach function
@@ -350,6 +376,7 @@ typedef void (*media_insert_burst_shot_completed_cb)(media_content_error_e error
 /**
  * @ingroup CAPI_CONTENT_MEDIA_INFO_MODULE
  * @brief Called when creating a thumbnail image.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details This callback is called for completion of generating the thumbnail image.
  *
@@ -367,6 +394,7 @@ typedef void (*media_thumbnail_completed_cb)(media_content_error_e error, const
 /**
  * @ingroup CAPI_CONTENT_MEDIA_FOLDER_MODULE
  * @brief Called for every available media folder.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a list of folders.
  *
@@ -387,6 +415,7 @@ typedef bool (*media_folder_cb)(media_folder_h folder, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_PLAYLIST_MODULE
  * @brief Called for every playlist in the obtained list of playlists.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a playlist list.
  *
@@ -408,6 +437,7 @@ typedef bool (*media_playlist_cb)(media_playlist_h playlist, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_PLAYLIST_MODULE
  * @brief Called for every media info with playlist member ID in the obtained list of media info.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over playlist members.
  *
@@ -430,6 +460,7 @@ typedef bool(* playlist_member_cb)(int playlist_member_id, media_info_h media, v
 /**
  * @ingroup CAPI_CONTENT_MEDIA_TAG_MODULE
  * @brief Called for every tag in the obtained list of tags.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a list of tags.
  *
@@ -452,6 +483,7 @@ typedef bool (*media_tag_cb)(media_tag_h tag, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_BOOKMARK_MODULE
  * @brief Called for every bookmark in the obtained list of bookmarks.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a bookmark list.
  *
@@ -472,6 +504,7 @@ typedef bool (*media_bookmark_cb)(media_bookmark_h bookmark, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_ALBUM_MODULE
  * @brief Called for every album in the obtained list of groups.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over an album list.
  *
@@ -493,6 +526,7 @@ typedef bool (*media_album_cb)(media_album_h album, void *user_data);
 /**
  * @ingroup CAPI_CONTENT_MEDIA_GROUP_MODULE
  * @brief Called for every group in the obtained list of groups.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @details Iterates over a media group list.
  *
@@ -538,78 +572,490 @@ typedef bool (*media_storage_cb)(media_storage_h storage, void *user_data);
 /**
  * @addtogroup CAPI_CONTENT_MEDIA_FILTER_MODULE
  * @{
- * @brief You can use above defines to set the condition of media filter and order keyword.
+ */
+
+ /**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  */
 #define MEDIA_ID "MEDIA_ID" /**< Media ID */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_PATH "MEDIA_PATH"  /**< Media full path */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_DISPLAY_NAME "MEDIA_DISPLAY_NAME"  /**< Media base name */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_TYPE "MEDIA_TYPE"  /**< Media type: 0-image, 1-video, 2-sound, 3-music, 4-other*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_MIME_TYPE "MEDIA_MIME_TYPE"  /**< Media MIME type */
+
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_SIZE "MEDIA_SIZE"  /**< Media MIME size */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ADDED_TIME "MEDIA_ADDED_TIME"  /**< Media added time */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_MODIFIED_TIME "MEDIA_MODIFIED_TIME"  /**< Media modified time */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_TIMELINE "MEDIA_TIMELINE"  /**< Media modified time */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_THUMBNAIL_PATH "MEDIA_THUMBNAIL_PATH"  /**< Media thumbnail path */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_TITLE "MEDIA_TITLE"  /**< Media title get from tag or file name */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ALBUM "MEDIA_ALBUM"  /**< Media album name*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ARTIST "MEDIA_ARTIST"  /**< Media artist*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ALBUM_ARTIST "MEDIA_ALBUM_ARTIST"  /**< Media album_artist*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_GENRE "MEDIA_GENRE"  /**< Media genre*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_COMPOSER "MEDIA_COMPOSER"  /**< Media composer*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_YEAR "MEDIA_YEAR"  /**< Media year*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_RECORDED_DATE "MEDIA_RECORDED_DATE"  /**< Media recorded date*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_COPYRIGHT "MEDIA_COPYRIGHT"  /**< Media copyright*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_TRACK_NUM "MEDIA_TRACK_NUM"  /**< Media track number*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_DESCRIPTION "MEDIA_DESCRIPTION"  /**< Media description*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_BITRATE "MEDIA_BITRATE"  /**< Media bitrate*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_BITPERSAMPLE "MEDIA_BITPERSAMPLE"  /**< Media bit per sample*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_SAMPLERATE "MEDIA_SAMPLERATE"  /**< Media sample rate*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_CHANNEL "MEDIA_CHANNEL"  /**< Media channel*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_DURATION "MEDIA_DURATION"  /**< Media duration */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LONGITUDE "MEDIA_LONGITUDE"  /**< Media longitude */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LATITUDE "MEDIA_LATITUDE"  /**< Media latitude */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ALTITUDE "MEDIA_ALTITUDE"  /**< Media altitude */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_WIDTH "MEDIA_WIDTH"  /**< Media width*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_HEIGHT "MEDIA_HEIGHT"  /**< Media height*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_DATETAKEN "MEDIA_DATETAKEN"  /**< Media datetaken*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ORIENTATION "MEDIA_ORIENTATION"  /**< Media orientation*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_BURST_ID "BURST_ID"  /**< Media burst ID*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_PLAYED_COUNT "MEDIA_PLAYED_COUNT"  /**< Media playedcount*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LAST_PLAYED_TIME "MEDIA_LAST_PLAYED_TIME"  /**< Media last played time*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LAST_PLAYED_POSITION "MEDIA_LAST_PLAYED_POSITION"  /**< Media last played position of file*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_RATING "MEDIA_RATING"  /**< Media rating*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_FAVOURITE "MEDIA_FAVOURITE"  /**< 0-not favourite, 1-favourite*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_AUTHOR "MEDIA_AUTHOR"  /**< Media authore*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_PROVIDER "MEDIA_PROVIDER"  /**< Media provider*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_CONTENT_NAME "MEDIA_CONTENT_NAME"  /**< Media content name*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_CATEGORY "MEDIA_CATEGORY"  /**< Media category*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LOCATION_TAG "MEDIA_LOCATION_TAG"  /**< Media location tag*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_AGE_RATING "MEDIA_AGE_RATING"  /**< Media age rating*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_KEYWORD "MEDIA_KEYWORD"  /**< Media keyword*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_WEATHER "MEDIA_WEATHER"  /**< Media weather*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_IS_DRM "MEDIA_IS_DRM"  /**< Is DRM. 0-not drm, 1-drm*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_STORAGE_TYPE "MEDIA_STORAGE_TYPE"  /**< Media storage. 0-internal storage, 1-external storage*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen 2.4
+ *
+ */
 #define MEDIA_EXPOSURE_TIME "MEDIA_EXPOSURE_TIME"      /**< media exposure_time*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen 2.4
+ *
+ */
 #define MEDIA_FNUMBER "MEDIA_FNUMBER"  /**< media fnumber*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen 2.4
+ *
+ */
 #define MEDIA_ISO "MEDIA_ISO"  /**< media iso*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen 2.4
+ *
+ */
 #define MEDIA_MODEL "MEDIA_MODEL"      /**< media model*/
 
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_FILE_NAME_PINYIN "MEDIA_FILE_NAME_PINYIN"  /**< Media file name pinyin */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_TITLE_PINYIN "MEDIA_TITLE_PINYIN"  /**< Media title pinyin */
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ALBUM_PINYIN "MEDIA_ALBUM_PINYIN"  /**< Media album pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ARTIST_PINYIN "MEDIA_ARTIST_PINYIN"  /**< Media artist pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_ALBUM_ARTIST_PINYIN "MEDIA_ALBUM_ARTIST_PINYIN"  /**< Media album_artist pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_GENRE_PINYIN "MEDIA_GENRE_PINYIN"  /**< Media genre pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_COMPOSER_PINYIN "MEDIA_COMPOSER_PINYIN"  /**< Media composer pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_COPYRIGHT_PINYIN "MEDIA_COPYRIGHT_PINYIN"  /**< Media copyright pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_DESCRIPTION_PINYIN "MEDIA_DESCRIPTION_PINYIN"  /**< Media description pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_AUTHOR_PINYIN "MEDIA_AUTHOR_PINYIN"  /**< Media authore pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_PROVIDER_PINYIN "MEDIA_PROVIDER_PINYIN"  /**< Media provider pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_CONTENT_NAME_PINYIN "MEDIA_CONTENT_NAME_PINYIN"  /**< Media content name pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_CATEGORY_PINYIN "MEDIA_CATEGORY_PINYIN"  /**< Media category pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_LOCATION_TAG_PINYIN "MEDIA_LOCATION_TAG_PINYIN"  /**< Media location tag pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_AGE_RATING_PINYIN "MEDIA_AGE_RATING_PINYIN"  /**< Media age rating pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of media filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ *
+ */
 #define MEDIA_KEYWORD_PINYIN "MEDIA_KEYWORD_PINYIN"  /**< Media keyword pinyin*/
 
 /**
@@ -618,28 +1064,80 @@ typedef bool (*media_storage_cb)(media_storage_h storage, void *user_data);
 
 
 /**
-
  * @addtogroup CAPI_CONTENT_MEDIA_FOLDER_MODULE
  * @{
  */
+
+ /**
+ * @brief You can use above define to set the condition of folder filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
 #define FOLDER_ID "FOLDER_ID"  /**< Folder ID */
+
+/**
+* @brief You can use above define to set the condition of folder filter and order keyword.
+* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+*/
 #define FOLDER_PATH "FOLDER_PATH"  /**< Folder full path */
+
+/**
+* @brief You can use above define to set the condition of folder filter and order keyword.
+* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+*/
 #define FOLDER_NAME "FOLDER_NAME"  /**< Folder base name */
+
+/**
+* @brief You can use above define to set the condition of folder filter and order keyword.
+* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+*/
 #define FOLDER_MODIFIED_TIME "FOLDER_MODIFIED_TIME"  /**< Folder modified time */
+
+/**
+* @brief You can use above define to set the condition of folder filter and order keyword.
+* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+*/
 #define FOLDER_STORAGE_TYPE "FOLDER_STORAGE_TYPE"  /**< Folder storage. 0-internal storage, 1-external storage*/
+
+/**
+* @brief You can use above define to set the condition of folder filter and order keyword.
+* @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+*/
 #define FOLDER_NAME_PINYIN "FOLDER_NAME_PINYIN"  /**< Folder base name pinyin*/
+
+/**
+ * @brief You can use above define to set the condition of folder filter and order keyword.
+ * @since_tizen 2.4
+ */
 #define FOLDER_ORDER "FOLDER_ORDER"  /**< Folder order info */
 
 /**
+ * @brief You can use above define to set the condition of folder filter and order keyword.
+ * @since_tizen 2.4
+ */
+#define FOLDER_PARENT_FOLDER_ID "FOLDER_PARENT_FOLDER_ID"      /**< parent folder id */
+
+/**
  * @}
  */
 
 /**
  * @addtogroup CAPI_CONTENT_MEDIA_PLAYLIST_MODULE
  * @{
+ * @brief You can use above define to set the condition of playlist filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 #define PLAYLIST_NAME "PLAYLIST_NAME"  /**< Playlist name */
+
+/**
+ * @brief You can use above define to set the condition of playlist filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
 #define PLAYLIST_MEMBER_ORDER "PLAYLIST_MEMBER_ORDER"  /**< Playlist name */
+
+/**
+ * @brief You can use above define to set the condition of playlist filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
 #define PLAYLIST_MEDIA_COUNT "PLAYLIST_MEDIA_COUNT"  /**< Media count in playlist view */
 
 /**
@@ -649,8 +1147,15 @@ typedef bool (*media_storage_cb)(media_storage_h storage, void *user_data);
 /**
  * @addtogroup CAPI_CONTENT_MEDIA_TAG_MODULE
  * @{
+ * @brief You can use above define to set the condition of tag filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 #define TAG_NAME "TAG_NAME"  /**< Tag name */
+
+/**
+ * @brief You can use above define to set the condition of tag filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
+ */
 #define TAG_MEDIA_COUNT "TAG_MEDIA_COUNT"  /**< Media count in tag view */
 
 /**
@@ -660,6 +1165,8 @@ typedef bool (*media_storage_cb)(media_storage_h storage, void *user_data);
 /**
  * @addtogroup CAPI_CONTENT_MEDIA_BOOKMARK_MODULE
  * @{
+ * @brief You can use above define to set the condition of bookmark filter and order keyword.
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  */
 #define BOOKMARK_MARKED_TIME "BOOKMARK_MARKED_TIME"  /**< Bookmark marked time */
 
@@ -667,6 +1174,25 @@ typedef bool (*media_storage_cb)(media_storage_h storage, void *user_data);
  * @}
  */
 
+/**
+ * @addtogroup CAPI_CONTENT_MEDIA_STORAGE_MODULE
+ * @{
+ * @brief You can use above define to set the condition of storage filter and order keyword.
+ * @since_tizen 2.4
+ */
+#define MEDIA_STORAGE_ID                                       "STORAGE_ID"  /**< Storage ID */
+
+/**
+ * @brief You can use above define to set the condition of storage filter and order keyword.
+ * @since_tizen 2.4
+ */
+#define MEDIA_STORAGE_PATH                             "STORAGE_PATH"  /**< Storage path */
+
+/**
+ * @}
+ */
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 41777dd..528727c 100755 (executable)
@@ -44,7 +44,7 @@ extern "C" {
  * @details This function creates a media filter handle. The handle can be
  *          used to get the filtered information based on filter properties i.e. offset, count, condition for searching and order.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the @a filter handle using media_info_filter_destroy().
  *
@@ -68,7 +68,7 @@ int media_filter_create(filter_h *filter);
  *          handle no longer can be used to perform any operation. A new filter handle
  *          has to be created before the next usage.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter The handle to the media filter
  *
@@ -88,7 +88,7 @@ int media_filter_destroy(filter_h filter);
  * @details This function sets the @a offset and @a count for the given filter used to limit number of items returned.
  *          For example, if you set the @a offset as @c 10 and @a count as @c 5, then only searched data from @c 10 to @c 14 will be returned when the filter is used with foreach functions.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter The handle to the media filter
  * @param[in] offset The start position of the given filter (Starting from zero)
@@ -108,7 +108,7 @@ int media_filter_set_offset(filter_h filter, int offset, int count);
 
 /**
  * @brief Sets the @a condition for the given @a filter.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter       The handle to the media filter
  * @param[in] condition    The condition which is used WHERE clause on a query
@@ -129,7 +129,7 @@ int media_filter_set_condition(filter_h filter, const char *condition, media_con
 
 /**
  * @brief Sets the media filter content @a order and order keyword i.e. either descending or ascending.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter        The handle to the media filter
  * @param[in] order_type    The search order type
@@ -150,6 +150,8 @@ int media_filter_set_order(filter_h filter, media_content_order_e order_type, co
 
 /**
  * @brief Sets the @a storage id for the given @a filter.
+ * @details You can use this API when you want to search items only in the specific storage
+ *
  * @since_tizen 2.4
  *
  * @param[in] filter       The handle to the media filter
@@ -170,7 +172,7 @@ int media_filter_set_storage(filter_h filter, const char *storage_id);
 
 /**
  * @brief Gets the @a offset and @a count for the given @a filter used to limit the number of items returned.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter The handle to the media filter
  * @param[out] offset The start position of the given filter (Starting from zero)
@@ -190,7 +192,7 @@ int media_filter_get_offset(filter_h filter, int *offset, int *count);
 
 /**
  * @brief Gets the @a condition for the given @a filter.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a condition using free().
  *
@@ -213,7 +215,7 @@ int media_filter_get_condition(filter_h filter, char **condition, media_content_
 
 /**
  * @brief Gets the media filter's content @a order and order keyword i.e. either descending or ascending.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a order_keyword using free().
  *
index 33ea5a3..313f54a 100755 (executable)
@@ -43,7 +43,7 @@ extern "C" {
 
 /**
  * @brief Gets the count of folder for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter       The handle to filter \n
  *                          To allow searching over different content types, you should use #filter_h.
@@ -70,7 +70,7 @@ int media_folder_get_folder_count_from_db(filter_h filter, int *folder_count);
  *          The @a callback function will be invoked for every retrieved
  *          folder. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks Do not call updating DB fuction like media_folder_update_to_db() in your callback function, your callback function is invoked as inline function.\n
  *                   So, your callback function is in read state in SQLite. When you are in read state, sometimes you do not update DB. \n
@@ -102,7 +102,7 @@ int media_folder_foreach_folder_from_db(filter_h filter, media_folder_cb callbac
 
 /**
  * @brief Gets the count of media files for the passed @a filter in the given @a folder from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] folder_id    The ID of the media folder
  * @param[in] filter       The filter of the media content
@@ -129,7 +129,7 @@ int media_folder_get_media_count_from_db(const char *folder_id, filter_h filter,
  *          meeting desired filter option and calls registered callback function for
  *          every retrieved media item. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks   Do not call updating DB function like media_info_update_to_db(), media_info_refresh_metadata_to_db(), audio_meta_update_to_db(), image_meta_update_to_db() and video_meta_update_to_db()  in your callback function,
  *                    your callback function is invoked as inline function. \n
@@ -167,7 +167,7 @@ int media_folder_foreach_media_from_db(const char *folder_id, filter_h filter, m
  *          media folder foreach function such as media_folder_foreach_folder_from_db(). To use this handle outside of these foreach functions,
  *          use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks The destination handle must be released with media_folder_destroy().
  *
@@ -192,7 +192,7 @@ int media_folder_clone(media_folder_h *dst, media_folder_h src);
  *          no longer can be used to perform any operation. A new handle has to
  *          be created before the next use.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] folder The handle to the media folder
  *
@@ -211,7 +211,7 @@ int media_folder_destroy(media_folder_h folder);
 
 /**
  * @brief Gets the media folder ID.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a folder_id using free().
  *
@@ -228,8 +228,26 @@ int media_folder_destroy(media_folder_h folder);
 int media_folder_get_folder_id(media_folder_h folder, char **folder_id);
 
 /**
+ * @brief Gets the parent folder ID.
+ * @since_tizen 2.4
+ *
+ * @remarks You must release @a parent_folder_id using free().
+ *
+ * @param[in]  folder    The handle to the media folder
+ * @param[out] parent_folder_id The ID of the upper media folder
+ *
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ *
+ * @retval #MEDIA_CONTENT_ERROR_NONE              Successful
+ * @retval #MEDIA_CONTENT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MEDIA_CONTENT_ERROR_PERMISSION_DENIED Permission denied
+ */
+int media_folder_get_parent_folder_id(media_folder_h folder, char **parent_folder_id);
+
+/**
  * @brief Gets the absolute path to the media folder.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a path using free().
  *
@@ -249,7 +267,7 @@ int media_folder_get_path(media_folder_h folder, char **path);
 
 /**
  * @brief Gets the media folder name.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a folder_name using free().
  *
@@ -268,7 +286,7 @@ int media_folder_get_name(media_folder_h folder, char **folder_name);
 
 /**
  * @brief Gets the modified date of the folder.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  folder The handle to the media folder
  * @param[out] date   The modified date of the folder
@@ -283,7 +301,7 @@ int media_folder_get_modified_time(media_folder_h folder, time_t *date);
 
 /**
  * @brief Gets the folder storage type.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  folder       The handle to the media folder
  * @param[out] storage_type The storage type of the media folder
@@ -340,7 +358,7 @@ int media_folder_get_order(media_folder_h folder, int *order);
  *
  * @details This function creates a new media folder handle from the media database by the given @a folder_id.
  *          Media folder will be created, which is filled with folder information.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a folder using media_folder_destroy().
  *
@@ -364,7 +382,7 @@ int media_folder_get_folder_from_db(const char *folder_id, media_folder_h *folde
 
 /**
  * @brief Sets the folder name.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] folder The handle to the media folder
  * @param[in] name   The name of the media folder
@@ -412,7 +430,7 @@ int media_folder_set_order(media_folder_h folder, int order);
  *          database. For example, after using media_folder_set_name() for setting the name of the folder, the media_folder_update_to_db() function should be called so as to update
  *          the given folder attributes in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index 83882c2..572dcbd 100755 (executable)
@@ -41,7 +41,7 @@ extern "C" {
 
 /**
  * @brief Gets the number of the album for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter      The media filter handle
  * @param[out] album_count The count of the media album
@@ -67,7 +67,7 @@ int media_album_get_album_count_from_db(filter_h filter, int *album_count);
  *          The callback function will be invoked for every retrieved media album.
  *          If @c NULL is passed to the filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter    The media filter handle
  * @param[in] callback  The callback function to be invoked
@@ -94,7 +94,7 @@ int media_album_foreach_album_from_db(filter_h filter, media_album_cb callback,
 
 /**
  * @brief Gets the number of media info for the given album present in the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  album_id    The ID of the media album
  * @param[in]  filter      The media filter handle
@@ -122,7 +122,7 @@ int media_album_get_media_count_from_db (int album_id, filter_h filter, int *med
  *          meeting desired filter option and calls registered callback function for
  *          every retrieved media info. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] album_id  The ID of the media album
  * @param[in] filter    The media filter handle
@@ -154,7 +154,7 @@ int media_album_foreach_media_from_db(int album_id, filter_h filter, media_info_
  *          can no longer be used to perform any operation. A new handle has to
  *          be created before the next use.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] album The media album handle
  *
@@ -178,7 +178,7 @@ int media_album_destroy(media_album_h album);
  *          media album foreach function such as media_album_foreach_album_from_db(). To use this handle outside of these foreach functions,
  *          use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the destination handle using media_album_destroy().
  *
@@ -200,7 +200,7 @@ int media_album_clone(media_album_h *dst, media_album_h src);
 
 /**
  * @brief Gets the ID of the album.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  album    The media album handle
  * @param[out] album_id The media album ID
@@ -219,7 +219,7 @@ int media_album_get_album_id(media_album_h album, int *album_id);
 
 /**
  * @brief Gets the name of the album.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album_name using free().
  *
@@ -238,7 +238,7 @@ int media_album_get_name(media_album_h album, char **album_name);
 
 /**
  * @brief Gets the name of the artist from the given album.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a artist using free().
  *
@@ -257,7 +257,7 @@ int media_album_get_artist(media_album_h album, char **artist);
 
 /**
  * @brief Gets the album art path from the album.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album_art using free().
  *
@@ -280,7 +280,7 @@ int media_album_get_album_art(media_album_h album, char **album_art);
  * @details This function creates a new media album handle from the media database by the given @a album_id.
  *          Media album will be created and will be filled with the album information.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a folder using media_album_destroy().
  *
@@ -317,7 +317,7 @@ int media_album_get_album_from_db(int album_id, media_album_h *album);
 
  /**
  * @brief Gets the number of the group for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter       The media filter handle
  * @param[in]  group        The type of the media group
@@ -344,7 +344,7 @@ int media_group_get_group_count_from_db(filter_h filter, media_group_e group, in
  *          The callback function will be invoked for every retrieved media group.
  *          If @c NULL is passed to the filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter    The media filter handle
  * @param[in] group     The type of the media group
@@ -372,7 +372,7 @@ int media_group_foreach_group_from_db(filter_h filter, media_group_e group, medi
 
  /**
  * @brief Gets the count of the media info for the given media group present in the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  group_name  The name of the media group
  * @param[in]  group       The type of the media group
@@ -401,7 +401,7 @@ int media_group_get_media_count_from_db(const char *group_name, media_group_e gr
  *          meeting desired filter option and calls registered callback function for
  *          every retrieved media info. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] group_name The name of the media group
  * @param[in] group      The type of the media group
index 450ade4..a97524e 100755 (executable)
@@ -41,7 +41,7 @@ extern "C" {
  * @brief Clones the image metadata.
  * @details The function copies the image metadata handle from a source to destination.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks The destination handle must be released with image_meta_destroy().
  *
@@ -66,7 +66,7 @@ int image_meta_clone(image_meta_h *dst, image_meta_h src);
  *          no longer can be used to perform any operation. A new handle has to
  *          be created before next usage.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] image The image metadata handle
  *
@@ -84,7 +84,7 @@ int image_meta_destroy(image_meta_h image);
 
 /**
  * @brief Gets the ID of an image.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image    The image metadata handle
  * @param[out] media_id The ID of an image
@@ -100,7 +100,7 @@ int image_meta_get_media_id(image_meta_h image, char **media_id);
 
 /**
  * @brief Gets the image width in pixels.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image The image metadata handle
  * @param[out] width The image width in pixels
@@ -116,7 +116,7 @@ int image_meta_get_width(image_meta_h image, int *width);
 
 /**
  * @brief Gets the image height in pixels.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image  The image metadata handle
  * @param[out] height The image height in pixels
@@ -132,7 +132,7 @@ int image_meta_get_height(image_meta_h image, int *height);
 
 /**
  * @brief Gets the image orientation.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image       The image metadata handle
  * @param[out] orientation The image orientation
@@ -148,7 +148,7 @@ int image_meta_get_orientation(image_meta_h image, media_content_orientation_e *
 
 /**
  * @brief Gets the image creation time.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image      The image metadata handle
  * @param[out] date_taken The time, when image was taken (in seconds, since the Epoch)
@@ -164,7 +164,7 @@ int image_meta_get_date_taken(image_meta_h image, char **date_taken);
 
 /**
  * @brief Gets the burst shot ID.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a burst_id using free().
  *
@@ -255,7 +255,7 @@ int image_meta_get_model(image_meta_h image, char **model);
 
 /**
  * @brief Checks whether the media is a burst shot image.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  image         The image metadata handle
  * @param[out] is_burst_shot @c true if the media is a burst shot image,
@@ -272,7 +272,7 @@ int image_meta_is_burst_shot(image_meta_h image, bool *is_burst_shot);
 
 /**
  * @brief Sets an orientation of the image.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] image       The image metadata handle
  * @param[in] orientation The image orientation
@@ -295,7 +295,7 @@ int image_meta_set_orientation(image_meta_h image, media_content_orientation_e o
  *          database. For example, after using image_meta_set_orientation() for setting the orientation of the image, the image_meta_update_to_db() function should be called so as to update
  *          the given image attributes in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index a86bbe6..4a3b2f6 100755 (executable)
@@ -47,7 +47,7 @@ extern "C" {
  *          This function is only called when the media server is busy and the user needs to get quick result of inserting
  *          e.g. Taking a photo while media server is busy and the user wants to see the quick snapshot of the photo taken.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -87,7 +87,7 @@ int media_info_insert_to_db (const char *path, media_info_h *info);
  *          Normally, inserting a media file in database is done automatically by the media server, without calling this function.
  *          This function invokes media_insert_completed_cb() callback function when insertion to the media database is finished.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -128,7 +128,7 @@ int media_info_insert_batch_to_db(const char **path_array,unsigned int array_len
  * @details This function inserts burst images into the content storage.
  *          media_insert_burst_shot_completed_cb() will be called when insertion to media database is finished.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -170,7 +170,7 @@ int media_info_insert_burst_shot_to_db(const char **path_array,unsigned int arra
  *          Normally, deleting a media file in the database is done automatically by the media server, without calling this function.
  *          This function is only called when the media server is busy and user needs to get quick result of deleting.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -201,7 +201,7 @@ int media_info_delete_from_db(const char *media_id);
  *          Normally, deleting  media files in the database are done automatically by the media server, without calling this function.
  *          This function is only called when the media server is busy and user needs to get quick result of deleting.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -232,7 +232,7 @@ int media_info_delete_batch_from_db(filter_h filter);
  *          can no longer be used to perform any operation. New media info handle has to
  *          be created before the next usage.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media  The media info handle
  *
@@ -257,7 +257,7 @@ int media_info_destroy(media_info_h media);
  *          available through media info foreach function such as media_info_foreach_media_from_db().
  *          To use this handle outside of these foreach functions, use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the destination handle using media_info_destroy().
  *
@@ -284,7 +284,7 @@ int media_info_clone(media_info_h *dst, media_info_h src);
 
 /**
  * @brief Gets the count of media info for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter      The handle to filter
  * @param[out] media_count The count of media
@@ -310,7 +310,7 @@ int media_info_get_media_count_from_db(filter_h filter, int *media_count);
  *          The @a callback function will be invoked for every retrieved media info.
  *          If @c NULL is passed to the @a filter, then no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks Do not call updating DB function like media_info_update_to_db(), media_info_refresh_metadata_to_db(), audio_meta_update_to_db(), image_meta_update_to_db() and video_meta_update_to_db()  in your callback function,
  *                   your callback function is invoked as inline function.
@@ -342,7 +342,7 @@ int media_info_foreach_media_from_db(filter_h filter, media_info_cb callback, vo
 
 /**
  * @brief Gets the count of media tags for the passed @a filter in the given @a media_id from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media_id  The ID of the media info
  * @param[in]  filter    The handle to the media filter
@@ -367,7 +367,7 @@ int media_info_get_tag_count_from_db(const char *media_id, filter_h filter, int
  * @brief Iterates through the media tag in the given media info from the media database.
  * @details This function gets all the media tags associated with the given @a media_id and calls registered callback function for every retrieved media tag.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media_id  The ID of the media info
  * @param[in] filter    The handle to the media filter
@@ -394,7 +394,7 @@ int media_info_foreach_tag_from_db(const char *media_id, filter_h filter, media_
 
 /**
  * @brief Gets the number of bookmarks for the passed @a filter in the given media ID from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media_id        The ID of the media info
  * @param[in]  filter          The handle to the media filter
@@ -419,7 +419,7 @@ int media_info_get_bookmark_count_from_db(const char *media_id, filter_h filter,
  * @brief Iterates through the media bookmark in the given media info from the media database.
  * @details This function gets all media bookmarks associated with the given media and calls registered callback function for every retrieved media bookmark.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media_id  The ID of the media info
  * @param[in] filter    The handle to the media filter
@@ -448,7 +448,7 @@ int media_info_foreach_bookmark_from_db (const char *media_id, filter_h filter,
  * @brief Gets the image metadata for a given media info.
  * @details This function returns an image metadata handle retrieved from the media info.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the @a image handle using image_meta_destroy().
  *
@@ -470,7 +470,7 @@ int media_info_get_image(media_info_h media, image_meta_h *image);
  * @brief Gets a video metadata for a given media info.
  * @details This function returns a video metadata handle retrieved from the media info handle.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the @a video handle using video_meta_destroy().
  *
@@ -493,7 +493,7 @@ int media_info_get_video(media_info_h media, video_meta_h *video);
  * @brief Gets an audio metadata for a given media info.
  * @details This function returns an audio metadata handle retrieved from the media info handle.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the @a audio handle using audio_meta_destroy().
  *
@@ -514,7 +514,7 @@ int media_info_get_audio(media_info_h media, audio_meta_h *audio);
 
 /**
  * @brief Gets the tag ID for the media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media The media info handle
  * @param[out] media_id     The ID of the media tag
@@ -530,7 +530,7 @@ int media_info_get_media_id(media_info_h media, char **media_id);
 
 /**
  * @brief Gets the path to the media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a path using free().
  *
@@ -550,7 +550,7 @@ int media_info_get_file_path(media_info_h media, char **path);
 
 /**
  * @brief Gets the name of the media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a name using free().
  *
@@ -569,7 +569,7 @@ int media_info_get_display_name(media_info_h media, char **name);
 
 /**
  * @brief Gets the content type of the media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media The media info handle
  * @param[out] type  The type of the media content (#media_content_type_e)
@@ -585,7 +585,7 @@ int media_info_get_media_type(media_info_h media, media_content_type_e *type);
 
 /**
  * @brief Gets the MIME type from the media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a mime_type using free().
  *
@@ -604,7 +604,7 @@ int media_info_get_mime_type(media_info_h media, char **mime_type);
 
 /**
  * @brief Gets the media file size.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media The media info handle
  * @param[out] size  The type of the media content
@@ -620,7 +620,7 @@ int media_info_get_size(media_info_h media, unsigned long long *size);
 
 /**
  * @brief Gets the addition time of the media.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media      The media info handle
  * @param[out] added_time The added time to the DB
@@ -636,7 +636,7 @@ int media_info_get_added_time(media_info_h media, time_t *added_time);
 
 /**
  * @brief Gets the date of modification of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media The media info handle
  * @param[out] time  The date of modification of the file \n
@@ -655,7 +655,7 @@ int media_info_get_modified_time(media_info_h media, time_t *time);
  * @brief Gets the timeline of media info.
  * @details If the image file has the creation time, the value of the timeline is the creation time.\n
  *          Otherwise, the value of the timeline is the same as modified time.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media The media info handle
  * @param[out] time  The date of the timeline
@@ -671,7 +671,7 @@ int media_info_get_timeline(media_info_h media, time_t* time);
 
 /**
  * @brief Gets the thumbnail of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a path using free().
  *
@@ -690,7 +690,7 @@ int media_info_get_thumbnail_path(media_info_h media, char **path);
 
 /**
  * @brief Gets the description of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a description using free().
  *
@@ -709,7 +709,7 @@ int media_info_get_description(media_info_h media, char **description);
 
 /**
  * @brief Gets the longitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media     The media info handle
  * @param[out] longitude The longitude of the media info
@@ -725,7 +725,7 @@ int media_info_get_longitude(media_info_h media, double* longitude);
 
 /**
  * @brief Gets the latitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media    The media info handle
  * @param[out] latitude The latitude of the media info
@@ -742,7 +742,7 @@ int media_info_get_latitude(media_info_h media, double* latitude);
 
 /**
  * @brief Gets the altitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media    The media info handle
  * @param[out] altitude The altitude of the media info
@@ -758,7 +758,7 @@ int media_info_get_altitude(media_info_h media, double* altitude);
 
 /**
  * @brief Gets the weather of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media   The media info handle
  * @param[out] weather The weather of the media info
@@ -774,7 +774,7 @@ int media_info_get_weather(media_info_h media, char **weather);
 
 /**
  * @brief Gets the rating of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media  The media info handle
  * @param[out] rating The rating of the media info
@@ -790,7 +790,7 @@ int media_info_get_rating(media_info_h media, int *rating);
 
 /**
  * @brief Gets the favorite status of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media     The media info handle
  * @param[out] favorite  @c true if media info is set as favorite, 
@@ -807,7 +807,7 @@ int media_info_get_favorite(media_info_h media, bool* favorite);
 
 /**
  * @brief Gets the author of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a author using free().
  *
@@ -826,7 +826,7 @@ int media_info_get_author(media_info_h media, char **author);
 
 /**
  * @brief Gets the provider of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a provider using free().
  *
@@ -845,7 +845,7 @@ int media_info_get_provider(media_info_h media, char **provider);
 
 /**
  * @brief Gets the content name of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a content_name using free().
  *
@@ -864,7 +864,7 @@ int media_info_get_content_name(media_info_h media, char **content_name);
 
 /**
  * @brief Gets the title of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a title using free().
  *
@@ -883,7 +883,7 @@ int media_info_get_title(media_info_h media, char **title);
 
 /**
  * @brief Gets the category of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a category using free().
  *
@@ -902,7 +902,7 @@ int media_info_get_category(media_info_h media, char **category);
 
 /**
  * @brief Gets the location tag of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a location_tag using free().
  *
@@ -921,7 +921,7 @@ int media_info_get_location_tag(media_info_h media, char **location_tag);
 
 /**
  * @brief Gets the age_rating of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a age_rating using free().
  *
@@ -940,7 +940,7 @@ int media_info_get_age_rating(media_info_h media, char **age_rating);
 
 /**
  * @brief Gets the keyword of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a keyword using free().
  *
@@ -978,7 +978,7 @@ int media_info_get_storage_id(media_info_h media, char **storage_id);
 
 /**
  * @brief Checks whether the media is protected via DRM.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media  The media info handle
  * @param[out] is_drm @c true if media is DRM media,
@@ -995,7 +995,7 @@ int media_info_is_drm(media_info_h media, bool *is_drm);
 
 /**
  * @brief Gets the storage type of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  media        The media info handle
  * @param[out] storage_type The storage type of the media info
@@ -1047,7 +1047,7 @@ int media_info_get_played_time(media_info_h media, time_t *played_time);
  * @details This function creates a new media handle from the media database by the given @a media_id.
  *          Media info will be created and filled with information.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a media using media_tag_destroy().
  *
@@ -1104,7 +1104,7 @@ int media_info_set_played_time(media_info_h media);
 
 /**
  * @brief Sets the display name of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media        The media info handle
  * @param[in] display_name The display name of the media info
@@ -1124,7 +1124,7 @@ int media_info_set_display_name(media_info_h media, const char *display_name);
 
 /**
  * @brief Sets the description of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media       The media info handle
  * @param[in] description The description of the media info
@@ -1144,7 +1144,7 @@ int media_info_set_description(media_info_h media, const char *description);
 
 /**
  * @brief Sets the longitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media     The media info handle
  * @param[in] longitude The longitude of the media info
@@ -1163,7 +1163,7 @@ int media_info_set_longitude(media_info_h media, double longitude);
 
 /**
  * @brief Sets the latitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media    The media info handle
  * @param[in] latitude The latitude of the media info
@@ -1182,7 +1182,7 @@ int media_info_set_latitude(media_info_h media, double latitude);
 
 /**
  * @brief Sets the altitude of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media    The media info handle
  * @param[in] altitude The altitude of the media info
@@ -1201,7 +1201,7 @@ int media_info_set_altitude(media_info_h media, double altitude);
 
 /**
  * @brief Sets the weather of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media   The media info handle
  * @param[in] weather The weather of the media info
@@ -1221,7 +1221,7 @@ int media_info_set_weather(media_info_h media, const char *weather);
 
 /**
  * @brief Sets the rating of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media  The media info handle
  * @param[in] rating The rating of the media info
@@ -1240,7 +1240,7 @@ int media_info_set_rating(media_info_h media, int rating);
 
 /**
  * @brief Sets the favorite of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media    The media info handle
  * @param[in] favorite Set @c true to set the media info as favorite,
@@ -1258,7 +1258,7 @@ int media_info_set_favorite(media_info_h media, bool favorite);
 
 /**
  * @brief Sets the author of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media  The media info handle
  * @param[in] author The author of the media info
@@ -1275,7 +1275,7 @@ int media_info_set_author(media_info_h media, const char *author);
 
 /**
  * @brief Sets the provider of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media    The media info handle
  * @param[in] provider The provider of the media info
@@ -1292,7 +1292,7 @@ int media_info_set_provider(media_info_h media, const char *provider);
 
 /**
  * @brief Sets the content name of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media        The media info handle
  * @param[in] content_name The content name of the media info
@@ -1311,7 +1311,7 @@ int media_info_set_content_name(media_info_h media, const char *content_name);
 
 /**
  * @brief Sets the category of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media    The media info handle
  * @param[in] category The category of the media info
@@ -1330,7 +1330,7 @@ int media_info_set_category(media_info_h media, const char *category);
 
 /**
  * @brief Sets the location tag of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media        The media info handle
  * @param[in] location_tag The location of the media info
@@ -1349,7 +1349,7 @@ int media_info_set_location_tag(media_info_h media, const char *location_tag);
 
 /**
  * @brief Sets the age rating of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media      The media info handle
  * @param[in] age_rating The age rating of the media info
@@ -1368,7 +1368,7 @@ int media_info_set_age_rating(media_info_h media, const char *age_rating);
 
 /**
  * @brief Sets the keyword of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media   The media info handle
  * @param[in] keyword The keyword of the media info
@@ -1390,7 +1390,7 @@ int media_info_set_keyword(media_info_h media, const char *keyword);
  * 
  * @details The function updates the given media info in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
  *
@@ -1434,7 +1434,7 @@ int media_info_update_to_db(media_info_h media);
 
 /**
  * @brief Refreshes the media metadata to the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -1468,7 +1468,7 @@ int media_info_refresh_metadata_to_db(const char *media_id);
 
 /**
  * @brief Sets the added time of media info.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] media      The media info handle
  * @param[in] added_time The added time of the media info
@@ -1487,7 +1487,7 @@ int media_info_set_added_time(media_info_h media, time_t added_time);
 
 /**
  * @brief Moves the media info to the given destination path in the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write \n
@@ -1525,11 +1525,13 @@ int media_info_move_to_db(media_info_h media, const char* dst_path);
  * @details This function creates an thumbnail image for given media item and calls registered callback function for completion of creating the thumbnail.
  *          If a thumbnail already exists for the given media, then the path of thumbnail will be returned in callback function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
  *
+ * @remarks If you want to destory media handle before callback invoked, you must cancel thumbnail request by using media_info_cancel_thumbnail()
+ *
  * @param[in] media     The media info handle
  * @param[in] callback  The callback function to be invoked
  * @param[in] user_data The user data to be passed to the callback function
@@ -1554,7 +1556,7 @@ int media_info_create_thumbnail(media_info_h media, media_thumbnail_completed_cb
 
 /**
  * @brief Cancels the creation of image's thumbnail for the given media.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index a5dfdef..babbcf2 100755 (executable)
@@ -61,6 +61,8 @@ extern "C" {
 #define SAFE_FREE(src)         {if(src) {free(src); src = NULL;}}
 #define STRING_VALID(str)              ((str != NULL && strlen(str) > 0) ? TRUE : FALSE)
 #define SQLITE3_FINALIZE(x)    {if(x != NULL) {sqlite3_finalize(x);}}
+#define SQLITE3_SAFE_FREE(x)   {if(x != NULL) {sqlite3_free(x);x = NULL;}}
+
 
 #define MEDIA_CONTENT_PATH_PHONE       MEDIA_ROOT_PATH_INTERNAL        /**< File path prefix of files stored in phone */
 #define MEDIA_CONTENT_PATH_MMC                 MEDIA_ROOT_PATH_SDCARD          /**< File path prefix of files stored in mmc card */
@@ -184,6 +186,7 @@ typedef struct _filter_s
 typedef struct
 {
        char *folder_id;                                //image id, audio id, video id
+       char *parent_folder_id;
        char *path;
        char *name;
        time_t modified_time;
@@ -196,6 +199,7 @@ typedef struct
 {
        int tag_id;
        char *name;
+       GList *item_list;
 }media_tag_s;
 
 typedef struct
@@ -219,6 +223,7 @@ typedef struct
        int playlist_id;        //playlist id
        char *name;             // playlist name
        char *thumbnail_path;           //playlist thumbnail path
+       GList *item_list;
 }media_playlist_s;
 
 typedef struct
@@ -485,6 +490,7 @@ typedef struct _media_content_cb_data {
 #define DB_FIELD_FOLDER_STORAGE_TYPE   "storage_type"
 #define DB_FIELD_FOLDER_NAME_PINYIN    "name_pinyin"
 #define DB_FIELD_FOLDER_ORDER                  "folder_order"
+#define DB_FIELD_FOLDER_PARENT_FOLDER_ID       "parent_folder_uuid"
 
 /* DB field for playlist */
 #define DB_FIELD_PLAYLIST_ID                                   "playlist_id"
@@ -506,6 +512,10 @@ typedef struct _media_content_cb_data {
 #define DB_FIELD_ALBUM_NAME            "name"
 #define DB_FIELD_ALBUM_ARTIST          "artist"
 
+/* DB field for Storage*/
+#define DB_FIELD_STORAGE_ID                    "storage_uuid"
+#define DB_FIELD_STORAGE_PATH          "storage_path"
+
 /* DB Query Keyword */
 #define QUERY_KEYWORD_AND "AND"
 #define QUERY_KEYWORD_OR "OR"
@@ -518,7 +528,7 @@ typedef struct _media_content_cb_data {
 
 /* DB TABLE JOIN */
 //#define FOLDER_MEDIA_JOIN                                    "("DB_TABLE_FOLDER" AS f LEFT OUTER JOIN '%s' AS m ON f.folder_uuid=m.folder_uuid AND m.validity=1) WHERE f.storage_uuid IN (SELECT storage_uuid FROM "DB_TABLE_STORAGE" WHERE validity=1) "
-#define FOLDER_MEDIA_JOIN                                      "("DB_TABLE_FOLDER" AS f LEFT OUTER JOIN '%s' AS m ON f.folder_uuid=m.folder_uuid AND m.validity=1) WHERE f.validity=1"
+#define FOLDER_MEDIA_JOIN                                      "("DB_TABLE_FOLDER" AS f LEFT OUTER JOIN '%s' AS m ON f.folder_uuid=m.folder_uuid AND m.validity=1) WHERE f.validity=1 "
 #define BOOKMARK_MEDIA_JOIN                            "("DB_TABLE_BOOKMARK" AS b INNER JOIN '%s' AS m \
                                                                                        ON (b.media_uuid = m.media_uuid)) WHERE m.validity=1"
 #define ALBUM_MEDIA_JOIN                                       "("DB_TABLE_ALBUM" AS a INNER JOIN '%s' AS m \
@@ -528,7 +538,7 @@ typedef struct _media_content_cb_data {
 #define SELECT_ALBUM_LIST                      "SELECT DISTINCT a.album_id, a.name, a.artist, a.album_art FROM "ALBUM_MEDIA_JOIN
 #define SELECT_MEDIA_GROUP_LIST        "SELECT DISTINCT %s FROM '%s' WHERE validity=1 "
 
-#define SELECT_FOLDER_LIST                     "SELECT DISTINCT f.folder_uuid, f.path, f.name, f.storage_type, f.modified_time, f.storage_uuid, f.folder_order FROM "FOLDER_MEDIA_JOIN
+#define SELECT_FOLDER_LIST                     "SELECT DISTINCT f.folder_uuid, f.path, f.name, f.storage_type, f.modified_time, f.storage_uuid, f.folder_order, f.parent_folder_uuid FROM "FOLDER_MEDIA_JOIN
 #define SELECT_FOLDER_LIST_BY_STORAGE_ID       SELECT_FOLDER_LIST"AND f.storage_uuid='%s' "
 #define SELECT_TAG_LIST                                "SELECT DISTINCT tag_id, name FROM "DB_VIEW_TAG" WHERE 1 "
 #define SELECT_PLAYLIST_LIST                   "SELECT DISTINCT playlist_id, name, p_thumbnail_path FROM "DB_VIEW_PLAYLIST" WHERE 1 "
index bc3bb73..fd4d9bb 100755 (executable)
@@ -39,7 +39,7 @@ extern "C" {
 
 /**
  * @brief Gets the number of playlists for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter         The handle to the filter
  * @param[out] playlist_count The count of the media playlist
@@ -65,7 +65,7 @@ int media_playlist_get_playlist_count_from_db(filter_h filter, int *playlist_cou
  *          The callback function will be invoked for every retrieved media playlist.
  *          If @c NULL is passed to the filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter    The handle to the audio filter
  * @param[in] callback  The callback function to be invoked
@@ -92,7 +92,7 @@ int media_playlist_foreach_playlist_from_db(filter_h filter, media_playlist_cb c
 
 /**
  * @brief Gets the number of the media info for the given playlist present in the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  playlist_id  The ID of the media playlist
  * @param[in]  filter       The media filter handle
@@ -119,7 +119,7 @@ int media_playlist_get_media_count_from_db(int playlist_id, filter_h filter, int
  *          meeting desired filter option and calls registered callback function for
  *          every retrieved media info. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist_id The ID of the media playlist
  * @param[in] filter      The audio filter handle
@@ -147,7 +147,7 @@ int media_playlist_foreach_media_from_db(int playlist_id, filter_h filter, playl
 
 /**
  * @brief Inserts a new playlist with the given name into the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -178,7 +178,7 @@ int media_playlist_insert_to_db(const char *name, media_playlist_h *playlist);
 
 /**
  * @brief Deletes the given playlist from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -209,7 +209,7 @@ int media_playlist_delete_from_db(int playlist_id);
  * @details This function creates a new media playlist handle from the media database by the given @a playlist_id.
  *          The media playlist will be created and will be filled with the playlist information.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a playlist using media_playlist_destroy().
  *
@@ -239,7 +239,7 @@ int media_playlist_get_playlist_from_db(int playlist_id, media_playlist_h *playl
  *          handle no longer can be used to perform any operation. A new handle has to
  *          be created before next usage.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist The media playlist handle
  *
@@ -263,7 +263,7 @@ int media_playlist_destroy(media_playlist_h playlist);
  *          media playlist foreach function such as media_playlist_foreach_playlist_from_db().
  *          To use this handle outside of these foreach functions, use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks The destination handle must be released using media_playlist_destroy().
  *
@@ -285,7 +285,7 @@ int media_playlist_clone(media_playlist_h *dst, media_playlist_h src);
 
 /**
  * @brief Gets the media playlist ID.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  playlist    The media playlist handle
  * @param[out] playlist_id The ID of the media playlist
@@ -301,7 +301,7 @@ int media_playlist_get_playlist_id(media_playlist_h playlist, int *playlist_id);
 
 /**
  * @brief Gets a name of the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a playlist_name using free().
  *
@@ -320,7 +320,7 @@ int media_playlist_get_name(media_playlist_h playlist, char **playlist_name);
 
 /**
  * @brief Sets the name of the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist      The media playlist handle
  * @param[in] playlist_name The name of the media playlist
@@ -340,7 +340,7 @@ int media_playlist_set_name(media_playlist_h playlist, const char *playlist_name
 
 /**
  * @brief Gets a thumbnail path of the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a path using free().
  *
@@ -359,7 +359,7 @@ int media_playlist_get_thumbnail_path(media_playlist_h playlist, char **path);
 
 /**
  * @brief Sets the thumbnail path of the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist The media playlist handle
  * @param[in] path     The path of the thumbnail
@@ -379,7 +379,7 @@ int media_playlist_set_thumbnail_path(media_playlist_h playlist, const char *pat
 
 /**
  * @brief Sets the playing order in the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist           The media playlist handle
  * @param[in] playlist_member_id The playlist member ID
@@ -399,7 +399,7 @@ int media_playlist_set_play_order(media_playlist_h playlist, int playlist_member
 
 /**
  * @brief Adds a new media info to the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist The media playlist handle
  * @param[in] media_id The ID to the media info which is added
@@ -422,7 +422,7 @@ int media_playlist_add_media(media_playlist_h playlist, const char *media_id);
 
 /**
  * @brief Removes the playlist members related with the media from the given playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist           The media playlist handle
  * @param[in] playlist_member_id The playlist member ID
@@ -445,7 +445,7 @@ int media_playlist_remove_media(media_playlist_h playlist, int playlist_member_i
 
 /**
  * @brief Gets the played order of the playlist.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] playlist           The media playlist handle
  * @param[in] playlist_member_id The playlist member ID
@@ -469,7 +469,7 @@ int media_playlist_get_play_order(media_playlist_h playlist, int playlist_member
  *          media_playlist_update_to_db() function should be called so as to update
  *          the given playlist attributes in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index 42a6596..0a47b28 100755 (executable)
@@ -233,7 +233,7 @@ int media_storage_clone(media_storage_h *dst, media_storage_h src);
  * @param[in]  storage The media storage handle
  * @param[out] storage_id  The storage id of the media storage
  *
- * @return @c 0 on success, 
+ * @return @c 0 on success,
  *         otherwise a negative error value
  *
  * @retval #MEDIA_CONTENT_ERROR_NONE              Successful
index a5d51c1..59fc3c4 100755 (executable)
@@ -41,7 +41,7 @@ extern "C" {
 
 /**
  * @brief Inserts a new tag in the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -73,7 +73,7 @@ int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag);
 
 /**
  * @brief Deletes a given tag from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
@@ -100,7 +100,7 @@ int media_tag_delete_from_db(int tag_id);
 
 /**
  * @brief Gets the count of the tag for the passed @a filter from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  filter    The handle to the filter
  * @param[out] tag_count The count of the media tag
@@ -126,7 +126,7 @@ int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count);
  *          and calls a registered callback function for every retrieved tag.
  *          If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] filter    The tag filter handle
  * @param[in] callback  The callback function to be invoked
@@ -153,7 +153,7 @@ int media_tag_foreach_tag_from_db (filter_h filter, media_tag_cb callback, void
 
 /**
  * @brief Gets the number of media files for the passed @a filter in the given @a tag from the media database.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  tag_id      The ID of the media tag
  * @param[in]  filter      The handle to the media filter
@@ -180,7 +180,7 @@ int media_tag_get_media_count_from_db (int tag_id, filter_h filter, int *media_c
  *          meeting a desired @a filter and calls a registered callback function for
  *          every retrieved media item. If @c NULL is passed to the @a filter, no filtering is applied.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] tag_id    The ID of the media tag
  * @param[in] filter    The handle to the media filter
@@ -213,7 +213,7 @@ int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb c
  *          such as media_tag_foreach_tag_from_db().
  *          To use this handle outside of these foreach functions, use this function.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the destination handle using media_tag_destroy().
  *
@@ -237,7 +237,7 @@ int media_tag_clone(media_tag_h *dst, media_tag_h src);
  * @details This function frees all resources related to the tag handle. The tag handle can no longer
  *          be used for any operation. A new tag handle has to be created before next usage.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] tag The media tag handle
  *
@@ -257,7 +257,7 @@ int media_tag_destroy(media_tag_h tag);
 
 /**
  * @brief Gets the media tag ID.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  tag     The media tag handle
  * @param[out] tag_id  The ID of the media tag
@@ -273,7 +273,7 @@ int media_tag_get_tag_id(media_tag_h tag, int *tag_id);
 
 /**
  * @brief Gets the tag name.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a tag_name using free().
  *
@@ -296,7 +296,7 @@ int media_tag_get_name(media_tag_h tag, char **tag_name);
  * @details This function creates a new media tag handle from the media database by the given @a tag_id.
  *          Media tag will be created and will be filled with tag information.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a folder using media_tag_destroy().
  *
@@ -322,7 +322,7 @@ int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag);
 
 /**
  * @brief Adds a new media info to the tag.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] tag      The media tag handle
  * @param[in] media_id The ID to the media info which is added
@@ -345,7 +345,7 @@ int media_tag_add_media(media_tag_h tag, const char *media_id);
 
 /**
  * @brief Removes the media info from the given tag.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] tag      The media tag handle
  * @param[in] media_id The ID to the media info which is removed
@@ -368,7 +368,7 @@ int media_tag_remove_media(media_tag_h tag, const char *media_id);
 
 /**
  * @brief Sets the name of the tag.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] tag      The media tag handle
  * @param[in] tag_name The name of the media tag
@@ -392,7 +392,7 @@ int media_tag_set_name(media_tag_h tag, char *tag_name);
  *          database. For example, after using media_tag_set_name() for setting the name of the tag, the media_tag_update_to_db() function should be called so as to update
  *          the given tag attributes in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index dc388d0..090add9 100755 (executable)
@@ -30,8 +30,8 @@ extern "C" {
  *@internal
  */
 
-int _media_util_check_file(const char *path);
-
+int _media_util_check_file_exist(const char *path);
+int _media_util_check_ignore_file(const char *path, bool *ignore);
 int _media_util_check_ignore_dir(const char *dir_path, bool *ignore);
 
 
index 560bb9a..c73be4a 100755 (executable)
@@ -42,7 +42,7 @@ extern "C" {
  * @details This function copies the video metadata handle from a source to 
  *          destination.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release the destination handle using video_meta_destroy().
  *
@@ -67,7 +67,7 @@ int video_meta_clone(video_meta_h *dst, video_meta_h src);
  *          no longer can be used to perform any operation. A new handle has to
  *          be created before the next use.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] video The video metadata handle
  *
@@ -86,7 +86,7 @@ int video_meta_destroy(video_meta_h video);
 
 /**
  * @brief Gets the ID of the media of the given video metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a media_id using free().
  *
@@ -107,7 +107,7 @@ int video_meta_get_media_id(video_meta_h video, char **media_id);
  * @brief Gets the video's album.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album using free().
  *
@@ -128,7 +128,7 @@ int video_meta_get_album(video_meta_h video, char **album);
  * @brief Gets the video artist.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a artist using free().
  *
@@ -149,7 +149,7 @@ int video_meta_get_artist(video_meta_h video, char **artist);
  * @brief Gets the video album artist.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a album_artist using free().
  *
@@ -170,7 +170,7 @@ int video_meta_get_album_artist(video_meta_h video, char **album_artist);
  * @brief Gets the video genre.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a genre using free().
  *
@@ -191,7 +191,7 @@ int video_meta_get_genre(video_meta_h video, char **genre);
  * @brief Gets the video composer.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a composer using free().
  *
@@ -212,7 +212,7 @@ int video_meta_get_composer(video_meta_h video, char **composer);
  * @brief Gets the year of the video.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a year using free().
  *
@@ -231,7 +231,7 @@ int video_meta_get_year(video_meta_h video, char **year);
 
 /**
  * @brief Gets the recorded date of the video.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a recorded_date using free().
  *
@@ -250,7 +250,7 @@ int video_meta_get_recorded_date(video_meta_h video, char **recorded_date);
 
 /**
  * @brief Gets the video copyright.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a copyright using free().
  *
@@ -271,7 +271,7 @@ int video_meta_get_copyright(video_meta_h video, char **copyright);
  * @brief Gets the track number of the video.
  * @details If the value is an empty string, the method returns "Unknown".
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a track_num using free().
  *
@@ -290,7 +290,7 @@ int video_meta_get_track_num(video_meta_h video, char **track_num);
 
 /**
  * @brief Gets the video bit rate.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks You must release @a bit_rate using free().
  *
@@ -309,7 +309,7 @@ int video_meta_get_bit_rate(video_meta_h video, int *bit_rate);
 
 /**
  * @brief Gets the duration of video metadata.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video    The video metadata handle
  * @param[out] duration The video duration in milliseconds
@@ -325,7 +325,7 @@ int video_meta_get_duration(video_meta_h video, int *duration);
 
 /**
  * @brief Gets the video width in pixels.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video The video metadata handle
  * @param[out] width The video width in pixels
@@ -341,7 +341,7 @@ int video_meta_get_width(video_meta_h video, int *width);
 
 /**
  * @brief Gets the video height in pixels.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video  The video metadata handle
  * @param[out] height The video height in pixels
@@ -358,7 +358,7 @@ int video_meta_get_height(video_meta_h video, int *height);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_get_played_count() instead]
  * @brief Gets the played count of the video.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video        The video metadata handle
  * @param[out] played_count The number of played
@@ -375,7 +375,7 @@ int video_meta_get_played_count(video_meta_h video, int *played_count);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_get_played_time() instead]
  * @brief Gets the last played time parameter of the video.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video       The video metadata handle
  * @param[out] played_time The time last played in the video
@@ -395,7 +395,7 @@ int video_meta_get_played_time(video_meta_h video, time_t *played_time);
  * @details This function returns the elapsed playback time parameter of the video as period
  *          starting from the beginning of the movie.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in]  video           The video metadata handle
  * @param[out] played_position The position from the beginning of the video (in milliseconds)
@@ -412,7 +412,7 @@ int video_meta_get_played_position(video_meta_h video, int *played_position);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_increase_played_count() instead]
  * @brief Sets the played count of the video.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] video        The video metadata handle
  * @param[in] played_count The number of played
@@ -431,7 +431,7 @@ int video_meta_set_played_count(video_meta_h video, int played_count);
 /**
  * @deprecated Deprecated since 2.4. [Use media_info_set_played_time() instead]
  * @brief Sets the time last played parameter of the video.
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @param[in] video       The video metadata handle
  * @param[in] played_time The time last played in the video
@@ -453,7 +453,7 @@ int video_meta_set_played_time(video_meta_h video, time_t played_time);
  * @details This function returns video's elapsed playback time parameter as period
  *          starting from the beginning of the movie.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @remarks  It is NOT recommended to use this attribute for your application-specific purpose because this attribute can be overwritten by other applications (even 0).
  *
@@ -478,7 +478,7 @@ int video_meta_set_played_position(video_meta_h video, int played_position);
  *          database. For example, after using video_meta_get_played_time() for setting the played time of the video, the video_meta_update_to_db() function should be called so as to update
  *          the given video attributes in the media database.
  *
- * @since_tizen 2.3
+ * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  *
  * @privlevel public
  * @privilege %http://tizen.org/privilege/content.write
index bbfe521..9d408ee 100755 (executable)
@@ -12,6 +12,7 @@ BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(libmedia-service)
 BuildRequires:  pkgconfig(media-thumbnail)
 BuildRequires:  pkgconfig(libmedia-utils)
+BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(libtzplatform-config)
 
 %description
index d2970e6..551f0cb 100755 (executable)
@@ -704,7 +704,7 @@ int audio_meta_update_to_db(audio_meta_h audio)
 
                sql = sqlite3_mprintf(UPDATE_AV_META_FROM_MEDIA, storage_id, _audio->played_count, _audio->played_time, _audio->played_position, _audio->media_id);
                ret = _content_query_sql(sql);
-               sqlite3_free(sql);
+               SQLITE3_SAFE_FREE(sql);
        }
        else
        {
index f3c6a93..edb94b5 100755 (executable)
@@ -27,7 +27,7 @@ int media_bookmark_insert_to_db(const char *media_id, time_t time, const char *t
        {
                sql = sqlite3_mprintf(INSERT_BOOKMARK_TO_BOOKMARK, media_id, time, thumbnail_path);
                ret = _content_query_sql(sql);
-               sqlite3_free(sql);
+               SQLITE3_SAFE_FREE(sql);
        }
        else
        {
@@ -53,7 +53,7 @@ int media_bookmark_delete_from_db(int bookmark_id)
 
        ret = _content_query_sql(query_str);
 
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
index 457cf2f..4d13adc 100755 (executable)
@@ -41,7 +41,6 @@ static int __media_content_create_alias_attr_handle(void);
 static int __media_content_create_attribute_handle(void);
 static int __media_content_destroy_attribute_handle(void);
 
-
 static int __media_content_create_attr_handle(void)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
@@ -269,6 +268,13 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, BOOKMARK_MARKED_TIME, DB_FIELD_BOOKMARK_MARKED_TIME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       /* Storage*/
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_STORAGE_ID, DB_FIELD_STORAGE_ID);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_STORAGE_PATH, DB_FIELD_STORAGE_PATH);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        return ret;
 }
 
@@ -498,6 +504,8 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_ORDER, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_ORDER);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_PARENT_FOLDER_ID, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_PARENT_FOLDER_ID);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
        /* Playlist*/
        ret = _media_filter_attribute_add(g_alias_attr_handle, PLAYLIST_NAME, DB_TABLE_ALIAS_PLAYLIST"."DB_FIELD_PLAYLIST_NAME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -680,7 +688,6 @@ int media_content_connect(void)
                                        ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
                                        if(ret == MEDIA_CONTENT_ERROR_NONE) {
                                                ref_count++;
-                                               //__media_content_create_collate();
                                        } else {
                                                __media_content_destroy_attribute_handle();
                                        }
@@ -771,22 +778,35 @@ int media_content_disconnect(void)
 int media_content_scan_file(const char *path)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
+       bool ignore_file = FALSE;
        bool ignore_dir = FALSE;
        char *folder_path = NULL;
        int check_file = MEDIA_CONTENT_ERROR_NONE;
+       char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
 
        media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
 
        media_content_sec_debug("Path : %s", path);
 
-       check_file = _media_util_check_file(path);
+       ret = _media_util_check_ignore_file(path, &ignore_file);
+       media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
+
+       memset(storage_id, 0x00, sizeof(storage_id));
+       ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id);
+       if(ret != MS_MEDIA_ERR_NONE)
+       {
+               media_content_error("media_svc_get_storage_id failed : %d", ret);
+               return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+       }
+
+       check_file = _media_util_check_file_exist(path);
        if (check_file == MEDIA_CONTENT_ERROR_NONE) {
                /* This means this path has to be inserted or refreshed */
                folder_path = g_path_get_dirname(path);
                ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
                SAFE_FREE(folder_path);
 
-               media_content_retvm_if(ignore_dir, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
+               media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
 
                media_svc_storage_type_e storage_type;
 
@@ -795,10 +815,10 @@ int media_content_scan_file(const char *path)
                        media_content_sec_error("media_svc_get_storage_type failed : %d (%s)", ret, path);
                        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
                }
-               ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), path);
+               ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), storage_id, path);
                if (ret == MS_MEDIA_ERR_NONE) {
                        /* Refresh */
-                       ret = media_svc_refresh_item(_content_get_db_handle(), storage_type, "media", path,tzplatform_getuid(TZ_USER_NAME));
+                       ret = media_svc_refresh_item(_content_get_db_handle(), storage_id, storage_type, path,tzplatform_getuid(TZ_USER_NAME));
                        if(ret != MS_MEDIA_ERR_NONE) {
                                media_content_error("media_svc_refresh_item failed : %d", ret);
                                return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
@@ -806,7 +826,7 @@ int media_content_scan_file(const char *path)
 
                } else if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
                        /* Insert */
-                       ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_type, path,tzplatform_getuid(TZ_USER_NAME));
+                       ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, storage_type, path,tzplatform_getuid(TZ_USER_NAME));
                        if(ret != MS_MEDIA_ERR_NONE) {
                                if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
                                        media_content_sec_error("This item is already inserted. This may be normal operation because other process already did this (%s)", path);
@@ -827,7 +847,7 @@ int media_content_scan_file(const char *path)
        } else {
                /* This means this path has to be deleted */
                media_content_debug("This path doesn't exists in file system... So now start to delete it from DB");
-               ret = media_svc_delete_item_by_path(_content_get_db_handle(), "media", path, tzplatform_getuid(TZ_USER_NAME));
+               ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, tzplatform_getuid(TZ_USER_NAME));
                if(ret != MS_MEDIA_ERR_NONE) {
                        media_content_error("media_svc_delete_item_by_path failed : %d", ret);
                        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
@@ -875,14 +895,16 @@ static int __media_content_check_dir(const char *path)
        return MEDIA_CONTENT_ERROR_NONE;
 }
 
-
 int media_content_scan_folder(const char *path, bool is_recursive, media_scan_completed_cb callback, void *user_data)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        bool ignore_dir = FALSE;
+       char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
 
        media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
 
+       memset(storage_id, 0x00, sizeof(storage_id));
+
        ret = _media_util_check_ignore_dir(path, &ignore_dir);
        media_content_retvm_if(ignore_dir, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
 
@@ -896,7 +918,10 @@ int media_content_scan_folder(const char *path, bool is_recursive, media_scan_co
        cb_data->callback = callback;
        cb_data->user_data = user_data;
 
-       ret = media_directory_scanning_async(path, is_recursive, _media_content_scan_cb, cb_data, tzplatform_getuid(TZ_USER_NAME));
+       ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id);
+       /*FIX ME. need to check ret value?*/
+
+       ret = media_directory_scanning_async(path, storage_id, is_recursive, _media_content_scan_cb, cb_data, tzplatform_getuid(TZ_USER_NAME));
        if(ret != MS_MEDIA_ERR_NONE) {
                media_content_error("media_directory_scanning_async failed : %d", ret);
        }
index 9d4b4ba..c042b6e 100755 (executable)
@@ -444,6 +444,9 @@ int _media_db_get_folder(filter_h filter, media_folder_cb callback, void *user_d
 
                _folder->folder_order = (int)sqlite3_column_int(stmt, 6);
 
+               if(STRING_VALID((const char *)sqlite3_column_text(stmt, 7)))
+                       _folder->parent_folder_id= strdup((const char *)sqlite3_column_text(stmt, 7));
+
                if(callback((media_folder_h)_folder, user_data) == false)
                {
                        media_folder_destroy((media_folder_h) _folder);
@@ -816,7 +819,7 @@ int _media_db_get_group_item_count(const char *group_name, filter_h filter, grou
        if(ret != MEDIA_CONTENT_ERROR_NONE)
        {
                if(tmp_query != NULL)
-                       sqlite3_free(tmp_query);
+                       SQLITE3_SAFE_FREE(tmp_query);
                return ret;
        }
 
@@ -837,7 +840,7 @@ int _media_db_get_group_item_count(const char *group_name, filter_h filter, grou
 
        ret = _content_query_prepare(&stmt, select_query, condition_query, option_query);
        if(tmp_query != NULL)
-               sqlite3_free(tmp_query);
+               SQLITE3_SAFE_FREE(tmp_query);
        SAFE_FREE(condition_query);
        SAFE_FREE(option_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -1036,7 +1039,7 @@ int _media_db_get_media_group_item_count(const char *group_name, filter_h filter
        if(ret != MEDIA_CONTENT_ERROR_NONE)
        {
                if(tmp_query != NULL)
-                       sqlite3_free(tmp_query);
+                       SQLITE3_SAFE_FREE(tmp_query);
                return ret;
        }
 
@@ -1052,7 +1055,7 @@ int _media_db_get_media_group_item_count(const char *group_name, filter_h filter
 
        ret = _content_query_prepare(&stmt, select_query, condition_query, option_query);
        if(tmp_query != NULL)
-               sqlite3_free(tmp_query);
+               SQLITE3_SAFE_FREE(tmp_query);
        SAFE_FREE(condition_query);
        SAFE_FREE(option_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -1102,13 +1105,13 @@ int _media_db_get_media_group_item(const char *group_name, filter_h filter, medi
        if(ret != MEDIA_CONTENT_ERROR_NONE)
        {
                if(tmp_query != NULL)
-                       sqlite3_free(tmp_query);
+                       SQLITE3_SAFE_FREE(tmp_query);
                return ret;
        }
 
        ret = _content_query_prepare(&stmt, select_query, condition_query, option_query);
        if(tmp_query != NULL)
-               sqlite3_free(tmp_query);
+               SQLITE3_SAFE_FREE(tmp_query);
        SAFE_FREE(condition_query);
        SAFE_FREE(option_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -1213,7 +1216,7 @@ int _media_db_get_storage_id_by_media_id(const char *media_id, char *storage_id)
        select_query = sqlite3_mprintf(SELECT_MEDIA_STORAGE_ID_BY_ID, media_id);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        if(sqlite3_step(stmt) == SQLITE_ROW)
index 11f25b9..87e81f9 100755 (executable)
 
 static char *g_src_path = NULL;
 
-static char *__media_folder_get_update_folder_sql(media_folder_h folder);
-
-static char *__media_folder_get_update_folder_sql(media_folder_h folder)
-{
-       media_folder_s *_folder = (media_folder_s*)folder;
-       char *return_sql = NULL;
-       char *name_pinyin = NULL;
-       bool pinyin_support = FALSE;
-
-       /*Update Pinyin If Support Pinyin*/
-       media_svc_check_pinyin_support(&pinyin_support);
-       if(pinyin_support)
-               media_svc_get_pinyin(_content_get_db_handle(), _folder->name, &name_pinyin);
-
-       return_sql = sqlite3_mprintf("%q='%q', %q='%q', %q=%d, %q='%q'",
-                                                                                       DB_FIELD_FOLDER_PATH, _folder->path,
-                                                                                       DB_FIELD_FOLDER_NAME, _folder->name,
-                                                                                       DB_FIELD_FOLDER_MODIFIED_TIME, _folder->modified_time,
-                                                                                       DB_FIELD_FOLDER_NAME_PINYIN, name_pinyin);
-
-       SAFE_FREE(name_pinyin);
-       return return_sql;
-}
-
 int media_folder_get_folder_count_from_db(filter_h filter, int *folder_count)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
@@ -117,6 +93,7 @@ int media_folder_destroy(media_folder_h folder)
                SAFE_FREE(_folder->path);
                SAFE_FREE(_folder->name);
                SAFE_FREE(_folder->folder_id);
+               SAFE_FREE(_folder->parent_folder_id);
                SAFE_FREE(_folder->storage_uuid);
                SAFE_FREE(_folder);
                ret = MEDIA_CONTENT_ERROR_NONE;
@@ -150,7 +127,16 @@ int media_folder_clone(media_folder_h *dst, media_folder_h src)
                        }
                }
 
-               _dst->storage_type = _src->storage_type;
+               if(STRING_VALID(_src->parent_folder_id))
+               {
+                       _dst->parent_folder_id = strdup(_src->parent_folder_id);
+                       if(_dst->parent_folder_id == NULL)
+                       {
+                               media_folder_destroy((media_folder_h)_dst);
+                               media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
+                               return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
+                       }
+               }
 
                if(STRING_VALID(_src->name))
                {
@@ -185,6 +171,10 @@ int media_folder_clone(media_folder_h *dst, media_folder_h src)
                        }
                }
 
+               _dst->storage_type = _src->storage_type;
+               _dst->modified_time = _src->modified_time;
+               _dst->folder_order= _src->folder_order;
+
                *dst = (media_folder_h)_dst;
 
                ret = MEDIA_CONTENT_ERROR_NONE;
@@ -225,6 +215,33 @@ int media_folder_get_folder_id(media_folder_h folder, char **folder_id)
        return ret;
 }
 
+int media_folder_get_parent_folder_id(media_folder_h folder, char **parent_folder_id)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+       media_folder_s *_folder = (media_folder_s*)folder;
+
+       if(_folder)
+       {
+               if(STRING_VALID(_folder->parent_folder_id))
+               {
+                       *parent_folder_id = strdup(_folder->parent_folder_id);
+                       media_content_retvm_if(*parent_folder_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+               }
+               else
+               {
+                       *parent_folder_id = NULL;
+               }
+               ret = MEDIA_CONTENT_ERROR_NONE;
+       }
+       else
+       {
+               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+               ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       }
+
+       return ret;
+}
+
 int media_folder_get_path(media_folder_h folder, char **path)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
@@ -425,7 +442,6 @@ int media_folder_update_to_db(media_folder_h folder)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_folder_s *_folder = (media_folder_s*)folder;
-       char *set_sql = NULL;
        char *sql = NULL;
 
        if((_folder == NULL) || (_folder->folder_id == NULL))
@@ -438,31 +454,46 @@ int media_folder_update_to_db(media_folder_h folder)
        sql = sqlite3_mprintf(UPDATE_FOLDER_ORDER, _folder->folder_order, _folder->folder_id);
 
        ret = _content_query_sql(sql);
-       sqlite3_free(sql);
+       SQLITE3_SAFE_FREE(sql);
 
        if(STRING_VALID(_folder->folder_id) && g_src_path)
        {
+               char *name_pinyin = NULL;
+               bool pinyin_support = FALSE;
+
                /* Set modified time */
                time_t date;
                time(&date);
                _folder->modified_time = date;
 
-               set_sql = __media_folder_get_update_folder_sql((media_folder_h)_folder);
-               if(set_sql == NULL)
-               {
+               /*Update Pinyin If Support Pinyin*/
+               media_svc_check_pinyin_support(&pinyin_support);
+               if(pinyin_support)
+                       media_svc_get_pinyin(_content_get_db_handle(), _folder->name, &name_pinyin);
+
+               sql = sqlite3_mprintf("UPDATE %Q SET path='%q', name='%q', modified_time=%d, name_pinyin='%q' WHERE folder_uuid=%Q",
+                                               DB_TABLE_FOLDER,  _folder->path, _folder->name, _folder->modified_time, name_pinyin, _folder->folder_id);
+
+               ret = _content_query_sql(sql);
+               SQLITE3_SAFE_FREE(sql);
+               if (ret != MEDIA_CONTENT_ERROR_NONE) {
                        SAFE_FREE(g_src_path);
-                       media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
-                       return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
+                       return ret;
                }
 
-               sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE folder_uuid=%Q", DB_TABLE_FOLDER, set_sql, _folder->folder_id);
+               /* Update all folder record's path, which are matched by old parent path */
+               char *update_folder_path_sql = NULL;
+               char src_path_slash[MAX_QUERY_SIZE + 1] = {0, };
+               char dst_path_slash[MAX_QUERY_SIZE + 1] = {0, };
 
-               ret = _content_query_sql(sql);
+               snprintf(src_path_slash, sizeof(src_path_slash), "%s/", g_src_path);
+               snprintf(dst_path_slash, sizeof(dst_path_slash), "%s/", _folder->path);
 
-               sqlite3_free(set_sql);
-               sqlite3_free(sql);
-               if (ret != MEDIA_CONTENT_ERROR_NONE)
-               {
+               update_folder_path_sql = sqlite3_mprintf("UPDATE folder SET path = REPLACE( path, '%q', '%q');", src_path_slash, dst_path_slash);
+
+               ret = _content_query_sql(update_folder_path_sql);
+               SQLITE3_SAFE_FREE(update_folder_path_sql);
+               if (ret != MEDIA_CONTENT_ERROR_NONE) {
                        SAFE_FREE(g_src_path);
                        return ret;
                }
@@ -486,12 +517,20 @@ int media_folder_set_name(media_folder_h folder, const char *name)
                if (STRING_VALID(_folder->path) && STRING_VALID(_folder->name)) {
                        char *folder_path = NULL;
                        char new_folder_path[MAX_QUERY_SIZE] = {0,};
+                       bool ignore_dir = FALSE;
 
                        folder_path = g_path_get_dirname(_folder->path);
                        media_content_sec_debug("Existed Folder Path : %s", _folder->path);
                        snprintf(new_folder_path, sizeof(new_folder_path), "%s/%s", folder_path, name); 
                        media_content_sec_debug("New Path : %s", new_folder_path);
 
+                       ret = _media_util_check_ignore_dir(new_folder_path, &ignore_dir);
+                       if (ignore_dir == TRUE) {
+                               media_content_error("Invalid folder path");
+                               SAFE_FREE(folder_path);
+                               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+                       }
+
                        SAFE_FREE(g_src_path);
                        g_src_path = strdup(_folder->path);
 
index ff06636..2232b81 100755 (executable)
@@ -448,7 +448,7 @@ int image_meta_update_to_db(image_meta_h image)
 
                sql = sqlite3_mprintf(UPDATE_IMAGE_META_FROM_MEDIA, storage_id, _image->orientation, _image->weather, _image->media_id);
                ret = _content_query_sql(sql);
-               sqlite3_free(sql);
+               SQLITE3_SAFE_FREE(sql);
        }
        else
        {
index 7ad6d87..cfb2e64 100755 (executable)
@@ -35,7 +35,7 @@ static int __media_info_get_media_path_by_id_from_db(const char *media_id, char
        select_query = sqlite3_mprintf(SELECT_MEDIA_PATH_BY_ID, media_id);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        if(sqlite3_step(stmt) == SQLITE_ROW)
@@ -175,7 +175,7 @@ static int __media_info_insert_batch(media_batch_insert_e insert_type, const cha
                if (STRING_VALID(path_array[idx])) {
                        int size = strlen(path_array[idx]);
 
-                       ret = _media_util_check_file(path_array[idx]);
+                       ret = _media_util_check_file_exist(path_array[idx]);
                        if (ret != MEDIA_CONTENT_ERROR_NONE) {
                                fclose(fp);
                                if (unlink(list_path) < 0) {
@@ -454,7 +454,7 @@ int _media_info_get_media_info_from_db(const char *path, const char *storage_id,
        select_query = sqlite3_mprintf(SELECT_MEDIA_BY_PATH, storage_id, path);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        if(sqlite3_step(stmt) == SQLITE_ROW)
@@ -472,23 +472,36 @@ int _media_info_get_media_info_from_db(const char *path, const char *storage_id,
 
 int media_info_insert_to_db(const char *path, media_info_h *info)
 {
+       bool ignore_file = FALSE;
        bool ignore_dir = FALSE;
        char *folder_path = NULL;
+       char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
        media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
        media_content_retvm_if(info == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
 
-       ret = _media_util_check_file(path);
+       ret = _media_util_check_ignore_file(path, &ignore_file);
+       media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
+
+       ret = _media_util_check_file_exist(path);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        folder_path = g_path_get_dirname(path);
        ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
        SAFE_FREE(folder_path);
 
-       media_content_retvm_if(ignore_dir, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
+       media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
+
+       memset(storage_id, 0x00, sizeof(storage_id));
+       ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id);
+       if(ret != MS_MEDIA_ERR_NONE)
+       {
+               media_content_error("media_svc_get_storage_id failed : %d", ret);
+               return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+       }
 
-       ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), path);
+       ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), storage_id, path);
        if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
                media_content_sec_debug("media_svc_check_item_exist_by_path : no record : %s", path);
 
@@ -500,7 +513,7 @@ int media_info_insert_to_db(const char *path, media_info_h *info)
                        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
                }
 
-               ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_type, path, tzplatform_getuid(TZ_USER_NAME));
+               ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, storage_type, path, tzplatform_getuid(TZ_USER_NAME));
 
                if(ret != MS_MEDIA_ERR_NONE) {
                        if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
@@ -675,15 +688,25 @@ int media_info_delete_batch_from_db(filter_h filter)
                        In this case, send noti for internal storage and external storage
                */
                media_content_debug("Batch deletion is successfull. Send notification for this");
-               media_svc_publish_noti(_content_get_db_handle(), MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_CONTENT_PATH_PHONE, -1, NULL, NULL);
-               media_svc_publish_noti(_content_get_db_handle(), MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_CONTENT_PATH_MMC, -1, NULL, NULL);
+               if (_filter->storage_id != NULL) {
+                       char *storage_path = NULL;
+                       media_svc_get_storage_path(_content_get_db_handle(), _filter->storage_id, &storage_path);
+                       if (STRING_VALID(storage_path))
+                               media_svc_publish_noti(_content_get_db_handle(), MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, storage_path, -1, NULL, NULL);
+
+                       SAFE_FREE(storage_path);
+               } else {
+                       /*FIX ME*/
+                       media_svc_publish_noti(_content_get_db_handle(), MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_INTERNAL, -1, NULL, NULL);
+                       media_svc_publish_noti(_content_get_db_handle(), MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_SDCARD, -1, NULL, NULL);
+               }
 
                __media_info_delete_thumb_from_list(thumb_list);
                __media_info_release_thumb_list(thumb_list);
        }
 
        SAFE_FREE(condition_query);
-       sqlite3_free(query_string);
+       SQLITE3_SAFE_FREE(query_string);
 
        return ret;
 }
@@ -2769,7 +2792,7 @@ int media_info_update_to_db(media_info_h media)
                /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
                /* This code will be removed when sqlite3_mprintf works clearly */
                char *test_sql = sqlite3_mprintf("%f, %f, %f", _media->longitude, _media->latitude, _media->altitude);
-               sqlite3_free(test_sql);
+               SQLITE3_SAFE_FREE(test_sql);
 
                /*Update Pinyin If Support Pinyin*/
                char *file_name_pinyin = NULL;
@@ -2818,8 +2841,8 @@ int media_info_update_to_db(media_info_h media)
                sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_uuid=%Q", _media->storage_uuid, set_sql, _media->media_id);
 
                ret = _content_query_sql(sql);
-               sqlite3_free(set_sql);
-               sqlite3_free(sql);
+               SQLITE3_SAFE_FREE(set_sql);
+               SQLITE3_SAFE_FREE(sql);
 
                SAFE_FREE(description_pinyin);
                SAFE_FREE(author_pinyin);
@@ -2830,6 +2853,38 @@ int media_info_update_to_db(media_info_h media)
                SAFE_FREE(age_rating_pinyin);
                SAFE_FREE(keyword_pinyin);
 
+               if(_media->storage_type == MEDIA_CONTENT_STORAGE_CLOUD)
+               {
+                       set_sql = NULL;
+                       sql = NULL;
+
+                       if(_media->media_type == MEDIA_CONTENT_TYPE_VIDEO)
+                       {
+                               set_sql = sqlite3_mprintf("title=%Q, album=%Q, artist=%Q, genre=%Q, duration=%d, width=%d, height=%d", \
+                               _media->title, _media->video_meta->album, _media->video_meta->artist, _media->video_meta->genre, _media->video_meta->duration, _media->video_meta->width, _media->video_meta->height);
+                       }
+                       else if((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND))
+                       {
+                               set_sql = sqlite3_mprintf("title=%Q, album=%Q, artist=%Q, genre=%Q, duration=%d", \
+                               _media->title, _media->audio_meta->album, _media->audio_meta->artist, _media->audio_meta->genre, _media->audio_meta->duration);
+                       }
+                       else if(_media->media_type == MEDIA_CONTENT_TYPE_IMAGE)
+                       {
+                               set_sql = sqlite3_mprintf("title=%Q, width=%d, height=%d", _media->title, _media->image_meta->width, _media->image_meta->height);
+                       }
+                       else
+                       {
+                               set_sql = sqlite3_mprintf("title=%Q", _media->title);
+                       }
+
+                       sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_uuid=%Q", _media->storage_uuid, set_sql, _media->media_id);
+
+                       ret = _content_query_sql(sql);
+
+                       SQLITE3_SAFE_FREE(set_sql);
+                       SQLITE3_SAFE_FREE(sql);
+               }
+
                if (ret == MEDIA_CONTENT_ERROR_NONE) {
                        /*  Send notification for this update */
                        media_content_debug("Update is successfull. Send notification for this");
@@ -2855,6 +2910,7 @@ int media_info_refresh_metadata_to_db(const char *media_id)
        media_info_h media = NULL;
        char *file_path = NULL;
        media_content_storage_e storage_type = 0;
+       char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
 
        if(!STRING_VALID(media_id))
        {
@@ -2876,6 +2932,13 @@ int media_info_refresh_metadata_to_db(const char *media_id)
                return ret;
        }
 
+       if(storage_type == MEDIA_CONTENT_STORAGE_CLOUD)
+       {
+               media_info_destroy(media);
+               media_content_error("Can't refresh cloud content!!");
+               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       }
+
        ret = media_info_get_file_path(media, &file_path);
        if(ret != MEDIA_CONTENT_ERROR_NONE)
        {
@@ -2883,14 +2946,24 @@ int media_info_refresh_metadata_to_db(const char *media_id)
                return ret;
        }
 
-       ret = _media_util_check_file(file_path);
+       ret = _media_util_check_file_exist(file_path);
        if (ret != MEDIA_CONTENT_ERROR_NONE) {
                SAFE_FREE(file_path);
                media_info_destroy(media);
                return ret;
        }
 
-       ret = media_svc_refresh_item(_content_get_db_handle(), storage_type, "media", file_path, tzplatform_getuid(TZ_USER_NAME));
+       memset(storage_id, 0x00, sizeof(storage_id));
+       ret = media_svc_get_storage_id(_content_get_db_handle(), file_path, storage_id);
+       if(ret != MS_MEDIA_ERR_NONE)
+       {
+               media_content_error("media_svc_get_storage_id failed : %d", ret);
+               SAFE_FREE(file_path);
+               media_info_destroy(media);
+               return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+       }
+
+       ret = media_svc_refresh_item(_content_get_db_handle(), storage_id, storage_type, file_path, tzplatform_getuid(TZ_USER_NAME));
        if (ret != MS_MEDIA_ERR_NONE)
        {
                ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
@@ -2905,18 +2978,30 @@ int media_info_refresh_metadata_to_db(const char *media_id)
 int media_info_move_to_db(media_info_h media, const char* dst_path)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
-
+       bool ignore_file = FALSE;
+       bool ignore_dir = FALSE;
+       char *folder_path = NULL;
        media_svc_storage_type_e src_storage_type = 0;
        media_svc_storage_type_e dst_storage_type = 0;
+       char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
 
        media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
        media_content_retvm_if(!STRING_VALID(dst_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid dst_path");
 
        media_info_s *_media = (media_info_s*)media;
 
-       ret = _media_util_check_file(dst_path);
+       ret = _media_util_check_ignore_file(dst_path, &ignore_file);
+       media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
+
+       ret = _media_util_check_file_exist(dst_path);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       folder_path = g_path_get_dirname(dst_path);
+       ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
+       SAFE_FREE(folder_path);
+
+       media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
+
        ret = media_svc_get_storage_type(_media->file_path, &src_storage_type, tzplatform_getuid(TZ_USER_NAME));
        if(ret != MS_MEDIA_ERR_NONE)
        {
@@ -2931,7 +3016,15 @@ int media_info_move_to_db(media_info_h media, const char* dst_path)
                return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
        }
 
-       ret = media_svc_move_item(_content_get_db_handle(), src_storage_type, _media->file_path, dst_storage_type, dst_path, tzplatform_getuid(TZ_USER_NAME));
+       memset(storage_id, 0x00, sizeof(storage_id));
+       ret = media_svc_get_storage_id(_content_get_db_handle(), _media->file_path, storage_id);
+       if(ret != MS_MEDIA_ERR_NONE)
+       {
+               media_content_error("media_svc_get_storage_id failed : %d", ret);
+               return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+       }
+
+       ret = media_svc_move_item(_content_get_db_handle(), storage_id, src_storage_type, _media->file_path, dst_storage_type, dst_path, tzplatform_getuid(TZ_USER_NAME));
        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
 
@@ -2980,6 +3073,85 @@ int media_info_cancel_thumbnail(media_info_h media)
        return ret;
 }
 
+static int __media_info_map_data_usr_to_svc(media_info_s *media, media_svc_content_info_s **service_content, media_content_storage_e storage_type)
+{
+       if(media == NULL)
+       {
+               media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       }
+
+       media_svc_content_info_s *svc_content_info = calloc(1, sizeof(media_svc_content_info_s));
+       media_content_retvm_if(svc_content_info == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       svc_content_info->path = g_strdup(media->file_path);
+       svc_content_info->media_type = media->media_type;
+       svc_content_info->mime_type = g_strdup(media->mime_type);
+       svc_content_info->size = media->size;
+       svc_content_info->storage_type = storage_type;
+       svc_content_info->storage_uuid = g_strdup(media->storage_uuid);
+
+       svc_content_info->added_time = media->added_time;
+       svc_content_info->modified_time = media->modified_time;
+       svc_content_info->thumbnail_path = g_strdup(media->thumbnail_path);
+       svc_content_info->is_drm = media->is_drm;
+
+       svc_content_info->media_meta.title = g_strdup(media->title);
+       svc_content_info->media_meta.rating = media->rating;
+       svc_content_info->media_meta.description = g_strdup(media->description);
+       svc_content_info->media_meta.longitude = media->longitude;
+       svc_content_info->media_meta.latitude = media->latitude;
+       svc_content_info->media_meta.altitude = media->altitude;
+       svc_content_info->media_meta.weather = g_strdup(media->weather);
+
+       switch(media->media_type)
+       {
+               case MEDIA_CONTENT_TYPE_IMAGE:
+                       svc_content_info->media_meta.width = media->image_meta->width;
+                       svc_content_info->media_meta.height = media->image_meta->height;
+                       svc_content_info->media_meta.datetaken = g_strdup(media->image_meta->date_taken);
+                       svc_content_info->media_meta.orientation = media->image_meta->orientation;
+                       break;
+               case MEDIA_CONTENT_TYPE_VIDEO:
+                       svc_content_info->media_meta.album = g_strdup(media->audio_meta->album);
+                       svc_content_info->media_meta.artist = g_strdup(media->audio_meta->artist);
+                       svc_content_info->media_meta.album_artist = g_strdup(media->audio_meta->album_artist);
+                       svc_content_info->media_meta.genre = g_strdup(media->audio_meta->genre);
+                       svc_content_info->media_meta.composer = g_strdup(media->audio_meta->composer);
+                       svc_content_info->media_meta.year = g_strdup(media->audio_meta->year);
+                       svc_content_info->media_meta.recorded_date = g_strdup(media->audio_meta->recorded_date);
+                       svc_content_info->media_meta.copyright = g_strdup(media->audio_meta->copyright);
+                       svc_content_info->media_meta.track_num = g_strdup(media->audio_meta->track_num);
+                       svc_content_info->media_meta.bitrate = media->audio_meta->bitrate;
+                       svc_content_info->media_meta.duration = media->audio_meta->duration;
+                       svc_content_info->media_meta.width = media->image_meta->width;
+                       svc_content_info->media_meta.height = media->image_meta->height;
+                       break;
+               case MEDIA_CONTENT_TYPE_SOUND:
+               case MEDIA_CONTENT_TYPE_MUSIC:
+                       svc_content_info->media_meta.album = g_strdup(media->audio_meta->album);
+                       svc_content_info->media_meta.artist = g_strdup(media->audio_meta->artist);
+                       svc_content_info->media_meta.album_artist = g_strdup(media->audio_meta->album_artist);
+                       svc_content_info->media_meta.genre = g_strdup(media->audio_meta->genre);
+                       svc_content_info->media_meta.composer = g_strdup(media->audio_meta->composer);
+                       svc_content_info->media_meta.year = g_strdup(media->audio_meta->year);
+                       svc_content_info->media_meta.recorded_date = g_strdup(media->audio_meta->recorded_date);
+                       svc_content_info->media_meta.copyright = g_strdup(media->audio_meta->copyright);
+                       svc_content_info->media_meta.track_num = g_strdup(media->audio_meta->track_num);
+                       svc_content_info->media_meta.bitrate = media->audio_meta->bitrate;
+                       svc_content_info->media_meta.duration = media->audio_meta->duration;
+                       svc_content_info->media_meta.channel = media->audio_meta->channel;
+                       svc_content_info->media_meta.samplerate = media->audio_meta->samplerate;
+                       break;
+               case MEDIA_CONTENT_TYPE_OTHERS:
+               default:
+                       break;
+       }
+
+       *service_content = svc_content_info;
+       return MEDIA_CONTENT_ERROR_NONE;
+}
+
 static int __media_info_set_str_data(media_info_h media, media_info_item_e data_type, const char *str_data)
 {
        media_info_s *_media = (media_info_s*)media;
@@ -3198,41 +3370,14 @@ int media_info_insert_to_db_with_data(media_info_h media, media_info_h *info)
 
        media_info_s *_media = (media_info_s*)media;
 
-       if(_media == NULL)
-       {
-               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if (!STRING_VALID(_media->file_path))
-       {
-               media_content_error("invalid media path");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if (!STRING_VALID(_media->mime_type))
-       {
-               media_content_error("invalid mime_type");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if (!STRING_VALID(_media->storage_uuid))
-       {
-               media_content_error("invalid storage_uuid");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if (!STRING_VALID(_media->title))
-       {
-               media_content_error("invalid title");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if(_media->storage_type < 0)
-       {
-               media_content_error("invalid storage_type");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
+       media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
+       media_content_retvm_if(!STRING_VALID(_media->file_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid file_path");
+       media_content_retvm_if(!STRING_VALID(_media->mime_type), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid mime_type");
+       media_content_retvm_if(!STRING_VALID(_media->storage_uuid), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid storage_uuid");
+       media_content_retvm_if(!STRING_VALID(_media->title), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid title");
+       media_content_retvm_if(_media->storage_type < 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid storage_type [%d]", _media->storage_type);
+       media_content_retvm_if(_media->size <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid size [%d]", _media->size);
+       media_content_retvm_if(_media->modified_time <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid modified_time [%d]", _media->modified_time);
 
        if ((_media->media_type < MEDIA_CONTENT_TYPE_IMAGE) || (_media->media_type > MEDIA_CONTENT_TYPE_OTHERS))
        {
@@ -3240,22 +3385,13 @@ int media_info_insert_to_db_with_data(media_info_h media, media_info_h *info)
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       if (_media->size <= 0)
-       {
-               media_content_error("invalid size [%d]", _media->size);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       if (_media->modified_time <= 0)
-       {
-               media_content_error("invalid modified_time [%d]", _media->modified_time);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
        media_content_sec_debug("storage[%d], path[%s], media_type[%d]", _media->storage_type, _media->file_path, _media->media_type);
 
        media_svc_content_info_s *svc_content_info = NULL;
 
+       ret = __media_info_map_data_usr_to_svc(_media, &svc_content_info, _media->storage_type);
+       media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "__media_info_map_data_usr_to_svc fail");
+
        if(svc_content_info == NULL)
        {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
@@ -3264,7 +3400,7 @@ int media_info_insert_to_db_with_data(media_info_h media, media_info_h *info)
 
        ret = media_svc_insert_item_immediately_with_data(_content_get_db_handle(), svc_content_info, tzplatform_getuid(TZ_USER_NAME));
        if(ret != MS_MEDIA_ERR_NONE) {
-               media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, _media->file_path);
+               media_content_sec_error("media_svc_insert_item_immediately_with_data failed : %d (%s)", ret, _media->file_path);
                media_svc_destroy_content_info(svc_content_info);
                SAFE_FREE(svc_content_info);
                return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
index 13dffbb..baa43be 100755 (executable)
 #define PLAYLIST_ARRAY_EXPAND                  10
 #define MAX_TMP_STR                                            2048
 
-static __thread GList *g_playlist_item_list = NULL;
-
-static void __media_playlist_item_add(media_playlist_item_s *item_s);
-static void __media_playlist_item_release(void);
+static void __media_playlist_item_add(media_playlist_s *playlist, media_playlist_item_s *item_s);
+static void __media_playlist_item_release(media_playlist_s *playlist);
 static int __media_playlist_insert_playlist_record(const char *playlist_name, int *playlist_id);
 static int __media_playlist_insert_item_to_playlist(int playlist_id, const char *media_id);
 static int __media_playlist_remove_item_from_playlist(int playlist_id, int playlist_member_id);
@@ -40,24 +38,24 @@ static int __media_playlist_import_item_from_file(const char* playlist_path, cha
 static int __media_playlist_destroy_import_item(char** item_list, int item_count);
 static void __media_playlist_destroy_export_item(gpointer data);
 
-static void __media_playlist_item_add(media_playlist_item_s *item_s)
+static void __media_playlist_item_add(media_playlist_s *playlist, media_playlist_item_s *item_s)
 {
-       g_playlist_item_list = g_list_append(g_playlist_item_list, item_s);
+       playlist->item_list = g_list_append(playlist->item_list, item_s);
 }
 
-static void __media_playlist_item_release(void)
+static void __media_playlist_item_release(media_playlist_s *playlist)
 {
        int idx = 0;
        int list_cnt = 0;
        media_playlist_item_s *item = NULL;
 
-       list_cnt = g_list_length(g_playlist_item_list);
+       list_cnt = g_list_length(playlist->item_list);
 
        media_content_debug("list_cnt : [%d]", list_cnt);
 
        for(idx = 0; idx < list_cnt; idx++)
        {
-               item = (media_playlist_item_s*)g_list_nth_data(g_playlist_item_list, idx);
+               item = (media_playlist_item_s*)g_list_nth_data(playlist->item_list, idx);
                if(item != NULL)
                {
                        SAFE_FREE(item->media_id);
@@ -67,8 +65,8 @@ static void __media_playlist_item_release(void)
                }
        }
 
-       g_list_free(g_playlist_item_list);
-       g_playlist_item_list = NULL;
+       g_list_free(playlist->item_list);
+       playlist->item_list = NULL;
 
 }
 
@@ -82,13 +80,13 @@ static int __media_playlist_insert_playlist_record(const char *playlist_name, in
        query_str = sqlite3_mprintf(INSERT_PLAYLIST_TO_PLAYLIST, playlist_name);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        select_query = sqlite3_mprintf(SELECT_PLAYLIST_ID_FROM_PLAYLIST, playlist_name);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        while(sqlite3_step(stmt) == SQLITE_ROW)
@@ -129,7 +127,7 @@ static int __media_playlist_insert_item_to_playlist(int playlist_id, const char
        query_str = sqlite3_mprintf("INSERT INTO %q (playlist_id, media_uuid, play_order) values (%d, '%q', %d)",
                        DB_TABLE_PLAYLIST_MAP, playlist_id, media_id, play_order);
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -142,7 +140,7 @@ static int __media_playlist_remove_item_from_playlist(int playlist_id, int playl
        query_str = sqlite3_mprintf(REMOVE_PLAYLIST_ITEM_FROM_PLAYLIST_MAP, playlist_id, playlist_member_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -155,7 +153,7 @@ static int __media_playlist_update_playlist_name(int playlist_id, const char *pl
        query_str = sqlite3_mprintf(UPDATE_PLAYLIST_NAME_FROM_PLAYLIST, playlist_name, playlist_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -168,7 +166,7 @@ static int __media_playlist_update_thumbnail_path(int playlist_id, const char *p
        query_str = sqlite3_mprintf(UPDATE_PLAYLIST_THUMBNAIL_FROM_PLAYLIST, path, playlist_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -181,7 +179,7 @@ static int __media_playlist_update_play_order(int playlist_id, int playlist_memb
        query_str = sqlite3_mprintf(UPDATE_PLAYLIST_ORDER_FROM_PLAYLIST_MAP, play_order, playlist_id, playlist_member_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -434,7 +432,7 @@ int media_playlist_delete_from_db(int playlist_id)
 
        ret = _content_query_sql(query_str);
 
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -749,7 +747,7 @@ int media_playlist_set_name(media_playlist_h playlist, const char *playlist_name
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_playlist_item_add(item);
+               __media_playlist_item_add(_playlist, item);
        }
        else
        {
@@ -790,7 +788,7 @@ int media_playlist_set_thumbnail_path(media_playlist_h playlist, const char *pat
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_playlist_item_add(item);
+               __media_playlist_item_add(_playlist, item);
        }
        else
        {
@@ -815,7 +813,7 @@ int media_playlist_set_play_order(media_playlist_h playlist, int playlist_member
                item->function = MEDIA_PLAYLIST_UPDATE_PLAY_ORDER;
                item->play_order = play_order;
 
-               __media_playlist_item_add(item);
+               __media_playlist_item_add(_playlist, item);
        }
        else
        {
@@ -846,7 +844,7 @@ int media_playlist_add_media(media_playlist_h playlist, const char *media_id)
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_playlist_item_add(item);
+               __media_playlist_item_add(_playlist, item);
        }
        else
        {
@@ -871,7 +869,7 @@ int media_playlist_remove_media(media_playlist_h playlist, int playlist_member_i
                item->playlist_member_id = playlist_member_id;
                item->function = MEDIA_PLAYLIST_REMOVE;
 
-               __media_playlist_item_add(item);
+               __media_playlist_item_add(_playlist, item);
        }
        else
        {
@@ -896,10 +894,15 @@ int media_playlist_update_to_db(media_playlist_h playlist)
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       length = g_list_length(g_playlist_item_list);
+       if(_playlist->item_list != NULL) {
+               length = g_list_length(_playlist->item_list);
+       } else {
+               media_content_debug("operation list length is 0");
+               return MEDIA_CONTENT_ERROR_NONE;
+       }
 
        for (idx = 0; idx < length; idx++) {
-               _playlist_item = (media_playlist_item_s*)g_list_nth_data(g_playlist_item_list, idx);
+               _playlist_item = (media_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
                if(_playlist_item != NULL) {
                        switch(_playlist_item->function) {
                                case MEDIA_PLAYLIST_ADD:
@@ -938,7 +941,7 @@ int media_playlist_update_to_db(media_playlist_h playlist)
                }
        }
 
-       __media_playlist_item_release();
+       __media_playlist_item_release(_playlist);
 
        return ret;
 }
@@ -989,7 +992,7 @@ int media_playlist_import_from_file(const char *path, const char *playlist_name,
                {
                        __media_playlist_destroy_import_item(import_item_list, import_item_count);
                        media_filter_destroy(filter);
-                       sqlite3_free(condition);
+                       SQLITE3_SAFE_FREE(condition);
                        media_content_error("error media_filter_set_condition");
                        return ret;
                }
@@ -999,7 +1002,7 @@ int media_playlist_import_from_file(const char *path, const char *playlist_name,
                        __media_playlist_destroy_import_item(import_item_list, import_item_count);
                        media_filter_destroy(filter);
                        SAFE_FREE(media_id);
-                       sqlite3_free(condition);
+                       SQLITE3_SAFE_FREE(condition);
                        media_content_error("error media_info_foreach_media_from_db");
                        return ret;
                }
@@ -1009,13 +1012,13 @@ int media_playlist_import_from_file(const char *path, const char *playlist_name,
                        __media_playlist_destroy_import_item(import_item_list, import_item_count);
                        media_filter_destroy(filter);
                        SAFE_FREE(media_id);
-                       sqlite3_free(condition);
+                       SQLITE3_SAFE_FREE(condition);
                        media_content_error("error media_playlist_add_media");
                        return ret;
                }
                media_filter_destroy(filter);
                SAFE_FREE(media_id);
-               sqlite3_free(condition);
+               SQLITE3_SAFE_FREE(condition);
        }
 
        ret = media_playlist_update_to_db(*playlist);
index 24a3a19..e56b11f 100755 (executable)
@@ -17,6 +17,7 @@
 
 #include <media_content.h>
 #include <media_info_private.h>
+#include <media_content_internal.h>
 
 static void __media_storage_get_detail(sqlite3_stmt* stmt, media_storage_h storage)
 {
@@ -45,29 +46,18 @@ int media_storage_insert_to_db(const char *storage_name, const char *storage_pat
        char *storage_uuid = NULL;
        media_storage_s *_storage = NULL;
 
-       if(!STRING_VALID(storage_name))
-       {
-               media_content_error("Invalid Storage Name");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
+       media_content_retvm_if(!STRING_VALID(storage_name), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid storage_name");
+       media_content_retvm_if(!STRING_VALID(storage_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid storage_path");
 
-       if(!STRING_VALID(storage_path))
-       {
-               media_content_error("Invalid path");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
-
-       storage_uuid = media_info_generate_uuid();
-       if(storage_uuid == NULL)
-       {
-               media_content_error("Fail to get storage_id");
-               return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
-       }
+       ret = media_svc_generate_uuid(&storage_uuid);
+       media_content_retvm_if(ret != MS_MEDIA_ERR_NONE, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Fail to get storage_id");
+       media_content_retvm_if(storage_uuid == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Invalid storage_id");
 
        ret = media_svc_insert_storage(_content_get_db_handle(), storage_uuid, storage_name, storage_path, storage_account, storage_type, tzplatform_getuid(TZ_USER_NAME));
        if (ret != MS_MEDIA_ERR_NONE)
        {
                ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+               SAFE_FREE(storage_uuid);
                return ret;
        }
 
@@ -81,6 +71,8 @@ int media_storage_insert_to_db(const char *storage_name, const char *storage_pat
 
        *storage = (media_storage_h)_storage;
 
+       SAFE_FREE(storage_uuid);
+
        return ret;
 }
 
@@ -94,7 +86,7 @@ int media_storage_delete_from_db(const char *storage_id)
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       ret = media_svc_delete_storage(_content_get_db_handle(), storage_id, tzplatform_getuid(TZ_USER_NAME));
+       ret = media_svc_delete_storage(_content_get_db_handle(), storage_id, NULL, tzplatform_getuid(TZ_USER_NAME));
 
        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
@@ -427,4 +419,28 @@ int media_storage_get_type(media_storage_h storage, media_content_storage_e *sto
        }
 
        return ret;
+}
+
+int media_storage_get_scan_status(const char *storage_uuid, media_storage_scan_status_e *scan_status)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+       media_svc_scan_status_type_e status = MEDIA_STORAGE_SCAN_NONE;
+
+       if(STRING_VALID(storage_uuid))
+       {
+               ret = media_svc_get_storage_scan_status(_content_get_db_handle(), storage_uuid, &status);
+               if (ret != MS_MEDIA_ERR_NONE) {
+                       media_content_error("media_svc_get_storage_scan_status failed");
+                       ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+               } else {
+                       *scan_status = status;
+               }
+       }
+       else
+       {
+               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
+               ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       }
+
+       return ret;
 }
\ No newline at end of file
index ba654d4..9515ca5 100755 (executable)
 
 #include <media_info_private.h>
 
-
-static __thread GList *g_tag_item_list = NULL;
-
-static void __media_tag_item_add(media_tag_item_s *item_s);
-static void __media_tag_item_release(void);
+static void __media_tag_item_add(media_tag_s *tag_s, media_tag_item_s *item_s);
+static void __media_tag_item_release(media_tag_s *tag_s);
 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id);
 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id);
 static int __media_tag_update_tag_name(int tag_id, const char *tag_name);
 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag);
 
-static void __media_tag_item_add(media_tag_item_s *item_s)
+static void __media_tag_item_add(media_tag_s *tag_s, media_tag_item_s *item_s)
 {
-       g_tag_item_list = g_list_append(g_tag_item_list, item_s);
+       tag_s->item_list = g_list_append(tag_s->item_list, item_s);
 }
 
-static void __media_tag_item_release(void)
+static void __media_tag_item_release(media_tag_s *tag_s)
 {
        int idx = 0;
        int list_cnt = 0;
        media_tag_item_s *item = NULL;
 
-       list_cnt = g_list_length(g_tag_item_list);
+       list_cnt = g_list_length(tag_s->item_list);
 
        media_content_debug("list_cnt : [%d]", list_cnt);
 
        for(idx = 0; idx < list_cnt; idx++)
        {
-               item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
+               item = (media_tag_item_s*)g_list_nth_data(tag_s->item_list, idx);
                if(item != NULL)
                {
                        SAFE_FREE(item->media_id);
@@ -53,8 +50,8 @@ static void __media_tag_item_release(void)
                }
        }
 
-       g_list_free(g_tag_item_list);
-       g_tag_item_list = NULL;
+       g_list_free(tag_s->item_list);
+       tag_s->item_list = NULL;
 
 }
 
@@ -66,7 +63,7 @@ static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
        query_str = sqlite3_mprintf("INSERT INTO %q (tag_id, media_uuid) values (%d, '%q')",
                        DB_TABLE_TAG_MAP, tag_id, media_id);
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -79,7 +76,7 @@ static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
        query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -92,7 +89,7 @@ static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
        query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
 
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -111,7 +108,7 @@ static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
        select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        while(sqlite3_step(stmt) == SQLITE_ROW)
@@ -148,7 +145,7 @@ int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
 
        query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        if(ret == MEDIA_CONTENT_ERROR_NONE)
        {
@@ -177,7 +174,7 @@ int media_tag_delete_from_db(int tag_id)
 
        ret = _content_query_sql(query_str);
 
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -414,7 +411,7 @@ int media_tag_add_media(media_tag_h tag, const char *media_id)
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
+               __media_tag_item_add(_tag, _item);
        }
        else
        {
@@ -445,7 +442,7 @@ int media_tag_remove_media(media_tag_h tag, const char *media_id)
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
+               __media_tag_item_add(_tag, _item);
        }
        else
        {
@@ -487,7 +484,7 @@ int media_tag_set_name(media_tag_h tag, char *tag_name)
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
+               __media_tag_item_add(_tag, _item);
        }
        else
        {
@@ -512,10 +509,15 @@ int media_tag_update_to_db(media_tag_h tag)
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       length = g_list_length(g_tag_item_list);
+       if(_tag->item_list != NULL) {
+               length = g_list_length(_tag->item_list);
+       } else {
+               media_content_debug("operation list length is 0");
+               return MEDIA_CONTENT_ERROR_NONE;
+       }
 
        for (idx = 0; idx < length; idx++) {
-               _tag_item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
+               _tag_item = (media_tag_item_s*)g_list_nth_data(_tag->item_list, idx);
                if(_tag_item != NULL) {
                        switch(_tag_item->function) {
                                case MEDIA_TAG_ADD:
@@ -542,7 +544,7 @@ int media_tag_update_to_db(media_tag_h tag)
                }
        }
 
-       __media_tag_item_release();
+       __media_tag_item_release(_tag);
 
        return ret;
 }
index 224e85e..8587baa 100755 (executable)
@@ -23,7 +23,7 @@
 #include <media_info_private.h>
 #include <media_content_type.h>
 
-int _media_util_check_file(const char *path)
+int _media_util_check_file_exist(const char *path)
 {
        int exist;
 
@@ -44,6 +44,22 @@ int _media_util_check_file(const char *path)
        return MEDIA_CONTENT_ERROR_NONE;
 }
 
+int _media_util_check_ignore_file(const char *path, bool *ignore)
+{
+       media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
+
+       *ignore = FALSE;
+
+       if(strstr(path, "/.") != NULL)
+       {
+               *ignore = TRUE;
+               media_content_error("hidden path");
+               media_content_sec_debug("path : %s", path);
+       }
+
+       return MEDIA_CONTENT_ERROR_NONE;
+}
+
 int _media_util_check_ignore_dir(const char *dir_path, bool *ignore)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
@@ -57,10 +73,10 @@ int _media_util_check_ignore_dir(const char *dir_path, bool *ignore)
 
        *ignore = FALSE;
        /*1. Check Hidden Directory*/
-       if(strstr(dir_path, "/."))
+       if(strstr(dir_path, "/.") != NULL)
        {
                *ignore = TRUE;
-               media_content_debug("hidden path");
+               media_content_error("hidden path");
                return MEDIA_CONTENT_ERROR_NONE;
        }
 
@@ -83,6 +99,13 @@ int _media_util_check_ignore_dir(const char *dir_path, bool *ignore)
        while(STRING_VALID(search_path))
        {
                dp = opendir(search_path);
+               if (dp == NULL) {
+                       *ignore = TRUE;
+                       media_content_error("Open Directory fail");
+                       media_content_sec_debug("Open fail path[%s]", search_path);
+                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+               }
+
                media_content_retvm_if(dp == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Open Directory fail");
 
                while (!readdir_r(dp, &entry, &result))
@@ -92,7 +115,7 @@ int _media_util_check_ignore_dir(const char *dir_path, bool *ignore)
 
                        if(STRING_VALID(entry.d_name) && (strcmp(entry.d_name, scan_ignore) == 0))
                        {
-                               media_content_info("Find Ignore path");
+                               media_content_error("Find Ignore path");
                                media_content_sec_debug("Ignore path[%s]", search_path);
                                find = TRUE;
                                break;
@@ -115,16 +138,28 @@ int _media_util_check_ignore_dir(const char *dir_path, bool *ignore)
                else
                {
                        /*If root path, Stop Scanning*/
-                       if((storage_type == MEDIA_SVC_STORAGE_INTERNAL) && (strcmp(search_path, tzplatform_getenv(TZ_USER_CONTENT)) == 0))
+                       if((storage_type == MEDIA_SVC_STORAGE_INTERNAL) && (strcmp(search_path, MEDIA_ROOT_PATH_INTERNAL) == 0))
                        {
-                               //media_content_debug("Internal root path. Stop Scanning. Not found Ignore information");
                                break;
                        }
                        else if((storage_type == MEDIA_SVC_STORAGE_EXTERNAL) && (strcmp(search_path, MEDIA_ROOT_PATH_SDCARD) == 0))
                        {
-                               //media_content_debug("Enternal root path. Stop Scanning. Not found Ignore information");
                                break;
                        }
+                       else if(storage_type == MEDIA_SVC_STORAGE_EXTERNAL_USB)
+                       {
+                               char *parent_folder_path = NULL;
+                               bool is_root = FALSE;
+
+                               parent_folder_path = g_path_get_dirname(search_path);
+                               if (strcmp(search_path, MEDIA_ROOT_PATH_USB) == 0)
+                                       is_root = TRUE;
+
+                               SAFE_FREE(parent_folder_path);
+
+                               if (is_root == TRUE)
+                                       break;
+                       }
 
                        leaf_path = strrchr(search_path, '/');
                        if(leaf_path != NULL)
index 5e6b578..e1cce6f 100755 (executable)
@@ -696,7 +696,7 @@ int video_meta_update_to_db(video_meta_h video)
 
                sql = sqlite3_mprintf(UPDATE_AV_META_FROM_MEDIA, storage_id, _video->played_count, _video->played_time, _video->played_position, _video->media_id);
                ret = _content_query_sql(sql);
-               sqlite3_free(sql);
+               SQLITE3_SAFE_FREE(sql);
        }
        else
        {