*** empty log message ***

git-svn-id: http://yate.null.ro/svn/yate/trunk@147 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2004-12-28 14:50:10 +00:00
parent 6b0074459a
commit 57edf0b457
4 changed files with 72 additions and 15 deletions

View File

@ -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())

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
};