tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

media_section.rs (6528B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 use std::convert::TryInto;
      6 use std::os::raw::c_char;
      7 use std::ptr;
      8 
      9 use libc::size_t;
     10 
     11 use nserror::{nsresult, NS_ERROR_INVALID_ARG, NS_OK};
     12 use rsdparsa::attribute_type::{SdpAttribute, SdpAttributeRtpmap};
     13 use rsdparsa::media_type::{SdpFormatList, SdpMedia, SdpMediaValue, SdpProtocolValue};
     14 use rsdparsa::{SdpBandwidth, SdpSession};
     15 
     16 use network::{get_bandwidth, RustSdpConnection};
     17 use types::StringView;
     18 
     19 #[no_mangle]
     20 pub unsafe extern "C" fn sdp_get_media_section(
     21    session: *const SdpSession,
     22    index: size_t,
     23 ) -> *const SdpMedia {
     24    return match (&(*session).media).get(index) {
     25        Some(m) => m,
     26        None => ptr::null(),
     27    };
     28 }
     29 
     30 #[repr(C)]
     31 #[derive(Clone, Copy)]
     32 pub enum RustSdpMediaValue {
     33    Audio,
     34    Video,
     35    Application,
     36 }
     37 
     38 impl<'a> From<&'a SdpMediaValue> for RustSdpMediaValue {
     39    fn from(val: &SdpMediaValue) -> Self {
     40        match *val {
     41            SdpMediaValue::Audio => RustSdpMediaValue::Audio,
     42            SdpMediaValue::Video => RustSdpMediaValue::Video,
     43            SdpMediaValue::Application => RustSdpMediaValue::Application,
     44        }
     45    }
     46 }
     47 
     48 #[no_mangle]
     49 pub unsafe extern "C" fn sdp_rust_get_media_type(sdp_media: *const SdpMedia) -> RustSdpMediaValue {
     50    RustSdpMediaValue::from((*sdp_media).get_type())
     51 }
     52 
     53 #[repr(C)]
     54 #[derive(Clone, Copy)]
     55 pub enum RustSdpProtocolValue {
     56    RtpSavpf,
     57    UdpTlsRtpSavp,
     58    TcpDtlsRtpSavp,
     59    UdpTlsRtpSavpf,
     60    TcpDtlsRtpSavpf,
     61    DtlsSctp,
     62    UdpDtlsSctp,
     63    TcpDtlsSctp,
     64    RtpAvp,
     65    RtpAvpf,
     66    RtpSavp,
     67 }
     68 
     69 impl<'a> From<&'a SdpProtocolValue> for RustSdpProtocolValue {
     70    fn from(val: &SdpProtocolValue) -> Self {
     71        match *val {
     72            SdpProtocolValue::RtpSavpf => RustSdpProtocolValue::RtpSavpf,
     73            SdpProtocolValue::UdpTlsRtpSavp => RustSdpProtocolValue::UdpTlsRtpSavp,
     74            SdpProtocolValue::TcpDtlsRtpSavp => RustSdpProtocolValue::TcpDtlsRtpSavp,
     75            SdpProtocolValue::UdpTlsRtpSavpf => RustSdpProtocolValue::UdpTlsRtpSavpf,
     76            SdpProtocolValue::TcpDtlsRtpSavpf => RustSdpProtocolValue::TcpDtlsRtpSavpf,
     77            SdpProtocolValue::DtlsSctp => RustSdpProtocolValue::DtlsSctp,
     78            SdpProtocolValue::UdpDtlsSctp => RustSdpProtocolValue::UdpDtlsSctp,
     79            SdpProtocolValue::TcpDtlsSctp => RustSdpProtocolValue::TcpDtlsSctp,
     80            SdpProtocolValue::RtpAvp => RustSdpProtocolValue::RtpAvp,
     81            SdpProtocolValue::RtpAvpf => RustSdpProtocolValue::RtpAvpf,
     82            SdpProtocolValue::RtpSavp => RustSdpProtocolValue::RtpSavp,
     83        }
     84    }
     85 }
     86 
     87 #[no_mangle]
     88 pub unsafe extern "C" fn sdp_get_media_protocol(
     89    sdp_media: *const SdpMedia,
     90 ) -> RustSdpProtocolValue {
     91    RustSdpProtocolValue::from((*sdp_media).get_proto())
     92 }
     93 
     94 #[repr(C)]
     95 #[derive(Clone, Copy)]
     96 pub enum RustSdpFormatType {
     97    Integers,
     98    Strings,
     99 }
    100 
    101 #[no_mangle]
    102 pub unsafe extern "C" fn sdp_get_format_type(sdp_media: *const SdpMedia) -> RustSdpFormatType {
    103    match *(*sdp_media).get_formats() {
    104        SdpFormatList::Integers(_) => RustSdpFormatType::Integers,
    105        SdpFormatList::Strings(_) => RustSdpFormatType::Strings,
    106    }
    107 }
    108 
    109 #[no_mangle]
    110 pub unsafe extern "C" fn sdp_get_format_string_vec(
    111    sdp_media: *const SdpMedia,
    112 ) -> *const Vec<String> {
    113    if let SdpFormatList::Strings(ref formats) = *(*sdp_media).get_formats() {
    114        formats
    115    } else {
    116        ptr::null()
    117    }
    118 }
    119 
    120 #[no_mangle]
    121 pub unsafe extern "C" fn sdp_get_format_u32_vec(sdp_media: *const SdpMedia) -> *const Vec<u32> {
    122    if let SdpFormatList::Integers(ref formats) = *(*sdp_media).get_formats() {
    123        formats
    124    } else {
    125        ptr::null()
    126    }
    127 }
    128 
    129 #[no_mangle]
    130 pub unsafe extern "C" fn sdp_set_media_port(sdp_media: *mut SdpMedia, port: u32) {
    131    (*sdp_media).set_port(port);
    132 }
    133 
    134 #[no_mangle]
    135 pub unsafe extern "C" fn sdp_get_media_port(sdp_media: *const SdpMedia) -> u32 {
    136    (*sdp_media).get_port()
    137 }
    138 
    139 #[no_mangle]
    140 pub unsafe extern "C" fn sdp_get_media_port_count(sdp_media: *const SdpMedia) -> u32 {
    141    (*sdp_media).get_port_count()
    142 }
    143 
    144 #[no_mangle]
    145 pub unsafe extern "C" fn sdp_get_media_bandwidth(
    146    sdp_media: *const SdpMedia,
    147    bandwidth_type: *const c_char,
    148 ) -> u32 {
    149    get_bandwidth((*sdp_media).get_bandwidth(), bandwidth_type)
    150 }
    151 
    152 #[no_mangle]
    153 pub unsafe extern "C" fn sdp_get_media_bandwidth_vec(
    154    sdp_media: *const SdpMedia,
    155 ) -> *const Vec<SdpBandwidth> {
    156    (*sdp_media).get_bandwidth()
    157 }
    158 
    159 #[no_mangle]
    160 pub unsafe extern "C" fn sdp_media_has_connection(sdp_media: *const SdpMedia) -> bool {
    161    (*sdp_media).get_connection().is_some()
    162 }
    163 
    164 #[no_mangle]
    165 pub unsafe extern "C" fn sdp_get_media_connection(
    166    sdp_media: *const SdpMedia,
    167    ret: *mut RustSdpConnection,
    168 ) -> nsresult {
    169    if let &Some(ref connection) = (*sdp_media).get_connection() {
    170        *ret = RustSdpConnection::from(connection);
    171        return NS_OK;
    172    }
    173    NS_ERROR_INVALID_ARG
    174 }
    175 
    176 #[no_mangle]
    177 pub unsafe extern "C" fn sdp_get_media_attribute_list(
    178    sdp_media: *const SdpMedia,
    179 ) -> *const Vec<SdpAttribute> {
    180    (*sdp_media).get_attributes()
    181 }
    182 
    183 #[no_mangle]
    184 pub unsafe extern "C" fn sdp_media_clear_codecs(sdp_media: *mut SdpMedia) {
    185    (*sdp_media).remove_codecs()
    186 }
    187 
    188 #[no_mangle]
    189 pub unsafe extern "C" fn sdp_media_add_codec(
    190    sdp_media: *mut SdpMedia,
    191    pt: u8,
    192    codec_name: StringView,
    193    clockrate: u32,
    194    channels: u16,
    195 ) -> nsresult {
    196    let rtpmap = SdpAttributeRtpmap {
    197        payload_type: pt,
    198        codec_name: match codec_name.try_into() {
    199            Ok(x) => x,
    200            Err(boxed_error) => {
    201                error!("Error while parsing string, description: {}", boxed_error);
    202                return NS_ERROR_INVALID_ARG;
    203            }
    204        },
    205        frequency: clockrate,
    206        channels: Some(channels as u32),
    207    };
    208 
    209    match (*sdp_media).add_codec(rtpmap) {
    210        Ok(_) => NS_OK,
    211        Err(_) => NS_ERROR_INVALID_ARG,
    212    }
    213 }
    214 
    215 #[no_mangle]
    216 pub unsafe extern "C" fn sdp_media_add_datachannel(
    217    sdp_media: *mut SdpMedia,
    218    name: StringView,
    219    port: u16,
    220    streams: u16,
    221    message_size: u32,
    222 ) -> nsresult {
    223    let name_str = match name.try_into() {
    224        Ok(x) => x,
    225        Err(_) => {
    226            return NS_ERROR_INVALID_ARG;
    227        }
    228    };
    229    match (*sdp_media).add_datachannel(name_str, port, streams, message_size) {
    230        Ok(_) => NS_OK,
    231        Err(_) => NS_ERROR_INVALID_ARG,
    232    }
    233 }