aboutsummaryrefslogtreecommitdiff
path: root/files/ja/archive/mozilla/xulrunner/commandline/index.html
blob: c89e7ab56a9d0affefe077c2ba3279102225ce06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
---
title: CommandLine
slug: Archive/Mozilla/XULRunner/CommandLine
tags:
  - XUL
  - XULRunner
translation_of: Archive/Mozilla/XULRunner/CommandLine
---
<h2 id="Handling_command_line_arguments_with_XULRunner" name="Handling_command_line_arguments_with_XULRunner"> Handling command line arguments with XULRunner </h2>
<h3 id="For_Multiple_Instances_Application" name="For_Multiple_Instances_Application"> For Multiple Instances Application </h3>
<p>XULRunner でアプリケーション固有のコマンドライン引数を取得するのは、一つのインスタンスしか持たないアプリケーションでなければとても簡単です。 <a href="ja/NsICommandLine">nsICommandLine</a> オブジェクトが起動したwindowの引数を最初に渡してくれます:
</p>
<h4 id="Example" name="Example"> Example </h4>
<pre>var cmdLine = window.arguments[0];
cmdLine = cmdLine.QueryInterface(Components.interfaces.nsICommandLine);
alert(cmdLine.handleFlagWithParam("test", false));
</pre>
<h3 id="For_Single_Instance_Application" name="For_Single_Instance_Application"> For Single Instance Application </h3>
<p>もちろん、一つのインスタンスしか持たないアプリケーション (詳細は<a href="ja/Toolkit.singletonWindowType">toolkit.singletonWindowType</a> をご覧ください)でも、先ほど示したサンプルはアプリケーションの最初の起動時のみ有効です。しかしながら、もし最後のコマンドライン引数を取得したい(例えばファイルを開くなど)のであれば、それを可能とする解決方法はあなた用の<a href="ja/Chrome/Command_Line">command line handler</a> を作る事です。
</p><p>単純なソリューションとしては、<a href="ja/NsIObserverService">observer service</a> を新たな引数が存在する事を通知するオブザーバとする事です。このソリューションを実装する似た方法もしくはよりよい方法としては、特定のハンドラのレジスタかアンレジスタする関数をコマンドラインハンドラサービスとして定義する事です。このアプローチは <a class="external" href="http://publicsvn.songbirdnest.com/browser/trunk/components/commandline/src/sbCommandLine.js">Songbird</a> で利用されています。
</p>
<h4 id="Example_2" name="Example_2"> Example </h4>
<p>Command Line Handler Component を定義します: <b>components/clh.js</b>
</p>
<pre>const nsISupports              = Components.interfaces.nsISupports;

const nsICategoryManager       = Components.interfaces.nsICategoryManager;
const nsIComponentRegistrar    = Components.interfaces.nsIComponentRegistrar;
const nsICommandLine           = Components.interfaces.nsICommandLine;
const nsICommandLineHandler    = Components.interfaces.nsICommandLineHandler;
const nsIFactory               = Components.interfaces.nsIFactory;
const nsIModule                = Components.interfaces.nsIModule;

const CLASS_ID = Components.ID("178cfbb6-503c-11dc-8314-0800200c9a66");
const CLASS_NAME = "ApplicationNameCLH";
const CONTRACT_ID = "@example.com/applicationname/clh;1";
const CLD_CATEGORY = "m-applicationname";

var appHandler = {
  /* nsISupports */
  QueryInterface : function clh_QI(aIID)
  {
    if (aIID.equals(nsICommandLineHandler) ||
        aIID.equals(nsIFactory) ||
        aIID.equals(nsISupports))
      return this;

    throw Components.results.NS_ERROR_NO_INTERFACE;
  },

  /* nsICommandLineHandler */
  handle : function clh_handle(aCmdLine)
  {
    var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                    .getService(Components.interfaces.nsIObserverService);
    observerService.notifyObservers(aCmdLine, "commandline-args-changed", null);
  },

  helpInfo : "  -test &lt;value&gt;        A test attribute\n",

  /* nsIFactory */
  createInstance : function mdh_CI(aOuter, aIID)
  {
    if (aOuter != null) {
      throw Components.results.NS_ERROR_NO_AGGREGATION;
    }

    return this.QueryInterface(aIID);
  },

  lockFactory : function mdh_lock(aLock)
  {
    /* no-op */
  }
};

var appHandlerModule = {
  /* nsISupports */
  QueryInterface : function mod_QI(aIID)
  {
    if (aIID.equals(nsIModule) ||
        aIID.equals(nsISupports))
      return this;

    throw Components.results.NS_ERROR_NO_INTERFACE;
  },

  /* nsIModule */
  getClassObject : function mod_gch(aCompMgr, aCID, aIID)
  {
    if (aCID.equals(CLASS_ID))
      return appHandler.QueryInterface(aIID);

    throw components.results.NS_ERROR_FAILURE;
  },

  registerSelf : function mod_regself(aCompMgr, aFileSpec, aLocation, aType)
  {
    var compReg = aCompMgr.QueryInterface(nsIComponentRegistrar);

    compReg.registerFactoryLocation(CLASS_ID, CLASS_NAME, CONTRACT_ID,
                                    aFileSpec, aLocation, aType);

    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
                           .getService(nsICategoryManager);
    catMan.addCategoryEntry("command-line-handler",
                            CLD_CATEGORY, CONTRACT_ID, true, true);
  },

  unregisterSelf : function mod_unreg(aCompMgr, aLocation, aType)
  {
    var compReg = aCompMgr.QueryInterface(nsIComponentRegistrar);
    compReg.unregisterFactoryLocation(CLASS_ID, aLocation);

    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
                           .getService(nsICategoryManager);
    catMan.deleteCategoryEntry("command-line-handler", CLD_CATEGORY);
  },

  canUnload : function (aCompMgr)
  {
    return true;
  }
};

function NSGetModule(aCompMgr, aFileSpec)
{
  return appHandlerModule;
}
</pre>
<p>引数が変更された時に通知を受け取るオブザーバを作ります: <b>chrome/content/cmdline.js</b>
</p>
<pre>function CommandLineObserver() {
  this.register();
}
CommandLineObserver.prototype = {
  observe: function(aSubject, aTopic, aData) {
     var cmdLine = aSubject.QueryInterface(Components.interfaces.nsICommandLine);
     var test = cmdLine.handleFlagWithParam("test", false);
     alert("test = " + test + ");
  },

  register: function() {
    var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                    .getService(Components.interfaces.nsIObserverService);
    observerService.addObserver(this, "commandline-args-changed", false);
  },

  unregister: function() {
    var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                    .getService(Components.interfaces.nsIObserverService);
    observerService.removeObserver(this, "commandline-args-changed");
  }
}

var observer = new CommandLineObserver();


// アプリケーションの初回起動時には CommandLineObserver がまだレジストされていないため、
// ここで通知のふりをしてあげます。
var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                 .getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(window.arguments[0], "commandline-args-changed", null);

addEventListener("unload", observer.unregister, false);
</pre>
<p>最後に、アプリケーションのWindowにオブザーバへの参照を追加します: <b>chrome/content/window.xul</b>
</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;?xml-stylesheet href="chrome://global/skin/" type="text/css"?&gt;

&lt;window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        id="main" title="&amp;window.title;" windowtype="xulmine"
        style="width: 300px; height: 350px;"
        persist="screenX screenY width height sizemode"&gt;
  &lt;script type="application/x-javascript" src="cmdline.js" /&gt;
  ...
&lt;/window&gt;
</pre>
<div class="originaldocinfo">
<h2 id="Original_Document_Information" name="Original_Document_Information"> Original Document Information </h2>
<ul><li> Author: <a class="external" href="http://legege.com">Georges-Etienne Legendre</a>
</li><li> Last Updated Date: August 21st, 2007
</li></ul>
</div>