/* * Copyright (c) 2015 Samsung Electronics Co., Ltd * * Licensed under the Flora License, Version 1.1 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "doc-data-util.h" #include "doc-local-data.h" #include "doc-debug.h" static bool _doc_local_data_clone_folder(media_folder_h folder, bool b_path, doc_folder_s ** pfolder) { DOC_CHECK_FALSE(folder); DOC_CHECK_FALSE(pfolder); doc_folder_s *tmp_folder = NULL; tmp_folder = (doc_folder_s *) calloc(1, sizeof(doc_folder_s)); if (tmp_folder == NULL) { doc_dbgE("Failed to calloc!"); return false; } tmp_folder->gtype = DOC_TYPE_FOLDER; if (b_path) { if (media_folder_get_path(folder, &(tmp_folder->path)) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get folder path failed!"); goto DOC_LOCAL_FAILED; } } if (media_folder_get_folder_id(folder, &(tmp_folder->uuid)) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get folder id failed!"); goto DOC_LOCAL_FAILED; } if (media_folder_get_modified_time(folder, &(tmp_folder->mtime)) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get modified time failed!"); goto DOC_LOCAL_FAILED; } media_content_storage_e storage_type; if (media_folder_get_storage_type(folder, &storage_type) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get storage type failed!"); goto DOC_LOCAL_FAILED; } if (storage_type == MEDIA_CONTENT_STORAGE_INTERNAL) { /* The device's internal storage */ tmp_folder->type = DOC_PHONE; } else if (storage_type == MEDIA_CONTENT_STORAGE_EXTERNAL) { /* The device's external storage */ tmp_folder->type = DOC_MMC; } else { doc_dbgE("Undefined mode[%d]!", storage_type); } if (media_folder_get_name(folder, &(tmp_folder->display_name)) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get folder name failed!"); goto DOC_LOCAL_FAILED; } *pfolder = tmp_folder; return true; DOC_LOCAL_FAILED: doc_data_type_free_item((void **) (&tmp_folder)); *pfolder = NULL; return false; } static bool _doc_local_data_get_media_list_cb(media_info_h media, void *data) { DOC_CHECK_FALSE(data); doc_transfer_data_s *td = (doc_transfer_data_s *) data; DOC_CHECK_FALSE(td->userdata); DOC_CHECK_FALSE(media); doc_media_s *item = NULL; Eina_List **elist = (Eina_List **) (td->userdata); if (doc_data_util_clone_media(media, &item, td->with_meta)) { *elist = eina_list_append(*elist, item); return true; } else { return false; } } int doc_local_data_connect(void) { int ret = -1; ret = media_content_connect(); if (ret == MEDIA_CONTENT_ERROR_NONE) { doc_dbg("DB connection is success"); return 0; } else { doc_dbgE("DB connection is failed!"); return -1; } } int doc_local_data_disconnect(void) { int ret = -1; ret = media_content_disconnect(); if (ret == MEDIA_CONTENT_ERROR_NONE) { doc_dbg("DB disconnection is success"); return 0; } else { doc_dbgE("DB disconnection is failed!"); return -1; } } static bool _doc_local_data_get_folder_list_cb(media_folder_h folder, void *data) { DOC_CHECK_FALSE(data); doc_transfer_data_s *tmp_data = (doc_transfer_data_s *) data; DOC_CHECK_FALSE(tmp_data->userdata); DOC_CHECK_FALSE(folder); Eina_List **elist = (Eina_List **) (tmp_data->userdata); doc_folder_s *tmp_folder = NULL; char *path = NULL; if (media_folder_get_path(folder, &path) != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get folder path failed!"); return false; } DOC_CHECK_FALSE(path); if (tmp_data->list_type != DOC_FOLDER_LIST_PATH) { if (!g_strcmp0(DOC_CAMERA_PATH_PHONE, path) || !g_strcmp0(DOC_CAMERA_PATH_MMC, path) || !g_strcmp0(DOC_DOWNLOADS_PATH, path)) { doc_dbgW("Camera or Downloads!"); DOC_FREE(path); return true; } } _doc_local_data_clone_folder(folder, false, &tmp_folder); if (tmp_folder == NULL) { DOC_FREE(path); doc_dbgE("Failed clone folder!"); return false; } tmp_folder->path = path; *elist = eina_list_append(*elist, tmp_folder); return true; } static int _doc_local_data_get_folder_list(doc_filter_s * condition, Eina_List ** elilst) { DOC_CHECK_VAL(elilst, -1); DOC_CHECK_VAL(condition, -1); int ret = -1; filter_h filter = NULL; ret = doc_data_util_create_filter(condition, &filter); if (ret != 0) { doc_dbgE("Create filter failed[%d]!", ret); return -1; } doc_transfer_data_s tran_data; memset(&tran_data, 0x00, sizeof(doc_transfer_data_s)); tran_data.userdata = (void **) elilst; tran_data.folder_id = NULL; tran_data.with_meta = false; tran_data.list_type = condition->list_type; doc_dbg("Get folders--start"); ret = media_folder_foreach_folder_from_db(filter, _doc_local_data_get_folder_list_cb, &tran_data); doc_dbg("Get folders--over"); doc_data_util_destroy_filter(filter); if (ret != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get folders failed[%d]!", ret); return -1; } return 0; } int doc_local_data_get_folder_by_path(char *path, doc_folder_s ** folder) { DOC_CHECK_VAL(path, -1); DOC_CHECK_VAL(folder, -1); int ret = -1; Eina_List *list = NULL; doc_filter_s condition; doc_folder_s *_item = NULL; int i = 0; if (strlen(path) <= 0) { doc_dbgE("Invalid path!"); return -1; } doc_dbg("path: %s", path); memset(&condition, 0x00, sizeof(doc_filter_s)); condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE; condition.sort_type = MEDIA_CONTENT_ORDER_DESC; condition.offset = -1; condition.count = -1; condition.with_meta = false; condition.list_type = DOC_FOLDER_LIST_PATH; snprintf(condition.cond, CONDITION_LENGTH, "%s AND %s=\'%s\'", DOC_CONDITION_LOCAL_DOCUMENT, FOLDER_PATH, path); ret = _doc_local_data_get_folder_list(&condition, &list); if (ret != 0 || NULL == list) { doc_dbgE("Failed to get folder list[%d]!", ret); ret = -1; } else if (NULL != list) { *folder = eina_list_nth(list, 0); i = 1; ret = 0; } /* Free other items */ if (list) { int len = eina_list_count(list); doc_dbg("len: %d", len); for (; i < len; i++) { _item = eina_list_nth(list, i); doc_data_type_free_item((void **) (&_item)); } eina_list_free(list); } return ret; } int doc_local_data_get_all_media_count(doc_filter_s * condtion, int *item_cnt) { DOC_CHECK_VAL(condtion, -1); DOC_CHECK_VAL(item_cnt, -1); int ret = -1; filter_h filter = NULL; ret = doc_data_util_create_filter(condtion, &filter); if (ret != 0) { doc_dbgE("Create filter failed[%d]!", ret); return -1; } doc_dbg("Get media count--start"); ret = media_info_get_media_count_from_db(filter, item_cnt); doc_dbg("Get media count--over"); doc_data_util_destroy_filter(filter); if (ret != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get media count failed[d]!", ret); return -1; } return 0; } int doc_local_data_get_all_folders_media_list(doc_filter_s * condition, Eina_List ** elist) { DOC_CHECK_VAL(elist, -1); DOC_CHECK_VAL(condition, -1); int ret = -1; filter_h filter = NULL; ret = doc_data_util_create_filter(condition, &filter); if (ret != 0) { doc_dbgE("Create filter failed!"); return -1; } doc_transfer_data_s tran_data; memset(&tran_data, 0x00, sizeof(doc_transfer_data_s)); tran_data.userdata = (void **) elist; tran_data.folder_id = NULL; tran_data.with_meta = condition->with_meta; doc_dbg("Get all medias--start"); ret = media_info_foreach_media_from_db(filter, _doc_local_data_get_media_list_cb, &tran_data); doc_dbg("Get all medias--over"); doc_data_util_destroy_filter(filter); if (ret != MEDIA_CONTENT_ERROR_NONE) { doc_dbgE("Get all medias failed[d]!", ret); return -1; } return 0; }