From 5bda84a2d7d135ed099fc87c10bf9d3a2758b44f Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Mon, 19 Mar 2012 19:36:44 +0100 Subject: Fixed spl_component_getFactory The old code relied on the order of initializing global static variables across compilation units, which failed for MinGW cross compilation. Cleaned up. --- desktop/source/splash/services_spl.cxx | 92 +++++-------------------- desktop/source/splash/splash.cxx | 114 ++++++++++++++++++++++++------- desktop/source/splash/splash.hxx | 118 +++++++-------------------------- 3 files changed, 129 insertions(+), 195 deletions(-) diff --git a/desktop/source/splash/services_spl.cxx b/desktop/source/splash/services_spl.cxx index 0dc412c77896..5cc0bcf6054c 100644 --- a/desktop/source/splash/services_spl.cxx +++ b/desktop/source/splash/services_spl.cxx @@ -26,92 +26,32 @@ * ************************************************************************/ -#include -#include -#include -#include -#include -#include +#include "sal/config.h" -#include "splash.hxx" - -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::registry; -using namespace ::desktop; +#include "cppuhelper/factory.hxx" +#include "cppuhelper/implementationentry.hxx" +#include "sal/types.h" -using ::rtl::OUString; - -static const char* pServices[] = -{ - SplashScreen::serviceName, - NULL -}; - -static const char* pImplementations[] = -{ - SplashScreen::implementationName, - NULL -}; +#include "splash.hxx" -typedef Reference(* fProvider)(const Reference&); +namespace { -static const fProvider pInstanceProviders[] = -{ - SplashScreen::getInstance, - NULL -}; +namespace css = com::sun::star; -static const char** pSupportedServices[] = -{ - SplashScreen::interfaces, - NULL +static cppu::ImplementationEntry const services[] = { + { &desktop::splash::create, &desktop::splash::getImplementationName, + &desktop::splash::getSupportedServiceNames, + &cppu::createSingleComponentFactory, 0, 0 }, + { 0, 0, 0, 0, 0, 0 } }; -static Sequence -getSupportedServiceNames(int p) { - const char **names = pSupportedServices[p]; - Sequence aSeq; - for(int i = 0; names[i] != NULL; i++) { - aSeq.realloc(i+1); - aSeq[i] = OUString::createFromAscii(names[i]); - } - return aSeq; } -extern "C" -{ -SAL_DLLPUBLIC_EXPORT void* SAL_CALL spl_component_getFactory( - const sal_Char* pImplementationName, - void* pServiceManager, - void*) +extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL spl_component_getFactory( + char const * pImplName, void * pServiceManager, void * pRegistryKey) { - // Set default return value for this operation - if it failed. - if ( pImplementationName && pServiceManager ) - { - Reference< XSingleServiceFactory > xFactory; - Reference< XMultiServiceFactory > xServiceManager( - reinterpret_cast< XMultiServiceFactory* >( pServiceManager ) ) ; - - // search implementation - for (int i = 0; (pImplementations[i]!=NULL); i++) { - if ( strcmp(pImplementations[i], pImplementationName ) == 0 ) { - // found implementation - xFactory = Reference(cppu::createSingleFactory( - xServiceManager, OUString::createFromAscii(pImplementationName), - pInstanceProviders[i], getSupportedServiceNames(i))); - if ( xFactory.is() ) { - // Factory is valid - service was found. - xFactory->acquire(); - return xFactory.get(); - } - } - } // for() - } - // Return with result of this operation. - return NULL; + return cppu::component_getFactoryHelper( + pImplName, pServiceManager, pRegistryKey, services); } -} // extern "C" /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/source/splash/splash.cxx b/desktop/source/splash/splash.cxx index 8773f1af8a98..eaa6d07f66c1 100644 --- a/desktop/source/splash/splash.cxx +++ b/desktop/source/splash/splash.cxx @@ -35,24 +35,99 @@ #include #include +#include #include +#include +#include #include #include #include #include #include #include +#include +#include #include #define NOT_LOADED ((long)-1) using namespace ::rtl; +using namespace ::com::sun::star::lang; using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::task; +using namespace ::com::sun::star::uno; -namespace desktop +namespace { + +namespace css = com::sun::star; + +class SplashScreen + : public ::cppu::WeakImplHelper2< XStatusIndicator, XInitialization > + , public IntroWindow { +private: + struct FullScreenProgressRatioValue + { + double _fXRelPos; + double _fYRelPos; + double _fRelWidth; + double _fRelHeight; + }; + enum BitmapMode { BM_FULLSCREEN, BM_DEFAULTMODE }; + + DECL_LINK( AppEventListenerHdl, VclWindowEvent * ); + virtual ~SplashScreen(); + void loadConfig(); + void updateStatus(); + void SetScreenBitmap(BitmapEx &rBitmap); + void determineProgressRatioValues( double& rXRelPos, double& rYRelPos, double& rRelWidth, double& rRelHeight ); + + static osl::Mutex _aMutex; + + VirtualDevice _vdev; + BitmapEx _aIntroBmp; + Color _cProgressFrameColor; + Color _cProgressBarColor; + bool _bNativeProgress; + OUString _sAppName; + OUString _sProgressText; + std::vector< FullScreenProgressRatioValue > _sFullScreenProgressRatioValues; + + sal_Int32 _iMax; + sal_Int32 _iProgress; + BitmapMode _eBitmapMode; + sal_Bool _bPaintBitmap; + sal_Bool _bPaintProgress; + sal_Bool _bVisible; + sal_Bool _bShowLogo; + sal_Bool _bFullScreenSplash; + sal_Bool _bProgressEnd; + long _height, _width, _tlx, _tly, _barwidth; + long _barheight, _barspace; + double _fXPos, _fYPos; + double _fWidth, _fHeight; + const long _xoffset, _yoffset; + +public: + SplashScreen(); + + // XStatusIndicator + virtual void SAL_CALL end() throw ( RuntimeException ); + virtual void SAL_CALL reset() throw ( RuntimeException ); + virtual void SAL_CALL setText(const OUString& aText) throw ( RuntimeException ); + virtual void SAL_CALL setValue(sal_Int32 nValue) throw ( RuntimeException ); + virtual void SAL_CALL start(const OUString& aText, sal_Int32 nRange) throw ( RuntimeException ); + + // XInitialize + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any>& aArguments ) + throw ( RuntimeException ); + + // workwindow + virtual void Paint( const Rectangle& ); -SplashScreen::SplashScreen(const Reference< XMultiServiceFactory >& rSMgr) +}; + +SplashScreen::SplashScreen() : IntroWindow() , _vdev(*((IntroWindow*)this)) , _cProgressFrameColor(sal::static_int_cast< ColorData >(NOT_LOADED)) @@ -78,8 +153,6 @@ SplashScreen::SplashScreen(const Reference< XMultiServiceFactory >& rSMgr) , _xoffset(12) , _yoffset(18) { - _rFactory = rSMgr; - loadConfig(); } @@ -546,32 +619,25 @@ void SplashScreen::Paint( const Rectangle&) // get service instance... -SplashScreen *SplashScreen::_pINSTANCE = NULL; osl::Mutex SplashScreen::_aMutex; -Reference< XInterface > SplashScreen::getInstance(const Reference< XMultiServiceFactory >& rSMgr) -{ - if ( _pINSTANCE == 0 ) - { - osl::MutexGuard guard(_aMutex); - if (_pINSTANCE == 0) - return (XComponent*)new SplashScreen(rSMgr); - } - - return (XComponent*)0; } -// static service info... -const char* SplashScreen::interfaces[] = +css::uno::Reference< css::uno::XInterface > desktop::splash::create( + css::uno::Reference< css::uno::XComponentContext > const &) { - "com.sun.star.task.XStartusIndicator", - "com.sun.star.lang.XInitialization", - NULL, -}; -const sal_Char *SplashScreen::serviceName = "com.sun.star.office.SplashScreen"; -const sal_Char *SplashScreen::implementationName = "com.sun.star.office.comp.SplashScreen"; -const sal_Char *SplashScreen::supportedServiceNames[] = {"com.sun.star.office.SplashScreen", NULL}; + return static_cast< cppu::OWeakObject * >(new SplashScreen); +} + +rtl::OUString desktop::splash::getImplementationName() { + return rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.office.comp.SplashScreen")); +} +css::uno::Sequence< rtl::OUString > desktop::splash::getSupportedServiceNames() { + rtl::OUString name( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.office.SplashScreen")); + return css::uno::Sequence< rtl::OUString >(&name, 1); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/source/splash/splash.hxx b/desktop/source/splash/splash.hxx index 0d4858402b83..b29f19e21db6 100644 --- a/desktop/source/splash/splash.hxx +++ b/desktop/source/splash/splash.hxx @@ -26,109 +26,37 @@ * ************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#ifndef INCLUDED_DESKTOP_SOURCE_SPLASH_SPLASH_HXX +#define INCLUDED_DESKTOP_SOURCE_SPLASH_SPLASH_HXX +#include "sal/config.h" -using namespace ::rtl; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::task; +#include "com/sun/star/uno/Reference.hxx" +#include "com/sun/star/uno/Sequence.hxx" +#include "sal/types.h" -namespace desktop { +namespace com { namespace sun { namespace star { + namespace uno { + class XComponentContext; + class XInterface; + } +} } } +namespace rtl { class OUString; } -class SplashScreen - : public ::cppu::WeakImplHelper2< XStatusIndicator, XInitialization > - , public IntroWindow -{ -private: - struct FullScreenProgressRatioValue - { - double _fXRelPos; - double _fYRelPos; - double _fRelWidth; - double _fRelHeight; - }; - enum BitmapMode { BM_FULLSCREEN, BM_DEFAULTMODE }; +namespace desktop { namespace splash { - // don't allow anybody but ourselves to create instances of this class - SplashScreen(const SplashScreen&); - SplashScreen(void); - SplashScreen operator =(const SplashScreen&); +com::sun::star::uno::Reference< com::sun::star::uno::XInterface > SAL_CALL +create( + com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > + const &); - SplashScreen(const Reference< XMultiServiceFactory >& xFactory); +rtl::OUString SAL_CALL getImplementationName(); - DECL_LINK( AppEventListenerHdl, VclWindowEvent * ); - virtual ~SplashScreen(); - void loadConfig(); - void updateStatus(); - void SetScreenBitmap(BitmapEx &rBitmap); - void determineProgressRatioValues( double& rXRelPos, double& rYRelPos, double& rRelWidth, double& rRelHeight ); +com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL +getSupportedServiceNames(); - static SplashScreen *_pINSTANCE; +} } - static osl::Mutex _aMutex; - Reference< XMultiServiceFactory > _rFactory; - - VirtualDevice _vdev; - BitmapEx _aIntroBmp; - Color _cProgressFrameColor; - Color _cProgressBarColor; - bool _bNativeProgress; - OUString _sAppName; - OUString _sProgressText; - std::vector< FullScreenProgressRatioValue > _sFullScreenProgressRatioValues; - - sal_Int32 _iMax; - sal_Int32 _iProgress; - BitmapMode _eBitmapMode; - sal_Bool _bPaintBitmap; - sal_Bool _bPaintProgress; - sal_Bool _bVisible; - sal_Bool _bShowLogo; - sal_Bool _bFullScreenSplash; - sal_Bool _bProgressEnd; - long _height, _width, _tlx, _tly, _barwidth; - long _barheight, _barspace; - double _fXPos, _fYPos; - double _fWidth, _fHeight; - const long _xoffset, _yoffset; - -public: - static const char* interfaces[]; - static const sal_Char *serviceName; - static const sal_Char *implementationName; - static const sal_Char *supportedServiceNames[]; - - static Reference< XInterface > getInstance(const Reference < XMultiServiceFactory >& xFactory); - - // XStatusIndicator - virtual void SAL_CALL end() throw ( RuntimeException ); - virtual void SAL_CALL reset() throw ( RuntimeException ); - virtual void SAL_CALL setText(const OUString& aText) throw ( RuntimeException ); - virtual void SAL_CALL setValue(sal_Int32 nValue) throw ( RuntimeException ); - virtual void SAL_CALL start(const OUString& aText, sal_Int32 nRange) throw ( RuntimeException ); - - // XInitialize - virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any>& aArguments ) - throw ( RuntimeException ); - - // workwindow - virtual void Paint( const Rectangle& ); - -}; - -} +#endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit