Progression4 AMFCommand

by meemeer
♥0 | Line 205 | Modified 2010-04-11 00:07:19 | MIT License
play

ActionScript3 source code

/**
 * Copyright meemeer ( http://wonderfl.net/user/meemeer )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vnjd
 */

package {
    import flash.events.*;
    import flash.net.*;
    import flash.system.Security;
    import flash.utils.*;
    import jp.progression.casts.*;
    import com.bit101.components.*
    import jp.progression.commands.lists.*;
    import jp.progression.commands.net.*;
    
    public class FlashTest extends CastDocument {
    		
    		private var label:Label;
    		
        public function FlashTest() {
            // write as3 code here..
            
/*
class SampleController < ApplicationController

  def helloworld
    render :amf=>"HelloWorld"
  end
  
  def return_object
    render :amf=>{"key_abc"=>"value_abc","key_def"=>"value_def"}
  end
  
  def return_arg_first
    render :amf=>params[0]
  end

  def return_arg_second
    render :amf=>params[1]
  end

end
*/
        }
        
		override protected function atReady():void
		{
			new PushButton(this, 10, 10, 'helloworld', helloworld);
			new PushButton(this, 10, 60, 'return_object', return_object);
			new PushButton(this, 10, 110, 'return_arg_second', return_arg_second);
			label = new Label(this, 150, 10, "");
		}
		
		private function helloworld(e:Event = null):void
		{
			/*
			new Amf(関数名, callback, initobject, 引数)
			変な順番...
			*/
			new SerialList(null,
				new Amf('SampleController.helloworld', function(res:String):String {
					return '[ ' + res + ' ]';
				}, {
					onStart:function():void {
						trace('amf start');
					},
					onComplete:function():void {
						trace('amf end');
					}
				} ),
				function():void {
					trace(this.latestData);
					label.text = this.latestData;
				}
			).execute();
		}
		
		private function return_object(e:Event = null):void
		{
			new SerialList(null,
				new Amf('SampleController.return_object', function(res:Object):Object {
					var b:* = '';
					for each (var a:* in res) {
						b += '\n' + a + ',';
					}
					return '[' + b + '\n]';
				}, {
					onStart:function():void {
						trace('amf start');
					},
					onComplete:function():void {
						trace('amf end');
					}
				} ),
				function():void {
					trace(this.latestData);
					label.text = this.latestData;
				}
			).execute();
		}
		
		private function return_arg_second(e:Event = null):void
		{
			new SerialList(null,
				new Amf('SampleController.return_arg_second', function(res:String):String {
					return '[ ' + res + ' ]';
				}, {
					onStart:function():void {
						trace('amf start');
					},
					onComplete:function():void {
						trace('amf end');
					}
				}, 'arg1', 'arg2', 'arg3'),
				function():void {
					trace(this.latestData);
					label.text = this.latestData;
				}
			).execute();
		}
    }
}

import flash.events.Event;
import flash.net.Responder;
import jp.progression.casts.*;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.commands.*;
import jp.progression.data.*;
import jp.progression.events.*;
import jp.progression.scenes.*;

/**
 * ...
 * @author m_emem
 */
class Amf extends Command 
{
	private var _amf:AmfConnect;
	private var _func:String;
	private var _args:Object;
	private var _callback:Function;
	
	/**
	 * 新しい AmfCommand インスタンスを作成します。
	 */
	public function Amf( func:String, callback:Function, initObject:Object = null, ... args:Array ) 
	{
		_func = func;
		_callback = callback;
		_args = args;
		
		// 親クラスを初期化します。
		super( _execute, _interrupt, initObject );
	}
	
	/**
	 * 実行されるコマンドの実装です。
	 */
	private function _execute():void 
	{
		_amf = AmfConnect.instance;
		_amf.dispatcher.addEventListener(Event.COMPLETE, _complete, false, 0, true);
		
		var params:Array = [_func, _callback];
		params.push.apply(params, _args);
		_amf.execute.apply(_amf, params);
		
		// 
		//executeComplete();
	}
	
	/**
	 * 中断されるコマンドの実装です。
	 */
	private function _interrupt():void 
	{
	}
	
	private function _complete(e:Event):void
	{
		_amf.dispatcher.removeEventListener(Event.COMPLETE, _complete);
		latestData = _amf.data;
		
		_amf.data = null;
		_func = null;
		_callback = null;
		_args = null;
		
		if (_amf.error != null) {
			super.throwError(this, new Error(_amf.error));
		} else {
			super.executeComplete();
		}
	}
	
	/**
	 * インスタンスのコピーを作成して、各プロパティの値を元のプロパティの値と一致するように設定します。
	 */
	public override function clone():Command 
	{
		return new Amf( _func, _callback, this, _args );
	}
}


import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;

/**
 * ...
 * @author m_emem
 */
class AmfConnect
{
	private static var _instance:AmfConnect;
	public var dispatcher:IEventDispatcher;
	public var nc:NetConnection;
	public var error:Object;
	
	//private var gatewayUrl:String = 'http://localhost:13000/rubyamf/gateway';
	private var gatewayUrl:String = 'http://afternoon-spring-97.heroku.com/rubyamf/gateway';
	private var callback:Function;
	public var data:Object;
	
	public function AmfConnect() 
	{
		if (_instance === null) {
			_instance = this;
			init();
		} else {
			throw new Error('Singleton class');
		}
	}
	
	public static function get instance():AmfConnect
	{
		if (_instance === null) {
			_instance = new AmfConnect();
		}
		return _instance;
	}
	
	private function init():void
	{
		dispatcher = new EventDispatcher();
		error = null;
		
		nc = new NetConnection();
		nc.objectEncoding = ObjectEncoding.AMF3;
		nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
		nc.connect(gatewayUrl);
	}
	
	private function onNetStatus(e:NetStatusEvent):void 
	{
		trace("Connection error, error code: (" +e.info.code + ")", "System message");
	}
	
	public function execute(_func:String, _callback:Function, ... _args:Array):void
	{
		callback = _callback;
		
		var params:Array = [_func, new Responder(onResultHandler, onFaultHandler)];
		params.push.apply(params, _args);
		nc.call.apply(nc, params);
	}
	
	private function onResultHandler(result:Object):void
	{
		if (callback != null) {
			data = callback.call(null, result);
		} else {
			data = result;
		}
		dispatcher.dispatchEvent(new Event(Event.COMPLETE));
	}
	
	private function onFaultHandler(fault:Object):void
	{
		data = fault;
		error = 'discription: ' + fault.description + ' code: ' + fault.code + ' details: ' + fault.details + ' level: ' + fault.level + ' line: ' + fault.line;
		dispatcher.dispatchEvent(new Event(Event.COMPLETE));
	}
	
}