Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Package registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lorenzo Ferrillo
wine
Commits
33a1f892
Commit
33a1f892
authored
12 years ago
by
Nikolay Sivov
Committed by
Alexandre Julliard
12 years ago
Browse files
Options
Downloads
Patches
Plain Diff
msxml3: Implement a common way to store and get callback interface pointers.
parent
2bff764d
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
dlls/msxml3/saxreader.c
+200
-333
200 additions, 333 deletions
dlls/msxml3/saxreader.c
dlls/msxml3/tests/saxreader.c
+12
-0
12 additions, 0 deletions
dlls/msxml3/tests/saxreader.c
with
212 additions
and
333 deletions
dlls/msxml3/saxreader.c
+
200
−
333
View file @
33a1f892
...
...
@@ -163,22 +163,48 @@ typedef struct
int
ns_count
;
}
element_entry
;
enum
saxhandler_type
{
SAXContentHandler
=
0
,
SAXDeclHandler
,
SAXDTDHandler
,
SAXErrorHandler
,
SAXLexicalHandler
,
SAXHandler_Last
};
struct
saxhandler_iface
{
IUnknown
*
handler
;
IUnknown
*
vbhandler
;
};
struct
saxcontenthandler_iface
{
ISAXContentHandler
*
handler
;
IVBSAXContentHandler
*
vbhandler
;
};
struct
saxerrorhandler_iface
{
ISAXErrorHandler
*
handler
;
IVBSAXErrorHandler
*
vbhandler
;
};
struct
saxlexicalhandler_iface
{
ISAXLexicalHandler
*
handler
;
IVBSAXLexicalHandler
*
vbhandler
;
};
typedef
struct
{
DispatchEx
dispex
;
IVBSAXXMLReader
IVBSAXXMLReader_iface
;
ISAXXMLReader
ISAXXMLReader_iface
;
LONG
ref
;
ISAXContentHandler
*
contentHandler
;
IVBSAXContentHandler
*
vbcontentHandler
;
ISAXErrorHandler
*
errorHandler
;
IVBSAXErrorHandler
*
vberrorHandler
;
ISAXLexicalHandler
*
lexicalHandler
;
IVBSAXLexicalHandler
*
vblexicalHandler
;
ISAXDeclHandler
*
declHandler
;
IVBSAXDeclHandler
*
vbdeclHandler
;
ISAXDTDHandler
*
dtdHandler
;
IVBSAXDTDHandler
*
vbdtdHandler
;
struct
saxhandler_iface
saxhandlers
[
SAXHandler_Last
];
xmlSAXHandler
sax
;
BOOL
isParsing
;
struct
bstrpool
pool
;
...
...
@@ -186,6 +212,59 @@ typedef struct
MSXML_VERSION
version
;
}
saxreader
;
static
HRESULT
saxreader_put_handler
(
saxreader
*
reader
,
enum
saxhandler_type
type
,
void
*
ptr
,
BOOL
vb
)
{
struct
saxhandler_iface
*
iface
=
&
reader
->
saxhandlers
[
type
];
IUnknown
*
unk
=
(
IUnknown
*
)
ptr
;
if
(
unk
)
IUnknown_AddRef
(
unk
);
if
((
vb
&&
iface
->
vbhandler
)
||
(
!
vb
&&
iface
->
handler
))
IUnknown_Release
(
vb
?
iface
->
vbhandler
:
iface
->
handler
);
if
(
vb
)
iface
->
vbhandler
=
unk
;
else
iface
->
handler
=
unk
;
return
S_OK
;
}
static
HRESULT
saxreader_get_handler
(
const
saxreader
*
reader
,
enum
saxhandler_type
type
,
BOOL
vb
,
void
**
ret
)
{
const
struct
saxhandler_iface
*
iface
=
&
reader
->
saxhandlers
[
type
];
if
(
!
ret
)
return
E_POINTER
;
if
((
vb
&&
iface
->
vbhandler
)
||
(
!
vb
&&
iface
->
handler
))
{
if
(
vb
)
IUnknown_AddRef
(
iface
->
vbhandler
);
else
IUnknown_AddRef
(
iface
->
handler
);
}
*
ret
=
vb
?
iface
->
vbhandler
:
iface
->
handler
;
return
S_OK
;
}
static
struct
saxcontenthandler_iface
*
saxreader_get_contenthandler
(
saxreader
*
reader
)
{
return
(
struct
saxcontenthandler_iface
*
)
&
reader
->
saxhandlers
[
SAXContentHandler
];
}
static
struct
saxerrorhandler_iface
*
saxreader_get_errorhandler
(
saxreader
*
reader
)
{
return
(
struct
saxerrorhandler_iface
*
)
&
reader
->
saxhandlers
[
SAXErrorHandler
];
}
static
struct
saxlexicalhandler_iface
*
saxreader_get_lexicalhandler
(
saxreader
*
reader
)
{
return
(
struct
saxlexicalhandler_iface
*
)
&
reader
->
saxhandlers
[
SAXLexicalHandler
];
}
typedef
struct
{
IVBSAXLocator
IVBSAXLocator_iface
;
...
...
@@ -317,20 +396,20 @@ static BOOL is_namespaces_enabled(const saxreader *reader)
static
inline
int
has_content_handler
(
const
saxlocator
*
locator
)
{
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
vbcontentH
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
contentH
andler
);
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXContentHandler
].
vbh
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXContentHandler
].
h
andler
);
}
static
inline
int
has_lexical_handler
(
const
saxlocator
*
locator
)
{
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
vblexicalH
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
lexicalH
andler
);
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXLexicalHandler
].
vbh
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXLexicalHandler
].
h
andler
);
}
static
inline
int
has_error_handler
(
const
saxlocator
*
locator
)
{
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
vberrorH
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
errorH
andler
);
return
(
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXErrorHandler
].
vbh
andler
)
||
(
!
locator
->
vbInterface
&&
locator
->
saxreader
->
saxhandlers
[
SAXErrorHandler
].
h
andler
);
}
static
BSTR
build_qname
(
BSTR
prefix
,
BSTR
local
)
...
...
@@ -556,6 +635,7 @@ static BSTR pooled_bstr_from_xmlCharN(struct bstrpool *pool, const xmlChar *buf,
static
void
format_error_message_from_id
(
saxlocator
*
This
,
HRESULT
hr
)
{
struct
saxerrorhandler_iface
*
handler
=
saxreader_get_errorhandler
(
This
->
saxreader
);
xmlStopParser
(
This
->
pParserCtxt
);
This
->
ret
=
hr
;
...
...
@@ -572,12 +652,12 @@ static void format_error_message_from_id(saxlocator *This, HRESULT hr)
if
(
This
->
vbInterface
)
{
BSTR
bstrMsg
=
SysAllocString
(
msg
);
IVBSAXErrorHandler_fatalError
(
This
->
saxreader
->
vberrorH
andler
,
IVBSAXErrorHandler_fatalError
(
handler
->
vbh
andler
,
&
This
->
IVBSAXLocator_iface
,
&
bstrMsg
,
hr
);
SysFreeString
(
bstrMsg
);
}
else
ISAXErrorHandler_fatalError
(
This
->
saxreader
->
errorH
andler
,
ISAXErrorHandler_fatalError
(
handler
->
h
andler
,
&
This
->
ISAXLocator_iface
,
msg
,
hr
);
}
}
...
...
@@ -1225,6 +1305,7 @@ static HRESULT SAXAttributes_populate(saxlocator *locator,
static
void
libxmlStartDocument
(
void
*
ctx
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
HRESULT
hr
;
if
(
This
->
saxreader
->
version
>=
MSXML4
)
...
...
@@ -1245,9 +1326,9 @@ static void libxmlStartDocument(void *ctx)
if
(
has_content_handler
(
This
))
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_startDocument
(
This
->
saxreader
->
vbcontentH
andler
);
hr
=
IVBSAXContentHandler_startDocument
(
handler
->
vbh
andler
);
else
hr
=
ISAXContentHandler_startDocument
(
This
->
saxreader
->
contentH
andler
);
hr
=
ISAXContentHandler_startDocument
(
handler
->
h
andler
);
if
(
sax_callback_failed
(
This
,
hr
))
format_error_message_from_id
(
This
,
hr
);
...
...
@@ -1257,6 +1338,7 @@ static void libxmlStartDocument(void *ctx)
static
void
libxmlEndDocument
(
void
*
ctx
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
HRESULT
hr
;
if
(
This
->
saxreader
->
version
>=
MSXML4
)
{
...
...
@@ -1274,9 +1356,9 @@ static void libxmlEndDocument(void *ctx)
if
(
has_content_handler
(
This
))
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_endDocument
(
This
->
saxreader
->
vbcontentH
andler
);
hr
=
IVBSAXContentHandler_endDocument
(
handler
->
vbh
andler
);
else
hr
=
ISAXContentHandler_endDocument
(
This
->
saxreader
->
contentH
andler
);
hr
=
ISAXContentHandler_endDocument
(
handler
->
h
andler
);
if
(
sax_callback_failed
(
This
,
hr
))
format_error_message_from_id
(
This
,
hr
);
...
...
@@ -1295,6 +1377,7 @@ static void libxmlStartElementNS(
const
xmlChar
**
attributes
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
element_entry
*
element
;
HRESULT
hr
=
S_OK
;
BSTR
uri
;
...
...
@@ -1316,12 +1399,12 @@ static void libxmlStartElementNS(
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_startPrefixMapping
(
This
->
saxreader
->
vbcontentH
andler
,
handler
->
vbh
andler
,
&
element
->
ns
[
i
].
prefix
,
&
element
->
ns
[
i
].
uri
);
else
hr
=
ISAXContentHandler_startPrefixMapping
(
This
->
saxreader
->
contentH
andler
,
handler
->
h
andler
,
element
->
ns
[
i
].
prefix
,
SysStringLen
(
element
->
ns
[
i
].
prefix
),
element
->
ns
[
i
].
uri
,
...
...
@@ -1347,10 +1430,10 @@ static void libxmlStartElementNS(
uri
=
local
=
NULL
;
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_startElement
(
This
->
saxreader
->
vbcontentH
andler
,
hr
=
IVBSAXContentHandler_startElement
(
handler
->
vbh
andler
,
&
uri
,
&
local
,
&
element
->
qname
,
&
This
->
IVBSAXAttributes_iface
);
else
hr
=
ISAXContentHandler_startElement
(
This
->
saxreader
->
contentH
andler
,
hr
=
ISAXContentHandler_startElement
(
handler
->
h
andler
,
uri
,
SysStringLen
(
uri
),
local
,
SysStringLen
(
local
),
element
->
qname
,
SysStringLen
(
element
->
qname
),
...
...
@@ -1368,6 +1451,7 @@ static void libxmlEndElementNS(
const
xmlChar
*
URI
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
element_entry
*
element
;
const
xmlChar
*
p
;
BSTR
uri
,
local
;
...
...
@@ -1418,11 +1502,11 @@ static void libxmlEndElementNS(
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_endElement
(
This
->
saxreader
->
vbcontentH
andler
,
handler
->
vbh
andler
,
&
uri
,
&
local
,
&
element
->
qname
);
else
hr
=
ISAXContentHandler_endElement
(
This
->
saxreader
->
contentH
andler
,
handler
->
h
andler
,
uri
,
SysStringLen
(
uri
),
local
,
SysStringLen
(
local
),
element
->
qname
,
SysStringLen
(
element
->
qname
));
...
...
@@ -1443,11 +1527,10 @@ static void libxmlEndElementNS(
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_endPrefixMapping
(
This
->
saxreader
->
vbcontentH
andler
,
&
element
->
ns
[
i
].
prefix
);
handler
->
vbh
andler
,
&
element
->
ns
[
i
].
prefix
);
else
hr
=
ISAXContentHandler_endPrefixMapping
(
This
->
saxreader
->
contentHandler
,
element
->
ns
[
i
].
prefix
,
SysStringLen
(
element
->
ns
[
i
].
prefix
));
handler
->
handler
,
element
->
ns
[
i
].
prefix
,
SysStringLen
(
element
->
ns
[
i
].
prefix
));
if
(
sax_callback_failed
(
This
,
hr
))
break
;
}
...
...
@@ -1465,6 +1548,7 @@ static void libxmlCharacters(
int
len
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
BSTR
Chars
;
HRESULT
hr
;
xmlChar
*
cur
,
*
end
;
...
...
@@ -1524,12 +1608,9 @@ static void libxmlCharacters(
Chars
=
pooled_bstr_from_xmlCharN
(
&
This
->
saxreader
->
pool
,
cur
,
end
-
cur
);
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_characters
(
This
->
saxreader
->
vbcontentHandler
,
&
Chars
);
hr
=
IVBSAXContentHandler_characters
(
handler
->
vbhandler
,
&
Chars
);
else
hr
=
ISAXContentHandler_characters
(
This
->
saxreader
->
contentHandler
,
Chars
,
SysStringLen
(
Chars
));
hr
=
ISAXContentHandler_characters
(
handler
->
handler
,
Chars
,
SysStringLen
(
Chars
));
if
(
sax_callback_failed
(
This
,
hr
))
{
...
...
@@ -1560,16 +1641,16 @@ static void libxmlSetDocumentLocator(
xmlSAXLocatorPtr
loc
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
handler
=
saxreader_get_contenthandler
(
This
->
saxreader
);
HRESULT
hr
=
S_OK
;
if
(
has_content_handler
(
This
))
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_putref_documentLocator
(
This
->
saxreader
->
vbcontentH
andler
,
hr
=
IVBSAXContentHandler_putref_documentLocator
(
handler
->
vbh
andler
,
&
This
->
IVBSAXLocator_iface
);
else
hr
=
ISAXContentHandler_putDocumentLocator
(
This
->
saxreader
->
contentHandler
,
&
This
->
ISAXLocator_iface
);
hr
=
ISAXContentHandler_putDocumentLocator
(
handler
->
handler
,
&
This
->
ISAXLocator_iface
);
}
if
(
FAILED
(
hr
))
...
...
@@ -1579,6 +1660,7 @@ static void libxmlSetDocumentLocator(
static
void
libxmlComment
(
void
*
ctx
,
const
xmlChar
*
value
)
{
saxlocator
*
This
=
ctx
;
struct
saxlexicalhandler_iface
*
handler
=
saxreader_get_lexicalhandler
(
This
->
saxreader
);
BSTR
bValue
;
HRESULT
hr
;
const
xmlChar
*
p
=
This
->
pParserCtxt
->
input
->
cur
;
...
...
@@ -1600,13 +1682,10 @@ static void libxmlComment(void *ctx, const xmlChar *value)
bValue
=
pooled_bstr_from_xmlChar
(
&
This
->
saxreader
->
pool
,
value
);
if
(
This
->
vbInterface
)
hr
=
IVBSAXLexicalHandler_comment
(
This
->
saxreader
->
vblexicalHandler
,
&
bValue
);
if
(
This
->
vbInterface
)
hr
=
IVBSAXLexicalHandler_comment
(
handler
->
vbhandler
,
&
bValue
);
else
hr
=
ISAXLexicalHandler_comment
(
This
->
saxreader
->
lexicalHandler
,
bValue
,
SysStringLen
(
bValue
));
hr
=
ISAXLexicalHandler_comment
(
handler
->
handler
,
bValue
,
SysStringLen
(
bValue
));
if
(
FAILED
(
hr
))
format_error_message_from_id
(
This
,
hr
);
...
...
@@ -1615,6 +1694,7 @@ static void libxmlComment(void *ctx, const xmlChar *value)
static
void
libxmlFatalError
(
void
*
ctx
,
const
char
*
msg
,
...)
{
saxlocator
*
This
=
ctx
;
struct
saxerrorhandler_iface
*
handler
=
saxreader_get_errorhandler
(
This
->
saxreader
);
char
message
[
1024
];
WCHAR
*
error
;
DWORD
len
;
...
...
@@ -1650,13 +1730,12 @@ static void libxmlFatalError(void *ctx, const char *msg, ...)
if
(
This
->
vbInterface
)
{
BSTR
bstrError
=
SysAllocString
(
error
);
IVBSAXErrorHandler_fatalError
(
This
->
saxreader
->
vberrorH
andler
,
&
This
->
IVBSAXLocator_iface
,
IVBSAXErrorHandler_fatalError
(
handler
->
vbh
andler
,
&
This
->
IVBSAXLocator_iface
,
&
bstrError
,
E_FAIL
);
SysFreeString
(
bstrError
);
}
else
ISAXErrorHandler_fatalError
(
This
->
saxreader
->
errorHandler
,
&
This
->
ISAXLocator_iface
,
error
,
E_FAIL
);
ISAXErrorHandler_fatalError
(
handler
->
handler
,
&
This
->
ISAXLocator_iface
,
error
,
E_FAIL
);
heap_free
(
error
);
...
...
@@ -1667,6 +1746,8 @@ static void libxmlFatalError(void *ctx, const char *msg, ...)
static
void
libxmlCDataBlock
(
void
*
ctx
,
const
xmlChar
*
value
,
int
len
)
{
saxlocator
*
This
=
ctx
;
struct
saxcontenthandler_iface
*
content
=
saxreader_get_contenthandler
(
This
->
saxreader
);
struct
saxlexicalhandler_iface
*
lexical
=
saxreader_get_lexicalhandler
(
This
->
saxreader
);
HRESULT
hr
=
S_OK
;
xmlChar
*
beg
=
(
xmlChar
*
)
This
->
pParserCtxt
->
input
->
cur
-
len
;
xmlChar
*
cur
,
*
end
;
...
...
@@ -1689,9 +1770,9 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
if
(
has_lexical_handler
(
This
))
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXLexicalHandler_startCDATA
(
This
->
saxreader
->
vb
lexical
H
andler
);
hr
=
IVBSAXLexicalHandler_startCDATA
(
lexical
->
vbh
andler
);
else
hr
=
ISAXLexicalHandler_startCDATA
(
This
->
saxreader
->
lexical
H
andler
);
hr
=
ISAXLexicalHandler_startCDATA
(
lexical
->
h
andler
);
}
if
(
FAILED
(
hr
))
...
...
@@ -1720,16 +1801,13 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
if
(
change
)
*
end
=
'\n'
;
if
(
has_content_handler
(
This
))
if
(
has_content_handler
(
This
))
{
Chars
=
pooled_bstr_from_xmlCharN
(
&
This
->
saxreader
->
pool
,
cur
,
end
-
cur
+
1
);
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_characters
(
This
->
saxreader
->
vbcontentHandler
,
&
Chars
);
if
(
This
->
vbInterface
)
hr
=
IVBSAXContentHandler_characters
(
content
->
vbhandler
,
&
Chars
);
else
hr
=
ISAXContentHandler_characters
(
This
->
saxreader
->
contentHandler
,
Chars
,
SysStringLen
(
Chars
));
hr
=
ISAXContentHandler_characters
(
content
->
handler
,
Chars
,
SysStringLen
(
Chars
));
}
if
(
change
)
*
end
=
'\r'
;
...
...
@@ -1745,9 +1823,9 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
if
(
has_lexical_handler
(
This
))
{
if
(
This
->
vbInterface
)
hr
=
IVBSAXLexicalHandler_endCDATA
(
This
->
saxreader
->
vb
lexical
H
andler
);
hr
=
IVBSAXLexicalHandler_endCDATA
(
lexical
->
vbh
andler
);
else
hr
=
ISAXLexicalHandler_endCDATA
(
This
->
saxreader
->
lexical
H
andler
);
hr
=
ISAXLexicalHandler_endCDATA
(
lexical
->
h
andler
);
}
if
(
FAILED
(
hr
))
...
...
@@ -2308,154 +2386,6 @@ static HRESULT internal_putEntityResolver(
return
E_NOTIMPL
;
}
static
HRESULT
internal_getContentHandler
(
saxreader
*
This
,
void
*
pContentHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
pContentHandler
);
if
(
pContentHandler
==
NULL
)
return
E_POINTER
;
if
((
vbInterface
&&
This
->
vbcontentHandler
)
||
(
!
vbInterface
&&
This
->
contentHandler
))
{
if
(
vbInterface
)
IVBSAXContentHandler_AddRef
(
This
->
vbcontentHandler
);
else
ISAXContentHandler_AddRef
(
This
->
contentHandler
);
}
if
(
vbInterface
)
*
(
IVBSAXContentHandler
**
)
pContentHandler
=
This
->
vbcontentHandler
;
else
*
(
ISAXContentHandler
**
)
pContentHandler
=
This
->
contentHandler
;
return
S_OK
;
}
static
HRESULT
internal_putContentHandler
(
saxreader
*
This
,
void
*
contentHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
contentHandler
);
if
(
contentHandler
)
{
if
(
vbInterface
)
IVBSAXContentHandler_AddRef
((
IVBSAXContentHandler
*
)
contentHandler
);
else
ISAXContentHandler_AddRef
((
ISAXContentHandler
*
)
contentHandler
);
}
if
((
vbInterface
&&
This
->
vbcontentHandler
)
||
(
!
vbInterface
&&
This
->
contentHandler
))
{
if
(
vbInterface
)
IVBSAXContentHandler_Release
(
This
->
vbcontentHandler
);
else
ISAXContentHandler_Release
(
This
->
contentHandler
);
}
if
(
vbInterface
)
This
->
vbcontentHandler
=
contentHandler
;
else
This
->
contentHandler
=
contentHandler
;
return
S_OK
;
}
static
HRESULT
internal_getDTDHandler
(
saxreader
*
This
,
void
*
dtdHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
dtdHandler
);
if
(
!
dtdHandler
)
return
E_POINTER
;
if
((
vbInterface
&&
This
->
vbdtdHandler
)
||
(
!
vbInterface
&&
This
->
dtdHandler
))
{
if
(
vbInterface
)
IVBSAXContentHandler_AddRef
(
This
->
vbdtdHandler
);
else
ISAXContentHandler_AddRef
(
This
->
dtdHandler
);
}
if
(
vbInterface
)
*
(
IVBSAXDTDHandler
**
)
dtdHandler
=
This
->
vbdtdHandler
;
else
*
(
ISAXDTDHandler
**
)
dtdHandler
=
This
->
dtdHandler
;
return
S_OK
;
}
static
HRESULT
internal_putDTDHandler
(
saxreader
*
This
,
void
*
dtdHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
dtdHandler
);
if
(
dtdHandler
)
{
if
(
vbInterface
)
IVBSAXDTDHandler_AddRef
((
IVBSAXDTDHandler
*
)
dtdHandler
);
else
ISAXDTDHandler_AddRef
((
ISAXDTDHandler
*
)
dtdHandler
);
}
if
((
vbInterface
&&
This
->
vbdtdHandler
)
||
(
!
vbInterface
&&
This
->
dtdHandler
))
{
if
(
vbInterface
)
IVBSAXDTDHandler_Release
(
This
->
vbdtdHandler
);
else
ISAXDTDHandler_Release
(
This
->
dtdHandler
);
}
if
(
vbInterface
)
This
->
vbdtdHandler
=
dtdHandler
;
else
This
->
dtdHandler
=
dtdHandler
;
return
S_OK
;
}
static
HRESULT
internal_getErrorHandler
(
saxreader
*
This
,
void
*
pErrorHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
pErrorHandler
);
if
(
pErrorHandler
==
NULL
)
return
E_POINTER
;
if
(
vbInterface
&&
This
->
vberrorHandler
)
IVBSAXErrorHandler_AddRef
(
This
->
vberrorHandler
);
else
if
(
!
vbInterface
&&
This
->
errorHandler
)
ISAXErrorHandler_AddRef
(
This
->
errorHandler
);
if
(
vbInterface
)
*
(
IVBSAXErrorHandler
**
)
pErrorHandler
=
This
->
vberrorHandler
;
else
*
(
ISAXErrorHandler
**
)
pErrorHandler
=
This
->
errorHandler
;
return
S_OK
;
}
static
HRESULT
internal_putErrorHandler
(
saxreader
*
This
,
void
*
errorHandler
,
BOOL
vbInterface
)
{
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
errorHandler
);
if
(
errorHandler
)
{
if
(
vbInterface
)
IVBSAXErrorHandler_AddRef
((
IVBSAXErrorHandler
*
)
errorHandler
);
else
ISAXErrorHandler_AddRef
((
ISAXErrorHandler
*
)
errorHandler
);
}
if
(
vbInterface
&&
This
->
vberrorHandler
)
IVBSAXErrorHandler_Release
(
This
->
vberrorHandler
);
else
if
(
!
vbInterface
&&
This
->
errorHandler
)
ISAXErrorHandler_Release
(
This
->
errorHandler
);
if
(
vbInterface
)
This
->
vberrorHandler
=
errorHandler
;
else
This
->
errorHandler
=
errorHandler
;
return
S_OK
;
}
static
HRESULT
internal_parse
(
saxreader
*
This
,
VARIANT
varInput
,
...
...
@@ -2598,43 +2528,27 @@ static HRESULT internal_putProperty(
switch
(
V_VT
(
&
value
))
{
case
VT_EMPTY
:
if
(
vbInterface
)
{
if
(
This
->
vbdeclHandler
)
{
IVBSAXDeclHandler_Release
(
This
->
vbdeclHandler
);
This
->
vbdeclHandler
=
NULL
;
}
}
else
if
(
This
->
declHandler
)
{
ISAXDeclHandler_Release
(
This
->
declHandler
);
This
->
declHandler
=
NULL
;
}
saxreader_put_handler
(
This
,
SAXDeclHandler
,
NULL
,
vbInterface
);
break
;
case
VT_UNKNOWN
:
if
((
vbInterface
&&
This
->
vbdeclHandler
)
||
(
!
vbInterface
&&
This
->
declHandler
))
{
IUnknown
*
handler
=
NULL
;
if
(
V_UNKNOWN
(
&
value
))
{
HRESULT
hr
;
if
(
vbInterface
)
IVBSAXDeclHandler_Release
(
This
->
vbdeclH
andler
);
hr
=
IUnknown_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_IVBSAXDeclHandler
,
(
void
**
)
&
h
andler
);
else
ISAXDeclHandler_Release
(
This
->
declHandler
);
hr
=
IUnknown_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_ISAXDeclHandler
,
(
void
**
)
&
handler
);
if
(
FAILED
(
hr
))
return
hr
;
}
if
(
V_UNKNOWN
(
&
value
))
{
return
vbInterface
?
IVBSAXDeclHandler_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_IVBSAXDeclHandler
,
(
void
**
)
&
This
->
vbdeclHandler
)
:
ISAXDeclHandler_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_ISAXDeclHandler
,
(
void
**
)
&
This
->
declHandler
);
}
else
{
This
->
vbdeclHandler
=
NULL
;
This
->
declHandler
=
NULL
;
}
saxreader_put_handler
(
This
,
SAXDeclHandler
,
handler
,
vbInterface
);
if
(
handler
)
IUnknown_Release
(
handler
);
break
;
}
default:
return
E_INVALIDARG
;
}
...
...
@@ -2649,44 +2563,27 @@ static HRESULT internal_putProperty(
switch
(
V_VT
(
&
value
))
{
case
VT_EMPTY
:
if
(
vbInterface
)
{
if
(
This
->
vblexicalHandler
)
{
IVBSAXLexicalHandler_Release
(
This
->
vblexicalHandler
);
This
->
vblexicalHandler
=
NULL
;
}
}
else
if
(
This
->
lexicalHandler
)
{
ISAXLexicalHandler_Release
(
This
->
lexicalHandler
);
This
->
lexicalHandler
=
NULL
;
}
saxreader_put_handler
(
This
,
SAXLexicalHandler
,
NULL
,
vbInterface
);
break
;
case
VT_UNKNOWN
:
if
((
vbInterface
&&
This
->
vblexicalHandler
)
||
(
!
vbInterface
&&
This
->
lexicalHandler
))
{
if
(
vbInterface
)
IVBSAXLexicalHandler_Release
(
This
->
vblexicalHandler
);
else
ISAXLexicalHandler_Release
(
This
->
lexicalHandler
);
}
{
IUnknown
*
handler
=
NULL
;
if
(
V_UNKNOWN
(
&
value
))
{
return
vbInterface
?
IVBSAXLexicalHandler_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_IVBSAXLexicalHandler
,
(
void
**
)
&
This
->
vblexicalHandler
)
:
ISAXLexicalHandler_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_ISAXLexicalHandler
,
(
void
**
)
&
This
->
lexicalHandler
);
}
else
{
This
->
vblexicalHandler
=
NULL
;
This
->
lexicalHandler
=
NULL
;
HRESULT
hr
;
if
(
vbInterface
)
hr
=
IUnknown_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_IVBSAXLexicalHandler
,
(
void
**
)
&
handler
);
else
hr
=
IUnknown_QueryInterface
(
V_UNKNOWN
(
&
value
),
&
IID_ISAXLexicalHandler
,
(
void
**
)
&
handler
);
if
(
FAILED
(
hr
))
return
hr
;
}
saxreader_put_handler
(
This
,
SAXLexicalHandler
,
handler
,
vbInterface
);
if
(
handler
)
IUnknown_Release
(
handler
);
break
;
}
default:
return
E_INVALIDARG
;
}
...
...
@@ -2743,16 +2640,14 @@ static HRESULT internal_getProperty(const saxreader* This, const WCHAR *prop, VA
if
(
!
memcmp
(
PropertyLexicalHandlerW
,
prop
,
sizeof
(
PropertyLexicalHandlerW
)))
{
V_VT
(
value
)
=
VT_UNKNOWN
;
V_UNKNOWN
(
value
)
=
vb
?
(
IUnknown
*
)
This
->
vblexicalHandler
:
(
IUnknown
*
)
This
->
lexicalHandler
;
if
(
V_UNKNOWN
(
value
))
IUnknown_AddRef
(
V_UNKNOWN
(
value
));
saxreader_get_handler
(
This
,
SAXLexicalHandler
,
vb
,
(
void
**
)
&
V_UNKNOWN
(
value
));
return
S_OK
;
}
if
(
!
memcmp
(
PropertyDeclHandlerW
,
prop
,
sizeof
(
PropertyDeclHandlerW
)))
{
V_VT
(
value
)
=
VT_UNKNOWN
;
V_UNKNOWN
(
value
)
=
vb
?
(
IUnknown
*
)
This
->
vbdeclHandler
:
(
IUnknown
*
)
This
->
declHandler
;
if
(
V_UNKNOWN
(
value
))
IUnknown_AddRef
(
V_UNKNOWN
(
value
));
saxreader_get_handler
(
This
,
SAXDeclHandler
,
vb
,
(
void
**
)
&
V_UNKNOWN
(
value
));
return
S_OK
;
}
...
...
@@ -2814,35 +2709,18 @@ static ULONG WINAPI saxxmlreader_Release(
ref
=
InterlockedDecrement
(
&
This
->
ref
);
if
(
ref
==
0
)
{
if
(
This
->
contentHandler
)
ISAXContentHandler_Release
(
This
->
contentHandler
);
if
(
This
->
vbcontentHandler
)
IVBSAXContentHandler_Release
(
This
->
vbcontentHandler
);
if
(
This
->
errorHandler
)
ISAXErrorHandler_Release
(
This
->
errorHandler
);
if
(
This
->
vberrorHandler
)
IVBSAXErrorHandler_Release
(
This
->
vberrorHandler
);
if
(
This
->
lexicalHandler
)
ISAXLexicalHandler_Release
(
This
->
lexicalHandler
);
if
(
This
->
vblexicalHandler
)
IVBSAXLexicalHandler_Release
(
This
->
vblexicalHandler
);
if
(
This
->
declHandler
)
ISAXDeclHandler_Release
(
This
->
declHandler
);
int
i
;
if
(
This
->
vbdeclHandler
)
IVBSAXDeclHandler_Release
(
This
->
vbdeclHandler
);
for
(
i
=
0
;
i
<
SAXHandler_Last
;
i
++
)
{
struct
saxhandler_iface
*
iface
=
&
This
->
saxhandlers
[
i
];
if
(
This
->
dtdH
andler
)
ISAXDTDHandler_Release
(
This
->
dtdH
andler
);
if
(
iface
->
h
andler
)
IUnknown_Release
(
iface
->
h
andler
);
if
(
This
->
vbdtdHandler
)
IVBSAXDTDHandler_Release
(
This
->
vbdtdHandler
);
if
(
iface
->
vbhandler
)
IUnknown_Release
(
iface
->
vbhandler
);
}
free_bstr_pool
(
&
This
->
pool
);
...
...
@@ -2983,50 +2861,50 @@ static HRESULT WINAPI saxxmlreader_put_entityResolver(
static
HRESULT
WINAPI
saxxmlreader_get_contentHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXContentHandler
**
ppContentH
andler
)
IVBSAXContentHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_getContentH
andler
(
This
,
pp
ContentHandler
,
TRUE
);
return
saxreader_get_h
andler
(
This
,
SAX
ContentHandler
,
TRUE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
saxxmlreader_put_contentHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXContentHandler
*
contentH
andler
)
IVBSAXContentHandler
*
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_putContentH
andler
(
This
,
c
ontentHandler
,
TRUE
);
return
saxreader_put_h
andler
(
This
,
SAXC
ontentHandler
,
handler
,
TRUE
);
}
static
HRESULT
WINAPI
saxxmlreader_get_dtdHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXDTDHandler
**
pDTDH
andler
)
IVBSAXDTDHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_getDTDH
andler
(
This
,
p
DTDHandler
,
TRUE
);
return
saxreader_get_h
andler
(
This
,
SAX
DTDHandler
,
TRUE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
saxxmlreader_put_dtdHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXDTDHandler
*
pDTDH
andler
)
IVBSAXDTDHandler
*
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_putDTDH
andler
(
This
,
p
DTDHandler
,
TRUE
);
return
saxreader_put_h
andler
(
This
,
SAX
DTDHandler
,
handler
,
TRUE
);
}
static
HRESULT
WINAPI
saxxmlreader_get_errorHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXErrorHandler
**
pErrorH
andler
)
IVBSAXErrorHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_getErrorH
andler
(
This
,
p
ErrorHandler
,
TRUE
);
return
saxreader_get_h
andler
(
This
,
SAX
ErrorHandler
,
TRUE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
saxxmlreader_put_errorHandler
(
IVBSAXXMLReader
*
iface
,
IVBSAXErrorHandler
*
errorH
andler
)
IVBSAXErrorHandler
*
h
andler
)
{
saxreader
*
This
=
impl_from_IVBSAXXMLReader
(
iface
);
return
internal_putErrorH
andler
(
This
,
e
rrorHandler
,
TRUE
);
return
saxreader_put_h
andler
(
This
,
SAXE
rrorHandler
,
handler
,
TRUE
);
}
static
HRESULT
WINAPI
saxxmlreader_get_baseURL
(
...
...
@@ -3190,50 +3068,48 @@ static HRESULT WINAPI isaxxmlreader_putEntityResolver(
static
HRESULT
WINAPI
isaxxmlreader_getContentHandler
(
ISAXXMLReader
*
iface
,
ISAXContentHandler
**
pContentH
andler
)
ISAXContentHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_getContentH
andler
(
This
,
p
ContentHandler
,
FALSE
);
return
saxreader_get_h
andler
(
This
,
SAX
ContentHandler
,
FALSE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
isaxxmlreader_putContentHandler
(
ISAXXMLReader
*
iface
,
ISAXContentHandler
*
contentH
andler
)
ISAXXMLReader
*
iface
,
ISAXContentHandler
*
h
andler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_putContentH
andler
(
This
,
c
ontentHandler
,
FALSE
);
return
saxreader_put_h
andler
(
This
,
SAXC
ontentHandler
,
handler
,
FALSE
);
}
static
HRESULT
WINAPI
isaxxmlreader_getDTDHandler
(
ISAXXMLReader
*
iface
,
ISAXDTDHandler
**
pDTDH
andler
)
ISAXDTDHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_getDTDH
andler
(
This
,
p
DTDHandler
,
FALSE
);
return
saxreader_get_h
andler
(
This
,
SAX
DTDHandler
,
FALSE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
isaxxmlreader_putDTDHandler
(
ISAXXMLReader
*
iface
,
ISAXDTDHandler
*
pDTDH
andler
)
ISAXDTDHandler
*
h
andler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_putDTDH
andler
(
This
,
p
DTDHandler
,
FALSE
);
return
saxreader_put_h
andler
(
This
,
SAX
DTDHandler
,
handler
,
FALSE
);
}
static
HRESULT
WINAPI
isaxxmlreader_getErrorHandler
(
ISAXXMLReader
*
iface
,
ISAXErrorHandler
**
pErrorH
andler
)
ISAXErrorHandler
**
h
andler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_getErrorH
andler
(
This
,
p
ErrorHandler
,
FALSE
);
return
saxreader_get_h
andler
(
This
,
SAX
ErrorHandler
,
FALSE
,
(
void
**
)
handler
);
}
static
HRESULT
WINAPI
isaxxmlreader_putErrorHandler
(
ISAXXMLReader
*
iface
,
ISAXErrorHandler
*
errorHandler
)
static
HRESULT
WINAPI
isaxxmlreader_putErrorHandler
(
ISAXXMLReader
*
iface
,
ISAXErrorHandler
*
handler
)
{
saxreader
*
This
=
impl_from_ISAXXMLReader
(
iface
);
return
internal_putErrorH
andler
(
This
,
e
rrorHandler
,
FALSE
);
return
saxreader_put_h
andler
(
This
,
SAXE
rrorHandler
,
handler
,
FALSE
);
}
static
HRESULT
WINAPI
isaxxmlreader_getBaseURL
(
...
...
@@ -3333,16 +3209,7 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, IUnknown *outer, LPVOID *ppOb
reader
->
IVBSAXXMLReader_iface
.
lpVtbl
=
&
VBSAXXMLReaderVtbl
;
reader
->
ISAXXMLReader_iface
.
lpVtbl
=
&
SAXXMLReaderVtbl
;
reader
->
ref
=
1
;
reader
->
contentHandler
=
NULL
;
reader
->
vbcontentHandler
=
NULL
;
reader
->
errorHandler
=
NULL
;
reader
->
vberrorHandler
=
NULL
;
reader
->
lexicalHandler
=
NULL
;
reader
->
vblexicalHandler
=
NULL
;
reader
->
declHandler
=
NULL
;
reader
->
vbdeclHandler
=
NULL
;
reader
->
dtdHandler
=
NULL
;
reader
->
vbdtdHandler
=
NULL
;
memset
(
reader
->
saxhandlers
,
0
,
sizeof
(
reader
->
saxhandlers
));
reader
->
isParsing
=
FALSE
;
reader
->
pool
.
pool
=
NULL
;
reader
->
pool
.
index
=
0
;
...
...
This diff is collapsed.
Click to expand it.
dlls/msxml3/tests/saxreader.c
+
12
−
0
View file @
33a1f892
...
...
@@ -2332,6 +2332,11 @@ static void test_saxreader_properties(void)
ok
(
V_UNKNOWN
(
&
v
)
==
NULL
,
"got %p
\n
"
,
V_UNKNOWN
(
&
v
));
/* block QueryInterface on handler riid */
V_VT
(
&
v
)
=
VT_UNKNOWN
;
V_UNKNOWN
(
&
v
)
=
ptr
->
iface
;
hr
=
ISAXXMLReader_putProperty
(
reader
,
_bstr_
(
ptr
->
prop_name
),
v
);
EXPECT_HR
(
hr
,
S_OK
);
init_saxlexicalhandler
(
&
lexicalhandler
,
E_NOINTERFACE
);
init_saxdeclhandler
(
&
declhandler
,
E_NOINTERFACE
);
...
...
@@ -2343,6 +2348,13 @@ static void test_saxreader_properties(void)
EXPECT_HR
(
hr
,
E_NOINTERFACE
);
EXPECT_REF
(
ptr
->
iface
,
1
);
V_VT
(
&
v
)
=
VT_EMPTY
;
V_UNKNOWN
(
&
v
)
=
(
IUnknown
*
)
0xdeadbeef
;
hr
=
ISAXXMLReader_getProperty
(
reader
,
_bstr_
(
ptr
->
prop_name
),
&
v
);
EXPECT_HR
(
hr
,
S_OK
);
ok
(
V_VT
(
&
v
)
==
VT_UNKNOWN
,
"got %d
\n
"
,
V_VT
(
&
v
));
ok
(
V_UNKNOWN
(
&
v
)
!=
NULL
,
"got %p
\n
"
,
V_UNKNOWN
(
&
v
));
ptr
++
;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment