summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/comphelper/servicehelper.hxx20
-rw-r--r--include/oox/mathml/imexport.hxx5
-rw-r--r--oox/source/drawingml/shape.cxx3
-rw-r--r--oox/source/export/shapes.cxx3
-rw-r--r--oox/source/mathml/imexport.cxx10
-rw-r--r--starmath/source/unomodel.cxx1
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx3
-rw-r--r--sw/source/filter/ww8/rtfattributeoutput.cxx3
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx3
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx3
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx3
11 files changed, 50 insertions, 7 deletions
diff --git a/include/comphelper/servicehelper.hxx b/include/comphelper/servicehelper.hxx
index 1d157cbf1482..286108bd2568 100644
--- a/include/comphelper/servicehelper.hxx
+++ b/include/comphelper/servicehelper.hxx
@@ -137,6 +137,26 @@ namespace comphelper {
return FallbackToGetSomethingOf<Base>::get(rId, pThis);
}
+#if defined _MSC_VER && _MSC_VER < 1930 && !defined __clang__
+ // Without this additional overload, at least VS 2019 16.11.21 has sometimes issues deducing the
+ // Base template argument in calls to the "full" getSomethingImpl overload with zero arguments
+ // substituted for the variadic Mixins parameter:
+ template <class T, class Mixin, class Base>
+ sal_Int64 getSomethingImpl(const css::uno::Sequence<sal_Int8>& rId, T* pThis,
+ MixinToGetSomethingOf<Mixin>,
+ FallbackToGetSomethingOf<Base>)
+ {
+ sal_Int64 res;
+ if (MixinToGetSomethingOf<T>::get(rId, pThis, &res)
+ || MixinToGetSomethingOf<Mixin>::get(rId, pThis, &res))
+ {
+ return res;
+ }
+
+ return FallbackToGetSomethingOf<Base>::get(rId, pThis);
+ }
+#endif
+
template <class T, class Mixin, class... Mixins, class Base>
sal_Int64 getSomethingImpl(const css::uno::Sequence<sal_Int8>& rId, T* pThis,
MixinToGetSomethingOf<Mixin>, MixinToGetSomethingOf<Mixins>...,
diff --git a/include/oox/mathml/imexport.hxx b/include/oox/mathml/imexport.hxx
index a93216fb1199..5a0ac1313f18 100644
--- a/include/oox/mathml/imexport.hxx
+++ b/include/oox/mathml/imexport.hxx
@@ -9,12 +9,14 @@
#ifndef INCLUDED_OOX_MATHML_IMEXPORT_HXX
#define INCLUDED_OOX_MATHML_IMEXPORT_HXX
+#include <com/sun/star/uno/Sequence.hxx>
#include <oox/core/filterbase.hxx>
#include <oox/dllapi.h>
#include <oox/export/utils.hxx>
#include <rtl/ref.hxx>
#include <rtl/strbuf.hxx>
#include <rtl/textenc.h>
+#include <sal/types.h>
#include <sax/fshelper.hxx>
#include <tools/gen.hxx>
@@ -43,6 +45,9 @@ public:
virtual void writeFormulaRtf( OStringBuffer& rBuffer, rtl_TextEncoding nEncoding ) = 0;
enum eFormulaAlign { INLINE, CENTER, GROUPEDCENTER, LEFT, RIGHT };
+ sal_Int64 getSomething(css::uno::Sequence<sal_Int8> const & id);
+ static css::uno::Sequence<sal_Int8> const & getUnoTunnelId();
+
protected:
FormulaImExportBase();
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index d5b02455ab35..7c2920eabcbf 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -56,6 +56,7 @@
#include <comphelper/propertysequence.hxx>
#include <comphelper/propertyvalue.hxx>
#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
#include <comphelper/diagnose_ex.hxx>
#include <tools/gen.hxx>
#include <tools/globname.hxx>
@@ -1295,7 +1296,7 @@ Reference< XShape > const & Shape::createAndInsert(
{
uno::Reference<uno::XInterface> const xMathModel(xObj->getComponent());
oox::FormulaImExportBase *const pMagic(
- dynamic_cast<oox::FormulaImExportBase*>(xMathModel.get()));
+ comphelper::getFromUnoTunnel<oox::FormulaImExportBase>(xMathModel));
assert(pMagic);
pMagic->readFormulaOoxml(*pMathXml);
}
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 137c69fe7c33..ce3787069adb 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -71,6 +71,7 @@
#include <tools/globname.hxx>
#include <comphelper/classids.hxx>
#include <comphelper/propertysequence.hxx>
+#include <comphelper/servicehelper.hxx>
#include <comphelper/storagehelper.hxx>
#include <sot/exchange.hxx>
#include <utility>
@@ -2473,7 +2474,7 @@ void ShapeExport::WriteMathShape(Reference<XShape> const& xShape)
mpFS->startElementNS(XML_a14, XML_m);
oox::FormulaImExportBase *const pMagic(
- dynamic_cast<oox::FormulaImExportBase*>(xMathModel.get()));
+ comphelper::getFromUnoTunnel<oox::FormulaImExportBase>(xMathModel));
assert(pMagic);
pMagic->writeFormulaOoxml(GetFS(), GetFB()->getVersion(), GetDocumentType(),
FormulaImExportBase::eFormulaAlign::INLINE);
diff --git a/oox/source/mathml/imexport.cxx b/oox/source/mathml/imexport.cxx
index 2b5990679bea..ad0389051b42 100644
--- a/oox/source/mathml/imexport.cxx
+++ b/oox/source/mathml/imexport.cxx
@@ -13,6 +13,7 @@
#include <oox/core/contexthandler.hxx>
#include <oox/token/namespaces.hxx>
+#include <comphelper/servicehelper.hxx>
#include <drawingml/textparagraph.hxx>
@@ -21,6 +22,15 @@ using namespace ::com::sun::star;
namespace oox
{
+sal_Int64 FormulaImExportBase::getSomething(css::uno::Sequence<sal_Int8> const & aIdentifier) {
+ return comphelper::getSomethingImpl(aIdentifier, this);
+}
+
+css::uno::Sequence<sal_Int8> const & FormulaImExportBase::getUnoTunnelId() {
+ static comphelper::UnoIdInit const id;
+ return id.getSeq();
+}
+
FormulaImExportBase::FormulaImExportBase()
{
}
diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx
index b7a92567fe25..a4b14671b63d 100644
--- a/starmath/source/unomodel.cxx
+++ b/starmath/source/unomodel.cxx
@@ -361,6 +361,7 @@ const uno::Sequence< sal_Int8 > & SmModel::getUnoTunnelId()
sal_Int64 SAL_CALL SmModel::getSomething( const uno::Sequence< sal_Int8 >& rId )
{
return comphelper::getSomethingImpl(rId, this,
+ comphelper::MixinToGetSomethingOf<FormulaImExportBase>{},
comphelper::FallbackToGetSomethingOf<SfxBaseModel>{});
}
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index fac7d3aa42c4..3e4bca89472d 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -45,6 +45,7 @@
#include <comphelper/string.hxx>
#include <comphelper/flagguard.hxx>
#include <comphelper/sequence.hxx>
+#include <comphelper/servicehelper.hxx>
#include <oox/token/namespaces.hxx>
#include <oox/token/tokens.hxx>
#include <oox/export/utils.hxx>
@@ -5985,7 +5986,7 @@ void DocxAttributeOutput::WritePostponedMath(const SwOLENode* pPostponedMath, sa
SAL_WARN("sw.ww8", "Broken math object");
return;
}
- if( oox::FormulaImExportBase* formulaexport = dynamic_cast< oox::FormulaImExportBase* >( xInterface.get()))
+ if( oox::FormulaImExportBase* formulaexport = comphelper::getFromUnoTunnel< oox::FormulaImExportBase >( xInterface))
formulaexport->writeFormulaOoxml( m_pSerializer, GetExport().GetFilter().getVersion(),
oox::drawingml::DOCUMENT_DOCX, nAlign);
else
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 8131b981c0e8..6f777b148407 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -24,6 +24,7 @@
#include "writerwordglue.hxx"
#include "ww8par.hxx"
#include <fmtcntnt.hxx>
+#include <comphelper/servicehelper.hxx>
#include <rtl/tencinfo.h>
#include <sal/log.hxx>
#include <sot/exchange.hxx>
@@ -4187,7 +4188,7 @@ bool RtfAttributeOutput::FlyFrameOLEMath(const SwFlyFrameFormat* pFlyFrameFormat
uno::Reference<util::XCloseable> xClosable = xObj->getComponent();
if (!xClosable.is())
return false;
- auto pBase = dynamic_cast<oox::FormulaImExportBase*>(xClosable.get());
+ auto pBase = comphelper::getFromUnoTunnel<oox::FormulaImExportBase>(xClosable);
SAL_WARN_IF(!pBase, "sw.rtf", "Math OLE object cannot write out RTF");
if (pBase)
{
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 09b1ba422aec..fe7374848d72 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -82,6 +82,7 @@
#include <com/sun/star/document/XImporter.hpp>
#include <com/sun/star/document/XFilter.hpp>
#include <comphelper/indexedpropertyvalues.hxx>
+#include <comphelper/servicehelper.hxx>
#include <editeng/flditem.hxx>
#include <editeng/unotext.hxx>
#include <o3tl/safeint.hxx>
@@ -3011,7 +3012,7 @@ void DomainMapper_Impl::appendStarMath( const Value& val )
xComponentProperties->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ),
uno::Any(sal_Int32(0)));
Size size( 1000, 1000 );
- if( oox::FormulaImExportBase* formulaimport = dynamic_cast< oox::FormulaImExportBase* >( xInterface.get()))
+ if( oox::FormulaImExportBase* formulaimport = comphelper::getFromUnoTunnel< oox::FormulaImExportBase >( xInterface))
size = formulaimport->getFormulaSize();
xStarMathProperties->setPropertyValue(getPropertyName( PROP_WIDTH ),
uno::Any( sal_Int32(size.Width())));
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 2563956bf97a..32e0aa403867 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -28,6 +28,7 @@
#include <sal/log.hxx>
#include <comphelper/embeddedobjectcontainer.hxx>
#include <comphelper/propertyvalue.hxx>
+#include <comphelper/servicehelper.hxx>
#include <cppuhelper/exc_hlp.hxx>
#include <tools/globname.hxx>
#include <comphelper/classids.hxx>
@@ -2283,7 +2284,7 @@ void OOXMLFastContextHandlerMath::process()
return;
uno::Reference< uno::XInterface > component(ref->getComponent(), uno::UNO_QUERY_THROW);
if( oox::FormulaImExportBase* import
- = dynamic_cast< oox::FormulaImExportBase* >( component.get()))
+ = comphelper::getFromUnoTunnel< oox::FormulaImExportBase >( component))
import->readFormulaOoxml( buffer );
if (!isForwardEvents())
return;
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index ac5bbfb042f2..c61721ff484e 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -26,6 +26,7 @@
#include <filter/msfilter/rtfutil.hxx>
#include <comphelper/string.hxx>
#include <comphelper/diagnose_ex.hxx>
+#include <comphelper/servicehelper.hxx>
#include <tools/globname.hxx>
#include <tools/datetimeutils.hxx>
#include <comphelper/classids.hxx>
@@ -2968,7 +2969,7 @@ RTFError RTFDocumentImpl::beforePopState(RTFParserState& rState)
uno::Reference<util::XCloseable> xComponent(xObject->getComponent(),
uno::UNO_SET_THROW);
if (oox::FormulaImExportBase* pImport
- = dynamic_cast<oox::FormulaImExportBase*>(xComponent.get()))
+ = comphelper::getFromUnoTunnel<oox::FormulaImExportBase>(xComponent))
pImport->readFormulaOoxml(m_aMathBuffer);
auto pValue = new RTFValue(xObject);