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