From ef6bafd506e616959ba04fd838bc8756564e7106 Mon Sep 17 00:00:00 2001 From: ribbid987 Date: Sun, 4 Sep 2016 14:29:21 +0200 Subject: [PATCH 1/5] fixes #22 --- language.c | 3 +- language.h | 3 +- main.c | 72 ++++++++++++++++++++++++++++++++++++++-- resources/english_us.txt | 3 +- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/language.c b/language.c index 5242e3c..fc481b2 100644 --- a/language.c +++ b/language.c @@ -95,6 +95,7 @@ void loadLanguage(int id) { LANGUAGE_ENTRY(WIFI_ERROR), LANGUAGE_ENTRY(FTP_SERVER), LANGUAGE_ENTRY(SYS_INFO), + LANGUAGE_ENTRY(INSTALL_ALL), LANGUAGE_ENTRY(UPDATE_QUESTION), }; @@ -109,4 +110,4 @@ void loadLanguage(int id) { readConfig(path, language_entries, sizeof(language_entries) / sizeof(ConfigEntry)); } } -} \ No newline at end of file +} diff --git a/language.h b/language.h index f4e3610..c87500d 100644 --- a/language.h +++ b/language.h @@ -53,6 +53,7 @@ enum LanguageContainer { WIFI_ERROR, FTP_SERVER, SYS_INFO, + INSTALL_ALL, UPDATE_QUESTION, LANGUAGE_CONTRAINER_SIZE, }; @@ -62,4 +63,4 @@ extern char *language_container[LANGUAGE_CONTRAINER_SIZE]; void freeLanguageContainer(); void loadLanguage(int id); -#endif \ No newline at end of file +#endif diff --git a/main.c b/main.c index 8d2d481..7210a45 100644 --- a/main.c +++ b/main.c @@ -56,10 +56,10 @@ int _newlib_heap_size_user = 64 * 1024 * 1024; #define MAX_DIR_LEVELS 1024 // File lists -static FileList file_list, mark_list, copy_list; +static FileList file_list, mark_list, copy_list, install_list; // Paths -static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH]; +static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH], installListPath[MAX_PATH_LENGTH]; // Position static int base_pos = 0, rel_pos = 0; @@ -234,6 +234,24 @@ void refreshCopyList() { } } +void refreshInstallList() { + FileListEntry *entry = install_list.head; + + int length = install_list.length; + + if (length > 0) { + // Get next entry already now to prevent crash after entry is removed + FileListEntry *next = entry->next; + + fileListRemoveEntry(&install_list, entry); + + // Next + if(next != NULL) { + entry = next; + } + } +} + void resetFileLists() { memset(&file_list, 0, sizeof(FileList)); memset(&mark_list, 0, sizeof(FileList)); @@ -407,6 +425,7 @@ void drawShellInfo(char *path) { enum MenuEntrys { MENU_ENTRY_MARK_UNMARK_ALL, + MENU_ENTRY_INSTALL_ALL, MENU_ENTRY_EMPTY_1, MENU_ENTRY_MOVE, MENU_ENTRY_COPY, @@ -431,6 +450,7 @@ typedef struct { MenuEntry menu_entries[] = { { MARK_ALL, VISIBILITY_INVISIBLE }, + { INSTALL_ALL, VISIBILITY_INVISIBLE }, { -1, VISIBILITY_UNUSED }, { MOVE, VISIBILITY_INVISIBLE }, { COPY, VISIBILITY_INVISIBLE }, @@ -458,6 +478,7 @@ void initContextMenu() { // Invisble entries when on '..' if (strcmp(file_entry->name, DIR_UP) == 0) { menu_entries[MENU_ENTRY_MARK_UNMARK_ALL].visibility = VISIBILITY_INVISIBLE; + menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_MOVE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_COPY].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_DELETE].visibility = VISIBILITY_INVISIBLE; @@ -470,6 +491,7 @@ void initContextMenu() { // Invisble write operations in archives if (isInArchive()) { // TODO: read-only mount points + menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_MOVE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_PASTE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_DELETE].visibility = VISIBILITY_INVISIBLE; @@ -733,6 +755,36 @@ void contextMenuCtrl() { dialog_step = DIALOG_STEP_NEW_FOLDER; break; } + + case MENU_ENTRY_INSTALL_ALL: + { + // Empty install list + fileListEmpty(&install_list); + + FileListEntry *file_entry = file_list.head->next; // Ignore '..' + + int i; + for (i = 0; i < file_list.length - 1; i++) { + char fileInstallPath[MAX_PATH_LENGTH]; + snprintf(fileInstallPath, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); + + int type = getFileType(fileInstallPath); + if (type == FILE_TYPE_VPK) { + FileListEntry *install_entry = malloc(sizeof(FileListEntry)); + memcpy(install_entry, file_entry, sizeof(FileListEntry)); + fileListAddEntry(&install_list, install_entry, SORT_NONE); + } + + // Next + file_entry = file_entry->next; + } + strcpy(install_list.path, file_list.path); + + initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_QUESTION]); + dialog_step = DIALOG_STEP_INSTALL_QUESTION; + + break; + } } ctx_menu_mode = CONTEXT_MENU_CLOSING; @@ -908,7 +960,13 @@ int dialogSteps() { case DIALOG_STEP_INSTALL_CONFIRMED: if (msg_result == MESSAGE_DIALOG_RESULT_RUNNING) { InstallArguments args; - args.file = cur_file; + if(install_list.length > 0) { + FileListEntry *entryInstallList = install_list.head; + snprintf(installListPath, MAX_PATH_LENGTH, "%s%s", install_list.path, entryInstallList->name); + args.file = installListPath; + } else { + args.file = cur_file; + } SceUID thid = sceKernelCreateThread("install_thread", (SceKernelThreadEntry)install_thread, 0x40, 0x10000, 0, 0, NULL); if (thid >= 0) @@ -1126,6 +1184,14 @@ int shellMain() { // Control if (dialog_step == DIALOG_STEP_NONE) { + if(install_list.length > 0) { + refreshInstallList(); + if(install_list.length > 0) { + initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_QUESTION]); + dialog_step = DIALOG_STEP_INSTALL_QUESTION; + } + } + if (ctx_menu_mode != CONTEXT_MENU_CLOSED) { contextMenuCtrl(); } else { diff --git a/resources/english_us.txt b/resources/english_us.txt index 3a0d2db..992fe72 100644 --- a/resources/english_us.txt +++ b/resources/english_us.txt @@ -33,4 +33,5 @@ SAVE_MODIFICATIONS = "Do you want to save your modifications?" WIFI_ERROR = "You must use Wi-Fi to do this." FTP_SERVER = "FTP server is now running at\ftp://%s:%i\\Press 'OK' to keep it in background.\Press 'Cancel' to disconnect." SYS_INFO = "System software: %s\Model: 0x%08X\MAC address: %s\IP address: %s\Memory card: %s/%s" -UPDATE_QUESTION = "VitaShell %s is now available.\\Do you want to update the application?" \ No newline at end of file +INSTALL_ALL = "Install All" +UPDATE_QUESTION = "VitaShell %s is now available.\\Do you want to update the application?" From 40a3eeb698f7b39c643452ef9b646dc1ea2eec79 Mon Sep 17 00:00:00 2001 From: TheOfficialFloW Date: Sun, 4 Sep 2016 14:37:42 +0200 Subject: [PATCH 2/5] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8e6bc85..0733245 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,14 @@ You can customize those files: - **'ux0:VitaShell/theme/YOUR_THEME_NAME/battery_bar_red.png'**: Red battery bar - **'ux0:VitaShell/theme/YOUR_THEME_NAME/battery_bar_charge.png'**: Charging battery bar - **'ux0:VitaShell/theme/YOUR_THEME_NAME/ftp.png'**: Ftp icon +- **'ux0:VitaShell/theme/YOUR_THEME_NAME/audio_icon.png'**: Audio icon - **'ux0:VitaShell/theme/YOUR_THEME_NAME/archive_icon.png'**: Archive icon - **'ux0:VitaShell/theme/YOUR_THEME_NAME/file_icon.png'**: File icon - **'ux0:VitaShell/theme/YOUR_THEME_NAME/folder_icon.png'**: Folder icon - **'ux0:VitaShell/theme/YOUR_THEME_NAME/image_icon.png'**: Image icon +- **'ux0:VitaShell/theme/YOUR_THEME_NAME/sfo_icon.png'**: SFO icon +- **'ux0:VitaShell/theme/YOUR_THEME_NAME/text_icon.png'**: Text icon + **Theme setting:** VitaShell will load the theme that is set in **'ux0:VitaShell/theme/theme.txt'** (THEME_NAME = "YOUR_THEME_NAME") From 80e91c89d8ad373effbc663c31642211b9000162 Mon Sep 17 00:00:00 2001 From: ribbid987 Date: Sun, 4 Sep 2016 14:51:14 +0200 Subject: [PATCH 3/5] Change Entry to top and display only on vpk --- main.c | 10 ++++++---- resources/english_us.txt | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/main.c b/main.c index 7210a45..6415d70 100644 --- a/main.c +++ b/main.c @@ -424,8 +424,8 @@ void drawShellInfo(char *path) { } enum MenuEntrys { - MENU_ENTRY_MARK_UNMARK_ALL, MENU_ENTRY_INSTALL_ALL, + MENU_ENTRY_MARK_UNMARK_ALL, MENU_ENTRY_EMPTY_1, MENU_ENTRY_MOVE, MENU_ENTRY_COPY, @@ -449,8 +449,8 @@ typedef struct { } MenuEntry; MenuEntry menu_entries[] = { - { MARK_ALL, VISIBILITY_INVISIBLE }, { INSTALL_ALL, VISIBILITY_INVISIBLE }, + { MARK_ALL, VISIBILITY_INVISIBLE }, { -1, VISIBILITY_UNUSED }, { MOVE, VISIBILITY_INVISIBLE }, { COPY, VISIBILITY_INVISIBLE }, @@ -478,7 +478,6 @@ void initContextMenu() { // Invisble entries when on '..' if (strcmp(file_entry->name, DIR_UP) == 0) { menu_entries[MENU_ENTRY_MARK_UNMARK_ALL].visibility = VISIBILITY_INVISIBLE; - menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_MOVE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_COPY].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_DELETE].visibility = VISIBILITY_INVISIBLE; @@ -491,7 +490,6 @@ void initContextMenu() { // Invisble write operations in archives if (isInArchive()) { // TODO: read-only mount points - menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_MOVE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_PASTE].visibility = VISIBILITY_INVISIBLE; menu_entries[MENU_ENTRY_DELETE].visibility = VISIBILITY_INVISIBLE; @@ -499,6 +497,10 @@ void initContextMenu() { menu_entries[MENU_ENTRY_NEW_FOLDER].visibility = VISIBILITY_INVISIBLE; } + if(file_entry->type != FILE_TYPE_VPK) { + menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE; + } + // TODO: Moving from one mount point to another is not possible // Mark/Unmark all text diff --git a/resources/english_us.txt b/resources/english_us.txt index 992fe72..76f41db 100644 --- a/resources/english_us.txt +++ b/resources/english_us.txt @@ -33,5 +33,5 @@ SAVE_MODIFICATIONS = "Do you want to save your modifications?" WIFI_ERROR = "You must use Wi-Fi to do this." FTP_SERVER = "FTP server is now running at\ftp://%s:%i\\Press 'OK' to keep it in background.\Press 'Cancel' to disconnect." SYS_INFO = "System software: %s\Model: 0x%08X\MAC address: %s\IP address: %s\Memory card: %s/%s" -INSTALL_ALL = "Install All" +INSTALL_ALL = "Install all" UPDATE_QUESTION = "VitaShell %s is now available.\\Do you want to update the application?" From 45d6acd8a983d618ca15a197dcde8036f78d3822 Mon Sep 17 00:00:00 2001 From: TheFloW Date: Sun, 4 Sep 2016 15:12:31 +0200 Subject: [PATCH 4/5] Improved install-all feature --- language.c | 1 + language.h | 1 + main.c | 66 +++++++++++++++++----------------------- resources/english_us.txt | 1 + 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/language.c b/language.c index fc481b2..e297428 100644 --- a/language.c +++ b/language.c @@ -89,6 +89,7 @@ void loadLanguage(int id) { LANGUAGE_ENTRY(DELETE_FILE_QUESTION), LANGUAGE_ENTRY(DELETE_FOLDER_QUESTION), LANGUAGE_ENTRY(DELETE_FILES_FOLDERS_QUESTION), + LANGUAGE_ENTRY(INSTALL_ALL_QUESTION), LANGUAGE_ENTRY(INSTALL_QUESTION), LANGUAGE_ENTRY(INSTALL_WARNING), LANGUAGE_ENTRY(SAVE_MODIFICATIONS), diff --git a/language.h b/language.h index c87500d..ba005c1 100644 --- a/language.h +++ b/language.h @@ -47,6 +47,7 @@ enum LanguageContainer { DELETE_FILE_QUESTION, DELETE_FOLDER_QUESTION, DELETE_FILES_FOLDERS_QUESTION, + INSTALL_ALL_QUESTION, INSTALL_QUESTION, INSTALL_WARNING, SAVE_MODIFICATIONS, diff --git a/main.c b/main.c index 6415d70..d836f65 100644 --- a/main.c +++ b/main.c @@ -59,7 +59,7 @@ int _newlib_heap_size_user = 64 * 1024 * 1024; static FileList file_list, mark_list, copy_list, install_list; // Paths -static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH], installListPath[MAX_PATH_LENGTH]; +static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH], install_path[MAX_PATH_LENGTH]; // Position static int base_pos = 0, rel_pos = 0; @@ -234,24 +234,6 @@ void refreshCopyList() { } } -void refreshInstallList() { - FileListEntry *entry = install_list.head; - - int length = install_list.length; - - if (length > 0) { - // Get next entry already now to prevent crash after entry is removed - FileListEntry *next = entry->next; - - fileListRemoveEntry(&install_list, entry); - - // Next - if(next != NULL) { - entry = next; - } - } -} - void resetFileLists() { memset(&file_list, 0, sizeof(FileList)); memset(&mark_list, 0, sizeof(FileList)); @@ -767,22 +749,23 @@ void contextMenuCtrl() { int i; for (i = 0; i < file_list.length - 1; i++) { - char fileInstallPath[MAX_PATH_LENGTH]; - snprintf(fileInstallPath, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); + char path[MAX_PATH_LENGTH]; + snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); - int type = getFileType(fileInstallPath); + int type = getFileType(path); if (type == FILE_TYPE_VPK) { - FileListEntry *install_entry = malloc(sizeof(FileListEntry)); - memcpy(install_entry, file_entry, sizeof(FileListEntry)); - fileListAddEntry(&install_list, install_entry, SORT_NONE); + FileListEntry *install_entry = malloc(sizeof(FileListEntry)); + memcpy(install_entry, file_entry, sizeof(FileListEntry)); + fileListAddEntry(&install_list, install_entry, SORT_NONE); } // Next file_entry = file_entry->next; } + strcpy(install_list.path, file_list.path); - initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_QUESTION]); + initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_ALL_QUESTION]); dialog_step = DIALOG_STEP_INSTALL_QUESTION; break; @@ -813,7 +796,6 @@ int dialogSteps() { // With refresh case DIALOG_STEP_COPIED: case DIALOG_STEP_DELETED: - case DIALOG_STEP_INSTALLED: if (msg_result == MESSAGE_DIALOG_RESULT_NONE || msg_result == MESSAGE_DIALOG_RESULT_FINISHED) { refresh = 1; dialog_step = DIALOG_STEP_NONE; @@ -963,9 +945,12 @@ int dialogSteps() { if (msg_result == MESSAGE_DIALOG_RESULT_RUNNING) { InstallArguments args; if(install_list.length > 0) { - FileListEntry *entryInstallList = install_list.head; - snprintf(installListPath, MAX_PATH_LENGTH, "%s%s", install_list.path, entryInstallList->name); - args.file = installListPath; + FileListEntry *entry = install_list.head; + snprintf(install_path, MAX_PATH_LENGTH, "%s%s", install_list.path, entry->name); + args.file = install_path; + + // Remove entry + fileListRemoveEntry(&install_list, entry); } else { args.file = cur_file; } @@ -988,6 +973,19 @@ int dialogSteps() { break; + case DIALOG_STEP_INSTALLED: + if (msg_result == MESSAGE_DIALOG_RESULT_NONE || msg_result == MESSAGE_DIALOG_RESULT_FINISHED) { + if(install_list.length > 0) { + initMessageDialog(MESSAGE_DIALOG_PROGRESS_BAR, language_container[INSTALLING]); + dialog_step = DIALOG_STEP_INSTALL_CONFIRMED; + break; + } + + dialog_step = DIALOG_STEP_NONE; + } + + break; + case DIALOG_STEP_UPDATE_QUESTION: if (msg_result == MESSAGE_DIALOG_RESULT_YES) { initMessageDialog(MESSAGE_DIALOG_PROGRESS_BAR, language_container[DOWNLOADING]); @@ -1186,14 +1184,6 @@ int shellMain() { // Control if (dialog_step == DIALOG_STEP_NONE) { - if(install_list.length > 0) { - refreshInstallList(); - if(install_list.length > 0) { - initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_QUESTION]); - dialog_step = DIALOG_STEP_INSTALL_QUESTION; - } - } - if (ctx_menu_mode != CONTEXT_MENU_CLOSED) { contextMenuCtrl(); } else { diff --git a/resources/english_us.txt b/resources/english_us.txt index 76f41db..3732502 100644 --- a/resources/english_us.txt +++ b/resources/english_us.txt @@ -27,6 +27,7 @@ EXTRACTING = "Extracting..." DELETE_FILE_QUESTION = "Are you sure you want to delete this file?" DELETE_FOLDER_QUESTION = "Are you sure you want to delete this folder?" DELETE_FILES_FOLDERS_QUESTION = "Are you sure you want to delete these files/folders?" +INSTALL_ALL_QUESTION = "Do you want to install all packages available in this folder?" INSTALL_QUESTION = "Do you want to install this package?" INSTALL_WARNING = "This package requests extended permissions.\It will have access to your personal information.\If you did not obtain it from a trusted source,\please proceed at your own caution.\\Would you like to continue the install?" SAVE_MODIFICATIONS = "Do you want to save your modifications?" From 522683e39fd017fd68438d1f21e508a24e2b898d Mon Sep 17 00:00:00 2001 From: TheFloW Date: Sun, 4 Sep 2016 15:30:39 +0200 Subject: [PATCH 5/5] Set focus on file for install-all feature --- file.c | 18 ++++++++++++++++++ file.h | 4 ++++ main.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/file.c b/file.c index e5b3baa..58be87d 100644 --- a/file.c +++ b/file.c @@ -419,6 +419,24 @@ FileListEntry *fileListGetNthEntry(FileList *list, int n) { return entry; } +int fileListGetNumberByName(FileList *list, char *name) { + FileListEntry *entry = list->head; + + int name_length = strlen(name); + + int n = 0; + + while (entry) { + if (entry->name_length == name_length && strcmp(entry->name, name) == 0) + break; + + n++; + entry = entry->next; + } + + return n; +} + void fileListAddEntry(FileList *list, FileListEntry *entry, int sort) { entry->next = NULL; entry->previous = NULL; diff --git a/file.h b/file.h index 70b861b..61ce4c2 100644 --- a/file.h +++ b/file.h @@ -85,10 +85,14 @@ char **getMountPoints(); FileListEntry *fileListFindEntry(FileList *list, char *name); FileListEntry *fileListGetNthEntry(FileList *list, int n); +int fileListGetNumberByName(FileList *list, char *name); + void fileListAddEntry(FileList *list, FileListEntry *entry, int sort); int fileListRemoveEntry(FileList *list, FileListEntry *entry); int fileListRemoveEntryByName(FileList *list, char *name); + void fileListEmpty(FileList *list); + int fileListGetEntries(FileList *list, char *path); #endif diff --git a/main.c b/main.c index d836f65..db1176a 100644 --- a/main.c +++ b/main.c @@ -149,6 +149,39 @@ DIR_UP_RETURN: dirUpCloseArchive(); } +void focusOnFilename(char *name) { + int name_pos = fileListGetNumberByName(&file_list, name); + if (name_pos < file_list.length) { + while (1) { + int index = base_pos + rel_pos; + if (index == name_pos) + break; + + if (index > name_pos) { + if (rel_pos > 0) { + rel_pos--; + } else { + if (base_pos > 0) { + base_pos--; + } + } + } + + if (index < name_pos) { + if ((rel_pos + 1) < file_list.length) { + if ((rel_pos + 1) < MAX_POSITION) { + rel_pos++; + } else { + if ((base_pos + rel_pos + 1) < file_list.length) { + base_pos++; + } + } + } + } + } + } +} + int refreshFileList() { int ret = 0, res = 0; @@ -949,6 +982,9 @@ int dialogSteps() { snprintf(install_path, MAX_PATH_LENGTH, "%s%s", install_list.path, entry->name); args.file = install_path; + // Focus + focusOnFilename(entry->name); + // Remove entry fileListRemoveEntry(&install_list, entry); } else {