dect
/
asterisk
Archived
13
0
Fork 0

Allows ParkedCall application to specify a parkinglot.

When invoking the app parkedcall, the argument can now include '@parkinglot' after the
extension.

(closes issue #18777)
Reported by: cartama
Patches:
      0018777.diff uploaded by cartama (license 1157)

Review: https://reviewboard.asterisk.org/r/1209/



git-svn-id: http://svn.digium.com/svn/asterisk/trunk@318141 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
jrose 2011-05-09 13:56:32 +00:00
parent a71f030090
commit bc68932e23
2 changed files with 40 additions and 4 deletions

View File

@ -15,6 +15,7 @@
Parking Parking
------- -------
* parkedmusicclass can now be set for non-default parking lots. * parkedmusicclass can now be set for non-default parking lots.
* ParkedCall application can now specify a specific parkinglot.
Asterisk Manager Interface Asterisk Manager Interface
-------------------------- --------------------------
@ -304,6 +305,8 @@ Applications
* Added 'D' command to ExternalIVR full details in doc/externalivr.txt * Added 'D' command to ExternalIVR full details in doc/externalivr.txt
* Added 'v' option to MeetMe to play voicemail greetings when a user joins/leaves * Added 'v' option to MeetMe to play voicemail greetings when a user joins/leaves
a MeetMe conference a MeetMe conference
* Added ability to include '@parkinglot' to ParkedCall extension in order to specify
a specific parkinglot on which to search the extension.
Dialplan Functions Dialplan Functions
------------------ ------------------

View File

@ -209,14 +209,22 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
Answer a parked call. Answer a parked call.
</synopsis> </synopsis>
<syntax> <syntax>
<parameter name="exten" required="true" /> <parameter name="exten" required="true" argsep="@">
<argument name="exten" required="true">
<para>Specify extension.</para>
</argument>
<argument name="parkinglot">
<para>Optionally specify a parkinglot.<literal>exten</literal>.</para>
</argument>
</parameter>
</syntax> </syntax>
<description> <description>
<para>Used to connect to a parked call. This application is always <para>Used to connect to a parked call. This application is always
registered internally and does not need to be explicitly added registered internally and does not need to be explicitly added
into the dialplan, although you should include the <literal>parkedcalls</literal> into the dialplan, although you should include the <literal>parkedcalls</literal>
context. If no extension is provided, then the first available context. If no extension is provided, then the first available
parked call will be acquired.</para> parked call will be acquired. If <literal>parkinglot</literal> is included,the
parkinglot with that name will be used to seek the extension.</para>
</description> </description>
<see-also> <see-also>
<ref type="application">Park</ref> <ref type="application">Park</ref>
@ -646,6 +654,18 @@ static int find_parkinglot_by_exten_cb(void *obj, void *args, int flags)
return 0; return 0;
} }
static int find_parkinglot_by_name_cb(void *obj, void *args, int flags)
{
struct ast_parkinglot *parkinglot = obj;
const char *parkname = args;
if (!strcmp(parkinglot->name, parkname)) {
return CMP_MATCH | CMP_STOP;
}
return 0;
}
int ast_parking_ext_valid(const char *exten_str, struct ast_channel *chan, const char *context) int ast_parking_ext_valid(const char *exten_str, struct ast_channel *chan, const char *context)
{ {
struct ast_exten *exten; struct ast_exten *exten;
@ -4478,12 +4498,25 @@ static int park_exec_full(struct ast_channel *chan, const char *data)
int park = 0; int park = 0;
struct ast_bridge_config config; struct ast_bridge_config config;
struct ast_parkinglot *parkinglot; struct ast_parkinglot *parkinglot;
const char *lotname_split = NULL; /* name of the parking lot if an '@' symbol is included in data */
if (data) { if (data) {
park = atoi((char *) data); sscanf(data, "%d", &park);
if ((lotname_split = strchr(data, (int)'@'))) {
lotname_split++;
}
}
/*
* If we found an '@' in data, we want to specify the parkinglot used by its name.
* otherwise we just search by position.
*/
if (lotname_split) {
parkinglot = ao2_callback(parkinglots, 0, find_parkinglot_by_name_cb, (void *) (lotname_split));
} else {
parkinglot = ao2_callback(parkinglots, 0, find_parkinglot_by_position_cb, (void *) &park);
} }
parkinglot = ao2_callback(parkinglots, 0, find_parkinglot_by_position_cb, (void *) &park);
if (!parkinglot) if (!parkinglot)
parkinglot = default_parkinglot; parkinglot = default_parkinglot;