void files_open(FS_ArchiveID archiveId, FS_Path archivePath) { files_data* data = (files_data*) calloc(1, sizeof(files_data)); if(data == NULL) { error_display(NULL, NULL, NULL, "Failed to allocate files data."); return; } data->populateData.recursive = false; data->populateData.includeBase = false; data->populateData.dirsFirst = true; data->populateData.filter = files_filter; data->populateData.filterData = data; data->populateData.finished = true; data->populated = false; data->showDirectories = true; data->showCias = true; data->showTickets = true; data->showMisc = true; data->archiveId = archiveId; data->archivePath.type = archivePath.type; data->archivePath.size = archivePath.size; if(archivePath.data != NULL) { data->archivePath.data = calloc(1, data->archivePath.size); if(data->archivePath.data == NULL) { error_display(NULL, NULL, NULL, "Failed to allocate files data."); files_free_data(data); return; } memcpy((void*) data->archivePath.data, archivePath.data, data->archivePath.size); } else { data->archivePath.data = NULL; } snprintf(data->currDir, FILE_PATH_MAX, "/"); data->dirItem = NULL; Result res = 0; if(R_FAILED(res = FSUSER_OpenArchive(&data->archive, archiveId, archivePath))) { error_display_res(NULL, NULL, NULL, res, "Failed to open file listing archive."); files_free_data(data); return; } list_display("Files", "A: Select, B: Back, X: Refresh, Y: Dir, Select: Filter", data, files_update, files_draw_top); }
static void files_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; while(!util_is_dir(listData->archive, listData->currDir)) { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } if(hidKeysDown() & KEY_B) { if(strncmp(listData->currDir, "/", FILE_PATH_MAX) == 0) { ui_pop(); files_free_data(listData); task_clear_files(items); list_destroy(view); return; } else { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } } if(hidKeysDown() & KEY_SELECT) { files_filters_open(listData); return; } if((hidKeysDown() & KEY_Y) && listData->dirItem != NULL) { files_action_open(items, listData->dirItem, listData); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { file_info* fileInfo = (file_info*) selected->data; if(fileInfo->isDirectory) { files_navigate(listData, items, fileInfo->path); } else { files_action_open(items, selected, listData); return; } } if(!listData->populated || (hidKeysDown() & KEY_X)) { files_repopulate(listData, items); } if(listData->populateData.finished && R_FAILED(listData->populateData.result)) { error_display_res(NULL, NULL, NULL, listData->populateData.result, "Failed to populate file list."); listData->populateData.result = 0; } }
static void files_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; if(listData->populated) { // Detect whether the current directory was renamed by an action. list_item* currDirItem = linked_list_get(items, 0); if(currDirItem != NULL && strncmp(listData->currDir, ((file_info*) currDirItem->data)->path, FILE_PATH_MAX) != 0) { strncpy(listData->currDir, ((file_info*) currDirItem->data)->path, FILE_PATH_MAX); } } while(!util_is_dir(listData->archive, listData->currDir)) { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } if(hidKeysDown() & KEY_B) { if(strncmp(listData->currDir, "/", FILE_PATH_MAX) == 0) { ui_pop(); files_free_data(listData); task_clear_files(items); list_destroy(view); return; } else { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } } if(hidKeysDown() & KEY_SELECT) { files_filters_open(listData); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { file_info* fileInfo = (file_info*) selected->data; if((fileInfo->attributes & FS_ATTRIBUTE_DIRECTORY) && strncmp(selected->name, "<current directory>", LIST_ITEM_NAME_MAX) != 0) { files_navigate(listData, items, fileInfo->path); } else { files_action_open(items, selected, listData); return; } } if(!listData->populated || (hidKeysDown() & KEY_X)) { files_repopulate(listData, items); } if(listData->populateData.finished && R_FAILED(listData->populateData.result)) { error_display_res(NULL, NULL, listData->populateData.result, "Failed to populate file list."); listData->populateData.result = 0; } }