[asterisk-commits] jrose: branch jrose/bridge_projects r383912 - in /team/jrose/bridge_projects:...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Mar 26 11:25:07 CDT 2013
Author: jrose
Date: Tue Mar 26 11:25:04 2013
New Revision: 383912
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383912
Log:
More docs, AMI + stasis stuff restored, ParkedCallGiveUp, and others.
Added:
team/jrose/bridge_projects/configs/res_parking.conf.sample (with props)
Modified:
team/jrose/bridge_projects/CHANGES
team/jrose/bridge_projects/include/asterisk/_private.h
team/jrose/bridge_projects/res/parking/parking_applications.c
team/jrose/bridge_projects/res/parking/parking_controller.c
team/jrose/bridge_projects/res/parking/parking_manager.c
team/jrose/bridge_projects/res/parking/res_parking.h
Modified: team/jrose/bridge_projects/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/CHANGES?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/CHANGES (original)
+++ team/jrose/bridge_projects/CHANGES Tue Mar 26 11:25:04 2013
@@ -145,6 +145,13 @@
* PARKING_SPACE and PARKEDLOT channel variables will now be set for a parked
channel even when comebactoorigin=yes
+
+ * New CLI command 'parking show' allows you to inspect the currently in use
+ parking lots. 'parking show <parkinglot>' will also show the parked calls
+ in that specific parking lot.
+
+ * The CLI command 'parkedcalls' is now deprecated in favor of
+ 'parking show <parkinglot>'.
Queue
-------------------
Added: team/jrose/bridge_projects/configs/res_parking.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/configs/res_parking.conf.sample?view=auto&rev=383912
==============================================================================
--- team/jrose/bridge_projects/configs/res_parking.conf.sample (added)
+++ team/jrose/bridge_projects/configs/res_parking.conf.sample Tue Mar 26 11:25:04 2013
@@ -1,0 +1,48 @@
+[general]
+;parkeddynamic = yes ; Enables dynamically created parkinglots. (default is no)
+
+
+; A parking lot named 'default' will automatically be used when no other
+; named parking lot is indicated for use by the park application or a
+; channel's parkinglot function and PARKINGLOT channel variable.
+
+[default] ; based on the old default from features.conf.sample
+parkext => 700
+;parket_exclusive=yes
+parkpos => 701-720
+context => parkedcalls
+;parkinghints = no
+;parkingtime => 45
+;comebacktoorigin = yes
+;comebackdialtime = 30
+;comebackcontext = parkedcallstimeout
+;courtesytone = beep
+;parkedplay = caller
+;parkedcalltransfers = caller
+;parkedcallreparking = caller
+;parkedcallhangup = caller
+;findslot => next
+;parkedmusicclass = default
+
+; Parking lots can now be any named configuration category aside from
+; 'general' which is reserved for general options.
+;
+; You can set parkinglot with the CHANNEL dialplan function or by setting
+; 'parkinglot' directly in the channel configuration file.
+;
+; (Note: Leading '0's and any non-numerical characters on parkpos
+; extensions will be ignored. Parkext on the other hand can be any string.)
+;
+;[edvina2]
+;context => edvina2_park
+;parkpos => 800-850
+;findslot => next
+;comebacktoorigin = no
+;comebackdialtime = 90
+;comebackcontext = edvina2_park-timeout
+;parkedmusicclass = edvina
+;
+; Since edvina2 doesn't define parkext, extensions won't automatically be
+; created for parking to it or for retrieving calls from it. These can be
+; created manually in the dial plan by using the Park and ParkedCall
+; applications.
Propchange: team/jrose/bridge_projects/configs/res_parking.conf.sample
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/jrose/bridge_projects/configs/res_parking.conf.sample
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/jrose/bridge_projects/configs/res_parking.conf.sample
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/jrose/bridge_projects/include/asterisk/_private.h
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/include/asterisk/_private.h?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/include/asterisk/_private.h (original)
+++ team/jrose/bridge_projects/include/asterisk/_private.h Tue Mar 26 11:25:04 2013
@@ -23,7 +23,6 @@
int ast_term_init(void); /*!< Provided by term.c */
int astdb_init(void); /*!< Provided by db.c */
void ast_channels_init(void); /*!< Provided by channel.c */
-void ast_parking_init(void); /*!< Provided by parking.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 */
Modified: team/jrose/bridge_projects/res/parking/parking_applications.c
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/res/parking/parking_applications.c?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/res/parking/parking_applications.c (original)
+++ team/jrose/bridge_projects/res/parking/parking_applications.c Tue Mar 26 11:25:04 2013
@@ -216,11 +216,16 @@
/* Alright, now wait in the holding bridge until we get removed from it for some reason. */
reset_parked_time(pu);
ast_bridge_join(parking_bridge, chan, NULL, &chan_features, NULL, 0);
- /* XXX After this, depending on the conditions of exit we might want to return early. But that comes later. */
-
+
+ /* At this point the channel is no longer in the bridge. Start breaking things down. */
ast_bridge_features_cleanup(&chan_features);
- /* Remove the parked user from the parking lot if it is still in */
+ /* If the parked channel exits without a resolution set, it gave up. Issue a ParkedCallGiveUp message. */
+ if (pu->resolution == PARK_UNSET) {
+ pu->resolution = PARK_ABANDON;
+ publish_parked_call(pu, PARKED_CALL_GIVEUP);
+ }
+
unpark_parked_user(pu);
/* Figure out if we need to go somewhere special now that the timeout has occured */
Modified: team/jrose/bridge_projects/res/parking/parking_controller.c
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/res/parking/parking_controller.c?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/res/parking/parking_controller.c (original)
+++ team/jrose/bridge_projects/res/parking/parking_controller.c Tue Mar 26 11:25:04 2013
@@ -80,6 +80,22 @@
static int parking_duration_callback(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, void *hook_pvt)
{
struct parked_user *user = hook_pvt;
+ struct ast_channel *chan = user->chan;
+ char *peername;
+ char *dash;
+ char parking_space[AST_MAX_EXTENSION];
+
+ /* We are still in the bridge, so it's possible for other stuff to mess with the parked call before we leave the bridge
+ to deal with this, lock the parked user, check and set resolution. */
+ ao2_lock(user);
+ if (user->resolution != PARK_UNSET) {
+ /* Abandon timeout since something else has resolved the parked user before we got to it. */
+ ao2_unlock(user);
+ return 0;
+ }
+
+ user->resolution = PARK_TIMEOUT;
+ ao2_unlock(user);
ao2_lock(bridge_channel);
switch (bridge_channel->state) {
@@ -91,11 +107,21 @@
}
ao2_unlock(bridge_channel);
- /* Replace this with a more relevant event */
- ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s", ast_channel_name(bridge_channel->chan));
+ /* Set parking timeout channel variables */
+ snprintf(parking_space, sizeof(parking_space), "%d", user->parking_space);
+ pbx_builtin_setvar_helper(chan, "PARKING_SPACE", parking_space);
+ pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parking_space); /* Deprecated version of PARKING_SPACE */
+ pbx_builtin_setvar_helper(chan, "PARKEDLOT", user->lot_state->name);
+
+ peername = ast_strdupa(user->parker->name);
+ dash = strrchr(peername, '-');
+ if (dash) {
+ *dash = '\0';
+ }
+
+ pbx_builtin_setvar_helper(chan, "PARKER", peername);
/* Set the resolution for the user to timeout */
- user->resolution = PARK_TIMEOUT;
publish_parked_call(user, PARKED_CALL_TIMEOUT);
return -1;
@@ -256,12 +282,14 @@
if (ast_exists_extension(chan, lot_state->comebackcontext, peername, 1, NULL)) {
set_c_e_p(chan, lot_state->comebackcontext, peername, 1);
+ return 0;
}
if (ast_exists_extension(chan, lot_state->comebackcontext, "s", 1, NULL)) {
ast_verb(2, "Could not start %s at %s,%s,1. Using 's@%s' instead.\n", ast_channel_name(chan),
lot_state->comebackcontext, peername, lot_state->comebackcontext);
set_c_e_p(chan, lot_state->comebackcontext, "s", 1);
+ return 0;
}
ast_verb(2, "Can not start %s at %s,%s,1 and exten 's@%s' does not exist. Using 's at default'\n",
Modified: team/jrose/bridge_projects/res/parking/parking_manager.c
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/res/parking/parking_manager.c?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/res/parking/parking_manager.c (original)
+++ team/jrose/bridge_projects/res/parking/parking_manager.c Tue Mar 26 11:25:04 2013
@@ -69,6 +69,9 @@
/*! \brief Topic for parking lots */
static struct stasis_topic *parking_topic;
+/*! \brief subscription to the parking lot topic */
+static struct stasis_subscription *parking_sub;
+
/*!
* \brief A parked call message payload
* \since 12
@@ -95,6 +98,7 @@
ast_string_field_free_memory(park_obj);
}
+/*! \brief Constructor for parked_call_payload objects */
static struct parked_call_payload *parked_call_payload_create(struct parked_user *pu, enum parked_call_event_type event_type)
{
struct parked_call_payload *payload;
@@ -139,7 +143,8 @@
return payload;
}
-static struct ast_str *manager_build_parkedcall_string(const struct parked_call_payload *payload)
+/*! \brief Builds a manager string based on the contents of a parked call payload */
+static struct ast_str *manager_build_parked_call_string(const struct parked_call_payload *payload)
{
struct ast_str *out = ast_str_create(1024);
int res = 0;
@@ -203,16 +208,16 @@
iter_users = ao2_iterator_init(curlot->parked_user_list, 0);
while ((curuser = ao2_iterator_next(&iter_users))) {
RAII_VAR(struct parked_call_payload *, payload, NULL, ao2_cleanup);
- RAII_VAR(struct ast_str *, parkedcall_string, NULL, ast_free);
+ RAII_VAR(struct ast_str *, parked_call_string, NULL, ast_free);
payload = parked_call_payload_create(curuser, PARKED_CALL);
- parkedcall_string = manager_build_parkedcall_string(payload);
+ parked_call_string = manager_build_parked_call_string(payload);
total++;
astman_append(s, "Event: ParkedCall\r\n"
"%s" /* The parked call string */
"%s" /* The action ID */
"\r\n",
- ast_str_buffer(parkedcall_string),
+ ast_str_buffer(parked_call_string),
id_text);
ao2_ref(curuser, -1);
@@ -295,12 +300,49 @@
}
if (pu->chan) {
- stasis_publish(ast_channel_topic(pu->chan), msg);
+ stasis_publish(parking_topic, msg);
+ }
+}
+
+static void parked_call_message_response(struct parked_call_payload *parked_call)
+{
+ char *event_type;
+ RAII_VAR(struct ast_str *, parked_call_string, NULL, ast_free);
+
+ switch (parked_call->event_type) {
+ case PARKED_CALL:
+ event_type = "ParkedCall";
+ break;
+ case PARKED_CALL_TIMEOUT:
+ event_type = "ParkedCallTimeOut";
+ break;
+ case PARKED_CALL_GIVEUP:
+ event_type = "ParkedCallGiveUp";
+ break;
+ case PARKED_CALL_UNPARKED:
+ event_type = "UnParkedCall";
+ break;
+ }
+
+ parked_call_string = manager_build_parked_call_string(parked_call);
+
+ manager_event(EVENT_FLAG_DIALPLAN, event_type,
+ "%s",
+ ast_str_buffer(parked_call_string)
+ );
+}
+
+static void parking_event_cb(void *data, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *message)
+{
+ if (stasis_message_type(message) == parked_call_message_type) {
+ struct parked_call_payload *parked_call_message = stasis_message_data(message);
+ parked_call_message_response(parked_call_message);
}
}
static void parking_manager_disable_stasis(void)
{
+ parking_sub = stasis_unsubscribe(parking_sub);
ao2_cleanup(parked_call_message_type);
ao2_cleanup(parking_topic);
parked_call_message_type = NULL;
@@ -317,6 +359,10 @@
parked_call_message_type = stasis_message_type_create("parked_call");
parking_topic = stasis_topic_create("ast_parking_topic");
+ if (!parking_sub) {
+ parking_sub = stasis_subscribe(parking_topic, parking_event_cb, NULL);
+ }
+
return res ? -1 : 0;
}
Modified: team/jrose/bridge_projects/res/parking/res_parking.h
URL: http://svnview.digium.com/svn/asterisk/team/jrose/bridge_projects/res/parking/res_parking.h?view=diff&rev=383912&r1=383911&r2=383912
==============================================================================
--- team/jrose/bridge_projects/res/parking/res_parking.h (original)
+++ team/jrose/bridge_projects/res/parking/res_parking.h Tue Mar 26 11:25:04 2013
@@ -143,7 +143,7 @@
char exten[AST_MAX_CONTEXT]; /*!< Where to go on parking timeout (extension) */
unsigned int time_limit; /*!< How long this specific channel may remain in the parking lot before timing out */
struct parking_lot_state *lot_state; /*!< Which parking lot the user is parked to */
- enum park_call_resolution resolution; /*!< How did the parking session end? */
+ enum park_call_resolution resolution; /*!< How did the parking session end? If the call is in a bridge, lock parked_user before checking/setting */
};
/*!
More information about the asterisk-commits
mailing list