2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <media_info_private.h>
19 #include <media_util_private.h>
21 static char *g_src_path = NULL;
23 static char *__media_folder_get_update_folder_sql(media_folder_h folder);
25 static char *__media_folder_get_update_folder_sql(media_folder_h folder)
27 media_folder_s *_folder = (media_folder_s*)folder;
28 char *return_sql = NULL;
29 char *name_pinyin = NULL;
30 bool pinyin_support = FALSE;
32 /*Update Pinyin If Support Pinyin*/
33 media_svc_check_pinyin_support(&pinyin_support);
35 media_svc_get_pinyin(_content_get_db_handle(), _folder->name, &name_pinyin);
37 return_sql = sqlite3_mprintf("%q='%q', %q='%q', %q=%d, %q='%q'",
38 DB_FIELD_FOLDER_PATH, _folder->path,
39 DB_FIELD_FOLDER_NAME, _folder->name,
40 DB_FIELD_FOLDER_MODIFIED_TIME, _folder->modified_time,
41 DB_FIELD_FOLDER_NAME_PINYIN, name_pinyin);
43 SAFE_FREE(name_pinyin);
47 int media_folder_get_folder_count_from_db(filter_h filter, int *folder_count)
49 int ret = MEDIA_CONTENT_ERROR_NONE;
53 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
54 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
57 ret = _media_db_get_group_count(filter, MEDIA_GROUP_FOLDER, folder_count);
62 int media_folder_foreach_folder_from_db(filter_h filter, media_folder_cb callback, void *user_data)
64 int ret = MEDIA_CONTENT_ERROR_NONE;
68 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
69 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
72 ret = _media_db_get_folder(filter, callback, user_data);
77 int media_folder_get_media_count_from_db(const char *folder_id, filter_h filter, int *media_count)
79 int ret = MEDIA_CONTENT_ERROR_NONE;
81 if(STRING_VALID(folder_id) && media_count)
83 ret = _media_db_get_group_item_count(folder_id, filter, MEDIA_GROUP_FOLDER, media_count);
87 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
88 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
94 int media_folder_foreach_media_from_db(const char *folder_id, filter_h filter, media_info_cb callback, void *user_data)
96 int ret = MEDIA_CONTENT_ERROR_NONE;
98 if((callback != NULL) && STRING_VALID(folder_id))
100 ret = _media_db_get_group_item(folder_id, filter, callback, user_data, MEDIA_GROUP_FOLDER);
104 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
105 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
111 int media_folder_destroy(media_folder_h folder)
113 int ret = MEDIA_CONTENT_ERROR_NONE;
114 media_folder_s *_folder = (media_folder_s*)folder;
117 SAFE_FREE(_folder->path);
118 SAFE_FREE(_folder->name);
119 SAFE_FREE(_folder->folder_id);
120 SAFE_FREE(_folder->storage_uuid);
122 ret = MEDIA_CONTENT_ERROR_NONE;
126 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
127 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
132 int media_folder_clone(media_folder_h *dst, media_folder_h src)
134 int ret = MEDIA_CONTENT_ERROR_NONE;
135 media_folder_s *_src = (media_folder_s*)src;
139 media_folder_s *_dst = (media_folder_s*)calloc(1, sizeof(media_folder_s));
140 media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
142 if(STRING_VALID(_src->folder_id))
144 _dst->folder_id = strdup(_src->folder_id);
145 if(_dst->folder_id == NULL)
148 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
149 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
153 _dst->storage_type = _src->storage_type;
155 if(STRING_VALID(_src->name))
157 _dst->name = strdup(_src->name);
158 if(_dst->name == NULL)
160 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
161 media_folder_destroy((media_folder_h)_dst);
162 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
166 if(STRING_VALID(_src->path))
168 _dst->path = strdup(_src->path);
169 if(_dst->path == NULL)
171 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
172 media_folder_destroy((media_folder_h)_dst);
173 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
177 if(STRING_VALID(_src->storage_uuid))
179 _dst->storage_uuid = strdup(_src->storage_uuid);
180 if(_dst->storage_uuid == NULL)
182 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
183 media_folder_destroy((media_folder_h)_dst);
184 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
188 *dst = (media_folder_h)_dst;
190 ret = MEDIA_CONTENT_ERROR_NONE;
194 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
195 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
201 int media_folder_get_folder_id(media_folder_h folder, char **folder_id)
203 int ret = MEDIA_CONTENT_ERROR_NONE;
204 media_folder_s *_folder = (media_folder_s*)folder;
208 if(STRING_VALID(_folder->folder_id))
210 *folder_id = strdup(_folder->folder_id);
211 media_content_retvm_if(*folder_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
217 ret = MEDIA_CONTENT_ERROR_NONE;
221 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
222 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
228 int media_folder_get_path(media_folder_h folder, char **path)
230 int ret = MEDIA_CONTENT_ERROR_NONE;
231 media_folder_s *_folder = (media_folder_s*)folder;
235 if(STRING_VALID(_folder->path))
237 *path = strdup(_folder->path);
238 media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
244 ret = MEDIA_CONTENT_ERROR_NONE;
249 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
250 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
257 int media_folder_get_name(media_folder_h folder, char **name)
259 int ret = MEDIA_CONTENT_ERROR_NONE;
260 media_folder_s *_folder = (media_folder_s*)folder;
264 if(STRING_VALID(_folder->name))
266 *name = strdup(_folder->name);
267 media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
273 ret = MEDIA_CONTENT_ERROR_NONE;
278 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
279 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
285 int media_folder_get_modified_time(media_folder_h folder, time_t* time)
287 int ret = MEDIA_CONTENT_ERROR_NONE;
288 media_folder_s *_folder = (media_folder_s*)folder;
292 *time = _folder->modified_time;
293 ret = MEDIA_CONTENT_ERROR_NONE;
297 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
298 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
304 int media_folder_get_storage_type(media_folder_h folder, media_content_storage_e* storage_type)
306 int ret = MEDIA_CONTENT_ERROR_NONE;
307 media_folder_s *_folder = (media_folder_s*)folder;
311 *storage_type = _folder->storage_type;
312 ret = MEDIA_CONTENT_ERROR_NONE;
316 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
317 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
323 int media_folder_get_storage_id(media_folder_h folder, char **storage_id)
325 int ret = MEDIA_CONTENT_ERROR_NONE;
326 media_folder_s *_folder = (media_folder_s*)folder;
330 if(STRING_VALID(_folder->storage_uuid))
332 *storage_id = strdup(_folder->storage_uuid);
333 media_content_retvm_if(*storage_id == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
339 ret = MEDIA_CONTENT_ERROR_NONE;
344 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
345 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
351 int media_folder_get_order(media_folder_h folder, int *order)
353 int ret = MEDIA_CONTENT_ERROR_NONE;
354 media_folder_s *_folder = (media_folder_s*)folder;
358 *order = _folder->folder_order;
359 ret = MEDIA_CONTENT_ERROR_NONE;
363 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
364 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
371 int media_folder_get_folder_from_db(const char *folder_id, media_folder_h *folder)
373 int ret = MEDIA_CONTENT_ERROR_NONE;
374 sqlite3_stmt *stmt = NULL;
375 char select_query[DEFAULT_QUERY_SIZE];
377 if(!STRING_VALID(folder_id))
379 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
380 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
383 memset(select_query, 0x00, sizeof(select_query));
385 snprintf(select_query, sizeof(select_query), SELECT_FOLDER_FROM_FOLDER, folder_id);
387 ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
388 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
390 media_folder_s *_folder = NULL;
392 while(sqlite3_step(stmt) == SQLITE_ROW)
395 media_folder_destroy((media_folder_h)_folder);
397 _folder = (media_folder_s*)calloc(1, sizeof(media_folder_s));
400 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
401 SQLITE3_FINALIZE(stmt);
402 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
405 media_content_error("folder handle %x", _folder);
407 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 0)))
408 _folder->folder_id = strdup((const char *)sqlite3_column_text(stmt, 0));
410 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
411 _folder->path = strdup((const char *)sqlite3_column_text(stmt, 1));
413 if(STRING_VALID((const char *)sqlite3_column_text(stmt, 2)))
414 _folder->name = strdup((const char *)sqlite3_column_text(stmt, 2));
416 *folder = (media_folder_h)_folder;
419 SQLITE3_FINALIZE(stmt);
424 int media_folder_update_to_db(media_folder_h folder)
426 int ret = MEDIA_CONTENT_ERROR_NONE;
427 media_folder_s *_folder = (media_folder_s*)folder;
428 char *set_sql = NULL;
431 if((_folder == NULL) || (_folder->folder_id == NULL))
433 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
434 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
437 /* Update folder order */
438 sql = sqlite3_mprintf(UPDATE_FOLDER_ORDER, _folder->folder_order, _folder->folder_id);
440 ret = _content_query_sql(sql);
443 if(STRING_VALID(_folder->folder_id) && g_src_path)
445 /* Set modified time */
448 _folder->modified_time = date;
450 set_sql = __media_folder_get_update_folder_sql((media_folder_h)_folder);
453 SAFE_FREE(g_src_path);
454 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
455 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
458 sql = sqlite3_mprintf("UPDATE %Q SET %s WHERE folder_uuid=%Q", DB_TABLE_FOLDER, set_sql, _folder->folder_id);
460 ret = _content_query_sql(sql);
462 sqlite3_free(set_sql);
464 if (ret != MEDIA_CONTENT_ERROR_NONE)
466 SAFE_FREE(g_src_path);
470 ret = media_svc_rename_folder(_content_get_db_handle(), _folder->storage_uuid, g_src_path, _folder->path, tzplatform_getuid(TZ_USER_NAME));
471 SAFE_FREE(g_src_path);
473 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
479 int media_folder_set_name(media_folder_h folder, const char *name)
481 int ret = MEDIA_CONTENT_ERROR_NONE;
482 media_folder_s *_folder = (media_folder_s*)folder;
484 if(_folder != NULL && STRING_VALID(name))
486 if (STRING_VALID(_folder->path) && STRING_VALID(_folder->name)) {
487 char *folder_path = NULL;
488 char new_folder_path[MAX_QUERY_SIZE] = {0,};
490 folder_path = g_path_get_dirname(_folder->path);
491 media_content_sec_debug("Existed Folder Path : %s", _folder->path);
492 snprintf(new_folder_path, sizeof(new_folder_path), "%s/%s", folder_path, name);
493 media_content_sec_debug("New Path : %s", new_folder_path);
495 SAFE_FREE(g_src_path);
496 g_src_path = strdup(_folder->path);
498 SAFE_FREE(_folder->path);
499 SAFE_FREE(_folder->name);
500 SAFE_FREE(folder_path);
501 _folder->path = strdup(new_folder_path);
502 media_content_retvm_if(_folder->path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
505 _folder->name = strdup(name);
506 media_content_retvm_if(_folder->name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
510 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
511 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
517 int media_folder_set_order(media_folder_h folder, int order)
519 int ret = MEDIA_CONTENT_ERROR_NONE;
520 media_folder_s *_folder = (media_folder_s*)folder;
522 if(_folder != NULL && order >= 0)
524 _folder->folder_order = order;
528 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
529 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;