1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 04:34:43 +04:00

Fix large folders parsing

This commit is contained in:
MX
2023-02-12 23:55:39 +03:00
parent 8b22952dac
commit ca12057426
2 changed files with 119 additions and 16 deletions

View File

@@ -189,6 +189,87 @@ static bool browser_folder_init(
return state;
}
static bool browser_folder_load_chunked(
BrowserWorker* browser,
FuriString* path,
uint32_t offset,
uint32_t count) {
FileInfo file_info;
Storage* storage = furi_record_open(RECORD_STORAGE);
File* directory = storage_file_alloc(storage);
char name_temp[FILE_NAME_LEN_MAX];
FuriString* name_str;
name_str = furi_string_alloc();
uint32_t items_cnt = 0;
do {
if(!storage_dir_open(directory, furi_string_get_cstr(path))) {
break;
}
items_cnt = 0;
while(items_cnt < offset) {
if(!storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX)) {
break;
}
if(storage_file_get_error(directory) == FSE_OK) {
furi_string_set(name_str, name_temp);
if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
items_cnt++;
}
} else {
break;
}
}
if(items_cnt != offset) {
break;
}
if(browser->list_load_cb) {
browser->list_load_cb(browser->cb_ctx, offset);
}
items_cnt = 0;
while(items_cnt < count) {
if(!storage_dir_read(directory, &file_info, name_temp, FILE_NAME_LEN_MAX)) {
break;
}
if(storage_file_get_error(directory) == FSE_OK) {
furi_string_set(name_str, name_temp);
if(browser_filter_by_name(browser, name_str, (file_info.flags & FSF_DIRECTORY))) {
furi_string_printf(name_str, "%s/%s", furi_string_get_cstr(path), name_temp);
if(browser->list_item_cb) {
browser->list_item_cb(
browser->cb_ctx,
name_str,
items_cnt,
(file_info.flags & FSF_DIRECTORY),
false);
}
items_cnt++;
}
} else {
break;
}
}
if(browser->list_item_cb) {
browser->list_item_cb(browser->cb_ctx, NULL, 0, false, true);
}
} while(0);
furi_string_free(name_str);
storage_dir_close(directory);
storage_file_free(directory);
furi_record_close(RECORD_STORAGE);
return (items_cnt == count);
}
static bool
browser_folder_load(BrowserWorker* browser, FuriString* path, uint32_t offset, uint32_t count) {
FileInfo file_info;
@@ -246,7 +327,11 @@ static bool
furi_string_printf(name_str, "%s/%s", furi_string_get_cstr(path), name_temp);
if(browser->list_item_cb) {
browser->list_item_cb(
browser->cb_ctx, name_str, items_cnt, (file_info.flags & FSF_DIRECTORY), false);
browser->cb_ctx,
name_str,
items_cnt,
(file_info.flags & FSF_DIRECTORY),
false);
}
items_cnt++;
}
@@ -361,7 +446,12 @@ static int32_t browser_worker(void* context) {
if(flags & WorkerEvtLoad) {
FURI_LOG_D(
TAG, "Load offset: %lu cnt: %lu", browser->load_offset, browser->load_count);
browser_folder_load(browser, path, browser->load_offset, browser->load_count);
if(items_cnt > 430) {
browser_folder_load_chunked(
browser, path, browser->load_offset, browser->load_count);
} else {
browser_folder_load(browser, path, browser->load_offset, browser->load_count);
}
}
if(flags & WorkerEvtStop) {