summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2014-04-30 12:32:12 +0000
committerJoshua Colp <jcolp@digium.com>2014-04-30 12:32:12 +0000
commit56ca10c7f1b7e2d3bcabe60f796e58325468d39c (patch)
tree21c97befd9d227d5c8643a5b996e994fb515f7ab /res
parentc6ed85748c19b8f77259fb14c210f5bcf65c86cb (diff)
chan_pjsip: Add support for picking up calls in the configured pickup group.
AST-1363 Review: https://reviewboard.asterisk.org/r/3478/ ........ Merged revisions 413117 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@413118 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 82c7a3f22..6acbc0c6d 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -43,6 +43,8 @@
#include "asterisk/sdp_srtp.h"
#include "asterisk/dsp.h"
#include "asterisk/acl.h"
+#include "asterisk/features_config.h"
+#include "asterisk/pickup.h"
#define SDP_HANDLER_BUCKETS 11
@@ -1349,12 +1351,27 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s
{
pjsip_uri *ruri = rdata->msg_info.msg->line.req.uri;
pjsip_sip_uri *sip_ruri;
+ struct ast_features_pickup_config *pickup_cfg;
+ const char *pickupexten;
+
if (!PJSIP_URI_SCHEME_IS_SIP(ruri) && !PJSIP_URI_SCHEME_IS_SIPS(ruri)) {
return SIP_GET_DEST_UNSUPPORTED_URI;
}
+
sip_ruri = pjsip_uri_get_uri(ruri);
ast_copy_pj_str(session->exten, &sip_ruri->user, sizeof(session->exten));
- if (ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, NULL)) {
+
+ pickup_cfg = ast_get_chan_features_pickup_config(session->channel);
+ if (!pickup_cfg) {
+ ast_log(LOG_ERROR, "Unable to retrieve pickup configuration options. Unable to detect call pickup extension\n");
+ pickupexten = "";
+ } else {
+ pickupexten = ast_strdupa(pickup_cfg->pickupexten);
+ ao2_ref(pickup_cfg, -1);
+ }
+
+ if (!strcmp(session->exten, pickupexten) ||
+ ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, NULL)) {
return SIP_GET_DEST_EXTEN_FOUND;
}
/* XXX In reality, we'll likely have further options so that partial matches