Language version: | ActionScript 3.0 |
The NativeProcess class provides command line integration and general launching capabilities. The NativeProcess
class lets an AIR application execute native processes on the host operating system. The AIR applcation
can monitor the standard input (stdin) and standard output (stdout) stream of the process as well as the
process's standard error (stderr) stream.
The NativeProcess class and its capabilities are only available to AIR applications installed with a
native installer (extended desktop profile applications). When debugging, you can pass the
-profile extendedDesktop
argument to ADL to enable the NativeProcess functionality.
At runtime, you can check the NativeProcess.isSupported
property to to determine whether
native process communication is supported.
AIR profile support: This feature is supported
on applications that are deployed to desktop operating systems via native installers.
The feature is not supported on mobile devices or on AIR for TV devices. You can test
for support at run time using the NativeProcess.isSupported
property. See
AIR Profile Support for more information regarding API support across multiple profiles.
AIR applications installed with a native installer (extended desktop profile applications) can also use the
File.openWithDefaultApplication
to open an application. However, the NativeProcess class
provides direct access to the standard input, standard output, and standard error pipes.
Note: AIR for TV applications using the extendedTV
profile can use native extensions
to execute native processes. Similarly, mobile devices can use native extensions.
View the examples.
isSupported:Boolean
[read-only]
Language version: | ActionScript 3.0 |
Indicates if running native processes is supported in the current profile. This property returns
true
only when running in the extendedDesktop profile. In addition,
NativeProcess.isSupported
is always false
for applications installed
as an AIR file. You must package an AIR application using the ADT -target native
flag
in order to use the NativeProcess class.
Implementation
public static function get isSupported():Boolean
running:Boolean
[read-only]
Language version: | ActionScript 3.0 |
Indicates if this native process is currently running. The process is running if you have called
the start()
method and the NativeProcess object has not yet dispatched an exit
event. A NativeProcess instance corresponds to a single process on the underlying operating system.
This property remains true
as long as the underlying operating system process is executing
(while the native process is starting and until the process returns an exit code to the operating system.)
Implementation
public function get running():Boolean
standardError:IDataInput
[read-only]
Language version: | ActionScript 3.0 |
Provides access to the standard error output from this native process. As data
becomes available on this pipe, the NativeProcess object dispatches a ProgressEvent
object. If you attempt to read data from this stream when no data is
available, the NativeProcess object throw an EOFError exception.
The type is IDataInput because data is input from the perspective of the
current process, even though it is an output stream of the child process.
Implementation
public function get standardError():IDataInput
Throws
| Error — if no data is present and a read operation is attempted.
|
See also
standardInput:IDataOutput
[read-only]
Language version: | ActionScript 3.0 |
Provides access to the standard input of this native process. Use this pipe to
send data to this process. Each time data is written to the input
property
that data is written to the native process's input pipe as soon as possible.
The type is IDataOutput because data is output from the perspective of the current process,
even though it is an input stream of the child process.
Implementation
public function get standardInput():IDataOutput
Throws
| Error — when writing to this value when running returns false or
when attempting to write data to a closed input stream.
|
See also
standardOutput:IDataInput
[read-only]
Language version: | ActionScript 3.0 |
Provides access to the standard output pipe of this native process. Use this pipe to
read data from the native process's standard output. When data is present on this pipe,
the NativeProcess object dispatches a ProgressEvent. If you attempt to read data from this stream
when no data is available, the NativeProcess object throws an EOFError.
The type is IDataInput because data is input from the perspective of the
current process even though it is an output stream of the child process.
Implementation
public function get standardOutput():IDataInput
Throws
| Error — if no data is present and a read operation is attempted.
|
See also
public function NativeProcess()
Language version: | ActionScript 3.0 |
Constructs an uninitialized NativeProcess object. Call the start()
method
to start the process.
See also
public function closeInput():void
Language version: | ActionScript 3.0 |
Closes the input stream on this process. Some command line applications
wait until the input stream is closed to start some operations. Once
the stream is closed it cannot be re-opened until the process exits and
is started again.
Events
| ioErrorStandardInput:IOErrorEvent — There is a problem closing the input stream to the process |
|
| standardInputClose:Event — The input stream has been closed. |
public function exit(force:Boolean = false):void
Language version: | ActionScript 3.0 |
Attempts to exit the native process.
Parameters
| force:Boolean (default = false ) — Whether the application should attempt to forcibly exit the native process, if necessary.
If the force parameter is set to false , this method attempts to gracefully exit the native process.
This method "asks" the native process to exit. This request may be ignored by the native process, and as a result this method
is not guaranteed to actually cause the native process to exit. The NativeProcess object only dispatches a
NativeProcessExitEvent event if the native process exits.
If the force parameter is set to true , this method attempts to forcibly exit the native process.
Calling this method with the force parameter is set to true should be a last resort.
Calling this method with the force parameter is set to true may have adverse affects on the state of system
resources associated with the native process. For example, opened files may be left in an inconsistent state. The runtime will
make its best effort to try to force the native process to exit. However, it is not guaranteed that the native process
will exit. The NativeProcess object only dispatches a NativeProcessExitEvent event if the native process exits.
If the NativeProcess does successfully exit, it dispatches a NativeProcessExitEvent event.
|
public function start(info:NativeProcessStartupInfo):void
Language version: | ActionScript 3.0 |
Starts the native process identified by the start up info specified. Once the process starts,
all of the input and output streams will be opened. This method returns immediately after the request
to start the specified process has been made to the operating system. The NativeProcess object throws an
IllegalOperationError
exception if the process is currently running. The process is running
if the running
property of the NativeProcess object returns true
.
If the operating system is unable to start the process, an Error
is thrown.
A NativeProcess instance corresponds to a single process on the underlying operating system. If you want to execute more than
one instance of the same operating system process concurrently, you can create one NativeProcess instance per child
process.
You can call this method whenever the running
property of the NativeProcess object returns false
.
This means that the NativeProcess object can be reused. In other words you can construct a NativeProcess instance,
call the start()
method, wait for the exit
event, and then call the start()
method again. You may use a different NativeProcessStartupInfo object as the info
parameter value in
the subsequent call to the start()
method.
The NativeProcess class and its capabilities are only available to AIR applications installed with a
native installer. When debugging, you can pass the -profile extendedDesktop
argument to ADL
to enable the NativeProcess functionality. Check the NativeProcess.isSupported
property to
to determine whether native process communication is supported.
Important security considerations:
The native process API can run any executable on the user's system. Take extreme care when constructing
and executing commands. If any part of a command to be executed originates from an external source,
carefully validate that the command is safe to execute. Likewise, your AIR application should
validate data passed to a running process.
However, validating input can be difficult. To avoid such difficulties, it is best
to write a native application (such as an EXE file on Windows) that has specific APIs. These APIs should
process only those commands specifically required by the AIR application. For example, the native
application may accept only a limited set of instructions via the standard input stream.
AIR on Windows does not allow you to run .bat files directly. Windows .bat files are executed by
the command interpreter application (cmd.exe). When you invoke a .bat file, this command application
can interpret arguments passed to the command as additional applications to launch. A malicious injection
of extra characters in the argument string could cause cmd.exe to execute a harmful or insecure application.
For example, without proper data validation, your AIR application may call
myBat.bat myArguments c:/evil.exe
. The command application would launch the evil.exe
application in addition to running your batch file.
If you call the start()
method with a .bat file, the NativeProcess object
throws an exception. The message
property of the Error object contains the string
"Error #3219: The NativeProcess could not be started."
Parameters
Throws
| Error — if the NativeProcess is currently running.
|
|
| ArgumentError — if the nativePath property of the NativeProcessStartupInfo does not exist.
|
|
| Error — if the NativeProcess did not start successfully.
|
See also
Event object type: flash.events.NativeProcessExitEvent
Language version: | ActionScript 3.0 |
Signals the native process has exited. The exitCode
property
contains the value the process returns to the host operating system on exit.
If the AIR application terminates the process by calling the exit()
method of the NativeProcess object, the exitCode
property is set
to NaN.
Event object type: flash.events.Event
Language version: | ActionScript 3.0 |
Signals that the NativeProcess has closed its error stream.
Event object type: flash.events.ProgressEvent
Language version: | ActionScript 3.0 |
Signals that the native process has data available to read on the standard error (stderror) stream. The NativeProcess
object dispatches this event when the child process flushes its standard error stream or when the internal
buffer used to communicate between the processes is full. Do not write code that depend on
the size of this internal buffer; it varies between versions and operating systems.
Event object type: flash.events.IOErrorEvent
Language version: | ActionScript 3.0 |
Signals that reading from the standard error (stderror) stream has failed. The NativeProcess object can dispatch
this event when the runtime
cannot read data from the native process's standard error pipe.
Event object type: flash.events.Event
Language version: | ActionScript 3.0 |
Signals that the NativeProcess object has closed its input stream by calling the closeInput()
method. The NativeProcess object does not dispatch this event when the actual native process itself
closes the input stream.
Event object type: flash.events.IOErrorEvent
Language version: | ActionScript 3.0 |
Signals that writing to the standard input (stdin) stream has failed. The NativeProcess
object dispatches this event when the closeInput()
method fails or when the runtime
cannot write data to the native process's standard input pipe.
Event object type: flash.events.ProgressEvent
Language version: | ActionScript 3.0 |
Signals that the NativeProcess has written data to the input stream for the child process.
The NativeProcess object dispatches this event when data is written to the stream. This event
does not indicate whether or not the child process has read any of the data.
Event object type: flash.events.Event
Language version: | ActionScript 3.0 |
Signals that the NativeProcess has closed its output stream.
Event object type: flash.events.ProgressEvent
Language version: | ActionScript 3.0 |
Signals that the native process has data available to read on the output stream. The NativeProcess
object dispatches this event when the child process flushes its stdout stream or when the internal
buffer used to communicate between the processes is full. Do not write code that depend on
the size of this internal buffer; it varies between versions and operating systems.
Event object type: flash.events.IOErrorEvent
Language version: | ActionScript 3.0 |
Signals that reading from the stdout stream has failed. The NativeProcess object can dispatch
this event when the runtime
cannot read data from the native process's standard output pipe.
The following example checks to see if native process communication is supported on
the machine. If it is, the application sets up event listeners for the native process and launches
the test.py file in the main application directory). :
package
{
import flash.display.Sprite;
import flash.desktop.NativeProcess;
import flash.desktop.NativeProcessStartupInfo;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.NativeProcessExitEvent;
import flash.filesystem.File;
public class NativeProcessExample extends Sprite
{
public var process:NativeProcess;
public function NativeProcessExample()
{
if(NativeProcess.isSupported)
{
setupAndLaunch();
}
else
{
trace("NativeProcess not supported.");
}
}
public function setupAndLaunch():void
{
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var file:File = File.applicationDirectory.resolvePath("test.py");
nativeProcessStartupInfo.executable = file;
var processArgs:Vector.<String> = new Vector.<String>();
processArgs[0] = "foo";
nativeProcessStartupInfo.arguments = processArgs;
process = new NativeProcess();
process.start(nativeProcessStartupInfo);
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
}
public function onOutputData(event:ProgressEvent):void
{
trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable));
}
public function onErrorData(event:ProgressEvent):void
{
trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable));
}
public function onExit(event:NativeProcessExitEvent):void
{
trace("Process exited with ", event.exitCode);
}
public function onIOError(event:IOErrorEvent):void
{
trace(event.toString());
}
}
}
Add the following Python script to a file named test.py in your
application directory (and the ensure that Python is installed):
#!/usr/bin/python
# ------------------------------------------------------------------------------
# Sample Python script
# ------------------------------------------------------------------------------
import sys
for word in sys.argv: #echo the command line arguments
print word
print "HI FROM PYTHON"
print "Enter user name"
line = sys.stdin.readline()
sys.stdout.write("hello," + line)
© 2004-2022 Adobe Systems Incorporated. All rights reserved.
Wed Sep 28 2022, 6:12 PM GMT+01:00