Allows ParkedCall application to specify a parkinglot.
authorJonathan Rose <jrose@digium.com>
Mon, 9 May 2011 13:56:32 +0000 (13:56 +0000)
committerJonathan Rose <jrose@digium.com>
Mon, 9 May 2011 13:56:32 +0000 (13:56 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@318141 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
main/features.c

diff --git a/CHANGES b/CHANGES
index becdbfd..c7aebe1 100644 (file)
--- 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
 ------------------
index c12a02c..4850f1c 100644 (file)
@@ -209,14 +209,22 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                        Answer a parked call.
                </synopsis>
                <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>
                <description>
                        <para>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 <literal>parkedcalls</literal>
                        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>
                <see-also>
                        <ref type="application">Park</ref>
@@ -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;