Hatena::Groupmoz-addon

hogezilla RSSフィード

当ページに書かれているコードは、修正BSDライセンスのもと、再頒布して頂いて構いません。

 | 

2012-12-26

enigmailのipcモジュール subprocess.jsm が便利!

| 22:39 | はてなブックマーク - enigmailのipcモジュール subprocess.jsm が便利! - hogezilla

一応 XPConnect で nsIProcess を使用してプロセス実行することは可能だけれども、標準入力、標準出力、標準エラーを取るには、一度ファイルへ書きだしておいてリダイレクトとか、リダイレクトでファイルに書き出すようにしないといけなかった。

var args = ["<", "/tmp/stdin.txt", ">", "/tmp/stdout.txt"];
var exe = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
exe..initWithPath("/bin/cat");
var proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
proc.init(exe);
proc.runAync(args, args.length);

な感じ。

これが、

// test-resource は各自で登録したresource名を
Cu.import("resource://test-resource/subprocess.jsm");

subprocess.call({
  command: "/bin/cat",
  arguments: [],
  workdir: "/home/teramako",
  charset: "UTF-8",
  stdin: function (stdin) {
    stdin.write("data...");
    stdin.close();
  },
  stdout: function (data) {
    log(data);
  },
  stderr: function (data) {
    Cu.reportError(data);
  },
  done: function (result) {
    switch (result.exitCode) {
      case 0:
        // 正常終了
        break;
      default:
        // 異常終了
    }
  },
});

みたいに書けちゃう。stdout, stderrは非同期で取れるし、素晴らしい。

中身は、js-ctypes を使って Windows なら "kernel32.dll", Darwin なら "libc.dylib", linux なら "libc.so.6" を直接叩くみたいな感じ。

昔、enigmail は nsIIPCService ってやつを使って、stdout, stderr のリスナを登録する感じだったんだけど、これもプロセスが終了しないと結果が得られない代物だった。これが随分と進化したものだ。

追記

stdout, stderr から得られるデータは、charset指定のもので、nsIScriptableUnicodeConverter にかけられてしまう。純粋にバイナリデータを取りたい時は注意すべきかもしれない

トラックバック - http://moz-addon.g.hatena.ne.jp/teramako/20121226
 |