     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62

    use ffi;
    use foreign_types::ForeignTypeRef;
    use libc::c_ulong;
    use stack::Stackable;
    use std::ffi::CStr;
    use std::str;

    /// fake free method, since SRTP_PROTECTION_PROFILE is static
    unsafe fn free(_profile: *mut ffi::SRTP_PROTECTION_PROFILE) {}

    #[allow(unused_unsafe)]
    foreign_type_and_impl_send_sync! {
        type CType = ffi::SRTP_PROTECTION_PROFILE;
        fn drop = free;

        pub struct SrtpProtectionProfile;
        /// Reference to `SrtpProtectionProfile`.
        pub struct SrtpProtectionProfileRef;
    }

    impl Stackable for SrtpProtectionProfile {
        type StackType = ffi::stack_st_SRTP_PROTECTION_PROFILE;
    }

    impl SrtpProtectionProfileRef {
        pub fn id(&self) -> SrtpProfileId {
            SrtpProfileId::from_raw(unsafe { (*self.as_ptr()).id })
        }
        pub fn name(&self) -> &'static str {
            unsafe { CStr::from_ptr((*self.as_ptr()).name as *const _) }
                .to_str()
                .expect("should be UTF-8")
        }
    }

    /// An identifier of an SRTP protection profile.
    #[derive(Debug, Copy, Clone, PartialEq, Eq)]
    pub struct SrtpProfileId(c_ulong);

    impl SrtpProfileId {
        pub const SRTP_AES128_CM_SHA1_80: SrtpProfileId = SrtpProfileId(ffi::SRTP_AES128_CM_SHA1_80);
        pub const SRTP_AES128_CM_SHA1_32: SrtpProfileId = SrtpProfileId(ffi::SRTP_AES128_CM_SHA1_32);
        pub const SRTP_AES128_F8_SHA1_80: SrtpProfileId = SrtpProfileId(ffi::SRTP_AES128_F8_SHA1_80);
        pub const SRTP_AES128_F8_SHA1_32: SrtpProfileId = SrtpProfileId(ffi::SRTP_AES128_F8_SHA1_32);
        pub const SRTP_NULL_SHA1_80: SrtpProfileId = SrtpProfileId(ffi::SRTP_NULL_SHA1_80);
        pub const SRTP_NULL_SHA1_32: SrtpProfileId = SrtpProfileId(ffi::SRTP_NULL_SHA1_32);
        #[cfg(ossl110)]
        pub const SRTP_AEAD_AES_128_GCM: SrtpProfileId = SrtpProfileId(ffi::SRTP_AEAD_AES_128_GCM);
        #[cfg(ossl110)]
        pub const SRTP_AEAD_AES_256_GCM: SrtpProfileId = SrtpProfileId(ffi::SRTP_AEAD_AES_256_GCM);

        /// Creates a `SrtpProfileId` from an integer representation.
        pub fn from_raw(value: c_ulong) -> SrtpProfileId {
            SrtpProfileId(value)
        }

        /// Returns the integer representation of `SrtpProfileId`.
        #[allow(clippy::trivially_copy_pass_by_ref)]
        pub fn as_raw(&self) -> c_ulong {
            self.0
        }
    }