92 lines
2.6 KiB
Haxe
92 lines
2.6 KiB
Haxe
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<String,Export> = [];
|
|
|
|
public function new() {}
|
|
|
|
public function run(handle:ProcessHandle) {
|
|
this.handle = handle;
|
|
Net.registerProto("res",handlePackage);
|
|
load();
|
|
}
|
|
|
|
public function register(id: String, export: Export): Promise<Noise>{
|
|
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<Request> = 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}');
|
|
}
|
|
|
|
}
|
|
}
|