mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 20:06:43 +00:00
add save.commit() and save.write()
This commit is contained in:
parent
dea3294445
commit
d2a0786875
6 changed files with 102 additions and 15 deletions
|
@ -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))
|
if (!save_data_file_validate_write_params(ctx, offset, count, ctx->mode, &is_resize_needed))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (is_resize_needed) {
|
|
||||||
if (!save_data_file_set_size(ctx, offset + count))
|
if (!save_data_file_set_size(ctx, offset + count))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
*out_bytes_written = save_allocation_table_storage_write(&ctx->base_storage, buffer, offset, count);
|
*out_bytes_written = save_allocation_table_storage_write(&ctx->base_storage, buffer, offset, count);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -3,7 +3,7 @@ p=println
|
||||||
pe={pause() exit()}
|
pe={pause() exit()}
|
||||||
fwstr={fw=maj.str()+"."+min.str()+"."+pat.str()}
|
fwstr={fw=maj.str()+"."+min.str()+"."+pat.str()}
|
||||||
fv={a=readsave("bis:/save/8000000000000120")
|
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]
|
c=["BYTE[]",9,8,0,0,0,0,0,1]
|
||||||
d=b.find(c)
|
d=b.find(c)
|
||||||
if(d>0){
|
if(d>0){
|
||||||
|
|
|
@ -5,13 +5,20 @@
|
||||||
a="Hello world!\n"
|
a="Hello world!\n"
|
||||||
a.print()
|
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.result)
|
||||||
println(a.files.len())
|
println(a.files.len())
|
||||||
println(a.folders.len())
|
println(a.folders.len())
|
||||||
|
@ -20,3 +27,5 @@ println(a.fileSizes.len())
|
||||||
a.files.foreach("b") {
|
a.files.foreach("b") {
|
||||||
println(b)
|
println(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pause()
|
|
@ -1,7 +1,10 @@
|
||||||
#include "saveClass.h"
|
#include "saveClass.h"
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
#include "intClass.h"
|
||||||
|
#include "dictionaryClass.h"
|
||||||
|
|
||||||
u8 oneStringArgSave[] = {StringClass};
|
u8 oneStringArgSave[] = {StringClass};
|
||||||
|
u8 oneStrOneByteArrayArgSave[] = {StringClass, ByteArrayClass};
|
||||||
|
|
||||||
ClassFunction(readFile){
|
ClassFunction(readFile){
|
||||||
Variable_t *arg = (*args);
|
Variable_t *arg = (*args);
|
||||||
|
@ -21,8 +24,83 @@ ClassFunction(readFile){
|
||||||
return copyVariableToPtr(a);
|
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[] = {
|
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) {
|
Variable_t getSaveMember(Variable_t* var, char* memberName) {
|
||||||
|
|
|
@ -14,4 +14,5 @@ void printScriptError(u8 errLevel, char* message, ...) {
|
||||||
if (errLevel < SCRIPT_WARN)
|
if (errLevel < SCRIPT_WARN)
|
||||||
gfx_printf("\nError occured on or near line %d\n", (u32)scriptCurrentLine);
|
gfx_printf("\nError occured on or near line %d\n", (u32)scriptCurrentLine);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
hidWait();
|
||||||
}
|
}
|
|
@ -145,7 +145,7 @@ ClassFunction(stdMountSave){
|
||||||
Variable_t *arg = (*args);
|
Variable_t *arg = (*args);
|
||||||
Variable_t var = {.variableType = SaveClass};
|
Variable_t var = {.variableType = SaveClass};
|
||||||
SaveClass_t* save = calloc(1, sizeof(SaveClass_t));
|
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;
|
return NULL;
|
||||||
save_init(&save->saveCtx, &save->saveFile, dumpedKeys.save_mac_key, 0);
|
save_init(&save->saveCtx, &save->saveFile, dumpedKeys.save_mac_key, 0);
|
||||||
if (!save_process(&save->saveCtx))
|
if (!save_process(&save->saveCtx))
|
||||||
|
|
Loading…
Reference in a new issue