diff options
author | Release Engineers <releng@openoffice.org> | 2008-12-01 12:31:27 +0000 |
---|---|---|
committer | Release Engineers <releng@openoffice.org> | 2008-12-01 12:31:27 +0000 |
commit | 2363c961947028ee152cbdfca7e4b4d1099ca019 (patch) | |
tree | d4e60312f0d4cca1098aa9ea181329711867e53e /dbaccess/source/core/dataaccess/ModelImpl.hxx | |
parent | f2c90bcc552da21d692df2abeaf3997f8a7eda78 (diff) |
CWS-TOOLING: integrate CWS dba31e
2008-11-19 12:36:23 +0100 msc r263980 : i96104
2008-11-19 12:31:19 +0100 msc r263979 : i96104
2008-11-19 12:21:55 +0100 msc r263977 : i96104
2008-11-19 12:18:53 +0100 msc r263976 : i96104
2008-11-18 09:09:45 +0100 oj r263746 : disable color entry when area is set
2008-11-18 08:37:52 +0100 oj r263741 : #remove sub report entry
2008-11-17 11:20:25 +0100 fs r263708 : #i10000#
2008-11-17 11:06:52 +0100 fs r263706 : minimal version now is 3.1
2008-11-12 22:25:59 +0100 fs r263621 : #i96150#
2008-11-12 22:20:02 +0100 fs r263620 : rebased to m34
2008-11-12 21:39:41 +0100 fs r263618 : MANUAL REBASE: rebase CWS dba31d to DEV300_m34
2008-11-12 13:54:58 +0100 fs r263597 : #i96134# MediaDescriptor.URL is to be preferred over MediaDescriptor.FileName. Nonetheless, ensure both are handled
2008-11-12 13:53:40 +0100 fs r263596 : #i96134# re-enabled the code for #i41897#, a better fix is to come
2008-11-12 12:48:21 +0100 fs r263585 : #i96134# disable saving URLs of file-base databases relatively
2008-11-11 16:11:11 +0100 msc r263566 : #i96104#
2008-11-05 09:09:47 +0100 oj r263342 : #i88727# color noe added
2008-11-05 08:41:43 +0100 oj r263341 : #i77916# zoom added
2008-11-04 21:24:15 +0100 fs r263339 : disposing: call disposeAndClear without own mutex locked - some of our listeners insist on locking the SolarMutex, which sometimes led to deadlocks on the complex test cases
2008-11-04 21:23:15 +0100 fs r263338 : remove SolarMutex locking - this happned in CWS dba31c (in the CVS version), which this CWS was created from, but seems to got lost during resync
2008-11-04 20:49:50 +0100 fs r263335 : docu formatting
2008-11-04 20:06:39 +0100 fs r263334 : #i95826# use m_aMutex, not a DocumentGuard (wrongly resolved merge conflicts)
2008-11-04 17:36:29 +0100 fs r263332 : #i92688# properly revoke as XEventListener from m_xActiveController when disposing
2008-11-04 14:49:34 +0100 fs r263324 : #i92322# enable Input Required if EmptyIsNULL does not exist at the control
2008-10-31 11:10:04 +0100 oj r262857 : merge from cvs to svn
2008-10-31 09:46:45 +0100 oj r262853 : merge from cvs to svn
2008-10-31 08:46:37 +0100 oj r262849 : merge from cvs to svn
2008-10-31 08:44:24 +0100 oj r262848 : merge from cvs to svn
2008-10-31 08:43:33 +0100 oj r262847 : merge from cvs to svn
2008-10-31 08:42:28 +0100 oj r262846 : merge from cvs to svn
2008-10-31 08:41:58 +0100 oj r262845 : merge from cvs to svn
2008-10-31 08:41:32 +0100 oj r262844 : merge from cvs to svn
2008-10-28 12:19:50 +0100 oj r262733 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:42 +0100 oj r262732 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:36 +0100 oj r262731 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:31 +0100 oj r262730 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:22 +0100 oj r262729 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:18 +0100 oj r262728 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:10 +0100 oj r262727 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:06 +0100 oj r262726 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:05 +0100 oj r262725 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:19:01 +0100 oj r262724 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:50 +0100 oj r262723 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:41 +0100 oj r262722 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:40 +0100 oj r262721 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:27 +0100 oj r262720 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:10 +0100 oj r262719 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:18:01 +0100 oj r262718 : #iXXXXX#: migrate CWS dba31e to SVN
2008-10-28 12:17:39 +0100 oj r262717 : #iXXXXX#: migrate CWS dba31e to SVN
Diffstat (limited to 'dbaccess/source/core/dataaccess/ModelImpl.hxx')
-rw-r--r-- | dbaccess/source/core/dataaccess/ModelImpl.hxx | 1313 |
1 files changed, 637 insertions, 676 deletions
diff --git a/dbaccess/source/core/dataaccess/ModelImpl.hxx b/dbaccess/source/core/dataaccess/ModelImpl.hxx index 9c845c7c171d..f7628aa45b40 100644 --- a/dbaccess/source/core/dataaccess/ModelImpl.hxx +++ b/dbaccess/source/core/dataaccess/ModelImpl.hxx @@ -1,676 +1,637 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: ModelImpl.hxx,v $ - * $Revision: 1.24.26.1 $ - * - * 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 _DBA_COREDATAACCESS_MODELIMPL_HXX_ -#define _DBA_COREDATAACCESS_MODELIMPL_HXX_ - -#include "apitools.hxx" -#include "bookmarkcontainer.hxx" -#include "ContentHelper.hxx" -#include "core_resource.hxx" - -/** === begin UNO includes === **/ -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/beans/XPropertyAccess.hpp> -#include <com/sun/star/container/XContainerListener.hpp> -#include <com/sun/star/document/XDocumentSubStorageSupplier.hpp> -#include <com/sun/star/document/XEventListener.hpp> -#include <com/sun/star/document/XStorageBasedDocument.hpp> -#include <com/sun/star/embed/ElementModes.hpp> -#include <com/sun/star/embed/XStorage.hpp> -#include <com/sun/star/embed/XTransactionListener.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/frame/XStorable.hpp> -#include <com/sun/star/lang/NotInitializedException.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XSingleServiceFactory.hpp> -#include <com/sun/star/sdb/XBookmarksSupplier.hpp> -#include <com/sun/star/sdb/XCompletedConnection.hpp> -#include <com/sun/star/sdb/XFormDocumentsSupplier.hpp> -#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp> -#include <com/sun/star/sdb/XReportDocumentsSupplier.hpp> -#include <com/sun/star/sdbc/XDataSource.hpp> -#include <com/sun/star/sdbc/XIsolatedConnection.hpp> -#include <com/sun/star/sdbcx/XTablesSupplier.hpp> -#include <com/sun/star/util/XCloseable.hpp> -#include <com/sun/star/util/XFlushable.hpp> -#include <com/sun/star/util/XModifiable.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> -#include <com/sun/star/util/XNumberFormatter.hpp> -#include <com/sun/star/util/XRefreshable.hpp> -#include <com/sun/star/sdb/XDocumentDataSource.hpp> -#include <com/sun/star/frame/DoubleInitializationException.hpp> -/** === end UNO includes === **/ - -#include <comphelper/broadcasthelper.hxx> -#include <comphelper/proparrhlp.hxx> -#include <connectivity/CommonTools.hxx> -#include <cppuhelper/propshlp.hxx> -#include <cppuhelper/weakref.hxx> -#include <sfx2/docmacromode.hxx> -#include <sfx2/docstoragemodifylistener.hxx> -#include <tools/string.hxx> -#include <unotools/sharedunocomponent.hxx> -#include <vos/mutex.hxx> - -#include <memory> - -namespace comphelper -{ - class NamedValueCollection; -} - -//........................................................................ -namespace dbaccess -{ -//........................................................................ - -typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XConnection > OWeakConnection; -typedef std::vector< OWeakConnection > OWeakConnectionArray; - -struct AsciiPropertyValue -{ - // note: the canonic member order would be AsciiName / DefaultValue, but - // this crashes on unxlngi6.pro, since there's a bug which somehow results in - // getDefaultDataSourceSettings returning corrupted Any instances then. - ::com::sun::star::uno::Any DefaultValue; - const sal_Char* AsciiName; - - AsciiPropertyValue( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Any& _rDefaultValue ) - :DefaultValue( _rDefaultValue ) - ,AsciiName( _pAsciiName ) - { - } -}; - -class ODatabaseContext; -class OSharedConnectionManager; - -//============================================================ -//= SharedMutex -//============================================================ -/** a shared mutex, which deletes itself as soon as the last reference - to it dies. -*/ -class SharedMutex -{ -private: - oslInterlockedCount m_refCount; - mutable ::osl::Mutex m_aMutex; - -public: - SharedMutex(); - - void SAL_CALL acquire(); - void SAL_CALL release(); - - inline ::osl::Mutex& getMutex() const { return m_aMutex; } - -private: - ~SharedMutex(); -}; - -//============================================================ -//= SharedMutexHolder -//============================================================ -/** a base class merely holding a SharedMutex instance. Useful if you - need to ensure the SharedMutex is to be initialized before other - of your members, in this case just derive from SharedMutexHolder. -*/ -class SharedMutexHolder -{ -protected: - SharedMutexHolder() : m_xMutex( new SharedMutex ) { } - ~SharedMutexHolder() { } - -protected: - ::rtl::Reference< SharedMutex > m_xMutex; -}; - -//============================================================ -//= VosMutexFacade -//============================================================ -/** a class which provides an IMutex interface to an OSL-based mutex -*/ -class VosMutexFacade : public ::vos::IMutex -{ -public: - /** beware of life time: the mutex you pass here must live as least as long - as the VosMutexFacade instance lives. - */ - VosMutexFacade( ::osl::Mutex& _rMutex ); - - // IMutex - virtual void SAL_CALL acquire(); - virtual sal_Bool SAL_CALL tryToAcquire(); - virtual void SAL_CALL release(); - -private: - ::osl::Mutex& m_rMutex; -}; - -//============================================================ -//= ODatabaseModelImpl -//============================================================ -DECLARE_STL_USTRINGACCESS_MAP(::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >,TStorages); - -typedef ::utl::SharedUNOComponent< ::com::sun::star::embed::XStorage > SharedStorage; - -class ODatabaseContext; -class DocumentStorageAccess; -class OSharedConnectionManager; -class ODatabaseModelImpl :public SharedMutexHolder - ,public ::rtl::IReference - ,public ::sfx2::IMacroDocumentAccess - ,public ::sfx2::IModifiableDocument -{ -public: - enum ObjectType - { - E_FORM = 0, - E_REPORT = 1, - E_QUERY = 2, - E_TABLE = 3 - }; - -private: - OModuleClient m_aModuleClient; - ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XModel > m_xModel; - ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDataSource > m_xDataSource; - - DocumentStorageAccess* m_pStorageAccess; - VosMutexFacade m_aMutexFacade; - ::std::vector< TContentPtr > m_aContainer; // one for each ObjectType - TStorages m_aStorages; - ::sfx2::DocumentMacroMode m_aMacroMode; - sal_Int16 m_nImposedMacroExecMode; - - ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xBasicLibraries; - ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xDialogLibraries; - - SharedStorage m_xDocumentStorage; - ::rtl::Reference< ::sfx2::DocumentStorageModifyListener > m_pStorageModifyListener; - ODatabaseContext* m_pDBContext; - - ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aArgs; - /// the URL the document was loaded from - ::rtl::OUString m_sDocFileLocation; - - oslInterlockedCount m_refCount; - - /// do we have any object (forms/reports) which contains macros? - bool m_bHasAnyObjectWithMacros; - /// does our root storage have macro/script sub storages? - bool m_bHasMacroStorages; - - /// true if setting the Modified flag of the document is currently locked - bool m_bModificationLock; - - /// true if and only if a database document existed previously (though meanwhile disposed), and was already initialized - bool m_bDocumentInitialized; - - /** the URL which the document should report as it's URL - - This might differ from ->m_sDocFileLocation in case the document was loaded - as part of a crash recovery process. In this case, ->m_sDocFileLocation points to - the temporary file where the DB had been saved to, after a crash. - ->m_sDocumentURL then is the URL of the document which actually had - been recovered. - */ - ::rtl::OUString m_sDocumentURL; - -public: - OWeakConnectionArray m_aConnections; - const ::comphelper::ComponentContext m_aContext; - -public: - ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess > m_xCommandDefinitions; - ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess > m_xTableDefinitions; - - ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > - m_xNumberFormatsSupplier; - ::rtl::OUString m_sConnectURL; - ::rtl::OUString m_sName; // transient, our creator has to tell us the title - ::rtl::OUString m_sUser; - ::rtl::OUString m_aPassword; // transient ! - ::rtl::OUString m_sFailedPassword; - ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue> - m_aLayoutInformation; - sal_Int32 m_nLoginTimeout; - sal_Bool m_bReadOnly : 1; - sal_Bool m_bPasswordRequired : 1; - sal_Bool m_bSuppressVersionColumns : 1; - sal_Bool m_bModified : 1; - sal_Bool m_bDocumentReadOnly : 1; - sal_Bool m_bDisposingSubStorages; - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyAccess > - m_xSettings; - ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aTableFilter; - ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aTableTypeFilter; - OSharedConnectionManager* m_pSharedConnectionManager; - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > - m_xSharedConnectionManager; - sal_uInt16 m_nControllerLockCount; - - void reset(); - - /** determines whether the database document has an embedded data storage - */ - inline bool isEmbeddedDatabase() const { return ( m_sConnectURL.compareToAscii( "sdbc:embedded:", 14 ) == 0 ); } - - /** stores the embedded storage ("database") - - @param _bPreventRootCommits - Normally, committing the embedded storage results in also commiting the root storage - - this is an automatism for data safety reasons. - If you pass <TRUE/> here, committing the root storage is prevented for this particular - call. - @return <TRUE/> if the storage could be commited, otherwise <FALSE/> - */ - sal_Bool commitEmbeddedStorage( sal_Bool _bPreventRootCommits = sal_False ); - - /** commits all storages storages which have been obtained via getStorage - */ - void commitStorages() - SAL_THROW(( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException )); - - ODatabaseModelImpl( - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, - ODatabaseContext& _pDBContext - ); - virtual ~ODatabaseModelImpl(); - - ODatabaseModelImpl( - const ::rtl::OUString& _rRegistrationName, - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory, - ODatabaseContext& _rDBContext - ); - - // XEventListener - void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); - - void setModified( sal_Bool bModified ); - - void dispose(); - - inline ::rtl::OUString getURL() const { return m_sDocumentURL; } - inline ::rtl::OUString getDocFileLocation() const { return m_sDocFileLocation; } - - ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage> getStorage(const ::rtl::OUString& _sStorageName,sal_Int32 nMode = ::com::sun::star::embed::ElementModes::READWRITE); -// helper - const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >& - getNumberFormatsSupplier(); - - const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& - getResource() const { return m_aArgs; } - - void attachResource( - const ::rtl::OUString& _rURL, - const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs ); - - static ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > - stripLoadArguments( const ::comphelper::NamedValueCollection& _rArguments ); - -// other stuff - void flushTables(); - - // disposes all elements in m_aStorages, and clears it - void disposeStorages() SAL_THROW(()); - - /// creates a ->com::sun::star::embed::StorageFactory - ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory > - createStorageFactory() const; - - /// commits our storage - void commitRootStorage(); - - /// commits a given storage if it's not readonly - static bool commitStorageIfWriteable( - const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage - ) - SAL_THROW(( - ::com::sun::star::io::IOException, - ::com::sun::star::lang::WrappedTargetException, - ::com::sun::star::uno::RuntimeException - )); - - /// commits a given storage if it's not readonly, ignoring (but asserting) all errors - static bool commitStorageIfWriteable_ignoreErrors( - const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage - ) - SAL_THROW(()); - - void clearConnections(); - - ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getOrCreateRootStorage(); - inline ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getRootStorage() const { return m_xDocumentStorage.getTyped(); } - inline void resetRootStroage() { impl_switchToStorage_throw( NULL ); } - - /** returns the data source. If it doesn't exist it will be created - */ - ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> getOrCreateDataSource(); - - /** returns the model, if there already exists one - */ - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > getModel_noCreate() const; - - /** returns a new ->ODatabaseDocument - - @param _bInitializeIfNecessary - calls XLoadable::initNew on the newly created model, if necessary - - @precond - No ->ODatabaseDocument exists so far - - @seealso - getModel_noCreate - */ - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > createNewModel_deliverOwnership( bool _bInitialize ); - - struct ResetModelAccess { friend class ODatabaseDocument; private: ResetModelAccess() { } }; - - /** resets the model to NULL - - Only to be called when the model is being disposed - */ - void modelIsDisposing( const bool _wasInitialized, ResetModelAccess ); - - bool hadInitializedDocument() const { return m_bDocumentInitialized; } - - DocumentStorageAccess* - getDocumentStorageAccess(); - - ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentSubStorageSupplier > - getDocumentSubStorageSupplier(); - - inline ::rtl::Reference< SharedMutex > getSharedMutex() const { return m_xMutex; } - - /** @see osl_incrementInterlockedCount. - */ - virtual oslInterlockedCount SAL_CALL acquire(); - - /** @see osl_decrementInterlockedCount. - */ - virtual oslInterlockedCount SAL_CALL release(); - - /// returns a all known data source settings, including their default values - static const AsciiPropertyValue* getDefaultDataSourceSettings(); - - /** retrieves the requested container of objects (forms/reports/tables/queries) - */ - TContentPtr& getObjectContainer( const ObjectType _eType ); - - /** determines whether the given storage is the storage of our embedded database (named "database"), if any - */ - bool isDatabaseStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage ) const; - - /** returns the name of the storage which is used to stored objects of the given type, if applicable - */ - static ::rtl::OUString - getObjectContainerStorageName( const ObjectType _eType ); - - /** revokes the data source registration at the database context - */ - void revokeDataSource() const; - - /** determines whether a given object storage contains macros - */ - static bool objectHasMacros( - const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxContainerStorage, - const ::rtl::OUString& _rPersistentName - ); - - /** determines whether the database document has any object (form/report) which contains macros - - In such a case, *all* objects in the document keep the macro capability, and the database document - itself does *not* allow embedding macros. - */ - bool hasAnyObjectWithMacros() const { return m_bHasAnyObjectWithMacros; } - - /** determines whether the document storage has sub storages used to store macros/scripts - - Though the current version does not allow creating such documents, later versions will, so - we need to be prepared when we encounter them. - */ - bool hasMacroStorages() const { return m_bHasMacroStorages; } - - /** checks our document's macro execution mode, using the interaction handler as supplied with our - load arguments - */ - bool checkMacrosOnLoading(); - - /** adjusts our document's macro execution mode, without using any UI, assuming the user - would reject execution of macros, if she would have been asked. - - If checkMacrosOnLoading has been called before (and thus the macro execution mode - is already adjusted), then the current execution mode is simply returned. - - @return - whether or not macro execution is allowed - */ - bool adjustMacroMode_AutoReject(); - - /** resets our macro execute mode, so next time the checkMacrosOnLoading is called, it will - behave as if it has never been called before - */ - void resetMacroExecutionMode(); - - /** ensures that ->m_xBasicLibraries resp. m_xDialogLibraries exists - - @return - the requested library container. Is never <NULL/>. - - @throws RuntimeException - if something does wrong, which indicates a server error in the installation - */ - ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > - getLibraryContainer( bool _bScript ); - - /** lets our library containers store themself into the given root storage - */ - void storeLibraryContainersTo( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxToRootStorage ); - - /** rebases the document to the given storage - - No actual committing, copying, saving, whatsoever happens. The storage is just remembered as the documents - new storage, nothing more. - - @throws ::com::sun::star::lang::IllegalArgumentException - if the given storage is <NULL/> - @throws ::com::sun::star::lang::RuntimeException - if any of the invoked operations does so - */ - ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > - switchToStorage( - const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage - ); - - /** switches to the given document location/URL - - The document location is the URL of the file from which the document has been loaded. - The document URL is the "intended location" of the document. It differs from the location - if and only if the document was loaded as part of a document recovery process. In this case, - the location points to some temporary file, but the URL is the URL of the file which has been - just recovered. The next store operation would operate on the URL, not the location. - */ - void switchToURL( - const ::rtl::OUString& _rDocumentLocation, - const ::rtl::OUString& _rDocumentURL - ); - - /** returns the macro mode imposed by an external instance, which passed it to attachResource - */ - sal_Int16 getImposedMacroExecMode() const - { - return m_nImposedMacroExecMode; - } - void setImposedMacroExecMode( const sal_Int16 _nMacroMode ) - { - m_nImposedMacroExecMode = _nMacroMode; - } - -public: - // IMacroDocumentAccess overridables - virtual sal_Int16 getCurrentMacroExecMode() const; - virtual sal_Bool setCurrentMacroExecMode( sal_uInt16 ); - virtual ::rtl::OUString getDocumentLocation() const; - virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getLastCommitDocumentStorage(); - virtual sal_Bool documentStorageHasMacros() const; - virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedScripts > getEmbeddedDocumentScripts() const; - virtual sal_Int16 getScriptingSignatureState() const; - virtual void showBrokenSignatureWarning( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxInteraction ) const; - - // IModifiableDocument - virtual void storageIsModified(); - - // don't use directly, use the ModifyLock class instead - void lockModify() { m_bModificationLock = true; } - void unlockModify() { m_bModificationLock = false; } - bool isModifyLocked() const { return m_bModificationLock; } - -private: - void impl_construct_nothrow(); - ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > - impl_switchToStorage_throw( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage ); -}; - -/** a small base class for UNO components whose functionality depends on a ODatabaseModelImpl -*/ -class ModelDependentComponent -{ -protected: - ::rtl::Reference< ODatabaseModelImpl > m_pImpl; - ::rtl::Reference< SharedMutex > m_xMutex; - -protected: - ModelDependentComponent( const ::rtl::Reference< ODatabaseModelImpl >& _model ); - virtual ~ModelDependentComponent(); - - /** returns the component itself - */ - virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getThis() const = 0; - - inline ::osl::Mutex& getMutex() const - { - return m_xMutex->getMutex(); - } - -public: - struct GuardAccess { friend class ModelMethodGuard; private: GuardAccess() { } }; - - /** returns the mutex used for thread safety - - @throws ::com::sun::star::lang::DisposedException - if m_pImpl is <NULL/>. Usually, you will set this member in your derived - component's <code>dispose</code> method to <NULL/>. - */ - inline ::osl::Mutex& getMutex( GuardAccess ) const - { - return getMutex(); - } - inline ::rtl::Reference< ODatabaseModelImpl > getImpl( GuardAccess ) - { - return m_pImpl; - } - - /// checks whether the component is already disposed, throws a DisposedException if so - inline void checkDisposed() const - { - if ( !m_pImpl.is() ) - throw ::com::sun::star::lang::DisposedException( ::rtl::OUString::createFromAscii( "Component is already disposed." ), getThis() ); - } - - inline void lockModify() - { - m_pImpl->lockModify(); - } - - inline void unlockModify() - { - m_pImpl->unlockModify(); - } -}; - -class ModifyLock -{ -public: - ModifyLock( ModelDependentComponent& _component ) - :m_rComponent( _component ) - { - m_rComponent.lockModify(); - } - - ~ModifyLock() - { - m_rComponent.unlockModify(); - } - -private: - ModelDependentComponent& m_rComponent; -}; - -/** a guard for public methods of objects dependent on a ODatabaseModelImpl instance - - Just put this guard onto the stack at the beginning of your method. Don't bother yourself - with a MutexGuard, checks for being disposed, and the like. -*/ -class ModelMethodGuard : public ::osl::ResettableMutexGuard -{ -private: - typedef ::osl::ResettableMutexGuard BaseMutexGuard; - -public: - /** constructs the guard - - @param _component - the component whose functionality depends on a ODatabaseModelImpl instance - - @throws ::com::sun::star::lang::DisposedException - If the given component is already disposed - */ - ModelMethodGuard( const ModelDependentComponent& _component ) - :BaseMutexGuard( _component.getMutex( ModelDependentComponent::GuardAccess() ) ) - { - _component.checkDisposed(); - } - - ~ModelMethodGuard() - { - } -}; - -//........................................................................ -} // namespace dbaccess -//........................................................................ - -#endif // _DBA_COREDATAACCESS_DATALINK_HXX_ - +/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ModelImpl.hxx,v $
+ * $Revision: 1.24.26.1 $
+ *
+ * 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 _DBA_COREDATAACCESS_MODELIMPL_HXX_
+#define _DBA_COREDATAACCESS_MODELIMPL_HXX_
+
+#include "apitools.hxx"
+#include "bookmarkcontainer.hxx"
+#include "ContentHelper.hxx"
+#include "core_resource.hxx"
+
+/** === begin UNO includes === **/
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertyAccess.hpp>
+#include <com/sun/star/container/XContainerListener.hpp>
+#include <com/sun/star/document/XDocumentSubStorageSupplier.hpp>
+#include <com/sun/star/document/XEventListener.hpp>
+#include <com/sun/star/document/XStorageBasedDocument.hpp>
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/embed/XTransactionListener.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/lang/NotInitializedException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/sdb/XBookmarksSupplier.hpp>
+#include <com/sun/star/sdb/XCompletedConnection.hpp>
+#include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
+#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
+#include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
+#include <com/sun/star/sdbc/XDataSource.hpp>
+#include <com/sun/star/sdbc/XIsolatedConnection.hpp>
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <com/sun/star/util/XCloseable.hpp>
+#include <com/sun/star/util/XFlushable.hpp>
+#include <com/sun/star/util/XModifiable.hpp>
+#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
+#include <com/sun/star/util/XNumberFormatter.hpp>
+#include <com/sun/star/util/XRefreshable.hpp>
+#include <com/sun/star/sdb/XDocumentDataSource.hpp>
+#include <com/sun/star/frame/DoubleInitializationException.hpp>
+/** === end UNO includes === **/
+
+#include <comphelper/broadcasthelper.hxx>
+#include <comphelper/proparrhlp.hxx>
+#include <comphelper/sharedmutex.hxx>
+#include <connectivity/CommonTools.hxx>
+#include <cppuhelper/propshlp.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <sfx2/docmacromode.hxx>
+#include <sfx2/docstoragemodifylistener.hxx>
+#include <tools/string.hxx>
+#include <unotools/sharedunocomponent.hxx>
+#include <vos/mutex.hxx>
+
+#include <memory>
+
+namespace comphelper
+{
+ class NamedValueCollection;
+}
+
+//........................................................................
+namespace dbaccess
+{
+//........................................................................
+
+typedef ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XConnection > OWeakConnection;
+typedef std::vector< OWeakConnection > OWeakConnectionArray;
+
+struct AsciiPropertyValue
+{
+ // note: the canonic member order would be AsciiName / DefaultValue, but
+ // this crashes on unxlngi6.pro, since there's a bug which somehow results in
+ // getDefaultDataSourceSettings returning corrupted Any instances then.
+ ::com::sun::star::uno::Any DefaultValue;
+ const sal_Char* AsciiName;
+
+ AsciiPropertyValue( const sal_Char* _pAsciiName, const ::com::sun::star::uno::Any& _rDefaultValue )
+ :DefaultValue( _rDefaultValue )
+ ,AsciiName( _pAsciiName )
+ {
+ }
+};
+
+class ODatabaseContext;
+class OSharedConnectionManager;
+
+//============================================================
+//= VosMutexFacade
+//============================================================
+/** a class which provides an IMutex interface to an OSL-based mutex
+*/
+class VosMutexFacade : public ::vos::IMutex
+{
+public:
+ /** beware of life time: the mutex you pass here must live as least as long
+ as the VosMutexFacade instance lives.
+ */
+ VosMutexFacade( ::osl::Mutex& _rMutex );
+
+ // IMutex
+ virtual void SAL_CALL acquire();
+ virtual sal_Bool SAL_CALL tryToAcquire();
+ virtual void SAL_CALL release();
+
+private:
+ ::osl::Mutex& m_rMutex;
+};
+
+
+//============================================================
+//= ODatabaseModelImpl
+//============================================================
+DECLARE_STL_USTRINGACCESS_MAP(::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >,TStorages);
+
+typedef ::utl::SharedUNOComponent< ::com::sun::star::embed::XStorage > SharedStorage;
+
+class ODatabaseContext;
+class DocumentStorageAccess;
+class OSharedConnectionManager;
+class ODatabaseModelImpl :public ::rtl::IReference
+ ,public ::sfx2::IMacroDocumentAccess
+ ,public ::sfx2::IModifiableDocument
+{
+public:
+ enum ObjectType
+ {
+ E_FORM = 0,
+ E_REPORT = 1,
+ E_QUERY = 2,
+ E_TABLE = 3
+ };
+
+private:
+ OModuleClient m_aModuleClient;
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XModel > m_xModel;
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XDataSource > m_xDataSource;
+
+ DocumentStorageAccess* m_pStorageAccess;
+ ::comphelper::SharedMutex m_aMutex;
+ VosMutexFacade m_aMutexFacade;
+ ::std::vector< TContentPtr > m_aContainer; // one for each ObjectType
+ TStorages m_aStorages;
+ ::sfx2::DocumentMacroMode m_aMacroMode;
+ sal_Int16 m_nImposedMacroExecMode;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xBasicLibraries;
+ ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer > m_xDialogLibraries;
+
+ SharedStorage m_xDocumentStorage;
+ ::rtl::Reference< ::sfx2::DocumentStorageModifyListener > m_pStorageModifyListener;
+ ODatabaseContext* m_pDBContext;
+
+ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aArgs;
+ /// the URL the document was loaded from
+ ::rtl::OUString m_sDocFileLocation;
+
+ oslInterlockedCount m_refCount;
+
+ /// do we have any object (forms/reports) which contains macros?
+ bool m_bHasAnyObjectWithMacros;
+ /// does our root storage have macro/script sub storages?
+ bool m_bHasMacroStorages;
+
+ /// true if setting the Modified flag of the document is currently locked
+ bool m_bModificationLock;
+
+ /// true if and only if a database document existed previously (though meanwhile disposed), and was already initialized
+ bool m_bDocumentInitialized;
+
+ /** the URL which the document should report as it's URL
+
+ This might differ from ->m_sDocFileLocation in case the document was loaded
+ as part of a crash recovery process. In this case, ->m_sDocFileLocation points to
+ the temporary file where the DB had been saved to, after a crash.
+ ->m_sDocumentURL then is the URL of the document which actually had
+ been recovered.
+ */
+ ::rtl::OUString m_sDocumentURL;
+
+public:
+ OWeakConnectionArray m_aConnections;
+ const ::comphelper::ComponentContext m_aContext;
+
+public:
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess > m_xCommandDefinitions;
+ ::com::sun::star::uno::WeakReference< ::com::sun::star::container::XNameAccess > m_xTableDefinitions;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >
+ m_xNumberFormatsSupplier;
+ ::rtl::OUString m_sConnectURL;
+ ::rtl::OUString m_sName; // transient, our creator has to tell us the title
+ ::rtl::OUString m_sUser;
+ ::rtl::OUString m_aPassword; // transient !
+ ::rtl::OUString m_sFailedPassword;
+ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>
+ m_aLayoutInformation;
+ sal_Int32 m_nLoginTimeout;
+ sal_Bool m_bReadOnly : 1;
+ sal_Bool m_bPasswordRequired : 1;
+ sal_Bool m_bSuppressVersionColumns : 1;
+ sal_Bool m_bModified : 1;
+ sal_Bool m_bDocumentReadOnly : 1;
+ sal_Bool m_bDisposingSubStorages;
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyAccess >
+ m_xSettings;
+ ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aTableFilter;
+ ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aTableTypeFilter;
+ OSharedConnectionManager* m_pSharedConnectionManager;
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >
+ m_xSharedConnectionManager;
+ sal_uInt16 m_nControllerLockCount;
+
+ void reset();
+
+ /** determines whether the database document has an embedded data storage
+ */
+ inline bool isEmbeddedDatabase() const { return ( m_sConnectURL.compareToAscii( "sdbc:embedded:", 14 ) == 0 ); }
+
+ /** stores the embedded storage ("database")
+
+ @param _bPreventRootCommits
+ Normally, committing the embedded storage results in also commiting the root storage
+ - this is an automatism for data safety reasons.
+ If you pass <TRUE/> here, committing the root storage is prevented for this particular
+ call.
+ @return <TRUE/> if the storage could be commited, otherwise <FALSE/>
+ */
+ sal_Bool commitEmbeddedStorage( sal_Bool _bPreventRootCommits = sal_False );
+
+ /** commits all storages storages which have been obtained via getStorage
+ */
+ void commitStorages()
+ SAL_THROW(( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException ));
+
+ ODatabaseModelImpl(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
+ ODatabaseContext& _pDBContext
+ );
+ virtual ~ODatabaseModelImpl();
+
+ ODatabaseModelImpl(
+ const ::rtl::OUString& _rRegistrationName,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory,
+ ODatabaseContext& _rDBContext
+ );
+
+ // XEventListener
+ void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException);
+
+ void setModified( sal_Bool bModified );
+
+ void dispose();
+
+ inline ::rtl::OUString getURL() const { return m_sDocumentURL; }
+ inline ::rtl::OUString getDocFileLocation() const { return m_sDocFileLocation; }
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage> getStorage(const ::rtl::OUString& _sStorageName,sal_Int32 nMode = ::com::sun::star::embed::ElementModes::READWRITE);
+// helper
+ const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >&
+ getNumberFormatsSupplier();
+
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >&
+ getResource() const { return m_aArgs; }
+
+ void attachResource(
+ const ::rtl::OUString& _rURL,
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rArgs );
+
+ static ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >
+ stripLoadArguments( const ::comphelper::NamedValueCollection& _rArguments );
+
+// other stuff
+ void flushTables();
+
+ // disposes all elements in m_aStorages, and clears it
+ void disposeStorages() SAL_THROW(());
+
+ /// creates a ->com::sun::star::embed::StorageFactory
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory >
+ createStorageFactory() const;
+
+ /// commits our storage
+ void commitRootStorage();
+
+ /// commits a given storage if it's not readonly
+ static bool commitStorageIfWriteable(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage
+ )
+ SAL_THROW((
+ ::com::sun::star::io::IOException,
+ ::com::sun::star::lang::WrappedTargetException,
+ ::com::sun::star::uno::RuntimeException
+ ));
+
+ /// commits a given storage if it's not readonly, ignoring (but asserting) all errors
+ static bool commitStorageIfWriteable_ignoreErrors(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage
+ )
+ SAL_THROW(());
+
+ void clearConnections();
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getOrCreateRootStorage();
+ inline ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getRootStorage() const { return m_xDocumentStorage.getTyped(); }
+ inline void resetRootStroage() { impl_switchToStorage_throw( NULL ); }
+
+ /** returns the data source. If it doesn't exist it will be created
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> getOrCreateDataSource();
+
+ /** returns the model, if there already exists one
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > getModel_noCreate() const;
+
+ /** returns a new ->ODatabaseDocument
+
+ @param _bInitializeIfNecessary
+ calls XLoadable::initNew on the newly created model, if necessary
+
+ @precond
+ No ->ODatabaseDocument exists so far
+
+ @seealso
+ getModel_noCreate
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > createNewModel_deliverOwnership( bool _bInitialize );
+
+ struct ResetModelAccess { friend class ODatabaseDocument; private: ResetModelAccess() { } };
+
+ /** resets the model to NULL
+
+ Only to be called when the model is being disposed
+ */
+ void modelIsDisposing( const bool _wasInitialized, ResetModelAccess );
+
+ bool hadInitializedDocument() const { return m_bDocumentInitialized; }
+
+ DocumentStorageAccess*
+ getDocumentStorageAccess();
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::document::XDocumentSubStorageSupplier >
+ getDocumentSubStorageSupplier();
+
+ inline const ::comphelper::SharedMutex& getSharedMutex() const { return m_aMutex; }
+
+ /** @see osl_incrementInterlockedCount.
+ */
+ virtual oslInterlockedCount SAL_CALL acquire();
+
+ /** @see osl_decrementInterlockedCount.
+ */
+ virtual oslInterlockedCount SAL_CALL release();
+
+ /// returns a all known data source settings, including their default values
+ static const AsciiPropertyValue* getDefaultDataSourceSettings();
+
+ /** retrieves the requested container of objects (forms/reports/tables/queries)
+ */
+ TContentPtr& getObjectContainer( const ObjectType _eType );
+
+ /** determines whether the given storage is the storage of our embedded database (named "database"), if any
+ */
+ bool isDatabaseStorage( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxStorage ) const;
+
+ /** returns the name of the storage which is used to stored objects of the given type, if applicable
+ */
+ static ::rtl::OUString
+ getObjectContainerStorageName( const ObjectType _eType );
+
+ /** revokes the data source registration at the database context
+ */
+ void revokeDataSource() const;
+
+ /** determines whether a given object storage contains macros
+ */
+ static bool objectHasMacros(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxContainerStorage,
+ const ::rtl::OUString& _rPersistentName
+ );
+
+ /** determines whether the database document has any object (form/report) which contains macros
+
+ In such a case, *all* objects in the document keep the macro capability, and the database document
+ itself does *not* allow embedding macros.
+ */
+ bool hasAnyObjectWithMacros() const { return m_bHasAnyObjectWithMacros; }
+
+ /** determines whether the document storage has sub storages used to store macros/scripts
+
+ Though the current version does not allow creating such documents, later versions will, so
+ we need to be prepared when we encounter them.
+ */
+ bool hasMacroStorages() const { return m_bHasMacroStorages; }
+
+ /** checks our document's macro execution mode, using the interaction handler as supplied with our
+ load arguments
+ */
+ bool checkMacrosOnLoading();
+
+ /** adjusts our document's macro execution mode, without using any UI, assuming the user
+ would reject execution of macros, if she would have been asked.
+
+ If checkMacrosOnLoading has been called before (and thus the macro execution mode
+ is already adjusted), then the current execution mode is simply returned.
+
+ @return
+ whether or not macro execution is allowed
+ */
+ bool adjustMacroMode_AutoReject();
+
+ /** resets our macro execute mode, so next time the checkMacrosOnLoading is called, it will
+ behave as if it has never been called before
+ */
+ void resetMacroExecutionMode();
+
+ /** ensures that ->m_xBasicLibraries resp. m_xDialogLibraries exists
+
+ @return
+ the requested library container. Is never <NULL/>.
+
+ @throws RuntimeException
+ if something does wrong, which indicates a server error in the installation
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::script::XStorageBasedLibraryContainer >
+ getLibraryContainer( bool _bScript );
+
+ /** lets our library containers store themself into the given root storage
+ */
+ void storeLibraryContainersTo( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxToRootStorage );
+
+ /** rebases the document to the given storage
+
+ No actual committing, copying, saving, whatsoever happens. The storage is just remembered as the documents
+ new storage, nothing more.
+
+ @throws ::com::sun::star::lang::IllegalArgumentException
+ if the given storage is <NULL/>
+ @throws ::com::sun::star::lang::RuntimeException
+ if any of the invoked operations does so
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >
+ switchToStorage(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage
+ );
+
+ /** switches to the given document location/URL
+
+ The document location is the URL of the file from which the document has been loaded.
+ The document URL is the "intended location" of the document. It differs from the location
+ if and only if the document was loaded as part of a document recovery process. In this case,
+ the location points to some temporary file, but the URL is the URL of the file which has been
+ just recovered. The next store operation would operate on the URL, not the location.
+ */
+ void switchToURL(
+ const ::rtl::OUString& _rDocumentLocation,
+ const ::rtl::OUString& _rDocumentURL
+ );
+
+ /** returns the macro mode imposed by an external instance, which passed it to attachResource
+ */
+ sal_Int16 getImposedMacroExecMode() const
+ {
+ return m_nImposedMacroExecMode;
+ }
+ void setImposedMacroExecMode( const sal_Int16 _nMacroMode )
+ {
+ m_nImposedMacroExecMode = _nMacroMode;
+ }
+
+public:
+ // IMacroDocumentAccess overridables
+ virtual sal_Int16 getCurrentMacroExecMode() const;
+ virtual sal_Bool setCurrentMacroExecMode( sal_uInt16 );
+ virtual ::rtl::OUString getDocumentLocation() const;
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage > getLastCommitDocumentStorage();
+ virtual sal_Bool documentStorageHasMacros() const;
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedScripts > getEmbeddedDocumentScripts() const;
+ virtual sal_Int16 getScriptingSignatureState() const;
+ virtual void showBrokenSignatureWarning( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxInteraction ) const;
+
+ // IModifiableDocument
+ virtual void storageIsModified();
+
+ // don't use directly, use the ModifyLock class instead
+ void lockModify() { m_bModificationLock = true; }
+ void unlockModify() { m_bModificationLock = false; }
+ bool isModifyLocked() const { return m_bModificationLock; }
+
+private:
+ void impl_construct_nothrow();
+ ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >
+ impl_switchToStorage_throw( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& _rxNewRootStorage );
+};
+
+/** a small base class for UNO components whose functionality depends on a ODatabaseModelImpl
+*/
+class ModelDependentComponent
+{
+protected:
+ ::rtl::Reference< ODatabaseModelImpl > m_pImpl;
+ mutable ::comphelper::SharedMutex m_aMutex;
+
+protected:
+ ModelDependentComponent( const ::rtl::Reference< ODatabaseModelImpl >& _model );
+ virtual ~ModelDependentComponent();
+
+ /** returns the component itself
+ */
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getThis() const = 0;
+
+ inline ::osl::Mutex& getMutex() const
+ {
+ return m_aMutex;
+ }
+
+public:
+ struct GuardAccess { friend class ModelMethodGuard; private: GuardAccess() { } };
+
+ /** returns the mutex used for thread safety
+
+ @throws ::com::sun::star::lang::DisposedException
+ if m_pImpl is <NULL/>. Usually, you will set this member in your derived
+ component's <code>dispose</code> method to <NULL/>.
+ */
+ inline ::osl::Mutex& getMutex( GuardAccess ) const
+ {
+ return getMutex();
+ }
+ inline ::rtl::Reference< ODatabaseModelImpl > getImpl( GuardAccess )
+ {
+ return m_pImpl;
+ }
+
+ /// checks whether the component is already disposed, throws a DisposedException if so
+ inline void checkDisposed() const
+ {
+ if ( !m_pImpl.is() )
+ throw ::com::sun::star::lang::DisposedException( ::rtl::OUString::createFromAscii( "Component is already disposed." ), getThis() );
+ }
+
+ inline void lockModify()
+ {
+ m_pImpl->lockModify();
+ }
+
+ inline void unlockModify()
+ {
+ m_pImpl->unlockModify();
+ }
+};
+
+class ModifyLock
+{
+public:
+ ModifyLock( ModelDependentComponent& _component )
+ :m_rComponent( _component )
+ {
+ m_rComponent.lockModify();
+ }
+
+ ~ModifyLock()
+ {
+ m_rComponent.unlockModify();
+ }
+
+private:
+ ModelDependentComponent& m_rComponent;
+};
+
+/** a guard for public methods of objects dependent on a ODatabaseModelImpl instance
+
+ Just put this guard onto the stack at the beginning of your method. Don't bother yourself
+ with a MutexGuard, checks for being disposed, and the like.
+*/
+class ModelMethodGuard : public ::osl::ResettableMutexGuard
+{
+private:
+ typedef ::osl::ResettableMutexGuard BaseMutexGuard;
+
+public:
+ /** constructs the guard
+
+ @param _component
+ the component whose functionality depends on a ODatabaseModelImpl instance
+
+ @throws ::com::sun::star::lang::DisposedException
+ If the given component is already disposed
+ */
+ ModelMethodGuard( const ModelDependentComponent& _component )
+ :BaseMutexGuard( _component.getMutex( ModelDependentComponent::GuardAccess() ) )
+ {
+ _component.checkDisposed();
+ }
+
+ ~ModelMethodGuard()
+ {
+ }
+};
+
+//........................................................................
+} // namespace dbaccess
+//........................................................................
+
+#endif // _DBA_COREDATAACCESS_DATALINK_HXX_
+
|