Piotr Caban : msxml3: Don' t allocate new strings when returning namespace related data.
Alexandre Julliard
julliard at winehq.org
Mon Oct 31 12:49:07 CDT 2011
Module: wine
Branch: master
Commit: 216b64801d0b6adb3bb1ba9c7fadf8951e656066
URL: http://source.winehq.org/git/wine.git/?a=commit;h=216b64801d0b6adb3bb1ba9c7fadf8951e656066
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Oct 31 12:33:08 2011 +0100
msxml3: Don't allocate new strings when returning namespace related data.
---
dlls/msxml3/saxreader.c | 32 +++++++++++++++++++++++---------
1 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 35b0c04..14d1643 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -313,6 +313,20 @@ static HRESULT namespacePop(saxlocator *locator)
return S_OK;
}
+static BSTR namespaceFind(saxlocator *locator, const xmlChar *ptr)
+{
+ int i;
+
+ for(i=locator->nsStackLast-1; i>=0; i--)
+ {
+ if(ptr == locator->nsStack[i].ptr)
+ return locator->nsStack[i].uri;
+ }
+
+ ERR("namespace not found\n");
+ return NULL;
+}
+
static BOOL bstr_pool_insert(struct bstrpool *pool, BSTR pool_entry)
{
if (!pool->pool)
@@ -1188,7 +1202,7 @@ static void libxmlStartElementNS(
int nb_defaulted,
const xmlChar **attributes)
{
- BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
+ BSTR NamespaceUri, LocalName, QName;
saxlocator *This = ctx;
HRESULT hr;
int index;
@@ -1214,18 +1228,18 @@ static void libxmlStartElementNS(
{
for(index=0; index<nb_namespaces; index++)
{
- Prefix = pooled_bstr_from_xmlChar(&This->saxreader->pool, namespaces[2*index]);
- Uri = pooled_bstr_from_xmlChar(&This->saxreader->pool, namespaces[2*index+1]);
-
if(This->vbInterface)
hr = IVBSAXContentHandler_startPrefixMapping(
This->saxreader->vbcontentHandler,
- &Prefix, &Uri);
+ &This->nsStack[This->nsStackLast-nb_namespaces+index].prefix,
+ &This->nsStack[This->nsStackLast-nb_namespaces+index].uri);
else
hr = ISAXContentHandler_startPrefixMapping(
This->saxreader->contentHandler,
- Prefix, SysStringLen(Prefix),
- Uri, SysStringLen(Uri));
+ This->nsStack[This->nsStackLast-nb_namespaces+index].prefix,
+ SysStringLen(This->nsStack[This->nsStackLast-nb_namespaces+index].prefix),
+ This->nsStack[This->nsStackLast-nb_namespaces+index].uri,
+ SysStringLen(This->nsStack[This->nsStackLast-nb_namespaces+index].uri));
if(This->saxreader->version>=MSXML6 ? FAILED(hr) : hr!=S_OK)
{
@@ -1234,7 +1248,7 @@ static void libxmlStartElementNS(
}
}
- NamespaceUri = pooled_bstr_from_xmlChar(&This->saxreader->pool, URI);
+ NamespaceUri = namespaceFind(This, URI);
LocalName = pooled_bstr_from_xmlChar(&This->saxreader->pool, localname);
QName = pooled_QName_from_xmlChar(&This->saxreader->pool, prefix, localname);
@@ -1280,7 +1294,7 @@ static void libxmlEndElementNS(
if(has_content_handler(This))
{
- NamespaceUri = pooled_bstr_from_xmlChar(&This->saxreader->pool, URI);
+ NamespaceUri = namespaceFind(This, URI);
LocalName = pooled_bstr_from_xmlChar(&This->saxreader->pool, localname);
QName = pooled_QName_from_xmlChar(&This->saxreader->pool, prefix, localname);
More information about the wine-cvs
mailing list