diff --git a/CHANGES b/CHANGES
index becdbfd6a1..c7aebe1831 100644
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,7 @@
Parking
-------
* parkedmusicclass can now be set for non-default parking lots.
+ * ParkedCall application can now specify a specific parkinglot.
Asterisk Manager Interface
--------------------------
@@ -304,6 +305,8 @@ Applications
* 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
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
------------------
diff --git a/main/features.c b/main/features.c
index c12a02c1c9..4850f1c876 100644
--- a/main/features.c
+++ b/main/features.c
@@ -209,14 +209,22 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
Answer a parked call.
-
+
+
+ Specify extension.
+
+
+ Optionally specify a parkinglot.exten.
+
+
Used to connect to a parked call. This application is always
registered internally and does not need to be explicitly added
into the dialplan, although you should include the parkedcalls
context. If no extension is provided, then the first available
- parked call will be acquired.
+ parked call will be acquired. If parkinglot is included,the
+ parkinglot with that name will be used to seek the extension.
[Park]
@@ -646,6 +654,18 @@ static int find_parkinglot_by_exten_cb(void *obj, void *args, int flags)
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)
{
struct ast_exten *exten;
@@ -4478,12 +4498,25 @@ static int park_exec_full(struct ast_channel *chan, const char *data)
int park = 0;
struct ast_bridge_config config;
struct ast_parkinglot *parkinglot;
+ const char *lotname_split = NULL; /* name of the parking lot if an '@' symbol is included in 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)
parkinglot = default_parkinglot;