Check input parmeters
[platform/core/multimedia/libmedia-service.git] / src / common / media-svc.c
1 /*
2  * libmedia-service
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #include <string.h>
23 #include <errno.h>
24 #include "media-svc.h"
25 #include "media-svc-media.h"
26 #include "media-svc-debug.h"
27 #include "media-svc-util.h"
28 #include "media-svc-db-utils.h"
29 #include "media-svc-env.h"
30 #include "media-svc-media-folder.h"
31 #include "media-svc-album.h"
32 #include "media-svc-noti.h"
33 #include "media-svc-storage.h"
34
35 static __thread int g_media_svc_item_validity_data_cnt = 1;
36 static __thread int g_media_svc_item_validity_cur_data_cnt = 0;
37
38 static __thread int g_media_svc_insert_item_data_cnt = 1;
39 static __thread int g_media_svc_insert_item_cur_data_cnt = 0;
40
41 static __thread int g_media_svc_update_item_data_cnt = 1;
42 static __thread int g_media_svc_update_item_cur_data_cnt = 0;
43
44 static __thread int g_media_svc_insert_folder_data_cnt = 1;
45 static __thread int g_media_svc_insert_folder_cur_data_cnt = 0;
46
47 /* Flag for items to be published by notification */
48 static __thread int g_insert_with_noti = FALSE;
49
50 #define BATCH_REQUEST_MAX 300
51
52 int media_svc_cleanup_db(sqlite3 *handle, uid_t uid)
53 {
54         media_svc_debug_fenter();
55
56         return _media_svc_do_cleanup(handle, uid);
57 }
58
59 int media_svc_get_user_version(sqlite3 *handle, int *user_version)
60 {
61         return _media_svc_get_user_version(handle, user_version);
62 }
63
64 int media_svc_create_table(uid_t uid)
65 {
66         int ret = MS_MEDIA_ERR_NONE;
67         char *sql = NULL;
68
69         media_svc_debug_fenter();
70
71         ret = _media_svc_init_table_query(MEDIA_SVC_DB_TABLE_MEDIA);
72         if (ret != MS_MEDIA_ERR_NONE) {
73                 media_svc_error("_media_svc_init_table_query fail.");
74                 goto ERROR;
75         }
76
77         /*create media table*/
78         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_MEDIA, MEDIA_SVC_DB_LIST_MEDIA, uid);
79         if (ret != MS_MEDIA_ERR_NONE) {
80                 media_svc_error("_media_svc_make_table_query fail.");
81                 goto ERROR;
82         }
83
84         /*create folder table*/
85         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FOLDER, MEDIA_SVC_DB_LIST_FOLDER, uid);
86         if (ret != MS_MEDIA_ERR_NONE) {
87                 media_svc_error("_media_svc_make_table_query fail.");
88                 goto ERROR;
89         }
90
91         /*create playlist_map table*/
92         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST_MAP, MEDIA_SVC_DB_LIST_PLAYLIST_MAP, uid);
93         if (ret != MS_MEDIA_ERR_NONE) {
94                 media_svc_error("_media_svc_make_table_query fail.");
95                 goto ERROR;
96         }
97
98         /*create playlist table*/
99         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_PLAYLIST, MEDIA_SVC_DB_LIST_PLAYLIST, uid);
100         if (ret != MS_MEDIA_ERR_NONE) {
101                 media_svc_error("_media_svc_make_table_query fail.");
102                 goto ERROR;
103         }
104
105         /* create album table*/
106         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_ALBUM, MEDIA_SVC_DB_LIST_ALBUM, uid);
107         if (ret != MS_MEDIA_ERR_NONE) {
108                 media_svc_error("_media_svc_make_table_query fail.");
109                 goto ERROR;
110         }
111
112         /*create tag_map table*/
113         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG_MAP, MEDIA_SVC_DB_LIST_TAG_MAP, uid);
114         if (ret != MS_MEDIA_ERR_NONE) {
115                 media_svc_error("_media_svc_make_table_query fail.");
116                 goto ERROR;
117         }
118
119         /*create tag table*/
120         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_TAG, MEDIA_SVC_DB_LIST_TAG, uid);
121         if (ret != MS_MEDIA_ERR_NONE) {
122                 media_svc_error("_media_svc_make_table_query fail.");
123                 goto ERROR;
124         }
125
126         /*create bookmark table*/
127         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_BOOKMARK, MEDIA_SVC_DB_LIST_BOOKMARK, uid);
128         if (ret != MS_MEDIA_ERR_NONE) {
129                 media_svc_error("_media_svc_make_table_query fail.");
130                 goto ERROR;
131         }
132
133         /*create storage table from tizen 2.4 */
134         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_STORAGE, MEDIA_SVC_DB_LIST_STORAGE, uid);
135         if (ret != MS_MEDIA_ERR_NONE) {
136                 media_svc_error("_media_svc_make_table_query fail.");
137                 goto ERROR;
138         }
139
140         /*create face table. from tizen 3.0*/
141         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE_SCAN_LIST, MEDIA_SVC_DB_LIST_FACE_SCAN_LIST, uid);
142         if (ret != MS_MEDIA_ERR_NONE) {
143                 media_svc_error("_media_svc_make_table_query fail.");
144                 goto ERROR;
145         }
146
147         ret = _media_svc_make_table_query(MEDIA_SVC_DB_TABLE_FACE, MEDIA_SVC_DB_LIST_FACE, uid);
148         if (ret != MS_MEDIA_ERR_NONE) {
149                 media_svc_error("_media_svc_make_table_query fail.");
150                 goto ERROR;
151         }
152
153         sql = sqlite3_mprintf("pragma user_version = %d;", LATEST_VERSION_NUMBER);
154         ret = _media_svc_sql_query(sql, uid);
155         if (ret != MS_MEDIA_ERR_NONE) {
156                 media_svc_error("user_version update fail.");
157                 goto ERROR;
158         }
159
160         _media_svc_destroy_table_query();
161
162         media_svc_debug_fleave();
163
164         return MS_MEDIA_ERR_NONE;
165 ERROR:
166         _media_svc_destroy_table_query();
167
168         media_svc_debug_fleave();
169
170         return ret;
171 }
172
173 int media_svc_get_file_info(sqlite3 *handle, const char *storage_id, const char *path, time_t *modified_time, unsigned long long *size)
174 {
175         return _media_svc_get_fileinfo_by_path(handle, storage_id, path, modified_time, size);
176 }
177
178 int media_svc_check_item_exist_by_path(sqlite3 *handle, const char *storage_id, const char *path)
179 {
180         int ret = MS_MEDIA_ERR_NONE;
181         int count = -1;
182
183         ret = _media_svc_count_record_with_path(handle, storage_id, path, &count);
184         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
185
186         if (count > 0) {
187                 media_svc_debug("item is exist in database");
188                 return MS_MEDIA_ERR_NONE;
189         } else {
190                 media_svc_debug("item is not exist in database");
191                 return MS_MEDIA_ERR_DB_NO_RECORD;
192         }
193
194         return MS_MEDIA_ERR_NONE;
195 }
196
197 int media_svc_insert_item_begin(int data_cnt, int with_noti, int from_pid)
198 {
199         media_svc_debug("Transaction data count : [%d]", data_cnt);
200
201         media_svc_retvm_if(data_cnt < 1, MS_MEDIA_ERR_INVALID_PARAMETER, "data_cnt shuld be bigger than 1");
202
203         g_media_svc_insert_item_data_cnt = data_cnt;
204         g_media_svc_insert_item_cur_data_cnt = 0;
205
206         /* Prepare for making noti item list */
207         if (with_noti) {
208                 media_svc_debug("making noti list from pid[%d]", from_pid);
209                 if (_media_svc_create_noti_list(data_cnt) != MS_MEDIA_ERR_NONE)
210                         return MS_MEDIA_ERR_OUT_OF_MEMORY;
211
212                 _media_svc_set_noti_from_pid(from_pid);
213                 g_insert_with_noti = TRUE;
214         }
215
216         return MS_MEDIA_ERR_NONE;
217 }
218
219 int media_svc_insert_item_end(uid_t uid)
220 {
221         int ret = MS_MEDIA_ERR_NONE;
222
223         media_svc_debug_fenter();
224
225         if (g_media_svc_insert_item_cur_data_cnt > 0) {
226
227                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_ITEM, uid);
228                 if (g_insert_with_noti) {
229                         media_svc_debug("sending noti list");
230                         _media_svc_publish_noti_list(g_media_svc_insert_item_cur_data_cnt);
231                         _media_svc_destroy_noti_list(g_media_svc_insert_item_cur_data_cnt);
232                         g_insert_with_noti = FALSE;
233                         _media_svc_set_noti_from_pid(-1);
234                 }
235         }
236
237         g_media_svc_insert_item_data_cnt = 1;
238         g_media_svc_insert_item_cur_data_cnt = 0;
239
240         return ret;
241 }
242
243 int media_svc_insert_item_bulk(sqlite3 *handle, const char *storage_id, ms_user_storage_type_e storage_type, const char *path, uid_t uid)
244 {
245         int ret = MS_MEDIA_ERR_NONE;
246         char folder_uuid[MEDIA_SVC_UUID_SIZE + 1] = {0, };
247         media_svc_media_type_e media_type;
248
249         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
250         media_svc_retvm_if(!STRING_VALID(storage_id), MS_MEDIA_ERR_INVALID_PARAMETER, "storage_id is NULL");
251         media_svc_retvm_if(!STRING_VALID(path), MS_MEDIA_ERR_INVALID_PARAMETER, "path is NULL");
252         media_svc_retvm_if(_media_svc_check_storage_type(storage_type) != TRUE, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid storage_type");
253
254         media_svc_content_info_s content_info;
255         memset(&content_info, 0, sizeof(media_svc_content_info_s));
256
257         /*Set media info*/
258         /* if drm_contentinfo is not NULL, the file is OMA DRM.*/
259         ret = _media_svc_set_media_info(&content_info, storage_id, storage_type, path, &media_type, FALSE);
260         if (ret != MS_MEDIA_ERR_NONE)
261                 return ret;
262
263         if (media_type == MEDIA_SVC_MEDIA_TYPE_OTHER
264         || (media_type == MEDIA_SVC_MEDIA_TYPE_PVR)
265         || (media_type == MEDIA_SVC_MEDIA_TYPE_UHD)
266         || (media_type == MEDIA_SVC_MEDIA_TYPE_SCSA))
267                 media_svc_debug("Do nothing[%d]", media_type);
268         else if (media_type == MEDIA_SVC_MEDIA_TYPE_IMAGE)
269                 ret = _media_svc_extract_image_metadata(&content_info);
270         else
271                 ret = _media_svc_extract_media_metadata(handle, &content_info, uid);
272         media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
273
274         /*Set or Get folder id*/
275         ret = _media_svc_get_and_append_folder_id_by_path(handle, storage_id, path, storage_type, folder_uuid, uid);
276         media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
277
278         content_info.folder_uuid = g_strdup(folder_uuid);
279         media_svc_retv_del_if(content_info.folder_uuid == NULL, MS_MEDIA_ERR_INTERNAL, &content_info);
280
281         if (g_media_svc_insert_item_data_cnt == 1) {
282
283                 ret = _media_svc_insert_item_with_data(handle, storage_id, &content_info, FALSE, uid);
284                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
285
286                 if (g_insert_with_noti)
287                         _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt++);
288
289         } else if (g_media_svc_insert_item_cur_data_cnt < (g_media_svc_insert_item_data_cnt - 1)) {
290
291                 ret = _media_svc_insert_item_with_data(handle, storage_id, &content_info, TRUE, uid);
292                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
293
294                 if (g_insert_with_noti)
295                         _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt);
296
297                 g_media_svc_insert_item_cur_data_cnt++;
298
299         } else if (g_media_svc_insert_item_cur_data_cnt == (g_media_svc_insert_item_data_cnt - 1)) {
300
301                 ret = _media_svc_insert_item_with_data(handle, storage_id, &content_info, TRUE, uid);
302                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
303
304                 if (g_insert_with_noti)
305                         _media_svc_insert_item_to_noti_list(&content_info, g_media_svc_insert_item_cur_data_cnt);
306
307                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_ITEM, uid);
308                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
309
310                 if (g_insert_with_noti) {
311                         _media_svc_publish_noti_list(g_media_svc_insert_item_cur_data_cnt + 1);
312                         _media_svc_destroy_noti_list(g_media_svc_insert_item_cur_data_cnt + 1);
313
314                         /* Recreate noti list */
315                         ret = _media_svc_create_noti_list(g_media_svc_insert_item_data_cnt);
316                         media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
317                 }
318
319                 g_media_svc_insert_item_cur_data_cnt = 0;
320
321         } else {
322                 media_svc_error("Error in media_svc_insert_item_bulk");
323                 _media_svc_destroy_content_info(&content_info);
324                 return MS_MEDIA_ERR_INTERNAL;
325         }
326
327         _media_svc_destroy_content_info(&content_info);
328
329         return MS_MEDIA_ERR_NONE;
330 }
331
332 int media_svc_insert_item_immediately(sqlite3 *handle, const char *storage_id, ms_user_storage_type_e storage_type, const char *path, uid_t uid)
333 {
334         int ret = MS_MEDIA_ERR_NONE;
335         char folder_uuid[MEDIA_SVC_UUID_SIZE + 1] = {0, };
336         media_svc_media_type_e media_type;
337
338         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
339         media_svc_retvm_if(!STRING_VALID(storage_id), MS_MEDIA_ERR_INVALID_PARAMETER, "storage_id is NULL");
340         media_svc_retvm_if(!STRING_VALID(path), MS_MEDIA_ERR_INVALID_PARAMETER, "path is NULL");
341         media_svc_retvm_if(_media_svc_check_storage_type(storage_type) != TRUE, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid storage_type");
342
343         media_svc_content_info_s content_info;
344         memset(&content_info, 0, sizeof(media_svc_content_info_s));
345
346         /*Set media info*/
347         ret = _media_svc_set_media_info(&content_info, storage_id, storage_type, path, &media_type, FALSE);
348         if (ret != MS_MEDIA_ERR_NONE)
349                 return ret;
350
351         if (media_type == MEDIA_SVC_MEDIA_TYPE_OTHER
352         || (media_type == MEDIA_SVC_MEDIA_TYPE_PVR)
353         || (media_type == MEDIA_SVC_MEDIA_TYPE_UHD)
354         || (media_type == MEDIA_SVC_MEDIA_TYPE_SCSA)) {
355                 /*Do nothing.*/
356         } else if (media_type == MEDIA_SVC_MEDIA_TYPE_IMAGE) {
357                 ret = _media_svc_extract_image_metadata(&content_info);
358         } else {
359                 ret = _media_svc_extract_media_metadata(handle, &content_info, uid);
360         }
361
362         media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
363
364         /*Set or Get folder id*/
365         ret = _media_svc_get_and_append_folder_id_by_path(handle, storage_id, path, storage_type, folder_uuid, uid);
366         media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
367
368         content_info.folder_uuid = g_strdup(folder_uuid);
369         media_svc_retv_del_if(content_info.folder_uuid == NULL, MS_MEDIA_ERR_INTERNAL, &content_info);
370
371         /* Extracting thumbnail */
372         if (content_info.thumbnail_path == NULL) {
373                 if (media_type == MEDIA_SVC_MEDIA_TYPE_IMAGE || media_type == MEDIA_SVC_MEDIA_TYPE_VIDEO) {
374                         char thumb_path[MEDIA_SVC_PATHNAME_SIZE + 1] = {0, };
375
376                         ret = _media_svc_create_thumbnail(content_info.path, thumb_path, sizeof(thumb_path), media_type, uid);
377                         if (ret == MS_MEDIA_ERR_NONE)
378                                 content_info.thumbnail_path = g_strdup(thumb_path);
379                 }
380         }
381
382         ret = _media_svc_insert_item_with_data(handle, storage_id, &content_info, FALSE, uid);
383
384         if (ret == MS_MEDIA_ERR_NONE) {
385                 media_svc_debug("Insertion is successful. Sending noti for this");
386                 _media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_INSERT, content_info.path, content_info.media_type, content_info.media_uuid, content_info.mime_type);
387         } else if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
388                 media_svc_error("This item is already inserted. This may be normal operation because other process already did this");
389         }
390
391         _media_svc_destroy_content_info(&content_info);
392         return ret;
393 }
394
395 int media_svc_move_item(sqlite3 *handle, const char *src_path, const char *dest_path, uid_t uid)
396 {
397         int ret = MS_MEDIA_ERR_NONE;
398         char *file_name = NULL;
399         char *folder_path = NULL;
400         int modified_time = 0;
401         char folder_uuid[MEDIA_SVC_UUID_SIZE + 1] = {0, };
402         char old_thumb_path[MEDIA_SVC_PATHNAME_SIZE] = {0, };
403         char org_stg_id[MEDIA_SVC_UUID_SIZE + 1] = {0, };
404         char dst_stg_id[MEDIA_SVC_UUID_SIZE + 1] = {0, };
405         ms_user_storage_type_e org_stg_type = MS_USER_STORAGE_INTERNAL;
406         ms_user_storage_type_e dst_stg_type = MS_USER_STORAGE_INTERNAL;
407         int media_type = -1;
408
409         media_svc_debug_fenter();
410
411         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
412         media_svc_retvm_if(!STRING_VALID(src_path), MS_MEDIA_ERR_INVALID_PARAMETER, "src_path is NULL");
413         media_svc_retvm_if(!STRING_VALID(dest_path), MS_MEDIA_ERR_INVALID_PARAMETER, "dest_path is NULL");
414
415         /* Get storage_id */
416         ret = _media_svc_get_storage_uuid(handle, src_path, org_stg_id, uid);
417         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
418         ret = _media_svc_get_storage_uuid(handle, dest_path, dst_stg_id, uid);
419         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
420         /* Get storage_type */
421         ret = ms_user_get_storage_type(uid, src_path, &org_stg_type);
422         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
423         ret = ms_user_get_storage_type(uid, dest_path, &dst_stg_type);
424         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
425
426         /*check and update folder*/
427         ret = _media_svc_get_and_append_folder_id_by_path(handle, dst_stg_id, dest_path, dst_stg_type, folder_uuid, uid);
428         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
429
430         /*get filename*/
431         file_name = g_path_get_basename(dest_path);
432
433         /*get modified_time*/
434         modified_time = _media_svc_get_file_time(dest_path);
435
436         ret = _media_svc_get_media_type_by_path(handle, org_stg_id, src_path, &media_type);
437         if (ret != MS_MEDIA_ERR_NONE) {
438                 media_svc_error("_media_svc_get_media_type_by_path failed");
439                 SAFE_FREE(file_name);
440                 return ret;
441         }
442
443         /*get old thumbnail_path and remove thumbnail */
444         ret = _media_svc_get_thumbnail_path_by_path(handle, src_path, old_thumb_path);
445         if ((ret != MS_MEDIA_ERR_NONE) && (ret != MS_MEDIA_ERR_DB_NO_RECORD)) {
446                 media_svc_error("_media_svc_get_thumbnail_path_by_path failed");
447                 SAFE_FREE(file_name);
448                 return ret;
449         }
450
451         if (STRING_VALID(old_thumb_path)) {
452                 ret = _media_svc_remove_file(old_thumb_path);
453                 if (ret != MS_MEDIA_ERR_NONE)
454                         media_svc_error("_media_svc_remove_file failed : %d", ret);
455         }
456
457         /*move item*/
458         ret = _media_svc_update_item_by_path(org_stg_id, src_path, dst_stg_id, dst_stg_type, dest_path, file_name, modified_time, folder_uuid, uid);
459         SAFE_FREE(file_name);
460         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
461
462         media_svc_debug("Move is successful. Sending noti for this");
463
464         /* Get notification info */
465         media_svc_noti_item *noti_item = NULL;
466         ret = _media_svc_get_noti_info(handle, dst_stg_id, dest_path, MS_MEDIA_ITEM_FILE, &noti_item);
467         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
468
469         /* Send notification for move */
470         _media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_UPDATE, src_path, media_type, noti_item->media_uuid, noti_item->mime_type);
471         _media_svc_destroy_noti_item(noti_item);
472
473         /*update folder modified_time*/
474         folder_path = g_path_get_dirname(dest_path);
475         ret = _media_svc_update_folder_modified_time_by_folder_uuid(folder_uuid, folder_path, uid);
476         SAFE_FREE(folder_path);
477         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
478
479         return MS_MEDIA_ERR_NONE;
480 }
481
482 int media_svc_set_item_validity_begin(int data_cnt)
483 {
484         media_svc_debug("Transaction data count : [%d]", data_cnt);
485
486         media_svc_retvm_if(data_cnt < 1, MS_MEDIA_ERR_INVALID_PARAMETER, "data_cnt shuld be bigger than 1");
487
488         g_media_svc_item_validity_data_cnt = data_cnt;
489         g_media_svc_item_validity_cur_data_cnt = 0;
490
491         return MS_MEDIA_ERR_NONE;
492 }
493
494 int media_svc_set_item_validity_end(uid_t uid)
495 {
496         int ret = MS_MEDIA_ERR_NONE;
497
498         media_svc_debug_fenter();
499
500         if (g_media_svc_item_validity_cur_data_cnt > 0)
501                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_SET_ITEM_VALIDITY, uid);
502
503         g_media_svc_item_validity_data_cnt = 1;
504         g_media_svc_item_validity_cur_data_cnt = 0;
505
506         return ret;
507 }
508
509 int media_svc_set_item_validity(const char *storage_id, const char *path, int validity, uid_t uid)
510 {
511         int ret = MS_MEDIA_ERR_NONE;
512
513         if (g_media_svc_item_validity_data_cnt == 1) {
514
515                 return _media_svc_update_item_validity(storage_id, path, validity, FALSE, uid);
516
517         } else if (g_media_svc_item_validity_cur_data_cnt < (g_media_svc_item_validity_data_cnt - 1)) {
518
519                 ret = _media_svc_update_item_validity(storage_id, path, validity, TRUE, uid);
520                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
521
522                 g_media_svc_item_validity_cur_data_cnt++;
523
524         } else if (g_media_svc_item_validity_cur_data_cnt == (g_media_svc_item_validity_data_cnt - 1)) {
525
526                 ret = _media_svc_update_item_validity(storage_id, path, validity, TRUE, uid);
527                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
528
529                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_SET_ITEM_VALIDITY, uid);
530                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
531
532                 g_media_svc_item_validity_cur_data_cnt = 0;
533
534         } else {
535
536                 media_svc_error("Error in media_svc_set_item_validity");
537                 return MS_MEDIA_ERR_INTERNAL;
538         }
539
540         return MS_MEDIA_ERR_NONE;
541 }
542
543 int media_svc_delete_item_by_path(sqlite3 *handle, const char *storage_id, const char *path, uid_t uid)
544 {
545         int ret = MS_MEDIA_ERR_NONE;
546         char thumb_path[MEDIA_SVC_PATHNAME_SIZE] = {0, };
547
548         media_svc_debug_fenter();
549
550         int media_type = -1;
551         ret = _media_svc_get_media_type_by_path(handle, storage_id, path, &media_type);
552         media_svc_retv_if((ret != MS_MEDIA_ERR_NONE), ret);
553
554         /*Get thumbnail path to delete*/
555         ret = _media_svc_get_thumbnail_path_by_path(handle, path, thumb_path);
556         media_svc_retv_if((ret != MS_MEDIA_ERR_NONE) && (ret != MS_MEDIA_ERR_DB_NO_RECORD), ret);
557
558         if (g_media_svc_insert_item_data_cnt == 1) {
559
560                 /* Get notification info */
561                 media_svc_noti_item *noti_item = NULL;
562                 ret = _media_svc_get_noti_info(handle, storage_id, path, MS_MEDIA_ITEM_FILE, &noti_item);
563                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
564
565                 /*Delete item*/
566                 ret = _media_svc_delete_item_by_path(storage_id, path, FALSE, uid);
567                 if (ret != MS_MEDIA_ERR_NONE) {
568                         media_svc_error("_media_svc_delete_item_by_path failed : %d", ret);
569                         _media_svc_destroy_noti_item(noti_item);
570
571                         return ret;
572                 }
573
574                 /* Send notification */
575                 media_svc_debug("Deletion is successful. Sending noti for this");
576                 _media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_DELETE, path, media_type, noti_item->media_uuid, noti_item->mime_type);
577                 _media_svc_destroy_noti_item(noti_item);
578         } else {
579                 ret = _media_svc_delete_item_by_path(storage_id, path, TRUE, uid);
580                 if (ret != MS_MEDIA_ERR_NONE) {
581                         media_svc_error("_media_svc_delete_item_by_path failed : %d", ret);
582                         return ret;
583                 }
584
585         }
586
587         /*Delete thumbnail*/
588         if (STRING_VALID(thumb_path)) {
589                 ret = _media_svc_remove_file(thumb_path);
590                 if (ret != MS_MEDIA_ERR_NONE)
591                         media_svc_error("fail to remove thumbnail file.");
592         }
593
594         return MS_MEDIA_ERR_NONE;
595 }
596
597 int media_svc_delete_invalid_items_in_storage(sqlite3 *handle, const char *storage_id, ms_user_storage_type_e storage_type, uid_t uid)
598 {
599         media_svc_debug_fenter();
600
601         /*Delete from DB and remove thumbnail files*/
602         return _media_svc_delete_invalid_items(handle, storage_id, storage_type, uid);
603 }
604
605 int media_svc_set_all_storage_items_validity(const char *storage_id, ms_user_storage_type_e storage_type, int validity, uid_t uid)
606 {
607         return _media_svc_update_storage_item_validity(storage_id, storage_type, validity, uid);
608 }
609
610 int media_svc_set_folder_items_validity(sqlite3 *handle, const char *storage_id, const char *folder_path, int validity, int recursive, uid_t uid)
611 {
612         if (recursive)
613                 return _media_svc_update_recursive_folder_item_validity(storage_id, folder_path, validity, uid);
614         else
615                 return _media_svc_update_folder_item_validity(handle, storage_id, folder_path, validity, uid);
616 }
617
618 int media_svc_refresh_item(sqlite3 *handle, const char *storage_id, ms_user_storage_type_e storage_type, const char *path, uid_t uid)
619 {
620         int ret = MS_MEDIA_ERR_NONE;
621         media_svc_media_type_e media_type;
622         char thumb_path[MEDIA_SVC_PATHNAME_SIZE + 1] = {0, };
623
624         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
625         media_svc_retvm_if(!STRING_VALID(storage_id), MS_MEDIA_ERR_INVALID_PARAMETER, "storage_id is NULL");
626         media_svc_retvm_if(!STRING_VALID(path), MS_MEDIA_ERR_INVALID_PARAMETER, "path is NULL");
627         media_svc_retvm_if(_media_svc_check_storage_type(storage_type) != TRUE, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid storage_type");
628
629         media_svc_content_info_s content_info;
630         memset(&content_info, 0, sizeof(media_svc_content_info_s));
631
632         /*Set media info*/
633         ret = _media_svc_set_media_info(&content_info, storage_id, storage_type, path, &media_type, TRUE);
634         if (ret != MS_MEDIA_ERR_NONE)
635                 return ret;
636
637         /* Initialize thumbnail information to remake thumbnail. */
638         ret = _media_svc_get_thumbnail_path_by_path(handle, path, thumb_path);
639         if (ret != MS_MEDIA_ERR_NONE && ret != MS_MEDIA_ERR_DB_NO_RECORD) {
640                 _media_svc_destroy_content_info(&content_info);
641                 return ret;
642         }
643
644         if (STRING_VALID(thumb_path)) {
645                 if (g_file_test(thumb_path, G_FILE_TEST_EXISTS)) {
646                         ret = _media_svc_remove_file(thumb_path);
647                         if (ret != MS_MEDIA_ERR_NONE)
648                                 media_svc_error("_media_svc_remove_file failed : %s", thumb_path);
649                 }
650
651                 ret = _media_svc_update_thumbnail_path(storage_id, path, NULL, uid);
652                 if (ret != MS_MEDIA_ERR_NONE) {
653                         _media_svc_destroy_content_info(&content_info);
654                         return ret;
655                 }
656         }
657
658         /* Get notification info */
659         media_svc_noti_item *noti_item = NULL;
660         ret = _media_svc_get_noti_info(handle, storage_id, path, MS_MEDIA_ITEM_FILE, &noti_item);
661         if (ret != MS_MEDIA_ERR_NONE) {
662                 _media_svc_destroy_content_info(&content_info);
663                 return ret;
664         }
665
666         media_type = noti_item->media_type;
667         content_info.media_type = media_type;
668
669         if (media_type == MEDIA_SVC_MEDIA_TYPE_OTHER
670         || (media_type == MEDIA_SVC_MEDIA_TYPE_PVR)
671         || (media_type == MEDIA_SVC_MEDIA_TYPE_UHD)
672         || (media_type == MEDIA_SVC_MEDIA_TYPE_SCSA))
673                 media_svc_debug("Do nothing [%d]", media_type);
674         else if (media_type == MEDIA_SVC_MEDIA_TYPE_IMAGE)
675                 ret = _media_svc_extract_image_metadata(&content_info);
676         else
677                 ret = _media_svc_extract_media_metadata(handle, &content_info, uid);
678
679         if (ret != MS_MEDIA_ERR_NONE) {
680                 _media_svc_destroy_noti_item(noti_item);
681                 _media_svc_destroy_content_info(&content_info);
682                 return ret;
683         }
684
685         /* Extracting thumbnail */
686         if (content_info.thumbnail_path == NULL) {
687                 if (media_type == MEDIA_SVC_MEDIA_TYPE_IMAGE || media_type == MEDIA_SVC_MEDIA_TYPE_VIDEO) {
688                         memset(thumb_path, 0, sizeof(thumb_path));
689
690                         ret = _media_svc_create_thumbnail(content_info.path, thumb_path, sizeof(thumb_path), media_type, uid);
691                         if (ret == MS_MEDIA_ERR_NONE)
692                                 content_info.thumbnail_path = g_strdup(thumb_path);
693                 }
694         }
695
696         ret = _media_svc_update_item_with_data(storage_id, &content_info, uid);
697
698         if (ret == MS_MEDIA_ERR_NONE) {
699                 media_svc_debug("Update is successful. Sending noti for this");
700                 _media_svc_publish_noti(MS_MEDIA_ITEM_FILE, MS_MEDIA_ITEM_UPDATE, content_info.path, noti_item->media_type, noti_item->media_uuid, noti_item->mime_type);
701         } else {
702                 media_svc_error("_media_svc_update_item_with_data failed : %d", ret);
703         }
704
705         _media_svc_destroy_content_info(&content_info);
706         _media_svc_destroy_noti_item(noti_item);
707
708         return ret;
709 }
710
711 int media_svc_request_update_db(const char *db_query, uid_t uid)
712 {
713         return _media_svc_sql_query(db_query, uid);
714 }
715
716 int media_svc_send_dir_update_noti(sqlite3 *handle, const char *storage_id, const char *dir_path, const char *folder_id, media_item_update_type_e update_type, int pid)
717 {
718         int ret = MS_MEDIA_ERR_NONE;
719         char *uuid = NULL;
720
721         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
722         media_svc_retvm_if(!STRING_VALID(dir_path), MS_MEDIA_ERR_INVALID_PARAMETER, "dir_path is NULL");
723
724         /* Get notification info */
725         media_svc_noti_item *noti_item = NULL;
726         ret = _media_svc_get_noti_info(handle, storage_id, dir_path, MS_MEDIA_ITEM_DIRECTORY, &noti_item);
727         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
728
729         if (folder_id != NULL) {
730                 uuid = strndup(folder_id, strlen(folder_id));
731         } else {
732                 if (noti_item->media_uuid != NULL) {
733                         uuid = strndup(noti_item->media_uuid, strlen(noti_item->media_uuid));
734                 } else {
735                         _media_svc_destroy_noti_item(noti_item);
736                         media_svc_error("folder uuid is wrong");
737                         return MS_MEDIA_ERR_DB_INTERNAL;
738                 }
739         }
740
741         ret = _media_svc_publish_dir_noti_v2(MS_MEDIA_ITEM_DIRECTORY, update_type, dir_path, -1, uuid, NULL, pid);
742         _media_svc_destroy_noti_item(noti_item);
743         SAFE_FREE(uuid);
744
745         return ret;
746 }
747
748 int media_svc_check_db_upgrade(sqlite3 *handle, int user_version, uid_t uid)
749 {
750         media_svc_debug_fenter();
751
752         return _media_svc_check_db_upgrade(handle, user_version, uid);
753 }
754
755 int media_svc_update_item_begin(int data_cnt)
756 {
757         media_svc_debug("Transaction data count : [%d]", data_cnt);
758
759         media_svc_retvm_if(data_cnt < 1, MS_MEDIA_ERR_INVALID_PARAMETER, "data_cnt shuld be bigger than 1");
760
761         g_media_svc_update_item_data_cnt = data_cnt;
762         g_media_svc_update_item_cur_data_cnt = 0;
763
764         return MS_MEDIA_ERR_NONE;
765 }
766
767 int media_svc_update_item_end(uid_t uid)
768 {
769         int ret = MS_MEDIA_ERR_NONE;
770
771         media_svc_debug_fenter();
772
773         if (g_media_svc_update_item_cur_data_cnt > 0)
774                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_UPDATE_ITEM, uid);
775
776         g_media_svc_update_item_data_cnt = 1;
777         g_media_svc_update_item_cur_data_cnt = 0;
778
779         return ret;
780 }
781
782 int media_svc_update_item_meta(const char *file_path, const char *storage_id, int storage_type, uid_t uid)
783 {
784         int ret = MS_MEDIA_ERR_NONE;
785         media_svc_media_type_e media_type;
786         media_svc_content_info_s content_info;
787         memset(&content_info, 0, sizeof(media_svc_content_info_s));
788
789         /*Set media info*/
790         ret = _media_svc_set_media_info(&content_info, storage_id, storage_type, file_path, &media_type, FALSE);
791         if (ret != MS_MEDIA_ERR_NONE)
792                 return ret;
793
794         if (media_type == MEDIA_SVC_MEDIA_TYPE_MUSIC)
795                 ret = _media_svc_extract_music_metadata_for_update(&content_info, media_type);
796         else {
797                 _media_svc_destroy_content_info(&content_info);
798                 return MS_MEDIA_ERR_NONE;
799         }
800
801         if (ret != MS_MEDIA_ERR_NONE) {
802                 _media_svc_destroy_content_info(&content_info);
803                 return ret;
804         }
805
806         if (g_media_svc_update_item_data_cnt == 1) {
807
808                 ret = _media_svc_update_meta_with_data(&content_info);
809                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
810
811         } else if (g_media_svc_update_item_cur_data_cnt < (g_media_svc_update_item_data_cnt - 1)) {
812
813                 ret = _media_svc_update_meta_with_data(&content_info);
814                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
815
816                 g_media_svc_update_item_cur_data_cnt++;
817
818         } else if (g_media_svc_update_item_cur_data_cnt == (g_media_svc_update_item_data_cnt - 1)) {
819
820                 ret = _media_svc_update_meta_with_data(&content_info);
821                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
822
823                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_UPDATE_ITEM, uid);
824                 media_svc_retv_del_if(ret != MS_MEDIA_ERR_NONE, ret, &content_info);
825
826                 g_media_svc_update_item_cur_data_cnt = 0;
827
828         } else {
829                 media_svc_error("Error in media_svc_update_item_meta");
830                 _media_svc_destroy_content_info(&content_info);
831                 return MS_MEDIA_ERR_INTERNAL;
832         }
833
834         _media_svc_destroy_content_info(&content_info);
835
836         return ret;
837 }
838
839 int media_svc_publish_noti(media_item_type_e update_item, media_item_update_type_e update_type, const char *path, media_type_e media_type, const char *uuid, const char *mime_type)
840 {
841         return _media_svc_publish_noti(update_item, update_type, path, media_type, uuid, mime_type);
842 }
843
844 int media_svc_get_pinyin(const char *src_str, char **pinyin_str)
845 {
846         return _media_svc_get_pinyin_str(src_str, pinyin_str);
847 }
848
849 int media_svc_check_pinyin_support(bool *support)
850 {
851         *support = _media_svc_check_pinyin_support();
852
853         return MS_MEDIA_ERR_NONE;
854 }
855
856 int media_svc_set_storage_validity(sqlite3 *handle, const char *storage_id, int validity, uid_t uid)
857 {
858         int ret = MS_MEDIA_ERR_NONE;
859
860         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
861
862         ret = _media_svc_update_storage_validity(storage_id, validity, uid);
863         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "update storage validity failed: %d", ret);
864
865         ret = _media_svc_update_media_view(handle, uid);
866         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "update media view failed : %d", ret);
867
868         return ret;
869 }
870
871 int media_svc_get_storage_id(sqlite3 *handle, const char *path, char *storage_id, uid_t uid)
872 {
873         return _media_svc_get_storage_uuid(handle, path, storage_id, uid);
874 }
875
876 int media_svc_get_storage_list(sqlite3 *handle, char ***storage_list, char ***storage_id_list, int *count)
877 {
878         media_svc_debug_fenter();
879
880         return _media_svc_get_all_storage(handle, storage_list, storage_id_list, count);
881 }
882
883 int media_svc_generate_uuid(char **uuid)
884 {
885         char *gen_uuid = NULL;
886         gen_uuid = _media_info_generate_uuid();
887         media_svc_retvm_if(gen_uuid == NULL, MS_MEDIA_ERR_INTERNAL, "Fail to generate uuid");
888
889         *uuid = strdup(gen_uuid);
890
891         return MS_MEDIA_ERR_NONE;
892 }
893
894 int media_svc_check_storage(sqlite3 *handle, const char *storage_id, char **storage_path, int *validity, uid_t uid)
895 {
896         return _media_svc_check_storage(handle, storage_id, storage_path, validity, uid);
897 }
898
899 int media_svc_update_storage(sqlite3 *handle, const char *storage_id, const char *storage_path, uid_t uid)
900 {
901         return _media_svc_update_storage_path(handle, storage_id, storage_path, uid);
902 }
903
904 int media_svc_insert_storage(sqlite3 *handle, const char *storage_id, const char *storage_path, ms_user_storage_type_e storage_type, uid_t uid)
905 {
906         int ret = MS_MEDIA_ERR_NONE;
907
908         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
909         media_svc_retvm_if(storage_id == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "storage_id is NULL");
910         media_svc_retvm_if(storage_path == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "storage_path is NULL");
911         media_svc_retvm_if(_media_svc_check_storage_type(storage_type) != TRUE, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid storage_type");
912
913         ret = _media_svc_append_storage(storage_id, storage_path, storage_type, uid);
914         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "append storage failed : %d", ret);
915
916         ret = _media_svc_create_media_table_with_id(storage_id, uid);
917         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "create media table failed : %d", ret);
918
919         ret = _media_svc_update_media_view(handle, uid);
920         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "update media view failed : %d", ret);
921
922         /* Remove external storage that validity is 0 */
923         ret = _media_svc_delete_invalid_storage(handle, storage_type, uid);
924         media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Delete invalid storage failed : %d", ret);
925
926         return ret;
927 }
928
929 int media_svc_insert_folder_begin(int data_cnt)
930 {
931         media_svc_debug("Transaction data count : [%d]", data_cnt);
932
933         media_svc_retvm_if(data_cnt < 1, MS_MEDIA_ERR_INVALID_PARAMETER, "data_cnt shuld be bigger than 1");
934
935         g_media_svc_insert_folder_data_cnt = data_cnt;
936         g_media_svc_insert_folder_cur_data_cnt = 0;
937
938         return MS_MEDIA_ERR_NONE;
939 }
940
941 int media_svc_insert_folder_end(uid_t uid)
942 {
943         int ret = MS_MEDIA_ERR_NONE;
944
945         media_svc_debug_fenter();
946
947         if (g_media_svc_insert_folder_cur_data_cnt > 0)
948                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_FOLDER, uid);
949
950         g_media_svc_insert_folder_data_cnt = 1;
951         g_media_svc_insert_folder_cur_data_cnt = 0;
952
953         return ret;
954 }
955
956 int media_svc_insert_folder(sqlite3 *handle, const char *storage_id, ms_user_storage_type_e storage_type, const char *path, uid_t uid)
957 {
958         int ret = MS_MEDIA_ERR_NONE;
959         char folder_uuid[MEDIA_SVC_UUID_SIZE+1] = {0,};
960
961         media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Handle is NULL");
962         media_svc_retvm_if(!STRING_VALID(storage_id), MS_MEDIA_ERR_INVALID_PARAMETER, "storage_id is NULL");
963         media_svc_retvm_if(!STRING_VALID(path), MS_MEDIA_ERR_INVALID_PARAMETER, "path is NULL");
964         media_svc_retvm_if(_media_svc_check_storage_type(storage_type) != TRUE, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid storage_type");
965
966         if (g_media_svc_insert_folder_data_cnt == 1) {
967
968                 ret = _media_svc_get_and_append_folder_id_by_folder_path(handle, storage_id, path, storage_type, folder_uuid, FALSE, uid);
969
970         } else if (g_media_svc_insert_folder_cur_data_cnt < (g_media_svc_insert_folder_data_cnt - 1)) {
971
972                 ret = _media_svc_get_and_append_folder_id_by_folder_path(handle, storage_id, path, storage_type, folder_uuid, TRUE, uid);
973                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
974
975                 g_media_svc_insert_folder_cur_data_cnt++;
976
977         } else if (g_media_svc_insert_folder_cur_data_cnt == (g_media_svc_insert_folder_data_cnt - 1)) {
978
979                 ret = _media_svc_get_and_append_folder_id_by_folder_path(handle, storage_id, path, storage_type, folder_uuid, TRUE, uid);
980                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
981
982                 ret = _media_svc_list_query_do(MEDIA_SVC_QUERY_INSERT_FOLDER, uid);
983                 media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
984
985                 g_media_svc_insert_folder_cur_data_cnt = 0;
986
987         } else {
988                 media_svc_error("Error in media_svc_set_insert_folder");
989                 return MS_MEDIA_ERR_INTERNAL;
990         }
991
992         return ret;
993 }
994
995 int media_svc_delete_invalid_folder(const char *storage_id, int storage_type, uid_t uid)
996 {
997         return _media_svc_delete_invalid_folder(storage_id, storage_type, uid);
998 }
999
1000 int media_svc_set_folder_validity(sqlite3 *handle, const char *storage_id, const char *start_path, int validity, bool is_recursive, uid_t uid)
1001 {
1002         return _media_svc_set_folder_validity(handle, storage_id, start_path, validity, is_recursive, uid);
1003 }
1004
1005 int media_svc_check_folder_exist_by_path(sqlite3 *handle, const char *storage_id, const char *folder_path)
1006 {
1007         int ret = MS_MEDIA_ERR_NONE;
1008         int count = -1;
1009
1010         ret = _media_svc_count_folder_with_path(handle, storage_id, folder_path, &count);
1011         media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret);
1012
1013         if (count > 0) {
1014                 media_svc_debug("item is exist in database");
1015                 return MS_MEDIA_ERR_NONE;
1016         } else {
1017                 media_svc_debug("item is not exist in database");
1018                 return MS_MEDIA_ERR_DB_NO_RECORD;
1019         }
1020
1021         return MS_MEDIA_ERR_NONE;
1022 }
1023
1024 int media_svc_get_folder_id(sqlite3 *handle, const char *storage_id, const char *path, char *folder_id)
1025 {
1026         return _media_svc_get_folder_uuid(handle, storage_id, path, folder_id);
1027 }
1028
1029 int media_svc_append_query(const char *query, uid_t uid)
1030 {
1031         return _media_svc_append_query_list(query, uid);
1032 }
1033
1034 int media_svc_send_query(uid_t uid)
1035 {
1036         return _media_svc_list_query_do(MEDIA_SVC_QUERY_UPDATE_COMMON, uid);
1037 }
1038
1039 int media_svc_get_media_type(const char *path, int *mediatype)
1040 {
1041         return _media_svc_get_media_type(path, mediatype);
1042 }
1043
1044 int media_svc_create_thumbnail(const char *storage_id, const char *file_path, int media_type, uid_t uid, char **thumbnail_path)
1045 {
1046         int ret = MS_MEDIA_ERR_NONE;
1047         char thumb_path[MEDIA_SVC_PATHNAME_SIZE + 1] = { 0, };
1048         char *sql = NULL;
1049
1050         // 1. Check media type
1051         if (media_type != MS_MEDIA_IMAGE && media_type != MS_MEDIA_VIDEO)
1052                 return MS_MEDIA_ERR_UNSUPPORTED_CONTENT;
1053
1054         // 2. try to create thumbnail
1055         ret = _media_svc_create_thumbnail(file_path, thumb_path, MEDIA_SVC_PATHNAME_SIZE, media_type, uid);
1056         if (ret != MS_MEDIA_ERR_NONE) {
1057                 media_svc_error("Failed to create thumbnail [%d]", ret);
1058                 if (ret == MS_MEDIA_ERR_UNSUPPORTED_CONTENT)
1059                         return ret;
1060         }
1061
1062         // 3. Update creation result to media db
1063         sql = sqlite3_mprintf("UPDATE '%q' SET thumbnail_path='%q' WHERE path='%q';", storage_id, thumb_path, file_path);
1064
1065         ret = _media_svc_sql_query(sql, uid);
1066         SQLITE3_SAFE_FREE(sql);
1067         if (ret != MS_MEDIA_ERR_NONE) {
1068                 media_svc_error("Failed to update media db [%d]", ret);
1069                 *thumbnail_path = g_strdup("");
1070         } else {
1071                 *thumbnail_path = g_strdup(thumb_path);
1072         }
1073
1074         return ret;
1075 }