use std::ffi::CString;
use std::os::raw::c_char;
use std::ptr;
use std::sync::Arc;
use hdds::api::{DataReader, DataWriter, Participant};
use super::{BytePayload, HddsDataReader, HddsDataWriter, HddsError, HddsParticipant};
#[no_mangle]
pub unsafe extern "C" fn hdds_participant_name(participant: *mut HddsParticipant) -> *const c_char {
if participant.is_null() {
return ptr::null();
}
let participant_ref = &*participant.cast::<Arc<Participant>>();
match CString::new(participant_ref.name()) {
Ok(cstr) => {
let ptr = cstr.as_ptr();
std::mem::forget(cstr); ptr
}
Err(_) => ptr::null(),
}
}
#[no_mangle]
pub unsafe extern "C" fn hdds_participant_domain_id(participant: *mut HddsParticipant) -> u32 {
if participant.is_null() {
return 0xFFFF_FFFF;
}
let participant_ref = &*participant.cast::<Arc<Participant>>();
participant_ref.domain_id()
}
#[no_mangle]
pub unsafe extern "C" fn hdds_participant_id(participant: *mut HddsParticipant) -> u8 {
if participant.is_null() {
return 0xFF;
}
let participant_ref = &*participant.cast::<Arc<Participant>>();
participant_ref.participant_id()
}
#[no_mangle]
pub unsafe extern "C" fn hdds_writer_topic_name(
writer: *mut HddsDataWriter,
buf: *mut c_char,
buf_len: usize,
out_len: *mut usize,
) -> HddsError {
if writer.is_null() || buf.is_null() || out_len.is_null() {
return HddsError::HddsInvalidArgument;
}
let writer_ref = &*writer.cast::<DataWriter<BytePayload>>();
let name = writer_ref.topic_name();
let name_len = name.len();
*out_len = name_len;
if buf_len < name_len + 1 {
return HddsError::HddsOutOfMemory;
}
ptr::copy_nonoverlapping(name.as_ptr(), buf.cast::<u8>(), name_len);
*buf.add(name_len) = 0;
HddsError::HddsOk
}
#[no_mangle]
pub unsafe extern "C" fn hdds_reader_topic_name(
reader: *mut HddsDataReader,
buf: *mut c_char,
buf_len: usize,
out_len: *mut usize,
) -> HddsError {
if reader.is_null() || buf.is_null() || out_len.is_null() {
return HddsError::HddsInvalidArgument;
}
let reader_ref = &*reader.cast::<DataReader<BytePayload>>();
let name = reader_ref.topic_name();
let name_len = name.len();
*out_len = name_len;
if buf_len < name_len + 1 {
return HddsError::HddsOutOfMemory;
}
ptr::copy_nonoverlapping(name.as_ptr(), buf.cast::<u8>(), name_len);
*buf.add(name_len) = 0;
HddsError::HddsOk
}