Piotr Caban : msxml3: Return QNames properly.
Alexandre Julliard
julliard at winehq.org
Mon Aug 4 08:53:41 CDT 2008
Module: wine
Branch: master
Commit: 319d86c733300c1c2282cf76c676d1a50b54e689
URL: http://source.winehq.org/git/wine.git/?a=commit;h=319d86c733300c1c2282cf76c676d1a50b54e689
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Sun Aug 3 14:37:37 2008 +0200
msxml3: Return QNames properly.
---
dlls/msxml3/saxreader.c | 61 +++++++++++++++++++++++++++-------------------
1 files changed, 36 insertions(+), 25 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 4bba5e6..b87576a 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -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(
More information about the wine-cvs
mailing list