Пример #1
0
static int w_agent_login(struct sip_msg *req, char *agent_v, char *state_v)
{
	struct cc_agent *agent, *prev_agent;
	str agent_s;
	int state;
	unsigned int flags;


	/* get state */
	if (fixup_get_isvalue( req, (gparam_p)state_v, &state, &agent_s,
	&flags)!=0 || ((flags|GPARAM_INT_VALUE_FLAG)==0) ) {
		LM_ERR("unable to evaluate state spec \n");
		return -1;
	}
	/* get agent */
	if (fixup_get_svalue( req, (gparam_p)agent_v, &agent_s)!=0) {
		LM_ERR("unable to evaluate agent spec \n");
		return -2;
	}

	/* block access to data */
	lock_get( data->lock );

	/* name of the agent */
	agent = get_agent_by_name( data, &agent_s, &prev_agent);
	if (agent==NULL) {
		lock_release( data->lock );
		LM_DBG("agent <%.*s> not found\n",agent_s.len,agent_s.s);
		return -3;
	}

	if (agent->loged_in != state) {

		if(state && (agent->state==CC_AGENT_WRAPUP) &&
			(get_ticks() - agent->last_call_end > wrapup_time))
			agent->state = CC_AGENT_FREE;

		if(state && data->agents[CC_AG_ONLINE] == NULL)
			data->last_online_agent = agent;

		agent_switch_login(data, agent, prev_agent);

		if(state) {
			data->logedin_agents++;
			log_agent_to_flows( data, agent, 1);
		} else {
			data->logedin_agents--;
			log_agent_to_flows(data, agent, 0);
		}
	}

	/* release access to data */
	lock_release( data->lock );

	return 1;
}
Пример #2
0
/* FORMAT :  agent_id  log_state */
static struct mi_root* mi_agent_login(struct mi_root *cmd_tree, void *param)
{
	struct mi_node *node;
	struct cc_agent *agent;
	unsigned int loged_in;
	struct cc_agent* prev_agent= 0;

	node = cmd_tree->node.kids;

	if (node==NULL || node->next==NULL || node->next->next!=NULL)
		return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);

	/* block access to data */
	lock_get( data->lock );

	/* name of the agent */
	agent = get_agent_by_name( data, &node->value, &prev_agent);
	if (agent==NULL) {
		lock_release( data->lock );
		return init_mi_tree( 404, MI_SSTR("Agent not found") );
	}

	/* login state */
	node = node->next;
	if (str2int( &node->value , &loged_in)!=0 ) {
		lock_release( data->lock );
		return init_mi_tree( 400, MI_SSTR("Bad loged_in state") );
	}

	if (agent->loged_in != loged_in) {

		if(loged_in && (agent->state==CC_AGENT_WRAPUP) &&
			(get_ticks() - agent->last_call_end > wrapup_time))
			agent->state = CC_AGENT_FREE;

		if(loged_in && data->agents[CC_AG_ONLINE] == NULL)
			data->last_online_agent = agent;

		agent_switch_login(data, agent, prev_agent);
		
		if(loged_in) {
			data->logedin_agents++;
			log_agent_to_flows( data, agent, 1);
		} else {
			data->logedin_agents--;
			log_agent_to_flows(data, agent, 0);
		}
	}

	/* release the readers */
	lock_release( data->lock );

	return init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
}
Пример #3
0
void clean_cc_old_data(struct cc_data *data)
{
	struct cc_skill *skill, **prv_skill;
	struct cc_agent *agent, **prv_agent;
	struct cc_flow  *flow,  **prv_flow;
	int i;

	/* clean old skills */
	skill = data->skills_map;
	prv_skill = &(data->skills_map);
	while(skill) {
		if (skill->is_new) {
			skill->is_new = 0;
			prv_skill = &(skill->next);
			skill = skill->next;
		} else {
			*prv_skill = skill->next;
			free_cc_skill(skill);
			skill = (*prv_skill);
		}
	}

	/* clean old agents */
	for(i= 0; i< 2; i++) {
		agent = data->agents[i];
		prv_agent = &data->agents[i];
		while(agent) { 
			if (agent->is_new) {
				agent->is_new = 0;
				prv_agent = &(agent->next);
				agent = agent->next;
			} else {
				*prv_agent = agent->next;
				if (agent->ref_cnt==0) {
					free_cc_agent(agent);
				} else {
					agent->next = data->old_agents;
					data->old_agents = agent;
				}
				agent = (*prv_agent);
				data->totalnr_agents--;
			}
		}
	}

	/* clean old flows */
	flow = data->flows;
	prv_flow = &(data->flows);
	while(flow) {
		flow->logged_agents = 0;
		if (flow->is_new) {
			flow->is_new = 0;
			prv_flow = &(flow->next);
			flow = flow->next;
		} else {
			*prv_flow = flow->next;
			if (flow->ref_cnt==0) {
				free_cc_flow(flow);
			} else {
				/* put in a cleanup list */
				flow->next = data->old_flows; 
				data->old_flows = flow;
			}
			flow = (*prv_flow);
		}
	}

	/* sync flows and agents (how many agents per flow are logged) */
	/* iterate all logged agents */
	data->logedin_agents = 0;
	for( agent=data->agents[CC_AG_ONLINE] ; agent ; agent=agent->next ) {
		/* update last agent */
		data->last_online_agent = agent;

		/* log_agent_to_flows() must now the call center of the 
		 * agent to count it as logged in */
		log_agent_to_flows( data, agent, agent->loged_in);
		data->logedin_agents++;
	}
}