コード例 #1
0
ファイル: sdp.c プロジェクト: 26597925/shairplay
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;
	}
}
コード例 #2
0
ファイル: AmSdp.cpp プロジェクト: BackupTheBerlios/sems-svn
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;
}
コード例 #3
0
ファイル: AmSdp.cpp プロジェクト: BackupTheBerlios/sems-svn
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;
}