タグ「air air2 perl ajax」が付けられているもの

[AIR2.0 ajax] NativeProcessで perl を呼び出す メモ

  • 投稿日:
  • by
  • カテゴリ:
アドビのサンプル:Interacting with a native processのエコープログラムを
perlに置き換えてみました。

アドビのサンプル:Interacting with a native process

AIR2 ajax htmlの書き方の場合のメモを残します。
(FLEX,FLASH Builderのas3でのサンプルは多いのですが、ajaxでの書き方はあまり載っていないので。)

1. perl で標準入力から入力された文字をそのまま標準出力で返却するスクリプトを書く
NativeProcessは外部のアプリを起動し標準入出力でデータの受け渡しを行います。
AnyEventを使い標準入力があるまで待機し、入力が行われたら文字列をそのまま返します。
 
#!/usr/bin/perl
use strict;
use AnyEvent;

my $cv = AnyEvent->condvar;
my $w; $w = AnyEvent->io(
    fh   => \*STDIN,
    poll => 'r',
    cb   => sub {
        chomp(my $input = <STDIN>);
        print $input . "\n";
        $cv->send;
    },
    );
$cv->recv;
今回はecho.plという名前で保存します。

2. AIR2.0からperlスクリプトを実行します。
以下のような記述で perl スクリプトの呼び出しが行えます。
Ajaxでのargumentsの使い方が as3のVectorを使っており特殊なので注意してください
adobeのAIR2フォーラムから書式を参考にしました。
参考:NativeProcessInfo() arguments in JavaScript?

AIRから/usr/bin/perlを実行し、引数にスクリプトへのパスを指定しています。
インストール場所によっても違いますが、今回perlスクリプトへのパスは、
 
/Applications/NativeProcessTestHTML.app/Contents/Resources/echo.pl
になっていました。
AIRから、
 
/usr/bin/perl /Applications/NativeProcessTestHTML.app/Contents/Resources/echo.pl
で呼ばれるようにすれば良いことがわかります。
 
var nativeProcessStartupInfo = new air.NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = new air.File( "/usr/bin/perl");    
var processArgs = new air.Vector["<String>"]();
processArgs.push(air.File.applicationDirectory.nativePath + "/echo.pl");
nativeProcessStartupInfo.arguments = processArgs;
process = new air.NativeProcess();
process.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(air.ProgressEvent.STANDARD_INPUT_PROGRESS, inputProgressListener);
process.start(nativeProcessStartupInfo);
3. アプリを書き出す
NativeProcessを利用するには、
 
extendedDesktop
の設定が必要になります。
パッケージを作成します。
先程作成した echo.pl もパッケージに含める為に引数にいれます。
 
$adt -package -storetype pkcs12 -keystore myCert.p12 -target native NativeProcessTest.dmg application.xml index.html AIRAliases.js sample_styles.css icons echo.pl

以下の写真のように実行されました。 air2_ajax_NativeProcess_perl
文字を受け取ると以下が呼び出され、
もう一度launchEchoTest()が実行され perlを起動しAnyEventで入力待ちで待機します。
 
function onOutputData(event){
    var date = new Date();
    var bytes = process.standardOutput;
    var textReceived = document.getElementById("textReceived");
    textReceived.value = bytes.readUTFBytes(bytes.bytesAvailable);
    var dateStamp = document.getElementById("dateStamp");
    dateStamp.innerHTML = date.toString();
    launchEchoTest();
}
CPANのモジュールに依存しているものは、
配布するバイナリーから呼び出すのは注意が必要かもしれません。

追記
書いている途中で気がついたのですが
#!/usr/bin/perlが働いて
 
nativeProcessStartupInfo.executable = new air.File(air.File.applicationDirectory.nativePath + "/echo.pl");    
でも動きました。
vectorで引数を指定するのは別な事に使えそうなので
そのまま記載しておきます。