package jp.clockmaker.prog4.commands { import com.adobe.net.URI; import flash.events.Event; import flash.events.TimerEvent; import flash.utils.ByteArray; import flash.utils.Timer; import jp.progression.commands.Command; import org.httpclient.HttpClient; import org.httpclient.HttpRequest; import org.httpclient.events.HttpDataEvent; import org.httpclient.http.Get; /** * as3httpclientlib を利用したコマンド * @author Yasu */ public class HttpClientCommand extends Command { /** *取得したデータのバイナリデータです。 */ private var _bytes:ByteArray; public function get bytes():ByteArray { return _bytes; } /** * リクエスト先のURLです。 */ private var _url:String = ""; public function get url():String { return _url; } public function set url(value:String):void { _url = value; } /** * 新しい MyCommand インスタンスを作成します。 */ public function HttpClientCommand(initObject:Object = null) { // 親クラスを初期化します。 super(_executeFunction, _interrupt, initObject); } /** * リクエストヘッダーを取得します。 * リクエストヘッダーはリテラル記法で記述ください。 * command.requestHeaders = { Referer: "hogehoge" } */ private var _requestHeaders:Object; public function get requestHeaders():Object { return _requestHeaders; } public function set requestHeaders(value:Object):void { _requestHeaders = value; } /** * @private */ private var _httpClient:HttpClient; /** * @private */ private var _timer:Timer; /** * @private */ private var _start:int; /** * 実行されるコマンドの実装です。 */ private function _executeFunction():void { _httpClient = new HttpClient(); var uri:URI = new URI(_url); var request:HttpRequest = new Get(); for (var param:String in _requestHeaders) { request.addHeader(param, _requestHeaders[param]); } _httpClient.listener.onData = this.dataHandler; _httpClient.listener.onError = this.onErrorHandler; _httpClient.request(uri, request); _bytes = new ByteArray(); _start = 0; _timer = new Timer(1000, 1); _timer.addEventListener(TimerEvent.TIMER_COMPLETE, onLoadedImage); } private function dataHandler(evt:HttpDataEvent):void { var loadBytes:ByteArray = evt.bytes; loadBytes.position = 0; for (var i:int = 0; i < loadBytes.length; i++) { _bytes.position = _start; loadBytes.position = i; _bytes.writeByte(loadBytes.readByte()); _start++; } // タイマーをかけて最後のonDataイベントからの時間を測定して終了イベントを発行 _timer.stop(); _timer.reset(); _timer.start(); } /** * 読み込み完了時からタイマーの測定時間後に発行 */ private function onLoadedImage(e:Event = null):void { _destroy(); super.executeComplete(); } /** *エラーが起きたとき */ private function onErrorHandler(e:Error):void { _destroy(); super.throwError(this, new Error(e.message)); } /** * メモリの解放 * @private */ private function _destroy():void { _timer.removeEventListener(TimerEvent.TIMER_COMPLETE, onLoadedImage); _timer = null; _httpClient = null; _start = NaN; } /** * 中断されるコマンドの実装です。 */ private function _interrupt():void { } /** * インスタンスのコピーを作成して、各プロパティの値を元のプロパティの値と一致するように設定します。 */ public override function clone():Command { return new HttpClientCommand(this); } } }