📄 sdp_rfc2327.c
字号:
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 + -