msxml3: Reuse MXAttributes implementation for SAX reader attributes reporting

Nikolay Sivov nsivov at codeweavers.com
Mon Jun 11 03:58:02 CDT 2012


Reuse MXAttributes implementation for SAX reader attributes reporting
-------------- next part --------------
>From f99f13e94ed0a1b0298fba66fe6fa57b971a2be0 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat, 9 Jun 2012 15:37:52 +0400
Subject: [PATCH 2/5] Reuse MXAttributes implementation for SAX reader attributes reporting

---
 dlls/msxml3/saxreader.c       |  532 +++++++++++------------------------------
 dlls/msxml3/tests/saxreader.c |    1 -
 2 files changed, 142 insertions(+), 391 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index b3b6fc4..ca133bc 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -202,15 +202,10 @@ typedef struct
     struct list elements;
 
     BSTR namespaceUri;
-    int attributesSize;
-    int nb_attributes;
-    struct _attributes
-    {
-        BSTR szLocalname;
-        BSTR szURI;
-        BSTR szValue;
-        BSTR szQName;
-    } *attributes;
+
+    IMXAttributes *attributes;
+    ISAXAttributes *saxattr;
+    IVBSAXAttributes *vbsaxattr;
 } saxlocator;
 
 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
@@ -605,7 +600,7 @@ static HRESULT WINAPI ivbsaxattributes_QueryInterface(
         void **ppvObject)
 {
     saxlocator *This = impl_from_IVBSAXAttributes(iface);
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
     return IVBSAXLocator_QueryInterface(&This->IVBSAXLocator_iface, riid, ppvObject);
 }
 
@@ -625,26 +620,14 @@ static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-
-    TRACE("(%p)->(%p)\n", This, pctinfo);
-
-    *pctinfo = 1;
-
-    return S_OK;
+    return IVBSAXAttributes_GetTypeInfoCount(This->vbsaxattr, pctinfo);
 }
 
-static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
-    IVBSAXAttributes *iface,
+static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(IVBSAXAttributes *iface,
     UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    HRESULT hr;
-
-    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
-
-    hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
-
-    return hr;
+    return IVBSAXAttributes_GetTypeInfo(This->vbsaxattr, iTInfo, lcid, ppTInfo);
 }
 
 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
@@ -656,23 +639,7 @@ static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
     DISPID* rgDispId)
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    ITypeInfo *typeinfo;
-    HRESULT hr;
-
-    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
-          lcid, rgDispId);
-
-    if(!rgszNames || cNames == 0 || !rgDispId)
-        return E_INVALIDARG;
-
-    hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
-    if(SUCCEEDED(hr))
-    {
-        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
-        ITypeInfo_Release(typeinfo);
-    }
-
-    return hr;
+    return IVBSAXAttributes_GetIDsOfNames(This->vbsaxattr, riid, rgszNames, cNames, lcid, rgDispId);
 }
 
 static HRESULT WINAPI ivbsaxattributes_Invoke(
@@ -680,28 +647,15 @@ static HRESULT WINAPI ivbsaxattributes_Invoke(
     DISPID dispIdMember,
     REFIID riid,
     LCID lcid,
-    WORD wFlags,
+    WORD flags,
     DISPPARAMS* pDispParams,
     VARIANT* pVarResult,
     EXCEPINFO* pExcepInfo,
     UINT* puArgErr)
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    ITypeInfo *typeinfo;
-    HRESULT hr;
-
-    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
-          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
-
-    hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
-    if(SUCCEEDED(hr))
-    {
-        hr = ITypeInfo_Invoke(typeinfo, &This->IVBSAXAttributes_iface, dispIdMember, wFlags,
-                pDispParams, pVarResult, pExcepInfo, puArgErr);
-        ITypeInfo_Release(typeinfo);
-    }
-
-    return hr;
+    return IVBSAXAttributes_Invoke(This->vbsaxattr, dispIdMember, riid, lcid, flags, pDispParams,
+        pVarResult, pExcepInfo, puArgErr);
 }
 
 /*** IVBSAXAttributes methods ***/
@@ -723,112 +677,71 @@ static HRESULT WINAPI ivbsaxattributes_getURI(
     return ISAXAttributes_getURI(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)uri, &len);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getLocalName(
-        IVBSAXAttributes* iface,
-        int nIndex,
-        BSTR *localName)
+static HRESULT WINAPI ivbsaxattributes_getLocalName(IVBSAXAttributes* iface, int index, BSTR *name)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getLocalName(&This->ISAXAttributes_iface, nIndex,
-            (const WCHAR**)localName, &len);
+    return IVBSAXAttributes_getLocalName(This->vbsaxattr, index, name);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getQName(
-        IVBSAXAttributes* iface,
-        int nIndex,
-        BSTR *QName)
+static HRESULT WINAPI ivbsaxattributes_getQName(IVBSAXAttributes* iface, int index, BSTR *qname)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getQName(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)QName, &len);
+    return IVBSAXAttributes_getQName(This->vbsaxattr, index, qname);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
-        IVBSAXAttributes* iface,
-        BSTR uri,
-        BSTR localName,
-        int *index)
+static HRESULT WINAPI ivbsaxattributes_getIndexFromName(IVBSAXAttributes* iface, BSTR uri, BSTR name,
+    int *index)
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getIndexFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
-            localName, SysStringLen(localName), index);
+    return IVBSAXAttributes_getIndexFromName(This->vbsaxattr, uri, name, index);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
-        IVBSAXAttributes* iface,
-        BSTR QName,
-        int *index)
+static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(IVBSAXAttributes* iface,
+    BSTR qname, int *index)
 {
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getIndexFromQName(&This->ISAXAttributes_iface, QName,
-            SysStringLen(QName), index);
+    return IVBSAXAttributes_getIndexFromQName(This->vbsaxattr, qname, index);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getType(
-        IVBSAXAttributes* iface,
-        int nIndex,
-        BSTR *type)
+static HRESULT WINAPI ivbsaxattributes_getType(IVBSAXAttributes* iface, int index, BSTR *type)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getType(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)type, &len);
+    return IVBSAXAttributes_getType(This->vbsaxattr, index, type);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
-        IVBSAXAttributes* iface,
-        BSTR uri,
-        BSTR localName,
-        BSTR *type)
+static HRESULT WINAPI ivbsaxattributes_getTypeFromName(IVBSAXAttributes* iface, BSTR uri,
+    BSTR name, BSTR *type)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getTypeFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
-            localName, SysStringLen(localName), (const WCHAR**)type, &len);
+    return IVBSAXAttributes_getTypeFromName(This->vbsaxattr, uri, name, type);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
-        IVBSAXAttributes* iface,
-        BSTR QName,
-        BSTR *type)
+static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(IVBSAXAttributes* iface,
+    BSTR qname, BSTR *type)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getTypeFromQName(&This->ISAXAttributes_iface, QName, SysStringLen(QName),
-            (const WCHAR**)type, &len);
+    return IVBSAXAttributes_getTypeFromQName(This->vbsaxattr, qname, type);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getValue(
-        IVBSAXAttributes* iface,
-        int nIndex,
-        BSTR *value)
+static HRESULT WINAPI ivbsaxattributes_getValue(IVBSAXAttributes* iface, int index,
+    BSTR *value)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getValue(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)value, &len);
+    return IVBSAXAttributes_getValue(This->vbsaxattr, index, value);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getValueFromName(
-        IVBSAXAttributes* iface,
-        BSTR uri,
-        BSTR localName,
-        BSTR *value)
+static HRESULT WINAPI ivbsaxattributes_getValueFromName(IVBSAXAttributes* iface, BSTR uri,
+    BSTR name, BSTR *value)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getValueFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
-            localName, SysStringLen(localName), (const WCHAR**)value, &len);
+    return IVBSAXAttributes_getValueFromName(This->vbsaxattr, uri, name, value);
 }
 
-static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
-        IVBSAXAttributes* iface,
-        BSTR QName,
-        BSTR *value)
+static HRESULT WINAPI ivbsaxattributes_getValueFromQName(IVBSAXAttributes* iface, BSTR qname,
+    BSTR *value)
 {
-    int len;
     saxlocator *This = impl_from_IVBSAXAttributes( iface );
-    return ISAXAttributes_getValueFromQName(&This->ISAXAttributes_iface, QName,
-            SysStringLen(QName), (const WCHAR**)value, &len);
+    return IVBSAXAttributes_getValueFromQName(This->vbsaxattr, qname, value);
 }
 
 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
@@ -862,7 +775,7 @@ static HRESULT WINAPI isaxattributes_QueryInterface(
         void **ppvObject)
 {
     saxlocator *This = impl_from_ISAXAttributes(iface);
-    TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
     return ISAXLocator_QueryInterface(&This->ISAXLocator_iface, riid, ppvObject);
 }
 
@@ -876,266 +789,105 @@ static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
 {
     saxlocator *This = impl_from_ISAXAttributes(iface);
-
     TRACE("%p\n", This);
     return ISAXLocator_Release(&This->ISAXLocator_iface);
 }
 
 /*** ISAXAttributes methods ***/
-static HRESULT WINAPI isaxattributes_getLength(
-        ISAXAttributes* iface,
-        int *length)
+static HRESULT WINAPI isaxattributes_getLength(ISAXAttributes* iface, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-
-    *length = This->nb_attributes;
-    TRACE("Length set to %d\n", *length);
-    return S_OK;
+    return ISAXAttributes_getLength(This->saxattr, len);
 }
 
-static HRESULT WINAPI isaxattributes_getURI(
-        ISAXAttributes* iface,
-        int index,
-        const WCHAR **url,
-        int *size)
+static HRESULT WINAPI isaxattributes_getURI(ISAXAttributes* iface, int index,
+    const WCHAR **uri, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%d)\n", This, index);
-
-    if(index >= This->nb_attributes || index < 0) return E_INVALIDARG;
-    if(!url || !size) return E_POINTER;
-
-    *size = SysStringLen(This->attributes[index].szURI);
-    *url = This->attributes[index].szURI;
-
-    TRACE("(%s:%d)\n", debugstr_w(This->attributes[index].szURI), *size);
-
-    return S_OK;
+    return ISAXAttributes_getURI(This->saxattr, index, uri, len);
 }
 
-static HRESULT WINAPI isaxattributes_getLocalName(
-        ISAXAttributes* iface,
-        int nIndex,
-        const WCHAR **pLocalName,
-        int *pLocalNameLength)
+static HRESULT WINAPI isaxattributes_getLocalName(ISAXAttributes* iface, int index,
+    const WCHAR **name, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%d)\n", This, nIndex);
-
-    if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
-    if(!pLocalName || !pLocalNameLength) return E_POINTER;
-
-    *pLocalNameLength = SysStringLen(This->attributes[nIndex].szLocalname);
-    *pLocalName = This->attributes[nIndex].szLocalname;
-
-    return S_OK;
+    return ISAXAttributes_getLocalName(This->saxattr, index, name, len);
 }
 
-static HRESULT WINAPI isaxattributes_getQName(
-        ISAXAttributes* iface,
-        int nIndex,
-        const WCHAR **pQName,
-        int *pQNameLength)
+static HRESULT WINAPI isaxattributes_getQName(ISAXAttributes* iface, int index,
+    const WCHAR **qname, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%d)\n", This, nIndex);
-
-    if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
-    if(!pQName || !pQNameLength) return E_POINTER;
-
-    *pQNameLength = SysStringLen(This->attributes[nIndex].szQName);
-    *pQName = This->attributes[nIndex].szQName;
-
-    return S_OK;
+    return ISAXAttributes_getLocalName(This->saxattr, index, qname, len);
 }
 
-static HRESULT WINAPI isaxattributes_getName(
-        ISAXAttributes* iface,
-        int index,
-        const WCHAR **uri,
-        int *pUriLength,
-        const WCHAR **localName,
-        int *pLocalNameSize,
-        const WCHAR **QName,
-        int *pQNameLength)
+static HRESULT WINAPI isaxattributes_getName(ISAXAttributes* iface, int index,
+    const WCHAR **uri, int *uri_len, const WCHAR **local, int *local_len,
+    const WCHAR **qname, int *qname_len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%d)\n", This, index);
-
-    if(index>=This->nb_attributes || index<0) return E_INVALIDARG;
-    if(!uri || !pUriLength || !localName || !pLocalNameSize
-            || !QName || !pQNameLength) return E_POINTER;
-
-    *pUriLength = SysStringLen(This->attributes[index].szURI);
-    *uri = This->attributes[index].szURI;
-    *pLocalNameSize = SysStringLen(This->attributes[index].szLocalname);
-    *localName = This->attributes[index].szLocalname;
-    *pQNameLength = SysStringLen(This->attributes[index].szQName);
-    *QName = This->attributes[index].szQName;
-
-    TRACE("(%s, %s, %s)\n", debugstr_w(*uri), debugstr_w(*localName), debugstr_w(*QName));
-
-    return S_OK;
+    return ISAXAttributes_getName(This->saxattr, index, uri, uri_len, local, local_len,
+        qname, qname_len);
 }
 
-static HRESULT WINAPI isaxattributes_getIndexFromName(
-        ISAXAttributes* iface,
-        const WCHAR *pUri,
-        int cUriLength,
-        const WCHAR *pLocalName,
-        int cocalNameLength,
-        int *index)
+static HRESULT WINAPI isaxattributes_getIndexFromName(ISAXAttributes* iface, const WCHAR *uri,
+    int uri_len, const WCHAR *name, int len, int *index)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    int i;
-    TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
-            debugstr_w(pLocalName), cocalNameLength);
-
-    if(!pUri || !pLocalName || !index) return E_POINTER;
-
-    for(i=0; i<This->nb_attributes; i++)
-    {
-        if(cUriLength!=SysStringLen(This->attributes[i].szURI)
-                || cocalNameLength!=SysStringLen(This->attributes[i].szLocalname))
-            continue;
-        if(cUriLength && memcmp(pUri, This->attributes[i].szURI,
-                    sizeof(WCHAR)*cUriLength))
-            continue;
-        if(cocalNameLength && memcmp(pLocalName, This->attributes[i].szLocalname,
-                    sizeof(WCHAR)*cocalNameLength))
-            continue;
-
-        *index = i;
-        return S_OK;
-    }
-
-    return E_INVALIDARG;
+    return ISAXAttributes_getIndexFromName(This->saxattr, uri, uri_len, name, len, index);
 }
 
-static HRESULT WINAPI isaxattributes_getIndexFromQName(
-        ISAXAttributes* iface,
-        const WCHAR *pQName,
-        int nQNameLength,
-        int *index)
+static HRESULT WINAPI isaxattributes_getIndexFromQName(ISAXAttributes* iface, const WCHAR *qname,
+    int qname_len, int *index)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    int i;
-    TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
-
-    if(!pQName || !index) return E_POINTER;
-    if(!nQNameLength) return E_INVALIDARG;
-
-    for(i=0; i<This->nb_attributes; i++)
-    {
-        if(nQNameLength!=SysStringLen(This->attributes[i].szQName)) continue;
-        if(memcmp(pQName, This->attributes[i].szQName, sizeof(WCHAR)*nQNameLength)) continue;
-
-        *index = i;
-        return S_OK;
-    }
-
-    return E_INVALIDARG;
+    return ISAXAttributes_getIndexFromQName(This->saxattr, qname, qname_len, index);
 }
 
-static HRESULT WINAPI isaxattributes_getType(
-        ISAXAttributes* iface,
-        int nIndex,
-        const WCHAR **pType,
-        int *pTypeLength)
+static HRESULT WINAPI isaxattributes_getType(ISAXAttributes* iface, int index,
+    const WCHAR **type, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-
-    FIXME("(%p)->(%d) stub\n", This, nIndex);
-    return E_NOTIMPL;
+    return ISAXAttributes_getType(This->saxattr, index, type, len);
 }
 
-static HRESULT WINAPI isaxattributes_getTypeFromName(
-        ISAXAttributes* iface,
-        const WCHAR *pUri,
-        int nUri,
-        const WCHAR *pLocalName,
-        int nLocalName,
-        const WCHAR **pType,
-        int *nType)
+static HRESULT WINAPI isaxattributes_getTypeFromName(ISAXAttributes* iface,
+    const WCHAR *uri, int uri_len, const WCHAR *name, int name_len,
+    const WCHAR **type, int *type_len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-
-    FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
-            debugstr_w(pLocalName), nLocalName);
-    return E_NOTIMPL;
+    return ISAXAttributes_getTypeFromName(This->saxattr, uri, uri_len, name, name_len,
+       type, type_len);
 }
 
-static HRESULT WINAPI isaxattributes_getTypeFromQName(
-        ISAXAttributes* iface,
-        const WCHAR *pQName,
-        int nQName,
-        const WCHAR **pType,
-        int *nType)
+static HRESULT WINAPI isaxattributes_getTypeFromQName(ISAXAttributes* iface,
+    const WCHAR *qname, int qname_len, const WCHAR **type, int *type_len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-
-    FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
-    return E_NOTIMPL;
+    return ISAXAttributes_getTypeFromQName(This->saxattr, qname, qname_len, type, type_len);
 }
 
-static HRESULT WINAPI isaxattributes_getValue(
-        ISAXAttributes* iface,
-        int index,
-        const WCHAR **value,
-        int *nValue)
+static HRESULT WINAPI isaxattributes_getValue(ISAXAttributes* iface, int index,
+    const WCHAR **value, int *len)
 {
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%d)\n", This, index);
-
-    if(index>=This->nb_attributes || index<0) return E_INVALIDARG;
-    if(!value || !nValue) return E_POINTER;
-
-    *nValue = SysStringLen(This->attributes[index].szValue);
-    *value = This->attributes[index].szValue;
-
-    TRACE("(%s:%d)\n", debugstr_w(*value), *nValue);
-
-    return S_OK;
+    return ISAXAttributes_getValue(This->saxattr, index, value, len);
 }
 
-static HRESULT WINAPI isaxattributes_getValueFromName(
-        ISAXAttributes* iface,
-        const WCHAR *pUri,
-        int nUri,
-        const WCHAR *pLocalName,
-        int nLocalName,
-        const WCHAR **pValue,
-        int *nValue)
+static HRESULT WINAPI isaxattributes_getValueFromName(ISAXAttributes* iface,
+    const WCHAR *uri, int uri_len, const WCHAR *name, int name_len,
+    const WCHAR **value, int *len)
 {
-    HRESULT hr;
-    int index;
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
-            debugstr_w(pLocalName), nLocalName);
-
-    hr = ISAXAttributes_getIndexFromName(iface,
-            pUri, nUri, pLocalName, nLocalName, &index);
-    if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
-
-    return hr;
+    return ISAXAttributes_getValueFromName(This->saxattr, uri, uri_len, name, name_len,
+        value, len);
 }
 
-static HRESULT WINAPI isaxattributes_getValueFromQName(
-        ISAXAttributes* iface,
-        const WCHAR *pQName,
-        int nQName,
-        const WCHAR **pValue,
-        int *nValue)
+static HRESULT WINAPI isaxattributes_getValueFromQName(ISAXAttributes* iface,
+    const WCHAR *qname, int qname_len, const WCHAR **value, int *value_len)
 {
-    HRESULT hr;
-    int index;
     saxlocator *This = impl_from_ISAXAttributes( iface );
-    TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
-
-    hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
-    if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
-
-    return hr;
+    return ISAXAttributes_getValueFromQName(This->saxattr, qname, qname_len, value, value_len);
 }
 
 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
@@ -1163,58 +915,61 @@ static HRESULT SAXAttributes_populate(saxlocator *locator,
         int nb_attributes, const xmlChar **xmlAttributes)
 {
     static const xmlChar xmlns[] = "xmlns";
-    static const WCHAR xmlnsW[] = { 'x','m','l','n','s',0 };
-
-    struct _attributes *attrs;
+    BSTR empty, qname, value;
     int i;
 
     /* skip namespace definitions */
     if ((locator->saxreader->features & NamespacePrefixes) == 0)
         nb_namespaces = 0;
 
-    locator->nb_attributes = nb_namespaces + nb_attributes;
-    if(locator->nb_attributes > locator->attributesSize)
-    {
-        attrs = heap_realloc(locator->attributes, sizeof(struct _attributes)*locator->nb_attributes*2);
-        if(!attrs)
-        {
-            locator->nb_attributes = 0;
-            return E_OUTOFMEMORY;
-        }
-        locator->attributes = attrs;
-    }
-    else
-    {
-        attrs = locator->attributes;
-    }
+    IMXAttributes_clear(locator->attributes);
 
-    for (i = 0; i < nb_namespaces; i++)
-    {
-        attrs[nb_attributes+i].szLocalname = SysAllocStringLen(NULL, 0);
-        attrs[nb_attributes+i].szURI = locator->namespaceUri;
-        attrs[nb_attributes+i].szValue = bstr_from_xmlChar(xmlNamespaces[2*i+1]);
-        if(!xmlNamespaces[2*i])
-            attrs[nb_attributes+i].szQName = SysAllocString(xmlnsW);
-        else
-            attrs[nb_attributes+i].szQName = QName_from_xmlChar(xmlns, xmlNamespaces[2*i]);
-    }
+    empty = SysAllocStringLen(NULL, 0);
 
     for (i = 0; i < nb_attributes; i++)
     {
         static const xmlChar xmlA[] = "xml";
+        BSTR uri, local;
 
         if (xmlStrEqual(xmlAttributes[i*5+1], xmlA))
-            attrs[i].szURI = bstr_from_xmlChar(xmlAttributes[i*5+2]);
+            uri = bstr_from_xmlChar(xmlAttributes[i*5+2]);
         else
-            attrs[i].szURI = find_element_uri(locator, xmlAttributes[i*5+2]);
+            uri = find_element_uri(locator, xmlAttributes[i*5+2]);
 
-        attrs[i].szLocalname = bstr_from_xmlChar(xmlAttributes[i*5]);
-        attrs[i].szValue = bstr_from_xmlCharN(xmlAttributes[i*5+3],
-                xmlAttributes[i*5+4]-xmlAttributes[i*5+3]);
-        attrs[i].szQName = QName_from_xmlChar(xmlAttributes[i*5+1],
-                xmlAttributes[i*5]);
+        local = bstr_from_xmlChar(xmlAttributes[i*5]);
+        value = bstr_from_xmlCharN(xmlAttributes[i*5+3], xmlAttributes[i*5+4]-xmlAttributes[i*5+3]);
+        qname = QName_from_xmlChar(xmlAttributes[i*5+1], xmlAttributes[i*5]);
+
+        IMXAttributes_addAttribute(locator->attributes, uri ? uri : empty, local, qname, empty, value);
+
+        if (xmlStrEqual(xmlAttributes[i*5+1], xmlA))
+            SysFreeString(uri);
+
+        SysFreeString(local);
+        SysFreeString(qname);
+        SysFreeString(value);
     }
 
+    for (i = 0; i < nb_namespaces; i++)
+    {
+        static const WCHAR xmlnsW[] = { 'x','m','l','n','s',0 };
+
+        if (!xmlNamespaces[2*i])
+            qname = SysAllocString(xmlnsW);
+        else
+            qname = QName_from_xmlChar(xmlns, xmlNamespaces[2*i]);
+
+        value = bstr_from_xmlChar(xmlNamespaces[2*i+1]);
+
+        IMXAttributes_addAttribute(locator->attributes, locator->namespaceUri,
+            empty, qname, empty, value);
+
+        SysFreeString(qname);
+        SysFreeString(value);
+    }
+
+    SysFreeString(empty);
+
     return S_OK;
 }
 
@@ -1403,7 +1158,7 @@ static void libxmlEndElementNS(
 
     if (!has_content_handler(This))
     {
-        This->nb_attributes = 0;
+        IMXAttributes_clear(This->attributes);
         free_element_entry(element);
         return;
     }
@@ -1424,7 +1179,7 @@ static void libxmlEndElementNS(
                 local, SysStringLen(local),
                 element->qname, SysStringLen(element->qname));
 
-    This->nb_attributes = 0;
+    IMXAttributes_clear(This->attributes);
 
     if (sax_callback_failed(This, hr))
     {
@@ -1937,7 +1692,7 @@ static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid
 {
     saxlocator *This = impl_from_ISAXLocator( iface );
 
-    TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid( riid ), ppvObject );
 
     *ppvObject = NULL;
 
@@ -1980,19 +1735,14 @@ static ULONG WINAPI isaxlocator_Release(
     if (ref == 0)
     {
         element_entry *element, *element2;
-        int index;
 
         SysFreeString(This->publicId);
         SysFreeString(This->systemId);
         SysFreeString(This->namespaceUri);
 
-        for(index=0; index<This->nb_attributes; index++)
-        {
-            SysFreeString(This->attributes[index].szLocalname);
-            SysFreeString(This->attributes[index].szValue);
-            SysFreeString(This->attributes[index].szQName);
-        }
-        heap_free(This->attributes);
+        ISAXAttributes_Release(This->saxattr);
+        IVBSAXAttributes_Release(This->vbsaxattr);
+        IMXAttributes_Release(This->attributes);
 
         /* element stack */
         LIST_FOR_EACH_ENTRY_SAFE(element, element2, &This->elements, element_entry, entry)
@@ -2090,6 +1840,7 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B
         'o','r','g','/','2','0','0','0','/','x','m','l','n','s','/',0 };
 
     saxlocator *locator;
+    HRESULT hr;
 
     locator = heap_alloc( sizeof (*locator) );
     if( !locator )
@@ -2105,6 +1856,16 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B
     locator->saxreader = reader;
     ISAXXMLReader_AddRef(&reader->ISAXXMLReader_iface);
 
+    hr = SAXAttributes_create(locator->saxreader->version, NULL, (void**)&locator->attributes);
+    if (hr != S_OK)
+    {
+        heap_free(locator);
+        return hr;
+    }
+
+    IMXAttributes_QueryInterface(locator->attributes, &IID_ISAXAttributes, (void**)&locator->saxattr);
+    IMXAttributes_QueryInterface(locator->attributes, &IID_IVBSAXAttributes, (void**)&locator->vbsaxattr);
+
     locator->pParserCtxt = NULL;
     locator->publicId = NULL;
     locator->systemId = NULL;
@@ -2115,20 +1876,11 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B
         locator->namespaceUri = SysAllocString(w3xmlns);
     else
         locator->namespaceUri = SysAllocStringLen(NULL, 0);
-    if(!locator->namespaceUri)
-    {
-        ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
-        heap_free(locator);
-        return E_OUTOFMEMORY;
-    }
 
-    locator->attributesSize = 8;
-    locator->nb_attributes = 0;
-    locator->attributes = heap_alloc(sizeof(struct _attributes)*locator->attributesSize);
-    if(!locator->attributes)
+    if(!locator->namespaceUri)
     {
         ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
-        SysFreeString(locator->namespaceUri);
+        IMXAttributes_Release(locator->attributes);
         heap_free(locator);
         return E_OUTOFMEMORY;
     }
@@ -2735,7 +2487,7 @@ static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID
 {
     saxreader *This = impl_from_IVBSAXXMLReader( iface );
 
-    TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid( riid ), ppvObject );
 
     *ppvObject = NULL;
 
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index 33ac2dc..c9480a9 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -956,7 +956,6 @@ static HRESULT WINAPI contentHandler_putDocumentLocator(
 
     locator = pLocator;
 
-    memset(&call, 0, sizeof(call));
     init_call_entry(locator, &call);
     call.id = CH_PUTDOCUMENTLOCATOR;
     add_call(sequences, CONTENT_HANDLER_INDEX, &call);
-- 
1.5.6.5



More information about the wine-patches mailing list