ReactOS  0.4.15-dev-985-gd905dd5
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 
59 static const struct clsid_version_t clsid_versions_table[] =
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  */
114 typedef struct
115 {
116  IClassFactory IClassFactory_iface;
118 } ClassFactory;
119 
120 typedef 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 {
138  if (IsEqualGUID(riid, &IID_IUnknown) ||
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)
176  return CLASS_E_NOAGGREGATION;
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) {
214  heap_free(This);
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)
234  return CLASS_E_NOAGGREGATION;
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 
245 static const struct IClassFactoryVtbl ClassFactoryVtbl =
246 {
252 };
253 
254 static const struct IClassFactoryVtbl DOMClassFactoryVtbl =
255 {
261 };
262 
264 {
265  DOMFactory *ret = heap_alloc(sizeof(DOMFactory));
266  HRESULT hres;
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 {
294  IClassFactory *cf = NULL;
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 ClassFactory httpreqcf
Definition: factory.c:282
#define HRESULT
Definition: msvc.h:7
#define REFIID
Definition: guiddef.h:118
static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
Definition: factory.c:156
#define E_NOINTERFACE
Definition: winerror.h:2364
static const struct clsid_version_t clsid_versions_table[]
Definition: factory.c:59
static DOMFactory * DOMFactory_from_IClassFactory(IClassFactory *iface)
Definition: factory.c:195
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: factory.c:133
REFIID riid
Definition: precomp.h:44
HRESULT MXNamespaceManager_create(void **) DECLSPEC_HIDDEN
Definition: mxnamespace.c:645
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
HRESULT XMLView_create(void **) DECLSPEC_HIDDEN
Definition: xmlview.c:1460
#define REFCLSID
Definition: guiddef.h:117
HRESULT SchemaCache_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: schema.c:1647
static ClassFactory xsltemplatecf
Definition: factory.c:284
REFIID LPVOID * ppv
Definition: atlbase.h:39
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
Definition: factory.c:187
static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
Definition: factory.c:151
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:2663
Definition: send.c:48
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
static ClassFactory * ClassFactory_from_IClassFactory(IClassFactory *iface)
Definition: factory.c:128
static ULONG WINAPI DOMClassFactory_Release(IClassFactory *iface)
Definition: factory.c:208
HRESULT ServerXMLHTTP_create(void **obj)
Definition: httprequest.c:2112
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
MSXML_VERSION version
Definition: factory.c:56
HRESULT XMLParser_create(void **) DECLSPEC_HIDDEN
Definition: xmlparser.c:437
HRESULT MXWriter_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: mxwriter.c:2585
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
ClassFactoryCreateInstanceFunc pCreateInstance
Definition: factory.c:117
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:111
static ClassFactory xmlparsercf
Definition: factory.c:286
HRESULT XSLTemplate_create(void **) DECLSPEC_HIDDEN
Definition: stylesheet.c:268
LONG ref
Definition: factory.c:123
smooth NULL
Definition: ftsmooth.c:416
static const WCHAR version[]
Definition: asmname.c:66
HRESULT XMLHTTPRequest_create(void **ppObj)
Definition: httprequest.c:2105
#define debugstr_guid
Definition: kernel32.h:35
HRESULT(* ClassFactoryCreateInstanceFunc)(void **)
Definition: factory.c:50
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static ClassFactory serverhttp
Definition: factory.c:283
HRESULT(* DOMFactoryCreateInstanceFunc)(MSXML_VERSION, void **)
Definition: factory.c:51
HRESULT SAXAttributes_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
Definition: mxwriter.c:3553
static ULONG WINAPI DOMClassFactory_AddRef(IClassFactory *iface)
Definition: factory.c:200
static ClassFactory xmldoccf
Definition: factory.c:281
const struct _GUID CLSID_XMLDocument
IClassFactory IClassFactory_iface
Definition: factory.c:122
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
static HRESULT WINAPI DOMClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: factory.c:219
LONG HRESULT
Definition: typedefs.h:79
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
static MSXML_VERSION get_msxml_version(const GUID *clsid)
Definition: factory.c:99
DOMFactoryCreateInstanceFunc pCreateInstance
Definition: factory.c:124
HRESULT XMLDocument_create(void **) DECLSPEC_HIDDEN
int ret
REFCLSID clsid
Definition: msctf.c:82
#define InterlockedDecrement
Definition: armddk.h:52
static ClassFactory xmlviewcf
Definition: factory.c:287
MSXML_VERSION
Definition: msxml_private.h:34
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:2662
MSXML_VERSION version
Definition: factory.c:125
HRESULT SAXXMLReader_create(MSXML_VERSION, void **) DECLSPEC_HIDDEN
static ClassFactory mxnsmanagercf
Definition: factory.c:285
#define ERR(fmt,...)
Definition: debug.h:110
HRESULT(* fnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: hnetcfg.c:37
const GUID * clsid
Definition: factory.c:55
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
static const struct IClassFactoryVtbl DOMClassFactoryVtbl
Definition: factory.c:254
#define ARRAY_SIZE(a)
Definition: main.h:24
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
WINE_DEFAULT_DEBUG_CHANNEL(avifile)
static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv, DOMFactoryCreateInstanceFunc fnCreateInstance)
Definition: factory.c:263
struct tagClassFactory ClassFactory
unsigned int ULONG
Definition: retypes.h:1
const struct _GUID CLSID_XMLHTTPRequest
HRESULT WINAPI DllGetClassObject(REFCLSID pclsid, REFIID piid, LPVOID *ppv)
Definition: factory.c:183
static const struct IClassFactoryVtbl ClassFactoryVtbl
Definition: factory.c:245
const GUID IID_IClassFactory
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
IClassFactory IClassFactory_iface
Definition: main.c:203
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: factory.c:161
const struct _GUID CLSID_DOMFreeThreadedDocument
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
const struct _GUID CLSID_DOMDocument
HRESULT DOMDocument_create(MSXML_VERSION version, void **ppObj)
Definition: domdoc.c:3727