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");
 | |
| 	}
 | |
| }
 |