package { import flash.display.Sprite; import flash.external.ExternalInterface; import flash.events.*; import flash.net.XMLSocket; public class JSXMLSocket extends Sprite { public var instance:Array = new Array(); public var jsEventListener:Object = new Object(); public var jsEventListeners:Array = new Array(); public function JSXMLSocket() { if(ExternalInterface.available){ ExternalInterface.addCallback("create", create); ExternalInterface.addCallback("close", close); ExternalInterface.addCallback("connect", connect); ExternalInterface.addCallback("send", send); ExternalInterface.addCallback("addJSEventListener", addJSEventListener); ExternalInterface.addCallback("removeJSEventListener", removeJSEventListener); } } public function create():int { trace("create"); var socket:XMLSocket = new XMLSocket(); instance[instance.length] = socket; socket.addEventListener(Event.CLOSE, jsDispatcher); socket.addEventListener(Event.CONNECT, jsDispatcher); socket.addEventListener(DataEvent.DATA, jsDispatcher); socket.addEventListener(IOErrorEvent.IO_ERROR, jsDispatcher); socket.addEventListener(ProgressEvent.PROGRESS, jsDispatcher); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, jsDispatcher); return instance.length-1; } public function connect(instanceId:int, host:String, port:int):void { trace("connect"); instance[instanceId].connect(host, port); } public function send(instanceId:int, object:*):void { trace("send"); instance[instanceId].send(object); } public function close(instanceId:int):void { instance[instanceId].close(); } public function addJSEventListener(instanceId:int, type:String, functionName:String):int { var index:int = jsEventListeners.length; jsEventListeners[index] = { "instanceId":instanceId, "type":type, "functionName":functionName, "call":true } return index; } public function removeJSEventListener(eventListenerId:int):void { jsEventListeners[eventListenerId].call = false; } private function jsDispatcher(event:Event):void { for(var i:int=0; i