use crate::datatables::PropFlags;
use std::ffi::{CStr, c_char, c_int, c_void};
use std::mem::zeroed;
pub unsafe extern "C" fn custom_proxy(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
out: *mut sys::DVariant,
_: c_int,
_: c_int,
) {
unsafe { (*out).__bindgen_anon_1.m_Int = data.cast::<c_int>().read() + 1 };
}
pub fn derived_server_class(
class: &'static CStr,
table_name: &'static CStr,
base_name: &'static CStr,
) -> *mut sys::ServerClass {
let base = super::leak(table(base_name, &mut []));
let props = Box::leak(Box::new([table_prop(
c"baseclass",
0,
base,
Some(direct_table),
)]));
super::leak(sys::ServerClass {
m_pNetworkName: class.as_ptr(),
m_pTable: super::leak(table(table_name, props)),
m_pNext: std::ptr::null_mut(),
m_ClassID: 1,
m_InstanceBaselineIndex: 0,
})
}
pub unsafe extern "C" fn direct_table(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
_: *mut sys::CSendProxyRecipients,
_: c_int,
) -> *mut c_void {
data.cast_mut()
}
pub unsafe extern "C" fn int8_proxy(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
out: *mut sys::DVariant,
_: c_int,
_: c_int,
) {
unsafe { (*out).__bindgen_anon_1.m_Int = c_int::from(data.cast::<i8>().read()) };
}
pub unsafe extern "C" fn int16_proxy(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
out: *mut sys::DVariant,
_: c_int,
_: c_int,
) {
unsafe { (*out).__bindgen_anon_1.m_Int = c_int::from(data.cast::<i16>().read()) };
}
pub unsafe extern "C" fn int32_proxy(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
out: *mut sys::DVariant,
_: c_int,
_: c_int,
) {
unsafe { (*out).__bindgen_anon_1.m_Int = data.cast::<c_int>().read() };
}
pub unsafe extern "C" fn pointer_table(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
_: *mut sys::CSendProxyRecipients,
_: c_int,
) -> *mut c_void {
unsafe { data.cast::<*mut c_void>().read() }
}
pub fn prop(
name: &'static CStr,
kind: sys::SendPropType,
offset: c_int,
flags: PropFlags,
proxy: sys::SendVarProxyFn,
) -> sys::SendProp {
let mut prop: sys::SendProp = unsafe { zeroed() };
prop.m_pVarName = name.as_ptr();
prop.m_Type = kind;
prop.m_Offset = offset;
prop.m_Flags = flags.bits();
prop.m_ProxyFn = proxy;
prop.m_nElements = 1;
prop
}
pub fn proxies(non_modified: *mut *mut sys::CNonModifiedPointerProxy) -> sys::CStandardSendProxies {
sys::CStandardSendProxies {
_base: sys::CStandardSendProxiesV1 {
m_Int8ToInt32: Some(int8_proxy),
m_Int16ToInt32: Some(int16_proxy),
m_Int32ToInt32: Some(int32_proxy),
m_UInt8ToInt32: Some(int8_proxy),
m_UInt16ToInt32: Some(int16_proxy),
m_UInt32ToInt32: Some(int32_proxy),
m_FloatToFloat: Some(int32_proxy),
m_VectorToVector: Some(vector_proxy),
},
m_DataTableToDataTable: Some(direct_table),
m_SendLocalDataTable: Some(direct_table),
m_ppNonModifiedPointerProxies: non_modified,
}
}
pub unsafe extern "C" fn registered_table(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
_: *mut sys::CSendProxyRecipients,
_: c_int,
) -> *mut c_void {
data.cast_mut()
}
pub fn table(name: &'static CStr, props: &mut [sys::SendProp]) -> sys::SendTable {
let mut table: sys::SendTable = unsafe { zeroed() };
table.m_pNetTableName = name.as_ptr().cast::<c_char>();
table.m_pProps = props.as_mut_ptr();
table.m_nProps = c_int::try_from(props.len()).expect("too many properties for a table");
table
}
pub fn table_prop(
name: &'static CStr,
offset: c_int,
table: *mut sys::SendTable,
proxy: sys::SendTableProxyFn,
) -> sys::SendProp {
let mut prop = self::prop(
name,
sys::SendPropType_DPT_DataTable,
offset,
PropFlags::default(),
None,
);
prop.m_pDataTable = table;
prop.m_DataTableProxyFn = proxy;
prop
}
pub unsafe extern "C" fn vector_proxy(
_: *const sys::SendProp,
_: *const c_void,
data: *const c_void,
out: *mut sys::DVariant,
_: c_int,
_: c_int,
) {
unsafe { (*out).__bindgen_anon_1.m_Vector = data.cast::<[f32; 3]>().read() };
}