79e75913c5e60d34a7b48cc9d36379e50117eca8
[platform/core/api/media-content.git] / src / media_info.c
1 /*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <media_info.h>
18 #include <media-thumbnail.h>
19 #include <media-util-dcm.h>
20 #include <media_info_private.h>
21 #include <media_util_private.h>
22 #include <system_info.h>
23
24
25 #define media_content_retv_free_info_if(expr, val, p_str) do { \
26                                 if (expr) {     \
27                                         LOGE(FONT_COLOR_RED"Memory allocation failure"FONT_COLOR_RESET);        \
28                                         media_info_destroy(p_str);      \
29                                         return (val);   \
30                                 }       \
31                         } while (0)
32
33
34 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data);
35 static void __media_info_thumbnail_completed_cb(int error, const char *path, void *user_data);
36 static void __media_info_face_completed_cb(int error, const int face_count, void *user_data);
37 static int __media_info_insert_batch(const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data);
38 static int __media_info_check_file_validity(const char *path);
39
40 static int __media_info_get_media_path_by_id_from_db(const char *media_id, char **path)
41 {
42         int ret = MEDIA_CONTENT_ERROR_NONE;
43         sqlite3_stmt *stmt = NULL;
44         char *select_query = NULL;
45
46         media_content_retvm_if(!STRING_VALID(media_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media_id");
47
48         select_query = sqlite3_mprintf(SELECT_MEDIA_PATH_BY_ID, media_id);
49
50         ret = _content_get_result(select_query, &stmt);
51         SQLITE3_SAFE_FREE(select_query);
52         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
53
54         if (sqlite3_step(stmt) == SQLITE_ROW) {
55                 *path = g_strdup((const char *)sqlite3_column_text(stmt, 0));
56         } else {
57                 media_content_error("There's no media with this ID : %s", media_id);
58                 *path = NULL;
59                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
60         }
61
62         SQLITE3_FINALIZE(stmt);
63
64         return ret;
65 }
66
67 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data)
68 {
69         int ret = MEDIA_CONTENT_ERROR_NONE;
70         media_insert_cb_s *_cb_data = (media_insert_cb_s *)user_data;
71
72         if (_cb_data) {
73                 if (result)
74                         ret = _content_error_capi(result->result);
75
76                 if (_cb_data->insert_completed_cb) {
77                         media_content_debug("User callback is being called now");
78                         _cb_data->insert_completed_cb(ret, _cb_data->user_data);
79                 }
80
81                 if (STRING_VALID(_cb_data->insert_list_path)) {
82                         if (unlink(_cb_data->insert_list_path) < 0)
83                                 media_content_stderror("failed to delete");
84                         SAFE_FREE(_cb_data->insert_list_path);
85                 }
86         }
87
88         SAFE_FREE(_cb_data);
89
90         return;
91 }
92
93 static void __media_info_thumbnail_completed_cb(int error, const char *path, void *user_data)
94 {
95         int error_value = MEDIA_CONTENT_ERROR_NONE;
96
97         media_thumbnail_cb_s *_thumb_cb = (media_thumbnail_cb_s *)user_data;
98         media_info_s *media = NULL;
99
100         if (_thumb_cb != NULL) {
101                 media = _thumb_cb->handle;
102
103                 if (media != NULL) {
104                         if (media->thumbnail_path != NULL)
105                                 SAFE_FREE(media->thumbnail_path);
106
107                         if (STRING_VALID(path))
108                                 media->thumbnail_path = g_strdup(path);
109                         else
110                                 media->thumbnail_path = g_strdup(MEDIA_CONTENT_EMPTY_STRING);
111                 }
112
113                 media_content_debug("error [%d], thumbnail_path [%s]", error, path);
114                 error_value = _content_error_capi(error);
115                 if (_thumb_cb->thumbnail_completed_cb)
116                         _thumb_cb->thumbnail_completed_cb(error_value, path, _thumb_cb->user_data);
117         }
118
119         SAFE_FREE(_thumb_cb);
120
121         return;
122 }
123
124 static bool __media_info_isFaceRecognition_feature_supported()
125 {
126         bool isFaceRecognitionSupported = false;
127
128         const int nRetVal = system_info_get_platform_bool("http://tizen.org/feature/vision.face_recognition", &isFaceRecognitionSupported);
129
130         if (nRetVal != SYSTEM_INFO_ERROR_NONE) {
131                 media_content_debug("SYSTEM_INFO_ERROR: vision.face_recognition [%d]", nRetVal);
132                 return false;
133         }
134
135         return isFaceRecognitionSupported;
136 }
137
138 static void __media_info_face_completed_cb(int error, const int face_count, void *user_data)
139 {
140         int error_value = MEDIA_CONTENT_ERROR_NONE;
141
142         media_face_cb_s *_face_cb = (media_face_cb_s *)user_data;
143
144         if (_face_cb != NULL) {
145                 media_content_debug("error [%d], face_count [%d]", error, face_count);
146                 error_value = _content_error_capi(error);
147                 if (_face_cb->face_completed_cb)
148                         _face_cb->face_completed_cb(error_value, face_count, _face_cb->user_data);
149         }
150
151         SAFE_FREE(_face_cb);
152
153         return;
154 }
155
156 static int __media_info_insert_batch(const char **path_array,
157                                         unsigned int array_length,
158                                         media_insert_completed_cb completed_cb,
159                                         void *user_data)
160 {
161         int ret = MEDIA_CONTENT_ERROR_NONE;
162         FILE *fp = NULL;
163         char list_path[255] = {0, };
164         unsigned int idx = 0;
165         int nwrites = 0;
166
167         for (idx = 0; idx < BATCH_REQUEST_MAX; idx++) {
168                 snprintf(list_path, sizeof(list_path), "%s/request-%ld-%d", MEDIA_CONTENT_INSERT_FILES_PATH, media_content_gettid(), idx);
169
170                 if (g_file_test(list_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
171                         memset(list_path, 0x00, sizeof(list_path));
172                         continue;
173                 } else {
174                         media_content_debug("The request file list path : %s", list_path);
175                         break;
176                 }
177         }
178
179         if (idx == BATCH_REQUEST_MAX) {
180                 media_content_error("Too many batch request for one thread");
181                 return MEDIA_CONTENT_ERROR_DB_BUSY;
182         }
183
184         fp = fopen(list_path, "w");
185         if (fp == NULL) {
186                 media_content_error("failed to open file : [%s]", list_path);
187                 media_content_stderror("failed to open file");
188                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
189         }
190
191         for (idx = 0; idx < array_length; idx++) {
192                 if (STRING_VALID(path_array[idx])) {
193                         int size = strlen(path_array[idx]);
194
195                         ret = __media_info_check_file_validity(path_array[idx]);
196                         if (ret != MEDIA_CONTENT_ERROR_NONE) {
197                                 fclose(fp);
198                                 if (unlink(list_path) < 0)
199                                         media_content_stderror("failed to delete");
200                                 return ret;
201                         }
202
203                         if (!_media_util_check_support_media_type(path_array[idx])) {
204                                 fclose(fp);
205                                 if (unlink(list_path) < 0)
206                                         media_content_stderror("failed to delete");
207                                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
208                         }
209
210                         nwrites = fwrite(path_array[idx], 1, size, fp);
211                         if (nwrites != size) {
212                                 media_content_stderror("failed to write");
213                                 fclose(fp);
214                                 if (unlink(list_path) < 0)
215                                         media_content_stderror("failed to delete");
216                                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
217                         }
218
219                         nwrites = fwrite("\n", 1, 1, fp);
220                         if (nwrites != 1) {
221                                 media_content_stderror("failed to write");
222                                 fclose(fp);
223                                 if (unlink(list_path) < 0)
224                                         media_content_stderror("failed to delete");
225                                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
226                         }
227                 } else {
228                         media_content_error("path[%d] is invalid string", idx);
229                 }
230         }
231
232         fclose(fp);
233
234         media_insert_cb_s *_cb_data = (media_insert_cb_s *)calloc(1, sizeof(media_insert_cb_s));
235         media_content_retvm_if(_cb_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
236
237         _cb_data->insert_completed_cb = completed_cb;
238         _cb_data->user_data = user_data;
239         _cb_data->insert_list_path = g_strdup(list_path);
240
241         ret = media_files_register(list_path, __media_info_insert_completed_cb, _cb_data, _content_get_uid());
242         if (ret != MEDIA_CONTENT_ERROR_NONE) {
243                 media_content_error("media_files_register failed : %d", ret);
244                 if (unlink(list_path) < 0)
245                         media_content_stderror("failed to delete");
246                 return _content_error_capi(ret);
247         }
248
249         return ret;
250 }
251
252 static int __media_info_check_file_validity(const char *path)
253 {
254         bool ignore = FALSE;
255         char *folder_path = NULL;
256         int ret = MEDIA_CONTENT_ERROR_NONE;
257
258         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
259
260         ret = _media_util_check_ignore_file(path, &ignore);
261         media_content_retvm_if(ignore == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid ignore path");
262
263         ret = _media_util_check_file_exist(path);
264         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "invalid path");
265
266         folder_path = g_path_get_dirname(path);
267         ret = _media_util_check_ignore_dir(folder_path, &ignore);
268         SAFE_FREE(folder_path);
269         media_content_retvm_if(ignore == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
270
271         return MEDIA_CONTENT_ERROR_NONE;
272 }
273
274 void _media_info_item_get_detail(sqlite3_stmt* stmt, media_info_h media)
275 {
276         media_info_s *_media = (media_info_s*)media;
277
278         _media->media_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_UUID));
279         _media->file_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_PATH));
280         _media->display_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_FILE_NAME));
281         _media->media_type = (int)sqlite3_column_int(stmt, MEDIA_INFO_TYPE);
282         _media->mime_type = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MIME_TYPE));
283         _media->size = (unsigned long long)sqlite3_column_int64(stmt, MEDIA_INFO_SIZE);
284         _media->added_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_ADDED_TIME);
285         _media->modified_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_MODIFIED_TIME);
286         _media->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_THUMBNAIL_PATH));
287         _media->description = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DESCRIPTION));
288         _media->rating = (int)sqlite3_column_int(stmt, MEDIA_INFO_RATING);
289         _media->favourite = (int)sqlite3_column_int(stmt, MEDIA_INFO_FAVOURITE);
290         _media->is_drm = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_DRM);
291         _media->storage_type = (int)sqlite3_column_int(stmt, MEDIA_INFO_STORAGE_TYPE);
292         _media->longitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LONGITUDE);
293         _media->latitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LATITUDE);
294         _media->altitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_ALTITUDE);
295         _media->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
296         _media->timeline = (double)sqlite3_column_double(stmt, MEDIA_INFO_TIMELINE);
297         _media->sync_status = (int)sqlite3_column_int(stmt, MEDIA_INFO_SYNC_STATUS);
298         _media->storage_uuid = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_STORAGE_UUID));
299         _media->is_360 = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_360);
300 #ifdef _USE_TVPD_MODE
301         _media->played_count = sqlite3_column_int(stmt, MEDIA_INFO_PLAYED_COUNT);
302         _media->played_time = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_TIME);
303         _media->played_position = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_POSITION);
304         _media->stitched_info = (int)sqlite3_column_int(stmt, MEDIA_INFO_STITCHED_INFO);
305 #endif
306
307         if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE) {
308                 _media->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
309                 if (_media->image_meta) {
310                         _media->image_meta->media_id = g_strdup(_media->media_id);
311                         _media->image_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
312                         _media->image_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
313                         _media->image_meta->fnumber = (double)sqlite3_column_double(stmt, MEDIA_INFO_FNUMBER);
314                         _media->image_meta->iso = sqlite3_column_int(stmt, MEDIA_INFO_ISO);
315                         _media->image_meta->date_taken = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DATETAKEN));
316                         _media->image_meta->orientation = sqlite3_column_int(stmt, MEDIA_INFO_ORIENTATION);
317                         _media->image_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
318                         _media->image_meta->exposure_time = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_EXPOSURE_TIME));
319                         _media->image_meta->model = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MODEL));
320                 }
321         } else if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
322                 _media->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
323                 if (_media->video_meta) {
324                         _media->video_meta->media_id = g_strdup(_media->media_id);
325                         _media->video_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
326                         _media->video_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
327                         _media->video_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
328                         _media->video_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
329                         _media->video_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
330                         _media->video_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
331                         _media->video_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
332                         _media->video_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
333                         _media->video_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
334                         _media->video_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
335                         _media->video_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
336                         _media->video_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
337                         _media->video_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
338                         _media->video_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
339                         _media->video_meta->rotation = sqlite3_column_int(stmt, MEDIA_INFO_ORIENTATION);
340                 }
341
342         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
343                 _media->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
344                 if (_media->audio_meta) {
345                         _media->audio_meta->media_id = g_strdup(_media->media_id);
346                         _media->audio_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
347                         _media->audio_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
348                         _media->audio_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
349                         _media->audio_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
350                         _media->audio_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
351                         _media->audio_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
352                         _media->audio_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
353                         _media->audio_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
354                         _media->audio_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
355                         _media->audio_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
356                         _media->audio_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
357                         _media->audio_meta->bitpersample = sqlite3_column_int(stmt, MEDIA_INFO_BITPERSAMPLE);
358                         _media->audio_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
359                         _media->audio_meta->samplerate = sqlite3_column_int(stmt, MEDIA_INFO_SAMPLERATE);
360                         _media->audio_meta->channel = sqlite3_column_int(stmt, MEDIA_INFO_CHANNEL);
361                 }
362         }
363 }
364
365 int _media_info_get_media_info_from_db(const char *path, const char *storage_id, media_info_h media)
366 {
367         int ret = MEDIA_CONTENT_ERROR_NONE;
368         sqlite3_stmt *stmt = NULL;
369         char *select_query = NULL;
370         media_info_s *_media = (media_info_s*)media;
371
372         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
373
374         select_query = sqlite3_mprintf(SELECT_MEDIA_BY_PATH, storage_id, path);
375
376         ret = _content_get_result(select_query, &stmt);
377         SQLITE3_SAFE_FREE(select_query);
378         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
379
380         if (sqlite3_step(stmt) == SQLITE_ROW) {
381                 _media_info_item_get_detail(stmt, (media_info_h)_media);
382         } else {
383                 media_content_sec_error("No media : path[%s] storage id[%s]", path, storage_id);
384                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
385         }
386
387         SQLITE3_FINALIZE(stmt);
388
389         return ret;
390 }
391
392 int media_info_insert_to_db(const char *path, media_info_h *info)
393 {
394         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
395         char repl_path[MAX_PATH_LEN] = {0, };
396         int ret = MEDIA_CONTENT_ERROR_NONE;
397         ms_user_storage_type_e storage_type = MS_USER_STORAGE_INTERNAL;
398         int modified_time = 0;
399
400         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
401         media_content_retvm_if(info == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
402         memset(repl_path, 0, sizeof(repl_path));
403         ret = _media_content_replace_path(path, repl_path);
404         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
405
406         ret = __media_info_check_file_validity(repl_path);
407         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
408
409         memset(storage_id, 0x00, sizeof(storage_id));
410         ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, _content_get_uid());
411         if (ret != MS_MEDIA_ERR_NONE) {
412                 media_content_error("media_svc_get_storage_id failed : %d", ret);
413                 return _content_error_capi(ret);
414         }
415
416         ret = ms_user_get_storage_type(_content_get_uid(), repl_path, &storage_type);
417         if (ret != MS_MEDIA_ERR_NONE) {
418                 media_content_sec_error("ms_user_get_storage_type failed : %d", ret);
419                 return _content_error_capi(ret);
420         }
421
422         /* Get modified time for check exists */
423         ret = media_svc_get_modified_time(_content_get_db_handle(), storage_id, repl_path, &modified_time);
424         if (ret == MS_MEDIA_ERR_NONE) {
425                 /* Refresh if need */
426                 if (modified_time != _media_util_get_file_time(repl_path)) {
427                         ret = media_svc_refresh_item(_content_get_db_handle(), false, storage_id, storage_type, repl_path, _content_get_uid());
428                         if (ret != MS_MEDIA_ERR_NONE) {
429                                 media_content_error("media_svc_refresh_item failed : %d", ret);
430                                 return _content_error_capi(ret);
431                         }
432                 }
433         } else if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
434                 media_content_sec_debug("media_svc_check_item_exist_by_path : no record : %s", repl_path);
435                 media_content_retvm_if(!_media_util_check_support_media_type(repl_path), MEDIA_CONTENT_ERROR_NOT_SUPPORTED, "Unsupported media type");
436
437                 ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, storage_type, repl_path, _content_get_uid());
438                 if (ret != MS_MEDIA_ERR_NONE) {
439                         if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
440                                 media_content_sec_error("This item is already inserted. This may be normal operation because other process already did this (%s)", repl_path);
441                                 ret = MEDIA_CONTENT_ERROR_NONE;
442                         } else {
443                                 media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, repl_path);
444                         }
445
446                         return _content_error_capi(ret);
447                 }
448         } else {
449                 media_content_sec_error("media_svc_get_modified_time failed : %d (%s)", ret, repl_path);
450                 return _content_error_capi(ret);
451         }
452
453         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
454         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
455
456         if (STRING_VALID(storage_id))
457                 ret = _media_info_get_media_info_from_db(repl_path, storage_id, (media_info_h)_media);
458         else
459                 ret = _media_info_get_media_info_from_db(repl_path, DB_TABLE_MEDIA, (media_info_h)_media);
460
461         *info = (media_info_h)_media;
462
463         return ret;
464 }
465
466 int media_info_insert_batch_to_db(const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data)
467 {
468         char **repl_path_array = NULL;
469         int idx = 0;
470         int ret = MS_MEDIA_ERR_NONE;
471         char repl_path[MAX_PATH_LEN] = {0, };
472
473         media_content_retvm_if(path_array == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path_array");
474         media_content_retvm_if(array_length <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid array_length");
475
476         repl_path_array = calloc(1, sizeof(char *) * array_length);
477         media_content_retvm_if(repl_path_array == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
478
479         for (idx = 0; idx < array_length; idx++) {
480                 if (STRING_VALID(path_array[idx])) {
481                         memset(repl_path, 0, sizeof(repl_path));
482                         _media_content_replace_path(path_array[idx], repl_path);
483                         repl_path_array[idx] = strndup(repl_path, strlen(repl_path));
484                 } else {
485                         media_content_error("path[%d] is invalid string", idx);
486                 }
487         }
488
489         ret = __media_info_insert_batch((const char **)repl_path_array, array_length, completed_cb, user_data);
490         for (idx = 0; idx < array_length; idx++)
491                 SAFE_FREE(repl_path_array[idx]);
492
493         SAFE_FREE(repl_path_array);
494
495         return ret;
496 }
497 #ifdef _USE_TVPD_MODE
498 int media_info_get_media_info_by_path_from_db(const char* path, media_info_h* media)
499 {
500         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
501         int ret = MEDIA_CONTENT_ERROR_NONE;
502         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
503         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
504
505         memset(storage_id, 0x00, sizeof(storage_id));
506         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, tzplatform_getuid(TZ_USER_NAME));
507         if (ret != MS_MEDIA_ERR_NONE) {
508                 media_content_error("media_svc_get_storage_id failed : %d", ret);
509                 return _content_error_capi(ret);
510         }
511
512         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
513         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
514
515         ret =  _media_info_get_media_info_from_db(path, storage_id, (media_info_h)_media);
516         *media = (media_info_h)_media;
517
518         return ret;
519 }
520 #endif
521
522 int media_info_delete_from_db(const char *media_id)
523 {
524         int ret = MEDIA_CONTENT_ERROR_NONE;
525         char *path = NULL;
526         char *storage_id = NULL;
527         media_content_warn("DEPRECATION WARNING: media_info_delete_from_db() is deprecated and will be removed from next release. Use media_content_scan_file() instead.");
528
529         if (!STRING_VALID(media_id)) {
530                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
531                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
532         }
533
534         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
535         if (ret != MEDIA_CONTENT_ERROR_NONE) {
536                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
537                 SAFE_FREE(path);
538                 return ret;
539         }
540
541         ret = _media_db_get_storage_id_by_media_id(media_id, &storage_id);
542         if (ret != MEDIA_CONTENT_ERROR_NONE) {
543                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
544                 SAFE_FREE(path);
545                 return ret;
546         }
547
548         ret = media_svc_delete_item_by_path(_content_get_db_handle(), false, storage_id, path, _content_get_uid());
549         SAFE_FREE(path);
550         SAFE_FREE(storage_id);
551
552         return _content_error_capi(ret);
553 }
554
555 int media_info_destroy(media_info_h media)
556 {
557         media_info_s *_media = (media_info_s*)media;
558         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Handle is null");
559
560         SAFE_FREE(_media->media_id);
561         SAFE_FREE(_media->file_path);
562         SAFE_FREE(_media->display_name);
563         SAFE_FREE(_media->mime_type);
564         SAFE_FREE(_media->thumbnail_path);
565         SAFE_FREE(_media->description);
566         SAFE_FREE(_media->title);
567 #ifdef _USE_TVPD_MODE
568         SAFE_FREE(_media->modified_month);
569 #endif
570         SAFE_FREE(_media->storage_uuid);
571 #ifdef _USE_SENIOR_MODE
572         SAFE_FREE(_media->contact);
573         SAFE_FREE(_media->app_data);
574 #endif
575
576         if (_media->image_meta) {
577                 SAFE_FREE(_media->image_meta->media_id);
578                 SAFE_FREE(_media->image_meta->date_taken);
579                 SAFE_FREE(_media->image_meta->exposure_time);
580                 SAFE_FREE(_media->image_meta->model);
581                 SAFE_FREE(_media->image_meta->title);
582
583                 SAFE_FREE(_media->image_meta);
584         }
585
586         if (_media->video_meta) {
587                 SAFE_FREE(_media->video_meta->media_id);
588                 SAFE_FREE(_media->video_meta->title);
589                 SAFE_FREE(_media->video_meta->album);
590                 SAFE_FREE(_media->video_meta->artist);
591                 SAFE_FREE(_media->video_meta->album_artist);
592                 SAFE_FREE(_media->video_meta->genre);
593                 SAFE_FREE(_media->video_meta->composer);
594                 SAFE_FREE(_media->video_meta->year);
595                 SAFE_FREE(_media->video_meta->recorded_date);
596                 SAFE_FREE(_media->video_meta->copyright);
597                 SAFE_FREE(_media->video_meta->track_num);
598
599                 SAFE_FREE(_media->video_meta);
600         }
601
602         if (_media->audio_meta) {
603                 SAFE_FREE(_media->audio_meta->media_id);
604                 SAFE_FREE(_media->audio_meta->title);
605                 SAFE_FREE(_media->audio_meta->album);
606                 SAFE_FREE(_media->audio_meta->artist);
607                 SAFE_FREE(_media->audio_meta->album_artist);
608                 SAFE_FREE(_media->audio_meta->genre);
609                 SAFE_FREE(_media->audio_meta->composer);
610                 SAFE_FREE(_media->audio_meta->year);
611                 SAFE_FREE(_media->audio_meta->recorded_date);
612                 SAFE_FREE(_media->audio_meta->copyright);
613                 SAFE_FREE(_media->audio_meta->track_num);
614
615                 SAFE_FREE(_media->audio_meta);
616         }
617
618         SAFE_FREE(_media);
619
620         return MEDIA_CONTENT_ERROR_NONE;
621 }
622
623 int media_info_clone(media_info_h *dst, media_info_h src)
624 {
625         media_info_s *_src = (media_info_s*)src;
626         media_content_retvm_if(_src == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Source handle is null");
627
628         media_info_s *_dst = (media_info_s*)calloc(1, sizeof(media_info_s));
629         media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
630
631         if (_src->media_id) {
632                 _dst->media_id = g_strdup(_src->media_id);
633                 media_content_retv_free_info_if(_dst->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
634         }
635         if (_src->file_path) {
636                 _dst->file_path = g_strdup(_src->file_path);
637                 media_content_retv_free_info_if(_dst->file_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
638         }
639         if (_src->display_name != NULL) {
640                 _dst->display_name = g_strdup(_src->display_name);
641                 media_content_retv_free_info_if(_dst->display_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
642         }
643         if (_src->mime_type) {
644                 _dst->mime_type = g_strdup(_src->mime_type);
645                 media_content_retv_free_info_if(_dst->mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
646         }
647         if (_src->thumbnail_path != NULL) {
648                 _dst->thumbnail_path = g_strdup(_src->thumbnail_path);
649                 media_content_retv_free_info_if(_dst->thumbnail_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
650         }
651         if (_src->description != NULL) {
652                 _dst->description = g_strdup(_src->description);
653                 media_content_retv_free_info_if(_dst->description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
654         }
655
656         if (_src->title != NULL) {
657                 _dst->title = g_strdup(_src->title);
658                 media_content_retv_free_info_if(_dst->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
659         }
660
661         if (_src->storage_uuid != NULL) {
662                 _dst->storage_uuid = g_strdup(_src->storage_uuid);
663                 media_content_retv_free_info_if(_dst->storage_uuid == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
664         }
665 #ifdef _USE_TVPD_MODE
666         if (STRING_VALID(_src->modified_month)) {
667                 _dst->modified_month = strdup(_src->modified_month);
668                 media_content_retv_free_info_if(_dst->modified_month == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
669         }
670 #endif
671 #ifdef _USE_SENIOR_MODE
672         if (STRING_VALID(_src->contact)) {
673                 _dst->contact = strdup(_src->contact);
674                 media_content_retv_free_info_if(_dst->contact == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
675         }
676
677         if (STRING_VALID(_src->app_data)) {
678                 _dst->app_data = strdup(_src->app_data);
679                 media_content_retv_free_info_if(_dst->app_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
680         }
681 #endif
682
683         _dst->media_type = _src->media_type;
684         _dst->size = _src->size;
685         _dst->added_time = _src->added_time;
686         _dst->modified_time = _src->modified_time;
687         _dst->timeline = _src->timeline;
688         _dst->longitude = _src->longitude;
689         _dst->latitude = _src->latitude;
690         _dst->altitude = _src->altitude;
691         _dst->rating = _src->rating;
692         _dst->favourite = _src->favourite;
693         _dst->is_drm = _src->is_drm;
694         _dst->storage_type = _src->storage_type;
695         _dst->sync_status = _src->sync_status;
696         _dst->request_id = _src->request_id;
697         _dst->face_request_id = _src->face_request_id;
698         _dst->is_360 = _src->is_360;
699 #ifdef _USE_TVPD_MODE
700         _dst->played_count = _src->played_count;
701         _dst->played_time = _src->played_time;
702         _dst->played_position = _src->played_position;
703         _dst->stitched_info = _src->stitched_info;
704         _dst->extract_flag = _src->extract_flag;
705 #endif
706
707         if (_src->media_type == MEDIA_CONTENT_TYPE_IMAGE && _src->image_meta) {
708                 _dst->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
709                 media_content_retv_free_info_if(_dst->image_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
710
711                 if (_src->image_meta->media_id != NULL) {
712                         _dst->image_meta->media_id = g_strdup(_src->image_meta->media_id);
713                         media_content_retv_free_info_if(_dst->image_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
714                 }
715
716                 if (_src->image_meta->date_taken != NULL) {
717                         _dst->image_meta->date_taken = g_strdup(_src->image_meta->date_taken);
718                         media_content_retv_free_info_if(_dst->image_meta->date_taken == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
719                 }
720
721                 if (_src->image_meta->exposure_time != NULL) {
722                         _dst->image_meta->exposure_time = g_strdup(_src->image_meta->exposure_time);
723                         media_content_retv_free_info_if(_dst->image_meta->exposure_time == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
724                 }
725
726                 if (_src->image_meta->model != NULL) {
727                         _dst->image_meta->model = g_strdup(_src->image_meta->model);
728                         media_content_retv_free_info_if(_dst->image_meta->model == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
729                 }
730
731                 _dst->image_meta->fnumber = _src->image_meta->fnumber;
732                 _dst->image_meta->iso = _src->image_meta->iso;
733                 _dst->image_meta->width = _src->image_meta->width;
734                 _dst->image_meta->height = _src->image_meta->height;
735                 _dst->image_meta->orientation = _src->image_meta->orientation;
736
737         } else if (_src->media_type == MEDIA_CONTENT_TYPE_VIDEO && _src->video_meta) {
738                 _dst->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
739                 media_content_retv_free_info_if(_dst->video_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
740
741                 if (_src->video_meta->media_id != NULL) {
742                         _dst->video_meta->media_id = g_strdup(_src->video_meta->media_id);
743                         media_content_retv_free_info_if(_dst->video_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
744                 }
745                 if (_src->video_meta->title != NULL) {
746                         _dst->video_meta->title = g_strdup(_src->video_meta->title);
747                         media_content_retv_free_info_if(_dst->video_meta->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
748                 }
749                 if (_src->video_meta->album != NULL) {
750                         _dst->video_meta->album = g_strdup(_src->video_meta->album);
751                         media_content_retv_free_info_if(_dst->video_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
752                 }
753                 if (_src->video_meta->artist != NULL) {
754                         _dst->video_meta->artist = g_strdup(_src->video_meta->artist);
755                         media_content_retv_free_info_if(_dst->video_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
756                 }
757                 if (_src->video_meta->album_artist != NULL) {
758                         _dst->video_meta->album_artist = g_strdup(_src->video_meta->album_artist);
759                         media_content_retv_free_info_if(_dst->video_meta->album_artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
760                 }
761                 if (_src->video_meta->genre != NULL) {
762                         _dst->video_meta->genre = g_strdup(_src->video_meta->genre);
763                         media_content_retv_free_info_if(_dst->video_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
764                 }
765                 if (_src->video_meta->composer != NULL) {
766                         _dst->video_meta->composer = g_strdup(_src->video_meta->composer);
767                         media_content_retv_free_info_if(_dst->video_meta->composer == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
768                 }
769                 if (_src->video_meta->year != NULL) {
770                         _dst->video_meta->year = g_strdup(_src->video_meta->year);
771                         media_content_retv_free_info_if(_dst->video_meta->year == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
772                 }
773                 if (_src->video_meta->recorded_date != NULL) {
774                         _dst->video_meta->recorded_date = g_strdup(_src->video_meta->recorded_date);
775                         media_content_retv_free_info_if(_dst->video_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
776                 }
777                 if (_src->video_meta->copyright != NULL) {
778                         _dst->video_meta->copyright = g_strdup(_src->video_meta->copyright);
779                         media_content_retv_free_info_if(_dst->video_meta->copyright == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
780                 }
781                 if (_src->video_meta->track_num != NULL) {
782                         _dst->video_meta->track_num = g_strdup(_src->video_meta->track_num);
783                         media_content_retv_free_info_if(_dst->video_meta->track_num == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
784                 }
785
786                 _dst->video_meta->width = _src->video_meta->width;
787                 _dst->video_meta->height = _src->video_meta->height;
788                 _dst->video_meta->duration = _src->video_meta->duration;
789                 _dst->video_meta->bitrate = _src->video_meta->bitrate;
790                 _dst->video_meta->rotation = _src->video_meta->rotation;
791
792         } else if ((_src->media_type == MEDIA_CONTENT_TYPE_MUSIC || _src->media_type == MEDIA_CONTENT_TYPE_SOUND) && _src->audio_meta) {
793                 _dst->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
794                 media_content_retv_free_info_if(_dst->audio_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
795
796                 if (_src->audio_meta->media_id != NULL) {
797                         _dst->audio_meta->media_id = g_strdup(_src->audio_meta->media_id);
798                         media_content_retv_free_info_if(_dst->audio_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
799                 }
800                 if (_src->audio_meta->title != NULL) {
801                         _dst->audio_meta->title = g_strdup(_src->audio_meta->title);
802                         media_content_retv_free_info_if(_dst->audio_meta->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
803                 }
804                 if (_src->audio_meta->album != NULL) {
805                         _dst->audio_meta->album = g_strdup(_src->audio_meta->album);
806                         media_content_retv_free_info_if(_dst->audio_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
807                 }
808                 if (_src->audio_meta->artist != NULL) {
809                         _dst->audio_meta->artist = g_strdup(_src->audio_meta->artist);
810                         media_content_retv_free_info_if(_dst->audio_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
811                 }
812                 if (_src->audio_meta->album_artist != NULL) {
813                         _dst->audio_meta->album_artist = g_strdup(_src->audio_meta->album_artist);
814                         media_content_retv_free_info_if(_dst->audio_meta->album_artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
815                 }
816                 if (_src->audio_meta->genre != NULL) {
817                         _dst->audio_meta->genre = g_strdup(_src->audio_meta->genre);
818                         media_content_retv_free_info_if(_dst->audio_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
819                 }
820                 if (_src->audio_meta->composer != NULL) {
821                         _dst->audio_meta->composer = g_strdup(_src->audio_meta->composer);
822                         media_content_retv_free_info_if(_dst->audio_meta->composer == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
823                 }
824                 if (_src->audio_meta->year != NULL) {
825                         _dst->audio_meta->year = g_strdup(_src->audio_meta->year);
826                         media_content_retv_free_info_if(_dst->audio_meta->year == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
827                 }
828                 if (_src->audio_meta->recorded_date != NULL) {
829                         _dst->audio_meta->recorded_date = g_strdup(_src->audio_meta->recorded_date);
830                         media_content_retv_free_info_if(_dst->audio_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
831                 }
832                 if (_src->audio_meta->copyright != NULL) {
833                         _dst->audio_meta->copyright = g_strdup(_src->audio_meta->copyright);
834                         media_content_retv_free_info_if(_dst->audio_meta->copyright == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
835                 }
836                 if (_src->audio_meta->track_num != NULL) {
837                         _dst->audio_meta->track_num = g_strdup(_src->audio_meta->track_num);
838                         media_content_retv_free_info_if(_dst->audio_meta->track_num == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
839                 }
840
841                 _dst->audio_meta->channel = _src->audio_meta->channel;
842                 _dst->audio_meta->samplerate = _src->audio_meta->samplerate;
843                 _dst->audio_meta->duration = _src->audio_meta->duration;
844                 _dst->audio_meta->bitrate = _src->audio_meta->bitrate;
845                 _dst->audio_meta->bitpersample = _src->audio_meta->bitpersample;
846         }
847         *dst = (media_info_h)_dst;
848
849         return MEDIA_CONTENT_ERROR_NONE;
850 }
851
852 int media_info_get_media_count_from_db(filter_h filter, int *media_count)
853 {
854         int ret = MEDIA_CONTENT_ERROR_NONE;
855
856         if (media_count == NULL) {
857                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
858                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
859
860                 return ret;
861         }
862
863         ret = _media_db_get_group_item_count(NULL, filter, MEDIA_GROUP_NONE, media_count);
864
865         return ret;
866 }
867
868 int media_info_foreach_media_from_db(filter_h filter, media_info_cb callback, void *user_data)
869 {
870         int ret = MEDIA_CONTENT_ERROR_NONE;
871
872         media_content_retvm_if(callback == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid callback");
873
874         ret = _media_db_get_group_item(NULL, filter, callback, user_data, MEDIA_GROUP_NONE);
875
876         return ret;
877 }
878
879 int media_info_get_tag_count_from_db(const char *media_id, filter_h filter, int *tag_count)
880 {
881         int ret = MEDIA_CONTENT_ERROR_NONE;
882
883         if (STRING_VALID(media_id) && tag_count) {
884                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_TAG_BY_MEDIA_ID, tag_count);
885         } else {
886                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
887                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
888         }
889
890         return ret;
891 }
892
893 int media_info_foreach_tag_from_db(const char *media_id, filter_h filter, media_tag_cb callback, void *user_data)
894 {
895         int ret = MEDIA_CONTENT_ERROR_NONE;
896
897         if ((callback != NULL) && STRING_VALID(media_id)) {
898                 ret = _media_db_get_tag(media_id, filter, callback, user_data);
899         } else {
900                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
901                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
902         }
903
904         return ret;
905 }
906
907 int media_info_get_bookmark_count_from_db(const char *media_id, filter_h filter, int *bookmark_count)
908 {
909         int ret = MEDIA_CONTENT_ERROR_NONE;
910
911         if (STRING_VALID(media_id) && bookmark_count) {
912                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_BOOKMARK_BY_MEDIA_ID, bookmark_count);
913         } else {
914                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
915                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
916         }
917
918         return ret;
919 }
920
921 int media_info_foreach_bookmark_from_db(const char *media_id, filter_h filter, media_bookmark_cb callback, void *user_data)
922 {
923         int ret = MEDIA_CONTENT_ERROR_NONE;
924
925         if ((callback != NULL) && STRING_VALID(media_id)) {
926                 ret = _media_db_get_bookmark(media_id, filter, callback, user_data);
927         } else {
928                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
929                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
930         }
931
932         return ret;
933 }
934
935 int media_info_get_face_count_from_db(const char *media_id, filter_h filter, int *face_count)
936 {
937         int ret = MEDIA_CONTENT_ERROR_NONE;
938
939         if (STRING_VALID(media_id) && face_count) {
940                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_FACE_BY_MEDIA_ID, face_count);
941         } else {
942                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
943                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
944         }
945
946         return ret;
947 }
948
949 int media_info_foreach_face_from_db(const char *media_id, filter_h filter, media_face_cb callback, void *user_data)
950 {
951         int ret = MEDIA_CONTENT_ERROR_NONE;
952
953         if ((callback != NULL) && STRING_VALID(media_id)) {
954                 ret = _media_db_get_face(media_id, filter, callback, user_data);
955         } else {
956                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
957                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
958         }
959
960         return ret;
961 }
962
963 int media_info_get_image(media_info_h media, image_meta_h *image)
964 {
965         int ret = MEDIA_CONTENT_ERROR_NONE;
966
967         media_info_s *_media = (media_info_s*)media;
968
969         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
970         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_IMAGE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
971         media_content_retvm_if(_media->image_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid image_meta");
972
973         image_meta_s *_image = (image_meta_s*)calloc(1, sizeof(image_meta_s));
974         media_content_retvm_if(_image == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
975
976         _image->media_id = g_strdup(_media->media_id);
977         _image->width = _media->image_meta->width;
978         _image->height = _media->image_meta->height;
979         _image->orientation = _media->image_meta->orientation;
980         _image->fnumber = _media->image_meta->fnumber;
981         _image->iso = _media->image_meta->iso;
982         _image->date_taken = g_strdup(_media->image_meta->date_taken);
983         _image->title = g_strdup(_media->image_meta->title);
984         _image->exposure_time = g_strdup(_media->image_meta->exposure_time);
985         _image->model = g_strdup(_media->image_meta->model);
986
987         *image = (image_meta_h)_image;
988
989         return ret;
990 }
991
992 int media_info_get_video(media_info_h media, video_meta_h *video)
993 {
994         int ret = MEDIA_CONTENT_ERROR_NONE;
995
996         media_info_s *_media = (media_info_s*)media;
997
998         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
999         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_VIDEO, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
1000         media_content_retvm_if(_media->video_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid video_meta");
1001
1002         video_meta_s *_video = (video_meta_s*)calloc(1, sizeof(video_meta_s));
1003         media_content_retvm_if(_video == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1004
1005         _video->media_id = g_strdup(_media->media_id);
1006         _video->title = g_strdup(_media->video_meta->title);
1007         _video->album = g_strdup(_media->video_meta->album);
1008         _video->artist = g_strdup(_media->video_meta->artist);
1009         _video->album_artist = g_strdup(_media->video_meta->album_artist);
1010         _video->genre = g_strdup(_media->video_meta->genre);
1011         _video->composer = g_strdup(_media->video_meta->composer);
1012         _video->year = g_strdup(_media->video_meta->year);
1013         _video->recorded_date = g_strdup(_media->video_meta->recorded_date);
1014         _video->copyright = g_strdup(_media->video_meta->copyright);
1015         _video->track_num = g_strdup(_media->video_meta->track_num);
1016
1017         _video->width = _media->video_meta->width;
1018         _video->height = _media->video_meta->height;
1019         _video->duration = _media->video_meta->duration;
1020         _video->bitrate = _media->video_meta->bitrate;
1021         _video->rotation = _media->video_meta->rotation;
1022
1023         *video = (video_meta_h)_video;
1024
1025         return ret;
1026 }
1027
1028 int media_info_get_audio(media_info_h media, audio_meta_h *audio)
1029 {
1030         int ret = MEDIA_CONTENT_ERROR_NONE;
1031
1032         media_info_s *_media = (media_info_s*)media;
1033
1034         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
1035         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_MUSIC && _media->media_type != MEDIA_CONTENT_TYPE_SOUND, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
1036         media_content_retvm_if(_media->audio_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid audio_meta");
1037
1038         audio_meta_s *_audio = (audio_meta_s*)calloc(1, sizeof(audio_meta_s));
1039         media_content_retvm_if(_audio == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1040
1041         _audio->media_id = g_strdup(_media->media_id);
1042         _audio->title = g_strdup(_media->audio_meta->title);
1043         _audio->album = g_strdup(_media->audio_meta->album);
1044         _audio->artist = g_strdup(_media->audio_meta->artist);
1045         _audio->album_artist = g_strdup(_media->audio_meta->album_artist);
1046         _audio->genre = g_strdup(_media->audio_meta->genre);
1047         _audio->composer = g_strdup(_media->audio_meta->composer);
1048         _audio->year = g_strdup(_media->audio_meta->year);
1049         _audio->recorded_date = g_strdup(_media->audio_meta->recorded_date);
1050         _audio->copyright = g_strdup(_media->audio_meta->copyright);
1051         _audio->track_num = g_strdup(_media->audio_meta->track_num);
1052
1053         _audio->duration = _media->audio_meta->duration;
1054         _audio->bitrate = _media->audio_meta->bitrate;
1055         _audio->bitpersample = _media->audio_meta->bitpersample;
1056         _audio->samplerate = _media->audio_meta->samplerate;
1057         _audio->channel = _media->audio_meta->channel;
1058
1059         *audio = (audio_meta_h)_audio;
1060
1061         return ret;
1062 }
1063
1064 int media_info_get_media_id(media_info_h media, char **media_id)
1065 {
1066         int ret = MEDIA_CONTENT_ERROR_NONE;
1067         media_info_s *_media = (media_info_s*)media;
1068
1069         if (_media && media_id) {
1070                 if (STRING_VALID(_media->media_id)) {
1071                         *media_id = strdup(_media->media_id);
1072                         media_content_retvm_if(*media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1073                 } else {
1074                         *media_id = NULL;
1075                 }
1076                 ret = MEDIA_CONTENT_ERROR_NONE;
1077         } else {
1078                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1079                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1080         }
1081
1082         return ret;
1083 }
1084
1085 int media_info_get_file_path(media_info_h media, char **path)
1086 {
1087         int ret = MEDIA_CONTENT_ERROR_NONE;
1088         media_info_s *_media = (media_info_s*)media;
1089
1090         if (_media && path) {
1091                 if (STRING_VALID(_media->file_path)) {
1092                         *path = strdup(_media->file_path);
1093                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1094                 } else {
1095                         *path = NULL;
1096                 }
1097                 ret = MEDIA_CONTENT_ERROR_NONE;
1098
1099         } else {
1100                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1101                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1102         }
1103
1104         return ret;
1105 }
1106
1107 int media_info_get_display_name(media_info_h media, char **name)
1108 {
1109         int ret = MEDIA_CONTENT_ERROR_NONE;
1110         media_info_s *_media = (media_info_s*)media;
1111         if (_media && name) {
1112                 if (_media->display_name != NULL) {
1113                         *name = g_strdup(_media->display_name);
1114                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1115                 } else {
1116                         *name = NULL;
1117                 }
1118                 ret = MEDIA_CONTENT_ERROR_NONE;
1119
1120         } else {
1121                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1122                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1123         }
1124
1125         return ret;
1126 }
1127
1128 int media_info_get_media_type(media_info_h media, media_content_type_e *type)
1129 {
1130         int ret = MEDIA_CONTENT_ERROR_NONE;
1131         media_info_s *_media = (media_info_s*)media;
1132         if (_media && type) {
1133                 *type = _media->media_type;
1134                 ret = MEDIA_CONTENT_ERROR_NONE;
1135         } else {
1136                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1137                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1138         }
1139
1140         return ret;
1141 }
1142
1143 int media_info_get_mime_type(media_info_h media, char **mime_type)
1144 {
1145         int ret = MEDIA_CONTENT_ERROR_NONE;
1146         media_info_s *_media = (media_info_s*)media;
1147
1148         if (_media && mime_type) {
1149                 if (STRING_VALID(_media->mime_type)) {
1150                         *mime_type = strdup(_media->mime_type);
1151                         media_content_retvm_if(*mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1152                 } else {
1153                         *mime_type = NULL;
1154                 }
1155                 ret = MEDIA_CONTENT_ERROR_NONE;
1156         } else {
1157                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1158                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1159         }
1160
1161         return ret;
1162 }
1163
1164 int media_info_get_size(media_info_h media, unsigned long long *size)
1165 {
1166         int ret = MEDIA_CONTENT_ERROR_NONE;
1167         media_info_s *_media = (media_info_s*)media;
1168
1169         if (_media && size) {
1170                 *size = _media->size;
1171                 ret = MEDIA_CONTENT_ERROR_NONE;
1172         } else {
1173                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1174                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1175         }
1176
1177         return ret;
1178 }
1179
1180 int media_info_get_added_time(media_info_h media, time_t *added_time)
1181 {
1182         int ret = MEDIA_CONTENT_ERROR_NONE;
1183         media_info_s *_media = (media_info_s*)media;
1184         if (_media && added_time) {
1185                 *added_time = _media->added_time;
1186                 ret = MEDIA_CONTENT_ERROR_NONE;
1187         } else {
1188                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1189                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1190         }
1191
1192         return ret;
1193 }
1194
1195 int media_info_get_modified_time(media_info_h media, time_t* time)
1196 {
1197         int ret = MEDIA_CONTENT_ERROR_NONE;
1198         media_info_s *_media = (media_info_s*)media;
1199         if (_media && time) {
1200                 *time = _media->modified_time;
1201                 ret = MEDIA_CONTENT_ERROR_NONE;
1202         } else {
1203                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1204                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1205         }
1206
1207         return ret;
1208 }
1209
1210 int media_info_get_timeline(media_info_h media, time_t* time)
1211 {
1212         int ret = MEDIA_CONTENT_ERROR_NONE;
1213         media_info_s *_media = (media_info_s*)media;
1214         if (_media && time) {
1215                 *time = _media->timeline;
1216                 ret = MEDIA_CONTENT_ERROR_NONE;
1217         } else {
1218                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1219                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1220         }
1221
1222         return ret;
1223 }
1224
1225 int media_info_get_thumbnail_path(media_info_h media, char **path)
1226 {
1227         int ret = MEDIA_CONTENT_ERROR_NONE;
1228         media_info_s *_media = (media_info_s*)media;
1229         if (_media && path) {
1230                 if (_media->thumbnail_path != NULL) {
1231                         *path = g_strdup(_media->thumbnail_path);
1232                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1233                 } else {
1234                         *path = NULL;
1235                 }
1236                 ret = MEDIA_CONTENT_ERROR_NONE;
1237
1238         } else {
1239                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1240                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1241         }
1242
1243         return ret;
1244 }
1245
1246 int media_info_get_title(media_info_h media, char **title)
1247 {
1248         int ret = MEDIA_CONTENT_ERROR_NONE;
1249         media_info_s *_media = (media_info_s*)media;
1250
1251         if (_media && title)    { /*title can be empty string*/
1252                 if (_media->title != NULL) {
1253                         *title = g_strdup(_media->title);
1254                         media_content_retvm_if(*title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1255                 } else {
1256                         *title = NULL;
1257                 }
1258                 ret = MEDIA_CONTENT_ERROR_NONE;
1259         } else {
1260                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1261                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1262         }
1263
1264         return ret;
1265 }
1266
1267 int media_info_get_description(media_info_h media, char **description)
1268 {
1269         int ret = MEDIA_CONTENT_ERROR_NONE;
1270         media_info_s *_media = (media_info_s*)media;
1271
1272         if (_media && description) {
1273                 if (_media->description != NULL) {      /*description can be empty string*/
1274                         *description = g_strdup(_media->description);
1275                         media_content_retvm_if(*description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1276                 } else {
1277                         *description = NULL;
1278                 }
1279                 ret = MEDIA_CONTENT_ERROR_NONE;
1280         } else {
1281                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1282                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1283         }
1284
1285         return ret;
1286 }
1287
1288 int media_info_get_longitude(media_info_h media, double* longitude)
1289 {
1290         int ret = MEDIA_CONTENT_ERROR_NONE;
1291         media_info_s *_media = (media_info_s*)media;
1292
1293         if (_media && longitude) {
1294                 *longitude = _media->longitude;
1295                 ret = MEDIA_CONTENT_ERROR_NONE;
1296         } else {
1297                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1298                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1299         }
1300
1301         return ret;
1302 }
1303 int media_info_get_latitude(media_info_h media, double* latitude)
1304 {
1305         int ret = MEDIA_CONTENT_ERROR_NONE;
1306         media_info_s *_media = (media_info_s*)media;
1307
1308         if (_media && latitude) {
1309                 *latitude = _media->latitude;
1310                 ret = MEDIA_CONTENT_ERROR_NONE;
1311         } else {
1312                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1313                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1314         }
1315
1316         return ret;
1317 }
1318
1319 int media_info_get_altitude(media_info_h media, double *altitude)
1320 {
1321         int ret = MEDIA_CONTENT_ERROR_NONE;
1322         media_info_s *_media = (media_info_s*)media;
1323
1324         if (_media && altitude) {
1325                 *altitude = _media->altitude;
1326                 ret = MEDIA_CONTENT_ERROR_NONE;
1327         } else {
1328                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1329                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1330         }
1331
1332         return ret;
1333 }
1334
1335 int media_info_get_rating(media_info_h media, int *rating)
1336 {
1337         int ret = MEDIA_CONTENT_ERROR_NONE;
1338         media_info_s *_media = (media_info_s*)media;
1339
1340         if (_media && rating) {
1341                 *rating = _media->rating;
1342                 ret = MEDIA_CONTENT_ERROR_NONE;
1343         } else {
1344                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1345                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1346         }
1347
1348         return ret;
1349 }
1350
1351 int media_info_get_favorite(media_info_h media, bool* favorite)
1352 {
1353         int ret = MEDIA_CONTENT_ERROR_NONE;
1354         media_info_s *_media = (media_info_s*)media;
1355
1356         if (_media && favorite) {
1357                 *favorite = _media->favourite;
1358                 ret = MEDIA_CONTENT_ERROR_NONE;
1359         } else {
1360                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1361                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1362         }
1363
1364         return ret;
1365 }
1366
1367 int media_info_get_storage_id(media_info_h media, char **storage_id)
1368 {
1369         int ret = MEDIA_CONTENT_ERROR_NONE;
1370         media_content_warn("DEPRECATION WARNING: media_info_get_storage_id() is deprecated and will be removed from next release.");
1371         media_info_s *_media = (media_info_s*)media;
1372
1373         if (_media && storage_id) {
1374                 if (STRING_VALID(_media->storage_uuid)) {
1375                         *storage_id = strdup(_media->storage_uuid);
1376                         media_content_retvm_if(*storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1377                 } else {
1378                         *storage_id = NULL;
1379                         ret = MEDIA_CONTENT_ERROR_DB_FAILED;
1380                 }
1381         } else {
1382                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1383                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1384         }
1385
1386         return ret;
1387 }
1388
1389 int media_info_is_drm(media_info_h media, bool *is_drm)
1390 {
1391         int ret = MEDIA_CONTENT_ERROR_NONE;
1392         media_info_s *_media = (media_info_s*)media;
1393
1394         if (_media) {
1395                 *is_drm = _media->is_drm;
1396                 ret = MEDIA_CONTENT_ERROR_NONE;
1397         } else {
1398                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1399                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1400         }
1401
1402         return ret;
1403 }
1404
1405 int media_info_is_360_content(media_info_h media, bool *is_360)
1406 {
1407         int ret = MEDIA_CONTENT_ERROR_NONE;
1408         media_info_s *_media = (media_info_s*)media;
1409
1410         if (_media) {
1411                 *is_360 = _media->is_360;
1412                 ret = MEDIA_CONTENT_ERROR_NONE;
1413         } else {
1414                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1415                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1416         }
1417
1418         return ret;
1419 }
1420
1421 int media_info_get_storage_type(media_info_h media, media_content_storage_e *storage_type)
1422 {
1423         int ret = MEDIA_CONTENT_ERROR_NONE;
1424         media_content_warn("DEPRECATION WARNING: media_info_get_storage_type() is deprecated and will be removed from next release. Use storage_get_type_dev() instead.");
1425         media_info_s *_media = (media_info_s*)media;
1426
1427         if (_media && storage_type) {
1428                 *storage_type = _media->storage_type;
1429                 ret = MEDIA_CONTENT_ERROR_NONE;
1430         } else {
1431                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1432                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1433         }
1434
1435         return ret;
1436 }
1437
1438 #ifdef _USE_SENIOR_MODE
1439 int media_info_set_contact(media_info_h media, const char *contact)
1440 {
1441         int ret = MEDIA_CONTENT_ERROR_NONE;
1442         media_info_s *_media = (media_info_s*)media;
1443
1444         if (_media != NULL) {
1445                 SAFE_FREE(_media->contact);
1446                 if (STRING_VALID(contact)) {
1447                         _media->contact = strdup(contact);
1448                         media_content_retvm_if(_media->contact == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1449                 } else {
1450                         _media->contact = NULL;
1451                 }
1452         } else {
1453                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1454                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1455         }
1456
1457         return ret;
1458 }
1459
1460 int media_info_set_app_data(media_info_h media, const char *app_data)
1461 {
1462         int ret = MEDIA_CONTENT_ERROR_NONE;
1463         media_info_s *_media = (media_info_s*)media;
1464
1465         if (_media != NULL) {
1466                 SAFE_FREE(_media->app_data);
1467                 if (STRING_VALID(app_data)) {
1468                         _media->app_data = strdup(app_data);
1469                         media_content_retvm_if(_media->app_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1470                 } else {
1471                         _media->app_data = NULL;
1472                 }
1473         } else {
1474                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1475                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1476         }
1477
1478         return ret;
1479 }
1480
1481 int media_info_insert_to_db_with_contact_data(const char *path, const char* contact, const char* app_data, media_info_h *info)
1482 {
1483         int ret = media_info_insert_to_db(path, info);
1484         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_insert_to_db [%s] failed", path);
1485
1486         ret = media_info_set_contact(*info, contact);
1487         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1488                 media_content_error("media_info_set_contact [%s] failed", contact);
1489
1490                 media_info_s* _media_info = (media_info_s*)*info;
1491                 ret = media_info_delete_from_db(_media_info->media_id);
1492                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1493
1494                 media_info_destroy(*info);
1495                 return ret;
1496         }
1497
1498         ret = media_info_set_app_data(*info, app_data);
1499         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1500                 media_content_error("media_info_set_app_data [%s] failed", app_data);
1501
1502                 media_info_s* _media_info = (media_info_s*)*info;
1503                 ret = media_info_delete_from_db(_media_info->media_id);
1504                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1505
1506                 media_info_destroy(*info);
1507                 return ret;
1508         }
1509
1510         ret = media_info_update_to_db(*info);
1511         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1512                 media_content_error("media_info_update_to_db [] failed");
1513
1514                 media_info_s* _media_info = (media_info_s*)*info;
1515                 ret = media_info_delete_from_db(_media_info->media_id);
1516                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1517
1518                 media_info_destroy(*info);
1519                 return ret;
1520         }
1521
1522         return ret;
1523 }
1524
1525 int media_info_delete_contact_from_db(const char* contact, const char* storage_id)
1526 {
1527         return -1;
1528 }
1529
1530 int media_info_delete_item(const char *media_id)
1531 {
1532         int ret = MEDIA_CONTENT_ERROR_NONE;
1533         char *path = NULL;
1534         char *storage_id = NULL;
1535
1536         if (!STRING_VALID(media_id)) {
1537                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1538                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1539         }
1540
1541         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
1542         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1543                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
1544                 SAFE_FREE(path);
1545                 return ret;
1546         }
1547
1548         ret = _media_db_get_storage_id_by_media_id(media_id, &storage_id);
1549         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1550                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
1551                 SAFE_FREE(path);
1552                 return ret;
1553         }
1554
1555         ret = media_svc_delete_item_by_path(_content_get_db_handle(), false, storage_id, path, tzplatform_getuid(TZ_USER_NAME));
1556         SAFE_FREE(storage_id);
1557         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1558                 media_content_error("remove from DB failed : %d", ret);
1559                 SAFE_FREE(path);
1560                 return ret;
1561         }
1562
1563         ret = media_svc_remove_file(path);
1564         SAFE_FREE(path);
1565         return _content_error_capi(ret);
1566 }
1567
1568 int media_info_get_contact(media_info_h media, char **contact)
1569 {
1570         int ret = MEDIA_CONTENT_ERROR_NONE;
1571         media_info_s *_media = (media_info_s*)media;
1572
1573         if (_media && contact) {
1574                 if (STRING_VALID(_media->contact)) {
1575                         *contact = strdup(_media->contact);
1576                         if (*contact == NULL) {
1577                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1578                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1579                         }
1580                 } else {
1581                         *contact = NULL;
1582                 }
1583                 ret = MEDIA_CONTENT_ERROR_NONE;
1584         } else {
1585                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1586                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1587         }
1588
1589         return ret;
1590 }
1591
1592 int media_info_get_app_data(media_info_h media, char **app_data)
1593 {
1594         int ret = MEDIA_CONTENT_ERROR_NONE;
1595         media_info_s *_media = (media_info_s*)media;
1596
1597         if (_media && app_data) {
1598                 if (STRING_VALID(_media->app_data)) {
1599                         *app_data = strdup(_media->app_data);
1600                         if (*app_data == NULL) {
1601                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1602                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1603                         }
1604                 } else {
1605                         *app_data = NULL;
1606                 }
1607                 ret = MEDIA_CONTENT_ERROR_NONE;
1608         } else {
1609                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1610                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1611         }
1612
1613         return ret;
1614 }
1615 #endif
1616 #ifdef _USE_TVPD_MODE
1617 int media_info_get_played_count(media_info_h media, int *played_count)
1618 {
1619         int ret = MEDIA_CONTENT_ERROR_NONE;
1620         media_info_s *_media = (media_info_s*)media;
1621
1622         if (_media) {
1623                 *played_count = _media->played_count;
1624                 ret = MEDIA_CONTENT_ERROR_NONE;
1625         } else {
1626                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1627                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1628         }
1629
1630         return ret;
1631 }
1632
1633 int media_info_set_played_count(media_info_h media, int played_count)
1634 {
1635         int ret = MEDIA_CONTENT_ERROR_NONE;
1636
1637         media_info_s *_media = (media_info_s*)media;
1638
1639         if (_media) {
1640                 _media->played_count = played_count;
1641         } else {
1642                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1643                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1644         }
1645
1646         return ret;
1647 }
1648
1649 int media_info_set_played_position(media_info_h media, int played_position)
1650 {
1651         int ret = MEDIA_CONTENT_ERROR_NONE;
1652         media_info_s *_media = (media_info_s*)media;
1653
1654         if ((_media != NULL) && (played_position >= 0)) {
1655                 _media->played_position = played_position;
1656         } else {
1657                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1658                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1659         }
1660
1661         return ret;
1662 }
1663
1664 int media_info_get_played_position(media_info_h media, int *played_position)
1665 {
1666         int ret = MEDIA_CONTENT_ERROR_NONE;
1667         media_info_s *_media = (media_info_s*)media;
1668
1669         if (_media) {
1670                 *played_position = _media->played_position;
1671                 ret = MEDIA_CONTENT_ERROR_NONE;
1672         } else {
1673                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1674                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1675         }
1676
1677         return ret;
1678 }
1679
1680 int media_info_set_played_time(media_info_h media)
1681 {
1682         int ret = MEDIA_CONTENT_ERROR_NONE;
1683         time_t current_time;
1684
1685         media_info_s *_media = (media_info_s*)media;
1686
1687         if (_media != NULL) {
1688                 time(&current_time);
1689                 _media->played_time = current_time;
1690         } else {
1691                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1692                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1693         }
1694
1695         return ret;
1696 }
1697
1698 int media_info_get_played_time(media_info_h media, time_t* played_time)
1699 {
1700         int ret = MEDIA_CONTENT_ERROR_NONE;
1701         media_info_s *_media = (media_info_s*)media;
1702
1703         if (_media) {
1704                 *played_time = _media->played_time;
1705                 ret = MEDIA_CONTENT_ERROR_NONE;
1706         } else {
1707                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1708                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1709         }
1710
1711         return ret;
1712 }
1713
1714 int media_info_get_extract_flag(media_info_h media, int *extract_flag)
1715 {
1716         int ret = MEDIA_CONTENT_ERROR_NONE;
1717         media_info_s *_media = (media_info_s *)media;
1718
1719         if (_media && extract_flag) {
1720                 *extract_flag = _media->extract_flag;
1721                 ret = MEDIA_CONTENT_ERROR_NONE;
1722         } else {
1723                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1724                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1725         }
1726
1727         return ret;
1728 }
1729
1730 int media_info_get_stitched_state(media_info_h media, int *stitched_info)
1731 {
1732         int ret = MEDIA_CONTENT_ERROR_NONE;
1733         media_info_s *_media = (media_info_s*)media;
1734
1735         if (_media) {
1736                 *stitched_info = (_media->stitched_info & 0xFFFF0000) >> 16;
1737                 ret = MEDIA_CONTENT_ERROR_NONE;
1738         } else {
1739                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1740                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1741         }
1742
1743         return ret;
1744 }
1745
1746 int media_info_get_stitched_engine(media_info_h media, int *stitched_info)
1747 {
1748         int ret = MEDIA_CONTENT_ERROR_NONE;
1749         media_info_s *_media = (media_info_s*)media;
1750
1751         if (_media) {
1752                 *stitched_info = _media->stitched_info & 0x0000FFFF;
1753                 ret = MEDIA_CONTENT_ERROR_NONE;
1754         } else {
1755                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1756                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1757         }
1758
1759         return ret;
1760 }
1761
1762 int media_info_get_modified_month(media_info_h media, char **modified_month)
1763 {
1764         int ret = MEDIA_CONTENT_ERROR_NONE;
1765         media_info_s *_media = (media_info_s*)media;
1766
1767         if (_media && modified_month) {
1768                 if (STRING_VALID(_media->modified_month)) {
1769                         *modified_month = strdup(_media->modified_month);
1770                         if (*modified_month == NULL) {
1771                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1772                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1773                         }
1774                 } else {
1775                         *modified_month = NULL;
1776                 }
1777                 ret = MEDIA_CONTENT_ERROR_NONE;
1778         } else {
1779                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1780                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1781         }
1782
1783         return ret;
1784 }
1785
1786 #endif
1787
1788 int media_info_get_media_from_db(const char *media_id, media_info_h *media)
1789 {
1790         int ret = MEDIA_CONTENT_ERROR_NONE;
1791         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1792         char *storage_id = NULL;
1793         sqlite3_stmt *stmt = NULL;
1794
1795         if (!STRING_VALID(media_id) || (media == NULL)) {
1796                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1797                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1798         }
1799
1800         memset(select_query, 0x00, sizeof(select_query));
1801
1802         ret = _media_db_get_storage_id_by_media_id(media_id, &storage_id);
1803         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1804
1805         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_FROM_MEDIA, storage_id, media_id);
1806         ret = _content_get_result(select_query, &stmt);
1807         SAFE_FREE(storage_id);
1808         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1809
1810         media_info_s *_media = NULL;
1811
1812         if (sqlite3_step(stmt) == SQLITE_ROW) {
1813                 _media = (media_info_s*)calloc(1, sizeof(media_info_s));
1814
1815                 if (_media == NULL) {
1816                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1817                         SQLITE3_FINALIZE(stmt);
1818                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1819                 }
1820
1821                 _media_info_item_get_detail(stmt, (media_info_h)_media);
1822
1823                 *media = (media_info_h)_media;
1824         } else {
1825                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1826         }
1827
1828         SQLITE3_FINALIZE(stmt);
1829
1830         return ret;
1831 }
1832
1833 int media_info_set_favorite(media_info_h media, bool favorite)
1834 {
1835         int ret = MEDIA_CONTENT_ERROR_NONE;
1836         media_info_s *_media = (media_info_s*)media;
1837
1838         if (_media != NULL) {
1839                 if (favorite == TRUE)
1840                         time(&_media->favourite);
1841                 else
1842                         _media->favourite = 0;
1843         } else {
1844                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1845                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1846         }
1847
1848         return ret;
1849 }
1850
1851 int media_info_update_to_db(media_info_h media)
1852 {
1853         int ret = MEDIA_CONTENT_ERROR_NONE;
1854         media_info_s *_media = (media_info_s*)media;
1855         char *set_sql = NULL;
1856         char *sql = NULL;
1857
1858         if (_media != NULL && STRING_VALID(_media->media_id)) {
1859                 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
1860                 /* This code will be removed when sqlite3_mprintf works clearly */
1861                 char *test_sql = sqlite3_mprintf("%f, %f, %f", _media->longitude, _media->latitude, _media->altitude);
1862                 SQLITE3_SAFE_FREE(test_sql);
1863
1864                 /*Update Pinyin If Support Pinyin*/
1865                 char *file_name_pinyin = NULL;
1866                 char *description_pinyin = NULL;
1867                 bool pinyin_support = FALSE;
1868
1869                 /*Update Pinyin If Support Pinyin*/
1870                 media_svc_check_pinyin_support(&pinyin_support);
1871                 if (pinyin_support) {
1872                         if (STRING_VALID(_media->display_name))
1873                                 media_svc_get_pinyin(_media->display_name, &file_name_pinyin);
1874                         if (STRING_VALID(_media->description))
1875                                 media_svc_get_pinyin(_media->description, &description_pinyin);
1876                 }
1877 #ifdef _USE_TVPD_MODE
1878 #ifdef _USE_SENIOR_MODE
1879                 if (_media_content_is_support_senior_mode()) {
1880                         set_sql = sqlite3_mprintf("media_display_name=%Q, media_description=%Q, media_longitude=%f, media_latitude=%f, media_file_name_pinyin=%Q, media_description_pinyin=%Q, played_count=%d, last_played_time=%d, last_played_position=%d, media_rating=%d, media_favourite=%d, contact=%Q, app_data=%Q",
1881                                 _media->display_name, _media->description, _media->longitude, _media->latitude, file_name_pinyin, description_pinyin, _media->played_count, _media->played_time, _media->played_position, _media->rating, _media->favourite, _media->contact, _media->app_data);
1882                 } else
1883 #endif
1884                 {
1885                         set_sql = sqlite3_mprintf("media_display_name=%Q, media_description=%Q, media_longitude=%f, media_latitude=%f, media_file_name_pinyin=%Q, media_description_pinyin=%Q, played_count=%d, last_played_time=%d, last_played_position=%d, media_rating=%d, media_favourite=%d",
1886                                 _media->display_name, _media->description, _media->longitude, _media->latitude, file_name_pinyin, description_pinyin, _media->played_count, _media->played_time, _media->played_position, _media->rating, _media->favourite);
1887                 }
1888 #else
1889                 set_sql = sqlite3_mprintf("media_display_name=%Q, media_description=%Q, media_longitude=%f, media_latitude=%f, media_file_name_pinyin=%Q, media_description_pinyin=%Q, media_rating=%d, media_favourite=%d", _media->display_name, _media->description, _media->longitude, _media->latitude, file_name_pinyin, description_pinyin, _media->rating, _media->favourite);
1890 #endif
1891
1892                 sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_id=%Q", _media->storage_uuid, set_sql, _media->media_id);
1893
1894                 ret = _content_query_sql(sql);
1895                 SQLITE3_SAFE_FREE(set_sql);
1896                 SQLITE3_SAFE_FREE(sql);
1897
1898                 SAFE_FREE(description_pinyin);
1899
1900                 if (ret == MEDIA_CONTENT_ERROR_NONE) {
1901                         /* Send notification for this update */
1902                         media_content_debug("Update is successfull. Send notification for this");
1903                         if (_media->file_path && _media->mime_type)
1904                                 media_svc_publish_noti(MS_MEDIA_ITEM_UPDATE, _media->file_path, _media->media_type, _media->media_id, _media->mime_type);
1905                         else
1906                                 media_content_error("Can't Send Noti : path or mime type is NULL");
1907                 }
1908         } else {
1909                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1910                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1911         }
1912
1913         return ret;
1914 }
1915
1916 int media_info_move_to_db(media_info_h media, const char* dst_path)
1917 {
1918         int ret = MEDIA_CONTENT_ERROR_NONE;
1919         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
1920         char repl_path[MAX_PATH_LEN] = {0, };
1921         char org_repl_path[MAX_PATH_LEN] = {0, };
1922
1923         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
1924         media_content_retvm_if(!STRING_VALID(dst_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid dst_path");
1925         memset(repl_path, 0, sizeof(repl_path));
1926         memset(org_repl_path, 0, sizeof(org_repl_path));
1927         ret = _media_content_replace_path(dst_path, repl_path);
1928         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1929
1930         media_info_s *_media = (media_info_s*)media;
1931
1932         ret = _media_content_replace_path(_media->file_path, org_repl_path);
1933         media_content_retvm_if(!STRING_VALID(org_repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1934
1935         /* If dst_path is folder, append file_name */
1936         if (g_file_test(repl_path, G_FILE_TEST_IS_DIR)) {
1937                 if (repl_path[strlen(repl_path) - 1] != '/')
1938                         SAFE_STRLCAT(repl_path, "/", sizeof(repl_path));
1939
1940                 SAFE_STRLCAT(repl_path, _media->display_name, sizeof(repl_path));
1941         }
1942
1943         /* If the two paths are the same, do nothing */
1944         media_content_retvm_if(g_strcmp0(repl_path, org_repl_path) == 0, MEDIA_CONTENT_ERROR_NONE, "Same path");
1945
1946         ret = __media_info_check_file_validity(repl_path);
1947         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1948
1949         memset(storage_id, 0x00, sizeof(storage_id));
1950         ret = media_svc_get_storage_id(_content_get_db_handle(), org_repl_path, storage_id, _content_get_uid());
1951         if (ret != MS_MEDIA_ERR_NONE) {
1952                 media_content_error("media_svc_get_storage_id failed : %d", ret);
1953                 return _content_error_capi(ret);
1954         }
1955
1956         ret = media_svc_move_item(_content_get_db_handle(), org_repl_path, repl_path, _media->media_id, _media->media_type, _media->mime_type, _content_get_uid());
1957         return _content_error_capi(ret);
1958 }
1959
1960 int media_info_create_thumbnail(media_info_h media, media_thumbnail_completed_cb callback, void *user_data)
1961 {
1962         int ret = MEDIA_CONTENT_ERROR_NONE;
1963         media_content_warn("DEPRECATION WARNING: media_info_create_thumbnail() is deprecated and will be removed from next release. Use media_info_generate_thumbnail() instead.");
1964         static unsigned int req_id = 0;
1965         char repl_path[MAX_PATH_LEN] = {0, };
1966         media_info_s *_media = (media_info_s*)media;
1967
1968         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
1969                 memset(repl_path, 0, sizeof(repl_path));
1970                 ret = _media_content_replace_path(_media->file_path, repl_path);
1971                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1972
1973                 media_thumbnail_cb_s *_thumb_cb = (media_thumbnail_cb_s*)calloc(1, sizeof(media_thumbnail_cb_s));
1974                 media_content_retvm_if(_thumb_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1975                 req_id++;
1976                 _media->request_id = req_id;
1977
1978                 _thumb_cb->handle = _media;
1979                 _thumb_cb->user_data = user_data;
1980                 _thumb_cb->thumbnail_completed_cb = callback;
1981
1982                 ret = thumbnail_request_from_db_async(_media->request_id, repl_path, (ThumbFunc)__media_info_thumbnail_completed_cb, (void *)_thumb_cb, _content_get_uid());
1983                 ret = _content_error_capi(ret);
1984         } else {
1985                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1986                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1987         }
1988
1989         return ret;
1990 }
1991
1992 int media_info_generate_thumbnail(media_info_h media)
1993 {
1994         int ret = MEDIA_CONTENT_ERROR_NONE;
1995         char repl_path[MAX_PATH_LEN] = {0, };
1996         char *thumb_path = NULL;
1997         media_info_s *_media = (media_info_s*)media;
1998
1999         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
2000                 /* Already exists */
2001                 if (STRING_VALID(_media->thumbnail_path))
2002                         return MEDIA_CONTENT_ERROR_NONE;
2003
2004                 memset(repl_path, 0, sizeof(repl_path));
2005                 ret = _media_content_replace_path(_media->file_path, repl_path);
2006                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
2007
2008                 ret = media_svc_create_thumbnail(_media->storage_uuid, repl_path, _media->media_type, _content_get_uid(), &thumb_path);
2009                 ret = _content_error_capi(ret);
2010                 if (ret == MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT) {
2011                         SAFE_FREE(thumb_path);
2012                         return ret;
2013                 }
2014
2015                 /* thumb_path is not NULL except #MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT */
2016                 _media->thumbnail_path = g_strdup(thumb_path);
2017                 SAFE_FREE(thumb_path);
2018                 if (_media->thumbnail_path == NULL)
2019                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2020         } else {
2021                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2022                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2023         }
2024
2025         return ret;
2026 }
2027
2028 int media_info_cancel_thumbnail(media_info_h media)
2029 {
2030         int ret = MEDIA_CONTENT_ERROR_NONE;
2031         media_content_warn("DEPRECATION WARNING: media_info_cancel_thumbnail() is deprecated and will be removed from next release.");
2032         media_info_s *_media = (media_info_s*)media;
2033
2034         if (_media != NULL && STRING_VALID(_media->media_id) && _media->request_id > 0) {
2035                 ret = thumbnail_request_cancel_media(_media->request_id);
2036                 ret = _content_error_capi(ret);
2037         } else {
2038                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2039                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2040         }
2041
2042         return ret;
2043 }
2044
2045 int media_info_start_face_detection(media_info_h media, media_face_detection_completed_cb callback, void *user_data)
2046 {
2047         int ret = MEDIA_CONTENT_ERROR_NONE;
2048         static unsigned int req_id = 0;
2049         media_info_s *_media = (media_info_s*)media;
2050         char repl_path[MAX_PATH_LEN] = {0, };
2051
2052         if (!__media_info_isFaceRecognition_feature_supported()) {
2053                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
2054                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
2055         }
2056
2057         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
2058                 if (g_strcmp0(_media->mime_type, "image/jpeg") != 0 && g_strcmp0(_media->mime_type, "image/png") != 0 && g_strcmp0(_media->mime_type, "image/bmp") != 0) {
2059                         media_content_error("Unsupported mime type");
2060                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2061                 }
2062
2063                 memset(repl_path, 0, sizeof(repl_path));
2064                 ret = _media_content_replace_path(_media->file_path, repl_path);
2065                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
2066                 media_face_cb_s *_face_cb = (media_face_cb_s*)calloc(1, sizeof(media_face_cb_s));
2067                 media_content_retvm_if(_face_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2068                 req_id++;
2069                 _media->face_request_id = req_id;
2070
2071                 _face_cb->user_data = user_data;
2072                 _face_cb->face_completed_cb = callback;
2073
2074                 ret = dcm_request_extract_face_async(_media->face_request_id, repl_path, (FaceFunc)__media_info_face_completed_cb, (void *)_face_cb, _content_get_uid());
2075                 ret = _content_error_capi(ret);
2076         } else {
2077                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2078                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2079         }
2080
2081         return ret;
2082 }
2083
2084 int media_info_cancel_face_detection(media_info_h media)
2085 {
2086         int ret = MEDIA_CONTENT_ERROR_NONE;
2087         media_info_s *_media = (media_info_s*)media;
2088
2089         if (!__media_info_isFaceRecognition_feature_supported()) {
2090                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
2091                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
2092         }
2093
2094         if (_media != NULL && STRING_VALID(_media->media_id) && _media->face_request_id > 0) {
2095                 ret = dcm_request_cancel_face(_media->face_request_id);
2096                 ret = _content_error_capi(ret);
2097         } else {
2098                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2099                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2100         }
2101
2102         return ret;
2103 }
2104
2105 int media_info_set_description(media_info_h media, const char *description)
2106 {
2107         int ret = MEDIA_CONTENT_ERROR_NONE;
2108         media_content_warn("DEPRECATION WARNING: media_info_set_description() is deprecated and will be removed from next release.");
2109         media_info_s *_media = (media_info_s*)media;
2110
2111         if (_media != NULL) {
2112                 SAFE_FREE(_media->description);
2113
2114                 if (STRING_VALID(description)) {
2115                         _media->description = strdup(description);
2116                         media_content_retvm_if(_media->description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2117                 } else {
2118                         _media->description = NULL;
2119                 }
2120         } else {
2121                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2122                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2123         }
2124
2125         return ret;
2126 }
2127
2128 int media_info_set_longitude(media_info_h media, double longitude)
2129 {
2130         int ret = MEDIA_CONTENT_ERROR_NONE;
2131         media_content_warn("DEPRECATION WARNING: media_info_set_longitude() is deprecated and will be removed from next release.");
2132         media_info_s *_media = (media_info_s*)media;
2133
2134         if (_media != NULL) {
2135                 _media->longitude = longitude;
2136         } else {
2137                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2138                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2139         }
2140
2141         return ret;
2142 }
2143
2144 int media_info_set_latitude(media_info_h media, double latitude)
2145 {
2146         int ret = MEDIA_CONTENT_ERROR_NONE;
2147         media_content_warn("DEPRECATION WARNING: media_info_set_latitude() is deprecated and will be removed from next release.");
2148         media_info_s *_media = (media_info_s*)media;
2149
2150         if (_media != NULL) {
2151                 _media->latitude = latitude;
2152         } else {
2153                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2154                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2155         }
2156
2157         return ret;
2158 }
2159
2160 int media_info_set_rating(media_info_h media, int rating)
2161 {
2162         int ret = MEDIA_CONTENT_ERROR_NONE;
2163         media_content_warn("DEPRECATION WARNING: media_info_set_rating() is deprecated and will be removed from next release.");
2164         media_info_s *_media = (media_info_s*)media;
2165
2166         if (_media != NULL) {
2167                 _media->rating = rating;
2168         } else {
2169                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2170                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2171         }
2172
2173         return ret;
2174 }
2175
2176
2177 int media_info_set_display_name(media_info_h media, const char *display_name)
2178 {
2179         int ret = MEDIA_CONTENT_ERROR_NONE;
2180         media_content_warn("DEPRECATION WARNING: media_info_set_display_name() is deprecated and will be removed from next release.");
2181         media_info_s *_media = (media_info_s*)media;
2182
2183         if (_media != NULL && STRING_VALID(display_name)) {
2184                 SAFE_FREE(_media->display_name);
2185
2186                 _media->display_name = strdup(display_name);
2187                 media_content_retvm_if(_media->display_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2188         } else {
2189                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2190                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2191         }
2192
2193         return ret;
2194 }