Various cosmetic changes.
[wine] / dlls / quartz / iunk.h
1 /*
2  * An implementation of IUnknown.
3  *
4  * hidenori@a2.ctktv.ne.jp
5  */
6
7 #ifndef WINE_DSHOW_IUNK_H
8 #define WINE_DSHOW_IUNK_H
9
10 /*
11         To avoid implementing IUnknown for all interfaces,
12
13   1) To give a method to get rel-offset of IUnknown.
14   2) The IUnknown knows all IIDs and offsets of interfaces.
15
16     So each implementation must have following two members
17     with the following order:
18
19   typedef struct IDispatchImpl
20   {
21     ICOM_VFIELD(IDispatch);     <-pointer of the interface.
22     size_t      ofsIUnknown;    <-ofs<IDispatchImpl> - ofs<QUARTZ_IUnkImpl>
23   };
24
25  */
26
27 /* for InterlockedExchangeAdd. */
28 #include <pshpack4.h>
29
30 typedef struct QUARTZ_IFEntry
31 {
32         const IID*      piid;           /* interface ID. */
33         size_t          ofsVTPtr;       /* offset from IUnknown. */
34 } QUARTZ_IFEntry;
35
36 typedef struct QUARTZ_IFDelegation
37 {
38         struct QUARTZ_IFDelegation*     pNext;
39         HRESULT (*pOnQueryInterface)(
40                 IUnknown* punk, const IID* piid, void** ppobj );
41 } QUARTZ_IFDelegation;
42
43 typedef struct QUARTZ_IUnkImpl
44 {
45         /* pointer of IUnknown interface. */
46         ICOM_VFIELD(IUnknown);
47
48         /* array of supported IIDs and offsets. */
49         const QUARTZ_IFEntry*   pEntries;
50         DWORD   dwEntries;
51         /* list of delegation handlers. */
52         QUARTZ_IFDelegation*    pDelegationFirst;
53         /* called on final release. */
54         void (*pOnFinalRelease)(IUnknown* punk);
55
56         /* IUnknown fields. */
57         LONG    ref;
58         IUnknown*       punkControl;
59 } QUARTZ_IUnkImpl;
60
61 #include <poppack.h>
62
63
64 void QUARTZ_IUnkInit( QUARTZ_IUnkImpl* pImpl, IUnknown* punkOuter );
65 void QUARTZ_IUnkAddDelegation(
66         QUARTZ_IUnkImpl* pImpl, QUARTZ_IFDelegation* pDelegation );
67
68
69 #endif  /* WINE_DSHOW_IUNK_H */