Handle all save data types

This commit is contained in:
J-D-K
2020-05-25 14:21:24 -04:00
parent 9d39d4e586
commit c6e90bb85a
10 changed files with 128 additions and 120 deletions

View File

@@ -38,7 +38,7 @@ INCLUDES := inc
EXEFS_SRC := exefs_src
APP_TITLE := JKSV
APP_AUTHOR := JK
APP_VERSION := 05.24.2020
APP_VERSION := 05.25.2020
ROMFS := romfs
ICON := romfs/icon.jpg

View File

@@ -8,6 +8,9 @@
#include "gfx.h"
#define curUser users[data::selUser]
#define curData users[data::selUser].titles[data::selData]
namespace data
{
extern bool forceMount;
@@ -135,8 +138,7 @@ namespace data
//Adds title to blacklist
void blacklistAdd(data::titledata& t);
//Adds title to favorite list
void favoriteAdd(data::titledata& t);
void favoriteRemove(data::titledata& t);
void favoriteTitle(data::titledata& t);
//User vector
extern std::vector<icn> icons;
@@ -146,11 +148,6 @@ namespace data
extern int selUser, selData;
extern SetLanguage sysLang;
extern bool incDev, autoBack, ovrClk, holdDel, holdRest, holdOver, forceMount, accSysSave, sysSaveWrite, directFsCmd, skipUser;
//Inline shortcuts to current user and current title. I might need to think of another way.
//Previous versions made full copies of vectors in memory, which i didn't like
inline data::user& curUser(){ return data::users[data::selUser]; }
inline data::titledata& curData(){ return curUser().titles[data::selData]; }
}
#endif // DATA_H

View File

@@ -67,6 +67,7 @@ namespace fs
class dirList
{
public:
dirList() = default;
dirList(const std::string& _path);
void reassign(const std::string& _path);
void rescan();

View File

@@ -23,6 +23,9 @@ SetLanguage data::sysLang;
bool data::incDev = false, data::autoBack = true, data::ovrClk = false, data::holdDel = true, data::holdRest = true, data::holdOver = true;
bool data::forceMount = true, data::accSysSave = false, data::sysSaveWrite = false, data::directFsCmd = false, data::skipUser = false;
//For other save types
static bool sysBCATPushed = false, cachePushed = false, tempPushed = false;
static std::vector<uint64_t> blacklist;
static std::vector<uint64_t> favorites;
@@ -118,13 +121,17 @@ bool data::loadUsersTitles(bool clearUsers)
for(data::user& u : data::users)
u.titles.clear();
if(clearUsers)
{
data::users.clear();
sysBCATPushed = false;
cachePushed = false;
tempPushed = false;
}
//Push system users
users.push_back(data::user(util::u128ToAccountUID(3), "Device Saves", createDeviceIcon()));
users.push_back(data::user(util::u128ToAccountUID(2), "BCAT"));
users.push_back(data::user(util::u128ToAccountUID(1), "System"));
//users.push_back(data::user(util::u128ToAccountUID(4), "Sys. BCAT"));
users.emplace_back(util::u128ToAccountUID(3), "Device Saves", createDeviceIcon());
users.emplace_back(util::u128ToAccountUID(2), "BCAT");
users.emplace_back(util::u128ToAccountUID(1), "System");
NsApplicationControlData *dat = new NsApplicationControlData;
while(R_SUCCEEDED(fsSaveDataInfoReaderRead(&it, &info, 1, &total)) && total != 0)
@@ -145,7 +152,30 @@ bool data::loadUsersTitles(bool clearUsers)
break;
case FsSaveDataType_SystemBcat:
//info.uid = util::u128ToAccountUID(4);
info.uid = util::u128ToAccountUID(4);
if(!sysBCATPushed)
{
sysBCATPushed = true;
users.emplace_back(util::u128ToAccountUID(4), "Sys. BCAT");
}
break;
case FsSaveDataType_Cache:
info.uid = util::u128ToAccountUID(5);
if(!cachePushed)
{
cachePushed = true;
users.emplace_back(util::u128ToAccountUID(5), "Cache");
}
break;
case FsSaveDataType_Temporary:
info.uid = util::u128ToAccountUID(6);
if(!tempPushed)
{
tempPushed = true;
users.emplace_back(util::u128ToAccountUID(6), "Temp");
}
break;
}
@@ -155,7 +185,7 @@ bool data::loadUsersTitles(bool clearUsers)
int u = getUserIndex(info.uid);
if(u == -1)
{
users.insert(users.end() - 3, data::user(info.uid, ""));
users.emplace(users.end() - 3, info.uid, "");
u = getUserIndex(info.uid);
}
@@ -346,6 +376,8 @@ data::user::user(const AccountUid& _id, const std::string& _backupName)
userSafe = _backupName.empty() ? getIDStr((uint64_t)uID128) : _backupName;
userIcon = util::createIconGeneric(_backupName.c_str());
}
titles.reserve(64);
}
data::user::user(const AccountUid& _id, const std::string& _backupName, tex *img) : user(_id, _backupName)
@@ -390,30 +422,31 @@ void data::blacklistAdd(titledata& t)
blacklist.push_back(tid);
}
void data::favoriteAdd(titledata& t)
void data::favoriteTitle(titledata& t)
{
uint64_t tid = t.getID();
for(data::user& _u : data::users)
if(!t.getFav())
{
for(unsigned i = 0; i < _u.titles.size(); i++)
if(_u.titles[i].getID() == tid) _u.titles[i].setFav(true);
for(data::user& _u : data::users)
{
for(unsigned i = 0; i < _u.titles.size(); i++)
if(_u.titles[i].getID() == tid) _u.titles[i].setFav(true);
std::sort(_u.titles.begin(), _u.titles.end(), sortTitles);
std::sort(_u.titles.begin(), _u.titles.end(), sortTitles);
}
favorites.push_back(tid);
}
favorites.push_back(tid);
}
void data::favoriteRemove(data::titledata& t)
{
uint64_t tid = t.getID();
auto ind = std::find(favorites.begin(), favorites.end(), tid);
favorites.erase(ind);
for(data::user& _u : data::users)
else
{
for(unsigned i = 0; i < _u.titles.size(); i++)
if(_u.titles[i].getID() == tid) _u.titles[i].setFav(false);
auto ind = std::find(favorites.begin(), favorites.end(), tid);
favorites.erase(ind);
for(data::user& _u : data::users)
{
for(unsigned i = 0; i < _u.titles.size(); i++)
if(_u.titles[i].getID() == tid) _u.titles[i].setFav(false);
std::sort(_u.titles.begin(), _u.titles.end(), sortTitles);
std::sort(_u.titles.begin(), _u.titles.end(), sortTitles);
}
}
}

View File

@@ -10,7 +10,7 @@
#include "util.h"
#include "file.h"
#define VER_STRING "v. 05.24.2020"
#define VER_STRING "v. 05.25.2020"
//text mode
bool ui::textMode = false;
@@ -223,7 +223,7 @@ void ui::init()
if(ui::textMode && data::skipUser)
{
ui::textTitlePrep(data::curUser());
ui::textTitlePrep(data::curUser);
mstate = TXT_TTL;
}
else if(ui::textMode)

View File

@@ -18,7 +18,7 @@ static std::string savePath, sdPath, dev;
static int advMenuCtrl, advPrev;
//Dir listings
fs::dirList saveList(""), sdList("sdmc:/");
fs::dirList saveList, sdList;
static bool commit = false;

View File

@@ -28,11 +28,11 @@ void ui::createNewBackup(const uint64_t& held)
std::string folder;
if(held & KEY_R)
folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD);
folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD);
else if(held & KEY_L)
folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM);
folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM);
else if(held & KEY_ZL)
folder = data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_HOYSTE);
folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_HOYSTE);
else
{
const std::string dict[] =
@@ -42,31 +42,31 @@ void ui::createNewBackup(const uint64_t& held)
util::getDateTime(util::DATE_FMT_HOYSTE),
util::getDateTime(util::DATE_FMT_JHK),
util::getDateTime(util::DATE_FMT_ASC),
data::curUser().getUsernameSafe(),
data::curData().getTitleSafe().length() < 24 ? data::curData().getTitleSafe() : util::generateAbbrev(data::curData())
data::curUser.getUsernameSafe(),
data::curData.getTitleSafe().length() < 24 ? data::curData.getTitleSafe() : util::generateAbbrev(data::curData)
};
folder = util::getStringInput("", "Enter a folder name", 64, 7, dict);
}
if(!folder.empty())
{
std::string path = data::curData().getPath() + "/" + folder;
std::string path = data::curData.getPath() + "/" + folder;
mkdir(path.c_str(), 777);
path += "/";
fs::copyDirToDir("sv:/", path);
folderMenuPrepare(data::curUser(), data::curData());
folderMenuPrepare(data::curUser, data::curData);
}
}
void ui::overwriteBackup(unsigned ind)
{
fs::dirList list(data::curData().getPath());
fs::dirList list(data::curData.getPath());
std::string folderName = list.getItem(ind);
if(confirm(data::holdOver, ui::confOverwrite.c_str(), folderName.c_str()))
{
std::string toPath = data::curData().getPath() + folderName + "/";
std::string toPath = data::curData.getPath() + folderName + "/";
//Delete and recreate
fs::delDir(toPath);
mkdir(toPath.c_str(), 777);
@@ -79,16 +79,16 @@ void ui::overwriteBackup(unsigned ind)
void ui::restoreBackup(unsigned ind)
{
if((data::curData().getType() != FsSaveDataType_System || data::sysSaveWrite) && folderMenu.getSelected() > 0)
if((data::curData.getType() != FsSaveDataType_System || data::sysSaveWrite) && folderMenu.getSelected() > 0)
{
fs::dirList list(data::curData().getPath());
fs::dirList list(data::curData.getPath());
std::string folderName = list.getItem(ind);
if(confirm(data::holdRest, ui::confRestore.c_str(), folderName.c_str()))
{
if(data::autoBack)
{
std::string autoFolder = data::curData().getPath() + "/AUTO - " + data::curUser().getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_ASC);
std::string autoFolder = data::curData.getPath() + "/AUTO - " + data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_ASC);
mkdir(autoFolder.c_str(), 777);
autoFolder += "/";
@@ -96,7 +96,7 @@ void ui::restoreBackup(unsigned ind)
fs::copyDirToDir(root, autoFolder);
}
std::string fromPath = data::curData().getPath() + folderName + "/";
std::string fromPath = data::curData.getPath() + folderName + "/";
std::string root = "sv:/";
fs::delDir(root);
@@ -106,23 +106,23 @@ void ui::restoreBackup(unsigned ind)
//Rescan init folder menu if autobak to show changes
if(data::autoBack)
folderMenuPrepare(data::curUser(), data::curData());
folderMenuPrepare(data::curUser, data::curData);
}
}
}
void ui::deleteBackup(unsigned ind)
{
fs::dirList list(data::curData().getPath());
fs::dirList list(data::curData.getPath());
std::string folderName = list.getItem(folderMenu.getSelected() - 1);
if(ui::confirmDelete(folderName))
{
std::string delPath = data::curData().getPath() + folderName + "/";
std::string delPath = data::curData.getPath() + folderName + "/";
fs::delDir(delPath);
}
folderMenuPrepare(data::curUser(), data::curData());
folderMenuPrepare(data::curUser, data::curData);
}
void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held)
@@ -132,7 +132,7 @@ void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held)
//Draw folder menu
folderMenu.draw(ui::txtCont);
data::curData().icon.draw(96, 98);
data::curData.icon.draw(96, 98);
drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 60, 370, 16, ui::txtCont, 360);
@@ -149,10 +149,10 @@ void ui::updateFolderMenu(const uint64_t& down, const uint64_t& held)
ui::deleteBackup(folderMenu.getSelected() - 1);
else if(down & KEY_MINUS)
{
advModePrep("sv:/", data::curData().getType(), true);
advModePrep("sv:/", data::curData.getType(), true);
mstate = ADV_MDE;
}
else if(down & KEY_ZR && data::curData().getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData().getTitle().c_str()))
else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str()))
{
fs::delDir("sv:/");
fsdevCommitDevice("sv");

View File

@@ -37,8 +37,8 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
unsigned x = 70, y = 98;
unsigned endTitle = start + 32;
if(start + 32 > (int)data::curUser().titles.size())
endTitle = data::curUser().titles.size();
if(start + 32 > (int)data::curUser.titles.size())
endTitle = data::curUser.titles.size();
//draw Rect so it's always behind icons
drawBoundBox(selRectX, selRectY, 140, 140, clrShft);
@@ -56,7 +56,7 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
selRectX = tX - 6;
selRectY = y - 6;
std::string title = data::curData().getTitle();
std::string title = data::curData.getTitle();
unsigned titleWidth = textGetWidth(title.c_str(), ui::shared, 18);
int rectWidth = titleWidth + 32, rectX = (tX + 64) - (rectWidth / 2);
if(rectX < 16)
@@ -68,16 +68,16 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
drawText(title.c_str(), frameBuffer, ui::shared, rectX + 16, y - 40, 18, ui::txtDiag);
}
if(data::curUser().titles[i].getFav())
data::curUser().titles[i].icon.drawFavHalf(tX, y);
if(data::curUser.titles[i].getFav())
data::curUser.titles[i].icon.drawFavHalf(tX, y);
else
data::curUser().titles[i].icon.drawHalf(tX, y);
data::curUser.titles[i].icon.drawHalf(tX, y);
}
}
if(down & KEY_RIGHT)
{
if(data::selData < (int)data::curUser().titles.size() - 1)
if(data::selData < (int)data::curUser.titles.size() - 1)
data::selData++;
if(data::selData >= (int)start + 32)
@@ -103,26 +103,26 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
else if(down & KEY_DOWN)
{
data::selData += 8;
if(data::selData > (int)data::curUser().titles.size() - 1)
data::selData = data::curUser().titles.size() - 1;
if(data::selData > (int)data::curUser.titles.size() - 1)
data::selData = data::curUser.titles.size() - 1;
if(data::selData - start >= 32)
start += 8;
}
else if(down & KEY_A && fs::mountSave(data::curUser(), data::curData()))
else if(down & KEY_A && fs::mountSave(data::curUser, data::curData))
{
folderMenuPrepare(data::curUser(), data::curData());
folderMenuPrepare(data::curUser, data::curData);
//Wanna change this sometime
ui::folderMenuInfo = util::getInfoString(data::curUser(), data::curData());
ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData);
mstate = FLD_SEL;
}
else if(down & KEY_Y)
fs::dumpAllUserSaves(data::curUser());
fs::dumpAllUserSaves(data::curUser);
else if(down & KEY_MINUS)
{
if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser().titles[data::selData].getTitle().c_str()))
data::blacklistAdd(data::curData());
if(ui::confirm(false, ui::confBlacklist.c_str(), data::curUser.titles[data::selData].getTitle().c_str()))
data::blacklistAdd(data::curData);
}
else if(down & KEY_B)
{
@@ -141,9 +141,7 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
start = 0;
data::selData = 0;
selRectX = 64, selRectY = 90;
data::curUser() = data::users[data::selUser];
ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT);
ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT);
}
else if(down & KEY_R)
{
@@ -153,13 +151,11 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
start = 0;
data::selData = 0;
selRectX = 64, selRectY = 90;
data::curUser() = data::users[data::selUser];
ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT);
ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT);
}
else if(down & KEY_ZR)
{
data::titledata tempData = data::curUser().titles[data::selData];
data::titledata tempData = data::curUser.titles[data::selData];
if(tempData.getType() == FsSaveDataType_System)
ui::showMessage("*NO*", "Deleting system save archives is disabled.");
else if(confirm(true, ui::confEraseNand.c_str(), tempData.getTitle().c_str()))
@@ -170,11 +166,6 @@ void ui::updateTitleMenu(const uint64_t& down, const uint64_t& held)
}
}
else if(down & KEY_X)
{
if(!data::curData().getFav())
data::favoriteAdd(data::curData());
else
data::favoriteRemove(data::curData());
}
data::favoriteTitle(data::curData);
}

View File

@@ -88,7 +88,7 @@ void ui::textUserMenuUpdate(const uint64_t& down, const uint64_t& held)
if(data::users[userMenu.getSelected()].titles.size() > 0)
{
data::selUser = userMenu.getSelected();
textTitlePrep(data::curUser());
textTitlePrep(data::curUser);
mstate = TXT_TTL;
}
else
@@ -122,66 +122,54 @@ void ui::textTitleMenuUpdate(const uint64_t& down, const uint64_t& held)
if(down & KEY_A)
{
data::selData = titleMenu.getSelected();
if(fs::mountSave(data::curUser(), data::curData()))
if(fs::mountSave(data::curUser, data::curData))
{
textFolderPrep(data::curUser(), data::curData());
textFolderPrep(data::curUser, data::curData);
mstate = TXT_FLD;
}
}
else if(down & KEY_Y)
{
fs::dumpAllUserSaves(data::curUser());
fs::dumpAllUserSaves(data::curUser);
}
else if(down & KEY_MINUS)
{
data::selData = titleMenu.getSelected();
if(ui::confirm(false, ui::confBlacklist.c_str(), data::curData().getTitle().c_str()))
data::blacklistAdd(data::curData());
if(ui::confirm(false, ui::confBlacklist.c_str(), data::curData.getTitle().c_str()))
data::blacklistAdd(data::curData);
textTitlePrep(data::curUser());
textTitlePrep(data::curUser);
}
else if(down & KEY_L)
{
if(--data::selUser < 0)
data::selUser = data::users.size() - 1;
data::curUser() = data::users[data::selUser];
textTitlePrep(data::curUser());
ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT);
textTitlePrep(data::curUser);
ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT);
}
else if(down & KEY_R)
{
if(++data::selUser > (int)data::users.size() - 1)
data::selUser = 0;
data::curUser() = data::users[data::selUser];
textTitlePrep(data::curUser());
ui::showPopup(data::curUser().getUsername(), POP_FRAME_DEFAULT);
textTitlePrep(data::curUser);
ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT);
}
else if(down & KEY_X)
{
data::selData = titleMenu.getSelected();
if(!data::curData().getFav())
data::favoriteAdd(data::curData());
else
data::favoriteRemove(data::curData());
textTitlePrep(data::curUser());
data::favoriteTitle(data::curData);
textTitlePrep(data::curUser);
}
else if(down & KEY_ZR)
{
data::titledata tempData = data::curUser().titles[titleMenu.getSelected()];
data::titledata tempData = data::curUser.titles[titleMenu.getSelected()];
if(tempData.getType() == FsSaveDataType_System)
ui::showMessage("*NO*", "Deleting system save archives is disabled.");
else if(confirm(true, ui::confEraseNand.c_str(), tempData.getTitle().c_str()))
{
fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, tempData.getSaveID());
data::loadUsersTitles(false);
data::curUser() = data::users[data::selUser];
ui::textTitlePrep(data::curUser());
ui::textTitlePrep(data::curUser);
}
}
else if(down & KEY_B)
@@ -207,10 +195,10 @@ void ui::textFolderMenuUpdate(const uint64_t& down, const uint64_t& held)
deleteBackup(folderMenu.getSelected() - 1);
else if(down & KEY_MINUS)
{
advModePrep("sv:/", data::curData().getType(), true);
advModePrep("sv:/", data::curData.getType(), true);
mstate = ADV_MDE;
}
else if(down & KEY_ZR && data::curData().getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData().getTitle().c_str()))
else if(down & KEY_ZR && data::curData.getType() != FsSaveDataType_System && confirm(true, ui::confEraseFolder.c_str(), data::curData.getTitle().c_str()))
{
fs::delDir("sv:/");
fsdevCommitDevice("sv");
@@ -238,12 +226,12 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held)
{
fsdevUnmountDevice("sv");
FsFileSystem sv;
data::curData().setType(FsSaveDataType_System);
data::curData.setType(FsSaveDataType_System);
switch(exMenu.getSelected())
{
case 0:
data::curData().setType(FsSaveDataType_Bcat);
advModePrep("sdmc:/", data::curData().getType(), false);
data::curData.setType(FsSaveDataType_Bcat);
advModePrep("sdmc:/", data::curData.getType(), false);
mstate = ADV_MDE;
prevState = EX_MNU;
break;
@@ -326,8 +314,7 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held)
if(R_SUCCEEDED(fsOpen_SystemSaveData(&sv, FsSaveDataSpaceId_System, mountID, (AccountUid) {0})))
{
fsdevMountDevice("sv", sv);
advModePrep("sv:/", data::curData().getType(), true);
data::curData().setType(FsSaveDataType_SystemBcat);
advModePrep("sv:/", data::curData.getType(), true);
prevState = EX_MNU;
mstate = ADV_MDE;
}
@@ -346,7 +333,6 @@ void ui::updateExMenu(const uint64_t& down, const uint64_t& held)
{
fsdevMountDevice("tromfs", tromfs);
advModePrep("tromfs:/", FsSaveDataType_Account, false);
data::curData().setType(FsSaveDataType_System);
ui::mstate = ADV_MDE;
ui::prevState = EX_MNU;
}

View File

@@ -15,7 +15,7 @@ void ui::updateUserMenu(const uint64_t& down, const uint64_t& held)
static uint8_t clrShft = 0;
static bool clrAdd = true;
static unsigned selRectX = 364, selRectY = 160;
static unsigned selRectX = 276, selRectY = 160;
if(clrAdd)
{
@@ -30,14 +30,14 @@ void ui::updateUserMenu(const uint64_t& down, const uint64_t& held)
clrAdd = true;
}
unsigned x = 368, y = 164;
unsigned x = 280, y = 164;
unsigned endUser = data::users.size();
drawBoundBox(selRectX, selRectY, 140, 140, clrShft);
for(unsigned i = start; i < endUser; y += 136)
{
unsigned endRow = i + 4;
unsigned endRow = i + 5;
for(unsigned tX = x; i < endRow; i++, tX += 144)
{
if(i == endUser)