49e0b478f22953abcb0fca7e710b0e057bb60b2b
[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_query_prepare(&stmt, select_query, NULL, NULL);
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(MEDIA_CONTENT_TYPE, 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(EMPTY_STR);
111                 }
112
113                 media_content_debug("error [%d], thumbnail_path [%s]", error, path);
114                 error_value = _content_error_capi(MEDIA_THUMBNAIL_TYPE, 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(MEDIA_THUMBNAIL_TYPE, 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(MEDIA_CONTENT_TYPE, 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_query_prepare(&stmt, select_query, NULL, NULL);
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
398         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
399         media_content_retvm_if(info == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
400         memset(repl_path, 0, sizeof(repl_path));
401         ret = _media_content_replace_path(path, repl_path);
402         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
403
404         ret = __media_info_check_file_validity(repl_path);
405         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
406
407         memset(storage_id, 0x00, sizeof(storage_id));
408         ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, _content_get_uid());
409         if (ret != MS_MEDIA_ERR_NONE) {
410                 media_content_error("media_svc_get_storage_id failed : %d", ret);
411                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
412         }
413
414         ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), storage_id, repl_path);
415         if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
416                 media_content_sec_debug("media_svc_check_item_exist_by_path : no record : %s", repl_path);
417                 media_content_retvm_if(!_media_util_check_support_media_type(repl_path), MEDIA_CONTENT_ERROR_NOT_SUPPORTED, "Unsupported media type");
418                 ms_user_storage_type_e storage_type = MS_USER_STORAGE_INTERNAL;
419
420                 ret = ms_user_get_storage_type(_content_get_uid(), repl_path, &storage_type);
421                 if (ret != MS_MEDIA_ERR_NONE) {
422                         media_content_sec_error("ms_user_get_storage_type failed : %d", ret);
423                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
424                 }
425
426                 ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, storage_type, repl_path, _content_get_uid());
427
428                 if (ret != MS_MEDIA_ERR_NONE) {
429                         if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
430                                 media_content_sec_error("This item is already inserted. This may be normal operation because other process already did this (%s)", repl_path);
431                                 ret = MEDIA_CONTENT_ERROR_NONE;
432                         } else {
433                                 media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, repl_path);
434                         }
435
436                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
437                 }
438         } else if (ret != MS_MEDIA_ERR_NONE) {
439                 media_content_sec_error("media_svc_check_item_exist_by_path failed : %d (%s)", ret, repl_path);
440                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
441         }
442
443         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
444         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
445
446         if (STRING_VALID(storage_id))
447                 ret = _media_info_get_media_info_from_db(repl_path, storage_id, (media_info_h)_media);
448         else
449                 ret = _media_info_get_media_info_from_db(repl_path, DB_TABLE_MEDIA, (media_info_h)_media);
450
451         *info = (media_info_h)_media;
452         return ret;
453 }
454
455 int media_info_insert_batch_to_db(const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data)
456 {
457         char **repl_path_array = NULL;
458         int idx = 0;
459         int ret = MS_MEDIA_ERR_NONE;
460         char repl_path[MAX_PATH_LEN] = {0, };
461
462         media_content_retvm_if(path_array == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path_array");
463         media_content_retvm_if(array_length <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid array_length");
464
465         repl_path_array = calloc(1, sizeof(char *) * array_length);
466         media_content_retvm_if(repl_path_array == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
467
468         for (idx = 0; idx < array_length; idx++) {
469                 if (STRING_VALID(path_array[idx])) {
470                         memset(repl_path, 0, sizeof(repl_path));
471                         _media_content_replace_path(path_array[idx], repl_path);
472                         repl_path_array[idx] = strndup(repl_path, strlen(repl_path));
473                 } else {
474                         media_content_error("path[%d] is invalid string", idx);
475                 }
476         }
477
478         ret = __media_info_insert_batch((const char **)repl_path_array, array_length, completed_cb, user_data);
479         for (idx = 0; idx < array_length; idx++)
480                 SAFE_FREE(repl_path_array[idx]);
481
482         SAFE_FREE(repl_path_array);
483
484         return ret;
485 }
486 #ifdef _USE_TVPD_MODE
487 int media_info_get_media_info_by_path_from_db(const char* path, media_info_h* media)
488 {
489         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
490         int ret = MEDIA_CONTENT_ERROR_NONE;
491         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
492         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
493
494         memset(storage_id, 0x00, sizeof(storage_id));
495         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, tzplatform_getuid(TZ_USER_NAME));
496         if (ret != MS_MEDIA_ERR_NONE) {
497                 media_content_error("media_svc_get_storage_id failed : %d", ret);
498                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
499         }
500
501         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
502         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
503
504         ret =  _media_info_get_media_info_from_db(path, storage_id, (media_info_h)_media);
505         *media = (media_info_h)_media;
506
507         return ret;
508 }
509 #endif
510
511 int media_info_delete_from_db(const char *media_id)
512 {
513         int ret = MEDIA_CONTENT_ERROR_NONE;
514         char *path = NULL;
515         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
516         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.");
517
518         if (!STRING_VALID(media_id)) {
519                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
520                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
521         }
522
523         memset(storage_id, 0x00, sizeof(storage_id));
524
525         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
526         if (ret != MEDIA_CONTENT_ERROR_NONE) {
527                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
528                 SAFE_FREE(path);
529                 return ret;
530         }
531
532         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
533         if (ret != MEDIA_CONTENT_ERROR_NONE) {
534                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
535                 SAFE_FREE(path);
536                 return ret;
537         }
538
539         ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, _content_get_uid());
540         SAFE_FREE(path);
541
542         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
543 }
544
545 int media_info_destroy(media_info_h media)
546 {
547         media_info_s *_media = (media_info_s*)media;
548         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Handle is null");
549
550         SAFE_FREE(_media->media_id);
551         SAFE_FREE(_media->file_path);
552         SAFE_FREE(_media->display_name);
553         SAFE_FREE(_media->mime_type);
554         SAFE_FREE(_media->thumbnail_path);
555         SAFE_FREE(_media->description);
556         SAFE_FREE(_media->title);
557 #ifdef _USE_TVPD_MODE
558         SAFE_FREE(_media->modified_month);
559 #endif
560         SAFE_FREE(_media->storage_uuid);
561 #ifdef _USE_SENIOR_MODE
562         SAFE_FREE(_media->contact);
563         SAFE_FREE(_media->app_data);
564 #endif
565
566         if (_media->image_meta) {
567                 SAFE_FREE(_media->image_meta->media_id);
568                 SAFE_FREE(_media->image_meta->date_taken);
569                 SAFE_FREE(_media->image_meta->exposure_time);
570                 SAFE_FREE(_media->image_meta->model);
571                 SAFE_FREE(_media->image_meta->title);
572
573                 SAFE_FREE(_media->image_meta);
574         }
575
576         if (_media->video_meta) {
577                 SAFE_FREE(_media->video_meta->media_id);
578                 SAFE_FREE(_media->video_meta->title);
579                 SAFE_FREE(_media->video_meta->album);
580                 SAFE_FREE(_media->video_meta->artist);
581                 SAFE_FREE(_media->video_meta->album_artist);
582                 SAFE_FREE(_media->video_meta->genre);
583                 SAFE_FREE(_media->video_meta->composer);
584                 SAFE_FREE(_media->video_meta->year);
585                 SAFE_FREE(_media->video_meta->recorded_date);
586                 SAFE_FREE(_media->video_meta->copyright);
587                 SAFE_FREE(_media->video_meta->track_num);
588
589                 SAFE_FREE(_media->video_meta);
590         }
591
592         if (_media->audio_meta) {
593                 SAFE_FREE(_media->audio_meta->media_id);
594                 SAFE_FREE(_media->audio_meta->title);
595                 SAFE_FREE(_media->audio_meta->album);
596                 SAFE_FREE(_media->audio_meta->artist);
597                 SAFE_FREE(_media->audio_meta->album_artist);
598                 SAFE_FREE(_media->audio_meta->genre);
599                 SAFE_FREE(_media->audio_meta->composer);
600                 SAFE_FREE(_media->audio_meta->year);
601                 SAFE_FREE(_media->audio_meta->recorded_date);
602                 SAFE_FREE(_media->audio_meta->copyright);
603                 SAFE_FREE(_media->audio_meta->track_num);
604
605                 SAFE_FREE(_media->audio_meta);
606         }
607
608         SAFE_FREE(_media);
609
610         return MEDIA_CONTENT_ERROR_NONE;
611 }
612
613 int media_info_clone(media_info_h *dst, media_info_h src)
614 {
615         media_info_s *_src = (media_info_s*)src;
616         media_content_retvm_if(_src == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Source handle is null");
617
618         media_info_s *_dst = (media_info_s*)calloc(1, sizeof(media_info_s));
619         media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
620
621         if (_src->media_id) {
622                 _dst->media_id = g_strdup(_src->media_id);
623                 media_content_retv_free_info_if(_dst->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
624         }
625         if (_src->file_path) {
626                 _dst->file_path = g_strdup(_src->file_path);
627                 media_content_retv_free_info_if(_dst->file_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
628         }
629         if (_src->display_name != NULL) {
630                 _dst->display_name = g_strdup(_src->display_name);
631                 media_content_retv_free_info_if(_dst->display_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
632         }
633         if (_src->mime_type) {
634                 _dst->mime_type = g_strdup(_src->mime_type);
635                 media_content_retv_free_info_if(_dst->mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
636         }
637         if (_src->thumbnail_path != NULL) {
638                 _dst->thumbnail_path = g_strdup(_src->thumbnail_path);
639                 media_content_retv_free_info_if(_dst->thumbnail_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
640         }
641         if (_src->description != NULL) {
642                 _dst->description = g_strdup(_src->description);
643                 media_content_retv_free_info_if(_dst->description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
644         }
645
646         if (_src->title != NULL) {
647                 _dst->title = g_strdup(_src->title);
648                 media_content_retv_free_info_if(_dst->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
649         }
650
651         if (_src->storage_uuid != NULL) {
652                 _dst->storage_uuid = g_strdup(_src->storage_uuid);
653                 media_content_retv_free_info_if(_dst->storage_uuid == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
654         }
655 #ifdef _USE_TVPD_MODE
656         if (STRING_VALID(_src->modified_month)) {
657                 _dst->modified_month = strdup(_src->modified_month);
658                 media_content_retv_free_info_if(_dst->modified_month == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
659         }
660 #endif
661 #ifdef _USE_SENIOR_MODE
662         if (STRING_VALID(_src->contact)) {
663                 _dst->contact = strdup(_src->contact);
664                 media_content_retv_free_info_if(_dst->contact == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
665         }
666
667         if (STRING_VALID(_src->app_data)) {
668                 _dst->app_data = strdup(_src->app_data);
669                 media_content_retv_free_info_if(_dst->app_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
670         }
671 #endif
672
673         _dst->media_type = _src->media_type;
674         _dst->size = _src->size;
675         _dst->added_time = _src->added_time;
676         _dst->modified_time = _src->modified_time;
677         _dst->timeline = _src->timeline;
678         _dst->longitude = _src->longitude;
679         _dst->latitude = _src->latitude;
680         _dst->altitude = _src->altitude;
681         _dst->rating = _src->rating;
682         _dst->favourite = _src->favourite;
683         _dst->is_drm = _src->is_drm;
684         _dst->storage_type = _src->storage_type;
685         _dst->sync_status = _src->sync_status;
686         _dst->request_id = _src->request_id;
687         _dst->face_request_id = _src->face_request_id;
688         _dst->is_360 = _src->is_360;
689 #ifdef _USE_TVPD_MODE
690         _dst->played_count = _src->played_count;
691         _dst->played_time = _src->played_time;
692         _dst->played_position = _src->played_position;
693         _dst->stitched_info = _src->stitched_info;
694         _dst->extract_flag = _src->extract_flag;
695 #endif
696
697         if (_src->media_type == MEDIA_CONTENT_TYPE_IMAGE && _src->image_meta) {
698                 _dst->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
699                 media_content_retv_free_info_if(_dst->image_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
700
701                 if (_src->image_meta->media_id != NULL) {
702                         _dst->image_meta->media_id = g_strdup(_src->image_meta->media_id);
703                         media_content_retv_free_info_if(_dst->image_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
704                 }
705
706                 if (_src->image_meta->date_taken != NULL) {
707                         _dst->image_meta->date_taken = g_strdup(_src->image_meta->date_taken);
708                         media_content_retv_free_info_if(_dst->image_meta->date_taken == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
709                 }
710
711                 if (_src->image_meta->exposure_time != NULL) {
712                         _dst->image_meta->exposure_time = g_strdup(_src->image_meta->exposure_time);
713                         media_content_retv_free_info_if(_dst->image_meta->exposure_time == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
714                 }
715
716                 if (_src->image_meta->model != NULL) {
717                         _dst->image_meta->model = g_strdup(_src->image_meta->model);
718                         media_content_retv_free_info_if(_dst->image_meta->model == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
719                 }
720
721                 _dst->image_meta->fnumber = _src->image_meta->fnumber;
722                 _dst->image_meta->iso = _src->image_meta->iso;
723                 _dst->image_meta->width = _src->image_meta->width;
724                 _dst->image_meta->height = _src->image_meta->height;
725                 _dst->image_meta->orientation = _src->image_meta->orientation;
726
727         } else if (_src->media_type == MEDIA_CONTENT_TYPE_VIDEO && _src->video_meta) {
728                 _dst->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
729                 media_content_retv_free_info_if(_dst->video_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
730
731                 if (_src->video_meta->media_id != NULL) {
732                         _dst->video_meta->media_id = g_strdup(_src->video_meta->media_id);
733                         media_content_retv_free_info_if(_dst->video_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
734                 }
735                 if (_src->video_meta->title != NULL) {
736                         _dst->video_meta->title = g_strdup(_src->video_meta->title);
737                         media_content_retv_free_info_if(_dst->video_meta->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
738                 }
739                 if (_src->video_meta->album != NULL) {
740                         _dst->video_meta->album = g_strdup(_src->video_meta->album);
741                         media_content_retv_free_info_if(_dst->video_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
742                 }
743                 if (_src->video_meta->artist != NULL) {
744                         _dst->video_meta->artist = g_strdup(_src->video_meta->artist);
745                         media_content_retv_free_info_if(_dst->video_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
746                 }
747                 if (_src->video_meta->album_artist != NULL) {
748                         _dst->video_meta->album_artist = g_strdup(_src->video_meta->album_artist);
749                         media_content_retv_free_info_if(_dst->video_meta->album_artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
750                 }
751                 if (_src->video_meta->genre != NULL) {
752                         _dst->video_meta->genre = g_strdup(_src->video_meta->genre);
753                         media_content_retv_free_info_if(_dst->video_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
754                 }
755                 if (_src->video_meta->composer != NULL) {
756                         _dst->video_meta->composer = g_strdup(_src->video_meta->composer);
757                         media_content_retv_free_info_if(_dst->video_meta->composer == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
758                 }
759                 if (_src->video_meta->year != NULL) {
760                         _dst->video_meta->year = g_strdup(_src->video_meta->year);
761                         media_content_retv_free_info_if(_dst->video_meta->year == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
762                 }
763                 if (_src->video_meta->recorded_date != NULL) {
764                         _dst->video_meta->recorded_date = g_strdup(_src->video_meta->recorded_date);
765                         media_content_retv_free_info_if(_dst->video_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
766                 }
767                 if (_src->video_meta->copyright != NULL) {
768                         _dst->video_meta->copyright = g_strdup(_src->video_meta->copyright);
769                         media_content_retv_free_info_if(_dst->video_meta->copyright == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
770                 }
771                 if (_src->video_meta->track_num != NULL) {
772                         _dst->video_meta->track_num = g_strdup(_src->video_meta->track_num);
773                         media_content_retv_free_info_if(_dst->video_meta->track_num == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
774                 }
775
776                 _dst->video_meta->width = _src->video_meta->width;
777                 _dst->video_meta->height = _src->video_meta->height;
778                 _dst->video_meta->duration = _src->video_meta->duration;
779                 _dst->video_meta->bitrate = _src->video_meta->bitrate;
780                 _dst->video_meta->rotation = _src->video_meta->rotation;
781
782         } else if ((_src->media_type == MEDIA_CONTENT_TYPE_MUSIC || _src->media_type == MEDIA_CONTENT_TYPE_SOUND) && _src->audio_meta) {
783                 _dst->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
784                 media_content_retv_free_info_if(_dst->audio_meta == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
785
786                 if (_src->audio_meta->media_id != NULL) {
787                         _dst->audio_meta->media_id = g_strdup(_src->audio_meta->media_id);
788                         media_content_retv_free_info_if(_dst->audio_meta->media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
789                 }
790                 if (_src->audio_meta->title != NULL) {
791                         _dst->audio_meta->title = g_strdup(_src->audio_meta->title);
792                         media_content_retv_free_info_if(_dst->audio_meta->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
793                 }
794                 if (_src->audio_meta->album != NULL) {
795                         _dst->audio_meta->album = g_strdup(_src->audio_meta->album);
796                         media_content_retv_free_info_if(_dst->audio_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
797                 }
798                 if (_src->audio_meta->artist != NULL) {
799                         _dst->audio_meta->artist = g_strdup(_src->audio_meta->artist);
800                         media_content_retv_free_info_if(_dst->audio_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
801                 }
802                 if (_src->audio_meta->album_artist != NULL) {
803                         _dst->audio_meta->album_artist = g_strdup(_src->audio_meta->album_artist);
804                         media_content_retv_free_info_if(_dst->audio_meta->album_artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
805                 }
806                 if (_src->audio_meta->genre != NULL) {
807                         _dst->audio_meta->genre = g_strdup(_src->audio_meta->genre);
808                         media_content_retv_free_info_if(_dst->audio_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
809                 }
810                 if (_src->audio_meta->composer != NULL) {
811                         _dst->audio_meta->composer = g_strdup(_src->audio_meta->composer);
812                         media_content_retv_free_info_if(_dst->audio_meta->composer == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
813                 }
814                 if (_src->audio_meta->year != NULL) {
815                         _dst->audio_meta->year = g_strdup(_src->audio_meta->year);
816                         media_content_retv_free_info_if(_dst->audio_meta->year == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
817                 }
818                 if (_src->audio_meta->recorded_date != NULL) {
819                         _dst->audio_meta->recorded_date = g_strdup(_src->audio_meta->recorded_date);
820                         media_content_retv_free_info_if(_dst->audio_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
821                 }
822                 if (_src->audio_meta->copyright != NULL) {
823                         _dst->audio_meta->copyright = g_strdup(_src->audio_meta->copyright);
824                         media_content_retv_free_info_if(_dst->audio_meta->copyright == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
825                 }
826                 if (_src->audio_meta->track_num != NULL) {
827                         _dst->audio_meta->track_num = g_strdup(_src->audio_meta->track_num);
828                         media_content_retv_free_info_if(_dst->audio_meta->track_num == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, (media_info_h)_dst);
829                 }
830
831                 _dst->audio_meta->channel = _src->audio_meta->channel;
832                 _dst->audio_meta->samplerate = _src->audio_meta->samplerate;
833                 _dst->audio_meta->duration = _src->audio_meta->duration;
834                 _dst->audio_meta->bitrate = _src->audio_meta->bitrate;
835                 _dst->audio_meta->bitpersample = _src->audio_meta->bitpersample;
836         }
837         *dst = (media_info_h)_dst;
838
839         return MEDIA_CONTENT_ERROR_NONE;
840 }
841
842 int media_info_get_media_count_from_db(filter_h filter, int *media_count)
843 {
844         int ret = MEDIA_CONTENT_ERROR_NONE;
845
846         if (media_count == NULL) {
847                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
848                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
849
850                 return ret;
851         }
852
853         ret = _media_db_get_group_item_count(NULL, filter, MEDIA_GROUP_NONE, media_count);
854
855         return ret;
856 }
857
858 int media_info_foreach_media_from_db(filter_h filter, media_info_cb callback, void *user_data)
859 {
860         int ret = MEDIA_CONTENT_ERROR_NONE;
861
862         media_content_retvm_if(callback == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid callback");
863
864         ret = _media_db_get_group_item(NULL, filter, callback, user_data, MEDIA_GROUP_NONE);
865
866         return ret;
867 }
868
869 int media_info_get_tag_count_from_db(const char *media_id, filter_h filter, int *tag_count)
870 {
871         int ret = MEDIA_CONTENT_ERROR_NONE;
872
873         if (STRING_VALID(media_id) && tag_count) {
874                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_TAG_BY_MEDIA_ID, tag_count);
875         } else {
876                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
877                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
878         }
879
880         return ret;
881 }
882
883 int media_info_foreach_tag_from_db(const char *media_id, filter_h filter, media_tag_cb callback, void *user_data)
884 {
885         int ret = MEDIA_CONTENT_ERROR_NONE;
886
887         if ((callback != NULL) && STRING_VALID(media_id)) {
888                 ret = _media_db_get_tag(media_id, filter, callback, user_data);
889         } else {
890                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
891                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
892         }
893
894         return ret;
895 }
896
897 int media_info_get_bookmark_count_from_db(const char *media_id, filter_h filter, int *bookmark_count)
898 {
899         int ret = MEDIA_CONTENT_ERROR_NONE;
900
901         if (STRING_VALID(media_id) && bookmark_count) {
902                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_BOOKMARK_BY_MEDIA_ID, bookmark_count);
903         } else {
904                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
905                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
906         }
907
908         return ret;
909 }
910
911 int media_info_foreach_bookmark_from_db(const char *media_id, filter_h filter, media_bookmark_cb callback, void *user_data)
912 {
913         int ret = MEDIA_CONTENT_ERROR_NONE;
914
915         if ((callback != NULL) && STRING_VALID(media_id)) {
916                 ret = _media_db_get_bookmark(media_id, filter, callback, user_data);
917         } else {
918                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
919                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
920         }
921
922         return ret;
923 }
924
925 int media_info_get_face_count_from_db(const char *media_id, filter_h filter, int *face_count)
926 {
927         int ret = MEDIA_CONTENT_ERROR_NONE;
928
929         if (STRING_VALID(media_id) && face_count) {
930                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_FACE_BY_MEDIA_ID, face_count);
931         } else {
932                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
933                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
934         }
935
936         return ret;
937 }
938
939 int media_info_foreach_face_from_db(const char *media_id, filter_h filter, media_face_cb callback, void *user_data)
940 {
941         int ret = MEDIA_CONTENT_ERROR_NONE;
942
943         if ((callback != NULL) && STRING_VALID(media_id)) {
944                 ret = _media_db_get_face(media_id, filter, callback, user_data);
945         } else {
946                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
947                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
948         }
949
950         return ret;
951 }
952
953 int media_info_get_image(media_info_h media, image_meta_h *image)
954 {
955         int ret = MEDIA_CONTENT_ERROR_NONE;
956
957         media_info_s *_media = (media_info_s*)media;
958
959         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
960         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_IMAGE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
961         media_content_retvm_if(_media->image_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid image_meta");
962
963         image_meta_s *_image = (image_meta_s*)calloc(1, sizeof(image_meta_s));
964         media_content_retvm_if(_image == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
965
966         _image->media_id = g_strdup(_media->media_id);
967         _image->width = _media->image_meta->width;
968         _image->height = _media->image_meta->height;
969         _image->orientation = _media->image_meta->orientation;
970         _image->fnumber = _media->image_meta->fnumber;
971         _image->iso = _media->image_meta->iso;
972         _image->date_taken = g_strdup(_media->image_meta->date_taken);
973         _image->title = g_strdup(_media->image_meta->title);
974         _image->exposure_time = g_strdup(_media->image_meta->exposure_time);
975         _image->model = g_strdup(_media->image_meta->model);
976
977         *image = (image_meta_h)_image;
978
979         return ret;
980 }
981
982 int media_info_get_video(media_info_h media, video_meta_h *video)
983 {
984         int ret = MEDIA_CONTENT_ERROR_NONE;
985
986         media_info_s *_media = (media_info_s*)media;
987
988         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
989         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_VIDEO, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
990         media_content_retvm_if(_media->video_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid video_meta");
991
992         video_meta_s *_video = (video_meta_s*)calloc(1, sizeof(video_meta_s));
993         media_content_retvm_if(_video == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
994
995         _video->media_id = g_strdup(_media->media_id);
996         _video->title = g_strdup(_media->video_meta->title);
997         _video->album = g_strdup(_media->video_meta->album);
998         _video->artist = g_strdup(_media->video_meta->artist);
999         _video->album_artist = g_strdup(_media->video_meta->album_artist);
1000         _video->genre = g_strdup(_media->video_meta->genre);
1001         _video->composer = g_strdup(_media->video_meta->composer);
1002         _video->year = g_strdup(_media->video_meta->year);
1003         _video->recorded_date = g_strdup(_media->video_meta->recorded_date);
1004         _video->copyright = g_strdup(_media->video_meta->copyright);
1005         _video->track_num = g_strdup(_media->video_meta->track_num);
1006
1007         _video->width = _media->video_meta->width;
1008         _video->height = _media->video_meta->height;
1009         _video->duration = _media->video_meta->duration;
1010         _video->bitrate = _media->video_meta->bitrate;
1011         _video->rotation = _media->video_meta->rotation;
1012
1013         *video = (video_meta_h)_video;
1014
1015         return ret;
1016 }
1017
1018 int media_info_get_audio(media_info_h media, audio_meta_h *audio)
1019 {
1020         int ret = MEDIA_CONTENT_ERROR_NONE;
1021
1022         media_info_s *_media = (media_info_s*)media;
1023
1024         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
1025         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");
1026         media_content_retvm_if(_media->audio_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid audio_meta");
1027
1028         audio_meta_s *_audio = (audio_meta_s*)calloc(1, sizeof(audio_meta_s));
1029         media_content_retvm_if(_audio == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1030
1031         _audio->media_id = g_strdup(_media->media_id);
1032         _audio->title = g_strdup(_media->audio_meta->title);
1033         _audio->album = g_strdup(_media->audio_meta->album);
1034         _audio->artist = g_strdup(_media->audio_meta->artist);
1035         _audio->album_artist = g_strdup(_media->audio_meta->album_artist);
1036         _audio->genre = g_strdup(_media->audio_meta->genre);
1037         _audio->composer = g_strdup(_media->audio_meta->composer);
1038         _audio->year = g_strdup(_media->audio_meta->year);
1039         _audio->recorded_date = g_strdup(_media->audio_meta->recorded_date);
1040         _audio->copyright = g_strdup(_media->audio_meta->copyright);
1041         _audio->track_num = g_strdup(_media->audio_meta->track_num);
1042
1043         _audio->duration = _media->audio_meta->duration;
1044         _audio->bitrate = _media->audio_meta->bitrate;
1045         _audio->bitpersample = _media->audio_meta->bitpersample;
1046         _audio->samplerate = _media->audio_meta->samplerate;
1047         _audio->channel = _media->audio_meta->channel;
1048
1049         *audio = (audio_meta_h)_audio;
1050
1051         return ret;
1052 }
1053
1054 int media_info_get_media_id(media_info_h media, char **media_id)
1055 {
1056         int ret = MEDIA_CONTENT_ERROR_NONE;
1057         media_info_s *_media = (media_info_s*)media;
1058
1059         if (_media && media_id) {
1060                 if (STRING_VALID(_media->media_id)) {
1061                         *media_id = strdup(_media->media_id);
1062                         media_content_retvm_if(*media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1063                 } else {
1064                         *media_id = NULL;
1065                 }
1066                 ret = MEDIA_CONTENT_ERROR_NONE;
1067         } else {
1068                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1069                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1070         }
1071
1072         return ret;
1073 }
1074
1075 int media_info_get_file_path(media_info_h media, char **path)
1076 {
1077         int ret = MEDIA_CONTENT_ERROR_NONE;
1078         media_info_s *_media = (media_info_s*)media;
1079
1080         if (_media && path) {
1081                 if (STRING_VALID(_media->file_path)) {
1082                         *path = strdup(_media->file_path);
1083                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1084                 } else {
1085                         *path = NULL;
1086                 }
1087                 ret = MEDIA_CONTENT_ERROR_NONE;
1088
1089         } else {
1090                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1091                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1092         }
1093
1094         return ret;
1095 }
1096
1097 int media_info_get_display_name(media_info_h media, char **name)
1098 {
1099         int ret = MEDIA_CONTENT_ERROR_NONE;
1100         media_info_s *_media = (media_info_s*)media;
1101         if (_media && name) {
1102                 if (_media->display_name != NULL) {
1103                         *name = g_strdup(_media->display_name);
1104                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1105                 } else {
1106                         *name = NULL;
1107                 }
1108                 ret = MEDIA_CONTENT_ERROR_NONE;
1109
1110         } else {
1111                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1112                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1113         }
1114
1115         return ret;
1116 }
1117
1118 int media_info_get_media_type(media_info_h media, media_content_type_e *type)
1119 {
1120         int ret = MEDIA_CONTENT_ERROR_NONE;
1121         media_info_s *_media = (media_info_s*)media;
1122         if (_media && type) {
1123                 *type = _media->media_type;
1124                 ret = MEDIA_CONTENT_ERROR_NONE;
1125         } else {
1126                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1127                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1128         }
1129
1130         return ret;
1131 }
1132
1133 int media_info_get_mime_type(media_info_h media, char **mime_type)
1134 {
1135         int ret = MEDIA_CONTENT_ERROR_NONE;
1136         media_info_s *_media = (media_info_s*)media;
1137
1138         if (_media && mime_type) {
1139                 if (STRING_VALID(_media->mime_type)) {
1140                         *mime_type = strdup(_media->mime_type);
1141                         media_content_retvm_if(*mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1142                 } else {
1143                         *mime_type = NULL;
1144                 }
1145                 ret = MEDIA_CONTENT_ERROR_NONE;
1146         } else {
1147                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1148                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1149         }
1150
1151         return ret;
1152 }
1153
1154 int media_info_get_size(media_info_h media, unsigned long long *size)
1155 {
1156         int ret = MEDIA_CONTENT_ERROR_NONE;
1157         media_info_s *_media = (media_info_s*)media;
1158
1159         if (_media && size) {
1160                 *size = _media->size;
1161                 ret = MEDIA_CONTENT_ERROR_NONE;
1162         } else {
1163                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1164                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1165         }
1166
1167         return ret;
1168 }
1169
1170 int media_info_get_added_time(media_info_h media, time_t *added_time)
1171 {
1172         int ret = MEDIA_CONTENT_ERROR_NONE;
1173         media_info_s *_media = (media_info_s*)media;
1174         if (_media && added_time) {
1175                 *added_time = _media->added_time;
1176                 ret = MEDIA_CONTENT_ERROR_NONE;
1177         } else {
1178                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1179                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1180         }
1181
1182         return ret;
1183 }
1184
1185 int media_info_get_modified_time(media_info_h media, time_t* time)
1186 {
1187         int ret = MEDIA_CONTENT_ERROR_NONE;
1188         media_info_s *_media = (media_info_s*)media;
1189         if (_media && time) {
1190                 *time = _media->modified_time;
1191                 ret = MEDIA_CONTENT_ERROR_NONE;
1192         } else {
1193                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1194                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1195         }
1196
1197         return ret;
1198 }
1199
1200 int media_info_get_timeline(media_info_h media, time_t* time)
1201 {
1202         int ret = MEDIA_CONTENT_ERROR_NONE;
1203         media_info_s *_media = (media_info_s*)media;
1204         if (_media && time) {
1205                 *time = _media->timeline;
1206                 ret = MEDIA_CONTENT_ERROR_NONE;
1207         } else {
1208                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1209                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1210         }
1211
1212         return ret;
1213 }
1214
1215 int media_info_get_thumbnail_path(media_info_h media, char **path)
1216 {
1217         int ret = MEDIA_CONTENT_ERROR_NONE;
1218         media_info_s *_media = (media_info_s*)media;
1219         if (_media && path) {
1220                 if (_media->thumbnail_path != NULL) {
1221                         *path = g_strdup(_media->thumbnail_path);
1222                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1223                 } else {
1224                         *path = NULL;
1225                 }
1226                 ret = MEDIA_CONTENT_ERROR_NONE;
1227
1228         } else {
1229                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1230                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1231         }
1232
1233         return ret;
1234 }
1235
1236 int media_info_get_title(media_info_h media, char **title)
1237 {
1238         int ret = MEDIA_CONTENT_ERROR_NONE;
1239         media_info_s *_media = (media_info_s*)media;
1240
1241         if (_media && title)    { /*title can be empty string*/
1242                 if (_media->title != NULL) {
1243                         *title = g_strdup(_media->title);
1244                         media_content_retvm_if(*title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1245                 } else {
1246                         *title = NULL;
1247                 }
1248                 ret = MEDIA_CONTENT_ERROR_NONE;
1249         } else {
1250                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1251                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1252         }
1253
1254         return ret;
1255 }
1256
1257 int media_info_get_description(media_info_h media, char **description)
1258 {
1259         int ret = MEDIA_CONTENT_ERROR_NONE;
1260         media_info_s *_media = (media_info_s*)media;
1261
1262         if (_media && description) {
1263                 if (_media->description != NULL) {      /*description can be empty string*/
1264                         *description = g_strdup(_media->description);
1265                         media_content_retvm_if(*description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1266                 } else {
1267                         *description = NULL;
1268                 }
1269                 ret = MEDIA_CONTENT_ERROR_NONE;
1270         } else {
1271                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1272                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1273         }
1274
1275         return ret;
1276 }
1277
1278 int media_info_get_longitude(media_info_h media, double* longitude)
1279 {
1280         int ret = MEDIA_CONTENT_ERROR_NONE;
1281         media_info_s *_media = (media_info_s*)media;
1282
1283         if (_media && longitude) {
1284                 *longitude = _media->longitude;
1285                 ret = MEDIA_CONTENT_ERROR_NONE;
1286         } else {
1287                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1288                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1289         }
1290
1291         return ret;
1292 }
1293 int media_info_get_latitude(media_info_h media, double* latitude)
1294 {
1295         int ret = MEDIA_CONTENT_ERROR_NONE;
1296         media_info_s *_media = (media_info_s*)media;
1297
1298         if (_media && latitude) {
1299                 *latitude = _media->latitude;
1300                 ret = MEDIA_CONTENT_ERROR_NONE;
1301         } else {
1302                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1303                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1304         }
1305
1306         return ret;
1307 }
1308
1309 int media_info_get_altitude(media_info_h media, double *altitude)
1310 {
1311         int ret = MEDIA_CONTENT_ERROR_NONE;
1312         media_info_s *_media = (media_info_s*)media;
1313
1314         if (_media && altitude) {
1315                 *altitude = _media->altitude;
1316                 ret = MEDIA_CONTENT_ERROR_NONE;
1317         } else {
1318                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1319                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1320         }
1321
1322         return ret;
1323 }
1324
1325 int media_info_get_rating(media_info_h media, int *rating)
1326 {
1327         int ret = MEDIA_CONTENT_ERROR_NONE;
1328         media_info_s *_media = (media_info_s*)media;
1329
1330         if (_media && rating) {
1331                 *rating = _media->rating;
1332                 ret = MEDIA_CONTENT_ERROR_NONE;
1333         } else {
1334                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1335                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1336         }
1337
1338         return ret;
1339 }
1340
1341 int media_info_get_favorite(media_info_h media, bool* favorite)
1342 {
1343         int ret = MEDIA_CONTENT_ERROR_NONE;
1344         media_info_s *_media = (media_info_s*)media;
1345
1346         if (_media && favorite) {
1347                 *favorite = _media->favourite;
1348                 ret = MEDIA_CONTENT_ERROR_NONE;
1349         } else {
1350                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1351                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1352         }
1353
1354         return ret;
1355 }
1356
1357 int media_info_get_storage_id(media_info_h media, char **storage_id)
1358 {
1359         int ret = MEDIA_CONTENT_ERROR_NONE;
1360         media_content_warn("DEPRECATION WARNING: media_info_get_storage_id() is deprecated and will be removed from next release.");
1361         media_info_s *_media = (media_info_s*)media;
1362
1363         if (_media && storage_id) {
1364                 if (STRING_VALID(_media->storage_uuid)) {
1365                         *storage_id = strdup(_media->storage_uuid);
1366                         media_content_retvm_if(*storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1367                 } else {
1368                         *storage_id = NULL;
1369                         ret = MEDIA_CONTENT_ERROR_DB_FAILED;
1370                 }
1371         } else {
1372                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1373                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1374         }
1375
1376         return ret;
1377 }
1378
1379 int media_info_is_drm(media_info_h media, bool *is_drm)
1380 {
1381         int ret = MEDIA_CONTENT_ERROR_NONE;
1382         media_info_s *_media = (media_info_s*)media;
1383
1384         if (_media) {
1385                 *is_drm = _media->is_drm;
1386                 ret = MEDIA_CONTENT_ERROR_NONE;
1387         } else {
1388                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1389                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1390         }
1391
1392         return ret;
1393 }
1394
1395 int media_info_is_360_content(media_info_h media, bool *is_360)
1396 {
1397         int ret = MEDIA_CONTENT_ERROR_NONE;
1398         media_info_s *_media = (media_info_s*)media;
1399
1400         if (_media) {
1401                 *is_360 = _media->is_360;
1402                 ret = MEDIA_CONTENT_ERROR_NONE;
1403         } else {
1404                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1405                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1406         }
1407
1408         return ret;
1409 }
1410
1411 int media_info_get_storage_type(media_info_h media, media_content_storage_e *storage_type)
1412 {
1413         int ret = MEDIA_CONTENT_ERROR_NONE;
1414         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.");
1415         media_info_s *_media = (media_info_s*)media;
1416
1417         if (_media && storage_type) {
1418                 *storage_type = _media->storage_type;
1419                 ret = MEDIA_CONTENT_ERROR_NONE;
1420         } else {
1421                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1422                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1423         }
1424
1425         return ret;
1426 }
1427
1428 #ifdef _USE_SENIOR_MODE
1429 int media_info_set_contact(media_info_h media, const char *contact)
1430 {
1431         int ret = MEDIA_CONTENT_ERROR_NONE;
1432         media_info_s *_media = (media_info_s*)media;
1433
1434         if (_media != NULL) {
1435                 SAFE_FREE(_media->contact);
1436                 if (STRING_VALID(contact)) {
1437                         _media->contact = strdup(contact);
1438                         media_content_retvm_if(_media->contact == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1439                 } else {
1440                         _media->contact = NULL;
1441                 }
1442         } else {
1443                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1444                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1445         }
1446
1447         return ret;
1448 }
1449
1450 int media_info_set_app_data(media_info_h media, const char *app_data)
1451 {
1452         int ret = MEDIA_CONTENT_ERROR_NONE;
1453         media_info_s *_media = (media_info_s*)media;
1454
1455         if (_media != NULL) {
1456                 SAFE_FREE(_media->app_data);
1457                 if (STRING_VALID(app_data)) {
1458                         _media->app_data = strdup(app_data);
1459                         media_content_retvm_if(_media->app_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1460                 } else {
1461                         _media->app_data = NULL;
1462                 }
1463         } else {
1464                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1465                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1466         }
1467
1468         return ret;
1469 }
1470
1471 int media_info_insert_to_db_with_contact_data(const char *path, const char* contact, const char* app_data, media_info_h *info)
1472 {
1473         int ret = media_info_insert_to_db(path, info);
1474         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_insert_to_db [%s] failed", path);
1475
1476         ret = media_info_set_contact(*info, contact);
1477         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1478                 media_content_error("media_info_set_contact [%s] failed", contact);
1479
1480                 media_info_s* _media_info = (media_info_s*)*info;
1481                 ret = media_info_delete_from_db(_media_info->media_id);
1482                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1483
1484                 media_info_destroy(*info);
1485                 return ret;
1486         }
1487
1488         ret = media_info_set_app_data(*info, app_data);
1489         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1490                 media_content_error("media_info_set_app_data [%s] failed", app_data);
1491
1492                 media_info_s* _media_info = (media_info_s*)*info;
1493                 ret = media_info_delete_from_db(_media_info->media_id);
1494                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1495
1496                 media_info_destroy(*info);
1497                 return ret;
1498         }
1499
1500         ret = media_info_update_to_db(*info);
1501         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1502                 media_content_error("media_info_update_to_db [] failed");
1503
1504                 media_info_s* _media_info = (media_info_s*)*info;
1505                 ret = media_info_delete_from_db(_media_info->media_id);
1506                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
1507
1508                 media_info_destroy(*info);
1509                 return ret;
1510         }
1511
1512         return ret;
1513 }
1514
1515 int media_info_delete_contact_from_db(const char* contact, const char* storage_id)
1516 {
1517         return -1;
1518 }
1519
1520 int media_info_delete_item(const char *media_id)
1521 {
1522         int ret = MEDIA_CONTENT_ERROR_NONE;
1523         char *path = NULL;
1524         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
1525
1526         if (!STRING_VALID(media_id)) {
1527                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1528                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1529         }
1530
1531         memset(storage_id, 0x00, sizeof(storage_id));
1532
1533         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
1534         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1535                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
1536                 SAFE_FREE(path);
1537                 return ret;
1538         }
1539
1540         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
1541         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1542                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
1543                 SAFE_FREE(path);
1544                 return ret;
1545         }
1546
1547         ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, tzplatform_getuid(TZ_USER_NAME));
1548         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1549                 media_content_error("remove from DB failed : %d", ret);
1550                 SAFE_FREE(path);
1551                 return ret;
1552         }
1553
1554         ret = media_svc_remove_file(path);
1555         SAFE_FREE(path);
1556         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
1557 }
1558
1559 int media_info_get_contact(media_info_h media, char **contact)
1560 {
1561         int ret = MEDIA_CONTENT_ERROR_NONE;
1562         media_info_s *_media = (media_info_s*)media;
1563
1564         if (_media && contact) {
1565                 if (STRING_VALID(_media->contact)) {
1566                         *contact = strdup(_media->contact);
1567                         if (*contact == NULL) {
1568                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1569                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1570                         }
1571                 } else {
1572                         *contact = NULL;
1573                 }
1574                 ret = MEDIA_CONTENT_ERROR_NONE;
1575         } else {
1576                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1577                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1578         }
1579
1580         return ret;
1581 }
1582
1583 int media_info_get_app_data(media_info_h media, char **app_data)
1584 {
1585         int ret = MEDIA_CONTENT_ERROR_NONE;
1586         media_info_s *_media = (media_info_s*)media;
1587
1588         if (_media && app_data) {
1589                 if (STRING_VALID(_media->app_data)) {
1590                         *app_data = strdup(_media->app_data);
1591                         if (*app_data == NULL) {
1592                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1593                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1594                         }
1595                 } else {
1596                         *app_data = NULL;
1597                 }
1598                 ret = MEDIA_CONTENT_ERROR_NONE;
1599         } else {
1600                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1601                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1602         }
1603
1604         return ret;
1605 }
1606 #endif
1607 #ifdef _USE_TVPD_MODE
1608 int media_info_get_played_count(media_info_h media, int *played_count)
1609 {
1610         int ret = MEDIA_CONTENT_ERROR_NONE;
1611         media_info_s *_media = (media_info_s*)media;
1612
1613         if (_media) {
1614                 *played_count = _media->played_count;
1615                 ret = MEDIA_CONTENT_ERROR_NONE;
1616         } else {
1617                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1618                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1619         }
1620
1621         return ret;
1622 }
1623
1624 int media_info_set_played_count(media_info_h media, int played_count)
1625 {
1626         int ret = MEDIA_CONTENT_ERROR_NONE;
1627
1628         media_info_s *_media = (media_info_s*)media;
1629
1630         if (_media) {
1631                 _media->played_count = played_count;
1632         } else {
1633                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1634                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1635         }
1636
1637         return ret;
1638 }
1639
1640 int media_info_set_played_position(media_info_h media, int played_position)
1641 {
1642         int ret = MEDIA_CONTENT_ERROR_NONE;
1643         media_info_s *_media = (media_info_s*)media;
1644
1645         if ((_media != NULL) && (played_position >= 0)) {
1646                 _media->played_position = played_position;
1647         } else {
1648                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1649                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1650         }
1651
1652         return ret;
1653 }
1654
1655 int media_info_get_played_position(media_info_h media, int *played_position)
1656 {
1657         int ret = MEDIA_CONTENT_ERROR_NONE;
1658         media_info_s *_media = (media_info_s*)media;
1659
1660         if (_media) {
1661                 *played_position = _media->played_position;
1662                 ret = MEDIA_CONTENT_ERROR_NONE;
1663         } else {
1664                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1665                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1666         }
1667
1668         return ret;
1669 }
1670
1671 int media_info_set_played_time(media_info_h media)
1672 {
1673         int ret = MEDIA_CONTENT_ERROR_NONE;
1674         time_t current_time;
1675
1676         media_info_s *_media = (media_info_s*)media;
1677
1678         if (_media != NULL) {
1679                 time(&current_time);
1680                 _media->played_time = current_time;
1681         } else {
1682                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1683                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1684         }
1685
1686         return ret;
1687 }
1688
1689 int media_info_get_played_time(media_info_h media, time_t* played_time)
1690 {
1691         int ret = MEDIA_CONTENT_ERROR_NONE;
1692         media_info_s *_media = (media_info_s*)media;
1693
1694         if (_media) {
1695                 *played_time = _media->played_time;
1696                 ret = MEDIA_CONTENT_ERROR_NONE;
1697         } else {
1698                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1699                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1700         }
1701
1702         return ret;
1703 }
1704
1705 int media_info_get_extract_flag(media_info_h media, int *extract_flag)
1706 {
1707         int ret = MEDIA_CONTENT_ERROR_NONE;
1708         media_info_s *_media = (media_info_s *)media;
1709
1710         if (_media && extract_flag) {
1711                 *extract_flag = _media->extract_flag;
1712                 ret = MEDIA_CONTENT_ERROR_NONE;
1713         } else {
1714                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1715                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1716         }
1717
1718         return ret;
1719 }
1720
1721 int media_info_get_stitched_state(media_info_h media, int *stitched_info)
1722 {
1723         int ret = MEDIA_CONTENT_ERROR_NONE;
1724         media_info_s *_media = (media_info_s*)media;
1725
1726         if (_media) {
1727                 *stitched_info = (_media->stitched_info & 0xFFFF0000) >> 16;
1728                 ret = MEDIA_CONTENT_ERROR_NONE;
1729         } else {
1730                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1731                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1732         }
1733
1734         return ret;
1735 }
1736
1737 int media_info_get_stitched_engine(media_info_h media, int *stitched_info)
1738 {
1739         int ret = MEDIA_CONTENT_ERROR_NONE;
1740         media_info_s *_media = (media_info_s*)media;
1741
1742         if (_media) {
1743                 *stitched_info = _media->stitched_info & 0x0000FFFF;
1744                 ret = MEDIA_CONTENT_ERROR_NONE;
1745         } else {
1746                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1747                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1748         }
1749
1750         return ret;
1751 }
1752
1753 int media_info_get_modified_month(media_info_h media, char **modified_month)
1754 {
1755         int ret = MEDIA_CONTENT_ERROR_NONE;
1756         media_info_s *_media = (media_info_s*)media;
1757
1758         if (_media && modified_month) {
1759                 if (STRING_VALID(_media->modified_month)) {
1760                         *modified_month = strdup(_media->modified_month);
1761                         if (*modified_month == NULL) {
1762                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1763                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1764                         }
1765                 } else {
1766                         *modified_month = NULL;
1767                 }
1768                 ret = MEDIA_CONTENT_ERROR_NONE;
1769         } else {
1770                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1771                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1772         }
1773
1774         return ret;
1775 }
1776
1777 #endif
1778
1779 int media_info_get_media_from_db(const char *media_id, media_info_h *media)
1780 {
1781         int ret = MEDIA_CONTENT_ERROR_NONE;
1782         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1783         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
1784         sqlite3_stmt *stmt = NULL;
1785
1786         if (!STRING_VALID(media_id) || (media == NULL)) {
1787                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1788                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1789         }
1790
1791         memset(select_query, 0x00, sizeof(select_query));
1792         memset(storage_id, 0x00, sizeof(storage_id));
1793
1794         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
1795         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1796
1797         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_FROM_MEDIA, storage_id, media_id);
1798
1799         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
1800         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1801
1802         media_info_s *_media = NULL;
1803
1804         if (sqlite3_step(stmt) == SQLITE_ROW) {
1805                 _media = (media_info_s*)calloc(1, sizeof(media_info_s));
1806
1807                 if (_media == NULL) {
1808                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1809                         SQLITE3_FINALIZE(stmt);
1810                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1811                 }
1812
1813                 _media_info_item_get_detail(stmt, (media_info_h)_media);
1814
1815                 *media = (media_info_h)_media;
1816         } else {
1817                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1818         }
1819
1820         SQLITE3_FINALIZE(stmt);
1821
1822         return ret;
1823 }
1824
1825 int media_info_set_favorite(media_info_h media, bool favorite)
1826 {
1827         int ret = MEDIA_CONTENT_ERROR_NONE;
1828         media_info_s *_media = (media_info_s*)media;
1829
1830         if (_media != NULL) {
1831                 if (favorite == TRUE)
1832                         time(&_media->favourite);
1833                 else
1834                         _media->favourite = 0;
1835         } else {
1836                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1837                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1838         }
1839
1840         return ret;
1841 }
1842
1843 int media_info_update_to_db(media_info_h media)
1844 {
1845         int ret = MEDIA_CONTENT_ERROR_NONE;
1846         media_info_s *_media = (media_info_s*)media;
1847         char *set_sql = NULL;
1848         char *sql = NULL;
1849
1850         if (_media != NULL && STRING_VALID(_media->media_id)) {
1851                 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
1852                 /* This code will be removed when sqlite3_mprintf works clearly */
1853                 char *test_sql = sqlite3_mprintf("%f, %f, %f", _media->longitude, _media->latitude, _media->altitude);
1854                 SQLITE3_SAFE_FREE(test_sql);
1855
1856                 /*Update Pinyin If Support Pinyin*/
1857                 char *file_name_pinyin = NULL;
1858                 char *description_pinyin = NULL;
1859                 bool pinyin_support = FALSE;
1860
1861                 /*Update Pinyin If Support Pinyin*/
1862                 media_svc_check_pinyin_support(&pinyin_support);
1863                 if (pinyin_support) {
1864                         if (STRING_VALID(_media->display_name))
1865                                 media_svc_get_pinyin(_media->display_name, &file_name_pinyin);
1866                         if (STRING_VALID(_media->description))
1867                                 media_svc_get_pinyin(_media->description, &description_pinyin);
1868                 }
1869 #ifdef _USE_TVPD_MODE
1870 #ifdef _USE_SENIOR_MODE
1871                 if (_media_content_is_support_senior_mode()) {
1872                         set_sql = sqlite3_mprintf("file_name=%Q, description=%Q, longitude=%f, latitude=%f, file_name_pinyin=%Q, description_pinyin=%Q, played_count=%d, last_played_time=%d, last_played_position=%d, rating=%d, favourite=%d, contact=%Q, app_data=%Q",
1873                                 _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);
1874                 } else
1875 #endif
1876                 {
1877                         set_sql = sqlite3_mprintf("file_name=%Q, description=%Q, longitude=%f, latitude=%f, file_name_pinyin=%Q, description_pinyin=%Q, played_count=%d, last_played_time=%d, last_played_position=%d, rating=%d, favourite=%d",
1878                                 _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);
1879                 }
1880 #else
1881                 set_sql = sqlite3_mprintf("file_name=%Q, description=%Q, longitude=%f, latitude=%f, file_name_pinyin=%Q, description_pinyin=%Q, rating=%d, favourite=%d", _media->display_name, _media->description, _media->longitude, _media->latitude, file_name_pinyin, description_pinyin, _media->rating, _media->favourite);
1882 #endif
1883
1884                 sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_uuid=%Q", _media->storage_uuid, set_sql, _media->media_id);
1885
1886                 ret = _content_query_sql(sql);
1887                 SQLITE3_SAFE_FREE(set_sql);
1888                 SQLITE3_SAFE_FREE(sql);
1889
1890                 SAFE_FREE(description_pinyin);
1891
1892                 if (ret == MEDIA_CONTENT_ERROR_NONE) {
1893                         /* Send notification for this update */
1894                         media_content_debug("Update is successfull. Send notification for this");
1895                         if (_media->file_path && _media->mime_type)
1896                                 media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_UPDATE, _media->file_path, _media->media_type, _media->media_id, _media->mime_type);
1897                         else
1898                                 media_content_error("Can't Send Noti : path or mime type is NULL");
1899                 }
1900         } else {
1901                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1902                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1903         }
1904
1905         return ret;
1906 }
1907
1908 int media_info_move_to_db(media_info_h media, const char* dst_path)
1909 {
1910         int ret = MEDIA_CONTENT_ERROR_NONE;
1911         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
1912         char repl_path[MAX_PATH_LEN] = {0, };
1913         char org_repl_path[MAX_PATH_LEN] = {0, };
1914
1915         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
1916         media_content_retvm_if(!STRING_VALID(dst_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid dst_path");
1917         memset(repl_path, 0, sizeof(repl_path));
1918         memset(org_repl_path, 0, sizeof(org_repl_path));
1919         ret = _media_content_replace_path(dst_path, repl_path);
1920         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1921
1922         media_info_s *_media = (media_info_s*)media;
1923
1924         ret = _media_content_replace_path(_media->file_path, org_repl_path);
1925         media_content_retvm_if(!STRING_VALID(org_repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1926
1927         /* If the two paths are the same, do nothing */
1928         media_content_retvm_if(g_strcmp0(repl_path, org_repl_path) == 0, MEDIA_CONTENT_ERROR_NONE, "Same path");
1929
1930         ret = __media_info_check_file_validity(repl_path);
1931         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1932
1933         memset(storage_id, 0x00, sizeof(storage_id));
1934         ret = media_svc_get_storage_id(_content_get_db_handle(), org_repl_path, storage_id, _content_get_uid());
1935         if (ret != MS_MEDIA_ERR_NONE) {
1936                 media_content_error("media_svc_get_storage_id failed : %d", ret);
1937                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
1938         }
1939
1940         ret = media_svc_move_item(_content_get_db_handle(), org_repl_path, repl_path, _content_get_uid());
1941         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
1942 }
1943
1944 int media_info_create_thumbnail(media_info_h media, media_thumbnail_completed_cb callback, void *user_data)
1945 {
1946         int ret = MEDIA_CONTENT_ERROR_NONE;
1947         media_content_warn("DEPRECATION WARNING: media_info_create_thumbnail() is deprecated and will be removed from next release. Use media_info_generate_thumbnail() instead.");
1948         static unsigned int req_id = 0;
1949         char repl_path[MAX_PATH_LEN] = {0, };
1950         media_info_s *_media = (media_info_s*)media;
1951
1952         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
1953                 memset(repl_path, 0, sizeof(repl_path));
1954                 ret = _media_content_replace_path(_media->file_path, repl_path);
1955                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1956
1957                 media_thumbnail_cb_s *_thumb_cb = (media_thumbnail_cb_s*)calloc(1, sizeof(media_thumbnail_cb_s));
1958                 media_content_retvm_if(_thumb_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1959                 req_id++;
1960                 _media->request_id = req_id;
1961
1962                 _thumb_cb->handle = _media;
1963                 _thumb_cb->user_data = user_data;
1964                 _thumb_cb->thumbnail_completed_cb = callback;
1965
1966                 ret = thumbnail_request_from_db_async(_media->request_id, repl_path, (ThumbFunc)__media_info_thumbnail_completed_cb, (void *)_thumb_cb, _content_get_uid());
1967                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
1968         } else {
1969                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1970                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1971         }
1972
1973         return ret;
1974 }
1975
1976 int media_info_generate_thumbnail(media_info_h media)
1977 {
1978         int ret = MEDIA_CONTENT_ERROR_NONE;
1979         char repl_path[MAX_PATH_LEN] = {0, };
1980         char *thumb_path = NULL;
1981         media_info_s *_media = (media_info_s*)media;
1982
1983         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
1984                 /* Already exists */
1985                 if (STRING_VALID(_media->thumbnail_path))
1986                         return MEDIA_CONTENT_ERROR_NONE;
1987
1988                 memset(repl_path, 0, sizeof(repl_path));
1989                 ret = _media_content_replace_path(_media->file_path, repl_path);
1990                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
1991
1992                 ret = media_svc_create_thumbnail(_media->storage_uuid, repl_path, _media->media_type, _content_get_uid(), &thumb_path);
1993                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
1994                 if (ret == MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT) {
1995                         SAFE_FREE(thumb_path);
1996                         return ret;
1997                 }
1998
1999                 /* thumb_path is not NULL except #MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT */
2000                 _media->thumbnail_path = g_strdup(thumb_path);
2001                 SAFE_FREE(thumb_path);
2002                 if (_media->thumbnail_path == NULL)
2003                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2004         } else {
2005                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2006                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2007         }
2008
2009         return ret;
2010 }
2011
2012 int media_info_cancel_thumbnail(media_info_h media)
2013 {
2014         int ret = MEDIA_CONTENT_ERROR_NONE;
2015         media_content_warn("DEPRECATION WARNING: media_info_cancel_thumbnail() is deprecated and will be removed from next release.");
2016         media_info_s *_media = (media_info_s*)media;
2017
2018         if (_media != NULL && STRING_VALID(_media->media_id) && _media->request_id > 0) {
2019                 ret = thumbnail_request_cancel_media(_media->request_id);
2020                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
2021         } else {
2022                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2023                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2024         }
2025
2026         return ret;
2027 }
2028
2029 int media_info_start_face_detection(media_info_h media, media_face_detection_completed_cb callback, void *user_data)
2030 {
2031         int ret = MEDIA_CONTENT_ERROR_NONE;
2032         static unsigned int req_id = 0;
2033         media_info_s *_media = (media_info_s*)media;
2034         char repl_path[MAX_PATH_LEN] = {0, };
2035
2036         if (!__media_info_isFaceRecognition_feature_supported()) {
2037                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
2038                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
2039         }
2040
2041         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
2042                 memset(repl_path, 0, sizeof(repl_path));
2043                 ret = _media_content_replace_path(_media->file_path, repl_path);
2044                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
2045                 media_face_cb_s *_face_cb = (media_face_cb_s*)calloc(1, sizeof(media_face_cb_s));
2046                 media_content_retvm_if(_face_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2047                 req_id++;
2048                 _media->face_request_id = req_id;
2049
2050                 _face_cb->user_data = user_data;
2051                 _face_cb->face_completed_cb = callback;
2052
2053                 ret = dcm_request_extract_face_async(_media->face_request_id, repl_path, (FaceFunc)__media_info_face_completed_cb, (void *)_face_cb, _content_get_uid());
2054                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
2055         } else {
2056                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2057                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2058         }
2059
2060         return ret;
2061 }
2062
2063 int media_info_cancel_face_detection(media_info_h media)
2064 {
2065         int ret = MEDIA_CONTENT_ERROR_NONE;
2066         media_info_s *_media = (media_info_s*)media;
2067
2068         if (!__media_info_isFaceRecognition_feature_supported()) {
2069                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
2070                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
2071         }
2072
2073         if (_media != NULL && STRING_VALID(_media->media_id) && _media->face_request_id > 0) {
2074                 ret = dcm_request_cancel_face(_media->face_request_id);
2075                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, 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_set_description(media_info_h media, const char *description)
2085 {
2086         int ret = MEDIA_CONTENT_ERROR_NONE;
2087         media_content_warn("DEPRECATION WARNING: media_info_set_description() is deprecated and will be removed from next release.");
2088         media_info_s *_media = (media_info_s*)media;
2089
2090         if (_media != NULL) {
2091                 SAFE_FREE(_media->description);
2092
2093                 if (STRING_VALID(description)) {
2094                         _media->description = strdup(description);
2095                         media_content_retvm_if(_media->description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2096                 } else {
2097                         _media->description = NULL;
2098                 }
2099         } else {
2100                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2101                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2102         }
2103
2104         return ret;
2105 }
2106
2107 int media_info_set_longitude(media_info_h media, double longitude)
2108 {
2109         int ret = MEDIA_CONTENT_ERROR_NONE;
2110         media_content_warn("DEPRECATION WARNING: media_info_set_longitude() is deprecated and will be removed from next release.");
2111         media_info_s *_media = (media_info_s*)media;
2112
2113         if (_media != NULL) {
2114                 _media->longitude = longitude;
2115         } else {
2116                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2117                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2118         }
2119
2120         return ret;
2121 }
2122
2123 int media_info_set_latitude(media_info_h media, double latitude)
2124 {
2125         int ret = MEDIA_CONTENT_ERROR_NONE;
2126         media_content_warn("DEPRECATION WARNING: media_info_set_latitude() is deprecated and will be removed from next release.");
2127         media_info_s *_media = (media_info_s*)media;
2128
2129         if (_media != NULL) {
2130                 _media->latitude = latitude;
2131         } else {
2132                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2133                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2134         }
2135
2136         return ret;
2137 }
2138
2139 int media_info_set_rating(media_info_h media, int rating)
2140 {
2141         int ret = MEDIA_CONTENT_ERROR_NONE;
2142         media_content_warn("DEPRECATION WARNING: media_info_set_rating() is deprecated and will be removed from next release.");
2143         media_info_s *_media = (media_info_s*)media;
2144
2145         if (_media != NULL) {
2146                 _media->rating = rating;
2147         } else {
2148                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2149                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2150         }
2151
2152         return ret;
2153 }
2154
2155
2156 int media_info_set_display_name(media_info_h media, const char *display_name)
2157 {
2158         int ret = MEDIA_CONTENT_ERROR_NONE;
2159         media_content_warn("DEPRECATION WARNING: media_info_set_display_name() is deprecated and will be removed from next release.");
2160         media_info_s *_media = (media_info_s*)media;
2161
2162         if (_media != NULL && STRING_VALID(display_name)) {
2163                 SAFE_FREE(_media->display_name);
2164
2165                 _media->display_name = strdup(display_name);
2166                 media_content_retvm_if(_media->display_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2167         } else {
2168                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2169                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2170         }
2171
2172         return ret;
2173 }