package sketchbook.net
{
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.events.HTTPStatusEvent;
import flash.events.ProgressEvent;
import flash.net.URLVariables;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.net.URLLoaderDataFormat;
/**
* URLLoaderを簡略化したクラスです。
*
URLLoaderのイベントに対するコールバックハンドラや、URLRequestを介さず直接URLをコールするメソッドを提供します。
* TODO: Flashのundocumentな使用か、onCompleteというハンドラがうまく動かない
* @example
* var loader:URLLoaderSB = new URLLoader()
* loader.onComplete=function(data:Object):void
* {
* trace("loadCompleted")
* }
* loader.loadURL("http://www.fladdict.net")
*
* @see flash.net.URLLoader
* * */
public class URLLoaderHelper
{
/** Event.COMPLETEのコールバックハンドラ。 引数としてdata:Objectが渡されます。 */
public var onComplete:Function
/** HTTPStatusEvent.HTTP_STATUSのコールバックハンドラ。引数としてstatusが渡されます。*/
public var onHttpStatus:Function
/** IOErrorEvent.IOErrorのコールバックハンドラ。*/
public var onIOError:Function
/** Event.OPENのコールバックハンドラ。 */
public var onOpen:Function
/** ProgressEvent.PROGRESSのコールバックハンドラ。引数としてbytesLoaded, bytesTotalが渡されます。*/
public var onProgress:Function = function():void{}
public var onSecurityError:Function
/** URLRequestMethodの定数へのショートカット */
public static const METHOD_POST:String = URLRequestMethod.POST
/** URLRequestMethodの定数へのショートカット */
public static const METHOD_GET:String = URLRequestMethod.GET
/** URLLoaderDataの定数へのショートカット */
public static const DATA_FORMAT_BINARY:String = URLLoaderDataFormat.BINARY
/** URLLoaderDataの定数へのショートカット */
public static const DATA_FORMAT_TEXT:String = URLLoaderDataFormat.TEXT
/** URLLoaderDataの定数へのショートカット */
public static const DATA_FORMAT_VARIABLES:String = URLLoaderDataFormat.VARIABLES
private var _target:URLLoader
/**
* 対象のURLLoaderに対する簡易イベントハンドラー等を提供するヘルパー。
*/
public function URLLoaderHelper(urlLoader:URLLoader)
{
target = urlLoader
}
/** 操作対象のURLLoader */
public function set target(urlLoader:URLLoader):void
{
if(urlLoader==_target) return
if(_target!=null){
_target.removeEventListener(Event.COMPLETE, _complete)
_target.removeEventListener(HTTPStatusEvent.HTTP_STATUS, _httpStatus)
_target.removeEventListener(IOErrorEvent.IO_ERROR, _ioError)
_target.removeEventListener(ProgressEvent.PROGRESS, _progress)
_target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityError)
}
_target = urlLoader
if(_target!=null){
_target.addEventListener(Event.COMPLETE, _complete,false,0,true)
_target.addEventListener(HTTPStatusEvent.HTTP_STATUS, _httpStatus, false, 0, true)
_target.addEventListener(IOErrorEvent.IO_ERROR, _ioError, false,0,true)
_target.addEventListener(ProgressEvent.PROGRESS, _progress, false, 0, true)
_target.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityError, false, 0, true)
}
}
public function get target():URLLoader
{
return _target
}
/**
* URLLoader.loadのショートカット
* URLRequestだけでなく、StringでURLを指定してもリクエスト可能です。
*
* @see flash.net.URLRequest#load()
*/
public function load(...rest):void
{
var req:URLRequest
if(rest[0] is URLRequest )
req = rest[0]
if(rest[0] is String )
req = new URLRequest(rest[0])
_target.load(req)
}
/**
* URLRequestを介さずにURLをダイレクトに指定するロード方法します。
*
* @example
* var params:Object = {keyword:"test", sort:"asc"}
* var loader:URLLoaderSB = new URLLoader()
* loader.loadURL("http://www.fladdict.net",params,"POST")
*
* @param url ロードするURL
* @param params サーバーに渡す引数を格納した無名オブジェクト
* @param method POST or GET
* @param headerParams ヘッダーとして送信する値を格納した無名オブジェクト
*
* @see flash.net.URLRequest
* */
public function loadURL(url:String, params:Object=null, method:String="GET", headerParams:Object=null):void
{
var req:URLRequest = new URLRequest(url)
var val:URLVariables = new URLVariables()
for(var prop:String in params)
val[prop] = params[prop]
req.data = val
req.method = method
var urlHeaders:Array = new Array()
for(prop in headerParams)
urlHeaders.push( new URLRequestHeader(prop,headerParams[prop]) )
req.requestHeaders = urlHeaders
_target.load(req)
}
public function get data():*
{
_target.data
}
public function set dataFormat(dataFormat:String):void
{
_target.dataFormat = dataFormat
}
public function get dataFormat():String
{
return _target.dataFormat
}
private function _complete(e:Event):void
{
if(onComplete!=null)
onComplete(_target.data)
}
private function _httpStatus(e:HTTPStatusEvent):void
{
if(onHttpStatus!=null)
onHttpStatus(e.status)
}
private function _ioError(e:IOErrorEvent):void
{
if(onIOError!=null)
onIOError()
}
private function _open(e:Event):void
{
if(onOpen!=null)
onOpen()
}
private function _progress(e:ProgressEvent):void
{
if(onProgress!=null)
onProgress(e.bytesLoaded, e.bytesLoaded)
}
private function _securityError(e:SecurityErrorEvent):void
{
if(onSecurityError!=null)
onSecurityError()
}
}
}