📄 sipmessage.cxx
字号:
if ((pb.position() - start) == 3)
{
mStartLine->setParserContainer(new ParserContainer<StatusLine>(mStartLine, Headers::NONE));
//!dcm! should invoke the statusline parser here once it does limited validation
mResponse = true;
}
}
if (!mResponse)
{
mStartLine->setParserContainer(new ParserContainer<RequestLine>(mStartLine, Headers::NONE));
//!dcm! should invoke the responseline parser here once it does limited validation
mRequest = true;
}
}
void
SipMessage::setBody(const char* start, UInt32 len)
{
if(checkContentLength)
{
if(exists(h_ContentLength))
{
try
{
header(h_ContentLength).checkParsed();
}
catch(resip::ParseBuffer::Exception& e)
{
if(mInvalid)
{
mReason+=",";
}
mInvalid=true;
mReason+="Malformed Content-Length";
InfoLog(<< "Malformed Content-Length. Ignoring. " << e);
header(h_ContentLength).value()=len;
}
UInt32 contentLength=header(h_ContentLength).value();
if(len > contentLength)
{
InfoLog(<< (len-contentLength) << " extra bytes after body. Ignoring these bytes.");
}
else if(len < contentLength)
{
InfoLog(<< "Content Length is "<< (contentLength-len) << " bytes larger than body!"
<< " (We are supposed to 400 this) ");
if(mInvalid)
{
mReason+=",";
}
mInvalid=true;
mReason+="Bad Content-Length (larger than datagram)";
header(h_ContentLength).value()=len;
contentLength=len;
}
mContentsHfv = new HeaderFieldValue(start,contentLength);
}
else
{
InfoLog(<< "Message has a body, but no Content-Length header.");
mContentsHfv = new HeaderFieldValue(start,len);
}
}
else
{
mContentsHfv = new HeaderFieldValue(start,len);
}
}
void
SipMessage::setContents(auto_ptr<Contents> contents)
{
Contents* contentsP = contents.release();
delete mContents;
mContents = 0;
delete mContentsHfv;
mContentsHfv = 0;
if (contentsP == 0)
{
// The semantics of setContents(0) are to delete message contents
remove(h_ContentType);
remove(h_ContentDisposition);
remove(h_ContentTransferEncoding);
remove(h_ContentLanguages);
return;
}
mContents = contentsP;
// copy contents headers into message
if (mContents->exists(h_ContentDisposition))
{
header(h_ContentDisposition) = mContents->header(h_ContentDisposition);
}
if (mContents->exists(h_ContentTransferEncoding))
{
header(h_ContentTransferEncoding) = mContents->header(h_ContentTransferEncoding);
}
if (mContents->exists(h_ContentLanguages))
{
header(h_ContentLanguages) = mContents->header(h_ContentLanguages);
}
if (mContents->exists(h_ContentType))
{
header(h_ContentType) = mContents->header(h_ContentType);
assert( header(h_ContentType).type() == mContents->getType().type() );
assert( header(h_ContentType).subType() == mContents->getType().subType() );
}
else
{
header(h_ContentType) = mContents->getType();
}
}
void
SipMessage::setContents(const Contents* contents)
{
if (contents)
{
setContents(auto_ptr<Contents>(contents->clone()));
}
else
{
setContents(auto_ptr<Contents>(0));
}
}
Contents*
SipMessage::getContents() const
{
if (mContents == 0 && mContentsHfv != 0)
{
if (!exists(h_ContentType))
{
StackLog(<< "SipMessage::getContents: ContentType header does not exist - implies no contents");
return 0;
}
DebugLog(<< "SipMessage::getContents: "
<< header(h_ContentType).type()
<< "/"
<< header(h_ContentType).subType());
if ( ContentsFactoryBase::getFactoryMap().find(header(h_ContentType)) == ContentsFactoryBase::getFactoryMap().end() )
{
InfoLog(<< "SipMessage::getContents: got content type ("
<< header(h_ContentType).type()
<< "/"
<< header(h_ContentType).subType()
<< ") that is not known, "
<< "returning as opaque application/octet-stream");
mContents = ContentsFactoryBase::getFactoryMap()[OctetContents::getStaticType()]->create(mContentsHfv, OctetContents::getStaticType());
}
else
{
mContents = ContentsFactoryBase::getFactoryMap()[header(h_ContentType)]->create(mContentsHfv, header(h_ContentType));
}
assert( mContents );
// copy contents headers into the contents
if (exists(h_ContentDisposition))
{
mContents->header(h_ContentDisposition) = header(h_ContentDisposition);
}
if (exists(h_ContentTransferEncoding))
{
mContents->header(h_ContentTransferEncoding) = header(h_ContentTransferEncoding);
}
if (exists(h_ContentLanguages))
{
mContents->header(h_ContentLanguages) = header(h_ContentLanguages);
}
if (exists(h_ContentType))
{
mContents->header(h_ContentType) = header(h_ContentType);
}
// !dlb! Content-Transfer-Encoding?
}
return mContents;
}
auto_ptr<Contents>
SipMessage::releaseContents()
{
auto_ptr<Contents> ret(getContents());
if (ret.get() != 0)
{
// the buffer may go away...
ret->checkParsed();
mContents = 0;
// ...here
}
setContents(auto_ptr<Contents>(0));
return ret;
}
// unknown header interface
const StringCategories&
SipMessage::header(const ExtensionHeader& headerName) const
{
for (UnknownHeaders::iterator i = mUnknownHeaders.begin();
i != mUnknownHeaders.end(); i++)
{
// !dlb! case sensitive?
if (i->first == headerName.getName())
{
HeaderFieldValueList* hfvs = i->second;
if (hfvs->getParserContainer() == 0)
{
hfvs->setParserContainer(new ParserContainer<StringCategory>(hfvs, Headers::RESIP_DO_NOT_USE));
}
return *dynamic_cast<ParserContainer<StringCategory>*>(hfvs->getParserContainer());
}
}
// missing extension header
assert(false);
return *(StringCategories*)0;
}
StringCategories&
SipMessage::header(const ExtensionHeader& headerName)
{
for (UnknownHeaders::iterator i = mUnknownHeaders.begin();
i != mUnknownHeaders.end(); i++)
{
// !dlb! case sensitive?
if (i->first == headerName.getName())
{
HeaderFieldValueList* hfvs = i->second;
if (hfvs->getParserContainer() == 0)
{
hfvs->setParserContainer(new ParserContainer<StringCategory>(hfvs, Headers::RESIP_DO_NOT_USE));
}
return *dynamic_cast<ParserContainer<StringCategory>*>(hfvs->getParserContainer());
}
}
// create the list empty
HeaderFieldValueList* hfvs = new HeaderFieldValueList;
hfvs->setParserContainer(new ParserContainer<StringCategory>(hfvs, Headers::RESIP_DO_NOT_USE));
mUnknownHeaders.push_back(make_pair(headerName.getName(), hfvs));
return *dynamic_cast<ParserContainer<StringCategory>*>(hfvs->getParserContainer());
}
bool
SipMessage::exists(const ExtensionHeader& symbol) const
{
for (UnknownHeaders::iterator i = mUnknownHeaders.begin();
i != mUnknownHeaders.end(); i++)
{
if (i->first == symbol.getName())
{
return true;
}
}
return false;
}
void
SipMessage::remove(const ExtensionHeader& headerName)
{
for (UnknownHeaders::iterator i = mUnknownHeaders.begin();
i != mUnknownHeaders.end(); i++)
{
if (i->first == headerName.getName())
{
delete i->second;
mUnknownHeaders.erase(i);
return;
}
}
}
void
SipMessage::addHeader(Headers::Type header, const char* headerName, int headerLen,
const char* start, int len)
{
if (header != Headers::UNKNOWN)
{
if (mHeaders[header] == 0)
{
mHeaders[header] = new HeaderFieldValueList;
}
if (len)
{
if(mHeaders[header]->size()==1 && !(Headers::isMulti(header)))
{
if(mInvalid)
{
mReason+=",";
}
mInvalid=true;
mReason+="Multiple values in single-value header ";
mReason += Headers::getHeaderName(header);
return;
}
mHeaders[header]->push_back(new HeaderFieldValue(start, len));
}
}
else
{
for (UnknownHeaders::iterator i = mUnknownHeaders.begin();
i != mUnknownHeaders.end(); i++)
{
if (strncasecmp(i->first.data(), headerName, headerLen) == 0)
{
// add to end of list
if (len)
{
i->second->push_back(new HeaderFieldValue(start, len));
}
return;
}
}
// didn't find it, add an entry
HeaderFieldValueList *hfvs = new HeaderFieldValueList();
if (len)
{
hfvs->push_back(new HeaderFieldValue(start, len));
}
mUnknownHeaders.push_back(pair<Data, HeaderFieldValueList*>(Data(headerName, headerLen),
hfvs));
}
}
Data&
SipMessage::getEncoded()
{
return mEncoded;
}
Data&
SipMessage::getCompartmentId()
{
return mCompartmentId;
}
RequestLine&
SipMessage::header(const RequestLineType& l)
{
assert (!isResponse());
if (mStartLine == 0 )
{
mStartLine = new HeaderFieldValueList;
mStartLine->push_back(new HeaderFieldValue);
mStartLine->setParserContainer(new ParserContainer<RequestLine>(mStartLine, Headers::NONE));
mRequest = true;
}
return dynamic_cast<ParserContainer<RequestLine>*>(mStartLine->getParserContainer())->front();
}
const RequestLine&
SipMessage::header(const RequestLineType& l) const
{
assert (!isResponse());
if (mStartLine == 0 )
{
// request line missing
assert(false);
}
return dynamic_cast<ParserContainer<RequestLine>*>(mStartLine->getParserContainer())->front();
}
StatusLine&
SipMessage::header(const StatusLineType& l)
{
assert (!isRequest());
if (mStartLine == 0 )
{
mStartLine = new HeaderFieldValueList;
mStartLine->push_back(new HeaderFieldValue);
mStartLine->setParserContainer(new ParserContainer<StatusLine>(mStartLine, Headers::NONE));
mResponse = true;
}
return dynamic_cast<ParserContainer<StatusLine>*>(mStartLine->getParserContainer())->front();
}
const StatusLine&
SipMessage::header(const StatusLineType& l) const
{
assert (!isRequest());
if (mStartLine == 0 )
{
// status line missing
assert(false);
}
return dynamic_cast<ParserContainer<StatusLine>*>(mStartLine->getParserContainer())->front();
}
HeaderFieldValueList*
SipMessage::ensureHeaders(Headers::Type type, bool single)
{
HeaderFieldValueList* hfvs = mHeaders[type];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -