include: Add XMLDOMDocumentEvents dispinterface to xmldom.idl.
[wine] / include / objidl.idl
1 /*
2  * Copyright 2002 Ove Kaaven
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #ifndef DO_NO_IMPORTS
20 import "unknwn.idl";
21 #endif
22
23 interface IStream;
24 interface IEnumString;
25 interface IRunningObjectTable;
26 interface IMoniker;
27 interface IAdviseSink;
28 interface IAsyncManager;
29 interface ISynchronize;
30
31 typedef struct _COSERVERINFO {
32   DWORD dwReserved1;
33   LPWSTR pwszName;
34   COAUTHINFO *pAuthInfo;
35   DWORD dwReserved2;
36 } COSERVERINFO;
37
38 /******************** Fundamentals ********************/
39
40 [
41   local,
42   object,
43   uuid(00000003-0000-0000-C000-000000000046)
44 ]
45 interface IMarshal : IUnknown
46 {
47   typedef [unique] IMarshal *LPMARSHAL;
48
49   HRESULT GetUnmarshalClass(
50     [in] REFIID riid,
51     [in, unique] void *pv,
52     [in] DWORD dwDestContext,
53     [in, unique] void *pvDestContext,
54     [in] DWORD mshlflags,
55     [out] CLSID *pCid);
56
57   HRESULT GetMarshalSizeMax(
58     [in] REFIID riid,
59     [in, unique] void *pv,
60     [in] DWORD dwDestContext,
61     [in, unique] void *pvDestContext,
62     [in] DWORD mshlflags,
63     [out] DWORD *pSize);
64
65   HRESULT MarshalInterface(
66     [in, unique] IStream *pStm,
67     [in] REFIID riid,
68     [in, unique] void *pv,
69     [in] DWORD dwDestContext,
70     [in, unique] void *pvDestContext,
71     [in] DWORD mshlflags);
72
73   HRESULT UnmarshalInterface(
74     [in, unique] IStream *pStm,
75     [in] REFIID riid,
76     [out] void **ppv);
77
78   HRESULT ReleaseMarshalData(
79     [in, unique] IStream *pStm);
80
81   HRESULT DisconnectObject(
82     [in] DWORD dwReserved);
83 }
84
85 [
86     local,
87     object,
88     uuid(000001cf-0000-0000-C000-000000000046)
89 ]
90 interface IMarshal2 : IMarshal
91 {
92     typedef [unique] IMarshal2 *LPMARSHAL2;
93 }
94
95 [
96   local,
97   object,
98   uuid(00000018-0000-0000-C000-000000000046)
99 ]
100 interface IStdMarshalInfo : IUnknown
101 {
102   typedef [unique] IStdMarshalInfo *LPSTDMARSHALINFO;
103
104   HRESULT GetClassForHandler(
105     [in] DWORD dwDestContext,
106     [in, unique] void *pvDestContext,
107     [out] CLSID *pClsid);
108 }
109
110 [
111   local,
112   object,
113   uuid(00000019-0000-0000-C000-000000000046)
114 ]
115 interface IExternalConnection : IUnknown
116 {
117   typedef [unique] IExternalConnection *LPEXTERNALCONNECTION;
118
119   typedef enum tagEXTCONN {
120     EXTCONN_STRONG   = 0x0001,
121     EXTCONN_WEAK     = 0x0002,
122     EXTCONN_CALLABLE = 0x0004
123   } EXTCONN;
124
125   DWORD AddConnection(
126     [in] DWORD extconn,
127     [in] DWORD reserved);
128
129   DWORD ReleaseConnection(
130     [in] DWORD extconn,
131     [in] DWORD reserved,
132     [in] BOOL fLastReleaseCloses);
133 }
134
135 [
136   local,
137   object,
138   uuid(00000020-0000-0000-C000-000000000046)
139 ]
140 interface IMultiQI : IUnknown
141 {
142   typedef [unique] IMultiQI *LPMULTIQI;
143
144   typedef struct tagMULTI_QI {
145     const IID *pIID;
146     IUnknown *pItf;
147     HRESULT hr;
148   } MULTI_QI;
149
150   HRESULT QueryMultipleInterfaces(
151     [in] ULONG cMQIs,
152     [in, out] MULTI_QI *pMQIs);
153 }
154
155 [
156   local,
157   object,
158   uuid(00000002-0000-0000-C000-000000000046)
159 ]
160 interface IMalloc : IUnknown
161 {
162   typedef [unique] IMalloc *LPMALLOC;
163
164   LPVOID Alloc(
165     [in] ULONG cb);
166
167   LPVOID Realloc(
168     [in] LPVOID pv,
169     [in] ULONG cb);
170
171   void Free(
172     [in] LPVOID pv);
173
174   ULONG GetSize(
175     [in] LPVOID pv);
176
177   int DidAlloc(LPVOID pv);
178
179   void HeapMinimize();
180 }
181
182 [
183   local,
184   object,
185   uuid(0000001d-0000-0000-C000-000000000046)
186 ]
187 interface IMallocSpy : IUnknown
188 {
189   typedef [unique] IMallocSpy *LPMALLOCSPY;
190
191   ULONG PreAlloc(
192     [in] ULONG cbRequest);
193
194   LPVOID PostAlloc(
195     [in] LPVOID pActual);
196
197   LPVOID PreFree(
198     [in] LPVOID pRequest,
199     [in] BOOL fSpyed);
200
201   void PostFree(
202     [in] BOOL fSpyed);
203
204   ULONG PreRealloc(
205     [in] LPVOID pRequest,
206     [in] ULONG cbRequest,
207     [out] LPVOID *ppNewRequest,
208     [in] BOOL fSpyed);
209
210   LPVOID PostRealloc(
211     [in] LPVOID pActual,
212     [in] BOOL fSpyed);
213
214   LPVOID PreGetSize(
215     [in] LPVOID pRequest,
216     [in] BOOL fSpyed);
217
218   ULONG PostGetSize(
219     [in] ULONG cbActual,
220     [in] BOOL fSpyed);
221
222   LPVOID PreDidAlloc(
223     [in] LPVOID pRequest,
224     [in] BOOL fSpyed);
225
226   int PostDidAlloc(
227     [in] LPVOID pRequest,
228     [in] BOOL fSpyed,
229     [in] int fActual);
230
231   void PreHeapMinimize();
232
233   void PostHeapMinimize();
234 }
235
236 [
237   local,
238   object,
239   uuid(00000021-0000-0000-C000-000000000046)
240 ]
241 interface IInternalUnknown : IUnknown
242 {
243   HRESULT QueryInternalInterface(
244     [in] REFIID riid,
245     [out] void **ppv);
246 }
247
248 [
249   object,
250   uuid(00000100-0000-0000-C000-000000000046),
251   pointer_default(unique)
252 ]
253 interface IEnumUnknown : IUnknown
254 {
255   typedef [unique] IEnumUnknown *LPENUMUNKNOWN;
256
257   [local]
258   HRESULT Next(
259     [in] ULONG celt,
260     [out] IUnknown **rgelt,
261     [out] ULONG *pceltFetched);
262
263   [call_as(Next)]
264   HRESULT RemoteNext(
265     [in] ULONG celt,
266     [out, size_is(celt), length_is(*pceltFetched)]
267     IUnknown **rgelt,
268     [out] ULONG *pceltFetched);
269
270   HRESULT Skip(
271     [in] ULONG celt);
272
273   HRESULT Reset();
274
275   HRESULT Clone(
276     [out] IEnumUnknown **ppenum);
277 }
278
279 [
280   object,
281   uuid(00000022-0000-0000-C000-000000000046),
282   version(1.0),
283   pointer_default(unique)
284 ]
285 interface ISurrogate : IUnknown
286 {
287   typedef [unique] ISurrogate *LPSURROGATE;
288
289   HRESULT LoadDllServer(
290     [in] REFCLSID Clsid);
291   HRESULT FreeSurrogate();
292 }
293
294 [
295   local,
296   object,
297   uuid(00000146-0000-0000-C000-000000000046)
298 ]
299 interface IGlobalInterfaceTable : IUnknown
300 {
301   typedef [unique] IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
302
303   HRESULT RegisterInterfaceInGlobal(
304     [in] IUnknown *pUnk,
305     [in] REFIID riid,
306     [out] DWORD *pdwCookie);
307
308   HRESULT RevokeInterfaceFromGlobal(
309     [in] DWORD dwCookie);
310
311   HRESULT GetInterfaceFromGlobal(
312     [in] DWORD dwCookie,
313     [in] REFIID riid,
314     [out, iid_is(riid)] void **ppv);
315 }
316
317 /******************** Monikers ********************/
318
319 [
320   object,
321   uuid(0000000e-0000-0000-C000-000000000046),
322   pointer_default(unique)
323 ]
324 interface IBindCtx : IUnknown
325 {
326   typedef [unique] IBindCtx *LPBINDCTX;
327   typedef [unique] IBindCtx *LPBC;
328
329   typedef struct tagBIND_OPTS {
330     DWORD cbStruct;
331     DWORD grfFlags;
332     DWORD grfMode;
333     DWORD dwTickCountDeadline;
334   } BIND_OPTS, *LPBIND_OPTS;
335
336   /* FIXME: C++ crap */
337   typedef struct tagBIND_OPTS2 {
338     DWORD cbStruct;
339     DWORD grfFlags;
340     DWORD grfMode;
341     DWORD dwTickCountDeadline;
342     DWORD dwTrackFlags;
343     DWORD dwClassContext;
344     LCID  locale;
345     COSERVERINFO *pServerInfo;
346   } BIND_OPTS2, *LPBIND_OPTS2;
347
348   typedef enum tagBIND_FLAGS {
349     BIND_MAYBOTHERUSER   = 1,
350     BIND_JUSTTESTEXISTENCE = 2
351   } BIND_FLAGS;
352
353   HRESULT RegisterObjectBound(
354     [in, unique] IUnknown *punk);
355
356   HRESULT RevokeObjectBound(
357     [in, unique] IUnknown *punk);
358
359   HRESULT ReleaseBoundObjects();
360
361   [local]
362   HRESULT SetBindOptions(
363     [in] BIND_OPTS *pbindopts);
364
365   [call_as(SetBindOptions)]
366   HRESULT RemoteSetBindOptions(
367     [in] BIND_OPTS2 *pbindopts);
368
369   [local]
370   HRESULT GetBindOptions(
371     [in, out] BIND_OPTS *pbindopts);
372
373   [call_as(GetBindOptions)]
374   HRESULT RemoteGetBindOptions(
375     [in, out] BIND_OPTS2 *pbindopts);
376
377   HRESULT GetRunningObjectTable(
378     [out] IRunningObjectTable **pprot);
379
380   HRESULT RegisterObjectParam(
381     [in] LPOLESTR pszKey,
382     [in, unique] IUnknown *punk);
383
384   HRESULT GetObjectParam(
385     [in] LPOLESTR pszKey,
386     [out] IUnknown **ppunk);
387
388   HRESULT EnumObjectParam(
389     [out] IEnumString **ppenum);
390
391   HRESULT RevokeObjectParam(
392     [in] LPOLESTR pszKey);
393 }
394
395 [
396   object,
397   uuid(00000102-0000-0000-C000-000000000046),
398   pointer_default(unique)
399 ]
400 interface IEnumMoniker : IUnknown
401 {
402   typedef [unique] IEnumMoniker *LPENUMMONIKER;
403
404   [local]
405   HRESULT Next(
406     [in] ULONG celt,
407     [out, size_is(celt), length_is(*pceltFetched)]
408     IMoniker **rgelt,
409     [out] ULONG *pceltFetched);
410
411   [call_as(Next)]
412   HRESULT RemoteNext(
413     [in] ULONG celt,
414     [out, size_is(celt), length_is(*pceltFetched)]
415     IMoniker **rgelt,
416     [out] ULONG *pceltFetched);
417
418   HRESULT Skip(
419     [in] ULONG celt);
420
421   HRESULT Reset();
422
423   HRESULT Clone(
424     [out] IEnumMoniker **ppenum);
425 }
426
427 [
428   object,
429   uuid(00000126-0000-0000-C000-000000000046)
430 ]
431 interface IRunnableObject : IUnknown
432 {
433   typedef [unique] IRunnableObject *LPRUNNABLEOBJECT;
434
435   HRESULT GetRunningClass(
436     [out] LPCLSID lpClsid);
437
438   HRESULT Run(
439     [in] LPBINDCTX pbc);
440
441   [local]
442   BOOL IsRunning();
443
444   [call_as(IsRunning)]
445   HRESULT RemoteIsRunning();
446
447   HRESULT LockRunning(
448     [in] BOOL fLock,
449     [in] BOOL fLastUnlockCloses);
450
451   HRESULT SetContainedObject(
452     [in] BOOL fContained);
453 }
454
455 /* GetObject is defined in wingdi.h as WINELIB_NAME_AW(GetObject),
456  * which resolves to a compilation failure if WINE_NO_UNICODE_MACROS is defined,
457  * but GetObject is used as a valid method name below, so we have
458  * to undefine it in that case */
459 cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
460 cpp_quote("#undef GetObject")
461 cpp_quote("#endif")
462
463 [
464   object,
465   uuid(00000010-0000-0000-C000-000000000046)
466 ]
467 interface IRunningObjectTable : IUnknown
468 {
469   typedef [unique] IRunningObjectTable *LPRUNNINGOBJECTTABLE;
470
471   HRESULT Register(
472     [in] DWORD grfFlags,
473     [in, unique] IUnknown *punkObject,
474     [in, unique] IMoniker *pmkObjectName,
475     [out] DWORD *pdwRegister);
476
477   HRESULT Revoke(
478     [in] DWORD dwRegister);
479
480   HRESULT IsRunning(
481     [in, unique] IMoniker *pmkObjectName);
482
483   HRESULT GetObject(
484     [in, unique] IMoniker *pmkObjectName,
485     [out] IUnknown **ppunkObject);
486
487   HRESULT NoteChangeTime(
488     [in] DWORD dwRegister,
489     [in] FILETIME *pfiletime);
490
491   HRESULT GetTimeOfLastChange(
492     [in, unique] IMoniker *pmkObjectName,
493     [out] FILETIME *pfiletime);
494
495   HRESULT EnumRunning(
496     [out] IEnumMoniker **ppenumMoniker);
497 }
498
499 [
500   object,
501   uuid(0000010c-0000-0000-C000-000000000046)
502 ]
503 interface IPersist : IUnknown
504 {
505   typedef [unique] IPersist *LPPERSIST;
506
507   HRESULT GetClassID(
508     [out] CLSID *pClassID);
509 }
510
511 [
512   object,
513   uuid(00000109-0000-0000-C000-000000000046),
514   pointer_default(unique)
515 ]
516 interface IPersistStream : IPersist
517 {
518   typedef [unique] IPersistStream *LPPERSISTSTREAM;
519
520   HRESULT IsDirty();
521
522   HRESULT Load(
523     [in, unique] IStream *pStm);
524
525   HRESULT Save(
526     [in, unique] IStream *pStm,
527     [in] BOOL fClearDirty);
528
529   HRESULT GetSizeMax(
530     [out] ULARGE_INTEGER *pcbSize);
531 }
532
533 [
534   object,
535   uuid(0000000f-0000-0000-C000-000000000046),
536   pointer_default(unique)
537 ]
538 interface IMoniker : IPersistStream
539 {
540   typedef [unique] IMoniker *LPMONIKER;
541
542   typedef enum tagMKSYS {
543     MKSYS_NONE             = 0,
544     MKSYS_GENERICCOMPOSITE = 1,
545     MKSYS_FILEMONIKER      = 2,
546     MKSYS_ANTIMONIKER      = 3,
547     MKSYS_ITEMMONIKER      = 4,
548     MKSYS_POINTERMONIKER   = 5,
549     /* MKSYS_URLMONIKER       = 6, */ /* defined in urlmon.idl */
550     MKSYS_CLASSMONIKER     = 7
551   } MKSYS;
552
553   typedef [v1_enum] enum tagMKREDUCE {
554     MKRREDUCE_ONE         = 3 << 16,
555     MKRREDUCE_TOUSER      = 2 << 16,
556     MKRREDUCE_THROUGHUSER = 1 << 16,
557     MKRREDUCE_ALL         = 0
558   } MKRREDUCE;
559
560   [local]
561   HRESULT BindToObject(
562     [in, unique] IBindCtx *pbc,
563     [in, unique] IMoniker *pmkToLeft,
564     [in] REFIID riidResult,
565     [out, iid_is(riidResult)] void **ppvResult);
566
567   [call_as(BindToObject)]
568   HRESULT RemoteBindToObject(
569     [in, unique] IBindCtx *pbc,
570     [in, unique] IMoniker *pmkToLeft,
571     [in] REFIID riidResult,
572     [out, iid_is(riidResult)] IUnknown **ppvResult);
573
574   [local]
575   HRESULT BindToStorage(
576     [in, unique] IBindCtx *pbc,
577     [in, unique] IMoniker *pmkToLeft,
578     [in] REFIID riid,
579     [out, iid_is(riid)] void **ppvObj);
580
581   [call_as(BindToStorage)]
582   HRESULT RemoteBindToStorage(
583     [in, unique] IBindCtx *pbc,
584     [in, unique] IMoniker *pmkToLeft,
585     [in] REFIID riid,
586     [out, iid_is(riid)] IUnknown **ppvObj);
587
588   HRESULT Reduce(
589     [in, unique] IBindCtx *pbc,
590     [in] DWORD dwReduceHowFar,
591     [in, out, unique] IMoniker **ppmkToLeft,
592     [out] IMoniker **ppmkReduced);
593
594   HRESULT ComposeWith(
595     [in, unique] IMoniker *pmkRight,
596     [in] BOOL fOnlyIfNotGeneric,
597     [out] IMoniker **ppmkComposite);
598
599   HRESULT Enum(
600     [in] BOOL fForward,
601     [out] IEnumMoniker **ppenumMoniker);
602
603   HRESULT IsEqual(
604     [in, unique] IMoniker *pmkOtherMoniker);
605
606   HRESULT Hash(
607     [out] DWORD *pdwHash);
608
609   HRESULT IsRunning(
610     [in, unique] IBindCtx *pbc,
611     [in, unique] IMoniker *pmkToLeft,
612     [in, unique] IMoniker *pmkNewlyRunning);
613
614   HRESULT GetTimeOfLastChange(
615     [in, unique] IBindCtx *pbc,
616     [in, unique] IMoniker *pmkToLeft,
617     [out] FILETIME *pFileTime);
618
619   HRESULT Inverse(
620     [out] IMoniker **ppmk);
621
622   HRESULT CommonPrefixWith(
623     [in, unique] IMoniker *pmkOther,
624     [out] IMoniker **ppmkPrefix);
625
626   HRESULT RelativePathTo(
627     [in, unique] IMoniker *pmkOther,
628     [out] IMoniker **ppmkRelPath);
629
630   HRESULT GetDisplayName(
631     [in, unique] IBindCtx *pbc,
632     [in, unique] IMoniker *pmkToLeft,
633     [out] LPOLESTR *ppszDisplayName);
634
635   HRESULT ParseDisplayName(
636     [in, unique] IBindCtx *pbc,
637     [in, unique] IMoniker *pmkToLeft,
638     [in] LPOLESTR pszDisplayName,
639     [out] ULONG *pchEaten,
640     [out] IMoniker **ppmkOut);
641
642   HRESULT IsSystemMoniker(
643     [out] DWORD *pdwMksys);
644 }
645
646 [
647   object,
648   uuid(f29f6bc0-5021-11ce-aa15-00006901293f),
649   pointer_default(unique)
650 ]
651 interface IROTData : IUnknown
652 {
653   HRESULT GetComparisonData(
654     [out, size_is(cbMax)] byte *pbData,
655     [in] ULONG cbMax,
656     [out] ULONG *pcbData);
657 }
658
659 [
660   object,
661   uuid(00000101-0000-0000-C000-000000000046),
662   pointer_default(unique)
663 ]
664 interface IEnumString : IUnknown
665 {
666   typedef [unique] IEnumString *LPENUMSTRING;
667
668   [local]
669   HRESULT Next(
670     [in] ULONG celt,
671     [out, size_is(celt), length_is(*pceltFetched)]
672     LPOLESTR *rgelt,
673     [out] ULONG *pceltFetched);
674
675   [call_as(Next)]
676   HRESULT RemoteNext(
677     [in] ULONG celt,
678     [out, size_is(celt), length_is(*pceltFetched)]
679     LPOLESTR *rgelt,
680     [out] ULONG *pceltFetched);
681
682   HRESULT Skip(
683     [in] ULONG celt);
684
685   HRESULT Reset();
686
687   HRESULT Clone(
688     [out] IEnumString **ppenum);
689 }
690
691 [
692   object,
693   uuid(00000140-0000-0000-C000-000000000046)
694 ]
695 interface IClassActivator : IUnknown
696 {
697   HRESULT GetClassObject(
698     [in] REFCLSID rclsid,
699     [in] DWORD dwClassContext,
700     [in] LCID locale,
701     [in] REFIID riid,
702     [out, iid_is(riid)] void **ppv);
703 }
704
705 /******************** Storage ********************/
706
707 [
708   object,
709   uuid(0c733a30-2a1c-11ce-ade5-00aa0044773d),
710   pointer_default(unique)
711 ]
712 interface ISequentialStream : IUnknown
713 {
714   [local]
715   HRESULT Read(
716     [out, size_is(cb), length_is(*pcbRead)]
717     void *pv,
718     [in] ULONG cb,
719     [out] ULONG *pcbRead);
720
721   [call_as(Read)]
722   HRESULT RemoteRead(
723     [out, size_is(cb), length_is(*pcbRead)]
724     byte *pv,
725     [in] ULONG cb,
726     [out] ULONG *pcbRead);
727
728   [local]
729   HRESULT Write(
730     [in, size_is(cb)] const void *pv,
731     [in] ULONG cb,
732     [out] ULONG *pcbWritten);
733
734   [call_as(Write)]
735   HRESULT RemoteWrite(
736     [in, size_is(cb)] const byte *pv,
737     [in] ULONG cb,
738     [out] ULONG *pcbWritten);
739 }
740
741 [
742   object,
743   uuid(0000000c-0000-0000-C000-000000000046),
744   pointer_default(unique)
745 ]
746 interface IStream : ISequentialStream
747 {
748   typedef [unique] IStream *LPSTREAM;
749
750   typedef struct tagSTATSTG {
751     LPOLESTR pwcsName;
752     DWORD type;
753     ULARGE_INTEGER cbSize;
754     FILETIME mtime;
755     FILETIME ctime;
756     FILETIME atime;
757     DWORD grfMode;
758     DWORD grfLocksSupported;
759     CLSID clsid;
760     DWORD grfStateBits;
761     DWORD reserved;
762   } STATSTG;
763
764   typedef enum tagSTGTY {
765     STGTY_STORAGE   = 1,
766     STGTY_STREAM    = 2,
767     STGTY_LOCKBYTES = 3,
768     STGTY_PROPERTY  = 4
769   } STGTY;
770
771   typedef enum tagSTREAM_SEEK {
772     STREAM_SEEK_SET = 0,
773     STREAM_SEEK_CUR = 1,
774     STREAM_SEEK_END = 2
775   } STREAM_SEEK;
776
777   /* these are defined in Linux's fcntl.h,
778    * undefine them to avoid conflicts */
779   cpp_quote("#undef LOCK_MAND")
780   cpp_quote("#undef LOCK_READ")
781   cpp_quote("#undef LOCK_WRITE")
782   cpp_quote("#undef LOCK_RW")
783
784   typedef enum tagLOCKTYPE {
785     LOCK_WRITE      = 1,
786     LOCK_EXCLUSIVE  = 2,
787     LOCK_ONLYONCE   = 4
788   } LOCKTYPE;
789
790   [local]
791   HRESULT Seek(
792     [in] LARGE_INTEGER dlibMove,
793     [in] DWORD dwOrigin,
794     [out] ULARGE_INTEGER *plibNewPosition);
795
796   [call_as(Seek)]
797   HRESULT RemoteSeek(
798     [in] LARGE_INTEGER dlibMove,
799     [in] DWORD dwOrigin,
800     [out] ULARGE_INTEGER *plibNewPosition);
801
802   HRESULT SetSize(
803     [in] ULARGE_INTEGER libNewSize);
804
805   [local]
806   HRESULT CopyTo(
807     [in, unique] IStream *pstm,
808     [in] ULARGE_INTEGER cb,
809     [out] ULARGE_INTEGER *pcbRead,
810     [out] ULARGE_INTEGER *pcbWritten);
811
812   [call_as(CopyTo)]
813   HRESULT RemoteCopyTo(
814     [in, unique] IStream *pstm,
815     [in] ULARGE_INTEGER cb,
816     [out] ULARGE_INTEGER *pcbRead,
817     [out] ULARGE_INTEGER *pcbWritten);
818
819   HRESULT Commit(
820     [in] DWORD grfCommitFlags);
821
822   HRESULT Revert();
823
824   HRESULT LockRegion(
825     [in] ULARGE_INTEGER libOffset,
826     [in] ULARGE_INTEGER cb,
827     [in] DWORD dwLockType);
828
829   HRESULT UnlockRegion(
830     [in] ULARGE_INTEGER libOffset,
831     [in] ULARGE_INTEGER cb,
832     [in] DWORD dwLockType);
833
834   HRESULT Stat(
835     [out] STATSTG *pstatstg,
836     [in] DWORD grfStatFlag);
837
838   HRESULT Clone(
839     [out] IStream **ppstm);
840 }
841
842 [
843   object,
844   uuid(0000000d-0000-0000-C000-000000000046),
845   pointer_default(unique)
846 ]
847 interface IEnumSTATSTG : IUnknown
848 {
849   typedef [unique] IEnumSTATSTG *LPENUMSTATSTG;
850
851   [local]
852   HRESULT Next(
853     [in] ULONG celt,
854     [out, size_is(celt), length_is(*pceltFetched)]
855     STATSTG *rgelt,
856     [out] ULONG *pceltFetched);
857
858   [call_as(Next)]
859   HRESULT RemoteNext(
860     [in] ULONG celt,
861     [out, size_is(celt), length_is(*pceltFetched)]
862     STATSTG *rgelt,
863     [out] ULONG *pceltFetched);
864
865   HRESULT Skip(
866     [in] ULONG celt);
867
868   HRESULT Reset();
869
870   HRESULT Clone(
871     [out] IEnumSTATSTG **ppenum);
872 }
873
874 [
875   object,
876   uuid(0000000b-0000-0000-C000-000000000046),
877   pointer_default(unique)
878 ]
879 interface IStorage : IUnknown
880 {
881   typedef [unique] IStorage *LPSTORAGE;
882
883   typedef struct tagRemSNB {
884     unsigned long ulCntStr;
885     unsigned long ulCntChar;
886     [size_is(ulCntChar)] OLECHAR rgString[];
887   } RemSNB;
888
889   typedef [unique] RemSNB *wireSNB;
890   typedef [wire_marshal(wireSNB)] OLECHAR **SNB;
891
892   HRESULT CreateStream(
893     [in] LPCOLESTR pwcsName,
894     [in] DWORD grfMode,
895     [in] DWORD reserved1,
896     [in] DWORD reserved2,
897     [out] IStream **ppstm);
898
899   [local]
900   HRESULT OpenStream(
901     [in] LPCOLESTR pwcsName,
902     [in, unique] void *reserved1,
903     [in] DWORD grfMode,
904     [in] DWORD reserved2,
905     [out] IStream **ppstm);
906
907   [call_as(OpenStream)]
908   HRESULT RemoteOpenStream(
909     [in] LPCOLESTR pwcsName,
910     [in] unsigned long cbReserved1,
911     [in, unique, size_is(cbReserved1)] byte *reserved1,
912     [in] DWORD grfMode,
913     [in] DWORD reserved2,
914     [out] IStream **ppstm);
915
916   HRESULT CreateStorage(
917     [in] LPCOLESTR pwcsName,
918     [in] DWORD grfMode,
919     [in] DWORD dwStgFmt,
920     [in] DWORD reserved2,
921     [out] IStorage **ppstg);
922
923   HRESULT OpenStorage(
924     [in, unique] LPCOLESTR pwcsName,
925     [in, unique] IStorage *pstgPriority,
926     [in] DWORD grfMode,
927     [in, unique] SNB snbExclude,
928     [in] DWORD reserved,
929     [out] IStorage **ppstg);
930
931   HRESULT CopyTo(
932     [in] DWORD ciidExclude,
933     [in, unique, size_is(ciidExclude)] const IID *rgiidExclude,
934     [in, unique] SNB snbExclude,
935     [in, unique] IStorage *pstgDest);
936
937   HRESULT MoveElementTo(
938     [in] LPCOLESTR pwcsName,
939     [in, unique] IStorage *pstgDest,
940     [in] LPCOLESTR pwcsNewName,
941     [in] DWORD grfFlags);
942
943   HRESULT Commit(
944     [in] DWORD grfCommitFlags);
945
946   HRESULT Revert();
947
948   [local]
949   HRESULT EnumElements(
950     [in] DWORD reserved1,
951     [in, unique, size_is(1)] void *reserved2,
952     [in] DWORD reserved3,
953     [out] IEnumSTATSTG **ppenum);
954
955   [call_as(EnumElements)]
956   HRESULT RemoteEnumElements(
957     [in] DWORD reserved1,
958     [in] unsigned long cbReserved2,
959     [in, unique, size_is(cbReserved2)] byte *reserved2,
960     [in] DWORD reserved3,
961     [out] IEnumSTATSTG **ppenum);
962
963   HRESULT DestroyElement(
964     [in] LPCOLESTR pwcsName);
965
966   HRESULT RenameElement(
967     [in] LPCOLESTR pwcsOldName,
968     [in] LPCOLESTR pwcsNewName);
969
970   HRESULT SetElementTimes(
971     [in, unique] LPCOLESTR pwcsName,
972     [in, unique] const FILETIME *pctime,
973     [in, unique] const FILETIME *patime,
974     [in, unique] const FILETIME *pmtime);
975
976   HRESULT SetClass(
977     [in] REFCLSID clsid);
978
979   HRESULT SetStateBits(
980     [in] DWORD grfStateBits,
981     [in] DWORD grfMask);
982
983   HRESULT Stat(
984     [out] STATSTG *pstatstg,
985     [in] DWORD grfStatFlag);
986 }
987
988 [
989   object,
990   uuid(0000010b-0000-0000-C000-000000000046),
991   pointer_default(unique)
992 ]
993 interface IPersistFile : IPersist
994 {
995   typedef [unique] IPersistFile *LPPERSISTFILE;
996
997   HRESULT IsDirty();
998
999   HRESULT Load(
1000     [in] LPCOLESTR pszFileName,
1001     [in] DWORD dwMode);
1002
1003   HRESULT Save(
1004     [in, unique] LPCOLESTR pszFileName,
1005     [in] BOOL fRemember);
1006
1007   HRESULT SaveCompleted(
1008     [in, unique] LPCOLESTR pszFileName);
1009
1010   HRESULT GetCurFile(
1011     [out] LPOLESTR *ppszFileName);
1012 }
1013
1014 [
1015   object,
1016   uuid(0000010a-0000-0000-C000-000000000046),
1017   pointer_default(unique)
1018 ]
1019 interface IPersistStorage : IPersist
1020 {
1021   typedef [unique] IPersistStorage *LPPERSISTSTORAGE;
1022
1023   HRESULT IsDirty();
1024
1025   HRESULT InitNew(
1026     [in, unique] IStorage *pStg);
1027
1028   HRESULT Load(
1029     [in, unique] IStorage *pStg);
1030
1031   HRESULT Save(
1032     [in, unique] IStorage *pStgSave,
1033     [in] BOOL fSameAsLoad);
1034
1035   HRESULT SaveCompleted(
1036     [in, unique] IStorage *pStgNew);
1037
1038   HRESULT HandsOffStorage();
1039 }
1040
1041 [
1042   object,
1043   uuid(00000012-0000-0000-C000-000000000046),
1044   pointer_default(unique)
1045 ]
1046 interface IRootStorage : IUnknown
1047 {
1048   typedef [unique] IRootStorage *LPROOTSTORAGE;
1049
1050   HRESULT SwitchToFile(
1051     [in] LPOLESTR pszFile);
1052 }
1053
1054 [
1055   object,
1056   uuid(0000000a-0000-0000-C000-000000000046),
1057   pointer_default(unique)
1058 ]
1059 interface ILockBytes : IUnknown
1060 {
1061   typedef [unique] ILockBytes *LPLOCKBYTES;
1062
1063   [local]
1064   HRESULT ReadAt(
1065     [in] ULARGE_INTEGER ulOffset,
1066     [out, size_is(cb), length_is(*pcbRead)]
1067     void *pv,
1068     [in] ULONG cb,
1069     [out] ULONG *pcbRead);
1070
1071   [call_as(ReadAt)]
1072   HRESULT RemoteReadAt(
1073     [in] ULARGE_INTEGER ulOffset,
1074     [out, size_is(cb), length_is(*pcbRead)]
1075     byte *pv,
1076     [in] ULONG cb,
1077     [out] ULONG *pcbRead);
1078
1079   [local]
1080   HRESULT WriteAt(
1081     [in] ULARGE_INTEGER ulOffset,
1082     [in, size_is(cb)] const void *pv,
1083     [in] ULONG cb,
1084     [out] ULONG *pcbWritten);
1085
1086   [call_as(WriteAt)]
1087   HRESULT RemoteWriteAt(
1088     [in] ULARGE_INTEGER ulOffset,
1089     [in, size_is(cb)] const byte *pv,
1090     [in] ULONG cb,
1091     [out] ULONG *pcbWritten);
1092
1093   HRESULT Flush();
1094
1095   HRESULT SetSize(
1096     [in] ULARGE_INTEGER cb);
1097
1098   HRESULT LockRegion(
1099     [in] ULARGE_INTEGER libOffset,
1100     [in] ULARGE_INTEGER cb,
1101     [in] DWORD dwLockType);
1102
1103   HRESULT UnlockRegion(
1104     [in] ULARGE_INTEGER libOffset,
1105     [in] ULARGE_INTEGER cb,
1106     [in] DWORD dwLockType);
1107
1108   HRESULT Stat(
1109     [out] STATSTG *pstatstg,
1110     [in] DWORD grfStatFlag);
1111 }
1112
1113 [
1114   object,
1115   uuid(99caf010-415e-11cf-8814-00aa00b569f5),
1116   pointer_default(unique)
1117 ]
1118 interface IFillLockBytes : IUnknown
1119 {
1120   [local]
1121   HRESULT FillAppend(
1122     [in, size_is(cb)] const void *pv,
1123     [in] ULONG cb,
1124     [out] ULONG *pcbWritten);
1125
1126   [call_as(FillAppend)]
1127   HRESULT RemoteFillAppend(
1128     [in, size_is(cb)] const byte *pv,
1129     [in] ULONG cb,
1130     [out] ULONG *pcbWritten);
1131
1132   [local]
1133   HRESULT FillAt(
1134     [in] ULARGE_INTEGER ulOffset,
1135     [in, size_is(cb)] const void *pv,
1136     [in] ULONG cb,
1137     [out] ULONG *pcbWritten);
1138
1139   [call_as(FillAt)]
1140   HRESULT RemoteFillAt(
1141     [in] ULARGE_INTEGER ulOffset,
1142     [in, size_is(cb)] const byte *pv,
1143     [in] ULONG cb,
1144     [out] ULONG *pcbWritten);
1145
1146   HRESULT SetFillSize(
1147     [in] ULARGE_INTEGER ulSize);
1148
1149   HRESULT Terminate(
1150     [in] BOOL bCanceled);
1151 }
1152
1153 [
1154   object,
1155   uuid(a9d758a0-4617-11cf-95fc-00aa00680db4),
1156   pointer_default(unique)
1157 ]
1158 interface IProgressNotify : IUnknown
1159 {
1160   HRESULT OnProgress(
1161     [in] DWORD dwProgressCurrent,
1162     [in] DWORD dwProgressMaximum,
1163     [in] BOOL fAccurate,
1164     [in] BOOL fOwner);
1165 }
1166
1167 [
1168   local,
1169   object,
1170   uuid(0e6d4d90-6738-11cf-9608-00aa00680db4),
1171   pointer_default(unique)
1172 ]
1173 interface ILayoutStorage : IUnknown
1174 {
1175   typedef struct tagStorageLayout {
1176     DWORD LayoutType;
1177     OLECHAR *pwcsElementName;
1178     LARGE_INTEGER cOffset;
1179     LARGE_INTEGER cBytes;
1180   } StorageLayout;
1181
1182   HRESULT LayoutScript(
1183     [in] StorageLayout *pStorageLayout,
1184     [in] DWORD nEntries,
1185     [in] DWORD glfInterleavedFlag);
1186
1187   HRESULT BeginMonitor();
1188
1189   HRESULT EndMonitor();
1190
1191   HRESULT ReLayoutDocfile(
1192     [in] OLECHAR *pwcsNewDfName);
1193
1194   HRESULT ReLayoutDocfileOnILockBytes(
1195     [in] ILockBytes *pILockBytes);
1196 }
1197
1198 [
1199     object,
1200     uuid(30f3d47a-6447-11d1-8e3c-00c04fb9386d)
1201 ]
1202 interface IBlockingLock : IUnknown
1203 {
1204     HRESULT Lock(
1205         [in] DWORD dwTimeout);
1206
1207     HRESULT Unlock();
1208 }
1209
1210
1211 [
1212     object,
1213     uuid(bc0bf6ae-8878-11d1-83e9-00c04fc2c6d4)
1214 ]
1215 interface ITimeAndNoticeControl : IUnknown
1216 {
1217     HRESULT SuppressChanges(
1218         [in] DWORD res1,
1219         [in] DWORD res2);
1220
1221 }
1222
1223
1224
1225 [
1226     object,
1227     uuid(8d19c834-8879-11d1-83e9-00c04fc2c6d4)
1228 ]
1229 interface IOplockStorage: IUnknown
1230 {
1231     HRESULT CreateStorageEx(
1232         [in] LPCWSTR pwcsName,
1233         [in] DWORD grfMode,
1234         [in] DWORD stgfmt,
1235         [in] DWORD grfAttrs,
1236         [in] REFIID riid,
1237         [out, iid_is(riid)] void **ppstgOpen);
1238
1239     HRESULT OpenStorageEx(
1240         [in] LPCWSTR pwcsName,
1241         [in] DWORD grfMode,
1242         [in] DWORD stgfmt,
1243         [in] DWORD grfAttrs,
1244         [in] REFIID riid,
1245         [out, iid_is(riid)] void **ppstgOpen);
1246 }
1247
1248 /******************** Data Object ********************/
1249
1250 [
1251   object,
1252   uuid(00000103-0000-0000-C000-000000000046),
1253   pointer_default(unique)
1254 ]
1255 interface IEnumFORMATETC : IUnknown
1256 {
1257   typedef [unique] IEnumFORMATETC *LPENUMFORMATETC;
1258
1259   typedef struct tagDVTARGETDEVICE {
1260     DWORD tdSize;
1261     WORD tdDriverNameOffset;
1262     WORD tdDeviceNameOffset;
1263     WORD tdPortNameOffset;
1264     WORD tdExtDevmodeOffset;
1265     [size_is(tdSize - sizeof(DWORD) - 4*sizeof(WORD))]
1266     BYTE tdData[];
1267   } DVTARGETDEVICE;
1268
1269   typedef CLIPFORMAT *LPCLIPFORMAT;
1270
1271   typedef struct tagFORMATETC {
1272     CLIPFORMAT cfFormat;
1273     [unique] DVTARGETDEVICE *ptd;
1274     DWORD dwAspect;
1275     LONG lindex;
1276     DWORD tymed;
1277   } FORMATETC, *LPFORMATETC;
1278
1279   [local]
1280   HRESULT Next(
1281     [in] ULONG celt,
1282     [out, size_is(celt), length_is(*pceltFetched)]
1283     FORMATETC *rgelt,
1284     [out] ULONG *pceltFetched);
1285
1286   [call_as(Next)]
1287   HRESULT RemoteNext(
1288     [in] ULONG celt,
1289     [out, size_is(celt), length_is(*pceltFetched)]
1290     FORMATETC *rgelt,
1291     [out] ULONG *pceltFetched);
1292
1293   HRESULT Skip(
1294     [in] ULONG celt);
1295
1296   HRESULT Reset();
1297
1298   HRESULT Clone(
1299     [out] IEnumFORMATETC **ppenum);
1300 }
1301
1302 [
1303   object,
1304   uuid(00000105-0000-0000-C000-000000000046),
1305   pointer_default(unique)
1306 ]
1307 interface IEnumSTATDATA : IUnknown
1308 {
1309   typedef [unique] IEnumSTATDATA *LPENUMSTATDATA;
1310
1311   typedef enum tagADVF {
1312     ADVF_NODATA            = 1,
1313     ADVF_PRIMEFIRST        = 2,
1314     ADVF_ONLYONCE          = 4,
1315     ADVF_DATAONSTOP        = 64,
1316     ADVFCACHE_NOHANDLER    = 8,
1317     ADVFCACHE_FORCEBUILTIN = 16,
1318     ADVFCACHE_ONSAVE       = 32
1319   } ADVF;
1320
1321   typedef struct tagSTATDATA
1322   {
1323     FORMATETC formatetc;
1324     DWORD advf;
1325     [unique] IAdviseSink *pAdvSink;
1326     DWORD dwConnection;
1327   } STATDATA, *LPSTATDATA;
1328
1329   [local]
1330   HRESULT Next(
1331     [in] ULONG celt,
1332     [out, size_is(celt), length_is(*pceltFetched)]
1333     STATDATA *rgelt,
1334     [out] ULONG *pceltFetched);
1335
1336   [call_as(Next)]
1337   HRESULT RemoteNext(
1338     [in] ULONG celt,
1339     [out, size_is(celt), length_is(*pceltFetched)]
1340     STATDATA *rgelt,
1341     [out] ULONG *pceltFetched);
1342
1343   HRESULT Skip(
1344     [in] ULONG celt);
1345
1346   HRESULT Reset();
1347
1348   HRESULT Clone(
1349     [out] IEnumSTATDATA **ppenum);
1350 }
1351
1352 [
1353   object,
1354   uuid(0000010f-0000-0000-C000-000000000046),
1355   pointer_default(unique)
1356 ]
1357 interface IAdviseSink : IUnknown
1358 {
1359   typedef IAdviseSink *LPADVISESINK;
1360
1361   typedef [v1_enum] enum tagTYMED {
1362     TYMED_HGLOBAL  = 1,
1363     TYMED_FILE     = 2,
1364     TYMED_ISTREAM  = 4,
1365     TYMED_ISTORAGE = 8,
1366     TYMED_GDI      = 16,
1367     TYMED_MFPICT   = 32,
1368     TYMED_ENHMF    = 64,
1369     TYMED_NULL     = 0
1370   } TYMED;
1371
1372   typedef struct tagRemSTGMEDIUM {
1373     DWORD tymed;
1374     DWORD dwHandleType;
1375     unsigned long pData;
1376     unsigned long pUnkForRelease;
1377     unsigned long cbData;
1378     [size_is(cbData)] byte data[];
1379   } RemSTGMEDIUM;
1380
1381   /* FIXME: C/C++ nameless union version */
1382   typedef struct tagSTGMEDIUM {
1383     DWORD tymed;
1384     [switch_is(tymed)] union {
1385     [case(TYMED_GDI)]      HBITMAP hBitmap;
1386     [case(TYMED_MFPICT)]   HMETAFILEPICT hMetaFilePict;
1387     [case(TYMED_ENHMF)]    HENHMETAFILE hEnhMetaFile;
1388     [case(TYMED_HGLOBAL)]  HGLOBAL hGlobal;
1389     [case(TYMED_FILE)]     LPOLESTR lpszFileName;
1390     [case(TYMED_ISTREAM)]  IStream *pstm;
1391     [case(TYMED_ISTORAGE)] IStorage *pstg;
1392     [default]              ;
1393     };
1394     [unique] IUnknown *pUnkForRelease;
1395   } uSTGMEDIUM;
1396
1397 /* copied from wingdi.h */
1398 #define OBJ_PEN             1
1399 #define OBJ_BRUSH           2
1400 #define OBJ_DC              3
1401 #define OBJ_METADC          4
1402 #define OBJ_PAL             5
1403 #define OBJ_FONT            6
1404 #define OBJ_BITMAP          7
1405 #define OBJ_REGION          8
1406 #define OBJ_METAFILE        9
1407 #define OBJ_MEMDC           10
1408 #define OBJ_EXTPEN          11
1409 #define OBJ_ENHMETADC       12
1410 #define OBJ_ENHMETAFILE     13
1411
1412   typedef union _GDI_OBJECT switch(DWORD ObjectType) u {
1413     case OBJ_BITMAP: wireHBITMAP hBitmap;
1414     case OBJ_PAL:    wireHPALETTE hPalette;
1415     default:         wireHGLOBAL hGeneric;
1416   } GDI_OBJECT;
1417
1418   typedef struct _userSTGMEDIUM {
1419     union switch(DWORD tymed) u {
1420     case TYMED_NULL:     ;
1421     case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
1422     case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
1423     case TYMED_GDI:      GDI_OBJECT *hGdiHandle;
1424     case TYMED_HGLOBAL:  wireHGLOBAL hGlobal;
1425     case TYMED_FILE:     LPOLESTR lpszFileName;
1426     case TYMED_ISTREAM:  BYTE_BLOB *pstm;
1427     case TYMED_ISTORAGE: BYTE_BLOB *pstg;
1428     };
1429     IUnknown *pUnkForRelease;
1430   } userSTGMEDIUM;
1431
1432   typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
1433   typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
1434
1435   typedef [unique] userSTGMEDIUM *wireASYNC_STGMEDIUM;
1436   typedef [wire_marshal(wireASYNC_STGMEDIUM)] STGMEDIUM ASYNC_STGMEDIUM;
1437
1438   typedef STGMEDIUM *LPSTGMEDIUM;
1439
1440   typedef struct _userFLAG_STGMEDIUM {
1441     long ContextFlags;
1442     long fPassOwnership;
1443     userSTGMEDIUM Stgmed;
1444   } userFLAG_STGMEDIUM;
1445
1446   typedef [unique] userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
1447
1448   typedef [wire_marshal(wireFLAG_STGMEDIUM)] struct _FLAG_STGMEDIUM {
1449     long ContextFlags;
1450     long fPassOwnership;
1451     STGMEDIUM Stgmed;
1452   } FLAG_STGMEDIUM;
1453
1454   [local]
1455   void OnDataChange(
1456     [in, unique] FORMATETC *pFormatetc,
1457     [in, unique] STGMEDIUM *pStgmed);
1458
1459   [call_as(OnDataChange)]
1460   HRESULT  RemoteOnDataChange(
1461     [in, unique] FORMATETC *pFormatetc,
1462     [in, unique] ASYNC_STGMEDIUM *pStgmed);
1463
1464   [local]
1465   void OnViewChange(
1466     [in] DWORD dwAspect,
1467     [in] LONG lindex);
1468
1469   [call_as(OnViewChange)]
1470   HRESULT RemoteOnViewChange(
1471     [in] DWORD dwAspect,
1472     [in] LONG lindex);
1473
1474   [local]
1475   void OnRename(
1476     [in] IMoniker *pmk);
1477
1478   [call_as(OnRename)]
1479   HRESULT RemoteOnRename(
1480     [in] IMoniker *pmk);
1481
1482   [local]
1483   void OnSave();
1484
1485   [call_as(OnSave)]
1486   HRESULT RemoteOnSave();
1487
1488   [local]
1489   void OnClose();
1490
1491   [call_as(OnClose)]
1492   HRESULT RemoteOnClose();
1493 }
1494
1495 [
1496   object,
1497   uuid(00000125-0000-0000-C000-000000000046),
1498   pointer_default(unique)
1499 ]
1500 interface IAdviseSink2 : IAdviseSink
1501 {
1502   typedef [unique] IAdviseSink2 *LPADVISESINK2;
1503
1504   [local]
1505   void OnLinkSrcChange(
1506     [in, unique] IMoniker *pmk);
1507
1508   [call_as(OnLinkSrcChange)]
1509   HRESULT RemoteOnLinkSrcChange(
1510     [in, unique] IMoniker *pmk);
1511 }
1512
1513 [
1514   object,
1515   uuid(0000010e-0000-0000-C000-000000000046),
1516   pointer_default(unique)
1517 ]
1518 interface IDataObject : IUnknown
1519 {
1520   typedef [unique] IDataObject *LPDATAOBJECT;
1521
1522   typedef enum tagDATADIR {
1523     DATADIR_GET = 1,
1524     DATADIR_SET = 2
1525   } DATADIR;
1526
1527   [local]
1528   HRESULT GetData(
1529     [in, unique] FORMATETC *pformatetcIn,
1530     [out] STGMEDIUM *pmedium);
1531
1532   [call_as(GetData)]
1533   HRESULT RemoteGetData(
1534     [in, unique] FORMATETC *pformatetcIn,
1535     [out] STGMEDIUM *pRemoteMedium);
1536
1537   [local]
1538   HRESULT GetDataHere(
1539     [in, unique] FORMATETC *pformatetc,
1540     [in, out] STGMEDIUM *pmedium);
1541
1542   [call_as(GetDataHere)]
1543   HRESULT RemoteGetDataHere(
1544     [in, unique] FORMATETC *pformatetc,
1545     [in, out] STGMEDIUM *pRemoteMedium);
1546
1547   HRESULT QueryGetData(
1548     [in, unique] FORMATETC *pformatetc);
1549
1550   HRESULT GetCanonicalFormatEtc(
1551     [in, unique] FORMATETC *pformatectIn,
1552     [out] FORMATETC *pformatetcOut);
1553
1554   [local]
1555   HRESULT SetData(
1556     [in, unique] FORMATETC *pformatetc,
1557     [in, unique] STGMEDIUM *pmedium,
1558     [in] BOOL fRelease);
1559
1560   [call_as(SetData)]
1561   HRESULT RemoteSetData(
1562     [in, unique] FORMATETC *pformatetc,
1563     [in, unique] FLAG_STGMEDIUM *pmedium,
1564     [in] BOOL fRelease);
1565
1566   HRESULT EnumFormatEtc(
1567     [in] DWORD dwDirection,
1568     [out] IEnumFORMATETC **ppenumFormatEtc);
1569
1570   HRESULT DAdvise(
1571     [in] FORMATETC *pformatetc,
1572     [in] DWORD advf,
1573     [in, unique] IAdviseSink *pAdvSink,
1574     [out] DWORD *pdwConnection);
1575
1576   HRESULT DUnadvise(
1577     [in] DWORD dwConnection);
1578
1579   HRESULT EnumDAdvise(
1580     [out] IEnumSTATDATA **ppenumAdvise);
1581 }
1582
1583 [
1584   local,
1585   object,
1586   uuid(00000110-0000-0000-C000-000000000046)
1587 ]
1588 interface IDataAdviseHolder : IUnknown
1589 {
1590   typedef [unique] IDataAdviseHolder *LPDATAADVISEHOLDER;
1591
1592   HRESULT Advise(
1593     [in, unique] IDataObject *pDataObject,
1594     [in, unique] FORMATETC *pFetc,
1595     [in] DWORD advf,
1596     [in, unique] IAdviseSink *pAdvise,
1597     [out] DWORD *pdwConnection);
1598
1599   HRESULT Unadvise(
1600     [in] DWORD dwConnection);
1601
1602   HRESULT EnumAdvise(
1603     [out] IEnumSTATDATA **ppenumAdvise);
1604
1605   HRESULT SendOnDataChange(
1606     [in, unique] IDataObject *pDataObject,
1607     [in] DWORD dwReserved,
1608     [in] DWORD advf);
1609 }
1610
1611 /******************** Remoting ********************/
1612
1613 [
1614   local,
1615   object,
1616   uuid(00000016-0000-0000-C000-000000000046)
1617 ]
1618 interface IMessageFilter : IUnknown
1619 {
1620   typedef [unique] IMessageFilter *LPMESSAGEFILTER;
1621
1622   typedef enum tagCALLTYPE {
1623     CALLTYPE_TOPLEVEL = 1,
1624     CALLTYPE_NESTED   = 2,
1625     CALLTYPE_ASYNC    = 3,
1626     CALLTYPE_TOPLEVEL_CALLPENDING = 4,
1627     CALLTYPE_ASYNC_CALLPENDING    = 5
1628   } CALLTYPE;
1629
1630   typedef enum tagSERVERCALL {
1631     SERVERCALL_ISHANDLED  = 0,
1632     SERVERCALL_REJECTED   = 1,
1633     SERVERCALL_RETRYLATER = 2
1634   } SERVERCALL;
1635
1636   typedef enum tagPENDINGTYPE {
1637     PENDINGTYPE_TOPLEVEL = 1,
1638     PENDINGTYPE_NESTED   = 2
1639   } PENDINGTYPE;
1640
1641   typedef enum tagPENDINGMSG {
1642     PENDINGMSG_CANCELCALL     = 0,
1643     PENDINGMSG_WAITNOPROCESS  = 1,
1644     PENDINGMSG_WAITDEFPROCESS = 2
1645   } PENDINGMSG;
1646
1647   typedef struct tagINTERFACEINFO {
1648     IUnknown *pUnk;
1649     IID iid;
1650     WORD wMethod;
1651   } INTERFACEINFO, *LPINTERFACEINFO;
1652
1653   DWORD HandleInComingCall(
1654     [in] DWORD dwCallType,
1655     [in] HTASK htaskCaller,
1656     [in] DWORD dwTickCount,
1657     [in] LPINTERFACEINFO lpInterfaceInfo);
1658
1659   DWORD RetryRejectedCall(
1660     [in] HTASK htaskCallee,
1661     [in] DWORD dwTickCount,
1662     [in] DWORD dwRejectType);
1663
1664   DWORD MessagePending(
1665     [in] HTASK htaskCallee,
1666     [in] DWORD dwTickCount,
1667     [in] DWORD dwPendingType);
1668 }
1669
1670 [
1671   local,
1672   object,
1673   uuid(D5F56B60-593B-101A-B569-08002B2DBF7A)
1674 ]
1675 interface IRpcChannelBuffer : IUnknown
1676 {
1677   typedef [unique] IRpcChannelBuffer *LPRPCCHANNELBUFFER;
1678
1679   typedef unsigned long RPCOLEDATAREP;
1680
1681   typedef struct tagRPCOLEMESSAGE {
1682     void *reserved1;
1683     RPCOLEDATAREP dataRepresentation;
1684     void *Buffer;
1685     ULONG cbBuffer;
1686     ULONG iMethod;
1687     void *reserved2[5];
1688     ULONG rpcFlags;
1689   } RPCOLEMESSAGE;
1690
1691   typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
1692
1693   HRESULT GetBuffer(
1694     [in] RPCOLEMESSAGE *pMessage,
1695     [in] REFIID riid);
1696
1697   HRESULT SendReceive(
1698     [in,out] RPCOLEMESSAGE *pMessage,
1699     [out] ULONG *pStatus);
1700
1701   HRESULT FreeBuffer(
1702     [in] RPCOLEMESSAGE *pMessage);
1703
1704   HRESULT GetDestCtx(
1705     [out] DWORD *pdwDestContext,
1706     [out] void **ppvDestContext);
1707
1708   HRESULT IsConnected();
1709 }
1710
1711 [
1712   local,
1713   object,
1714   uuid(594f31d0-7f19-11d0-b194-00a0c90dc8bf)
1715 ]
1716 interface IRpcChannelBuffer2 : IRpcChannelBuffer
1717 {
1718   typedef [unique] IRpcChannelBuffer2 *LPRPCCHANNELBUFFER2;
1719
1720   HRESULT GetProtocolVersion(
1721     [in,out] DWORD *pdwVersion);
1722 }
1723
1724 [
1725   local,
1726   object,
1727   uuid(25B15600-0115-11d0-BF0D-00AA00B8DFD2)
1728 ]
1729 interface IRpcChannelBuffer3 : IRpcChannelBuffer2
1730 {
1731   typedef [unique] IRpcChannelBuffer3 *LPRPCCHANNELBUFFER3;
1732
1733   HRESULT Send(
1734     [in,out] RPCOLEMESSAGE *pMsg,
1735     [out] ULONG *pulStatus);
1736
1737   HRESULT Receive(
1738     [in,out] RPCOLEMESSAGE *pMsg,
1739     [in] ULONG ulSize,
1740     [out] ULONG *pulStatus);
1741
1742   HRESULT Cancel(
1743     [in] RPCOLEMESSAGE *pMsg);
1744
1745   HRESULT GetCallContext(
1746     [in] RPCOLEMESSAGE *pMsg,
1747     [in] REFIID riid,
1748     [out] void **pInterface);
1749
1750   HRESULT GetDestCtxEx(
1751     [in] RPCOLEMESSAGE *pMsg,
1752     [out] DWORD *pdwDestContext,
1753     [out] void **ppvDestContext);
1754
1755   HRESULT GetState(
1756     [in] RPCOLEMESSAGE *pMsg,
1757     [out] DWORD *pState);
1758
1759   HRESULT RegisterAsync(
1760     [in] RPCOLEMESSAGE *pMsg,
1761     [in] IAsyncManager *pAsyncMgr);
1762 }
1763
1764 [
1765     local,
1766     object,
1767     uuid(a5029fb6-3c34-11d1-9c99-00c04fb998aa),
1768     pointer_default(unique)
1769 ]
1770 interface IAsyncRpcChannelBuffer : IRpcChannelBuffer2
1771 {
1772     HRESULT Send(
1773         [in, out] RPCOLEMESSAGE *pMsg,
1774         [in] ISynchronize *pSync,
1775         [out] ULONG *pulStatus);
1776
1777     HRESULT Receive(
1778         [in, out] RPCOLEMESSAGE *pMsg,
1779         [out] ULONG *pulStatus);
1780
1781     HRESULT GetDestCtxEx(
1782         [in] RPCOLEMESSAGE *pMsg,
1783         [out] DWORD *pdwDestContext,
1784         [out] void **ppvDestContext);
1785 }
1786
1787 [
1788     local,
1789     object,
1790     uuid(58a08519-24c8-4935-b482-3fd823333a4f)
1791 ]
1792 interface IRpcSyntaxNegotiate : IUnknown
1793 {
1794     HRESULT NegotiateSyntax(
1795         [in, out] RPCOLEMESSAGE *pMsg);
1796 }
1797
1798 [
1799   local,
1800   object,
1801   uuid(D5F56A34-593B-101A-B569-08002B2DBF7A)
1802 ]
1803 interface IRpcProxyBuffer : IUnknown
1804 {
1805   typedef [unique] IRpcProxyBuffer *LPRPCPROXYBUFFER;
1806
1807   HRESULT Connect(
1808     [in, unique] IRpcChannelBuffer *pRpcChannelBuffer);
1809
1810   void Disconnect();
1811 }
1812
1813 [
1814   local,
1815   object,
1816   uuid(D5F56AFC-593B-101A-B569-08002B2DBF7A)
1817 ]
1818 interface IRpcStubBuffer : IUnknown
1819 {
1820   typedef [unique] IRpcStubBuffer *LPRPCSTUBBUFFER;
1821
1822   HRESULT Connect(
1823     [in] IUnknown *pUnkServer);
1824
1825   void Disconnect();
1826
1827   HRESULT Invoke(
1828     [in] RPCOLEMESSAGE *_prpcmsg,
1829     [in] IRpcChannelBuffer *_pRpcChannelBuffer);
1830
1831   IRpcStubBuffer *IsIIDSupported(
1832     [in] REFIID riid);
1833
1834   ULONG CountRefs();
1835
1836   HRESULT DebugServerQueryInterface(
1837     void **ppv);
1838
1839   void DebugServerRelease(
1840     void *pv);
1841 }
1842
1843 [
1844   local,
1845   object,
1846   uuid(D5F569D0-593B-101A-B569-08002B2DBF7A)
1847 ]
1848 interface IPSFactoryBuffer : IUnknown
1849 {
1850   typedef [unique] IPSFactoryBuffer *LPPSFACTORYBUFFER;
1851
1852   HRESULT CreateProxy(
1853     [in] IUnknown *pUnkOuter,
1854     [in] REFIID riid,
1855     [out] IRpcProxyBuffer **ppProxy,
1856     [out] void **ppv);
1857
1858   HRESULT CreateStub(
1859     [in] REFIID riid,
1860     [in, unique] IUnknown *pUnkServer,
1861     [out] IRpcStubBuffer **ppStub);
1862 }
1863
1864 [
1865   local,
1866   object,
1867   uuid(1008c4a0-7613-11cf-9af1-0020af6e72f4)
1868 ]
1869 interface IChannelHook : IUnknown
1870 {
1871   typedef [unique] IChannelHook *LPCHANNELHOOK;
1872
1873   typedef struct SChannelHookCallInfo {
1874     IID iid;
1875     DWORD cbSize;
1876     GUID uCausality;
1877     DWORD dwServerPid;
1878     DWORD iMethod;
1879     void *pObject;
1880   } SChannelHookCallInfo;
1881
1882   void ClientGetSize(
1883     [in] REFGUID uExtent,
1884     [in] REFIID riid,
1885     [out] ULONG *pDataSize);
1886
1887   void ClientFillBuffer(
1888     [in] REFGUID uExtent,
1889     [in] REFIID riid,
1890     [in, out] ULONG *pDataSize,
1891     [in] void *pDataBuffer);
1892
1893   void ClientNotify(
1894     [in] REFGUID uExtent,
1895     [in] REFIID riid,
1896     [in] ULONG cbDataSize,
1897     [in] void *pDataBuffer,
1898     [in] DWORD lDataRep,
1899     [in] HRESULT hrFault);
1900
1901   void ServerNotify(
1902     [in] REFGUID uExtent,
1903     [in] REFIID riid,
1904     [in] ULONG cbDataSize,
1905     [in] void *pDataBuffer,
1906     [in] DWORD lDataRep);
1907
1908   void ServerGetSize(
1909     [in] REFGUID uExtent,
1910     [in] REFIID riid,
1911     [in] HRESULT hrFault,
1912     [out] ULONG *pDataSize);
1913
1914   void ServerFillBuffer(
1915     [in] REFGUID uExtent,
1916     [in] REFIID riid,
1917     [in, out] ULONG *pDataSize,
1918     [in] void *pDataBuffer,
1919     [in] HRESULT hrFault );
1920 }
1921
1922 extern const FMTID FMTID_SummaryInformation;
1923 extern const FMTID FMTID_DocSummaryInformation;
1924 extern const FMTID FMTID_UserDefinedProperties;
1925
1926
1927 /******************** Connection Points ********************/
1928 /* FIXME */
1929
1930 /******************** DCOM ********************/
1931
1932 [
1933   local,
1934   object,
1935   uuid(0000013D-0000-0000-C000-000000000046)
1936 ]
1937 interface IClientSecurity : IUnknown
1938 {
1939   typedef struct tagSOLE_AUTHENTICATION_SERVICE {
1940     DWORD dwAuthnSvc;
1941     DWORD dwAuthzSvc;
1942     OLECHAR *pPrincipalName;
1943     HRESULT hr;
1944   } SOLE_AUTHENTICATION_SERVICE;
1945
1946   typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
1947
1948   typedef struct tagSOLE_AUTHENTICATION_INFO {
1949     DWORD dwAuthnSvc;
1950     DWORD dwAuthzSvc;
1951     void *pAuthInfo;
1952   } SOLE_AUTHENTICATION_INFO;
1953
1954   typedef struct tagSOLE_AUTHENTICATION_LIST {
1955     DWORD cAuthInfo;
1956     SOLE_AUTHENTICATION_INFO *aAuthInfo;
1957   } SOLE_AUTHENTICATION_LIST;
1958
1959   typedef enum tagEOLE_AUTHENTICATION_CAPABILITIES {
1960     EOAC_NONE               = 0x0,
1961     EOAC_MUTUAL_AUTH        = 0x1,
1962     EOAC_SECURE_REFS        = 0x2, /* CoInitializeSecurity only */
1963     EOAC_ACCESS_CONTROL     = 0x4, /* CoInitializeSecurity only */
1964     EOAC_APPID              = 0x8, /* CoInitializeSecurity only */
1965     EOAC_DYNAMIC            = 0x10, /* CoInitializeSecurity only */
1966     EOAC_STATIC_CLOAKING    = 0x20,
1967     EOAC_DYNAMIC_CLOAKING   = 0x40,
1968     EOAC_ANY_AUTHORITY      = 0x80,
1969     EOAC_MAKE_FULLSIC       = 0x100,
1970     EOAC_REQUIRE_FULLSIC    = 0x200, /* CoInitializeSecurity only */
1971     EOAC_AUTO_IMPERSONATE   = 0x400, /* CoInitializeSecurity only */
1972     EOAC_DEFAULT            = 0x800,
1973     EOAC_DISABLE_AAA        = 0x1000, /* CoInitializeSecurity only */
1974     EOAC_NO_CUSTOM_MARSHAL  = 0x2000, /* CoInitializeSecurity only */
1975   } EOLE_AUTHENTICATION_CAPABILITIES;
1976
1977   HRESULT QueryBlanket(
1978     [in] IUnknown *pProxy,
1979     [out] DWORD *pAuthnSvc,
1980     [out] DWORD *pAuthzSvc,
1981     [out] OLECHAR **pServerPrincName,
1982     [out] DWORD *pAuthnLevel,
1983     [out] DWORD *pImpLevel,
1984     [out] void **pAuthInfo,
1985     [out] DWORD *pCapabilities);
1986
1987   HRESULT SetBlanket(
1988     [in] IUnknown *pProxy,
1989     [in] DWORD AuthnSvc,
1990     [in] DWORD AuthzSvc,
1991     [in] OLECHAR *pServerPrincName,
1992     [in] DWORD AuthnLevel,
1993     [in] DWORD ImpLevel,
1994     [in] void *pAuthInfo,
1995     [in] DWORD Capabilities);
1996
1997   HRESULT CopyProxy(
1998     [in] IUnknown *pProxy,
1999     [out] IUnknown **ppCopy);
2000 }
2001
2002 [
2003   local,
2004   object,
2005   uuid(0000013E-0000-0000-C000-000000000046)
2006 ]
2007 interface IServerSecurity : IUnknown
2008 {
2009   HRESULT QueryBlanket(
2010     [out] DWORD *pAuthnSvc,
2011     [out] DWORD *pAuthzSvc,
2012     [out] OLECHAR **pServerPrincName,
2013     [out] DWORD *pAuthnLevel,
2014     [out] DWORD *pImpLevel,
2015     [out] void **pPrivs,
2016     [out] DWORD *pCapabilities);
2017
2018   HRESULT ImpersonateClient();
2019
2020   HRESULT RevertToSelf();
2021
2022   BOOL IsImpersonating();
2023 }
2024
2025 [
2026   local,
2027   object,
2028   uuid(00000024-0000-0000-C000-000000000046)
2029 ]
2030 interface IAsyncSetup : IUnknown
2031 {
2032   HRESULT GetAsyncManager(
2033     [in] REFIID riid,
2034     [in] IUnknown *pOuter,
2035     [in] DWORD dwFlags,
2036     [out] IUnknown **ppInner,
2037     [out] IAsyncManager **ppAsyncMgr);
2038 }
2039
2040 [
2041     object,
2042     uuid(0e6d4d92-6738-11cf-9608-00aa00680db4)
2043 ]
2044 interface IDirectWriterLock : IUnknown
2045 {
2046     HRESULT WaitForWriteAccess(
2047         [in] DWORD dwTimeout);
2048
2049     HRESULT ReleaseWriteAccess();
2050
2051     HRESULT HaveWriteAccess();
2052 }
2053
2054 [
2055     object,
2056     uuid(00000030-0000-0000-C000-000000000046)
2057 ]
2058
2059 interface ISynchronize : IUnknown
2060 {
2061     HRESULT Wait(
2062         [in] DWORD dwFlags,
2063         [in] DWORD dwMilliseconds);
2064
2065     HRESULT Signal();
2066
2067     HRESULT Reset();
2068 }
2069
2070
2071 [
2072     local,
2073     object,
2074     uuid(00000031-0000-0000-C000-000000000046)
2075 ]
2076 interface ISynchronizeHandle : IUnknown
2077 {
2078     HRESULT GetHandle(
2079         [out] HANDLE *ph);
2080 }
2081
2082
2083 [
2084     local,
2085     object,
2086     uuid(00000032-0000-0000-C000-000000000046)
2087 ]
2088 interface ISynchronizeEvent : ISynchronizeHandle
2089 {
2090     HRESULT SetEventHandle(
2091         [in] HANDLE *ph);
2092 }
2093
2094
2095 [
2096     local,
2097     object,
2098     uuid(00000033-0000-0000-C000-000000000046)
2099 ]
2100 interface ISynchronizeContainer : IUnknown
2101 {
2102     HRESULT AddSynchronize(
2103         [in] ISynchronize *pSync);
2104
2105     HRESULT WaitMultiple(
2106         [in] DWORD dwFlags,
2107         [in] DWORD dwTimeOut,
2108         [out] ISynchronize **ppSync);
2109 }
2110
2111 [
2112     local,
2113     object,
2114     uuid(00000025-0000-0000-C000-000000000046)
2115 ]
2116 interface ISynchronizeMutex : ISynchronize
2117 {
2118     HRESULT ReleaseMutex();
2119 }
2120
2121 [
2122     local,
2123     object,
2124     uuid(00000029-0000-0000-C000-000000000046)
2125 ]
2126
2127 interface ICancelMethodCalls : IUnknown
2128 {
2129     typedef [unique] ICancelMethodCalls *LPCANCELMETHODCALLS;
2130
2131     HRESULT Cancel(
2132         [in] ULONG ulSeconds);
2133
2134     HRESULT TestCancel();
2135 }
2136
2137 [
2138   local,
2139   object,
2140   uuid(0000002A-0000-0000-C000-000000000046)
2141 ]
2142 interface IAsyncManager : IUnknown
2143 {
2144   typedef enum tagDCOM_CALL_STATE {
2145     DCOM_NONE          = 0,
2146     DCOM_CALL_COMPLETE = 1,
2147     DCOM_CALL_CANCELED = 2
2148   } DCOM_CALL_STATE;
2149
2150   HRESULT CompleteCall(
2151     [in] HRESULT Result);
2152
2153   HRESULT GetCallContext(
2154     [in] REFIID riid,
2155     [out] void **pInterface);
2156
2157   HRESULT GetState(
2158     [out] ULONG *pulStateFlags);
2159 }
2160
2161 [
2162     local,
2163     object,
2164     uuid(1c733a30-2a1c-11ce-ade5-00aa0044773d),
2165     pointer_default(unique)
2166 ]
2167 interface ICallFactory : IUnknown
2168 {
2169     HRESULT CreateCall(
2170         [in] REFIID riid,
2171         [in] IUnknown *pCtrlUnk,
2172         [in] REFIID riid2,
2173         [out, iid_is(riid2)] IUnknown **ppv);
2174 }
2175
2176 [
2177     local,
2178     object,
2179     uuid(00000144-0000-0000-C000-000000000046)
2180 ]
2181 interface IRpcOptions : IUnknown
2182 {
2183     HRESULT Set(
2184         [in] IUnknown *pPrx,
2185         [in] DWORD dwProperty,
2186         [in] ULONG_PTR dwValue);
2187
2188     HRESULT Query(
2189         [in] IUnknown *pPrx,
2190         [in] DWORD dwProperty,
2191         [out] ULONG_PTR *pdwValue);
2192 }
2193
2194 enum {
2195    COMBND_RPCTIMEOUT = 1,
2196    COMBND_SERVER_LOCALITY = 2
2197 };  
2198
2199 enum {
2200    SERVER_LOCALITY_PROCESS_LOCAL = 0,
2201    SERVER_LOCALITY_MACHINE_LOCAL = 1,
2202    SERVER_LOCALITY_REMOTE = 2
2203 };
2204
2205 [
2206     local,
2207     object,
2208     uuid(00000149-0000-0000-C000-000000000046),
2209     pointer_default(unique)
2210 ]
2211 interface IRpcHelper : IUnknown
2212 {
2213     HRESULT GetDCOMProtocolVersion(
2214         [out] DWORD *pComVersion);
2215
2216     HRESULT GetIIDFromOBJREF(
2217         [in] void *pObjRef,
2218         [out] IID **piid);
2219 }
2220
2221 [
2222     local,
2223     object,
2224     uuid(eb0cb9e8-7996-11d2-872e-0000f8080859)
2225 ]
2226 interface IReleaseMarshalBuffers : IUnknown
2227 {
2228     HRESULT ReleaseMarshalBuffer(
2229         [in] RPCOLEMESSAGE *pMsg,
2230         [in] DWORD dwFlags,
2231         [in, unique] IUnknown *pChnl);
2232 }
2233
2234 [
2235     local,
2236     object,
2237     uuid(0000002B-0000-0000-C000-000000000046)
2238 ]
2239 interface IWaitMultiple : IUnknown
2240 {
2241     HRESULT WaitMultiple(
2242         [in] DWORD timeout,
2243         [out] ISynchronize **pSync);
2244     HRESULT AddSynchronize(
2245         [in] ISynchronize *pSync);
2246 }
2247
2248
2249 [
2250     object,
2251     uuid(00000026-0000-0000-C000-000000000046)
2252 ]
2253 interface IUrlMon : IUnknown
2254 {
2255     HRESULT AsyncGetClassBits(
2256         [in] REFCLSID rclsid,
2257         [in, unique] LPCWSTR pszTYPE,
2258         [in, unique] LPCWSTR pszExt,
2259         [in] DWORD dwFileVersionMS,
2260         [in] DWORD dwFileVersionLS,
2261         [in, unique] LPCWSTR pszCodeBase,
2262         [in] IBindCtx *pbc,
2263         [in] DWORD dwClassContext,
2264         [in] REFIID riid,
2265         [in] DWORD flags);
2266 }
2267
2268 [
2269     local,
2270     object,
2271     uuid(00000145-0000-0000-C000-000000000046)
2272 ]
2273 interface IForegroundTransfer : IUnknown
2274 {
2275     HRESULT AllowForegroundTransfer(
2276         [in] void *lpvReserved);
2277 }
2278
2279 [
2280     local,
2281     object,
2282     uuid(00000147-0000-0000-C000-000000000046)
2283 ]
2284 interface IAddrTrackingControl : IUnknown
2285 {
2286     typedef [unique] IAddrTrackingControl *LPADDRTRACKINGCONTROL;
2287
2288     HRESULT EnableCOMDynamicAddrTracking();
2289     HRESULT DisableCOMDynamicAddrTracking();
2290 }
2291
2292 [
2293     local,
2294     object,
2295     uuid(00000148-0000-0000-C000-000000000046)
2296 ]
2297 interface IAddrExclusionControl : IUnknown
2298 {
2299     typedef [unique] IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
2300
2301     HRESULT GetCurrentAddrExclusionList(
2302         [in] REFIID riid,
2303         [out, iid_is(riid)] void **ppEnumerator);
2304     HRESULT UpdateAddrExclusionList(
2305         [in] IUnknown *pEnumerator);
2306 }
2307
2308 typedef enum _APTTYPE {
2309     APTTYPE_CURRENT = -1,
2310     APTTYPE_STA     = 0,
2311     APTTYPE_MTA     = 1,
2312     APTTYPE_NA      = 2,
2313     APTTYPE_MAINSTA = 3
2314 } APTTYPE;
2315
2316 typedef enum _THDTYPE {
2317     THDTYPE_BLOCKMESSAGES   = 0,
2318     THDTYPE_PROCESSMESSAGES = 1
2319 } THDTYPE;
2320
2321 [
2322     local,
2323     object,
2324     uuid(000001ce-0000-0000-C000-000000000046),
2325     pointer_default(unique)
2326 ]
2327 interface IComThreadingInfo : IUnknown
2328 {
2329     HRESULT GetCurrentApartmentType(
2330         [out] APTTYPE *pAptType);
2331     HRESULT GetCurrentThreadType(
2332         [out] THDTYPE *pThreadType);
2333     HRESULT GetCurrentLogicalThreadId(
2334         [out] GUID *pguidLogicalThreadId);
2335     HRESULT SetCurrentLogicalThreadId(
2336         [in] REFGUID rguid);
2337 }
2338
2339
2340 [
2341     object,
2342     pointer_default(unique),
2343     uuid(72380d55-8d2b-43a3-8513-2b6ef31434e9)
2344 ]
2345 interface IProcessInitControl : IUnknown
2346 {
2347     HRESULT ResetInitializerTimeout(
2348         [in] DWORD dwSecondsRemaining);
2349 }
2350
2351 [
2352     local,
2353     object,
2354     uuid(00000034-0000-0000-C000-000000000046),
2355     pointer_default(unique)
2356 ]
2357 interface IInitializeSpy : IUnknown
2358 {
2359     typedef [unique] IInitializeSpy *LPINITIALIZESPY;
2360
2361     HRESULT PreInitialize(
2362         [in] DWORD dwCoInit,
2363         [in] DWORD dwCurThreadAptRefs);
2364
2365     HRESULT PostInitialize(
2366         [in] HRESULT hrCoInit,
2367         [in] DWORD dwCoInit,
2368         [in] DWORD dwNewThreadAptRefs);
2369
2370     HRESULT PreUninitialize(
2371         [in] DWORD dwCurThreadAptRefs);
2372
2373     HRESULT PostUninitialize(
2374         [in] DWORD dwNewThreadAptRefs);
2375 }
2376
2377 [
2378     object,
2379     uuid(969dc708-5c76-11d1-8d86-0000f804b057)
2380 ]
2381 interface IThumbnailExtractor : IUnknown
2382 {
2383     HRESULT ExtractThumbnail(
2384         [in] IStorage *pStg,
2385         [in] ULONG ulLength,
2386         [in] ULONG ulHeight,
2387         [out] ULONG *pulOutputLength,
2388         [out] ULONG *pulOutputHeight,
2389         [out] HBITMAP *phOutputBitmap);
2390
2391
2392     HRESULT OnFileUpdated(
2393         [in] IStorage *pStg);
2394 }
2395
2396
2397 cpp_quote("#ifdef USE_COM_CONTEXT_DEF")
2398
2399 typedef DWORD CPFLAGS;
2400
2401 typedef struct tagContextProperty
2402 {
2403     GUID policyId;
2404     CPFLAGS flags;
2405     [unique] IUnknown *pUnk;
2406 } ContextProperty;
2407
2408 [
2409     local,
2410     object,
2411     uuid(000001c1-0000-0000-C000-000000000046)
2412 ]
2413 interface IEnumContextProps : IUnknown
2414 {
2415     typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS;
2416
2417     HRESULT Next(
2418         [in] ULONG celt,
2419         [out, size_is(celt), length_is(*pceltFetched)] ContextProperty *pContextProperties,
2420         [out] ULONG *pceltFetched);
2421
2422     HRESULT Skip(
2423         [in] ULONG celt);
2424
2425     HRESULT Reset();
2426
2427     HRESULT Clone(
2428         [out] IEnumContextProps **ppEnumContextProps);
2429
2430     HRESULT Count(
2431         [out] ULONG *pcelt);
2432 }
2433
2434 [
2435     local,
2436     object,
2437     uuid(000001c0-0000-0000-C000-000000000046)
2438 ]
2439 interface IContext : IUnknown
2440 {
2441     HRESULT SetProperty(
2442         [in] REFGUID policyId,
2443         [in] CPFLAGS flags,
2444         [in] IUnknown *pUnk);
2445
2446     HRESULT RemovePropert(
2447         [in] REFGUID policyId);
2448
2449     HRESULT GetProperty(
2450         [in] REFGUID guid,
2451         [out] CPFLAGS *pFlags,
2452         [out] IUnknown **ppUnk);
2453
2454     HRESULT EnumContextProps(
2455         [out] IEnumContextProps **ppEnumContextProps);
2456 }
2457
2458 cpp_quote("#endif /* defined USE_COM_CONTEXT_DEF */")