Use filters when retrieving file information in actions.

This commit is contained in:
Steven Smith 2016-05-27 17:10:04 -07:00
parent b87332ff68
commit 9ec05c8860
7 changed files with 32 additions and 36 deletions

View File

@ -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;
}

View File

@ -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);
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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)) {

View File

@ -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;
}
}