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

📄 sdpparser.cpp

📁 Conferencing code using Dialogic hardware
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  	  case SDP_CMD_I:
		   if (pSdpParser->GetLine(token, sizeof(token)) ){
				 str_storestring(&sdp_i, token);
		   }
		   break;

	  // bandwith ... ( not really supported )
	   case SDP_CMD_B:
	  	    if (pSdpParser->GetLine(token, sizeof(token)) ){
		 	    str_storestring(&sdp_b, token);
			}
			break;

			// attributes
	   case SDP_CMD_A:
			if (pSdpParser->GetLine(token, sizeof(token)) ){
			    str_storestring(&sdp_a, token);
            } 
			break;

      // encryption key - not supported
	   case SDP_CMD_K:
			if ( pSdpParser->GetLine(token, sizeof(token)) ){
				str_storestring(&sdp_k, token);
            }
			break;

          // Connection
       case SDP_CMD_C:
            Parse_c_line(pSdpParser);
            break;

       default:
           brc = false;
  } // swithc
 return brc;
}

//*****************************************************************************
// Purpose	: 
//     Parse session data lines
// Parameters:	
//     sdp message
// Returns:	
//     none
//*****************************************************************************
bool CSdpParser::ParseSessionDataLines(SDP_CMD sdp_cmd) {
bool brc = true;
char token[MAXTOKEN];

  switch(sdp_cmd){
  // v=0 (version is a number)
	case SDP_CMD_V:			// version
	   	 if ( ! GetNextToken(token,sizeof(token) ) ) {
			  LOG(LOG_WARNING, SDP_MODULE_NAME,"incomplete sdp descriptor 'v[missing value]");
		 } else {
			 if (!GetUNumber(token,&sdp_v)){
				  LOG(LOG_WARNING, SDP_MODULE_NAME,"invalid value: v=%s",token);
			 } 
         } 
		 break;

  // o=owner of the session is a text line
	case SDP_CMD_O:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_o, token);
		 }
		 break;
				
  // s=session name is a text line
	case SDP_CMD_S:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_s, token);
         }
		 break;

  // session level attributes
	case SDP_CMD_A:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_a, token);
		 }
		 break;

  // t= start stop - 2 numbers
	case SDP_CMD_T:
		 if ( ! GetNextToken(token,sizeof(token) ) ) {
			  LOG(LOG_WARNING, SDP_MODULE_NAME,"incomplete sdp descriptor 't[missing value]");
		 } else if (!GetUNumber(token,&sdp_tstart)){
			  LOG(LOG_WARNING, SDP_MODULE_NAME,"invalid value: t=%s",token);
		 } else  if ( ! GetNextToken(token,sizeof(token) ) ) {
					  LOG(LOG_WARNING, SDP_MODULE_NAME,"incomplete sdp descriptor 't[missing second value]");
		 } else if (!GetUNumber(token,&sdp_tstop)){
 			  LOG(LOG_WARNING, SDP_MODULE_NAME,"invalid second value %s: expected  t=num num", token);
		 } 
		 break;

	// phone number
	case SDP_CMD_P:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_p, token);
		 }
		 break;

	// email
	case SDP_CMD_E:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_e, token);
		 }
		 break;

	// z number -1h  number 0 ... ( not really supported )
	case SDP_CMD_Z:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_z, token);
		 }
		 break;

	// r repeat times (not supported)
	case SDP_CMD_R:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_r, token);
		 }
		 break;

	case SDP_CMD_U:
		 if ( GetLine(token, sizeof(token)) ){
			  str_storestring(&sdp_u, token);
		 }
		 break;

      // Connection
    case SDP_CMD_C:
         m_MediaInfo.Parse_c_line(this);
		 break;

	default:
        { const char *sdp_cmd_name ;
            str_findname(sdp_cmd,&sdp_cmd_name,sdp_table);
		    LOG(LOG_ERR1, SDP_MODULE_NAME,"App error: invalid command code/missing switch case %d '%s'",
                 sdp_cmd, sdp_cmd_name);
        }
         brc = false;
		 break;
  } // switch
 return brc;
}

//*****************************************************************************
// Purpose	: 
//     Extract data from sdp message
// Parameters:	
//     sdp message
// Returns:	
//     none
//*****************************************************************************
bool CSdpParser::ParseSdpOffer(){
  char token[MAXTOKEN];
  SDP_CMD sdp_cmd;

  LOG(LOG_DBG, SDP_MODULE_NAME,"Enter ParseSdpOffer()");

  clear_vars();
  unsigned int line = GetCurrentLineNumber();
  P_STATE state = STATE_BGN;
  CnfDemoMediaInfo *pMediaInfo = &m_MediaInfo;


  while ( GetNextToken(token,sizeof(token) ) ) {
	  if (!str_findcode(token,(int *)&sdp_cmd,sdp_table)){
		   LOG(LOG_WARNING, SDP_MODULE_NAME,"unknown sdp descriptor '%s'",token);
	  }else if (skip_equal(token)){
		  if (sdp_cmd == SDP_CMD_M ) {
			  // Media command
			  if ( GetLine(token, sizeof(token)) ){
				   str_storestring(&pMediaInfo->sdp_m, token);
				   LOG(LOG_DBG,SDP_MODULE_NAME,"m=%s",pMediaInfo->sdp_m);
              }
              state = pMediaInfo->ProcessMediaCommand(token);
          }else {
			  switch (state) {
				  case STATE_BGN:
					   ParseSessionDataLines(sdp_cmd);
                       break;

				  case STATE_MEDIA:
                       if (! pMediaInfo->ParseMediaDataLines(sdp_cmd, this)  ){
                             LOG(LOG_WARNING, SDP_MODULE_NAME, "Command %s= is not valid after command m=", token);
                       }
                       break;
					  
				  case STATE_SKIP_MEDIA:
        			   LOG(LOG_WARNING, SDP_MODULE_NAME, "Command %s= is skipped(media not supported", token);
              }// switch state
		  }// not cmd_m ends
      } // else (skip_equal)

	  // skip rest of the same line
	  if (GetCurrentLineNumber() == line ){
		  if (! GotoNextLine() ){
			  break;
		  }
	  }	
	  line = GetCurrentLineNumber();
  } // while
  return true;
}

//*****************************************************************************
// Purpose	: 
//     Dump sdp variables
// Parameters:	
//     sdp message
// Returns:	
//     none CHECKNULL
//*****************************************************************************
void CnfDemoMediaInfo::Dump(void){
   LOG(LOG_DBG,SDP_MODULE_NAME, "media         m=%s", CHECKNULL(sdp_m));
   LOG(LOG_DBG,SDP_MODULE_NAME, "  Information i=%s", CHECKNULL(sdp_i));
   LOG(LOG_DBG,SDP_MODULE_NAME, "  Encryption  k=%s", CHECKNULL(sdp_k));
   LOG(LOG_DBG,SDP_MODULE_NAME, "  Bandwith    b=%s", CHECKNULL(sdp_b));
   LOG(LOG_DBG,SDP_MODULE_NAME, "  Attributes  a=%s", CHECKNULL(sdp_a));

    if(sdp_c){
		const char *ip_name;
		str_findname(sdp_remote_ip_version, &ip_name,ipv_addr);
		      LOG(LOG_DBG,SDP_MODULE_NAME, "conn info   c=%s",	 sdp_c);
			  LOG(LOG_DBG,SDP_MODULE_NAME, "               ip  = %s", sdp_remote_ip);
			  LOG(LOG_DBG,SDP_MODULE_NAME, "               ipv = %d %s", sdp_remote_ip_version, ip_name);
	}
	          LOG(LOG_DBG,SDP_MODULE_NAME, "remote port        = %d 0x%x%",	m_remote_port, m_remote_port);

 return;
}
//*****************************************************************************
// Purpose	: 
//     Dump sdp variables
// Parameters:	
//     sdp message
// Returns:	
//     none
//*****************************************************************************
void CSdpParser::Dump(void){
     LOG(LOG_DBG,SDP_MODULE_NAME, "Version     v=%d", sdp_v);
	 LOG(LOG_DBG,SDP_MODULE_NAME, "Owner       o=%s", CHECKNULL(sdp_o));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "Session     s=%s", CHECKNULL(sdp_s));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "attrubute(s)a=%s", CHECKNULL(sdp_a));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "URL         u=%s", CHECKNULL(sdp_u));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "email       e=%s", CHECKNULL(sdp_e));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "phone       p=%s", CHECKNULL(sdp_p));
     LOG(LOG_DBG,SDP_MODULE_NAME, "time        t=%d %d", sdp_tstart, sdp_tstop);
	 LOG(LOG_DBG,SDP_MODULE_NAME, "time zone   z=%s", CHECKNULL(sdp_z));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "repeat time z=%s", CHECKNULL(sdp_r));
	 LOG(LOG_DBG,SDP_MODULE_NAME, "url         u=%s", CHECKNULL(sdp_u));
   m_MediaInfo.Dump();
 return;
}

⌨️ 快捷键说明

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