📄 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::ParseException& 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); }}voidSipMessage::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(){ // .bwc. auto_ptr owns the Contents. No other references allowed! auto_ptr<Contents> ret(getContents()); mContents = 0; if (ret.get() != 0 && !ret->isWellFormed()) { ret.reset(0); } // .bwc. At this point, the Contents object has been parsed, so we don't need // this anymore. delete mContentsHfv; mContentsHfv=0; return ret;}// unknown header interfaceconst 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());}boolSipMessage::exists(const ExtensionHeader& symbol) const{ for (UnknownHeaders::iterator i = mUnknownHeaders.begin(); i != mUnknownHeaders.end(); i++) { if (i->first == symbol.getName()) { return true; } } return false;}voidSipMessage::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; } }}voidSipMessage::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 { assert(headerLen >= 0); for (UnknownHeaders::iterator i = mUnknownHeaders.begin(); i != mUnknownHeaders.end(); i++) { if (i->first.size() == (unsigned int)headerLen && 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 + -