1#![allow(deprecated)]
6
7use crate::{ffi, WebRTCDataChannelState, WebRTCPriorityType};
8use glib::{
9    object::ObjectType as _,
10    prelude::*,
11    signal::{connect_raw, SignalHandlerId},
12    translate::*,
13};
14use std::boxed::Box as Box_;
15
16glib::wrapper! {
17    #[doc(alias = "GstWebRTCDataChannel")]
111    pub struct WebRTCDataChannel(Object<ffi::GstWebRTCDataChannel, ffi::GstWebRTCDataChannelClass>);
112
113    match fn {
114        type_ => || ffi::gst_webrtc_data_channel_get_type(),
115    }
116}
117
118impl WebRTCDataChannel {
119    #[doc(alias = "gst_webrtc_data_channel_close")]
121    pub fn close(&self) {
122        unsafe {
123            ffi::gst_webrtc_data_channel_close(self.to_glib_none().0);
124        }
125    }
126
127    #[cfg_attr(feature = "v1_22", deprecated = "Since 1.22")]
135    #[allow(deprecated)]
136    #[doc(alias = "gst_webrtc_data_channel_send_data")]
137    pub fn send_data(&self, data: Option<&glib::Bytes>) {
138        unsafe {
139            ffi::gst_webrtc_data_channel_send_data(self.to_glib_none().0, data.to_glib_none().0);
140        }
141    }
142
143    #[cfg(feature = "v1_22")]
151    #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
152    #[doc(alias = "gst_webrtc_data_channel_send_data_full")]
153    pub fn send_data_full(&self, data: Option<&glib::Bytes>) -> Result<(), glib::Error> {
154        unsafe {
155            let mut error = std::ptr::null_mut();
156            let is_ok = ffi::gst_webrtc_data_channel_send_data_full(
157                self.to_glib_none().0,
158                data.to_glib_none().0,
159                &mut error,
160            );
161            debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
162            if error.is_null() {
163                Ok(())
164            } else {
165                Err(from_glib_full(error))
166            }
167        }
168    }
169
170    #[cfg_attr(feature = "v1_22", deprecated = "Since 1.22")]
178    #[allow(deprecated)]
179    #[doc(alias = "gst_webrtc_data_channel_send_string")]
180    pub fn send_string(&self, str: Option<&str>) {
181        unsafe {
182            ffi::gst_webrtc_data_channel_send_string(self.to_glib_none().0, str.to_glib_none().0);
183        }
184    }
185
186    #[cfg(feature = "v1_22")]
194    #[cfg_attr(docsrs, doc(cfg(feature = "v1_22")))]
195    #[doc(alias = "gst_webrtc_data_channel_send_string_full")]
196    pub fn send_string_full(&self, str: Option<&str>) -> Result<(), glib::Error> {
197        unsafe {
198            let mut error = std::ptr::null_mut();
199            let is_ok = ffi::gst_webrtc_data_channel_send_string_full(
200                self.to_glib_none().0,
201                str.to_glib_none().0,
202                &mut error,
203            );
204            debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
205            if error.is_null() {
206                Ok(())
207            } else {
208                Err(from_glib_full(error))
209            }
210        }
211    }
212
213    #[doc(alias = "buffered-amount")]
214    pub fn buffered_amount(&self) -> u64 {
215        ObjectExt::property(self, "buffered-amount")
216    }
217
218    #[doc(alias = "buffered-amount-low-threshold")]
219    pub fn buffered_amount_low_threshold(&self) -> u64 {
220        ObjectExt::property(self, "buffered-amount-low-threshold")
221    }
222
223    #[doc(alias = "buffered-amount-low-threshold")]
224    pub fn set_buffered_amount_low_threshold(&self, buffered_amount_low_threshold: u64) {
225        ObjectExt::set_property(
226            self,
227            "buffered-amount-low-threshold",
228            buffered_amount_low_threshold,
229        )
230    }
231
232    pub fn id(&self) -> i32 {
233        ObjectExt::property(self, "id")
234    }
235
236    pub fn label(&self) -> Option<glib::GString> {
237        ObjectExt::property(self, "label")
238    }
239
240    #[doc(alias = "max-packet-lifetime")]
241    pub fn max_packet_lifetime(&self) -> i32 {
242        ObjectExt::property(self, "max-packet-lifetime")
243    }
244
245    #[doc(alias = "max-retransmits")]
246    pub fn max_retransmits(&self) -> i32 {
247        ObjectExt::property(self, "max-retransmits")
248    }
249
250    pub fn is_negotiated(&self) -> bool {
251        ObjectExt::property(self, "negotiated")
252    }
253
254    pub fn is_ordered(&self) -> bool {
255        ObjectExt::property(self, "ordered")
256    }
257
258    pub fn priority(&self) -> WebRTCPriorityType {
259        ObjectExt::property(self, "priority")
260    }
261
262    pub fn protocol(&self) -> Option<glib::GString> {
263        ObjectExt::property(self, "protocol")
264    }
265
266    #[doc(alias = "ready-state")]
267    pub fn ready_state(&self) -> WebRTCDataChannelState {
268        ObjectExt::property(self, "ready-state")
269    }
270
271    #[doc(alias = "on-buffered-amount-low")]
272    pub fn connect_on_buffered_amount_low<F: Fn(&Self) + Send + Sync + 'static>(
273        &self,
274        f: F,
275    ) -> SignalHandlerId {
276        unsafe extern "C" fn on_buffered_amount_low_trampoline<
277            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
278        >(
279            this: *mut ffi::GstWebRTCDataChannel,
280            f: glib::ffi::gpointer,
281        ) {
282            let f: &F = &*(f as *const F);
283            f(&from_glib_borrow(this))
284        }
285        unsafe {
286            let f: Box_<F> = Box_::new(f);
287            connect_raw(
288                self.as_ptr() as *mut _,
289                c"on-buffered-amount-low".as_ptr() as *const _,
290                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
291                    on_buffered_amount_low_trampoline::<F> as *const (),
292                )),
293                Box_::into_raw(f),
294            )
295        }
296    }
297
298    #[doc(alias = "on-close")]
299    pub fn connect_on_close<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> SignalHandlerId {
300        unsafe extern "C" fn on_close_trampoline<
301            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
302        >(
303            this: *mut ffi::GstWebRTCDataChannel,
304            f: glib::ffi::gpointer,
305        ) {
306            let f: &F = &*(f as *const F);
307            f(&from_glib_borrow(this))
308        }
309        unsafe {
310            let f: Box_<F> = Box_::new(f);
311            connect_raw(
312                self.as_ptr() as *mut _,
313                c"on-close".as_ptr() as *const _,
314                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
315                    on_close_trampoline::<F> as *const (),
316                )),
317                Box_::into_raw(f),
318            )
319        }
320    }
321
322    #[doc(alias = "on-error")]
325    pub fn connect_on_error<F: Fn(&Self, &glib::Error) + Send + Sync + 'static>(
326        &self,
327        f: F,
328    ) -> SignalHandlerId {
329        unsafe extern "C" fn on_error_trampoline<
330            F: Fn(&WebRTCDataChannel, &glib::Error) + Send + Sync + 'static,
331        >(
332            this: *mut ffi::GstWebRTCDataChannel,
333            error: *mut glib::ffi::GError,
334            f: glib::ffi::gpointer,
335        ) {
336            let f: &F = &*(f as *const F);
337            f(&from_glib_borrow(this), &from_glib_borrow(error))
338        }
339        unsafe {
340            let f: Box_<F> = Box_::new(f);
341            connect_raw(
342                self.as_ptr() as *mut _,
343                c"on-error".as_ptr() as *const _,
344                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
345                    on_error_trampoline::<F> as *const (),
346                )),
347                Box_::into_raw(f),
348            )
349        }
350    }
351
352    #[doc(alias = "on-message-data")]
355    pub fn connect_on_message_data<F: Fn(&Self, Option<&glib::Bytes>) + Send + Sync + 'static>(
356        &self,
357        f: F,
358    ) -> SignalHandlerId {
359        unsafe extern "C" fn on_message_data_trampoline<
360            F: Fn(&WebRTCDataChannel, Option<&glib::Bytes>) + Send + Sync + 'static,
361        >(
362            this: *mut ffi::GstWebRTCDataChannel,
363            data: *mut glib::ffi::GBytes,
364            f: glib::ffi::gpointer,
365        ) {
366            let f: &F = &*(f as *const F);
367            f(
368                &from_glib_borrow(this),
369                Option::<glib::Bytes>::from_glib_borrow(data)
370                    .as_ref()
371                    .as_ref(),
372            )
373        }
374        unsafe {
375            let f: Box_<F> = Box_::new(f);
376            connect_raw(
377                self.as_ptr() as *mut _,
378                c"on-message-data".as_ptr() as *const _,
379                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
380                    on_message_data_trampoline::<F> as *const (),
381                )),
382                Box_::into_raw(f),
383            )
384        }
385    }
386
387    #[doc(alias = "on-message-string")]
390    pub fn connect_on_message_string<F: Fn(&Self, Option<&str>) + Send + Sync + 'static>(
391        &self,
392        f: F,
393    ) -> SignalHandlerId {
394        unsafe extern "C" fn on_message_string_trampoline<
395            F: Fn(&WebRTCDataChannel, Option<&str>) + Send + Sync + 'static,
396        >(
397            this: *mut ffi::GstWebRTCDataChannel,
398            data: *mut std::ffi::c_char,
399            f: glib::ffi::gpointer,
400        ) {
401            let f: &F = &*(f as *const F);
402            f(
403                &from_glib_borrow(this),
404                Option::<glib::GString>::from_glib_borrow(data)
405                    .as_ref()
406                    .as_ref()
407                    .map(|s| s.as_str()),
408            )
409        }
410        unsafe {
411            let f: Box_<F> = Box_::new(f);
412            connect_raw(
413                self.as_ptr() as *mut _,
414                c"on-message-string".as_ptr() as *const _,
415                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
416                    on_message_string_trampoline::<F> as *const (),
417                )),
418                Box_::into_raw(f),
419            )
420        }
421    }
422
423    #[doc(alias = "on-open")]
424    pub fn connect_on_open<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> SignalHandlerId {
425        unsafe extern "C" fn on_open_trampoline<
426            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
427        >(
428            this: *mut ffi::GstWebRTCDataChannel,
429            f: glib::ffi::gpointer,
430        ) {
431            let f: &F = &*(f as *const F);
432            f(&from_glib_borrow(this))
433        }
434        unsafe {
435            let f: Box_<F> = Box_::new(f);
436            connect_raw(
437                self.as_ptr() as *mut _,
438                c"on-open".as_ptr() as *const _,
439                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
440                    on_open_trampoline::<F> as *const (),
441                )),
442                Box_::into_raw(f),
443            )
444        }
445    }
446
447    #[doc(alias = "buffered-amount")]
448    pub fn connect_buffered_amount_notify<F: Fn(&Self) + Send + Sync + 'static>(
449        &self,
450        f: F,
451    ) -> SignalHandlerId {
452        unsafe extern "C" fn notify_buffered_amount_trampoline<
453            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
454        >(
455            this: *mut ffi::GstWebRTCDataChannel,
456            _param_spec: glib::ffi::gpointer,
457            f: glib::ffi::gpointer,
458        ) {
459            let f: &F = &*(f as *const F);
460            f(&from_glib_borrow(this))
461        }
462        unsafe {
463            let f: Box_<F> = Box_::new(f);
464            connect_raw(
465                self.as_ptr() as *mut _,
466                c"notify::buffered-amount".as_ptr() as *const _,
467                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
468                    notify_buffered_amount_trampoline::<F> as *const (),
469                )),
470                Box_::into_raw(f),
471            )
472        }
473    }
474
475    #[doc(alias = "buffered-amount-low-threshold")]
476    pub fn connect_buffered_amount_low_threshold_notify<F: Fn(&Self) + Send + Sync + 'static>(
477        &self,
478        f: F,
479    ) -> SignalHandlerId {
480        unsafe extern "C" fn notify_buffered_amount_low_threshold_trampoline<
481            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
482        >(
483            this: *mut ffi::GstWebRTCDataChannel,
484            _param_spec: glib::ffi::gpointer,
485            f: glib::ffi::gpointer,
486        ) {
487            let f: &F = &*(f as *const F);
488            f(&from_glib_borrow(this))
489        }
490        unsafe {
491            let f: Box_<F> = Box_::new(f);
492            connect_raw(
493                self.as_ptr() as *mut _,
494                c"notify::buffered-amount-low-threshold".as_ptr() as *const _,
495                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
496                    notify_buffered_amount_low_threshold_trampoline::<F> as *const (),
497                )),
498                Box_::into_raw(f),
499            )
500        }
501    }
502
503    #[doc(alias = "ready-state")]
504    pub fn connect_ready_state_notify<F: Fn(&Self) + Send + Sync + 'static>(
505        &self,
506        f: F,
507    ) -> SignalHandlerId {
508        unsafe extern "C" fn notify_ready_state_trampoline<
509            F: Fn(&WebRTCDataChannel) + Send + Sync + 'static,
510        >(
511            this: *mut ffi::GstWebRTCDataChannel,
512            _param_spec: glib::ffi::gpointer,
513            f: glib::ffi::gpointer,
514        ) {
515            let f: &F = &*(f as *const F);
516            f(&from_glib_borrow(this))
517        }
518        unsafe {
519            let f: Box_<F> = Box_::new(f);
520            connect_raw(
521                self.as_ptr() as *mut _,
522                c"notify::ready-state".as_ptr() as *const _,
523                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
524                    notify_ready_state_trampoline::<F> as *const (),
525                )),
526                Box_::into_raw(f),
527            )
528        }
529    }
530}
531
532unsafe impl Send for WebRTCDataChannel {}
533unsafe impl Sync for WebRTCDataChannel {}