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

📄 sdp_message.c

📁 libosip2-3.0.3最新版本
💻 C
📖 第 1 页 / 共 4 页
字号:
      i = __osip_set_next_token (&(k_header->k_keydata), tmp, '\r', &tmp_next);      if (i != 0)        {          i = __osip_set_next_token (&(k_header->k_keydata), tmp, '\n', &tmp_next);          if (i != 0)            {              sdp_key_free (k_header);              return -1;            }        }  } else    {      i = __osip_set_next_token (&(k_header->k_keytype), tmp, '\r', &tmp_next);      if (i != 0)        {          i = __osip_set_next_token (&(k_header->k_keytype), tmp, '\n', &tmp_next);          if (i != 0)            {              sdp_key_free (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 = osip_list_size (&sdp->m_medias);  if (i == 0)    sdp->k_key = k_header;  else    {      sdp_media_t *last_sdp_media =        (sdp_media_t *) osip_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;}static intsdp_message_parse_a (sdp_message_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 = __osip_set_next_token (&(a_attribute->a_att_field), tmp, ':', &tmp_next);      if (i != 0)        {          sdp_attribute_free (a_attribute);          return -1;        }      tmp = tmp_next;      i =        __osip_set_next_token (&(a_attribute->a_att_value), tmp, '\r', &tmp_next);      if (i != 0)        {          i =            __osip_set_next_token (&(a_attribute->a_att_value), tmp, '\n',                                   &tmp_next);          if (i != 0)            {              sdp_attribute_free (a_attribute);              return -1;            }        }  } else    {      i =        __osip_set_next_token (&(a_attribute->a_att_field), tmp, '\r', &tmp_next);      if (i != 0)        {          i =            __osip_set_next_token (&(a_attribute->a_att_field), tmp, '\n',                                   &tmp_next);          if (i != 0)            {              sdp_attribute_free (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 = osip_list_size (&sdp->m_medias);  if (i == 0)    osip_list_add (&sdp->a_attributes, a_attribute, -1);  else    {      sdp_media_t *last_sdp_media =        (sdp_media_t *) osip_list_get (&sdp->m_medias, i - 1);      osip_list_add (&last_sdp_media->a_attributes, a_attribute, -1);    }  if (crlf[1] == '\n')    *next = crlf + 2;  else    *next = crlf + 1;  return WF;}static intsdp_message_parse_m (sdp_message_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 = __osip_set_next_token (&(m_header->m_media), tmp, ' ', &tmp_next);  if (i != 0)    {      sdp_media_free (m_header);      return -1;    }  tmp = tmp_next;  slash = strchr (tmp, '/');  space = strchr (tmp, ' ');  if (space == NULL)            /* not possible! */    {      sdp_media_free (m_header);      return ERR_ERROR;    }  if ((slash != NULL) && (slash < space))    {                           /* a number of port is specified! */      i = __osip_set_next_token (&(m_header->m_port), tmp, '/', &tmp_next);      if (i != 0)        {          sdp_media_free (m_header);          return -1;        }      tmp = tmp_next;      i =        __osip_set_next_token (&(m_header->m_number_of_port), tmp, ' ', &tmp_next);      if (i != 0)        {          sdp_media_free (m_header);          return -1;        }      tmp = tmp_next;  } else    {      i = __osip_set_next_token (&(m_header->m_port), tmp, ' ', &tmp_next);      if (i != 0)        {          sdp_media_free (m_header);          return -1;        }      tmp = tmp_next;    }  i = __osip_set_next_token (&(m_header->m_proto), tmp, ' ', &tmp_next);  if (i != 0)    {      /* a few stack don't add SPACE after m_proto when rejecting all payloads */        i = __osip_set_next_token (&(m_header->m_proto), tmp, '\r', &tmp_next);        if (i != 0)          {            i = __osip_set_next_token (&(m_header->m_proto), tmp, '\n', &tmp_next);            if (i != 0)              {		sdp_media_free (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 = __osip_set_next_token (&str, tmp, ' ', &tmp_next);        if (i != 0)          {            sdp_media_free (m_header);            return -1;          }        tmp = tmp_next;        osip_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 = __osip_set_next_token (&str, tmp, '\r', &tmp_next);        if (i != 0)          {            i = __osip_set_next_token (&str, tmp, '\n', &tmp_next);            if (i != 0)              {                sdp_media_free (m_header);                return -1;              }          }        osip_list_add (&m_header->m_payloads, str, -1);      }  }  osip_list_add (&sdp->m_medias, m_header, -1);  if (crlf[1] == '\n')    *next = crlf + 2;  else    *next = crlf + 1;  return WF;}intsdp_message_parse (sdp_message_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_message_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_message_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_message_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_message_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_message_parse_i (sdp, ptr, &next_buf);  if (i == -1)                  /* header is bad */    return -1;  ptr = next_buf;  i = sdp_message_parse_u (sdp, ptr, &next_buf);  if (i == -1)                  /* header is bad */    return -1;  ptr = next_buf;  i = 1;  while (i == 1)    {      i = sdp_message_parse_e (sdp, ptr, &next_buf);      if (i == -1)              /* header is bad */        return -1;      ptr = next_buf;    }  i = 1;  while (i == 1)    {      i = sdp_message_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 (osip_list_size (&sdp->e_emails) == 0 && osip_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_message_parse_c (sdp, ptr, &next_buf);  if (i == -1)                  /* header is bad */    return -1;  ptr = next_buf;  i = 1;  while (i == 1)    {      i = sdp_message_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_message_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_message_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_message_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_message_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_message_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_message_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_message_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_message_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_message_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_message_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)

⌨️ 快捷键说明

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