aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-04-09 04:00:43 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-04-09 04:00:43 +0000
commit689c55ac5199bea0fd512fd34048a94bae1ffacf (patch)
tree43d077910583f5109004186ebc01cfc12c25dcf7 /res
parent6275b6092f595030b029ad7cbe665fa03ebddf50 (diff)
Implement call pickup on SIP, override context if appropriate
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@791 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rwxr-xr-xres/res_parking.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/res/res_parking.c b/res/res_parking.c
index da918bd88..dc13af024 100755
--- a/res/res_parking.c
+++ b/res/res_parking.c
@@ -49,6 +49,8 @@ static char parking_con[AST_MAX_EXTENSION] = "parkedcalls";
/* Extension you type to park the call */
static char parking_ext[AST_MAX_EXTENSION] = "700";
+static char pickup_ext[AST_MAX_EXTENSION] = "*8";
+
/* First available extension for parking */
static int parking_start = 701;
@@ -93,6 +95,11 @@ char *ast_parking_ext(void)
return parking_ext;
}
+char *ast_pickup_ext(void)
+{
+ return pickup_ext;
+}
+
int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeout, int *extout)
{
/* We put the user in the parking list, then wake up the parking thread to be sure it looks
@@ -565,6 +572,72 @@ int load_module(void)
return res;
}
+int ast_pickup_call(struct ast_channel *chan)
+{
+ struct ast_channel *cur;
+ int res = -1;
+ cur = ast_channel_walk(NULL);
+ while(cur) {
+ if (!cur->pbx &&
+ (cur != chan) &&
+ (chan->pickupgroup & cur->callgroup) &&
+ ((cur->_state == AST_STATE_RINGING) ||
+ (cur->_state == AST_STATE_RING))) {
+ break;
+ }
+ cur = ast_channel_walk(cur);
+ }
+ if (cur) {
+ ast_log(LOG_DEBUG, "Call pickup on chan '%s' by '%s'\n",cur->name, chan->name);
+ res = ast_answer(chan);
+ if (res)
+ ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
+ res = ast_queue_control(chan, AST_CONTROL_ANSWER, 0);
+ if (res)
+ ast_log(LOG_WARNING, "Unable to queue answer on '%s'\n", chan->name);
+ res = ast_channel_masquerade(cur, chan);
+ if (res)
+ ast_log(LOG_WARNING, "Unable to masquerade '%s' into '%s'\n", chan->name, cur->name); /* Done */
+ } else {
+ ast_log(LOG_DEBUG, "No call pickup possible...\n");
+ }
+ return res;
+}
+
+unsigned int ast_get_group(char *s)
+{
+ char *copy;
+ char *piece;
+ char *c=NULL;
+ int start=0, finish=0,x;
+ unsigned int group = 0;
+ copy = strdupa(s);
+ if (!copy) {
+ ast_log(LOG_ERROR, "Out of memory\n");
+ return 0;
+ }
+ c = copy;
+
+ while((piece = strsep(&c, ","))) {
+ if (sscanf(piece, "%d-%d", &start, &finish) == 2) {
+ /* Range */
+ } else if (sscanf(piece, "%d", &start)) {
+ /* Just one */
+ finish = start;
+ } else {
+ ast_log(LOG_ERROR, "Syntax error parsing '%s' at '%s'. Using '0'\n", s,piece);
+ return 0;
+ }
+ for (x=start;x<=finish;x++) {
+ if ((x > 31) || (x < 0)) {
+ ast_log(LOG_WARNING, "Ignoring invalid group %d\n", x);
+ } else
+ group |= (1 << x);
+ }
+ }
+ return group;
+}
+
int unload_module(void)
{
STANDARD_HANGUP_LOCALUSERS;