⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sipmessage.cxx

📁 这是国外的resip协议栈
💻 CXX
📖 第 1 页 / 共 4 页
字号:
      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 + -