dbghelp: Keep the mapping of any PDB file open until the module is unloaded.
[wine] / dlls / wiaservc / factory.c
1 /*
2  * Class factory interface for WiaServc
3  *
4  * Copyright (C) 2009 Damjan Jovanovic
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #define COBJMACROS
22
23 #include "objbase.h"
24 #include "winuser.h"
25 #include "winreg.h"
26 #include "initguid.h"
27 #include "wia_lh.h"
28
29 #include "wiaservc_private.h"
30
31 #include "wine/debug.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(wia);
34
35 static ULONG WINAPI
36 WIASERVC_IClassFactory_AddRef(LPCLASSFACTORY iface)
37 {
38     return 2;
39 }
40
41 static HRESULT WINAPI
42 WIASERVC_IClassFactory_QueryInterface(LPCLASSFACTORY iface, REFIID riid,
43                                       LPVOID *ppvObj)
44 {
45     ClassFactoryImpl *This = (ClassFactoryImpl *) iface;
46
47     if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IClassFactory))
48     {
49         *ppvObj = &This->lpVtbl;
50         return S_OK;
51     }
52
53     *ppvObj = NULL;
54     return E_NOINTERFACE;
55 }
56
57 static ULONG WINAPI
58 WIASERVC_IClassFactory_Release(LPCLASSFACTORY iface)
59 {
60     return 1;
61 }
62
63 static HRESULT WINAPI
64 WIASERVC_IClassFactory_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnkOuter,
65                                       REFIID riid, LPVOID *ppvObj)
66 {
67     HRESULT res;
68     IUnknown *punk = NULL;
69
70     TRACE("IID: %s\n", debugstr_guid(riid));
71
72     if (pUnkOuter)
73         return CLASS_E_NOAGGREGATION;
74
75     res = wiadevmgr_Constructor(pUnkOuter, (LPVOID*) &punk);
76     if (FAILED(res))
77         return res;
78
79     res = IUnknown_QueryInterface(punk, riid, ppvObj);
80     IUnknown_Release(punk);
81     return res;
82 }
83
84 static HRESULT WINAPI
85 WIASERVC_IClassFactory_LockServer(LPCLASSFACTORY iface, BOOL fLock)
86 {
87     FIXME("Not implemented\n");
88     return E_NOTIMPL;
89 }
90
91 static const IClassFactoryVtbl WIASERVC_IClassFactory_Vtbl =
92 {
93     WIASERVC_IClassFactory_QueryInterface,
94     WIASERVC_IClassFactory_AddRef,
95     WIASERVC_IClassFactory_Release,
96     WIASERVC_IClassFactory_CreateInstance,
97     WIASERVC_IClassFactory_LockServer
98 };
99
100 ClassFactoryImpl WIASERVC_ClassFactory =
101 {
102     &WIASERVC_IClassFactory_Vtbl
103 };