diff --git a/apps/app_meetme.c b/apps/app_meetme.c index b7c4cc6f2976c879d4dbc3e931c681244087f9b5..e16b435b97b5fbe8d1b92c040bca4390965eb660 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -63,6 +63,365 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "enter.h" #include "leave.h" +/*** DOCUMENTATION + <application name="MeetMe" language="en_US"> + <synopsis> + MeetMe conference bridge. + </synopsis> + <syntax> + <parameter name="confno"> + <para>The conference number</para> + </parameter> + <parameter name="options"> + <optionlist> + <option name="a"> + <para>Set admin mode.</para> + </option> + <option name="A"> + <para>Set marked mode.</para> + </option> + <option name="b"> + <para>Run AGI script specified in <variable>MEETME_AGI_BACKGROUND</variable> + Default: <literal>conf-background.agi</literal>.</para> + <note><para>This does not work with non-DAHDI channels in the same + conference).</para></note> + </option> + <option name="c"> + <para>Announce user(s) count on joining a conference.</para> + </option> + <option name="C"> + <para>Continue in dialplan when kicked out of conference.</para> + </option> + <option name="d"> + <para>Dynamically add conference.</para> + </option> + <option name="D"> + <para>Dynamically add conference, prompting for a PIN.</para> + </option> + <option name="e"> + <para>Select an empty conference.</para> + </option> + <option name="E"> + <para>Select an empty pinless conference.</para> + </option> + <option name="F"> + <para>Pass DTMF through the conference.</para> + </option> + <option name="i"> + <para>Announce user join/leave with review.</para> + </option> + <option name="I"> + <para>Announce user join/leave without review.</para> + </option> + <option name="l"> + <para>Set listen only mode (Listen only, no talking).</para> + </option> + <option name="m"> + <para>Set initially muted.</para> + </option> + <option name="M" hasparams="optional"> + <para>Enable music on hold when the conference has a single caller. Optionally, + specify a musiconhold class to use. If one is not provided, it will use the + channel's currently set music class, or <literal>default</literal>.</para> + <argument name="class" required="true" /> + </option> + <option name="o"> + <para>Set talker optimization - treats talkers who aren't speaking as + being muted, meaning (a) No encode is done on transmission and (b) + Received audio that is not registered as talking is omitted causing no + buildup in background noise.</para> + </option> + <option name="p" hasparams="optional"> + <para>Allow user to exit the conference by pressing <literal>#</literal> (default) + or any of the defined keys. If keys contain <literal>*</literal> this will override + option <literal>s</literal>. The key used is set to channel variable + <variable>MEETME_EXIT_KEY</variable>.</para> + <argument name="keys" required="true" /> + </option> + <option name="P"> + <para>Always prompt for the pin even if it is specified.</para> + </option> + <option name="q"> + <para>Quiet mode (don't play enter/leave sounds).</para> + </option> + <option name="r"> + <para>Record conference (records as <variable>MEETME_RECORDINGFILE</variable> + using format <variable>MEETME_RECORDINGFORMAT</variable>. Default filename is + <literal>meetme-conf-rec-${CONFNO}-${UNIQUEID}</literal> and the default format is + wav.</para> + </option> + <option name="s"> + <para>Present menu (user or admin) when <literal>*</literal> is received + (send to menu).</para> + </option> + <option name="t"> + <para>Set talk only mode. (Talk only, no listening).</para> + </option> + <option name="T"> + <para>Set talker detection (sent to manager interface and meetme list).</para> + </option> + <option name="W" hasparams="optional"> + <para>Wait until the marked user enters the conference.</para> + <argument name="secs" required="true" /> + </option> + <option name="x"> + <para>Close the conference when last marked user exits</para> + </option> + <option name="X"> + <para>Allow user to exit the conference by entering a valid single digit + extension <variable>MEETME_EXIT_CONTEXT</variable> or the current context + if that variable is not defined.</para> + </option> + <option name="1"> + <para>Do not play message when first person enters</para> + </option> + <option name="S"> + <para>Kick the user <replaceable>x</replaceable> seconds <emphasis>after</emphasis> he entered into + the conference.</para> + <argument name="x" required="true" /> + </option> + <option name="L" argsep=":"> + <para>Limit the conference to <replaceable>x</replaceable> ms. Play a warning when + <replaceable>y</replaceable> ms are left. Repeat the warning every <replaceable>z</replaceable> ms. + The following special variables can be used with this option:</para> + <variablelist> + <variable name="CONF_LIMIT_TIMEOUT_FILE"> + <para>File to play when time is up.</para> + </variable> + <variable name="CONF_LIMIT_WARNING_FILE"> + <para>File to play as warning if <replaceable>y</replaceable> is defined. The + default is to say the time remaining.</para> + </variable> + </variablelist> + <argument name="x" /> + <argument name="y" /> + <argument name="z" /> + </option> + </optionlist> + </parameter> + <parameter name="pin" /> + </syntax> + <description> + <para>Enters the user into a specified MeetMe conference. If the <replaceable>confno</replaceable> + is omitted, the user will be prompted to enter one. User can exit the conference by hangup, or + if the <literal>p</literal> option is specified, by pressing <literal>#</literal>.</para> + <note><para>The DAHDI kernel modules and at least one hardware driver (or dahdi_dummy) + must be present for conferencing to operate properly. In addition, the chan_dahdi channel driver + must be loaded for the <literal>i</literal> and <literal>r</literal> options to operate at + all.</para></note> + </description> + <see-also> + <ref type="application">MeetMeCount</ref> + <ref type="application">MeetMeAdmin</ref> + <ref type="application">MeetMeChannelAdmin</ref> + </see-also> + </application> + <application name="MeetMeCount" language="en_US"> + <synopsis> + MeetMe participant count. + </synopsis> + <syntax> + <parameter name="confno" required="true"> + <para>Conference number.</para> + </parameter> + <parameter name="var" /> + </syntax> + <description> + <para>Plays back the number of users in the specified MeetMe conference. + If <replaceable>var</replaceable> is specified, playback will be skipped and the value + will be returned in the variable. Upon application completion, MeetMeCount will hangup + the channel, unless priority <literal>n+1</literal> exists, in which case priority progress will + continue.</para> + </description> + <see-also> + <ref type="application">MeetMe</ref> + </see-also> + </application> + <application name="MeetMeAdmin" language="en_US"> + <synopsis> + MeetMe conference administration. + </synopsis> + <syntax> + <parameter name="confno" required="true" /> + <parameter name="command" required="true"> + <optionlist> + <option name="e"> + <para>Eject last user that joined.</para> + </option> + <option name="E"> + <para>Extend conference end time, if scheduled.</para> + </option> + <option name="k"> + <para>Kick one user out of conference.</para> + </option> + <option name="K"> + <para>Kick all users out of conference.</para> + </option> + <option name="l"> + <para>Unlock conference.</para> + </option> + <option name="L"> + <para>Lock conference.</para> + </option> + <option name="m"> + <para>Unmute one user.</para> + </option> + <option name="M"> + <para>Mute one user.</para> + </option> + <option name="n"> + <para>Unmute all users in the conference.</para> + </option> + <option name="N"> + <para>Mute all non-admin users in the conference.</para> + </option> + <option name="r"> + <para>Reset one user's volume settings.</para> + </option> + <option name="R"> + <para>Reset all users volume settings.</para> + </option> + <option name="s"> + <para>Lower entire conference speaking volume.</para> + </option> + <option name="S"> + <para>Raise entire conference speaking volume.</para> + </option> + <option name="t"> + <para>Lower one user's talk volume.</para> + </option> + <option name="T"> + <para>Raise one user's talk volume.</para> + </option> + <option name="u"> + <para>Lower one user's listen volume.</para> + </option> + <option name="U"> + <para>Raise one user's listen volume.</para> + </option> + <option name="v"> + <para>Lower entire conference listening volume.</para> + </option> + <option name="V"> + <para>Raise entire conference listening volume.</para> + </option> + </optionlist> + </parameter> + <parameter name="user" /> + </syntax> + <description> + <para>Run admin <replaceable>command</replaceable> for conference <replaceable>confno</replaceable>.</para> + <para>Will additionally set the variable <variable>MEETMEADMINSTATUS</variable> with one of + the following values:</para> + <variablelist> + <variable name="MEETMEADMINSTATUS"> + <value name="NOPARSE"> + Invalid arguments. + </value> + <value name="NOTFOUND"> + User specified was not found. + </value> + <value name="FAILED"> + Another failure occurred. + </value> + <value name="OK"> + The operation was completed successfully. + </value> + </variable> + </variablelist> + </description> + <see-also> + <ref type="application">MeetMe</ref> + </see-also> + </application> + <application name="MeetMeChannelAdmin" language="en_US"> + <synopsis> + MeetMe conference Administration (channel specific). + </synopsis> + <syntax> + <parameter name="channel" required="true" /> + <parameter name="command" required="true"> + <optionlist> + <option name="k"> + <para>Kick the specified user out of the conference he is in.</para> + </option> + <option name="m"> + <para>Unmute the specified user.</para> + </option> + <option name="M"> + <para>Mute the specified user.</para> + </option> + </optionlist> + </parameter> + </syntax> + <description> + <para>Run admin <replaceable>command</replaceable> for a specific + <replaceable>channel</replaceable> in any coference.</para> + </description> + </application> + <application name="SLAStation" language="en_US"> + <synopsis> + Shared Line Appearance Station. + </synopsis> + <syntax> + <parameter name="station" required="true"> + <para>Station name</para> + </parameter> + </syntax> + <description> + <para>This application should be executed by an SLA station. The argument depends + on how the call was initiated. If the phone was just taken off hook, then the argument + <replaceable>station</replaceable> should be just the station name. If the call was + initiated by pressing a line key, then the station name should be preceded by an underscore + and the trunk name associated with that line button.</para> + <para>For example: <literal>station1_line1</literal></para> + <para>On exit, this application will set the variable <variable>SLASTATION_STATUS</variable> to + one of the following values:</para> + <variablelist> + <variable name="SLASTATION_STATUS"> + <value name="FAILURE" /> + <value name="CONGESTION" /> + <value name="SUCCESS" /> + </variable> + </variablelist> + </description> + </application> + <application name="SLATrunk" language="en_US"> + <synopsis> + Shared Line Appearance Trunk. + </synopsis> + <syntax> + <parameter name="trunk" required="true"> + <para>Trunk name</para> + </parameter> + <parameter name="options"> + <optionlist> + <option name="M" hasparams="optional"> + <para>Play back the specified MOH <replaceable>class</replaceable> + instead of ringing</para> + <argument name="class" required="true" /> + </option> + </optionlist> + </parameter> + </syntax> + <description> + <para>This application should be executed by an SLA trunk on an inbound call. The channel calling + this application should correspond to the SLA trunk with the name <replaceable>trunk</replaceable> + that is being passed as an argument.</para> + <para>On exit, this application will set the variable <variable>SLATRUNK_STATUS</variable> to + one of the following values:</para> + <variablelist> + <variable name="SLATRUNK_STATUS"> + <value name="FAILURE" /> + <value name="SUCCESS" /> + <value name="UNANSWERED" /> + <value name="RINGTIMEOUT" /> + </variable> + </variablelist> + </description> + </application> + ***/ + #define CONFIG_FILE_NAME "meetme.conf" #define SLA_CONFIG_FILE "sla.conf" @@ -208,13 +567,6 @@ static const char *app4 = "MeetMeChannelAdmin"; static const char *slastation_app = "SLAStation"; static const char *slatrunk_app = "SLATrunk"; -static const char *synopsis = "MeetMe conference bridge"; -static const char *synopsis2 = "MeetMe participant count"; -static const char *synopsis3 = "MeetMe conference Administration"; -static const char *synopsis4 = "MeetMe conference Administration (channel specific)"; -static const char *slastation_synopsis = "Shared Line Appearance Station"; -static const char *slatrunk_synopsis = "Shared Line Appearance Trunk"; - /* Lookup RealTime conferences based on confno and current time */ static int rt_schedule; static int fuzzystart; @@ -225,140 +577,6 @@ static int extendby; /* Log participant count to the RealTime backend */ static int rt_log_members; -static const char *descrip = -" MeetMe([confno][,[options][,pin]]): Enters the user into a specified MeetMe\n" -"conference. If the conference number is omitted, the user will be prompted\n" -"to enter one. User can exit the conference by hangup, or if the 'p' option\n" -"is specified, by pressing '#'.\n" -"Please note: The DAHDI kernel modules and at least one hardware driver (or dahdi_dummy)\n" -" must be present for conferencing to operate properly. In addition, the chan_dahdi\n" -" channel driver must be loaded for the 'i' and 'r' options to operate at all.\n\n" -"The option string may contain zero or more of the following characters:\n" -" 'a' -- set admin mode\n" -" 'A' -- set marked mode\n" -" 'b' -- run AGI script specified in ${MEETME_AGI_BACKGROUND}\n" -" Default: conf-background.agi (Note: This does not work with\n" -" non-DAHDI channels in the same conference)\n" -" 'c' -- announce user(s) count on joining a conference\n" -" 'C' -- continue in dialplan when kicked out of conference\n" -" 'd' -- dynamically add conference\n" -" 'D' -- dynamically add conference, prompting for a PIN\n" -" 'e' -- select an empty conference\n" -" 'E' -- select an empty pinless conference\n" -" 'F' -- Pass DTMF through the conference.\n" -" 'i' -- announce user join/leave with review\n" -" 'I' -- announce user join/leave without review\n" -" 'l' -- set listen only mode (Listen only, no talking)\n" -" 'm' -- set initially muted\n" -" 'M[(<class>)]'\n" -" -- enable music on hold when the conference has a single caller.\n" -" Optionally, specify a musiconhold class to use. If one is not\n" -" provided, it will use the channel's currently set music class,\n" -" or \"default\".\n" -" 'o' -- set talker optimization - treats talkers who aren't speaking as\n" -" being muted, meaning (a) No encode is done on transmission and\n" -" (b) Received audio that is not registered as talking is omitted\n" -" causing no buildup in background noise\n" -" 'p[(<keys>)]'\n" -" -- allow user to exit the conference by pressing '#' (default)\n" -" or any of the defined keys. If keys contain '*' this will override\n" -" option 's'. The key used is set to channel variable MEETME_EXIT_KEY.\n" -" 'P' -- always prompt for the pin even if it is specified\n" -" 'q' -- quiet mode (don't play enter/leave sounds)\n" -" 'r' -- Record conference (records as ${MEETME_RECORDINGFILE}\n" -" using format ${MEETME_RECORDINGFORMAT}). Default filename is\n" -" meetme-conf-rec-${CONFNO}-${UNIQUEID} and the default format is\n" -" wav.\n" -" 's' -- Present menu (user or admin) when '*' is received ('send' to menu)\n" -" 't' -- set talk only mode. (Talk only, no listening)\n" -" 'T' -- set talker detection (sent to manager interface and meetme list)\n" -" 'w[(<secs>)]'\n" -" -- wait until the marked user enters the conference\n" -" 'x' -- close the conference when last marked user exits\n" -" 'X' -- allow user to exit the conference by entering a valid single\n" -" digit extension ${MEETME_EXIT_CONTEXT} or the current context\n" -" if that variable is not defined.\n" -" '1' -- do not play message when first person enters\n" -" 'S(x)' -- Kick the user 'x' seconds *after* he entered into the conference.\n" -" 'L(x[:y][:z])' - Limit the conference to 'x' ms. Play a warning when 'y' ms are\n" -" left. Repeat the warning every 'z' ms. The following special\n" -" variables can be used with this option:\n" -" * CONF_LIMIT_TIMEOUT_FILE File to play when time is up.\n" -" * CONF_LIMIT_WARNING_FILE File to play as warning if 'y' is defined.\n" -" The default is to say the time remaining.\n" -""; - -static const char *descrip2 = -" MeetMeCount(confno[,var]): Plays back the number of users in the specified\n" -"MeetMe conference. If var is specified, playback will be skipped and the value\n" -"will be returned in the variable. Upon app completion, MeetMeCount will hangup\n" -"the channel, unless priority n+1 exists, in which case priority progress will\n" -"continue.\n" -""; - -static const char *descrip3 = -" MeetMeAdmin(confno,command[,user]): Run admin command for conference\n" -" 'e' -- Eject last user that joined\n" -" 'E' -- Extend conference end time, if scheduled\n" -" 'k' -- Kick one user out of conference\n" -" 'K' -- Kick all users out of conference\n" -" 'l' -- Unlock conference\n" -" 'L' -- Lock conference\n" -" 'm' -- Unmute one user\n" -" 'M' -- Mute one user\n" -" 'n' -- Unmute all users in the conference\n" -" 'N' -- Mute all non-admin users in the conference\n" -" 'r' -- Reset one user's volume settings\n" -" 'R' -- Reset all users volume settings\n" -" 's' -- Lower entire conference speaking volume\n" -" 'S' -- Raise entire conference speaking volume\n" -" 't' -- Lower one user's talk volume\n" -" 'T' -- Raise one user's talk volume\n" -" 'u' -- Lower one user's listen volume\n" -" 'U' -- Raise one user's listen volume\n" -" 'v' -- Lower entire conference listening volume\n" -" 'V' -- Raise entire conference listening volume\n" -" MeetMeAdmin will additionally set the variable MEETMEADMINSTATUS with one\n" -"of the following values:\n" -" 'NOPARSE' -- Invalid arguments\n" -" 'NOTFOUND' -- User specified was not found\n" -" 'FAILED' -- Another failure occurred\n" -" 'OK' -- The operation was completed successfully\n" -""; - -static const char *descrip4 = -" MeetMeChannelAdmin(channel,command): Run admin command for a specific\n" -"channel in any coference.\n" -" 'k' -- Kick the specified user out of the conference he is in\n" -" 'm' -- Unmute the specified user\n" -" 'M' -- Mute the specified user\n" -""; - -static const char *slastation_desc = -" SLAStation(<station name>):\n" -"This application should be executed by an SLA station. The argument depends\n" -"on how the call was initiated. If the phone was just taken off hook, then\n" -"the argument \"station\" should be just the station name. If the call was\n" -"initiated by pressing a line key, then the station name should be preceded\n" -"by an underscore and the trunk name associated with that line button.\n" -"For example: \"station1_line1\"." -" On exit, this application will set the variable SLASTATION_STATUS to\n" -"one of the following values:\n" -" FAILURE | CONGESTION | SUCCESS\n" -""; - -static const char *slatrunk_desc = -" SLATrunk(<trunk name>[,options]):\n" -"This application should be executed by an SLA trunk on an inbound call.\n" -"The channel calling this application should correspond to the SLA trunk\n" -"with the name \"trunk\" that is being passed as an argument.\n" -" On exit, this application will set the variable SLATRUNK_STATUS to\n" -"one of the following values:\n" -" FAILURE | SUCCESS | UNANSWERED | RINGTIMEOUT\n" -" The available options are:\n" -" M[(<class>)] - Play back the specified MOH class instead of ringing\n" -""; - #define MAX_CONFNUM 80 #define MAX_PIN 80 #define OPTIONS_LEN 32 @@ -6153,14 +6371,12 @@ static int load_module(void) action_meetmeunmute, "Unmute a Meetme user"); res |= ast_manager_register2("MeetmeList", EVENT_FLAG_REPORTING, action_meetmelist, "List participants in a conference", mandescr_meetmelist); - res |= ast_register_application(app4, channel_admin_exec, synopsis4, descrip4); - res |= ast_register_application(app3, admin_exec, synopsis3, descrip3); - res |= ast_register_application(app2, count_exec, synopsis2, descrip2); - res |= ast_register_application(app, conf_exec, synopsis, descrip); - res |= ast_register_application(slastation_app, sla_station_exec, - slastation_synopsis, slastation_desc); - res |= ast_register_application(slatrunk_app, sla_trunk_exec, - slatrunk_synopsis, slatrunk_desc); + res |= ast_register_application_xml(app4, channel_admin_exec); + res |= ast_register_application_xml(app3, admin_exec); + res |= ast_register_application_xml(app2, count_exec); + res |= ast_register_application_xml(app, conf_exec); + res |= ast_register_application_xml(slastation_app, sla_station_exec); + res |= ast_register_application_xml(slatrunk_app, sla_trunk_exec); res |= ast_devstate_prov_add("Meetme", meetmestate); res |= ast_devstate_prov_add("SLA", sla_state); diff --git a/doc/appdocsxml.dtd b/doc/appdocsxml.dtd index bc72d1324bd4e69e93879d48ecee4a5bceebc82c..d0ce640898defe35f47d949a95ce4919c2013aa3 100644 --- a/doc/appdocsxml.dtd +++ b/doc/appdocsxml.dtd @@ -38,6 +38,7 @@ <!ATTLIST option name CDATA #REQUIRED> <!ATTLIST option argsep CDATA ","> <!ATTLIST option implies CDATA ""> + <!ATTLIST option hasparams CDATA ""> <!ELEMENT enumlist (enum+)> <!ELEMENT enum (para|note|warning|parameter)*> diff --git a/main/xmldoc.c b/main/xmldoc.c index 084fdf3fdfca9bf921934990dfeea4159e99f2cb..5921960c4ee0db83ca23d3cd82eb89dfa860c2c8 100644 --- a/main/xmldoc.c +++ b/main/xmldoc.c @@ -1462,8 +1462,9 @@ static int xmldoc_parse_option(struct ast_xml_node *fixnode, const char *tabs, s static void xmldoc_parse_optionlist(struct ast_xml_node *fixnode, const char *tabs, struct ast_str **buffer) { struct ast_xml_node *node; - const char *optname; + const char *optname, *hasparams; char *optionsyntax; + int optparams; for (node = ast_xml_node_get_children(fixnode); node; node = ast_xml_node_get_next(node)) { /* Start appending every option tag. */ @@ -1477,8 +1478,16 @@ static void xmldoc_parse_optionlist(struct ast_xml_node *fixnode, const char *ta continue; } - optionsyntax = xmldoc_get_syntax_fun(node, optname, "argument", 0, 1); + optparams = 1; + hasparams = ast_xml_get_attribute(node, "hasparams"); + if (hasparams && !strcasecmp(hasparams, "optional")) { + optparams = 2; + } + + optionsyntax = xmldoc_get_syntax_fun(node, optname, "argument", 0, optparams); if (!optionsyntax) { + ast_xml_free_attr(optname); + ast_xml_free_attr(hasparams); continue; } @@ -1487,6 +1496,8 @@ static void xmldoc_parse_optionlist(struct ast_xml_node *fixnode, const char *ta if (!xmldoc_parse_option(node, tabs, buffer)) { ast_str_append(buffer, 0, "\n"); } + ast_xml_free_attr(optname); + ast_xml_free_attr(hasparams); } }