AppLauncher ver.0.3 〜 XPCOM を利用して外部アプリケーションを起動する 〜

Firefox拡張機能 (add-on の一種) を作ってみよう、ということで作り始めた AppLauncher。 前回は、コンテキストメニューに AppLaunhcer の項目を追加しました。

今回はいよいよ外部アプリケーションの起動を行うということをします。

AppLauncher ver.0.3 の作成

Firefox から外部アプリケーションを開く、という拡張機能 AppLauncher を作っていきます。

Ver.0.3 では、外部アプリケーションを起動する部分を実装します。 外部アプリケーションを開くなど、OS と関係してくる処理は XPCOM が担ってくれます。 JavaScript から XPCOM を利用するためには、XPConnect という技術を用います。

今回は外部アプリケーションを起動するわけですが、起動対象のアプリケーションは設定画面にパスを入力することで指定することにします。 ということで、まずは設定の取得 (これも XPCOM で行います)、その後外部アプリケーションの起動、という風にプログラムを書いていきます。

なお、現時点 (ver.0.2) でのファイル構成は以下のようになっています。

[applauncher-0.2.xpi]
+--[chrome.manifest]
+--[install.rdf]
+--[content]
+--[launcher.xul]
+--[launcher.js]
+--[prefs.xul]

設定の取得

まずは設定した値を取得します。 基本的に MDC の設定システムに関する文書 どおりです。

"content/launcher.js" ファイルに、以下の getPref 関数を新たに追加しました。

(省略)
/**
* Preference 情報を取得する関数 (設定の情報)
* @param prefString 取得するキー
*/
// cf.https://developer.mozilla.org/Ja/Code_snippets/Preferences
getPref: function( prefString ) {
var branchString = "extensions.applauncher.";
// 設定の情報を取得する XPCOM オブジェクトの生成
var prefSvc = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var prefBranch = prefSvc.getBranch(branchString);
// タイプ別に取得する関数を分ける
switch( prefBranch.getPrefType(prefString) ) {
// 設定値が文字の場合
case Components.interfaces.nsIPrefBranch.PREF_STRING:
return prefBranch.getCharPref(prefString);
break;
// 設定値が数値の場合
case Components.interfaces.nsIPrefBranch.PREF_INT:
return prefBranch.getIntPref(prefString);
break;
// 設定値が真偽値の場合
case Components.interfaces.nsIPrefBranch.PREF_BOOL:
return prefBranch.getBoolPref(prefString);
break;
}
},
(省略)

外部アプリケーションを起動する

次に、外部アプリケーションの起動を行います。 これも MDC の外部アプリケーションを起動する方法を書いた文書 どおりです。

"content/launcher.js" ファイルの launch 関数を以下のように変更しました。

(省略)
/**
* 外部アプリケーションを起動する関数
* 現在は、テスト用のアラートを表示するだけ.
*/
launch: function( evt ) {
try {
// 設定値の取得
var path = AppLauncher.getPref("path");
window.alert( "launching \"" + path + "\"..." );
// cf.https://developer.mozilla.org/ja/Code_snippets/Running_applications
// 実行可能ファイルに対する nsILocalFile を作成する
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(path);
if( ! file.exists() ) {
throw new Error("The File \"" + path + "\" doesn't exist!");
}
// nsIProcess を作成する
var process = Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(file);
// プロセスの起動
// 最初のパラメータが true なら、スレッドはプロセスが終わるまでブロックされる。
// 2 つ目と 3 つ目のパラメータは、プロセスのコマンドライン引数
// var args = ["argument1", "argument2"];
var args = []; // とりあえず今は引数なし
process.run(false, args, args.length);
} catch(e) {
window.alert("[EXCEPTION] An exception occured in \"AppLauncher\": \n" + e.message);
}
},
(省略)

これで、設定画面に記述したパスの外部ファイルが起動するようになりました。

展望

これで一応外部アプリケーションを起動できるようになったので、後はどのアプリケーションをどのような引数で起動するのか、といった設定をどのように記述するのか考えていきたいと思います。