add 360 content stitched info API.
[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 #ifdef _USE_TV_PROFILE
24 #include <media_content_internal.h>
25 #endif
26
27 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data);
28 static void __media_info_thumbnail_completed_cb(int error, const char *path, void *user_data);
29 static void __media_info_face_completed_cb(int error, const int face_count, void *user_data);
30 static bool __media_info_delete_batch_cb(media_info_h media, void *user_data);
31 static int __media_info_insert_batch(media_batch_insert_e insert_type, const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data);
32
33 static int __media_info_get_media_path_by_id_from_db(const char *media_id, char **path)
34 {
35         int ret = MEDIA_CONTENT_ERROR_NONE;
36         sqlite3_stmt *stmt = NULL;
37         char *select_query = NULL;
38
39         media_content_retvm_if(!STRING_VALID(media_id), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media_id");
40
41         select_query = sqlite3_mprintf(SELECT_MEDIA_PATH_BY_ID, media_id);
42
43         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
44         SQLITE3_SAFE_FREE(select_query);
45         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
46
47         if (sqlite3_step(stmt) == SQLITE_ROW) {
48                 *path = g_strdup((const char *)sqlite3_column_text(stmt, 0));
49         } else {
50                 media_content_error("There's no media with this ID : %s", media_id);
51                 *path = NULL;
52                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
53         }
54
55         SQLITE3_FINALIZE(stmt);
56
57         return ret;
58 }
59
60 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data)
61 {
62         int ret = MEDIA_CONTENT_ERROR_NONE;
63         media_insert_cb_s *_cb_data = (media_insert_cb_s *)user_data;
64
65         if (_cb_data) {
66                 if (result)
67                         ret = _content_error_capi(MEDIA_CONTENT_TYPE, result->result);
68
69                 if (_cb_data->insert_completed_cb)
70                         _cb_data->insert_completed_cb(ret, _cb_data->user_data);
71
72                 if (STRING_VALID(_cb_data->insert_list_path)) {
73                         if (unlink(_cb_data->insert_list_path) < 0)
74                                 media_content_stderror("failed to delete");
75                         SAFE_FREE(_cb_data->insert_list_path);
76                 }
77         }
78
79         SAFE_FREE(_cb_data);
80
81         return;
82 }
83
84 static void __media_info_thumbnail_completed_cb(int error, const char *path, void *user_data)
85 {
86         int error_value = MEDIA_CONTENT_ERROR_NONE;
87
88         media_thumbnail_cb_s *_thumb_cb = (media_thumbnail_cb_s *)user_data;
89         media_info_s *media = NULL;
90
91         if (_thumb_cb != NULL) {
92                 media = _thumb_cb->handle;
93                 if ((media != NULL) && STRING_VALID(path)) {
94                         media->thumbnail_path = NULL;
95                         media->thumbnail_path = g_strdup(path);
96                 }
97
98                 media_content_debug("error [%d], thumbnail_path [%s]", error, path);
99                 error_value = _content_error_capi(MEDIA_THUMBNAIL_TYPE, error);
100                 if (_thumb_cb->thumbnail_completed_cb)
101                         _thumb_cb->thumbnail_completed_cb(error_value, path, _thumb_cb->user_data);
102         }
103
104         SAFE_FREE(_thumb_cb);
105
106         return;
107 }
108
109 static bool __media_info_isFaceRecognition_feature_supported()
110 {
111         bool isFaceRecognitionSupported = false;
112
113         const int nRetVal = system_info_get_platform_bool("http://tizen.org/feature/vision.face_recognition", &isFaceRecognitionSupported);
114
115         if (nRetVal != SYSTEM_INFO_ERROR_NONE) {
116                 media_content_debug("SYSTEM_INFO_ERROR: vision.face_recognition [%d]", nRetVal);
117                 return false;
118         }
119
120         return isFaceRecognitionSupported;
121 }
122
123 static void __media_info_face_completed_cb(int error, const int face_count, void *user_data)
124 {
125         int error_value = MEDIA_CONTENT_ERROR_NONE;
126
127         media_face_cb_s *_face_cb = (media_face_cb_s *)user_data;
128
129         if (_face_cb != NULL) {
130                 media_content_debug("error [%d], face_count [%d]", error, face_count);
131                 error_value = _content_error_capi(MEDIA_THUMBNAIL_TYPE, error);
132                 if (_face_cb->face_completed_cb)
133                         _face_cb->face_completed_cb(error_value, face_count, _face_cb->user_data);
134         }
135
136         SAFE_FREE(_face_cb);
137
138         return;
139 }
140
141 static bool __media_info_delete_batch_cb(media_info_h media, void *user_data)
142 {
143         int err = MEDIA_CONTENT_ERROR_NONE;
144         char *thumb_path = NULL;
145         media_content_type_e media_type = 0;
146         GArray *thumb_list = (GArray *)user_data;
147
148         if (media == NULL) {
149                 media_content_debug("NO Item");
150                 return true;
151         }
152
153         err = media_info_get_media_type(media, &media_type);
154         if (err == MEDIA_CONTENT_ERROR_NONE) {
155                 media_content_debug("media_type : [%d]", media_type);
156
157                 media_info_get_thumbnail_path(media, &thumb_path);
158                 if (STRING_VALID(thumb_path) && STRING_VALID(MEDIA_CONTENT_THUMB_DEFAULT_PATH)) {
159                         if (strncmp(MEDIA_CONTENT_THUMB_DEFAULT_PATH, thumb_path, strlen(MEDIA_CONTENT_THUMB_DEFAULT_PATH)) != 0)
160                                 g_array_append_val(thumb_list, thumb_path);
161                 }
162         } else {
163                 media_content_error("media_info_get_media_type failed");
164         }
165
166         return true;
167 }
168
169 static int __media_info_insert_batch(media_batch_insert_e insert_type, const char **path_array,
170                                         unsigned int array_length,
171                                         media_insert_completed_cb completed_cb,
172                                         void *user_data)
173 {
174         int ret = MEDIA_CONTENT_ERROR_NONE;
175         FILE *fp = NULL;
176         char list_path[255] = {0, };
177         unsigned int idx = 0;
178         int nwrites = 0;
179
180         for (idx = 0; idx < BATCH_REQUEST_MAX; idx++) {
181                 snprintf(list_path, sizeof(list_path), "%s/request-%ld-%d", MEDIA_CONTENT_INSERT_FILES_PATH, media_content_gettid(), idx);
182
183                 if (g_file_test(list_path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
184                         memset(list_path, 0x00, sizeof(list_path));
185                         continue;
186                 } else {
187                         media_content_debug("The request file list path : %s", list_path);
188                         break;
189                 }
190         }
191
192         if (idx == BATCH_REQUEST_MAX) {
193                 media_content_error("Too many batch request for one thread");
194                 return MEDIA_CONTENT_ERROR_DB_BUSY;
195         }
196
197         fp = fopen(list_path, "w");
198         if (fp == NULL) {
199                 media_content_error("failed to open file : [%s]", list_path);
200                 media_content_stderror("failed to open file");
201                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
202         }
203
204         for (idx = 0; idx < array_length; idx++) {
205                 if (STRING_VALID(path_array[idx])) {
206                         int size = strlen(path_array[idx]);
207
208                         ret = _media_util_check_file_exist(path_array[idx]);
209                         if (ret != MEDIA_CONTENT_ERROR_NONE) {
210                                 fclose(fp);
211                                 if (unlink(list_path) < 0)
212                                         media_content_stderror("failed to delete");
213                                 return ret;
214                         }
215
216                         nwrites = fwrite(path_array[idx], 1, size, fp);
217                         if (nwrites != size) {
218                                 media_content_stderror("failed to write");
219                                 fclose(fp);
220                                 if (unlink(list_path) < 0)
221                                         media_content_stderror("failed to delete");
222                                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
223                         }
224
225                         nwrites = fwrite("\n", 1, 1, fp);
226                         if (nwrites != 1) {
227                                 media_content_stderror("failed to write");
228                                 fclose(fp);
229                                 if (unlink(list_path) < 0)
230                                         media_content_stderror("failed to delete");
231                                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
232                         }
233                 } else {
234                         media_content_error("path[%d] is invalid string", idx);
235                 }
236         }
237
238         fclose(fp);
239
240         media_insert_cb_s *_cb_data = (media_insert_cb_s *)calloc(1, sizeof(media_insert_cb_s));
241         media_content_retvm_if(_cb_data == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
242
243         _cb_data->insert_completed_cb = completed_cb;
244         _cb_data->user_data = user_data;
245         _cb_data->insert_list_path = g_strdup(list_path);
246
247         if (insert_type == MEDIA_BATCH_INSERT_NORMAL)
248                 ret = media_files_register(list_path, __media_info_insert_completed_cb, _cb_data, tzplatform_getuid(TZ_USER_NAME));
249         else if (insert_type == MEDIA_BATCH_INSERT_BURSTSHOT)
250                 ret = media_burstshot_register(list_path, __media_info_insert_completed_cb, _cb_data, tzplatform_getuid(TZ_USER_NAME));
251         else
252                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
253
254         if (ret != MEDIA_CONTENT_ERROR_NONE) {
255                 media_content_error("media_files_register failed : %d", ret);
256                 if (unlink(list_path) < 0)
257                         media_content_stderror("failed to delete");
258                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
259         }
260
261         return ret;
262 }
263
264 void _media_info_item_get_detail(sqlite3_stmt* stmt, media_info_h media)
265 {
266         media_info_s *_media = (media_info_s*)media;
267 #ifndef _USE_TV_PROFILE
268         char *tmp_path = NULL;
269         char repl_path[MAX_QUERY_SIZE] = {0, };
270 #endif
271
272         _media->media_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_UUID));
273 #ifdef _USE_TV_PROFILE
274         _media->file_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_PATH));
275 #else
276         tmp_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_PATH));
277         _media_content_rollback_path(tmp_path, repl_path);
278         _media->file_path = g_strdup(repl_path);
279         SAFE_FREE(tmp_path);
280 #endif
281         _media->display_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_FILE_NAME));
282         _media->media_type = (int)sqlite3_column_int(stmt, MEDIA_INFO_TYPE);
283         _media->mime_type = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MIME_TYPE));
284         _media->size = (unsigned long long)sqlite3_column_int64(stmt, MEDIA_INFO_SIZE);
285         _media->added_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_ADDED_TIME);
286         _media->modified_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_MODIFIED_TIME);
287         _media->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_THUMBNAIL_PATH));
288         _media->description = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DESCRIPTION));
289         _media->rating = (int)sqlite3_column_int(stmt, MEDIA_INFO_RATING);
290         _media->favourite = (int)sqlite3_column_int(stmt, MEDIA_INFO_FAVOURITE);
291         _media->author = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_AUTHOR));
292         _media->provider = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_PROVIDER));
293         _media->content_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_CONTENT_NAME));
294         _media->category = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_CATEGORY));
295         _media->location_tag = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_LOCATION_TAG));
296         _media->age_rating = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_AGE_RATING));
297         _media->keyword = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_KEYWORD));
298         _media->is_drm = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_DRM);
299         _media->storage_type = (int)sqlite3_column_int(stmt, MEDIA_INFO_STORAGE_TYPE);
300         _media->longitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LONGITUDE);
301         _media->latitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LATITUDE);
302         _media->altitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_ALTITUDE);
303         _media->played_count = sqlite3_column_int(stmt, MEDIA_INFO_PLAYED_COUNT);
304         _media->played_time = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_TIME);
305         _media->played_position = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_POSITION);
306         _media->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
307         _media->timeline = (double)sqlite3_column_double(stmt, MEDIA_INFO_TIMELINE);
308         _media->weather = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_WEATHER));
309         _media->sync_status = (int)sqlite3_column_int(stmt, MEDIA_INFO_SYNC_STATUS);
310         _media->storage_uuid = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_STORAGE_UUID));
311         _media->is_360 = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_360);
312 #ifdef _USE_TV_PROFILE
313         _media->stitched_info = (int)sqlite3_column_int(stmt, MEDIA_INFO_STITCHED_INFO);
314 #endif
315
316         if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE) {
317                 _media->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
318                 if (_media->image_meta) {
319                         _media->image_meta->media_id = g_strdup(_media->media_id);
320                         _media->image_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
321                         _media->image_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
322                         _media->image_meta->fnumber = (double)sqlite3_column_double(stmt, MEDIA_INFO_FNUMBER);
323                         _media->image_meta->iso = sqlite3_column_int(stmt, MEDIA_INFO_ISO);
324                         _media->image_meta->date_taken = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DATETAKEN));
325                         _media->image_meta->orientation = sqlite3_column_int(stmt, MEDIA_INFO_ORIENTATION);
326                         _media->image_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
327                         _media->image_meta->burst_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_BURST_ID));
328                         _media->image_meta->weather = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_WEATHER));
329                         _media->image_meta->exposure_time = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_EXPOSURE_TIME));
330                         _media->image_meta->model = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MODEL));
331                 }
332         } else if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
333                 _media->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
334                 if (_media->video_meta) {
335                         _media->video_meta->media_id = g_strdup(_media->media_id);
336                         _media->video_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
337                         _media->video_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
338                         _media->video_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
339                         _media->video_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
340                         _media->video_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
341                         _media->video_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
342                         _media->video_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
343                         _media->video_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
344                         _media->video_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
345                         _media->video_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
346                         _media->video_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
347                         _media->video_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
348                         _media->video_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
349                         _media->video_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
350                         _media->video_meta->played_count = sqlite3_column_int(stmt, MEDIA_INFO_PLAYED_COUNT);
351                         _media->video_meta->played_time = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_TIME);
352                         _media->video_meta->played_position = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_POSITION);
353                 }
354
355         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
356                 _media->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
357                 if (_media->audio_meta) {
358                         _media->audio_meta->media_id = g_strdup(_media->media_id);
359                         _media->audio_meta->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
360                         _media->audio_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
361                         _media->audio_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
362                         _media->audio_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
363                         _media->audio_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
364                         _media->audio_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
365                         _media->audio_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
366                         _media->audio_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
367                         _media->audio_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
368                         _media->audio_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
369                         _media->audio_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
370                         _media->audio_meta->bitpersample = sqlite3_column_int(stmt, MEDIA_INFO_BITPERSAMPLE);
371                         _media->audio_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
372                         _media->audio_meta->played_count = sqlite3_column_int(stmt, MEDIA_INFO_PLAYED_COUNT);
373                         _media->audio_meta->played_time = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_TIME);
374                         _media->audio_meta->played_position = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_POSITION);
375                         _media->audio_meta->samplerate = sqlite3_column_int(stmt, MEDIA_INFO_SAMPLERATE);
376                         _media->audio_meta->channel = sqlite3_column_int(stmt, MEDIA_INFO_CHANNEL);
377                 }
378         }
379 }
380
381 int _media_info_get_media_info_from_db(const char *path, const char *storage_id, media_info_h media)
382 {
383         int ret = MEDIA_CONTENT_ERROR_NONE;
384         sqlite3_stmt *stmt = NULL;
385         char *select_query = NULL;
386         media_info_s *_media = (media_info_s*)media;
387
388         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
389
390         select_query = sqlite3_mprintf(SELECT_MEDIA_BY_PATH, storage_id, path);
391
392         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
393         SQLITE3_SAFE_FREE(select_query);
394         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
395
396         if (sqlite3_step(stmt) == SQLITE_ROW) {
397                 _media_info_item_get_detail(stmt, (media_info_h)_media);
398         } else {
399                 media_content_error("There's no media!!");
400                 media_content_error("%s", path);
401                 media_content_error("%s", storage_id);
402                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
403         }
404
405         SQLITE3_FINALIZE(stmt);
406
407         return ret;
408 }
409
410 int media_info_insert_to_db(const char *path, media_info_h *info)
411 {
412         bool ignore_file = FALSE;
413         bool ignore_dir = FALSE;
414         char *folder_path = NULL;
415         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
416         char repl_path[MAX_QUERY_SIZE] = {0, };
417         int ret = MEDIA_CONTENT_ERROR_NONE;
418
419         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
420         media_content_retvm_if(info == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
421         memset(repl_path, 0, sizeof(repl_path));
422         ret = _media_content_replace_path(path, repl_path);
423         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
424
425         ret = _media_util_check_ignore_file(repl_path, &ignore_file);
426         media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
427
428         ret = _media_util_check_file_exist(repl_path);
429         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
430
431         folder_path = g_path_get_dirname(repl_path);
432         ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
433         SAFE_FREE(folder_path);
434
435         media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
436
437         memset(storage_id, 0x00, sizeof(storage_id));
438         ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, tzplatform_getuid(TZ_USER_NAME));
439         if (ret != MS_MEDIA_ERR_NONE) {
440                 media_content_error("media_svc_get_storage_id failed : %d", ret);
441                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
442         }
443
444         ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), storage_id, repl_path);
445         if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
446                 media_content_sec_debug("media_svc_check_item_exist_by_path : no record : %s", repl_path);
447
448                 media_svc_storage_type_e storage_type = 0;
449
450                 ret = media_svc_get_storage_type(repl_path, &storage_type, tzplatform_getuid(TZ_USER_NAME));
451                 if (ret != MS_MEDIA_ERR_NONE) {
452                         media_content_sec_error("media_svc_get_storage_type failed : %d", ret);
453                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
454                 }
455
456                 ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, storage_type, repl_path, tzplatform_getuid(TZ_USER_NAME));
457
458                 if (ret != MS_MEDIA_ERR_NONE) {
459                         if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
460                                 media_content_sec_error("This item is already inserted. This may be normal operation because other process already did this (%s)", repl_path);
461                                 ret = MEDIA_CONTENT_ERROR_NONE;
462                         } else {
463                                 media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, repl_path);
464                         }
465
466                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
467                 }
468         } else if (ret != MS_MEDIA_ERR_NONE) {
469                 media_content_sec_error("media_svc_check_item_exist_by_path failed : %d (%s)", ret, repl_path);
470                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
471         }
472
473         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
474         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
475
476         if (STRING_VALID(storage_id))
477                 ret = _media_info_get_media_info_from_db(repl_path, storage_id, (media_info_h)_media);
478         else
479                 ret = _media_info_get_media_info_from_db(repl_path, DEFAULT_MEDIA_STORAGE_ID, (media_info_h)_media);
480
481         *info = (media_info_h)_media;
482         return ret;
483 }
484
485 int media_info_insert_batch_to_db(
486                                         const char **path_array,
487                                         unsigned int array_length,
488                                         media_insert_completed_cb completed_cb,
489                                         void *user_data)
490 {
491         char **repl_path_array = NULL;
492         int idx = 0;
493         int ret = MS_MEDIA_ERR_NONE;
494         char repl_path[MAX_QUERY_SIZE] = {0, };
495
496         media_content_retvm_if(path_array == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path_array");
497         media_content_retvm_if(array_length <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid array_length");
498
499         repl_path_array = calloc(1, sizeof(char *) * array_length);
500
501         for (idx = 0; idx < array_length; idx++) {
502                 if (STRING_VALID(path_array[idx])) {
503                         memset(repl_path, 0, sizeof(repl_path));
504                         _media_content_replace_path(path_array[idx], repl_path);
505                         repl_path_array[idx] = strndup(repl_path, strlen(repl_path));
506                 } else {
507                         media_content_error("path[%d] is invalid string", idx);
508                 }
509         }
510
511         ret = __media_info_insert_batch(MEDIA_BATCH_INSERT_NORMAL, (const char **)repl_path_array, array_length, completed_cb, user_data);
512         for (idx = 0; idx < array_length; idx++)
513                 SAFE_FREE(repl_path_array[idx]);
514
515         SAFE_FREE(repl_path_array);
516
517         return ret;
518 }
519
520 int media_info_insert_burst_shot_to_db(const char **path_array, unsigned int array_length, media_insert_burst_shot_completed_cb callback, void *user_data)
521 {
522         char **repl_path_array = NULL;
523         int idx = 0;
524         int ret = MS_MEDIA_ERR_NONE;
525         char repl_path[MAX_QUERY_SIZE] = {0, };
526
527         media_content_retvm_if(path_array == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path_array");
528         media_content_retvm_if(array_length <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid array_length");
529
530         repl_path_array = calloc(1, sizeof(char *) * array_length);
531
532         for (idx = 0; idx < array_length; idx++) {
533                 if (STRING_VALID(path_array[idx])) {
534                         memset(repl_path, 0, sizeof(repl_path));
535                         _media_content_replace_path(path_array[idx], repl_path);
536                         repl_path_array[idx] = strndup(repl_path, strlen(repl_path));
537                 } else {
538                         media_content_error("path[%d] is invalid string", idx);
539                 }
540         }
541
542         ret = __media_info_insert_batch(MEDIA_BATCH_INSERT_BURSTSHOT, (const char **)repl_path_array, array_length, callback, user_data);
543         for (idx = 0; idx < array_length; idx++)
544                 SAFE_FREE(repl_path_array[idx]);
545
546         SAFE_FREE(repl_path_array);
547
548         return ret;
549 }
550
551 #ifdef _USE_SENIOR_MODE
552 int media_info_insert_to_db_with_contact_data(const char *path, const char* contact, const char* app_data, media_info_h *info)
553 {
554         int ret = media_info_insert_to_db(path, info);
555         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_insert_to_db [%s] failed", path);
556
557         ret = media_info_set_contact(*info, contact);
558         if (ret != MEDIA_CONTENT_ERROR_NONE) {
559                 media_content_error("media_info_set_contact [%s] failed", contact);
560
561                 media_info_s* _media_info = (media_info_s*)*info;
562                 ret = media_info_delete_from_db(_media_info->media_id);
563                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
564
565                 media_info_destroy(*info);
566                 return ret;
567         }
568
569         ret = media_info_set_app_data(*info, app_data);
570         if (ret != MEDIA_CONTENT_ERROR_NONE) {
571                 media_content_error("media_info_set_app_data [%s] failed", app_data);
572
573                 media_info_s* _media_info = (media_info_s*)*info;
574                 ret = media_info_delete_from_db(_media_info->media_id);
575                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
576
577                 media_info_destroy(*info);
578                 return ret;
579         }
580
581         ret = media_info_update_to_db(*info);
582         if (ret != MEDIA_CONTENT_ERROR_NONE) {
583                 media_content_error("media_info_update_to_db [] failed");
584
585                 media_info_s* _media_info = (media_info_s*)*info;
586                 ret = media_info_delete_from_db(_media_info->media_id);
587                 media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_info_delete_from_db [%s] failed", _media_info->media_id);
588
589                 media_info_destroy(*info);
590                 return ret;
591         }
592
593         return ret;
594 }
595
596 int media_info_delete_contact_from_db(const char* contact, const char* storage_id)
597 {
598         return -1;
599 }
600
601 int media_info_get_media_info_by_path_from_db(const char* path, media_info_h* media)
602 {
603         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
604         int ret = MEDIA_CONTENT_ERROR_NONE;
605         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid path");
606         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid info");
607
608         memset(storage_id, 0x00, sizeof(storage_id));
609         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, tzplatform_getuid(TZ_USER_NAME));
610         if (ret != MS_MEDIA_ERR_NONE) {
611                 media_content_error("media_svc_get_storage_id failed : %d", ret);
612                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
613         }
614
615         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
616         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
617
618         ret =  _media_info_get_media_info_from_db(path, storage_id, (media_info_h)_media);
619         *media = (media_info_h)_media;
620
621         return ret;
622 }
623
624 int media_info_delete_item(const char *media_id)
625 {
626         int ret = MEDIA_CONTENT_ERROR_NONE;
627         char *path = NULL;
628         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0,};
629
630         if (!STRING_VALID(media_id)) {
631                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
632                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
633         }
634
635         memset(storage_id, 0x00, sizeof(storage_id));
636
637         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
638         if (ret != MEDIA_CONTENT_ERROR_NONE) {
639                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
640                 SAFE_FREE(path);
641                 return ret;
642         }
643
644         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
645         if (ret != MEDIA_CONTENT_ERROR_NONE) {
646                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
647                 SAFE_FREE(path);
648                 return ret;
649         }
650
651         ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, tzplatform_getuid(TZ_USER_NAME));
652         if (ret != MEDIA_CONTENT_ERROR_NONE) {
653                 media_content_error("remove from DB failed : %d", ret);
654                 SAFE_FREE(path);
655                 return ret;
656         }
657
658         ret = media_svc_remove_file(path);
659         SAFE_FREE(path);
660         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
661 }
662
663 #endif
664
665 int media_info_delete_from_db(const char *media_id)
666 {
667         int ret = MEDIA_CONTENT_ERROR_NONE;
668         char *path = NULL;
669         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
670
671         if (!STRING_VALID(media_id)) {
672                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
673                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
674         }
675
676         memset(storage_id, 0x00, sizeof(storage_id));
677
678         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
679         if (ret != MEDIA_CONTENT_ERROR_NONE) {
680                 media_content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
681                 SAFE_FREE(path);
682                 return ret;
683         }
684
685         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
686         if (ret != MEDIA_CONTENT_ERROR_NONE) {
687                 media_content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
688                 SAFE_FREE(path);
689                 return ret;
690         }
691
692         ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, tzplatform_getuid(TZ_USER_NAME));
693         SAFE_FREE(path);
694
695         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
696 }
697
698 static int __media_info_delete_thumb_from_list(GArray *thumb_list)
699 {
700         int i = 0;
701         int list_len = 0;
702         char *thumb_path = NULL;
703
704         if (thumb_list != NULL) {
705                 list_len = thumb_list->len;
706                 for (i = 0; i < list_len; i++) {
707                         thumb_path = g_array_index(thumb_list, char*, i);
708                         media_content_debug("thumb path [%s]", thumb_path);
709                         if (unlink(thumb_path) < 0)
710                                 media_content_stderror("failed to delete");
711                 }
712         }
713         return MEDIA_CONTENT_ERROR_NONE;
714 }
715
716 static int __media_info_release_thumb_list(GArray *thumb_list)
717 {
718         int i = 0;
719         int list_len = 0;
720         char *thumb_path = NULL;
721
722         if (thumb_list != NULL) {
723                 list_len = thumb_list->len;
724                 for (i = 0; i < list_len; i++) {
725                         thumb_path = g_array_index(thumb_list, char*, 0);
726                         g_array_remove_index(thumb_list, 0);
727                         SAFE_FREE(thumb_path);
728                 }
729
730                 g_array_free(thumb_list, FALSE);
731         }
732
733         return MEDIA_CONTENT_ERROR_NONE;
734 }
735
736 int media_info_delete_batch_from_db(filter_h filter)
737 {
738         int ret = MEDIA_CONTENT_ERROR_NONE;
739
740         char *query_string = NULL;
741         filter_s *_filter = NULL;
742         attribute_h attr;
743         char *condition_query = NULL;
744         GArray *thumb_list = NULL;
745
746         media_content_retvm_if(filter == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid filter");
747
748         thumb_list = g_array_new(FALSE, FALSE, sizeof(char*));
749
750         /* Delete thumbnail of each item */
751         ret = _media_db_get_group_item(NULL, filter, __media_info_delete_batch_cb, thumb_list, MEDIA_GROUP_NONE);
752
753         _filter = (filter_s*)filter;
754         attr = _content_get_attirbute_handle();
755
756         if (_filter->condition) {
757                 ret = _media_filter_attribute_generate(attr, _filter->condition, _filter->condition_collate_type, &condition_query);
758                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
759                         __media_info_release_thumb_list(thumb_list);
760                         return ret;
761                 }
762         }
763
764         if (STRING_VALID(condition_query)) {
765                 if (_filter->storage_id == NULL) {
766                         /*FIX ME*/
767                         query_string = sqlite3_mprintf(DELETE_MEDIA_FROM_MEDIA_BATCH, "media", condition_query);
768                 } else {
769                         query_string = sqlite3_mprintf(DELETE_MEDIA_FROM_MEDIA_BATCH, _filter->storage_id, condition_query);
770                 }
771         } else {
772                 SAFE_FREE(condition_query);
773                 __media_info_release_thumb_list(thumb_list);
774
775                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
776         }
777
778         ret = _content_query_sql(query_string);
779         if (ret == MEDIA_CONTENT_ERROR_NONE) {
780                 /* Send notification for this
781                         In this case, send noti for internal storage and external storage
782                 */
783                 media_content_debug("Batch deletion is successfull. Send notification for this");
784                 if (_filter->storage_id != NULL) {
785                         char *storage_path = NULL;
786                         media_svc_get_storage_path(_content_get_db_handle(), _filter->storage_id, &storage_path);
787                         if (STRING_VALID(storage_path))
788                                 media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, storage_path, -1, NULL, NULL);
789
790                         SAFE_FREE(storage_path);
791                 } else {
792                         /*FIX ME*/
793                         media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_INTERNAL, -1, NULL, NULL);
794                         media_svc_publish_noti(MS_MEDIA_ITEM_DIRECTORY, MS_MEDIA_ITEM_UPDATE, MEDIA_ROOT_PATH_SDCARD, -1, NULL, NULL);
795                 }
796
797                 __media_info_delete_thumb_from_list(thumb_list);
798                 __media_info_release_thumb_list(thumb_list);
799         }
800
801         SAFE_FREE(condition_query);
802         SQLITE3_SAFE_FREE(query_string);
803
804         return ret;
805 }
806
807 int media_info_destroy(media_info_h media)
808 {
809         int ret = MEDIA_CONTENT_ERROR_NONE;
810         media_info_s *_media = (media_info_s*)media;
811
812         if (_media) {
813                 SAFE_FREE(_media->media_id);
814                 SAFE_FREE(_media->file_path);
815                 SAFE_FREE(_media->display_name);
816                 SAFE_FREE(_media->mime_type);
817                 SAFE_FREE(_media->thumbnail_path);
818                 SAFE_FREE(_media->description);
819                 SAFE_FREE(_media->author);
820                 SAFE_FREE(_media->provider);
821                 SAFE_FREE(_media->content_name);
822                 SAFE_FREE(_media->category);
823                 SAFE_FREE(_media->location_tag);
824                 SAFE_FREE(_media->age_rating);
825                 SAFE_FREE(_media->keyword);
826                 SAFE_FREE(_media->title);
827 #ifdef _USE_TV_PROFILE
828                 SAFE_FREE(_media->modified_month);
829 #endif
830                 SAFE_FREE(_media->weather);
831                 SAFE_FREE(_media->storage_uuid);
832 #ifdef _USE_SENIOR_MODE
833                 SAFE_FREE(_media->contact);
834                 SAFE_FREE(_media->app_data);
835 #endif
836
837                 if (_media->image_meta) {
838                         SAFE_FREE(_media->image_meta->media_id);
839                         SAFE_FREE(_media->image_meta->date_taken);
840                         SAFE_FREE(_media->image_meta->burst_id);
841                         SAFE_FREE(_media->image_meta->exposure_time);
842                         SAFE_FREE(_media->image_meta->model);
843                         SAFE_FREE(_media->image_meta->title);
844                         SAFE_FREE(_media->image_meta->weather);
845
846                         SAFE_FREE(_media->image_meta);
847                 }
848
849                 if (_media->video_meta) {
850                         SAFE_FREE(_media->video_meta->media_id);
851                         SAFE_FREE(_media->video_meta->title);
852                         SAFE_FREE(_media->video_meta->album);
853                         SAFE_FREE(_media->video_meta->artist);
854                         SAFE_FREE(_media->video_meta->album_artist);
855                         SAFE_FREE(_media->video_meta->genre);
856                         SAFE_FREE(_media->video_meta->composer);
857                         SAFE_FREE(_media->video_meta->year);
858                         SAFE_FREE(_media->video_meta->recorded_date);
859                         SAFE_FREE(_media->video_meta->copyright);
860                         SAFE_FREE(_media->video_meta->track_num);
861
862                         SAFE_FREE(_media->video_meta);
863                 }
864
865                 if (_media->audio_meta) {
866                         SAFE_FREE(_media->audio_meta->media_id);
867                         SAFE_FREE(_media->audio_meta->title);
868                         SAFE_FREE(_media->audio_meta->album);
869                         SAFE_FREE(_media->audio_meta->artist);
870                         SAFE_FREE(_media->audio_meta->album_artist);
871                         SAFE_FREE(_media->audio_meta->genre);
872                         SAFE_FREE(_media->audio_meta->composer);
873                         SAFE_FREE(_media->audio_meta->year);
874                         SAFE_FREE(_media->audio_meta->recorded_date);
875                         SAFE_FREE(_media->audio_meta->copyright);
876                         SAFE_FREE(_media->audio_meta->track_num);
877
878                         SAFE_FREE(_media->audio_meta);
879                 }
880
881                 SAFE_FREE(_media);
882
883                 ret = MEDIA_CONTENT_ERROR_NONE;
884         } else {
885                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
886                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
887         }
888
889         return ret;
890 }
891
892 int media_info_clone(media_info_h *dst, media_info_h src)
893 {
894         int ret = MEDIA_CONTENT_ERROR_NONE;
895         media_info_s *_src = (media_info_s*)src;
896
897         if (_src != NULL) {
898                 media_info_s *_dst = (media_info_s*)calloc(1, sizeof(media_info_s));
899                 media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
900
901                 if (_src->media_id) {
902                         _dst->media_id = g_strdup(_src->media_id);
903                         if (_dst->media_id == NULL) {
904                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
905                                 media_info_destroy((media_info_h)_dst);
906                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
907                         }
908                 }
909                 if (_src->file_path) {
910                         _dst->file_path = g_strdup(_src->file_path);
911                         if (_dst->file_path == NULL) {
912                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
913                                 media_info_destroy((media_info_h)_dst);
914                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
915                         }
916                 }
917                 if (_src->display_name != NULL) {
918                         _dst->display_name = g_strdup(_src->display_name);
919                         if (_dst->display_name == NULL) {
920                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
921                                 media_info_destroy((media_info_h)_dst);
922                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
923                         }
924                 }
925                 if (_src->mime_type) {
926                         _dst->mime_type = g_strdup(_src->mime_type);
927                         if (_dst->mime_type == NULL) {
928                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
929                                 media_info_destroy((media_info_h)_dst);
930                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
931                         }
932                 }
933                 if (_src->thumbnail_path != NULL) {
934                         _dst->thumbnail_path = g_strdup(_src->thumbnail_path);
935                         if (_dst->thumbnail_path == NULL) {
936                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
937                                 media_info_destroy((media_info_h)_dst);
938                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
939                         }
940                 }
941                 if (_src->description != NULL) {
942                         _dst->description = g_strdup(_src->description);
943                         if (_dst->description == NULL) {
944                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
945                                 media_info_destroy((media_info_h)_dst);
946                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
947                         }
948                 }
949
950                 if (_src->weather != NULL) {
951                         _dst->weather = g_strdup(_src->weather);
952                         if (_dst->weather == NULL) {
953                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
954                                 media_info_destroy((media_info_h)_dst);
955                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
956                         }
957                 }
958
959                 if (_src->title != NULL) {
960                         _dst->title = g_strdup(_src->title);
961                         if (_dst->title == NULL) {
962                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
963                                 media_info_destroy((media_info_h)_dst);
964                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
965                         }
966                 }
967                 if (_src->author != NULL) {
968                         _dst->author = g_strdup(_src->author);
969                         if (_dst->author == NULL) {
970                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
971                                 media_info_destroy((media_info_h)_dst);
972                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
973                         }
974                 }
975                 if (_src->provider != NULL) {
976                         _dst->provider = g_strdup(_src->provider);
977                         if (_dst->provider == NULL) {
978                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
979                                 media_info_destroy((media_info_h)_dst);
980                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
981                         }
982                 }
983                 if (_src->content_name != NULL) {
984                         _dst->content_name = g_strdup(_src->content_name);
985                         if (_dst->content_name == NULL) {
986                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
987                                 media_info_destroy((media_info_h)_dst);
988                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
989                         }
990                 }
991                 if (_src->category != NULL) {
992                         _dst->category = g_strdup(_src->category);
993                         if (_dst->category == NULL) {
994                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
995                                 media_info_destroy((media_info_h)_dst);
996                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
997                         }
998                 }
999                 if (_src->location_tag != NULL) {
1000                         _dst->location_tag = g_strdup(_src->location_tag);
1001                         if (_dst->location_tag == NULL) {
1002                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1003                                 media_info_destroy((media_info_h)_dst);
1004                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1005                         }
1006                 }
1007                 if (_src->age_rating != NULL) {
1008                         _dst->age_rating = g_strdup(_src->age_rating);
1009                         if (_dst->age_rating == NULL) {
1010                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1011                                 media_info_destroy((media_info_h)_dst);
1012                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1013                         }
1014                 }
1015                 if (_src->keyword != NULL) {
1016                         _dst->keyword = g_strdup(_src->keyword);
1017                         if (_dst->keyword == NULL) {
1018                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1019                                 media_info_destroy((media_info_h)_dst);
1020                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1021                         }
1022                 }
1023
1024                 if (_src->storage_uuid != NULL) {
1025                         _dst->storage_uuid = g_strdup(_src->storage_uuid);
1026                         if (_dst->storage_uuid == NULL) {
1027                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1028                                 media_info_destroy((media_info_h)_dst);
1029                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1030                         }
1031                 }
1032 #ifdef _USE_TV_PROFILE
1033                 if (STRING_VALID(_src->modified_month)) {
1034                         _dst->modified_month = strdup(_src->modified_month);
1035                         if (_dst->modified_month == NULL) {
1036                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1037                                 media_info_destroy((media_info_h)_dst);
1038                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1039                         }
1040                 }
1041 #endif
1042 #ifdef _USE_SENIOR_MODE
1043                 if (STRING_VALID(_src->contact)) {
1044                         _dst->contact = strdup(_src->contact);
1045                         if (_dst->contact == NULL) {
1046                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1047                                 media_info_destroy((media_info_h)_dst);
1048                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1049                         }
1050                 }
1051
1052                 if (STRING_VALID(_src->app_data)) {
1053                         _dst->app_data = strdup(_src->app_data);
1054                         if (_dst->app_data == NULL) {
1055                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1056                                 media_info_destroy((media_info_h)_dst);
1057                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1058                         }
1059                 }
1060 #endif
1061
1062                 _dst->media_type = _src->media_type;
1063                 _dst->size = _src->size;
1064                 _dst->added_time = _src->added_time;
1065                 _dst->modified_time = _src->modified_time;
1066                 _dst->timeline = _src->timeline;
1067                 _dst->longitude = _src->longitude;
1068                 _dst->latitude = _src->latitude;
1069                 _dst->altitude = _src->altitude;
1070                 _dst->rating = _src->rating;
1071                 _dst->favourite = _src->favourite;
1072                 _dst->is_drm = _src->is_drm;
1073                 _dst->storage_type = _src->storage_type;
1074                 _dst->played_count = _src->played_count;
1075                 _dst->played_time = _src->played_time;
1076                 _dst->played_position = _src->played_position;
1077                 _dst->sync_status = _src->sync_status;
1078                 _dst->request_id = _src->request_id;
1079                 _dst->face_request_id = _src->face_request_id;
1080                 _dst->is_360 = _src->is_360;
1081 #ifdef _USE_TV_PROFILE
1082                 _dst->stitched_info = _src->stitched_info;
1083                 _dst->extract_flag = _src->extract_flag;
1084 #endif
1085
1086                 if (_src->media_type == MEDIA_CONTENT_TYPE_IMAGE && _src->image_meta) {
1087                         _dst->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
1088                         if (_dst->image_meta == NULL) {
1089                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1090                                 media_info_destroy((media_info_h)_dst);
1091                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1092                         }
1093
1094                         if (_src->image_meta->media_id != NULL) {
1095                                 _dst->image_meta->media_id = g_strdup(_src->image_meta->media_id);
1096                                 if (_dst->image_meta->media_id == NULL) {
1097                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1098                                         media_info_destroy((media_info_h)_dst);
1099                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1100                                 }
1101                         }
1102
1103                         if (_src->image_meta->date_taken != NULL) {
1104                                 _dst->image_meta->date_taken = g_strdup(_src->image_meta->date_taken);
1105                                 if (_dst->image_meta->date_taken == NULL) {
1106                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1107                                         media_info_destroy((media_info_h)_dst);
1108                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1109                                 }
1110                         }
1111
1112                         if (_src->image_meta->burst_id != NULL) {
1113                                 _dst->image_meta->burst_id = g_strdup(_src->image_meta->burst_id);
1114                                 if (_dst->image_meta->burst_id == NULL) {
1115                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1116                                         media_info_destroy((media_info_h)_dst);
1117                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1118                                 }
1119                         }
1120
1121                         if (_src->image_meta->weather != NULL) {
1122                                 _dst->image_meta->weather = g_strdup(_src->image_meta->weather);
1123                                 if (_dst->image_meta->weather == NULL) {
1124                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1125                                         media_info_destroy((media_info_h)_dst);
1126                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1127                                 }
1128                         }
1129
1130                         if (_src->image_meta->exposure_time != NULL) {
1131                                 _dst->image_meta->exposure_time = g_strdup(_src->image_meta->exposure_time);
1132                                 if (_dst->image_meta->exposure_time == NULL) {
1133                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1134                                         media_info_destroy((media_info_h)_dst);
1135                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1136                                 }
1137                         }
1138
1139                         if (_src->image_meta->model != NULL) {
1140                                 _dst->image_meta->model = g_strdup(_src->image_meta->model);
1141                                 if (_dst->image_meta->model == NULL) {
1142                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1143                                         media_info_destroy((media_info_h)_dst);
1144                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1145                                 }
1146                         }
1147
1148                         _dst->image_meta->fnumber = _src->image_meta->fnumber;
1149                         _dst->image_meta->iso = _src->image_meta->iso;
1150                         _dst->image_meta->width = _src->image_meta->width;
1151                         _dst->image_meta->height = _src->image_meta->height;
1152                         _dst->image_meta->orientation = _src->image_meta->orientation;
1153
1154                 } else if (_src->media_type == MEDIA_CONTENT_TYPE_VIDEO && _src->video_meta) {
1155                         _dst->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
1156                         if (_dst->video_meta == NULL) {
1157                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1158                                 media_info_destroy((media_info_h)_dst);
1159                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1160                         }
1161
1162                         if (_src->video_meta->media_id != NULL) {
1163                                 _dst->video_meta->media_id = g_strdup(_src->video_meta->media_id);
1164                                 if (_dst->video_meta->media_id == NULL) {
1165                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1166                                         media_info_destroy((media_info_h)_dst);
1167                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1168                                 }
1169                         }
1170                         if (_src->video_meta->title != NULL) {
1171                                 _dst->video_meta->title = g_strdup(_src->video_meta->title);
1172                                 if (_dst->video_meta->title == NULL) {
1173                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1174                                         media_info_destroy((media_info_h)_dst);
1175                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1176                                 }
1177                         }
1178                         if (_src->video_meta->album != NULL) {
1179                                 _dst->video_meta->album = g_strdup(_src->video_meta->album);
1180                                 if (_dst->video_meta->album == NULL) {
1181                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1182                                         media_info_destroy((media_info_h)_dst);
1183                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1184                                 }
1185                         }
1186                         if (_src->video_meta->artist != NULL) {
1187                                 _dst->video_meta->artist = g_strdup(_src->video_meta->artist);
1188                                 if (_dst->video_meta->artist == NULL) {
1189                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1190                                         media_info_destroy((media_info_h)_dst);
1191                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1192                                 }
1193                         }
1194                         if (_src->video_meta->album_artist != NULL) {
1195                                 _dst->video_meta->album_artist = g_strdup(_src->video_meta->album_artist);
1196                                 if (_dst->video_meta->album_artist == NULL) {
1197                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1198                                         media_info_destroy((media_info_h)_dst);
1199                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1200                                 }
1201                         }
1202                         if (_src->video_meta->genre != NULL) {
1203                                 _dst->video_meta->genre = g_strdup(_src->video_meta->genre);
1204                                 if (_dst->video_meta->genre == NULL) {
1205                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1206                                         media_info_destroy((media_info_h)_dst);
1207                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1208                                 }
1209                         }
1210                         if (_src->video_meta->composer != NULL) {
1211                                 _dst->video_meta->composer = g_strdup(_src->video_meta->composer);
1212                                 if (_dst->video_meta->composer == NULL) {
1213                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1214                                         media_info_destroy((media_info_h)_dst);
1215                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1216                                 }
1217                         }
1218                         if (_src->video_meta->year != NULL) {
1219                                 _dst->video_meta->year = g_strdup(_src->video_meta->year);
1220                                 if (_dst->video_meta->year == NULL) {
1221                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1222                                         media_info_destroy((media_info_h)_dst);
1223                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1224                                 }
1225                         }
1226                         if (_src->video_meta->recorded_date != NULL) {
1227                                 _dst->video_meta->recorded_date = g_strdup(_src->video_meta->recorded_date);
1228                                 if (_dst->video_meta->recorded_date == NULL) {
1229                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1230                                         media_info_destroy((media_info_h)_dst);
1231                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1232                                 }
1233                         }
1234                         if (_src->video_meta->copyright != NULL) {
1235                                 _dst->video_meta->copyright = g_strdup(_src->video_meta->copyright);
1236                                 if (_dst->video_meta->copyright == NULL) {
1237                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1238                                         media_info_destroy((media_info_h)_dst);
1239                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1240                                 }
1241                         }
1242                         if (_src->video_meta->track_num != NULL) {
1243                                 _dst->video_meta->track_num = g_strdup(_src->video_meta->track_num);
1244                                 if (_dst->video_meta->track_num == NULL) {
1245                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1246                                         media_info_destroy((media_info_h)_dst);
1247                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1248                                 }
1249                         }
1250
1251                         _dst->video_meta->width = _src->video_meta->width;
1252                         _dst->video_meta->height = _src->video_meta->height;
1253                         _dst->video_meta->duration = _src->video_meta->duration;
1254                         _dst->video_meta->bitrate = _src->video_meta->bitrate;
1255                         _dst->video_meta->played_count = _src->video_meta->played_count;
1256                         _dst->video_meta->played_time = _src->video_meta->played_time;
1257                         _dst->video_meta->played_position = _src->video_meta->played_position;
1258
1259                 } else if ((_src->media_type == MEDIA_CONTENT_TYPE_MUSIC || _src->media_type == MEDIA_CONTENT_TYPE_SOUND) && _src->audio_meta) {
1260                         _dst->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
1261                         if (_dst->audio_meta == NULL) {
1262                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1263                                 media_info_destroy((media_info_h)_dst);
1264                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1265                         }
1266
1267                         if (_src->audio_meta->media_id != NULL) {
1268                                 _dst->audio_meta->media_id = g_strdup(_src->audio_meta->media_id);
1269                                 if (_dst->audio_meta->media_id == NULL) {
1270                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1271                                         media_info_destroy((media_info_h)_dst);
1272                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1273                                 }
1274                         }
1275                         if (_src->audio_meta->title != NULL) {
1276                                 _dst->audio_meta->title = g_strdup(_src->audio_meta->title);
1277                                 if (_dst->audio_meta->title == NULL) {
1278                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1279                                         media_info_destroy((media_info_h)_dst);
1280                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1281                                 }
1282                         }
1283                         if (_src->audio_meta->album != NULL) {
1284                                 _dst->audio_meta->album = g_strdup(_src->audio_meta->album);
1285                                 if (_dst->audio_meta->album == NULL) {
1286                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1287                                         media_info_destroy((media_info_h)_dst);
1288                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1289                                 }
1290                         }
1291                         if (_src->audio_meta->artist != NULL) {
1292                                 _dst->audio_meta->artist = g_strdup(_src->audio_meta->artist);
1293                                 if (_dst->audio_meta->artist == NULL) {
1294                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1295                                         media_info_destroy((media_info_h)_dst);
1296                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1297                                 }
1298                         }
1299                         if (_src->audio_meta->album_artist != NULL) {
1300                                 _dst->audio_meta->album_artist = g_strdup(_src->audio_meta->album_artist);
1301                                 if (_dst->audio_meta->album_artist == NULL) {
1302                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1303                                         media_info_destroy((media_info_h)_dst);
1304                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1305                                 }
1306                         }
1307                         if (_src->audio_meta->genre != NULL) {
1308                                 _dst->audio_meta->genre = g_strdup(_src->audio_meta->genre);
1309                                 if (_dst->audio_meta->genre == NULL) {
1310                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1311                                         media_info_destroy((media_info_h)_dst);
1312                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1313                                 }
1314                         }
1315                         if (_src->audio_meta->composer != NULL) {
1316                                 _dst->audio_meta->composer = g_strdup(_src->audio_meta->composer);
1317                                 if (_dst->audio_meta->composer == NULL) {
1318                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1319                                         media_info_destroy((media_info_h)_dst);
1320                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1321                                 }
1322                         }
1323                         if (_src->audio_meta->year != NULL) {
1324                                 _dst->audio_meta->year = g_strdup(_src->audio_meta->year);
1325                                 if (_dst->audio_meta->year == NULL) {
1326                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1327                                         media_info_destroy((media_info_h)_dst);
1328                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1329                                 }
1330                         }
1331                         if (_src->audio_meta->recorded_date != NULL) {
1332                                 _dst->audio_meta->recorded_date = g_strdup(_src->audio_meta->recorded_date);
1333                                 if (_dst->audio_meta->recorded_date == NULL) {
1334                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1335                                         media_info_destroy((media_info_h)_dst);
1336                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1337                                 }
1338                         }
1339                         if (_src->audio_meta->copyright != NULL) {
1340                                 _dst->audio_meta->copyright = g_strdup(_src->audio_meta->copyright);
1341                                 if (_dst->audio_meta->copyright == NULL) {
1342                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1343                                         media_info_destroy((media_info_h)_dst);
1344                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1345                                 }
1346                         }
1347                         if (_src->audio_meta->track_num != NULL) {
1348                                 _dst->audio_meta->track_num = g_strdup(_src->audio_meta->track_num);
1349                                 if (_dst->audio_meta->track_num == NULL) {
1350                                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
1351                                         media_info_destroy((media_info_h)_dst);
1352                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
1353                                 }
1354                         }
1355
1356                         _dst->audio_meta->channel = _src->audio_meta->channel;
1357                         _dst->audio_meta->samplerate = _src->audio_meta->samplerate;
1358                         _dst->audio_meta->duration = _src->audio_meta->duration;
1359                         _dst->audio_meta->bitrate = _src->audio_meta->bitrate;
1360                         _dst->audio_meta->bitpersample = _src->audio_meta->bitpersample;
1361                         _dst->audio_meta->played_count = _src->audio_meta->played_count;
1362                         _dst->audio_meta->played_time = _src->audio_meta->played_time;
1363                         _dst->audio_meta->played_position = _src->audio_meta->played_position;
1364                 }
1365                 *dst = (media_info_h)_dst;
1366
1367                 ret = MEDIA_CONTENT_ERROR_NONE;
1368         } else {
1369                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1370                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1371         }
1372
1373         return ret;
1374 }
1375
1376 int media_info_get_media_count_from_db(filter_h filter, int *media_count)
1377 {
1378         int ret = MEDIA_CONTENT_ERROR_NONE;
1379
1380         if (media_count == NULL) {
1381                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1382                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1383
1384                 return ret;
1385         }
1386
1387         ret = _media_db_get_group_item_count(NULL, filter, MEDIA_GROUP_NONE, media_count);
1388
1389         return ret;
1390 }
1391
1392 int media_info_foreach_media_from_db(filter_h filter, media_info_cb callback, void *user_data)
1393 {
1394         int ret = MEDIA_CONTENT_ERROR_NONE;
1395
1396         media_content_retvm_if(callback == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid callback");
1397
1398         ret = _media_db_get_group_item(NULL, filter, callback, user_data, MEDIA_GROUP_NONE);
1399
1400         return ret;
1401 }
1402
1403 int media_info_get_tag_count_from_db(const char *media_id, filter_h filter, int *tag_count)
1404 {
1405         int ret = MEDIA_CONTENT_ERROR_NONE;
1406
1407         if (STRING_VALID(media_id) && tag_count) {
1408                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_TAG_BY_MEDIA_ID, tag_count);
1409         } else {
1410                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1411                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1412         }
1413
1414         return ret;
1415 }
1416
1417 int media_info_foreach_tag_from_db(const char *media_id, filter_h filter, media_tag_cb callback, void *user_data)
1418 {
1419         int ret = MEDIA_CONTENT_ERROR_NONE;
1420
1421         if ((callback != NULL) && STRING_VALID(media_id)) {
1422                 ret = _media_db_get_tag(media_id, filter, callback, user_data);
1423         } else {
1424                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1425                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1426         }
1427
1428         return ret;
1429 }
1430
1431 int media_info_get_bookmark_count_from_db(const char *media_id, filter_h filter, int *bookmark_count)
1432 {
1433         int ret = MEDIA_CONTENT_ERROR_NONE;
1434
1435         if (STRING_VALID(media_id) && bookmark_count) {
1436                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_BOOKMARK_BY_MEDIA_ID, bookmark_count);
1437         } else {
1438                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1439                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1440         }
1441
1442         return ret;
1443 }
1444
1445 int media_info_foreach_bookmark_from_db(const char *media_id, filter_h filter, media_bookmark_cb callback, void *user_data)
1446 {
1447         int ret = MEDIA_CONTENT_ERROR_NONE;
1448
1449         if ((callback != NULL) && STRING_VALID(media_id)) {
1450                 ret = _media_db_get_bookmark(media_id, filter, callback, user_data);
1451         } else {
1452                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1453                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1454         }
1455
1456         return ret;
1457 }
1458
1459 int media_info_get_face_count_from_db(const char *media_id, filter_h filter, int *face_count)
1460 {
1461         int ret = MEDIA_CONTENT_ERROR_NONE;
1462
1463         if (STRING_VALID(media_id) && face_count) {
1464                 ret = _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_FACE_BY_MEDIA_ID, face_count);
1465         } else {
1466                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1467                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1468         }
1469
1470         return ret;
1471 }
1472
1473 int media_info_foreach_face_from_db(const char *media_id, filter_h filter, media_face_cb callback, void *user_data)
1474 {
1475         int ret = MEDIA_CONTENT_ERROR_NONE;
1476
1477         if ((callback != NULL) && STRING_VALID(media_id)) {
1478                 ret = _media_db_get_face(media_id, filter, callback, user_data);
1479         } else {
1480                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1481                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1482         }
1483
1484         return ret;
1485 }
1486
1487 int media_info_get_image(media_info_h media, image_meta_h *image)
1488 {
1489         int ret = MEDIA_CONTENT_ERROR_NONE;
1490
1491         media_info_s *_media = (media_info_s*)media;
1492
1493         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
1494         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_IMAGE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
1495         media_content_retvm_if(_media->image_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid image_meta");
1496
1497         image_meta_s *_image = (image_meta_s*)calloc(1, sizeof(image_meta_s));
1498         media_content_retvm_if(_image == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1499
1500         _image->media_id = g_strdup(_media->media_id);
1501         _image->width = _media->image_meta->width;
1502         _image->height = _media->image_meta->height;
1503         _image->orientation = _media->image_meta->orientation;
1504         _image->fnumber = _media->image_meta->fnumber;
1505         _image->iso = _media->image_meta->iso;
1506         _image->date_taken = g_strdup(_media->image_meta->date_taken);
1507         _image->title = g_strdup(_media->image_meta->title);
1508         _image->burst_id = g_strdup(_media->image_meta->burst_id);
1509         _image->weather = g_strdup(_media->image_meta->weather);
1510         _image->exposure_time = g_strdup(_media->image_meta->exposure_time);
1511         _image->model = g_strdup(_media->image_meta->model);
1512
1513         *image = (image_meta_h)_image;
1514
1515         return ret;
1516 }
1517
1518 int media_info_get_video(media_info_h media, video_meta_h *video)
1519 {
1520         int ret = MEDIA_CONTENT_ERROR_NONE;
1521
1522         media_info_s *_media = (media_info_s*)media;
1523
1524         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
1525         media_content_retvm_if(_media->media_type != MEDIA_CONTENT_TYPE_VIDEO, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media_type");
1526         media_content_retvm_if(_media->video_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid video_meta");
1527
1528         video_meta_s *_video = (video_meta_s*)calloc(1, sizeof(video_meta_s));
1529         media_content_retvm_if(_video == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1530
1531         _video->media_id = g_strdup(_media->media_id);
1532         _video->title = g_strdup(_media->video_meta->title);
1533         _video->album = g_strdup(_media->video_meta->album);
1534         _video->artist = g_strdup(_media->video_meta->artist);
1535         _video->album_artist = g_strdup(_media->video_meta->album_artist);
1536         _video->genre = g_strdup(_media->video_meta->genre);
1537         _video->composer = g_strdup(_media->video_meta->composer);
1538         _video->year = g_strdup(_media->video_meta->year);
1539         _video->recorded_date = g_strdup(_media->video_meta->recorded_date);
1540         _video->copyright = g_strdup(_media->video_meta->copyright);
1541         _video->track_num = g_strdup(_media->video_meta->track_num);
1542
1543         _video->width = _media->video_meta->width;
1544         _video->height = _media->video_meta->height;
1545         _video->duration = _media->video_meta->duration;
1546         _video->bitrate = _media->video_meta->bitrate;
1547         _video->played_count = _media->video_meta->played_count;
1548         _video->played_time = _media->video_meta->played_time;
1549         _video->played_position = _media->video_meta->played_position;
1550
1551         *video = (video_meta_h)_video;
1552
1553         return ret;
1554 }
1555
1556 int media_info_get_audio(media_info_h media, audio_meta_h *audio)
1557 {
1558         int ret = MEDIA_CONTENT_ERROR_NONE;
1559
1560         media_info_s *_media = (media_info_s*)media;
1561
1562         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
1563         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");
1564         media_content_retvm_if(_media->audio_meta == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid audio_meta");
1565
1566         audio_meta_s *_audio = (audio_meta_s*)calloc(1, sizeof(audio_meta_s));
1567         media_content_retvm_if(_audio == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1568
1569         _audio->media_id = g_strdup(_media->media_id);
1570         _audio->title = g_strdup(_media->audio_meta->title);
1571         _audio->album = g_strdup(_media->audio_meta->album);
1572         _audio->artist = g_strdup(_media->audio_meta->artist);
1573         _audio->album_artist = g_strdup(_media->audio_meta->album_artist);
1574         _audio->genre = g_strdup(_media->audio_meta->genre);
1575         _audio->composer = g_strdup(_media->audio_meta->composer);
1576         _audio->year = g_strdup(_media->audio_meta->year);
1577         _audio->recorded_date = g_strdup(_media->audio_meta->recorded_date);
1578         _audio->copyright = g_strdup(_media->audio_meta->copyright);
1579         _audio->track_num = g_strdup(_media->audio_meta->track_num);
1580
1581         _audio->duration = _media->audio_meta->duration;
1582         _audio->bitrate = _media->audio_meta->bitrate;
1583         _audio->bitpersample = _media->audio_meta->bitpersample;
1584         _audio->samplerate = _media->audio_meta->samplerate;
1585         _audio->channel = _media->audio_meta->channel;
1586         _audio->played_time = _media->audio_meta->played_time;
1587         _audio->played_count = _media->audio_meta->played_count;
1588         _audio->played_position = _media->audio_meta->played_position;
1589
1590         *audio = (audio_meta_h)_audio;
1591
1592         return ret;
1593 }
1594
1595 int media_info_get_media_id(media_info_h media, char **media_id)
1596 {
1597         int ret = MEDIA_CONTENT_ERROR_NONE;
1598         media_info_s *_media = (media_info_s*)media;
1599
1600         if (_media && media_id) {
1601                 if (STRING_VALID(_media->media_id)) {
1602                         *media_id = strdup(_media->media_id);
1603                         media_content_retvm_if(*media_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1604                 } else {
1605                         *media_id = NULL;
1606                 }
1607                 ret = MEDIA_CONTENT_ERROR_NONE;
1608         } else {
1609                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1610                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1611         }
1612
1613         return ret;
1614 }
1615
1616 int media_info_get_file_path(media_info_h media, char **path)
1617 {
1618         int ret = MEDIA_CONTENT_ERROR_NONE;
1619         media_info_s *_media = (media_info_s*)media;
1620
1621         if (_media && path) {
1622                 if (STRING_VALID(_media->file_path)) {
1623                         *path = strdup(_media->file_path);
1624                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1625                 } else {
1626                         *path = NULL;
1627                 }
1628                 ret = MEDIA_CONTENT_ERROR_NONE;
1629
1630         } else {
1631                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1632                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1633         }
1634
1635         return ret;
1636 }
1637
1638 int media_info_get_display_name(media_info_h media, char **name)
1639 {
1640         int ret = MEDIA_CONTENT_ERROR_NONE;
1641         media_info_s *_media = (media_info_s*)media;
1642         if (_media && name) {
1643                 if (_media->display_name != NULL) {
1644                         *name = g_strdup(_media->display_name);
1645                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1646                 } else {
1647                         *name = NULL;
1648                 }
1649                 ret = MEDIA_CONTENT_ERROR_NONE;
1650
1651         } else {
1652                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1653                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1654         }
1655
1656         return ret;
1657 }
1658
1659 int media_info_get_media_type(media_info_h media, media_content_type_e *type)
1660 {
1661         int ret = MEDIA_CONTENT_ERROR_NONE;
1662         media_info_s *_media = (media_info_s*)media;
1663         if (_media && type) {
1664                 *type = _media->media_type;
1665                 ret = MEDIA_CONTENT_ERROR_NONE;
1666         } else {
1667                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1668                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1669         }
1670
1671         return ret;
1672 }
1673
1674 int media_info_get_mime_type(media_info_h media, char **mime_type)
1675 {
1676         int ret = MEDIA_CONTENT_ERROR_NONE;
1677         media_info_s *_media = (media_info_s*)media;
1678
1679         if (_media && mime_type) {
1680                 if (STRING_VALID(_media->mime_type)) {
1681                         *mime_type = strdup(_media->mime_type);
1682                         media_content_retvm_if(*mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1683                 } else {
1684                         *mime_type = NULL;
1685                 }
1686                 ret = MEDIA_CONTENT_ERROR_NONE;
1687         } else {
1688                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1689                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1690         }
1691
1692         return ret;
1693 }
1694
1695 int media_info_get_size(media_info_h media, unsigned long long *size)
1696 {
1697         int ret = MEDIA_CONTENT_ERROR_NONE;
1698         media_info_s *_media = (media_info_s*)media;
1699
1700         if (_media && size) {
1701                 *size = _media->size;
1702                 ret = MEDIA_CONTENT_ERROR_NONE;
1703         } else {
1704                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1705                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1706         }
1707
1708         return ret;
1709 }
1710
1711 int media_info_get_added_time(media_info_h media, time_t *added_time)
1712 {
1713         int ret = MEDIA_CONTENT_ERROR_NONE;
1714         media_info_s *_media = (media_info_s*)media;
1715         if (_media && added_time) {
1716                 *added_time = _media->added_time;
1717                 ret = MEDIA_CONTENT_ERROR_NONE;
1718         } else {
1719                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1720                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1721         }
1722
1723         return ret;
1724 }
1725
1726 int media_info_get_modified_time(media_info_h media, time_t* time)
1727 {
1728         int ret = MEDIA_CONTENT_ERROR_NONE;
1729         media_info_s *_media = (media_info_s*)media;
1730         if (_media && time) {
1731                 *time = _media->modified_time;
1732                 ret = MEDIA_CONTENT_ERROR_NONE;
1733         } else {
1734                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1735                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1736         }
1737
1738         return ret;
1739 }
1740
1741 int media_info_get_timeline(media_info_h media, time_t* time)
1742 {
1743         int ret = MEDIA_CONTENT_ERROR_NONE;
1744         media_info_s *_media = (media_info_s*)media;
1745         if (_media && time) {
1746                 *time = _media->timeline;
1747                 ret = MEDIA_CONTENT_ERROR_NONE;
1748         } else {
1749                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1750                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1751         }
1752
1753         return ret;
1754 }
1755
1756 int media_info_get_thumbnail_path(media_info_h media, char **path)
1757 {
1758         int ret = MEDIA_CONTENT_ERROR_NONE;
1759         media_info_s *_media = (media_info_s*)media;
1760         if (_media && path) {
1761                 if (_media->thumbnail_path != NULL) {
1762                         *path = g_strdup(_media->thumbnail_path);
1763                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1764                 } else {
1765                         *path = NULL;
1766                 }
1767                 ret = MEDIA_CONTENT_ERROR_NONE;
1768
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 int media_info_get_title(media_info_h media, char **title)
1778 {
1779         int ret = MEDIA_CONTENT_ERROR_NONE;
1780         media_info_s *_media = (media_info_s*)media;
1781
1782         if (_media && title)    { /*title can be empty string*/
1783                 if (_media->title != NULL) {
1784                         *title = g_strdup(_media->title);
1785                         media_content_retvm_if(*title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1786                 } else {
1787                         *title = NULL;
1788                 }
1789                 ret = MEDIA_CONTENT_ERROR_NONE;
1790         } else {
1791                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1792                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1793         }
1794
1795         return ret;
1796 }
1797 #ifdef _USE_TV_PROFILE
1798 int media_info_get_extract_flag(media_info_h media, int *extract_flag)
1799 {
1800         int ret = MEDIA_CONTENT_ERROR_NONE;
1801         media_info_s *_media = (media_info_s *)media;
1802
1803         if (_media && extract_flag) {
1804                 *extract_flag = _media->extract_flag;
1805                 ret = MEDIA_CONTENT_ERROR_NONE;
1806         } else {
1807                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1808                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1809         }
1810
1811         return ret;
1812 }
1813 #endif
1814
1815 int media_info_get_description(media_info_h media, char **description)
1816 {
1817         int ret = MEDIA_CONTENT_ERROR_NONE;
1818         media_info_s *_media = (media_info_s*)media;
1819
1820         if (_media && description) {
1821                 if (_media->description != NULL) {      /*description can be empty string*/
1822                         *description = g_strdup(_media->description);
1823                         media_content_retvm_if(*description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1824                 } else {
1825                         *description = NULL;
1826                 }
1827                 ret = MEDIA_CONTENT_ERROR_NONE;
1828         } else {
1829                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1830                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1831         }
1832
1833         return ret;
1834 }
1835
1836 int media_info_get_longitude(media_info_h media, double* longitude)
1837 {
1838         int ret = MEDIA_CONTENT_ERROR_NONE;
1839         media_info_s *_media = (media_info_s*)media;
1840
1841         if (_media && longitude) {
1842                 *longitude = _media->longitude;
1843                 ret = MEDIA_CONTENT_ERROR_NONE;
1844         } else {
1845                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1846                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1847         }
1848
1849         return ret;
1850 }
1851 int media_info_get_latitude(media_info_h media, double* latitude)
1852 {
1853         int ret = MEDIA_CONTENT_ERROR_NONE;
1854         media_info_s *_media = (media_info_s*)media;
1855
1856         if (_media && latitude) {
1857                 *latitude = _media->latitude;
1858                 ret = MEDIA_CONTENT_ERROR_NONE;
1859         } else {
1860                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1861                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1862         }
1863
1864         return ret;
1865 }
1866
1867 int media_info_get_altitude(media_info_h media, double *altitude)
1868 {
1869         int ret = MEDIA_CONTENT_ERROR_NONE;
1870         media_info_s *_media = (media_info_s*)media;
1871
1872         if (_media && altitude) {
1873                 *altitude = _media->altitude;
1874                 ret = MEDIA_CONTENT_ERROR_NONE;
1875         } else {
1876                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1877                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1878         }
1879
1880         return ret;
1881 }
1882
1883 int media_info_get_weather(media_info_h media, char **weather)
1884 {
1885         int ret = MEDIA_CONTENT_ERROR_NONE;
1886         media_info_s *_media = (media_info_s*)media;
1887
1888         if (_media && weather) {
1889                 if (_media->weather != NULL) {
1890                         *weather = strdup(_media->weather);
1891                         media_content_retvm_if(*weather == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1892                 } else {
1893                         *weather = NULL;
1894                 }
1895                 ret = MEDIA_CONTENT_ERROR_NONE;
1896         } else {
1897                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1898                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1899         }
1900
1901         return ret;
1902 }
1903
1904 int media_info_get_rating(media_info_h media, int *rating)
1905 {
1906         int ret = MEDIA_CONTENT_ERROR_NONE;
1907         media_info_s *_media = (media_info_s*)media;
1908
1909         if (_media && rating) {
1910                 *rating = _media->rating;
1911                 ret = MEDIA_CONTENT_ERROR_NONE;
1912         } else {
1913                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1914                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1915         }
1916
1917         return ret;
1918 }
1919
1920 int media_info_get_favorite(media_info_h media, bool* favorite)
1921 {
1922         int ret = MEDIA_CONTENT_ERROR_NONE;
1923         media_info_s *_media = (media_info_s*)media;
1924
1925         if (_media && favorite) {
1926                 *favorite = _media->favourite;
1927                 ret = MEDIA_CONTENT_ERROR_NONE;
1928         } else {
1929                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1930                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1931         }
1932
1933         return ret;
1934 }
1935
1936 int media_info_get_author(media_info_h media, char **author)
1937 {
1938         int ret = MEDIA_CONTENT_ERROR_NONE;
1939         media_info_s *_media = (media_info_s*)media;
1940
1941         if (_media && author) {
1942                 if (_media->author != NULL) {
1943                         *author = strdup(_media->author);
1944                         media_content_retvm_if(*author == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1945                 } else {
1946                         *author = NULL;
1947                 }
1948                 ret = MEDIA_CONTENT_ERROR_NONE;
1949         } else {
1950                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1951                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1952         }
1953
1954         return ret;
1955 }
1956
1957 int media_info_get_provider(media_info_h media, char **provider)
1958 {
1959         int ret = MEDIA_CONTENT_ERROR_NONE;
1960         media_info_s *_media = (media_info_s*)media;
1961
1962         if (_media && provider) {
1963                 if (_media->provider != NULL) {
1964                         *provider = strdup(_media->provider);
1965                         media_content_retvm_if(*provider == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1966                 } else {
1967                         *provider = NULL;
1968                 }
1969                 ret = MEDIA_CONTENT_ERROR_NONE;
1970         } else {
1971                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1972                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1973         }
1974
1975         return ret;
1976 }
1977
1978 int media_info_get_content_name(media_info_h media, char **content_name)
1979 {
1980         int ret = MEDIA_CONTENT_ERROR_NONE;
1981         media_info_s *_media = (media_info_s*)media;
1982
1983         if (_media && content_name) {
1984                 if (_media->content_name != NULL) {
1985                         *content_name = strdup(_media->content_name);
1986                         media_content_retvm_if(*content_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
1987                 } else {
1988                         *content_name = NULL;
1989                 }
1990                 ret = MEDIA_CONTENT_ERROR_NONE;
1991         } else {
1992                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
1993                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1994         }
1995
1996         return ret;
1997 }
1998
1999 int media_info_get_category(media_info_h media, char **category)
2000 {
2001         int ret = MEDIA_CONTENT_ERROR_NONE;
2002         media_info_s *_media = (media_info_s*)media;
2003
2004         if (_media && category) {
2005                 if (_media->category != NULL) {
2006                         *category = strdup(_media->category);
2007                         media_content_retvm_if(*category == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2008                 } else {
2009                         *category = NULL;
2010                 }
2011                 ret = MEDIA_CONTENT_ERROR_NONE;
2012         } else {
2013                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2014                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2015         }
2016
2017         return ret;
2018 }
2019
2020 int media_info_get_location_tag(media_info_h media, char **location_tag)
2021 {
2022         int ret = MEDIA_CONTENT_ERROR_NONE;
2023         media_info_s *_media = (media_info_s*)media;
2024
2025         if (_media && location_tag) {
2026                 if (_media->location_tag != NULL) {
2027                         *location_tag = strdup(_media->location_tag);
2028                         media_content_retvm_if(*location_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2029                 } else {
2030                         *location_tag = NULL;
2031                 }
2032                 ret = MEDIA_CONTENT_ERROR_NONE;
2033         } else {
2034                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2035                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2036         }
2037
2038         return ret;
2039 }
2040
2041 int media_info_get_age_rating(media_info_h media, char **age_rating)
2042 {
2043         int ret = MEDIA_CONTENT_ERROR_NONE;
2044         media_info_s *_media = (media_info_s*)media;
2045
2046         if (_media && age_rating) {
2047                 if (_media->age_rating != NULL) {
2048                         *age_rating = strdup(_media->age_rating);
2049                         media_content_retvm_if(*age_rating == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2050                 } else {
2051                         *age_rating = NULL;
2052                 }
2053                 ret = MEDIA_CONTENT_ERROR_NONE;
2054         } else {
2055                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2056                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2057         }
2058
2059         return ret;
2060 }
2061
2062 int media_info_get_keyword(media_info_h media, char **keyword)
2063 {
2064         int ret = MEDIA_CONTENT_ERROR_NONE;
2065         media_info_s *_media = (media_info_s*)media;
2066
2067         if (_media && keyword) {
2068                 if (_media->keyword != NULL) {
2069                         *keyword = strdup(_media->keyword);
2070                         media_content_retvm_if(*keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2071                 } else {
2072                         *keyword = NULL;
2073                 }
2074                 ret = MEDIA_CONTENT_ERROR_NONE;
2075         } else {
2076                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2077                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2078         }
2079
2080         return ret;
2081 }
2082
2083 int media_info_get_storage_id(media_info_h media, char **storage_id)
2084 {
2085         int ret = MEDIA_CONTENT_ERROR_NONE;
2086         media_info_s *_media = (media_info_s*)media;
2087
2088         if (_media && storage_id) {
2089                 if (STRING_VALID(_media->storage_uuid)) {
2090                         *storage_id = strdup(_media->storage_uuid);
2091                         media_content_retvm_if(*storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2092                 } else {
2093                         *storage_id = NULL;
2094                         ret = MEDIA_CONTENT_ERROR_DB_FAILED;
2095                 }
2096                 ret = MEDIA_CONTENT_ERROR_NONE;
2097         } else {
2098                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2099                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2100         }
2101
2102         return ret;
2103 }
2104
2105 int media_info_is_drm(media_info_h media, bool *is_drm)
2106 {
2107         int ret = MEDIA_CONTENT_ERROR_NONE;
2108         media_info_s *_media = (media_info_s*)media;
2109
2110         if (_media) {
2111                 *is_drm = _media->is_drm;
2112                 ret = MEDIA_CONTENT_ERROR_NONE;
2113         } else {
2114                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2115                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2116         }
2117
2118         return ret;
2119 }
2120
2121 int media_info_is_360_content(media_info_h media, bool *is_360)
2122 {
2123         int ret = MEDIA_CONTENT_ERROR_NONE;
2124         media_info_s *_media = (media_info_s*)media;
2125
2126         if (_media) {
2127                 *is_360 = _media->is_360;
2128                 ret = MEDIA_CONTENT_ERROR_NONE;
2129         } else {
2130                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2131                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2132         }
2133
2134         return ret;
2135 }
2136
2137 #ifdef _USE_TV_PROFILE
2138 int media_info_get_stitched_state(media_info_h media, int *stitched_info)
2139 {
2140         int ret = MEDIA_CONTENT_ERROR_NONE;
2141         media_info_s *_media = (media_info_s*)media;
2142
2143         if (_media) {
2144                 *stitched_info = (_media->stitched_info & 0xFFFF0000) >> 16;
2145                 ret = MEDIA_CONTENT_ERROR_NONE;
2146         } else {
2147                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2148                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2149         }
2150
2151         return ret;
2152 }
2153
2154 int media_info_get_stitched_engine(media_info_h media, int *stitched_info)
2155 {
2156         int ret = MEDIA_CONTENT_ERROR_NONE;
2157         media_info_s *_media = (media_info_s*)media;
2158
2159         if (_media) {
2160                 *stitched_info = _media->stitched_info & 0x0000FFFF;
2161                 ret = MEDIA_CONTENT_ERROR_NONE;
2162         } else {
2163                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2164                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2165         }
2166
2167         return ret;
2168 }
2169 #endif
2170
2171 int media_info_get_storage_type(media_info_h media, media_content_storage_e *storage_type)
2172 {
2173         int ret = MEDIA_CONTENT_ERROR_NONE;
2174         media_info_s *_media = (media_info_s*)media;
2175
2176         if (_media && storage_type) {
2177                 *storage_type = _media->storage_type;
2178                 ret = MEDIA_CONTENT_ERROR_NONE;
2179         } else {
2180                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2181                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2182         }
2183
2184         return ret;
2185 }
2186
2187 #ifdef _USE_TV_PROFILE
2188 int media_info_get_played_position(media_info_h media, int *played_position)
2189 {
2190         int ret = MEDIA_CONTENT_ERROR_NONE;
2191         media_info_s *_media = (media_info_s*)media;
2192
2193         if (_media) {
2194                 *played_position = _media->played_position;
2195                 ret = MEDIA_CONTENT_ERROR_NONE;
2196         } else {
2197                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2198                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2199         }
2200
2201         return ret;
2202 }
2203 #endif
2204
2205 int media_info_get_played_count(media_info_h media, int *played_count)
2206 {
2207         int ret = MEDIA_CONTENT_ERROR_NONE;
2208         media_info_s *_media = (media_info_s*)media;
2209
2210         if (_media) {
2211                 *played_count = _media->played_count;
2212                 ret = MEDIA_CONTENT_ERROR_NONE;
2213         } else {
2214                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2215                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2216         }
2217
2218         return ret;
2219 }
2220
2221 int media_info_get_played_time(media_info_h media, time_t* played_time)
2222 {
2223         int ret = MEDIA_CONTENT_ERROR_NONE;
2224         media_info_s *_media = (media_info_s*)media;
2225
2226         if (_media) {
2227                 *played_time = _media->played_time;
2228                 ret = MEDIA_CONTENT_ERROR_NONE;
2229         } else {
2230                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2231                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2232         }
2233
2234         return ret;
2235 }
2236
2237 int media_info_increase_played_count(media_info_h media)
2238 {
2239         int ret = MEDIA_CONTENT_ERROR_NONE;
2240
2241         media_info_s *_media = (media_info_s*)media;
2242
2243         if (_media) {
2244                 _media->played_count += 1;
2245         } else {
2246                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2247                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2248         }
2249
2250         return ret;
2251 }
2252
2253 #ifdef _USE_TV_PROFILE
2254 int media_info_get_modified_month(media_info_h media, char **modified_month)
2255 {
2256         int ret = MEDIA_CONTENT_ERROR_NONE;
2257         media_info_s *_media = (media_info_s*)media;
2258
2259         if (_media && modified_month) {
2260                 if (STRING_VALID(_media->modified_month)) {
2261                         *modified_month = strdup(_media->modified_month);
2262                         if (*modified_month == NULL) {
2263                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
2264                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2265                         }
2266                 } else {
2267                         *modified_month = NULL;
2268                 }
2269                 ret = MEDIA_CONTENT_ERROR_NONE;
2270         } else {
2271                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2272                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2273         }
2274
2275         return ret;
2276 }
2277 #endif
2278 #ifdef _USE_SENIOR_MODE
2279 int media_info_get_contact(media_info_h media, char **contact)
2280 {
2281         int ret = MEDIA_CONTENT_ERROR_NONE;
2282         media_info_s *_media = (media_info_s*)media;
2283
2284         if (_media && contact) {
2285                 if (STRING_VALID(_media->contact)) {
2286                         *contact = strdup(_media->contact);
2287                         if (*contact == NULL) {
2288                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
2289                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2290                         }
2291                 } else {
2292                         *contact = NULL;
2293                 }
2294                 ret = MEDIA_CONTENT_ERROR_NONE;
2295         } else {
2296                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2297                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2298         }
2299
2300         return ret;
2301 }
2302
2303 int media_info_get_app_data(media_info_h media, char **app_data)
2304 {
2305         int ret = MEDIA_CONTENT_ERROR_NONE;
2306         media_info_s *_media = (media_info_s*)media;
2307
2308         if (_media && app_data) {
2309                 if (STRING_VALID(_media->app_data)) {
2310                         *app_data = strdup(_media->app_data);
2311                         if (*app_data == NULL) {
2312                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
2313                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2314                         }
2315                 } else {
2316                         *app_data = NULL;
2317                 }
2318                 ret = MEDIA_CONTENT_ERROR_NONE;
2319         } else {
2320                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2321                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2322         }
2323
2324         return ret;
2325 }
2326 #endif
2327 #ifdef _USE_TV_PROFILE
2328 int media_info_set_played_count(media_info_h media, int played_count)
2329 {
2330         int ret = MEDIA_CONTENT_ERROR_NONE;
2331
2332         media_info_s *_media = (media_info_s*)media;
2333
2334         if (_media) {
2335                 _media->played_count = played_count;
2336         } else {
2337                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2338                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2339         }
2340
2341         return ret;
2342 }
2343 #endif
2344
2345 int media_info_set_played_time(media_info_h media)
2346 {
2347         int ret = MEDIA_CONTENT_ERROR_NONE;
2348         time_t current_time;
2349
2350         media_info_s *_media = (media_info_s*)media;
2351
2352         if (_media != NULL) {
2353                 time(&current_time);
2354                 _media->played_time = current_time;
2355         } else {
2356                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2357                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2358         }
2359
2360         return ret;
2361 }
2362 #ifdef _USE_TV_PROFILE
2363 int media_info_set_played_position(media_info_h media, int played_position)
2364 {
2365         int ret = MEDIA_CONTENT_ERROR_NONE;
2366         media_info_s *_media = (media_info_s*)media;
2367
2368         if ((_media != NULL) && (played_position >= 0)) {
2369                 _media->played_position = played_position;
2370         } else {
2371                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2372                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2373         }
2374
2375         return ret;
2376 }
2377 #endif
2378
2379 int media_info_get_media_from_db(const char *media_id, media_info_h *media)
2380 {
2381         int ret = MEDIA_CONTENT_ERROR_NONE;
2382         char select_query[DEFAULT_QUERY_SIZE];
2383         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
2384         sqlite3_stmt *stmt = NULL;
2385
2386         if (!STRING_VALID(media_id) || (media == NULL)) {
2387                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2388                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2389         }
2390
2391         memset(select_query, 0x00, sizeof(select_query));
2392         memset(storage_id, 0x00, sizeof(storage_id));
2393
2394         ret = _media_db_get_storage_id_by_media_id(media_id, storage_id);
2395         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
2396
2397         snprintf(select_query, sizeof(select_query), SELECT_MEDIA_FROM_MEDIA, storage_id, media_id);
2398
2399         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
2400         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
2401
2402         media_info_s *_media = NULL;
2403
2404         while (sqlite3_step(stmt) == SQLITE_ROW) {
2405                 if (_media)
2406                         media_info_destroy((media_info_h)_media);
2407
2408                 _media = (media_info_s*)calloc(1, sizeof(media_info_s));
2409
2410                 if (_media == NULL) {
2411                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
2412                         SQLITE3_FINALIZE(stmt);
2413                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
2414                 }
2415
2416                 _media_info_item_get_detail(stmt, (media_info_h)_media);
2417
2418                 *media = (media_info_h)_media;
2419         }
2420
2421         SQLITE3_FINALIZE(stmt);
2422
2423         return ret;
2424 }
2425
2426 int media_info_set_display_name(media_info_h media, const char *display_name)
2427 {
2428         int ret = MEDIA_CONTENT_ERROR_NONE;
2429         media_info_s *_media = (media_info_s*)media;
2430
2431         if (_media != NULL && STRING_VALID(display_name)) {
2432                 SAFE_FREE(_media->display_name);
2433
2434                 _media->display_name = strdup(display_name);
2435                 media_content_retvm_if(_media->display_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2436         } else {
2437                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2438                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2439         }
2440
2441         return ret;
2442 }
2443
2444 int media_info_set_description(media_info_h media, const char *description)
2445 {
2446         int ret = MEDIA_CONTENT_ERROR_NONE;
2447         media_info_s *_media = (media_info_s*)media;
2448
2449         if (_media != NULL) {
2450                 SAFE_FREE(_media->description);
2451
2452                 if (STRING_VALID(description)) {
2453                         _media->description = strdup(description);
2454                         media_content_retvm_if(_media->description == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2455                 } else {
2456                         _media->description = NULL;
2457                 }
2458         } else {
2459                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2460                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2461         }
2462
2463         return ret;
2464 }
2465
2466 int media_info_set_longitude(media_info_h media, double longitude)
2467 {
2468         int ret = MEDIA_CONTENT_ERROR_NONE;
2469         media_info_s *_media = (media_info_s*)media;
2470
2471         if (_media != NULL) {
2472                 _media->longitude = longitude;
2473         } else {
2474                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2475                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2476         }
2477
2478         return ret;
2479 }
2480
2481 int media_info_set_latitude(media_info_h media, double latitude)
2482 {
2483         int ret = MEDIA_CONTENT_ERROR_NONE;
2484         media_info_s *_media = (media_info_s*)media;
2485
2486         if (_media != NULL) {
2487                 _media->latitude = latitude;
2488         } else {
2489                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2490                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2491         }
2492
2493         return ret;
2494 }
2495
2496 int media_info_set_altitude(media_info_h media, double altitude)
2497 {
2498         int ret = MEDIA_CONTENT_ERROR_NONE;
2499         media_info_s *_media = (media_info_s*)media;
2500
2501         if (_media != NULL) {
2502                 _media->altitude = altitude;
2503         } else {
2504                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2505                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2506         }
2507
2508         return ret;
2509 }
2510
2511 int media_info_set_weather(media_info_h media, const char *weather)
2512 {
2513         int ret = MEDIA_CONTENT_ERROR_NONE;
2514         media_info_s *_media = (media_info_s*)media;
2515
2516         if (_media != NULL) {
2517                 SAFE_FREE(_media->weather);
2518
2519                 if (STRING_VALID(weather)) {
2520                         _media->weather = strdup(weather);
2521                         media_content_retvm_if(_media->weather == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2522                 } else {
2523                         _media->weather = NULL;
2524                 }
2525         } else {
2526                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2527                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2528         }
2529
2530         return ret;
2531 }
2532
2533 int media_info_set_rating(media_info_h media, int rating)
2534 {
2535         int ret = MEDIA_CONTENT_ERROR_NONE;
2536         media_info_s *_media = (media_info_s*)media;
2537
2538         if (_media != NULL) {
2539                 _media->rating = rating;
2540         } else {
2541                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2542                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2543         }
2544
2545         return ret;
2546 }
2547
2548 int media_info_set_added_time(media_info_h media, time_t added_time)
2549 {
2550         int ret = MEDIA_CONTENT_ERROR_NONE;
2551
2552         media_info_s *_media = (media_info_s*)media;
2553
2554         if ((_media != NULL) && (added_time >= 0)) {
2555                 _media->added_time = added_time;
2556         } else {
2557                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2558                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2559         }
2560
2561         return ret;
2562 }
2563
2564 int media_info_set_favorite(media_info_h media, bool favorite)
2565 {
2566         int ret = MEDIA_CONTENT_ERROR_NONE;
2567         media_info_s *_media = (media_info_s*)media;
2568
2569         if (_media != NULL) {
2570                 if (favorite == TRUE)
2571                         time(&_media->favourite);
2572                 else
2573                         _media->favourite = 0;
2574         } else {
2575                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2576                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2577         }
2578
2579         return ret;
2580 }
2581
2582 int media_info_set_author(media_info_h media, const char *author)
2583 {
2584         int ret = MEDIA_CONTENT_ERROR_NONE;
2585         media_info_s *_media = (media_info_s*)media;
2586
2587         if (_media != NULL) {
2588                 if (STRING_VALID(author)) {
2589                         _media->author = strdup(author);
2590                         media_content_retvm_if(_media->author == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2591                 } else {
2592                         _media->author = NULL;
2593                 }
2594         } else {
2595                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2596                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2597         }
2598
2599         return ret;
2600 }
2601
2602 int media_info_set_provider(media_info_h media, const char *provider)
2603 {
2604         int ret = MEDIA_CONTENT_ERROR_NONE;
2605         media_info_s *_media = (media_info_s*)media;
2606
2607         if (_media != NULL) {
2608                 SAFE_FREE(_media->provider);
2609
2610                 if (STRING_VALID(provider)) {
2611                         _media->provider = strdup(provider);
2612                         media_content_retvm_if(_media->provider == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2613                 } else {
2614                         _media->provider = NULL;
2615                 }
2616         } else {
2617                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2618                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2619         }
2620
2621         return ret;
2622 }
2623
2624 int media_info_set_content_name(media_info_h media, const char *content_name)
2625 {
2626         int ret = MEDIA_CONTENT_ERROR_NONE;
2627         media_info_s *_media = (media_info_s*)media;
2628
2629         if (_media != NULL) {
2630                 SAFE_FREE(_media->content_name);
2631
2632                 if (STRING_VALID(content_name)) {
2633                         _media->content_name = strdup(content_name);
2634                         media_content_retvm_if(_media->content_name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2635                 } else {
2636                         _media->content_name = NULL;
2637                 }
2638         } else {
2639                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2640                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2641         }
2642
2643         return ret;
2644 }
2645
2646 int media_info_set_category(media_info_h media, const char *category)
2647 {
2648         int ret = MEDIA_CONTENT_ERROR_NONE;
2649         media_info_s *_media = (media_info_s*)media;
2650
2651         if (_media != NULL) {
2652                 SAFE_FREE(_media->category);
2653
2654                 if (STRING_VALID(category)) {
2655                         _media->category = strdup(category);
2656                         media_content_retvm_if(_media->category == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2657                 } else {
2658                         _media->category = NULL;
2659                 }
2660         } else {
2661                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2662                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2663         }
2664
2665         return ret;
2666 }
2667
2668 int media_info_set_location_tag(media_info_h media, const char *location_tag)
2669 {
2670         int ret = MEDIA_CONTENT_ERROR_NONE;
2671         media_info_s *_media = (media_info_s*)media;
2672
2673         if (_media != NULL) {
2674                 SAFE_FREE(_media->location_tag);
2675
2676                 if (STRING_VALID(location_tag)) {
2677                         _media->location_tag = strdup(location_tag);
2678                         media_content_retvm_if(_media->location_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2679                 } else {
2680                         _media->location_tag = NULL;
2681                 }
2682         } else {
2683                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2684                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2685         }
2686
2687         return ret;
2688 }
2689
2690 int media_info_set_age_rating(media_info_h media, const char *age_rating)
2691 {
2692         int ret = MEDIA_CONTENT_ERROR_NONE;
2693         media_info_s *_media = (media_info_s*)media;
2694
2695         if (_media != NULL) {
2696                 SAFE_FREE(_media->age_rating);
2697
2698                 if (STRING_VALID(age_rating)) {
2699                         _media->age_rating = strdup(age_rating);
2700                         media_content_retvm_if(_media->age_rating == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2701                 } else {
2702                         _media->age_rating = NULL;
2703                 }
2704         } else {
2705                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2706                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2707         }
2708
2709         return ret;
2710 }
2711
2712 int media_info_set_keyword(media_info_h media, const char *keyword)
2713 {
2714         int ret = MEDIA_CONTENT_ERROR_NONE;
2715         media_info_s *_media = (media_info_s*)media;
2716
2717         if (_media != NULL) {
2718                 SAFE_FREE(_media->keyword);
2719
2720                 if (STRING_VALID(keyword)) {
2721                         _media->keyword = strdup(keyword);
2722                         media_content_retvm_if(_media->keyword == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
2723                 } else {
2724                         _media->keyword = NULL;
2725                 }
2726         } else {
2727                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2728                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2729         }
2730
2731         return ret;
2732 }
2733
2734 int media_info_update_to_db(media_info_h media)
2735 {
2736         int ret = MEDIA_CONTENT_ERROR_NONE;
2737         media_info_s *_media = (media_info_s*)media;
2738         char *set_sql = NULL;
2739         char *sql = NULL;
2740
2741         if (_media != NULL && STRING_VALID(_media->media_id)) {
2742                 /* This sql is due to sqlite3_mprintf's wrong operation when using floating point in the text format */
2743                 /* This code will be removed when sqlite3_mprintf works clearly */
2744                 char *test_sql = sqlite3_mprintf("%f, %f, %f", _media->longitude, _media->latitude, _media->altitude);
2745                 SQLITE3_SAFE_FREE(test_sql);
2746
2747                 /*Update Pinyin If Support Pinyin*/
2748                 char *file_name_pinyin = NULL;
2749                 char *description_pinyin = NULL;
2750                 char *author_pinyin = NULL;
2751                 char *provider_pinyin = NULL;
2752                 char *content_name_pinyin = NULL;
2753                 char *category_pinyin = NULL;
2754                 char *location_tag_pinyin = NULL;
2755                 char *age_rating_pinyin = NULL;
2756                 char *keyword_pinyin = NULL;
2757                 bool pinyin_support = FALSE;
2758
2759                 /*Update Pinyin If Support Pinyin*/
2760                 media_svc_check_pinyin_support(&pinyin_support);
2761                 if (pinyin_support) {
2762                         if (STRING_VALID(_media->display_name))
2763                                 media_svc_get_pinyin(_media->display_name, &file_name_pinyin);
2764                         if (STRING_VALID(_media->description))
2765                                 media_svc_get_pinyin(_media->description, &description_pinyin);
2766                         if (STRING_VALID(_media->author))
2767                                 media_svc_get_pinyin(_media->author, &author_pinyin);
2768                         if (STRING_VALID(_media->provider))
2769                                 media_svc_get_pinyin(_media->provider, &provider_pinyin);
2770                         if (STRING_VALID(_media->content_name))
2771                                 media_svc_get_pinyin(_media->content_name, &content_name_pinyin);
2772                         if (STRING_VALID(_media->category))
2773                                 media_svc_get_pinyin(_media->category, &category_pinyin);
2774                         if (STRING_VALID(_media->location_tag))
2775                                 media_svc_get_pinyin(_media->location_tag, &location_tag_pinyin);
2776                         if (STRING_VALID(_media->age_rating))
2777                                 media_svc_get_pinyin(_media->age_rating, &age_rating_pinyin);
2778                         if (STRING_VALID(_media->keyword))
2779                                 media_svc_get_pinyin(_media->keyword, &keyword_pinyin);
2780                 }
2781
2782                 char *album = NULL;
2783                 char *artist = NULL;
2784                 char *genre = NULL;
2785                 char *recorded_date = NULL;
2786
2787                 if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
2788                         if (_media->video_meta->album != NULL)
2789                                 album = strdup(_media->video_meta->album);
2790                         if (_media->video_meta->artist != NULL)
2791                                 artist = strdup(_media->video_meta->artist);
2792                         if (_media->video_meta->genre != NULL)
2793                                 genre = strdup(_media->video_meta->genre);
2794                         if (_media->video_meta->recorded_date != NULL)
2795                                 recorded_date = strdup(_media->video_meta->recorded_date);
2796                 } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
2797                         if (_media->audio_meta->album != NULL)
2798                                 album = strdup(_media->audio_meta->album);
2799                         if (_media->audio_meta->artist != NULL)
2800                                 artist = strdup(_media->audio_meta->artist);
2801                         if (_media->audio_meta->genre != NULL)
2802                                 genre = strdup(_media->audio_meta->genre);
2803                         if (_media->audio_meta->recorded_date != NULL)
2804                                 recorded_date = strdup(_media->audio_meta->recorded_date);
2805                 }
2806
2807 #ifdef _USE_SENIOR_MODE
2808                 if (_media_content_is_support_senior_mode()) {
2809                         set_sql = sqlite3_mprintf("file_name=%Q, added_time=%d, description=%Q, longitude=%f, latitude=%f, altitude=%f, \
2810                                 played_count=%d, last_played_time=%d, last_played_position=%d, \
2811                                 rating=%d, favourite=%d, author=%Q, provider=%Q, content_name=%Q, category=%Q, location_tag=%Q, age_rating=%Q, keyword=%Q, weather=%Q, sync_status=%d, \
2812                                 file_name_pinyin=%Q, description_pinyin=%Q, author_pinyin=%Q, provider_pinyin=%Q, content_name_pinyin=%Q, category_pinyin=%Q, location_tag_pinyin=%Q, age_rating_pinyin=%Q, keyword_pinyin=%Q, title=%Q, contact=%Q, app_data=%Q",
2813                                 _media->display_name, _media->added_time, _media->description, _media->longitude, _media->latitude, _media->altitude, _media->played_count, _media->played_time, _media->played_position, _media->rating, _media->favourite,
2814                                 _media->author, _media->provider, _media->content_name, _media->category, _media->location_tag, _media->age_rating, _media->keyword, _media->weather, _media->sync_status,
2815                                 file_name_pinyin, description_pinyin, author_pinyin, provider_pinyin, content_name_pinyin, category_pinyin, location_tag_pinyin, age_rating_pinyin, keyword_pinyin, _media->title, _media->contact, _media->app_data);
2816                 } else
2817 #endif
2818                 {
2819                         set_sql = sqlite3_mprintf("file_name=%Q, added_time=%d, description=%Q, longitude=%f, latitude=%f, altitude=%f, \
2820                                 played_count=%d, last_played_time=%d, last_played_position=%d, \
2821                                 rating=%d, favourite=%d, author=%Q, provider=%Q, content_name=%Q, category=%Q, location_tag=%Q, age_rating=%Q, keyword=%Q, weather=%Q, sync_status=%d, \
2822                                 file_name_pinyin=%Q, description_pinyin=%Q, author_pinyin=%Q, provider_pinyin=%Q, content_name_pinyin=%Q, category_pinyin=%Q, location_tag_pinyin=%Q, age_rating_pinyin=%Q, keyword_pinyin=%Q, title=%Q, \
2823                                 album=%Q, artist=%Q, genre=%Q, recorded_date=%Q",
2824                                 _media->display_name, _media->added_time, _media->description, _media->longitude, _media->latitude, _media->altitude, _media->played_count, _media->played_time, _media->played_position, _media->rating, _media->favourite,
2825                                 _media->author, _media->provider, _media->content_name, _media->category, _media->location_tag, _media->age_rating, _media->keyword, _media->weather, _media->sync_status,
2826                                 file_name_pinyin, description_pinyin, author_pinyin, provider_pinyin, content_name_pinyin, category_pinyin, location_tag_pinyin, age_rating_pinyin, keyword_pinyin, _media->title,
2827                                 album, artist, genre, recorded_date);
2828                 }
2829
2830                 sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_uuid=%Q", _media->storage_uuid, set_sql, _media->media_id);
2831
2832                 ret = _content_query_sql(sql);
2833                 SQLITE3_SAFE_FREE(set_sql);
2834                 SQLITE3_SAFE_FREE(sql);
2835
2836                 SAFE_FREE(description_pinyin);
2837                 SAFE_FREE(author_pinyin);
2838                 SAFE_FREE(provider_pinyin);
2839                 SAFE_FREE(content_name_pinyin);
2840                 SAFE_FREE(category_pinyin);
2841                 SAFE_FREE(location_tag_pinyin);
2842                 SAFE_FREE(age_rating_pinyin);
2843                 SAFE_FREE(keyword_pinyin);
2844
2845                 SAFE_FREE(album);
2846                 SAFE_FREE(artist);
2847                 SAFE_FREE(genre);
2848                 SAFE_FREE(recorded_date);
2849
2850                 if (_media->storage_type == MEDIA_CONTENT_STORAGE_CLOUD) {
2851                         set_sql = NULL;
2852                         sql = NULL;
2853
2854                         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
2855                                 set_sql = sqlite3_mprintf("title=%Q, album=%Q, artist=%Q, genre=%Q, duration=%d, width=%d, height=%d", \
2856                                 _media->title, _media->video_meta->album, _media->video_meta->artist, _media->video_meta->genre, _media->video_meta->duration, _media->video_meta->width, _media->video_meta->height);
2857                         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
2858                                 set_sql = sqlite3_mprintf("title=%Q, album=%Q, artist=%Q, genre=%Q, duration=%d", \
2859                                 _media->title, _media->audio_meta->album, _media->audio_meta->artist, _media->audio_meta->genre, _media->audio_meta->duration);
2860                         } else if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE) {
2861                                 set_sql = sqlite3_mprintf("title=%Q, width=%d, height=%d", _media->title, _media->image_meta->width, _media->image_meta->height);
2862                         } else {
2863                                 set_sql = sqlite3_mprintf("title=%Q", _media->title);
2864                         }
2865
2866                         sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE media_uuid=%Q", _media->storage_uuid, set_sql, _media->media_id);
2867
2868                         ret = _content_query_sql(sql);
2869
2870                         SQLITE3_SAFE_FREE(set_sql);
2871                         SQLITE3_SAFE_FREE(sql);
2872                 }
2873
2874                 if (ret == MEDIA_CONTENT_ERROR_NONE) {
2875                         /* Send notification for this update */
2876                         media_content_debug("Update is successfull. Send notification for this");
2877                         if (_media->file_path && _media->mime_type)
2878                                 media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_UPDATE, _media->file_path, _media->media_type, _media->media_id, _media->mime_type);
2879                         else
2880                                 media_content_error("Can't Send Noti : path or mime type is NULL");
2881                 }
2882         } else {
2883                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2884                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2885         }
2886
2887         return ret;
2888 }
2889
2890 int media_info_refresh_metadata_to_db(const char *media_id)
2891 {
2892         int ret = MEDIA_CONTENT_ERROR_NONE;
2893         media_info_h media = NULL;
2894         char *file_path = NULL;
2895         media_content_storage_e storage_type = 0;
2896         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
2897         char repl_path[MAX_QUERY_SIZE] = {0, };
2898
2899         if (!STRING_VALID(media_id)) {
2900                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
2901                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2902         }
2903
2904         ret = media_info_get_media_from_db(media_id, &media);
2905         if (ret != MEDIA_CONTENT_ERROR_NONE) {
2906                 media_info_destroy(media);
2907                 return ret;
2908         }
2909
2910         ret = media_info_get_storage_type(media, &storage_type);
2911         if (ret != MEDIA_CONTENT_ERROR_NONE) {
2912                 media_info_destroy(media);
2913                 return ret;
2914         }
2915
2916         if (storage_type == MEDIA_CONTENT_STORAGE_CLOUD) {
2917                 media_info_destroy(media);
2918                 media_content_error("Can't refresh cloud content!!");
2919                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
2920         }
2921
2922         ret = media_info_get_file_path(media, &file_path);
2923         if (ret != MEDIA_CONTENT_ERROR_NONE) {
2924                 media_info_destroy(media);
2925                 return ret;
2926         }
2927         memset(repl_path, 0, sizeof(repl_path));
2928         ret = _media_content_replace_path(file_path, repl_path);
2929
2930         ret = _media_util_check_file_exist(repl_path);
2931         if (ret != MEDIA_CONTENT_ERROR_NONE) {
2932                 SAFE_FREE(file_path);
2933                 media_info_destroy(media);
2934                 return ret;
2935         }
2936
2937         memset(storage_id, 0x00, sizeof(storage_id));
2938         ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, tzplatform_getuid(TZ_USER_NAME));
2939         if (ret != MS_MEDIA_ERR_NONE) {
2940                 media_content_error("media_svc_get_storage_id failed : %d", ret);
2941                 SAFE_FREE(file_path);
2942                 media_info_destroy(media);
2943                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
2944         }
2945
2946         ret = media_svc_refresh_item(_content_get_db_handle(), storage_id, storage_type, repl_path, tzplatform_getuid(TZ_USER_NAME));
2947         if (ret != MS_MEDIA_ERR_NONE)
2948                 ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
2949
2950         SAFE_FREE(file_path);
2951         media_info_destroy(media);
2952
2953         return ret;
2954 }
2955
2956 int media_info_move_to_db(media_info_h media, const char* dst_path)
2957 {
2958         int ret = MEDIA_CONTENT_ERROR_NONE;
2959         bool ignore_file = FALSE;
2960         bool ignore_dir = FALSE;
2961         char *folder_path = NULL;
2962         media_svc_storage_type_e src_storage_type = 0;
2963         media_svc_storage_type_e dst_storage_type = 0;
2964         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
2965         char repl_path[MAX_QUERY_SIZE] = {0, };
2966         char org_repl_path[MAX_QUERY_SIZE] = {0, };
2967
2968         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid media");
2969         media_content_retvm_if(!STRING_VALID(dst_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid dst_path");
2970         memset(repl_path, 0, sizeof(repl_path));
2971         memset(org_repl_path, 0, sizeof(org_repl_path));
2972         ret = _media_content_replace_path(dst_path, repl_path);
2973         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
2974
2975         media_info_s *_media = (media_info_s*)media;
2976
2977         ret = _media_util_check_ignore_file(repl_path, &ignore_file);
2978         media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
2979         ret = _media_content_replace_path(_media->file_path, org_repl_path);
2980         media_content_retvm_if(!STRING_VALID(org_repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
2981
2982         ret = _media_util_check_file_exist(repl_path);
2983         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
2984
2985         folder_path = g_path_get_dirname(repl_path);
2986         ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
2987         SAFE_FREE(folder_path);
2988
2989         media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
2990
2991         ret = media_svc_get_storage_type(org_repl_path, &src_storage_type, tzplatform_getuid(TZ_USER_NAME));
2992         if (ret != MS_MEDIA_ERR_NONE) {
2993                 media_content_sec_error("media_svc_get_storage_type failed : %d", ret);
2994                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
2995         }
2996
2997         ret = media_svc_get_storage_type(repl_path, &dst_storage_type, tzplatform_getuid(TZ_USER_NAME));
2998         if (ret != MS_MEDIA_ERR_NONE) {
2999                 media_content_sec_error("media_svc_get_storage_type failed : %d", ret);
3000                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3001         }
3002
3003         memset(storage_id, 0x00, sizeof(storage_id));
3004         ret = media_svc_get_storage_id(_content_get_db_handle(), org_repl_path, storage_id, tzplatform_getuid(TZ_USER_NAME));
3005         if (ret != MS_MEDIA_ERR_NONE) {
3006                 media_content_error("media_svc_get_storage_id failed : %d", ret);
3007                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3008         }
3009
3010         ret = media_svc_move_item(_content_get_db_handle(), storage_id, src_storage_type, org_repl_path, dst_storage_type, repl_path, tzplatform_getuid(TZ_USER_NAME));
3011         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3012 }
3013
3014 int media_info_create_thumbnail(media_info_h media, media_thumbnail_completed_cb callback, void *user_data)
3015 {
3016         int ret = MEDIA_CONTENT_ERROR_NONE;
3017         static unsigned int req_id = 0;
3018         char repl_path[MAX_QUERY_SIZE] = {0, };
3019         media_info_s *_media = (media_info_s*)media;
3020
3021         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
3022                 memset(repl_path, 0, sizeof(repl_path));
3023                 ret = _media_content_replace_path(_media->file_path, repl_path);
3024                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
3025
3026                 media_thumbnail_cb_s *_thumb_cb = (media_thumbnail_cb_s*)calloc(1, sizeof(media_thumbnail_cb_s));
3027                 media_content_retvm_if(_thumb_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3028                 req_id++;
3029                 _media->request_id = req_id;
3030
3031                 _thumb_cb->handle = _media;
3032                 _thumb_cb->user_data = user_data;
3033                 _thumb_cb->thumbnail_completed_cb = callback;
3034
3035                 ret = thumbnail_request_from_db_async(_media->request_id, repl_path, (ThumbFunc)__media_info_thumbnail_completed_cb, (void *)_thumb_cb, tzplatform_getuid(TZ_USER_NAME));
3036                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
3037         } else {
3038                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3039                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3040         }
3041
3042         return ret;
3043 }
3044
3045 int media_info_cancel_thumbnail(media_info_h media)
3046 {
3047         int ret = MEDIA_CONTENT_ERROR_NONE;
3048         media_info_s *_media = (media_info_s*)media;
3049         char repl_path[MAX_QUERY_SIZE] = {0, };
3050
3051         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path) && _media->request_id > 0) {
3052                 memset(repl_path, 0, sizeof(repl_path));
3053                 ret = _media_content_replace_path(_media->file_path, repl_path);
3054                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
3055
3056                 ret = thumbnail_request_cancel_media(_media->request_id, repl_path);
3057                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
3058         } else {
3059                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3060                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3061         }
3062
3063         return ret;
3064 }
3065
3066 int media_info_start_face_detection(media_info_h media, media_face_detection_completed_cb callback, void *user_data)
3067 {
3068         int ret = MEDIA_CONTENT_ERROR_NONE;
3069         static unsigned int req_id = 0;
3070         media_info_s *_media = (media_info_s*)media;
3071         char repl_path[MAX_QUERY_SIZE] = {0, };
3072
3073         if (!__media_info_isFaceRecognition_feature_supported()) {
3074                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
3075                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
3076         }
3077
3078         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path)) {
3079                 memset(repl_path, 0, sizeof(repl_path));
3080                 ret = _media_content_replace_path(_media->file_path, repl_path);
3081                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
3082                 media_face_cb_s *_face_cb = (media_face_cb_s*)calloc(1, sizeof(media_face_cb_s));
3083                 media_content_retvm_if(_face_cb == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3084                 req_id++;
3085                 _media->face_request_id = req_id;
3086
3087                 _face_cb->handle = _media;
3088                 _face_cb->user_data = user_data;
3089                 _face_cb->face_completed_cb = callback;
3090
3091                 ret = dcm_request_extract_face_async(_media->face_request_id, repl_path, (FaceFunc)__media_info_face_completed_cb, (void *)_face_cb, tzplatform_getuid(TZ_USER_NAME));
3092                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
3093         } else {
3094                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3095                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3096         }
3097
3098         return ret;
3099 }
3100
3101 int media_info_cancel_face_detection(media_info_h media)
3102 {
3103         int ret = MEDIA_CONTENT_ERROR_NONE;
3104         media_info_s *_media = (media_info_s*)media;
3105         char repl_path[MAX_QUERY_SIZE] = {0, };
3106
3107         if (!__media_info_isFaceRecognition_feature_supported()) {
3108                 media_content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
3109                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
3110         }
3111
3112         if (_media != NULL && STRING_VALID(_media->media_id) && STRING_VALID(_media->file_path) && _media->face_request_id > 0) {
3113                 memset(repl_path, 0, sizeof(repl_path));
3114                 ret = _media_content_replace_path(_media->file_path, repl_path);
3115                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
3116                 ret = dcm_request_cancel_face(_media->face_request_id, repl_path);
3117                 ret = _content_error_capi(MEDIA_THUMBNAIL_TYPE, ret);
3118         } else {
3119                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3120                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3121         }
3122
3123         return ret;
3124 }
3125
3126 static int __media_info_map_data_usr_to_svc(media_info_s *media, media_svc_content_info_s **service_content, media_content_storage_e storage_type)
3127 {
3128         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid handle");
3129 #ifndef _USE_TV_PROFILE
3130         char repl_path[MAX_QUERY_SIZE] = {0, };
3131         char *tmp_path = NULL;
3132 #endif
3133
3134         media_svc_content_info_s *svc_content_info = calloc(1, sizeof(media_svc_content_info_s));
3135         media_content_retvm_if(svc_content_info == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3136
3137 #ifdef _USE_TV_PROFILE
3138         svc_content_info->path = g_strdup(media->file_path);
3139 #else
3140         memset(repl_path, 0, sizeof(repl_path));
3141         tmp_path = g_strdup(media->file_path);
3142         _media_content_replace_path(tmp_path, repl_path);
3143         svc_content_info->path = g_strdup(repl_path);
3144         SAFE_FREE(tmp_path);
3145 #endif
3146         svc_content_info->file_name = g_strdup(media->display_name);
3147         svc_content_info->media_type = media->media_type;
3148         svc_content_info->mime_type = g_strdup(media->mime_type);
3149         svc_content_info->size = media->size;
3150         svc_content_info->storage_type = storage_type;
3151         svc_content_info->storage_uuid = g_strdup(media->storage_uuid);
3152
3153         svc_content_info->added_time = media->added_time;
3154         svc_content_info->modified_time = media->modified_time;
3155         svc_content_info->thumbnail_path = g_strdup(media->thumbnail_path);
3156         svc_content_info->is_drm = media->is_drm;
3157         svc_content_info->last_played_time = media->played_time;
3158         svc_content_info->played_count = media->played_count;
3159         svc_content_info->favourate = media->favourite;
3160
3161 #ifdef _USE_SENIOR_MODE
3162         if (_media_content_is_support_senior_mode()) {
3163                 svc_content_info->contact = g_strdup(media->contact);
3164                 svc_content_info->app_data = g_strdup(media->app_data);
3165         }
3166 #endif
3167
3168         svc_content_info->media_meta.title = g_strdup(media->title);
3169         svc_content_info->media_meta.rating = media->rating;
3170         svc_content_info->media_meta.description = g_strdup(media->description);
3171         svc_content_info->media_meta.longitude = media->longitude;
3172         svc_content_info->media_meta.latitude = media->latitude;
3173         svc_content_info->media_meta.altitude = media->altitude;
3174         svc_content_info->media_meta.weather = g_strdup(media->weather);
3175         svc_content_info->media_meta.category = g_strdup(media->category);
3176         svc_content_info->media_meta.keyword = g_strdup(media->keyword);
3177         svc_content_info->media_meta.location_tag = g_strdup(media->location_tag);
3178         svc_content_info->media_meta.content_name = g_strdup(media->content_name);
3179         svc_content_info->media_meta.age_rating = g_strdup(media->age_rating);
3180         svc_content_info->media_meta.author = g_strdup(media->author);
3181         svc_content_info->media_meta.provider = g_strdup(media->provider);
3182
3183         svc_content_info->media_meta.album = g_strdup(media->audio_meta->album);
3184         svc_content_info->media_meta.artist = g_strdup(media->audio_meta->artist);
3185         svc_content_info->media_meta.genre = g_strdup(media->audio_meta->genre);
3186         svc_content_info->media_meta.recorded_date = g_strdup(media->audio_meta->recorded_date);
3187
3188         if (storage_type == MEDIA_CONTENT_STORAGE_CLOUD) {
3189                 switch (media->media_type) {
3190                 case MEDIA_CONTENT_TYPE_IMAGE:
3191                         svc_content_info->media_meta.width = media->image_meta->width;
3192                         svc_content_info->media_meta.height = media->image_meta->height;
3193                         svc_content_info->media_meta.datetaken = g_strdup(media->image_meta->date_taken);
3194                         svc_content_info->media_meta.orientation = media->image_meta->orientation;
3195                         break;
3196                 case MEDIA_CONTENT_TYPE_VIDEO:
3197                         svc_content_info->media_meta.album_artist = g_strdup(media->audio_meta->album_artist);
3198                         svc_content_info->media_meta.composer = g_strdup(media->audio_meta->composer);
3199                         svc_content_info->media_meta.year = g_strdup(media->audio_meta->year);
3200                         svc_content_info->media_meta.copyright = g_strdup(media->audio_meta->copyright);
3201                         svc_content_info->media_meta.track_num = g_strdup(media->audio_meta->track_num);
3202                         svc_content_info->media_meta.bitrate = media->audio_meta->bitrate;
3203                         svc_content_info->media_meta.duration = media->audio_meta->duration;
3204                         svc_content_info->media_meta.width = media->image_meta->width;
3205                         svc_content_info->media_meta.height = media->image_meta->height;
3206                         break;
3207                 case MEDIA_CONTENT_TYPE_SOUND:
3208                 case MEDIA_CONTENT_TYPE_MUSIC:
3209                         svc_content_info->media_meta.album_artist = g_strdup(media->audio_meta->album_artist);
3210                         svc_content_info->media_meta.composer = g_strdup(media->audio_meta->composer);
3211                         svc_content_info->media_meta.year = g_strdup(media->audio_meta->year);
3212                         svc_content_info->media_meta.copyright = g_strdup(media->audio_meta->copyright);
3213                         svc_content_info->media_meta.track_num = g_strdup(media->audio_meta->track_num);
3214                         svc_content_info->media_meta.bitrate = media->audio_meta->bitrate;
3215                         svc_content_info->media_meta.duration = media->audio_meta->duration;
3216                         svc_content_info->media_meta.channel = media->audio_meta->channel;
3217                         svc_content_info->media_meta.samplerate = media->audio_meta->samplerate;
3218                         break;
3219                 case MEDIA_CONTENT_TYPE_OTHERS:
3220                 default:
3221                         break;
3222                 }
3223         }
3224
3225         *service_content = svc_content_info;
3226
3227         return MEDIA_CONTENT_ERROR_NONE;
3228 }
3229
3230 static int __media_info_set_str_data(media_info_h media, media_info_item_e data_type, const char *str_data)
3231 {
3232         media_info_s *_media = (media_info_s*)media;
3233
3234         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3235
3236         switch (data_type) {
3237         case MEDIA_INFO_PATH:
3238                 SAFE_FREE(_media->file_path);
3239                 if (STRING_VALID(str_data)) {
3240                         _media->file_path = strdup(str_data);
3241                         media_content_retvm_if(_media->file_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3242                 } else {
3243                         _media->file_path = NULL;
3244                 }
3245                 break;
3246         case MEDIA_INFO_MIME_TYPE:
3247                 SAFE_FREE(_media->mime_type);
3248                 if (STRING_VALID(str_data)) {
3249                         _media->mime_type = strdup(str_data);
3250                         media_content_retvm_if(_media->mime_type == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3251                 } else {
3252                         _media->mime_type = NULL;
3253                 }
3254                 break;
3255         case MEDIA_INFO_THUMBNAIL_PATH:
3256                 SAFE_FREE(_media->thumbnail_path);
3257                 if (STRING_VALID(str_data)) {
3258                         _media->thumbnail_path = strdup(str_data);
3259                         media_content_retvm_if(_media->thumbnail_path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3260                 } else {
3261                         _media->thumbnail_path = NULL;
3262                 }
3263                 break;
3264         case MEDIA_INFO_TITLE:
3265                 SAFE_FREE(_media->title);
3266                 if (STRING_VALID(str_data)) {
3267                         _media->title = strdup(str_data);
3268                         media_content_retvm_if(_media->title == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3269                 } else {
3270                         _media->title = NULL;
3271                 }
3272                 break;
3273         case MEDIA_INFO_STORAGE_UUID:
3274                 SAFE_FREE(_media->storage_uuid);
3275                 if (STRING_VALID(str_data)) {
3276                         _media->storage_uuid = strdup(str_data);
3277                         media_content_retvm_if(_media->storage_uuid == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3278                 } else {
3279                         _media->storage_uuid = NULL;
3280                 }
3281                 break;
3282         case MEDIA_INFO_ALBUM:
3283                 if (STRING_VALID(_media->media_id)) {
3284                         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
3285                                 SAFE_FREE(_media->video_meta->album);
3286                                 if (str_data != NULL) {
3287                                         _media->video_meta->album = strdup(str_data);
3288                                         media_content_retvm_if(_media->video_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3289                                 }
3290                         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
3291                                 SAFE_FREE(_media->audio_meta->album);
3292                                 if (str_data != NULL) {
3293                                         _media->audio_meta->album = strdup(str_data);
3294                                         media_content_retvm_if(_media->audio_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3295                                 }
3296                         }
3297                 } else {
3298                         SAFE_FREE(_media->video_meta->album);
3299                         if (str_data != NULL) {
3300                                 _media->video_meta->album = strdup(str_data);
3301                                 media_content_retvm_if(_media->video_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3302                         }
3303
3304                         SAFE_FREE(_media->audio_meta->album);
3305                         if (str_data != NULL) {
3306                                 _media->audio_meta->album = strdup(str_data);
3307                                 media_content_retvm_if(_media->audio_meta->album == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3308                         }
3309                 }
3310                 break;
3311         case MEDIA_INFO_ARTIST:
3312                 if (STRING_VALID(_media->media_id)) {
3313                         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
3314                                 SAFE_FREE(_media->video_meta->artist);
3315                                 if (str_data != NULL) {
3316                                         _media->video_meta->artist = strdup(str_data);
3317                                         media_content_retvm_if(_media->video_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3318                                 }
3319                         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
3320                                 SAFE_FREE(_media->audio_meta->artist);
3321                                 if (str_data != NULL) {
3322                                         _media->audio_meta->artist = strdup(str_data);
3323                                         media_content_retvm_if(_media->audio_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3324                                 }
3325                         }
3326                 } else {
3327                         SAFE_FREE(_media->video_meta->artist);
3328                         if (str_data != NULL) {
3329                                 _media->video_meta->artist = strdup(str_data);
3330                                 media_content_retvm_if(_media->video_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3331                         }
3332
3333                         SAFE_FREE(_media->audio_meta->artist);
3334                         if (str_data != NULL) {
3335                                 _media->audio_meta->artist = strdup(str_data);
3336                                 media_content_retvm_if(_media->audio_meta->artist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3337                         }
3338                 }
3339                 break;
3340         case MEDIA_INFO_GENRE:
3341                 if (STRING_VALID(_media->media_id)) {
3342                         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
3343                                 SAFE_FREE(_media->video_meta->genre);
3344                                 if (str_data != NULL) {
3345                                         _media->video_meta->genre = strdup(str_data);
3346                                         media_content_retvm_if(_media->video_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3347                                 }
3348                         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
3349                                 SAFE_FREE(_media->audio_meta->genre);
3350                                 if (str_data != NULL) {
3351                                         _media->audio_meta->genre = strdup(str_data);
3352                                         media_content_retvm_if(_media->audio_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3353                                 }
3354                         }
3355                 } else {
3356                         SAFE_FREE(_media->video_meta->genre);
3357                         if (str_data != NULL) {
3358                                 _media->video_meta->genre = strdup(str_data);
3359                                 media_content_retvm_if(_media->video_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3360                         }
3361
3362                         SAFE_FREE(_media->audio_meta->genre);
3363                         if (str_data != NULL) {
3364                                 _media->audio_meta->genre = strdup(str_data);
3365                                 media_content_retvm_if(_media->audio_meta->genre == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3366                         }
3367                 }
3368                 break;
3369         case MEDIA_INFO_RECORDED_DATE:
3370                 if (STRING_VALID(_media->media_id)) {
3371                         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
3372                                 SAFE_FREE(_media->video_meta->recorded_date);
3373                                 if (str_data != NULL) {
3374                                         _media->video_meta->recorded_date = strdup(str_data);
3375                                         media_content_retvm_if(_media->video_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3376                                 }
3377                         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
3378                                 SAFE_FREE(_media->audio_meta->recorded_date);
3379                                 if (str_data != NULL) {
3380                                         _media->audio_meta->recorded_date = strdup(str_data);
3381                                         media_content_retvm_if(_media->audio_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3382                                 }
3383                         }
3384                 } else {
3385                         SAFE_FREE(_media->video_meta->recorded_date);
3386                         if (str_data != NULL) {
3387                                 _media->video_meta->recorded_date = strdup(str_data);
3388                                 media_content_retvm_if(_media->video_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3389                         }
3390
3391                         SAFE_FREE(_media->audio_meta->recorded_date);
3392                         if (str_data != NULL) {
3393                                 _media->audio_meta->recorded_date = strdup(str_data);
3394                                 media_content_retvm_if(_media->audio_meta->recorded_date == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3395                         }
3396                 }
3397                 break;
3398         default:
3399                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3400                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3401         }
3402
3403         return MEDIA_CONTENT_ERROR_NONE;
3404 }
3405
3406 static int __media_info_destroy(media_info_h media)
3407 {
3408         int ret = MEDIA_CONTENT_ERROR_NONE;
3409         media_info_s *_media = (media_info_s*)media;
3410
3411         if (_media) {
3412                 SAFE_FREE(_media->media_id);
3413                 SAFE_FREE(_media->file_path);
3414                 SAFE_FREE(_media->display_name);
3415                 SAFE_FREE(_media->mime_type);
3416                 SAFE_FREE(_media->thumbnail_path);
3417                 SAFE_FREE(_media->description);
3418                 SAFE_FREE(_media->author);
3419                 SAFE_FREE(_media->provider);
3420                 SAFE_FREE(_media->content_name);
3421                 SAFE_FREE(_media->category);
3422                 SAFE_FREE(_media->location_tag);
3423                 SAFE_FREE(_media->age_rating);
3424                 SAFE_FREE(_media->keyword);
3425                 SAFE_FREE(_media->title);
3426                 SAFE_FREE(_media->weather);
3427                 SAFE_FREE(_media->storage_uuid);
3428
3429                 if (_media->image_meta) {
3430                         SAFE_FREE(_media->image_meta->media_id);
3431                         SAFE_FREE(_media->image_meta->date_taken);
3432                         SAFE_FREE(_media->image_meta->burst_id);
3433                         SAFE_FREE(_media->image_meta->exposure_time);
3434                         SAFE_FREE(_media->image_meta->model);
3435                         SAFE_FREE(_media->image_meta->title);
3436                         SAFE_FREE(_media->image_meta->weather);
3437
3438                         SAFE_FREE(_media->image_meta);
3439                 }
3440
3441                 if (_media->video_meta) {
3442                         SAFE_FREE(_media->video_meta->media_id);
3443                         SAFE_FREE(_media->video_meta->title);
3444                         SAFE_FREE(_media->video_meta->album);
3445                         SAFE_FREE(_media->video_meta->artist);
3446                         SAFE_FREE(_media->video_meta->album_artist);
3447                         SAFE_FREE(_media->video_meta->genre);
3448                         SAFE_FREE(_media->video_meta->composer);
3449                         SAFE_FREE(_media->video_meta->year);
3450                         SAFE_FREE(_media->video_meta->recorded_date);
3451                         SAFE_FREE(_media->video_meta->copyright);
3452                         SAFE_FREE(_media->video_meta->track_num);
3453
3454                         SAFE_FREE(_media->video_meta);
3455                 }
3456
3457                 if (_media->audio_meta) {
3458                         SAFE_FREE(_media->audio_meta->media_id);
3459                         SAFE_FREE(_media->audio_meta->title);
3460                         SAFE_FREE(_media->audio_meta->album);
3461                         SAFE_FREE(_media->audio_meta->artist);
3462                         SAFE_FREE(_media->audio_meta->album_artist);
3463                         SAFE_FREE(_media->audio_meta->genre);
3464                         SAFE_FREE(_media->audio_meta->composer);
3465                         SAFE_FREE(_media->audio_meta->year);
3466                         SAFE_FREE(_media->audio_meta->recorded_date);
3467                         SAFE_FREE(_media->audio_meta->copyright);
3468                         SAFE_FREE(_media->audio_meta->track_num);
3469
3470                         SAFE_FREE(_media->audio_meta);
3471                 }
3472
3473                 ret = MEDIA_CONTENT_ERROR_NONE;
3474         } else {
3475                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
3476                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3477         }
3478
3479         return ret;
3480 }
3481
3482 int media_info_insert_to_db_with_data(media_info_h media)
3483 {
3484         int ret = MEDIA_CONTENT_ERROR_NONE;
3485         int ret_cnt = 0;
3486         char repl_path[MAX_QUERY_SIZE] = {0, };
3487
3488         media_info_s *_media = (media_info_s*)media;
3489
3490         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3491         media_content_retvm_if(!STRING_VALID(_media->file_path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid file_path");
3492         media_content_retvm_if(!STRING_VALID(_media->storage_uuid), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid storage_uuid");
3493         media_content_retvm_if(_media->storage_type < 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid storage_type [%d]", _media->storage_type);
3494
3495         /* Cloud Item should be filled whole info*/
3496         if (_media->storage_type == MEDIA_CONTENT_STORAGE_CLOUD) {
3497                 media_content_retvm_if(!STRING_VALID(_media->mime_type), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid mime_type");
3498                 media_content_retvm_if(!STRING_VALID(_media->title), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid title");
3499                 media_content_retvm_if(_media->size <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid size [%d]", _media->size);
3500                 media_content_retvm_if(_media->modified_time <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid modified_time [%d]", _media->modified_time);
3501
3502                 if ((_media->media_type < MEDIA_CONTENT_TYPE_IMAGE) || (_media->media_type > MEDIA_CONTENT_TYPE_OTHERS)) {
3503                         media_content_error("invalid media type [%d]", _media->media_type);
3504                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3505                 }
3506         }
3507
3508         media_content_sec_debug("storage[%d], path[%s], media_type[%d]", _media->storage_type, _media->file_path, _media->media_type);
3509
3510         media_svc_content_info_s *svc_content_info = NULL;
3511
3512         ret = __media_info_map_data_usr_to_svc(_media, &svc_content_info, _media->storage_type);
3513         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "__media_info_map_data_usr_to_svc fail");
3514
3515         ret = media_svc_insert_item_immediately_with_data(_content_get_db_handle(), svc_content_info, tzplatform_getuid(TZ_USER_NAME));
3516         if (ret != MS_MEDIA_ERR_NONE) {
3517                 media_content_sec_error("media_svc_insert_item_immediately_with_data failed : %d (%s)", ret, _media->file_path);
3518                 media_svc_destroy_content_info(svc_content_info);
3519                 SAFE_FREE(svc_content_info);
3520                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3521         }
3522         /*free the svc_content_info*/
3523         media_svc_destroy_content_info(svc_content_info);
3524         SAFE_FREE(svc_content_info);
3525
3526         /*Fill out the handle*/
3527         memset(repl_path, 0, sizeof(repl_path));
3528         ret = _media_content_replace_path(_media->file_path, repl_path);
3529         char *media_file_path = g_strdup(repl_path);
3530
3531         char *media_string_uuid = g_strdup(_media->storage_uuid);
3532
3533         __media_info_destroy(media);
3534 RETRY:
3535         ret = _media_info_get_media_info_from_db(media_file_path, media_string_uuid, media);
3536         if (ret != MEDIA_CONTENT_ERROR_NONE) {
3537                 media_content_error("_media_info_get_media_info_from_db fail", ret);
3538                 if (ret == MEDIA_CONTENT_ERROR_DB_FAILED && ret_cnt < 5) {
3539                         ret_cnt++;
3540                         media_content_error("RETRY GETTING DATA");
3541                         goto RETRY;
3542                 }
3543         }
3544
3545         SAFE_FREE(media_file_path);
3546         SAFE_FREE(media_string_uuid);
3547
3548         return ret;
3549 }
3550
3551 int media_info_create(const char *path, media_info_h *media)
3552 {
3553         int ret = MEDIA_CONTENT_ERROR_NONE;
3554         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
3555         media_svc_storage_type_e storage_type = 0;
3556         bool ignore_file = FALSE;
3557         char repl_path[MAX_QUERY_SIZE] = {0, };
3558
3559         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
3560         media_content_retvm_if(media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3561         memset(repl_path, 0, sizeof(repl_path));
3562         ret = _media_content_replace_path(path, repl_path);
3563         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
3564
3565         ret = _media_util_check_ignore_file(repl_path, &ignore_file);
3566         media_content_retvm_if(ignore_file == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
3567
3568         memset(storage_id, 0x00, sizeof(storage_id));
3569
3570         if (STRING_VALID(MEDIA_ROOT_PATH_CLOUD) && (strstr(repl_path, MEDIA_ROOT_PATH_CLOUD) == NULL)) {
3571                 bool ignore_dir = FALSE;
3572                 char *folder_path = NULL;
3573
3574                 ret = _media_util_check_file_exist(repl_path);
3575                 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
3576
3577                 folder_path = g_path_get_dirname(repl_path);
3578                 ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
3579                 SAFE_FREE(folder_path);
3580                 media_content_retvm_if(ignore_dir == TRUE, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid folder path");
3581
3582                 ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, tzplatform_getuid(TZ_USER_NAME));
3583                 if (ret != MS_MEDIA_ERR_NONE) {
3584                         media_content_error("media_svc_get_storage_id failed : %d", ret);
3585                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3586                 }
3587
3588                 ret = media_svc_get_storage_type(repl_path, &storage_type, tzplatform_getuid(TZ_USER_NAME));
3589                 if (ret != MS_MEDIA_ERR_NONE) {
3590                         media_content_sec_error("media_svc_get_storage_type failed : %d", ret);
3591                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
3592                 }
3593         }
3594
3595         media_info_s *_media = (media_info_s*)calloc(1, sizeof(media_info_s));
3596         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
3597
3598         _media->audio_meta = (audio_meta_s *)calloc(1, sizeof(audio_meta_s));
3599         if (_media->audio_meta == NULL) {
3600                 SAFE_FREE(_media);
3601                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
3602                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
3603         }
3604
3605         _media->video_meta = (video_meta_s *)calloc(1, sizeof(video_meta_s));
3606         if (_media->video_meta == NULL) {
3607                 SAFE_FREE(_media->audio_meta);
3608                 SAFE_FREE(_media);
3609                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
3610                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
3611         }
3612
3613         _media->image_meta = (image_meta_s *)calloc(1, sizeof(image_meta_s));
3614         if (_media->image_meta == NULL) {
3615                 SAFE_FREE(_media->audio_meta);
3616                 SAFE_FREE(_media->video_meta);
3617                 SAFE_FREE(_media);
3618                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
3619                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
3620         }
3621
3622         _media->file_path = g_strdup(path);
3623         _media->storage_type = -1;
3624         _media->media_type = 0;
3625         _media->modified_time = 0;
3626         _media->size = 0;
3627         _media->request_id = 0;
3628         _media->longitude = MEDIA_SVC_DEFAULT_GPS_VALUE;
3629         _media->latitude = MEDIA_SVC_DEFAULT_GPS_VALUE;
3630         _media->altitude = MEDIA_SVC_DEFAULT_GPS_VALUE;
3631
3632         if (STRING_VALID(storage_id)) {
3633                 _media->storage_uuid = g_strdup(storage_id);
3634                 _media->storage_type = storage_type;
3635         }
3636
3637         *media = (media_info_h)_media;
3638
3639         return ret;
3640 }
3641
3642 int media_info_set_mime_type(media_info_h media, const char *mime_type)
3643 {
3644         return __media_info_set_str_data(media, MEDIA_INFO_MIME_TYPE, mime_type);
3645 }
3646
3647 int media_info_set_title(media_info_h media, const char *title)
3648 {
3649         return __media_info_set_str_data(media, MEDIA_INFO_TITLE, title);
3650 }
3651
3652 int media_info_set_album(media_info_h media, const char *album)
3653 {
3654         return __media_info_set_str_data(media, MEDIA_INFO_ALBUM, album);
3655 }
3656
3657 int media_info_set_artist(media_info_h media, const char *artist)
3658 {
3659         return __media_info_set_str_data(media, MEDIA_INFO_ARTIST, artist);
3660 }
3661
3662 int media_info_set_genre(media_info_h media, const char *genre)
3663 {
3664         return __media_info_set_str_data(media, MEDIA_INFO_GENRE, genre);
3665 }
3666
3667 int media_info_set_recorded_date(media_info_h media, const char *recorded_date)
3668 {
3669         return __media_info_set_str_data(media, MEDIA_INFO_RECORDED_DATE, recorded_date);
3670 }
3671
3672 int media_info_set_thumbnail_path(media_info_h media, const char *thumbnail_path)
3673 {
3674         return __media_info_set_str_data(media, MEDIA_INFO_THUMBNAIL_PATH, thumbnail_path);
3675 }
3676
3677 int media_info_set_storage_id(media_info_h media, const char *storage_id)
3678 {
3679         return __media_info_set_str_data(media, MEDIA_INFO_STORAGE_UUID, storage_id);
3680 }
3681
3682 int media_info_set_size(media_info_h media, unsigned long long size)
3683 {
3684         media_info_s *_media = (media_info_s*)media;
3685
3686         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3687
3688         _media->size = size;
3689
3690         return MEDIA_CONTENT_ERROR_NONE;
3691 }
3692
3693 int media_info_set_modified_time(media_info_h media, time_t modified_time)
3694 {
3695         media_info_s *_media = (media_info_s*)media;
3696
3697         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3698
3699         _media->modified_time = modified_time;
3700
3701         return MEDIA_CONTENT_ERROR_NONE;
3702 }
3703
3704 int media_info_set_media_type(media_info_h media, media_content_type_e type)
3705 {
3706         media_info_s *_media = (media_info_s*)media;
3707
3708         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3709
3710         _media->media_type = type;
3711
3712         return MEDIA_CONTENT_ERROR_NONE;
3713 }
3714
3715 int media_info_set_duration(media_info_h media, int duration)
3716 {
3717         media_info_s *_media = (media_info_s*)media;
3718
3719         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3720
3721         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO)
3722                 _media->video_meta->duration = duration;
3723         else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND))
3724                 _media->audio_meta->duration = duration;
3725         else {
3726                 media_content_error("Invalid media type");
3727                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3728         }
3729
3730         return MEDIA_CONTENT_ERROR_NONE;
3731 }
3732
3733 int media_info_set_width(media_info_h media, int width)
3734 {
3735         media_info_s *_media = (media_info_s*)media;
3736
3737         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3738
3739         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO)
3740                 _media->video_meta->width = width;
3741         else if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE)
3742                 _media->image_meta->width = width;
3743         else {
3744                 media_content_error("Invalid media type");
3745                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3746         }
3747
3748         return MEDIA_CONTENT_ERROR_NONE;
3749 }
3750
3751 int media_info_set_height(media_info_h media, int height)
3752 {
3753         media_info_s *_media = (media_info_s*)media;
3754
3755         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3756
3757         if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO)
3758                 _media->video_meta->height = height;
3759         else if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE)
3760                 _media->image_meta->height = height;
3761         else {
3762                 media_content_error("Invalid media type");
3763                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
3764         }
3765
3766         return MEDIA_CONTENT_ERROR_NONE;
3767 }
3768
3769 int media_info_set_storage_type(media_info_h media, media_content_storage_e storage_type)
3770 {
3771         media_info_s *_media = (media_info_s*)media;
3772
3773         media_content_retvm_if(_media == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid media");
3774
3775         _media->storage_type = storage_type;
3776
3777         return MEDIA_CONTENT_ERROR_NONE;
3778 }
3779
3780 #ifdef _USE_SENIOR_MODE
3781 int media_info_set_contact(media_info_h media, const char *contact)
3782 {
3783         return __media_info_set_str_data(media, MEDIA_INFO_CONTACT, contact);
3784 }
3785
3786 int media_info_set_app_data(media_info_h media, const char *app_data)
3787 {
3788         return __media_info_set_str_data(media, MEDIA_INFO_APP_DATA, app_data);
3789 }
3790 #endif
3791