package bin.srsc; import kernel.log.Log; import lib.KVStore; import bin.srsc.PackageTypes; import kernel.net.Package; import kernel.ps.ProcessHandle; import kernel.ps.Process; /** The SiteRessourceController is responsible for the management of ressources on the site. It makes sure that ressources are have a unique id and that they are not duplicated. It also keeps track of the responsible NetID for each ressource. Kinda like a DNS. **/ class SiteRessourceController implements Process { public static inline final SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO:String = "srsc"; private var handle:ProcessHandle; private var ressources:Map; public function new() {} public function run(handle:ProcessHandle) { this.handle = handle; load(); // Register proto kernel.net.Net.instance.registerProto(SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, this.handleMsg); } private function handleMsg(pkg:Package) { /* There are 3 types of messages: - Register a new ressource name - Unregister a ressource name - Get the responsible NetID for a ressource name */ switch (pkg.data.type) { case "register": pkg.respond(handleRegister(pkg.data)); case "unregister": pkg.respond(handleUnregister(pkg.data)); case "get": pkg.respond(handleGet(pkg.data)); default: handle.writeLine("Unknown message type: " + pkg.data.type); } } private function handleGet(data:GetRequest):GetResponse { var res = get(data.name); return {success: res != null, netID: res}; } private function handleRegister(data:RegisterRequest):RegisterResponse { var res = register(data.name, data.netID); return {success: res}; } private function handleUnregister(data:UnregisterRequest):UnregisterResponse { unregister(data.name); return {success: true}; } public function register(name:String, netID:NetworkID):Bool { if (ressources.exists(name) && ressources.get(name) != netID) { return false; } ressources.set(name, netID); save(); return true; } public function unregister(name:String) { if (ressources.exists(name)) { ressources.remove(name); } save(); } public function get(name:String):Null { return ressources.get(name); } private function load() { var store = KVStore.getStoreForClass(); var data:Null> = store.get("ressources"); if (data != null) { this.ressources = data; } else { this.ressources = new Map(); } } private function save() { var store = KVStore.getStoreForClass(); store.set("ressources", this.ressources); store.save(); } }