comctl32/monthcal: Get rid of empty slots in cached brushes array.
[wine.git] / dlls / msxml3 / factory.c
blob027506c675ca65b8602e4bccdcefd09468f25bf6
1 /*
2 * MSXML Class Factory
4 * Copyright 2002 Lionel Ulmer
5 * Copyright 2005 Mike McCormack
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.
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.
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
22 #define COBJMACROS
24 #include "config.h"
26 #include <stdarg.h>
27 #ifdef HAVE_LIBXML2
28 # include <libxml/parser.h>
29 # include <libxml/xmlerror.h>
30 #endif
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winuser.h"
35 #include "ole2.h"
36 #include "msxml.h"
37 #include "msxml2.h"
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
43 #include "wine/debug.h"
45 #include "msxml_private.h"
47 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
49 typedef HRESULT (*ClassFactoryCreateInstanceFunc)(IUnknown *pUnkOuter, LPVOID *ppObj);
50 typedef HRESULT (*DOMFactoryCreateInstanceFunc)(const GUID *clsid, IUnknown *pUnkOuter, LPVOID *ppObj);
52 /******************************************************************************
53 * MSXML ClassFactory
55 typedef struct
57 const struct IClassFactoryVtbl *lpVtbl;
58 ClassFactoryCreateInstanceFunc pCreateInstance;
59 } ClassFactory;
61 typedef struct
63 const struct IClassFactoryVtbl *lpVtbl;
64 LONG ref;
65 DOMFactoryCreateInstanceFunc pCreateInstance;
66 GUID clsid;
67 } DOMFactory;
69 static HRESULT WINAPI ClassFactory_QueryInterface(
70 IClassFactory *iface,
71 REFIID riid,
72 void **ppobj )
74 if (IsEqualGUID(riid, &IID_IUnknown) ||
75 IsEqualGUID(riid, &IID_IClassFactory))
77 IClassFactory_AddRef( iface );
78 *ppobj = iface;
79 return S_OK;
82 FIXME("interface %s not implemented\n", debugstr_guid(riid));
83 *ppobj = NULL;
84 return E_NOINTERFACE;
87 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface )
89 return 2;
92 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface )
94 return 1;
97 static HRESULT WINAPI ClassFactory_CreateInstance(
98 IClassFactory *iface,
99 IUnknown *pOuter,
100 REFIID riid,
101 void **ppobj )
103 ClassFactory *This = (ClassFactory*)iface;
104 IUnknown *punk;
105 HRESULT r;
107 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
109 *ppobj = NULL;
111 if (pOuter)
112 return CLASS_E_NOAGGREGATION;
114 r = This->pCreateInstance( pOuter, (void**) &punk );
115 if (FAILED(r))
116 return r;
118 r = IUnknown_QueryInterface( punk, riid, ppobj );
119 IUnknown_Release( punk );
120 return r;
123 static HRESULT WINAPI ClassFactory_LockServer(
124 IClassFactory *iface,
125 BOOL dolock)
127 FIXME("(%p)->(%d),stub!\n",iface,dolock);
128 return S_OK;
131 static ULONG WINAPI DOMClassFactory_AddRef(IClassFactory *iface )
133 DOMFactory *This = (DOMFactory*)iface;
134 ULONG ref = InterlockedIncrement(&This->ref);
135 TRACE("(%p) ref = %u\n", This, ref);
136 return ref;
139 static ULONG WINAPI DOMClassFactory_Release(IClassFactory *iface )
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);
147 return ref;
150 static HRESULT WINAPI DOMClassFactory_CreateInstance(
151 IClassFactory *iface,
152 IUnknown *pOuter,
153 REFIID riid,
154 void **ppobj )
156 DOMFactory *This = (DOMFactory*)iface;
157 IUnknown *punk;
158 HRESULT r;
160 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
162 *ppobj = NULL;
164 if (pOuter)
165 return CLASS_E_NOAGGREGATION;
167 r = This->pCreateInstance( &This->clsid, pOuter, (void**) &punk );
168 if (FAILED(r))
169 return r;
171 r = IUnknown_QueryInterface( punk, riid, ppobj );
172 IUnknown_Release( punk );
173 return r;
176 static const struct IClassFactoryVtbl ClassFactoryVtbl =
178 ClassFactory_QueryInterface,
179 ClassFactory_AddRef,
180 ClassFactory_Release,
181 ClassFactory_CreateInstance,
182 ClassFactory_LockServer
185 static const struct IClassFactoryVtbl DOMClassFactoryVtbl =
187 ClassFactory_QueryInterface,
188 DOMClassFactory_AddRef,
189 DOMClassFactory_Release,
190 DOMClassFactory_CreateInstance,
191 ClassFactory_LockServer
194 static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv, DOMFactoryCreateInstanceFunc fnCreateInstance)
196 DOMFactory *ret = heap_alloc(sizeof(DOMFactory));
197 HRESULT hres;
199 ret->lpVtbl = &DOMClassFactoryVtbl;
200 ret->ref = 0;
201 ret->clsid = *clsid;
202 ret->pCreateInstance = fnCreateInstance;
204 hres = IClassFactory_QueryInterface((IClassFactory*)ret, riid, ppv);
205 if(FAILED(hres)) {
206 heap_free(ret);
207 *ppv = NULL;
209 return hres;
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 };
217 /******************************************************************
218 * DllGetClassObject (MSXML3.@)
220 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
222 IClassFactory *cf = NULL;
224 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv );
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 */
233 return DOMClassFactory_Create(rclsid, riid, ppv, DOMDocument_create);
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 ))
241 return DOMClassFactory_Create(rclsid, riid, ppv, SchemaCache_create);
243 else if( IsEqualCLSID( rclsid, &CLSID_XMLDocument ) )
245 cf = (IClassFactory*) &xmldoccf.lpVtbl;
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 ))
254 return DOMClassFactory_Create(rclsid, riid, ppv, DOMDocument_create);
256 else if( IsEqualCLSID( rclsid, &CLSID_SAXXMLReader) ||
257 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader30 ) ||
258 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader40 ) ||
259 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader60 ))
261 cf = (IClassFactory*) &saxreadcf.lpVtbl;
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 ))
269 cf = (IClassFactory*) &httpreqcf.lpVtbl;
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 ))
277 cf = (IClassFactory*) &xsltemplatecf.lpVtbl;
280 if ( !cf )
281 return CLASS_E_CLASSNOTAVAILABLE;
283 return IClassFactory_QueryInterface( cf, riid, ppv );