1  /**
     2   * com.sekati.remoting.RemoteCall
     3   * @version 1.0.0
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   */
     8   
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.events.Dispatcher;
    11  import com.sekati.remoting.RemoteEvent;
    12  import mx.rpc.RelayResponder;
    13  import mx.rpc.ResultEvent;
    14  import mx.rpc.FaultEvent;
    15  import mx.remoting.PendingCall;
    16  import mx.remoting.Service;
    17  
    18  /**
    19   * Make Remoting calls to AMFPHP, Fluorine, etc.
    20   * TODO Replace Singleton Dispatcher for call result handling granularity.
    21   * @see <a href="http://www.amfphp.org">AMFPHP</a>
    22   * @see <a href="http://remoting.sekati.com/browser/">remoting.sekati.com</a>
    23   */
    24  class com.sekati.remoting.RemoteCall extends CoreObject {
    25  
    26  	private var _gateway:String;
    27  	private var _service:String;
    28  	private var _method:String;	
    29  
    30  	/**
    31  	 * RemoteCall Constructor
    32  	 * @param gateway (String)
    33  	 * @param service (String)
    34  	 * @param method (String)
    35  	 * @return Void
    36  	 */
    37  	public function RemoteCall(gateway:String, service:String, method:String) {
    38  		super( );
    39  		_gateway = gateway;
    40  		_service = service;
    41  		_method = method;		
    42  	}
    43  
    44  	/**
    45  	 * Invoke the RPC; all arguments will be passed through.
    46  	 * @param * (Object) your arguments here.
    47  	 * @return Void
    48  	 */
    49  	public function call():Void {
    50  		var s:Service = new Service( _gateway, null, _service );
    51  		var pc:PendingCall = s[_method].apply( this, arguments );
    52  		pc.responder = new RelayResponder( this, "callResult", "callFault" );		
    53  	}
    54  
    55  	/**
    56  	 * Call onResult Handler
    57  	 * @param res (ResultEvent)
    58  	 * @return Void
    59  	 */
    60  	private function callResult(res:ResultEvent):Void {
    61  		var result:Object = res.result;
    62  		var error:Object = false;
    63  		var remote:RemoteCall = this;
    64  		Dispatcher.$.dispatchEvent( new RemoteEvent( RemoteEvent.onRemoteResultEVENT, this, {result:result, error:error, remote:remote} ) );
    65  	}
    66  
    67  	/**
    68  	 * Call onFault Handler
    69  	 * @param fault (FaultEvent)
    70  	 * @return Void
    71  	 */
    72  	private function callFault(fault:FaultEvent):Void {
    73  		var result:Object = null;
    74  		var error:Object = {};
    75  		var remote:RemoteCall = this;
    76  		for(var i:String in fault.fault) error[i] = fault.fault[i];
    77  		Dispatcher.$.dispatchEvent( new RemoteEvent( RemoteEvent.onRemoteFaultEVENT, this, {result:result, error:error, remote:remote} ) );
    78  	}
    79  }