LNXSDK/Kha/Backends/HTML5/kha/Storage.hx
2025-01-22 16:18:30 +01:00

103 lines
2.3 KiB
Haxe

package kha;
import haxe.io.Bytes;
import haxe.io.BytesBuffer;
import haxe.io.BytesData;
import js.Browser;
using StringTools;
class LocalStorageFile extends StorageFile {
var name: String;
public function new(name: String) {
this.name = name;
}
override public function read(): Blob {
var storage = Browser.getLocalStorage();
if (storage == null)
return null;
var value: String = storage.getItem(System.title + "_" + name);
if (value == null)
return null;
else
return Blob.fromBytes(decode(value));
}
override public function write(data: Blob): Void {
var storage = Browser.getLocalStorage();
if (storage == null)
return;
storage.setItem(System.title + "_" + name, encode(data.bytes.getData()));
}
/**
* Encodes byte array to yEnc string (from SASStore).
* @param {Array} source Byte array to convert to yEnc.
* @return {string} Resulting yEnc string from byte array.
*/
static function encode(source: BytesData): String {
var reserved = [0, 10, 13, 61];
var output = "";
var converted, ele;
var bytes = new js.lib.Uint8Array(source);
for (i in 0...bytes.length) {
ele = bytes[i];
converted = (ele + 42) % 256;
if (!Lambda.has(reserved, converted)) {
output += String.fromCharCode(converted);
}
else {
converted = (converted + 64) % 256;
output += "=" + String.fromCharCode(converted);
}
}
return output;
}
/**
* Decodes yEnc string to byte array (from SASStore).
* @param {string} source yEnc string to decode to byte array.
* @return {Array} Resulting byte array from yEnc string.
*/
static function decode(source: String): Bytes {
var output = new BytesBuffer();
var ck = false;
var c;
for (i in 0...source.length) {
c = source.fastCodeAt(i);
// ignore newlines
if (c == 13 || c == 10) {
continue;
}
// if we're an "=" and we haven't been flagged, set flag
if (c == 61 && !ck) {
ck = true;
continue;
}
if (ck) {
ck = false;
c = c - 64;
}
if (c < 42 && c > 0) {
output.addByte(c + 214);
}
else {
output.addByte(c - 42);
}
}
return output.getBytes();
}
}
class Storage {
public static function namedFile(name: String): StorageFile {
return new LocalStorageFile(name);
}
public static function defaultFile(): StorageFile {
return namedFile("default.kha");
}
}