wined3d: Get rid of wined3d_buffer_get_desc().
[wine] / dlls / msxml3 / factory.c
1 /*
2  *    MSXML Class Factory
3  *
4  * Copyright 2002 Lionel Ulmer
5  * Copyright 2005 Mike McCormack
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #define COBJMACROS
23
24 #include "config.h"
25
26 #include <stdarg.h>
27 #ifdef HAVE_LIBXML2
28 # include <libxml/parser.h>
29 # include <libxml/xmlerror.h>
30 #endif
31
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winuser.h"
35 #include "ole2.h"
36 #include "msxml.h"
37 #include "msxml2.h"
38
39 /* undef the #define in msxml2 so that we can access the v.2 version
40    independent CLSID as well as the v.3 one. */
41 #undef CLSID_DOMDocument
42
43 #include "wine/debug.h"
44
45 #include "msxml_private.h"
46
47 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
48
49 typedef HRESULT (*ClassFactoryCreateInstanceFunc)(IUnknown *pUnkOuter, LPVOID *ppObj);
50 typedef HRESULT (*DOMFactoryCreateInstanceFunc)(const GUID *clsid, IUnknown *pUnkOuter, LPVOID *ppObj);
51
52 /******************************************************************************
53  * MSXML ClassFactory
54  */
55 typedef struct
56 {
57     const struct IClassFactoryVtbl *lpVtbl;
58     ClassFactoryCreateInstanceFunc pCreateInstance;
59 } ClassFactory;
60
61 typedef struct
62 {
63     const struct IClassFactoryVtbl *lpVtbl;
64     LONG ref;
65     DOMFactoryCreateInstanceFunc pCreateInstance;
66     GUID clsid;
67 } DOMFactory;
68
69 static HRESULT WINAPI ClassFactory_QueryInterface(
70     IClassFactory *iface,
71     REFIID riid,
72     void **ppobj )
73 {
74     if (IsEqualGUID(riid, &IID_IUnknown) ||
75         IsEqualGUID(riid, &IID_IClassFactory))
76     {
77         IClassFactory_AddRef( iface );
78         *ppobj = iface;
79         return S_OK;
80     }
81
82     FIXME("interface %s not implemented\n", debugstr_guid(riid));
83     *ppobj = NULL;
84     return E_NOINTERFACE;
85 }
86
87 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface )
88 {
89     return 2;
90 }
91
92 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface )
93 {
94     return 1;
95 }
96
97 static HRESULT WINAPI ClassFactory_CreateInstance(
98     IClassFactory *iface,
99     IUnknown *pOuter,
100     REFIID riid,
101     void **ppobj )
102 {
103     ClassFactory *This = (ClassFactory*)iface;
104     IUnknown *punk;
105     HRESULT r;
106
107     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
108
109     *ppobj = NULL;
110
111     if (pOuter)
112         return CLASS_E_NOAGGREGATION;
113
114     r = This->pCreateInstance( pOuter, (void**) &punk );
115     if (FAILED(r))
116         return r;
117
118     r = IUnknown_QueryInterface( punk, riid, ppobj );
119     IUnknown_Release( punk );
120     return r;
121 }
122
123 static HRESULT WINAPI ClassFactory_LockServer(
124     IClassFactory *iface,
125     BOOL dolock)
126 {
127     FIXME("(%p)->(%d),stub!\n",iface,dolock);
128     return S_OK;
129 }
130
131 static ULONG WINAPI DOMClassFactory_AddRef(IClassFactory *iface )
132 {
133     DOMFactory *This = (DOMFactory*)iface;
134     ULONG ref = InterlockedIncrement(&This->ref);
135     TRACE("(%p) ref = %u\n", This, ref);
136     return ref;
137 }
138
139 static ULONG WINAPI DOMClassFactory_Release(IClassFactory *iface )
140 {
141     DOMFactory *This = (DOMFactory*)iface;
142     ULONG ref = InterlockedDecrement(&This->ref);
143     TRACE("(%p) ref = %u\n", This, ref);
144     if(!ref) {
145         heap_free(This);
146     }
147     return ref;
148 }
149
150 static HRESULT WINAPI DOMClassFactory_CreateInstance(
151     IClassFactory *iface,
152     IUnknown *pOuter,
153     REFIID riid,
154     void **ppobj )
155 {
156     DOMFactory *This = (DOMFactory*)iface;
157     IUnknown *punk;
158     HRESULT r;
159
160     TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
161
162     *ppobj = NULL;
163
164     if (pOuter)
165         return CLASS_E_NOAGGREGATION;
166
167     r = This->pCreateInstance( &This->clsid, pOuter, (void**) &punk );
168     if (FAILED(r))
169         return r;
170
171     r = IUnknown_QueryInterface( punk, riid, ppobj );
172     IUnknown_Release( punk );
173     return r;
174 }
175
176 static const struct IClassFactoryVtbl ClassFactoryVtbl =
177 {
178     ClassFactory_QueryInterface,
179     ClassFactory_AddRef,
180     ClassFactory_Release,
181     ClassFactory_CreateInstance,
182     ClassFactory_LockServer
183 };
184
185 static const struct IClassFactoryVtbl DOMClassFactoryVtbl =
186 {
187     ClassFactory_QueryInterface,
188     DOMClassFactory_AddRef,
189     DOMClassFactory_Release,
190     DOMClassFactory_CreateInstance,
191     ClassFactory_LockServer
192 };
193
194 static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv, DOMFactoryCreateInstanceFunc fnCreateInstance)
195 {
196     DOMFactory *ret = heap_alloc(sizeof(DOMFactory));
197     HRESULT hres;
198
199     ret->lpVtbl = &DOMClassFactoryVtbl;
200     ret->ref = 0;
201     ret->clsid = *clsid;
202     ret->pCreateInstance = fnCreateInstance;
203
204     hres = IClassFactory_QueryInterface((IClassFactory*)ret, riid, ppv);
205     if(FAILED(hres)) {
206         heap_free(ret);
207         *ppv = NULL;
208     }
209     return hres;
210 }
211
212 static ClassFactory xmldoccf = { &ClassFactoryVtbl, XMLDocument_create };
213 static ClassFactory saxreadcf = { &ClassFactoryVtbl, SAXXMLReader_create };
214 static ClassFactory httpreqcf = { &ClassFactoryVtbl, XMLHTTPRequest_create };
215 static ClassFactory xsltemplatecf = { &ClassFactoryVtbl, XSLTemplate_create };
216
217 /******************************************************************
218  *              DllGetClassObject (MSXML3.@)
219  */
220 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
221 {
222     IClassFactory *cf = NULL;
223
224     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv );
225
226     if( IsEqualCLSID( rclsid, &CLSID_DOMDocument )  ||  /* Version indep. v 2.x */
227         IsEqualCLSID( rclsid, &CLSID_DOMDocument2 ) ||  /* Version indep. v 3.0 */
228         IsEqualCLSID( rclsid, &CLSID_DOMDocument26 )||  /* Version dep.   v 2.6 */
229         IsEqualCLSID( rclsid, &CLSID_DOMDocument30 )||  /* Version dep.   v 3.0 */
230         IsEqualCLSID( rclsid, &CLSID_DOMDocument40 )||  /* Version dep.   v 4.0 */
231         IsEqualCLSID( rclsid, &CLSID_DOMDocument60 ))   /* Version dep.   v 6.0 */
232     {
233         return DOMClassFactory_Create(rclsid, riid, ppv, DOMDocument_create);
234     }
235     else if( IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache )   ||
236              IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache26 ) ||
237              IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache30 ) ||
238              IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache40 ) ||
239              IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache60 ))
240     {
241         return DOMClassFactory_Create(rclsid, riid, ppv, SchemaCache_create);
242     }
243     else if( IsEqualCLSID( rclsid, &CLSID_XMLDocument ) )
244     {
245         cf = (IClassFactory*) &xmldoccf.lpVtbl;
246     }
247     else if( IsEqualCLSID( rclsid, &CLSID_DOMFreeThreadedDocument )   ||   /* Version indep. v 2.x */
248              IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument )   ||
249              IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument26 ) ||
250              IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument30 ) ||
251              IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument40 ) ||
252              IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument60 ))
253     {
254         return DOMClassFactory_Create(rclsid, riid, ppv, DOMDocument_create);
255     }
256     else if( IsEqualCLSID( rclsid, &CLSID_SAXXMLReader) ||
257              IsEqualCLSID( rclsid, &CLSID_SAXXMLReader30 ) ||
258              IsEqualCLSID( rclsid, &CLSID_SAXXMLReader40 ) ||
259              IsEqualCLSID( rclsid, &CLSID_SAXXMLReader60 ))
260     {
261         cf = (IClassFactory*) &saxreadcf.lpVtbl;
262     }
263     else if( IsEqualCLSID( rclsid, &CLSID_XMLHTTPRequest ) ||
264              IsEqualCLSID( rclsid, &CLSID_XMLHTTP26 ) ||
265              IsEqualCLSID( rclsid, &CLSID_XMLHTTP30 ) ||
266              IsEqualCLSID( rclsid, &CLSID_XMLHTTP40 ) ||
267              IsEqualCLSID( rclsid, &CLSID_XMLHTTP60 ))
268     {
269         cf = (IClassFactory*) &httpreqcf.lpVtbl;
270     }
271     else if( IsEqualCLSID( rclsid, &CLSID_XSLTemplate )   ||
272              IsEqualCLSID( rclsid, &CLSID_XSLTemplate26 ) ||
273              IsEqualCLSID( rclsid, &CLSID_XSLTemplate30 ) ||
274              IsEqualCLSID( rclsid, &CLSID_XSLTemplate40 ) ||
275              IsEqualCLSID( rclsid, &CLSID_XSLTemplate60 ))
276     {
277         cf = (IClassFactory*) &xsltemplatecf.lpVtbl;
278     }
279
280     if ( !cf )
281         return CLASS_E_CLASSNOTAVAILABLE;
282
283     return IClassFactory_QueryInterface( cf, riid, ppv );
284 }