use crate::idltypes::safearray::SafeArray;
use crate::idltypes::decimal::Decimal;
use crate::idltypes::vartype::VarType;
use crate::minwindef::filetime::FileTime;
use crate::GUID;
use std::ptr::NonNull;
use winapi::shared::ntdef::{LPSTR, LPWSTR};
use winapi::shared::wtypes::BSTR;
use winapi::um::oaidl::IDispatch;
use winapi::um::objidl::IStorage;
use winapi::um::objidlbase::IStream;
use winapi::um::unknwnbase::IUnknown;
#[repr(C)]
#[derive(Copy, Clone)]
pub union PropVariant {
pub pv: InnerPropVariant,
pub dec: Decimal,
}
impl PropVariant {
pub fn vartype(&self) -> VarType {
unsafe { self.pv.vartype }
}
pub fn new_i8(val: i8) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::I1;
v.pv.data.c_val = val;
v
}
}
pub fn new_u8(val: u8) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::UI1;
v.pv.data.b_val = val;
v
}
}
pub fn new_i16(val: i16) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::I2;
v.pv.data.i_val = val;
v
}
}
pub fn new_u16(val: u16) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::UI2;
v.pv.data.ui_val = val;
v
}
}
pub fn new_i32(val: i32) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::I4;
v.pv.data.l_val = val;
v
}
}
pub fn new_u32(val: u32) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::UI4;
v.pv.data.ul_val = val;
v
}
}
pub fn new_i64(val: i64) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::I8;
v.pv.data.h_val = val;
v
}
}
pub fn new_u64(val: u64) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::UI8;
v.pv.data.uh_val = val;
v
}
}
pub fn new_f32(val: f32) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::R4;
v.pv.data.flt_val = val;
v
}
}
pub fn new_f64(val: f64) -> PropVariant {
unsafe {
let mut v: PropVariant = std::mem::zeroed();
v.pv.vartype = VarType::R8;
v.pv.data.dbl_val = val;
v
}
}
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct InnerPropVariant {
pub vartype: VarType,
pub reserved1: u16,
pub reserved2: u16,
pub reserved3: u16,
pub data: InnerPropVariantData,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union InnerPropVariantData {
pub c_val: i8,
pub b_val: u8,
pub i_val: i16,
pub ui_val: u16,
pub l_val: i32,
pub ul_val: u32,
pub int_val: i32,
pub uint_val: u32,
pub h_val: i64,
pub uh_val: u64,
pub flt_val: f32,
pub dbl_val: f64,
pub bool_val: i16,
pub scode: i32,
pub cy_val: i64,
pub date: f64,
pub filetime: FileTime,
pub puuid: *mut GUID,
pub pclipdata: *mut ClipData,
pub bstr_val: BSTR,
pub blob: Blob,
pub psz_val: LPSTR,
pub pwsz_val: LPWSTR,
pub punk_val: *mut IUnknown,
pub pdisp_val: *mut IDispatch,
pub pstream: *mut IStream,
pub pstorage: *mut IStorage,
pub pversioned_stream: *mut VersionedStream,
pub parray: *mut SafeArray,
pub ca_c: CountedArray<i8>,
pub ca_ub: CountedArray<u8>,
pub ca_i: CountedArray<i16>,
pub ca_ui: CountedArray<u16>,
pub ca_l: CountedArray<i32>,
pub ca_ul: CountedArray<u32>,
pub ca_h: CountedArray<i64>,
pub ca_uh: CountedArray<u64>,
pub ca_flt: CountedArray<f32>,
pub ca_dbl: CountedArray<f64>,
pub ca_bool: CountedArray<i16>,
pub ca_scode: CountedArray<i32>,
pub ca_cy: CountedArray<i64>,
pub ca_date: CountedArray<f64>,
pub ca_filetime: CountedArray<FileTime>,
pub ca_uuid: CountedArray<GUID>,
pub ca_clipdata: CountedArray<ClipData>,
pub ca_bstr: CountedArray<BSTR>,
pub ca_lpstr: CountedArray<LPSTR>,
pub ca_lpwstr: CountedArray<LPWSTR>,
pub ca_propvar: CountedArray<PropVariant>,
pub pc_val: *mut i8,
pub pb_val: *mut u8,
pub pi_val: *mut i16,
pub pui_val: *mut u16,
pub pl_val: *mut i32,
pub pul_val: *mut u32,
pub pint_val: *mut i32,
pub puint_val: *mut u32,
pub pflt_val: *mut f32,
pub pdbl_val: *mut f64,
pub pbool_val: *mut i16,
pub pdec_val: *mut Decimal,
pub pscode: *mut i32,
pub pcy_val: *mut i64,
pub pdate: *mut f64,
pub pbstr_val: *mut BSTR,
pub ppunk_val: *mut *mut IUnknown,
pub ppdisp_val: *mut *mut IDispatch,
pub pparray: *mut *mut SafeArray,
pub pvar_val: *mut PropVariant,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct ClipData {
pub size: u32,
pub format: i32,
pub data: Option<NonNull<u8>>,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct Blob {
pub size: u32,
pub data: Option<NonNull<u8>>,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct VersionedStream {
pub version: GUID,
pub stream: *mut IStream,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct CountedArray<T> {
pub elements: u32,
pub data: *mut T,
}