static void parse_time(pj_scanner *scanner, pjmedia_sdp_session *ses, parse_context *ctx) { pj_str_t str; ctx->last_error = PJMEDIA_SDP_EINTIME; /* check equal sign */ if (*(scanner->curptr+1) != '=') { on_scanner_error(scanner); return; } /* t= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* start time */ pj_scan_get_until_ch(scanner, ' ', &str); ses->time.start = pj_strtoul(&str); pj_scan_get_char(scanner); /* stop time */ pj_scan_get_until_chr(scanner, " \t\r", &str); ses->time.stop = pj_strtoul(&str); /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }
static void parse_media(pj_scanner *scanner, pjmedia_sdp_media *med, parse_context *ctx) { pj_str_t str; ctx->last_error = PJMEDIA_SDP_EINMEDIA; /* check the equal sign */ if (*(scanner->curptr+1) != '=') { on_scanner_error(scanner); return; } /* m= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* type */ pj_scan_get_until_ch(scanner, ' ', &med->desc.media); pj_scan_get_char(scanner); /* port */ pj_scan_get(scanner, &cs_token, &str); med->desc.port = (unsigned short)pj_strtoul(&str); if (*scanner->curptr == '/') { /* port count */ pj_scan_get_char(scanner); pj_scan_get(scanner, &cs_token, &str); med->desc.port_count = pj_strtoul(&str); } else { med->desc.port_count = 0; } if (pj_scan_get_char(scanner) != ' ') { PJ_THROW(SYNTAX_ERROR); } /* transport */ pj_scan_get_until_ch(scanner, ' ', &med->desc.transport); /* format list */ med->desc.fmt_count = 0; while (*scanner->curptr == ' ') { pj_scan_get_char(scanner); /* Check again for the end of the line */ if ((*scanner->curptr == '\r') || (*scanner->curptr == '\n')) break; pj_scan_get(scanner, &cs_token, &med->desc.fmt[med->desc.fmt_count++]); } /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }
static pjmedia_sdp_attr *parse_attr( pj_pool_t *pool, pj_scanner *scanner, parse_context *ctx) { pjmedia_sdp_attr *attr; ctx->last_error = PJMEDIA_SDP_EINATTR; attr = PJ_POOL_ALLOC_T(pool, pjmedia_sdp_attr); /* check equal sign */ if (*(scanner->curptr+1) != '=') { on_scanner_error(scanner); return NULL; } /* skip a= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* get attr name. */ pj_scan_get(scanner, &cs_token, &attr->name); if (*scanner->curptr && *scanner->curptr != '\r' && *scanner->curptr != '\n') { /* skip ':' if present. */ if (*scanner->curptr == ':') pj_scan_get_char(scanner); /* get value */ if (*scanner->curptr != '\r' && *scanner->curptr != '\n') { pj_scan_get_until_chr(scanner, "\r\n", &attr->value); } else { attr->value.ptr = NULL; attr->value.slen = 0; } } else { attr->value.ptr = NULL; attr->value.slen = 0; } /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); return attr; }
static void parse_origin(pj_scanner *scanner, pjmedia_sdp_session *ses, parse_context *ctx) { pj_str_t str; ctx->last_error = PJMEDIA_SDP_EINORIGIN; /* check equal sign */ if (*(scanner->curptr+1) != '=') { on_scanner_error(scanner); return; } /* o= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* username. */ pj_scan_get_until_ch(scanner, ' ', &ses->origin.user); pj_scan_get_char(scanner); /* id */ pj_scan_get_until_ch(scanner, ' ', &str); ses->origin.id = pj_strtoul(&str); pj_scan_get_char(scanner); /* version */ pj_scan_get_until_ch(scanner, ' ', &str); ses->origin.version = pj_strtoul(&str); pj_scan_get_char(scanner); /* network-type */ pj_scan_get_until_ch(scanner, ' ', &ses->origin.net_type); pj_scan_get_char(scanner); /* addr-type */ pj_scan_get_until_ch(scanner, ' ', &ses->origin.addr_type); pj_scan_get_char(scanner); /* address */ pj_scan_get_until_chr(scanner, " \t\r", &ses->origin.addr); /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }
static void parse_version(pj_scanner *scanner, parse_context *ctx) { ctx->last_error = PJMEDIA_SDP_EINVER; /* check equal sign */ if (*(scanner->curptr+1) != '=') { on_scanner_error(scanner); return; } /* check version is 0 */ if (*(scanner->curptr+2) != '0') { on_scanner_error(scanner); return; } /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }
static void parse_bandwidth_info(pj_scanner *scanner, pjmedia_sdp_bandw *bandw, parse_context *ctx) { pj_str_t str; ctx->last_error = PJMEDIA_SDP_EINBANDW; /* b= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* modifier */ pj_scan_get_until_ch(scanner, ':', &bandw->modifier); pj_scan_get_char(scanner); /* value */ pj_scan_get_until_chr(scanner, " \t\r\n", &str); bandw->value = pj_strtoul(&str); /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }
static void parse_connection_info(pj_scanner *scanner, pjmedia_sdp_conn *conn, parse_context *ctx) { ctx->last_error = PJMEDIA_SDP_EINCONN; /* c= */ pj_scan_advance_n(scanner, 2, SKIP_WS); /* network-type */ pj_scan_get_until_ch(scanner, ' ', &conn->net_type); pj_scan_get_char(scanner); /* addr-type */ pj_scan_get_until_ch(scanner, ' ', &conn->addr_type); pj_scan_get_char(scanner); /* address. */ pj_scan_get_until_chr(scanner, " \t\r", &conn->addr); /* We've got what we're looking for, skip anything until newline */ pj_scan_skip_line(scanner); }