1 // Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
2 //
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
8 
9 use Caps;
10 
11 use glib_sys;
12 use gobject_sys;
13 use gst_sys;
14 
15 use glib;
16 use glib::translate::{from_glib_full, FromGlibPtrNone, ToGlibPtr, ToGlibPtrMut};
17 
18 use std::ffi::CStr;
19 use std::fmt;
20 use std::ptr;
21 
22 #[repr(C)]
23 pub struct StaticCaps(ptr::NonNull<gst_sys::GstStaticCaps>);
24 
25 impl StaticCaps {
get(&self) -> Caps26     pub fn get(&self) -> Caps {
27         unsafe { from_glib_full(gst_sys::gst_static_caps_get(self.0.as_ptr())) }
28     }
29 }
30 
31 unsafe impl Send for StaticCaps {}
32 unsafe impl Sync for StaticCaps {}
33 
34 impl fmt::Debug for StaticCaps {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result35     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
36         f.debug_struct("StaticCaps")
37             .field("str", &unsafe {
38                 CStr::from_ptr(self.0.as_ref().string).to_str()
39             })
40             .finish()
41     }
42 }
43 
44 impl glib::types::StaticType for StaticCaps {
static_type() -> glib::types::Type45     fn static_type() -> glib::types::Type {
46         unsafe { glib::translate::from_glib(gst_sys::gst_static_caps_get_type()) }
47     }
48 }
49 
50 #[doc(hidden)]
51 impl<'a> glib::value::FromValueOptional<'a> for StaticCaps {
from_value_optional(value: &glib::Value) -> Option<Self>52     unsafe fn from_value_optional(value: &glib::Value) -> Option<Self> {
53         Option::<StaticCaps>::from_glib_none(
54             gobject_sys::g_value_get_boxed(value.to_glib_none().0) as *mut gst_sys::GstStaticCaps
55         )
56     }
57 }
58 
59 #[doc(hidden)]
60 impl glib::value::SetValue for StaticCaps {
set_value(value: &mut glib::Value, this: &Self)61     unsafe fn set_value(value: &mut glib::Value, this: &Self) {
62         gobject_sys::g_value_set_boxed(
63             value.to_glib_none_mut().0,
64             glib::translate::ToGlibPtr::<*const gst_sys::GstStaticCaps>::to_glib_none(this).0
65                 as glib_sys::gpointer,
66         )
67     }
68 }
69 
70 #[doc(hidden)]
71 impl glib::value::SetValueOptional for StaticCaps {
set_value_optional(value: &mut glib::Value, this: Option<&Self>)72     unsafe fn set_value_optional(value: &mut glib::Value, this: Option<&Self>) {
73         gobject_sys::g_value_set_boxed(
74             value.to_glib_none_mut().0,
75             glib::translate::ToGlibPtr::<*const gst_sys::GstStaticCaps>::to_glib_none(&this).0
76                 as glib_sys::gpointer,
77         )
78     }
79 }
80 
81 #[doc(hidden)]
82 impl glib::translate::GlibPtrDefault for StaticCaps {
83     type GlibType = *mut gst_sys::GstStaticCaps;
84 }
85 
86 #[doc(hidden)]
87 impl<'a> glib::translate::ToGlibPtr<'a, *const gst_sys::GstStaticCaps> for StaticCaps {
88     type Storage = &'a StaticCaps;
89 
to_glib_none(&'a self) -> glib::translate::Stash<'a, *const gst_sys::GstStaticCaps, Self>90     fn to_glib_none(&'a self) -> glib::translate::Stash<'a, *const gst_sys::GstStaticCaps, Self> {
91         glib::translate::Stash(self.0.as_ptr(), self)
92     }
93 
to_glib_full(&self) -> *const gst_sys::GstStaticCaps94     fn to_glib_full(&self) -> *const gst_sys::GstStaticCaps {
95         unimplemented!()
96     }
97 }
98 
99 #[doc(hidden)]
100 impl glib::translate::FromGlibPtrNone<*const gst_sys::GstStaticCaps> for StaticCaps {
101     #[inline]
from_glib_none(ptr: *const gst_sys::GstStaticCaps) -> Self102     unsafe fn from_glib_none(ptr: *const gst_sys::GstStaticCaps) -> Self {
103         assert!(!ptr.is_null());
104         StaticCaps(ptr::NonNull::new_unchecked(ptr as *mut _))
105     }
106 }
107 
108 #[doc(hidden)]
109 impl glib::translate::FromGlibPtrNone<*mut gst_sys::GstStaticCaps> for StaticCaps {
110     #[inline]
from_glib_none(ptr: *mut gst_sys::GstStaticCaps) -> Self111     unsafe fn from_glib_none(ptr: *mut gst_sys::GstStaticCaps) -> Self {
112         assert!(!ptr.is_null());
113         StaticCaps(ptr::NonNull::new_unchecked(ptr))
114     }
115 }
116 
117 #[doc(hidden)]
118 impl glib::translate::FromGlibPtrBorrow<*mut gst_sys::GstStaticCaps> for StaticCaps {
119     #[inline]
from_glib_borrow(ptr: *mut gst_sys::GstStaticCaps) -> Self120     unsafe fn from_glib_borrow(ptr: *mut gst_sys::GstStaticCaps) -> Self {
121         assert!(!ptr.is_null());
122         StaticCaps(ptr::NonNull::new_unchecked(ptr))
123     }
124 }
125 
126 #[doc(hidden)]
127 impl glib::translate::FromGlibPtrFull<*mut gst_sys::GstStaticCaps> for StaticCaps {
128     #[inline]
from_glib_full(_ptr: *mut gst_sys::GstStaticCaps) -> Self129     unsafe fn from_glib_full(_ptr: *mut gst_sys::GstStaticCaps) -> Self {
130         unimplemented!();
131     }
132 }
133