Display all file attributes.

This commit is contained in:
Steven Smith 2016-07-10 11:55:29 -07:00
parent 2f08d8435e
commit 6696b675ae
10 changed files with 69 additions and 36 deletions

View File

@ -406,9 +406,9 @@ int util_compare_file_infos(const void** p1, const void** p2) {
file_info* f1 = (file_info*) info1->data;
file_info* f2 = (file_info*) info2->data;
if(f1->isDirectory && !f2->isDirectory) {
if((f1->attributes & FS_ATTRIBUTE_DIRECTORY) && !(f2->attributes & FS_ATTRIBUTE_DIRECTORY)) {
return -1;
} else if(!f1->isDirectory && f2->isDirectory) {
} else if(!(f1->attributes & FS_ATTRIBUTE_DIRECTORY) && (f2->attributes & FS_ATTRIBUTE_DIRECTORY)) {
return 1;
} else {
return strncasecmp(f1->name, f2->name, FILE_NAME_MAX);

View File

@ -323,6 +323,8 @@ static const char* description_to_string(Result res) {
return "Illegal operation / File in use";
case 231:
return "Resource locked";
case 250:
return "FAT operation denied";
case 265:
return "Bus: Timeout";
case 331:

View File

@ -312,7 +312,7 @@ static void action_install_cias_internal(linked_list* items, list_item* selected
popData.archive = data->target->archive;
strncpy(popData.path, data->target->path, FILE_PATH_MAX);
popData.recursive = false;
popData.includeBase = !data->target->isDirectory;
popData.includeBase = !(data->target->attributes & FS_ATTRIBUTE_DIRECTORY);
popData.filter = util_filter_cias;
popData.filterData = NULL;

View File

@ -275,7 +275,7 @@ static void action_install_tickets_internal(linked_list* items, list_item* selec
popData.archive = data->target->archive;
strncpy(popData.path, data->target->path, FILE_PATH_MAX);
popData.recursive = false;
popData.includeBase = !data->target->isDirectory;
popData.includeBase = !(data->target->attributes & FS_ATTRIBUTE_DIRECTORY);
popData.filter = util_filter_tickets;
popData.filterData = NULL;

View File

@ -46,7 +46,7 @@ static void action_paste_files_get_dst_path(paste_files_data* data, u32 index, c
}
char baseDstPath[FILE_PATH_MAX];
if(data->target->isDirectory) {
if(data->target->attributes & FS_ATTRIBUTE_DIRECTORY) {
strncpy(baseDstPath, data->target->path, FILE_PATH_MAX);
} else {
util_get_parent_path(baseDstPath, data->target->path, FILE_PATH_MAX);
@ -58,7 +58,7 @@ static void action_paste_files_get_dst_path(paste_files_data* data, u32 index, c
static Result action_paste_files_is_src_directory(void* data, u32 index, bool* isDirectory) {
paste_files_data* pasteData = (paste_files_data*) data;
*isDirectory = ((file_info*) ((list_item*) linked_list_get(&pasteData->contents, index))->data)->isDirectory;
*isDirectory = (bool) (((file_info*) ((list_item*) linked_list_get(&pasteData->contents, index))->data)->attributes & FS_ATTRIBUTE_DIRECTORY);
return 0;
}
@ -75,7 +75,7 @@ static Result action_paste_files_make_dst_directory(void* data, u32 index) {
util_get_parent_path(parentPath, dstPath, FILE_PATH_MAX);
char baseDstPath[FILE_PATH_MAX];
if(pasteData->target->isDirectory) {
if(pasteData->target->attributes & FS_ATTRIBUTE_DIRECTORY) {
strncpy(baseDstPath, pasteData->target->path, FILE_PATH_MAX);
} else {
util_get_parent_path(baseDstPath, pasteData->target->path, FILE_PATH_MAX);
@ -164,7 +164,7 @@ static Result action_paste_files_close_dst(void* data, u32 index, bool succeeded
util_get_parent_path(parentPath, dstPath, FILE_PATH_MAX);
char baseDstPath[FILE_PATH_MAX];
if(pasteData->target->isDirectory) {
if(pasteData->target->attributes & FS_ATTRIBUTE_DIRECTORY) {
strncpy(baseDstPath, pasteData->target->path, FILE_PATH_MAX);
} else {
util_get_parent_path(baseDstPath, pasteData->target->path, FILE_PATH_MAX);
@ -312,21 +312,12 @@ void action_paste_contents(linked_list* items, list_item* selected) {
data->pasteInfo.finished = true;
list_item* clipboardItem = NULL;
Result createRes = 0;
if(R_FAILED(createRes = task_create_file_item(&clipboardItem, clipboard_get_archive(), clipboard_get_path()))) {
error_display_res(NULL, NULL, createRes, "Failed to retrieve clipboard content info.");
action_paste_files_free_data(data);
return;
}
linked_list_init(&data->contents);
populate_files_data popData;
popData.items = &data->contents;
popData.archive = ((file_info*) clipboardItem->data)->archive;
strncpy(popData.path, ((file_info*) clipboardItem->data)->path, FILE_PATH_MAX);
popData.archive = clipboard_get_archive();
strncpy(popData.path, clipboard_get_path(), FILE_PATH_MAX);
popData.recursive = true;
popData.includeBase = !clipboard_is_contents_only() || !util_is_dir(clipboard_get_archive(), clipboard_get_path());
popData.filter = NULL;
@ -336,7 +327,6 @@ void action_paste_contents(linked_list* items, list_item* selected) {
if(R_FAILED(listRes)) {
error_display_res(NULL, NULL, listRes, "Failed to initiate clipboard content list population.");
task_free_file(clipboardItem);
action_paste_files_free_data(data);
return;
}
@ -345,8 +335,6 @@ void action_paste_contents(linked_list* items, list_item* selected) {
svcSleepThread(1000000);
}
task_free_file(clipboardItem);
if(R_FAILED(popData.result)) {
error_display_res(NULL, NULL, popData.result, "Failed to populate clipboard content list.");

View File

@ -38,7 +38,7 @@ void action_rename(linked_list* items, list_item* selected) {
if(srcFsPath != NULL) {
FS_Path* dstFsPath = util_make_path_utf8(dstPath);
if(dstFsPath != NULL) {
if(targetInfo->isDirectory) {
if(targetInfo->attributes & FS_ATTRIBUTE_DIRECTORY) {
res = FSUSER_RenameDirectory(targetInfo->archive, *srcFsPath, targetInfo->archive, *dstFsPath);
} else {
res = FSUSER_RenameFile(targetInfo->archive, *srcFsPath, targetInfo->archive, *dstFsPath);

View File

@ -95,7 +95,7 @@ static void files_action_update(ui_view* view, void* data, linked_list* items, l
Result res = 0;
if(R_SUCCEEDED(res = clipboard_set_contents(actionData->parent->archive, info->path, selected == &copy_all_contents))) {
prompt_display("Success", selected == &copy_all_contents ? "Current directory contents copied to clipboard." : info->isDirectory ? "Current directory copied to clipboard." : "File copied to clipboard.", COLOR_TEXT, false, info, ui_draw_file_info, NULL);
prompt_display("Success", selected == &copy_all_contents ? "Current directory contents copied to clipboard." : (info->attributes & FS_ATTRIBUTE_DIRECTORY) ? "Current directory copied to clipboard." : "File copied to clipboard.", COLOR_TEXT, false, info, ui_draw_file_info, NULL);
} else {
error_display_res(info, ui_draw_file_info, res, "Failed to copy to clipboard.");
}
@ -111,7 +111,7 @@ static void files_action_update(ui_view* view, void* data, linked_list* items, l
if(linked_list_size(items) == 0) {
file_info* info = (file_info*) actionData->selected->data;
if(info->isDirectory) {
if(info->attributes & FS_ATTRIBUTE_DIRECTORY) {
if(actionData->containsCias) {
linked_list_add(items, &install_all_cias);
linked_list_add(items, &install_and_delete_all_cias);
@ -178,7 +178,7 @@ static void files_action_open(linked_list* items, list_item* selected, files_dat
}
}
list_display(((file_info*) selected->data)->isDirectory ? "Directory Action" : "File Action", "A: Select, B: Return", data, files_action_update, files_action_draw_top);
list_display((((file_info*) selected->data)->attributes & FS_ATTRIBUTE_DIRECTORY) ? "Directory Action" : "File Action", "A: Select, B: Return", data, files_action_update, files_action_draw_top);
}
static void files_filters_add_entry(linked_list* items, const char* name, bool* val) {
@ -329,7 +329,7 @@ static void files_update(ui_view* view, void* data, linked_list* items, list_ite
if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) {
file_info* fileInfo = (file_info*) selected->data;
if(fileInfo->isDirectory && strncmp(selected->name, "<current directory>", LIST_ITEM_NAME_MAX) != 0) {
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);

View File

@ -23,8 +23,11 @@ Result task_create_file_item(list_item** out, FS_Archive archive, const char* pa
if(fileInfo != NULL) {
fileInfo->archive = archive;
util_get_path_file(fileInfo->name, path, FILE_NAME_MAX);
fileInfo->attributes = 0;
fileInfo->size = 0;
fileInfo->isCia = false;
fileInfo->isTicket = false;
if(util_is_dir(archive, path)) {
item->color = COLOR_DIRECTORY;
@ -36,17 +39,17 @@ Result task_create_file_item(list_item** out, FS_Archive archive, const char* pa
strncpy(fileInfo->path, path, FILE_PATH_MAX);
}
fileInfo->isDirectory = true;
fileInfo->attributes = FS_ATTRIBUTE_DIRECTORY;
} else {
item->color = COLOR_FILE;
strncpy(fileInfo->path, path, FILE_PATH_MAX);
fileInfo->isDirectory = false;
FS_Path* fileFsPath = util_make_path_utf8(fileInfo->path);
if(fileFsPath != NULL) {
Handle fileHandle;
if(R_SUCCEEDED(FSUSER_OpenFile(&fileHandle, archive, *fileFsPath, FS_OPEN_READ, 0))) {
FSFILE_GetAttributes(fileHandle, &fileInfo->attributes);
FSFILE_GetSize(fileHandle, &fileInfo->size);
size_t len = strlen(fileInfo->path);
@ -149,7 +152,7 @@ static void task_populate_files_thread(void* arg) {
list_item* baseItem = NULL;
if(R_SUCCEEDED(res = task_create_file_item(&baseItem, data->archive, data->path))) {
file_info* baseInfo = (file_info*) baseItem->data;
if(baseInfo->isDirectory) {
if(baseInfo->attributes & FS_ATTRIBUTE_DIRECTORY) {
strncpy(baseItem->name, "<current directory>", LIST_ITEM_NAME_MAX);
} else {
strncpy(baseItem->name, "<current file>", LIST_ITEM_NAME_MAX);
@ -171,7 +174,7 @@ static void task_populate_files_thread(void* arg) {
linked_list_add(data->items, currItem);
}
if(curr->isDirectory) {
if(curr->attributes & FS_ATTRIBUTE_DIRECTORY) {
FS_Path* fsPath = util_make_path_utf8(curr->path);
if(fsPath != NULL) {
Handle dirHandle = 0;
@ -198,7 +201,7 @@ static void task_populate_files_thread(void* arg) {
list_item* item = NULL;
if(R_SUCCEEDED(res = task_create_file_item(&item, curr->archive, path))) {
if(data->recursive && ((file_info*) item->data)->isDirectory) {
if(data->recursive && (((file_info*) item->data)->attributes & FS_ATTRIBUTE_DIRECTORY)) {
linked_list_add(&queue, item);
} else {
linked_list_add(data->items, item);

View File

@ -58,7 +58,7 @@ typedef struct file_info_s {
FS_Archive archive;
char name[FILE_NAME_MAX];
char path[FILE_PATH_MAX];
bool isDirectory;
u32 attributes;
// Files only
u64 size;

View File

@ -400,7 +400,49 @@ void ui_draw_file_info(ui_view* view, void* data, float x1, float y1, float x2,
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Name: %.48s\n", info->name);
}
if(!info->isDirectory) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Attributes: ");
if(info->attributes & (FS_ATTRIBUTE_DIRECTORY | FS_ATTRIBUTE_HIDDEN | FS_ATTRIBUTE_ARCHIVE | FS_ATTRIBUTE_READ_ONLY)) {
bool needsSeparator = false;
if(info->attributes & FS_ATTRIBUTE_DIRECTORY) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Directory");
needsSeparator = true;
}
if(info->attributes & FS_ATTRIBUTE_HIDDEN) {
if(needsSeparator) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, ", ");
}
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Hidden");
needsSeparator = true;
}
if(info->attributes & FS_ATTRIBUTE_ARCHIVE) {
if(needsSeparator) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, ", ");
}
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Archive");
needsSeparator = true;
}
if(info->attributes & FS_ATTRIBUTE_READ_ONLY) {
if(needsSeparator) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, ", ");
}
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Read Only");
needsSeparator = true;
}
} else {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "None");
}
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "\n");
if(!(info->attributes & FS_ATTRIBUTE_DIRECTORY)) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Size: %.2f %s\n", util_get_display_size(info->size), util_get_display_size_units(info->size));
if(info->isCia) {
@ -460,8 +502,6 @@ void ui_draw_file_info(ui_view* view, void* data, float x1, float y1, float x2,
} else if(info->isTicket) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Ticket ID: %016llX", info->ticketInfo.titleId);
}
} else {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Directory");
}
float infoWidth;