msxml3: Return QNames properly.

This commit is contained in:
Piotr Caban 2008-08-03 14:37:37 +02:00 committed by Alexandre Julliard
parent ef647c9ad9
commit 319d86c733
1 changed files with 36 additions and 25 deletions

View File

@ -81,7 +81,6 @@ typedef struct _saxattributes
LONG ref;
int nb_attributes;
BSTR *szLocalname;
BSTR *szPrefix;
BSTR *szURI;
BSTR *szValue;
BSTR *szQName;
@ -118,7 +117,7 @@ static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
}
BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
{
DWORD dLen;
LPWSTR str;
@ -140,6 +139,33 @@ BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
return bstr;
}
static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
{
DWORD dLen, dLast;
LPWSTR str;
BSTR bstr;
if(!name) return NULL;
if(!prefix || *prefix=='\0')
return bstr_from_xmlChar(name);
dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, NULL, 0)
+ MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
str = HeapAlloc(GetProcessHeap(), 0, dLen * sizeof(WCHAR));
if(!str)
return NULL;
dLast = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, str, dLen);
str[dLast-1] = ':';
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, &str[dLast], dLen-dLast);
bstr = SysAllocString(str);
HeapFree(GetProcessHeap(), 0, str);
return bstr;
}
static void format_error_message_from_id(saxlocator *This, HRESULT hr)
{
xmlStopParser(This->pParserCtxt);
@ -551,15 +577,15 @@ static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
for(index=0; index<This->nb_attributes; index++)
{
SysFreeString(This->szLocalname[index]);
SysFreeString(This->szPrefix[index]);
SysFreeString(This->szURI[index]);
SysFreeString(This->szValue[index]);
SysFreeString(This->szQName[index]);
}
HeapFree(GetProcessHeap(), 0, This->szLocalname);
HeapFree(GetProcessHeap(), 0, This->szPrefix);
HeapFree(GetProcessHeap(), 0, This->szURI);
HeapFree(GetProcessHeap(), 0, This->szValue);
HeapFree(GetProcessHeap(), 0, This->szQName);
HeapFree(GetProcessHeap(), 0, This);
}
@ -793,8 +819,6 @@ static HRESULT SAXAttributes_create(saxattributes **attr,
attributes->szLocalname =
HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
attributes->szPrefix =
HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
attributes->szURI =
HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
attributes->szValue =
@ -802,12 +826,10 @@ static HRESULT SAXAttributes_create(saxattributes **attr,
attributes->szQName =
HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
if(!attributes->szLocalname || !attributes->szPrefix
|| !attributes->szURI || !attributes->szValue
|| !attributes->szQName)
if(!attributes->szLocalname || !attributes->szURI
|| !attributes->szValue || !attributes->szQName)
{
HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
HeapFree(GetProcessHeap(), 0, attributes->szPrefix);
HeapFree(GetProcessHeap(), 0, attributes->szURI);
HeapFree(GetProcessHeap(), 0, attributes->szValue);
HeapFree(GetProcessHeap(), 0, attributes->szQName);
@ -817,26 +839,15 @@ static HRESULT SAXAttributes_create(saxattributes **attr,
for(index=0; index<nb_attributes; index++)
{
int len1, len2;
attributes->szLocalname[index] =
bstr_from_xmlChar(xmlAttributes[index*5]);
attributes->szPrefix[index] =
bstr_from_xmlChar(xmlAttributes[index*5+1]);
attributes->szURI[index] =
bstr_from_xmlChar(xmlAttributes[index*5+2]);
attributes->szValue[index] =
bstr_from_xmlCharN(xmlAttributes[index*5+3],
xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
len1 = SysStringLen(attributes->szPrefix[index]);
len2 = SysStringLen(attributes->szLocalname[index]);
attributes->szQName[index] = SysAllocStringLen(NULL, len1+len2);
memcpy(attributes->szQName[index], attributes->szPrefix[index],
len1*sizeof(WCHAR));
memcpy(attributes->szQName[index]+len1,
attributes->szLocalname[index], len2*sizeof(WCHAR));
attributes->szQName[index][len1+len2] = '\0';
attributes->szQName[index] =
QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
}
*attr = attributes;
@ -910,7 +921,7 @@ static void libxmlStartElementNS(
{
NamespaceUri = bstr_from_xmlChar(URI);
LocalName = bstr_from_xmlChar(localname);
QName = bstr_from_xmlChar(localname);
QName = QName_from_xmlChar(prefix, localname);
hr = SAXAttributes_create(&attr, nb_attributes, attributes);
if(hr == S_OK)
@ -959,7 +970,7 @@ static void libxmlEndElementNS(
{
NamespaceUri = bstr_from_xmlChar(URI);
LocalName = bstr_from_xmlChar(localname);
QName = bstr_from_xmlChar(localname);
QName = QName_from_xmlChar(prefix, localname);
if(This->vbInterface)
hr = IVBSAXContentHandler_endElement(