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.applications">Launching applications</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="#Configuration.of.the.launcher">Configuration of the launcher</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 what we intend to do. It may happen that our
64 current implementation and the content of this document differ.</p>
66 <p>In case of differences, it is assumed that this document is right
67 and the implementation is wrong.</p>
69 <a name="Introduction"></a>
72 <p>The daemon <strong>afm-user-daemon</strong> is in charge of handling
73 applications for one user. Its main tasks are:</p>
76 <li><p>enumerate the applications that the user can run
77 and keep the list avalable on demand</p></li>
78 <li><p>start applications for the user, set their running
79 environment, set their security context</p></li>
80 <li><p>list the current runner applications</p></li>
81 <li><p>stop (aka pause), continue (aka resume), terminate
82 the running instance of application</p></li>
83 <li><p>transfer requests for installation or uninstallation
84 of applications to the dedicated system daemon
85 <strong>afm-system-daemon</strong></p></li>
89 <p>The <strong>afm-user-daemon</strong> takes its orders from the session
90 instance of D-Bus.</p>
92 <p>The figure below summarizes the situation of the
93 <strong>afm-user-daemon</strong> in the system.</p>
95 <pre><code>+------------------------------------------------------------+
97 | +---------------------+ |
98 | +---------------------+ | Smack isolated | |
99 | | D-Bus session + | APPLICATIONS | |
100 | +----------+----------+ +---------+-----------+ |
103 | +----------+--------------------------+-----------+ |
105 | | afm-user-daemon | |
107 | +----------+----------------------+----------+----+ |
110 :================|======================|==========:=========:
112 | +----------+----------+ +-----+-----+ : |
113 | | D-Bus system +-----+ CYNARA | : |
114 | +----------+----------+ +-----+-----+ : |
116 | +----------+---------+ +-------+----------+----+ |
117 | | afm-system-daemon +----+ SECURITY-MANAGER | |
118 | +--------------------+ +-----------------------+ |
121 +------------------------------------------------------------+
124 <a name="Tasks.of..strong.afm-user-daemon..strong."></a>
125 <h2>Tasks of <strong>afm-user-daemon</strong></h2>
127 <a name="Maintaining.list.of.applications"></a>
128 <h3>Maintaining list of applications</h3>
130 <p>At start <strong>afm-user-daemon</strong> scans the directories containing
131 the applications and load in memory the list applications
132 availables to the current user.</p>
134 <p>When <strong>afm-system-daemon</strong> installs or removes an application,
135 it sends the signal <em>org.AGL.afm.system.changed</em> on success.
136 If it receives that signal, <strong>afm-user-daemon</strong> rebuild its
137 list of applications.</p>
139 <p><strong>afm-user-daemon</strong> provides the data that it collected about
140 application to its clients that either want to get that list
141 or to get information about one application.</p>
143 <a name="Launching.applications"></a>
144 <h3>Launching applications</h3>
146 <p><strong>afm-user-daemon</strong> launchs the applications. This means
147 that its builds a secure environment for the application
148 and then start it inside that secured environment.</p>
150 <p>Applications of different kind can be launched.</p>
152 <p>This is set using a configuration file that describes
153 how to launch an application of a given kind for a given
156 <p>There is two launching modes: local or remote.</p>
158 <p>Launching an application locally means that
159 the application and its binder are launcher together.</p>
161 <p>Launching application remotely means that only the
162 binder is launched for the application.</p>
164 <p>Once launched, running instances of application receive
165 a runid that identify them.</p>
167 <a name="Managing.instances.of.running.applications"></a>
168 <h3>Managing instances of running applications</h3>
170 <p><strong>afm-user-daemon</strong> manages the list of applications
171 that it launched.</p>
173 <p>With the good permissions, a client can get the list
174 of the running instances and details about a specific
175 running instance. It can also terminate, stop or
176 continue a given application.</p>
178 <a name="Installing.and.uninstalling.applications"></a>
179 <h3>Installing and uninstalling applications</h3>
181 <p>If the client has the good permission,
182 <strong>afm-user-daemon</strong> delegates that task
183 to <strong>afm-system-daemon</strong>.</p>
185 <a name="Starting..strong.afm-user-daemon..strong."></a>
186 <h2>Starting <strong>afm-user-daemon</strong></h2>
188 <p><strong>afm-user-daemon</strong> is launched as a <strong>systemd</strong> service
189 attached to user sessions. Normally, the service file is
190 located at /usr/lib/systemd/user/afm-user-daemon.service.</p>
192 <p>The options for launching <strong>afm-user-daemon</strong> are:</p>
195 --application directory
197 Includes the given application directory to
198 the database base of applications.
205 Includes the root application directory to
206 the database base of applications.
208 Note that the default root directory for
209 applications is always added. It is defined
210 to be /usr/share/afm/applications (may change).
215 --mode (local|remote)
217 Set the default launch mode.
218 The default value is 'local'
223 Daemonizes the process. It is not needed by sytemd.
228 Reduces the verbosity (can be repeated).
233 Increases the verbosity (can be repeated).
241 <a name="Configuration.of.the.launcher"></a>
242 <h2>Configuration of the launcher</h2>
244 <p>It contains rules for launching applications.
245 When <strong>afm-user-daemon</strong> need to launch an application,
246 it looks to the mode of launch, local or remote, and the
247 type of the application as given by the file <strong><em>config.xml</em></strong>
250 <p>This couple mode and type allows to select the rule.</p>
252 <p>The configuration file is <strong>/etc/afm/afm-launch.conf</strong>.</p>
254 <p>It contains sections and rules. It can also contain comments
255 and empty lines to improve the readability.</p>
257 <p>The separators are space and tabulation, any other character
258 is meaning something.</p>
260 <p>The format is line oriented.
261 The new line character separate the lines.</p>
263 <p>Lines having only separators are blank lines and are skipped.
264 Line having the character # (sharp) as first not separator character
265 are comment lines and are ignored.</p>
267 <p>Lines starting with a not separator character are differents
268 of lines starting with a separator character.</p>
270 <p>The grammar of the configuration file is defined below:</p>
272 <pre><code>CONF: *COMMENT *SECTION
276 RULE: +TYPE VECTOR ?VECTOR
278 MODE: 'mode' +SEP ('local' | 'remote') *SEP EOL
282 VECTOR: +SEP DATA *(+SEP NDATA) *SEP EOL
288 COMMENT: *SEP CMT *(SEP | NCHAR) NL
293 CHAR: '\x00'..'\x08' | '\x0b'..'\x1f' | '\x21' | '\x22' | '\x24'..'\xff'
297 <p>Here is a sample of configuration file for defining how
298 to launch an application declared of types <em>application/x-executable</em>,
299 <em>text/x-shellscript</em> and <em>text/html</em> in mode local:</p>
301 <pre><code>mode local
303 application/x-executable
308 /usr/bin/afb-daemon --mode=local --readyfd=%R --alias=/icons:%I --port=%P --rootdir=%r --token=%S --sessiondir=%D/.afb-daemon
309 /usr/bin/web-runtime http://localhost:%P/%c?token=%S
312 <p>This shows that:</p>
315 <li>within a section, several rules can be defined</li>
316 <li>within a rule, several types can be defined</li>
317 <li>within a rule, one or two vectors can be defined</li>
318 <li>vectors are using %substitution</li>
319 <li>launched binaries must be defined with their full path</li>
323 <a name="mode.local"></a>
326 <p>Within this mode, the launchers have either one or two vectors
327 describing them. All of these vectors are treated as programs
328 and are executed with the system call ‘execve’.</p>
330 <p>The first vector is the leader vector and it defines the process
331 group. The second vector (if any) is attached to the group
332 defined by this first vector.</p>
334 <a name="mode.remote"></a>
337 <p>Within this mode, the launchers have either one or two vectors
340 <p>The first vector is treated as a program and is executed with
341 the system call ‘execve’.</p>
343 <p>The second vector (if any) defines a text that is returned
344 to the caller. This mechanism can be used to return the uri
345 to connect to for executing the application remotely.</p>
347 <p>The daemon <strong><em>afm-user-daemon</em></strong> allocates a port for the
348 running the application remotely.
349 The current implmentation of the port allocation is just
351 A more reliable (cacheable and same-originable) allocation
352 is to be defined.</p>
354 <a name="L.substitutions"></a>
355 <h3>%substitutions</h3>
357 <p>Vectors can include sequences of 2 characters that have a special
358 meaning. These sequences are named <em>%substitution</em> because their
359 first character is the percent sign (%) and because each occurrence
360 of the sequence is replaced, at launch time, by the value associated
363 <p>Here is the list of <em>%substitutions</em>:</p>
366 <li><p><strong><em>%%</em></strong>: %.</p>
368 <p>This simply emits the percent sign %</p></li>
369 <li><p><strong><em>%a</em></strong>: appid</p>
371 <p>This is the application Id of the launched application.</p>
373 <p>Defined by the attribute <strong>id</strong> of the element <strong><widget></strong>
374 of <strong>config.xml</strong>.</p></li>
375 <li><p><strong><em>%c</em></strong>: content</p>
377 <p>The file within the widget directory that is the entry point.</p>
379 <p>For a HTML application, it is the relative path to the main
380 page (aka index.html).</p>
382 <p>Defined by the attribute <strong>src</strong> of the element <strong><content></strong>
383 of <strong>config.xml</strong>.</p></li>
384 <li><p><strong><em>%D</em></strong>: datadir</p>
386 <p>Path of the directory where the application runs (cwd)
387 and stores its data.</p>
389 <p>It is equal to %h/%a.</p></li>
390 <li><p><strong><em>%H</em></strong>: height</p>
392 <p>Requested height for the widget.</p>
394 <p>Defined by the attribute <strong>height</strong> of the element <strong><widget></strong>
395 of <strong>config.xml</strong>.</p></li>
396 <li><p><strong><em>%h</em></strong>: homedir</p>
398 <p>Path of the home directory for all applications.</p>
400 <p>It is generally equal to $HOME/app-data</p></li>
401 <li><p><strong><em>%I</em></strong>: icondir</p>
403 <p>Path of the directory were the icons of the applications can be found.</p></li>
404 <li><p><strong><em>%m</em></strong>: mime-type</p>
406 <p>Mime type of the launched application.</p>
408 <p>Defined by the attribute <strong>type</strong> of the element <strong><content></strong>
409 of <strong>config.xml</strong>.</p></li>
410 <li><p><strong><em>%n</em></strong>: name</p>
412 <p>Name of the application as defined by the content of the
413 element <strong><name></strong> of <strong>config.xml</strong>.</p></li>
414 <li><p><strong><em>%p</em></strong>: plugins</p>
416 <p>Unhandled until now.</p>
418 <p>Will be the colon separated list of plugins and plugins directory.</p></li>
419 <li><p><strong><em>%P</em></strong>: port</p>
421 <p>A port to use. It is currently a kind of random port. The precise
422 model is to be defined later.</p></li>
423 <li><p><strong><em>%R</em></strong>: readyfd</p>
425 <p>Number of the file descriptor to use for signalling
426 readyness of the launched process.</p></li>
427 <li><p><strong><em>%r</em></strong>: rootdir</p>
429 <p>Path of the directory containing the widget and its data.</p></li>
430 <li><p><strong><em>%S</em></strong>: secret</p>
432 <p>An hexadecimal number that can be used to pair the client
433 with its server binder.</p></li>
434 <li><p><strong><em>%W</em></strong>: width</p>
436 <p>Requested width for the widget.</p>
438 <p>Defined by the attribute <strong>width</strong> of the element <strong><widget></strong>
439 of <strong>config.xml</strong>.</p></li>
443 <a name="The.D-Bus.interface"></a>
444 <h2>The D-Bus interface</h2>
446 <a name="Overview.of.the.dbus.interface"></a>
447 <h3>Overview of the dbus interface</h3>
449 <p><strong><em>afm-user-daemon</em></strong> takes its orders from the session instance
450 of D-Bus. The use of D-Bus is great because it allows to implement
451 discovery and signaling.</p>
453 <p>The dbus of the session is by default adressed by the environment
454 variable <strong><em>DBUS_SESSION_BUS_ADDRESS</em></strong>. Using <strong>systemd</strong>
455 the variable <em>DBUS_SESSION_BUS_ADDRESS</em> is automatically set for
458 <p>The <strong>afm-user-daemon</strong> is listening with the destination name
459 <strong><em>org.AGL.afm.user</em></strong> at the object of path <strong><em>/org/AGL/afm/user</em></strong>
460 on the interface <strong><em>org.AGL.afm.user</em></strong> for the below detailed
461 members <strong><em>runnables</em></strong>, <strong><em>detail</em></strong>, <strong><em>start</em></strong>, <strong><em>terminate</em></strong>,
462 <strong><em>stop</em></strong>, <strong><em>continue</em></strong>, <strong><em>runners</em></strong>, <strong><em>state</em></strong>,
463 <strong><em>install</em></strong> and <strong><em>uninstall</em></strong>.</p>
465 <p>D-Bus is mainly used for signaling and discovery. Its optimized
466 typed protocol is not used except for transmitting only one string
467 in both directions.</p>
469 <p>The client and the service are using JSON serialisation to
472 <p>The D-Bus interface is defined by:</p>
475 <li><p>DESTINATION: <strong>org.AGL.afm.user</strong></p></li>
476 <li><p>PATH: <strong>/org/AGL/afm/user</strong></p></li>
477 <li><p>INTERFACE: <strong>org.AGL.afm.user</strong></p></li>
481 <p>The signature of any member of the interface is <strong><em>string -> string</em></strong>
482 for <strong><em>JSON -> JSON</em></strong>.</p>
484 <p>This is the normal case. In case of error, the current implmentation
485 returns a dbus error that is a string.</p>
487 <p>Here is an example that use <em>dbus-send</em> to query data on
488 installed applications.</p>
490 <pre><code>dbus-send --session --print-reply \
491 --dest=org.AGL.afm.user \
493 org.AGL.afm.user.runnables string:true
496 <a name="Using..strong..em.afm-util..em...strong."></a>
497 <h3>Using <strong><em>afm-util</em></strong></h3>
499 <p>The command line tool <strong><em>afm-util</em></strong> uses dbus-send to send
500 orders to <strong>afm-user-daemon</strong>. This small scripts allows to
501 send command to <strong><em>afm-user-daemon</em></strong> either interactively
502 at shell prompt or scriptically.</p>
504 <p>The syntax is simple: it accept a command and if the command
505 requires it, the argument to the command.</p>
507 <p>Here is the summary of <strong><em>afm-util</em></strong>:</p>
510 <li><p><strong>afm-util runnables </strong>:</p>
512 <p>list the runnable widgets installed</p></li>
513 <li><p><strong>afm-util install wgt </strong>:</p>
515 <p>install the wgt file</p></li>
516 <li><p><strong>afm-util uninstall id </strong>:</p>
518 <p>remove the installed widget of id</p></li>
519 <li><p><strong>afm-util detail id </strong>:</p>
521 <p>print detail about the installed widget of id</p></li>
522 <li><p><strong>afm-util runners </strong>:</p>
524 <p>list the running instance</p></li>
525 <li><p><strong>afm-util start id </strong>:</p>
527 <p>start an instance of the widget of id</p></li>
528 <li><p><strong>afm-util terminate rid </strong>:</p>
530 <p>terminate the running instance rid</p></li>
531 <li><p><strong>afm-util stop rid </strong>:</p>
533 <p>stop the running instance rid</p></li>
534 <li><p><strong>afm-util continue rid </strong>:</p>
536 <p>continue the previously rid</p></li>
537 <li><p><strong>afm-util state rid </strong>:</p>
539 <p>get status of the running instance rid</p></li>
543 <p>Here is how to list applications using <strong><em>afm-util</em></strong>:</p>
545 <pre><code>afm-util runnables
550 <a name="The.protocol.over.D-Bus"></a>
551 <h3>The protocol over D-Bus</h3>
556 <li><p><strong>DESTINATION</strong>: org.AGL.afm.user</p></li>
557 <li><p><strong>PATH</strong>: /org/AGL/afm/user</p></li>
558 <li><p><strong>INTERFACE</strong>: org.AGL.afm.user</p></li>
564 <a name="Method.org.AGL.afm.user.detail"></a>
565 <h4>Method org.AGL.afm.user.detail</h4>
567 <p><strong>Description</strong>: Get details about an application from its id.</p>
569 <p><strong>Input</strong>: the id of the application as below.</p>
571 <p>Either just a string:</p>
573 <pre><code>"appli@x.y"
576 <p>Or an object having the field “id” of type string:</p>
578 <pre><code>{"id":"appli@x.y"}
581 <p><strong>Output</strong>: A JSON object describing the application containing
582 the fields described below.</p>
585 "id": string, the application id (id@version)
586 "version": string, the version of the application
587 "width": integer, requested width of the application
588 "height": integer, resqueted height of the application
589 "name": string, the name of the application
590 "description": string, the description of the application
591 "shortname": string, the short name of the application
592 "author": string, the author of the application
598 <a name="Method.org.AGL.afm.user.runnables"></a>
599 <h4>Method org.AGL.afm.user.runnables</h4>
601 <p><strong>Description</strong>: Get the list of applications that can be run.</p>
603 <p><strong>Input</strong>: any valid json entry, can be anything except null.</p>
605 <p><strong>output</strong>: An array of description of the runnable applications.
606 Each item of the array contains an object containing the detail of
607 an application as described above for the method
608 <em>org.AGL.afm.user.detail</em>.</p>
612 <a name="Method.org.AGL.afm.user.install"></a>
613 <h4>Method org.AGL.afm.user.install</h4>
615 <p><strong>Description</strong>: Install an application from its widget file.</p>
617 <p>If an application of the same <em>id</em> and <em>version</em> exists, it is not
618 reinstalled except if <em>force=true</em>.</p>
620 <p>Applications are installed in the subdirectories of the common directory
622 If <em>root</em> is specified, the application is installed under the
623 sub-directories of the <em>root</em> defined.</p>
625 <p>Note that this methods is a simple accessor to the method
626 <strong><em>org.AGL.afm.system.install</em></strong> of <strong><em>afm-system-daemon</em></strong>.</p>
628 <p>After the installation and before returning to the sender,
629 <strong><em>afm-user-daemon</em></strong> sends the signal <strong><em>org.AGL.afm.user.changed</em></strong>.</p>
631 <p><strong>Input</strong>: The <em>path</em> of the widget file to install and, optionaly,
632 a flag to <em>force</em> reinstallation, and, optionaly, a <em>root</em> directory.</p>
634 <p>Either just a string being the absolute path of the widget file:</p>
636 <pre><code>"/a/path/driving/to/the/widget"
642 "wgt": "/a/path/to/the/widget",
644 "root": "/a/path/to/the/root"
648 <p>“wgt” and “root” must be absolute paths.</p>
650 <p><strong>output</strong>: An object with the field “added” being the string for
651 the id of the added application.</p>
653 <pre><code>{"added":"appli@x.y"}
658 <a name="Method.org.AGL.afm.user.uninstall"></a>
659 <h4>Method org.AGL.afm.user.uninstall</h4>
661 <p><strong>Description</strong>: Uninstall an application from its id.</p>
663 <p>Note that this methods is a simple accessor to the method
664 <strong><em>org.AGL.afm.system.uninstall</em></strong> of <strong><em>afm-system-daemon</em></strong>.</p>
666 <p>After the uninstallation and before returning to the sender,
667 <strong><em>afm-user-daemon</em></strong> sends the signal <strong><em>org.AGL.afm.user.changed</em></strong>.</p>
669 <p><strong>Input</strong>: the <em>id</em> of the application and, otpionaly, the path to
670 <em>root</em> of the application.</p>
672 <p>Either a string:</p>
674 <pre><code>"appli@x.y"
681 "root": "/a/path/to/the/root"
685 <p><strong>output</strong>: the value ‘true’.</p>
689 <a name="Method.org.AGL.afm.user.start"></a>
690 <h4>Method org.AGL.afm.user.start</h4>
692 <p><strong>Description</strong>:</p>
694 <p><strong>Input</strong>: the <em>id</em> of the application and, optionaly, the
695 start <em>mode</em> as below.</p>
697 <p>Either just a string:</p>
699 <pre><code>"appli@x.y"
702 <p>Or an object having the field “id” of type string and
703 optionaly a field mode:</p>
705 <pre><code>{"id":"appli@x.y","mode":"local"}
708 <p>The field “mode” as a string value being either “local” or “remote”.</p>
710 <p><strong>output</strong>: The <em>runid</em> of the application launched.
711 The runid is an integer.</p>
715 <a name="Method.org.AGL.afm.user.terminate"></a>
716 <h4>Method org.AGL.afm.user.terminate</h4>
718 <p><strong>Description</strong>: Terminates the application of <em>runid</em>.</p>
720 <p><strong>Input</strong>: The <em>runid</em> (an integer) of the running instance to terminate.</p>
722 <p><strong>output</strong>: the value ‘true’.</p>
726 <a name="Method.org.AGL.afm.user.stop"></a>
727 <h4>Method org.AGL.afm.user.stop</h4>
729 <p><strong>Description</strong>: Stops the application of <em>runid</em> until terminate or continue.</p>
731 <p><strong>Input</strong>: The <em>runid</em> (an integer) of the running instance to stop.</p>
733 <p><strong>output</strong>: the value ‘true’.</p>
737 <a name="Method.org.AGL.afm.user.continue"></a>
738 <h4>Method org.AGL.afm.user.continue</h4>
740 <p><strong>Description</strong>: Continues the application of <em>runid</em> previously stopped.</p>
742 <p><strong>Input</strong>: The <em>runid</em> (an integer) of the running instance to continue.</p>
744 <p><strong>output</strong>: the value ‘true’.</p>
748 <a name="Method.org.AGL.afm.user.state"></a>
749 <h4>Method org.AGL.afm.user.state</h4>
751 <p><strong>Description</strong>: Get informations about a running instance of <em>runid</em>.</p>
753 <p><strong>Input</strong>: The <em>runid</em> (an integer) of the running instance inspected.</p>
755 <p><strong>output</strong>: An object describing the state of the instance. It contains:
756 the runid (an integer), the id of the running application (a string),
757 the state of the application (a string being either “starting”, “running”
758 or “stopped”).</p>
760 <p>Example of returned state:</p>
771 <a name="Method.org.AGL.afm.user.runners"></a>
772 <h4>Method org.AGL.afm.user.runners</h4>
774 <p><strong>Description</strong>: Get the list of the currently running instances.</p>
776 <p><strong>Input</strong>: anything.</p>
778 <p><strong>output</strong>: An array of states, one per running instance, as returned by
779 the methodd <strong><em>org.AGL.afm.user.state</em></strong>.</p>