Example #1
0
// must be write-locked, SessionManager must be read-locked
void CallManager::EndCall(Connection *sqlCon, unsigned int call_id)
{
	Call *call = getCall(call_id);
	if (!call)
		return;
	call->lock();

	//call->sendCallStatuses();

	if (call->tarificate(sqlCon)) {
		log(LOG_FATAL, "Error tarficating call[%d].", call_id);
	}
	call->DBwrite(sqlCon);

	if (call->getState() == ACTIVE || call->getState() == END) {
		if (User::CheckNeedMark(sqlCon, call->getClient(), call->getTranslator())) {
			Session *cs = sManager->findSessionByUser(call->getClient());
			if (cs) {
				struct timeval tv;
				gettimeofday(&tv, 0);
				unsigned long time = tv.tv_sec*1000 + tv.tv_usec/1000;
				cs->sendPacket_MarkRequest(call->getTranslator(), call->getTranslatorName(), time);
			}
		}
	}
	call->unlock();
	log(LOG_VERBOSE, "EndCall[%d->%d]: accounted=%d cost=%d.", call->getClient(), call->getTranslator(),
			call->getAccountedTime(), call->getCost());
	removeCall(call_id);
	delete call;
}