diff --git a/haxework/net/BaseLoader.hx b/haxework/net/BaseLoader.hx index 41c211b..d3dc2e8 100755 --- a/haxework/net/BaseLoader.hx +++ b/haxework/net/BaseLoader.hx @@ -1,5 +1,6 @@ package haxework.net; +import haxe.Timer; import flash.net.URLRequestMethod; import flash.events.ProgressEvent; import haxework.net.manage.ILoaderManager; @@ -18,6 +19,7 @@ class BaseLoader implements ILoader { public static function prepareUrl(url:String):String { for (p in urlProcessors) url = p(url); return url; } + public var timeout(default, default):Int; public var busy(default, null):Bool; public var completed(default, null):Float; @@ -25,8 +27,10 @@ class BaseLoader implements ILoader { private var method:String; private var data:Null; private var callback:ICallback; + private var timer:Timer; - public function new() { + public function new(?timeout = 0) { + this.timeout = timeout; busy = false; completed = Math.NaN; } @@ -42,6 +46,10 @@ class BaseLoader implements ILoader { //L.d(TAG, "Request: " + prepareUrl(url)); //internalRequest(prepareUrl(url)); Provider.get(ILoaderManager).add(this); + if (timeout > 0) { + timer = new Timer(timeout); + timer.run = callTimeout; + } return callback; } @@ -88,9 +96,11 @@ class BaseLoader implements ILoader { private function onComplete(e:Event):Void { var data:T = extrudeResult(e); - var c:ICallback = callback; - dispose(); - c.callSuccess(data); + if (data != null) { + var c:ICallback = callback; + dispose(); + c.callSuccess(data); + } } private function onError(e:Event):Void { @@ -99,12 +109,23 @@ class BaseLoader implements ILoader { c.callFail(e); } + private function callTimeout():Void { + var c:ICallback = callback; + var error:String = "Timeout for: " + url; + dispose(); + c.callFail(error); + } + private function extrudeResult(e:Event):T { throw "Abstract"; return null; } private function dispose():Void { + if (timer != null) { + timer.stop(); + timer = null; + } url = null; data = null; callback = null; diff --git a/haxework/net/BaseMediaLoader.hx b/haxework/net/BaseMediaLoader.hx index 469eddd..a98309b 100755 --- a/haxework/net/BaseMediaLoader.hx +++ b/haxework/net/BaseMediaLoader.hx @@ -22,8 +22,9 @@ class BaseMediaLoader extends BaseLoader { private var loader:Loader; - //ToDo: if storage use - override public function GET(url:String, data:Dynamic = null):ICallback { + //ToDo: if storage use and local domen + //exclude youtube player + /*override public function GET(url:String, data:Dynamic = null):ICallback { var storage:IStorage = Provider.get(IStorage); return if (storage.exists(url)) { fromBytes(storage.read(url)); @@ -37,7 +38,7 @@ class BaseMediaLoader extends BaseLoader { .fail(callback.callFail); callback; } - } + }*/ override private function internalRequest(url:String):Void { loader = buildLoader(); @@ -81,6 +82,7 @@ class BaseMediaLoader extends BaseLoader { loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError); loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); + try { loader.close(); } catch (error:Dynamic) {} loader = null; } } diff --git a/haxework/net/BaseURLLoader.hx b/haxework/net/BaseURLLoader.hx index 88fa7c9..dc0f973 100755 --- a/haxework/net/BaseURLLoader.hx +++ b/haxework/net/BaseURLLoader.hx @@ -72,6 +72,7 @@ class BaseURLLoader extends BaseLoader { loader.removeEventListener(IOErrorEvent.IO_ERROR, onError); loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); loader.removeEventListener(ProgressEvent.PROGRESS, onProgress); + try { loader.close(); } catch (error:Dynamic) {} loader = null; } } diff --git a/haxework/net/ExternalImageLoader.hx b/haxework/net/ExternalImageLoader.hx new file mode 100755 index 0000000..df9092a --- /dev/null +++ b/haxework/net/ExternalImageLoader.hx @@ -0,0 +1,57 @@ +package haxework.net; + +import haxework.net.callback.ICallback; +import flash.system.Security; +import flash.utils.ByteArray; +import flash.display.LoaderInfo; +import flash.display.Loader; +import flash.display.Bitmap; +import flash.events.Event; +import flash.display.BitmapData; + +class ExternalImageLoader extends BaseMediaLoader { + + private var internalLoader:InternalLoader; + + override private function extrudeResult(e:Event):BitmapData { + var loader:Loader = cast(e.currentTarget, LoaderInfo).loader; + if (Security.sandboxType == Security.APPLICATION) { + var content:Bitmap = cast(loader.content,Bitmap); + return content.bitmapData; + } else { + internalLoader = new InternalLoader(); + internalLoader.fromBytes(loader.contentLoaderInfo.bytes) + .success(function(data:BitmapData):Void { + var c:ICallback = callback; + dispose(); + c.callSuccess(data); + }) + .fail(function(error:Dynamic):Void { + var c:ICallback = callback; + dispose(); + c.callFail(e); + }); + return null; + } + } + + override public function dispose():Void { + super.dispose(); + if (internalLoader != null) { + internalLoader.dispose(); + internalLoader = null; + } + } +} + +class InternalLoader extends BaseMediaLoader { + + override private function extrudeResult(e:Event):BitmapData { + var loader:Loader = cast(e.currentTarget, LoaderInfo).loader; + var bitmapData:BitmapData = new BitmapData(Math.round(loader.width), Math.round(loader.height), true, 0x00000000); + bitmapData.draw(loader); + loader.unloadAndStop(); + return bitmapData; + } +} + diff --git a/haxework/net/ILoader.hx b/haxework/net/ILoader.hx index a29fc25..05d65a1 100755 --- a/haxework/net/ILoader.hx +++ b/haxework/net/ILoader.hx @@ -4,6 +4,7 @@ import flash.utils.ByteArray; import haxework.net.callback.ICallback; interface ILoader { + public var timeout(default, default):Int; public var busy(default, null):Bool; public var completed(default, null):Float; diff --git a/haxework/net/order/OrderSupplier.hx b/haxework/net/order/OrderSupplier.hx index ef2f461..81dc733 100755 --- a/haxework/net/order/OrderSupplier.hx +++ b/haxework/net/order/OrderSupplier.hx @@ -82,7 +82,9 @@ class OrderSupplier implements IOrderSupplier { private function buildLoader(clazz:Class):ILoader { var c:Class = clazz; return if (c == BitmapData) { - untyped new ImageLoader(); + var loader:ILoader = untyped new ExternalImageLoader(); + loader.timeout = 5000; //ToDo: hardcode timeout for loading images + loader; } else { throw "Unsupported order: " + c; } diff --git a/haxework/storage/NoStorage.hx b/haxework/storage/NoStorage.hx new file mode 100755 index 0000000..878f95f --- /dev/null +++ b/haxework/storage/NoStorage.hx @@ -0,0 +1,16 @@ +package haxework.storage; + +import flash.utils.ByteArray; + +class NoStorage implements IStorage { + + public function exists(key:String):Bool { + return false; + } + + public function write(key:String, value:ByteArray):Void {} + + public function read(key:String):Null { + return null; + } +} \ No newline at end of file