package { import flash.display.*; import flash.net.*; import flash.events.*; import flash.desktop.*; import flash.errors.*; import flash.system.*; public class Exporter extends MovieClip { public static var Instance:Exporter = null; public static var DefaultPort:int = 7890; private var driver:Socket = null; public function Exporter() { Instance = this; try { NativeApplication.nativeApplication.addEventListener("invoke", ApplicationInvoked); } catch (e) { // not an air runtime app ConnectDriver(DefaultPort); // try default port } } public function ApplicationInvoked(e) { if (e.arguments.length == 1) { ConnectDriver(parseInt(e.arguments[0])); } else { ConnectDriver(DefaultPort); } } private function ConnectDriver(port) { Trace("Attempting to connect to driver"); try { var s:Socket = new Socket(); s.addEventListener(IOErrorEvent.IO_ERROR, DriverError); s.addEventListener(Event.CONNECT, DriverConnected); s.connect("localhost", port); } catch (e) { Trace("Error establishing wrapper connection"); } } private function DriverError(e) { Trace(" Failed to connect"); } private function DriverConnected(e) { Trace(" Connected"); driver = e.target as Socket; driver.addEventListener(ProgressEvent.SOCKET_DATA, DriverRecv); } private function Quit() { fscommand("quit"); try { NativeApplication.nativeApplication.exit(); } catch (e) { } } private function DispatchCommand(msg) { if (msg.hasOwnProperty("command")) { var cmd = "" + msg.command; switch (cmd) { case "trace": Trace(msg.command); break; case "quit": Quit(); break; default: Trace("Recv: " + JSON.stringify(msg)); break; } } } private function DriverRecv(e) { try { var cmd = driver.readUTF(); DispatchCommand(JSON.parse(cmd)); } catch (e:EOFError) { // wait for more data } catch (e:IOError) { Trace("Driver IO error"); } catch (e) { Trace("Problem reading from driver"); } } private function DriverCommand(cmd:String, data = null) { var obj = {command:cmd}; if (data != null) { for (var k in data) { obj[k] = data[k]; } } DriverSend(JSON.stringify(obj)); } private function DriverSend(str:String) { if (driver != null) { driver.writeUTF(str); } } public function Trace(str:String) { traceText.x = 2; trace(str); traceText.width = stage.stageWidth - 4; traceText.height = stage.stageHeight - 4; if (traceText.text == "") { traceText.text = str; } else { traceText.appendText("\n" + str); } traceText.y = stage.height - traceText.textHeight - 2; } public function Print(str:String, localTrace:Boolean = true) { if (localTrace || driver == null) { Trace(str); } else { trace(str); } if (driver != null) { DriverCommand("print", {string:str}); } } } }