rendered paste bodystatic struct ast_channel *my_ast_get_channel_by_name_locked(char *channame) {
struct ast_channel *chan;
chan = ast_channel_walk_locked(NULL);
while(chan) {
if (!strncasecmp(chan->name, channame, strlen(channame)))
return chan;
ast_mutex_unlock(&chan->lock);
chan = ast_channel_walk_locked(chan);
}
return NULL;
}
void
icd_jabber_transfer (int argc, char *argv[])
{
icd_caller *bridger;
icd_caller *bridgee;
icd_fieldset_iterator *iter;
char *curr_key;
icd_agent *agent;
struct ast_channel *newchan;
struct ast_channel *oldchan;
struct ast_channel *xferchan;
if (argc == 3)
{
ast_log(LOG_WARNING, "\ttransfering:\n");
iter = icd_fieldset__get_key_iterator(agents);
while (icd_fieldset_iterator__has_more(iter)) {
curr_key = icd_fieldset_iterator__next(iter);
agent = icd_fieldset__get_value(agents, curr_key);
if (strcmp(icd_caller__get_param((icd_caller *)agent, "agent_id"), argv[1]) == 0)
{
ast_log(LOG_WARNING, "from: [%s]\n", icd_caller__get_name((icd_caller *) agent));
bridger = agent;
}
if (strcmp(icd_caller__get_param((icd_caller *)agent, "agent_id"), argv[2]) == 0)
{
ast_log(LOG_WARNING, "to: [%s]\n", icd_caller__get_name((icd_caller *) agent));
bridgee = agent;
}
}
oldchan = icd_caller__get_channel(bridger);
newchan = icd_caller__get_channel(bridgee);
ast_log(LOG_WARNING, "newchan: [%s]\n", newchan->name);
ast_log(LOG_WARNING, "oldchan: [%s]\n", oldchan->name);
xferchan = my_ast_get_channel_by_name_locked(oldchan->name);
if(!xferchan) {
ast_log(LOG_WARNING, "No Such Channel: %s\n", oldchan->name);
return -1;
}
ast_mutex_unlock(&xferchan->lock);
if(xferchan->_bridge) {
xferchan = xferchan->_bridge;
ast_mutex_lock(&xferchan->lock);
}
else
return -1;
ast_verbose("Transferring_to context do_agenta, extension %s, priority %d\n", argv[2], 1);
xferchan->pbx = 0;
ast_async_goto(xferchan, "", argv[2], 1);
if(xferchan)
ast_mutex_unlock(&xferchan->lock);
return 0;
}
}