Tonight I spoke at the Boston Flex User Group about AIR 2.0 with a focus on the new Native Process API and Networking APIs. Alas the talk didn't go as planned since I forgot my bag of video output adapters at home and didn't notice until I was setting up. The meeting was only a few blocks away from the Allurent offices so I ran (more like a sprint) back to find suitable replacements. Alas in my rush to borrow an adapter (only being able to find a mini display port to HDMI) I ran afoul of the old Mac VGA/HDMI mechanical virus issue. However, it wasn't until after sprinting back to the meeting and futzing with projectors for 15 minutes that I realized this issue. Thankfully a fellow attendee loaned me his computer and using the USB drive I did have on me, I managed to gave a modified version of the talk sans running demo code. I'd like to thank those in attendance for their patience, apologize for my forgetfulness, and hope that at least a little information was conveyed. A copy of the presentation is available in PDF format. The most import code snippets are below:
Define a Native Process Startup Information instance:
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = _mxmlc;
var mxmlcArguments:Vector.<String> = new Vector.<String>();
mxmlcArguments.push(_cssFile.nativePath);
mxmlcArguments.push("-output");
mxmlcArguments.push(_brandFile.nativePath);
nativeProcessStartupInfo.arguments = mxmlcArguments;
nativeProcessStartupInfo.workingDirectory = _kitDir;
Create and attach listeners to a Native Process:
_nativeProcess = new NativeProcess();
_nativeProcess.addEventListener(Event.STANDARD_ERROR_CLOSE, handleStandardErrorClose);
_nativeProcess.addEventListener(Event.STANDARD_INPUT_CLOSE, handleStandardInputClose);
_nativeProcess.addEventListener(Event.STANDARD_OUTPUT_CLOSE, handleStandardOutputClose);
_nativeProcess.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, handleStandardErrorError);
_nativeProcess.addEventListener(IOErrorEvent.STANDARD_INPUT_IO_ERROR, handleStandardInputError);
_nativeProcess.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, handleStandardOutputError);
_nativeProcess.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, handleStandardErrorData);
_nativeProcess.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, handleStandardInputProgress);
_nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, handleStandardOutputData);
_nativeProcess.addEventListener(NativeProcessExitEvent.EXIT, handleNativeProcessExit);
Typical event handling code:
private function handleStandardOutputData(progressEvent:ProgressEvent):void {
trace(_nativeProcess.standardOutput.readUTFBytes(_nativeProcess.standardOutput.bytesAvailable));
}
private function handleNativeProcessExit(nativeProcessExitEvent:NativeProcessExitEvent):void {
trace(nativeProcessExitEvent.exitCode);
}
Create a new server socket that listens on an OS selected available port:
_serverSocket = new ServerSocket();
_serverSocket.addEventListener(Event.CLOSE, handleServerClose);
_serverSocket.addEventListener(Event.CONNECT, handleServerConnect);
_serverSocket.bind();
_serverSocket.listen();
Handle a new incoming connection:
private function handleServerConnect(serverSocketConnectEvent:ServerSocketConnectEvent):void {
var socket:Socket = serverSocketConnectEvent.socket;
socket.addEventListener(ProgressEvent.SOCKET_DATA, handleSocketData);
socket.addEventListener(Event.CLOSE, handleSocketClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, handleSocketIOError);
}
Handling socket data:
private function handleSocketData(progressEvent:ProgressEvent):void {
var socket:Socket = Socket(progressEvent.target);
var byteArray:ByteArray = new ByteArray();
socket.readBytes(byteArray, 0, socket.bytesAvailable);
socket.writeUTFBytes("HTTP/1.1 404 Not Found" + CRLF);
socket.writeUTFBytes("Connection: close" + CRLF);
socket.writeUTFBytes(CRLF);
socket.flush();
socket.close();
}
Tags: air flex