Kaydet (Commit) 7b34fb18 authored tarafından Michael Meeks's avatar Michael Meeks

Re-factor internal filter logic, and impl. preload properly.

Change-Id: I4c55ceb19d5db2c1e4756901d0d8b14878641a99
Reviewed-on: https://gerrit.libreoffice.org/63761
Tested-by: Jenkins
Reviewed-by: 's avatarMichael Meeks <michael.meeks@collabora.com>
üst 4c195520
......@@ -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:
......
......@@ -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; }
......
......@@ -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
......
......@@ -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 );
}
}
......
......@@ -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();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment