diff --git a/libs/ysip/message.cpp b/libs/ysip/message.cpp index 4c8d5698..9cf935b9 100644 --- a/libs/ysip/message.cpp +++ b/libs/ysip/message.cpp @@ -292,12 +292,21 @@ void SIPMessage::complete(SIPEngine* engine, const char* user, const char* domai addHeader("Call-ID",tmp); } - if (!(isAnswer() || getHeader("CSeq"))) { - String tmp; - if (m_cseq <= 0) - m_cseq = engine->getNextCSeq(); - tmp << m_cseq << " " << method; - addHeader("CSeq",tmp); + if (!isAnswer()) { + hl = const_cast(getHeader("CSeq")); + if (hl) { + if (m_cseq <= 0) { + String tmp(*hl); + tmp >> m_cseq; + } + } + else { + String tmp; + if (m_cseq <= 0) + m_cseq = engine->getNextCSeq(); + tmp << m_cseq << " " << method; + addHeader("CSeq",tmp); + } } const char* info = isAnswer() ? "Server" : "User-Agent"; diff --git a/modules/ysipchan.cpp b/modules/ysipchan.cpp index 5b47c2b9..2c4b0d65 100644 --- a/modules/ysipchan.cpp +++ b/modules/ysipchan.cpp @@ -932,6 +932,7 @@ public: virtual bool msgText(Message& msg, const char* text); virtual bool msgDrop(Message& msg, const char* reason); virtual bool msgUpdate(Message& msg); + virtual bool msgControl(Message& msg); virtual bool callRouted(Message& msg); virtual void callAccept(Message& msg); virtual void callRejected(const char* error, const char* reason, const Message* msg); @@ -6013,6 +6014,7 @@ YateSIPConnection::YateSIPConnection(Message& msg, const String& uri, const char filterDebug(m_address); m_dialog = *m; m_dialog.localCSeq = m->getCSeq(); + m_dialog.remoteCSeq = msg.getIntValue("remote_cseq",-1); if (s_privacy) copyPrivacy(*m,msg); @@ -7529,6 +7531,31 @@ bool YateSIPConnection::msgUpdate(Message& msg) return false; } +bool YateSIPConnection::msgControl(Message& msg) +{ + bool ok = false; + if (msg[YSTRING("operation")] == YSTRING("query")) { + msg.setParam("sip_uri",m_uri); + msg.setParam("sip_callid",callid()); + String tmp; + tmp << "<" << m_dialog.localURI << ">"; + if (m_dialog.localTag) + tmp << ";tag=" << m_dialog.localTag; + msg.setParam("sip_from",tmp); + tmp.clear(); + tmp << "<" << m_dialog.remoteURI << ">"; + if (m_dialog.remoteTag) + tmp << ";tag=" << m_dialog.remoteTag; + msg.setParam("sip_to",tmp); + if (m_dialog.localCSeq >= 0) + msg.setParam("local_cseq",String(m_dialog.localCSeq)); + if (m_dialog.remoteCSeq >= 0) + msg.setParam("remote_cseq",String(m_dialog.remoteCSeq)); + ok = true; + } + return Channel::msgControl(msg) || ok; +} + void YateSIPConnection::endDisconnect(const Message& msg, bool handled) { const String* reason = msg.getParam(YSTRING("reason"));