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

📄 dialogusagemanager.cxx

📁 这是国外的resip协议栈
💻 CXX
📖 第 1 页 / 共 5 页
字号:
            it = mIncomingFeatureChainMap.insert(lb, FeatureChainMap::value_type(tid, new DumFeatureChain(*this, mIncomingFeatureList, *mIncomingTarget)));         }      }            DumFeatureChain::ProcessingResult res = it->second->process(msg.get());            if (res & DumFeatureChain::ChainDoneBit)      {         delete it->second;         mIncomingFeatureChainMap.erase(it);         //DebugLog(<< "feature chain deleted" << endl);      }       if (res & DumFeatureChain::EventTakenBit)      {         msg.release();         //DebugLog(<< "event taken");         return;      }   }      try   {      InfoLog (<< "Got: " << msg->brief());      DumDecrypted* decryptedMsg = dynamic_cast<DumDecrypted*>(msg.get());      SipMessage* sipMsg = 0;      if (decryptedMsg)      {         sipMsg = decryptedMsg->decrypted();      }      else      {         sipMsg = dynamic_cast<SipMessage*>(msg.get());      }      if (sipMsg)      {         //DebugLog ( << "DialogUsageManager::process: " << sipMsg->brief());         if (sipMsg->isRequest())         {            // Validate Request URI            if( !validateRequestURI(*sipMsg) )            {               DebugLog (<< "Failed RequestURI validation " << *sipMsg);               return;            }            // Continue validation on all requests, except ACK and CANCEL            if(sipMsg->header(h_RequestLine).method() != ACK &&               sipMsg->header(h_RequestLine).method() != CANCEL)            {               if( !validateRequiredOptions(*sipMsg) )               {                  DebugLog (<< "Failed required options validation " << *sipMsg);                  return;               }               if( !validate100RelSuport(*sipMsg) )               {                  DebugLog (<< "Remote party does not suport 100rel " << *sipMsg);                  return;               }               if( getMasterProfile()->validateContentEnabled() && !validateContent(*sipMsg) )               {                  DebugLog (<< "Failed content validation " << *sipMsg);                  return;               }               if( getMasterProfile()->validateAcceptEnabled() && !validateAccept(*sipMsg) )               {                  DebugLog (<< "Failed accept validation " << *sipMsg);                  return;               }            }            if (sipMsg->header(h_From).exists(p_tag))            {               if (mergeRequest(*sipMsg) )               {                  InfoLog (<< "Merged request: " << *sipMsg);                  return;               }            }            processRequest(*sipMsg);         }         else         {            processResponse(*sipMsg);         }      }   }   catch(BaseException& e)   {      //unparseable, bad 403 w/ 2543 trans it from FWD, etc	  ErrLog(<<"Illegal message rejected: " << e.getMessage());   }}bool DialogUsageManager::hasEvents() const{   return mFifo.messageAvailable();}// return true if there is more to dobool DialogUsageManager::process(resip::RWMutex* mutex){   if (mFifo.messageAvailable())   {      if (mutex)      {         resip::Lock lock(*mutex);          internalProcess(std::auto_ptr<Message>(mFifo.getNext()));      }      else      {         internalProcess(std::auto_ptr<Message>(mFifo.getNext()));      }   }   return mFifo.messageAvailable();}bool DialogUsageManager::process(int timeoutMs, resip::RWMutex* mutex){   std::auto_ptr<Message> message;   if(timeoutMs == -1)   {      message.reset(mFifo.getNext());   }   else   {      message.reset(mFifo.getNext(timeoutMs));   }   if (message.get())   {      if (mutex)      {         resip::Lock lock(*mutex);          internalProcess(message);      }      else      {         internalProcess(message);      }   }   return mFifo.messageAvailable();}boolDialogUsageManager::validateRequestURI(const SipMessage& request){   // RFC3261 - 8.2.1   if (!getMasterProfile()->isMethodSupported(request.header(h_RequestLine).getMethod()))   {      InfoLog (<< "Received an unsupported method: " << request.brief());      SipMessage failure;      makeResponse(failure, request, 405);      failure.header(h_Allows) = getMasterProfile()->getAllowedMethods();      sendResponse(failure);      return false;   }   // RFC3261 - 8.2.2   if (!getMasterProfile()->isSchemeSupported(request.header(h_RequestLine).uri().scheme()))   {      InfoLog (<< "Received an unsupported scheme: " << request.brief());      SipMessage failure;      makeResponse(failure, request, 416);      sendResponse(failure);	  return false;   }   return true;}boolDialogUsageManager::validateRequiredOptions(const SipMessage& request){   // RFC 2162 - 8.2.2   if(request.exists(h_Requires) &&                 // Don't check requires if method is ACK or CANCEL      (request.header(h_RequestLine).getMethod() != ACK ||       request.header(h_RequestLine).getMethod() != CANCEL))   {      Tokens unsupported = getMasterProfile()->getUnsupportedOptionsTags(request.header(h_Requires));	  if (!unsupported.empty())	  {	     InfoLog (<< "Received an unsupported option tag(s): " << request.brief());         SipMessage failure;         makeResponse(failure, request, 420);         failure.header(h_Unsupporteds) = unsupported;         sendResponse(failure);         return false;	  }   }   return true;}boolDialogUsageManager::validate100RelSuport(const SipMessage& request){   if(request.header(h_RequestLine).getMethod() == INVITE)   {      if (getMasterProfile()->getUasReliableProvisionalMode() == MasterProfile::Required)      {         if (!(request.exists(h_Requires) && request.header(h_Requires).find(Token(Symbols::C100rel))               || request.exists(h_Supporteds) && request.header(h_Supporteds).find(Token(Symbols::C100rel))))         {            SipMessage failure;            makeResponse(failure, request, 421);            failure.header(h_Requires).push_back(Token(Symbols::C100rel));            sendResponse(failure);            return false;         }      }   }   return true;}boolDialogUsageManager::validateContent(const SipMessage& request){   // RFC3261 - 8.2.3   // Don't need to validate content headers if they are specified as optional in the content-disposition   if (!(request.exists(h_ContentDisposition) &&         request.header(h_ContentDisposition).isWellFormed() &&        request.header(h_ContentDisposition).exists(p_handling) &&        isEqualNoCase(request.header(h_ContentDisposition).param(p_handling), Symbols::Optional)))   {     if (request.exists(h_ContentType) && !getMasterProfile()->isMimeTypeSupported(request.header(h_RequestLine).method(), request.header(h_ContentType)))      {         InfoLog (<< "Received an unsupported mime type: " << request.header(h_ContentType) << " for " << request.brief());         SipMessage failure;         makeResponse(failure, request, 415);         failure.header(h_Accepts) = getMasterProfile()->getSupportedMimeTypes(request.header(h_RequestLine).method());         sendResponse(failure);         return false;      }     if (request.exists(h_ContentEncoding) && !getMasterProfile()->isContentEncodingSupported(request.header(h_ContentEncoding)))      {         InfoLog (<< "Received an unsupported mime type: " << request.header(h_ContentEncoding) << " for " << request.brief());         SipMessage failure;         makeResponse(failure, request, 415);         failure.header(h_AcceptEncodings) = getMasterProfile()->getSupportedEncodings();         sendResponse(failure);         return false;      }      if (getMasterProfile()->validateContentLanguageEnabled() &&          request.exists(h_ContentLanguages) && !getMasterProfile()->isLanguageSupported(request.header(h_ContentLanguages)))      {         InfoLog (<< "Received an unsupported language: " << request.header(h_ContentLanguages).front() << " for " << request.brief());         SipMessage failure;         makeResponse(failure, request, 415);         failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages();         sendResponse(failure);         return false;      }   }   return true;}boolDialogUsageManager::validateAccept(const SipMessage& request){   MethodTypes method = request.header(h_RequestLine).method();   // checks for Accept to comply with SFTF test case 216   if(request.exists(h_Accepts))   {      for (Mimes::const_iterator i = request.header(h_Accepts).begin();           i != request.header(h_Accepts).end(); i++)      {         if (getMasterProfile()->isMimeTypeSupported(method, *i))         {            return true;  // Accept header passes validation if we support as least one of the mime types         }      }   }   // If no Accept header then application/sdp should be assumed for certain methods   else if(method == INVITE ||           method == OPTIONS ||           method == PRACK ||           method == UPDATE)   {      if (getMasterProfile()->isMimeTypeSupported(request.header(h_RequestLine).method(), Mime("application", "sdp")))      {         return true;      }   }   else   {      // Other method without an Accept Header      return true;   }   InfoLog (<< "Received unsupported mime types in accept header: " << request.brief());   SipMessage failure;   makeResponse(failure, request, 406);   failure.header(h_Accepts) = getMasterProfile()->getSupportedMimeTypes(method);   sendResponse(failure);   return false;}boolDialogUsageManager::mergeRequest(const SipMessage& request){   assert(request.isRequest());   assert(request.isExternal());   if (!request.header(h_To).exists(p_tag))   {      if (mMergedRequests.count(MergedRequestKey(request, getMasterProfile()->checkReqUriInMergeDetectionEnabled())))      {         SipMessage failure;         makeResponse(failure, request, 482, "Merged Request");         failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages();         sendResponse(failure);         return true;      }   }   return false;}voidDialogUsageManager::processRequest(const SipMessage& request){   DebugLog ( << "DialogUsageManager::processRequest: " << request.brief());   if (mShutdownState != Running && mShutdownState != ShutdownRequested)   {      WarningLog (<< "Ignoring a request since we are shutting down " << request.brief());      SipMessage failure;      makeResponse(failure, request, 480, "UAS is shutting down");      sendResponse(failure);      return;   }   if (request.header(h_RequestLine).method() == PUBLISH)   {      processPublish(request);      return;   }   bool toTag = request.header(h_To).exists(p_tag);   if(request.header(h_RequestLine).getMethod() == REGISTER && toTag && getMasterProfile()->allowBadRegistrationEnabled())   {       toTag = false;   }   assert(mAppDialogSetFactory.get());   // !jf! note, the logic was reversed during ye great merge of March of Ought 5   if (toTag ||       findDialogSet(DialogSetId(request)))   {      switch (request.header(h_RequestLine).getMethod())      {         case REGISTER:         {            SipMessage failure;            makeResponse(failure, request, 400, "Registration requests can't have To: tags.");            failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages();            sendResponse(failure);            break;         }         default:         {            DialogSet* ds = findDialogSet(DialogSetId(request));            if (ds == 0)            {               if (request.header(h_RequestLine).method() != ACK)               {                  SipMessage failure;                  makeResponse(failure, request, 481);                  failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages();                  InfoLog (<< "Rejected request (which was in a dialog) " << request.brief());                  sendResponse(failure);               }               else               {                  InfoLog (<< "ACK doesn't match any dialog" << request.brief());               }            }            else            {               InfoLog (<< "Handling in-dialog request: " << request.brief());               ds->dispatch(request);            }         }      }   }   else   {      switch (request.header(h_RequestLine).getMethod())      {         case ACK:            DebugLog (<< "Discarding request: " << request.brief());            break;         case PRACK:         case BYE:         case UPDATE:         case INFO: // !rm! in an ideal world         {            SipMessage failure;            makeResponse(failure, request, 481);            failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages();            sendResponse(failure);            break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -