1use super::*;
2use crate::raw::HRESULT;
3use crate::type_system::{AutomationTypeSystem, RawTypeSystem};
4
5#[com_interface(
13 com_iid = "00000000-0000-0000-C000-000000000046",
14 raw_iid = "11111111-0000-0000-C000-000000000046",
15 base = NO_BASE,
16 vtable_of = RawIUnknown )]
17pub trait IUnknown {}
18
19#[com_interface(
20 com_iid = "00000000-0000-0000-C000-000000000046",
21 raw_iid = "11111111-0000-0000-C000-000000000046",
22 base = NO_BASE )]
23pub trait RawIUnknown
24{
25 fn query_interface(&self, riid: crate::REFIID) -> crate::RawComResult<crate::raw::RawComPtr>;
36
37 fn add_ref(&self) -> u32;
41
42 fn release(&self) -> u32;
50}
51
52impl<I, S> crate::attributes::ComInterfaceVTableFor<I, S, RawTypeSystem> for dyn IUnknown
53where
54 I: ?Sized,
55 S: intercom::attributes::ComClassInterface<I, RawTypeSystem> + intercom::attributes::ComClass,
56{
57 const VTABLE: Self::VTable = Self::VTable {
58 query_interface: query_interface::<I, S, RawTypeSystem>,
59 add_ref: add_ref::<I, S, RawTypeSystem>,
60 release: release::<I, S, RawTypeSystem>,
61 };
62}
63impl<I, S> crate::attributes::ComInterfaceVTableFor<I, S, AutomationTypeSystem> for dyn IUnknown
64where
65 I: ?Sized,
66 S: intercom::attributes::ComClassInterface<I, AutomationTypeSystem>
67 + intercom::attributes::ComClass,
68{
69 const VTABLE: Self::VTable = Self::VTable {
70 query_interface: query_interface::<I, S, AutomationTypeSystem>,
71 add_ref: add_ref::<I, S, AutomationTypeSystem>,
72 release: release::<I, S, AutomationTypeSystem>,
73 };
74}
75
76#[doc(hidden)]
77pub unsafe extern "system" fn query_interface<I, S, TS>(
78 self_vtable: crate::raw::RawComPtr,
79 riid: *const crate::GUID,
80 out: *mut *mut std::ffi::c_void,
81) -> HRESULT
82where
83 I: ?Sized,
84 S: intercom::attributes::ComClassInterface<I, TS> + intercom::attributes::ComClass,
85 TS: crate::type_system::TypeSystem,
86{
87 let combox = S::get_box(self_vtable);
88 log::trace!(
89 "[{:p}, through {:p}] Serving {}::query_interface",
90 combox,
91 self_vtable,
92 std::any::type_name::<S>()
93 );
94 intercom::ComBoxData::<S>::query_interface(combox, riid, out)
95}
96
97#[doc(hidden)]
98pub unsafe extern "system" fn add_ref<I, S, TS>(self_vtable: crate::raw::RawComPtr) -> u32
99where
100 I: ?Sized,
101 S: intercom::attributes::ComClassInterface<I, TS> + intercom::attributes::ComClass,
102 TS: crate::type_system::TypeSystem,
103{
104 let combox = S::get_box(self_vtable);
105 log::trace!(
106 "[{:p}, through {:p}] Serving {}::add_ref",
107 combox,
108 self_vtable,
109 std::any::type_name::<S>()
110 );
111 intercom::ComBoxData::<S>::add_ref(combox)
112}
113
114#[doc(hidden)]
115pub unsafe extern "system" fn release<I, S, TS>(self_vtable: crate::raw::RawComPtr) -> u32
116where
117 I: ?Sized,
118 S: intercom::attributes::ComClassInterface<I, TS> + intercom::attributes::ComClass,
119 TS: crate::type_system::TypeSystem,
120{
121 let combox = S::get_box(self_vtable);
122 log::trace!(
123 "[{:p}, through {:p}] Serving {}::release",
124 combox,
125 self_vtable,
126 std::any::type_name::<S>()
127 );
128 intercom::ComBoxData::<S>::release(combox)
129}
130
131#[com_interface(
151 com_iid = "DF0B3D60-548F-101B-8E65-08002B2BD119",
152 raw_iid = "4C667A45-1C4F-4761-8EBF-34E7699BD06E",
153 implemented_by = isupporterrorinfo
154)]
155pub trait ISupportErrorInfo: IUnknown
156{
157 fn interface_supports_error_info(&self, riid: crate::REFIID) -> crate::raw::HRESULT;
178}
179
180pub mod isupporterrorinfo
181{
182 use crate::{combox::ComBoxData, raw, REFIID};
183
184 pub fn interface_supports_error_info<S>(_this: &ComBoxData<S>, riid: REFIID) -> raw::HRESULT
187 where
188 S: intercom::attributes::ComClass,
189 {
190 match S::interface_supports_error_info(riid) {
191 true => raw::S_OK,
192 false => raw::S_FALSE,
193 }
194 }
195}