int sdp_message_k_key_set (sdp_message_t * sdp, int pos_media, char *keytype, char *keydata) { sdp_key_t *key; sdp_media_t *med; if (sdp == NULL) return OSIP_BADPARAMETER; if ((pos_media != -1) && (osip_list_size (&sdp->m_medias) < pos_media + 1)) return OSIP_UNDEFINED_ERROR; sdp_key_init (&key); key->k_keytype = keytype; key->k_keydata = keydata; if (pos_media == -1) { sdp->k_key = key; return OSIP_SUCCESS; } med = (sdp_media_t *) osip_list_get (&sdp->m_medias, pos_media); med->k_key = key; return OSIP_SUCCESS; }
int sdp_message_k_key_set (sdp_message_t * sdp, int pos_media, char *keytype, char *keydata) { sdp_key_t *key; sdp_media_t *med; if (sdp == NULL) return -1; if ((pos_media != -1) && (osip_list_size (&sdp->m_medias) < pos_media + 1)) return -1; sdp_key_init (&key); key->k_keytype = keytype; key->k_keydata = keydata; if (pos_media == -1) { sdp->k_key = key; return 0; } med = (sdp_media_t *) osip_list_get (&sdp->m_medias, pos_media); med->k_key = key; return 0; }
static int sdp_message_parse_k (sdp_message_t * sdp, char *buf, char **next) { char *equal; char *crlf; int i; char *colon; sdp_key_t *k_header; char *tmp; char *tmp_next; *next = buf; equal = buf; while ((*equal != '=') && (*equal != '\0')) equal++; if (*equal == '\0') return ERR_ERROR; /* check if header is "k" */ if (equal[-1] != 'k') 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; /* k=\r ?? bad header */ tmp = equal + 1; i = sdp_key_init (&k_header); if (i != 0) return ERR_ERROR; /* k=key-type[:key-data] */ /* is there any key-data? */ colon = strchr (equal + 1, ':'); if ((colon != NULL) && (colon < crlf)) { /* att-field is alpha-numeric */ i = __osip_set_next_token (&(k_header->k_keytype), tmp, ':', &tmp_next); if (i != 0) { sdp_key_free (k_header); return -1; } tmp = tmp_next; 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; }