Add erasing + rescan

This commit is contained in:
J-D-K 2020-04-17 13:05:59 -04:00
parent 3b4b125826
commit 5d13264e57
8 changed files with 109 additions and 22 deletions

View File

@ -38,7 +38,7 @@ INCLUDES := inc
EXEFS_SRC := exefs_src
APP_TITLE := JKSV
APP_AUTHOR := JK
APP_VERSION := 04.14.2020
APP_VERSION := 04.17.2020
ROMFS := romfs
#---------------------------------------------------------------------------------

View File

@ -20,6 +20,7 @@ namespace data
void saveCfg();
void loadFav();
void saveFav();
void rescanTitles();
bool isAppletMode();
//Class to help not load the same icons over and over
@ -69,7 +70,11 @@ namespace data
//Returns folder path
std::string getPath() { return path; }
//returns save_data_id string. only used for helping identify nand files
std::string getSaveDataID(){ return saveDataID; }
uint64_t getID() { return id; }
uint64_t getSaveID() { return saveID; }
FsSaveDataType getType() { return (FsSaveDataType)saveDataType; }
void setType(FsSaveDataType type) { saveDataType = type; }
void setFav(bool setFav) { favorite = setFav; }
@ -80,8 +85,8 @@ namespace data
private:
uint8_t saveDataType;
std::string title, titleSafe, author, path;
uint64_t id;
std::string title, titleSafe, author, path, saveDataID;
uint64_t id, saveID;
bool favorite = false;
};

View File

@ -311,15 +311,20 @@ namespace data
else
id = inf.application_id;
saveID = inf.save_data_id;
saveDataType = inf.save_data_type;
Result ctrlDataRes = nsGetApplicationControlData(NsApplicationControlSource_Storage, id, dat, sizeof(NsApplicationControlData), &outSz);
Result nacpRes = nacpGetLanguageEntry(&dat->nacp, &ent);
size_t icnSize = outSz - sizeof(dat->nacp);
char tmp[18];
if(R_SUCCEEDED(ctrlDataRes) && !(outSz < sizeof(dat->nacp)) && R_SUCCEEDED(nacpRes) && ent != NULL && icnSize > 0)
{
title.assign(ent->name);
titleSafe.assign(util::safeString(title));
author.assign(ent->author);
sprintf(tmp, "%016lx", inf.save_data_id);
saveDataID.assign(tmp);
if(titleSafe.empty())
{
char tmp[32];
@ -343,10 +348,11 @@ namespace data
}
else
{
char tmp[18];
sprintf(tmp, "%016lX", id);
title.assign(tmp);
titleSafe.assign(tmp);
sprintf(tmp, "%016lx", inf.save_data_id);
saveDataID.assign(tmp);
icn newIcn;
newIcn.create(id, "");
newIcn.createFav();
@ -577,4 +583,59 @@ namespace data
fclose(fav);
}
void rescanTitles()
{
//Clear out users, device, and BCAT
for(unsigned i = 0; i < users.size() - 2; i++)
data::users[i].titles.clear();
FsSaveDataInfoReader it;
FsSaveDataInfo info;
s64 tot = 0;
fsOpenSaveDataInfoReader(&it, FsSaveDataSpaceId_All);
NsApplicationControlData *dat = new NsApplicationControlData;
while(R_SUCCEEDED(fsSaveDataInfoReaderRead(&it, &info, 1, &tot)) && tot != 0)
{
//Skip system saves cause we're not reloading them
if(info.save_data_type == FsSaveDataType_System)
continue;
switch(info.save_data_type)
{
case FsSaveDataType_Bcat:
info.uid = util::u128ToAccountUID(2);
break;
case FsSaveDataType_Device:
info.uid = util::u128ToAccountUID(3);
break;
}
if(!blacklisted(info.application_id) && !blacklisted(info.save_data_id))
{
//We have all users and icons. This *should* be safe
int u = getUserIndex(info.uid);
titledata newData;
newData.init(info, dat);
if(isFavorite(newData.getID()))
newData.setFav(true);
if(newData.isMountable(data::users[u].getUID()) || !forceMount)
users[u].titles.push_back(newData);
}
}
delete dat;
fsSaveDataInfoReaderClose(&it);
if(data::incDev)
{
//Copy device saves to all accounts
for(unsigned i = 0; i < users.size() - 3; i++)
users[i].titles.insert(users[i].titles.end(), users[users.size() - 3].titles.begin(), users[users.size() - 3].titles.end());
}
for(unsigned i = 0; i < users.size(); i++)
std::sort(users[i].titles.begin(), users[i].titles.end(), sortTitles);
}
}

View File

@ -10,7 +10,7 @@
#include "util.h"
#include "file.h"
#define VER_STRING "v. 04.15.2020"
#define VER_STRING "v. 04.17.2020"
//Nav buttons
std::vector<ui::button> usrNav, ttlNav, fldNav;
@ -20,7 +20,7 @@ static tex *top, *bot;
//Ui text strings
std::string ui::userHelp = "[A] Select [Y] Dump All [X] UI Mode [ZR] Options [MINUS] Extras";
std::string ui::titleHelp = "[A] Select [L][R] Change User [Y] Dump All [X] BlackList [MINUS] Favorite [B] Back";
std::string ui::titleHelp = "[A] Select [L][R] Change User [Y] Dump All [X] BlackList [MINUS] Favorite [ZR] Erase [B] Back";
std::string ui::folderHelp = "[MINUS] File Mode [L][R] Auto [A] Backup [Y] Restore [X] Delete Folder [ZR] Erase Save [B] Back";
std::string ui::optHelp = "[A] Toggle [B] Back";
std::string ui::confBlackList, ui::confOverwrite, ui::confRestore, ui::confDel, ui::confCopy;

View File

@ -39,7 +39,7 @@ namespace ui
folderMenu.draw(ui::mnuTxt);
data::curData.icon.draw(96, 98);
drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 64, 370, 18, ui::mnuTxt, 224);
drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 60, 370, 16, ui::mnuTxt, 360);
if(down & KEY_A || fldNav[0].getEvent() == BUTTON_RELEASED || folderMenu.getTouchEvent() == MENU_DOUBLE_REL)
@ -151,7 +151,7 @@ namespace ui
advModePrep("sv:/", true);
mstate = ADV_MDE;
}
else if(down & KEY_ZR && confirm("*WARNING*: This WILL delete your current saved data for #" + data::curData.getTitle() + "# on your Switch! Are you sure you want to do this?", true))
else if(down & KEY_ZR && confirm("*WARNING*: This WILL delete your current saved data for #" + data::curData.getTitle() + "# on your system! Are you sure you want to do this?", true))
{
fs::delDir("sv:/");
fsdevCommitDevice("sv");

View File

@ -201,9 +201,8 @@ namespace ui
}
else if(down & KEY_L)
{
data::selUser--;
if(data::selUser < 0)
data::selUser = data::users.size() -1;
if(--data::selUser < 0)
data::selUser = data::users.size() - 1;
start = 0;
data::selData = 0;
@ -214,8 +213,7 @@ namespace ui
}
else if(down & KEY_R)
{
data::selUser++;
if(data::selUser > (int)data::users.size() - 1)
if(++data::selUser > (int)data::users.size() - 1)
data::selUser = 0;
start = 0;
@ -225,6 +223,18 @@ namespace ui
ui::showPopup(data::curUser.getUsername(), POP_FRAME_DEFAULT);
}
else if(down & KEY_ZR)
{
data::titledata tempData = data::curUser.titles[data::selData];
if(tempData.getType() == FsSaveDataType_System)
ui::showMessage("Deleting system save archives is disabled.", "*NO*");
else if(confirm("*WARNING:* This will erase the save data for #" + tempData.getTitle() + "# from your system. Are you 100% sure you want to do this?", true))
fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, tempData.getSaveID());
data::rescanTitles();
data::curUser = data::users[data::selUser];
data::selData = 0;
}
else if(down & KEY_MINUS)
{
if(!data::curUser.titles[data::selData].getFav())

View File

@ -149,9 +149,8 @@ namespace ui
}
else if(down & KEY_L)
{
data::selUser--;
if(data::selUser < 0)
data::selUser = data::users.size() -1;
if(--data::selUser < 0)
data::selUser = data::users.size() - 1;
data::curUser = data::users[data::selUser];
textTitlePrep(data::curUser);
@ -160,8 +159,7 @@ namespace ui
}
else if(down & KEY_R)
{
data::selUser++;
if(data::selUser > (int)data::users.size() - 1)
if(++data::selUser > (int)data::users.size() - 1)
data::selUser = 0;
data::curUser = data::users[data::selUser];
@ -179,6 +177,18 @@ namespace ui
textTitlePrep(data::curUser);
}
else if(down & KEY_ZR)
{
data::titledata tempData = data::curUser.titles[titleMenu.getSelected()];
if(tempData.getType() == FsSaveDataType_System)
ui::showMessage("Deleting system save archives is disabled.", "*NO*");
else if(confirm("*WARNING:* This will erase the save data for #" + tempData.getTitle() + "# from your system. Are you 100% sure you want to do this?", true))
fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId_User, tempData.getSaveID());
data::rescanTitles();
data::curUser = data::users[data::selUser];
ui::textTitlePrep(data::curUser);
}
else if(down & KEY_B || ttlNav[3].getEvent() == BUTTON_RELEASED)
mstate = TXT_USR;
}
@ -300,7 +310,7 @@ namespace ui
advModePrep("sv:/", true);
mstate = ADV_MDE;
}
else if(down & KEY_ZR && confirm("*WARNING*: This WILL delete your current saved data for #" + data::curData.getTitle() + "# on your Switch! Are you sure you want to do this?", true))
else if(down & KEY_ZR && confirm("*WARNING*: This WILL delete your current saved data for #" + data::curData.getTitle() + "# on your system! Are you sure you want to do this?", true))
{
fs::delDir("sv:/");
fsdevCommitDevice("sv");

View File

@ -152,11 +152,12 @@ namespace util
std::string getInfoString(data::user& u, data::titledata& d)
{
std::string ret = d.getTitle() + "\n";
std::string ret = d.getTitle() + "\n\n";
char id[18];
sprintf(id, " %016lX", d.getID());
ret += std::string(id) + "\n\n";
ret += "TID: " + std::string(id) + "\n\n";
ret += "FILE: " + d.getSaveDataID() + "\n\n";
switch(d.getType())
{
@ -185,7 +186,7 @@ namespace util
break;
case FsSaveDataType_SystemBcat:
ret += "System BCAT";
ret += "System BCAT\n\n";
break;
}