#![allow(dead_code)]
use crate::*;
use crate::d3d9::*;
use winapi::shared::d3d9::IDirect3DQuery9;
use winapi::shared::winerror::*;
use winapi::um::unknwnbase::IUnknown;
use std::convert::TryInto;
use std::ptr::null_mut;
#[derive(Clone)] #[repr(transparent)]
pub struct Query(pub(crate) mcom::Rc<IDirect3DQuery9>);
unsafe impl AsSafe<IUnknown > for Query { fn as_safe(&self) -> &IUnknown { &**self.0 } }
unsafe impl AsSafe<IDirect3DQuery9 > for Query { fn as_safe(&self) -> &IDirect3DQuery9 { &*self.0 } }
pub trait IDirect3DQuery9Ext : AsSafe<IDirect3DQuery9> {
fn get_data_inplace(&self, mut data: impl AsMut<[u8]>, get_data_flags: impl Into<GetData>) -> Result<bool, MethodError> {
let data = data.as_mut();
let flags = get_data_flags.into().into();
let len = data.len().try_into().map_err(|_| MethodError("Query::get_data_inplace", D3DERR::INVALIDCALL))?;
let hr = unsafe { self.as_winapi().GetData(data.as_mut_ptr().cast(), len, flags) };
MethodError::check("IDirect3DQuery9::GetData", hr)?;
Ok(hr != S_FALSE)
}
fn get_data_size(&self) -> u32 {
unsafe { self.as_winapi().GetDataSize() }
}
fn get_device(&self) -> Result<Device, MethodError> {
let mut device = null_mut();
let hr = unsafe { self.as_winapi().GetDevice(&mut device) };
MethodError::check("IDirect3DQuery9::GetDevice", hr)?;
Ok(unsafe { Device::from_raw(device) })
}
fn get_type(&self) -> QueryType {
QueryType::from_unchecked(unsafe { self.as_winapi().GetType() })
}
fn issue(&self, issue_flags: impl Into<Issue>) -> Result<(), MethodError> {
let hr = unsafe { self.as_winapi().Issue(issue_flags.into().into()) };
MethodError::check("IDirect3DQuery9::Issue", hr)
}
}
impl<T: AsSafe<IDirect3DQuery9>> IDirect3DQuery9Ext for T {}