https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r172517 | twilson | 2009-01-30 11:47:41 -0600 (Fri, 30 Jan 2009) | 37 lines Fix feature inheritance with builtin features When using builtin features like parking and transfers, the AST_FEATURE_* flags would not be set correctly for all instances when either performing a builtin attended transfer, or parking a call and getting the timeout callback. Also, there was no way on a per-call basis to specify what features someone should have on picking up a parked call (since that doesn't involve the Dial() command). There was a global option for setting whether or not all users who pickup a parked call should have AST_FEATURE_REDIRECT set, but nothing for DISCONNECT, AUTOMON, or PARKCALL. This patch: 1) adds the BRIDGE_FEATURES dialplan variable which can be set either in the dialplan or with setvar in channels that support it. This variable can be set to any combination of 't', 'k', 'w', and 'h' (case insensitive matching of the equivalent dial options), to set what features should be activated on this channel. The patch moves the setting of the features datastores into the bridging code instead of app_dial to help facilitate this. 2) adds global options parkedcallparking, parkedcallhangup, and parkedcallrecording to be similar to the parkedcalltransfers option for globally setting features. 3) has builtin_atxfer call builtin_parkcall if being transfered to the parking extension since tracking everything through multiple masquerades, etc. is difficult and error-prone 4) attempts to fix all cases of return calls from parking and completed builtin transfers not having the correct permissions (closes issue #14274) Reported by: aragon Patches: fix_feature_inheritence.diff.txt uploaded by otherwiseguy (license 396) Tested by: aragon, otherwiseguy Review http://reviewboard.digium.com/r/138/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@172580 65c4cc65-6c06-0410-ace0-fbb531ad65f3
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
/*
|
|
* Asterisk -- An open source telephony toolkit.
|
|
*
|
|
* Copyright (C) 1999 - 2007, Digium, Inc.
|
|
*
|
|
* Mark Michelson <mmichelson@digium.com>
|
|
*
|
|
* See http://www.asterisk.org for more information about
|
|
* the Asterisk project. Please do not directly contact
|
|
* any of the maintainers of this project for assistance;
|
|
* the project provides a web site, mailing lists and IRC
|
|
* channels for your use.
|
|
*
|
|
* This program is free software, distributed under the terms of
|
|
* the GNU General Public License Version 2. See the LICENSE file
|
|
* at the top of the source tree.
|
|
*/
|
|
|
|
/*! \file
|
|
*
|
|
* \brief globally-accessible datastore information and callbacks
|
|
*
|
|
* \author Mark Michelson <mmichelson@digium.com>
|
|
*/
|
|
|
|
#include "asterisk.h"
|
|
|
|
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|
|
|
#include "asterisk/global_datastores.h"
|
|
#include "asterisk/linkedlists.h"
|
|
|
|
static void dialed_interface_destroy(void *data)
|
|
{
|
|
struct ast_dialed_interface *di = NULL;
|
|
AST_LIST_HEAD(, ast_dialed_interface) *dialed_interface_list = data;
|
|
|
|
if (!dialed_interface_list) {
|
|
return;
|
|
}
|
|
|
|
AST_LIST_LOCK(dialed_interface_list);
|
|
while ((di = AST_LIST_REMOVE_HEAD(dialed_interface_list, list)))
|
|
ast_free(di);
|
|
AST_LIST_UNLOCK(dialed_interface_list);
|
|
|
|
AST_LIST_HEAD_DESTROY(dialed_interface_list);
|
|
ast_free(dialed_interface_list);
|
|
}
|
|
|
|
static void *dialed_interface_duplicate(void *data)
|
|
{
|
|
struct ast_dialed_interface *di = NULL;
|
|
AST_LIST_HEAD(, ast_dialed_interface) *old_list;
|
|
AST_LIST_HEAD(, ast_dialed_interface) *new_list = NULL;
|
|
|
|
if(!(old_list = data)) {
|
|
return NULL;
|
|
}
|
|
|
|
if(!(new_list = ast_calloc(1, sizeof(*new_list)))) {
|
|
return NULL;
|
|
}
|
|
|
|
AST_LIST_HEAD_INIT(new_list);
|
|
AST_LIST_LOCK(old_list);
|
|
AST_LIST_TRAVERSE(old_list, di, list) {
|
|
struct ast_dialed_interface *di2 = ast_calloc(1, sizeof(*di2) + strlen(di->interface));
|
|
if(!di2) {
|
|
AST_LIST_UNLOCK(old_list);
|
|
dialed_interface_destroy(new_list);
|
|
return NULL;
|
|
}
|
|
strcpy(di2->interface, di->interface);
|
|
AST_LIST_INSERT_TAIL(new_list, di2, list);
|
|
}
|
|
AST_LIST_UNLOCK(old_list);
|
|
|
|
return new_list;
|
|
}
|
|
|
|
const struct ast_datastore_info dialed_interface_info = {
|
|
.type = "dialed-interface",
|
|
.destroy = dialed_interface_destroy,
|
|
.duplicate = dialed_interface_duplicate,
|
|
};
|