From 498e428ba4fc98dd40e4ac7e79f1e6995d740709 Mon Sep 17 00:00:00 2001 From: J-D-K Date: Wed, 13 Jun 2018 22:55:10 -0400 Subject: [PATCH] Add dev menu + dump all --- inc/sys.h | 3 +- inc/util.h | 3 ++ src/data.cpp | 7 +++-- src/file.cpp | 2 +- src/main.cpp | 2 +- src/sys.cpp | 31 +++++++++++++------ src/ui.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++-------- src/util.cpp | 5 +++ 8 files changed, 113 insertions(+), 27 deletions(-) diff --git a/inc/sys.h b/inc/sys.h index e61020e..677439c 100644 --- a/inc/sys.h +++ b/inc/sys.h @@ -11,7 +11,8 @@ namespace sys void debugWrite(const std::string& out); //Uh oh - extern bool devMode; + extern bool sysSave; + extern bool devMenu; } #endif // SYS_H diff --git a/inc/util.h b/inc/util.h index 4dfd7a5..13f51fe 100644 --- a/inc/util.h +++ b/inc/util.h @@ -8,6 +8,9 @@ namespace util //Returns string with date + time std::string getDateTime(); + //Creates user dir + void makeUserDir(data::user& u); + //Creates Dir 'JKSV/[user]/[title] void makeTitleDir(data::user& u, data::titledata& t); diff --git a/src/data.cpp b/src/data.cpp index e4779cf..f25a75b 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -114,13 +114,13 @@ namespace data if(R_FAILED(res) || total == 0) break; - if((info.SaveDataType == FsSaveDataType_SaveData) || sys::devMode) + if((info.SaveDataType == FsSaveDataType_SaveData) || sys::sysSave) { int u = getUserIndex(info.userID); if(u == -1) { user newUser; - if(newUser.init(info.userID) || (sys::devMode && newUser.initNoChk(info.userID))) + if(newUser.init(info.userID) || (sys::sysSave && newUser.initNoChk(info.userID))) { users.push_back(newUser); @@ -167,7 +167,8 @@ namespace data res = nsGetApplicationControlData(1, id, dat, sizeof(NsApplicationControlData), &outSz); if(R_FAILED(res) || outSz < sizeof(dat->nacp)) { - printf("nsGetAppCtrlData Failed: 0x%08X\n", (unsigned)res); + if(!sys::sysSave) + printf("nsGetAppCtrlData Failed: 0x%08X\n", (unsigned)res); delete dat; } diff --git a/src/file.cpp b/src/file.cpp index d8e8b88..050589d 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -29,7 +29,7 @@ namespace fs if(r == -1) return false; } - else if(sys::devMode && open.getType() == FsSaveDataType_SystemSaveData) + else if(sys::sysSave && open.getType() == FsSaveDataType_SystemSaveData) { res = fsMount_SystemSaveData(&sv, open.getID()); if(R_FAILED(res)) diff --git a/src/main.cpp b/src/main.cpp index ddde653..74fc51b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,7 +43,7 @@ int main(int argc, const char *argv[]) gfx::clearBufferColor(0x3B3B3BFF); gfx::drawText("JKSV - 6/13/2018", 16, 16, 64, 0xFFFFFFFF); gfx::drawRectangle(16, 64, 1248, 1, 0xFFFFFFFF); - gfx::drawRectangle(384, 64, 1, 592, 0xFFFFFFFF); + gfx::drawRectangle(448, 64, 1, 592, 0xFFFFFFFF); gfx::drawRectangle(16, 656, 1248, 1, 0xFFFFFFFF); ui::runApp(down, held); diff --git a/src/sys.cpp b/src/sys.cpp index 8c7cbd5..d8863d1 100644 --- a/src/sys.cpp +++ b/src/sys.cpp @@ -10,7 +10,27 @@ static std::fstream deb; namespace sys { - bool devMode = false; + bool sysSave = false; + bool devMenu = false; + + void loadCfg() + { + std::fstream devIn("0x4A4B.dev", std::ios::in | std::ios::binary); + if(devIn.is_open()) + { + uint8_t byte = 0; + devIn.read((char *)&byte, 1); + devIn.close(); + + sysSave = byte >> 7 & 1; + devMenu = byte >> 6 & 1; + + if(sysSave) + printf("System save dumping enabled.\n"); + if(devMenu) + printf("DevMenu enabled\n"); + } + } bool init() { @@ -46,14 +66,7 @@ namespace sys mkdir("sdmc:/JKSV", 0777); chdir("sdmc:/JKSV"); - deb.open("deb.txt", std::ios::out); - - std::fstream chk("0x4A4B.dev", std::ios::in); - if(chk.is_open()) - { - devMode = true; - chk.close(); - } + loadCfg(); return true; } diff --git a/src/ui.cpp b/src/ui.cpp index 5d8775f..2dab51e 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -23,12 +23,13 @@ enum menuState { USR_SEL, TTL_SEL, - FLD_SEL + FLD_SEL, + DEV_MNU }; static int mstate = USR_SEL; -static ui::menu userMenu, titleMenu, folderMenu; +static ui::menu userMenu, titleMenu, folderMenu, devMenu; static gfx::tex buttonA, buttonB, buttonX, buttonY; namespace ui @@ -129,14 +130,14 @@ namespace ui else length = start + 15; - uint32_t rectClr = 0x00 << 24 | ((0x88 + clrSh) & 0xFF) << 16 | ((0xbb + clrSh) & 0xFF) << 8 | 0xFF; + uint32_t rectClr = 0x00 << 24 | ((0x88 + clrSh) & 0xFF) << 16 | ((0xBB + clrSh) & 0xFF) << 8 | 0xFF; for(int i = start; i < length; i++) { if(i == selected) gfx::drawRectangle(x, y + ((i - start) * 36), rectWidth, 32, rectClr); - gfx::drawText(opt[i], x, y + ((i - start) * 36), 32, 0xFFFFFFFF); + gfx::drawText(opt[i], x, y + ((i - start) * 36), 38, 0xFFFFFFFF); } } @@ -513,21 +514,26 @@ namespace ui folderMenu.addOpt(list.getItem(i)); } + void devMenuPrepare() + { + devMenu.addOpt("Dump all saves"); + } + void drawMenus() { switch(mstate) { case USR_SEL: - userMenu.print(16, 88, 364); + userMenu.print(16, 88, 424); break; case TTL_SEL: - titleMenu.print(16, 88, 364); + titleMenu.print(16, 88, 424); break; case FLD_SEL: - titleMenu.print(16, 88, 364); - folderMenu.print(390, 88, 874); + titleMenu.print(16, 88, 424); + folderMenu.print(456, 88, 808); break; } } @@ -539,12 +545,17 @@ namespace ui if(down & KEY_A) { data::curUser = data::users[userMenu.getSelected()]; - - mkdir(data::curUser.getUsername().c_str(), 777); + util::makeUserDir(data::curUser); titleMenuPrepare(data::curUser); mstate = TTL_SEL; } + else if(down & KEY_MINUS && sys::devMenu) + { + devMenu.reset(); + devMenuPrepare(); + mstate = DEV_MNU; + } drawMenus(); @@ -578,7 +589,7 @@ namespace ui unsigned startX = 1056; - if(sys::devMode) + if(sys::sysSave) { std::string drawType = "Type: "; switch(data::curUser.titles[titleMenu.getSelected()].getType()) @@ -676,7 +687,7 @@ namespace ui } } else - ui::showMessage("NEIN NEIN NEIN."); + ui::showMessage("NEIN! NEIN! NEIN!"); } else if(down & KEY_X) { @@ -718,6 +729,54 @@ namespace ui gfx::drawText("Back", startX += 38, 668, 32, 0xFFFFFFFF); } + void showDevMenu(const uint64_t& down, const uint64_t& held) + { + devMenu.handleInput(down, held); + + if(down & KEY_A) + { + switch(devMenu.getSelected()) + { + case 0: + ui::progBar userProg(data::users.size()); + for(unsigned i = 0; i < data::users.size(); i++) + { + data::curUser = data::users[i]; + util::makeUserDir(data::curUser); + for(unsigned j = 0; j < data::curUser.titles.size(); j++) + { + data::curData = data::curUser.titles[j]; + if(fs::mountSave(data::curUser, data::curData)) + { + util::makeTitleDir(data::curUser, data::curData); + + std::string to = util::getTitleDir(data::curUser, data::curData) + util::getDateTime(); + mkdir(to.c_str(), 777); + to += "/"; + + std::string root = "sv:/"; + + fs::copyDirToDir(root, to); + + fsdevUnmountDevice("sv"); + } + + userProg.draw("Dumping " + data::curUser.getUsername() + "..."); + + gfx::handleBuffs(); + } + } + break; + } + } + else if(down & KEY_B) + mstate = USR_SEL; + + devMenu.print(16, 88, 424); + + gfx::handleBuffs(); + } + void runApp(const uint64_t& down, const uint64_t& held) { switch(mstate) @@ -733,6 +792,10 @@ namespace ui case FLD_SEL: showFolderMenu(down, held); break; + + case DEV_MNU: + showDevMenu(down, held); + break; } } diff --git a/src/util.cpp b/src/util.cpp index f35e2b6..25e1c78 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -22,6 +22,11 @@ namespace util return std::string(ret); } + void makeUserDir(data::user& u) + { + mkdir(u.getUsername().c_str(), 0777); + } + void makeTitleDir(data::user& u, data::titledata& t) { std::string path = u.getUsername() + "/" + t.getTitleSafe();