Just change order to inspect
[platform/core/api/media-content.git] / src / media_content.c
index 161cd17..98365d9 100755 (executable)
 */
 
 
-#include <media-thumb-error.h>
 #include <media_content.h>
 #include <media_info_private.h>
-#include <media-util.h>
+#include <media_util_private.h>
+
+#include <unicode/uscript.h>
+#include <unicode/uloc.h>
+#include <unicode/ucol.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
 
 
 static attribute_h g_attr_handle = NULL;
 static attribute_h g_alias_attr_handle = NULL;
 static MediaSvcHandle *db_handle = NULL;
 static int ref_count = 0;
+static GMutex db_mutex;
 
+static __thread media_noti_cb_s *g_noti_info = NULL;
 
 static int __media_content_create_attr_handle(void);
 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;
@@ -65,6 +73,9 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_MODIFIED_TIME, DB_FIELD_MEDIA_MODIFIED_TIME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TIMELINE, DB_FIELD_MEDIA_TIMELINE);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_THUMBNAIL_PATH, DB_FIELD_MEDIA_THUMBNAIL_PATH);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -77,6 +88,9 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ARTIST, DB_FIELD_MEDIA_ARTIST);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_ARTIST, DB_FIELD_MEDIA_ALBUM_ARTIST);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_GENRE, DB_FIELD_MEDIA_GENRE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -101,6 +115,9 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BITRATE, DB_FIELD_MEDIA_BITRATE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BITPERSAMPLE, DB_FIELD_MEDIA_BITPERSAMPLE);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_SAMPLERATE, DB_FIELD_MEDIA_SAMPLERATE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -131,6 +148,9 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ORIENTATION, DB_FIELD_MEDIA_ORIENTATION);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BURST_ID, DB_FIELD_MEDIA_BURST_ID);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PLAYED_COUNT, DB_FIELD_MEDIA_PLAYED_COUNT);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -167,12 +187,64 @@ static int __media_content_create_attr_handle(void)
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_KEYWORD, DB_FIELD_MEDIA_KEYWORD);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_WEATHER, DB_FIELD_MEDIA_WEATHER);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_IS_DRM, DB_FIELD_MEDIA_IS_DRM);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        ret = _media_filter_attribute_add(g_attr_handle, MEDIA_STORAGE_TYPE, DB_FIELD_MEDIA_STORAGE_TYPE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       /* Pinyin*/
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_FILE_NAME_PINYIN,  DB_FIELD_MEDIA_FILE_NAME_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TITLE_PINYIN,  DB_FIELD_MEDIA_TITLE_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_PINYIN,  DB_FIELD_MEDIA_ALBUM_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ARTIST_PINYIN,  DB_FIELD_MEDIA_ARTIST_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_ARTIST_PINYIN,  DB_FIELD_MEDIA_ALBUM_ARTIST_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_GENRE_PINYIN,  DB_FIELD_MEDIA_GENRE_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COMPOSER_PINYIN,  DB_FIELD_MEDIA_COMPOSER_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COPYRIGHT_PINYIN,  DB_FIELD_MEDIA_COPYRIGHT_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DESCRIPTION_PINYIN,  DB_FIELD_MEDIA_DESCRIPTION_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AUTHOR_PINYIN,  DB_FIELD_MEDIA_AUTHOR_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PROVIDER_PINYIN,  DB_FIELD_MEDIA_PROVIDER_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CONTENT_NAME_PINYIN,  DB_FIELD_MEDIA_CONTENT_NAME_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CATEGORY_PINYIN,  DB_FIELD_MEDIA_CATEGORY_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LOCATION_TAG_PINYIN,  DB_FIELD_MEDIA_LOCATION_TAG_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AGE_RATING_PINYIN,  DB_FIELD_MEDIA_AGE_RATING_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_attr_handle, MEDIA_KEYWORD_PINYIN,  DB_FIELD_MEDIA_KEYWORD_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        /* Playlist*/
        ret = _media_filter_attribute_add(g_attr_handle, PLAYLIST_NAME, DB_FIELD_PLAYLIST_NAME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -196,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;
 }
 
@@ -231,6 +310,9 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_MODIFIED_TIME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_MODIFIED_TIME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TIMELINE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TIMELINE);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_THUMBNAIL_PATH, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_THUMBNAIL_PATH);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -243,6 +325,9 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ARTIST, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ARTIST);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_ARTIST, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_ARTIST);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_GENRE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_GENRE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -267,6 +352,9 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BITRATE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BITRATE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BITPERSAMPLE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BITPERSAMPLE);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_SAMPLERATE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_SAMPLERATE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -297,6 +385,9 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ORIENTATION, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ORIENTATION);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BURST_ID, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BURST_ID);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PLAYED_COUNT, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PLAYED_COUNT);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
@@ -330,7 +421,10 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AGE_RATING, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AGE_RATING);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
-       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_KEYWORD, DB_TABLE_ALIAS_MEDIA"."MEDIA_KEYWORD);
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_KEYWORD, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_KEYWORD);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_WEATHER, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_WEATHER);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_IS_DRM, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_IS_DRM);
@@ -339,6 +433,55 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_STORAGE_TYPE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_STORAGE_TYPE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       /* Pinyin*/
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_FILE_NAME_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_FILE_NAME_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TITLE_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TITLE_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ARTIST_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ARTIST_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_ARTIST_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_ARTIST_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_GENRE_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_GENRE_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COMPOSER_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COMPOSER_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COPYRIGHT_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COPYRIGHT_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DESCRIPTION_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DESCRIPTION_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AUTHOR_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AUTHOR_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PROVIDER_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PROVIDER_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CONTENT_NAME_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CONTENT_NAME_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CATEGORY_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CATEGORY_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LOCATION_TAG_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LOCATION_TAG_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AGE_RATING_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AGE_RATING_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_KEYWORD_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_KEYWORD_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
        /* Folder */
        ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_ID, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_ID);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
@@ -355,6 +498,14 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_STORAGE_TYPE, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_STORAGE_TYPE);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
+       ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_NAME_PINYIN, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_NAME_PINYIN);
+       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
+
+       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);
@@ -370,8 +521,6 @@ static int __media_content_create_alias_attr_handle(void)
        ret = _media_filter_attribute_add(g_alias_attr_handle, BOOKMARK_MARKED_TIME, DB_TABLE_ALIAS_BOOKMARK"."DB_FIELD_BOOKMARK_MARKED_TIME);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
-       /* Album */
-
        return ret;
 }
 
@@ -383,6 +532,8 @@ static int __media_content_create_attribute_handle(void)
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
        ret = __media_content_create_alias_attr_handle();
+       if(ret != MEDIA_CONTENT_ERROR_NONE)
+               _media_filter_attribute_destory(g_attr_handle);
 
        return ret;
 }
@@ -392,10 +543,11 @@ static int __media_content_destroy_attribute_handle(void)
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
        ret = _media_filter_attribute_destory(g_attr_handle);
-       media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
-
        ret = _media_filter_attribute_destory(g_alias_attr_handle);
 
+       g_attr_handle = NULL;
+       g_alias_attr_handle = NULL;
+
        return ret;
 }
 
@@ -418,176 +570,150 @@ int _content_query_prepare(sqlite3_stmt **stmt, char *select_query, char *condit
 {
        int len = 0;
        int err = MEDIA_CONTENT_ERROR_NONE;
-       char query[MAX_QUERY_SIZE];
+       char query[MAX_QUERY_SIZE] = {0, };
        memset(query, '\0', sizeof(query));
 
-       if(db_handle == NULL)
-       {
-               media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
-               return MEDIA_CONTENT_ERROR_DB_FAILED;
-       }
+       media_content_retvm_if(db_handle == NULL, MEDIA_CONTENT_ERROR_DB_FAILED, "database is not connected");
+       media_content_retvm_if(!STRING_VALID(select_query), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid select_query");
 
-       if(STRING_VALID(select_query)) {
-               if(!STRING_VALID(condition_query)) {
-                       condition_query = " ";
-               }
+       if(!STRING_VALID(condition_query)) {
+               condition_query = (char *)" ";
+       }
 
-               if(!STRING_VALID(option_query)) {
-                       option_query = " ";
+       if(!STRING_VALID(option_query)) {
+               option_query = (char *)" ";
 
-               }
+       }
 
-               //query = sqlite3_mprintf("%s %s %s", select_query, condition_query, option_query);
-               len = snprintf(query, sizeof(query), "%s %s %s", select_query, condition_query, option_query);
-               if (len > 0) {
-                       query[len] = '\0';
-               } else {
-                       media_content_error("snprintf failed");
-                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-               }
+       //query = sqlite3_mprintf("%s %s %s", select_query, condition_query, option_query);
+       len = snprintf(query, sizeof(query), "%s %s %s", select_query, condition_query, option_query);
+       if (len > 0 && len < MAX_QUERY_SIZE) {
+               query[len] = '\0';
+       } else if (len >= MAX_QUERY_SIZE) {
+               query[MAX_QUERY_SIZE -1] = '\0';
+       } else {
+               media_content_error("snprintf failed");
+               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       }
 
-               media_content_info("Query : [%s]", query);
+       media_content_sec_debug("Query : [%s]", query);
 
-               err = sqlite3_prepare_v2((sqlite3*)db_handle, query, strlen(query), stmt, NULL);
-               if(err != SQLITE_OK)
-               {
-                       media_content_error("DB_FAILED(0x%08x) fail to sqlite3_prepare(), %s", MEDIA_CONTENT_ERROR_DB_FAILED, sqlite3_errmsg((sqlite3*)db_handle));
+       err = sqlite3_prepare_v2((sqlite3*)db_handle, query, strlen(query), stmt, NULL);
+       if(err != SQLITE_OK)
+       {
+               media_content_error("DB_FAILED(0x%08x) fail to sqlite3_prepare(), %s", MEDIA_CONTENT_ERROR_DB_FAILED, sqlite3_errmsg((sqlite3*)db_handle));
 
-                       if (err == SQLITE_BUSY)
-                               return MEDIA_CONTENT_ERROR_DB_BUSY;
-                       else
-                               return MEDIA_CONTENT_ERROR_DB_FAILED;
+               if (err == SQLITE_BUSY) {
+                       media_content_error(" BUSY ERROR");
+                       return MEDIA_CONTENT_ERROR_DB_BUSY;
+               } else if (err == SQLITE_PERM) {
+                       media_content_error("PERMISSION EROR");
+                       return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
+               } else {
+                       media_content_error("OTHER ERROR");
+                       return MEDIA_CONTENT_ERROR_DB_FAILED;
                }
        }
-       else
-       {
-               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
 
        return MEDIA_CONTENT_ERROR_NONE;
 }
 
 int _content_error_capi(int type, int content_error)
 {
-       media_content_debug("[type : %d] content_error : %d ", type, content_error);
-
-       if(type == MEDIA_CONTENT_TYPE)
+       if(content_error != MEDIA_CONTENT_ERROR_NONE)
        {
-               if(content_error == MEDIA_INFO_ERROR_NONE)
-                       return MEDIA_CONTENT_ERROR_NONE;
-               else if(content_error == MEDIA_INFO_ERROR_INVALID_PARAMETER)
-                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-               else if((content_error == MEDIA_INFO_ERROR_DATABASE_CONNECT) || (content_error == MEDIA_INFO_ERROR_DATABASE_DISCONNECT) ||
-                               (content_error == MEDIA_INFO_ERROR_DATABASE_NO_RECORD) ||(content_error == MEDIA_INFO_ERROR_DATABASE_INTERNAL))
-                       return MEDIA_CONTENT_ERROR_DB_FAILED;
-               else if((content_error == MS_MEDIA_ERR_SOCKET_CONN) ||(content_error == MS_MEDIA_ERR_SOCKET_INTERNAL) ||
-                               (content_error == MS_MEDIA_ERR_SOCKET_SEND) ||(content_error == MS_MEDIA_ERR_SOCKET_RECEIVE) || (content_error == MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT))
-                       return MEDIA_CONTENT_ERROR_NETWORK;
-       } else if(type == MEDIA_THUMBNAIL_TYPE) {
-               if(content_error == MEDIA_THUMB_ERROR_NONE)
-                       return MEDIA_CONTENT_ERROR_NONE;
-               else if(content_error == MEDIA_THUMB_ERROR_INVALID_PARAMETER)
-                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-               else if(content_error == MEDIA_THUMB_ERROR_DB)
-                       return MEDIA_CONTENT_ERROR_DB_FAILED;
-               else if(content_error == MEDIA_THUMB_ERROR_NETWORK)
-                       return MEDIA_CONTENT_ERROR_NETWORK;
-               else if(content_error == MEDIA_THUMB_ERROR_TIMEOUT)
-                       return MEDIA_CONTENT_ERROR_NETWORK;
-               else if(content_error == MEDIA_THUMB_ERROR_MM_UTIL)                     /* Error in mm-util lib */
-                       return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
-               else if(content_error == MEDIA_THUMB_ERROR_HASHCODE)            /* Failed to generate hash code */
-                       return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
-               else if(content_error == MEDIA_THUMB_ERROR_TOO_BIG)                     /* Original is too big to make thumb */
-                       return MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT;
-               else if(content_error == MEDIA_THUMB_ERROR_UNSUPPORTED) /* Unsupported type */
-                       return MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT;
-
-       } else if(type == MEDIA_REGISTER_TYPE) {
-               if(content_error == MS_MEDIA_ERR_NONE)
-                       return MEDIA_CONTENT_ERROR_NONE;
-               else if(content_error == MS_MEDIA_ERR_INVALID_PARAMETER || content_error == MS_MEDIA_ERR_INVALID_PATH)
-                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-               else if(content_error == MS_MEDIA_ERR_DB_INSERT_FAIL || content_error == MS_MEDIA_ERR_DRM_REGISTER_FAIL)
-                       return MEDIA_CONTENT_ERROR_DB_FAILED;
-               else if(content_error == MS_MEDIA_ERR_SCANNING_BUSY)
-                       return MEDIA_CONTENT_ERROR_DB_BUSY;
-               else if(content_error == MS_MEDIA_ERR_VCONF_GET_FAIL)
-                       return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
+               media_content_error("[type : %d] content_error : %d ", type, content_error);
        }
 
-       return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
-}
+       /*Error None*/
+       if(content_error == MS_MEDIA_ERR_NONE)
+               return MEDIA_CONTENT_ERROR_NONE;
 
-int _content_query_sql(char *query_str)
-{
-       int ret = MEDIA_CONTENT_ERROR_NONE;
-
-       //DB will be updated by Media Server.
-       ret = media_svc_request_update_db(query_str);
+       /* Internal operation error*/
+       else if((content_error == MS_MEDIA_ERR_INVALID_PARAMETER) ||
+               (content_error == MS_MEDIA_ERR_INVALID_PATH) ||
+               (content_error == MS_MEDIA_ERR_THUMB_DUPLICATED_REQUEST))
+               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
 
-       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+       else if(content_error == MS_MEDIA_ERR_OUT_OF_MEMORY)
+               return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
 
-#if 0
-       int err = MEDIA_CONTENT_ERROR_NONE;
-       char *err_msg;
+       /* DB operation error*/
+       else if(content_error == MS_MEDIA_ERR_DB_BUSY_FAIL)
+               return MEDIA_CONTENT_ERROR_DB_BUSY;
 
-       if(db_handle == NULL)
-       {
-               media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
+       else if((content_error <= MS_MEDIA_ERR_DB_CONNECT_FAIL) && (content_error >= MS_MEDIA_ERR_DB_INTERNAL))
                return MEDIA_CONTENT_ERROR_DB_FAILED;
-       }
 
-       err = sqlite3_exec(db_handle, query_str, NULL, NULL, &err_msg);
-       if(SQLITE_OK != err)
-       {
-               if(err_msg)
-               {
-                       media_content_error("DB_FAILED : %s", err_msg);
-                       media_content_error("DB_FAILED SQL: %s", query_str);
-                       sqlite3_free(err_msg);
-               }
+       /* IPC operation error*/
+       else if((content_error <= MS_MEDIA_ERR_SOCKET_CONN) && (content_error >= MS_MEDIA_ERR_SOCKET_INTERNAL))
+               return MEDIA_CONTENT_ERROR_NETWORK;
 
-               media_content_error("DB_FAILED(0x%08x) database operation is failed", MEDIA_CONTENT_ERROR_DB_FAILED);
+       /* MEDIA SERVER error*/
+       else if(content_error == MS_MEDIA_ERR_PERMISSION_DENIED)
+               return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
 
-               if (err == SQLITE_BUSY)
-                       return MEDIA_CONTENT_ERROR_DB_BUSY;
-               else
-                       return MEDIA_CONTENT_ERROR_DB_FAILED;
-       }
-       else
-       {
-               media_content_info("DB_SUCCESS: %s", query_str);
-       }
+       /* Thumbnail error*/
+       else if(content_error == MS_MEDIA_ERR_THUMB_TOO_BIG)
+                       return MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT;
 
-       if(err_msg)
-               sqlite3_free(err_msg);
+       /*ETC*/
+       return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
+}
 
-       return MEDIA_CONTENT_ERROR_NONE;
-#endif
+int _content_query_sql(char *query_str)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+
+       //DB will be updated by Media Server.
+       ret = media_svc_request_update_db(query_str,tzplatform_getuid(TZ_USER_NAME));
+
+       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
 
 int media_content_connect(void)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if(ref_count == 0)
-       {
-               if(db_handle == NULL)
+       if (g_mutex_trylock(&db_mutex)) {
+               media_content_info("ref count : %d", ref_count);
+
+               if(ref_count == 0)
                {
-                       ret = media_svc_connect(&db_handle);
+                       if(db_handle == NULL)
+                       {
+                               ret = __media_content_create_attribute_handle();
+                               if(ret == MEDIA_CONTENT_ERROR_NONE) {
+                                       ret = media_svc_connect(&db_handle,tzplatform_getuid(TZ_USER_NAME), false);
+                                       ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+                                       if(ret == MEDIA_CONTENT_ERROR_NONE) {
+                                               ref_count++;
+                                       } else {
+                                               __media_content_destroy_attribute_handle();
+                                       }
+                               } else {
+                                       media_content_error("Internal DB Connection Error");
+                               }
+                       } else {
+                               media_content_error("Wrong DB Connection status");
+                               ret = MEDIA_CONTENT_ERROR_DB_FAILED;
+                       }
+               } else {
+                       if(db_handle != NULL) {
+                               ref_count++;
+                       } else {
+                               media_content_error("Wrong DB Handle status");
+                               ret = MEDIA_CONTENT_ERROR_DB_FAILED;
+                       }
                }
 
-               ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
-
-               if(ret == MEDIA_CONTENT_ERROR_NONE) {
-                       ret = __media_content_create_attribute_handle();
-               }
+               media_content_info("ref count changed to: %d", ref_count);
+               g_mutex_unlock(&db_mutex);
+       } else {
+               media_content_error("mutex is NULL");
+               ret = MEDIA_CONTENT_ERROR_DB_FAILED;
        }
 
-       ref_count++;
-
        return ret;
 }
 
@@ -595,100 +721,134 @@ int media_content_disconnect(void)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if(ref_count > 0)
-       {
-               ref_count--;
-       }
-       else
-       {
-               media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
-               return MEDIA_CONTENT_ERROR_DB_FAILED;
-       }
+       if (g_mutex_trylock(&db_mutex)) {
+               media_content_debug("ref count : %d", ref_count);
+               if(ref_count > 0)
+               {
+                       if(db_handle != NULL) {
+                               ref_count--;
+                       } else {
+                               media_content_error("Wrong DB Handle status");
+                               ret = MEDIA_CONTENT_ERROR_DB_FAILED;
+                       }
+               }
+               else
+               {
+                       media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
+                       g_mutex_unlock(&db_mutex);
+                       return MEDIA_CONTENT_ERROR_DB_FAILED;
+               }
 
-       if(ref_count == 0)
-       {
-               if(db_handle != NULL)
+               if(ref_count == 0)
                {
-                       ret = media_svc_disconnect(db_handle);
-                       ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
-                       if(ret == MEDIA_CONTENT_ERROR_NONE)
+                       if(db_handle != NULL)
                        {
-                               ret = __media_content_destroy_attribute_handle();
-                               db_handle = NULL;
+                               ret = media_svc_disconnect(db_handle);
+                               ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+                               if(ret == MEDIA_CONTENT_ERROR_NONE) {
+                                       ret = __media_content_destroy_attribute_handle();
+                                       db_handle = NULL;
+                               } else {
+                                       media_content_error("database disconnect fail");
+                                       ref_count++;
+                               }
+                       } else {
+                               media_content_error("Wrong DB Handle status");
+                               ret = MEDIA_CONTENT_ERROR_DB_FAILED;
                        }
+
+                       g_mutex_unlock(&db_mutex);
+
+                       media_content_info("ref count changed to: %d", ref_count);
+
+                       return ret;
                }
+
+               g_mutex_unlock(&db_mutex);
+       } else {
+               media_content_error("mutex is NULL");
+               ret = MEDIA_CONTENT_ERROR_INVALID_OPERATION;
        }
 
+       media_content_info("ref count changed to: %d", ref_count);
+
        return ret;
 }
 
 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,};
 
-       if (!STRING_VALID(path)) {
-               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
-       }
+       media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
 
-       media_content_debug("Path : %s", path);
+       media_content_sec_debug("Path : %s", path);
 
-       if (g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-               /* This means this path has to be inserted or refreshed */
-               media_content_debug("This path exists in file system.");
+       ret = _media_util_check_ignore_file(path, &ignore_file);
+       media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
 
-               media_svc_media_type_e media_type;
-               media_svc_storage_type_e storage_type;
-               char mime_type[255];
+       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_get_storage_type(path, &storage_type);
-               if (ret < 0) {
-                       media_content_error("media_svc_get_storage_type failed : %d (%s)", ret, path);
-                       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);
 
-               ret = media_svc_get_mime_type(path, mime_type);
-               if (ret < 0) {
-                       media_content_error("media_svc_get_mime_type failed : %d (%s)", ret, path);
-                       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
-               }
+               media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
 
-               ret = media_svc_get_media_type(path, mime_type, &media_type);
-               if (ret < 0) {
-                       media_content_error("media_svc_get_media_type failed : %d (%s)", ret, path);
+               media_svc_storage_type_e storage_type;
+
+               ret = media_svc_get_storage_type(path, &storage_type, tzplatform_getuid(TZ_USER_NAME));
+               if(ret != MS_MEDIA_ERR_NONE) {
+                       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);
-               if (ret == MEDIA_INFO_ERROR_NONE) {
+               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, path, media_type);
-                       if (ret < 0) {
+                       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);
                        }
 
-               } else if (ret == MEDIA_INFO_ERROR_DATABASE_NO_RECORD) {
+               } else if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
                        /* Insert */
-                       ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_type, path, mime_type, media_type);
-                       if (ret < 0) {
-                               media_content_error("media_svc_insert_item_immediately failed : %d", ret);
+                       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);
+                                       ret = MEDIA_CONTENT_ERROR_NONE;
+                               } else {
+                                       media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, path);
+                               }
+
                                return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
                        }
-
                } else {
                        media_content_error("media_svc_check_item_exist_by_path failed : %d", ret);
                        return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
                }
-       } else if(g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
-               /* Dierectory is not accpted in this function */
-               media_content_error("This path is directory");
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       } else if (check_file == MEDIA_CONTENT_ERROR_PERMISSION_DENIED) {
+               media_content_error("You have no permission for this file %d", ret);
+               return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
        } 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(), path);
-               if (ret < 0) {
+               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);
                }
@@ -714,29 +874,120 @@ void _media_content_scan_cb(media_request_result_s* result, void *user_data)
        return;
 }
 
-int media_content_scan_folder(const char *path, media_scan_completed_cb callback, void *user_data)
+static int __media_content_check_dir(const char *path)
 {
-       int ret = MEDIA_CONTENT_ERROR_NONE;
+       DIR *dp = NULL;
 
-       if (!STRING_VALID(path)) {
-               media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
-               return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+       dp = opendir(path);
+       if (dp == NULL) {
+               media_content_sec_error("path [%s]", path);
+               media_content_stderror("open dir fail");
+
+               if (errno == EACCES || errno == EPERM) {
+                       return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
+               } else {
+                       return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
+               }
        }
 
+       closedir(dp);
+
+       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_content_check_dir(path);
+       media_content_retvm_if(ret == MEDIA_CONTENT_ERROR_PERMISSION_DENIED, ret, "Permission Denied");
+
+       ret = _media_util_check_ignore_dir(path, &ignore_dir);
+       media_content_retvm_if(ignore_dir, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
+
        media_content_scan_cb_data *cb_data = NULL;
        cb_data = (media_content_scan_cb_data *)malloc(sizeof(media_content_scan_cb_data));
-       if (cb_data == NULL) {
-               media_content_error("malloc failed");
-               return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
-       }
+       media_content_retvm_if(cb_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
        cb_data->callback = callback;
        cb_data->user_data = user_data;
 
-       ret = media_directory_scanning_async(path, TRUE, _media_content_scan_cb, cb_data);
-       if (ret < 0) {
+       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);
+       }
+
+       return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
+}
+
+int media_content_cancel_scan_folder(const char *path)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+
+       ret = media_directory_scanning_cancel(path, tzplatform_getuid(TZ_USER_NAME));
+       if(ret != MS_MEDIA_ERR_NONE) {
                media_content_error("media_directory_scanning_async failed : %d", ret);
        }
 
        return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
 }
+
+void _media_content_db_update_noti_cb(
+                                                       int pid,
+                                                       media_item_type_e item,
+                                                       media_item_update_type_e update_type,
+                                                       char* path,
+                                                       char* uuid,
+                                                       media_type_e content_type,
+                                                       char *mime_type,
+                                                       void *user_data)
+{
+       int error_value = MEDIA_CONTENT_ERROR_NONE;
+
+       media_noti_cb_s *_noti_info = (media_noti_cb_s *)user_data;
+
+       if(_noti_info != NULL)
+       {
+               if (_noti_info->update_noti_cb)
+                       _noti_info->update_noti_cb(error_value, pid, item, update_type, content_type, uuid, path, mime_type, _noti_info->user_data);
+       }
+
+       return;
+}
+
+int media_content_set_db_updated_cb(media_content_db_update_cb callback, void *user_data)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+
+       media_content_retvm_if(callback == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid callback");
+       media_content_retvm_if(g_noti_info != NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "Noti callback is already set");
+
+       g_noti_info = (media_noti_cb_s*)calloc(1, sizeof(media_noti_cb_s));
+       media_content_retvm_if(g_noti_info == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       g_noti_info->update_noti_cb = callback;
+       g_noti_info->user_data = user_data;
+
+       ret = media_db_update_subscribe(_media_content_db_update_noti_cb, (void *)g_noti_info);
+
+       return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
+}
+
+int media_content_unset_db_updated_cb(void)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+
+       SAFE_FREE(g_noti_info);
+       ret = media_db_update_unsubscribe();
+
+       return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
+}