forked from amazingfate/loongoffice
...rather than on the deprecated OComponentHelper. The two classes SfxDialogLibrary and SfxScriptLibrary, both deriving from SfxLibrary, had been found to implement their respective queryInterface in a way that is incompatible with the XAggregation protocol inherited via OComponentHelper. It looks like no code actually made use of the XAggregation offered by these Sfx*Library classes, so the easiest fix for those queryInterface implementations appears to switch from OComponentHelper to WeakComponentImplHelper (thereby dropping XAggregation, and thus rendering the existing queryInterface implementations OK). Ideally, SfxLibrary would derive from WeakComponentImplHelper<XInitialization, XStorageBasedLibraryContainer, XLibraryContainerPassword, ...> covering all the UNO interface classes from which it currently derives manually. But changing that manual implementation across SfxLibrary and its SfxDialogLibrary and SfxScriptLibrary derived classes looks tricky, so merely introduce an "empty" WeakComponentImplHelper<> for now and keep all the manual stuff, and leave proper clean up for later. Change-Id: I12dc5bad2c017b8d76ce28ac189e95cf2e3810e9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145792 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
668 lines
27 KiB
C++
668 lines
27 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <unordered_map>
|
|
#include <com/sun/star/uno/XComponentContext.hpp>
|
|
#include <com/sun/star/lang/XInitialization.hpp>
|
|
#include <com/sun/star/script/XStorageBasedLibraryContainer.hpp>
|
|
#include <com/sun/star/script/XLibraryContainerPassword.hpp>
|
|
#include <com/sun/star/script/XLibraryContainerExport.hpp>
|
|
#include <com/sun/star/script/XLibraryQueryExecutable.hpp>
|
|
#include <com/sun/star/script/XLibraryContainer3.hpp>
|
|
#include <com/sun/star/container/XNameContainer.hpp>
|
|
#include <com/sun/star/container/XContainer.hpp>
|
|
#include <com/sun/star/ucb/XSimpleFileAccess3.hpp>
|
|
#include <com/sun/star/io/XOutputStream.hpp>
|
|
#include <com/sun/star/io/XInputStream.hpp>
|
|
#include <com/sun/star/util/XStringSubstitution.hpp>
|
|
#include <com/sun/star/document/XStorageBasedDocument.hpp>
|
|
#include <com/sun/star/lang/XServiceInfo.hpp>
|
|
#include <com/sun/star/frame/XModel.hpp>
|
|
#include <com/sun/star/deployment/XPackage.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
#include <com/sun/star/script/vba/XVBACompatibility.hpp>
|
|
#include <com/sun/star/script/vba/XVBAScriptListener.hpp>
|
|
#include <com/sun/star/util/XChangesNotifier.hpp>
|
|
|
|
#include <osl/mutex.hxx>
|
|
#include <unotools/eventlisteneradapter.hxx>
|
|
#include <cppuhelper/implbase.hxx>
|
|
#include <cppuhelper/compbase.hxx>
|
|
#include <cppuhelper/weakref.hxx>
|
|
#include <cppuhelper/basemutex.hxx>
|
|
#include <rtl/ref.hxx>
|
|
#include <comphelper/interfacecontainer3.hxx>
|
|
#include <xmlscript/xmllib_imexp.hxx>
|
|
|
|
class BasicManager;
|
|
|
|
namespace basic
|
|
{
|
|
typedef ::cppu::WeakImplHelper<
|
|
css::container::XNameContainer,
|
|
css::container::XContainer,
|
|
css::util::XChangesNotifier > NameContainer_BASE;
|
|
|
|
|
|
class NameContainer final : public ::cppu::BaseMutex, public NameContainer_BASE
|
|
{
|
|
typedef std::unordered_map < OUString, sal_Int32 > NameContainerNameMap;
|
|
|
|
NameContainerNameMap mHashMap;
|
|
std::vector< OUString > mNames;
|
|
std::vector< css::uno::Any > mValues;
|
|
sal_Int32 mnElementCount;
|
|
|
|
css::uno::Type mType;
|
|
css::uno::XInterface* mpxEventSource;
|
|
|
|
::comphelper::OInterfaceContainerHelper3<css::container::XContainerListener> maContainerListeners;
|
|
::comphelper::OInterfaceContainerHelper3<css::util::XChangesListener> maChangesListeners;
|
|
|
|
public:
|
|
NameContainer( const css::uno::Type& rType )
|
|
: mnElementCount( 0 )
|
|
, mType( rType )
|
|
, mpxEventSource( nullptr )
|
|
, maContainerListeners( m_aMutex )
|
|
, maChangesListeners( m_aMutex )
|
|
{}
|
|
|
|
void setEventSource( css::uno::XInterface* pxEventSource )
|
|
{ mpxEventSource = pxEventSource; }
|
|
|
|
/// @throws css::lang::IllegalArgumentException
|
|
/// @throws css::container::ElementExistException
|
|
/// @throws css::lang::WrappedTargetException
|
|
/// @throws css::uno::RuntimeException
|
|
void insertCheck(const OUString& aName, const css::uno::Any& aElement);
|
|
|
|
/// @throws css::lang::IllegalArgumentException
|
|
/// @throws css::lang::WrappedTargetException
|
|
/// @throws css::uno::RuntimeException
|
|
void insertNoCheck(const OUString& aName, const css::uno::Any& aElement);
|
|
|
|
// Methods XElementAccess
|
|
virtual css::uno::Type SAL_CALL getElementType( ) override;
|
|
virtual sal_Bool SAL_CALL hasElements( ) override;
|
|
|
|
// Methods XNameAccess
|
|
virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
|
|
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override;
|
|
virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
|
|
|
|
// Methods XNameReplace
|
|
virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
|
|
|
|
// Methods XNameContainer
|
|
virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
|
|
virtual void SAL_CALL removeByName( const OUString& Name ) override;
|
|
|
|
// Methods XContainer
|
|
virtual void SAL_CALL addContainerListener( const css::uno::Reference<css::container::XContainerListener >& xListener ) override;
|
|
virtual void SAL_CALL removeContainerListener( const css::uno::Reference<css::container::XContainerListener >& xListener ) override;
|
|
|
|
// Methods XChangesNotifier
|
|
virtual void SAL_CALL addChangesListener( const css::uno::Reference<css::util::XChangesListener >& xListener ) override;
|
|
virtual void SAL_CALL removeChangesListener( const css::uno::Reference<css::util::XChangesListener >& xListener ) override;
|
|
};
|
|
|
|
|
|
class ModifiableHelper
|
|
{
|
|
private:
|
|
::comphelper::OInterfaceContainerHelper3<css::util::XModifyListener> m_aModifyListeners;
|
|
::cppu::OWeakObject& m_rEventSource;
|
|
bool mbModified;
|
|
|
|
public:
|
|
ModifiableHelper( ::cppu::OWeakObject& _rEventSource, ::osl::Mutex& _rMutex )
|
|
:m_aModifyListeners( _rMutex )
|
|
,m_rEventSource( _rEventSource )
|
|
,mbModified( false )
|
|
{
|
|
}
|
|
|
|
bool isModified() const { return mbModified; }
|
|
void setModified( bool _bModified );
|
|
|
|
void addModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener )
|
|
{
|
|
m_aModifyListeners.addInterface( _rxListener );
|
|
}
|
|
|
|
void removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& _rxListener )
|
|
{
|
|
m_aModifyListeners.removeInterface( _rxListener );
|
|
}
|
|
};
|
|
|
|
|
|
typedef ::comphelper::OInterfaceContainerHelper3<
|
|
css::script::vba::XVBAScriptListener > VBAScriptListenerContainer;
|
|
|
|
class SfxLibrary;
|
|
|
|
typedef ::cppu::WeakComponentImplHelper<
|
|
css::lang::XInitialization,
|
|
css::script::XStorageBasedLibraryContainer,
|
|
css::script::XLibraryContainerPassword,
|
|
css::script::XLibraryContainerExport,
|
|
css::script::XLibraryContainer3,
|
|
css::container::XContainer,
|
|
css::script::XLibraryQueryExecutable,
|
|
css::script::vba::XVBACompatibility,
|
|
css::lang::XServiceInfo,
|
|
css::beans::XPropertySet> SfxLibraryContainer_BASE;
|
|
|
|
class SfxLibraryContainer
|
|
: public ::cppu::BaseMutex
|
|
, public SfxLibraryContainer_BASE
|
|
, public ::utl::OEventListenerAdapter
|
|
{
|
|
VBAScriptListenerContainer maVBAScriptListeners;
|
|
sal_Int32 mnRunningVBAScripts;
|
|
bool mbVBACompat;
|
|
OUString msProjectName;
|
|
rtl_TextEncoding meVBATextEncoding;
|
|
protected:
|
|
css::uno::Reference< css::uno::XComponentContext > mxContext;
|
|
css::uno::Reference< css::ucb::XSimpleFileAccess3 > mxSFI;
|
|
css::uno::Reference< css::util::XStringSubstitution > mxStringSubstitution;
|
|
css::uno::WeakReference< css::frame::XModel > mxOwnerDocument;
|
|
|
|
ModifiableHelper maModifiable;
|
|
|
|
rtl::Reference<NameContainer> maNameContainer;
|
|
bool mbOldInfoFormat;
|
|
bool mbOasis2OOoFormat;
|
|
|
|
OUString maInitialDocumentURL;
|
|
OUString maInfoFileName;
|
|
OUString maOldInfoFileName;
|
|
OUString maLibElementFileExtension;
|
|
OUString maLibraryPath;
|
|
OUString maLibrariesDir;
|
|
|
|
css::uno::Reference< css::embed::XStorage > mxStorage;
|
|
BasicManager* mpBasMgr;
|
|
bool mbOwnBasMgr;
|
|
|
|
enum InitMode
|
|
{
|
|
DEFAULT,
|
|
CONTAINER_INIT_FILE,
|
|
LIBRARY_INIT_FILE,
|
|
OFFICE_DOCUMENT,
|
|
OLD_BASIC_STORAGE
|
|
} meInitMode;
|
|
|
|
void implStoreLibrary( SfxLibrary* pLib,
|
|
std::u16string_view rName,
|
|
const css::uno::Reference< css::embed::XStorage >& rStorage );
|
|
|
|
// New variant for library export
|
|
void implStoreLibrary( SfxLibrary* pLib,
|
|
std::u16string_view rName,
|
|
const css::uno::Reference< css::embed::XStorage >& rStorage,
|
|
std::u16string_view rTargetURL,
|
|
const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& rToUseSFI,
|
|
const css::uno::Reference< css::task::XInteractionHandler >& rHandler );
|
|
|
|
void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib,
|
|
const css::uno::Reference< css::embed::XStorage >& xStorage );
|
|
|
|
// New variant for library export
|
|
void implStoreLibraryIndexFile( SfxLibrary* pLib, const ::xmlscript::LibDescriptor& rLib,
|
|
const css::uno::Reference< css::embed::XStorage >& xStorage,
|
|
std::u16string_view aTargetURL,
|
|
const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& rToUseSFI );
|
|
|
|
bool implLoadLibraryIndexFile( SfxLibrary* pLib,
|
|
::xmlscript::LibDescriptor& rLib,
|
|
const css::uno::Reference< css::embed::XStorage >& xStorage,
|
|
const OUString& aIndexFileName );
|
|
|
|
void implImportLibDescriptor( SfxLibrary* pLib, ::xmlscript::LibDescriptor const & rLib );
|
|
|
|
// Methods to distinguish between different library types
|
|
virtual rtl::Reference<SfxLibrary> implCreateLibrary( const OUString& aName ) = 0;
|
|
virtual rtl::Reference<SfxLibrary> implCreateLibraryLink
|
|
( const OUString& aName, const OUString& aLibInfoFileURL,
|
|
const OUString& StorageURL, bool ReadOnly ) = 0;
|
|
virtual css::uno::Any createEmptyLibraryElement() = 0;
|
|
virtual bool isLibraryElementValid(const css::uno::Any& rElement) const = 0;
|
|
/// @throws css::uno::Exception
|
|
virtual void writeLibraryElement
|
|
(
|
|
const css::uno::Reference< css::container::XNameContainer>& xLibrary,
|
|
const OUString& aElementName,
|
|
const css::uno::Reference< css::io::XOutputStream >& xOutput
|
|
) = 0;
|
|
|
|
virtual css::uno::Any importLibraryElement
|
|
(
|
|
const css::uno::Reference< css::container::XNameContainer>& xLibrary,
|
|
const OUString& aElementName,
|
|
const OUString& aFile,
|
|
const css::uno::Reference< css::io::XInputStream >& xElementStream ) = 0;
|
|
virtual void importFromOldStorage( const OUString& aFile ) = 0;
|
|
|
|
// Password encryption
|
|
virtual bool implStorePasswordLibrary( SfxLibrary* pLib, const OUString& aName,
|
|
const css::uno::Reference< css::embed::XStorage >& xStorage, const css::uno::Reference< css::task::XInteractionHandler >& Handler );
|
|
|
|
// New variant for library export
|
|
virtual bool implStorePasswordLibrary( SfxLibrary* pLib, const OUString& aName,
|
|
const css::uno::Reference< css::embed::XStorage >& rStorage,
|
|
const OUString& aTargetURL,
|
|
const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& rToUseSFI, const css::uno::Reference< css::task::XInteractionHandler >& Handler );
|
|
|
|
/// @throws css::lang::WrappedTargetException
|
|
/// @throws css::uno::RuntimeException
|
|
virtual bool implLoadPasswordLibrary( SfxLibrary* pLib, const OUString& Name,
|
|
bool bVerifyPasswordOnly=false );
|
|
|
|
virtual void onNewRootStorage() = 0;
|
|
|
|
|
|
// #56666, Creates another library container
|
|
// instance of the same derived class
|
|
virtual rtl::Reference<SfxLibraryContainer> createInstanceImpl() = 0;
|
|
|
|
|
|
// Interface to get the BasicManager (Hack for password implementation)
|
|
BasicManager* getBasicManager();
|
|
OUString createAppLibraryFolder( SfxLibrary* pLib, std::u16string_view aName );
|
|
|
|
void init( const OUString& rInitialDocumentURL,
|
|
const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage );
|
|
|
|
virtual OUString getInfoFileName() const = 0;
|
|
virtual OUString getOldInfoFileName() const = 0;
|
|
virtual OUString getLibElementFileExtension() const = 0;
|
|
virtual OUString getLibrariesDir() const = 0;
|
|
|
|
// Handle maLibInfoFileURL and maStorageURL correctly
|
|
void checkStorageURL
|
|
(
|
|
const OUString& aSourceURL,
|
|
OUString& aLibInfoFileURL,
|
|
OUString& aStorageURL,
|
|
OUString& aUnexpandedStorageURL
|
|
);
|
|
/// @throws css::uno::RuntimeException
|
|
OUString expand_url( const OUString& url );
|
|
|
|
SfxLibrary* getImplLib( const OUString& rLibraryName );
|
|
|
|
void storeLibraries_Impl(
|
|
const css::uno::Reference< css::embed::XStorage >& xStorage,
|
|
bool bComplete );
|
|
|
|
void initializeFromDocument( const css::uno::Reference< css::document::XStorageBasedDocument >& _rxDocument );
|
|
|
|
// OEventListenerAdapter
|
|
virtual void _disposing( const css::lang::EventObject& _rSource ) override;
|
|
|
|
// OComponentHelper
|
|
virtual void SAL_CALL disposing() override;
|
|
|
|
private:
|
|
void init_Impl( const OUString& rInitialDocumentURL,
|
|
const css::uno::Reference< css::embed::XStorage >& _rxInitialStorage );
|
|
void implScanExtensions();
|
|
static constexpr OUStringLiteral sVBATextEncodingPropName = u"VBATextEncoding";
|
|
|
|
public:
|
|
SfxLibraryContainer();
|
|
virtual ~SfxLibraryContainer() override;
|
|
|
|
|
|
// Interface to set the BasicManager (Hack for password implementation)
|
|
void setBasicManager( BasicManager* pBasMgr )
|
|
{
|
|
mpBasMgr = pBasMgr;
|
|
}
|
|
|
|
void enterMethod();
|
|
static void leaveMethod();
|
|
|
|
// Methods XElementAccess
|
|
virtual css::uno::Type SAL_CALL getElementType() override;
|
|
virtual sal_Bool SAL_CALL hasElements() override;
|
|
|
|
// Methods XNameAccess
|
|
virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
|
|
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override;
|
|
virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
|
|
|
|
// Members XStorageBasedLibraryContainer
|
|
virtual css::uno::Reference< css::embed::XStorage > SAL_CALL getRootStorage() override;
|
|
virtual void SAL_CALL setRootStorage( const css::uno::Reference< css::embed::XStorage >& _rootstorage ) override;
|
|
virtual void SAL_CALL storeLibrariesToStorage( const css::uno::Reference< css::embed::XStorage >& RootStorage ) override;
|
|
|
|
// Methods XModifiable (base of XPersistentLibraryContainer)
|
|
virtual sal_Bool SAL_CALL isModified( ) override;
|
|
virtual void SAL_CALL setModified( sal_Bool bModified ) override;
|
|
virtual void SAL_CALL addModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override;
|
|
virtual void SAL_CALL removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& aListener ) override;
|
|
|
|
// Methods XPersistentLibraryContainer (base of XStorageBasedLibraryContainer)
|
|
virtual css::uno::Any SAL_CALL getRootLocation() override;
|
|
virtual OUString SAL_CALL getContainerLocationName() override;
|
|
virtual void SAL_CALL storeLibraries( ) override;
|
|
|
|
//Methods XLibraryContainer3
|
|
virtual OUString SAL_CALL getOriginalLibraryLinkURL( const OUString& Name ) override;
|
|
|
|
// Methods XLibraryContainer2 (base of XPersistentLibraryContainer)
|
|
virtual sal_Bool SAL_CALL isLibraryLink( const OUString& Name ) override;
|
|
virtual OUString SAL_CALL getLibraryLinkURL( const OUString& Name ) override;
|
|
virtual sal_Bool SAL_CALL isLibraryReadOnly( const OUString& Name ) override;
|
|
virtual void SAL_CALL setLibraryReadOnly( const OUString& Name, sal_Bool bReadOnly ) override;
|
|
virtual void SAL_CALL renameLibrary( const OUString& Name, const OUString& NewName ) override;
|
|
|
|
// Methods XLibraryContainer (base of XLibraryContainer2)
|
|
virtual css::uno::Reference< css::container::XNameContainer > SAL_CALL
|
|
createLibrary( const OUString& Name ) override;
|
|
virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL createLibraryLink
|
|
( const OUString& Name, const OUString& StorageURL, sal_Bool ReadOnly ) override;
|
|
virtual void SAL_CALL removeLibrary( const OUString& Name ) override;
|
|
virtual sal_Bool SAL_CALL isLibraryLoaded( const OUString& Name ) override;
|
|
virtual void SAL_CALL loadLibrary( const OUString& Name ) override;
|
|
|
|
// Methods XInitialization
|
|
virtual void SAL_CALL initialize( const css::uno::Sequence<
|
|
css::uno::Any >& aArguments ) override;
|
|
|
|
// Methods XLibraryContainerPassword
|
|
virtual sal_Bool SAL_CALL isLibraryPasswordProtected( const OUString& Name ) override;
|
|
virtual sal_Bool SAL_CALL isLibraryPasswordVerified( const OUString& Name ) override;
|
|
virtual sal_Bool SAL_CALL verifyLibraryPassword( const OUString& Name, const OUString& Password ) override;
|
|
virtual void SAL_CALL changeLibraryPassword( const OUString& Name,
|
|
const OUString& OldPassword, const OUString& NewPassword ) override;
|
|
|
|
// Methods XContainer
|
|
virtual void SAL_CALL addContainerListener( const css::uno::Reference<
|
|
css::container::XContainerListener >& xListener ) override;
|
|
virtual void SAL_CALL removeContainerListener( const css::uno::Reference<
|
|
css::container::XContainerListener >& xListener ) override;
|
|
|
|
// Methods XLibraryContainerExport
|
|
virtual void SAL_CALL exportLibrary( const OUString& Name, const OUString& URL,
|
|
const css::uno::Reference< css::task::XInteractionHandler >& Handler ) override;
|
|
|
|
// Methods XServiceInfo
|
|
virtual OUString SAL_CALL getImplementationName( ) override = 0;
|
|
virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
|
|
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override = 0;
|
|
// Methods XVBACompatibility
|
|
virtual sal_Bool SAL_CALL getVBACompatibilityMode() override;
|
|
virtual void SAL_CALL setVBACompatibilityMode( sal_Bool _vbacompatmodeon ) override;
|
|
virtual OUString SAL_CALL getProjectName() override { return msProjectName; }
|
|
virtual void SAL_CALL setProjectName( const OUString& _projectname ) override;
|
|
virtual sal_Int32 SAL_CALL getRunningVBAScripts() override;
|
|
virtual void SAL_CALL addVBAScriptListener(
|
|
const css::uno::Reference< css::script::vba::XVBAScriptListener >& Listener ) override;
|
|
virtual void SAL_CALL removeVBAScriptListener(
|
|
const css::uno::Reference< css::script::vba::XVBAScriptListener >& Listener ) override;
|
|
virtual void SAL_CALL broadcastVBAScriptEvent( sal_Int32 nIdentifier, const OUString& rModuleName ) override;
|
|
|
|
// css::beans::XPropertySet
|
|
virtual css::uno::Reference<css::beans::XPropertySetInfo>
|
|
SAL_CALL getPropertySetInfo() override;
|
|
virtual void SAL_CALL setPropertyValue(const OUString& aPropertyName,
|
|
const css::uno::Any& aValue) override;
|
|
virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& PropertyName) override;
|
|
virtual void SAL_CALL addPropertyChangeListener(
|
|
const OUString& aPropertyName,
|
|
const css::uno::Reference<css::beans::XPropertyChangeListener>& xListener) override;
|
|
virtual void SAL_CALL removePropertyChangeListener(
|
|
const OUString& aPropertyName,
|
|
const css::uno::Reference<css::beans::XPropertyChangeListener>& aListener) override;
|
|
virtual void SAL_CALL addVetoableChangeListener(
|
|
const OUString& PropertyName,
|
|
const css::uno::Reference<css::beans::XVetoableChangeListener>& aListener) override;
|
|
virtual void SAL_CALL removeVetoableChangeListener(
|
|
const OUString& PropertyName,
|
|
const css::uno::Reference<css::beans::XVetoableChangeListener>& aListener) override;
|
|
|
|
};
|
|
|
|
|
|
class LibraryContainerMethodGuard
|
|
{
|
|
public:
|
|
LibraryContainerMethodGuard( SfxLibraryContainer& _rContainer )
|
|
{
|
|
_rContainer.enterMethod();
|
|
}
|
|
|
|
~LibraryContainerMethodGuard()
|
|
{
|
|
basic::SfxLibraryContainer::leaveMethod();
|
|
}
|
|
};
|
|
|
|
|
|
class SfxLibrary
|
|
: public css::container::XNameContainer
|
|
, public css::container::XContainer
|
|
, public css::util::XChangesNotifier
|
|
, public ::cppu::BaseMutex
|
|
, public ::cppu::WeakComponentImplHelper<>
|
|
{
|
|
friend class SfxLibraryContainer;
|
|
friend class SfxDialogLibraryContainer;
|
|
friend class SfxScriptLibraryContainer;
|
|
|
|
css::uno::Reference< css::ucb::XSimpleFileAccess3 > mxSFI;
|
|
|
|
ModifiableHelper& mrModifiable;
|
|
rtl::Reference<NameContainer> maNameContainer;
|
|
|
|
bool mbLoaded;
|
|
bool mbIsModified;
|
|
bool mbInitialised;
|
|
|
|
private:
|
|
|
|
OUString maLibElementFileExtension;
|
|
OUString maLibInfoFileURL;
|
|
OUString maStorageURL;
|
|
OUString maUnexpandedStorageURL;
|
|
OUString maOriginalStorageURL;
|
|
|
|
bool mbLink;
|
|
bool mbReadOnly;
|
|
bool mbReadOnlyLink;
|
|
bool mbPreload;
|
|
|
|
protected:
|
|
bool mbPasswordProtected;
|
|
private:
|
|
bool mbPasswordVerified;
|
|
bool mbDoc50Password;
|
|
OUString maPassword;
|
|
|
|
bool mbSharedIndexFile;
|
|
bool mbExtension;
|
|
|
|
// Additional functionality for localisation
|
|
// Provide modify state including resources
|
|
virtual bool isModified() = 0;
|
|
virtual void storeResources() = 0;
|
|
virtual void storeResourcesAsURL( const OUString& URL, const OUString& NewName ) = 0;
|
|
virtual void storeResourcesToURL( const OUString& URL,
|
|
const css::uno::Reference< css::task::XInteractionHandler >& xHandler ) = 0;
|
|
virtual void storeResourcesToStorage( const css::uno::Reference< css::embed::XStorage >& xStorage ) = 0;
|
|
|
|
protected:
|
|
bool implIsModified() const { return mbIsModified; }
|
|
void implSetModified( bool _bIsModified );
|
|
|
|
private:
|
|
/** checks whether the lib is readonly, or a readonly link, throws an IllegalArgumentException if so
|
|
*/
|
|
void impl_checkReadOnly();
|
|
/** checks whether the library is loaded, throws a LibraryNotLoadedException (wrapped in a WrappedTargetException),
|
|
if not.
|
|
*/
|
|
void impl_checkLoaded();
|
|
|
|
private:
|
|
void impl_removeWithoutChecks( const OUString& _rElementName );
|
|
|
|
public:
|
|
SfxLibrary(
|
|
ModifiableHelper& _rModifiable,
|
|
const css::uno::Type& aType,
|
|
const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& xSFI
|
|
);
|
|
SfxLibrary(
|
|
ModifiableHelper& _rModifiable,
|
|
const css::uno::Type& aType,
|
|
const css::uno::Reference< css::ucb::XSimpleFileAccess3 >& xSFI,
|
|
OUString aLibInfoFileURL,
|
|
OUString aStorageURL,
|
|
bool ReadOnly
|
|
);
|
|
|
|
// Methods XInterface
|
|
virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& rType ) override;
|
|
virtual void SAL_CALL acquire() noexcept override { WeakComponentImplHelper::acquire(); }
|
|
virtual void SAL_CALL release() noexcept override { WeakComponentImplHelper::release(); }
|
|
|
|
// Methods XElementAccess
|
|
virtual css::uno::Type SAL_CALL getElementType( ) override;
|
|
virtual sal_Bool SAL_CALL hasElements( ) override;
|
|
|
|
// Methods XNameAccess
|
|
virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override;
|
|
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames( ) override;
|
|
virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override;
|
|
|
|
// Methods XNameReplace
|
|
virtual void SAL_CALL replaceByName( const OUString& aName, const css::uno::Any& aElement ) override;
|
|
|
|
// Methods XNameContainer
|
|
virtual void SAL_CALL insertByName( const OUString& aName, const css::uno::Any& aElement ) override;
|
|
virtual void SAL_CALL removeByName( const OUString& Name ) override;
|
|
|
|
// XTypeProvider
|
|
css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override;
|
|
css::uno::Sequence<sal_Int8> SAL_CALL getImplementationId( ) override;
|
|
|
|
// Methods XContainer
|
|
virtual void SAL_CALL addContainerListener( const css::uno::Reference<
|
|
css::container::XContainerListener >& xListener ) override;
|
|
virtual void SAL_CALL removeContainerListener( const css::uno::Reference<
|
|
css::container::XContainerListener >& xListener ) override;
|
|
|
|
// Methods XChangesNotifier
|
|
virtual void SAL_CALL addChangesListener( const css::uno::Reference<
|
|
css::util::XChangesListener >& xListener ) override;
|
|
virtual void SAL_CALL removeChangesListener( const css::uno::Reference<
|
|
css::util::XChangesListener >& xListener ) override;
|
|
|
|
public:
|
|
struct LibraryContainerAccess { friend class SfxLibraryContainer; private: LibraryContainerAccess() { } };
|
|
void removeElementWithoutChecks( const OUString& _rElementName, LibraryContainerAccess )
|
|
{
|
|
impl_removeWithoutChecks( _rElementName );
|
|
}
|
|
|
|
protected:
|
|
virtual bool isLoadedStorable();
|
|
|
|
virtual bool isLibraryElementValid(const css::uno::Any& rElement) const = 0;
|
|
};
|
|
|
|
|
|
class ScriptSubPackageIterator
|
|
{
|
|
css::uno::Reference< css::deployment::XPackage > m_xMainPackage;
|
|
|
|
bool m_bIsValid;
|
|
bool m_bIsBundle;
|
|
|
|
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aSubPkgSeq;
|
|
sal_Int32 m_nSubPkgCount;
|
|
sal_Int32 m_iNextSubPkg;
|
|
|
|
static css::uno::Reference< css::deployment::XPackage >
|
|
implDetectScriptPackage( const css::uno::Reference
|
|
< css::deployment::XPackage >& rPackage, bool& rbPureDialogLib );
|
|
|
|
public:
|
|
ScriptSubPackageIterator( css::uno::Reference< css::deployment::XPackage > const & xMainPackage );
|
|
|
|
css::uno::Reference< css::deployment::XPackage > getNextScriptSubPackage( bool& rbPureDialogLib );
|
|
};
|
|
|
|
|
|
class ScriptExtensionIterator final
|
|
{
|
|
public:
|
|
ScriptExtensionIterator();
|
|
OUString nextBasicOrDialogLibrary( bool& rbPureDialogLib );
|
|
|
|
private:
|
|
css::uno::Reference< css::deployment::XPackage >
|
|
implGetNextUserScriptPackage( bool& rbPureDialogLib );
|
|
css::uno::Reference< css::deployment::XPackage >
|
|
implGetNextSharedScriptPackage( bool& rbPureDialogLib );
|
|
css::uno::Reference< css::deployment::XPackage >
|
|
implGetNextBundledScriptPackage( bool& rbPureDialogLib );
|
|
|
|
css::uno::Reference< css::uno::XComponentContext > m_xContext;
|
|
|
|
enum IteratorState
|
|
{
|
|
USER_EXTENSIONS,
|
|
SHARED_EXTENSIONS,
|
|
BUNDLED_EXTENSIONS,
|
|
END_REACHED
|
|
} m_eState;
|
|
|
|
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aUserPackagesSeq;
|
|
bool m_bUserPackagesLoaded;
|
|
|
|
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aSharedPackagesSeq;
|
|
bool m_bSharedPackagesLoaded;
|
|
|
|
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aBundledPackagesSeq;
|
|
bool m_bBundledPackagesLoaded;
|
|
|
|
int m_iUserPackage;
|
|
int m_iSharedPackage;
|
|
int m_iBundledPackage;
|
|
|
|
ScriptSubPackageIterator* m_pScriptSubPackageIterator;
|
|
|
|
}; // end class ScriptExtensionIterator
|
|
|
|
|
|
} // namespace basic
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|