use std::collections::HashMap;
use super::DeRecProtocolHandle;
use crate::ffi::error::{
ffi_error, success, DeRecError, DEREC_CODE_FFI_BAD_PROTO, DEREC_CODE_FFI_NULL_PTR,
};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn derec_protocol_set_communication_info(
handle: *mut DeRecProtocolHandle,
info_json_ptr: *const u8,
info_json_len: usize,
) -> DeRecError {
if handle.is_null() {
return ffi_error(DEREC_CODE_FFI_NULL_PTR, "handle is null");
}
let info: HashMap<String, String> = if info_json_len == 0 {
HashMap::new()
} else if info_json_ptr.is_null() {
return ffi_error(DEREC_CODE_FFI_NULL_PTR, "info_json_ptr null with len > 0");
} else {
let bytes = unsafe { std::slice::from_raw_parts(info_json_ptr, info_json_len) };
match serde_json::from_slice(bytes) {
Ok(m) => m,
Err(e) => {
return ffi_error(
DEREC_CODE_FFI_BAD_PROTO,
format!("invalid communication_info JSON: {e}"),
);
}
}
};
let h = unsafe { &*handle };
let mut inner = h.lock_inner();
inner.set_communication_info(info);
success()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn derec_protocol_set_own_transport(
handle: *mut DeRecProtocolHandle,
uri_ptr: *const u8,
uri_len: usize,
protocol: i32,
) -> DeRecError {
if handle.is_null() {
return ffi_error(DEREC_CODE_FFI_NULL_PTR, "handle is null");
}
if uri_len == 0 || uri_ptr.is_null() {
return ffi_error(DEREC_CODE_FFI_NULL_PTR, "uri_ptr null or len == 0");
}
let uri = {
let bytes = unsafe { std::slice::from_raw_parts(uri_ptr, uri_len) };
match std::str::from_utf8(bytes) {
Ok(s) => s.to_owned(),
Err(_) => return ffi_error(DEREC_CODE_FFI_BAD_PROTO, "uri is not valid UTF-8"),
}
};
let validated_tp = match super::validate_transport(&uri, protocol) {
Ok(tp) => tp,
Err(e) => return e,
};
let h = unsafe { &*handle };
let mut inner = h.lock_inner();
match inner.set_own_transport(validated_tp) {
Ok(()) => success(),
Err(e) => crate::ffi::error::from_lib_error(e),
}
}