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; }
/* 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); }
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++; } }