1
0
Fork 0
mirror of https://github.com/suchmememanyskill/TegraExplorer.git synced 2024-11-08 05:01:46 +00:00

add save.commit() and save.write()

This commit is contained in:
suchmememanyskill 2021-07-26 01:45:35 +02:00
parent dea3294445
commit d2a0786875
6 changed files with 102 additions and 15 deletions

View file

@ -99,10 +99,9 @@ bool save_data_file_write(save_data_file_ctx_t *ctx, uint64_t *out_bytes_written
if (!save_data_file_validate_write_params(ctx, offset, count, ctx->mode, &is_resize_needed))
return false;
if (is_resize_needed) {
if (!save_data_file_set_size(ctx, offset + count))
return false;
}
*out_bytes_written = save_allocation_table_storage_write(&ctx->base_storage, buffer, offset, count);
return true;

View file

@ -3,7 +3,7 @@ p=println
pe={pause() exit()}
fwstr={fw=maj.str()+"."+min.str()+"."+pat.str()}
fv={a=readsave("bis:/save/8000000000000120")
b=a.readFile("/meta/imkvdb.arc")
b=a.read("/meta/imkvdb.arc")
c=["BYTE[]",9,8,0,0,0,0,0,1]
d=b.find(c)
if(d>0){

View file

@ -5,13 +5,20 @@
a="Hello world!\n"
a.print()
#i=0
#while (i<10){
# println(i)
# i=i+1
#}
a = readdir("sd:/tegraexplorer")
mountsys("SYSTEM")
s = readsave("sd:/8000000000000120")
f = s.read("/meta/imkvdb.arc")
println(f.len())
println(f.slice(1,1).project()[0])
s.write("/meta/imkvdb.arc", ["BYTE[]", 1,2]).print()
s.commit().print()
#a = s.readdir("/")
pause()
exit()
println(a.result)
println(a.files.len())
println(a.folders.len())
@ -20,3 +27,5 @@ println(a.fileSizes.len())
a.files.foreach("b") {
println(b)
}
pause()

View file

@ -1,7 +1,10 @@
#include "saveClass.h"
#include "compat.h"
#include "intClass.h"
#include "dictionaryClass.h"
u8 oneStringArgSave[] = {StringClass};
u8 oneStrOneByteArrayArgSave[] = {StringClass, ByteArrayClass};
ClassFunction(readFile){
Variable_t *arg = (*args);
@ -21,8 +24,83 @@ ClassFunction(readFile){
return copyVariableToPtr(a);
}
ClassFunction(writeFile){
Variable_t *arg = (*args);
save_data_file_ctx_t dataArc;
if (!save_open_file(&caller->save->saveCtx, &dataArc, arg->string.value, OPEN_MODE_WRITE))
return newIntVariablePtr(1);
u64 outBytes = 0;
if (!save_data_file_write(&dataArc, &outBytes, 0, args[1]->solvedArray.vector.data, args[1]->solvedArray.vector.count)){
return newIntVariablePtr(3);
};
if (outBytes != args[1]->solvedArray.vector.count){
return newIntVariablePtr(4);
}
return newIntVariablePtr(0);
}
ClassFunction(getFiles){
Variable_t* resPtr = newIntVariablePtr(0);
Variable_t ret = {.variableType = DictionaryClass, .dictionary.vector = newVec(sizeof(Dict_t), 4)};
addVariableToDict(&ret, "result", resPtr);
save_data_directory_ctx_t ctx;
if (!save_open_directory(&caller->save->saveCtx, &ctx, "/", OPEN_DIR_MODE_ALL)){
resPtr->integer.value = 1;
return copyVariableToPtr(ret);
}
u64 entryCount = 0;
if (!save_data_directory_get_entry_count(&ctx, &entryCount)){
resPtr->integer.value = 2;
return copyVariableToPtr(ret);
}
directory_entry_t* entries = malloc(sizeof(directory_entry_t) * entryCount);
u64 entryCountDirRead = 0;
if (!save_data_directory_read(&ctx, &entryCountDirRead, entries, entryCount)){
resPtr->integer.value = 3;
return copyVariableToPtr(ret);
}
Variable_t fileNamesArray = {.variableType = StringArrayClass, .solvedArray.vector = newVec(sizeof(char*), 0)};
Variable_t dirNamesArray = {.variableType = StringArrayClass, .solvedArray.vector = newVec(sizeof(char*), 0)};
Variable_t fileSizeArray = {.variableType = IntArrayClass, .solvedArray.vector = newVec(sizeof(s64), 0)};
for (int i = 0; i < entryCountDirRead; i++){
char *add = CpyStr(entries[i].name);
if (entries[i].type == DIR_ENT_TYPE_FILE){
vecAdd(&fileNamesArray.solvedArray.vector, add);
s64 fileSize = entries[i].size;
vecAdd(&fileSizeArray.solvedArray.vector, fileSize);
}
else {
vecAdd(&dirNamesArray.solvedArray.vector, add);
}
}
free(entries);
addVariableToDict(&ret, "files", copyVariableToPtr(fileNamesArray));
addVariableToDict(&ret, "folders", copyVariableToPtr(dirNamesArray));
addVariableToDict(&ret, "fileSizes", copyVariableToPtr(fileSizeArray));
return copyVariableToPtr(ret);
}
ClassFunction(saveClassCommit){
return newIntVariablePtr(!save_commit(&caller->save->saveCtx));
}
ClassFunctionTableEntry_t saveFunctions[] = {
{"readFile", readFile, 1, oneStringArgSave},
{"read", readFile, 1, oneStringArgSave},
{"write", writeFile, 2, oneStrOneByteArrayArgSave},
//{"readdir", getFiles, 1, oneStringArgSave}, // Seems broken?
{"commit", saveClassCommit, 0, 0},
};
Variable_t getSaveMember(Variable_t* var, char* memberName) {

View file

@ -14,4 +14,5 @@ void printScriptError(u8 errLevel, char* message, ...) {
if (errLevel < SCRIPT_WARN)
gfx_printf("\nError occured on or near line %d\n", (u32)scriptCurrentLine);
va_end(args);
hidWait();
}

View file

@ -145,7 +145,7 @@ ClassFunction(stdMountSave){
Variable_t *arg = (*args);
Variable_t var = {.variableType = SaveClass};
SaveClass_t* save = calloc(1, sizeof(SaveClass_t));
if (f_open(&save->saveFile, arg->string.value, FA_READ))
if (f_open(&save->saveFile, arg->string.value, FA_READ | FA_WRITE))
return NULL;
save_init(&save->saveCtx, &save->saveFile, dumpedKeys.save_mac_key, 0);
if (!save_process(&save->saveCtx))