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

📄 sdp_rfc2327.c

📁 libosip-0.9.7源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	  if (i != 0)	    {	      sdp_key_free (k_header);	      sfree (k_header);	      return -1;	    }	}    }  /* add the key at the correct place:     if there is no media line yet, then the "k=" is the     global one.   */  i = list_size (sdp->m_medias);  if (i == 0)    sdp->k_key = k_header;  else    {      sdp_media_t *last_sdp_media =	(sdp_media_t *) list_get (sdp->m_medias, i - 1);      last_sdp_media->k_key = k_header;    }  if (crlf[1] == '\n')    *next = crlf + 2;  else    *next = crlf + 1;  return WF;}intsdp_parse_a (sdp_t * sdp, char *buf, char **next){  char *equal;  char *crlf;  char *tmp;  char *tmp_next;  int i;  sdp_attribute_t *a_attribute;  char *colon;  *next = buf;  equal = buf;  while ((*equal != '=') && (*equal != '\0'))    equal++;  if (*equal == '\0')    return ERR_ERROR;  /* check if header is "a" */  if (equal[-1] != 'a')    return ERR_DISCARD;  crlf = equal + 1;  while ((*crlf != '\r') && (*crlf != '\n') && (*crlf != '\0'))    crlf++;  if (*crlf == '\0')    return ERR_ERROR;  if (crlf == equal + 1)    return ERR_ERROR;		/* a=\r ?? bad header */  tmp = equal + 1;  i = sdp_attribute_init (&a_attribute);  if (i != 0)    return ERR_ERROR;  /* a=att-field[:att-value] */  /* is there any att-value? */  colon = strchr (equal + 1, ':');  if ((colon != NULL) && (colon < crlf))    {      /* att-field is alpha-numeric */      i = set_next_token (&(a_attribute->a_att_field), tmp, ':', &tmp_next);      if (i != 0)	{	  sdp_attribute_free (a_attribute);	  sfree (a_attribute);	  return -1;	}      tmp = tmp_next;      i = set_next_token (&(a_attribute->a_att_value), tmp, '\r', &tmp_next);      if (i != 0)	{	  i =	    set_next_token (&(a_attribute->a_att_value), tmp, '\n',			    &tmp_next);	  if (i != 0)	    {	      sdp_attribute_free (a_attribute);	      sfree (a_attribute);	      return -1;	    }	}    }  else    {      i = set_next_token (&(a_attribute->a_att_field), tmp, '\r', &tmp_next);      if (i != 0)	{	  i =	    set_next_token (&(a_attribute->a_att_field), tmp, '\n',			    &tmp_next);	  if (i != 0)	    {	      sdp_attribute_free (a_attribute);	      sfree (a_attribute);	      return -1;	    }	}    }  /* add the attribute at the correct place:     if there is no media line yet, then the "a=" is the     global one.   */  i = list_size (sdp->m_medias);  if (i == 0)    list_add (sdp->a_attributes, a_attribute, -1);  else    {      sdp_media_t *last_sdp_media =	(sdp_media_t *) list_get (sdp->m_medias, i - 1);      list_add (last_sdp_media->a_attributes, a_attribute, -1);    }  if (crlf[1] == '\n')    *next = crlf + 2;  else    *next = crlf + 1;  return WF;}intsdp_parse_m (sdp_t * sdp, char *buf, char **next){  char *equal;  char *crlf;  char *tmp;  char *tmp_next;  int i;  sdp_media_t *m_header;  char *slash;  char *space;  *next = buf;  equal = buf;  while ((*equal != '=') && (*equal != '\0'))    equal++;  if (*equal == '\0')    return ERR_ERROR;  /* check if header is "m" */  if (equal[-1] != 'm')    return ERR_DISCARD;  crlf = equal + 1;  while ((*crlf != '\r') && (*crlf != '\n') && (*crlf != '\0'))    crlf++;  if (*crlf == '\0')    return ERR_ERROR;  if (crlf == equal + 1)    return ERR_ERROR;		/* a=\r ?? bad header */  tmp = equal + 1;  i = sdp_media_init (&m_header);  if (i != 0)    return ERR_ERROR;  /* m=media port ["/"integer] proto *(payload_number) */  /* media is "audio" "video" "application" "data" or other... */  i = set_next_token (&(m_header->m_media), tmp, ' ', &tmp_next);  if (i != 0)    {      sdp_media_free (m_header);      sfree (m_header);      return -1;    }  tmp = tmp_next;  slash = strchr (tmp, '/');  space = strchr (tmp, ' ');  if (space == NULL)		/* not possible! */    {      sdp_media_free (m_header);      sfree (m_header);      return ERR_ERROR;    }  if ((slash != NULL) && (slash < space))    {				/* a number of port is specified! */      i = set_next_token (&(m_header->m_port), tmp, '/', &tmp_next);      if (i != 0)	{	  sdp_media_free (m_header);	  sfree (m_header);	  return -1;	}      tmp = tmp_next;      i = set_next_token (&(m_header->m_number_of_port), tmp, ' ', &tmp_next);      if (i != 0)	{	  sdp_media_free (m_header);	  sfree (m_header);	  return -1;	}      tmp = tmp_next;    }  else    {      i = set_next_token (&(m_header->m_port), tmp, ' ', &tmp_next);      if (i != 0)	{	  sdp_media_free (m_header);	  sfree (m_header);	  return -1;	}      tmp = tmp_next;    }  i = set_next_token (&(m_header->m_proto), tmp, ' ', &tmp_next);  if (i != 0)    {      sdp_media_free (m_header);      sfree (m_header);      return -1;    }  tmp = tmp_next;  {    char *str;    int more_space_before_crlf;    space = strchr (tmp + 1, ' ');    if (space == NULL)      more_space_before_crlf = 1;    else if ((space != NULL) && (space > crlf))      more_space_before_crlf = 1;    else      more_space_before_crlf = 0;    while (more_space_before_crlf == 0)      {	i = set_next_token (&str, tmp, ' ', &tmp_next);	if (i != 0)	  {	    sdp_media_free (m_header);	    sfree (m_header);	    return -1;	  }	tmp = tmp_next;	list_add (m_header->m_payloads, str, -1);	space = strchr (tmp + 1, ' ');	if (space == NULL)	  more_space_before_crlf = 1;	else if ((space != NULL) && (space > crlf))	  more_space_before_crlf = 1;	else	  more_space_before_crlf = 0;      }    if (tmp_next < crlf)	// tmp_next is still less than clrf: no space      {	i = set_next_token (&str, tmp, '\r', &tmp_next);	if (i != 0)	  {	    i = set_next_token (&str, tmp, '\n', &tmp_next);	    if (i != 0)	      {		sdp_media_free (m_header);		sfree (m_header);		return -1;	      }	  }	list_add (m_header->m_payloads, str, -1);      }  }  list_add (sdp->m_medias, m_header, -1);  if (crlf[1] == '\n')    *next = crlf + 2;  else    *next = crlf + 1;  return WF;}intsdp_parse (sdp_t * sdp, const char *buf){  /* In SDP, headers must be in the right order */  /* This is a simple example     v=0     o=user1 53655765 2353687637 IN IP4 128.3.4.5     s=Mbone Audio     i=Discussion of Mbone Engineering Issues     e=mbone@somewhere.com     c=IN IP4 224.2.0.1/127     t=0 0     m=audio 3456 RTP/AVP 0     a=rtpmap:0 PCMU/8000   */  char *next_buf;  char *ptr;  int i;  ptr = (char *) buf;  /* mandatory */  i = sdp_parse_v (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  else if (0 == i)		/* header is not "v" */    return -1;  ptr = next_buf;  /* adtech phone use the wrong ordering and place "s" before "o" */  i = sdp_parse_s (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  /* else if (0==i) header is not "s" */  /* else ADTECH PHONE DETECTED */  ptr = next_buf;  i = sdp_parse_o (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  else if (0 == i)		/* header is not "o" */    return -1;  ptr = next_buf;  i = sdp_parse_s (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  else if (0 == i)		/* header is not "s" */    /* return -1; */    {      OSIP_TRACE (osip_trace		  (__FILE__, __LINE__, OSIP_INFO4, NULL,		   "The \"s\" parameter is mandatory, but this packet does not contain any! - anyway, we don't mind about it.\n"));    }  ptr = next_buf;  i = sdp_parse_i (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  ptr = next_buf;  i = sdp_parse_u (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  ptr = next_buf;  i = 1;  while (i == 1)    {      i = sdp_parse_e (sdp, ptr, &next_buf);      if (i == -1)		/* header is bad */	return -1;      ptr = next_buf;    }  i = 1;  while (i == 1)    {      i = sdp_parse_p (sdp, ptr, &next_buf);      if (i == -1)		/* header is bad */	return -1;      ptr = next_buf;    }  /* rfc2327: there should be at least of email or phone number! */  if (list_size (sdp->e_emails) == 0 && list_size (sdp->p_phones) == 0)    {      OSIP_TRACE (osip_trace		  (__FILE__, __LINE__, OSIP_INFO4, NULL,		   "The rfc2327 says there should be at least an email or a phone header!- anyway, we don't mind about it.\n"));    }  i = sdp_parse_c (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  ptr = next_buf;  i = 1;  while (i == 1)    {      i = sdp_parse_b (sdp, ptr, &next_buf);      if (i == -1)		/* header is bad */	return -1;      ptr = next_buf;    }  /* 1 or more "t" header + 0 or more "r" header for each "t" header */  i = sdp_parse_t (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  else if (i == ERR_DISCARD)    return -1;			/* t is mandatory */  ptr = next_buf;  if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))    return 0;  i = 1;  while (i == 1)		/* is a "r" header */    {      i = sdp_parse_r (sdp, ptr, &next_buf);      if (i == -1)		/* header is bad */	return -1;      ptr = next_buf;      if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	return 0;    }  {    int more_t_header = 1;    i = sdp_parse_t (sdp, ptr, &next_buf);    if (i == -1)		/* header is bad */      return -1;    ptr = next_buf;    if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))      return 0;    while (more_t_header == 1)      {	i = 1;	while (i == 1)		/* is a "r" header */	  {	    i = sdp_parse_r (sdp, ptr, &next_buf);	    if (i == -1)	/* header is bad */	      return -1;	    ptr = next_buf;	    if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	      return 0;	  }	i = sdp_parse_t (sdp, ptr, &next_buf);	if (i == -1)		/* header is bad */	  return -1;	else if (i == ERR_DISCARD)	  more_t_header = 0;	else	  more_t_header = 1;	/* no more "t" headers */	ptr = next_buf;	if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	  return 0;      }  }  i = sdp_parse_z (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  ptr = next_buf;  if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))    return 0;  i = sdp_parse_k (sdp, ptr, &next_buf);  if (i == -1)			/* header is bad */    return -1;  ptr = next_buf;  if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))    return 0;  /* 0 or more "a" header */  i = 1;  while (i == 1)		/* no more "a" header */    {      i = sdp_parse_a (sdp, ptr, &next_buf);      if (i == -1)		/* header is bad */	return -1;      ptr = next_buf;      if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	return 0;    }  /* 0 or more media headers */  {    int more_m_header = 1;    while (more_m_header == 1)      {	more_m_header = sdp_parse_m (sdp, ptr, &next_buf);	if (more_m_header == -1)	/* header is bad */	  return -1;	ptr = next_buf;	if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	  return 0;	i = sdp_parse_i (sdp, ptr, &next_buf);	if (i == -1)		/* header is bad */	  return -1;	ptr = next_buf;	if (*ptr == '\0' || (*ptr == '\r') || (*ptr == '\n'))	  return 0;	i = 1;	while (i == 1)	  {	    i = sdp_parse_c (sdp, ptr, &next_buf);	    if (i == -1)	/* header is bad */	      return -1;	    ptr = next_buf;

⌨️ 快捷键说明

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