Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
459c29ba
Commit
459c29ba
authored
Nov 24, 2010
by
Adam Martinson
Committed by
Alexandre Julliard
Nov 25, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msxml3: Store the DOMDocument/XMLSchemaCache object version.
parent
10e2d26e
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
100 additions
and
28 deletions
+100
-28
domdoc.c
dlls/msxml3/domdoc.c
+25
-11
factory.c
dlls/msxml3/factory.c
+1
-2
msxml_private.h
dlls/msxml3/msxml_private.h
+50
-1
schema.c
dlls/msxml3/schema.c
+24
-14
No files found.
dlls/msxml3/domdoc.c
View file @
459c29ba
...
...
@@ -75,6 +75,7 @@ static const WCHAR PropValueXSLPatternW[] = {'X','S','L','P','a','t','t','e','r'
* We need to preserve this when reloading a document,
* and also need access to it from the libxml backend. */
typedef
struct
_domdoc_properties
{
MSXML_VERSION
version
;
VARIANT_BOOL
preserving
;
IXMLDOMSchemaCollection2
*
schemaCache
;
struct
list
selectNsList
;
...
...
@@ -249,20 +250,31 @@ static domdoc_properties * create_properties(const GUID *clsid)
{
domdoc_properties
*
properties
=
heap_alloc
(
sizeof
(
domdoc_properties
));
list_init
(
&
properties
->
selectNsList
);
list_init
(
&
properties
->
selectNsList
);
properties
->
preserving
=
VARIANT_FALSE
;
properties
->
schemaCache
=
NULL
;
properties
->
selectNsStr
=
heap_alloc_zero
(
sizeof
(
xmlChar
));
properties
->
selectNsStr_len
=
0
;
/* properties that are dependent on object versions */
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument40
)
||
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument60
))
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument30
))
{
properties
->
version
=
MSXML3
;
properties
->
XPath
=
FALSE
;
}
else
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument40
))
{
properties
->
version
=
MSXML4
;
properties
->
XPath
=
TRUE
;
}
else
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument60
))
{
properties
->
version
=
MSXML6
;
properties
->
XPath
=
TRUE
;
}
else
{
properties
->
version
=
MSXML_DEFAULT
;
properties
->
XPath
=
FALSE
;
}
...
...
@@ -279,6 +291,7 @@ static domdoc_properties* copy_properties(domdoc_properties const* properties)
if
(
pcopy
)
{
pcopy
->
version
=
properties
->
version
;
pcopy
->
preserving
=
properties
->
preserving
;
pcopy
->
schemaCache
=
properties
->
schemaCache
;
pcopy
->
XPath
=
properties
->
XPath
;
...
...
@@ -630,33 +643,34 @@ static inline domdoc *impl_from_IConnectionPointContainer(IConnectionPointContai
static
HRESULT
WINAPI
domdoc_IPersistStreamInit_QueryInterface
(
IPersistStreamInit
*
iface
,
REFIID
riid
,
void
**
ppvObj
)
{
domdoc
*
t
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
2_QueryInterface
((
IXMLDOMDocument2
*
)
this
,
riid
,
ppvObj
);
domdoc
*
T
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
3_QueryInterface
((
IXMLDOMDocument3
*
)
&
This
->
lpVtbl
,
riid
,
ppvObj
);
}
static
ULONG
WINAPI
domdoc_IPersistStreamInit_AddRef
(
IPersistStreamInit
*
iface
)
{
domdoc
*
t
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
2_AddRef
((
IXMLDOMDocument2
*
)
this
);
domdoc
*
T
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
3_AddRef
((
IXMLDOMDocument3
*
)
&
This
->
lpVtbl
);
}
static
ULONG
WINAPI
domdoc_IPersistStreamInit_Release
(
IPersistStreamInit
*
iface
)
{
domdoc
*
t
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
2_Release
((
IXMLDOMDocument2
*
)
this
);
domdoc
*
T
his
=
impl_from_IPersistStreamInit
(
iface
);
return
IXMLDOMDocument
3_Release
((
IXMLDOMDocument3
*
)
&
This
->
lpVtbl
);
}
static
HRESULT
WINAPI
domdoc_IPersistStreamInit_GetClassID
(
IPersistStreamInit
*
iface
,
CLSID
*
classid
)
{
TRACE
(
"(%p,%p): stub!
\n
"
,
iface
,
classid
);
domdoc
*
This
=
impl_from_IPersistStreamInit
(
iface
);
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
classid
);
if
(
!
classid
)
return
E_POINTER
;
*
classid
=
CLSID_DOMDocument2
;
*
classid
=
*
DOMDocument_version
(
This
->
properties
->
version
)
;
return
S_OK
;
}
...
...
dlls/msxml3/factory.c
View file @
459c29ba
...
...
@@ -204,7 +204,6 @@ static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv
return
hres
;
}
static
ClassFactory
schemacf
=
{
&
ClassFactoryVtbl
,
SchemaCache_create
};
static
ClassFactory
xmldoccf
=
{
&
ClassFactoryVtbl
,
XMLDocument_create
};
static
ClassFactory
saxreadcf
=
{
&
ClassFactoryVtbl
,
SAXXMLReader_create
};
static
ClassFactory
httpreqcf
=
{
&
ClassFactoryVtbl
,
XMLHTTPRequest_create
};
...
...
@@ -231,7 +230,7 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
IsEqualCLSID
(
rclsid
,
&
CLSID_XMLSchemaCache40
)
||
IsEqualCLSID
(
rclsid
,
&
CLSID_XMLSchemaCache60
))
{
cf
=
(
IClassFactory
*
)
&
schemacf
.
lpVtbl
;
return
DOMClassFactory_Create
(
rclsid
,
riid
,
ppv
,
SchemaCache_create
)
;
}
else
if
(
IsEqualCLSID
(
rclsid
,
&
CLSID_XMLDocument
)
)
{
...
...
dlls/msxml3/msxml_private.h
View file @
459c29ba
...
...
@@ -29,6 +29,13 @@
# error You must include config.h to use this header
#endif
typedef
enum
{
MSXML_DEFAULT
=
0
,
MSXML3
=
30
,
MSXML4
=
40
,
MSXML6
=
60
}
MSXML_VERSION
;
/* typelibs */
typedef
enum
tid_t
{
IXMLDOMAttribute_tid
,
...
...
@@ -371,11 +378,53 @@ MAKE_FUNCPTR(xsltParseStylesheetDoc);
extern
IXMLDOMParseError
*
create_parseError
(
LONG
code
,
BSTR
url
,
BSTR
reason
,
BSTR
srcText
,
LONG
line
,
LONG
linepos
,
LONG
filepos
);
extern
HRESULT
DOMDocument_create
(
const
GUID
*
clsid
,
IUnknown
*
pUnkOuter
,
void
**
ppObj
);
extern
HRESULT
SchemaCache_create
(
IUnknown
*
pUnkOuter
,
void
**
pObj
);
extern
HRESULT
SchemaCache_create
(
const
GUID
*
clsid
,
IUnknown
*
pUnkOuter
,
void
**
p
pObj
);
extern
HRESULT
XMLDocument_create
(
IUnknown
*
pUnkOuter
,
void
**
pObj
);
extern
HRESULT
SAXXMLReader_create
(
IUnknown
*
pUnkOuter
,
void
**
pObj
);
extern
HRESULT
XMLHTTPRequest_create
(
IUnknown
*
pUnkOuter
,
void
**
pObj
);
static
inline
const
CLSID
*
DOMDocument_version
(
const
MSXML_VERSION
v
)
{
CLSID
const
*
clsid
;
switch
(
v
)
{
case
MSXML_DEFAULT
:
clsid
=
&
CLSID_DOMDocument
;
break
;
case
MSXML3
:
clsid
=
&
CLSID_DOMDocument30
;
break
;
case
MSXML4
:
clsid
=
&
CLSID_DOMDocument40
;
break
;
case
MSXML6
:
clsid
=
&
CLSID_DOMDocument60
;
break
;
}
return
clsid
;
}
static
inline
const
CLSID
*
SchemaCache_version
(
const
MSXML_VERSION
v
)
{
CLSID
const
*
clsid
;
switch
(
v
)
{
case
MSXML_DEFAULT
:
clsid
=
&
CLSID_XMLSchemaCache
;
break
;
case
MSXML3
:
clsid
=
&
CLSID_XMLSchemaCache30
;
break
;
case
MSXML4
:
clsid
=
&
CLSID_XMLSchemaCache40
;
break
;
case
MSXML6
:
clsid
=
&
CLSID_XMLSchemaCache60
;
break
;
}
return
clsid
;
}
typedef
struct
bsc_t
bsc_t
;
HRESULT
bind_url
(
LPCWSTR
,
HRESULT
(
*
onDataAvailable
)(
void
*
,
char
*
,
DWORD
),
void
*
,
bsc_t
**
);
...
...
dlls/msxml3/schema.c
View file @
459c29ba
...
...
@@ -85,6 +85,7 @@ typedef enum _SCHEMA_TYPE {
typedef
struct
_schema_cache
{
const
struct
IXMLDOMSchemaCollection2Vtbl
*
lpVtbl
;
MSXML_VERSION
version
;
xmlHashTablePtr
cache
;
LONG
ref
;
}
schema_cache
;
...
...
@@ -818,7 +819,7 @@ static BOOL link_datatypes(xmlDocPtr schema)
return
TRUE
;
}
static
cache_entry
*
cache_entry_from_xsd_doc
(
xmlDocPtr
doc
,
xmlChar
const
*
nsURI
)
static
cache_entry
*
cache_entry_from_xsd_doc
(
xmlDocPtr
doc
,
xmlChar
const
*
nsURI
,
MSXML_VERSION
v
)
{
cache_entry
*
entry
=
heap_alloc
(
sizeof
(
cache_entry
));
xmlSchemaParserCtxtPtr
spctx
;
...
...
@@ -834,7 +835,7 @@ static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc, xmlChar const* nsURI
if
((
entry
->
schema
=
Schema_parse
(
spctx
)))
{
xmldoc_init
(
entry
->
schema
->
doc
,
&
CLSID_DOMDocument40
);
xmldoc_init
(
entry
->
schema
->
doc
,
DOMDocument_version
(
v
)
);
entry
->
doc
=
entry
->
schema
->
doc
;
xmldoc_add_ref
(
entry
->
doc
);
}
...
...
@@ -849,7 +850,7 @@ static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc, xmlChar const* nsURI
return
entry
;
}
static
cache_entry
*
cache_entry_from_xdr_doc
(
xmlDocPtr
doc
,
xmlChar
const
*
nsURI
)
static
cache_entry
*
cache_entry_from_xdr_doc
(
xmlDocPtr
doc
,
xmlChar
const
*
nsURI
,
MSXML_VERSION
v
)
{
cache_entry
*
entry
=
heap_alloc
(
sizeof
(
cache_entry
));
xmlSchemaParserCtxtPtr
spctx
;
...
...
@@ -864,8 +865,8 @@ static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc, xmlChar const* nsURI
if
((
entry
->
schema
=
Schema_parse
(
spctx
)))
{
entry
->
doc
=
new_doc
;
xmldoc_init
(
entry
->
schema
->
doc
,
&
CLSID_DOMDocument30
);
xmldoc_init
(
entry
->
doc
,
&
CLSID_DOMDocument30
);
xmldoc_init
(
entry
->
schema
->
doc
,
DOMDocument_version
(
v
)
);
xmldoc_init
(
entry
->
doc
,
DOMDocument_version
(
v
)
);
xmldoc_add_ref
(
entry
->
doc
);
xmldoc_add_ref
(
entry
->
schema
->
doc
);
}
...
...
@@ -882,12 +883,12 @@ static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc, xmlChar const* nsURI
return
entry
;
}
static
cache_entry
*
cache_entry_from_url
(
VARIANT
url
,
xmlChar
const
*
nsURI
)
static
cache_entry
*
cache_entry_from_url
(
VARIANT
url
,
xmlChar
const
*
nsURI
,
MSXML_VERSION
v
)
{
cache_entry
*
entry
;
IXMLDOMDocument3
*
domdoc
=
NULL
;
xmlDocPtr
doc
=
NULL
;
HRESULT
hr
=
DOMDocument_create
(
&
CLSID_DOMDocument
,
NULL
,
(
void
**
)
&
domdoc
);
HRESULT
hr
=
DOMDocument_create
(
DOMDocument_version
(
v
)
,
NULL
,
(
void
**
)
&
domdoc
);
VARIANT_BOOL
b
=
VARIANT_FALSE
;
SCHEMA_TYPE
type
=
SCHEMA_TYPE_INVALID
;
...
...
@@ -916,10 +917,10 @@ static cache_entry* cache_entry_from_url(VARIANT url, xmlChar const* nsURI)
switch
(
type
)
{
case
SCHEMA_TYPE_XSD
:
entry
=
cache_entry_from_xsd_doc
(
doc
,
nsURI
);
entry
=
cache_entry_from_xsd_doc
(
doc
,
nsURI
,
v
);
break
;
case
SCHEMA_TYPE_XDR
:
entry
=
cache_entry_from_xdr_doc
(
doc
,
nsURI
);
entry
=
cache_entry_from_xdr_doc
(
doc
,
nsURI
,
v
);
break
;
case
SCHEMA_TYPE_INVALID
:
entry
=
NULL
;
...
...
@@ -1073,7 +1074,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri
case
VT_BSTR
:
{
cache_entry
*
entry
=
cache_entry_from_url
(
var
,
name
);
cache_entry
*
entry
=
cache_entry_from_url
(
var
,
name
,
This
->
version
);
if
(
entry
)
{
...
...
@@ -1111,11 +1112,11 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri
if
(
type
==
SCHEMA_TYPE_XSD
)
{
entry
=
cache_entry_from_xsd_doc
(
doc
,
name
);
entry
=
cache_entry_from_xsd_doc
(
doc
,
name
,
This
->
version
);
}
else
if
(
type
==
SCHEMA_TYPE_XDR
)
{
entry
=
cache_entry_from_xdr_doc
(
doc
,
name
);
entry
=
cache_entry_from_xdr_doc
(
doc
,
name
,
This
->
version
);
}
else
{
...
...
@@ -1405,7 +1406,7 @@ XDR_DT SchemaCache_get_node_dt(IXMLDOMSchemaCollection2* iface, xmlNodePtr node)
return
dt
;
}
HRESULT
SchemaCache_create
(
IUnknown
*
pUnkOuter
,
void
**
ppObj
)
HRESULT
SchemaCache_create
(
const
GUID
*
clsid
,
IUnknown
*
pUnkOuter
,
void
**
ppObj
)
{
schema_cache
*
This
=
heap_alloc
(
sizeof
(
schema_cache
));
if
(
!
This
)
...
...
@@ -1415,13 +1416,22 @@ HRESULT SchemaCache_create(IUnknown* pUnkOuter, void** ppObj)
This
->
cache
=
xmlHashCreate
(
DEFAULT_HASHTABLE_SIZE
);
This
->
ref
=
1
;
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_XMLSchemaCache30
))
This
->
version
=
MSXML3
;
else
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument40
))
This
->
version
=
MSXML4
;
else
if
(
IsEqualCLSID
(
clsid
,
&
CLSID_DOMDocument60
))
This
->
version
=
MSXML6
;
else
This
->
version
=
MSXML_DEFAULT
;
*
ppObj
=
&
This
->
lpVtbl
;
return
S_OK
;
}
#else
HRESULT
SchemaCache_create
(
IUnknown
*
pUnkOuter
,
void
**
ppObj
)
HRESULT
SchemaCache_create
(
const
GUID
*
clsid
,
IUnknown
*
pUnkOuter
,
void
**
ppObj
)
{
MESSAGE
(
"This program tried to use a SchemaCache object, but
\n
"
"libxml2 support was not present at compile time.
\n
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment