char *PopCurrentDir(s32 *Selected, s32 *Start) { if (gDirLevel > 1) gDirLevel--; else gDirLevel = 0; *Selected = gSeleted[gDirLevel]; *Start = gStart[gDirLevel]; return PeekCurrentDir(); }
void Menu_WadList(void) { char str [100]; fatFile *fileList = NULL; u32 fileCnt; s32 ret, selected = 0, start = 0; char *tmpPath = malloc (MAX_FILE_PATH_LEN); // wiiNinja: check for malloc error if (tmpPath == NULL) { ret = -999; // What am I gonna use here? printf(" ERROR! Out of memory (ret = %d)\n", ret); return; } printf("[+] Retrieving file list..."); fflush(stdout); gDirLevel = 0; // wiiNinja: The root is always the primary folder // But if the user has a /wad directory, just go there. This makes // both sides of the argument win sprintf(tmpPath, "%s:" WAD_DIRECTORY, fdev->mount); PushCurrentDir(tmpPath,0,0); //if (strcmp (WAD_DIRECTORY, WAD_ROOT_DIRECTORY) != 0) if (strcmp (WAD_DIRECTORY, gConfig.startupPath) != 0) { // If the directory can be successfully opened, it must exists //DIR_ITER *tmpDirPtr = NULL; //tmpDirPtr = diropen(WAD_ROOT_DIRECTORY); //if (tmpDirPtr) //{ // dirclose (tmpDirPtr); // Now push the /wad directory as the current operating folder //sprintf(tmpPath, "%s:" WAD_ROOT_DIRECTORY, fdev->mount); sprintf(tmpPath, "%s:%s", fdev->mount, gConfig.startupPath); //printf ("\nThe final startupPath is: %s\n", tmpPath); //WaitButtons (); PushCurrentDir(tmpPath,0,0); // wiiNinja //} } /* Retrieve filelist */ getList: if (fileList) { free (fileList); fileList = NULL; } ret = __Menu_RetrieveList(tmpPath, &fileList, &fileCnt); if (ret < 0) { printf(" ERROR! (ret = %d)\n", ret); goto err; } /* No files */ if (!fileCnt) { printf(" No files found!\n"); goto err; } for (;;) { u32 cnt; s32 index; /* Clear console */ Con_Clear(); /** Print entries **/ cnt = strlen(tmpPath); if(cnt>30) index = cnt-30; else index = 0; printf("[+] WAD files on [%s]:\n\n", tmpPath+index); /* Print entries */ for (cnt = start; cnt < fileCnt; cnt++) { fatFile *file = &fileList[cnt]; f32 filesize = file->filestat.st_size / MB_SIZE; /* Entries per page limit */ if ((cnt - start) >= ENTRIES_PER_PAGE) break; strncpy(str, file->filename, 48); str[48]=0; /* Print filename */ //printf("\t%2s %s (%.2f MB)\n", (cnt == selected) ? ">>" : " ", file->filename, filesize); if (file->filestat.st_mode & S_IFDIR) // wiiNinja printf("\t%2s [%s]\n", (cnt == selected) ? ">>" : " ", str); else printf("\t%2s %s (%.2f MB)\n", (cnt == selected) ? ">>" : " ", str, filesize); } printf("\n"); printf("[+] Press A button to (un)install a WAD file.\n"); if(gDirLevel>1) printf(" Press B button to go up-level DIR"); else printf(" Press B button to select a storage device"); /** Controls **/ u32 buttons = WaitButtons(); /* DPAD buttons */ if (buttons & (WPAD_BUTTON_UP | WPAD_BUTTON_LEFT)) { selected -= (buttons & WPAD_BUTTON_LEFT) ? ENTRIES_PER_PAGE : 1; if (selected <= -1) selected = (fileCnt - 1); } if (buttons & (WPAD_BUTTON_DOWN | WPAD_BUTTON_RIGHT)) { selected += (buttons & WPAD_BUTTON_RIGHT) ? ENTRIES_PER_PAGE : 1; if (selected >= fileCnt) selected = 0; } /* HOME button */ if (buttons & WPAD_BUTTON_HOME) Restart(); /* A button */ if (buttons & WPAD_BUTTON_A) { fatFile *tmpFile = &fileList[selected]; char *tmpCurPath; if (tmpFile->filestat.st_mode & S_IFDIR) // wiiNinja { if (strcmp (tmpFile->filename, "..") == 0) { selected = 0; start = 0; // Previous dir tmpCurPath = PopCurrentDir(&selected, &start); if (tmpCurPath != NULL) sprintf(tmpPath, "%s", tmpCurPath); goto getList; } else if (IsListFull () == true) { WaitPrompt ("Maximum number of directory levels is reached.\n"); } else { tmpCurPath = PeekCurrentDir (); if (tmpCurPath != NULL) { if(gDirLevel>1) sprintf(tmpPath, "%s/%s", tmpCurPath, tmpFile->filename); else sprintf(tmpPath, "%s%s", tmpCurPath, tmpFile->filename); } // wiiNinja: Need to PopCurrentDir PushCurrentDir (tmpPath, selected, start); selected = 0; start = 0; goto getList; } } else { tmpCurPath = PeekCurrentDir (); if (tmpCurPath != NULL) Menu_WadManage(tmpFile, tmpCurPath); } } /* B button */ if (buttons & WPAD_BUTTON_B) { if(gDirLevel<=1) { return; } char *tmpCurPath; selected = 0; start = 0; // Previous dir tmpCurPath = PopCurrentDir(&selected, &start); if (tmpCurPath != NULL) sprintf(tmpPath, "%s", tmpCurPath); goto getList; //return; } /** Scrolling **/ /* List scrolling */ index = (selected - start); if (index >= ENTRIES_PER_PAGE) start += index - (ENTRIES_PER_PAGE - 1); if (index <= -1) start += index; } err: printf("\n"); printf(" Press any button to continue...\n"); free (tmpPath); /* Wait for button */ WaitButtons(); }
void Menu_WadList(void) { char str [100]; fatFile *fileList = NULL; u32 fileCnt; s32 ret, selected = 0, start = 0; char *tmpPath = malloc (MAX_FILE_PATH_LEN); int installCnt = 0; int uninstallCnt = 0; //fatFile *installFiles = malloc(sizeof(fatFile) * 50); //int installCount = 0; // wiiNinja: check for malloc error if (tmpPath == NULL) { ret = -997; // What am I gonna use here? printf(" ERROR! Out of memory (ret = %d)\n", ret); return; } printf("[+] Retrieving file list..."); fflush(stdout); gDirLevel = 0; // wiiNinja: The root is always the primary folder // But if the user has a /wad directory, just go there. This makes // both sides of the argument win sprintf(tmpPath, "%s:" WAD_DIRECTORY, fdev->mount); PushCurrentDir(tmpPath,0,0); //if (strcmp (WAD_DIRECTORY, WAD_ROOT_DIRECTORY) != 0) if (strcmp (WAD_DIRECTORY, gConfig.startupPath) != 0) { // If the directory can be successfully opened, it must exists //DIR_ITER *tmpDirPtr = NULL; //tmpDirPtr = diropen(WAD_ROOT_DIRECTORY); //if (tmpDirPtr) //{ // dirclose (tmpDirPtr); // Now push the /wad directory as the current operating folder //sprintf(tmpPath, "%s:" WAD_ROOT_DIRECTORY, fdev->mount); sprintf(tmpPath, "%s:%s", fdev->mount, gConfig.startupPath); //printf ("\nThe final startupPath is: %s\n", tmpPath); //WaitButtons (); PushCurrentDir(tmpPath,0,0); // wiiNinja //} } /* Retrieve filelist */ getList: if (fileList) { free (fileList); fileList = NULL; } ret = __Menu_RetrieveList(tmpPath, &fileList, &fileCnt); if (ret < 0) { printf(" ERROR! (ret = %d)\n", ret); goto err; } /* No files */ if (!fileCnt) { printf(" No files found!\n"); goto err; } /* Set install-values to 0 - Leathl */ int counter; for (counter = 0; counter < fileCnt; counter++) { fatFile *file = &fileList[counter]; file->install = 0; } for (;;) { u32 cnt; s32 index; /* Clear console */ Con_Clear(); /** Print entries **/ cnt = strlen(tmpPath); if(cnt>30) index = cnt-30; else index = 0; printf("[+] WAD files on [%s]:\n\n", tmpPath+index); /* Print entries */ for (cnt = start; cnt < fileCnt; cnt++) { fatFile *file = &fileList[cnt]; f32 filesize = file->filestat.st_size / MB_SIZE; /* Entries per page limit */ if ((cnt - start) >= ENTRIES_PER_PAGE) break; strncpy(str, file->filename, 40); //Only 40 chars to fit the screen str[40]=0; /* Print filename */ //printf("\t%2s %s (%.2f MB)\n", (cnt == selected) ? ">>" : " ", file->filename, filesize); if (file->filestat.st_mode & S_IFDIR) // wiiNinja printf("\t%2s [%s]\n", (cnt == selected) ? ">>" : " ", str); else printf("\t%2s%s%s (%.2f MB)\n", (cnt == selected) ? ">>" : " ", (file->install == 1) ? "+" : ((file->install == 2) ? "-" : " "), str, filesize); } printf("\n"); printf("[+] Press A to (un)install."); if(gDirLevel>1) printf(" Press B to go up-level DIR.\n"); else printf(" Press B to select a device.\n"); printf(" Use + and - to (un)mark. Press 1 for file operations."); /** Controls **/ u32 buttons = WaitButtons(); /* DPAD buttons */ if (buttons & WPAD_BUTTON_UP) { selected--; if (selected <= -1) selected = (fileCnt - 1); } if (buttons & WPAD_BUTTON_LEFT) { selected = selected + ENTRIES_PER_PAGE; if (selected >= fileCnt) selected = 0; } if (buttons & WPAD_BUTTON_DOWN) { selected ++; if (selected >= fileCnt) selected = 0; } if (buttons & WPAD_BUTTON_RIGHT) { selected = selected - ENTRIES_PER_PAGE; if (selected <= -1) selected = (fileCnt - 1); } /* HOME button */ if (buttons & WPAD_BUTTON_HOME) Restart(); /* Plus Button - Leathl */ if (buttons & WPAD_BUTTON_PLUS) { if(Wpad_TimeButton()) { installCnt = 0; int i = 0; while( i < fileCnt) { fatFile *file = &fileList[i]; if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 0)) { file->install = 1; installCnt += 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 1)) { file->install = 0; installCnt -= 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 2)) { file->install = 1; installCnt += 1; uninstallCnt -= 1; } i++; } } else { fatFile *file = &fileList[selected]; if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 0)) { file->install = 1; installCnt += 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 1)) { file->install = 0; installCnt -= 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 2)) { file->install = 1; installCnt += 1; uninstallCnt -= 1; } selected++; if (selected >= fileCnt) selected = 0; } } /* Minus Button - Leathl */ if (buttons & WPAD_BUTTON_MINUS) { if(Wpad_TimeButton()) { installCnt = 0; int i = 0; while( i < fileCnt) { fatFile *file = &fileList[i]; if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 0)) { file->install = 2; uninstallCnt += 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 1)) { file->install = 2; uninstallCnt += 1; installCnt -= 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 2)) { file->install = 0; uninstallCnt -= 1; } i++; } } else { fatFile *file = &fileList[selected]; if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 0)) { file->install = 2; uninstallCnt += 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 1)) { file->install = 2; uninstallCnt += 1; installCnt -= 1; } else if (((file->filestat.st_mode & S_IFDIR) == false) & (file->install == 2)) { file->install = 0; uninstallCnt -= 1; } selected++; if (selected >= fileCnt) selected = 0; } } /* 1 Button - Leathl */ if (buttons & WPAD_BUTTON_1) { fatFile *tmpFile = &fileList[selected]; char *tmpCurPath = PeekCurrentDir (); if (tmpCurPath != NULL) { int res = Menu_FileOperations(tmpFile, tmpCurPath); if (res != 0) goto getList; } } /* A button */ if (buttons & WPAD_BUTTON_A) { fatFile *tmpFile = &fileList[selected]; char *tmpCurPath; if (tmpFile->filestat.st_mode & S_IFDIR) // wiiNinja { if (strcmp (tmpFile->filename, "..") == 0) { selected = 0; start = 0; // Previous dir tmpCurPath = PopCurrentDir(&selected, &start); if (tmpCurPath != NULL) sprintf(tmpPath, "%s", tmpCurPath); installCnt = 0; uninstallCnt = 0; goto getList; } else if (IsListFull () == true) { WaitPrompt ("Maximum number of directory levels is reached.\n"); } else { tmpCurPath = PeekCurrentDir (); if (tmpCurPath != NULL) { if(gDirLevel>1) sprintf(tmpPath, "%s/%s", tmpCurPath, tmpFile->filename); else sprintf(tmpPath, "%s%s", tmpCurPath, tmpFile->filename); } // wiiNinja: Need to PopCurrentDir PushCurrentDir (tmpPath, selected, start); selected = 0; start = 0; installCnt = 0; uninstallCnt = 0; goto getList; } } else { //If at least one WAD is marked, goto batch screen - Leathl if ((installCnt > 0) | (uninstallCnt > 0)) { char *thisCurPath = PeekCurrentDir (); if (thisCurPath != NULL) { int res = Menu_BatchProcessWads(fileList, fileCnt, thisCurPath, installCnt, uninstallCnt); if (res == 1) { int counter; for (counter = 0; counter < fileCnt; counter++) { fatFile *temp = &fileList[counter]; temp->install = 0; } installCnt = 0; uninstallCnt = 0; } } } //else use standard wadmanage menu - Leathl else { tmpCurPath = PeekCurrentDir (); if (tmpCurPath != NULL) Menu_WadManage(tmpFile, tmpCurPath); } } } /* B button */ if (buttons & WPAD_BUTTON_B) { if(gDirLevel<=1) { return; } char *tmpCurPath; selected = 0; start = 0; // Previous dir tmpCurPath = PopCurrentDir(&selected, &start); if (tmpCurPath != NULL) sprintf(tmpPath, "%s", tmpCurPath); goto getList; //return; } /** Scrolling **/ /* List scrolling */ index = (selected - start); if (index >= ENTRIES_PER_PAGE) start += index - (ENTRIES_PER_PAGE - 1); if (index <= -1) start += index; } err: printf("\n"); printf(" Press any button to continue...\n"); free (tmpPath); /* Wait for button */ WaitButtons(); }