Safely set and use the reason string.

git-svn-id: http://voip.null.ro/svn/yate@5681 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2013-10-22 09:01:57 +00:00
parent 7cacd6fd74
commit e93f346209
1 changed files with 23 additions and 20 deletions

View File

@ -944,8 +944,12 @@ public:
{ return m_dialog; } { return m_dialog; }
inline void setStatus(const char *stat, int state = -1) inline void setStatus(const char *stat, int state = -1)
{ status(stat); if (state >= 0) m_state = state; } { status(stat); if (state >= 0) m_state = state; }
inline void setReason(const char* str = "Request Terminated", int code = 487) inline void setReason(const char* str = "Request Terminated", int code = 487,
{ m_reason = str; m_reasonCode = code; } Mutex* mtx = 0) {
Lock lck(mtx);
m_reason = str;
m_reasonCode = code;
}
inline SIPTransaction* getTransaction() const inline SIPTransaction* getTransaction() const
{ return m_tr; } { return m_tr; }
inline const String& callid() const inline const String& callid() const
@ -6046,13 +6050,14 @@ void YateSIPConnection::hangup()
Debug(this,DebugAll,"YateSIPConnection::hangup() state=%d trans=%p error='%s' code=%d reason='%s' [%p]", Debug(this,DebugAll,"YateSIPConnection::hangup() state=%d trans=%p error='%s' code=%d reason='%s' [%p]",
m_state,m_tr,error,m_reasonCode,m_reason.c_str(),this); m_state,m_tr,error,m_reasonCode,m_reason.c_str(),this);
setMedia(0); setMedia(0);
String res = m_reason;
mylock.drop(); mylock.drop();
Message* m = message("chan.hangup"); Message* m = message("chan.hangup");
if (m_reason) if (res)
m->setParam("reason",m_reason); m->setParam("reason",res);
Engine::enqueue(m); Engine::enqueue(m);
if (!error) if (!error)
error = m_reason.c_str(); error = res.c_str();
bool sendBye = true; bool sendBye = true;
switch (m_state) { switch (m_state) {
case Cleared: case Cleared:
@ -6083,7 +6088,7 @@ void YateSIPConnection::hangup()
String tmp; String tmp;
tmp << i->getCSeq() << " CANCEL"; tmp << i->getCSeq() << " CANCEL";
m->addHeader("CSeq",tmp); m->addHeader("CSeq",tmp);
if (m_reason == YSTRING("pickup")) { if (res == YSTRING("pickup")) {
MimeHeaderLine* hl = new MimeHeaderLine("Reason","SIP"); MimeHeaderLine* hl = new MimeHeaderLine("Reason","SIP");
hl->setParam("cause","200"); hl->setParam("cause","200");
hl->setParam("text","\"Call completed elsewhere\""); hl->setParam("text","\"Call completed elsewhere\"");
@ -6103,12 +6108,12 @@ void YateSIPConnection::hangup()
if (sendBye && m_byebye && m_dialog.localTag && m_dialog.remoteTag) { if (sendBye && m_byebye && m_dialog.localTag && m_dialog.remoteTag) {
SIPMessage* m = createDlgMsg("BYE"); SIPMessage* m = createDlgMsg("BYE");
if (m) { if (m) {
if (m_reason) { if (res) {
// FIXME: add SIP and Q.850 cause codes, set the proper reason // FIXME: add SIP and Q.850 cause codes, set the proper reason
MimeHeaderLine* hl = new MimeHeaderLine("Reason","SIP"); MimeHeaderLine* hl = new MimeHeaderLine("Reason","SIP");
if ((m_reasonCode >= 300) && (m_reasonCode <= 699) && (m_reasonCode != 487)) if ((m_reasonCode >= 300) && (m_reasonCode <= 699) && (m_reasonCode != 487))
hl->setParam("cause",String(m_reasonCode)); hl->setParam("cause",String(m_reasonCode));
hl->setParam("text",MimeHeaderLine::quote(m_reason)); hl->setParam("text",MimeHeaderLine::quote(res));
m->addHeader(hl); m->addHeader(hl);
} }
paramMutex().lock(); paramMutex().lock();
@ -6342,11 +6347,11 @@ bool YateSIPConnection::process(SIPEvent* ev)
updateTags = false; updateTags = false;
m_cancel = false; m_cancel = false;
m_byebye = false; m_byebye = false;
setReason(msg->reason,code,driver());
paramMutex().lock(); paramMutex().lock();
parameters().clearParams(); parameters().clearParams();
parameters().addParam("cause_sip",String(code)); parameters().addParam("cause_sip",String(code));
parameters().addParam("reason_sip",msg->reason); parameters().addParam("reason_sip",msg->reason);
setReason(msg->reason,code);
if (msg->body) { if (msg->body) {
paramMutex().unlock(); paramMutex().unlock();
Message tmp("isup.decode"); Message tmp("isup.decode");
@ -6402,7 +6407,7 @@ bool YateSIPConnection::process(SIPEvent* ev)
parameters().setParam("cause_sip","408"); parameters().setParam("cause_sip","408");
parameters().clearParam("reason_sip"); parameters().clearParam("reason_sip");
paramMutex().unlock(); paramMutex().unlock();
setReason("Request Timeout",code); setReason("Request Timeout",code,driver());
hangup(); hangup();
} }
else if (!m_hungup && code >= 100) { else if (!m_hungup && code >= 100) {
@ -6500,8 +6505,8 @@ bool YateSIPConnection::process(SIPEvent* ev)
m_tr->deref(); m_tr->deref();
m_tr = 0; m_tr = 0;
} }
lock.drop();
setReason("",0); setReason("",0);
lock.drop();
setStatus("answered",Established); setStatus("answered",Established);
Message *m = message("call.answered"); Message *m = message("call.answered");
copySipHeaders(*m,*msg); copySipHeaders(*m,*msg);
@ -6906,7 +6911,7 @@ void YateSIPConnection::doBye(SIPTransaction* t)
if (hl) { if (hl) {
const NamedString* text = hl->getParam("text"); const NamedString* text = hl->getParam("text");
if (text) if (text)
m_reason = MimeHeaderLine::unquote(*text); setReason(MimeHeaderLine::unquote(*text),m_reasonCode,driver());
// FIXME: add SIP and Q.850 cause codes // FIXME: add SIP and Q.850 cause codes
} }
t->setResponse(m); t->setResponse(m);
@ -7126,9 +7131,9 @@ void YateSIPConnection::disconnected(bool final, const char *reason)
if (reason) { if (reason) {
int code = lookup(reason,dict_errors); int code = lookup(reason,dict_errors);
if (code >= 300 && code <= 699) if (code >= 300 && code <= 699)
setReason(lookup(code,SIPResponses,reason),code); setReason(lookup(code,SIPResponses,reason),code,driver());
else else
setReason(reason); setReason(reason,487,driver());
} }
Channel::disconnected(final,reason); Channel::disconnected(final,reason);
} }
@ -7294,10 +7299,8 @@ bool YateSIPConnection::msgDrop(Message& msg, const char* reason)
if (!Channel::msgDrop(msg,reason)) if (!Channel::msgDrop(msg,reason))
return false; return false;
int code = lookup(reason,dict_errors); int code = lookup(reason,dict_errors);
if (code >= 300 && code <= 699) { if (code >= 300 && code <= 699)
m_reasonCode = code; setReason(lookup(code,SIPResponses,reason),code,driver());
m_reason = lookup(code,SIPResponses,reason);
}
return true; return true;
} }
@ -7398,9 +7401,9 @@ void YateSIPConnection::endDisconnect(const Message& msg, bool handled)
if (!TelEngine::null(reason)) { if (!TelEngine::null(reason)) {
int code = reason->toInteger(dict_errors); int code = reason->toInteger(dict_errors);
if (code >= 300 && code <= 699) if (code >= 300 && code <= 699)
setReason(lookup(code,SIPResponses,*reason),code); setReason(lookup(code,SIPResponses,*reason),code,driver());
else else
setReason(*reason,m_reasonCode); setReason(*reason,m_reasonCode,driver());
} }
const char* sPrefix = msg.getValue(YSTRING("osip-prefix")); const char* sPrefix = msg.getValue(YSTRING("osip-prefix"));
const char* mPrefix = msg.getValue(YSTRING("message-prefix")); const char* mPrefix = msg.getValue(YSTRING("message-prefix"));