Dynamically calculate the totalProgress

This commit is contained in:
Li 2023-09-10 20:21:29 +12:00 committed by GitHub
parent fc36c5f436
commit 5c154181dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 40 deletions

View File

@ -31,17 +31,16 @@ link_directories(
)
add_executable(${PROJECT_NAME}
src/main.c
src/ui.c
src/install.c
src/io.c
src/promote.c
src/pbp.c
src/sha256
src/main.c
)
target_link_libraries(${PROJECT_NAME}
vita2d
z
c

View File

@ -9,18 +9,26 @@
#include "install.h"
#include "ui.h"
static char* NeededDirectories[] = {
"ux0:pspemu",
"ux0:pspemu/PSP",
"ux0:pspemu/PSP/SAVEDATA",
"ux0:pspemu/temp",
"ux0:pspemu/temp/game",
"ux0:pspemu/temp/game/PSP",
"ux0:pspemu/temp/game/PSP/GAME",
"ux0:pspemu/temp/game/PSP/GAME/" TITLE_ID,
"ux0:pspemu/temp/game/PSP/LICENSE"
};
size_t GetTotalNeededDirectories() {
return (sizeof(NeededDirectories) / sizeof(char*));
}
void createPspEmuDirectories() {
CreateDirAndUpdateUi("ux0:pspemu");
CreateDirAndUpdateUi("ux0:pspemu/PSP");
CreateDirAndUpdateUi("ux0:pspemu/PSP/SAVEDATA");
CreateDirAndUpdateUi("ux0:pspemu/temp");
CreateDirAndUpdateUi("ux0:pspemu/temp/game");
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP");
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP/GAME");
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP/LICENSE");
for(size_t i = 0; i < GetTotalNeededDirectories(); i++){
CreateDirAndUpdateUi(NeededDirectories[i]);
}
}
@ -34,9 +42,9 @@ void genEbootSignature(char* ebootPath) {
memset(ebootSig, 0x00, sizeof(ebootSig));
memset(pbpHash, 0x00, sizeof(pbpHash));
snprintf(ebootSigFilePath, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/__sce_ebootpbp", TITLE_ID);
snprintf(ebootSigFilePath, MAX_PATH, "ux0:pspemu/temp/game/PSP/GAME/%s/__sce_ebootpbp", TITLE_ID);
updateUi("Calculating EBOOT.PBP hash ...");
updateUi("Calculating EBOOT.PBP Sha256 ...");
HashPbp(ebootPath, pbpHash);
updateUi("Generating EBOOT.PBP Signature ...");
@ -47,33 +55,28 @@ void genEbootSignature(char* ebootPath) {
}
void placePspGameData() {
char gameFolder[MAX_PATH];
char ebootFile[MAX_PATH];
char pbootFile[MAX_PATH];
char rifFile[MAX_PATH];
// create game folder .
snprintf(gameFolder, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s", TITLE_ID);
CreateDirAndUpdateUi(gameFolder);
// get path to EBOOT.PBP and PBOOT.PBP
snprintf(ebootFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/EBOOT.PBP", TITLE_ID);
snprintf(pbootFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/PBOOT.PBP", TITLE_ID);
snprintf(rifFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/LICENSE/%s.rif", CONTENT_ID);
snprintf(ebootFile, MAX_PATH, "ux0:pspemu/temp/game/PSP/GAME/%s/EBOOT.PBP", TITLE_ID);
snprintf(pbootFile, MAX_PATH, "ux0:pspemu/temp/game/PSP/GAME/%s/PBOOT.PBP", TITLE_ID);
snprintf(rifFile, MAX_PATH, "ux0:pspemu/temp/game/PSP/LICENSE/%s.rif", CONTENT_ID);
CopyFileAndUpdateUi("app0:/psp/EBOOT.PBP", ebootFile);
CopyFileAndUpdateUi("app0:/psp/PBOOT.PBP", pbootFile);
CopyFileAndUpdateUi("app0:/rif/game.rif", rifFile);
CopyFileAndUpdateUi("app0:psp/EBOOT.PBP", ebootFile);
CopyFileAndUpdateUi("app0:psp/PBOOT.PBP", pbootFile);
CopyFileAndUpdateUi("app0:rif/game.rif", rifFile);
genEbootSignature(ebootFile);
}
void createBubble() {
updateUi("Promoting ...");
promoteCma("ux0:/pspemu/temp/game", TITLE_ID, SCE_PKG_TYPE_PSP);
promoteCma("ux0:pspemu/temp/game", TITLE_ID, SCE_PKG_TYPE_PSP);
}
void copySaveFiles() {
CopyTree("app0:/save", "ux0:/pspemu/PSP/SAVEDATA");
CopyTree("app0:save", "ux0:/pspemu/PSP/SAVEDATA");
}
void doInstall() {

View File

@ -1,6 +1,7 @@
#define TITLE_ID "NPUZ01234"
#define CONTENT_ID "IP9100-PCSI00011_00-PSMRUNTIME000000"
size_t GetTotalNeededDirectories();
void createPspEmuDirectories();
void placePspGameData();
void createBubble();

View File

@ -100,4 +100,41 @@ void CopyTree(const char* src, const char* dst) {
free(srcEnt);
free(dstEnt);
}
size_t CountTree(const char* src) {
size_t count = 0;
SceUID dfd = sceIoDopen(src);
char* srcEnt = malloc(MAX_PATH);
memset(srcEnt, 0x00, MAX_PATH);
int dir_read_ret = 0;
SceIoDirent* dir = malloc(sizeof(SceIoDirent));
do{
memset(dir, 0x00, sizeof(SceIoDirent));
dir_read_ret = sceIoDread(dfd, dir);
snprintf(srcEnt, MAX_PATH, "%s/%s", src, dir->d_name);
if(SCE_S_ISDIR(dir->d_stat.st_mode)) {
count++;
count += CountTree(srcEnt);
}
else{
count++;
}
} while(dir_read_ret > 0);
free(dir);
sceIoDclose(dfd);
free(srcEnt);
return count;
}

View File

@ -8,3 +8,4 @@ int WriteFile(const char *file, void *buf, int size);
void CopyFileAndUpdateUi(char* src, char* dst);
void CreateDirAndUpdateUi(char* dir);
size_t CountTree(const char* src);

View File

@ -31,37 +31,31 @@ int promoteCma(const char *path, const char *titleid, int type) {
res = loadScePaf();
if (res < 0) {
sceClibPrintf("loadScePaf: %x\n", res);
return res;
}
res = sceSysmoduleLoadModuleInternal(SCE_SYSMODULE_INTERNAL_PROMOTER_UTIL);
if (res < 0) {
sceClibPrintf("sceSysmoduleLoadModuleInternal: %x\n", res);
return res;
}
res = scePromoterUtilityInit();
if (res < 0) {
sceClibPrintf("scePromoterUtilityInit: %x\n", res);
return res;
}
res = scePromoterUtilityPromoteImport(&promoteArgs);
if (res < 0) {
sceClibPrintf("scePromoterUtilityPromoteImport: %x\n", res);
return res;
}
res = scePromoterUtilityExit();
if (res < 0) {
sceClibPrintf("scePromoterUtilityExit: %x\n", res);
return res;
}
res = sceSysmoduleUnloadModuleInternal(SCE_SYSMODULE_INTERNAL_PROMOTER_UTIL);
if (res < 0) {
sceClibPrintf("sceSysmoduleUnloadModuleInternal: %x\n", res);
return res;
}
@ -69,7 +63,6 @@ int promoteCma(const char *path, const char *titleid, int type) {
res = unloadScePaf();
if (res < 0)
if (res < 0) {
sceClibPrintf("unloadScePaf: %x\n", res);
return res;
}

View File

@ -4,14 +4,26 @@
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "install.h"
#include "io.h"
int progress = 0;
const int totalProgress = 42; // this is like how many times updateUi is called ..
static int progress = 0;
static int totalProgress = 0;
vita2d_pgf *pgf;
vita2d_pvf *pvf;
// calculate the total progress
void countProgress() {
totalProgress = 6; // Copy EBOOT.PBP, PBOOT.PBP, GAME.RIF
// PROMOTE, HASH EBOOT, GEN EBOOT SIGNATURE steps
totalProgress += GetTotalNeededDirectories(); // Directories required to be created.
totalProgress += CountTree("app0:save"); // Total number of files / dirs in ARK4 savedata.
}
void uiInit() {
countProgress();
vita2d_init();
vita2d_set_clear_color(RGBA8(0x00, 0x00, 0x00, 0xFF));
pgf = vita2d_load_default_pgf();
@ -32,14 +44,15 @@ void drawProgress() {
int end = 900;
int start = 60;
int y = 300;
int percent = (int)floor(((float)progress / (float)totalProgress) * 840.0);
int barPx = (int)floor(((float)progress / (float)totalProgress) * (float)(end - start));
int percent = (int)floor(((float)progress / (float)totalProgress) * 100.0);
char percentText[0x100];
vita2d_draw_line(start, y, end, y, RGBA8(128,128,128,255));
vita2d_draw_line(start, y, start + percent, y, RGBA8(0,255,0,255));
vita2d_draw_line(start, y, start + barPx, y, RGBA8(0,255,0,255));
snprintf(percentText, sizeof(percentText), "%i%%", progress);
drawTextCenter(320, percentText);
snprintf(percentText, sizeof(percentText), "%i%% (%i/%i)", percent, progress, totalProgress);
drawTextCenter(330, percentText);
}
void endDraw() {