forked from LeenkxTeam/LNXSDK
103 lines
2.3 KiB
Haxe
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");
|
|
}
|
|
}
|