]> git.proxmox.com Git - rustc.git/blame - vendor/cc-1.0.59/src/setup_config.rs
New upstream version 1.48.0+dfsg1
[rustc.git] / vendor / cc-1.0.59 / src / setup_config.rs
CommitLineData
1b1a35ee
XL
1// Copyright © 2017 winapi-rs developers
2// Licensed under the Apache License, Version 2.0
3// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5// All files in the project carrying such notice may not be copied, modified, or distributed
6// except according to those terms.
7
8#![allow(bad_style)]
9#![allow(unused)]
10
11use crate::winapi::Interface;
12use crate::winapi::BSTR;
13use crate::winapi::LPCOLESTR;
14use crate::winapi::LPSAFEARRAY;
15use crate::winapi::S_FALSE;
16use crate::winapi::{CoCreateInstance, CLSCTX_ALL};
17use crate::winapi::{IUnknown, IUnknownVtbl};
18use crate::winapi::{HRESULT, LCID, LPCWSTR, PULONGLONG};
19use crate::winapi::{LPFILETIME, ULONG};
20use std::ffi::OsString;
21use std::ptr::null_mut;
22
23use crate::com::{BStr, ComPtr};
24
25// Bindings to the Setup.Configuration stuff
26pub type InstanceState = u32;
27
28pub const eNone: InstanceState = 0;
29pub const eLocal: InstanceState = 1;
30pub const eRegistered: InstanceState = 2;
31pub const eNoRebootRequired: InstanceState = 4;
32pub const eComplete: InstanceState = -1i32 as u32;
33
34RIDL! {#[uuid(0xb41463c3, 0x8866, 0x43b5, 0xbc, 0x33, 0x2b, 0x06, 0x76, 0xf7, 0xf4, 0x2e)]
35interface ISetupInstance(ISetupInstanceVtbl): IUnknown(IUnknownVtbl) {
36 fn GetInstanceId(
37 pbstrInstanceId: *mut BSTR,
38 ) -> HRESULT,
39 fn GetInstallDate(
40 pInstallDate: LPFILETIME,
41 ) -> HRESULT,
42 fn GetInstallationName(
43 pbstrInstallationName: *mut BSTR,
44 ) -> HRESULT,
45 fn GetInstallationPath(
46 pbstrInstallationPath: *mut BSTR,
47 ) -> HRESULT,
48 fn GetInstallationVersion(
49 pbstrInstallationVersion: *mut BSTR,
50 ) -> HRESULT,
51 fn GetDisplayName(
52 lcid: LCID,
53 pbstrDisplayName: *mut BSTR,
54 ) -> HRESULT,
55 fn GetDescription(
56 lcid: LCID,
57 pbstrDescription: *mut BSTR,
58 ) -> HRESULT,
59 fn ResolvePath(
60 pwszRelativePath: LPCOLESTR,
61 pbstrAbsolutePath: *mut BSTR,
62 ) -> HRESULT,
63}}
64
65RIDL! {#[uuid(0x89143c9a, 0x05af, 0x49b0, 0xb7, 0x17, 0x72, 0xe2, 0x18, 0xa2, 0x18, 0x5c)]
66interface ISetupInstance2(ISetupInstance2Vtbl): ISetupInstance(ISetupInstanceVtbl) {
67 fn GetState(
68 pState: *mut InstanceState,
69 ) -> HRESULT,
70 fn GetPackages(
71 ppsaPackages: *mut LPSAFEARRAY,
72 ) -> HRESULT,
73 fn GetProduct(
74 ppPackage: *mut *mut ISetupPackageReference,
75 ) -> HRESULT,
76 fn GetProductPath(
77 pbstrProductPath: *mut BSTR,
78 ) -> HRESULT,
79}}
80
81RIDL! {#[uuid(0x6380bcff, 0x41d3, 0x4b2e, 0x8b, 0x2e, 0xbf, 0x8a, 0x68, 0x10, 0xc8, 0x48)]
82interface IEnumSetupInstances(IEnumSetupInstancesVtbl): IUnknown(IUnknownVtbl) {
83 fn Next(
84 celt: ULONG,
85 rgelt: *mut *mut ISetupInstance,
86 pceltFetched: *mut ULONG,
87 ) -> HRESULT,
88 fn Skip(
89 celt: ULONG,
90 ) -> HRESULT,
91 fn Reset() -> HRESULT,
92 fn Clone(
93 ppenum: *mut *mut IEnumSetupInstances,
94 ) -> HRESULT,
95}}
96
97RIDL! {#[uuid(0x42843719, 0xdb4c, 0x46c2, 0x8e, 0x7c, 0x64, 0xf1, 0x81, 0x6e, 0xfd, 0x5b)]
98interface ISetupConfiguration(ISetupConfigurationVtbl): IUnknown(IUnknownVtbl) {
99 fn EnumInstances(
100 ppEnumInstances: *mut *mut IEnumSetupInstances,
101 ) -> HRESULT,
102 fn GetInstanceForCurrentProcess(
103 ppInstance: *mut *mut ISetupInstance,
104 ) -> HRESULT,
105 fn GetInstanceForPath(
106 wzPath: LPCWSTR,
107 ppInstance: *mut *mut ISetupInstance,
108 ) -> HRESULT,
109}}
110
111RIDL! {#[uuid(0x26aab78c, 0x4a60, 0x49d6, 0xaf, 0x3b, 0x3c, 0x35, 0xbc, 0x93, 0x36, 0x5d)]
112interface ISetupConfiguration2(ISetupConfiguration2Vtbl):
113 ISetupConfiguration(ISetupConfigurationVtbl) {
114 fn EnumAllInstances(
115 ppEnumInstances: *mut *mut IEnumSetupInstances,
116 ) -> HRESULT,
117}}
118
119RIDL! {#[uuid(0xda8d8a16, 0xb2b6, 0x4487, 0xa2, 0xf1, 0x59, 0x4c, 0xcc, 0xcd, 0x6b, 0xf5)]
120interface ISetupPackageReference(ISetupPackageReferenceVtbl): IUnknown(IUnknownVtbl) {
121 fn GetId(
122 pbstrId: *mut BSTR,
123 ) -> HRESULT,
124 fn GetVersion(
125 pbstrVersion: *mut BSTR,
126 ) -> HRESULT,
127 fn GetChip(
128 pbstrChip: *mut BSTR,
129 ) -> HRESULT,
130 fn GetLanguage(
131 pbstrLanguage: *mut BSTR,
132 ) -> HRESULT,
133 fn GetBranch(
134 pbstrBranch: *mut BSTR,
135 ) -> HRESULT,
136 fn GetType(
137 pbstrType: *mut BSTR,
138 ) -> HRESULT,
139 fn GetUniqueId(
140 pbstrUniqueId: *mut BSTR,
141 ) -> HRESULT,
142}}
143
144RIDL! {#[uuid(0x42b21b78, 0x6192, 0x463e, 0x87, 0xbf, 0xd5, 0x77, 0x83, 0x8f, 0x1d, 0x5c)]
145interface ISetupHelper(ISetupHelperVtbl): IUnknown(IUnknownVtbl) {
146 fn ParseVersion(
147 pwszVersion: LPCOLESTR,
148 pullVersion: PULONGLONG,
149 ) -> HRESULT,
150 fn ParseVersionRange(
151 pwszVersionRange: LPCOLESTR,
152 pullMinVersion: PULONGLONG,
153 pullMaxVersion: PULONGLONG,
154 ) -> HRESULT,
155}}
156
157DEFINE_GUID! {CLSID_SetupConfiguration,
1580x177f0c4a, 0x1cd3, 0x4de7, 0xa3, 0x2c, 0x71, 0xdb, 0xbb, 0x9f, 0xa3, 0x6d}
159
160// Safe wrapper around the COM interfaces
161pub struct SetupConfiguration(ComPtr<ISetupConfiguration>);
162
163impl SetupConfiguration {
164 pub fn new() -> Result<SetupConfiguration, i32> {
165 let mut obj = null_mut();
166 let err = unsafe {
167 CoCreateInstance(
168 &CLSID_SetupConfiguration,
169 null_mut(),
170 CLSCTX_ALL,
171 &ISetupConfiguration::uuidof(),
172 &mut obj,
173 )
174 };
175 if err < 0 {
176 return Err(err);
177 }
178 let obj = unsafe { ComPtr::from_raw(obj as *mut ISetupConfiguration) };
179 Ok(SetupConfiguration(obj))
180 }
181 pub fn get_instance_for_current_process(&self) -> Result<SetupInstance, i32> {
182 let mut obj = null_mut();
183 let err = unsafe { self.0.GetInstanceForCurrentProcess(&mut obj) };
184 if err < 0 {
185 return Err(err);
186 }
187 Ok(unsafe { SetupInstance::from_raw(obj) })
188 }
189 pub fn enum_instances(&self) -> Result<EnumSetupInstances, i32> {
190 let mut obj = null_mut();
191 let err = unsafe { self.0.EnumInstances(&mut obj) };
192 if err < 0 {
193 return Err(err);
194 }
195 Ok(unsafe { EnumSetupInstances::from_raw(obj) })
196 }
197 pub fn enum_all_instances(&self) -> Result<EnumSetupInstances, i32> {
198 let mut obj = null_mut();
199 let this = self.0.cast::<ISetupConfiguration2>()?;
200 let err = unsafe { this.EnumAllInstances(&mut obj) };
201 if err < 0 {
202 return Err(err);
203 }
204 Ok(unsafe { EnumSetupInstances::from_raw(obj) })
205 }
206}
207
208pub struct SetupInstance(ComPtr<ISetupInstance>);
209
210impl SetupInstance {
211 pub unsafe fn from_raw(obj: *mut ISetupInstance) -> SetupInstance {
212 SetupInstance(ComPtr::from_raw(obj))
213 }
214 pub fn instance_id(&self) -> Result<OsString, i32> {
215 let mut s = null_mut();
216 let err = unsafe { self.0.GetInstanceId(&mut s) };
217 let bstr = unsafe { BStr::from_raw(s) };
218 if err < 0 {
219 return Err(err);
220 }
221 Ok(bstr.to_osstring())
222 }
223 pub fn installation_name(&self) -> Result<OsString, i32> {
224 let mut s = null_mut();
225 let err = unsafe { self.0.GetInstallationName(&mut s) };
226 let bstr = unsafe { BStr::from_raw(s) };
227 if err < 0 {
228 return Err(err);
229 }
230 Ok(bstr.to_osstring())
231 }
232 pub fn installation_path(&self) -> Result<OsString, i32> {
233 let mut s = null_mut();
234 let err = unsafe { self.0.GetInstallationPath(&mut s) };
235 let bstr = unsafe { BStr::from_raw(s) };
236 if err < 0 {
237 return Err(err);
238 }
239 Ok(bstr.to_osstring())
240 }
241 pub fn installation_version(&self) -> Result<OsString, i32> {
242 let mut s = null_mut();
243 let err = unsafe { self.0.GetInstallationVersion(&mut s) };
244 let bstr = unsafe { BStr::from_raw(s) };
245 if err < 0 {
246 return Err(err);
247 }
248 Ok(bstr.to_osstring())
249 }
250 pub fn product_path(&self) -> Result<OsString, i32> {
251 let mut s = null_mut();
252 let this = self.0.cast::<ISetupInstance2>()?;
253 let err = unsafe { this.GetProductPath(&mut s) };
254 let bstr = unsafe { BStr::from_raw(s) };
255 if err < 0 {
256 return Err(err);
257 }
258 Ok(bstr.to_osstring())
259 }
260}
261
262pub struct EnumSetupInstances(ComPtr<IEnumSetupInstances>);
263
264impl EnumSetupInstances {
265 pub unsafe fn from_raw(obj: *mut IEnumSetupInstances) -> EnumSetupInstances {
266 EnumSetupInstances(ComPtr::from_raw(obj))
267 }
268}
269
270impl Iterator for EnumSetupInstances {
271 type Item = Result<SetupInstance, i32>;
272 fn next(&mut self) -> Option<Result<SetupInstance, i32>> {
273 let mut obj = null_mut();
274 let err = unsafe { self.0.Next(1, &mut obj, null_mut()) };
275 if err < 0 {
276 return Some(Err(err));
277 }
278 if err == S_FALSE {
279 return None;
280 }
281 Some(Ok(unsafe { SetupInstance::from_raw(obj) }))
282 }
283}