use crate::ffi::{block_on, clear_last_error, set_io_error, set_last_error};
use crate::stream::{DtactStream, pair};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_stream_pair_create(
capacity: usize,
out_a: *mut *mut DtactStream,
out_b: *mut *mut DtactStream,
) -> i32 {
clear_last_error();
if out_a.is_null() || out_b.is_null() {
set_last_error("null out-pointer");
return -1;
}
let (a, b) = pair(capacity);
unsafe {
*out_a = Box::into_raw(Box::new(a));
*out_b = Box::into_raw(Box::new(b));
}
0
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_stream_read(
stream: *mut DtactStream,
buf: *mut u8,
len: usize,
) -> isize {
clear_last_error();
if stream.is_null() || buf.is_null() {
set_last_error("null stream handle or buffer");
return -1;
}
let stream = unsafe { &*stream };
let slice = unsafe { std::slice::from_raw_parts_mut(buf, len) };
match block_on(stream.read(slice)) {
Ok(n) => n as isize,
Err(e) => {
set_io_error(&e);
-1
}
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_stream_write(
stream: *mut DtactStream,
buf: *const u8,
len: usize,
) -> isize {
clear_last_error();
if stream.is_null() || buf.is_null() {
set_last_error("null stream handle or buffer");
return -1;
}
let stream = unsafe { &*stream };
let slice = unsafe { std::slice::from_raw_parts(buf, len) };
match block_on(stream.write(slice)) {
Ok(n) => n as isize,
Err(e) => {
set_io_error(&e);
-1
}
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_stream_free(stream: *mut DtactStream) {
if !stream.is_null() {
drop(unsafe { Box::from_raw(stream) });
}
}