1use gio_sys;
6use glib;
7use glib::object::IsA;
8use glib::translate::*;
9use std::fmt;
10use std::ptr;
11use Cancellable;
12use Error;
13
14glib_wrapper! {
15 pub struct Seekable(Interface<gio_sys::GSeekable>);
16
17 match fn {
18 get_type => || gio_sys::g_seekable_get_type(),
19 }
20}
21
22pub const NONE_SEEKABLE: Option<&Seekable> = None;
23
24pub trait SeekableExt: 'static {
25 fn can_seek(&self) -> bool;
26
27 fn can_truncate(&self) -> bool;
28
29 fn seek<P: IsA<Cancellable>>(
30 &self,
31 offset: i64,
32 type_: glib::SeekType,
33 cancellable: Option<&P>,
34 ) -> Result<(), Error>;
35
36 fn tell(&self) -> i64;
37
38 fn truncate<P: IsA<Cancellable>>(
39 &self,
40 offset: i64,
41 cancellable: Option<&P>,
42 ) -> Result<(), Error>;
43}
44
45impl<O: IsA<Seekable>> SeekableExt for O {
46 fn can_seek(&self) -> bool {
47 unsafe { from_glib(gio_sys::g_seekable_can_seek(self.as_ref().to_glib_none().0)) }
48 }
49
50 fn can_truncate(&self) -> bool {
51 unsafe {
52 from_glib(gio_sys::g_seekable_can_truncate(
53 self.as_ref().to_glib_none().0,
54 ))
55 }
56 }
57
58 fn seek<P: IsA<Cancellable>>(
59 &self,
60 offset: i64,
61 type_: glib::SeekType,
62 cancellable: Option<&P>,
63 ) -> Result<(), Error> {
64 unsafe {
65 let mut error = ptr::null_mut();
66 let _ = gio_sys::g_seekable_seek(
67 self.as_ref().to_glib_none().0,
68 offset,
69 type_.to_glib(),
70 cancellable.map(|p| p.as_ref()).to_glib_none().0,
71 &mut error,
72 );
73 if error.is_null() {
74 Ok(())
75 } else {
76 Err(from_glib_full(error))
77 }
78 }
79 }
80
81 fn tell(&self) -> i64 {
82 unsafe { gio_sys::g_seekable_tell(self.as_ref().to_glib_none().0) }
83 }
84
85 fn truncate<P: IsA<Cancellable>>(
86 &self,
87 offset: i64,
88 cancellable: Option<&P>,
89 ) -> Result<(), Error> {
90 unsafe {
91 let mut error = ptr::null_mut();
92 let _ = gio_sys::g_seekable_truncate(
93 self.as_ref().to_glib_none().0,
94 offset,
95 cancellable.map(|p| p.as_ref()).to_glib_none().0,
96 &mut error,
97 );
98 if error.is_null() {
99 Ok(())
100 } else {
101 Err(from_glib_full(error))
102 }
103 }
104 }
105}
106
107impl fmt::Display for Seekable {
108 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
109 write!(f, "Seekable")
110 }
111}