Newer
Older
exporter / Exporter.as
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});
			}
		}
	}
}