From 57edf0b4576bca7b656ecaaedf37f82f923f2db5 Mon Sep 17 00:00:00 2001 From: paulc Date: Tue, 28 Dec 2004 14:50:10 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: http://yate.null.ro/svn/yate/trunk@147 acf43c95-373e-0410-b603-e72c3f656dc1 --- contrib/ysip/engine.cpp | 3 +- contrib/ysip/message.cpp | 59 ++++++++++++++++++++++++++++-------- contrib/ysip/transaction.cpp | 6 ++-- contrib/ysip/yatesip.h | 19 ++++++++++++ 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/contrib/ysip/engine.cpp b/contrib/ysip/engine.cpp index 74cfb67d..cd08a9b8 100644 --- a/contrib/ysip/engine.cpp +++ b/contrib/ysip/engine.cpp @@ -71,7 +71,8 @@ SIPEvent::~SIPEvent() } SIPEngine::SIPEngine(const char* userAgent) - : m_t1(500000), m_t4(5000000), m_maxForwards(70), m_userAgent(userAgent) + : m_t1(500000), m_t4(5000000), m_maxForwards(70), + m_cseq(0), m_userAgent(userAgent) { Debug(DebugInfo,"SIPEngine::SIPEngine() [%p]",this); if (m_userAgent.null()) diff --git a/contrib/ysip/message.cpp b/contrib/ysip/message.cpp index e77f55d6..b08c4ff8 100644 --- a/contrib/ysip/message.cpp +++ b/contrib/ysip/message.cpp @@ -103,13 +103,13 @@ const NamedString* HeaderLine::getParam(const char *name) const SIPMessage::SIPMessage(const char* _method, const char* _uri, const char* _version) : version(_version), method(_method), uri(_uri), - body(0), m_ep(0), m_valid(true), m_answer(false), m_outgoing(true) + body(0), m_ep(0), m_valid(true), m_answer(false), m_outgoing(true), m_cseq(-1) { Debug(DebugAll,"SIPMessage::SIPMessage() [%p]",this); } SIPMessage::SIPMessage(SIPParty* ep, const char *buf, int len) - : body(0), m_ep(ep), m_valid(false), m_answer(false), m_outgoing(false) + : body(0), m_ep(ep), m_valid(false), m_answer(false), m_outgoing(false), m_cseq(-1) { Debugger debug(DebugAll,"SIPMessage::SIPMessage","(%p,%d) [%p]\n%s", buf,len,this,buf); @@ -126,7 +126,7 @@ SIPMessage::SIPMessage(SIPParty* ep, const char *buf, int len) SIPMessage::SIPMessage(const SIPMessage* message, int _code, const char* _reason) : code(_code), reason(_reason), body(0), - m_ep(0), m_valid(false), m_answer(true), m_outgoing(true) + m_ep(0), m_valid(false), m_answer(true), m_outgoing(true), m_cseq(-1) { Debug(DebugAll,"SIPMessage::SIPMessage(%p,%d,'%s') [%p]", message,_code,_reason,this); @@ -138,17 +138,39 @@ SIPMessage::SIPMessage(const SIPMessage* message, int _code, const char* _reason version = message->version; uri = message->uri; method = message->method; - copyAllHeaders(message,"via"); - copyHeader(message,"to"); - copyHeader(message,"from"); - copyHeader(message,"cseq"); - copyHeader(message,"call-id"); + copyAllHeaders(message,"Via"); + copyHeader(message,"To"); + copyHeader(message,"From"); + copyHeader(message,"Call-ID"); + copyHeader(message,"CSeq"); #if 0 body = message->body ? message->body->clone() : 0; #endif m_valid = true; } +SIPMessage::SIPMessage(const SIPMessage* message) + : method("ACK"), + body(), m_ep(0), m_valid(false), m_answer(false), m_outgoing(true), m_cseq(-1) +{ + Debug(DebugAll,"SIPMessage::SIPMessage(%p) [%p]",message,this); + if (!(message && message->isValid())) + return; + m_ep = message->getParty(); + if (m_ep) + m_ep->ref(); + version = message->version; + uri = message->uri; + copyAllHeaders(message,"Via"); + copyHeader(message,"To"); + copyHeader(message,"From"); + copyHeader(message,"Call-ID"); + String tmp; + tmp << message->getCSeq() << " " << method; + addHeader("CSeq",tmp); + m_valid = true; +} + SIPMessage::~SIPMessage() { Debug(DebugAll,"SIPMessage::~SIPMessage() [%p]",this); @@ -165,10 +187,19 @@ void SIPMessage::complete(SIPEngine* engine) { if (!engine) return; - if (!getHeader("Max-Forwards")) { - String m(engine->getMaxForwards()); - addHeader("Max-Forwards",m); + + if (!getHeader("CSeq")) { + String tmp; + m_cseq = engine->getNextCSeq(); + tmp << m_cseq << " " << method; + addHeader("CSeq",tmp); } + + if (!getHeader("Max-Forwards")) { + String tmp(engine->getMaxForwards()); + addHeader("Max-Forwards",tmp); + } + if (!getHeader("User-Agent")) addHeader("User-Agent",engine->getUserAgent()); } @@ -275,10 +306,14 @@ bool SIPMessage::parse(const char* buf, int len) line->trimBlanks(); DDebug("SIPMessage::parse",DebugAll,"header='%s' value='%s'",name.c_str(),line->c_str()); header.append(new HeaderLine(name.c_str(),*line)); - if (content.null() && (name &= "content-type")) { + if (content.null() && (name &= "Content-Type")) { content = *line; content.toLower(); } + if ((m_cseq < 0) && (name &= "CSeq")) { + String seq = *line; + seq >> m_cseq; + } line->destruct(); } body = SIPBody::build(buf,len,content); diff --git a/contrib/ysip/transaction.cpp b/contrib/ysip/transaction.cpp index 00d208e5..8bff779a 100644 --- a/contrib/ysip/transaction.cpp +++ b/contrib/ysip/transaction.cpp @@ -167,13 +167,14 @@ SIPEvent* SIPTransaction::getEvent() void SIPTransaction::setResponse(SIPMessage* message) { setLatestMessage(message); - m_lastMessage->deref(); changeState(Finish); } void SIPTransaction::setResponse(int code, const char* reason) { - setResponse(new SIPMessage(m_firstMessage, code, reason)); + SIPMessage* msg = new SIPMessage(m_firstMessage, code, reason); + setResponse(msg); + msg->deref(); } bool SIPTransaction::processMessage(SIPMessage* message, const String& branch) @@ -197,6 +198,7 @@ bool SIPTransaction::processMessage(SIPMessage* message, const String& branch) setTimeout(m_engine->getTimer('I')); return true; } + // fire up a retransmission of the latest outgoing message setTransmit(); return true; } diff --git a/contrib/ysip/yatesip.h b/contrib/ysip/yatesip.h index 25eaf1ef..1a451159 100644 --- a/contrib/ysip/yatesip.h +++ b/contrib/ysip/yatesip.h @@ -145,6 +145,11 @@ public: */ SIPMessage(const SIPMessage* message, int _code, const char* _reason); + /** + * Creates an ACK message from the initial message. + */ + SIPMessage(const SIPMessage* message); + /** * Destroy the message and all */ @@ -210,6 +215,12 @@ public: inline bool isReliable() const { return m_ep ? m_ep->isReliable() : false; } + /** + * + */ + inline int getCSeq() const + { return m_cseq; } + /** * Find a header line by name * @param name Name of the header to locate @@ -289,6 +300,7 @@ protected: bool m_valid; bool m_answer; bool m_outgoing; + int m_cseq; String m_branch; mutable String m_string; mutable DataBlock m_data; @@ -672,6 +684,12 @@ public: inline const String& getUserAgent() const { return m_userAgent; } + /** + * Get a CSeq value suitable for use in a new request + */ + inline int getNextCSeq() + { return ++m_cseq; } + /** * TransList is the key. * Is the list that holds all the transactions. @@ -683,6 +701,7 @@ protected: unsigned long long m_t1; unsigned long long m_t4; unsigned int m_maxForwards; + int m_cseq; String m_userAgent; };