mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-03-21 17:24:37 -05:00
Working on it
This commit is contained in:
parent
30c2c5e651
commit
e708f02b6f
4
Makefile
4
Makefile
|
|
@ -38,7 +38,7 @@ INCLUDES := inc
|
|||
EXEFS_SRC := exefs_src
|
||||
APP_TITLE := JKSV
|
||||
APP_AUTHOR := JK
|
||||
APP_VERSION := 12.07.2019
|
||||
APP_VERSION := 01.06.2020
|
||||
ROMFS := romfs
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
|
|
@ -51,7 +51,7 @@ override CFLAGS += -g -Wall -O2 -ffunction-sections \
|
|||
|
||||
override CFLAGS += $(INCLUDE) -D__SWITCH__ `freetype-config --cflags`
|
||||
|
||||
CXXFLAGS:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++14
|
||||
CXXFLAGS:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||
|
||||
ASFLAGS := -g $(ARCH)
|
||||
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
|
|
|
|||
23
inc/data.h
23
inc/data.h
|
|
@ -48,28 +48,25 @@ namespace data
|
|||
void init(const FsSaveDataInfo& inf);
|
||||
|
||||
//Attempts to mount data with uID + id. Returns false if fails. For filtering.
|
||||
bool isMountable(const u128& uID);
|
||||
bool isMountable(const AccountUid& uID);
|
||||
|
||||
//Returns title + title without forbidden chars
|
||||
std::string getTitle() { return title;}
|
||||
std::string getTitleSafe() { return titleSafe; }
|
||||
|
||||
//for disabling certain things
|
||||
void setType(FsSaveDataType _type){ type = _type; }
|
||||
|
||||
//Returns ID
|
||||
uint64_t getID() { return id; }
|
||||
FsSaveDataType getType(){ return (FsSaveDataType)info.save_data_type; }
|
||||
void setType(FsSaveDataType type){ info.save_data_type = type; }
|
||||
|
||||
//Game icon
|
||||
icn icon;
|
||||
|
||||
FsSaveDataType getType() { return type; }
|
||||
//FUCK IT
|
||||
FsSaveDataInfo info;
|
||||
|
||||
private:
|
||||
FsSaveDataType type;
|
||||
std::string title, titleSafe;
|
||||
uint64_t id;
|
||||
u128 uID;
|
||||
};
|
||||
|
||||
//Class to store user info + titles
|
||||
|
|
@ -77,16 +74,16 @@ namespace data
|
|||
{
|
||||
public:
|
||||
//Attempts to read user data using _id
|
||||
bool init(const u128& _id);
|
||||
bool init(const AccountUid& _id);
|
||||
|
||||
//Allows user to init without reading data. For fun.
|
||||
bool initNoChk(const u128& _id, const std::string& _backupName);
|
||||
bool initNoChk(const AccountUid& _id, const std::string& _backupName);
|
||||
|
||||
//Sets ID
|
||||
void setUID(const u128& _id){ userID = _id; }
|
||||
void setUID(const AccountUid& _id){ userID = _id; }
|
||||
|
||||
//Returns user ID
|
||||
u128 getUID() { return userID; }
|
||||
AccountUid getUID() { return userID; }
|
||||
|
||||
//Returns username
|
||||
std::string getUsername() { return username; }
|
||||
|
|
@ -100,7 +97,7 @@ namespace data
|
|||
void delIcon(){ texDestroy(userIcon); }
|
||||
|
||||
private:
|
||||
u128 userID;
|
||||
AccountUid userID;
|
||||
std::string username, userSafe;
|
||||
//User icon
|
||||
tex* userIcon;
|
||||
|
|
|
|||
13
inc/util.h
13
inc/util.h
|
|
@ -43,5 +43,18 @@ namespace util
|
|||
|
||||
//Creates a basic generic icon for stuff without one
|
||||
tex *createIconGeneric(const char *txt);
|
||||
|
||||
static inline u128 accountUIDToU128(AccountUid uid)
|
||||
{
|
||||
return ((u128)uid.uid[0] << 64 | uid.uid[1]);
|
||||
}
|
||||
|
||||
static inline AccountUid u128ToAccountUID(u128 id)
|
||||
{
|
||||
AccountUid ret;
|
||||
ret.uid[0] = id >> 64;
|
||||
ret.uid[1] = id;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif // UTIL_H
|
||||
|
|
|
|||
73
src/data.cpp
73
src/data.cpp
|
|
@ -33,11 +33,14 @@ static struct
|
|||
} sortTitles;
|
||||
|
||||
//Returns -1 for new
|
||||
static int getUserIndex(const u128& id)
|
||||
static int getUserIndex(const AccountUid& id)
|
||||
{
|
||||
u128 nId = 0, oId = 0;
|
||||
nId = util::accountUIDToU128(id);
|
||||
for(unsigned i = 0; i < data::users.size(); i++)
|
||||
{
|
||||
if(data::users[i].getUID() == id)
|
||||
oId = util::accountUIDToU128(data::users[i].getUID());
|
||||
if(oId == nId)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
|
@ -75,11 +78,11 @@ namespace data
|
|||
|
||||
loadBlacklist();
|
||||
|
||||
FsSaveDataIterator saveIt;
|
||||
size_t total = 0;
|
||||
FsSaveDataInfoReader saveIt;
|
||||
s64 total = 0;
|
||||
FsSaveDataInfo info;
|
||||
|
||||
if(R_FAILED(fsOpenSaveDataIterator(&saveIt, FsSaveDataSpaceId_All)))
|
||||
if(R_FAILED(fsOpenSaveDataInfoReader(&saveIt, FsSaveDataSpaceId_All)))
|
||||
{
|
||||
printf("SaveDataIterator Failed\n");
|
||||
return;
|
||||
|
|
@ -87,9 +90,9 @@ namespace data
|
|||
|
||||
//Push System and BCAT user
|
||||
user sys, bcat, dev;
|
||||
sys.initNoChk(1, "System");
|
||||
bcat.initNoChk(2, "BCAT");
|
||||
dev.initNoChk(3, "Dev. Sv");
|
||||
sys.initNoChk(util::u128ToAccountUID(1), "System");
|
||||
bcat.initNoChk(util::u128ToAccountUID(2), "BCAT");
|
||||
dev.initNoChk(util::u128ToAccountUID(3), "Dev. Sv");
|
||||
|
||||
users.push_back(sys);
|
||||
users.push_back(bcat);
|
||||
|
|
@ -97,37 +100,37 @@ namespace data
|
|||
|
||||
while(true)
|
||||
{
|
||||
if(R_FAILED(fsSaveDataIteratorRead(&saveIt, &info, 1, &total)) || total == 0)
|
||||
if(R_FAILED(fsSaveDataInfoReaderRead(&saveIt, &info, 1, &total)) || total == 0)
|
||||
break;
|
||||
|
||||
switch(info.saveDataType)
|
||||
switch(info.save_data_type)
|
||||
{
|
||||
case FsSaveDataType_SystemBcat:
|
||||
info.userID = 1;
|
||||
case FsSaveDataType_System:
|
||||
info.uid = util::u128ToAccountUID(1);
|
||||
break;
|
||||
|
||||
case FsSaveDataType_Bcat:
|
||||
info.uid = util::u128ToAccountUID(2);
|
||||
break;
|
||||
|
||||
case FsSaveDataType_Device:
|
||||
info.userID = 2;
|
||||
break;
|
||||
|
||||
case FsSaveDataType_DeviceSaveData:
|
||||
info.userID = 3;
|
||||
info.uid = util::u128ToAccountUID(3);
|
||||
break;
|
||||
}
|
||||
|
||||
//If save data, not black listed or just ignore
|
||||
if(!blacklisted(info.titleID))
|
||||
if(!blacklisted(info.application_id))
|
||||
{
|
||||
int u = getUserIndex(info.userID);
|
||||
int u = getUserIndex(info.uid);
|
||||
if(u == -1)
|
||||
{
|
||||
user newUser;
|
||||
if(newUser.init(info.userID))
|
||||
if(newUser.init(info.uid))
|
||||
{
|
||||
//Always insert new users to beginning
|
||||
users.insert(users.begin(), newUser);
|
||||
|
||||
u = getUserIndex(info.userID);
|
||||
u = getUserIndex(info.uid);
|
||||
titledata newData;
|
||||
newData.init(info);
|
||||
if(newData.isMountable(newUser.getUID()) || !forceMount)
|
||||
|
|
@ -144,7 +147,7 @@ namespace data
|
|||
}
|
||||
}
|
||||
|
||||
fsSaveDataIteratorClose(&saveIt);
|
||||
fsSaveDataInfoReaderClose(&saveIt);
|
||||
|
||||
for(unsigned i = 0; i < users.size(); i++)
|
||||
std::sort(users[i].titles.begin(), users[i].titles.end(), sortTitles);
|
||||
|
|
@ -204,17 +207,15 @@ namespace data
|
|||
NsApplicationControlData *dat = new NsApplicationControlData;
|
||||
std::memset(dat, 0, sizeof(NsApplicationControlData));
|
||||
NacpLanguageEntry *ent = NULL;
|
||||
|
||||
if(inf.saveDataType== FsSaveDataType_Bcat)
|
||||
id = inf.titleID;
|
||||
else if(inf.saveDataType== FsSaveDataType_SystemBcat)
|
||||
id = inf.saveID;
|
||||
|
||||
uID = inf.userID;
|
||||
type = (FsSaveDataType)inf.saveDataType;
|
||||
size_t outSz = 0;
|
||||
|
||||
if(R_SUCCEEDED(nsGetApplicationControlData(1, id, dat, sizeof(NsApplicationControlData), &outSz)) && outSz >= sizeof(dat->nacp) \
|
||||
info = inf;
|
||||
if(inf.save_data_type == FsSaveDataType_Account)
|
||||
id = inf.application_id;
|
||||
else
|
||||
id = inf.save_data_id;
|
||||
|
||||
if(R_SUCCEEDED(nsGetApplicationControlData(NsApplicationControlSource_Storage, id, dat, sizeof(NsApplicationControlData), &outSz)) && outSz >= sizeof(dat->nacp) \
|
||||
&& R_SUCCEEDED(nacpGetLanguageEntry(&dat->nacp, &ent)) && ent != NULL)
|
||||
{
|
||||
title.assign(ent->name);
|
||||
|
|
@ -250,7 +251,7 @@ namespace data
|
|||
delete dat;
|
||||
}
|
||||
|
||||
bool titledata::isMountable(const u128& uID)
|
||||
bool titledata::isMountable(const AccountUid& uID)
|
||||
{
|
||||
data::user tmpUser;
|
||||
tmpUser.setUID(uID);
|
||||
|
|
@ -262,7 +263,7 @@ namespace data
|
|||
return false;
|
||||
}
|
||||
|
||||
bool user::init(const u128& _id)
|
||||
bool user::init(const AccountUid& _id)
|
||||
{
|
||||
userID = _id;
|
||||
|
||||
|
|
@ -275,12 +276,12 @@ namespace data
|
|||
if(R_FAILED(accountProfileGet(&prof, NULL, &base)))
|
||||
return false;
|
||||
|
||||
username.assign(base.username);
|
||||
username.assign(base.nickname);
|
||||
if(username.empty())
|
||||
username = "Unknown";
|
||||
userSafe = util::safeString(username);
|
||||
|
||||
size_t sz = 0;
|
||||
uint32_t sz = 0;
|
||||
accountProfileGetImageSize(&prof, &sz);
|
||||
uint8_t *profJpeg = new uint8_t[sz];
|
||||
|
||||
|
|
@ -294,7 +295,7 @@ namespace data
|
|||
return true;
|
||||
}
|
||||
|
||||
bool user::initNoChk(const u128& _id, const std::string& _backupName)
|
||||
bool user::initNoChk(const AccountUid& _id, const std::string& _backupName)
|
||||
{
|
||||
userID = _id;
|
||||
|
||||
|
|
|
|||
4
src/ex.c
4
src/ex.c
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
Result fsOpenDataFileSystemByCurrentProcess(FsFileSystem *out)
|
||||
{
|
||||
Result ret = 0;
|
||||
/*Result ret = 0;
|
||||
|
||||
IpcCommand c;
|
||||
ipcInitialize(&c);
|
||||
|
|
@ -34,5 +34,5 @@ Result fsOpenDataFileSystemByCurrentProcess(FsFileSystem *out)
|
|||
serviceCreateSubservice(&out->s, fsGetServiceSession(), &p, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return ret;*/
|
||||
}
|
||||
|
|
|
|||
34
src/file.cpp
34
src/file.cpp
|
|
@ -18,26 +18,24 @@
|
|||
static std::string wd;
|
||||
|
||||
|
||||
Result fsMountBCAT(FsFileSystem *out, uint64_t id)
|
||||
static Result fsMountBCAT(FsFileSystem *out, data::titledata& open)
|
||||
{
|
||||
FsSave sv;
|
||||
std::memset(&sv, 0, sizeof(FsSave));
|
||||
FsSaveDataAttribute attr;
|
||||
std::memset(&attr, 0, sizeof(FsSaveDataAttribute));
|
||||
attr.application_id = open.info.application_id;
|
||||
attr.save_data_type = FsSaveDataType_Bcat;
|
||||
|
||||
sv.titleID = id;
|
||||
sv.saveDataType = FsSaveDataType_BcatDeliveryCacheStorage;
|
||||
|
||||
return fsMountSaveData(out, FsSaveDataSpaceId_NandUser, &sv);
|
||||
return fsOpenSaveDataFileSystem(out, FsSaveDataSpaceId_User, &attr);
|
||||
}
|
||||
|
||||
Result fsMountDeviceSave(FsFileSystem *out, uint64_t id)
|
||||
static Result fsMountDeviceSave(FsFileSystem *out, data::titledata& open)
|
||||
{
|
||||
FsSave sv;
|
||||
std::memset(&sv, 0, sizeof(FsSave));
|
||||
FsSaveDataAttribute attr;
|
||||
std::memset(&attr, 0, sizeof(FsSaveDataAttribute));
|
||||
attr.application_id = open.info.application_id;
|
||||
attr.save_data_type = FsSaveDataType_Device;
|
||||
|
||||
sv.titleID = id;
|
||||
sv.saveDataType = FsSaveDataType_Device;
|
||||
|
||||
return fsdevMountSaveData(out, FsSaveDataSpaceId_User, &sv);
|
||||
return fsOpenSaveDataFileSystem(out, FsSaveDataSpaceId_User, &attr);
|
||||
}
|
||||
|
||||
static struct
|
||||
|
|
@ -69,13 +67,13 @@ namespace fs
|
|||
{
|
||||
FsFileSystem sv;
|
||||
|
||||
if(open.getType() == FsSaveDataType_Bcat && R_FAILED(fsMount_SaveData(&sv, open.getID(), usr.getUID())))
|
||||
if(open.info.save_data_type == FsSaveDataType_Account && R_FAILED(fsOpen_SaveData(&sv, open.info.application_id, usr.getUID())))
|
||||
return false;
|
||||
else if(open.getType() == FsSaveDataType_SystemBcat && R_FAILED(fsMount_SystemSaveData(&sv, open.getID())))
|
||||
else if(open.info.save_data_type == FsSaveDataType_System && R_FAILED(fsOpen_SystemSaveData(&sv, FsSaveDataSpaceId_System, open.info.save_data_id, (AccountUid){0})))
|
||||
return false;
|
||||
else if(open.getType() == FsSaveDataType_BcatDeliveryCacheStorage && R_FAILED(fsMountBCAT(&sv, open.getID())))
|
||||
else if(open.info.save_data_type == FsSaveDataType_Bcat && R_FAILED(fsMountBCAT(&sv, open)))
|
||||
return false;
|
||||
else if(open.getType() == FsSaveDataType_Device && R_FAILED(fsMountDeviceSave(&sv, open.getID())))
|
||||
else if(open.info.save_data_type == FsSaveDataType_Device && R_FAILED(fsMountDeviceSave(&sv, open)))
|
||||
return false;
|
||||
|
||||
if(fsdevMountDevice("sv", sv) == -1)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ extern "C"
|
|||
hidInitialize();
|
||||
nsInitialize();
|
||||
setsysInitialize();
|
||||
accountInitialize();
|
||||
accountInitialize(AccountServiceType_Application);
|
||||
}
|
||||
|
||||
void userAppExit(void)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
#include "util.h"
|
||||
#include "file.h"
|
||||
|
||||
#define VER_STRING "v. 12.07.2019"
|
||||
#define VER_STRING "v. 01.06.2020"
|
||||
|
||||
//Nav buttons
|
||||
std::vector<ui::button> usrNav, ttlNav, fldNav;
|
||||
|
|
|
|||
|
|
@ -277,7 +277,7 @@ namespace ui
|
|||
|
||||
case 1:
|
||||
fsdevUnmountDevice("sv");
|
||||
fsOpenBisFileSystem(&sv, FsBisStorageId_CalibrationFile, "");
|
||||
fsOpenBisFileSystem(&sv, FsBisPartitionId_CalibrationFile, "");
|
||||
fsdevMountDevice("prodInfo-f", sv);
|
||||
|
||||
advModePrep("profInfo-f:/", false);
|
||||
|
|
@ -287,7 +287,7 @@ namespace ui
|
|||
|
||||
case 2:
|
||||
fsdevUnmountDevice("sv");
|
||||
fsOpenBisFileSystem(&sv, FsBisStorageId_SafeMode, "");
|
||||
fsOpenBisFileSystem(&sv, FsBisPartitionId_SafeMode, "");
|
||||
fsdevMountDevice("safe", sv);
|
||||
|
||||
advModePrep("safe:/", false);
|
||||
|
|
@ -297,7 +297,7 @@ namespace ui
|
|||
|
||||
case 3:
|
||||
fsdevUnmountDevice("sv");
|
||||
fsOpenBisFileSystem(&sv, FsBisStorageId_System, "");
|
||||
fsOpenBisFileSystem(&sv, FsBisPartitionId_System, "");
|
||||
fsdevMountDevice("sys", sv);
|
||||
|
||||
advModePrep("sys:/", false);
|
||||
|
|
@ -307,7 +307,7 @@ namespace ui
|
|||
|
||||
case 4:
|
||||
fsdevUnmountDevice("sv");
|
||||
fsOpenBisFileSystem(&sv, FsBisStorageId_User, "");
|
||||
fsOpenBisFileSystem(&sv, FsBisPartitionId_User, "");
|
||||
fsdevMountDevice("user", sv);
|
||||
|
||||
advModePrep("user:/", false);
|
||||
|
|
@ -320,8 +320,8 @@ namespace ui
|
|||
fsdevUnmountDevice("sv");
|
||||
|
||||
FsStorage nand;
|
||||
fsOpenBisStorage(&nand, FsBisStorageId_UserDataRoot);
|
||||
uint64_t nandSize = 0, offset = 0;
|
||||
fsOpenBisStorage(&nand, FsBisPartitionId_UserDataRoot);
|
||||
s64 nandSize = 0, offset = 0;
|
||||
fsStorageGetSize(&nand, &nandSize);
|
||||
|
||||
std::fstream nandOut("sdmc:/JKSV/nand.bin", std::ios::out | std::ios::binary);
|
||||
|
|
@ -367,8 +367,8 @@ namespace ui
|
|||
fsdevUnmountDevice("sv");
|
||||
|
||||
FsStorage nand;
|
||||
fsOpenBisStorage(&nand, FsBisStorageId_UserDataRoot);
|
||||
uint64_t nandSize = 0, offset = 0;
|
||||
fsOpenBisStorage(&nand, FsBisPartitionId_UserDataRoot);
|
||||
s64 nandSize = 0, offset = 0;
|
||||
fsStorageGetSize(&nand, &nandSize);
|
||||
|
||||
std::fstream nandOut("sdmc:/JKSV/nand.bin.00", std::ios::out | std::ios::binary);
|
||||
|
|
@ -419,7 +419,7 @@ namespace ui
|
|||
case 7:
|
||||
{
|
||||
fsdevUnmountDevice("sv");
|
||||
fsOpenBisFileSystem(&sv, FsBisStorageId_System, "");
|
||||
fsOpenBisFileSystem(&sv, FsBisPartitionId_System, "");
|
||||
fsdevMountDevice("sv", sv);
|
||||
std::string delPath = "sv:/Contents/placehld/";
|
||||
|
||||
|
|
@ -447,7 +447,7 @@ namespace ui
|
|||
{
|
||||
uint64_t termID = std::strtoull(idStr.c_str(), NULL, 16);
|
||||
pmshellInitialize();
|
||||
if(R_SUCCEEDED(pmshellTerminateProcessByTitleId(termID)))
|
||||
if(R_SUCCEEDED(pmshellTerminateProcess(termID)))
|
||||
ui::showMessage("Process " + idStr + " successfully shutdown.", "Success!");
|
||||
pmshellExit();
|
||||
}
|
||||
|
|
@ -459,7 +459,7 @@ namespace ui
|
|||
fsdevUnmountDevice("sv");
|
||||
std::string idStr = util::getStringInput("8000000000000000", "Enter Sys Save ID", 18, 0, NULL);
|
||||
uint64_t mountID = std::strtoull(idStr.c_str(), NULL, 16);
|
||||
if(R_SUCCEEDED(fsMount_SystemSaveData(&sv, mountID)))
|
||||
if(R_SUCCEEDED(fsOpen_SystemSaveData(&sv, FsSaveDataSpaceId_System, mountID, (AccountUid){0})))
|
||||
{
|
||||
fsdevMountDevice("sv", sv);
|
||||
advModePrep("sv:/", true);
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ namespace ui
|
|||
}
|
||||
else if(down & KEY_Y || fldNav[1].getEvent() == BUTTON_RELEASED)
|
||||
{
|
||||
if(data::curData.getType() != FsSaveDataType_SystemBcat && folderMenu.getSelected() > 0)
|
||||
if(data::curData.info.save_data_type != FsSaveDataType_SystemBcat && folderMenu.getSelected() > 0)
|
||||
{
|
||||
std::string scanPath = util::getTitleDir(data::curUser, data::curData);
|
||||
fs::dirList list(scanPath);
|
||||
|
|
|
|||
10
src/util.cpp
10
src/util.cpp
|
|
@ -158,20 +158,20 @@ namespace util
|
|||
std::string ret = d.getTitle() + "\n";
|
||||
|
||||
char id[18];
|
||||
sprintf(id, " %016lX", d.getID());
|
||||
sprintf(id, " %016lX", d.info.application_id);
|
||||
ret += std::string(id) + "\n\n";
|
||||
|
||||
switch(d.getType())
|
||||
switch(d.info.save_data_type)
|
||||
{
|
||||
case FsSaveDataType_SystemBcat:
|
||||
case FsSaveDataType_System:
|
||||
ret += "System Save\n\n";
|
||||
break;
|
||||
|
||||
case FsSaveDataType_Bcat:
|
||||
case FsSaveDataType_Account:
|
||||
ret += "Save Data\n\n";
|
||||
break;
|
||||
|
||||
case FsSaveDataType_BcatDeliveryCacheStorage:
|
||||
case FsSaveDataType_Bcat:
|
||||
ret += "Bcat Delivery Cache\n\n";
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user