diff --git a/haxework/gui/GuiBuilder.hx b/haxework/gui/GuiBuilder.hx index e9fac0a..8c9d829 100755 --- a/haxework/gui/GuiBuilder.hx +++ b/haxework/gui/GuiBuilder.hx @@ -32,11 +32,11 @@ import haxework.frame.FrameSwitcher; class GuiBuilder { public static function build(data:Dynamic, ?links:Dynamic):Dynamic { - return new GuiB(data, links).build(); + return new GuiB(data, links, data._includes).build(); } public static function fill(object:Dynamic, data:Dynamic, ?links:Dynamic):Void { - new GuiF(object, data, links).fill(); + new GuiF(object, data, links, data._includes).fill(); } } @@ -44,10 +44,12 @@ class GuiB { private var data:Dynamic; private var links:Dynamic; + private var includes:Dynamic; - public function new(data:Dynamic, ?links:Dynamic) { + public function new(data:Dynamic, ?links:Dynamic, ?includes:Dynamic) { this.data = data; this.links = links; + this.includes = includes; } public function build():Dynamic { @@ -55,14 +57,14 @@ class GuiB { var type:String = data.type; //Reflect.deleteField(data, "type"); var object:Dynamic = instance(type); - new GuiF(object, data, links).fill(); + new GuiF(object, data, links, includes).fill(); var initMethod:Dynamic = Reflect.field(object, "init"); if (initMethod != null) Reflect.callMethod(object, initMethod, []); return object; } else if (Std.is(data, String)) { return GuiF.convertString(data, links); } else { - new GuiF(data, data, links).fill(); + new GuiF(data, data, links, includes).fill(); return data; } } @@ -80,11 +82,13 @@ class GuiF { private var object:Dynamic; private var data:Dynamic; private var links:Dynamic; + private var includes:Dynamic; - public function new(object:Dynamic, data:Dynamic, ?links:Dynamic) { + public function new(object:Dynamic, data:Dynamic, ?links:Dynamic, ?includes:Dynamic) { this.object = object; this.data = data; this.links = links; + this.includes = includes; } public static function convertString(value:Dynamic, ?links:Dynamic):Dynamic { @@ -114,10 +118,18 @@ class GuiF { var fields:Array = Reflect.fields(data); for (field in fields) { if (field == "type") continue; + if (field == "_includes") continue; var value:Dynamic = Reflect.field(data, field); + if (field == "_include") { + var data:Dynamic = includes == null ? null : Reflect.field(includes, value); + if (data != null) { + new GuiF(object, data, links).fill(); + } + continue; + } if (Std.is(value, Array)) { var a:Array = []; - for (o in cast(value, Array)) a.push(new GuiB(o, links).build()); + for (o in cast(value, Array)) a.push(new GuiB(o, links, includes).build()); value = a; } else if (Std.is(value, String)) { var s:String = cast(value, String); @@ -148,7 +160,7 @@ class GuiF { } else if (Std.is(value, Bool)) { } else { - var o:Dynamic = new GuiB(value, links).build(); + var o:Dynamic = new GuiB(value, links, includes).build(); new GuiF(o, value, links).fill(); value = o; } diff --git a/haxework/net/BaseLoader.hx b/haxework/net/BaseLoader.hx index 5aee9c0..04afb26 100755 --- a/haxework/net/BaseLoader.hx +++ b/haxework/net/BaseLoader.hx @@ -18,6 +18,8 @@ class BaseLoader implements ILoader { public static var urlProcessors(default, null):ArrayString> = new ArrayString>(); public static function prepareUrl(url:String):String { for (p in urlProcessors) url = p(url); return url; } + public static var proxy(default, default):String->String; + public var timeout(default, default):Int; public var busy(default, null):Bool; @@ -56,6 +58,13 @@ class BaseLoader implements ILoader { } } + private function cancelTimeout():Void { + if (timer != null) { + timer.stop(); + timer = null; + } + } + public function fromBytes(data:ByteArray):ICallback { if (busy) throw "Busy"; busy = true; @@ -114,6 +123,15 @@ class BaseLoader implements ILoader { } } + private function onSecurityError(e:Event):Void { + if (proxy == null) { + onError(e); + } else { + cancelTimeout(); + internalRequest(proxy(buildUrl())); + } + } + private function onError(e:Event):Void { var c:ICallback = callback; dispose(); @@ -133,10 +151,7 @@ class BaseLoader implements ILoader { } private function dispose():Void { - if (timer != null) { - timer.stop(); - timer = null; - } + cancelTimeout(); url = null; data = null; callback = null; @@ -149,7 +164,7 @@ class BaseLoader implements ILoader { dispose(); } - public function run():Void { + private function buildUrl():String { var u:String = url; if (data != null && method == URLRequestMethod.GET) { var a:Array = []; @@ -158,7 +173,11 @@ class BaseLoader implements ILoader { } u += "?" + a.join("&"); } - internalRequest(prepareUrl(u)); + return prepareUrl(u); + } + + public function run():Void { + internalRequest(buildUrl()); } } diff --git a/haxework/net/BaseMediaLoader.hx b/haxework/net/BaseMediaLoader.hx index eb6272e..80a7c29 100755 --- a/haxework/net/BaseMediaLoader.hx +++ b/haxework/net/BaseMediaLoader.hx @@ -74,7 +74,7 @@ class BaseMediaLoader extends BaseLoader { loader.contentLoaderInfo.addEventListener(Event.INIT, onInit); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError); - loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); + loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); return loader; } @@ -85,7 +85,7 @@ class BaseMediaLoader extends BaseLoader { loader.contentLoaderInfo.removeEventListener(Event.INIT, onInit); loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete); loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError); - loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); + loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); #if flash try { loader.close(); } catch (error:Dynamic) {} #end loader = null; diff --git a/haxework/net/BaseURLLoader.hx b/haxework/net/BaseURLLoader.hx index 348d1ca..86f1681 100755 --- a/haxework/net/BaseURLLoader.hx +++ b/haxework/net/BaseURLLoader.hx @@ -65,7 +65,7 @@ class BaseURLLoader extends BaseLoader { loader.dataFormat = dataFormat; loader.addEventListener(Event.COMPLETE, onComplete); loader.addEventListener(IOErrorEvent.IO_ERROR, onError); - loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); + loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); loader.addEventListener(ProgressEvent.PROGRESS, onProgress); return loader; } @@ -75,7 +75,7 @@ class BaseURLLoader extends BaseLoader { if (loader != null) { loader.removeEventListener(Event.COMPLETE, onComplete); loader.removeEventListener(IOErrorEvent.IO_ERROR, onError); - loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); + loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); loader.removeEventListener(ProgressEvent.PROGRESS, onProgress); try { loader.close(); } catch (error:Dynamic) {} loader = null;