summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-11-30 18:00:53 +0100
committerMichael Stahl <mstahl@redhat.com>2017-11-30 22:32:46 +0100
commitebb34571c19c5ac939fbf5aed2ab66ee18e298dc (patch)
tree06e903579f92dc4f0f54dfb1dd90855551e2da23 /dbaccess
parent2bda2100d8abbf66285551379215579108a4ebf0 (diff)
dbaccess: split up ODBFilter::CreateContext()
This was handling XML elements at 3 different levels; add some more context classes to handle the nesting better. Change-Id: I05d7b2b7dc2d797acd4e97eacb54fa07e32d88e2
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/source/filter/xml/xmlEnums.hxx12
-rw-r--r--dbaccess/source/filter/xml/xmlfilter.cxx182
-rw-r--r--dbaccess/source/filter/xml/xmlfilter.hxx3
3 files changed, 173 insertions, 24 deletions
diff --git a/dbaccess/source/filter/xml/xmlEnums.hxx b/dbaccess/source/filter/xml/xmlEnums.hxx
index de87caa26b48..397e9bc592a4 100644
--- a/dbaccess/source/filter/xml/xmlEnums.hxx
+++ b/dbaccess/source/filter/xml/xmlEnums.hxx
@@ -25,11 +25,17 @@ namespace dbaxml
{
enum XMLDocTokens
{
- XML_TOK_DOC_AUTOSTYLES,
XML_TOK_DOC_SETTINGS,
- XML_TOK_DOC_DATABASE,
XML_TOK_DOC_STYLES,
- XML_TOK_DOC_SCRIPT
+ XML_TOK_DOC_CONTENT,
+ XML_TOK_DOC_META
+ };
+ enum XMLDocContentTokens
+ {
+ XML_TOK_CONTENT_AUTOSTYLES,
+ XML_TOK_CONTENT_STYLES,
+ XML_TOK_CONTENT_SCRIPTS,
+ XML_TOK_CONTENT_BODY,
};
enum XMLDatabaseToken
{
diff --git a/dbaccess/source/filter/xml/xmlfilter.cxx b/dbaccess/source/filter/xml/xmlfilter.cxx
index f386206bec66..e6db6b055d41 100644
--- a/dbaccess/source/filter/xml/xmlfilter.cxx
+++ b/dbaccess/source/filter/xml/xmlfilter.cxx
@@ -382,6 +382,137 @@ bool ODBFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
return bRet;
}
+class DBXMLDocumentSettingsContext : public SvXMLImportContext
+{
+public:
+ DBXMLDocumentSettingsContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ if (nPrefix == XML_NAMESPACE_OFFICE && IsXMLToken(rLocalName, XML_SETTINGS))
+ {
+ return new XMLDocumentSettingsContext(GetImport(), nPrefix, rLocalName, xAttrList);
+ }
+ else
+ {
+ return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+ }
+ }
+};
+
+class DBXMLDocumentStylesContext : public SvXMLImportContext
+{
+public:
+ DBXMLDocumentStylesContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ SvXMLImportContext *pContext = nullptr;
+
+ ODBFilter & rImport(static_cast<ODBFilter&>(GetImport()));
+ const SvXMLTokenMap& rTokenMap = rImport.GetDocContentElemTokenMap();
+ switch (rTokenMap.Get(nPrefix, rLocalName))
+ {
+ case XML_TOK_CONTENT_STYLES:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateStylesContext(nPrefix, rLocalName, xAttrList, false);
+ break;
+ case XML_TOK_CONTENT_AUTOSTYLES:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateStylesContext(nPrefix, rLocalName, xAttrList, true);
+ break;
+ default:
+ break;
+ }
+
+ if (!pContext)
+ pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+
+ return pContext;
+ }
+};
+
+class DBXMLDocumentBodyContext : public SvXMLImportContext
+{
+public:
+ DBXMLDocumentBodyContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> &) override
+ {
+ if ((XML_NAMESPACE_OFFICE == nPrefix || XML_NAMESPACE_OOO == nPrefix)
+ && IsXMLToken(rLocalName, XML_DATABASE))
+ {
+ ODBFilter & rImport(static_cast<ODBFilter&>(GetImport()));
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ return new OXMLDatabase(rImport, nPrefix, rLocalName );
+ }
+ else
+ {
+ return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+ }
+ }
+};
+
+class DBXMLDocumentContentContext : public SvXMLImportContext
+{
+public:
+ DBXMLDocumentContentContext(SvXMLImport & rImport,
+ sal_uInt16 const nPrefix,
+ const OUString& rLocalName)
+ : SvXMLImportContext(rImport, nPrefix, rLocalName)
+ {
+ }
+
+ virtual SvXMLImportContextRef CreateChildContext(sal_uInt16 const nPrefix,
+ const OUString& rLocalName,
+ const uno::Reference<xml::sax::XAttributeList> & xAttrList) override
+ {
+ SvXMLImportContext *pContext = nullptr;
+
+ ODBFilter & rImport(static_cast<ODBFilter&>(GetImport()));
+ const SvXMLTokenMap& rTokenMap = rImport.GetDocContentElemTokenMap();
+ switch (rTokenMap.Get(nPrefix, rLocalName))
+ {
+ case XML_TOK_CONTENT_AUTOSTYLES:
+ rImport.GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
+ pContext = rImport.CreateStylesContext(nPrefix, rLocalName, xAttrList, true);
+ break;
+ case XML_TOK_CONTENT_SCRIPTS:
+ pContext = new XMLScriptContext(GetImport(), rLocalName, rImport.GetModel());
+ break;
+ case XML_TOK_CONTENT_BODY:
+ pContext = new DBXMLDocumentBodyContext(rImport, nPrefix, rLocalName);
+ default:
+ break;
+ }
+
+ if (!pContext)
+ pContext = new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
+
+ return pContext;
+ }
+};
SvXMLImportContext* ODBFilter::CreateContext( sal_uInt16 nPrefix,
const OUString& rLocalName,
@@ -394,22 +525,15 @@ SvXMLImportContext* ODBFilter::CreateContext( sal_uInt16 nPrefix,
{
case XML_TOK_DOC_SETTINGS:
GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = new XMLDocumentSettingsContext( *this, nPrefix, rLocalName,xAttrList );
- break;
- case XML_TOK_DOC_DATABASE:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = new OXMLDatabase( *this, nPrefix, rLocalName );
+ pContext = new DBXMLDocumentSettingsContext(*this, nPrefix, rLocalName);
break;
case XML_TOK_DOC_STYLES:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, false);
+ pContext = new DBXMLDocumentStylesContext(*this, nPrefix, rLocalName);
break;
- case XML_TOK_DOC_AUTOSTYLES:
- GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP );
- pContext = CreateStylesContext(nPrefix, rLocalName, xAttrList, true);
+ case XML_TOK_DOC_CONTENT:
+ pContext = new DBXMLDocumentContentContext(*this, nPrefix, rLocalName);
break;
- case XML_TOK_DOC_SCRIPT:
- pContext = new XMLScriptContext( *this, rLocalName, GetModel() );
+ default:
break;
}
@@ -478,15 +602,12 @@ const SvXMLTokenMap& ODBFilter::GetDocElemTokenMap() const
{
static const SvXMLTokenMapEntry aElemTokenMap[]=
{
- { XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
- { XML_NAMESPACE_OOO, XML_SETTINGS, XML_TOK_DOC_SETTINGS },
- { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES },
- { XML_NAMESPACE_OOO, XML_STYLES, XML_TOK_DOC_STYLES },
- { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
- { XML_NAMESPACE_OOO, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
- { XML_NAMESPACE_OFFICE, XML_DATABASE, XML_TOK_DOC_DATABASE },
- { XML_NAMESPACE_OOO, XML_DATABASE, XML_TOK_DOC_DATABASE },
- { XML_NAMESPACE_OFFICE, XML_SCRIPTS, XML_TOK_DOC_SCRIPT },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_SETTINGS, XML_TOK_DOC_SETTINGS },
+ { XML_NAMESPACE_OOO, XML_DOCUMENT_SETTINGS, XML_TOK_DOC_SETTINGS },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_STYLES, XML_TOK_DOC_STYLES },
+ { XML_NAMESPACE_OOO, XML_DOCUMENT_STYLES, XML_TOK_DOC_STYLES },
+ { XML_NAMESPACE_OFFICE, XML_DOCUMENT_CONTENT, XML_TOK_DOC_CONTENT },
+ { XML_NAMESPACE_OOO, XML_DOCUMENT_CONTENT, XML_TOK_DOC_CONTENT },
XML_TOKEN_MAP_END
};
m_pDocElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
@@ -494,6 +615,25 @@ const SvXMLTokenMap& ODBFilter::GetDocElemTokenMap() const
return *m_pDocElemTokenMap;
}
+const SvXMLTokenMap& ODBFilter::GetDocContentElemTokenMap() const
+{
+ if (!m_pDocContentElemTokenMap.get())
+ {
+ static const SvXMLTokenMapEntry aElemTokenMap[]=
+ {
+ { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_CONTENT_STYLES },
+ { XML_NAMESPACE_OOO, XML_STYLES, XML_TOK_CONTENT_STYLES },
+ { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_CONTENT_AUTOSTYLES },
+ { XML_NAMESPACE_OOO, XML_AUTOMATIC_STYLES, XML_TOK_CONTENT_AUTOSTYLES },
+ { XML_NAMESPACE_OFFICE, XML_SCRIPTS, XML_TOK_CONTENT_SCRIPTS },
+ { XML_NAMESPACE_OFFICE, XML_BODY, XML_TOK_CONTENT_BODY },
+ XML_TOKEN_MAP_END
+ };
+ m_pDocContentElemTokenMap.reset(new SvXMLTokenMap( aElemTokenMap ));
+ }
+ return *m_pDocContentElemTokenMap;
+}
+
const SvXMLTokenMap& ODBFilter::GetDatabaseElemTokenMap() const
{
diff --git a/dbaccess/source/filter/xml/xmlfilter.hxx b/dbaccess/source/filter/xml/xmlfilter.hxx
index d2372d849d08..abe106cb60b1 100644
--- a/dbaccess/source/filter/xml/xmlfilter.hxx
+++ b/dbaccess/source/filter/xml/xmlfilter.hxx
@@ -65,6 +65,7 @@ private:
TInfoSequence m_aInfoSequence;
mutable std::unique_ptr<SvXMLTokenMap> m_pDocElemTokenMap;
+ mutable std::unique_ptr<SvXMLTokenMap> m_pDocContentElemTokenMap;
mutable std::unique_ptr<SvXMLTokenMap> m_pDatabaseElemTokenMap;
mutable std::unique_ptr<SvXMLTokenMap> m_pDataSourceElemTokenMap;
mutable std::unique_ptr<SvXMLTokenMap> m_pLoginElemTokenMap;
@@ -92,6 +93,7 @@ private:
*/
static void fillPropertyMap(const Any& _rValue,TPropertyNameMap& _rMap);
+public:
SvXMLImportContext* CreateStylesContext(sal_uInt16 nPrefix,const OUString& rLocalName,
const Reference< XAttributeList>& xAttrList, bool bIsAutoStyle );
@@ -128,6 +130,7 @@ public:
const TPropertyNameMap& getQuerySettings() const { return m_aQuerySettings;}
const SvXMLTokenMap& GetDocElemTokenMap() const;
+ const SvXMLTokenMap& GetDocContentElemTokenMap() const;
const SvXMLTokenMap& GetDatabaseElemTokenMap() const;
const SvXMLTokenMap& GetDataSourceElemTokenMap() const;
const SvXMLTokenMap& GetLoginElemTokenMap() const;