[asterisk-commits] mjordan: trunk r396060 - in /trunk: ./ apps/ channels/ include/asterisk/ main...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Aug 1 21:32:47 CDT 2013


Author: mjordan
Date: Thu Aug  1 21:32:44 2013
New Revision: 396060

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396060
Log:
Remove dead code from features.c; refactor pickup code into pickup.c

This patch does the following:
 * It moves the pickup code out of features.c and into pickup.c
 * It removes the vast majority of dead code out of features.c. In particular,
   this includes the parking code.

(issue ASTERISK-22134)


Added:
    trunk/include/asterisk/pickup.h   (with props)
    trunk/main/pickup.c   (with props)
Modified:
    trunk/CHANGES
    trunk/UPGRADE.txt
    trunk/apps/app_directed_pickup.c
    trunk/channels/chan_gtalk.c
    trunk/channels/chan_sip.c
    trunk/channels/chan_skinny.c
    trunk/channels/chan_unistim.c
    trunk/include/asterisk/_private.h
    trunk/include/asterisk/features.h
    trunk/include/asterisk/parking.h
    trunk/main/asterisk.c
    trunk/main/bridge.c
    trunk/main/cdr.c
    trunk/main/cel.c
    trunk/main/features.c
    trunk/main/pbx.c
    trunk/res/parking/parking_applications.c
    trunk/res/parking/parking_manager.c
    trunk/res/res_parking.c
    trunk/res/stasis/control.c
    trunk/tests/test_cdr.c
    trunk/tests/test_cel.c

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Thu Aug  1 21:32:44 2013
@@ -310,6 +310,15 @@
  * The option 'allowmultiplelogin' can now be set or overriden in a particular
    account. When set in the general context, it will act as the default
    setting for defined accounts.
+
+ * The 'BridgeAction' event was removed. It technically added no value, as the
+   Bridge Action already receives confirmation of the bridge through a
+   successful completion Event.
+
+ * The 'BridgeExec' events were removed. These events duplicated the events that
+   occur in the Briding API, and are conveyed now through BridgeCreate,
+   BridgeEnter, and BridgeLeave events.
+
 
 AGI (Asterisk Gateway Interface)
 ------------------

Modified: trunk/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/trunk/UPGRADE.txt?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Thu Aug  1 21:32:44 2013
@@ -185,6 +185,10 @@
  - Executing a dynamic feature on the bridge peer in a multi-party bridge will
    execute it on all peers of the activating channel.
 
+ - There is no longer an explicit 'features reload' CLI command. Features can still be
+   reloaded using 'module reload features'.
+
+
 Parking:
  - The arguments for the Park, ParkedCall, and ParkAndAnnounce applications have
    been modified significantly. See the application documents for specific details.

Modified: trunk/apps/app_directed_pickup.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_directed_pickup.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/apps/app_directed_pickup.c (original)
+++ trunk/apps/app_directed_pickup.c Thu Aug  1 21:32:44 2013
@@ -43,7 +43,7 @@
 #include "asterisk/module.h"
 #include "asterisk/lock.h"
 #include "asterisk/app.h"
-#include "asterisk/features.h"
+#include "asterisk/pickup.h"
 #include "asterisk/manager.h"
 #include "asterisk/callerid.h"
 
@@ -305,7 +305,7 @@
 	return 0;
 }
 
-/* Find channel for pick up specified by partial channel name */ 
+/* Find channel for pick up specified by partial channel name */
 static int find_by_part(void *obj, void *arg, void *data, int flags)
 {
 	struct ast_channel *target = obj;/*!< Potential pickup target */
@@ -323,7 +323,7 @@
 	return 0;
 }
 
-/* Attempt to pick up specified by partial channel name */ 
+/* Attempt to pick up specified by partial channel name */
 static int pickup_by_part(struct ast_channel *chan, const char *part)
 {
 	struct ast_channel *target;/*!< Potential pickup target */

Modified: trunk/channels/chan_gtalk.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_gtalk.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/channels/chan_gtalk.c (original)
+++ trunk/channels/chan_gtalk.c Thu Aug  1 21:32:44 2013
@@ -85,7 +85,7 @@
 #include "asterisk/abstract_jb.h"
 #include "asterisk/jabber.h"
 #include "asterisk/jingle.h"
-#include "asterisk/features.h"
+#include "asterisk/parking.h"
 #include "asterisk/stasis_channels.h"
 
 #define GOOGLE_CONFIG		"gtalk.conf"
@@ -2319,8 +2319,8 @@
  * Module loading including tests for configuration or dependencies.
  * This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
  * or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the 
- * configuration file or other non-critical problem return 
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
  * AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
  */
 static int load_module(void)

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Thu Aug  1 21:32:44 2013
@@ -259,7 +259,8 @@
 #include "asterisk/cli.h"
 #include "asterisk/musiconhold.h"
 #include "asterisk/dsp.h"
-#include "asterisk/features.h"
+#include "asterisk/pickup.h"
+#include "asterisk/parking.h"
 #include "asterisk/srv.h"
 #include "asterisk/astdb.h"
 #include "asterisk/causes.h"

Modified: trunk/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_skinny.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/channels/chan_skinny.c (original)
+++ trunk/channels/chan_skinny.c Thu Aug  1 21:32:44 2013
@@ -68,7 +68,7 @@
 #include "asterisk/manager.h"
 #include "asterisk/say.h"
 #include "asterisk/astdb.h"
-#include "asterisk/features.h"
+#include "asterisk/pickup.h"
 #include "asterisk/app.h"
 #include "asterisk/musiconhold.h"
 #include "asterisk/utils.h"

Modified: trunk/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_unistim.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/channels/chan_unistim.c (original)
+++ trunk/channels/chan_unistim.c Thu Aug  1 21:32:44 2013
@@ -73,7 +73,7 @@
 #include "asterisk/musiconhold.h"
 #include "asterisk/causes.h"
 #include "asterisk/indications.h"
-#include "asterisk/features.h"
+#include "asterisk/pickup.h"
 #include "asterisk/astobj2.h"
 #include "asterisk/astdb.h"
 #include "asterisk/features_config.h"

Modified: trunk/include/asterisk/_private.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/_private.h?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/include/asterisk/_private.h (original)
+++ trunk/include/asterisk/_private.h Thu Aug  1 21:32:44 2013
@@ -8,7 +8,7 @@
  *
  * \brief
  * Prototypes for public functions only of internal interest,
- * 
+ *
  */
 
 
@@ -25,7 +25,7 @@
 void ast_channels_init(void);		/*!< Provided by channel.c */
 void ast_builtins_init(void);		/*!< Provided by cli.c */
 int ast_cli_perms_init(int reload);	/*!< Provided by cli.c */
-int dnsmgr_init(void);			/*!< Provided by dnsmgr.c */ 
+int dnsmgr_init(void);			/*!< Provided by dnsmgr.c */
 void dnsmgr_start_refresh(void);	/*!< Provided by dnsmgr.c */
 int dnsmgr_reload(void);		/*!< Provided by dnsmgr.c */
 void threadstorage_init(void);		/*!< Provided by threadstorage.c */
@@ -109,9 +109,9 @@
  */
 void ast_process_pending_reloads(void);
 
-/*! \brief Load XML documentation. Provided by xmldoc.c 
+/*! \brief Load XML documentation. Provided by xmldoc.c
  *  \retval 1 on error.
- *  \retval 0 on success. 
+ *  \retval 0 on success.
  */
 int ast_xmldoc_load_documentation(void);
 

Modified: trunk/include/asterisk/features.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/features.h?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/include/asterisk/features.h (original)
+++ trunk/include/asterisk/features.h Thu Aug  1 21:32:44 2013
@@ -27,30 +27,6 @@
 #include "asterisk/pbx.h"
 #include "asterisk/linkedlists.h"
 #include "asterisk/bridge.h"
-
-#define FEATURE_MAX_LEN		11
-#define FEATURE_APP_LEN		64
-#define FEATURE_APP_ARGS_LEN	256
-#define FEATURE_SNAME_LEN	32
-#define FEATURE_EXTEN_LEN	32
-#define FEATURE_MOH_LEN		80  /* same as MAX_MUSICCLASS from channel.h */
-
-#define DEFAULT_PARKINGLOT "default"	/*!< Default parking lot */
-
-#define AST_FEATURE_RETURN_HANGUP           -1
-#define AST_FEATURE_RETURN_SUCCESSBREAK     0
-#define AST_FEATURE_RETURN_PBX_KEEPALIVE    AST_PBX_KEEPALIVE
-#define AST_FEATURE_RETURN_NO_HANGUP_PEER   AST_PBX_NO_HANGUP_PEER
-#define AST_FEATURE_RETURN_PASSDIGITS       21
-#define AST_FEATURE_RETURN_STOREDIGITS      22
-#define AST_FEATURE_RETURN_SUCCESS          23
-#define AST_FEATURE_RETURN_KEEPTRYING       24
-#define AST_FEATURE_RETURN_PARKFAILED       25
-
-#define FEATURE_SENSE_CHAN	(1 << 0)
-#define FEATURE_SENSE_PEER	(1 << 1)
-
-typedef int (*ast_feature_operation)(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, const char *code, int sense, void *data);
 
 /*! \brief main call feature structure */
 
@@ -93,54 +69,7 @@
 int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan,
 		struct ast_bridge_features *features, int play_tone, const char *xfersound);
 
-/*!
- * \brief Test if a channel can be picked up.
- *
- * \param chan Channel to test if can be picked up.
- *
- * \note This function assumes that chan is locked.
- *
- * \return TRUE if channel can be picked up.
- */
-int ast_can_pickup(struct ast_channel *chan);
 
-/*!
- * \brief Find a pickup channel target by group.
- *
- * \param chan channel that initiated pickup.
- *
- * \retval target on success.  The returned channel is locked and reffed.
- * \retval NULL on error.
- */
-struct ast_channel *ast_pickup_find_by_group(struct ast_channel *chan);
-
-/*! \brief Pickup a call */
-int ast_pickup_call(struct ast_channel *chan);
-
-/*!
- * \brief Pickup a call target.
- *
- * \param chan channel that initiated pickup.
- * \param target channel to be picked up.
- *
- * \note This function assumes that target is locked.
- *
- * \retval 0 on success.
- * \retval -1 on failure.
- */
-int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target);
-
-/*!
- * \brief accessor for call pickup message type
- * \since 12.0.0
- *
- * \retval pointer to the stasis message type
- * \retval NULL if not initialized
- */
-struct stasis_message_type *ast_call_pickup_type(void);
-
-/*! \brief Reload call features from features.conf */
-int ast_features_reload(void);
 
 /*!
  * \brief parse L option and read associated channel variables to set warning, warning frequency, and timelimit

Modified: trunk/include/asterisk/parking.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/parking.h?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/include/asterisk/parking.h (original)
+++ trunk/include/asterisk/parking.h Thu Aug  1 21:32:44 2013
@@ -29,6 +29,11 @@
  * \brief The default parking application that Asterisk expects.
  */
 #define PARK_APPLICATION "Park"
+
+/*!
+ * \brief The default parking lot
+ */
+#define DEFAULT_PARKINGLOT "default"
 
 /*!
  * \brief Defines the type of parked call message being published

Added: trunk/include/asterisk/pickup.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/pickup.h?view=auto&rev=396060
==============================================================================
--- trunk/include/asterisk/pickup.h (added)
+++ trunk/include/asterisk/pickup.h Thu Aug  1 21:32:44 2013
@@ -1,0 +1,91 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 1999 - 2013, Digium, Inc.
+ *
+ * Matt Jordan <mjordan at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief Call Pickup API
+ *
+ * Includes code and algorithms from the Zapata library.
+ *
+ */
+
+#ifndef _AST_FEATURES_H
+#define _AST_FEATURES_H
+
+/*!
+ * \brief Test if a channel can be picked up.
+ *
+ * \param chan Channel to test if can be picked up.
+ *
+ * \note This function assumes that chan is locked.
+ *
+ * \return TRUE if channel can be picked up.
+ */
+int ast_can_pickup(struct ast_channel *chan);
+
+/*!
+ * \brief Find a pickup channel target by group.
+ *
+ * \param chan channel that initiated pickup.
+ *
+ * \retval target on success.  The returned channel is locked and reffed.
+ * \retval NULL on error.
+ */
+struct ast_channel *ast_pickup_find_by_group(struct ast_channel *chan);
+
+/*!
+ * \brief Pickup a call
+ *
+ * \param chan The channel that initiated the pickup
+ *
+ * \retval 0 on success
+ * \retval -1 on failure
+ */
+int ast_pickup_call(struct ast_channel *chan);
+
+/*!
+ * \brief Pickup a call target.
+ *
+ * \param chan channel that initiated pickup.
+ * \param target channel to be picked up.
+ *
+ * \note This function assumes that target is locked.
+ *
+ * \retval 0 on success.
+ * \retval -1 on failure.
+ */
+int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target);
+
+/*!
+ * \brief accessor for call pickup message type
+ * \since 12.0.0
+ *
+ * \retval pointer to the stasis message type
+ * \retval NULL if not initialized
+ */
+struct stasis_message_type *ast_call_pickup_type(void);
+
+/*!
+ * \brief Initialize pickup
+ *
+ * \retval 0 on success
+ * \retval non-zero on failure
+ */
+int ast_pickup_init(void);
+
+#endif /* _AST_FEATURES_H */

Propchange: trunk/include/asterisk/pickup.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/include/asterisk/pickup.h
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: trunk/include/asterisk/pickup.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: trunk/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/asterisk.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/main/asterisk.c (original)
+++ trunk/main/asterisk.c Thu Aug  1 21:32:44 2013
@@ -202,6 +202,7 @@
 #include "asterisk/cli.h"
 #include "asterisk/channel.h"
 #include "asterisk/translate.h"
+#include "asterisk/pickup.h"
 #include "asterisk/features.h"
 #include "asterisk/acl.h"
 #include "asterisk/ulaw.h"
@@ -4298,6 +4299,11 @@
 		exit(1);
 	}
 
+	if (ast_pickup_init()) {
+		printf("%s", term_quit());
+		exit(1);
+	}
+
 	if (ast_bridging_init()) {
 		printf("%s", term_quit());
 		exit(1);

Modified: trunk/main/bridge.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/bridge.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/main/bridge.c (original)
+++ trunk/main/bridge.c Thu Aug  1 21:32:44 2013
@@ -40,6 +40,7 @@
 #include "asterisk/bridge.h"
 #include "asterisk/bridge_internal.h"
 #include "asterisk/bridge_channel_internal.h"
+#include "asterisk/bridge_features.h"
 #include "asterisk/bridge_basic.h"
 #include "asterisk/bridge_technology.h"
 #include "asterisk/bridge_channel.h"

Modified: trunk/main/cdr.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/cdr.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/main/cdr.c (original)
+++ trunk/main/cdr.c Thu Aug  1 21:32:44 2013
@@ -916,17 +916,14 @@
 		return 0;
 	}
 
-	if (strcmp(new_snapshot->context, old_snapshot->context)
-		|| strcmp(new_snapshot->exten, old_snapshot->exten)
-		|| new_snapshot->priority != old_snapshot->priority) {
-		return 1;
-	}
-
 	/* When Party A is originated to an application and the application exits, the stack
 	 * will attempt to clear the application and restore the dummy originate application
 	 * of "AppDialX". Ignore application changes to AppDialX as a result.
 	 */
-	if (strcmp(new_snapshot->appl, old_snapshot->appl) && strncasecmp(new_snapshot->appl, "appdial", 7)) {
+	if (strcmp(new_snapshot->appl, old_snapshot->appl) && strncasecmp(new_snapshot->appl, "appdial", 7)
+		&& (strcmp(new_snapshot->context, old_snapshot->context)
+		|| strcmp(new_snapshot->exten, old_snapshot->exten)
+		|| new_snapshot->priority != old_snapshot->priority)) {
 		return 1;
 	}
 

Modified: trunk/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/cel.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/main/cel.c (original)
+++ trunk/main/cel.c Thu Aug  1 21:32:44 2013
@@ -61,7 +61,7 @@
 #include "asterisk/stasis_bridges.h"
 #include "asterisk/bridge.h"
 #include "asterisk/parking.h"
-#include "asterisk/features.h"
+#include "asterisk/pickup.h"
 #include "asterisk/core_local.h"
 
 /*** DOCUMENTATION

Modified: trunk/main/features.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/features.c?view=diff&rev=396060&r1=396059&r2=396060
==============================================================================
--- trunk/main/features.c (original)
+++ trunk/main/features.c Thu Aug  1 21:32:44 2013
@@ -72,6 +72,7 @@
 #include "asterisk/astobj2.h"
 #include "asterisk/test.h"
 #include "asterisk/bridge.h"
+#include "asterisk/bridge_features.h"
 #include "asterisk/bridge_basic.h"
 #include "asterisk/bridge_after.h"
 #include "asterisk/stasis.h"
@@ -282,25 +283,7 @@
 			<para>Bridge together two channels already in the PBX.</para>
 		</description>
 	</manager>
-	<managerEvent language="en_US" name="Pickup">
-		<managerEventInstance class="EVENT_FLAG_CALL">
-			<synopsis>Raised when a call pickup occurs.</synopsis>
-			<syntax>
-				<channel_snapshot/>
-				<channel_snapshot prefix="Target"/>
-			</syntax>
-		</managerEventInstance>
-	</managerEvent>
  ***/
-
-#define DEFAULT_PARK_TIME							45000	/*!< ms */
-#define DEFAULT_PARK_EXTENSION						"700"
-#define DEFAULT_COMEBACK_CONTEXT					"parkedcallstimeout"
-#define DEFAULT_COMEBACK_TO_ORIGIN					1
-#define DEFAULT_COMEBACK_DIAL_TIME					30
-
-#define AST_MAX_WATCHERS 256
-#define MAX_DIAL_FEATURE_OPTIONS 30
 
 /* TODO Scrape all of the parking stuff out of features.c */
 
@@ -310,286 +293,12 @@
 	FEATURE_INTERPRET_CHECK,  /* Used by feature_check */
 } feature_interpret_op;
 
-/*! Parking lot access ramp dialplan usage entry. */
-struct parking_dp_ramp {
-	/*! Next node in the parking lot spaces dialplan list. */
-	AST_LIST_ENTRY(parking_dp_ramp) node;
-	/*! TRUE if the parking lot access extension is exclusive. */
-	unsigned int exclusive:1;
-	/*! Parking lot access extension */
-	char exten[1];
-};
-
-/*! Parking lot dialplan access ramp map */
-AST_LIST_HEAD_NOLOCK(parking_dp_ramp_map, parking_dp_ramp);
-
-/*! Parking lot spaces dialplan usage entry. */
-struct parking_dp_spaces {
-	/*! Next node in the parking lot spaces dialplan list. */
-	AST_LIST_ENTRY(parking_dp_spaces) node;
-	/*! First parking space */
-	int start;
-	/*! Last parking space */
-	int stop;
-};
-
-/*! Parking lot dialplan context space map */
-AST_LIST_HEAD_NOLOCK(parking_dp_space_map, parking_dp_spaces);
-
-/*! Parking lot context dialplan usage entry. */
-struct parking_dp_context {
-	/*! Next node in the parking lot contexts dialplan list. */
-	AST_LIST_ENTRY(parking_dp_context) node;
-	/*! Parking access extensions defined in this context. */
-	struct parking_dp_ramp_map access_extens;
-	/*! Parking spaces defined in this context. */
-	struct parking_dp_space_map spaces;
-	/*! Parking hints defined in this context. */
-	struct parking_dp_space_map hints;
-	/*! Parking lot context name */
-	char context[1];
-};
-
-/*! Parking lot dialplan usage map. */
-AST_LIST_HEAD_NOLOCK(parking_dp_map, parking_dp_context);
-
-/*!
- * \brief Description of one parked call, added to a list while active, then removed.
- * The list belongs to a parkinglot.
- */
-struct parkeduser {
-	struct ast_channel *chan;                   /*!< Parked channel */
-	struct timeval start;                       /*!< Time the park started */
-	int parkingnum;                             /*!< Parking lot space used */
-	char parkingexten[AST_MAX_EXTENSION];       /*!< If set beforehand, parking extension used for this call */
-	char context[AST_MAX_CONTEXT];              /*!< Where to go if our parking time expires */
-	char exten[AST_MAX_EXTENSION];
-	int priority;
-	unsigned int parkingtime;                   /*!< Maximum length in parking lot before return */
-	/*! Method to entertain the caller when parked: AST_CONTROL_RINGING, AST_CONTROL_HOLD, or 0(none) */
-	enum ast_control_frame_type hold_method;
-	unsigned int notquiteyet:1;
-	unsigned int options_specified:1;
-	char peername[AST_CHANNEL_NAME];
-	unsigned char moh_trys;
-	/*! Parking lot this entry belongs to.  Holds a parking lot reference. */
-	struct ast_parkinglot *parkinglot;
-	AST_LIST_ENTRY(parkeduser) list;
-};
-
-/*! Parking lot configuration options. */
-struct parkinglot_cfg {
-	/*! Music class used for parking */
-	char mohclass[MAX_MUSICCLASS];
-	/*! Extension to park calls in this parking lot. */
-	char parkext[AST_MAX_EXTENSION];
-	/*! Context for which parking is made accessible */
-	char parking_con[AST_MAX_CONTEXT];
-	/*! Context that timed-out parked calls are called back on when comebacktoorigin=no */
-	char comebackcontext[AST_MAX_CONTEXT];
-	/*! First available extension for parking */
-	int parking_start;
-	/*! Last available extension for parking */
-	int parking_stop;
-	/*! Default parking time in ms. */
-	unsigned int parkingtime;
-	/*!
-	 * \brief Enable DTMF based transfers on bridge when picking up parked calls.
-	 *
-	 * \details
-	 * none(0)
-	 * AST_FEATURE_FLAG_BYCALLEE
-	 * AST_FEATURE_FLAG_BYCALLER
-	 * AST_FEATURE_FLAG_BYBOTH
-	 */
-	int parkedcalltransfers;
-	/*!
-	 * \brief Enable DTMF based parking on bridge when picking up parked calls.
-	 *
-	 * \details
-	 * none(0)
-	 * AST_FEATURE_FLAG_BYCALLEE
-	 * AST_FEATURE_FLAG_BYCALLER
-	 * AST_FEATURE_FLAG_BYBOTH
-	 */
-	int parkedcallreparking;
-	/*!
-	 * \brief Enable DTMF based hangup on a bridge when pickup up parked calls.
-	 *
-	 * \details
-	 * none(0)
-	 * AST_FEATURE_FLAG_BYCALLEE
-	 * AST_FEATURE_FLAG_BYCALLER
-	 * AST_FEATURE_FLAG_BYBOTH
-	 */
-	int parkedcallhangup;
-	/*!
-	 * \brief Enable DTMF based recording on a bridge when picking up parked calls.
-	 *
-	 * \details
-	 * none(0)
-	 * AST_FEATURE_FLAG_BYCALLEE
-	 * AST_FEATURE_FLAG_BYCALLER
-	 * AST_FEATURE_FLAG_BYBOTH
-	 */
-	int parkedcallrecording;
-
-	/*! Time in seconds to dial the device that parked a timedout parked call */
-	unsigned int comebackdialtime;
-	/*! TRUE if findslot is set to next */
-	unsigned int parkfindnext:1;
-	/*! TRUE if the parking lot is exclusively accessed by parkext */
-	unsigned int parkext_exclusive:1;
-	/*! Add parking hints automatically */
-	unsigned int parkaddhints:1;
-	/*! TRUE if configuration is invalid and the parking lot should not be used. */
-	unsigned int is_invalid:1;
-	/*! TRUE if a timed out parked call goes back to the parker */
-	unsigned int comebacktoorigin:1;
-};
-
-/*! \brief Structure for parking lots which are put in a container. */
-struct ast_parkinglot {
-	/*! Name of the parking lot. */
-	char name[AST_MAX_CONTEXT];
-	/*! Parking lot user configuration. */
-	struct parkinglot_cfg cfg;
-
-	/*! Parking space to start next park search. */
-	int next_parking_space;
-
-	/*! That which bears the_mark shall be deleted if parking lot empty! (Used during reloads.) */
-	unsigned int the_mark:1;
-	/*! TRUE if the parking lot is disabled. */
-	unsigned int disabled:1;
-
-	/*! List of active parkings in this parkinglot */
-	AST_LIST_HEAD(parkinglot_parklist, parkeduser) parkings;
-};
-
-/*! \brief The configured parking lots container. Always at least one  - the default parking lot */
-static struct ao2_container *parkinglots;
-
-/*! Force a config reload to reload regardless of config file timestamp. */
-#ifdef TEST_FRAMEWORK
-static int force_reload_load;
-#endif
-
-/*!
- * \brief Context for parking dialback to parker.
- * \note The need for the context is a KLUDGE.
- *
- * \todo Might be able to eliminate the parking_con_dial context
- * kludge by running app_dial directly in its own thread to
- * simulate a PBX.
- */
-static char parking_con_dial[] = "park-dial";
-
-/*! Ensure that features.conf reloads on one thread at a time. */
-AST_MUTEX_DEFINE_STATIC(features_reload_lock);
-
-static char *registrar = "features";		   /*!< Registrar for operations */
-
-/*! PARK_APP_NAME application arguments */
-AST_DEFINE_APP_ARGS_TYPE(park_app_args,
-	AST_APP_ARG(timeout);		/*!< Time in ms to remain in the parking lot. */
-	AST_APP_ARG(return_con);	/*!< Context to return parked call if timeout. */
-	AST_APP_ARG(return_ext);	/*!< Exten to return parked call if timeout. */
-	AST_APP_ARG(return_pri);	/*!< Priority to return parked call if timeout. */
-	AST_APP_ARG(options);		/*!< Parking option flags. */
-	AST_APP_ARG(pl_name);		/*!< Parking lot name to use if present. */
-	AST_APP_ARG(dummy);			/*!< Place to put any remaining args string. */
-	);
-
-static pthread_t parking_thread;
 struct ast_dial_features {
 	/*! Channel's feature flags. */
 	struct ast_flags my_features;
 	/*! Bridge peer's feature flags. */
 	struct ast_flags peer_features;
 };
-
-static struct ast_manager_event_blob *call_pickup_to_ami(struct stasis_message *message);
-
-STASIS_MESSAGE_TYPE_DEFN(
-	ast_call_pickup_type,
-	.to_ami = call_pickup_to_ami);
-
-
-#if defined(ATXFER_NULL_TECH)
-/*!
- * \internal
- * \brief Set the channel technology to the kill technology.
- *
- * \param chan Channel to change technology.
- *
- * \return Nothing
- */
-static void set_kill_chan_tech(struct ast_channel *chan)
-{
-	int idx;
-
-	ast_channel_lock(chan);
-
-	/* Hangup the channel's physical side */
-	if (ast_channel_tech(chan)->hangup) {
-		ast_channel_tech(chan)->hangup(chan);
-	}
-	if (ast_channel_tech_pvt(chan)) {
-		ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n",
-			ast_channel_name(chan));
-		ast_free(ast_channel_tech_pvt(chan));
-		ast_channel_tech_pvt_set(chan, NULL);
-	}
-
-	/* Install the kill technology and wake up anyone waiting on it. */
-	ast_channel_tech_set(chan, &ast_kill_tech);
-	for (idx = 0; idx < AST_MAX_FDS; ++idx) {
-		switch (idx) {
-		case AST_ALERT_FD:
-		case AST_TIMING_FD:
-		case AST_GENERATOR_FD:
-			/* Don't clear these fd's. */
-			break;
-		default:
-			ast_channel_set_fd(chan, idx, -1);
-			break;
-		}
-	}
-	ast_queue_frame(chan, &ast_null_frame);
-
-	ast_channel_unlock(chan);
-}
-#endif	/* defined(ATXFER_NULL_TECH) */
-
-#if defined(ATXFER_NULL_TECH)
-/*!
- * \internal
- * \brief Set the channel name to something unique.
- *
- * \param chan Channel to change name.
- *
- * \return Nothing
- */
-static void set_new_chan_name(struct ast_channel *chan)
-{
-	static int seq_num_last;
-	int seq_num;
-	int len;
-	char *chan_name;
-	char dummy[1];
-
-	/* Create the new channel name string. */
-	ast_channel_lock(chan);
-	seq_num = ast_atomic_fetchadd_int(&seq_num_last, +1);
-	len = snprintf(dummy, sizeof(dummy), "%s<XFER_%x>", ast_channel_name(chan), seq_num) + 1;
-	chan_name = ast_alloca(len);
-	snprintf(chan_name, len, "%s<XFER_%x>", ast_channel_name(chan), seq_num);
-	ast_channel_unlock(chan);
-
-	ast_change_name(chan, chan_name);
-}
-#endif	/* defined(ATXFER_NULL_TECH) */
 
 static void *dial_features_duplicate(void *data)
 {
@@ -655,9 +364,6 @@
 	return 0;
 }
 
-/* Forward declarations */
-static void parkinglot_unref(struct ast_parkinglot *parkinglot);
-
 struct ast_bridge_thread_obj
 {
 	struct ast_bridge_config bconfig;
@@ -667,98 +373,12 @@
 	unsigned int return_to_pbx:1;
 };
 
-static int parkinglot_hash_cb(const void *obj, const int flags)
-{
-	const struct ast_parkinglot *parkinglot = obj;
-
-	return ast_str_case_hash(parkinglot->name);
-}
-
-static int parkinglot_cmp_cb(void *obj, void *arg, int flags)
-{
-	struct ast_parkinglot *parkinglot = obj;
-	struct ast_parkinglot *parkinglot2 = arg;
-
-	return !strcasecmp(parkinglot->name, parkinglot2->name) ? CMP_MATCH | CMP_STOP : 0;
-}
-
-/*!
- * \brief store context, extension and priority
- * \param chan, context, ext, pri
- */
-static void set_c_e_p(struct ast_channel *chan, const char *context, const char *ext, int pri)
-{
-	ast_channel_context_set(chan, context);
-	ast_channel_exten_set(chan, ext);
-	ast_channel_priority_set(chan, pri);
-}
-
 static const struct ast_datastore_info channel_app_data_datastore = {
 	.type = "Channel appdata datastore",
 	.destroy = ast_free_ptr,
 };
 
-/*! \brief Notify metermaids that we've changed an extension */
-static void notify_metermaids(const char *exten, char *context, enum ast_device_state state)
-{
-	ast_debug(4, "Notification of state change to metermaids %s@%s\n to state '%s'",
-		exten, context, ast_devstate2str(state));
-
-	ast_devstate_changed(state, AST_DEVSTATE_CACHABLE, "park:%s@%s", exten, context);
-}
-
-/*! \brief metermaids callback from devicestate.c */
-static enum ast_device_state metermaidstate(const char *data)
-{
-	char *context;
-	char *exten;
-
-	context = ast_strdupa(data);
-
-	exten = strsep(&context, "@");
-	if (!context)
-		return AST_DEVICE_INVALID;
-
-	ast_debug(4, "Checking state of exten %s in context %s\n", exten, context);
-
-	if (!ast_exists_extension(NULL, context, exten, 1, NULL))
-		return AST_DEVICE_NOT_INUSE;
-
-	return AST_DEVICE_INUSE;
-}
-
-/*! Options to pass to park_call_full */
-enum ast_park_call_options {
-	/*! Provide ringing to the parked caller instead of music on hold */
-	AST_PARK_OPT_RINGING =   (1 << 0),
-	/*! Randomly choose a parking spot for the caller instead of choosing
-	 *  the first one that is available. */
-	AST_PARK_OPT_RANDOMIZE = (1 << 1),
-	/*! Do not announce the parking number */
-	AST_PARK_OPT_SILENCE = (1 << 2),
-};
-
-/*! Optional additional parking options when parking a call. */
-struct ast_park_call_args {
-	/*! How long to wait in the parking lot before the call gets sent back
-	 *  to the specified return extension (or a best guess at where it came
-	 *  from if not explicitly specified). */
-	int timeout;
-	/*! An output parameter to store the parking space where the parked caller
-	 *  was placed. */
-	int *extout;
-	const char *orig_chan_name;
-	const char *return_con;
-	const char *return_ext;
-	int return_pri;
-	uint32_t flags;
-	/*! Parked user that has already obtained a parking space */
-	struct parkeduser *pu;
-	/*! \brief Parkinglot to be parked in */
-	struct ast_parkinglot *parkinglot;
-};
-
-/*!
+/*
  * \internal
  * \brief Get the extension for a given builtin feature
  *
@@ -1462,472 +1082,6 @@
 	return res;
 }
 
-/*! \brief Output parking event to manager */
-static void post_manager_event(const char *s, struct parkeduser *pu)
-{
-	manager_event(EVENT_FLAG_CALL, s,
-		"Exten: %s\r\n"
-		"Channel: %s\r\n"
-		"Parkinglot: %s\r\n"
-		"CallerIDNum: %s\r\n"
-		"CallerIDName: %s\r\n"
-		"ConnectedLineNum: %s\r\n"
-		"ConnectedLineName: %s\r\n"
-		"UniqueID: %s\r\n",
-		pu->parkingexten,
-		ast_channel_name(pu->chan),
-		pu->parkinglot->name,
-		S_COR(ast_channel_caller(pu->chan)->id.number.valid, ast_channel_caller(pu->chan)->id.number.str, "<unknown>"),
-		S_COR(ast_channel_caller(pu->chan)->id.name.valid, ast_channel_caller(pu->chan)->id.name.str, "<unknown>"),
-		S_COR(ast_channel_connected(pu->chan)->id.number.valid, ast_channel_connected(pu->chan)->id.number.str, "<unknown>"),
-		S_COR(ast_channel_connected(pu->chan)->id.name.valid, ast_channel_connected(pu->chan)->id.name.str, "<unknown>"),
-		ast_channel_uniqueid(pu->chan)
-		);
-}
-
-static char *callback_dialoptions(struct ast_flags *features_callee, struct ast_flags *features_caller, char *options, size_t len)
-{
-	int i = 0;
-	enum {
-		OPT_CALLEE_REDIRECT   = 't',
-		OPT_CALLER_REDIRECT   = 'T',
-		OPT_CALLEE_AUTOMON    = 'w',
-		OPT_CALLER_AUTOMON    = 'W',
-		OPT_CALLEE_DISCONNECT = 'h',
-		OPT_CALLER_DISCONNECT = 'H',
-		OPT_CALLEE_PARKCALL   = 'k',
-		OPT_CALLER_PARKCALL   = 'K',
-	};
-
-	memset(options, 0, len);
-	if (ast_test_flag(features_caller, AST_FEATURE_REDIRECT) && i < len) {
-		options[i++] = OPT_CALLER_REDIRECT;
-	}
-	if (ast_test_flag(features_caller, AST_FEATURE_AUTOMON) && i < len) {
-		options[i++] = OPT_CALLER_AUTOMON;
-	}
-	if (ast_test_flag(features_caller, AST_FEATURE_DISCONNECT) && i < len) {
-		options[i++] = OPT_CALLER_DISCONNECT;
-	}
-	if (ast_test_flag(features_caller, AST_FEATURE_PARKCALL) && i < len) {
-		options[i++] = OPT_CALLER_PARKCALL;
-	}
-
-	if (ast_test_flag(features_callee, AST_FEATURE_REDIRECT) && i < len) {
-		options[i++] = OPT_CALLEE_REDIRECT;
-	}
-	if (ast_test_flag(features_callee, AST_FEATURE_AUTOMON) && i < len) {
-		options[i++] = OPT_CALLEE_AUTOMON;
-	}
-	if (ast_test_flag(features_callee, AST_FEATURE_DISCONNECT) && i < len) {
-		options[i++] = OPT_CALLEE_DISCONNECT;
-	}
-	if (ast_test_flag(features_callee, AST_FEATURE_PARKCALL) && i < len) {
-		options[i++] = OPT_CALLEE_PARKCALL;
-	}
-
-	return options;
-}
-
-/*!
- * \internal
- * \brief Run management on a parked call.
- *
- * \note The parkinglot parkings list is locked on entry.
- *
- * \retval TRUE if the parking completed.
- */
-static int manage_parked_call(struct parkeduser *pu, const struct pollfd *pfds, int nfds, struct pollfd **new_pfds, int *new_nfds, int *ms)
-{
-	struct ast_channel *chan = pu->chan;	/* shorthand */
-	int tms;        /* timeout for this item */
-	int x;          /* fd index in channel */
-
-	tms = ast_tvdiff_ms(ast_tvnow(), pu->start);
-	if (tms > pu->parkingtime) {
-		/*
-		 * Call has been parked too long.
-		 * Stop entertaining the caller.
-		 */
-		switch (pu->hold_method) {
-		case AST_CONTROL_HOLD:
-			ast_indicate(pu->chan, AST_CONTROL_UNHOLD);
-			break;
-		case AST_CONTROL_RINGING:
-			ast_indicate(pu->chan, -1);
-			break;
-		default:
-			break;
-		}
-		pu->hold_method = 0;
-
-		/* Get chan, exten from derived kludge */
-		if (pu->peername[0]) {
-			char *peername;
-			char *dash;
-			char *peername_flat; /* using something like DAHDI/52 for an extension name is NOT a good idea */
-			char parkingslot[AST_MAX_EXTENSION]; /* buffer for parkinglot slot number */
-			int i;
-
-			peername = ast_strdupa(pu->peername);
-			dash = strrchr(peername, '-');
-			if (dash) {
-				*dash = '\0';
-			}
-
-			peername_flat = ast_strdupa(peername);
-			for (i = 0; peername_flat[i]; i++) {
-				if (peername_flat[i] == '/') {
-					peername_flat[i] = '_';
-				}
-			}
-
-			if (!ast_context_find_or_create(NULL, NULL, parking_con_dial, registrar)) {
-				ast_log(LOG_ERROR,
-					"Parking dial context '%s' does not exist and unable to create\n",
-					parking_con_dial);
-			} else {
-				char returnexten[AST_MAX_EXTENSION];
-				char comebackdialtime[AST_MAX_EXTENSION];
-				struct ast_datastore *features_datastore;
-				struct ast_dial_features *dialfeatures;
-
-				if (!strncmp(peername, "Parked/", 7)) {
-					peername += 7;
-				}
-
-				ast_channel_lock(chan);
-				features_datastore = ast_channel_datastore_find(chan, &dial_features_info,
-					NULL);
-				if (features_datastore && (dialfeatures = features_datastore->data)) {
-					char buf[MAX_DIAL_FEATURE_OPTIONS] = {0,};
-
-					snprintf(returnexten, sizeof(returnexten), "%s,%u,%s", peername,
-						pu->parkinglot->cfg.comebackdialtime,
-						callback_dialoptions(&dialfeatures->peer_features,
-							&dialfeatures->my_features, buf, sizeof(buf)));
-				} else { /* Existing default */
-					ast_log(LOG_NOTICE, "Dial features not found on %s, using default!\n",
-						ast_channel_name(chan));
-					snprintf(returnexten, sizeof(returnexten), "%s,%u,t", peername,
-						pu->parkinglot->cfg.comebackdialtime);
-				}
-				ast_channel_unlock(chan);
-
-				snprintf(comebackdialtime, sizeof(comebackdialtime), "%u",
-						pu->parkinglot->cfg.comebackdialtime);
-				pbx_builtin_setvar_helper(chan, "COMEBACKDIALTIME", comebackdialtime);
-
-				pbx_builtin_setvar_helper(chan, "PARKER", peername);
-
-			}
-
-			snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum);
-			pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot);
-			pbx_builtin_setvar_helper(chan, "PARKEDLOT", pu->parkinglot->name);
-
-			if (pu->options_specified) {
-				/*
-				 * Park() was called with overriding return arguments, respect
-				 * those arguments.
-				 */
-				set_c_e_p(chan, pu->context, pu->exten, pu->priority);
-			} else if (pu->parkinglot->cfg.comebacktoorigin) {
-				set_c_e_p(chan, parking_con_dial, peername_flat, 1);
-			} else {
-				/* Handle fallback when extensions don't exist here since that logic was removed from pbx */
-				if (ast_exists_extension(chan, pu->parkinglot->cfg.comebackcontext, peername_flat, 1, NULL)) {
-					set_c_e_p(chan, pu->parkinglot->cfg.comebackcontext, peername_flat, 1);
-				} else if (ast_exists_extension(chan, pu->parkinglot->cfg.comebackcontext, "s", 1, NULL)) {
-					ast_verb(2, "Can not start %s at %s,%s,1. Using 's@%s' instead.\n", ast_channel_name(chan),
-						pu->parkinglot->cfg.comebackcontext, peername_flat, pu->parkinglot->cfg.comebackcontext);
-					set_c_e_p(chan, pu->parkinglot->cfg.comebackcontext, "s", 1);
-				} else {
-					ast_verb(2, "Can not start %s at %s,%s,1 and exten 's@%s' does not exist. Using 's at default'\n",
-						ast_channel_name(chan),
-						pu->parkinglot->cfg.comebackcontext, peername_flat,
-						pu->parkinglot->cfg.comebackcontext);
-					set_c_e_p(chan, "default", "s", 1);
-				}
-			}
-		} else {
-			/*
-			 * They've been waiting too long, send them back to where they
-			 * came.  Theoretically they should have their original
-			 * extensions and such, but we copy to be on the safe side.
-			 */
-			set_c_e_p(chan, pu->context, pu->exten, pu->priority);
-		}
-		post_manager_event("ParkedCallTimeOut", pu);
-
-		ast_verb(2, "Timeout for %s parked on %d (%s). Returning to %s,%s,%d\n",
-			ast_channel_name(pu->chan), pu->parkingnum, pu->parkinglot->name, ast_channel_context(pu->chan),
-			ast_channel_exten(pu->chan), ast_channel_priority(pu->chan));
-
-		/* Start up the PBX, or hang them up */
-		if (ast_pbx_start(chan))  {
-			ast_log(LOG_WARNING,
-				"Unable to restart the PBX for user on '%s', hanging them up...\n",
-				ast_channel_name(pu->chan));
-			ast_hangup(chan);
-		}
-
-		/* And take them out of the parking lot */
-		return 1;
-	}
-
-	/* still within parking time, process descriptors */
-	if (pfds) {
-		for (x = 0; x < AST_MAX_FDS; x++) {
-			struct ast_frame *f;
-			int y;
-
-			if (!ast_channel_fd_isset(chan, x)) {
-				continue;	/* nothing on this descriptor */
-			}
-
-			for (y = 0; y < nfds; y++) {
-				if (pfds[y].fd == ast_channel_fd(chan, x)) {

[... 1336 lines stripped ...]



More information about the asterisk-commits mailing list