chart2/inc/ChartModel.hxx | 12 ++-- chart2/inc/ChartView.hxx | 7 -- chart2/qa/extras/xshape/chart2xshape.cxx | 14 ++--- chart2/source/controller/main/ChartController_Window.cxx | 2 chart2/source/inc/dumpxmltostring.hxx | 41 +++++++++++++++ chart2/source/model/main/ChartModel.cxx | 10 ++- chart2/source/view/main/ChartView.cxx | 8 ++ include/sfx2/xmldump.hxx | 29 ---------- offapi/com/sun/star/qa/XDumper.idl | 3 - svtools/source/misc/embedhlp.cxx | 12 ++-- sw/source/core/ole/ndole.cxx | 1 11 files changed, 83 insertions(+), 56 deletions(-)
New commits: commit 56e17186ffcda7e93530bef3a06120584bb7d579 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Sat Dec 10 12:34:50 2022 +0100 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Wed Dec 14 12:56:52 2022 +0000 [API CHANGE] Merge sfx2::XmlDump into css::qa::XDumper Both sfx2::XmlDump and css::qa::XDumper were (only) used to dump various data from ChartModel and ChartView instances in debugging (e.g., F12 and Shift-F12 in an SW_DEBUG=1 Writer) and testing scenarios. The problem with XmlDump was that it was used as the target of a dynamic_cast from a UNO type, which is dangerous (see the upcoming commit introducing loplugin:unocast for details). One fix would have been to replace that dynamic_cast with a use of XUnoTunnel, and make ChartModel and ChartView implement that. But those classes already implement XDumper, so it looks more natural to use XDumper for that purpose too. However, the information that was obtained via XDumper was rather different from the information that was obtained via XmlDump. So make an incompatible change to the (unpublished) XDumper, adding a kind parameter distinguishing the original behavior of XDumper (kind == "shapes") from the original behavior of XmlDump (kind == ""). Change-Id: Ia7379bedfc45ab62a298fdc2f030cebaf21c4885 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/144145 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx index b877e47db5e0..8c876d8b95e6 100644 --- a/chart2/inc/ChartModel.hxx +++ b/chart2/inc/ChartModel.hxx @@ -52,10 +52,11 @@ #include <cppuhelper/implbase.hxx> #include <comphelper/interfacecontainer2.hxx> #include <vcl/GraphicObject.hxx> -#include <sfx2/xmldump.hxx> #include <memory> +typedef struct _xmlTextWriter* xmlTextWriterPtr; + namespace com::sun::star::awt { class XRequestCallback; } namespace com::sun::star::chart2::data { class XDataProvider; } namespace com::sun::star::document { class XFilter; } @@ -113,7 +114,7 @@ class UndoManager; class ChartView; class OOO_DLLPUBLIC_CHARTTOOLS SAL_LOPLUGIN_ANNOTATE("crosscast") ChartModel final : - public impl::ChartModel_Base, public sfx2::XmlDump + public impl::ChartModel_Base { private: @@ -452,7 +453,7 @@ public: virtual void SAL_CALL update() override; // XDumper - virtual OUString SAL_CALL dump() override; + virtual OUString SAL_CALL dump(OUString const & kind) override; // normal methods css::uno::Reference< css::util::XNumberFormatsSupplier > const & @@ -474,10 +475,9 @@ public: const rtl::Reference< ::chart::ChartTypeManager > & getTypeManager() const { return m_xChartTypeManager; } - /// See sfx2::XmlDump::dumpAsXml(). - void dumpAsXml(xmlTextWriterPtr pWriter) const override; - private: + void dumpAsXml(xmlTextWriterPtr pWriter) const; + sal_Int32 mnStart; sal_Int32 mnEnd; }; diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx index 5c7e70e97900..5f0665877e3d 100644 --- a/chart2/inc/ChartView.hxx +++ b/chart2/inc/ChartView.hxx @@ -43,7 +43,6 @@ #include <memory> #include <vcl/timer.hxx> -#include <sfx2/xmldump.hxx> namespace com::sun::star::drawing { class XDrawPage; } namespace com::sun::star::drawing { class XShapes; } @@ -97,7 +96,6 @@ class OOO_DLLPUBLIC_CHARTVIEW ChartView final : public ::cppu::WeakImplHelper< > , public ExplicitValueProvider , private SfxListener - , public sfx2::XmlDump { private: void init(); @@ -180,14 +178,13 @@ public: virtual ::sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< ::sal_Int8 >& aIdentifier ) override; // XDumper - virtual OUString SAL_CALL dump() override; + virtual OUString SAL_CALL dump(OUString const & kind) override; void setViewDirty(); css::uno::Reference<css::uno::XComponentContext> const& getComponentContext() { return m_xCC;} - /// See sfx2::XmlDump::dumpAsXml(). - void dumpAsXml(xmlTextWriterPtr pWriter) const override; + void dumpAsXml(xmlTextWriterPtr pWriter) const; private: //methods void createShapes(); diff --git a/chart2/qa/extras/xshape/chart2xshape.cxx b/chart2/qa/extras/xshape/chart2xshape.cxx index 23e3f93eaafa..92605a71199c 100644 --- a/chart2/qa/extras/xshape/chart2xshape.cxx +++ b/chart2/qa/extras/xshape/chart2xshape.cxx @@ -63,6 +63,11 @@ private: namespace { +OUString getShapeDump(css::uno::Reference<css::chart::XChartDocument> const& doc) +{ + return css::uno::Reference<css::qa::XDumper>(doc, css::uno::UNO_QUERY_THROW)->dump("shapes"); +} + bool checkDumpAgainstFile(std::u16string_view rDump, std::u16string_view aFilePath, char const* toleranceFile) { @@ -80,8 +85,7 @@ OUString Chart2XShapeTest::getXShapeDumpString() { uno::Reference<chart::XChartDocument> xChartDoc(getChartCompFromSheet(0, 0, mxComponent), UNO_QUERY_THROW); - uno::Reference<qa::XDumper> xDumper(xChartDoc, UNO_QUERY_THROW); - return xDumper->dump(); + return getShapeDump(xChartDoc); } xmlDocUniquePtr Chart2XShapeTest::getXShapeDumpXmlDoc() @@ -132,8 +136,7 @@ void Chart2XShapeTest::testTdf149204() // - Attr: sizeX loadFromURL(u"pptx/tdf149204.pptx"); uno::Reference<chart::XChartDocument> xChartDoc = getChartDocFromDrawImpress(0, 0); - uno::Reference<qa::XDumper> xDumper(xChartDoc, UNO_QUERY_THROW); - compareAgainstReference(xDumper->dump(), u"tdf149204.xml"); + compareAgainstReference(getShapeDump(xChartDoc), u"tdf149204.xml"); } void Chart2XShapeTest::testTdf151424() @@ -251,8 +254,7 @@ void Chart2XShapeTest::testTdf88154LabelRotatedLayout() { loadFromURL(u"pptx/tdf88154_LabelRotatedLayout.pptx"); uno::Reference<chart::XChartDocument> xChartDoc = getChartDocFromDrawImpress(0, 5); - uno::Reference<qa::XDumper> xDumper(xChartDoc, UNO_QUERY_THROW); - OUString rDump = xDumper->dump(); + OUString rDump = getShapeDump(xChartDoc); OString aXmlDump = OUStringToOString(rDump, RTL_TEXTENCODING_UTF8); xmlDocUniquePtr pXmlDoc(xmlParseDoc(reinterpret_cast<const xmlChar*>(aXmlDump.getStr()))); diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx index 018419b0eacf..70ab5436e148 100644 --- a/chart2/source/controller/main/ChartController_Window.cxx +++ b/chart2/source/controller/main/ChartController_Window.cxx @@ -1563,7 +1563,7 @@ bool ChartController::execute_KeyInput( const KeyEvent& rKEvt ) rtl::Reference< ChartModel > xChartModel = getChartModel(); if(xChartModel.is()) { - OUString aDump = xChartModel->dump(); + OUString aDump = xChartModel->dump("shapes"); SAL_WARN("chart2", aDump); } } diff --git a/chart2/source/inc/dumpxmltostring.hxx b/chart2/source/inc/dumpxmltostring.hxx new file mode 100644 index 000000000000..d03f1cab9d45 --- /dev/null +++ b/chart2/source/inc/dumpxmltostring.hxx @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <sal/config.h> + +#include <libxml/tree.h> +#include <libxml/xmlwriter.h> + +#include <new> + +namespace chart +{ +template <typename F> OUString dumpXmlToString(F f) +{ + auto const buf = xmlBufferCreate(); + if (buf == nullptr) + { + throw std::bad_alloc(); + } + auto const writer = xmlNewTextWriterMemory(buf, 0); + if (writer == nullptr) + { + throw std::bad_alloc(); + } + f(writer); + xmlFreeTextWriter(writer); + OString s(reinterpret_cast<char const*>(xmlBufferContent(buf)), xmlBufferLength(buf)); + xmlBufferFree(buf); + return OStringToOUString(s, RTL_TEXTENCODING_ISO_8859_1); //TODO +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index 781fc7c8e08a..0564f83703b8 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -36,6 +36,7 @@ #include <PopupRequest.hxx> #include <ModifyListenerHelper.hxx> #include <Diagram.hxx> +#include <dumpxmltostring.hxx> #include <com/sun/star/chart/ChartDataRowSource.hpp> #include <com/sun/star/chart2/data/XPivotTableDataProvider.hpp> @@ -1257,12 +1258,17 @@ uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > SAL_CALL ChartM } //XDumper -OUString SAL_CALL ChartModel::dump() +OUString SAL_CALL ChartModel::dump(OUString const & kind) { + if (kind.isEmpty()) { + return dumpXmlToString([this](auto writer) { return dumpAsXml(writer); }); + } + + // kind == "shapes": uno::Reference< qa::XDumper > xDumper( createInstance( CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY ); if (xDumper.is()) - return xDumper->dump(); + return xDumper->dump(kind); return OUString(); } diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 584dfdb5ea72..2de5611c5ed0 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -56,6 +56,7 @@ #include <DateHelper.hxx> #include <ExplicitCategoriesProvider.hxx> #include <defines.hxx> +#include <dumpxmltostring.hxx> #include <unonames.hxx> #include <editeng/frmdiritem.hxx> #include <editeng/eeitem.hxx> @@ -1784,8 +1785,13 @@ uno::Sequence< OUString > ChartView::getAvailableServiceNames() return aServiceNames; } -OUString ChartView::dump() +OUString ChartView::dump(OUString const & kind) { + if (kind.isEmpty()) { + return dumpXmlToString([this](auto writer) { return dumpAsXml(writer); }); + } + + // kind == "shapes": #if HAVE_FEATURE_DESKTOP // Used for unit tests and in chartcontroller only, no need to drag in this when cross-compiling // for non-desktop diff --git a/include/sfx2/xmldump.hxx b/include/sfx2/xmldump.hxx deleted file mode 100644 index cd32d73299e0..000000000000 --- a/include/sfx2/xmldump.hxx +++ /dev/null @@ -1,29 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#pragma once - -#include <sal/types.h> - -typedef struct _xmlTextWriter* xmlTextWriterPtr; - -namespace sfx2 -{ -/// Implemented by objects that can be dumped to xml for debugging purposes. -class SAL_NO_VTABLE SAL_DLLPUBLIC_RTTI SAL_LOPLUGIN_ANNOTATE("crosscast") XmlDump -{ -public: - virtual void dumpAsXml(xmlTextWriterPtr pWriter) const = 0; - -protected: - ~XmlDump() noexcept = default; -}; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/offapi/com/sun/star/qa/XDumper.idl b/offapi/com/sun/star/qa/XDumper.idl index f980ac04a02d..0722b8b5bdd4 100644 --- a/offapi/com/sun/star/qa/XDumper.idl +++ b/offapi/com/sun/star/qa/XDumper.idl @@ -24,10 +24,11 @@ interface XDumper : com::sun::star::uno::XInterface { /** * dump the content into a string + * @param kind What kind of data to dump (for objects that know how to dump different data). * @since LibreOffice 3.6 */ - string dump(); + string dump([in] string kind); }; } ; // chart2 diff --git a/svtools/source/misc/embedhlp.cxx b/svtools/source/misc/embedhlp.cxx index 053a30835d2d..d784b20a4a39 100644 --- a/svtools/source/misc/embedhlp.cxx +++ b/svtools/source/misc/embedhlp.cxx @@ -51,12 +51,12 @@ #include <com/sun/star/embed/XStateChangeListener.hpp> #include <com/sun/star/embed/XLinkageSupport.hpp> #include <com/sun/star/chart2/XDefaultSizeTransmitter.hpp> +#include <com/sun/star/qa/XDumper.hpp> #include <embeddedobj/embeddedupdate.hxx> #include <cppuhelper/implbase.hxx> #include <vcl/svapp.hxx> #include <comphelper/diagnose_ex.hxx> #include <tools/debug.hxx> -#include <sfx2/xmldump.hxx> #include <memory> using namespace com::sun::star; @@ -287,10 +287,14 @@ struct EmbeddedObjectRef_Impl (void)xmlTextWriterStartElement(pWriter, BAD_CAST("mxObj")); (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("symbol"), BAD_CAST(typeid(*mxObj).name())); - auto pComponent = dynamic_cast<sfx2::XmlDump*>(mxObj->getComponent().get()); - if (pComponent) + css::uno::Reference<css::qa::XDumper> pComponent( + mxObj->getComponent(), css::uno::UNO_QUERY); + if (pComponent.is()) { - pComponent->dumpAsXml(pWriter); + auto const s = pComponent->dump(""); + auto const s1 = OUStringToOString(s, RTL_TEXTENCODING_ISO_8859_1); //TODO + (void)xmlTextWriterWriteRawLen( + pWriter, reinterpret_cast<xmlChar const *>(s1.getStr()), s1.getLength()); } (void)xmlTextWriterEndElement(pWriter); diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx index a5210d22d339..831dcaef6faf 100644 --- a/sw/source/core/ole/ndole.cxx +++ b/sw/source/core/ole/ndole.cxx @@ -56,7 +56,6 @@ #include <atomic> #include <deque> #include <libxml/xmlwriter.h> -#include <sfx2/xmldump.hxx> #include <osl/diagnose.h> #include <flyfrm.hxx>