xmllite: Implement GetNamespaceUri().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
249b7a99a7
commit
13afa65fb1
|
@ -216,8 +216,10 @@ typedef struct
|
||||||
} strval;
|
} strval;
|
||||||
|
|
||||||
static WCHAR emptyW[] = {0};
|
static WCHAR emptyW[] = {0};
|
||||||
|
static WCHAR xmlW[] = {'x','m','l',0};
|
||||||
static WCHAR xmlnsW[] = {'x','m','l','n','s',0};
|
static WCHAR xmlnsW[] = {'x','m','l','n','s',0};
|
||||||
static const strval strval_empty = { emptyW };
|
static const strval strval_empty = { emptyW };
|
||||||
|
static const strval strval_xml = { xmlW, 3 };
|
||||||
static const strval strval_xmlns = { xmlnsW, 5 };
|
static const strval strval_xmlns = { xmlnsW, 5 };
|
||||||
|
|
||||||
struct attribute
|
struct attribute
|
||||||
|
@ -2881,14 +2883,105 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface,
|
static struct ns *reader_lookup_ns(xmlreader *reader, const strval *prefix)
|
||||||
LPCWSTR *namespaceUri,
|
|
||||||
UINT *namespaceUri_length)
|
|
||||||
{
|
{
|
||||||
FIXME("(%p %p %p): stub\n", iface, namespaceUri, namespaceUri_length);
|
struct list *nslist = prefix ? &reader->ns : &reader->nsdef;
|
||||||
|
struct ns *ns;
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY_REV(ns, nslist, struct ns, entry) {
|
||||||
|
if (strval_eq(reader, prefix, &ns->prefix))
|
||||||
|
return ns;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct ns *reader_lookup_nsdef(xmlreader *reader)
|
||||||
|
{
|
||||||
|
if (list_empty(&reader->nsdef))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return LIST_ENTRY(list_head(&reader->nsdef), struct ns, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI xmlreader_GetNamespaceUri(IXmlReader* iface, const WCHAR **uri, UINT *len)
|
||||||
|
{
|
||||||
|
xmlreader *This = impl_from_IXmlReader(iface);
|
||||||
|
const strval *prefix = &This->strvalues[StringValue_Prefix];
|
||||||
|
XmlNodeType nodetype;
|
||||||
|
struct ns *ns;
|
||||||
|
UINT length;
|
||||||
|
|
||||||
|
TRACE("(%p %p %p)\n", iface, uri, len);
|
||||||
|
|
||||||
|
if (!len)
|
||||||
|
len = &length;
|
||||||
|
|
||||||
|
*uri = NULL;
|
||||||
|
*len = 0;
|
||||||
|
|
||||||
|
switch ((nodetype = reader_get_nodetype(This)))
|
||||||
|
{
|
||||||
|
case XmlNodeType_Attribute:
|
||||||
|
{
|
||||||
|
static const WCHAR xmlns_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
|
||||||
|
'2','0','0','0','/','x','m','l','n','s','/',0};
|
||||||
|
static const WCHAR xml_uriW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','3','.','o','r','g','/',
|
||||||
|
'X','M','L','/','1','9','9','8','/','n','a','m','e','s','p','a','c','e',0};
|
||||||
|
const strval *local = &This->strvalues[StringValue_LocalName];
|
||||||
|
|
||||||
|
/* check for reserved prefixes first */
|
||||||
|
if ((strval_eq(This, prefix, &strval_empty) && strval_eq(This, local, &strval_xmlns)) ||
|
||||||
|
strval_eq(This, prefix, &strval_xmlns))
|
||||||
|
{
|
||||||
|
*uri = xmlns_uriW;
|
||||||
|
*len = sizeof(xmlns_uriW)/sizeof(xmlns_uriW[0]) - 1;
|
||||||
|
}
|
||||||
|
else if (strval_eq(This, prefix, &strval_xml)) {
|
||||||
|
*uri = xml_uriW;
|
||||||
|
*len = sizeof(xml_uriW)/sizeof(xml_uriW[0]) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*uri) {
|
||||||
|
ns = reader_lookup_ns(This, prefix);
|
||||||
|
if (ns) {
|
||||||
|
*uri = ns->uri.str;
|
||||||
|
*len = ns->uri.len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*uri = emptyW;
|
||||||
|
*len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case XmlNodeType_Element:
|
||||||
|
case XmlNodeType_EndElement:
|
||||||
|
{
|
||||||
|
ns = reader_lookup_ns(This, prefix);
|
||||||
|
|
||||||
|
/* pick top default ns if any */
|
||||||
|
if (!ns)
|
||||||
|
ns = reader_lookup_nsdef(This);
|
||||||
|
|
||||||
|
if (ns) {
|
||||||
|
*uri = ns->uri.str;
|
||||||
|
*len = ns->uri.len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*uri = emptyW;
|
||||||
|
*len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("Unhandled node type %d\n", nodetype);
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, UINT *len)
|
static HRESULT WINAPI xmlreader_GetLocalName(IXmlReader* iface, LPCWSTR *name, UINT *len)
|
||||||
{
|
{
|
||||||
xmlreader *This = impl_from_IXmlReader(iface);
|
xmlreader *This = impl_from_IXmlReader(iface);
|
||||||
|
|
Loading…
Reference in New Issue