summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/source/meta/xmlmetai.cxx35
1 files changed, 25 insertions, 10 deletions
diff --git a/xmloff/source/meta/xmlmetai.cxx b/xmloff/source/meta/xmlmetai.cxx
index 907fd68d4e0d..4be70650152e 100644
--- a/xmloff/source/meta/xmlmetai.cxx
+++ b/xmloff/source/meta/xmlmetai.cxx
@@ -44,11 +44,13 @@ class XMLDocumentBuilderContext : public SvXMLImportContext
{
private:
css::uno::Reference< css::xml::dom::XSAXDocumentBuilder2> mxDocBuilder;
+ SvXMLMetaDocumentContext *const m_pTopLevel;
public:
XMLDocumentBuilderContext(SvXMLImport& rImport, sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList,
- const css::uno::Reference< css::xml::dom::XSAXDocumentBuilder2>& rDocBuilder);
+ const css::uno::Reference<css::xml::dom::XSAXDocumentBuilder2>& rDocBuilder,
+ SvXMLMetaDocumentContext * pTopLevel);
virtual void SAL_CALL characters( const OUString& aChars ) override;
@@ -69,9 +71,11 @@ public:
XMLDocumentBuilderContext::XMLDocumentBuilderContext(SvXMLImport& rImport,
sal_Int32 /*nElement*/, const uno::Reference<xml::sax::XFastAttributeList>&,
- const uno::Reference<xml::dom::XSAXDocumentBuilder2>& rDocBuilder) :
- SvXMLImportContext( rImport ),
- mxDocBuilder(rDocBuilder)
+ const uno::Reference<xml::dom::XSAXDocumentBuilder2>& rDocBuilder,
+ SvXMLMetaDocumentContext *const pTopLevel)
+ : SvXMLImportContext(rImport)
+ , mxDocBuilder(rDocBuilder)
+ , m_pTopLevel(pTopLevel)
{
}
@@ -84,6 +88,13 @@ void SAL_CALL XMLDocumentBuilderContext::startFastElement( sal_Int32 nElement,
void SAL_CALL XMLDocumentBuilderContext::endFastElement( sal_Int32 nElement )
{
mxDocBuilder->endFastElement(nElement);
+ if (m_pTopLevel)
+ {
+ // call this here because in the flat ODF case the top-level
+ // endFastElement is called only at the very end of the document,
+ // which is too late to init BuildId
+ m_pTopLevel->FinishMetaElement();
+ }
}
void SAL_CALL XMLDocumentBuilderContext::startUnknownElement( const OUString& rNamespace,
@@ -105,7 +116,7 @@ void SAL_CALL XMLDocumentBuilderContext::characters( const OUString& rChars )
uno::Reference< xml::sax::XFastContextHandler > SAL_CALL XMLDocumentBuilderContext::createFastChildContext(
sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
{
- return new XMLDocumentBuilderContext( GetImport(), nElement, xAttrList, mxDocBuilder );
+ return new XMLDocumentBuilderContext(GetImport(), nElement, xAttrList, mxDocBuilder, nullptr);
}
static void
@@ -181,18 +192,22 @@ SvXMLMetaDocumentContext::~SvXMLMetaDocumentContext()
{
}
-void SAL_CALL SvXMLMetaDocumentContext::startFastElement( sal_Int32 nElement,
+void SAL_CALL SvXMLMetaDocumentContext::startFastElement(sal_Int32 /*nElement*/,
const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
{
mxDocBuilder->startDocument();
// hardcode office:document-meta (necessary in case of flat file ODF)
- mxDocBuilder->startFastElement( ( nElement & NMSP_MASK ) | XML_DOCUMENT_META, xAttrList );
+ mxDocBuilder->startFastElement(XML_ELEMENT(OFFICE, XML_DOCUMENT_META), xAttrList);
+}
+
+void SAL_CALL SvXMLMetaDocumentContext::endFastElement(sal_Int32 /*nElement*/)
+{
}
-void SAL_CALL SvXMLMetaDocumentContext::endFastElement( sal_Int32 nElement )
+void SvXMLMetaDocumentContext::FinishMetaElement()
{
// hardcode office:document-meta (necessary in case of flat file ODF)
- mxDocBuilder->endFastElement( ( nElement & NMSP_MASK ) | XML_DOCUMENT_META );
+ mxDocBuilder->endFastElement(XML_ELEMENT(OFFICE, XML_DOCUMENT_META));
mxDocBuilder->endDocument();
if (mxDocProps.is())
{
@@ -213,7 +228,7 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL SvXMLMetaDocumentContex
{
if ( nElement == ( NAMESPACE_TOKEN( XML_NAMESPACE_OFFICE ) | XML_META ) )
return new XMLDocumentBuilderContext(
- GetImport(), nElement, xAttrList, mxDocBuilder);
+ GetImport(), nElement, xAttrList, mxDocBuilder, this);
else
return new SvXMLImportContext( GetImport() );
}