Files
loongoffice/extensions/source/plugin/inc/plugin/impl.hxx
Caolán McNamara 8305efa9e8 coverity#983665 Uncaught exception
Change-Id: I3d0cd9a9bde8c3705abd876e832b6b7e56bb7fad
2014-09-26 10:11:02 +01:00

447 lines
18 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_IMPL_HXX
#define INCLUDED_EXTENSIONS_SOURCE_PLUGIN_INC_PLUGIN_IMPL_HXX
#include <config_lgpl.h>
#ifdef SOLARIS
#include <limits>
#endif
#include <boost/shared_ptr.hpp>
#include "cppuhelper/weak.hxx"
#include "com/sun/star/awt/Key.hpp"
#include "com/sun/star/awt/KeyFunction.hpp"
#include "com/sun/star/beans/PropertyAttribute.hpp"
#include "com/sun/star/plugin/PluginMode.hpp"
#include "com/sun/star/plugin/PluginDescription.hpp"
#include "com/sun/star/plugin/PluginException.hpp"
#include "com/sun/star/plugin/PluginVariable.hpp"
#include "com/sun/star/plugin/XPlugin.hpp"
#include "com/sun/star/plugin/XPluginManager.hpp"
#include "com/sun/star/plugin/XPluginContext.hpp"
#include "com/sun/star/io/XConnectable.hpp"
#include "com/sun/star/io/XOutputStream.hpp"
#include "com/sun/star/io/XDataOutputStream.hpp"
#include "com/sun/star/io/XActiveDataControl.hpp"
#include "com/sun/star/io/XDataInputStream.hpp"
#include "com/sun/star/io/XMarkableStream.hpp"
#include "com/sun/star/io/XInputStream.hpp"
#include "com/sun/star/io/XStreamListener.hpp"
#include "com/sun/star/io/XActiveDataSink.hpp"
#include "com/sun/star/io/XActiveDataSource.hpp"
#include "com/sun/star/lang/XServiceName.hpp"
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
#include "com/sun/star/lang/XSingleServiceFactory.hpp"
#include "com/sun/star/awt/GradientStyle.hpp"
#include "com/sun/star/awt/RasterOperation.hpp"
#include "com/sun/star/awt/Gradient.hpp"
#include "com/sun/star/awt/XGraphics.hpp"
#include <com/sun/star/uno/XComponentContext.hpp>
#include "cppuhelper/implbase3.hxx"
#include "cppuhelper/implbase2.hxx"
#include "cppuhelper/implbase1.hxx"
#include <list>
#ifdef WNT
#include <plugin/win/sysplug.hxx>
#elif defined(MACOSX)
#include "plugin/aqua/sysplug.hxx"
#elif defined(UNX)
#include "plugin/unx/sysplug.hxx"
#endif
struct SysPlugData;
::boost::shared_ptr<SysPlugData> CreateSysPlugData();
extern "C" {
void /*SAL_CALL NP_LOADDS*/ NPN_ForceRedraw_Impl(NPP instance);
NPError /*SAL_CALL NP_LOADDS*/ NPN_SetValue_Impl( NPP instance,
NPPVariable variable,
void* value );
} // extern "C"
#include "plugin/plctrl.hxx"
#include "plugin/model.hxx"
#include "vcl/sysdata.hxx"
#include "vcl/syschild.hxx"
#include "tools/link.hxx"
#include "tools/stream.hxx"
using namespace com::sun::star::uno;
#define PROVIDING_NONE 0
#define PROVIDING_NOW 1
#define PROVIDING_MODEL_UPDATE 2
// forwards
namespace ucbhelper { class Content; }
class PluginStream;
class PluginInputStream;
class PluginOutputStream;
class XPlugin_Impl;
class PluginDisposer;
class PluginEventListener;
class XPlugin_Impl : public com::sun::star::plugin::XPlugin,
public PluginControl_Impl,
public com::sun::star::beans::XPropertyChangeListener
{
private:
::osl::Mutex m_aMutex;
Reference< com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
Reference< com::sun::star::plugin::XPluginContext > m_rBrowserContext;
PluginComm* m_pPluginComm;
NPP_t m_aInstance;
NPWindow m_aNPWindow;
::boost::shared_ptr<SysPlugData> m_pSysPlugData;
rtl_TextEncoding m_aEncoding;
const char** m_pArgv;
const char** m_pArgn;
int m_nArgs;
OString m_aLastGetUrl;
Reference< com::sun::star::awt::XControlModel > m_xModel;
::com::sun::star::plugin::PluginDescription m_aDescription;
sal_Int16 m_aPluginMode;
int m_nProvidingState;
int m_nCalledFromPlugin;
PluginDisposer* m_pDisposer;
::std::list<PluginInputStream*> m_aInputStreams;
::std::list<PluginOutputStream*> m_aOutputStreams;
::std::list<PluginEventListener*> m_aPEventListeners;
OUString m_aURL;
bool m_bIsDisposed;
#ifdef MACOSX
void SetSysPlugDataParentView(SystemEnvData const& rEnvData);
#endif
void prependArg( const char* pName, const char* pValue ); // arguments will be strdup'ed
void initArgs( const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
void freeArgs();
void handleSpecialArgs();
void loadPlugin();
void destroyInstance();
void modelChanged();
public:
XPlugin_Impl( const Reference< com::sun::star::lang::XMultiServiceFactory > & rSMgr );
virtual ~XPlugin_Impl();
::osl::Mutex& getMutex() { return m_aMutex; }
void destroyStreams();
void setLastGetUrl( const OString& rUrl ) { m_aLastGetUrl = rUrl; }
com::sun::star::plugin::PluginDescription fitDescription( const OUString& rURL );
::std::list<PluginInputStream*>& getInputStreams() { return m_aInputStreams; }
::std::list<PluginOutputStream*>& getOutputStreams() { return m_aOutputStreams; }
PluginComm* getPluginComm() { return m_pPluginComm; }
void setPluginComm( PluginComm* comm )
{
if( ! m_pPluginComm )
{
m_pPluginComm = comm;
m_pPluginComm->addRef();
}
}
Reference< com::sun::star::lang::XMultiServiceFactory > getServiceManager() { return m_xSMgr; }
const com::sun::star::plugin::PluginDescription& getDescription() const { return m_aDescription; }
rtl_TextEncoding getTextEncoding() { return m_aEncoding; }
NPP_t& getNPPInstance() { return m_aInstance; }
NPWindow& getNPWindow() { return m_aNPWindow; }
SysPlugData& getSysPlugData() { return *m_pSysPlugData; }
void enterPluginCallback() { m_nCalledFromPlugin++; }
void leavePluginCallback() { m_nCalledFromPlugin--; }
bool isDisposable() { return m_nCalledFromPlugin < 1 ? sal_True : sal_False; }
DECL_LINK( secondLevelDispose, XPlugin_Impl* );
void addPluginEventListener( PluginEventListener* pListener )
{ m_aPEventListeners.push_back( pListener ); }
void checkListeners( const char* normalizedURL );
void initInstance(
const com::sun::star::plugin::PluginDescription& rDescription,
const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
void initInstance(
const OUString& rURL,
const Sequence< OUString >& argn,
const Sequence< OUString >& argv,
sal_Int16 mode );
const OUString& getRefererURL() { return m_aURL; }
OUString getCreationURL();
PluginStream* getStreamFromNPStream( NPStream* );
const SystemEnvData* getSysChildSysData()
{ return _pSysChild->GetSystemData(); }
const Reference< com::sun::star::plugin::XPluginContext > & getPluginContext() const
{ return m_rBrowserContext; }
void setPluginContext( const Reference< com::sun::star::plugin::XPluginContext > & );
void secondLevelDispose();
// static const Reference< com::sun::star::reflection::XIdlClass > & staticGetIdlClass();
// XInterface
virtual Any SAL_CALL queryInterface( const Type& ) throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
virtual void SAL_CALL acquire() throw() SAL_OVERRIDE
{ OWeakAggObject::acquire(); }
virtual void SAL_CALL release() throw() SAL_OVERRIDE
{ OWeakAggObject::release(); }
// OWeakAggObject
virtual Any SAL_CALL queryAggregation( const Type& )
throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
// PluginContol_Impl
virtual void SAL_CALL dispose() throw(std::exception) SAL_OVERRIDE;
virtual void SAL_CALL createPeer( const Reference< com::sun::star::awt::XToolkit > & xToolkit, const Reference< com::sun::star::awt::XWindowPeer > & Parent) throw( RuntimeException, std::exception ) SAL_OVERRIDE;
virtual sal_Bool SAL_CALL setModel( const Reference< com::sun::star::awt::XControlModel > & Model ) throw( RuntimeException, std::exception ) SAL_OVERRIDE;
virtual Reference< com::sun::star::awt::XControlModel > SAL_CALL getModel()throw( RuntimeException, std::exception ) SAL_OVERRIDE
{ return m_xModel; }
virtual void SAL_CALL setPosSize( sal_Int32 nX_, sal_Int32 nY_, sal_Int32 nWidth_, sal_Int32 nHeight_, sal_Int16 nFlags ) throw( RuntimeException, std::exception ) SAL_OVERRIDE;
// com::sun::star::plugin::XPlugin
virtual sal_Bool SAL_CALL provideNewStream(const OUString& mimetype, const Reference< com::sun::star::io::XActiveDataSource > & stream, const OUString& url, sal_Int32 length, sal_Int32 lastmodified, sal_Bool isfile) throw(std::exception) SAL_OVERRIDE;
// com::sun::star::beans::XPropertyChangeListener
virtual void SAL_CALL disposing( const com::sun::star::lang::EventObject& rSource ) throw(std::exception) SAL_OVERRIDE;
virtual void SAL_CALL propertyChange(const com::sun::star::beans::PropertyChangeEvent& rEvent)
throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
};
class PluginManager
{
private:
Reference< com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
::std::list<PluginComm*> m_aPluginComms;
::std::list<XPlugin_Impl*> m_aAllPlugins;
::osl::Mutex m_aPluginMutex;
static PluginManager* pManager;
PluginManager();
public:
static PluginManager& get();
static void setServiceFactory( const Reference< com::sun::star::lang::XMultiServiceFactory >& xFactory );
static const Sequence< OUString >& getAdditionalSearchPaths();
::std::list<PluginComm*>& getPluginComms() { return m_aPluginComms; }
::std::list<XPlugin_Impl*>& getPlugins() { return m_aAllPlugins; }
::osl::Mutex& getPluginMutex() { return m_aPluginMutex; }
};
class XPluginManager_Impl :
public cppu::WeakAggImplHelper2< com::sun::star::plugin::XPluginManager,
com::sun::star::lang::XServiceInfo >
{
Reference< com::sun::star::uno::XComponentContext > m_xContext;
public:
XPluginManager_Impl( const Reference< com::sun::star::uno::XComponentContext > & );
virtual ~XPluginManager_Impl();
static XPlugin_Impl* getXPluginFromNPP( NPP );
static XPlugin_Impl* getPluginImplementation( const Reference< com::sun::star::plugin::XPlugin >& plugin );
virtual Reference< com::sun::star::plugin::XPluginContext > SAL_CALL createPluginContext() throw(std::exception) SAL_OVERRIDE;
// has to be implemented per system
virtual Sequence< com::sun::star::plugin::PluginDescription > SAL_CALL impl_getPluginDescriptions() throw(css::uno::RuntimeException, std::exception);
// calls system specific impl_getPluginDescriptions
// checks whether plugins are disabled
virtual Sequence< com::sun::star::plugin::PluginDescription > SAL_CALL getPluginDescriptions()
throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
virtual Reference< com::sun::star::plugin::XPlugin > SAL_CALL createPlugin( const Reference< com::sun::star::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const com::sun::star::plugin::PluginDescription& plugintype) throw( RuntimeException,::com::sun::star::plugin::PluginException, std::exception ) SAL_OVERRIDE;
virtual Reference< com::sun::star::plugin::XPlugin > SAL_CALL createPluginFromURL( const Reference< com::sun::star::plugin::XPluginContext > & acontext, sal_Int16 mode, const Sequence< OUString >& argn, const Sequence< OUString >& argv, const Reference< com::sun::star::awt::XToolkit > & toolkit, const Reference< com::sun::star::awt::XWindowPeer > & parent, const OUString& url ) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) throw() SAL_OVERRIDE;
virtual OUString SAL_CALL getImplementationName() throw() SAL_OVERRIDE;
Sequence< OUString > SAL_CALL getSupportedServiceNames(void) throw( ) SAL_OVERRIDE;
static Sequence< OUString > getSupportedServiceNames_Static(void) throw( );
static OUString getImplementationName_Static() throw( )
{
/** the soplayer uses this name in its source! maybe not after 5.2 */
return OUString( "com.sun.star.extensions.PluginManager" );
}
};
Reference< XInterface > SAL_CALL PluginManager_CreateInstance( const Reference< com::sun::star::lang::XMultiServiceFactory > & ) throw( Exception );
enum PluginStreamType { InputStream, OutputStream };
class PluginStream
{
protected:
XPlugin_Impl* m_pPlugin;
NPStream m_aNPStream;
public:
PluginStream( XPlugin_Impl* pPlugin,
const char* url, sal_uInt32 len, sal_uInt32 lastmod );
virtual ~PluginStream();
NPStream& getStream() { return m_aNPStream; }
XPlugin_Impl* getPlugin() { return m_pPlugin; }
virtual PluginStreamType getStreamType() = 0;
};
class PluginInputStream :
public PluginStream,
public cppu::WeakAggImplHelper2<
::com::sun::star::io::XOutputStream,
::com::sun::star::io::XConnectable
>
{
private:
::ucbhelper::Content* m_pContent;
sal_Int32 m_nMode;
sal_uInt32 m_nWritePos;
Reference< com::sun::star::io::XActiveDataSource > m_xSource;
// hold a reference on input until closeOutput is called
Reference< com::sun::star::io::XConnectable > m_xPredecessor;
Reference< com::sun::star::io::XConnectable > m_xSuccessor;
// needed to hold a reference to self in NP_SEEK mode
Reference< com::sun::star::io::XOutputStream > m_xSelf;
SvFileStream m_aFileStream;
public:
PluginInputStream( XPlugin_Impl* pPlugin,
const char* url, sal_uInt32 len, sal_uInt32 lastmod );
PluginInputStream() : PluginStream( NULL, NULL, 0, 0 ) {}
virtual ~PluginInputStream();
virtual PluginStreamType getStreamType() SAL_OVERRIDE;
void setMode( sal_Int32 nMode );
sal_uInt32 read( sal_uInt32 offset, sal_Int8* buffer, sal_uInt32 size );
void setSource( const Reference< com::sun::star::io::XActiveDataSource >& xSource ) { m_xSource = xSource; }
// get contents ot url via ucbhelper::Content
void load();
// clear reference
bool releaseSelf()
{ bool bRet = m_xSelf.is(); m_xSelf.clear(); return bRet; }
// XOutputStream
virtual void SAL_CALL writeBytes( const Sequence<sal_Int8>& ) throw(std::exception) SAL_OVERRIDE;
virtual void SAL_CALL flush() throw(std::exception) SAL_OVERRIDE;
virtual void SAL_CALL closeOutput() throw(std::exception) SAL_OVERRIDE;
// XConnectable
virtual void SAL_CALL setPredecessor( const Reference< com::sun::star::io::XConnectable >& xPredecessor ) throw(std::exception) SAL_OVERRIDE
{ m_xPredecessor = xPredecessor; }
virtual Reference< com::sun::star::io::XConnectable > SAL_CALL getPredecessor() throw(std::exception) SAL_OVERRIDE
{ return m_xPredecessor; }
virtual void SAL_CALL setSuccessor( const Reference< com::sun::star::io::XConnectable >& xSuccessor ) throw(std::exception) SAL_OVERRIDE
{ m_xSuccessor = xSuccessor; }
virtual Reference< com::sun::star::io::XConnectable > SAL_CALL getSuccessor() throw(std::exception) SAL_OVERRIDE
{ return m_xSuccessor; }
};
class PluginOutputStream : public PluginStream
{
private:
Reference< com::sun::star::io::XOutputStream > m_xStream;
public:
PluginOutputStream( XPlugin_Impl* pPlugin, const char* url,
sal_uInt32 len, sal_uInt32 lastmod );
virtual ~PluginOutputStream();
virtual PluginStreamType getStreamType() SAL_OVERRIDE;
Reference< com::sun::star::io::XOutputStream > & getOutputStream() { return m_xStream; }
};
class PluginEventListener :
public cppu::WeakAggImplHelper1< com::sun::star::lang::XEventListener >
{
private:
XPlugin_Impl* m_pPlugin;
Reference< com::sun::star::plugin::XPlugin > m_xPlugin; // just to hold the plugin
char* m_pUrl;
char* m_pNormalizedUrl;
void* m_pNotifyData;
public:
PluginEventListener( XPlugin_Impl*,
const char* url,
const char* normurl,
void* notifyData );
virtual ~PluginEventListener();
const char* getURL() { return m_pUrl; }
const char* getNormalizedURL() { return m_pNormalizedUrl; }
void* getNotifyData() { return m_pNotifyData; }
// com::sun::star::lang::XEventListener
virtual void SAL_CALL disposing( const com::sun::star::lang::EventObject& Source ) throw(std::exception) SAL_OVERRIDE;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */