Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
In macros always refer to winapi through com::_winapi
Browse files Browse the repository at this point in the history
  • Loading branch information
rylev committed Nov 6, 2019
1 parent a3663b2 commit 940f2f9
Show file tree
Hide file tree
Showing 10 changed files with 49 additions and 55 deletions.
3 changes: 0 additions & 3 deletions examples/aggregation/client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,3 @@ edition = "2018"
[dependencies]
com = { path = "../../.." }
interface = { path = "../interface" }

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser", "winreg", "combaseapi", "objbase"] }
3 changes: 0 additions & 3 deletions examples/basic/client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,3 @@ edition = "2018"
[dependencies]
com = { path = "../../.." }
interface = { path = "../interface" }

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser", "winreg", "combaseapi", "objbase"] }
15 changes: 8 additions & 7 deletions macros/support/src/aggr_co_class/class_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use syn::ItemStruct;
// We manually generate a ClassFactory without macros, otherwise
// it leads to an infinite loop.
pub fn generate(struct_item: &ItemStruct) -> HelperTokenStream {
let base_interface_idents = crate::co_class::class_factory::get_class_factory_base_interface_idents();
let base_interface_idents =
crate::co_class::class_factory::get_class_factory_base_interface_idents();
let aggr_map = crate::co_class::class_factory::get_class_factory_aggr_map();

let struct_ident = &struct_item.ident;
Expand All @@ -31,19 +32,19 @@ pub fn generate(struct_item: &ItemStruct) -> HelperTokenStream {
unsafe fn create_instance(
&self,
aggr: *mut *const <dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::VTable,
riid: winapi::shared::guiddef::REFIID,
ppv: *mut *mut winapi::ctypes::c_void,
) -> winapi::shared::winerror::HRESULT {
riid: com::_winapi::shared::guiddef::REFIID,
ppv: *mut *mut com::_winapi::ctypes::c_void,
) -> com::_winapi::shared::winerror::HRESULT {
// Bringing trait into scope to access IUnknown methods.
use com::interfaces::iunknown::IUnknown;

let riid = unsafe { &*riid };

if !aggr.is_null() && !winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::IID) {
if !aggr.is_null() && !com::_winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::IID) {
unsafe {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
}
return winapi::shared::winerror::E_INVALIDARG;
return com::_winapi::shared::winerror::E_INVALIDARG;
}

let mut instance = #struct_ident::new();
Expand Down
3 changes: 1 addition & 2 deletions macros/support/src/aggr_co_class/com_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ pub fn generate(
let aggregate_fields = co_class::com_struct::gen_aggregate_fields(aggr_map);

// COM Fields for an aggregable coclass.
let non_delegating_iunknown_field_ident =
crate::utils::non_delegating_iunknown_field_ident();
let non_delegating_iunknown_field_ident = crate::utils::non_delegating_iunknown_field_ident();
let iunknown_to_use_field_ident = crate::utils::iunknown_to_use_field_ident();

quote!(
Expand Down
14 changes: 7 additions & 7 deletions macros/support/src/aggr_co_class/com_struct_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,15 @@ fn gen_inner_query_interface(
let aggr_match_arms = crate::co_class::iunknown_impl::gen_aggregate_match_arms(aggr_map);

quote!(
pub(crate) fn inner_query_interface(&self, riid: *const winapi::shared::guiddef::IID, ppv: *mut *mut winapi::ctypes::c_void) -> HRESULT {
pub(crate) fn inner_query_interface(&self, riid: *const com::_winapi::shared::guiddef::IID, ppv: *mut *mut com::_winapi::ctypes::c_void) -> HRESULT {
unsafe {
let riid = &*riid;

if winapi::shared::guiddef::IsEqualGUID(riid, &com::interfaces::iunknown::IID_IUNKNOWN) {
*ppv = &self.#non_delegating_iunknown_field_ident as *const _ as *mut winapi::ctypes::c_void;
if com::_winapi::shared::guiddef::IsEqualGUID(riid, &com::interfaces::iunknown::IID_IUNKNOWN) {
*ppv = &self.#non_delegating_iunknown_field_ident as *const _ as *mut com::_winapi::ctypes::c_void;
} #base_match_arms #aggr_match_arms else {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
return winapi::shared::winerror::E_NOINTERFACE;
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
return com::_winapi::shared::winerror::E_NOINTERFACE;
}

self.inner_add_ref();
Expand Down Expand Up @@ -191,8 +191,8 @@ fn gen_allocate_fn(
// Non-delegating methods.
unsafe extern "stdcall" fn non_delegatingegating_query_interface(
this: *mut *const <dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::VTable,
riid: *const winapi::shared::guiddef::IID,
ppv: *mut *mut winapi::ctypes::c_void,
riid: *const com::_winapi::shared::guiddef::IID,
ppv: *mut *mut com::_winapi::ctypes::c_void,
) -> HRESULT {
let this = this.sub(#non_delegating_iunknown_offset) as *mut #struct_ident;
(*this).inner_query_interface(riid, ppv)
Expand Down
8 changes: 4 additions & 4 deletions macros/support/src/aggr_co_class/iunknown_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ use syn::ItemStruct;
pub fn generate(struct_item: &ItemStruct) -> HelperTokenStream {
let struct_ident = &struct_item.ident;
let iunknown_to_use_field_ident = crate::utils::iunknown_to_use_field_ident();
let ptr_casting = quote! { as *mut winapi::ctypes::c_void };
let ptr_casting = quote! { as *mut com::_winapi::ctypes::c_void };

quote!(
impl com::interfaces::iunknown::IUnknown for #struct_ident {
unsafe fn query_interface(
&self,
riid: *const winapi::shared::guiddef::IID,
ppv: *mut *mut winapi::ctypes::c_void
) -> winapi::shared::winerror::HRESULT {
riid: *const com::_winapi::shared::guiddef::IID,
ppv: *mut *mut com::_winapi::ctypes::c_void
) -> com::_winapi::shared::winerror::HRESULT {
let iunknown_to_use = com::InterfacePtr::<dyn com::interfaces::iunknown::IUnknown>::new(self.#iunknown_to_use_field_ident #ptr_casting);
iunknown_to_use.query_interface(riid, ppv)
}
Expand Down
24 changes: 12 additions & 12 deletions macros/support/src/co_class/class_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ pub fn generate(struct_item: &ItemStruct) -> HelperTokenStream {
unsafe fn create_instance(
&self,
aggr: *mut *const <dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::VTable,
riid: winapi::shared::guiddef::REFIID,
ppv: *mut *mut winapi::ctypes::c_void,
) -> winapi::shared::winerror::HRESULT {
riid: com::_winapi::shared::guiddef::REFIID,
ppv: *mut *mut com::_winapi::ctypes::c_void,
) -> com::_winapi::shared::winerror::HRESULT {
// Bringing trait into scope to access IUnknown methods.
use com::interfaces::iunknown::IUnknown;

if aggr != std::ptr::null_mut() {
return winapi::shared::winerror::CLASS_E_NOAGGREGATION;
return com::_winapi::shared::winerror::CLASS_E_NOAGGREGATION;
}

let mut instance = #struct_ident::new();
Expand Down Expand Up @@ -84,8 +84,8 @@ pub fn gen_class_factory_struct_definition(class_factory_ident: &Ident) -> Helpe
pub fn gen_lock_server() -> HelperTokenStream {
quote! {
// TODO: Implement correctly
fn lock_server(&self, _increment: winapi::shared::minwindef::BOOL) -> winapi::shared::winerror::HRESULT {
winapi::shared::winerror::S_OK
fn lock_server(&self, _increment: com::_winapi::shared::minwindef::BOOL) -> com::_winapi::shared::winerror::HRESULT {
com::_winapi::shared::winerror::S_OK
}
}
}
Expand Down Expand Up @@ -143,18 +143,18 @@ fn gen_query_interface() -> HelperTokenStream {
let vptr_field_ident = crate::utils::vptr_field_ident(&get_iclass_factory_interface_ident());

quote! {
unsafe fn query_interface(&self, riid: *const winapi::shared::guiddef::IID, ppv: *mut *mut winapi::ctypes::c_void) -> winapi::shared::winerror::HRESULT {
unsafe fn query_interface(&self, riid: *const com::_winapi::shared::guiddef::IID, ppv: *mut *mut com::_winapi::ctypes::c_void) -> com::_winapi::shared::winerror::HRESULT {
// Bringing trait into scope to access add_ref method.
use com::interfaces::iunknown::IUnknown;

let riid = &*riid;
if winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::IID) | winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iclass_factory::IClassFactory as com::ComInterface>::IID) {
*ppv = &self.#vptr_field_ident as *const _ as *mut winapi::ctypes::c_void;
if com::_winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iunknown::IUnknown as com::ComInterface>::IID) | com::_winapi::shared::guiddef::IsEqualGUID(riid, &<dyn com::interfaces::iclass_factory::IClassFactory as com::ComInterface>::IID) {
*ppv = &self.#vptr_field_ident as *const _ as *mut com::_winapi::ctypes::c_void;
self.add_ref();
winapi::shared::winerror::NOERROR
com::_winapi::shared::winerror::NOERROR
} else {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
winapi::shared::winerror::E_NOINTERFACE
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
com::_winapi::shared::winerror::E_NOINTERFACE
}
}
}
Expand Down
30 changes: 15 additions & 15 deletions macros/support/src/co_class/iunknown_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ fn gen_aggregate_drops(aggr_map: &HashMap<Ident, Vec<Ident>>) -> HelperTokenStre
let aggregate_drops = aggr_map.iter().map(|(aggr_field_ident, _)| {
quote!(
if !self.#aggr_field_ident.is_null() {
let mut aggr_interface_ptr = com::InterfacePtr::<dyn com::interfaces::iunknown::IUnknown>::new(self.#aggr_field_ident as *mut winapi::ctypes::c_void);
let mut aggr_interface_ptr = com::InterfacePtr::<dyn com::interfaces::iunknown::IUnknown>::new(self.#aggr_field_ident as *mut com::_winapi::ctypes::c_void);
aggr_interface_ptr.release();
}
)
Expand Down Expand Up @@ -154,20 +154,20 @@ pub fn gen_query_interface(
quote!(
unsafe fn query_interface(
&self,
riid: *const winapi::shared::guiddef::IID,
ppv: *mut *mut winapi::ctypes::c_void
) -> winapi::shared::winerror::HRESULT {
riid: *const com::_winapi::shared::guiddef::IID,
ppv: *mut *mut com::_winapi::ctypes::c_void
) -> com::_winapi::shared::winerror::HRESULT {
let riid = &*riid;

if winapi::shared::guiddef::IsEqualGUID(riid, &com::interfaces::iunknown::IID_IUNKNOWN) {
*ppv = &self.#first_vptr_field as *const _ as *mut winapi::ctypes::c_void;
if com::_winapi::shared::guiddef::IsEqualGUID(riid, &com::interfaces::iunknown::IID_IUNKNOWN) {
*ppv = &self.#first_vptr_field as *const _ as *mut com::_winapi::ctypes::c_void;
} #base_match_arms #aggr_match_arms else {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
return winapi::shared::winerror::E_NOINTERFACE;
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
return com::_winapi::shared::winerror::E_NOINTERFACE;
}

self.add_ref();
NOERROR
com::_winapi::shared::winerror::NOERROR
}
)
}
Expand All @@ -181,7 +181,7 @@ pub fn gen_base_match_arms(base_interface_idents: &[Ident]) -> HelperTokenStream

quote!(
else if #match_condition {
*ppv = &self.#vptr_field_ident as *const _ as *mut winapi::ctypes::c_void;
*ppv = &self.#vptr_field_ident as *const _ as *mut com::_winapi::ctypes::c_void;
}
)
});
Expand All @@ -204,15 +204,15 @@ pub fn gen_aggregate_match_arms(aggr_map: &HashMap<Ident, Vec<Ident>>) -> Helper
quote!(
else if #first_aggr_match_condition #(#rem_aggr_match_conditions)* {
if self.#aggr_field_ident.is_null() {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
return winapi::shared::winerror::E_NOINTERFACE;
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
return com::_winapi::shared::winerror::E_NOINTERFACE;
}

let mut aggr_interface_ptr = com::InterfacePtr::<dyn com::interfaces::iunknown::IUnknown>::new(self.#aggr_field_ident as *mut winapi::ctypes::c_void);
let mut aggr_interface_ptr = com::InterfacePtr::<dyn com::interfaces::iunknown::IUnknown>::new(self.#aggr_field_ident as *mut com::_winapi::ctypes::c_void);
let hr = aggr_interface_ptr.query_interface(riid, ppv);
if com::_winapi::shared::winerror::FAILED(hr) {
*ppv = std::ptr::null_mut::<winapi::ctypes::c_void>();
return winapi::shared::winerror::E_NOINTERFACE;
*ppv = std::ptr::null_mut::<com::_winapi::ctypes::c_void>();
return com::_winapi::shared::winerror::E_NOINTERFACE;
}

// We release it as the previous call add_ref-ed the inner object.
Expand Down
2 changes: 1 addition & 1 deletion macros/support/src/utils/idents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,4 @@ pub fn get_aggr_map(attr_args: &AttributeArgs) -> HashMap<Ident, Vec<Ident>> {
}

aggr_map
}
}
2 changes: 1 addition & 1 deletion macros/support/src/utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,4 @@ mod tests {
assert_eq!(result, "ianimal_vtable".to_owned());
}
use super::*;
}
}

0 comments on commit 940f2f9

Please sign in to comment.