diff options
author | zuul <zuul@gerrit.asterisk.org> | 2016-04-20 10:53:17 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-04-20 10:53:17 -0500 |
commit | cc9b72208f72f21022ff4f08384ef3316b5aa807 (patch) | |
tree | 2c5fb655f46c86220efd9f4341bfa81392d1b1bd /main | |
parent | 7bfa1784c1da20dad1fecb6f54d1e75218a783d3 (diff) | |
parent | 5e64d7e7a3ddc48a578e670cd8b719bb745cb195 (diff) |
Merge "Dial: Combine frame handling functions."
Diffstat (limited to 'main')
-rw-r--r-- | main/dial.c | 126 |
1 files changed, 52 insertions, 74 deletions
diff --git a/main/dial.c b/main/dial.c index 80247588d..fc66af5a7 100644 --- a/main/dial.c +++ b/main/dial.c @@ -583,13 +583,17 @@ static void set_state(struct ast_dial *dial, enum ast_dial_result state) dial->state_callback(dial); } -/*! \brief Helper function that handles control frames WITH owner */ +/*! \brief Helper function that handles frames */ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel, struct ast_frame *fr, struct ast_channel *chan) { if (fr->frametype == AST_FRAME_CONTROL) { switch (fr->subclass.integer) { case AST_CONTROL_ANSWER: - ast_verb(3, "%s answered %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); + if (chan) { + ast_verb(3, "%s answered %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); + } else { + ast_verb(3, "%s answered\n", ast_channel_name(channel->owner)); + } AST_LIST_LOCK(&dial->channels); AST_LIST_REMOVE(&dial->channels, channel, list); AST_LIST_INSERT_HEAD(&dial->channels, channel, list); @@ -613,28 +617,47 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel break; case AST_CONTROL_INCOMPLETE: ast_verb(3, "%s dialed Incomplete extension %s\n", ast_channel_name(channel->owner), ast_channel_exten(channel->owner)); - ast_indicate(chan, AST_CONTROL_INCOMPLETE); + if (chan) { + ast_indicate(chan, AST_CONTROL_INCOMPLETE); + } else { + ast_hangup(channel->owner); + channel->cause = AST_CAUSE_UNALLOCATED; + channel->owner = NULL; + } break; case AST_CONTROL_RINGING: ast_verb(3, "%s is ringing\n", ast_channel_name(channel->owner)); - if (!dial->options[AST_DIAL_OPTION_MUSIC]) + if (chan && !dial->options[AST_DIAL_OPTION_MUSIC]) ast_indicate(chan, AST_CONTROL_RINGING); set_state(dial, AST_DIAL_RESULT_RINGING); break; case AST_CONTROL_PROGRESS: - ast_verb(3, "%s is making progress, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); - ast_indicate(chan, AST_CONTROL_PROGRESS); + if (chan) { + ast_verb(3, "%s is making progress, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); + ast_indicate(chan, AST_CONTROL_PROGRESS); + } else { + ast_verb(3, "%s is making progress\n", ast_channel_name(channel->owner)); + } set_state(dial, AST_DIAL_RESULT_PROGRESS); break; case AST_CONTROL_VIDUPDATE: + if (!chan) { + break; + } ast_verb(3, "%s requested a video update, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); ast_indicate(chan, AST_CONTROL_VIDUPDATE); break; case AST_CONTROL_SRCUPDATE: + if (!chan) { + break; + } ast_verb(3, "%s requested a source update, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); ast_indicate(chan, AST_CONTROL_SRCUPDATE); break; case AST_CONTROL_CONNECTED_LINE: + if (!chan) { + break; + } ast_verb(3, "%s connected line has changed, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); if (ast_channel_connected_line_sub(channel->owner, chan, fr, 1) && ast_channel_connected_line_macro(channel->owner, chan, fr, 1, 1)) { @@ -642,6 +665,9 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel } break; case AST_CONTROL_REDIRECTING: + if (!chan) { + break; + } ast_verb(3, "%s redirecting info has changed, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); if (ast_channel_redirecting_sub(channel->owner, chan, fr, 1) && ast_channel_redirecting_macro(channel->owner, chan, fr, 1, 1)) { @@ -649,15 +675,25 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel } break; case AST_CONTROL_PROCEEDING: - ast_verb(3, "%s is proceeding, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); - ast_indicate(chan, AST_CONTROL_PROCEEDING); + if (chan) { + ast_verb(3, "%s is proceeding, passing it to %s\n", ast_channel_name(channel->owner), ast_channel_name(chan)); + ast_indicate(chan, AST_CONTROL_PROCEEDING); + } else { + ast_verb(3, "%s is proceeding\n", ast_channel_name(channel->owner)); + } set_state(dial, AST_DIAL_RESULT_PROCEEDING); break; case AST_CONTROL_HOLD: + if (!chan) { + break; + } ast_verb(3, "Call on %s placed on hold\n", ast_channel_name(chan)); ast_indicate_data(chan, AST_CONTROL_HOLD, fr->data.ptr, fr->datalen); break; case AST_CONTROL_UNHOLD: + if (!chan) { + break; + } ast_verb(3, "Call on %s left from hold\n", ast_channel_name(chan)); ast_indicate(chan, AST_CONTROL_UNHOLD); break; @@ -665,11 +701,15 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel case AST_CONTROL_FLASH: break; case AST_CONTROL_PVT_CAUSE_CODE: - ast_indicate_data(chan, AST_CONTROL_PVT_CAUSE_CODE, fr->data.ptr, fr->datalen); + if (chan) { + ast_indicate_data(chan, AST_CONTROL_PVT_CAUSE_CODE, fr->data.ptr, fr->datalen); + } break; case -1: - /* Prod the channel */ - ast_indicate(chan, -1); + if (chan) { + /* Prod the channel */ + ast_indicate(chan, -1); + } break; default: break; @@ -677,65 +717,6 @@ static void handle_frame(struct ast_dial *dial, struct ast_dial_channel *channel } } -/*! \brief Helper function that handles control frames WITHOUT owner */ -static void handle_frame_ownerless(struct ast_dial *dial, struct ast_dial_channel *channel, struct ast_frame *fr) -{ - /* If we have no owner we can only update the state of the dial structure, so only look at control frames */ - if (fr->frametype != AST_FRAME_CONTROL) - return; - - switch (fr->subclass.integer) { - case AST_CONTROL_ANSWER: - ast_verb(3, "%s answered\n", ast_channel_name(channel->owner)); - AST_LIST_LOCK(&dial->channels); - AST_LIST_REMOVE(&dial->channels, channel, list); - AST_LIST_INSERT_HEAD(&dial->channels, channel, list); - AST_LIST_UNLOCK(&dial->channels); - ast_channel_publish_dial(NULL, channel->owner, channel->device, "ANSWER"); - set_state(dial, AST_DIAL_RESULT_ANSWERED); - break; - case AST_CONTROL_BUSY: - ast_verb(3, "%s is busy\n", ast_channel_name(channel->owner)); - ast_channel_publish_dial(NULL, channel->owner, channel->device, "BUSY"); - ast_hangup(channel->owner); - channel->cause = AST_CAUSE_USER_BUSY; - channel->owner = NULL; - break; - case AST_CONTROL_CONGESTION: - ast_verb(3, "%s is circuit-busy\n", ast_channel_name(channel->owner)); - ast_channel_publish_dial(NULL, channel->owner, channel->device, "CONGESTION"); - ast_hangup(channel->owner); - channel->cause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; - channel->owner = NULL; - break; - case AST_CONTROL_INCOMPLETE: - /* - * Nothing to do but abort the call since we have no - * controlling channel to ask for more digits. - */ - ast_verb(3, "%s dialed Incomplete extension %s\n", - ast_channel_name(channel->owner), ast_channel_exten(channel->owner)); - ast_hangup(channel->owner); - channel->cause = AST_CAUSE_UNALLOCATED; - channel->owner = NULL; - break; - case AST_CONTROL_RINGING: - ast_verb(3, "%s is ringing\n", ast_channel_name(channel->owner)); - set_state(dial, AST_DIAL_RESULT_RINGING); - break; - case AST_CONTROL_PROGRESS: - ast_verb(3, "%s is making progress\n", ast_channel_name(channel->owner)); - set_state(dial, AST_DIAL_RESULT_PROGRESS); - break; - case AST_CONTROL_PROCEEDING: - ast_verb(3, "%s is proceeding\n", ast_channel_name(channel->owner)); - set_state(dial, AST_DIAL_RESULT_PROCEEDING); - break; - default: - break; - } -} - /*! \brief Helper function to handle when a timeout occurs on dialing attempt */ static int handle_timeout_trip(struct ast_dial *dial, struct timeval start) { @@ -887,10 +868,7 @@ static enum ast_dial_result monitor_dial(struct ast_dial *dial, struct ast_chann } /* Process the frame */ - if (chan) - handle_frame(dial, channel, fr, chan); - else - handle_frame_ownerless(dial, channel, fr); + handle_frame(dial, channel, fr, chan); /* Free the received frame and start all over */ ast_frfree(fr); |