package bin.exporter; import kernel.peripherals.Peripherals.Peripheral; import lib.KVStore; import lib.exporter.Request; import kernel.ps.ProcessHandle; import lib.RessourceNames; import lib.exporter.Export; import kernel.ps.Process; import kernel.net.Package; import kernel.net.Net; import kernel.net.Package.GenericPackage; using tink.CoreApi; class ResManager implements Process { private var handle:ProcessHandle; private var exports:Map = []; public function new() {} public function run(handle:ProcessHandle) { this.handle = handle; Net.registerProto("res",handlePackage); load(); } public function register(id: String, export: Export): Promise{ if (exports.exists(id)){ return Promise.reject(new Error("Ressource already exists: " + id)); } return registerName(id).next((success)->{ exports.set(id,export); persist(); return null; }); } private function handlePackage(pack: GenericPackage){ var requestPack: Package = cast pack; var id = requestPack.data.id; if (!exports.exists(id)){ requestPack.respond(lib.exporter.Response.NotFound); return; } var export = exports.get(id); var response = export.handleRequest(requestPack.data); requestPack.respond(response); } private function registerName(id: String){ return RessourceNames.register(id, Net.networkID); } private function persist(){ var store = new KVStore("export"); var saveExports: Array<{name: String, addr: String, type: String}> = [for (k => v in this.exports) {name: k, addr: v.getAddr(), type: v.getType()}]; store.set("exports",saveExports); store.save(); } private function load(){ var store = new KVStore("export"); var savedExports: Array<{name: String, addr: String, type: String}> = store.get("exports",[]); for (export in savedExports){ var perph = Peripheral.getFromType(export.addr,export.type); if (perph == null){ handle.writeLine('Could not load export: ${export.name} on ${export.addr}'); continue; } // I dont know if cast is the best way to do this // But since we know that this is a IExportable we can do this (I think) exports.set(export.name, new Export(cast perph)); handle.writeLine('Loaded export: ${export.name} on ${export.addr}'); } } }