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

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Thu Apr 30 07:43:44 UTC 2020


 include/xmloff/xformsimport.hxx                   |    5 +
 sw/source/filter/xml/xmlimp.cxx                   |    2 
 xmloff/inc/DomBuilderContext.hxx                  |   23 +++--
 xmloff/source/core/DomBuilderContext.cxx          |   77 +++++++++++--------
 xmloff/source/core/xmlimp.cxx                     |    1 
 xmloff/source/forms/layerimport.cxx               |    2 
 xmloff/source/xforms/SchemaContext.cxx            |   32 +++++---
 xmloff/source/xforms/SchemaContext.hxx            |   12 ++-
 xmloff/source/xforms/SchemaRestrictionContext.cxx |   88 ++++++++++++++--------
 xmloff/source/xforms/SchemaRestrictionContext.hxx |   12 ++-
 xmloff/source/xforms/SchemaSimpleTypeContext.cxx  |   36 ++++++---
 xmloff/source/xforms/SchemaSimpleTypeContext.hxx  |   12 ++-
 xmloff/source/xforms/TokenContext.cxx             |   71 +++++++++++++----
 xmloff/source/xforms/TokenContext.hxx             |   42 +++++++---
 xmloff/source/xforms/XFormsBindContext.cxx        |   54 ++++++++-----
 xmloff/source/xforms/XFormsBindContext.hxx        |   15 ++-
 xmloff/source/xforms/XFormsInstanceContext.cxx    |   44 +++++++----
 xmloff/source/xforms/XFormsInstanceContext.hxx    |   21 +++--
 xmloff/source/xforms/XFormsModelContext.cxx       |   65 +++++++++++-----
 xmloff/source/xforms/XFormsModelContext.hxx       |   14 ++-
 xmloff/source/xforms/XFormsSubmissionContext.cxx  |   67 +++++++++++-----
 xmloff/source/xforms/XFormsSubmissionContext.hxx  |   10 +-
 xmloff/source/xforms/xformsimport.cxx             |    7 +
 23 files changed, 474 insertions(+), 238 deletions(-)

New commits:
commit e4da8ae4bef37f5450dcf34d9f06b68e3b901c01
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Thu Apr 30 08:37:51 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Apr 30 09:43:10 2020 +0200

    Revert "Convert TokenContext to fastparser APIs"
    
    This reverts commit b7bfe6ae08f5b214f2d03d70a40b66c894c0b659.
    
    Reason for revert: I missed some call-sites which means this is not going to work properly, which also means we don't have any tests for this functionality :-(
    
    Change-Id: Ie340a5e2331609258e79176c3dd12249ad46ba7b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93134
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/xmloff/xformsimport.hxx b/include/xmloff/xformsimport.hxx
index 3bf554d9a7b2..5975ea993416 100644
--- a/include/xmloff/xformsimport.hxx
+++ b/include/xmloff/xformsimport.hxx
@@ -35,7 +35,10 @@ namespace com { namespace sun { namespace star {
 } } }
 
 /** create import context for xforms:model element. */
-XMLOFF_DLLPUBLIC SvXMLImportContext* createXFormsModelContext( SvXMLImport& rImport );
+XMLOFF_DLLPUBLIC SvXMLImportContext* createXFormsModelContext(
+    SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName );
 
 /** perform the actual binding of an XForms-binding with the suitable control
  *  @param document which contains the XForms-model(s)
diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index eaded191bdcc..0ea3690eddac 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -260,7 +260,7 @@ SvXMLImportContextRef SwXMLDocContext_Impl::CreateChildContext(
     switch( rTokenMap.Get( nPrefix, rLocalName ) )
     {
     case XML_TOK_DOC_XFORMS:
-        pContext = createXFormsModelContext(GetImport());
+        pContext = createXFormsModelContext(GetImport(), nPrefix, rLocalName);
         break;
     }
 
diff --git a/xmloff/inc/DomBuilderContext.hxx b/xmloff/inc/DomBuilderContext.hxx
index a3ce39574473..cf73d6e7d608 100644
--- a/xmloff/inc/DomBuilderContext.hxx
+++ b/xmloff/inc/DomBuilderContext.hxx
@@ -32,7 +32,7 @@ namespace com { namespace sun { namespace star {
         class XDocument;
     } }
     namespace xml { namespace sax {
-        class XFastAttributeList;
+        class XAttributeList;
     } }
 } } }
 class SvXMLImport;
@@ -48,11 +48,14 @@ class DomBuilderContext final : public SvXMLImportContext
 public:
 
     /** default constructor: create new DOM tree */
-    DomBuilderContext( SvXMLImport& rImport, sal_Int32 nElement );
+    DomBuilderContext( SvXMLImport& rImport,
+                       sal_uInt16 nPrefix,
+                       const OUString& rLocalName );
 
     /** constructor: create DOM subtree under the given node */
     DomBuilderContext( SvXMLImport& rImport,
-                       sal_Int32 nElement,
+                       sal_uInt16 nPrefix,
+                       const OUString& rLocalName,
                        css::uno::Reference<css::xml::dom::XNode> const & );
 
     virtual ~DomBuilderContext() override;
@@ -67,12 +70,16 @@ public:
 
     // implement SvXMLImportContext methods:
 
-    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
-        sal_Int32 nElement,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
 
-    virtual void SAL_CALL startFastElement( sal_Int32 nElement,
-                                            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+    virtual SvXMLImportContextRef CreateChildContext(
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList >& xAttrList ) override;
+
+    virtual void StartElement(
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
+
+    virtual void EndElement() override;
 
     virtual void Characters( const OUString& rChars ) override;
 };
diff --git a/xmloff/source/core/DomBuilderContext.cxx b/xmloff/source/core/DomBuilderContext.cxx
index d6f01954f14b..9f893d710ae0 100644
--- a/xmloff/source/core/DomBuilderContext.cxx
+++ b/xmloff/source/core/DomBuilderContext.cxx
@@ -55,13 +55,17 @@ using com::sun::star::xml::dom::NodeType_ELEMENT_NODE;
 // helper functions; implemented below
 static Reference<XNode> lcl_createDomInstance();
 static Reference<XNode> lcl_createElement( SvXMLImport& rImport,
-                                    sal_Int32 nElement,
+                                    sal_uInt16 nPrefix,
+                                    const OUString& rLocalName,
                                     const Reference<XNode>& xParent);
 
 
-DomBuilderContext::DomBuilderContext( SvXMLImport& rImport, sal_Int32 nElement ) :
-    SvXMLImportContext( rImport ),
-    mxNode( lcl_createElement( rImport, nElement, lcl_createDomInstance() ) )
+DomBuilderContext::DomBuilderContext( SvXMLImport& rImport,
+                                      sal_uInt16 nPrefix,
+                                      const OUString& rLocalName ) :
+    SvXMLImportContext( rImport, nPrefix, rLocalName ),
+    mxNode( lcl_createElement( rImport, nPrefix, rLocalName,
+                               lcl_createDomInstance() ) )
 {
     SAL_WARN_IF( !mxNode.is(), "xmloff", "empty XNode not allowed" );
     SAL_WARN_IF( !Reference<XElement>( mxNode, UNO_QUERY ).is(), "xmloff", "need element" );
@@ -69,10 +73,11 @@ DomBuilderContext::DomBuilderContext( SvXMLImport& rImport, sal_Int32 nElement )
 }
 
 DomBuilderContext::DomBuilderContext( SvXMLImport& rImport,
-                                      sal_Int32 nElement,
+                                      sal_uInt16 nPrefix,
+                                      const OUString& rLocalName,
                                       Reference<XNode> const & xParent ) :
-    SvXMLImportContext( rImport ),
-    mxNode( lcl_createElement( rImport, nElement, xParent ) )
+    SvXMLImportContext( rImport, nPrefix, rLocalName ),
+    mxNode( lcl_createElement( rImport, nPrefix, rLocalName, xParent ) )
 {
     SAL_WARN_IF( !mxNode.is(), "xmloff", "empty XNode not allowed" );
     SAL_WARN_IF( !Reference<XElement>( mxNode, UNO_QUERY ).is(), "xmloff", "need element" );
@@ -89,39 +94,43 @@ Reference<XDocument> DomBuilderContext::getTree()
     return mxNode->getOwnerDocument();
 }
 
-css::uno::Reference< css::xml::sax::XFastContextHandler > DomBuilderContext::createFastChildContext(
-        sal_Int32 nElement,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
+SvXMLImportContextRef DomBuilderContext::CreateChildContext(
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& )
 {
     // create DomBuilder for subtree
-    return new DomBuilderContext( GetImport(), nElement, mxNode );
+    return new DomBuilderContext( GetImport(), nPrefix, rLocalName, mxNode );
 }
 
 
-void DomBuilderContext::startFastElement(
-        sal_Int32 /*nElement*/,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+void DomBuilderContext::StartElement(
+    const Reference<XAttributeList>& 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
-    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
+    sal_Int16 nAttributeCount = xAttrList->getLength();
+    for( sal_Int16 i = 0; i < nAttributeCount; i++ )
     {
         // get name & value for attribute
-        OUString aName = SvXMLImport::getNameFromToken(aIter.getToken());
-        OUString aValue = aIter.toString();
+        const OUString& rName = xAttrList->getNameByIndex( i );
+        const OUString& rValue = xAttrList->getValueByIndex( i );
 
         // namespace handling: determine namespace & namespace key
-        sal_Int32 nNamespacePrefix = (( aIter.getToken() & NMSP_MASK ) >> NMSP_SHIFT) - 1;
+        OUString sNamespace;
+        sal_uInt16 nNamespaceKey =
+            GetImport().GetNamespaceMap().GetKeyByAttrName(
+                rName, nullptr, nullptr, &sNamespace);
 
         // create attribute node and set value
         Reference<XElement> xElement( mxNode, UNO_QUERY_THROW );
-        switch( nNamespacePrefix )
+        switch( nNamespaceKey )
         {
         case XML_NAMESPACE_NONE:
             // no namespace: create a non-namespaced attribute
-            xElement->setAttribute( aName, aValue );
+            xElement->setAttribute( rName, rValue );
             break;
         case XML_NAMESPACE_XMLNS:
             // namespace declaration: ignore, since the DOM tree handles these
@@ -131,20 +140,25 @@ void DomBuilderContext::startFastElement(
             // unknown namespace: illegal input. Raise Warning.
             {
                 Sequence<OUString> aSeq(2);
-                aSeq[0] = aName;
-                aSeq[1] = aValue;
+                aSeq[0] = rName;
+                aSeq[1] = rValue;
                 GetImport().SetError(
                     XMLERROR_FLAG_WARNING | XMLERROR_NAMESPACE_TROUBLE, aSeq );
             }
             break;
         default:
             // a real and proper namespace: create namespaced attribute
-            xElement->setAttributeNS( SvXMLImport::getNamespaceURIFromToken(aIter.getToken()), aName, aValue );
+            xElement->setAttributeNS( sNamespace, rName, rValue );
             break;
         }
     }
 }
 
+void DomBuilderContext::EndElement()
+{
+    // nothing to be done!
+}
+
 void DomBuilderContext::Characters( const OUString& rCharacters )
 {
     SAL_WARN_IF( !mxNode.is(), "xmloff", "empty XNode not allowed" );
@@ -175,7 +189,8 @@ static Reference<XNode> lcl_createDomInstance()
 }
 
 static Reference<XNode> lcl_createElement( SvXMLImport& rImport,
-                                    sal_Int32 nElement,
+                                    sal_uInt16 nPrefix,
+                                    const OUString& rLocalName,
                                     const Reference<XNode>& xParent)
 {
     SAL_WARN_IF( !xParent.is(), "xmloff", "need parent node" );
@@ -188,20 +203,18 @@ static Reference<XNode> lcl_createElement( SvXMLImport& rImport,
     // multiple prefixes for the same namespace. Fortunately, those are rare.
 
     Reference<XElement> xElement;
-    sal_Int32 nNamespacePrefix = (( nElement & NMSP_MASK ) >> NMSP_SHIFT) - 1;
-    OUString aLocalName = SvXMLImport::getNameFromToken(nElement);
-    switch( nNamespacePrefix )
+    switch( nPrefix )
     {
     case XML_NAMESPACE_NONE:
         // no namespace: use local name
-        xElement = xDocument->createElement( aLocalName );
+        xElement = xDocument->createElement( rLocalName );
         break;
     case XML_NAMESPACE_XMLNS:
     case XML_NAMESPACE_UNKNOWN:
         // both cases are illegal; raise warning (and use only local name)
-        xElement = xDocument->createElement( aLocalName );
+        xElement = xDocument->createElement( rLocalName );
         {
-            Sequence<OUString> aSeq { aLocalName };
+            Sequence<OUString> aSeq { rLocalName };
             rImport.SetError(
                 XMLERROR_FLAG_WARNING | XMLERROR_NAMESPACE_TROUBLE, aSeq );
         }
@@ -212,8 +225,8 @@ static Reference<XNode> lcl_createElement( SvXMLImport& rImport,
         // this is a bug, since this will fail for multiple prefixes used for
         // the same namespace.
         xElement = xDocument->createElementNS(
-            rImport.GetNamespaceMap().GetNameByKey( nNamespacePrefix ),
-            rImport.GetNamespaceMap().GetQNameByKey( nNamespacePrefix, aLocalName ) );
+            rImport.GetNamespaceMap().GetNameByKey( nPrefix ),
+            rImport.GetNamespaceMap().GetQNameByKey( nPrefix, rLocalName ) );
         break;
     }
     SAL_WARN_IF( !xElement.is(), "xmloff", "can't create element" );
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
index 99be12818ea8..cc515c645a23 100644
--- a/xmloff/source/core/xmlimp.cxx
+++ b/xmloff/source/core/xmlimp.cxx
@@ -2254,7 +2254,6 @@ void SAL_CALL SvXMLLegacyToFastDocHandler::startElement( const OUString& rName,
         const OUString& rAttrValue = xAttrList->getValueByIndex( i );
         sal_uInt16 const nAttrPrefix(mrImport->mpNamespaceMap->GetKeyByAttrName(
                 rAttrName, nullptr, &aLocalAttrName, &aNamespace));
-        SAL_WARN("xmloff", "nAttrPrefix=" << nAttrPrefix);
         if( XML_NAMESPACE_XMLNS != nAttrPrefix )
         {
             Sequence< sal_Int8 > aAttrSeq( reinterpret_cast<sal_Int8 const *>(
diff --git a/xmloff/source/forms/layerimport.cxx b/xmloff/source/forms/layerimport.cxx
index 8bb17c32b14c..0263989f07d1 100644
--- a/xmloff/source/forms/layerimport.cxx
+++ b/xmloff/source/forms/layerimport.cxx
@@ -458,7 +458,7 @@ SvXMLImportContext* OFormLayerXMLImport_Impl::createContext(const sal_uInt16 _nP
     else if ( _nPrefix == XML_NAMESPACE_XFORMS
               && xmloff::token::IsXMLToken( _rLocalName, xmloff::token::XML_MODEL ) )
     {
-        pContext = createXFormsModelContext( m_rImporter );
+        pContext = createXFormsModelContext( m_rImporter, _nPrefix, _rLocalName );
     }
 
     return pContext;
diff --git a/xmloff/source/xforms/SchemaContext.cxx b/xmloff/source/xforms/SchemaContext.cxx
index 36346bc9393f..6c19cbfa019a 100644
--- a/xmloff/source/xforms/SchemaContext.cxx
+++ b/xmloff/source/xforms/SchemaContext.cxx
@@ -25,7 +25,6 @@
 #include <xmloff/xmltoken.hxx>
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/xmltkmap.hxx>
-#include <xmloff/xmlimp.hxx>
 
 #include <com/sun/star/xforms/XDataTypeRepository.hpp>
 
@@ -35,27 +34,42 @@ using com::sun::star::xforms::XDataTypeRepository;
 using namespace xmloff::token;
 
 
+static const SvXMLTokenMapEntry aAttributes[] =
+{
+    XML_TOKEN_MAP_END
+};
+
+static const SvXMLTokenMapEntry aChildren[] =
+{
+    TOKEN_MAP_ENTRY( XSD, SIMPLETYPE ),
+    XML_TOKEN_MAP_END
+};
+
 SchemaContext::SchemaContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     const Reference<XDataTypeRepository>& rRepository ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributes, aChildren ),
         mxRepository( rRepository )
 {
 }
 
-bool SchemaContext::HandleAttribute(
-    sal_Int32 ,
+void SchemaContext::HandleAttribute(
+    sal_uInt16,
     const OUString& )
 {
-    return false;
 }
 
 SvXMLImportContext* SchemaContext::HandleChild(
-    sal_Int32 nElement,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16 nToken,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& )
 {
-    if ( nElement == XML_ELEMENT(XSD, XML_SIMPLETYPE))
-        return new SchemaSimpleTypeContext( GetImport(), mxRepository );
+    if ( nToken == XML_SIMPLETYPE )
+        return new SchemaSimpleTypeContext( GetImport(), nPrefix, rLocalName,
+                                       mxRepository );
     return nullptr;
 }
 
diff --git a/xmloff/source/xforms/SchemaContext.hxx b/xmloff/source/xforms/SchemaContext.hxx
index eca66406bdd3..1e65995eb2a2 100644
--- a/xmloff/source/xforms/SchemaContext.hxx
+++ b/xmloff/source/xforms/SchemaContext.hxx
@@ -39,18 +39,22 @@ class SchemaContext : public TokenContext
 
 public:
     SchemaContext( SvXMLImport& rImport,
+                   sal_uInt16 nPrfx,
+                   const OUString& rLName,
                    const css::uno::Reference<css::xforms::XDataTypeRepository>& rRepository );
 
     // implement TokenContext methods:
 
 protected:
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 };
 
 #endif
diff --git a/xmloff/source/xforms/SchemaRestrictionContext.cxx b/xmloff/source/xforms/SchemaRestrictionContext.cxx
index e4db981de1ab..cafaab50b16c 100644
--- a/xmloff/source/xforms/SchemaRestrictionContext.cxx
+++ b/xmloff/source/xforms/SchemaRestrictionContext.cxx
@@ -53,11 +53,37 @@ using com::sun::star::xforms::XDataTypeRepository;
 using namespace xmloff::token;
 
 
+static const SvXMLTokenMapEntry aAttributes[] =
+{
+    TOKEN_MAP_ENTRY( NONE, BASE ),
+    XML_TOKEN_MAP_END
+};
+
+static const SvXMLTokenMapEntry aChildren[] =
+{
+    TOKEN_MAP_ENTRY( XSD, LENGTH         ),
+    TOKEN_MAP_ENTRY( XSD, MINLENGTH      ),
+    TOKEN_MAP_ENTRY( XSD, MAXLENGTH      ),
+    TOKEN_MAP_ENTRY( XSD, MININCLUSIVE   ),
+    TOKEN_MAP_ENTRY( XSD, MINEXCLUSIVE   ),
+    TOKEN_MAP_ENTRY( XSD, MAXINCLUSIVE   ),
+    TOKEN_MAP_ENTRY( XSD, MAXEXCLUSIVE   ),
+    TOKEN_MAP_ENTRY( XSD, PATTERN        ),
+    // ??? XML_ENUMERATION
+    TOKEN_MAP_ENTRY( XSD, WHITESPACE     ),
+    TOKEN_MAP_ENTRY( XSD, TOTALDIGITS    ),
+    TOKEN_MAP_ENTRY( XSD, FRACTIONDIGITS ),
+    XML_TOKEN_MAP_END
+};
+
+
 SchemaRestrictionContext::SchemaRestrictionContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     Reference<css::xforms::XDataTypeRepository> const & rRepository,
     const OUString& sTypeName ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributes, aChildren ),
         mxRepository( rRepository ),
         msTypeName( sTypeName ),
         msBaseName()
@@ -90,16 +116,14 @@ void SchemaRestrictionContext::CreateDataType()
     SAL_WARN_IF( !mxDataType.is(), "xmloff", "can't create type" );
 }
 
-bool SchemaRestrictionContext::HandleAttribute(
-    sal_Int32 nElement,
+void SchemaRestrictionContext::HandleAttribute(
+    sal_uInt16 nToken,
     const OUString& rValue )
 {
-    if( nElement == XML_ELEMENT(NONE, XML_BASE) )
+    if( nToken == XML_BASE )
     {
         msBaseName = rValue;
-        return true;
     }
-    return false;
 }
 
 typedef Any (*convert_t)( const OUString& );
@@ -186,55 +210,59 @@ static Any xforms_time( const OUString& rValue )
     return aAny;
 }
 
+
 SvXMLImportContext* SchemaRestrictionContext::HandleChild(
-    sal_Int32 nElement,
-    const Reference<css::xml::sax::XFastAttributeList>& xAttrList )
+    sal_uInt16 nToken,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& xAttrList )
 {
     // find value
     OUString sValue;
-    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
+    sal_Int16 nLength = xAttrList->getLength();
+    for( sal_Int16 n = 0; n < nLength; n++ )
     {
-        if( (aIter.getToken() & TOKEN_MASK) == XML_VALUE )
-            sValue = aIter.toString();
+        if( IsXMLToken( xAttrList->getNameByIndex( n ), XML_VALUE ) )
+            sValue = xAttrList->getValueByIndex( n );
     }
 
     // determine property name + suitable converter
     OUString sPropertyName;
     convert_t pConvert = nullptr;
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(XSD, XML_LENGTH):
+    case XML_LENGTH:
         sPropertyName = "Length";
         pConvert = &xforms_int32;
         break;
-    case XML_ELEMENT(XSD, XML_MINLENGTH):
+    case XML_MINLENGTH:
         sPropertyName = "MinLength";
         pConvert = &xforms_int32;
         break;
-    case XML_ELEMENT(XSD, XML_MAXLENGTH):
+    case XML_MAXLENGTH:
         sPropertyName = "MaxLength";
         pConvert = &xforms_int32;
         break;
-    case XML_ELEMENT(XSD, XML_TOTALDIGITS):
+    case XML_TOTALDIGITS:
         sPropertyName = "TotalDigits";
         pConvert = &xforms_int32;
         break;
-    case XML_ELEMENT(XSD, XML_FRACTIONDIGITS):
+    case XML_FRACTIONDIGITS:
         sPropertyName = "FractionDigits";
         pConvert = &xforms_int32;
         break;
-    case XML_ELEMENT(XSD, XML_PATTERN):
+    case XML_PATTERN:
         sPropertyName = "Pattern";
         pConvert = &xforms_string;
         break;
-    case XML_ELEMENT(XSD, XML_WHITESPACE):
+    case XML_WHITESPACE:
         sPropertyName = "WhiteSpace";
         pConvert = &xforms_whitespace;
         break;
-    case XML_ELEMENT(XSD, XML_MININCLUSIVE):
-    case XML_ELEMENT(XSD, XML_MINEXCLUSIVE):
-    case XML_ELEMENT(XSD, XML_MAXINCLUSIVE):
-    case XML_ELEMENT(XSD, XML_MAXEXCLUSIVE):
+    case XML_MININCLUSIVE:
+    case XML_MINEXCLUSIVE:
+    case XML_MAXINCLUSIVE:
+    case XML_MAXEXCLUSIVE:
         {
             // these attributes are mapped to different properties.
             // To determine the property name, we use an attribute
@@ -242,18 +270,18 @@ SvXMLImportContext* SchemaRestrictionContext::HandleChild(
             // converter is only type dependent.
 
             // first, attribute-dependent prefix
-            switch( nElement )
+            switch( nToken )
             {
-            case XML_ELEMENT(XSD, XML_MININCLUSIVE):
+            case XML_MININCLUSIVE:
                 sPropertyName = "MinInclusive";
                 break;
-            case XML_ELEMENT(XSD, XML_MINEXCLUSIVE):
+            case XML_MINEXCLUSIVE:
                 sPropertyName = "MinExclusive";
                 break;
-            case XML_ELEMENT(XSD, XML_MAXINCLUSIVE):
+            case XML_MAXINCLUSIVE:
                 sPropertyName = "MaxInclusive";
                 break;
-            case XML_ELEMENT(XSD, XML_MAXEXCLUSIVE):
+            case XML_MAXEXCLUSIVE:
                 sPropertyName = "MaxExclusive";
                 break;
             }
@@ -308,7 +336,7 @@ SvXMLImportContext* SchemaRestrictionContext::HandleChild(
         break;
 
     default:
-        SAL_WARN("xmloff", "unknown element " << SvXMLImport::getPrefixAndNameFromToken(nElement));
+        OSL_FAIL( "unknown facet" );
     }
 
     // finally, set the property
@@ -328,7 +356,7 @@ SvXMLImportContext* SchemaRestrictionContext::HandleChild(
         }
     }
 
-    return new SvXMLImportContext( GetImport() );
+    return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/xforms/SchemaRestrictionContext.hxx b/xmloff/source/xforms/SchemaRestrictionContext.hxx
index 1c3e84f1c4d6..29a36247a335 100644
--- a/xmloff/source/xforms/SchemaRestrictionContext.hxx
+++ b/xmloff/source/xforms/SchemaRestrictionContext.hxx
@@ -42,6 +42,8 @@ class SchemaRestrictionContext : public TokenContext
 
 public:
     SchemaRestrictionContext( SvXMLImport& rImport,
+                              sal_uInt16 nPrfx,
+                              const OUString& rLName,
                               css::uno::Reference<css::xforms::XDataTypeRepository> const & rRepository,
                               const OUString& sTypeName );
 
@@ -51,13 +53,15 @@ private:
 
     // implement TokenContext methods:
 
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 };
 
 #endif
diff --git a/xmloff/source/xforms/SchemaSimpleTypeContext.cxx b/xmloff/source/xforms/SchemaSimpleTypeContext.cxx
index 47f770325ee3..0c01874efbf5 100644
--- a/xmloff/source/xforms/SchemaSimpleTypeContext.cxx
+++ b/xmloff/source/xforms/SchemaSimpleTypeContext.cxx
@@ -25,7 +25,6 @@
 #include <xmloff/nmspmap.hxx>
 #include <xmloff/xmlnmspe.hxx>
 #include <xmloff/xmltkmap.hxx>
-#include <xmloff/xmlimp.hxx>
 
 #include <osl/diagnose.h>
 
@@ -35,34 +34,49 @@ using com::sun::star::xforms::XDataTypeRepository;
 using namespace xmloff::token;
 
 
+static const SvXMLTokenMapEntry aAttributes[] =
+{
+    TOKEN_MAP_ENTRY( NONE, NAME ),
+    XML_TOKEN_MAP_END
+};
+
+static const SvXMLTokenMapEntry aChildren[] =
+{
+    TOKEN_MAP_ENTRY( XSD, RESTRICTION ),
+    XML_TOKEN_MAP_END
+};
+
 SchemaSimpleTypeContext::SchemaSimpleTypeContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     const Reference<XDataTypeRepository>& rRepository ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributes, aChildren ),
         mxRepository( rRepository )
 {
 }
 
-bool SchemaSimpleTypeContext::HandleAttribute(
-    sal_Int32 nElement,
+void SchemaSimpleTypeContext::HandleAttribute(
+    sal_uInt16 nToken,
     const OUString& rValue )
 {
-    if( nElement == XML_ELEMENT(NONE, XML_NAME) )
+    if( nToken == XML_NAME )
     {
         msTypeName = rValue;
-        return true;
     }
-    return false;
 }
 
 SvXMLImportContext* SchemaSimpleTypeContext::HandleChild(
-    sal_Int32 nElement,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16 nToken,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& )
 {
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(XSD, XML_RESTRICTION):
+    case XML_RESTRICTION:
         return new SchemaRestrictionContext( GetImport(),
+                                                 nPrefix, rLocalName,
                                                  mxRepository, msTypeName );
         break;
     }
diff --git a/xmloff/source/xforms/SchemaSimpleTypeContext.hxx b/xmloff/source/xforms/SchemaSimpleTypeContext.hxx
index 72341b0b3a5d..0280b0870f3c 100644
--- a/xmloff/source/xforms/SchemaSimpleTypeContext.hxx
+++ b/xmloff/source/xforms/SchemaSimpleTypeContext.hxx
@@ -40,18 +40,22 @@ class SchemaSimpleTypeContext : public TokenContext
 
 public:
     SchemaSimpleTypeContext( SvXMLImport& rImport,
+                             sal_uInt16 nPrfx,
+                             const OUString& rLName,
                              const css::uno::Reference<css::xforms::XDataTypeRepository>& rRepository );
 
     // implement TokenContext methods:
 
 protected:
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 };
 
 #endif
diff --git a/xmloff/source/xforms/TokenContext.cxx b/xmloff/source/xforms/TokenContext.cxx
index d5b410ab94be..71215c4395d7 100644
--- a/xmloff/source/xforms/TokenContext.cxx
+++ b/xmloff/source/xforms/TokenContext.cxx
@@ -29,51 +29,84 @@
 #include <algorithm>
 
 using com::sun::star::uno::Reference;
+using com::sun::star::xml::sax::XAttributeList;
 
-TokenContext::TokenContext( SvXMLImport& rImport )
-    : SvXMLImportContext( rImport )
+const SvXMLTokenMapEntry aEmptyMap[1] =
+{
+    XML_TOKEN_MAP_END
+};
+
+TokenContext::TokenContext( SvXMLImport& rImport,
+                            sal_uInt16 nPrefix,
+                            const OUString& rLocalName,
+                            const SvXMLTokenMapEntry* pAttributes,
+                            const SvXMLTokenMapEntry* pChildren )
+    : SvXMLImportContext( rImport, nPrefix, rLocalName ),
+      mpAttributes( pAttributes ),
+      mpChildren( pChildren )
 {
 }
 
-void TokenContext::startFastElement(
-    sal_Int32 /*nElement*/,
-    const Reference<css::xml::sax::XFastAttributeList>& xAttributeList )
+void TokenContext::StartElement(
+    const Reference<XAttributeList>& xAttributeList )
 {
     // iterate over attributes
     // - if in map: call HandleAttribute
     // - xmlns:... : ignore
     // - other: warning
+    SAL_WARN_IF( mpAttributes == nullptr, "xmloff", "no token map for attributes" );
+    SvXMLTokenMap aMap( mpAttributes );
 
-    for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttributeList ))
+    sal_Int16 nCount = xAttributeList->getLength();
+    for( sal_Int16 i = 0; i < nCount; i++ )
     {
+        // get key/local-name pair from namespace map
+        OUString sLocalName;
+        sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
+            GetKeyByAttrName( xAttributeList->getNameByIndex(i), &sLocalName );
+
+        // get token from token map
+        sal_uInt16 nToken = aMap.Get( nPrefix, sLocalName );
+
         // and the value...
-        OUString aValue = aIter.toString();
+        const OUString& rValue = xAttributeList->getValueByIndex(i);
 
-        if (HandleAttribute( aIter.getToken(), aValue ))
-            ; //fine
-        else if ( IsTokenInNamespace(aIter.getToken(), XML_NAMESPACE_XMLNS) )
-            ; // ignore
-        else
+        if( nToken != XML_TOK_UNKNOWN )
+        {
+            HandleAttribute( nToken, rValue );
+        }
+        else if( nPrefix != XML_NAMESPACE_XMLNS )
         {
             // error handling, for all attribute that are not
             // namespace declarations
             GetImport().SetError( XMLERROR_UNKNOWN_ATTRIBUTE,
-                                  SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()), aValue);
+                                  sLocalName, rValue);
         }
     }
 }
 
-css::uno::Reference< css::xml::sax::XFastContextHandler > TokenContext::createFastChildContext(
-        sal_Int32 nElement,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+SvXMLImportContextRef TokenContext::CreateChildContext(
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& xAttrList )
 {
-    // call handle child, and pass down arguments
-    SvXMLImportContext* pContext = HandleChild( nElement, xAttrList );
+    // call HandleChild for elements in token map. Ignore other content.
+
+    SvXMLImportContext* pContext = nullptr;
+
+    SAL_WARN_IF( mpChildren == nullptr, "xmloff", "no token map for child elements" );
+    SvXMLTokenMap aMap( mpChildren );
+    sal_uInt16 nToken = aMap.Get( nPrefix, rLocalName );
+    if( nToken != XML_TOK_UNKNOWN )
+    {
+        // call handle child, and pass down arguments
+        pContext = HandleChild( nToken, nPrefix, rLocalName, xAttrList );
+    }
 
     // error handling: create default context and generate warning
     if( pContext == nullptr )
     {
-        GetImport().SetError( XMLERROR_UNKNOWN_ELEMENT, SvXMLImport::getPrefixAndNameFromToken(nElement) );
+        GetImport().SetError( XMLERROR_UNKNOWN_ELEMENT, rLocalName );
     }
     return pContext;
 }
diff --git a/xmloff/source/xforms/TokenContext.hxx b/xmloff/source/xforms/TokenContext.hxx
index a8cd89bdf1e7..97b595232726 100644
--- a/xmloff/source/xforms/TokenContext.hxx
+++ b/xmloff/source/xforms/TokenContext.hxx
@@ -24,33 +24,46 @@
 #include <xmloff/xmltkmap.hxx>
 
 namespace com { namespace sun { namespace star {
-    namespace xml { namespace sax { class XFastAttributeList; } }
+    namespace xml { namespace sax { class XAttributeList; } }
     namespace uno { template<typename T> class Reference; }
 } } }
 
 class SvXMLImport;
 
+#define TOKEN_MAP_ENTRY(NAMESPACE,TOKEN) { XML_NAMESPACE_##NAMESPACE, xmloff::token::XML_##TOKEN, xmloff::token::XML_##TOKEN }
+
+extern const SvXMLTokenMapEntry aEmptyMap[1];
+
 /** handle attributes through an SvXMLTokenMap */
 class TokenContext : public SvXMLImportContext
 {
+protected:
+    const SvXMLTokenMapEntry* mpAttributes;    /// static token map
+    const SvXMLTokenMapEntry* mpChildren;      /// static token map
+
 public:
-    TokenContext( SvXMLImport& rImport );
+    TokenContext( SvXMLImport& rImport,
+                  sal_uInt16 nPrefix,
+                  const OUString& rLocalName,
+                  const SvXMLTokenMapEntry* pAttributes,
+                  const SvXMLTokenMapEntry* pChildren );
 
     // implement SvXMLImportContext methods:
 
     /** call HandleAttribute for each attribute in the token map;
      * create a warning for all others. Classes that wish to override
      * StartElement need to call the parent method. */
-    virtual void SAL_CALL startFastElement( sal_Int32 nElement,
-                                            const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+    virtual void StartElement(
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 
     /** call HandleChild for each child element in the token map;
      * create a warning for all others. Classes that wish to override
      * CreateChildContext may want to call the parent method for
      * handling of defaults. */
-    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
-        sal_Int32 nElement,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+    virtual SvXMLImportContextRef CreateChildContext(
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 
     /** Create a warning for all non-namespace character
      * content. Classes that wish to deal with character content have
@@ -59,15 +72,20 @@ public:
     virtual void Characters( const OUString& rChars ) override;
 
 protected:
-    /** will be called for each attribute. return true for success. */
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    /** will be called for each attribute */
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) = 0;
 
     /** will be called for each child element */
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) = 0;
+        sal_uInt16 nToken,
+
+        // the following attributes are mainly to be used for child
+        // context creation
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) = 0;
 };
 
 #endif
diff --git a/xmloff/source/xforms/XFormsBindContext.cxx b/xmloff/source/xforms/XFormsBindContext.cxx
index cd848f9e1275..c975e8b65b5c 100644
--- a/xmloff/source/xforms/XFormsBindContext.cxx
+++ b/xmloff/source/xforms/XFormsBindContext.cxx
@@ -44,14 +44,29 @@ using com::sun::star::xforms::XModel2;
 using namespace xmloff::token;
 
 
+static const struct SvXMLTokenMapEntry aAttributeMap[] =
+{
+    TOKEN_MAP_ENTRY( NONE, NODESET ),
+    TOKEN_MAP_ENTRY( NONE, ID ),
+    TOKEN_MAP_ENTRY( NONE, READONLY ),
+    TOKEN_MAP_ENTRY( NONE, RELEVANT ),
+    TOKEN_MAP_ENTRY( NONE, REQUIRED ),
+    TOKEN_MAP_ENTRY( NONE, CONSTRAINT ),
+    TOKEN_MAP_ENTRY( NONE, CALCULATE ),
+    TOKEN_MAP_ENTRY( NONE, TYPE ),
+    XML_TOKEN_MAP_END
+};
+
 // helper function; see below
 static void lcl_fillNamespaceContainer( const SvXMLNamespaceMap&,
                                  Reference<XNameContainer> const & );
 
 XFormsBindContext::XFormsBindContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     const Reference<XModel2>& xModel ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributeMap, aEmptyMap ),
         mxModel( xModel )
 {
     // attach binding to model
@@ -60,47 +75,46 @@ XFormsBindContext::XFormsBindContext(
     mxModel->getBindings()->insert( makeAny( mxBinding ) );
 }
 
-bool XFormsBindContext::HandleAttribute( sal_Int32 nElement,
+void XFormsBindContext::HandleAttribute( sal_uInt16 nToken,
                                          const OUString& rValue )
 {
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(NONE, XML_NODESET):
+    case XML_NODESET:
         xforms_setValue( mxBinding, "BindingExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_ID):
+    case XML_ID:
         xforms_setValue( mxBinding, "BindingID", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_READONLY):
+    case XML_READONLY:
         xforms_setValue( mxBinding, "ReadonlyExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_RELEVANT):
+    case XML_RELEVANT:
         xforms_setValue( mxBinding, "RelevantExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_REQUIRED):
+    case XML_REQUIRED:
         xforms_setValue( mxBinding, "RequiredExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_CONSTRAINT):
+    case XML_CONSTRAINT:
         xforms_setValue( mxBinding, "ConstraintExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_CALCULATE):
+    case XML_CALCULATE:
         xforms_setValue( mxBinding, "CalculateExpression", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_TYPE):
+    case XML_TYPE:
         xforms_setValue( mxBinding, "Type",
                       makeAny( xforms_getTypeName( mxModel->getDataTypeRepository(),
                                        GetImport().GetNamespaceMap(),
                                        rValue ) ) );
         break;
     default:
-        return false;
+        OSL_FAIL( "should not happen" );
+        break;
     }
-    return true;
 }
 
-void XFormsBindContext::startFastElement(
-    sal_Int32 nElement,
-    const Reference<css::xml::sax::XFastAttributeList>& xAttributeList )
+void XFormsBindContext::StartElement(
+    const Reference<XAttributeList>& xAttributeList )
 {
     // we need to register the namespaces
     Reference<XNameContainer> xContainer(
@@ -112,13 +126,15 @@ void XFormsBindContext::startFastElement(
         lcl_fillNamespaceContainer( GetImport().GetNamespaceMap(), xContainer);
 
     // call super-class for attribute handling
-    TokenContext::startFastElement( nElement, xAttributeList );
+    TokenContext::StartElement( xAttributeList );
 }
 
 /** will be called for each child element */
 SvXMLImportContext* XFormsBindContext::HandleChild(
-    sal_Int32,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16,
+    sal_uInt16,
+    const OUString&,
+    const Reference<XAttributeList>& )
 {
     OSL_FAIL( "no children supported" );
     return nullptr;
diff --git a/xmloff/source/xforms/XFormsBindContext.hxx b/xmloff/source/xforms/XFormsBindContext.hxx
index a4c7a47a48fd..26424b8c406f 100644
--- a/xmloff/source/xforms/XFormsBindContext.hxx
+++ b/xmloff/source/xforms/XFormsBindContext.hxx
@@ -40,21 +40,24 @@ class XFormsBindContext : public TokenContext
 
 public:
     XFormsBindContext( SvXMLImport& rImport,
+                       sal_uInt16 nPrefix,
+                       const OUString& rLocalName,
                        const css::uno::Reference<css::xforms::XModel2>& xModel );
 
     // implement SvXMLImportContext & TokenContext methods:
 
-    virtual void SAL_CALL startFastElement(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+    virtual void StartElement(
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 
 protected:
-    virtual bool HandleAttribute( sal_Int32 nElement,
+    virtual void HandleAttribute( sal_uInt16 nToken,
                                   const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nNamespace,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 
 };
 
diff --git a/xmloff/source/xforms/XFormsInstanceContext.cxx b/xmloff/source/xforms/XFormsInstanceContext.cxx
index 05beebbb2e11..e1a81a3f6c37 100644
--- a/xmloff/source/xforms/XFormsInstanceContext.cxx
+++ b/xmloff/source/xforms/XFormsInstanceContext.cxx
@@ -46,18 +46,28 @@ using com::sun::star::xml::sax::XAttributeList;
 using xmloff::token::XML_SRC;
 using xmloff::token::XML_ID;
 
+static const SvXMLTokenMapEntry aAttributes[] =
+{
+    TOKEN_MAP_ENTRY( NONE, SRC ),
+    TOKEN_MAP_ENTRY( NONE, ID ),
+    XML_TOKEN_MAP_END
+};
+
 XFormsInstanceContext::XFormsInstanceContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     const Reference<XModel2> & xModel ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributes, aEmptyMap ),
         mxModel( xModel )
 {
     SAL_WARN_IF( !mxModel.is(), "xmloff", "need model" );
 }
 
-css::uno::Reference< css::xml::sax::XFastContextHandler >  XFormsInstanceContext::createFastChildContext(
-    sal_Int32 nElement,
-    const css::uno::Reference< css::xml::sax::XFastAttributeList >& )
+SvXMLImportContextRef XFormsInstanceContext::CreateChildContext(
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& )
 {
     SvXMLImportContext* pContext = nullptr;
 
@@ -66,12 +76,13 @@ css::uno::Reference< css::xml::sax::XFastContextHandler >  XFormsInstanceContext
     // ignored.
     if( mxInstance.is() )
     {
-        GetImport().SetError( XMLERROR_XFORMS_ONLY_ONE_INSTANCE_ELEMENT, SvXMLImport::getPrefixAndNameFromToken(nElement) );
+        GetImport().SetError( XMLERROR_XFORMS_ONLY_ONE_INSTANCE_ELEMENT, rLocalName );
     }
     else
     {
         // create new DomBuilderContext. Save reference to tree in Model.
-        DomBuilderContext* pInstance = new DomBuilderContext( GetImport(), nElement );
+        DomBuilderContext* pInstance =
+            new DomBuilderContext( GetImport(), nPrefix, rLocalName );
         mxInstance = pInstance->getTree();
         pContext = pInstance;
     }
@@ -81,7 +92,7 @@ css::uno::Reference< css::xml::sax::XFastContextHandler >  XFormsInstanceContext
 
 }
 
-void XFormsInstanceContext::endFastElement(sal_Int32 )
+void XFormsInstanceContext::EndElement()
 {
     Sequence<PropertyValue> aSequence( 3 );
     PropertyValue* pSequence = aSequence.getArray();
@@ -96,28 +107,29 @@ void XFormsInstanceContext::endFastElement(sal_Int32 )
 }
 
 
-bool XFormsInstanceContext::HandleAttribute(
-    sal_Int32 nElement,
+void XFormsInstanceContext::HandleAttribute(
+    sal_uInt16 nToken,
     const OUString& rValue )
 {
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(NONE, XML_SRC):
+    case XML_SRC:
         msURL = rValue;
         break;
-    case XML_ELEMENT(NONE, XML_ID):
+    case XML_ID:
         msId = rValue;
         break;
     default:
-        return false;
+        OSL_FAIL( "should not happen" );
         break;
     }
-    return true;
 }
 
 SvXMLImportContext* XFormsInstanceContext::HandleChild(
-    sal_Int32,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16,
+    sal_uInt16,
+    const OUString&,
+    const Reference<XAttributeList>& )
 {
     OSL_FAIL( "to be handled by CreateChildContext" );
     return nullptr;
diff --git a/xmloff/source/xforms/XFormsInstanceContext.hxx b/xmloff/source/xforms/XFormsInstanceContext.hxx
index 92734dcadc89..df77d00a7e18 100644
--- a/xmloff/source/xforms/XFormsInstanceContext.hxx
+++ b/xmloff/source/xforms/XFormsInstanceContext.hxx
@@ -43,6 +43,8 @@ class XFormsInstanceContext : public TokenContext
 
 public:
     XFormsInstanceContext( SvXMLImport& rImport,
+                           sal_uInt16 nPrfx,
+                           const OUString& rLName,
                            const css::uno::Reference<css::xforms::XModel2> & xModel );
 
     // implement SvXMLImportContext & TokenContext methods:
@@ -50,20 +52,23 @@ public:
     // arbitrary DOM elements. For the attributes, we use the
     // TokenContext mechanism.
 
-    virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
-        sal_Int32 nElement,
-        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+    virtual SvXMLImportContextRef CreateChildContext(
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList >& xAttrList ) override;
 
-    virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
+    virtual void EndElement() override;
 
 protected:
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nNamespace,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 };
 
 #endif
diff --git a/xmloff/source/xforms/XFormsModelContext.cxx b/xmloff/source/xforms/XFormsModelContext.cxx
index 9217ab30c14d..e846e54b5866 100644
--- a/xmloff/source/xforms/XFormsModelContext.cxx
+++ b/xmloff/source/xforms/XFormsModelContext.cxx
@@ -44,52 +44,77 @@ using namespace com::sun::star::uno;
 using namespace xmloff::token;
 
 
-XFormsModelContext::XFormsModelContext( SvXMLImport& rImport ) :
-    TokenContext( rImport ),
+static const SvXMLTokenMapEntry aAttributes[] =
+{
+    TOKEN_MAP_ENTRY( NONE, ID ),
+    TOKEN_MAP_ENTRY( NONE, SCHEMA ),
+    XML_TOKEN_MAP_END
+};
+
+static const SvXMLTokenMapEntry aChildren[] =
+{
+    TOKEN_MAP_ENTRY( XFORMS, INSTANCE ),
+    TOKEN_MAP_ENTRY( XFORMS, BIND ),
+    TOKEN_MAP_ENTRY( XFORMS, SUBMISSION ),
+    TOKEN_MAP_ENTRY( XSD,    SCHEMA ),
+    XML_TOKEN_MAP_END
+};
+
+
+XFormsModelContext::XFormsModelContext( SvXMLImport& rImport,
+                                        sal_uInt16 nPrefix,
+                                        const OUString& rLocalName ) :
+    TokenContext( rImport, nPrefix, rLocalName, aAttributes, aChildren ),
     mxModel( xforms_createXFormsModel() )
 {
 }
 
-bool XFormsModelContext::HandleAttribute(
-    sal_Int32 nElement,
+void XFormsModelContext::HandleAttribute(
+    sal_uInt16 nToken,
     const OUString& rValue )
 {
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(NONE, XML_ID):
+    case XML_ID:
         mxModel->setPropertyValue( "ID", makeAny( rValue ) );
         break;
-    case XML_ELEMENT(NONE, XML_SCHEMA):
+    case XML_SCHEMA:
         GetImport().SetError( XMLERROR_XFORMS_NO_SCHEMA_SUPPORT );
         break;
     default:
-        return false;
+        OSL_FAIL( "this should not happen" );
         break;
     }
-    return true;
 }
 
 SvXMLImportContext* XFormsModelContext::HandleChild(
-    sal_Int32 nElement,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16 nToken,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
+    const Reference<XAttributeList>& )
 {
     SvXMLImportContext* pContext = nullptr;
 
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(XFORMS, XML_INSTANCE):
-        pContext = new XFormsInstanceContext( GetImport(), mxModel );
+    case XML_INSTANCE:
+        pContext = new XFormsInstanceContext( GetImport(), nPrefix, rLocalName,
+                                              mxModel );
         break;
-    case XML_ELEMENT(XFORMS, XML_BIND):
-        pContext = new XFormsBindContext( GetImport(), mxModel );
+    case XML_BIND:
+        pContext = new XFormsBindContext( GetImport(), nPrefix, rLocalName,
+                                          mxModel );
         break;
-    case XML_ELEMENT(XFORMS, XML_SUBMISSION):
-        pContext = new XFormsSubmissionContext( GetImport(), mxModel );
+    case XML_SUBMISSION:
+        pContext = new XFormsSubmissionContext( GetImport(), nPrefix,
+                                                rLocalName, mxModel );
         break;
-    case XML_ELEMENT(XSD, XML_SCHEMA):
-        pContext = new SchemaContext( GetImport(), mxModel->getDataTypeRepository() );
+    case XML_SCHEMA:
+        pContext = new SchemaContext(
+            GetImport(), nPrefix, rLocalName, mxModel->getDataTypeRepository() );
         break;
     default:
+        OSL_FAIL( "Boooo!" );
         break;
     }
 
diff --git a/xmloff/source/xforms/XFormsModelContext.hxx b/xmloff/source/xforms/XFormsModelContext.hxx
index 1e44951ad26d..d80b33088a7d 100644
--- a/xmloff/source/xforms/XFormsModelContext.hxx
+++ b/xmloff/source/xforms/XFormsModelContext.hxx
@@ -38,20 +38,24 @@ class XFormsModelContext : public TokenContext
     css::uno::Reference<css::xforms::XModel2> mxModel;
 
 public:
-    XFormsModelContext( SvXMLImport& rImport );
+    XFormsModelContext( SvXMLImport& rImport,
+                        sal_uInt16 nPrfx,
+                        const OUString& rLName );
 
     // implement SvXMLImportContext & TokenContext methods:
 
     virtual void EndElement() override;
 
 protected:
-    virtual bool HandleAttribute(
-        sal_Int32 nElement,
+    virtual void HandleAttribute(
+        sal_uInt16 nToken,
         const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nPrefix,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 };
 
 #endif
diff --git a/xmloff/source/xforms/XFormsSubmissionContext.cxx b/xmloff/source/xforms/XFormsSubmissionContext.cxx
index 695b70808a87..254c7b97b11d 100644
--- a/xmloff/source/xforms/XFormsSubmissionContext.cxx
+++ b/xmloff/source/xforms/XFormsSubmissionContext.cxx
@@ -41,10 +41,32 @@ using namespace com::sun::star::uno;
 using namespace xmloff::token;
 
 
+static const struct SvXMLTokenMapEntry aAttributeMap[] =
+{
+    TOKEN_MAP_ENTRY( NONE, ID ),
+    TOKEN_MAP_ENTRY( NONE, BIND ),
+    TOKEN_MAP_ENTRY( NONE, REF ),
+    TOKEN_MAP_ENTRY( NONE, ACTION ),
+    TOKEN_MAP_ENTRY( NONE, METHOD ),
+    TOKEN_MAP_ENTRY( NONE, VERSION ),
+    TOKEN_MAP_ENTRY( NONE, INDENT ),
+    TOKEN_MAP_ENTRY( NONE, MEDIATYPE ),
+    TOKEN_MAP_ENTRY( NONE, ENCODING ),
+    TOKEN_MAP_ENTRY( NONE, OMIT_XML_DECLARATION ),
+    TOKEN_MAP_ENTRY( NONE, STANDALONE ),
+    TOKEN_MAP_ENTRY( NONE, CDATA_SECTION_ELEMENTS ),
+    TOKEN_MAP_ENTRY( NONE, REPLACE ),
+    TOKEN_MAP_ENTRY( NONE, SEPARATOR ),
+    TOKEN_MAP_ENTRY( NONE, INCLUDENAMESPACEPREFIXES ),
+    XML_TOKEN_MAP_END
+};
+
 XFormsSubmissionContext::XFormsSubmissionContext(
     SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName,
     const Reference<XModel2>& xModel ) :
-        TokenContext( rImport ),
+        TokenContext( rImport, nPrefix, rLocalName, aAttributeMap, aEmptyMap ),
         mxSubmission()
 {
     // register submission with model
@@ -69,68 +91,69 @@ Any toBool( const OUString& rValue )
 
 } // namespace
 
-bool XFormsSubmissionContext::HandleAttribute( sal_Int32 nElement,
+void XFormsSubmissionContext::HandleAttribute( sal_uInt16 nToken,
                                                const OUString& rValue )
 {
-    switch( nElement )
+    switch( nToken )
     {
-    case XML_ELEMENT(NONE, XML_ID):
+    case XML_ID:
         xforms_setValue( mxSubmission, "ID", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_BIND):
+    case XML_BIND:
         xforms_setValue( mxSubmission, "Bind", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_REF):
+    case XML_REF:
         xforms_setValue( mxSubmission, "Ref", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_ACTION):
+    case XML_ACTION:
         xforms_setValue( mxSubmission, "Action", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_METHOD):
+    case XML_METHOD:
         xforms_setValue( mxSubmission, "Method", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_VERSION):
+    case XML_VERSION:
         xforms_setValue( mxSubmission, "Version", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_INDENT):
+    case XML_INDENT:
         xforms_setValue( mxSubmission, "Indent", toBool( rValue ) );
         break;
-    case XML_ELEMENT(NONE, XML_MEDIATYPE):
+    case XML_MEDIATYPE:
         xforms_setValue( mxSubmission, "MediaType", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_ENCODING):
+    case XML_ENCODING:
         xforms_setValue( mxSubmission, "Encoding", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_OMIT_XML_DECLARATION):
+    case XML_OMIT_XML_DECLARATION:
         xforms_setValue( mxSubmission, "OmitXmlDeclaration",
                       toBool( rValue ) );
         break;
-    case XML_ELEMENT(NONE, XML_STANDALONE):
+    case XML_STANDALONE:
         xforms_setValue( mxSubmission, "Standalone", toBool( rValue ) );
         break;
-    case XML_ELEMENT(NONE, XML_CDATA_SECTION_ELEMENTS):
+    case XML_CDATA_SECTION_ELEMENTS:
         xforms_setValue( mxSubmission, "CDataSectionElement", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_REPLACE):
+    case XML_REPLACE:
         xforms_setValue( mxSubmission, "Replace", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_SEPARATOR):
+    case XML_SEPARATOR:
         xforms_setValue( mxSubmission, "Separator", rValue );
         break;
-    case XML_ELEMENT(NONE, XML_INCLUDENAMESPACEPREFIXES):
+    case XML_INCLUDENAMESPACEPREFIXES:
         xforms_setValue( mxSubmission, "IncludeNamespacePrefixes", rValue );
         break;
     default:
-        return false;
+        OSL_FAIL( "unknown attribute" );
         break;
     }
-    return true;
 }
 
 /** will be called for each child element */
 SvXMLImportContext* XFormsSubmissionContext::HandleChild(
-    sal_Int32,
-    const Reference<css::xml::sax::XFastAttributeList>& )
+    sal_uInt16,
+    sal_uInt16,
+    const OUString&,
+    const Reference<XAttributeList>& )
 {
     OSL_FAIL( "no children supported" );
     return nullptr;
diff --git a/xmloff/source/xforms/XFormsSubmissionContext.hxx b/xmloff/source/xforms/XFormsSubmissionContext.hxx
index 5fe7d4d379ef..33ac54542bd8 100644
--- a/xmloff/source/xforms/XFormsSubmissionContext.hxx
+++ b/xmloff/source/xforms/XFormsSubmissionContext.hxx
@@ -39,17 +39,21 @@ class XFormsSubmissionContext : public TokenContext
 
 public:
     XFormsSubmissionContext( SvXMLImport& rImport,
+                             sal_uInt16 nPrefix,
+                             const OUString& rLocalName,
                              const css::uno::Reference<css::xforms::XModel2>& xModel );
 
     // implement TokenContext methods:
 
 protected:
-    virtual bool HandleAttribute( sal_Int32 nElement,
+    virtual void HandleAttribute( sal_uInt16 nToken,
                                   const OUString& rValue ) override;
 
     virtual SvXMLImportContext* HandleChild(
-        sal_Int32 nElement,
-        const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList ) override;
+        sal_uInt16 nToken,
+        sal_uInt16 nNamespace,
+        const OUString& rLocalName,
+        const css::uno::Reference<css::xml::sax::XAttributeList>& xAttrList ) override;
 
 };
 
diff --git a/xmloff/source/xforms/xformsimport.cxx b/xmloff/source/xforms/xformsimport.cxx
index 2579d2cf0d93..4d07507a6e68 100644
--- a/xmloff/source/xforms/xformsimport.cxx
+++ b/xmloff/source/xforms/xformsimport.cxx
@@ -54,9 +54,12 @@ using com::sun::star::form::binding::XListEntrySink;
 using com::sun::star::form::submission::XSubmission;
 using com::sun::star::form::submission::XSubmissionSupplier;
 
-SvXMLImportContext* createXFormsModelContext( SvXMLImport& rImport )
+SvXMLImportContext* createXFormsModelContext(
+    SvXMLImport& rImport,
+    sal_uInt16 nPrefix,
+    const OUString& rLocalName )
 {
-    return new XFormsModelContext( rImport );
+    return new XFormsModelContext( rImport, nPrefix, rLocalName );
 }
 
 void bindXFormsValueBinding(Reference<XModel> const& xModel,


More information about the Libreoffice-commits mailing list