msxml3: Initialize ISAXAttribute structure.
This commit is contained in:
parent
6d33798265
commit
6df49d5707
|
@ -73,6 +73,11 @@ typedef struct _saxattributes
|
||||||
{
|
{
|
||||||
const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
|
const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
int nb_attributes;
|
||||||
|
BSTR *szLocalname;
|
||||||
|
BSTR *szPrefix;
|
||||||
|
BSTR *szURI;
|
||||||
|
BSTR *szValue;
|
||||||
} saxattributes;
|
} saxattributes;
|
||||||
|
|
||||||
static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
|
static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
|
||||||
|
@ -96,6 +101,28 @@ static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
|
||||||
|
{
|
||||||
|
DWORD dLen;
|
||||||
|
LPWSTR str;
|
||||||
|
BSTR bstr;
|
||||||
|
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
|
||||||
|
if(len != -1) dLen++;
|
||||||
|
str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dLen * sizeof (WCHAR));
|
||||||
|
if (!str)
|
||||||
|
return NULL;
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, dLen);
|
||||||
|
if(len != -1) str[dLen-1] = '\0';
|
||||||
|
bstr = SysAllocString(str);
|
||||||
|
HeapFree(GetProcessHeap(), 0, str);
|
||||||
|
|
||||||
|
return bstr;
|
||||||
|
}
|
||||||
|
|
||||||
static void format_error_message_from_id(saxlocator *This, HRESULT hr)
|
static void format_error_message_from_id(saxlocator *This, HRESULT hr)
|
||||||
{
|
{
|
||||||
xmlStopParser(This->pParserCtxt);
|
xmlStopParser(This->pParserCtxt);
|
||||||
|
@ -191,6 +218,20 @@ static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
|
||||||
ref = InterlockedDecrement(&This->ref);
|
ref = InterlockedDecrement(&This->ref);
|
||||||
if (ref==0)
|
if (ref==0)
|
||||||
{
|
{
|
||||||
|
int index;
|
||||||
|
for(index=0; index<This->nb_attributes; index++)
|
||||||
|
{
|
||||||
|
SysFreeString(This->szLocalname[index]);
|
||||||
|
SysFreeString(This->szPrefix[index]);
|
||||||
|
SysFreeString(This->szURI[index]);
|
||||||
|
SysFreeString(This->szValue[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);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,9 +430,11 @@ static const struct ISAXAttributesVtbl isaxattributes_vtbl =
|
||||||
isaxattributes_getValueFromQName
|
isaxattributes_getValueFromQName
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT SAXAttributes_create(IUnknown *pUnkOuter, LPVOID *ppObj)
|
static HRESULT SAXAttributes_create(saxattributes **attr,
|
||||||
|
int nb_attributes, const xmlChar **xmlAttributes)
|
||||||
{
|
{
|
||||||
saxattributes *attributes;
|
saxattributes *attributes;
|
||||||
|
int index;
|
||||||
|
|
||||||
attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
|
attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
|
||||||
if(!attributes)
|
if(!attributes)
|
||||||
|
@ -400,9 +443,47 @@ static HRESULT SAXAttributes_create(IUnknown *pUnkOuter, LPVOID *ppObj)
|
||||||
attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
|
attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
|
||||||
attributes->ref = 1;
|
attributes->ref = 1;
|
||||||
|
|
||||||
*ppObj = attributes;
|
attributes->nb_attributes = nb_attributes;
|
||||||
|
|
||||||
TRACE("returning %p\n", *ppObj);
|
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 =
|
||||||
|
HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
|
||||||
|
|
||||||
|
if(!attributes->szLocalname || !attributes->szPrefix
|
||||||
|
|| !attributes->szURI || !attributes->szValue)
|
||||||
|
{
|
||||||
|
if(attributes->szLocalname)
|
||||||
|
HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
|
||||||
|
if(attributes->szPrefix)
|
||||||
|
HeapFree(GetProcessHeap(), 0, attributes->szPrefix);
|
||||||
|
if(attributes->szURI)
|
||||||
|
HeapFree(GetProcessHeap(), 0, attributes->szURI);
|
||||||
|
if(attributes->szValue)
|
||||||
|
HeapFree(GetProcessHeap(), 0, attributes->szValue);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(index=0; index<nb_attributes; index++)
|
||||||
|
{
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
*attr = attributes;
|
||||||
|
|
||||||
|
TRACE("returning %p\n", *attr);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -455,7 +536,7 @@ static void libxmlStartElementNS(
|
||||||
BSTR NamespaceUri, LocalName, QName;
|
BSTR NamespaceUri, LocalName, QName;
|
||||||
saxlocator *This = ctx;
|
saxlocator *This = ctx;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
ISAXAttributes *attr;
|
saxattributes *attr;
|
||||||
|
|
||||||
FIXME("Arguments processing not yet implemented.\n");
|
FIXME("Arguments processing not yet implemented.\n");
|
||||||
|
|
||||||
|
@ -467,21 +548,23 @@ static void libxmlStartElementNS(
|
||||||
LocalName = bstr_from_xmlChar(localname);
|
LocalName = bstr_from_xmlChar(localname);
|
||||||
QName = bstr_from_xmlChar(localname);
|
QName = bstr_from_xmlChar(localname);
|
||||||
|
|
||||||
SAXAttributes_create(NULL, (void*)&attr);
|
hr = SAXAttributes_create(&attr, nb_attributes, attributes);
|
||||||
|
if(hr == S_OK)
|
||||||
|
{
|
||||||
hr = ISAXContentHandler_startElement(
|
hr = ISAXContentHandler_startElement(
|
||||||
This->saxreader->contentHandler,
|
This->saxreader->contentHandler,
|
||||||
NamespaceUri, SysStringLen(NamespaceUri),
|
NamespaceUri, SysStringLen(NamespaceUri),
|
||||||
LocalName, SysStringLen(LocalName),
|
LocalName, SysStringLen(LocalName),
|
||||||
QName, SysStringLen(QName),
|
QName, SysStringLen(QName),
|
||||||
attr);
|
(ISAXAttributes*)&attr->lpSAXAttributesVtbl);
|
||||||
|
|
||||||
|
ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
|
||||||
|
}
|
||||||
|
|
||||||
SysFreeString(NamespaceUri);
|
SysFreeString(NamespaceUri);
|
||||||
SysFreeString(LocalName);
|
SysFreeString(LocalName);
|
||||||
SysFreeString(QName);
|
SysFreeString(QName);
|
||||||
|
|
||||||
ISAXAttributes_Release(attr);
|
|
||||||
|
|
||||||
if(hr != S_OK)
|
if(hr != S_OK)
|
||||||
format_error_message_from_id(This, hr);
|
format_error_message_from_id(This, hr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue