1use libc::{c_void, size_t};
2use std::io::{Read, Seek, SeekFrom, Write};
3
4pub trait ReadStream: Read + Seek {}
5
6#[no_mangle]
7extern "C" fn tch_write_stream_destructor(stream_ptr: *mut c_void) {
8 unsafe {
9 let boxed_stream: Box<Box<dyn Write>> = Box::from_raw(stream_ptr as *mut Box<dyn Write>);
10 drop(boxed_stream)
11 }
12}
13
14#[no_mangle]
15extern "C" fn tch_write_stream_write(
16 stream_ptr: *mut c_void,
17 buf: *const u8,
18 size: size_t,
19 out_size: *mut size_t,
20) -> bool {
21 unsafe {
22 let boxed_stream = stream_ptr as *mut Box<dyn Write>;
23 let buffer = std::slice::from_raw_parts(buf, size);
24 match (*boxed_stream).write(buffer) {
25 Ok(x) => {
26 *out_size = x;
27 true
28 }
29 Err(_) => false,
30 }
31 }
32}
33
34#[no_mangle]
35extern "C" fn tch_read_stream_destructor(stream_ptr: *mut c_void) {
36 unsafe {
37 let boxed_stream: Box<Box<dyn ReadStream>> =
38 Box::from_raw(stream_ptr as *mut Box<dyn ReadStream>);
39 drop(boxed_stream)
40 }
41}
42
43#[no_mangle]
44extern "C" fn tch_read_stream_stream_position(stream_ptr: *mut c_void, current: *mut u64) -> bool {
45 unsafe {
46 let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
47 match (*boxed_stream).stream_position() {
48 Ok(ret) => {
49 *current = ret;
50 true
51 }
52 Err(_) => false,
53 }
54 }
55}
56
57#[no_mangle]
58extern "C" fn tch_read_stream_seek_start(
59 stream_ptr: *mut c_void,
60 pos: u64,
61 new_pos: *mut u64,
62) -> bool {
63 unsafe {
64 let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
65 match (*boxed_stream).seek(SeekFrom::Start(pos)) {
66 Ok(ret) => {
67 *new_pos = ret;
68 true
69 }
70 Err(_) => false,
71 }
72 }
73}
74
75#[no_mangle]
76extern "C" fn tch_read_stream_seek_end(
77 stream_ptr: *mut c_void,
78 pos: i64,
79 new_pos: *mut u64,
80) -> bool {
81 unsafe {
82 let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
83 match (*boxed_stream).seek(SeekFrom::End(pos)) {
84 Ok(ret) => {
85 *new_pos = ret;
86 true
87 }
88 Err(_) => false,
89 }
90 }
91}
92
93#[no_mangle]
94extern "C" fn tch_read_stream_read(
95 stream_ptr: *mut c_void,
96 buf: *mut u8,
97 size: size_t,
98 read_size: *mut size_t,
99) -> bool {
100 unsafe {
101 let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
102 let buffer = std::slice::from_raw_parts_mut(buf, size);
103 match (*boxed_stream).read(buffer) {
104 Ok(ret) => {
105 *read_size = ret;
106 true
107 }
108 Err(_) => false,
109 }
110 }
111}