Added parameter "queuetime" for the CDR builder to know how long a call waited in a queue.

All calls in a queue can be dropped by specifying queuename/* as id.
A call to a "single" type queue is dropped when its operator call fails.


git-svn-id: http://yate.null.ro/svn/yate/trunk@2795 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2009-08-18 14:55:25 +00:00
parent 6fafa9bf1e
commit 05ef31e6b7
2 changed files with 40 additions and 14 deletions

View File

@ -5,7 +5,7 @@
;account=
; priority: int: Default priority of message handlers, 0 to disable them
;priority=50
;priority=45
; rescan: int: Period of polling for available operators, in seconds
;rescan=5

View File

@ -65,10 +65,12 @@ public:
{ return m_calls.count(); }
inline QueuedCall* findCall(const String& id) const
{ return static_cast<QueuedCall*>(m_calls[id]); }
inline QueuedCall* findCall(unsigned int index) const
{ return static_cast<QueuedCall*>(m_calls[index]); }
bool addCall(Message& msg);
inline bool removeCall(const String& id, const char* reason)
inline int removeCall(const String& id, const char* reason)
{ return removeCall(findCall(id),reason); }
bool removeCall(QueuedCall* call, const char* reason);
int removeCall(QueuedCall* call, const char* reason);
QueuedCall* markCall(const char* mark);
bool unmarkCall(const String& id);
void countCalls(unsigned int& marked, unsigned int& unmarked) const;
@ -113,7 +115,7 @@ protected:
void onHangup(Message& msg, String id);
void onQueued(Message& msg, String qname);
void onPickup(Message& msg, String qname);
void onDrop(Message& msg, String qname);
bool onDrop(Message& msg, String qname);
private:
bool m_init;
};
@ -298,10 +300,11 @@ bool CallsQueue::addCall(Message& msg)
}
// Remove and destroy call from the queue, destroy the queue if it becomes empty
bool CallsQueue::removeCall(QueuedCall* call, const char* reason)
int CallsQueue::removeCall(QueuedCall* call, const char* reason)
{
if (!call)
return false;
return -1;
int waited = (call->waitingTime() + 500000) / 1000000;
notify(reason,call);
int pos = m_detail ? position(call) : -1;
m_calls.remove(call);
@ -315,7 +318,7 @@ bool CallsQueue::removeCall(QueuedCall* call, const char* reason)
notify("position",c);
}
}
return true;
return waited;
}
// Mark a call as being routed to an operator
@ -340,6 +343,10 @@ bool CallsQueue::unmarkCall(const String& id)
return false;
if (m_single) {
removeCall(call,"noanswer");
Message* m = new Message("call.drop");
m->addParam("id",id);
m->addParam("reason","noanswer");
Engine::enqueue(m);
return false;
}
call->setMarked();
@ -568,7 +575,7 @@ void QueuesModule::onPickup(Message& msg, String qname)
if (call) {
id = *call;
String pid = msg.getValue("id");
queue->removeCall(call,"pickup");
String waited(queue->removeCall(call,"pickup"));
// convert message and let it connect to the queued call
msg = "chan.connect";
msg.setParam("targetid",id);
@ -581,6 +588,7 @@ void QueuesModule::onPickup(Message& msg, String qname)
m = new Message("call.answered");
m->setParam("id",id);
m->setParam("targetid",pid);
m->setParam("queuetime",waited);
Engine::enqueue(m);
return;
}
@ -608,7 +616,11 @@ void QueuesModule::onAnswered(Message& msg, String targetid, String reason)
return;
Debug(this,DebugCall,"Answered call '%s' in queue '%s'",
targetid.c_str(),queue->c_str());
queue->removeCall(targetid,"answered");
String waited(queue->removeCall(targetid,"answered"));
Message* m = new Message("call.update");
m->addParam("id",targetid);
m->addParam("queuetime",waited);
Engine::enqueue(m);
}
// Handle hangups on either caller or operator
@ -637,10 +649,10 @@ void QueuesModule::onHangup(Message& msg, String id)
}
// Drop the call from the head of a queue or a call specified by ID
void QueuesModule::onDrop(Message& msg, String qname)
bool QueuesModule::onDrop(Message& msg, String qname)
{
if (qname.null())
return;
return false;
String id;
int sep = qname.find('/');
if (sep >= 0) {
@ -649,6 +661,20 @@ void QueuesModule::onDrop(Message& msg, String qname)
}
CallsQueue* queue = findQueue(qname);
if (queue) {
if (id == "*") {
const char* reason = msg.getValue("reason");
for (unsigned int i = 0; ; i++) {
QueuedCall* call = queue->findCall(i);
if (!call)
break;
Message* m = new Message("call.drop");
m->addParam("id",*call);
if (reason)
m->addParam("reason",reason);
Engine::enqueue(m);
}
return true;
}
QueuedCall* call = id ? queue->findCall(id) : queue->topCall();
if (call) {
id = *call;
@ -657,6 +683,7 @@ void QueuesModule::onDrop(Message& msg, String qname)
msg.setParam("id",id);
}
}
return false;
}
// Command line execute handler
@ -696,8 +723,7 @@ bool QueuesModule::received(Message& msg, int id)
onHangup(msg,msg.getValue("id"));
break;
case Drop:
onDrop(msg,msg.getValue("id"));
break;
return onDrop(msg,msg.getValue("id"));
default:
lock.drop();
return Module::received(msg,id);
@ -752,7 +778,7 @@ void QueuesModule::initialize()
return;
m_init = true;
setup();
int priority = s_cfg.getIntValue("general","priority",50);
int priority = s_cfg.getIntValue("general","priority",45);
installRelay(Execute,s_cfg.getIntValue("priorities","call.execute",priority));
installRelay(Answered,s_cfg.getIntValue("priorities","call.answered",priority));
installRelay(Private,"chan.hangup",s_cfg.getIntValue("priorities","chan.hangup",priority));