[Libreoffice-commits] core.git: xmloff/inc xmloff/source

Noel (via logerrit) logerrit at kemper.freedesktop.org
Thu Nov 19 15:15:40 UTC 2020


 xmloff/inc/DomBuilderContext.hxx         |    5 ++--
 xmloff/source/core/DomBuilderContext.cxx |   37 +++++++++++++++----------------
 2 files changed, 22 insertions(+), 20 deletions(-)

New commits:
commit 0c48c46d3ed5db39a0c0e6d0b35aab7506fb8772
Author:     Noel <noelgrandin at gmail.com>
AuthorDate: Thu Nov 19 13:16:17 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Nov 19 16:14:54 2020 +0100

    fastparser in DomBuilderContext
    
    Change-Id: I126db3987f491c1753ec6c169e42503137e4fa86
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106152
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/xmloff/inc/DomBuilderContext.hxx b/xmloff/inc/DomBuilderContext.hxx
index ef019030d831..4c216084d112 100644
--- a/xmloff/inc/DomBuilderContext.hxx
+++ b/xmloff/inc/DomBuilderContext.hxx
@@ -71,8 +71,9 @@ public:
     virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
         sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
 
-    virtual void StartElement(
-        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
+    virtual void SAL_CALL startFastElement(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
     virtual void SAL_CALL characters( const OUString& rChars ) override;
 };
diff --git a/xmloff/source/core/DomBuilderContext.cxx b/xmloff/source/core/DomBuilderContext.cxx
index 9c72ebfbf1eb..f24990c73c94 100644
--- a/xmloff/source/core/DomBuilderContext.cxx
+++ b/xmloff/source/core/DomBuilderContext.cxx
@@ -99,33 +99,30 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > DomBuilderContext::cre
 }
 
 
-void DomBuilderContext::StartElement(
-    const Reference<XAttributeList>& xAttrList )
+void SAL_CALL DomBuilderContext::startFastElement(
+    sal_Int32 nElement,
+    const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
 {
     SAL_WARN_IF( !mxNode.is(), "xmloff", "empty XNode not allowed" );
     SAL_WARN_IF( !mxNode->getOwnerDocument().is(), "xmloff", "XNode must have XDocument" );
 
     // add attribute nodes to new node
-    sal_Int16 nAttributeCount = xAttrList->getLength();
-    for( sal_Int16 i = 0; i < nAttributeCount; i++ )
+    for( auto& aIter : sax_fastparser::castToFastAttributeList(xAttrList) )
     {
+        sal_Int32 nAttrToken = aIter.getToken();
         // get name & value for attribute
-        const OUString& rName = xAttrList->getNameByIndex( i );
-        const OUString& rValue = xAttrList->getValueByIndex( i );
-
-        // namespace handling: determine namespace & namespace key
-        OUString sNamespace;
-        sal_uInt16 nNamespaceKey =
-            GetImport().GetNamespaceMap().GetKeyByAttrName(
-                rName, nullptr, nullptr, &sNamespace);
+        sal_uInt16 nNamespace = (nAttrToken >> NMSP_SHIFT) - 1;
+        const OUString& rPrefix = SvXMLImport::getNamespacePrefixFromToken(nAttrToken, &GetImport().GetNamespaceMap());
+        const OUString& rLocalName = SvXMLImport::getNameFromToken( nAttrToken );
+        OUString aValue = aIter.toString();
 
         // create attribute node and set value
         Reference<XElement> xElement( mxNode, UNO_QUERY_THROW );
-        switch( nNamespaceKey )
+        switch( nNamespace )
         {
         case XML_NAMESPACE_NONE:
             // no namespace: create a non-namespaced attribute
-            xElement->setAttribute( rName, rValue );
+            xElement->setAttribute( rLocalName, aValue );
             break;
         case XML_NAMESPACE_XMLNS:
             // namespace declaration: ignore, since the DOM tree handles these
@@ -135,15 +132,19 @@ void DomBuilderContext::StartElement(
             // unknown namespace: illegal input. Raise Warning.
             {
                 Sequence<OUString> aSeq(2);
-                aSeq[0] = rName;
-                aSeq[1] = rValue;
+                aSeq[0] = rLocalName;
+                aSeq[1] = aValue;
                 GetImport().SetError(
                     XMLERROR_FLAG_WARNING | XMLERROR_NAMESPACE_TROUBLE, aSeq );
             }
             break;
         default:
-            // a real and proper namespace: create namespaced attribute
-            xElement->setAttributeNS( sNamespace, rName, rValue );
+            {
+                // a real and proper namespace: create namespaced attribute
+                OUString namespaceURI = SvXMLImport::getNamespaceURIFromToken(nElement);
+                OUString qualifiedName = rPrefix.isEmpty() ? rLocalName : rPrefix + SvXMLImport::aNamespaceSeparator + rLocalName;
+                xElement->setAttributeNS( namespaceURI, qualifiedName, aValue );
+            }
             break;
         }
     }


More information about the Libreoffice-commits mailing list