diff --git a/source/core/util.c b/source/core/util.c index 73d0325..62416a9 100644 --- a/source/core/util.c +++ b/source/core/util.c @@ -342,4 +342,22 @@ u16 util_get_tmd_content_count(u8* tmd) { u8* util_get_tmd_content_chunk(u8* tmd, u32 index) { return &tmd[sigSizes[tmd[0x03]] + 0x9C4 + (index * 0x30)]; +} + +bool util_filter_cias(void* data, const char* name, u32 attributes) { + if((attributes & FS_ATTRIBUTE_DIRECTORY) != 0) { + return false; + } + + size_t len = strlen(name); + return len >= 4 && strncasecmp(name + len - 4, ".cia", 4) == 0; +} + +bool util_filter_tickets(void* data, const char* name, u32 attributes) { + if((attributes & FS_ATTRIBUTE_DIRECTORY) != 0) { + return false; + } + + size_t len = strlen(name); + return len >= 4 && strncasecmp(name + len - 4, ".tik", 4) == 0; } \ No newline at end of file diff --git a/source/core/util.h b/source/core/util.h index 8f603d4..bcaa9d9 100644 --- a/source/core/util.h +++ b/source/core/util.h @@ -57,4 +57,7 @@ u64 util_get_cia_title_id(u8* cia); u64 util_get_ticket_title_id(u8* ticket); u64 util_get_tmd_title_id(u8* tmd); u16 util_get_tmd_content_count(u8* tmd); -u8* util_get_tmd_content_chunk(u8* tmd, u32 index); \ No newline at end of file +u8* util_get_tmd_content_chunk(u8* tmd, u32 index); + +bool util_filter_cias(void* data, const char* name, u32 attributes); +bool util_filter_tickets(void* data, const char* name, u32 attributes); \ No newline at end of file diff --git a/source/ui/section/action/deletecontents.c b/source/ui/section/action/deletecontents.c index d9d8506..9f1ebbd 100644 --- a/source/ui/section/action/deletecontents.c +++ b/source/ui/section/action/deletecontents.c @@ -176,6 +176,8 @@ static void action_delete_contents_internal(linked_list* items, list_item* selec popData.recursive = recursive; popData.includeBase = includeBase; popData.dirsFirst = false; + popData.filter = ciasOnly ? util_filter_cias : ticketsOnly ? util_filter_tickets : NULL; + popData.filterData = NULL; Result listRes = task_populate_files(&popData); if(R_FAILED(listRes)) { @@ -196,17 +198,6 @@ static void action_delete_contents_internal(linked_list* items, list_item* selec return; } - linked_list_iter iter; - linked_list_iterate(&data->contents, &iter); - - while(linked_list_iter_has_next(&iter)) { - file_info* info = (file_info*) ((list_item*) linked_list_iter_next(&iter))->data; - - if((ciasOnly && (info->isDirectory || !info->isCia)) || (ticketsOnly && (info->isDirectory || !info->isTicket))) { - linked_list_iter_remove(&iter); - } - } - data->deleteInfo.total = linked_list_size(&data->contents); data->deleteInfo.processed = data->deleteInfo.total; diff --git a/source/ui/section/action/installcias.c b/source/ui/section/action/installcias.c index 757e69a..1fd6bb8 100644 --- a/source/ui/section/action/installcias.c +++ b/source/ui/section/action/installcias.c @@ -283,6 +283,8 @@ static void action_install_cias_internal(linked_list* items, list_item* selected popData.recursive = false; popData.includeBase = !data->target->isDirectory; popData.dirsFirst = false; + popData.filter = util_filter_cias; + popData.filterData = NULL; Result listRes = task_populate_files(&popData); if(R_FAILED(listRes)) { @@ -303,17 +305,6 @@ static void action_install_cias_internal(linked_list* items, list_item* selected return; } - linked_list_iter iter; - linked_list_iterate(&data->contents, &iter); - - while(linked_list_iter_has_next(&iter)) { - file_info* info = (file_info*) ((list_item*) linked_list_iter_next(&iter))->data; - - if(!info->isCia) { - linked_list_iter_remove(&iter); - } - } - data->installInfo.total = linked_list_size(&data->contents); data->installInfo.processed = data->installInfo.total; diff --git a/source/ui/section/action/installtickets.c b/source/ui/section/action/installtickets.c index 1caea79..ff0de5f 100644 --- a/source/ui/section/action/installtickets.c +++ b/source/ui/section/action/installtickets.c @@ -262,6 +262,8 @@ static void action_install_tickets_internal(linked_list* items, list_item* selec popData.recursive = false; popData.includeBase = !data->target->isDirectory; popData.dirsFirst = false; + popData.filter = util_filter_tickets; + popData.filterData = NULL; Result listRes = task_populate_files(&popData); if(R_FAILED(listRes)) { @@ -282,17 +284,6 @@ static void action_install_tickets_internal(linked_list* items, list_item* selec return; } - linked_list_iter iter; - linked_list_iterate(&data->contents, &iter); - - while(linked_list_iter_has_next(&iter)) { - file_info* info = (file_info*) ((list_item*) linked_list_iter_next(&iter))->data; - - if(!info->isTicket) { - linked_list_iter_remove(&iter); - } - } - data->installInfo.total = linked_list_size(&data->contents); data->installInfo.processed = data->installInfo.total; diff --git a/source/ui/section/action/pastefiles.c b/source/ui/section/action/pastefiles.c index 42d3755..c6c3e73 100644 --- a/source/ui/section/action/pastefiles.c +++ b/source/ui/section/action/pastefiles.c @@ -314,6 +314,8 @@ void action_paste_contents(linked_list* items, list_item* selected) { popData.recursive = true; popData.includeBase = !clipboard_is_contents_only() || !util_is_dir(clipboard_get_archive(), clipboard_get_path()); popData.dirsFirst = true; + popData.filter = NULL; + popData.filterData = NULL; Result listRes = task_populate_files(&popData); if(R_FAILED(listRes)) { diff --git a/source/ui/section/files.c b/source/ui/section/files.c index a460020..0aaf18d 100644 --- a/source/ui/section/files.c +++ b/source/ui/section/files.c @@ -342,9 +342,9 @@ static bool files_filter(void* data, const char* name, u32 attributes) { size_t len = strlen(name); if(len >= 4) { const char* extension = name + len - 4; - if(strncmp(extension, ".cia", 4) == 0) { + if(strncasecmp(extension, ".cia", 4) == 0) { return listData->showCias; - } else if(strncmp(extension, ".tik", 4) == 0) { + } else if(strncasecmp(extension, ".tik", 4) == 0) { return listData->showTickets; } }