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