Require {DECLARE,DEFAULT}_DEBUG_CHANNEL statements to end in a ;
[wine] / dlls / dplayx / dpclassfactory.c
1
2 #include "windef.h"
3 #include "wine/obj_base.h"
4 #include "winerror.h"
5 #include "debugtools.h"
6 #include "dpinit.h"
7
8 DEFAULT_DEBUG_CHANNEL(dplay);
9
10
11 /*******************************************************************************
12  * DirectPlayLobby ClassFactory
13  */
14
15 typedef struct
16 {
17     /* IUnknown fields */
18     ICOM_VFIELD(IClassFactory);
19     DWORD                       ref;
20 } IClassFactoryImpl;
21
22 static HRESULT WINAPI
23 DP_and_DPL_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
24         ICOM_THIS(IClassFactoryImpl,iface);
25
26         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
27
28         return E_NOINTERFACE;
29 }
30
31 static ULONG WINAPI
32 DP_and_DPL_AddRef(LPCLASSFACTORY iface) {
33         ICOM_THIS(IClassFactoryImpl,iface);
34         return ++(This->ref);
35 }
36
37 static ULONG WINAPI DP_and_DPL_Release(LPCLASSFACTORY iface) {
38         ICOM_THIS(IClassFactoryImpl,iface);
39         /* static class (reference starts @ 1), won't ever be freed */
40         return --(This->ref);
41 }
42
43 static HRESULT WINAPI DP_and_DPL_CreateInstance(
44         LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
45 ) {
46         ICOM_THIS(IClassFactoryImpl,iface);
47
48         TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
49
50         if ( DPL_CreateInterface( riid, ppobj ) == S_OK )
51         {
52            return S_OK;
53         }
54         else if ( DP_CreateInterface( riid, ppobj ) == S_OK )
55         {
56            return S_OK;
57         }
58
59         return E_NOINTERFACE;
60 }
61
62 static HRESULT WINAPI DP_and_DPL_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
63         ICOM_THIS(IClassFactoryImpl,iface);
64         FIXME("(%p)->(%d),stub!\n",This,dolock);
65         return S_OK;
66 }
67
68 static ICOM_VTABLE(IClassFactory) DP_and_DPL_Vtbl = {
69         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
70         DP_and_DPL_QueryInterface,
71         DP_and_DPL_AddRef,
72         DP_and_DPL_Release,
73         DP_and_DPL_CreateInstance,
74         DP_and_DPL_LockServer
75 };
76
77 static IClassFactoryImpl DP_and_DPL_CF = {&DP_and_DPL_Vtbl, 1 };
78
79
80 /*******************************************************************************
81  * DPLAYX_DllGetClassObject [DPLAYX.11]
82  * Retrieves DP or DPL class object from a DLL object
83  *
84  * NOTES
85  *    Docs say returns STDAPI
86  *
87  * PARAMS
88  *    rclsid [I] CLSID for the class object
89  *    riid   [I] Reference to identifier of interface for class object
90  *    ppv    [O] Address of variable to receive interface pointer for riid
91  *
92  * RETURNS
93  *    Success: S_OK
94  *    Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
95  *             E_UNEXPECTED
96  */
97 DWORD WINAPI DPLAYX_DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppv)
98 {
99     TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
100
101     if ( IsEqualCLSID( riid, &IID_IClassFactory ) )
102     {
103         *ppv = (LPVOID)&DP_and_DPL_CF;
104         IClassFactory_AddRef( (IClassFactory*)*ppv );
105
106         return S_OK;
107     }
108
109     ERR("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
110     return CLASS_E_CLASSNOTAVAILABLE;
111 }