/* Function: sdp_validate_sdp * Description: Validate an SDP structure. * Parameters: sdp_p The SDP handle of the struct to validate. * Returns: A result value indicating if the validation was successful. * If not, what type of error was encountered. */ sdp_result_e sdp_validate_sdp (sdp_t *sdp_p) { int i; u16 num_media_levels; /* Need to validate c= info is specified at session level or * at all m= levels. */ if (sdp_connection_valid((void *)sdp_p, SDP_SESSION_LEVEL) == FALSE) { num_media_levels = sdp_get_num_media_lines((void *)sdp_p); for (i=1; i <= num_media_levels; i++) { if (sdp_connection_valid((void *)sdp_p, (unsigned short)i) == FALSE) { sdp_parse_error(sdp_p->peerconnection, "%s c= connection line not specified for " "every media level, validation failed.", sdp_p->debug_str); return (SDP_FAILURE); } } } /* Validate required lines were specified */ if ((sdp_owner_valid((void *)sdp_p) == FALSE) && (sdp_p->conf_p->owner_reqd == TRUE)) { sdp_parse_error(sdp_p->peerconnection, "%s o= owner line not specified, validation failed.", sdp_p->debug_str); return (SDP_FAILURE); } if ((sdp_session_name_valid((void *)sdp_p) == FALSE) && (sdp_p->conf_p->session_name_reqd == TRUE)) { sdp_parse_error(sdp_p->peerconnection, "%s s= session name line not specified, validation failed.", sdp_p->debug_str); return (SDP_FAILURE); } if ((sdp_timespec_valid((void *)sdp_p) == FALSE) && (sdp_p->conf_p->timespec_reqd == TRUE)) { sdp_parse_error(sdp_p->peerconnection, "%s t= timespec line not specified, validation failed.", sdp_p->debug_str); return (SDP_FAILURE); } return (SDP_SUCCESS); }
bool SipccSdpMediaSection::LoadConnection(sdp_t* sdp, uint16_t level, SdpErrorHolder& errorHolder) { if (!sdp_connection_valid(sdp, level)) { level = SDP_SESSION_LEVEL; if (!sdp_connection_valid(sdp, level)) { errorHolder.AddParseError(sdp_get_media_line_number(sdp, level), "Missing c= line"); return false; } } sdp_nettype_e type = sdp_get_conn_nettype(sdp, level); if (type != SDP_NT_INTERNET) { errorHolder.AddParseError(sdp_get_media_line_number(sdp, level), "Unsupported network type"); return false; } sdp::AddrType addrType; switch (sdp_get_conn_addrtype(sdp, level)) { case SDP_AT_IP4: addrType = sdp::kIPv4; break; case SDP_AT_IP6: addrType = sdp::kIPv6; break; default: errorHolder.AddParseError(sdp_get_media_line_number(sdp, level), "Unsupported address type"); return false; } std::string address = sdp_get_conn_address(sdp, level); int16_t ttl = static_cast<uint16_t>(sdp_get_mcast_ttl(sdp, level)); if (ttl < 0) { ttl = 0; } int32_t numAddr = static_cast<uint32_t>(sdp_get_mcast_num_of_addresses(sdp, level)); if (numAddr < 0) { numAddr = 0; } mConnection = MakeUnique<SdpConnection>(addrType, address, ttl, numAddr); return true; }