loader: fixes

This commit is contained in:
2014-01-22 15:33:40 +04:00
parent 9618e2e042
commit fe13fd7455
7 changed files with 108 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
package haxework.net; package haxework.net;
import haxe.Timer;
import flash.net.URLRequestMethod; import flash.net.URLRequestMethod;
import flash.events.ProgressEvent; import flash.events.ProgressEvent;
import haxework.net.manage.ILoaderManager; import haxework.net.manage.ILoaderManager;
@@ -18,6 +19,7 @@ class BaseLoader<T> implements ILoader<T> {
public static function prepareUrl(url:String):String { for (p in urlProcessors) url = p(url); return url; } 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 busy(default, null):Bool;
public var completed(default, null):Float; public var completed(default, null):Float;
@@ -25,8 +27,10 @@ class BaseLoader<T> implements ILoader<T> {
private var method:String; private var method:String;
private var data:Null<Dynamic>; private var data:Null<Dynamic>;
private var callback:ICallback<T>; private var callback:ICallback<T>;
private var timer:Timer;
public function new() { public function new(?timeout = 0) {
this.timeout = timeout;
busy = false; busy = false;
completed = Math.NaN; completed = Math.NaN;
} }
@@ -42,6 +46,10 @@ class BaseLoader<T> implements ILoader<T> {
//L.d(TAG, "Request: " + prepareUrl(url)); //L.d(TAG, "Request: " + prepareUrl(url));
//internalRequest(prepareUrl(url)); //internalRequest(prepareUrl(url));
Provider.get(ILoaderManager).add(this); Provider.get(ILoaderManager).add(this);
if (timeout > 0) {
timer = new Timer(timeout);
timer.run = callTimeout;
}
return callback; return callback;
} }
@@ -88,10 +96,12 @@ class BaseLoader<T> implements ILoader<T> {
private function onComplete(e:Event):Void { private function onComplete(e:Event):Void {
var data:T = extrudeResult(e); var data:T = extrudeResult(e);
if (data != null) {
var c:ICallback<T> = callback; var c:ICallback<T> = callback;
dispose(); dispose();
c.callSuccess(data); c.callSuccess(data);
} }
}
private function onError(e:Event):Void { private function onError(e:Event):Void {
var c:ICallback<T> = callback; var c:ICallback<T> = callback;
@@ -99,12 +109,23 @@ class BaseLoader<T> implements ILoader<T> {
c.callFail(e); c.callFail(e);
} }
private function callTimeout():Void {
var c:ICallback<T> = callback;
var error:String = "Timeout for: " + url;
dispose();
c.callFail(error);
}
private function extrudeResult(e:Event):T { private function extrudeResult(e:Event):T {
throw "Abstract"; throw "Abstract";
return null; return null;
} }
private function dispose():Void { private function dispose():Void {
if (timer != null) {
timer.stop();
timer = null;
}
url = null; url = null;
data = null; data = null;
callback = null; callback = null;

View File

@@ -22,8 +22,9 @@ class BaseMediaLoader<T> extends BaseLoader<T> {
private var loader:Loader; private var loader:Loader;
//ToDo: if storage use //ToDo: if storage use and local domen
override public function GET(url:String, data:Dynamic = null):ICallback<T> { //exclude youtube player
/*override public function GET(url:String, data:Dynamic = null):ICallback<T> {
var storage:IStorage = Provider.get(IStorage); var storage:IStorage = Provider.get(IStorage);
return if (storage.exists(url)) { return if (storage.exists(url)) {
fromBytes(storage.read(url)); fromBytes(storage.read(url));
@@ -37,7 +38,7 @@ class BaseMediaLoader<T> extends BaseLoader<T> {
.fail(callback.callFail); .fail(callback.callFail);
callback; callback;
} }
} }*/
override private function internalRequest(url:String):Void { override private function internalRequest(url:String):Void {
loader = buildLoader(); loader = buildLoader();
@@ -81,6 +82,7 @@ class BaseMediaLoader<T> extends BaseLoader<T> {
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError); loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError);
loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress); loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
try { loader.close(); } catch (error:Dynamic) {}
loader = null; loader = null;
} }
} }

View File

@@ -72,6 +72,7 @@ class BaseURLLoader<T> extends BaseLoader<T> {
loader.removeEventListener(IOErrorEvent.IO_ERROR, onError); loader.removeEventListener(IOErrorEvent.IO_ERROR, onError);
loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError); loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
loader.removeEventListener(ProgressEvent.PROGRESS, onProgress); loader.removeEventListener(ProgressEvent.PROGRESS, onProgress);
try { loader.close(); } catch (error:Dynamic) {}
loader = null; loader = null;
} }
} }

View File

@@ -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<BitmapData> {
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<BitmapData> = callback;
dispose();
c.callSuccess(data);
})
.fail(function(error:Dynamic):Void {
var c:ICallback<BitmapData> = 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<BitmapData> {
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;
}
}

View File

@@ -4,6 +4,7 @@ import flash.utils.ByteArray;
import haxework.net.callback.ICallback; import haxework.net.callback.ICallback;
interface ILoader<T> { interface ILoader<T> {
public var timeout(default, default):Int;
public var busy(default, null):Bool; public var busy(default, null):Bool;
public var completed(default, null):Float; public var completed(default, null):Float;

View File

@@ -82,7 +82,9 @@ class OrderSupplier implements IOrderSupplier {
private function buildLoader<T>(clazz:Class<T>):ILoader<T> { private function buildLoader<T>(clazz:Class<T>):ILoader<T> {
var c:Class<Dynamic> = clazz; var c:Class<Dynamic> = clazz;
return if (c == BitmapData) { return if (c == BitmapData) {
untyped new ImageLoader(); var loader:ILoader<T> = untyped new ExternalImageLoader();
loader.timeout = 5000; //ToDo: hardcode timeout for loading images
loader;
} else { } else {
throw "Unsupported order: " + c; throw "Unsupported order: " + c;
} }

16
haxework/storage/NoStorage.hx Executable file
View File

@@ -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<ByteArray> {
return null;
}
}