static void parse_sdp_data(sdp_t *sdp) { int pos, len; pos = 0; len = strlen(sdp->data); while (pos < len) { int lfpos; /* Find newline in string */ for (lfpos=pos; sdp->data[lfpos]; lfpos++) { if (sdp->data[lfpos] == '\n') { break; } } if (sdp->data[lfpos] != '\n') { break; } /* Replace newline with '\0' and parse line */ sdp->data[lfpos] = '\0'; if (lfpos > pos && sdp->data[lfpos-1] == '\r') { sdp->data[lfpos-1] = '\0'; } parse_sdp_line(sdp, sdp->data+pos); pos = lfpos+1; } }
static bool parse_sdp_media(AmSdp* sdp_msg, char*& s, char*& next_line) { SdpMedia m; m.dir = SdpMedia::DirBoth; char* old_s = s; bool ret = parse_media_type(s,m.type) || str2i(s,m.port) || parse_transport_prot(s,m.transport); if(ret){ ERROR("while parsing 'm=%s' line.\n",old_s); return true; } if(!ret && (m.transport == TP_RTPAVP)) ret = ret || parse_codec_list(s,m.payloads); sdp_msg->media.push_back(m); s = next_line; DBG("next_line=<%s>\n",next_line); ret = ret // Media title || parse_sdp_line(sdp_msg,s,'i',true,NULL) // connection information - optional if included at session-level || parse_sdp_line(sdp_msg,s,'c',true,parse_sdp_connection) // bandwidth information || parse_sdp_line(sdp_msg,s,'b',true,NULL,false) // encryption key || parse_sdp_line(sdp_msg,s,'k',true,NULL) // zero or more media attribute lines || parse_sdp_line(sdp_msg,s,'a',true,parse_sdp_attribute,false); if(ret){ ERROR("while parsing media attributes.\n"); return true; } next_line = get_next_line(s); DBG("ret=%i; next_line=<%s>\n",ret,next_line); return ret; }
int AmSdp::parse() { char* s = r_buf; media.clear(); bool ret = parse_sdp_line(this,s,'v',false,NULL) || parse_sdp_line(this,s,'o',false,NULL) || parse_sdp_line(this,s,'s',false,NULL) || parse_sdp_line(this,s,'i',true,NULL) || parse_sdp_line(this,s,'u',true,NULL) || parse_sdp_line(this,s,'e',true,NULL,false) || parse_sdp_line(this,s,'p',true,NULL,false) || parse_sdp_line(this,s,'c',true,parse_sdp_connection) || parse_sdp_line(this,s,'b',true,NULL,false) || parse_sdp_line(this,s,'a',true,NULL,false) || parse_sdp_line(this,s,'t',true,NULL,false) || parse_sdp_line(this,s,'k',true,NULL) || parse_sdp_line(this,s,'a',true,NULL,false) || parse_sdp_line(this,s,'m',false,parse_sdp_media,false); if(!ret && conn.address.empty()){ for(vector<SdpMedia>::iterator it = media.begin(); !ret && (it != media.end()); ++it) ret = it->conn.address.empty(); if(ret){ ERROR("A connection field must be present in every\n"); ERROR("media description or at the session level.\n"); } } telephone_event_pt = findPayload("telephone-event"); return ret; }