From 0b67ffc9c74019f0af6a34aefe91a6226d095e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 13 May 2016 18:02:19 +0300 Subject: [PATCH] Add location property handling --- Cargo.toml | 1 + src/lib.rs | 2 ++ src/rsfilesrc.c | 9 ++++----- src/rsfilesrc.rs | 31 +++++++++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d098434a..76a8918f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Sebastian Dröge "] build = "build.rs" [dependencies] +libc = "0.2" [build-dependencies] gcc = "0.3" diff --git a/src/lib.rs b/src/lib.rs index b9cc4298..73b0c0c9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ #![crate_type="dylib"] +extern crate libc; + pub mod rsfilesrc; diff --git a/src/rsfilesrc.c b/src/rsfilesrc.c index 2b6dac0d..2a272550 100644 --- a/src/rsfilesrc.c +++ b/src/rsfilesrc.c @@ -4,6 +4,8 @@ extern void * filesrc_new (void); extern void filesrc_drop (void * filesrc); extern int filesrc_fill (void * filesrc); +extern void filesrc_set_location (void * filesrc, const gchar *location); +extern gchar * filesrc_get_location (void * filesrc); GST_DEBUG_CATEGORY_STATIC (gst_rsfile_src_debug); #define GST_CAT_DEFAULT gst_rsfile_src_debug @@ -89,7 +91,6 @@ gst_rsfile_src_finalize (GObject * object) GstRsfileSrc *src = GST_RSFILE_SRC (object); filesrc_drop (src->instance); - g_free (src->location); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -102,9 +103,7 @@ gst_rsfile_src_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: - if (src->location) - g_free (src->location); - src->location = g_value_dup_string (value); + filesrc_set_location (src->instance, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -120,7 +119,7 @@ gst_rsfile_src_get_property (GObject * object, guint prop_id, GValue * value, switch (prop_id) { case PROP_LOCATION: - g_value_set_string (value, src->location); + g_value_take_string (value, filesrc_get_location (src->instance)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/src/rsfilesrc.rs b/src/rsfilesrc.rs index e4fae37b..5e2034fc 100644 --- a/src/rsfilesrc.rs +++ b/src/rsfilesrc.rs @@ -1,3 +1,7 @@ +use libc::{c_char}; +use std::ffi::{CStr, CString}; +use std::ptr; + #[no_mangle] pub extern "C" fn filesrc_new() -> *mut FileSrc { let instance = Box::new(FileSrc::new()); @@ -9,12 +13,35 @@ pub extern "C" fn filesrc_drop(ptr: *mut FileSrc) { unsafe { Box::from_raw(ptr) }; } +#[no_mangle] +pub extern "C" fn filesrc_set_location(ptr: *mut FileSrc, location_ptr: *const c_char) { + let filesrc: &mut FileSrc = unsafe { &mut *ptr }; + + if location_ptr.is_null() { + filesrc.location = None; + } else { + let location = unsafe { CStr::from_ptr(location_ptr) }; + filesrc.location = Some(String::from(location.to_str().unwrap())); + } +} + +#[no_mangle] +pub extern "C" fn filesrc_get_location(ptr: *mut FileSrc) -> *mut c_char { + let filesrc: &mut FileSrc = unsafe { &mut *ptr }; + + match filesrc.location { + Some(ref location) => + CString::new(location.clone().into_bytes()).unwrap().into_raw(), + None => + ptr::null_mut() + } +} + #[no_mangle] pub extern "C" fn filesrc_fill(ptr: *mut FileSrc) { let filesrc: &mut FileSrc = unsafe { &mut *ptr }; - println!("fill"); - filesrc.location = Some(String::from("bla")); + println!("fill {:?}", filesrc); } #[derive(Debug)]