Remove unnecessary executable permissions
[platform/core/multimedia/libmedia-service.git] / src / media-svc-util.c
index a4bed31..a32c1df 100644 (file)
@@ -128,44 +128,6 @@ RETRY_GEN:
        return g_strdup(uuid_unparsed);
 }
 
-static char * __media_svc_get_exif_datetaken(ExifData *ed)
-{
-       ExifEntry *entry;
-       char tmp[MEDIA_SVC_METADATA_LEN_MAX + 1] = { 0, };
-
-       media_svc_retv_if(!ed, NULL);
-
-       entry = exif_data_get_entry(ed, EXIF_TAG_DATE_TIME_ORIGINAL);
-       if (entry) {
-               exif_entry_get_value(entry, tmp, MEDIA_SVC_METADATA_LEN_MAX);
-               if (strlen(tmp) > 0)
-                       return g_strdup(tmp);
-       }
-
-       entry = exif_data_get_entry(ed, EXIF_TAG_DATE_TIME);
-       if (entry) {
-               exif_entry_get_value(entry, tmp, MEDIA_SVC_METADATA_LEN_MAX);
-               if (strlen(tmp) > 0)
-                       return g_strdup(tmp);
-       }
-
-       return NULL;
-}
-
-static bool __media_svc_get_exif_short(ExifData *ed, ExifTag tagtype, unsigned short *value)
-{
-       ExifEntry *entry;
-
-       media_svc_retv_if(!ed, false);
-       media_svc_retvm_if(!value, false, "value is NULL");
-
-       entry = exif_data_get_entry(ed, tagtype);
-       media_svc_retv_if(!entry, false);
-       *value = exif_get_short(entry->data, exif_data_get_byte_order(ed));
-
-       return true;
-}
-
 static int __media_svc_get_media_type(const char *path, const char *mime_type, media_svc_media_type_e *media_type)
 {
        int idx = 0;
@@ -451,6 +413,44 @@ char * _media_svc_get_title_from_filename(const char *filename)
        return __media_svc_get_title_from_filename(filename);
 }
 
+static char * __media_svc_get_exif_datetaken(ExifData *ed)
+{
+       ExifEntry *entry;
+       char tmp[MEDIA_SVC_METADATA_LEN_MAX + 1] = { 0, };
+
+       media_svc_retv_if(!ed, NULL);
+
+       entry = exif_data_get_entry(ed, EXIF_TAG_DATE_TIME_ORIGINAL);
+       if (entry) {
+               exif_entry_get_value(entry, tmp, MEDIA_SVC_METADATA_LEN_MAX);
+               if (strlen(tmp) > 0)
+                       return g_strdup(tmp);
+       }
+
+       entry = exif_data_get_entry(ed, EXIF_TAG_DATE_TIME);
+       if (entry) {
+               exif_entry_get_value(entry, tmp, MEDIA_SVC_METADATA_LEN_MAX);
+               if (strlen(tmp) > 0)
+                       return g_strdup(tmp);
+       }
+
+       return NULL;
+}
+
+static bool __media_svc_get_exif_short(ExifData *ed, ExifTag tagtype, unsigned short *value)
+{
+       ExifEntry *entry;
+
+       media_svc_retv_if(!ed, false);
+       media_svc_retvm_if(!value, false, "value is NULL");
+
+       entry = exif_data_get_entry(ed, tagtype);
+       media_svc_retv_if(!entry, false);
+       *value = exif_get_short(entry->data, exif_data_get_byte_order(ed));
+
+       return true;
+}
+
 int _media_svc_extract_image_metadata(media_svc_content_info_s *content_info)
 {
        unsigned short orient_value = 0;
@@ -472,6 +472,9 @@ int _media_svc_extract_image_metadata(media_svc_content_info_s *content_info)
        }
 
        content_info->media_meta.datetaken = __media_svc_get_exif_datetaken(ed);
+       content_info->media_meta.recorded_date = g_strdup(content_info->media_meta.datetaken);
+       if (content_info->media_meta.recorded_date == NULL)
+               content_info->media_meta.recorded_date = g_strdup(MEDIA_SVC_TAG_UNKNOWN);
 
        if (__media_svc_get_exif_short(ed, EXIF_TAG_ORIENTATION, &orient_value)) {
                if (orient_value <= ROT_270)
@@ -573,6 +576,22 @@ void _media_svc_extract_audio_metadata(sqlite3 *handle, bool is_direct, media_sv
        content_info->media_meta.genre = __media_svc_get_tag_str_value(tag, MM_FILE_TAG_GENRE);
        content_info->media_meta.track_num = __media_svc_get_tag_str_value(tag, MM_FILE_TAG_TRACK_NUM);
 
+       mmf_error = mm_file_get_attrs(tag, MM_FILE_TAG_RECDATE, &p, &size, NULL);
+       if ((mmf_error == FILEINFO_ERROR_NONE) && (size > 0)) {
+               if (g_str_has_suffix(content_info->mime_type, "mp4") || g_str_has_suffix(content_info->mime_type, "3gpp")) {
+                       /*Creation time format is 20130101 00:00:00 +0000. change it to 2013:01:01 00:00:00  +0000 like exif time format*/
+                       char *p_value = g_strdelimit(g_strdup(p), "-", ':');
+                       content_info->media_meta.recorded_date = g_strdup_printf("%s +0000", p_value);
+                       g_free(p_value);
+               } else {
+                       content_info->media_meta.recorded_date = g_strdup(p);
+               }
+       }
+
+       if (content_info->media_meta.recorded_date == NULL)
+               content_info->media_meta.recorded_date = g_strdup(MEDIA_SVC_TAG_UNKNOWN);
+       content_info->media_meta.datetaken = g_strdup(content_info->media_meta.recorded_date);
+
        mmf_error = mm_file_get_attrs(tag, MM_FILE_TAG_DATE, &p, &size, NULL);
        if (mmf_error == FILEINFO_ERROR_NONE && size == 4)
                content_info->media_meta.year = g_strdup(p);
@@ -599,6 +618,32 @@ void _media_svc_extract_audio_metadata(sqlite3 *handle, bool is_direct, media_sv
 
 void _media_svc_extract_video_metadata(media_svc_content_info_s *content_info)
 {
+       int mmf_error = FILEINFO_ERROR_NONE;
+       MMHandleType tag = 0;
+       char *p = NULL;
+       unsigned int size = 0;
+
+       mmf_error = mm_file_create_tag_attrs_no_albumart(&tag, content_info->path);
+       if (mmf_error == FILEINFO_ERROR_NONE) {
+               mmf_error = mm_file_get_attrs(tag, MM_FILE_TAG_RECDATE, &p, &size, NULL);
+               if ((mmf_error == FILEINFO_ERROR_NONE) && (size > 0)) {
+                       if (g_str_has_suffix(content_info->mime_type, "mp4") || g_str_has_suffix(content_info->mime_type, "3gpp")) {
+                               /*Creation time format is 20130101 00:00:00 +0000. change it to 2013:01:01 00:00:00  +0000 like exif time format*/
+                               char *p_value = g_strdelimit(g_strdup(p), "-", ':');
+                               content_info->media_meta.recorded_date = g_strdup_printf("%s +0000", p_value);
+                               g_free(p_value);
+                       } else {
+                               content_info->media_meta.recorded_date = g_strdup(p);
+                       }
+               }
+               if (content_info->media_meta.recorded_date == NULL)
+                       content_info->media_meta.recorded_date = g_strdup(MEDIA_SVC_TAG_UNKNOWN);
+               content_info->media_meta.datetaken = g_strdup(content_info->media_meta.recorded_date);
+
+               mmf_error = mm_file_destroy_tag_attrs(tag);
+               if (mmf_error != FILEINFO_ERROR_NONE)
+                       media_svc_error("fail to free tag attr - err(%x)", mmf_error);
+       }
        /* All metadata fields must be empty strings until media_video is deleted */
        content_info->media_meta.title = __media_svc_get_title_from_filename(content_info->file_name);
        content_info->media_meta.album = g_strdup(MEDIA_SVC_TAG_UNKNOWN);
@@ -851,8 +896,7 @@ static int __media_svc_get_pdf_metadata(media_svc_content_info_s *content_info)
                        found = NULL;
                }
 
-
-               if (start_pos != 0 && (found = strstr(tmp, "</x:xmpmeta>"))) {
+               if (start_pos > 0 && (found = strstr(tmp + ((cur_pos > start_pos) ? 0 : (start_pos - cur_pos)), "</x:xmpmeta>"))) {
                        end_pos = cur_pos + (found - tmp) + MEDIA_SVC_PDF_TAG_TAIL_LEN;
 //                     media_svc_error("FIND END_POS[%d]", end_pos);
                        found = NULL;
@@ -926,6 +970,7 @@ void _media_svc_destroy_content_info(media_svc_content_info_s *content_info)
        g_free(content_info->media_meta.album_artist);
        g_free(content_info->media_meta.genre);
        g_free(content_info->media_meta.year);
+       g_free(content_info->media_meta.recorded_date);
        g_free(content_info->media_meta.track_num);
        g_free(content_info->media_meta.datetaken);
 }
@@ -1010,7 +1055,7 @@ static int __media_svc_create_wordbook_db(const char *path, sqlite3 **handle)
 {
        int ret = SQLITE_OK;
        sqlite3 *db_handle = NULL;
-       char *err = NULL;
+       sql_autoptr err = NULL;
 
        ret = sqlite3_open_v2(path, &db_handle, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
        media_svc_retvm_if(ret != SQLITE_OK, ret, "sqlite3_open_v2 failed : %d", ret);
@@ -1037,7 +1082,6 @@ static int __media_svc_create_wordbook_db(const char *path, sqlite3 **handle)
 
 ERROR:
        media_svc_error("sqlite3_exec failed : %s", err);
-       SQLITE3_SAFE_FREE(err);
        sqlite3_close_v2(db_handle);
 
        return ret;
@@ -1068,32 +1112,23 @@ static bool __media_svc_get_wordbook_handle(uid_t uid, sqlite3 **handle)
 
 static bool __media_svc_is_exist_in_wordbook(sqlite3 *db_handle, const char *path)
 {
-       int ret = SQLITE_OK;
-       char *err = NULL;
-       char *query = NULL;
+       sql_autoptr err = NULL;
+       sql_autoptr q = sqlite3_mprintf("UPDATE files SET validity=1 WHERE path = %Q", path);
 
-       query = sqlite3_mprintf("UPDATE files SET validity=1 WHERE path = %Q", path);
-
-       ret = sqlite3_exec(db_handle, query, NULL, NULL, &err);
-       SQLITE3_SAFE_FREE(query);
-       if (ret != SQLITE_OK) {
+       if (sqlite3_exec(db_handle, q, NULL, NULL, &err) != SQLITE_OK) {
                media_svc_error("Query failed. [%s]", err);
-               SQLITE3_SAFE_FREE(err);
                return false;
        }
 
-       return sqlite3_changes(db_handle) > 0 ? true : false;
+       return (sqlite3_changes(db_handle) > 0);
 }
 
 static void __media_svc_insert_to_wordbook(sqlite3 *db_handle, const char *path)
 {
        void *handle = NULL;
        void (*svc_update) (sqlite3 *, const char *);
-       char *query = NULL;
-
-       query = sqlite3_mprintf("INSERT INTO files(path) VALUES(%Q);", path);
-       sqlite3_exec(db_handle, query, NULL, NULL, NULL);
-       sqlite3_free(query);
+       sql_autoptr q = sqlite3_mprintf("INSERT INTO files(path) VALUES(%Q);", path);
+       sqlite3_exec(db_handle, q, NULL, NULL, NULL);
 
        handle = dlopen(PATH_PLUGIN_LIB, RTLD_LAZY);
        if (!handle) {
@@ -1153,21 +1188,17 @@ void _media_svc_clean_wordbook(uid_t uid)
 
 bool _media_svc_get_matched_list(const char *keyword, uid_t uid, GList **list)
 {
-       int ret = SQLITE_OK;
        sqlite3 *handle = NULL;
        sqlite3_stmt *stmt = NULL;
-       char *query = NULL;
+       sql_autoptr q = NULL;
 
        media_svc_retvm_if(!list, false, "list is NULL");
        media_svc_retvm_if(!keyword, false, "keyword is NULL");
        media_svc_retvm_if(!__media_svc_get_wordbook_handle(uid, &handle), false, "Failed to get handle");
 
-       query = sqlite3_mprintf("SELECT files.path FROM files JOIN (SELECT file_id, sum(frequency) AS freq_sum FROM words WHERE word LIKE '%q%%' GROUP BY file_id ORDER BY freq_sum DESC) w ON files.id = w.file_id;", keyword);
-       ret = sqlite3_prepare_v2(handle, query, -1, &stmt, NULL);
-       SQLITE3_SAFE_FREE(query);
-
-       if (ret != SQLITE_OK) {
-               media_svc_error("Query failed[%d]", ret);
+       q = sqlite3_mprintf("SELECT files.path FROM files JOIN (SELECT file_id, sum(frequency) AS freq_sum FROM words WHERE word LIKE '%q%%' GROUP BY file_id ORDER BY freq_sum DESC) w ON files.id = w.file_id;", keyword);
+       if (sqlite3_prepare_v2(handle, q, -1, &stmt, NULL) != SQLITE_OK) {
+               media_svc_error("query failed");
                sqlite3_close_v2(handle);
                return false;
        }