summaryrefslogtreecommitdiff
path: root/dbaccess/source/core/dataaccess/ModelImpl.hxx
diff options
context:
space:
mode:
authorRelease Engineers <releng@openoffice.org>2008-12-01 12:31:27 +0000
committerRelease Engineers <releng@openoffice.org>2008-12-01 12:31:27 +0000
commit2363c961947028ee152cbdfca7e4b4d1099ca019 (patch)
treed4e60312f0d4cca1098aa9ea181329711867e53e /dbaccess/source/core/dataaccess/ModelImpl.hxx
parentf2c90bcc552da21d692df2abeaf3997f8a7eda78 (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.hxx1313
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_
+