mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-04-24 23:37:24 -05:00
Add erasing + rescan
This commit is contained in:
parent
3b4b125826
commit
5d13264e57
2
Makefile
2
Makefile
|
|
@ -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
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
63
src/data.cpp
63
src/data.cpp
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user