1use shared::guiddef::{CLSID, FMTID, GUID, REFCLSID, REFFMTID};
7use shared::minwindef::{
8 BYTE, DWORD, FILETIME, FLOAT, HIBYTE, HIWORD, INT, LOBYTE, LOWORD, UINT, WORD
9};
10use shared::ntdef::{
11 BOOLEAN, CHAR, HRESULT, LARGE_INTEGER, LONG, LPSTR, LPWSTR, PVOID, SHORT,
12 UCHAR, ULARGE_INTEGER, ULONG, USHORT
13};
14use shared::wtypes::{
15 BSTR, BSTRBLOB, CLIPDATA, CY, DATE, DECIMAL, PROPID, VARIANT_BOOL, VARTYPE
16};
17use shared::wtypesbase::{BLOB, DOUBLE, LPOLESTR, SCODE};
18use um::oaidl::{IDispatch, LPSAFEARRAY};
19use um::objidlbase::IStream;
20use um::unknwnbase::{IUnknown, IUnknownVtbl};
21pub const PROPSETFLAG_DEFAULT: DWORD = 0;
22pub const PROPSETFLAG_NONSIMPLE: DWORD = 1;
23pub const PROPSETFLAG_ANSI: DWORD = 2;
24pub const PROPSETFLAG_UNBUFFERED: DWORD = 4;
25pub const PROPSET_BEHAVIOR_CASE_SENSITIVE: DWORD = 1;
26STRUCT!{struct VERSIONEDSTREAM {
27 guidVersion: GUID,
28 pStream: *mut IStream,
29}}
30pub type LPVERSIONEDSTREAM = *mut VERSIONEDSTREAM;
31macro_rules! TYPEDEF_CA {
32 ($type_:ty, $name:ident) => { STRUCT!{struct $name {
33 cElems: $crate::shared::ntdef::ULONG,
34 pElems: *mut $type_,
35 }}}
36}
37TYPEDEF_CA!(CHAR, CAC);
38TYPEDEF_CA!(UCHAR, CAUB);
39TYPEDEF_CA!(SHORT, CAI);
40TYPEDEF_CA!(USHORT, CAUI);
41TYPEDEF_CA!(LONG, CAL);
42TYPEDEF_CA!(ULONG, CAUL);
43TYPEDEF_CA!(FLOAT, CAFLT);
44TYPEDEF_CA!(DOUBLE, CADBL);
45TYPEDEF_CA!(CY, CACY);
46TYPEDEF_CA!(DATE, CADATE);
47TYPEDEF_CA!(BSTR, CABSTR);
48TYPEDEF_CA!(BSTRBLOB, CABSTRBLOB);
49TYPEDEF_CA!(VARIANT_BOOL, CABOOL);
50TYPEDEF_CA!(SCODE, CASCODE);
51TYPEDEF_CA!(PROPVARIANT, CAPROPVARIANT);
52TYPEDEF_CA!(LARGE_INTEGER, CAH);
53TYPEDEF_CA!(ULARGE_INTEGER, CAUH);
54TYPEDEF_CA!(LPSTR, CALPSTR);
55TYPEDEF_CA!(LPWSTR, CALPWSTR);
56TYPEDEF_CA!(FILETIME, CAFILETIME);
57TYPEDEF_CA!(CLIPDATA, CACLIPDATA);
58TYPEDEF_CA!(CLSID, CACLSID);
59UNION!{union PROPVARIANT_data {
60 [u64; 1] [u64; 2],
61 cVal cVal_mut: CHAR,
62 bVal bVal_mut: UCHAR,
63 iVal iVal_mut: SHORT,
64 uiVal uiVal_mut: USHORT,
65 lVal lVal_mut: LONG,
66 ulVal ulVal_mut: ULONG,
67 intVal intVal_mut: INT,
68 uintVal uintVal_mut: UINT,
69 hVal hVal_mut: LARGE_INTEGER,
70 uhVal uhVal_mut: ULARGE_INTEGER,
71 fltVal fltVal_mut: FLOAT,
72 dblVal dblVal_mut: DOUBLE,
73 boolVal boolVal_mut: VARIANT_BOOL,
74 scode scode_mut: SCODE,
75 cyVal cyVal_mut: CY,
76 date date_mut: DATE,
77 filetime filetime_mut: FILETIME,
78 puuid puuid_mut: *mut CLSID,
79 pclipdata pclipdata_mut: *mut CLIPDATA,
80 bstrVal bstrVal_mut: BSTR,
81 bstrblobVal bstrblobVal_mut: BSTRBLOB,
82 blob blob_mut: BLOB,
83 pszVal pszVal_mut: LPSTR,
84 pwszVal pwszVal_mut: LPWSTR,
85 punkVal punkVal_mut: *mut IUnknown,
86 pdispVal pdisp_mut: *mut IDispatch,
87 pStream pStream_mut: *mut IStream,
88 pVersionedStream pVersionedStream_mut: LPVERSIONEDSTREAM,
90 parray parray_mut: LPSAFEARRAY,
91 cac cac_mut: CAC,
92 caub caub_mut: CAUB,
93 cai cai_mut: CAI,
94 caui caui_mut: CAUI,
95 cal cal_mut: CAL,
96 caul caul_mut: CAUL,
97 cah cah_mut: CAH,
98 cauh cauh_mut: CAUH,
99 caflt caflt_mut: CAFLT,
100 cadbl cadbl_mut: CADBL,
101 cabool cabool_mut: CABOOL,
102 cascode cascode_mut: CASCODE,
103 cacy cacy_mut: CACY,
104 cadate cadate_mut: CADATE,
105 cafiletime cafiletime_mut: CAFILETIME,
106 cauuid cauuid_mut: CACLSID,
107 caclipdata caclipdata_mut: CACLIPDATA,
108 cabstr cabstr_mut: CABSTR,
109 cabstrblob cabstrblob_mut: CABSTRBLOB,
110 calpstr calpstr_mut: CALPSTR,
111 calpwstr calpwstr_mut: CALPWSTR,
112 capropvar capropvar_mut: CAPROPVARIANT,
113 pcVal pcVal_mut: *mut CHAR,
114 pbVal pbVal_mut: *mut UCHAR,
115 piVal piVal_mut: *mut SHORT,
116 puiVal puiVal_mut: *mut USHORT,
117 plVal plVal_mut: *mut LONG,
118 pulVal pulVal_mut: *mut ULONG,
119 pintVal pintVal_mut: *mut INT,
120 puintVal puintVal_mut: *mut UINT,
121 pfltVal pfltVal_mut: *mut FLOAT,
122 pdblVal pdblVal_mut: *mut DOUBLE,
123 pboolVal pboolVal_mut: *mut VARIANT_BOOL,
124 pdecVal pdecVal_mut: *mut DECIMAL,
125 pscode pscode_mut: *mut SCODE,
126 pcyVal pcyVal_mut: *mut CY,
127 pdate pdate_mut: *mut DATE,
128 ppunkVal ppunkVal_mut: *mut *mut IUnknown,
129 ppdispVal ppdispVal_mut: *mut *mut IDispatch,
130 ppStream ppStream_mut: *mut *mut IStream,
131 }}
133STRUCT!{struct PROPVARIANT {
136 vt: VARTYPE,
137 wReserved1: WORD,
138 wReserved2: WORD,
139 wReserved3: WORD,
140 data: PROPVARIANT_data,
141}}
142pub type LPPROPVARIANT = *mut PROPVARIANT;
143pub type REFPROPVARIANT = *const PROPVARIANT;
144pub const PID_DICTIONARY: DWORD = 0;
145pub const PID_CODEPAGE: DWORD = 0x1;
146pub const PID_FIRST_USABLE: DWORD = 0x2;
147pub const PID_FIRST_NAME_DEFAULT: DWORD = 0xfff;
148pub const PID_LOCALE: DWORD = 0x80000000;
149pub const PID_MODIFY_TIME: DWORD = 0x80000001;
150pub const PID_SECURITY: DWORD = 0x80000002;
151pub const PID_BEHAVIOR: DWORD = 0x80000003;
152pub const PID_ILLEGAL: DWORD = 0xffffffff;
153pub const PID_MIN_READONLY: DWORD = 0x80000000;
154pub const PID_MAX_READONLY: DWORD = 0xbfffffff;
155pub const PRSPEC_INVALID: ULONG = 0xffffffff;
156pub const PRSPEC_LPWSTR: ULONG = 0;
157pub const PRSPEC_PROPID: ULONG = 1;
158UNION!{union PROPSPEC_u {
159 [u32; 1] [u64; 1],
160 propid propid_mut: PROPID,
161 lpwstr lpwstr_mut: LPOLESTR,
162}}
163STRUCT!{struct PROPSPEC {
164 ulKind: ULONG,
165 u: PROPSPEC_u,
166}}
167STRUCT!{struct STATPROPSTG {
168 lpwstrName: LPOLESTR,
169 propid: PROPID,
170 vt: VARTYPE,
171}}
172#[inline]
173pub fn PROPSETHDR_OSVER_KIND(dwOSVer: DWORD) -> WORD {
174 HIWORD(dwOSVer)
175}
176#[inline]
177pub fn PROPSETHDR_OSVER_MAJOR(dwOSVer: DWORD) -> BYTE {
178 LOBYTE(LOWORD(dwOSVer))
179}
180#[inline]
181pub fn PROPSETHDR_OSVER_MINOR(dwOSVer: DWORD) -> BYTE {
182 HIBYTE(LOWORD(dwOSVer))
183}
184pub const PROPSETHDR_OSVERSION_UNKNOWN: DWORD = 0xFFFFFFFF;
185STRUCT!{struct STATPROPSETSTG {
186 fmtid: FMTID,
187 clsid: CLSID,
188 grfFlags: DWORD,
189 mtime: FILETIME,
190 ctime: FILETIME,
191 atime: FILETIME,
192 dwOSVersion: DWORD,
193}}
194RIDL!{#[uuid(0x00000138, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)]
195interface IPropertyStorage(IPropertyStorageVtbl): IUnknown(IUnknownVtbl) {
196 fn ReadMultiple(
197 cpspec: ULONG,
198 rgpspec: *const PROPSPEC,
199 rgpropvar: *mut PROPVARIANT,
200 ) -> HRESULT,
201 fn WriteMultiple(
202 cpspec: ULONG,
203 rgpspec: *const PROPSPEC,
204 rgpropvar: *const PROPVARIANT,
205 ) -> HRESULT,
206 fn DeleteMultiple(
207 cpspec: ULONG,
208 rgpspec: *const PROPSPEC,
209 ) -> HRESULT,
210 fn ReadPropertyNames(
211 cppropid: ULONG,
212 rgpropid: *const PROPID,
213 rglpwstrName: *mut LPOLESTR,
214 ) -> HRESULT,
215 fn WritePropertyNames(
216 cppropid: ULONG,
217 rgpropid: *const PROPID,
218 rglpwstrName: *const LPOLESTR,
219 ) -> HRESULT,
220 fn DeletePropertyNames(
221 cppropid: ULONG,
222 rgpropid: *const PROPID,
223 ) -> HRESULT,
224 fn Commit(
225 grfCommitFlags: DWORD,
226 ) -> HRESULT,
227 fn Revert() -> HRESULT,
228 fn Enum(
229 ppenum: *mut *mut IEnumSTATPROPSTG,
230 ) -> HRESULT,
231 fn SetTimes(
232 pctime: *const FILETIME,
233 patime: *const FILETIME,
234 pmtime: *const FILETIME,
235 ) -> HRESULT,
236 fn SetClass(
237 clsid: REFCLSID,
238 ) -> HRESULT,
239 fn Stat(
240 pstatpsstg: *mut STATPROPSETSTG,
241 ) -> HRESULT,
242}}
243pub type LPPROPERTYSETSTORAGE = *mut IPropertySetStorage;
244RIDL!{#[uuid(0x0000013A, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)]
245interface IPropertySetStorage(IPropertySetStorageVtbl): IUnknown(IUnknownVtbl) {
246 fn Create(
247 rfmtid: REFFMTID,
248 pclsid: *const CLSID,
249 grfFlags: DWORD,
250 grfMode: DWORD,
251 ppprstg: *mut *mut IPropertyStorage,
252 ) -> HRESULT,
253 fn Open(
254 rfmtid: REFFMTID,
255 grfMode: DWORD,
256 ppprstg: *mut *mut IPropertyStorage,
257 ) -> HRESULT,
258 fn Delete(
259 rfmtid: REFFMTID,
260 ) -> HRESULT,
261 fn Enum(
262 ppenum: *mut *mut IEnumSTATPROPSTG,
263 ) -> HRESULT,
264}}
265pub type LPENUMSTATPROPSTG = *mut IEnumSTATPROPSTG;
266RIDL!{#[uuid(0x00000139, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)]
267interface IEnumSTATPROPSTG(IEnumSTATPROPSTGVtbl): IUnknown(IUnknownVtbl) {
268 fn Next(
269 celt: ULONG,
270 rgelt: *mut STATPROPSTG,
271 pceltFetched: *mut ULONG,
272 ) -> HRESULT,
273 fn Skip(
274 celt: ULONG,
275 ) -> HRESULT,
276 fn Revert() -> HRESULT,
277 fn Clone(
278 ppenum: *mut *mut IEnumSTATPROPSTG,
279 ) -> HRESULT,
280}}
281pub type LPENUMSTATPROPSETSTG = *mut IEnumSTATPROPSETSTG;
282RIDL!{#[uuid(0x0000013B, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)]
283interface IEnumSTATPROPSETSTG(IEnumSTATPROPSETSTGVtbl): IUnknown(IUnknownVtbl) {
284 fn Next(
285 celt: ULONG,
286 rgelt: *mut STATPROPSETSTG,
287 pceltFetched: *mut ULONG,
288 ) -> HRESULT,
289 fn Skip(
290 celt: ULONG,
291 ) -> HRESULT,
292 fn Revert() -> HRESULT,
293 fn Clone(
294 ppenum: *mut *mut IEnumSTATPROPSETSTG,
295 ) -> HRESULT,
296}}
297pub type LPPROPERTYSTORAGE = *mut IPropertyStorage;
298pub const PIDDI_THUMBNAIL: DWORD = 0x00000002;
299pub const PIDSI_TITLE: DWORD = 0x00000002;
300pub const PIDSI_SUBJECT: DWORD = 0x00000003;
301pub const PIDSI_AUTHOR: DWORD = 0x00000004;
302pub const PIDSI_KEYWORDS: DWORD = 0x00000005;
303pub const PIDSI_COMMENTS: DWORD = 0x00000006;
304pub const PIDSI_TEMPLATE: DWORD = 0x00000007;
305pub const PIDSI_LASTAUTHOR: DWORD = 0x00000008;
306pub const PIDSI_REVNUMBER: DWORD = 0x00000009;
307pub const PIDSI_EDITTIME: DWORD = 0x0000000a;
308pub const PIDSI_LASTPRINTED: DWORD = 0x0000000b;
309pub const PIDSI_CREATE_DTM: DWORD = 0x0000000c;
310pub const PIDSI_LASTSAVE_DTM: DWORD = 0x0000000d;
311pub const PIDSI_PAGECOUNT: DWORD = 0x0000000e;
312pub const PIDSI_WORDCOUNT: DWORD = 0x0000000f;
313pub const PIDSI_CHARCOUNT: DWORD = 0x00000010;
314pub const PIDSI_THUMBNAIL: DWORD = 0x00000011;
315pub const PIDSI_APPNAME: DWORD = 0x00000012;
316pub const PIDSI_DOC_SECURITY: DWORD = 0x00000013;
317pub const PIDDSI_CATEGORY: DWORD = 0x00000002;
318pub const PIDDSI_PRESFORMAT: DWORD = 0x00000003;
319pub const PIDDSI_BYTECOUNT: DWORD = 0x00000004;
320pub const PIDDSI_LINECOUNT: DWORD = 0x00000005;
321pub const PIDDSI_PARCOUNT: DWORD = 0x00000006;
322pub const PIDDSI_SLIDECOUNT: DWORD = 0x00000007;
323pub const PIDDSI_NOTECOUNT: DWORD = 0x00000008;
324pub const PIDDSI_HIDDENCOUNT: DWORD = 0x00000009;
325pub const PIDDSI_MMCLIPCOUNT: DWORD = 0x0000000A;
326pub const PIDDSI_SCALE: DWORD = 0x0000000B;
327pub const PIDDSI_HEADINGPAIR: DWORD = 0x0000000C;
328pub const PIDDSI_DOCPARTS: DWORD = 0x0000000D;
329pub const PIDDSI_MANAGER: DWORD = 0x0000000E;
330pub const PIDDSI_COMPANY: DWORD = 0x0000000F;
331pub const PIDDSI_LINKSDIRTY: DWORD = 0x00000010;
332pub const PIDMSI_EDITOR: DWORD = 0x00000002;
333pub const PIDMSI_SUPPLIER: DWORD = 0x00000003;
334pub const PIDMSI_SOURCE: DWORD = 0x00000004;
335pub const PIDMSI_SEQUENCE_NO: DWORD = 0x00000005;
336pub const PIDMSI_PROJECT: DWORD = 0x00000006;
337pub const PIDMSI_STATUS: DWORD = 0x00000007;
338pub const PIDMSI_OWNER: DWORD = 0x00000008;
339pub const PIDMSI_RATING: DWORD = 0x00000009;
340pub const PIDMSI_PRODUCTION: DWORD = 0x0000000A;
341pub const PIDMSI_COPYRIGHT: DWORD = 0x0000000B;
342ENUM!{enum PIDMSI_STATUS_VALUE {
343 PIDMSI_STATUS_NORMAL = 0,
344 PIDMSI_STATUS_NEW,
345 PIDMSI_STATUS_PRELIM,
346 PIDMSI_STATUS_DRAFT,
347 PIDMSI_STATUS_INPROGRESS,
348 PIDMSI_STATUS_EDIT,
349 PIDMSI_STATUS_REVIEW,
350 PIDMSI_STATUS_PROOF,
351 PIDMSI_STATUS_FINAL,
352 PIDMSI_STATUS_OTHER = 0x7fff,
353}}
354extern "system" {
355 pub fn PropVariantCopy(
356 pvarDest: *mut PROPVARIANT,
357 pvarSrc: *const PROPVARIANT,
358 ) -> HRESULT;
359 pub fn PropVariantClear(
360 pvar: *mut PROPVARIANT,
361 ) -> HRESULT;
362 pub fn FreePropVariantArray(
363 cVariants: ULONG,
364 rgvars: *mut PROPVARIANT,
365 ) -> HRESULT;
366}
367STRUCT!{struct SERIALIZEDPROPERTYVALUE {
372 dwType: DWORD,
373 rgb: *mut BYTE,
374}}
375pub type PMemoryAllocator = PVOID;
376extern "system" {
377 pub fn StgConvertVariantToProperty(
378 pvar: *const PROPVARIANT,
379 CodePage: USHORT,
380 pprop: *mut SERIALIZEDPROPERTYVALUE,
381 pcb: *mut ULONG,
382 pid: PROPID,
383 fReserved: BOOLEAN,
384 pcIndirect: *mut ULONG,
385 ) -> *mut SERIALIZEDPROPERTYVALUE;
386 pub fn StgConvertPropertyToVariant(
387 pprop: *const SERIALIZEDPROPERTYVALUE,
388 CodePage: USHORT,
389 pvar: *mut PROPVARIANT,
390 pma: *mut PMemoryAllocator
391 ) -> BOOLEAN;
392}