use FnOnce if possible on libwebrtc callbacks

This commit is contained in:
Théo Monnom
2022-10-08 20:58:40 +02:00
parent 754bc80f31
commit 410bbbb5ed
4 changed files with 95 additions and 150 deletions
+17 -36
View File
@@ -1,5 +1,6 @@
use std::error::Error;
use std::fmt::{Debug, Display, Formatter};
use std::mem::ManuallyDrop;
use std::str::FromStr;
use cxx::UniquePtr;
@@ -123,66 +124,46 @@ impl FromStr for ffi::SdpType {
// CreateSdpObserver
pub trait CreateSdpObserver: Send {
fn on_success(&self, session_description: UniquePtr<ffi::SessionDescription>);
fn on_failure(&self, error: RTCError);
}
pub struct CreateSdpObserverWrapper {
observer: Box<dyn CreateSdpObserver>,
pub on_success: ManuallyDrop<Box<dyn FnOnce(UniquePtr<ffi::SessionDescription>) + Send>>,
pub on_failure: ManuallyDrop<Box<dyn FnOnce(RTCError) + Send>>,
}
impl CreateSdpObserverWrapper {
pub fn new(observer: Box<dyn CreateSdpObserver>) -> Self {
Self { observer }
}
fn on_success(&self, session_description: UniquePtr<ffi::SessionDescription>) {
self.observer.on_success(session_description);
unsafe {
std::ptr::read(&*self.on_success)(session_description);
}
}
fn on_failure(&self, error: RTCError) {
self.observer.on_failure(error);
unsafe {
std::ptr::read(&*self.on_failure)(error);
}
}
}
// SetLocalSdpObserver
pub trait SetLocalSdpObserver: Send {
fn on_set_local_description_complete(&self, error: RTCError);
}
pub struct SetLocalSdpObserverWrapper {
observer: Box<dyn SetLocalSdpObserver>,
}
pub struct SetLocalSdpObserverWrapper(pub ManuallyDrop<Box<dyn FnOnce(RTCError) + Send>>);
impl SetLocalSdpObserverWrapper {
pub fn new(observer: Box<dyn SetLocalSdpObserver>) -> Self {
Self { observer }
}
fn on_set_local_description_complete(&self, error: RTCError) {
self.observer.on_set_local_description_complete(error);
unsafe {
std::ptr::read(&*self.0)(error);
}
}
}
// SetRemoteSdpObserver
pub trait SetRemoteSdpObserver: Send {
fn on_set_remote_description_complete(&self, error: RTCError);
}
pub struct SetRemoteSdpObserverWrapper {
observer: Box<dyn SetRemoteSdpObserver>,
}
pub struct SetRemoteSdpObserverWrapper(pub ManuallyDrop<Box<dyn FnOnce(RTCError) + Send>>);
impl SetRemoteSdpObserverWrapper {
pub fn new(observer: Box<dyn SetRemoteSdpObserver>) -> Self {
Self { observer }
}
fn on_set_remote_description_complete(&self, error: RTCError) {
self.observer.on_set_remote_description_complete(error);
unsafe {
std::ptr::read(&*self.0)(error);
}
}
}
@@ -1,4 +1,5 @@
use std::fmt::Debug;
use std::mem::ManuallyDrop;
use cxx::UniquePtr;
@@ -304,21 +305,13 @@ impl Default for ffi::RTCOfferAnswerOptions {
}
}
pub trait AddIceCandidateObserver: Send {
fn on_complete(&self, error: RTCError);
}
pub struct AddIceCandidateObserverWrapper {
observer: Box<dyn AddIceCandidateObserver>,
}
pub struct AddIceCandidateObserverWrapper(pub ManuallyDrop<Box<dyn FnOnce(RTCError) + Send>>);
impl AddIceCandidateObserverWrapper {
pub fn new(observer: Box<dyn AddIceCandidateObserver>) -> Self {
Self { observer }
}
fn on_complete(&self, error: RTCError) {
self.observer.on_complete(error);
unsafe {
std::ptr::read(&*self.0)(error);
}
}
}