All pastes #16921 Raw Edit

Stuff

public text v1 · immutable
#16921 ·published 2005-07-05 10:17 UTC
rendered paste body
static 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;
	}
}