sd/inc/sdfilter.hxx                  |    5 +
 sd/source/filter/cgm/sdcgmfilter.cxx |    7 -
 sd/source/filter/sdfilter.cxx        |   37 ++++++++--
 sd/source/filter/sdpptwrp.cxx        |  126 ++++++++++++++---------------------
 sd/source/ui/app/sddll.cxx           |    2 
 5 files changed, 93 insertions(+), 84 deletions(-)

New commits:
commit 7b34fb18a4d60bfc4e32b7c382ac596cbc2e776f
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Wed Nov 21 19:07:41 2018 +0000
Commit:     Michael Meeks <michael.me...@collabora.com>
CommitDate: Thu Nov 22 10:27:50 2018 +0100

    Re-factor internal filter logic, and impl. preload properly.
    
    Change-Id: I4c55ceb19d5db2c1e4756901d0d8b14878641a99
    Reviewed-on: https://gerrit.libreoffice.org/63761
    Tested-by: Jenkins
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/sd/inc/sdfilter.hxx b/sd/inc/sdfilter.hxx
index 17ce09d3647b..fb184ff10626 100644
--- a/sd/inc/sdfilter.hxx
+++ b/sd/inc/sdfilter.hxx
@@ -20,6 +20,7 @@
 #ifndef INCLUDED_SD_INC_SDFILTER_HXX
 #define INCLUDED_SD_INC_SDFILTER_HXX
 
+#include <osl/module.h>
 #include <rtl/ustring.hxx>
 #include <com/sun/star/frame/XModel.hpp>
 #include <com/sun/star/task/XStatusIndicator.hpp>
@@ -42,7 +43,9 @@ public:
     virtual bool            Export() = 0;
 
 #ifndef DISABLE_DYNLOADING
-    static ::osl::Module*       OpenLibrary( const OUString& rLibraryName );
+    static void Preload();
+    /// Open library @rLibraryName and lookup symbol @rFnSymbol
+    static oslGenericFunction GetLibrarySymbol( const OUString& rLibraryName, 
const OUString &rFnSymbol );
 #endif
 
 protected:
diff --git a/sd/source/filter/cgm/sdcgmfilter.cxx 
b/sd/source/filter/cgm/sdcgmfilter.cxx
index 73e4cc9392d2..c8841c42fdb5 100644
--- a/sd/source/filter/cgm/sdcgmfilter.cxx
+++ b/sd/source/filter/cgm/sdcgmfilter.cxx
@@ -61,17 +61,14 @@ namespace
     class CGMPointer
     {
         ImportCGMPointer m_pPointer;
-#ifndef DISABLE_DYNLOADING
-        std::unique_ptr<osl::Module> m_xLibrary;
-#endif
     public:
         CGMPointer()
         {
 #ifdef DISABLE_DYNLOADING
             m_pPointer = ImportCGM;
 #else
-            m_xLibrary.reset(SdFilter::OpenLibrary("icg"));
-            m_pPointer = m_xLibrary ? 
reinterpret_cast<ImportCGMPointer>(m_xLibrary->getFunctionSymbol("ImportCGM")) 
: nullptr;
+            m_pPointer = reinterpret_cast<ImportCGMPointer>(
+                SdFilter::GetLibrarySymbol("icg", "ImportCGM"));
 #endif
         }
         ImportCGMPointer get() { return m_pPointer; }
diff --git a/sd/source/filter/sdfilter.cxx b/sd/source/filter/sdfilter.cxx
index b822baa21c5c..fbffe2cf5ed9 100644
--- a/sd/source/filter/sdfilter.cxx
+++ b/sd/source/filter/sdfilter.cxx
@@ -58,14 +58,41 @@ OUString SdFilter::ImplGetFullLibraryName( const OUString& 
rLibraryName )
 }
 
 #ifndef DISABLE_DYNLOADING
+
+typedef std::map<OUString, std::unique_ptr<osl::Module>> SdModuleMap;
+static SdModuleMap g_SdModuleMap;
+
 extern "C" { static void thisModule() {} }
 
-::osl::Module* SdFilter::OpenLibrary( const OUString& rLibraryName )
+oslGenericFunction SdFilter::GetLibrarySymbol( const OUString& rLibraryName, 
const OUString &rFnSymbol )
+{
+    osl::Module *pMod = nullptr;
+    auto it = g_SdModuleMap.find(rLibraryName);
+    if (it != g_SdModuleMap.end())
+        pMod = it->second.get();
+
+    if (!pMod)
+    {
+        pMod = new osl::Module;
+        if (pMod->loadRelative(&thisModule, 
ImplGetFullLibraryName(rLibraryName),
+                               SAL_LOADMODULE_GLOBAL | SAL_LOADMODULE_LAZY))
+            g_SdModuleMap[rLibraryName] = std::unique_ptr<osl::Module>(pMod);
+        else
+        {
+            delete pMod;
+            pMod = nullptr;
+        }
+    }
+    if (!pMod)
+        return nullptr;
+    else
+        return pMod->getFunctionSymbol(rFnSymbol);
+}
+
+void SdFilter::Preload()
 {
-    std::unique_ptr< osl::Module > mod(new osl::Module);
-    return mod->loadRelative(&thisModule, ImplGetFullLibraryName(rLibraryName),
-                             SAL_LOADMODULE_GLOBAL | SAL_LOADMODULE_LAZY)
-        ? mod.release() : nullptr;
+    (void)GetLibrarySymbol("sdfilt", "ImportPPT");
+    (void)GetLibrarySymbol("icg", "ImportCGM");
 }
 
 #endif
diff --git a/sd/source/filter/sdpptwrp.cxx b/sd/source/filter/sdpptwrp.cxx
index df3f4da8d010..0eaf9934a22b 100644
--- a/sd/source/filter/sdpptwrp.cxx
+++ b/sd/source/filter/sdpptwrp.cxx
@@ -74,7 +74,7 @@ SdPPTFilter::~SdPPTFilter()
 
 bool SdPPTFilter::Import()
 {
-    bool    bRet = false;
+    bool bRet = false;
     tools::SvRef<SotStorage> pStorage = new SotStorage( 
mrMedium.GetInStream(), false );
     if( !pStorage->GetError() )
     {
@@ -97,24 +97,18 @@ bool SdPPTFilter::Import()
                 mrMedium.SetError(ERRCODE_SVX_READ_FILTER_PPOINT);
             else
             {
-#ifndef DISABLE_DYNLOADING
-                ::osl::Module* pLibrary = OpenLibrary( 
mrMedium.GetFilter()->GetUserData() );
-                if ( pLibrary )
-                {
-                    ImportPPTPointer PPTImport = reinterpret_cast< 
ImportPPTPointer >( pLibrary->getFunctionSymbol( "ImportPPT" ) );
-                    if ( PPTImport )
-                        bRet = PPTImport( &mrDocument, *pDocStream, *pStorage, 
mrMedium );
-
-                    if ( !bRet )
-                        mrMedium.SetError(SVSTREAM_WRONGVERSION);
-                    pLibrary->release(); //TODO: let it get unloaded?
-                    delete pLibrary;
-                }
+#ifdef DISABLE_DYNLOADING
+                ImportPPTPointer pPPTImport = ImportPPT;
 #else
-                bRet = ImportPPT( &mrDocument, *pDocStream, *pStorage, 
mrMedium );
+                ImportPPTPointer pPPTImport = reinterpret_cast< 
ImportPPTPointer >(
+                    
SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), "ImportPPT"));
+#endif
+
+                if ( pPPTImport )
+                    bRet = pPPTImport( &mrDocument, *pDocStream, *pStorage, 
mrMedium );
+
                 if ( !bRet )
                     mrMedium.SetError(SVSTREAM_WRONGVERSION);
-#endif
             }
 
             delete pDocStream;
@@ -126,58 +120,50 @@ bool SdPPTFilter::Import()
 
 bool SdPPTFilter::Export()
 {
-#ifndef DISABLE_DYNLOADING
-    ::osl::Module* pLibrary = OpenLibrary( mrMedium.GetFilter()->GetUserData() 
);
-#endif
-    bool        bRet = false;
+    bool bRet = false;
 
-#ifndef DISABLE_DYNLOADING
-    if( pLibrary )
-#endif
+    if( mxModel.is() )
     {
-        if( mxModel.is() )
-        {
-            tools::SvRef<SotStorage>    xStorRef = new SotStorage( 
mrMedium.GetOutStream(), false );
-#ifndef DISABLE_DYNLOADING
-            ExportPPTPointer PPTExport = 
reinterpret_cast<ExportPPTPointer>(pLibrary->getFunctionSymbol( "ExportPPT" ));
+        tools::SvRef<SotStorage> xStorRef = new SotStorage( 
mrMedium.GetOutStream(), false );
+
+#ifdef DISABLE_DYNLOADING
+        ExportPPTPointer PPTExport = ExportPPT;
 #else
-            ExportPPTPointer PPTExport = ExportPPT;
+        ExportPPTPointer PPTExport = reinterpret_cast< ExportPPTPointer >(
+            SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), 
"ExportPPT"));
 #endif
 
-            if( PPTExport && xStorRef.is() )
-            {
-                sal_uInt32          nCnvrtFlags = 0;
-                const SvtFilterOptions& rFilterOptions = 
SvtFilterOptions::Get();
-                if ( rFilterOptions.IsMath2MathType() )
-                    nCnvrtFlags |= OLE_STARMATH_2_MATHTYPE;
-                if ( rFilterOptions.IsWriter2WinWord() )
-                    nCnvrtFlags |= OLE_STARWRITER_2_WINWORD;
-                if ( rFilterOptions.IsCalc2Excel() )
-                    nCnvrtFlags |= OLE_STARCALC_2_EXCEL;
-                if ( rFilterOptions.IsImpress2PowerPoint() )
-                    nCnvrtFlags |= OLE_STARIMPRESS_2_POWERPOINT;
-                if ( rFilterOptions.IsEnablePPTPreview() )
-                    nCnvrtFlags |= 0x8000;
-
-                mrDocument.SetSwapGraphicsMode( SdrSwapGraphicsMode::TEMP );
-
-                CreateStatusIndicator();
-
-                //OUString sBaseURI( "BaseURI");
-                std::vector< PropertyValue > aProperties;
-                PropertyValue aProperty;
-                aProperty.Name = "BaseURI";
-                aProperty.Value <<= mrMedium.GetBaseURL( true );
-                aProperties.push_back( aProperty );
-
-                bRet = PPTExport( aProperties, xStorRef, mxModel, 
mxStatusIndicator, pBas, nCnvrtFlags );
-                xStorRef->Commit();
-            }
+        if( PPTExport && xStorRef.is() )
+        {
+            sal_uInt32          nCnvrtFlags = 0;
+            const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get();
+            if ( rFilterOptions.IsMath2MathType() )
+                nCnvrtFlags |= OLE_STARMATH_2_MATHTYPE;
+            if ( rFilterOptions.IsWriter2WinWord() )
+                nCnvrtFlags |= OLE_STARWRITER_2_WINWORD;
+            if ( rFilterOptions.IsCalc2Excel() )
+                nCnvrtFlags |= OLE_STARCALC_2_EXCEL;
+            if ( rFilterOptions.IsImpress2PowerPoint() )
+                nCnvrtFlags |= OLE_STARIMPRESS_2_POWERPOINT;
+            if ( rFilterOptions.IsEnablePPTPreview() )
+                nCnvrtFlags |= 0x8000;
+
+            mrDocument.SetSwapGraphicsMode( SdrSwapGraphicsMode::TEMP );
+
+            CreateStatusIndicator();
+
+            //OUString sBaseURI( "BaseURI");
+            std::vector< PropertyValue > aProperties;
+            PropertyValue aProperty;
+            aProperty.Name = "BaseURI";
+            aProperty.Value <<= mrMedium.GetBaseURL( true );
+            aProperties.push_back( aProperty );
+
+            bRet = PPTExport( aProperties, xStorRef, mxModel, 
mxStatusIndicator, pBas, nCnvrtFlags );
+            xStorRef->Commit();
         }
-#ifndef DISABLE_DYNLOADING
-        delete pLibrary;
-#endif
     }
+
     return bRet;
 }
 
@@ -186,20 +172,14 @@ void SdPPTFilter::PreSaveBasic()
     const SvtFilterOptions& rFilterOptions = SvtFilterOptions::Get();
     if( rFilterOptions.IsLoadPPointBasicStorage() )
     {
-#ifndef DISABLE_DYNLOADING
-        ::osl::Module* pLibrary = OpenLibrary( 
mrMedium.GetFilter()->GetUserData() );
-        if( pLibrary )
-        {
-            SaveVBAPointer pSaveVBA= 
reinterpret_cast<SaveVBAPointer>(pLibrary->getFunctionSymbol( "SaveVBA" ));
-            if( pSaveVBA )
-            {
-                pSaveVBA( static_cast<SfxObjectShell&>(mrDocShell), pBas );
-            }
-            delete pLibrary;
-        }
+#ifdef DISABLE_DYNLOADING
+        SaveVBAPointer pSaveVBA= SaveVBA;
 #else
-        SaveVBA( (SfxObjectShell&) mrDocShell, pBas );
+        SaveVBAPointer pSaveVBA = reinterpret_cast< SaveVBAPointer >(
+            SdFilter::GetLibrarySymbol(mrMedium.GetFilter()->GetUserData(), 
"SaveVBA"));
 #endif
+        if( pSaveVBA )
+            pSaveVBA( static_cast<SfxObjectShell&>(mrDocShell), pBas );
     }
 }
 
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
index a84e6b8bde96..35b7ca6f5113 100644
--- a/sd/source/ui/app/sddll.cxx
+++ b/sd/source/ui/app/sddll.cxx
@@ -95,6 +95,7 @@
 #include <vcl/FilterConfigItem.hxx>
 #include <o3tl/make_unique.hxx>
 #include <sdabstdlg.hxx>
+#include <sdfilter.hxx>
 #include <sdmod.hxx>
 
 using namespace ::com::sun::star;
@@ -294,6 +295,7 @@ void SdDLL::Init()
 extern "C" SAL_DLLPUBLIC_EXPORT
 void lok_preload_hook()
 {
+    SdFilter::Preload();
     SdAbstractDialogFactory::Create();
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to