3 <link rel="stylesheet" type="text/css" href="doc.css">
7 <a name="The.afm-user-daemon"></a>
8 <h1>The afm-user-daemon</h1>
16 <li><a href="#The.afm-user-daemon">The afm-user-daemon</a>
18 <li><a href="#Foreword">Foreword</a></li>
19 <li><a href="#Introduction">Introduction</a></li>
20 <li><a href="#Tasks.of..strong.afm-user-daemon..strong.">Tasks of <strong>afm-user-daemon</strong></a>
22 <li><a href="#Maintaining.list.of.applications">Maintaining list of applications</a></li>
23 <li><a href="#Launching.application">Launching application</a></li>
24 <li><a href="#Managing.instances.of.running.applications">Managing instances of running applications</a></li>
25 <li><a href="#Installing.and.uninstalling.applications">Installing and uninstalling applications</a></li>
28 <li><a href="#Starting..strong.afm-user-daemon..strong.">Starting <strong>afm-user-daemon</strong></a></li>
29 <li><a href="#Launcher.Configuration.">Launcher Configuration </a>
31 <li><a href="#mode.local">mode local</a></li>
32 <li><a href="#mode.remote">mode remote</a></li>
33 <li><a href="#L.substitutions">%substitutions</a></li>
36 <li><a href="#The.D-Bus.interface">The D-Bus interface</a>
38 <li><a href="#Overview.of.the.dbus.interface">Overview of the dbus interface</a></li>
39 <li><a href="#Using..strong..em.afm-util..em...strong.">Using <strong><em>afm-util</em></strong></a></li>
40 <li><a href="#The.protocol.over.D-Bus">The protocol over D-Bus</a>
42 <li><a href="#Method.org.AGL.afm.user.detail">Method org.AGL.afm.user.detail</a></li>
43 <li><a href="#Method.org.AGL.afm.user.runnables">Method org.AGL.afm.user.runnables</a></li>
44 <li><a href="#Method.org.AGL.afm.user.install">Method org.AGL.afm.user.install</a></li>
45 <li><a href="#Method.org.AGL.afm.user.uninstall">Method org.AGL.afm.user.uninstall</a></li>
46 <li><a href="#Method.org.AGL.afm.user.start">Method org.AGL.afm.user.start</a></li>
47 <li><a href="#Method.org.AGL.afm.user.terminate">Method org.AGL.afm.user.terminate</a></li>
48 <li><a href="#Method.org.AGL.afm.user.stop">Method org.AGL.afm.user.stop</a></li>
49 <li><a href="#Method.org.AGL.afm.user.continue">Method org.AGL.afm.user.continue</a></li>
50 <li><a href="#Method.org.AGL.afm.user.state">Method org.AGL.afm.user.state</a></li>
51 <li><a href="#Method.org.AGL.afm.user.runners">Method org.AGL.afm.user.runners</a></li>
60 <a name="Foreword"></a>
63 <p>This document describes application framework user daemon fundamentals.
64 FCF (Fully Conform to Specification) implementation is still under development.
65 It may happen that current implementation somehow diverges with specifications.</p>
67 <a name="Introduction"></a>
70 <p>The daemon <strong>afm-user-daemon</strong> is in charge of handling
71 applications on behalf of a user. Its main tasks are:</p>
74 <li><p>enumerate applications that end user can run
75 and keep this list available on demand</p></li>
76 <li><p>start applications on behalf of end user, set user running
77 environment, set user security context</p></li>
78 <li><p>list current runnable or running applications</p></li>
79 <li><p>stop (aka pause), continue (aka resume), terminate
80 a running instance of a given application</p></li>
81 <li><p>transfer requests for installation/uninstallation
82 of applications to the corresponding system daemon
83 <strong>afm-system-daemon</strong></p></li>
87 <p>The <strong>afm-user-daemon</strong> takes its orders from the session
88 instance of D-Bus.</p>
90 <p>The figure below summarizes the situation of <strong>afm-user-daemon</strong> in the system.</p>
92 <pre><code>+------------------------------------------------------------+
94 | +---------------------+ |
95 | +---------------------+ | Smack isolated | |
96 | | D-Bus session + | APPLICATIONS | |
97 | +----------+----------+ +---------+-----------+ |
100 | +----------+--------------------------+-----------+ |
102 | | afm-user-daemon | |
104 | +----------+----------------------+----------+----+ |
107 :================|======================|==========:=========:
109 | +----------+----------+ +-----+-----+ : |
110 | | D-Bus system +-----+ CYNARA | : |
111 | +----------+----------+ +-----+-----+ : |
113 | +----------+---------+ +-------+----------+----+ |
114 | | afm-system-daemon +----+ SECURITY-MANAGER | |
115 | +--------------------+ +-----------------------+ |
118 +------------------------------------------------------------+
121 <a name="Tasks.of..strong.afm-user-daemon..strong."></a>
122 <h2>Tasks of <strong>afm-user-daemon</strong></h2>
124 <a name="Maintaining.list.of.applications"></a>
125 <h3>Maintaining list of applications</h3>
127 <p>At start <strong>afm-user-daemon</strong> scans the directories containing
128 applications and load in memory a list of avaliable applications
129 accessible by current user.</p>
131 <p>When <strong>afm-system-daemon</strong> installs or removes an application.
132 On success it sends the signal <em>org.AGL.afm.system.changed</em>.
133 When receiving such a signal, <strong>afm-user-daemon</strong> rebuilds its
134 applications list.</p>
136 <p><strong>afm-user-daemon</strong> provides the data it collects about
137 applications to its clients. Clients may either request the full list
138 of avaliable applications or a more specific information about a
139 given application.</p>
141 <a name="Launching.application"></a>
142 <h3>Launching application</h3>
144 <p><strong>afm-user-daemon</strong> launches application. Its builds a secure
145 environment for the application before starting it within a
146 secured environment.</p>
148 <p>Different kind of applications can be launched.</p>
150 <p>This is set using a configuration file that describes
151 how to launch an application of a given kind within a given
154 <p>There is two launching modes: local or remote.</p>
156 <p>Launching an application locally means that
157 the application and its binder are launched together.</p>
159 <p>Launching application remotely translates in only launching
160 the application binder. The UI by itself has to be activated
161 remotely by the requested (ie: HTML5 homescreen in a browser)</p>
163 <p>Once launched, running instances of application receive
164 a runid that identify them.</p>
166 <a name="Managing.instances.of.running.applications"></a>
167 <h3>Managing instances of running applications</h3>
169 <p><strong>afm-user-daemon</strong> manages the list of applications
170 that it launched.</p>
172 <p>When owning the right permissions, a client can get the list
173 of running instances and details about a specific
174 running instance. It can also terminates, stops or
175 continues a given application.</p>
177 <a name="Installing.and.uninstalling.applications"></a>
178 <h3>Installing and uninstalling applications</h3>
180 <p>If the client own the right permissions,
181 <strong>afm-user-daemon</strong> delegates that task
182 to <strong>afm-system-daemon</strong>.</p>
184 <a name="Starting..strong.afm-user-daemon..strong."></a>
185 <h2>Starting <strong>afm-user-daemon</strong></h2>
187 <p><strong>afm-user-daemon</strong> is launched as a <strong>systemd</strong> service
188 attached to user sessions. Normally, the service file is
189 located at /usr/lib/systemd/user/afm-user-daemon.service.</p>
191 <p>The options for launching <strong>afm-user-daemon</strong> are:</p>
194 --application directory
196 Includes the given application directory to
197 the database base of applications.
204 Includes root application directory or directories when
205 passing multiple rootdir to
206 applications database.
208 Note that default root directory for
209 applications is always added. In current version
210 /usr/share/afm/applications is used as default.
213 --mode (local|remote)
215 Set the default launch mode.
216 The default value is 'local'
221 Daemonizes the process. It is not needed by sytemd.
226 Reduces the verbosity (can be repeated).
231 Increases the verbosity (can be repeated).
239 <a name="Launcher.Configuration."></a>
240 <h2>Launcher Configuration </h2>
242 <p>It contains rules for launching applications.
243 When <strong>afm-user-daemon</strong> has to launch an application,
244 it looks for launch mode (local or remote), as well as
245 for the type of application describe in <strong><em>config.xml</em></strong>
246 widget configuration file.</p>
248 <p>This tuple mode+type allows to select the adequate rule.</p>
250 <p>Configuration file is <strong>/etc/afm/afm-launch.conf</strong>.</p>
252 <p>It contains sections and rules. It can also contain comments
253 and empty lines to improve readability.</p>
255 <p>The separators are space and tabulation, any other character
256 should have a meaning.</p>
258 <p>The format is line oriented.
259 The new line character separate the lines.</p>
261 <p>Lines having only separators are blank lines and ignored.
262 Line having character #(sharp) at first position are comment
263 lines and ignored.</p>
265 <p>Lines not starting with a separator are different
266 from lines starting with a separator character.</p>
268 <p>The grammar of the configuration file is defined below:</p>
270 <pre><code>CONF: *COMMENT *SECTION
274 RULE: +TYPE VECTOR ?VECTOR
276 MODE: 'mode' +SEP ('local' | 'remote') *SEP EOL
280 VECTOR: +SEP DATA *(+SEP NDATA) *SEP EOL
286 COMMENT: *SEP CMT *(SEP | NCHAR) NL
291 CHAR: '\x00'..'\x08' | '\x0b'..'\x1f' | '\x21' | '\x22' | '\x24'..'\xff'
295 <p>Here is a sample of configuration file for defining how
296 to launch an application of types <em>application/x-executable</em>,
297 <em>text/x-shellscript</em> and <em>text/html</em> in local mode:</p>
299 <pre><code>mode local
301 application/x-executable
306 /usr/bin/afb-daemon --mode=local --readyfd=%R --alias=/icons:%I --port=%P --rootdir=%r --token=%S --sessiondir=%D/.afb-daemon
307 /usr/bin/web-runtime http://localhost:%P/%c?token=%S
310 <p>This shows that:</p>
313 <li>within a section, several rules can be defined</li>
314 <li>within a rule, several types can be defined</li>
315 <li>within a rule, one or two vectors can be defined</li>
316 <li>vectors are using %substitution</li>
317 <li>launched binaries must be defined with their full path</li>
321 <a name="mode.local"></a>
324 <p>Within this mode, the launchers have either one or two description vectors.
325 All of those vectors are treated as programs
326 and are executed with ‘execve’ system call.</p>
328 <p>The first vector is the leader vector and it defines the process
329 group. The second vector (if any) is attached to the group
330 defined by this first vector.</p>
332 <a name="mode.remote"></a>
335 <p>Within this mode, the launchers have either one or two vectors
338 <p>The first vector is process as a program and is executed with
339 system call ‘execve’.</p>
341 <p>The second vector (if any) defines a text that is returned
342 to the caller. This mechanism can be used to return a uri
343 for remote UI to connect on the newly launched application.</p>
345 <p>The daemon <strong><em>afm-user-daemon</em></strong> allocates a port for each
346 new remote application.
347 The current implementation port allocation is incremental.
348 A smarter (cacheable and discoverable) allocation should be defined.</p>
350 <a name="L.substitutions"></a>
351 <h3>%substitutions</h3>
353 <p>Vectors can include sequences of 2 characters that have a special
354 meaning. These sequences are named <em>%substitution</em> because their
355 first character is the percent sign (%) and because each occurrence
356 of the sequence is replaced, at launch time, by the value associated
359 <p>Here is the list of <em>%substitutions</em>:</p>
362 <li><p><strong><em>%%</em></strong>: %.</p>
364 <p>This simply emits the percent sign %</p></li>
365 <li><p><strong><em>%a</em></strong>: appid</p>
367 <p>Holds application Id of launched application.</p>
369 <p>Defined by the attribute <strong>id</strong> of the element <strong><widget></strong>
370 of <strong>config.xml</strong>.</p></li>
371 <li><p><strong><em>%c</em></strong>: content</p>
373 <p>The file within the widget directory that is the entry point.</p>
375 <p>For HTML applications, it represents the relative path to main
376 page (aka index.html).</p>
378 <p>Defined by attribute <strong>src</strong> of the element <strong><content></strong> within <strong>config.xml</strong>.</p></li>
379 <li><p><strong><em>%D</em></strong>: datadir</p>
381 <p>Path of the directory where the application runs (cwd)
382 and stores its data.</p>
384 <p>It is equal to %h/%a.</p></li>
385 <li><p><strong><em>%H</em></strong>: height</p>
387 <p>Requested height for the widget.</p>
389 <p>Defined by the attribute <strong>height</strong> of the element <strong><widget></strong>
390 of <strong>config.xml</strong>.</p></li>
391 <li><p><strong><em>%h</em></strong>: homedir</p>
393 <p>Path of the home directory for all applications.</p>
395 <p>It is generally equal to $HOME/app-data</p></li>
396 <li><p><strong><em>%I</em></strong>: icondir</p>
398 <p>Path of the directory were the icons of the applications can be found.</p></li>
399 <li><p><strong><em>%m</em></strong>: mime-type</p>
401 <p>Mime type of the launched application.</p>
403 <p>Defined by the attribute <strong>type</strong> of the element <strong><content></strong>
404 of <strong>config.xml</strong>.</p></li>
405 <li><p><strong><em>%n</em></strong>: name</p>
407 <p>Name of the application as defined by the content of the
408 element <strong><name></strong> of <strong>config.xml</strong>.</p></li>
409 <li><p><strong><em>%p</em></strong>: plugins</p>
411 <p>In the future should represent the list of plugins and plugins directory separated by ‘,’.
412 Warning: not supported in current version.</p></li>
413 <li><p><strong><em>%P</em></strong>: port</p>
415 <p>A port to use. It is currently a kind of random port. The precise
416 model is to be defined later.</p></li>
417 <li><p><strong><em>%R</em></strong>: readyfd</p>
419 <p>Number of file descriptor to use for signaling
420 readiness of launched process.</p></li>
421 <li><p><strong><em>%r</em></strong>: rootdir</p>
423 <p>Path of directory containing the widget and its data.</p></li>
424 <li><p><strong><em>%S</em></strong>: secret</p>
426 <p>An hexadecimal number that can be used to initialize pairing of client
427 and application binder.</p></li>
428 <li><p><strong><em>%W</em></strong>: width</p>
430 <p>Requested width for the widget.</p>
432 <p>Defined by the attribute <strong>width</strong> of the element <strong><widget></strong>
433 of <strong>config.xml</strong>.</p></li>
437 <a name="The.D-Bus.interface"></a>
438 <h2>The D-Bus interface</h2>
440 <a name="Overview.of.the.dbus.interface"></a>
441 <h3>Overview of the dbus interface</h3>
443 <p><strong><em>afm-user-daemon</em></strong> takes its orders from the session instance
444 of D-Bus. D-Bus is nice to use in this context because it allows
445 discovery and signaling.</p>
447 <p>The dbus session is by default addressed by environment
448 variable <strong><em>DBUS_SESSION_BUS_ADDRESS</em></strong>. Using <strong>systemd</strong>
449 variable <em>DBUS_SESSION_BUS_ADDRESS</em> is automatically set for
452 <p>The <strong>afm-user-daemon</strong> is listening on destination name
453 <strong><em>org.AGL.afm.user</em></strong> at object path <strong><em>/org/AGL/afm/user</em></strong>
454 on interface <strong><em>org.AGL.afm.user</em></strong> for following members:
455 <strong><em>runnables</em></strong>, <strong><em>detail</em></strong>, <strong><em>start</em></strong>, <strong><em>terminate</em></strong>,
456 <strong><em>stop</em></strong>, <strong><em>continue</em></strong>, <strong><em>runners</em></strong>, <strong><em>state</em></strong>,
457 <strong><em>install</em></strong> and <strong><em>uninstall</em></strong>.</p>
459 <p>D-Bus is mainly used for signaling and discovery. Its optimized
460 typed protocol is not used except for transmission of standalone strings.</p>
462 <p>Clients and Services are using JSON serialisation to exchange data.</p>
464 <p>The D-Bus interface is defined by:</p>
467 <li><p>DESTINATION: <strong>org.AGL.afm.user</strong></p></li>
468 <li><p>PATH: <strong>/org/AGL/afm/user</strong></p></li>
469 <li><p>INTERFACE: <strong>org.AGL.afm.user</strong></p></li>
473 <p>The signature of any member of the interface is <strong><em>string -> string</em></strong>
474 for <strong><em>JSON -> JSON</em></strong>.</p>
476 <p>This is the normal case. In case of error, the current implementation
477 returns a dbus error as a string.</p>
479 <p>Here an example using <em>dbus-send</em> to query data on
480 installed applications.</p>
482 <pre><code>dbus-send --session --print-reply \
483 --dest=org.AGL.afm.user \
485 org.AGL.afm.user.runnables string:true
488 <a name="Using..strong..em.afm-util..em...strong."></a>
489 <h3>Using <strong><em>afm-util</em></strong></h3>
491 <p>The command line tool <strong><em>afm-util</em></strong> uses dbus-send to send
492 orders to <strong>afm-user-daemon</strong>. This small scripts allows to
493 send command to <strong><em>afm-user-daemon</em></strong> either interactively
494 at shell prompt or scriptically.</p>
496 <p>The syntax is simple: it accept a command and when requires attached arguments.</p>
498 <p>Here is the summary of <strong><em>afm-util</em></strong>:</p>
501 <li><p><strong>afm-util runnables </strong>:</p>
503 <p>list the runnable widgets installed</p></li>
504 <li><p><strong>afm-util install wgt </strong>:</p>
506 <p>install the wgt file</p></li>
507 <li><p><strong>afm-util uninstall id </strong>:</p>
509 <p>remove the installed widget of id</p></li>
510 <li><p><strong>afm-util detail id </strong>:</p>
512 <p>print detail about the installed widget of id</p></li>
513 <li><p><strong>afm-util runners </strong>:</p>
515 <p>list the running instance</p></li>
516 <li><p><strong>afm-util start id </strong>:</p>
518 <p>start an instance of the widget of id</p></li>
519 <li><p><strong>afm-util terminate rid </strong>:</p>
521 <p>terminate the running instance rid</p></li>
522 <li><p><strong>afm-util stop rid </strong>:</p>
524 <p>stop the running instance rid</p></li>
525 <li><p><strong>afm-util continue rid </strong>:</p>
527 <p>continue the previously rid</p></li>
528 <li><p><strong>afm-util state rid </strong>:</p>
530 <p>get status of the running instance rid</p></li>
534 <p>Here is how to list applications using <strong><em>afm-util</em></strong>:</p>
536 <pre><code>afm-util runnables
541 <a name="The.protocol.over.D-Bus"></a>
542 <h3>The protocol over D-Bus</h3>
547 <li><p><strong>DESTINATION</strong>: org.AGL.afm.user</p></li>
548 <li><p><strong>PATH</strong>: /org/AGL/afm/user</p></li>
549 <li><p><strong>INTERFACE</strong>: org.AGL.afm.user</p></li>
555 <a name="Method.org.AGL.afm.user.detail"></a>
556 <h4>Method org.AGL.afm.user.detail</h4>
558 <p><strong>Description</strong>: Get details about an application from its id.</p>
560 <p><strong>Input</strong>: the id of the application as below.</p>
562 <p>Either just a string:</p>
564 <pre><code>"appli@x.y"
567 <p>Or an object having the field “id” of type string:</p>
569 <pre><code>{"id":"appli@x.y"}
572 <p><strong>Output</strong>: A JSON object describing the application containing
573 the fields described below.</p>
576 "id": string, the application id (id@version)
577 "version": string, the version of the application
578 "width": integer, requested width of the application
579 "height": integer, resqueted height of the application
580 "name": string, the name of the application
581 "description": string, the description of the application
582 "shortname": string, the short name of the application
583 "author": string, the author of the application
589 <a name="Method.org.AGL.afm.user.runnables"></a>
590 <h4>Method org.AGL.afm.user.runnables</h4>
592 <p><strong>Description</strong>: Get the list of applications that can be run.</p>
594 <p><strong>Input</strong>: any valid json entry, can be anything except null.</p>
596 <p><strong>output</strong>: An array of description of the runnable applications.
597 Each item of the array contains an object containing the detail of
598 an application as described above for the method
599 <em>org.AGL.afm.user.detail</em>.</p>
603 <a name="Method.org.AGL.afm.user.install"></a>
604 <h4>Method org.AGL.afm.user.install</h4>
606 <p><strong>Description</strong>: Install an application from its widget file.</p>
608 <p>If an application of the same <em>id</em> and <em>version</em> exists, it is not
609 reinstalled except when <em>force=true</em>.</p>
611 <p>Applications are installed in the subdirectories of the common directory
612 reserved for applications.
613 If <em>root</em> is specified, the application is installed under
614 sub-directories of defined <em>root</em>.</p>
616 <p>Note that this methods is a simple accessor to the method
617 <strong><em>org.AGL.afm.system.install</em></strong> of <strong><em>afm-system-daemon</em></strong>.</p>
619 <p>After the installation and before returning to the sender,
620 <strong><em>afm-user-daemon</em></strong> sends the signal <strong><em>org.AGL.afm.user.changed</em></strong>.</p>
622 <p><strong>Input</strong>: The <em>path</em> of widget file to be installed. Optionally,
623 a flag to <em>force</em> reinstallation and/or a <em>root</em> directory.</p>
625 <p>Simple form a simple string containing the absolute widget path:</p>
627 <pre><code>"/a/path/driving/to/the/widget"
633 "wgt": "/a/path/to/the/widget",
635 "root": "/a/path/to/the/root"
639 <p>“wgt” and “root” MUST be absolute paths.</p>
641 <p><strong>output</strong>: An object containing field “added” to use as application ID.</p>
643 <pre><code>{"added":"appli@x.y"}
648 <a name="Method.org.AGL.afm.user.uninstall"></a>
649 <h4>Method org.AGL.afm.user.uninstall</h4>
651 <p><strong>Description</strong>: Uninstall an application from its id.</p>
653 <p>Note that this methods is a simple accessor to
654 <strong><em>org.AGL.afm.system.uninstall</em></strong> method from <strong><em>afm-system-daemon</em></strong>.</p>
656 <p>After the uninstallation and before returning to the sender,
657 <strong><em>afm-user-daemon</em></strong> sends the signal <strong><em>org.AGL.afm.user.changed</em></strong>.</p>
659 <p><strong>Input</strong>: the <em>id</em> of the application and, optionally, the path to
660 application <em>root</em>.</p>
662 <p>Either a string:</p>
664 <pre><code>"appli@x.y"
671 "root": "/a/path/to/the/root"
675 <p><strong>output</strong>: the value ‘true’.</p>
679 <a name="Method.org.AGL.afm.user.start"></a>
680 <h4>Method org.AGL.afm.user.start</h4>
682 <p><strong>Description</strong>:</p>
684 <p><strong>Input</strong>: the <em>id</em> of the application and, optionally, the
685 start <em>mode</em> as below.</p>
687 <p>Either just a string:</p>
689 <pre><code>"appli@x.y"
692 <p>Or an object containing field “id” of type string and
693 optionally a field mode:</p>
695 <pre><code>{"id":"appli@x.y","mode":"local"}
698 <p>The field “mode” is a string equal to either “local” or “remote”.</p>
700 <p><strong>output</strong>: The <em>runid</em> of the application launched. <em>runid</em> is an integer.</p>
704 <a name="Method.org.AGL.afm.user.terminate"></a>
705 <h4>Method org.AGL.afm.user.terminate</h4>
707 <p><strong>Description</strong>: Terminates the application attached to <em>runid</em>.</p>
709 <p><strong>Input</strong>: The <em>runid</em> (an integer) of running instance to terminate.</p>
711 <p><strong>output</strong>: the value ‘true’.</p>
715 <a name="Method.org.AGL.afm.user.stop"></a>
716 <h4>Method org.AGL.afm.user.stop</h4>
718 <p><strong>Description</strong>: Stops the application attached to <em>runid</em> until terminate or continue.</p>
720 <p><strong>Input</strong>: The <em>runid</em> (integer) of the running instance to stop.</p>
722 <p><strong>output</strong>: the value ‘true’.</p>
726 <a name="Method.org.AGL.afm.user.continue"></a>
727 <h4>Method org.AGL.afm.user.continue</h4>
729 <p><strong>Description</strong>: Continues the application attached to <em>runid</em> previously stopped.</p>
731 <p><strong>Input</strong>: The <em>runid</em> (integer) of the running instance to continue.</p>
733 <p><strong>output</strong>: the value ‘true’.</p>
737 <a name="Method.org.AGL.afm.user.state"></a>
738 <h4>Method org.AGL.afm.user.state</h4>
740 <p><strong>Description</strong>: Get informations about a running instance of <em>runid</em>.</p>
742 <p><strong>Input</strong>: The <em>runid</em> (integer) of the running instance inspected.</p>
744 <p><strong>output</strong>: An object describing instance state. It contains:
745 the runid (integer), the id of the running application (string),
746 the state of the application (string either: “starting”, “running”, “stopped”).</p>
748 <p>Example of returned state:</p>
759 <a name="Method.org.AGL.afm.user.runners"></a>
760 <h4>Method org.AGL.afm.user.runners</h4>
762 <p><strong>Description</strong>: Get the list of currently running instances.</p>
764 <p><strong>Input</strong>: anything.</p>
766 <p><strong>output</strong>: An array of states, one per running instance, as returned by
767 the methodd <strong><em>org.AGL.afm.user.state</em></strong>.</p>