ReactOS 0.4.15-dev-8422-g6219a1a
factory.c
Go to the documentation of this file.
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#include "xmlparser.h"
39
40/* undef the #define in msxml2 so that we can access the v.2 version
41 independent CLSID as well as the v.3 one. */
42#undef CLSID_DOMDocument
43
44#include "wine/debug.h"
45
46#include "msxml_private.h"
47
49
52
54{
55 const GUID *clsid;
57};
58
60{
62 { &CLSID_DOMDocument2, MSXML2 },
63 { &CLSID_DOMDocument26, MSXML26 },
64 { &CLSID_DOMDocument30, MSXML3 },
65 { &CLSID_DOMDocument40, MSXML4 },
66 { &CLSID_DOMDocument60, MSXML6 },
67
69 { &CLSID_FreeThreadedDOMDocument, MSXML_DEFAULT },
70 { &CLSID_FreeThreadedDOMDocument26, MSXML26 },
71 { &CLSID_FreeThreadedDOMDocument30, MSXML3 },
72 { &CLSID_FreeThreadedDOMDocument40, MSXML4 },
73 { &CLSID_FreeThreadedDOMDocument60, MSXML6 },
74
75 { &CLSID_XMLSchemaCache, MSXML_DEFAULT },
76 { &CLSID_XMLSchemaCache26, MSXML26 },
77 { &CLSID_XMLSchemaCache30, MSXML3 },
78 { &CLSID_XMLSchemaCache40, MSXML4 },
79 { &CLSID_XMLSchemaCache60, MSXML6 },
80
81 { &CLSID_MXXMLWriter, MSXML_DEFAULT },
82 { &CLSID_MXXMLWriter30, MSXML3 },
83 { &CLSID_MXXMLWriter40, MSXML4 },
84 { &CLSID_MXXMLWriter60, MSXML6 },
85
86 { &CLSID_SAXXMLReader, MSXML_DEFAULT },
87 { &CLSID_SAXXMLReader30, MSXML3 },
88 { &CLSID_SAXXMLReader40, MSXML4 },
89 { &CLSID_SAXXMLReader60, MSXML6 },
90
91 { &CLSID_SAXAttributes, MSXML_DEFAULT },
92 { &CLSID_SAXAttributes30, MSXML3 },
93 { &CLSID_SAXAttributes40, MSXML4 },
94 { &CLSID_SAXAttributes60, MSXML6 },
95
96 { &CLSID_XMLView, MSXML_DEFAULT }
97};
98
100{
101 unsigned int i;
102
103 for (i = 0; i < ARRAY_SIZE(clsid_versions_table); i++)
106
107 ERR("unknown clsid=%s\n", debugstr_guid(clsid));
108 return MSXML_DEFAULT;
109}
110
111/******************************************************************************
112 * MSXML ClassFactory
113 */
114typedef struct
115{
116 IClassFactory IClassFactory_iface;
119
120typedef struct
121{
126} DOMFactory;
127
129{
130 return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface);
131}
132
134 IClassFactory *iface,
135 REFIID riid,
136 void **ppobj )
137{
140 {
141 IClassFactory_AddRef( iface );
142 *ppobj = iface;
143 return S_OK;
144 }
145
146 FIXME("interface %s not implemented\n", debugstr_guid(riid));
147 *ppobj = NULL;
148 return E_NOINTERFACE;
149}
150
152{
153 return 2;
154}
155
157{
158 return 1;
159}
160
162 IClassFactory *iface,
163 IUnknown *pOuter,
164 REFIID riid,
165 void **ppobj )
166{
168 IUnknown *punk;
169 HRESULT r;
170
171 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
172
173 *ppobj = NULL;
174
175 if (pOuter)
177
178 r = This->pCreateInstance( (void**) &punk );
179 if (FAILED(r))
180 return r;
181
182 r = IUnknown_QueryInterface( punk, riid, ppobj );
183 IUnknown_Release( punk );
184 return r;
185}
186
188 IClassFactory *iface,
189 BOOL dolock)
190{
191 FIXME("(%p)->(%d),stub!\n",iface,dolock);
192 return S_OK;
193}
194
196{
197 return CONTAINING_RECORD(iface, DOMFactory, IClassFactory_iface);
198}
199
201{
204 TRACE("(%p) ref = %u\n", This, ref);
205 return ref;
206}
207
209{
212 TRACE("(%p) ref = %u\n", This, ref);
213 if(!ref) {
215 }
216 return ref;
217}
218
220 IClassFactory *iface,
221 IUnknown *pOuter,
222 REFIID riid,
223 void **ppobj )
224{
226 IUnknown *punk;
227 HRESULT r;
228
229 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj );
230
231 *ppobj = NULL;
232
233 if (pOuter)
235
236 r = This->pCreateInstance( This->version, (void**) &punk );
237 if (FAILED(r))
238 return r;
239
240 r = IUnknown_QueryInterface( punk, riid, ppobj );
241 IUnknown_Release( punk );
242 return r;
243}
244
245static const struct IClassFactoryVtbl ClassFactoryVtbl =
246{
252};
253
254static const struct IClassFactoryVtbl DOMClassFactoryVtbl =
255{
261};
262
264{
267
268 ret->IClassFactory_iface.lpVtbl = &DOMClassFactoryVtbl;
269 ret->ref = 0;
270 ret->version = get_msxml_version(clsid);
271 ret->pCreateInstance = fnCreateInstance;
272
273 hres = IClassFactory_QueryInterface(&ret->IClassFactory_iface, riid, ppv);
274 if(FAILED(hres)) {
275 heap_free(ret);
276 *ppv = NULL;
277 }
278 return hres;
279}
280
288
289/******************************************************************
290 * DllGetClassObject (MSXML3.@)
291 */
293{
295
296 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv );
297
298 if( IsEqualCLSID( rclsid, &CLSID_DOMDocument ) || /* Version indep. v 2.x */
299 IsEqualCLSID( rclsid, &CLSID_DOMDocument2 ) || /* Version indep. v 3.0 */
300 IsEqualCLSID( rclsid, &CLSID_DOMDocument26 )|| /* Version dep. v 2.6 */
301 IsEqualCLSID( rclsid, &CLSID_DOMDocument30 )|| /* Version dep. v 3.0 */
302 IsEqualCLSID( rclsid, &CLSID_DOMDocument40 )|| /* Version dep. v 4.0 */
303 IsEqualCLSID( rclsid, &CLSID_DOMDocument60 )) /* Version dep. v 6.0 */
304 {
306 }
307 else if( IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache ) ||
308 IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache26 ) ||
309 IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache30 ) ||
310 IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache40 ) ||
311 IsEqualCLSID( rclsid, &CLSID_XMLSchemaCache60 ))
312 {
314 }
315 else if( IsEqualCLSID( rclsid, &CLSID_XMLDocument ) )
316 {
318 }
319 else if( IsEqualCLSID( rclsid, &CLSID_DOMFreeThreadedDocument ) || /* Version indep. v 2.x */
320 IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument ) ||
321 IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument26 ) ||
322 IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument30 ) ||
323 IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument40 ) ||
324 IsEqualCLSID( rclsid, &CLSID_FreeThreadedDOMDocument60 ))
325 {
327 }
328 else if( IsEqualCLSID( rclsid, &CLSID_SAXXMLReader) ||
329 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader30 ) ||
330 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader40 ) ||
331 IsEqualCLSID( rclsid, &CLSID_SAXXMLReader60 ))
332 {
334 }
335 else if( IsEqualCLSID( rclsid, &CLSID_XMLHTTPRequest ) ||
336 IsEqualCLSID( rclsid, &CLSID_XMLHTTP) ||
337 IsEqualCLSID( rclsid, &CLSID_XMLHTTP26 ) ||
338 IsEqualCLSID( rclsid, &CLSID_XMLHTTP30 ) ||
339 IsEqualCLSID( rclsid, &CLSID_XMLHTTP40 ) ||
340 IsEqualCLSID( rclsid, &CLSID_XMLHTTP60 ))
341 {
343 }
344 else if( IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP ) ||
345 IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP30 ) ||
346 IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP40 ) ||
347 IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP60 ))
348 {
350 }
351 else if( IsEqualCLSID( rclsid, &CLSID_XSLTemplate ) ||
352 IsEqualCLSID( rclsid, &CLSID_XSLTemplate26 ) ||
353 IsEqualCLSID( rclsid, &CLSID_XSLTemplate30 ) ||
354 IsEqualCLSID( rclsid, &CLSID_XSLTemplate40 ) ||
355 IsEqualCLSID( rclsid, &CLSID_XSLTemplate60 ))
356 {
358 }
359 else if( IsEqualCLSID( rclsid, &CLSID_MXXMLWriter ) ||
360 IsEqualCLSID( rclsid, &CLSID_MXXMLWriter30 ) ||
361 IsEqualCLSID( rclsid, &CLSID_MXXMLWriter40 ) ||
362 IsEqualCLSID( rclsid, &CLSID_MXXMLWriter60 ) )
363 {
365 }
366 else if( IsEqualCLSID( rclsid, &CLSID_SAXAttributes) ||
367 IsEqualCLSID( rclsid, &CLSID_SAXAttributes30 ) ||
368 IsEqualCLSID( rclsid, &CLSID_SAXAttributes40 ) ||
369 IsEqualCLSID( rclsid, &CLSID_SAXAttributes60 ))
370 {
372 }
373 else if( IsEqualCLSID( rclsid, &CLSID_MXNamespaceManager ) ||
374 IsEqualCLSID( rclsid, &CLSID_MXNamespaceManager40 ) ||
375 IsEqualCLSID( rclsid, &CLSID_MXNamespaceManager60 ) )
376 {
378 }
379 else if( IsEqualCLSID( rclsid, &CLSID_XMLParser ) ||
380 IsEqualCLSID( rclsid, &CLSID_XMLParser26 ) ||
381 IsEqualCLSID( rclsid, &CLSID_XMLParser30 ) )
382 {
384 }
385 else if( IsEqualCLSID( rclsid, &CLSID_XMLView ) )
386 {
388 }
389
390 if ( !cf )
392
393 return IClassFactory_QueryInterface( cf, riid, ppv );
394}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT WINAPI DllGetClassObject(REFCLSID pclsid, REFIID piid, LPVOID *ppv)
Definition: factory.c:183
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:33
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define NULL
Definition: types.h:112
static const WCHAR version[]
Definition: asmname.c:66
HRESULT DOMDocument_create(MSXML_VERSION version, void **ppObj)
Definition: domdoc.c:3727
unsigned int BOOL
Definition: ntddk_ex.h:94
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HRESULT(* fnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: hnetcfg.c:37
HRESULT ServerXMLHTTP_create(void **obj)
Definition: httprequest.c:2112
HRESULT XMLHTTPRequest_create(void **ppObj)
Definition: httprequest.c:2105
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
HRESULT hres
Definition: protocol.c:465
REFCLSID clsid
Definition: msctf.c:82
static ClassFactory xmlparsercf
Definition: factory.c:286
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: factory.c:161
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
Definition: factory.c:187
static const struct IClassFactoryVtbl ClassFactoryVtbl
Definition: factory.c:245
static const struct IClassFactoryVtbl DOMClassFactoryVtbl
Definition: factory.c:254
static ClassFactory * ClassFactory_from_IClassFactory(IClassFactory *iface)
Definition: factory.c:128
HRESULT(* DOMFactoryCreateInstanceFunc)(MSXML_VERSION, void **)
Definition: factory.c:51
static ClassFactory mxnsmanagercf
Definition: factory.c:285
static ClassFactory serverhttp
Definition: factory.c:283
static ClassFactory xmldoccf
Definition: factory.c:281
static HRESULT WINAPI DOMClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: factory.c:219
static ClassFactory xmlviewcf
Definition: factory.c:287
static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
Definition: factory.c:156
static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv, DOMFactoryCreateInstanceFunc fnCreateInstance)
Definition: factory.c:263
static const struct clsid_version_t clsid_versions_table[]
Definition: factory.c:59
static ULONG WINAPI DOMClassFactory_Release(IClassFactory *iface)
Definition: factory.c:208
HRESULT(* ClassFactoryCreateInstanceFunc)(void **)
Definition: factory.c:50
static DOMFactory * DOMFactory_from_IClassFactory(IClassFactory *iface)
Definition: factory.c:195
static ClassFactory xsltemplatecf
Definition: factory.c:284
static MSXML_VERSION get_msxml_version(const GUID *clsid)
Definition: factory.c:99
static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
Definition: factory.c:151
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: factory.c:133
static ClassFactory httpreqcf
Definition: factory.c:282
static ULONG WINAPI DOMClassFactory_AddRef(IClassFactory *iface)
Definition: factory.c:200
const struct _GUID CLSID_DOMDocument
const struct _GUID CLSID_DOMFreeThreadedDocument
const struct _GUID CLSID_XMLDocument
const struct _GUID CLSID_XMLHTTPRequest
MSXML_VERSION
Definition: msxml_private.h:34
@ MSXML_DEFAULT
Definition: msxml_private.h:35
@ MSXML4
Definition: msxml_private.h:39
@ MSXML6
Definition: msxml_private.h:40
@ MSXML26
Definition: msxml_private.h:37
@ MSXML3
Definition: msxml_private.h:38
HRESULT SAXXMLReader_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
HRESULT MXNamespaceManager_create(void **) DECLSPEC_HIDDEN
Definition: mxnamespace.c:645
HRESULT XMLDocument_create(void **) DECLSPEC_HIDDEN
HRESULT XSLTemplate_create(void **) DECLSPEC_HIDDEN
Definition: stylesheet.c:268
HRESULT MXWriter_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: mxwriter.c:2585
HRESULT XMLView_create(void **) DECLSPEC_HIDDEN
Definition: xmlview.c:1460
HRESULT SAXAttributes_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: mxwriter.c:3553
HRESULT XMLParser_create(void **) DECLSPEC_HIDDEN
Definition: xmlparser.c:437
HRESULT SchemaCache_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: schema.c:1647
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
#define TRACE(s)
Definition: solgame.cpp:4
IClassFactory IClassFactory_iface
Definition: main.c:210
ClassFactoryCreateInstanceFunc pCreateInstance
Definition: factory.c:117
LONG ref
Definition: factory.c:123
DOMFactoryCreateInstanceFunc pCreateInstance
Definition: factory.c:124
IClassFactory IClassFactory_iface
Definition: factory.c:122
MSXML_VERSION version
Definition: factory.c:125
const GUID * clsid
Definition: factory.c:55
MSXML_VERSION version
Definition: factory.c:56
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
int ret
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:2662
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663