[asterisk-commits] kmoore: branch kmoore/parking_unload r396858 - in /team/kmoore/parking_unload...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Aug 16 12:41:23 CDT 2013


Author: kmoore
Date: Fri Aug 16 12:41:20 2013
New Revision: 396858

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396858
Log:
Make the parking unloadability work a tad less ugly

Modified:
    team/kmoore/parking_unload/channels/chan_dahdi.c
    team/kmoore/parking_unload/channels/chan_skinny.c
    team/kmoore/parking_unload/channels/sig_analog.c
    team/kmoore/parking_unload/include/asterisk/parking.h
    team/kmoore/parking_unload/main/bridge.c
    team/kmoore/parking_unload/main/bridge_channel.c
    team/kmoore/parking_unload/main/parking.c
    team/kmoore/parking_unload/res/parking/parking_bridge_features.c
    team/kmoore/parking_unload/res/parking/res_parking.h
    team/kmoore/parking_unload/res/res_parking.c

Modified: team/kmoore/parking_unload/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/channels/chan_dahdi.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/channels/chan_dahdi.c (original)
+++ team/kmoore/parking_unload/channels/chan_dahdi.c Fri Aug 16 12:41:20 2013
@@ -9246,10 +9246,6 @@
 	int idx;
 	struct ast_format tmpfmt;
 	RAII_VAR(struct ast_features_pickup_config *, pickup_cfg, NULL, ao2_cleanup);
-	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-		ast_parking_get_bridge_features(),
-		ao2_cleanup);
-	int is_exten_parking;
 	const char *pickupexten;
 
 	ast_mutex_lock(&ss_thread_lock);
@@ -9563,6 +9559,8 @@
 		if (p->subs[SUB_THREEWAY].owner)
 			timeout = 999999;
 		while (len < AST_MAX_EXTENSION-1) {
+			int is_exten_parking = 0;
+
 			/* Read digit unless it's supposed to be immediate, in which case the
 			   only answer is 's' */
 			if (p->immediate)
@@ -9585,7 +9583,9 @@
 			} else {
 				tone_zone_play_tone(p->subs[idx].dfd, DAHDI_TONE_DIALTONE);
 			}
-			is_exten_parking = (parking_provider ? parking_provider->parking_is_exten_park(ast_channel_context(chan), exten) : 0);
+			if (ast_parking_provider_registered()) {
+				is_exten_parking = ast_parking_is_exten_park(ast_channel_context(chan), exten);
+			}
 			if (ast_exists_extension(chan, ast_channel_context(chan), exten, 1, p->cid_num) && !is_exten_parking) {
 				if (!res || !ast_matchmore_extension(chan, ast_channel_context(chan), exten, 1, p->cid_num)) {
 					if (getforward) {
@@ -9730,7 +9730,7 @@
 				ast_channel_lock(chan);
 				bridge_channel = ast_channel_get_bridge_channel(chan);
 				ast_channel_unlock(chan);
-				if (bridge_channel && !parking_provider->parking_blind_transfer_park(bridge_channel, ast_channel_context(chan), exten)) {
+				if (bridge_channel && !ast_parking_blind_transfer_park(bridge_channel, ast_channel_context(chan), exten)) {
 					ast_verb(3, "Parking call to '%s'\n", ast_channel_name(chan));
 				}
 				break;

Modified: team/kmoore/parking_unload/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/channels/chan_skinny.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/channels/chan_skinny.c (original)
+++ team/kmoore/parking_unload/channels/chan_skinny.c Fri Aug 16 12:41:20 2013
@@ -6409,14 +6409,11 @@
 		{
 		char extout[AST_MAX_EXTENSION];
 		char message[32];
-		RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-			ast_parking_get_bridge_features(),
-			ao2_cleanup);
 		RAII_VAR(struct ast_bridge_channel *, bridge_channel, NULL, ao2_cleanup);
 		SKINNY_DEBUG(DEBUG_PACKET, 3, "Received STIMULUS_CALLPARK from %s, inst %d, callref %d\n",
 			d->name, instance, callreference);
 
-		if (!parking_provider) {
+		if (!ast_parking_provider_registered()) {
 			transmit_displaynotify(d, "Call Park not available", 10);
 			break;
 		}
@@ -6432,7 +6429,7 @@
 				break;
 			}
 
-			if (!parking_provider->parking_park_call(bridge_channel, extout, sizeof(extout))) {
+			if (!ast_parking_park_call(bridge_channel, extout, sizeof(extout))) {
 				snprintf(message, sizeof(message), "Call Parked at: %s", extout);
 				transmit_displaynotify(d, message, 10);
 				break;
@@ -7159,14 +7156,11 @@
 		{
 		char extout[AST_MAX_EXTENSION];
 		char message[32];
-		RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-			ast_parking_get_bridge_features(),
-			ao2_cleanup);
 		RAII_VAR(struct ast_bridge_channel *, bridge_channel, NULL, ao2_cleanup);
 		SKINNY_DEBUG(DEBUG_PACKET, 3, "Received SOFTKEY_PARK from %s, inst %d, callref %d\n",
 			d->name, instance, callreference);
 
-		if (!parking_provider) {
+		if (!ast_parking_provider_registered()) {
 			transmit_displaynotify(d, "Call Park not available", 10);
 			break;
 		}
@@ -7184,7 +7178,7 @@
 				break;
 			}
 
-			if (!parking_provider->parking_park_call(bridge_channel, extout, sizeof(extout))) {
+			if (!ast_parking_park_call(bridge_channel, extout, sizeof(extout))) {
 				snprintf(message, sizeof(message), "Call Parked at: %s", extout);
 				transmit_displaynotify(d, message, 10);
 				break;

Modified: team/kmoore/parking_unload/channels/sig_analog.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/channels/sig_analog.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/channels/sig_analog.c (original)
+++ team/kmoore/parking_unload/channels/sig_analog.c Fri Aug 16 12:41:20 2013
@@ -1715,11 +1715,7 @@
 	int idx;
 	struct ast_callid *callid;
 	RAII_VAR(struct ast_features_pickup_config *, pickup_cfg, NULL, ao2_cleanup);
-	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-		ast_parking_get_bridge_features(),
-		ao2_cleanup);
 	const char *pickupexten;
-	int is_exten_parking;
 
 	analog_increase_ss_count();
 
@@ -2077,6 +2073,8 @@
 			timeout = 999999;
 		}
 		while (len < AST_MAX_EXTENSION-1) {
+			int is_exten_parking = 0;
+
 			/* Read digit unless it's supposed to be immediate, in which case the
 			   only answer is 's' */
 			if (p->immediate) {
@@ -2100,7 +2098,9 @@
 			} else {
 				analog_play_tone(p, idx, ANALOG_TONE_DIALTONE);
 			}
-			is_exten_parking = (parking_provider ? parking_provider->parking_is_exten_park(ast_channel_context(chan), exten) : 0);
+			if (ast_parking_provider_registered()) {
+				is_exten_parking = ast_parking_is_exten_park(ast_channel_context(chan), exten);
+			}
 			if (ast_exists_extension(chan, ast_channel_context(chan), exten, 1, p->cid_num) && !is_exten_parking) {
 				if (!res || !ast_matchmore_extension(chan, ast_channel_context(chan), exten, 1, p->cid_num)) {
 					if (getforward) {
@@ -2253,7 +2253,7 @@
 				ast_channel_lock(chan);
 				bridge_channel = ast_channel_get_bridge_channel(chan);
 				ast_channel_unlock(chan);
-				if (bridge_channel && !parking_provider->parking_blind_transfer_park(bridge_channel, ast_channel_context(chan), exten)) {
+				if (bridge_channel && !ast_parking_blind_transfer_park(bridge_channel, ast_channel_context(chan), exten)) {
 					ast_verb(3, "Parking call to '%s'\n", ast_channel_name(chan));
 				}
 				ao2_ref(bridge_channel, -1);

Modified: team/kmoore/parking_unload/include/asterisk/parking.h
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/include/asterisk/parking.h?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/include/asterisk/parking.h (original)
+++ team/kmoore/parking_unload/include/asterisk/parking.h Fri Aug 16 12:41:20 2013
@@ -188,25 +188,64 @@
 	 * \retval non-zero on error
 	 */
 	int (* parking_park_bridge_channel)(struct ast_bridge_channel *parkee, const char *parkee_uuid, const char *parker_uuid, const char *app_data);
-
-	/*!
-	 * \brief Let the parking provider know it is being used.
-	 */
-	void (* parking_ref)(void);
-
-	/*!
-	 * \brief Let the parking provider know it is done being used.
-	 */
-	void (* parking_unref)(void);
 };
 
 /*!
- * \brief Obtain the current parking provider
- *
- * \retval NULL if no provider exists
- * \retval an ao2 ref counted object of the existing provider's function table
- */
-struct ast_parking_bridge_feature_fn_table *ast_parking_get_bridge_features(void);
+ * \brief Determine if the context/exten is a "parking" extension
+ *
+ * \retval 0 if the extension is not a parking extension
+ * \retval 1 if the extension is a parking extension
+ */
+int ast_parking_is_exten_park(const char *context, const char *exten);
+
+/*!
+ * \brief Park the bridge and/or callers that this channel is in
+ *
+ * \param parker The bridge_channel parking the bridge
+ * \param exten Optional. The extension the channel or bridge was parked at if the
+ * call succeeds.
+ * \param length Optional. If \c exten is specified, the size of the buffer.
+ *
+ * \note This is safe to be called outside of the \ref AstBridging Bridging API.
+ *
+ * \retval 0 on success
+ * \retval non-zero on error
+ */
+int ast_parking_park_call(struct ast_bridge_channel *parker, char *exten, size_t length);
+
+/*!
+ * \brief Perform a blind transfer to a parking extension.
+ *
+ * \param parker The \ref bridge_channel object that is initiating the parking
+ * \param context The context to blind transfer to
+ * \param exten The extension to blind transfer to
+ *
+ * \note If the bridge \ref parker is in has more than one other occupant, the entire
+ * bridge will be parked using a Local channel
+ *
+ * \note This is safe to be called outside of the \ref AstBridging Bridging API.
+ *
+ * \retval 0 on success
+ * \retval non-zero on error
+ */
+int ast_parking_blind_transfer_park(struct ast_bridge_channel *parker, const char *context, const char *exten);
+
+/*!
+ * \brief Perform a direct park on a channel in a bridge.
+ *
+ * \param parkee The channel in the bridge to be parked.
+ * \param parkee_uuid The UUID of the channel being packed.
+ * \param parker_uuid The UUID of the channel performing the park.
+ * \param app_data Data to pass to the Park application
+ *
+ * \note This must be called within the context of the \ref AstBridging Bridging API.
+ * External entities should not call this method directly, but should instead use
+ * the direct call parking method or the blind transfer method.
+ *
+ * \retval 0 on success
+ * \retval non-zero on error
+ */
+int ast_parking_park_bridge_channel(struct ast_bridge_channel *parkee, const char *parkee_uuid, const char *parker_uuid, const char *app_data);
 
 /*!
  * \brief Register a parking provider
@@ -227,3 +266,11 @@
  * \retval -1 on error
  */
 int ast_parking_unregister_bridge_features(const char *module_name);
+
+/*!
+ * \brief Check whether a parking provider is registered
+ *
+ * \retval 0 if there is no parking provider regsistered
+ * \retval 1 if there is a parking provider regsistered
+ */
+int ast_parking_provider_registered(void);

Modified: team/kmoore/parking_unload/main/bridge.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/main/bridge.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/main/bridge.c (original)
+++ team/kmoore/parking_unload/main/bridge.c Fri Aug 16 12:41:20 2013
@@ -3819,11 +3819,8 @@
 static enum ast_transfer_result try_parking(struct ast_channel *transferer, const char *context, const char *exten)
 {
 	RAII_VAR(struct ast_bridge_channel *, transferer_bridge_channel, NULL, ao2_cleanup);
-	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-		ast_parking_get_bridge_features(),
-		ao2_cleanup);
-
-	if (!parking_provider) {
+
+	if (!ast_parking_provider_registered()) {
 		return AST_BRIDGE_TRANSFER_FAIL;
 	}
 
@@ -3835,7 +3832,7 @@
 		return AST_BRIDGE_TRANSFER_FAIL;
 	}
 
-	if (parking_provider->parking_blind_transfer_park(transferer_bridge_channel,
+	if (ast_parking_blind_transfer_park(transferer_bridge_channel,
 		context, exten)) {
 		return AST_BRIDGE_TRANSFER_FAIL;
 	}

Modified: team/kmoore/parking_unload/main/bridge_channel.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/main/bridge_channel.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/main/bridge_channel.c (original)
+++ team/kmoore/parking_unload/main/bridge_channel.c Fri Aug 16 12:41:20 2013
@@ -757,17 +757,13 @@
  */
 static void bridge_channel_park(struct ast_bridge_channel *bridge_channel, struct bridge_park *payload)
 {
-	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, parking_provider,
-		ast_parking_get_bridge_features(),
-		ao2_cleanup);
-
-	if (!parking_provider) {
+	if (!ast_parking_provider_registered()) {
 		ast_log(AST_LOG_WARNING, "Unable to park %s: No parking provider loaded!\n",
 			ast_channel_name(bridge_channel->chan));
 		return;
 	}
 
-	if (parking_provider->parking_park_bridge_channel(bridge_channel, payload->parkee_uuid,
+	if (ast_parking_park_bridge_channel(bridge_channel, payload->parkee_uuid,
 		&payload->parkee_uuid[payload->parker_uuid_offset],
 		payload->app_data_offset ? &payload->parkee_uuid[payload->app_data_offset] : NULL)) {
 		ast_log(AST_LOG_WARNING, "Error occurred while parking %s\n",

Modified: team/kmoore/parking_unload/main/parking.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/main/parking.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/main/parking.c (original)
+++ team/kmoore/parking_unload/main/parking.c Fri Aug 16 12:41:20 2013
@@ -124,41 +124,52 @@
 	return payload;
 }
 
-struct parking_provider_wrapper {
-	/*! \brief The actual table that gets accessed */
-	struct ast_parking_bridge_feature_fn_table fn_table;
-	/*! \brief The pointer to the global object from which this table was created */
-	struct ast_parking_bridge_feature_fn_table *global;
-};
-
-static void provider_wrapper_dtor(void *obj)
-{
-	struct parking_provider_wrapper *wrapper = obj;
-	if (wrapper->fn_table.parking_unref) {
-		wrapper->fn_table.parking_unref();
-	}
-	ao2_cleanup(wrapper->global);
-	wrapper->global = NULL;
-}
-
-struct ast_parking_bridge_feature_fn_table *ast_parking_get_bridge_features(void)
-{
-	RAII_VAR(struct parking_provider_wrapper *, wrapper, ao2_alloc(sizeof(*wrapper), provider_wrapper_dtor), ao2_cleanup);
-	if (!wrapper) {
-		return NULL;
-	}
-
-	wrapper->global = ao2_global_obj_ref(parking_provider);
-	if (!wrapper->global) {
-		return NULL;
-	}
-
-	wrapper->fn_table = *wrapper->global;
-	if (wrapper->fn_table.parking_ref) {
-		wrapper->fn_table.parking_ref();
-	}
-	ao2_ref(wrapper, +1);
-	return (struct ast_parking_bridge_feature_fn_table *)wrapper;
+int ast_parking_park_bridge_channel(struct ast_bridge_channel *parkee, const char *parkee_uuid, const char *parker_uuid, const char *app_data)
+{
+	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, table,
+		ao2_global_obj_ref(parking_provider), ao2_cleanup);
+	
+	if (!table || !table->parking_park_bridge_channel) {
+		return -1;
+	}
+
+	return table->parking_park_bridge_channel(parkee, parkee_uuid, parker_uuid, app_data);
+}
+
+int ast_parking_blind_transfer_park(struct ast_bridge_channel *parker, const char *context, const char *exten)
+{
+	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, table,
+		ao2_global_obj_ref(parking_provider), ao2_cleanup);
+	
+	if (!table || !table->parking_blind_transfer_park) {
+		return -1;
+	}
+
+	return table->parking_blind_transfer_park(parker, context, exten);
+}
+
+int ast_parking_park_call(struct ast_bridge_channel *parker, char *exten, size_t length)
+{
+	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, table,
+		ao2_global_obj_ref(parking_provider), ao2_cleanup);
+	
+	if (!table || !table->parking_park_call) {
+		return -1;
+	}
+
+	return table->parking_park_call(parker, exten, length);
+}
+
+int ast_parking_is_exten_park(const char *context, const char *exten)
+{
+	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, table,
+		ao2_global_obj_ref(parking_provider), ao2_cleanup);
+	
+	if (!table || !table->parking_is_exten_park) {
+		return -1;
+	}
+
+	return table->parking_is_exten_park(context, exten);
 }
 
 int ast_parking_register_bridge_features(struct ast_parking_bridge_feature_fn_table *fn_table)
@@ -206,3 +217,11 @@
 	ao2_global_obj_replace_unref(parking_provider, NULL);
 	return 0;
 }
+
+int ast_parking_provider_registered(void)
+{
+	RAII_VAR(struct ast_parking_bridge_feature_fn_table *, table,
+		ao2_global_obj_ref(parking_provider), ao2_cleanup);
+	
+	return !!table;
+}

Modified: team/kmoore/parking_unload/res/parking/parking_bridge_features.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/parking/parking_bridge_features.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/res/parking/parking_bridge_features.c (original)
+++ team/kmoore/parking_unload/res/parking/parking_bridge_features.c Fri Aug 16 12:41:20 2013
@@ -40,6 +40,7 @@
 #include "asterisk/say.h"
 #include "asterisk/datastore.h"
 #include "asterisk/stasis.h"
+#include "asterisk/module.h"
 #include "asterisk/core_local.h"
 
 struct parked_subscription_datastore {
@@ -237,6 +238,7 @@
 	struct ast_exten *exten_obj;
 	struct pbx_find_info info = { .stacklen = 0 }; /* the rest is reset in pbx_find_extension */
 	const char *app_at_exten;
+	SCOPED_MODULE_USE(parking_get_module());
 
 	ast_debug(4, "Checking if %s@%s is a parking exten\n", exten, context);
 	exten_obj = pbx_find_extension(NULL, NULL, &info, context, exten, 1, NULL, NULL, E_MATCH);
@@ -274,6 +276,7 @@
 {
 	RAII_VAR(struct ast_bridge_channel *, other, NULL, ao2_cleanup);
 	int peer_count;
+	SCOPED_MODULE_USE(parking_get_module());
 
 	if (ast_strlen_zero(context) || ast_strlen_zero(exten)) {
 		return -1;
@@ -350,6 +353,7 @@
 	RAII_VAR(struct ast_bridge *, parking_bridge, NULL, ao2_cleanup);
 	RAII_VAR(struct ast_bridge *, original_bridge, NULL, ao2_cleanup);
 	RAII_VAR(struct ast_channel *, parker, NULL, ao2_cleanup);
+	SCOPED_MODULE_USE(parking_get_module());
 
 	if (strcmp(ast_channel_uniqueid(bridge_channel->chan), uuid_parkee)) {
 		/* We aren't the parkee, so ignore this action. */
@@ -414,6 +418,7 @@
 {
 	RAII_VAR(struct parking_lot *, lot, NULL, ao2_cleanup);
 	const char *lot_name = NULL;
+	SCOPED_MODULE_USE(parking_get_module());
 
 	ast_channel_lock(parker->chan);
 	lot_name = find_channel_parking_lot_name(parker->chan);
@@ -442,10 +447,9 @@
 static int feature_park_call(struct ast_bridge_channel *bridge_channel, void *hook_pvt)
 {
 	int res;
-
-	parking_ref();
+	SCOPED_MODULE_USE(parking_get_module());
+
 	res = parking_park_call(bridge_channel, NULL, 0);
-	parking_unref();
 
 	return res;
 }
@@ -616,8 +620,6 @@
 	.parking_blind_transfer_park = parking_blind_transfer_park,
 	.parking_park_bridge_channel = parking_park_bridge_channel,
 	.parking_park_call = parking_park_call,
-	.parking_ref = parking_ref,
-	.parking_unref = parking_unref,
 };
 
 void unload_parking_bridge_features(void)

Modified: team/kmoore/parking_unload/res/parking/res_parking.h
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/parking/res_parking.h?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/res/parking/res_parking.h (original)
+++ team/kmoore/parking_unload/res/parking/res_parking.h Fri Aug 16 12:41:20 2013
@@ -554,12 +554,8 @@
 
 /*!
  * \since 12.0.0
- * \brief Increment res_parking's use count
- */
-void parking_ref(void);
-
-/*!
- * \since 12.0.0
- * \brief Decrement res_parking's use count
- */
-void parking_unref(void);
+ * \brief Get res_parking's module for module ref counting purposes
+ *
+ * \retval res_parking's ast_module
+ */
+struct ast_module *parking_get_module(void);

Modified: team/kmoore/parking_unload/res/res_parking.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/parking_unload/res/res_parking.c?view=diff&rev=396858&r1=396857&r2=396858
==============================================================================
--- team/kmoore/parking_unload/res/res_parking.c (original)
+++ team/kmoore/parking_unload/res/res_parking.c Fri Aug 16 12:41:20 2013
@@ -33,6 +33,9 @@
 		<configFile name="res_parking.conf">
 			<configObject name="globals">
 				<synopsis>Options that apply to every parking lot</synopsis>
+				<configOption name="parkeddynamic">
+					<synopsis>Enables dynamically created parkinglots.</synopsis>
+				</configOption>
 			</configObject>
 			<configObject name="parking_lot">
 				<synopsis>Defined parking lots for res_parking to use to park calls on</synopsis>
@@ -1152,14 +1155,9 @@
 	disable_marked_lots();
 }
 
-void parking_ref(void)
-{
-	ast_module_ref(ast_module_info->self);
-}
-
-void parking_unref(void)
-{
-	ast_module_unref(ast_module_info->self);
+struct ast_module *parking_get_module(void)
+{
+	return ast_module_info->self;
 }
 
 static int unload_module(void)




More information about the asterisk-commits mailing list