📄 sdpparser.cpp
字号:
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 + -