[asterisk-commits] rmudgett: branch rmudgett/parking r331573 - /team/rmudgett/parking/main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Aug 10 20:00:48 CDT 2011


Author: rmudgett
Date: Wed Aug 10 20:00:45 2011
New Revision: 331573

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=331573
Log:
* Address ASTERISK-15729 by juggling the return codes returned when DTMF
atxfer, DTMF blind transfer, and DTMF one-touch-parking are invoked by the
originating channel.

* Fix when pbx-parkingfailed is played that the other channel is put in
autoservice if it exists.

Modified:
    team/rmudgett/parking/main/features.c

Modified: team/rmudgett/parking/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/parking/main/features.c?view=diff&rev=331573&r1=331572&r2=331573
==============================================================================
--- team/rmudgett/parking/main/features.c (original)
+++ team/rmudgett/parking/main/features.c Wed Aug 10 20:00:45 2011
@@ -757,6 +757,7 @@
 static struct ast_parkinglot *create_parkinglot(const char *name);
 static struct ast_parkinglot *copy_parkinglot(const char *name, const struct ast_parkinglot *parkinglot);
 static int parkinglot_activate(struct ast_parkinglot *parkinglot);
+static int play_message_on_chan(struct ast_channel *play_to, struct ast_channel *other, const char *msg, const char *audiofile);
 
 /*!
  * \internal
@@ -1286,7 +1287,6 @@
 		}
 
 		/* free parking extension linear search: O(n^2) */
-		//parking_space = -1;
 		for (i = start; ; i++) {
 			/* If we are past the end, wrap around to the first parking slot*/
 			if (i == parkinglot->cfg.parking_stop + 1) {
@@ -1525,6 +1525,13 @@
 /*!
  * \param rchan the real channel to be parked
  * \param peer the channel to have the parking read to.
+ * \param timeout is a timeout in milliseconds
+ * \param extout is a parameter to an int that will hold the parked location, or NULL if you want.
+ * \param play_announcement TRUE if to play which parking space call parked in to peer.
+ * \param args Optional additional parking options when parking a call.
+ *
+ * \retval 0 on success.
+ * \retval -1 on failure.
  */
 static int masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int timeout, int *extout, int play_announcement, struct ast_park_call_args *args)
 {
@@ -1542,20 +1549,28 @@
 		rchan->context, rchan->linkedid, rchan->amaflags, "Parked/%s", rchan->name);
 	if (!chan) {
 		ast_log(LOG_WARNING, "Unable to create parked channel\n");
-		if (peer) {
+		if (peer == rchan) {
+			/* Only have one channel to worry about. */
 			ast_stream_and_wait(peer, "pbx-parkingfailed", "");
-		}
-		return AST_FEATURE_RETURN_PARKFAILED;
+		} else if (peer) {
+			/* Have two different channels to worry about. */
+			play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed");
+		}
+		return -1;
 	}
 
 	args->pu = park_space_reserve(rchan, peer, args);
 	if (!args->pu) {
 		chan->hangupcause = AST_CAUSE_SWITCH_CONGESTION;
 		ast_hangup(chan);
-		if (peer) {
+		if (peer == rchan) {
+			/* Only have one channel to worry about. */
 			ast_stream_and_wait(peer, "pbx-parkingfailed", "");
-		}
-		return AST_FEATURE_RETURN_PARKFAILED;
+		} else if (peer) {
+			/* Have two different channels to worry about. */
+			play_message_on_chan(peer, rchan, "failure message", "pbx-parkingfailed");
+		}
+		return -1;
 	}
 
 	/* Make formats okay */
@@ -1590,10 +1605,19 @@
 
 int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int timeout, int *extout)
 {
-	return masq_park_call(rchan, peer, timeout, extout, 0, NULL) ? -1 : 0;
-}
-
-/* Park call via masqueraded channel and announce parking spot on peer channel. */
+	return masq_park_call(rchan, peer, timeout, extout, 0, NULL);
+}
+
+/*!
+ * \brief Park call via masqueraded channel and announce parking spot on peer channel.
+ *
+ * \param rchan the real channel to be parked
+ * \param peer the channel to have the parking read to.
+ * \param args Optional additional parking options when parking a call.
+ *
+ * \retval 0 on success.
+ * \retval -1 on failure.
+ */
 static int masq_park_call_announce(struct ast_channel *rchan, struct ast_channel *peer, struct ast_park_call_args *args)
 {
 	return masq_park_call(rchan, peer, 0, NULL, 1, args);
@@ -1616,9 +1640,9 @@
  *
  * \note Assumes park_me is on hold and in autoservice.
  *
- * \retval 0 on success.
+ * \retval -1 on successful park.
  * \retval -1 on park_me hangup.
- * \retval AST_FEATURE_RETURN_PARKFAILED on error.
+ * \retval AST_FEATURE_RETURN_SUCCESS on error to keep the bridge connected.
  */
 static int xfer_park_call_helper(struct ast_channel *park_me, struct ast_channel *parker, struct ast_exten *park_exten)
 {
@@ -1636,13 +1660,7 @@
 	parse = ast_strdupa(app_data);
 	AST_STANDARD_APP_ARGS(app_args, parse);
 
-	res = finishup(park_me);
-	if (res) {
-		/* Parkee hungup on us. */
-		return res;
-	}
-
-	/* Park the call */
+	/* Find the parking lot */
 	if (!ast_strlen_zero(app_args.pl_name)) {
 		pl_name = app_args.pl_name;
 	} else {
@@ -1656,17 +1674,26 @@
 		if (!args.parkinglot && parkeddynamic) {
 			args.parkinglot = create_dynamic_parkinglot(pl_name, park_me);
 		}
-
-	}
+	}
+
 	if (args.parkinglot) {
+		/* Park the call */
+		res = finishup(park_me);
+		if (res) {
+			/* park_me hungup on us. */
+			parkinglot_unref(args.parkinglot);
+			return -1;
+		}
 		res = masq_park_call_announce(park_me, parker, &args);
 		parkinglot_unref(args.parkinglot);
 	} else {
 		/* Parking failed because parking lot does not exist. */
-		res = AST_FEATURE_RETURN_PARKFAILED;
-	}
-
-	return res;
+		ast_stream_and_wait(parker, "pbx-parkingfailed", "");
+		finishup(park_me);
+		res = -1;
+	}
+
+	return res ? AST_FEATURE_RETURN_SUCCESS : -1;
 }
 
 /*!
@@ -1687,23 +1714,23 @@
 	}
 }
 
-/*! 
+/*!
  * \brief support routing for one touch call parking
  * \param chan channel parking call
  * \param peer channel to be parked
  * \param config unsed
  * \param code unused
  * \param sense feature options
- *
- * \param data
- * Setup channel, set return exten,priority to 's,1'
- * answer chan, sleep chan, park call
+ * \param data unused
+ *
+ * \retval -1 on successful park.
+ * \retval -1 on chan hangup.
+ * \retval AST_FEATURE_RETURN_SUCCESS on error to keep the bridge connected.
  */
 static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, const char *code, int sense, void *data)
 {
 	struct ast_channel *parker;
 	struct ast_channel *parkee;
-	int res;
 
 	/*
 	 * We used to set chan's exten and priority to "s" and 1 here,
@@ -1716,6 +1743,10 @@
 
 	/* Answer if call is not up */
 	if (chan->_state != AST_STATE_UP) {
+		/*
+		 * XXX Why are we doing this?  Both of the channels should be up
+		 * since you cannot do DTMF features unless you are bridged.
+		 */
 		if (ast_answer(chan)) {
 			return -1;
 		}
@@ -1728,10 +1759,8 @@
 
 	/* one direction used to call park_call.... */
 	set_peers(&parker, &parkee, peer, chan, sense);
-	res = masq_park_call_announce(parkee, parker, NULL);
-	/* PBX should hangup zombie channel if a masquerade actually occurred (res=0) */
-
-	return res;
+	return masq_park_call_announce(parkee, parker, NULL)
+		? AST_FEATURE_RETURN_SUCCESS : -1;
 }
 
 /*!
@@ -4758,6 +4787,7 @@
 		parkinglot_unref(args.parkinglot);
 	} else {
 		/* Parking failed because the parking lot does not exist. */
+		ast_stream_and_wait(chan, "pbx-parkingfailed", "");
 		res = -1;
 	}
 	if (res) {




More information about the asterisk-commits mailing list