Move FFI usage out of actual Sink/Source implementations

This commit is contained in:
Sebastian Dröge 2016-08-10 18:27:38 +02:00
parent e1d2751fc2
commit 4eb3d879de
6 changed files with 18 additions and 25 deletions

View file

@ -49,8 +49,7 @@ extern "C" {
classification: *const c_char, classification: *const c_char,
author: *const c_char, author: *const c_char,
rank: i32, rank: i32,
create_instance: extern "C" fn(controller: SourceController) create_instance: fn(controller: SourceController) -> Box<Source>,
-> *mut Box<Source>,
protocols: *const c_char, protocols: *const c_char,
push_only: GBoolean) push_only: GBoolean)
-> GBoolean; -> GBoolean;
@ -64,8 +63,7 @@ extern "C" {
classification: *const c_char, classification: *const c_char,
author: *const c_char, author: *const c_char,
rank: i32, rank: i32,
create_instance: extern "C" fn(controller: SinkController) create_instance: fn(controller: SinkController) -> Box<Sink>,
-> *mut Box<Sink>,
protocols: *const c_char) protocols: *const c_char)
-> GBoolean; -> GBoolean;
} }
@ -83,7 +81,7 @@ pub extern "C" fn sources_register(plugin: *const c_void) -> GBoolean {
.unwrap() .unwrap()
.as_ptr(), .as_ptr(),
256 + 100, 256 + 100,
FileSrc::new_ptr, FileSrc::new_boxed,
CString::new("file").unwrap().as_ptr(), CString::new("file").unwrap().as_ptr(),
GBoolean::False); GBoolean::False);
@ -96,7 +94,7 @@ pub extern "C" fn sources_register(plugin: *const c_void) -> GBoolean {
.unwrap() .unwrap()
.as_ptr(), .as_ptr(),
256 + 100, 256 + 100,
HttpSrc::new_ptr, HttpSrc::new_boxed,
CString::new("http:https").unwrap().as_ptr(), CString::new("http:https").unwrap().as_ptr(),
GBoolean::True); GBoolean::True);
} }
@ -117,7 +115,7 @@ pub extern "C" fn sinks_register(plugin: *const c_void) -> GBoolean {
.unwrap() .unwrap()
.as_ptr(), .as_ptr(),
256 + 100, 256 + 100,
FileSink::new_ptr, FileSink::new_boxed,
CString::new("file").unwrap().as_ptr()); CString::new("file").unwrap().as_ptr());
} }
return GBoolean::True; return GBoolean::True;

View file

@ -38,7 +38,7 @@ unsafe impl Sync for FileSink {}
unsafe impl Send for FileSink {} unsafe impl Send for FileSink {}
impl FileSink { impl FileSink {
fn new(controller: SinkController) -> FileSink { pub fn new(controller: SinkController) -> FileSink {
FileSink { FileSink {
controller: controller, controller: controller,
location: Mutex::new(None), location: Mutex::new(None),
@ -47,9 +47,8 @@ impl FileSink {
} }
} }
pub extern "C" fn new_ptr(controller: SinkController) -> *mut Box<Sink> { pub fn new_boxed(controller: SinkController) -> Box<Sink> {
let instance: Box<Box<Sink>> = Box::new(Box::new(FileSink::new(controller))); Box::new(FileSink::new(controller))
return Box::into_raw(instance);
} }
} }

View file

@ -39,7 +39,7 @@ unsafe impl Sync for FileSrc {}
unsafe impl Send for FileSrc {} unsafe impl Send for FileSrc {}
impl FileSrc { impl FileSrc {
fn new(controller: SourceController) -> FileSrc { pub fn new(controller: SourceController) -> FileSrc {
FileSrc { FileSrc {
controller: controller, controller: controller,
location: Mutex::new(None), location: Mutex::new(None),
@ -48,9 +48,8 @@ impl FileSrc {
} }
} }
pub extern "C" fn new_ptr(controller: SourceController) -> *mut Box<Source> { pub fn new_boxed(controller: SourceController) -> Box<Source> {
let instance: Box<Box<Source>> = Box::new(Box::new(FileSrc::new(controller))); Box::new(FileSrc::new(controller))
return Box::into_raw(instance);
} }
} }

View file

@ -47,7 +47,7 @@ unsafe impl Sync for HttpSrc {}
unsafe impl Send for HttpSrc {} unsafe impl Send for HttpSrc {}
impl HttpSrc { impl HttpSrc {
fn new(controller: SourceController) -> HttpSrc { pub fn new(controller: SourceController) -> HttpSrc {
HttpSrc { HttpSrc {
controller: controller, controller: controller,
url: Mutex::new(None), url: Mutex::new(None),
@ -61,9 +61,8 @@ impl HttpSrc {
} }
} }
pub extern "C" fn new_ptr(controller: SourceController) -> *mut Box<Source> { pub fn new_boxed(controller: SourceController) -> Box<Source> {
let instance: Box<Box<Source>> = Box::new(Box::new(HttpSrc::new(controller))); Box::new(HttpSrc::new(controller))
return Box::into_raw(instance);
} }
pub fn do_request(&mut self, start: u64, stop: u64) -> bool { pub fn do_request(&mut self, start: u64, stop: u64) -> bool {

View file

@ -51,10 +51,9 @@ pub trait Sink: Sync + Send {
#[no_mangle] #[no_mangle]
pub extern "C" fn sink_new(sink: *mut c_void, pub extern "C" fn sink_new(sink: *mut c_void,
create_instance: extern "C" fn(controller: SinkController) create_instance: fn(controller: SinkController) -> Box<Sink>)
-> *mut Box<Sink>)
-> *mut Box<Sink> { -> *mut Box<Sink> {
create_instance(SinkController::new(sink)) Box::into_raw(Box::new(create_instance(SinkController::new(sink))))
} }
#[no_mangle] #[no_mangle]

View file

@ -55,10 +55,9 @@ pub trait Source: Sync + Send {
#[no_mangle] #[no_mangle]
pub extern "C" fn source_new(source: *mut c_void, pub extern "C" fn source_new(source: *mut c_void,
create_instance: extern "C" fn(controller: SourceController) create_instance: fn(controller: SourceController) -> Box<Source>)
-> *mut Box<Source>)
-> *mut Box<Source> { -> *mut Box<Source> {
create_instance(SourceController::new(source)) Box::into_raw(Box::new(create_instance(SourceController::new(source))))
} }
#[no_mangle] #[no_mangle]