diff options
Diffstat (limited to 'Northstar.Custom')
-rw-r--r-- | Northstar.Custom/mod.json | 4 | ||||
-rw-r--r-- | Northstar.Custom/mod/scripts/vscripts/sh_northstar_safe_io.gnut | 83 |
2 files changed, 87 insertions, 0 deletions
diff --git a/Northstar.Custom/mod.json b/Northstar.Custom/mod.json index 5fcdb0fd..22f9c45f 100644 --- a/Northstar.Custom/mod.json +++ b/Northstar.Custom/mod.json @@ -430,6 +430,10 @@ { "Path": "sh_northstar_http_requests.gnut", "RunOn": "CLIENT || SERVER || UI" + }, + { + "Path": "sh_northstar_safe_io.gnut", + "RunOn": "CLIENT || SERVER || UI" } ], diff --git a/Northstar.Custom/mod/scripts/vscripts/sh_northstar_safe_io.gnut b/Northstar.Custom/mod/scripts/vscripts/sh_northstar_safe_io.gnut new file mode 100644 index 00000000..f7b31cc2 --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/sh_northstar_safe_io.gnut @@ -0,0 +1,83 @@ +globalize_all_functions + +table< int, void functionref( string ) > pendingCallbacks +table< int, void functionref( table ) > pendingJSONCallbacks +table< int, void functionref() > failedCallbacks + + +void function NSLoadFile( string file, void functionref( string ) onSuccess, void functionref() onFailure = null ) +{ + int handle = NS_InternalLoadFile( file ) + + pendingCallbacks[handle] <- onSuccess + if (onFailure != null) + failedCallbacks[handle] <- onFailure +} + +void function NSLoadJSONFile( string file, void functionref( table ) onSuccess, void functionref() onFailure = null ) +{ + int handle = NS_InternalLoadFile( file ) + + pendingJSONCallbacks[handle] <- onSuccess + if (onFailure != null) + failedCallbacks[handle] <- onFailure +} + +void function NSHandleLoadResult( int handle, bool success, string result ) +{ + bool hasFailedCallback = handle in failedCallbacks + bool isJSONRequest = handle in pendingJSONCallbacks + bool isValid = isJSONRequest || handle in pendingCallbacks + + if (!isValid) + throw "Invalid IO callback handle" + + if (success) + { + if (isJSONRequest) + { + try + { + table result = DecodeJSON(result, true) + pendingJSONCallbacks[handle](result) + } + catch (ex) + { + print(ex) + // parsing failed, setting 'success' to false, since we + // consider this a failure. + success = false + } + } + else + { + pendingCallbacks[handle](result) + } + } + // don't use 'else', json might fail parsing and set 'success' to false. + if (!success) + { + if (hasFailedCallback) + failedCallbacks[handle]() + else + { + if (isJSONRequest) + pendingJSONCallbacks[handle]({}) + else + pendingCallbacks[handle]("") + } + } + + if (isJSONRequest) + delete pendingJSONCallbacks[handle] + else + delete pendingCallbacks[handle] + + if (hasFailedCallback) + delete failedCallbacks[handle] +} + +array<string> function NSGetAllFiles( string path = "" ) +{ + return NS_InternalGetAllFiles(path) +} |